@elizaos/plugin-shell 2.0.0-alpha.9 → 2.0.11-beta.7
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/LICENSE +21 -0
- package/README.md +111 -0
- package/auto-enable.ts +37 -0
- package/package.json +46 -20
- package/dist/actions/clearHistory.d.ts +0 -4
- package/dist/actions/clearHistory.d.ts.map +0 -1
- package/dist/actions/index.d.ts +0 -2
- package/dist/actions/index.d.ts.map +0 -1
- package/dist/approvals/allowlist.d.ts +0 -76
- package/dist/approvals/allowlist.d.ts.map +0 -1
- package/dist/approvals/analysis.d.ts +0 -76
- package/dist/approvals/analysis.d.ts.map +0 -1
- package/dist/approvals/index.d.ts +0 -12
- package/dist/approvals/index.d.ts.map +0 -1
- package/dist/approvals/service.d.ts +0 -121
- package/dist/approvals/service.d.ts.map +0 -1
- package/dist/approvals/types.d.ts +0 -219
- package/dist/approvals/types.d.ts.map +0 -1
- package/dist/build.d.ts +0 -2
- package/dist/build.d.ts.map +0 -1
- package/dist/generated/prompts/typescript/prompts.d.ts +0 -12
- package/dist/generated/prompts/typescript/prompts.d.ts.map +0 -1
- package/dist/generated/specs/spec-helpers.d.ts +0 -49
- package/dist/generated/specs/spec-helpers.d.ts.map +0 -1
- package/dist/generated/specs/specs.d.ts +0 -73
- package/dist/generated/specs/specs.d.ts.map +0 -1
- package/dist/index.browser.d.ts +0 -4
- package/dist/index.browser.d.ts.map +0 -1
- package/dist/index.d.ts +0 -14
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -5278
- package/dist/index.js.map +0 -35
- package/dist/providers/index.d.ts +0 -2
- package/dist/providers/index.d.ts.map +0 -1
- package/dist/providers/shellHistoryProvider.d.ts +0 -4
- package/dist/providers/shellHistoryProvider.d.ts.map +0 -1
- package/dist/providers/terminalUsage.d.ts +0 -3
- package/dist/providers/terminalUsage.d.ts.map +0 -1
- package/dist/services/index.d.ts +0 -3
- package/dist/services/index.d.ts.map +0 -1
- package/dist/services/processRegistry.d.ts +0 -25
- package/dist/services/processRegistry.d.ts.map +0 -1
- package/dist/services/shellService.d.ts +0 -91
- package/dist/services/shellService.d.ts.map +0 -1
- package/dist/types/index.d.ts +0 -144
- package/dist/types/index.d.ts.map +0 -1
- package/dist/utils/config.d.ts +0 -4
- package/dist/utils/config.d.ts.map +0 -1
- package/dist/utils/index.d.ts +0 -7
- package/dist/utils/index.d.ts.map +0 -1
- package/dist/utils/pathUtils.d.ts +0 -5
- package/dist/utils/pathUtils.d.ts.map +0 -1
- package/dist/utils/processQueue.d.ts +0 -136
- package/dist/utils/processQueue.d.ts.map +0 -1
- package/dist/utils/ptyKeys.d.ts +0 -23
- package/dist/utils/ptyKeys.d.ts.map +0 -1
- package/dist/utils/shellArgv.d.ts +0 -37
- package/dist/utils/shellArgv.d.ts.map +0 -1
- package/dist/utils/shellUtils.d.ts +0 -103
- package/dist/utils/shellUtils.d.ts.map +0 -1
- package/dist/vitest.config.d.ts +0 -3
- package/dist/vitest.config.d.ts.map +0 -1
package/dist/index.js.map
DELETED
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../node_modules/.pnpm/@lydell+node-pty@1.1.0/node_modules/@lydell/node-pty/eventEmitter2.js", "../../../../node_modules/.pnpm/@lydell+node-pty@1.1.0/node_modules/@lydell/node-pty/terminal.js", "../../../../node_modules/.pnpm/@lydell+node-pty@1.1.0/node_modules/@lydell/node-pty/shared/conout.js", "../../../../node_modules/.pnpm/@lydell+node-pty@1.1.0/node_modules/@lydell/node-pty/windowsConoutConnection.js", "../../../../node_modules/.pnpm/@lydell+node-pty@1.1.0/node_modules/@lydell/node-pty/requireBinary.js", "../../../../node_modules/.pnpm/@lydell+node-pty@1.1.0/node_modules/@lydell/node-pty/windowsPtyAgent.js", "../../../../node_modules/.pnpm/@lydell+node-pty@1.1.0/node_modules/@lydell/node-pty/utils.js", "../../../../node_modules/.pnpm/@lydell+node-pty@1.1.0/node_modules/@lydell/node-pty/windowsTerminal.js", "../../../../node_modules/.pnpm/@lydell+node-pty@1.1.0/node_modules/@lydell/node-pty/unixTerminal.js", "../../../../node_modules/.pnpm/@lydell+node-pty@1.1.0/node_modules/@lydell/node-pty/index.js", "../actions/clearHistory.ts", "../generated/specs/specs.ts", "../generated/specs/spec-helpers.ts", "../approvals/allowlist.ts", "../approvals/types.ts", "../approvals/analysis.ts", "../approvals/service.ts", "../providers/shellHistoryProvider.ts", "../providers/terminalUsage.ts", "../services/shellService.ts", "../utils/config.ts", "../utils/pathUtils.ts", "../utils/ptyKeys.ts", "../utils/shellUtils.ts", "../services/processRegistry.ts", "../index.ts"],
|
|
4
|
-
"sourcesContent": [
|
|
5
|
-
"\"use strict\";\n/**\n * Copyright (c) 2019, Microsoft Corporation (MIT License).\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar EventEmitter2 = /** @class */ (function () {\n function EventEmitter2() {\n this._listeners = [];\n }\n Object.defineProperty(EventEmitter2.prototype, \"event\", {\n get: function () {\n var _this = this;\n if (!this._event) {\n this._event = function (listener) {\n _this._listeners.push(listener);\n var disposable = {\n dispose: function () {\n for (var i = 0; i < _this._listeners.length; i++) {\n if (_this._listeners[i] === listener) {\n _this._listeners.splice(i, 1);\n return;\n }\n }\n }\n };\n return disposable;\n };\n }\n return this._event;\n },\n enumerable: true,\n configurable: true\n });\n EventEmitter2.prototype.fire = function (data) {\n var queue = [];\n for (var i = 0; i < this._listeners.length; i++) {\n queue.push(this._listeners[i]);\n }\n for (var i = 0; i < queue.length; i++) {\n queue[i].call(undefined, data);\n }\n };\n return EventEmitter2;\n}());\nexports.EventEmitter2 = EventEmitter2;\n",
|
|
6
|
-
"\"use strict\";\n/**\n * Copyright (c) 2012-2015, Christopher Jeffrey (MIT License)\n * Copyright (c) 2016, Daniel Imms (MIT License).\n * Copyright (c) 2018, Microsoft Corporation (MIT License).\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar events_1 = require(\"events\");\nvar eventEmitter2_1 = require(\"./eventEmitter2\");\nexports.DEFAULT_COLS = 80;\nexports.DEFAULT_ROWS = 24;\n/**\n * Default messages to indicate PAUSE/RESUME for automatic flow control.\n * To avoid conflicts with rebound XON/XOFF control codes (such as on-my-zsh),\n * the sequences can be customized in `IPtyForkOptions`.\n */\nvar FLOW_CONTROL_PAUSE = '\\x13'; // defaults to XOFF\nvar FLOW_CONTROL_RESUME = '\\x11'; // defaults to XON\nvar Terminal = /** @class */ (function () {\n function Terminal(opt) {\n this._pid = 0;\n this._fd = 0;\n this._cols = 0;\n this._rows = 0;\n this._readable = false;\n this._writable = false;\n this._onData = new eventEmitter2_1.EventEmitter2();\n this._onExit = new eventEmitter2_1.EventEmitter2();\n // for 'close'\n this._internalee = new events_1.EventEmitter();\n // setup flow control handling\n this.handleFlowControl = !!(opt === null || opt === void 0 ? void 0 : opt.handleFlowControl);\n this._flowControlPause = (opt === null || opt === void 0 ? void 0 : opt.flowControlPause) || FLOW_CONTROL_PAUSE;\n this._flowControlResume = (opt === null || opt === void 0 ? void 0 : opt.flowControlResume) || FLOW_CONTROL_RESUME;\n if (!opt) {\n return;\n }\n // Do basic type checks here in case node-pty is being used within JavaScript. If the wrong\n // types go through to the C++ side it can lead to hard to diagnose exceptions.\n this._checkType('name', opt.name ? opt.name : undefined, 'string');\n this._checkType('cols', opt.cols ? opt.cols : undefined, 'number');\n this._checkType('rows', opt.rows ? opt.rows : undefined, 'number');\n this._checkType('cwd', opt.cwd ? opt.cwd : undefined, 'string');\n this._checkType('env', opt.env ? opt.env : undefined, 'object');\n this._checkType('uid', opt.uid ? opt.uid : undefined, 'number');\n this._checkType('gid', opt.gid ? opt.gid : undefined, 'number');\n this._checkType('encoding', opt.encoding ? opt.encoding : undefined, 'string');\n }\n Object.defineProperty(Terminal.prototype, \"onData\", {\n get: function () { return this._onData.event; },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(Terminal.prototype, \"onExit\", {\n get: function () { return this._onExit.event; },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(Terminal.prototype, \"pid\", {\n get: function () { return this._pid; },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(Terminal.prototype, \"cols\", {\n get: function () { return this._cols; },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(Terminal.prototype, \"rows\", {\n get: function () { return this._rows; },\n enumerable: true,\n configurable: true\n });\n Terminal.prototype.write = function (data) {\n if (this.handleFlowControl) {\n // PAUSE/RESUME messages are not forwarded to the pty\n if (data === this._flowControlPause) {\n this.pause();\n return;\n }\n if (data === this._flowControlResume) {\n this.resume();\n return;\n }\n }\n // everything else goes to the real pty\n this._write(data);\n };\n Terminal.prototype._forwardEvents = function () {\n var _this = this;\n this.on('data', function (e) { return _this._onData.fire(e); });\n this.on('exit', function (exitCode, signal) { return _this._onExit.fire({ exitCode: exitCode, signal: signal }); });\n };\n Terminal.prototype._checkType = function (name, value, type, allowArray) {\n if (allowArray === void 0) { allowArray = false; }\n if (value === undefined) {\n return;\n }\n if (allowArray) {\n if (Array.isArray(value)) {\n value.forEach(function (v, i) {\n if (typeof v !== type) {\n throw new Error(name + \"[\" + i + \"] must be a \" + type + \" (not a \" + typeof v[i] + \")\");\n }\n });\n return;\n }\n }\n if (typeof value !== type) {\n throw new Error(name + \" must be a \" + type + \" (not a \" + typeof value + \")\");\n }\n };\n /** See net.Socket.end */\n Terminal.prototype.end = function (data) {\n this._socket.end(data);\n };\n /** See stream.Readable.pipe */\n Terminal.prototype.pipe = function (dest, options) {\n return this._socket.pipe(dest, options);\n };\n /** See net.Socket.pause */\n Terminal.prototype.pause = function () {\n return this._socket.pause();\n };\n /** See net.Socket.resume */\n Terminal.prototype.resume = function () {\n return this._socket.resume();\n };\n /** See net.Socket.setEncoding */\n Terminal.prototype.setEncoding = function (encoding) {\n if (this._socket._decoder) {\n delete this._socket._decoder;\n }\n if (encoding) {\n this._socket.setEncoding(encoding);\n }\n };\n Terminal.prototype.addListener = function (eventName, listener) { this.on(eventName, listener); };\n Terminal.prototype.on = function (eventName, listener) {\n if (eventName === 'close') {\n this._internalee.on('close', listener);\n return;\n }\n this._socket.on(eventName, listener);\n };\n Terminal.prototype.emit = function (eventName) {\n var args = [];\n for (var _i = 1; _i < arguments.length; _i++) {\n args[_i - 1] = arguments[_i];\n }\n if (eventName === 'close') {\n return this._internalee.emit.apply(this._internalee, arguments);\n }\n return this._socket.emit.apply(this._socket, arguments);\n };\n Terminal.prototype.listeners = function (eventName) {\n return this._socket.listeners(eventName);\n };\n Terminal.prototype.removeListener = function (eventName, listener) {\n this._socket.removeListener(eventName, listener);\n };\n Terminal.prototype.removeAllListeners = function (eventName) {\n this._socket.removeAllListeners(eventName);\n };\n Terminal.prototype.once = function (eventName, listener) {\n this._socket.once(eventName, listener);\n };\n Terminal.prototype._close = function () {\n this._socket.readable = false;\n this.write = function () { };\n this.end = function () { };\n this._writable = false;\n this._readable = false;\n };\n Terminal.prototype._parseEnv = function (env) {\n var keys = Object.keys(env || {});\n var pairs = [];\n for (var i = 0; i < keys.length; i++) {\n if (keys[i] === undefined) {\n continue;\n }\n pairs.push(keys[i] + '=' + env[keys[i]]);\n }\n return pairs;\n };\n return Terminal;\n}());\nexports.Terminal = Terminal;\n",
|
|
7
|
-
"\"use strict\";\n/**\n * Copyright (c) 2020, Microsoft Corporation (MIT License).\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nfunction getWorkerPipeName(conoutPipeName) {\n return conoutPipeName + \"-worker\";\n}\nexports.getWorkerPipeName = getWorkerPipeName;\n",
|
|
8
|
-
"\"use strict\";\n/**\n * Copyright (c) 2020, Microsoft Corporation (MIT License).\n */\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nvar __generator = (this && this.__generator) || function (thisArg, body) {\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\n function verb(n) { return function (v) { return step([n, v]); }; }\n function step(op) {\n if (f) throw new TypeError(\"Generator is already executing.\");\n while (_) try {\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n if (y = 0, t) op = [op[0] & 2, t.value];\n switch (op[0]) {\n case 0: case 1: t = op; break;\n case 4: _.label++; return { value: op[1], done: false };\n case 5: _.label++; y = op[1]; op = [0]; continue;\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n if (t[2]) _.ops.pop();\n _.trys.pop(); continue;\n }\n op = body.call(thisArg, _);\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n }\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar worker_threads_1 = require(\"worker_threads\");\nvar conout_1 = require(\"./shared/conout\");\nvar path_1 = require(\"path\");\nvar eventEmitter2_1 = require(\"./eventEmitter2\");\n/**\n * The amount of time to wait for additional data after the conpty shell process has exited before\n * shutting down the worker and sockets. The timer will be reset if a new data event comes in after\n * the timer has started.\n */\nvar FLUSH_DATA_INTERVAL = 1000;\n/**\n * Connects to and manages the lifecycle of the conout socket. This socket must be drained on\n * another thread in order to avoid deadlocks where Conpty waits for the out socket to drain\n * when `ClosePseudoConsole` is called. This happens when data is being written to the terminal when\n * the pty is closed.\n *\n * See also:\n * - https://github.com/microsoft/node-pty/issues/375\n * - https://github.com/microsoft/vscode/issues/76548\n * - https://github.com/microsoft/terminal/issues/1810\n * - https://docs.microsoft.com/en-us/windows/console/closepseudoconsole\n */\nvar ConoutConnection = /** @class */ (function () {\n function ConoutConnection(_conoutPipeName) {\n var _this = this;\n this._conoutPipeName = _conoutPipeName;\n this._isDisposed = false;\n this._onReady = new eventEmitter2_1.EventEmitter2();\n var workerData = { conoutPipeName: _conoutPipeName };\n var scriptPath = __dirname.replace('node_modules.asar', 'node_modules.asar.unpacked');\n this._worker = new worker_threads_1.Worker(path_1.join(scriptPath, 'worker/conoutSocketWorker.js'), { workerData: workerData });\n this._worker.on('message', function (message) {\n switch (message) {\n case 1 /* READY */:\n _this._onReady.fire();\n return;\n default:\n console.warn('Unexpected ConoutWorkerMessage', message);\n }\n });\n }\n Object.defineProperty(ConoutConnection.prototype, \"onReady\", {\n get: function () { return this._onReady.event; },\n enumerable: true,\n configurable: true\n });\n ConoutConnection.prototype.dispose = function () {\n if (this._isDisposed) {\n return;\n }\n this._isDisposed = true;\n // Drain all data from the socket before closing\n this._drainDataAndClose();\n };\n ConoutConnection.prototype.connectSocket = function (socket) {\n socket.connect(conout_1.getWorkerPipeName(this._conoutPipeName));\n };\n ConoutConnection.prototype._drainDataAndClose = function () {\n var _this = this;\n if (this._drainTimeout) {\n clearTimeout(this._drainTimeout);\n }\n this._drainTimeout = setTimeout(function () { return _this._destroySocket(); }, FLUSH_DATA_INTERVAL);\n };\n ConoutConnection.prototype._destroySocket = function () {\n return __awaiter(this, void 0, void 0, function () {\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0: return [4 /*yield*/, this._worker.terminate()];\n case 1:\n _a.sent();\n return [2 /*return*/];\n }\n });\n });\n };\n return ConoutConnection;\n}());\nexports.ConoutConnection = ConoutConnection;\n",
|
|
9
|
-
"\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar PACKAGE_NAME = \"@lydell/node-pty-\" + process.platform + \"-\" + process.arch;\nvar help = \"\\nThis can happen if you use the \\\"--omit=optional\\\" (or \\\"--no-optional\\\") npm flag.\\nThe \\\"optionalDependencies\\\" package.json feature is used to install the correct\\nbinary executable for your current platform. Remove that flag to use @lydell/node-pty.\\n\\nThis can also happen if the \\\"node_modules\\\" folder was copied between two operating systems\\nthat need different binaries - including \\\"virtual\\\" operating systems like Docker and WSL.\\nIf so, try installing with npm rather than copying \\\"node_modules\\\".\\n\".trim();\nfunction requireBinary(file) {\n try {\n return require(PACKAGE_NAME + \"/\" + file);\n }\n catch (error) {\n if (error && error.code === 'MODULE_NOT_FOUND') {\n var optionalDependencies = getOptionalDependencies();\n throw new Error(optionalDependencies === undefined\n ? \"The @lydell/node-pty package could not find the binary package: \" + PACKAGE_NAME + \"/\" + file + \"\\n\\n\" + help + \"\\n\\nYour platform (\" + process.platform + \"-\" + process.arch + \") might not be supported.\"\n : PACKAGE_NAME in optionalDependencies\n ? \"The @lydell/node-pty package supports your platform (\" + process.platform + \"-\" + process.arch + \"), but it could not find the binary package for it: \" + PACKAGE_NAME + \"/\" + file + \"\\n\\n\" + help\n : \"The @lydell/node-pty package currently does not support your platform: \" + process.platform + \"-\" + process.arch, \n // @ts-ignore: The TypeScript setup does not seem to support cause.\n { cause: error });\n }\n else {\n throw error;\n }\n }\n}\nexports.requireBinary = requireBinary;\nfunction getOptionalDependencies() {\n try {\n return require('./package.json').optionalDependencies;\n }\n catch (_error) {\n return undefined;\n }\n}\n",
|
|
10
|
-
"\"use strict\";\n/**\n * Copyright (c) 2012-2015, Christopher Jeffrey, Peter Sunde (MIT License)\n * Copyright (c) 2016, Daniel Imms (MIT License).\n * Copyright (c) 2018, Microsoft Corporation (MIT License).\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar fs = require(\"fs\");\nvar path = require(\"path\");\nvar net_1 = require(\"net\");\nvar child_process_1 = require(\"child_process\");\nvar windowsConoutConnection_1 = require(\"./windowsConoutConnection\");\nvar requireBinary_1 = require(\"./requireBinary\");\nvar conptyNative;\n/**\n * The amount of time to wait for additional data after the conpty shell process has exited before\n * shutting down the socket. The timer will be reset if a new data event comes in after the timer\n * has started.\n */\nvar FLUSH_DATA_INTERVAL = 1000;\n/**\n * This agent sits between the WindowsTerminal class and provides an interface for both conpty.\n */\nvar WindowsPtyAgent = /** @class */ (function () {\n function WindowsPtyAgent(file, args, env, cwd, cols, rows, debug, conptyInheritCursor) {\n var _this = this;\n if (conptyInheritCursor === void 0) { conptyInheritCursor = false; }\n this._pid = 0;\n this._innerPid = 0;\n if (!conptyNative) {\n conptyNative = requireBinary_1.requireBinary('conpty.node');\n }\n this._ptyNative = conptyNative;\n // Sanitize input variable.\n cwd = path.resolve(cwd);\n // Compose command line\n var commandLine = argsToCommandLine(file, args);\n // Open pty session.\n var term = this._ptyNative.startProcess(file, cols, rows, debug, this._generatePipeName(), conptyInheritCursor);\n // Not available on windows.\n this._fd = term.fd;\n // Generated incremental number that has no real purpose besides using it\n // as a terminal id.\n this._pty = term.pty;\n // Create terminal pipe IPC channel and forward to a local unix socket.\n this._outSocket = new net_1.Socket();\n this._outSocket.setEncoding('utf8');\n // The conout socket must be ready out on another thread to avoid deadlocks\n this._conoutSocketWorker = new windowsConoutConnection_1.ConoutConnection(term.conout);\n this._conoutSocketWorker.onReady(function () {\n _this._conoutSocketWorker.connectSocket(_this._outSocket);\n });\n this._outSocket.on('connect', function () {\n _this._outSocket.emit('ready_datapipe');\n });\n var inSocketFD = fs.openSync(term.conin, 'w');\n this._inSocket = new net_1.Socket({\n fd: inSocketFD,\n readable: false,\n writable: true\n });\n this._inSocket.setEncoding('utf8');\n var connect = this._ptyNative.connect(this._pty, commandLine, cwd, env, function (c) { return _this._$onProcessExit(c); });\n this._innerPid = connect.pid;\n }\n Object.defineProperty(WindowsPtyAgent.prototype, \"inSocket\", {\n get: function () { return this._inSocket; },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(WindowsPtyAgent.prototype, \"outSocket\", {\n get: function () { return this._outSocket; },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(WindowsPtyAgent.prototype, \"fd\", {\n get: function () { return this._fd; },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(WindowsPtyAgent.prototype, \"innerPid\", {\n get: function () { return this._innerPid; },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(WindowsPtyAgent.prototype, \"pty\", {\n get: function () { return this._pty; },\n enumerable: true,\n configurable: true\n });\n WindowsPtyAgent.prototype.resize = function (cols, rows) {\n if (this._exitCode !== undefined) {\n throw new Error('Cannot resize a pty that has already exited');\n }\n this._ptyNative.resize(this._pty, cols, rows);\n };\n WindowsPtyAgent.prototype.clear = function () {\n this._ptyNative.clear(this._pty);\n };\n WindowsPtyAgent.prototype.kill = function () {\n var _this = this;\n this._inSocket.readable = false;\n this._outSocket.readable = false;\n // Tell the agent to kill the pty, this releases handles to the process\n this._getConsoleProcessList().then(function (consoleProcessList) {\n consoleProcessList.forEach(function (pid) {\n try {\n process.kill(pid);\n }\n catch (e) {\n // Ignore if process cannot be found (kill ESRCH error)\n }\n });\n _this._ptyNative.kill(_this._pty);\n });\n this._conoutSocketWorker.dispose();\n };\n WindowsPtyAgent.prototype._getConsoleProcessList = function () {\n var _this = this;\n return new Promise(function (resolve) {\n var agent = child_process_1.fork(path.join(__dirname, 'conpty_console_list_agent'), [_this._innerPid.toString()]);\n agent.on('message', function (message) {\n clearTimeout(timeout);\n resolve(message.consoleProcessList);\n });\n var timeout = setTimeout(function () {\n // Something went wrong, just send back the shell PID\n agent.kill();\n resolve([_this._innerPid]);\n }, 5000);\n });\n };\n Object.defineProperty(WindowsPtyAgent.prototype, \"exitCode\", {\n get: function () {\n return this._exitCode;\n },\n enumerable: true,\n configurable: true\n });\n WindowsPtyAgent.prototype._generatePipeName = function () {\n return \"conpty-\" + Math.random() * 10000000;\n };\n /**\n * Triggered from the native side when a contpy process exits.\n */\n WindowsPtyAgent.prototype._$onProcessExit = function (exitCode) {\n var _this = this;\n this._exitCode = exitCode;\n this._flushDataAndCleanUp();\n this._outSocket.on('data', function () { return _this._flushDataAndCleanUp(); });\n };\n WindowsPtyAgent.prototype._flushDataAndCleanUp = function () {\n var _this = this;\n if (this._closeTimeout) {\n clearTimeout(this._closeTimeout);\n }\n this._closeTimeout = setTimeout(function () { return _this._cleanUpProcess(); }, FLUSH_DATA_INTERVAL);\n };\n WindowsPtyAgent.prototype._cleanUpProcess = function () {\n this._inSocket.readable = false;\n this._outSocket.readable = false;\n this._outSocket.destroy();\n };\n return WindowsPtyAgent;\n}());\nexports.WindowsPtyAgent = WindowsPtyAgent;\n// Convert argc/argv into a Win32 command-line following the escaping convention\n// documented on MSDN (e.g. see CommandLineToArgvW documentation). Copied from\n// winpty project.\nfunction argsToCommandLine(file, args) {\n if (isCommandLine(args)) {\n if (args.length === 0) {\n return file;\n }\n return argsToCommandLine(file, []) + \" \" + args;\n }\n var argv = [file];\n Array.prototype.push.apply(argv, args);\n var result = '';\n for (var argIndex = 0; argIndex < argv.length; argIndex++) {\n if (argIndex > 0) {\n result += ' ';\n }\n var arg = argv[argIndex];\n // if it is empty or it contains whitespace and is not already quoted\n var hasLopsidedEnclosingQuote = xOr((arg[0] !== '\"'), (arg[arg.length - 1] !== '\"'));\n var hasNoEnclosingQuotes = ((arg[0] !== '\"') && (arg[arg.length - 1] !== '\"'));\n var quote = arg === '' ||\n (arg.indexOf(' ') !== -1 ||\n arg.indexOf('\\t') !== -1) &&\n ((arg.length > 1) &&\n (hasLopsidedEnclosingQuote || hasNoEnclosingQuotes));\n if (quote) {\n result += '\\\"';\n }\n var bsCount = 0;\n for (var i = 0; i < arg.length; i++) {\n var p = arg[i];\n if (p === '\\\\') {\n bsCount++;\n }\n else if (p === '\"') {\n result += repeatText('\\\\', bsCount * 2 + 1);\n result += '\"';\n bsCount = 0;\n }\n else {\n result += repeatText('\\\\', bsCount);\n bsCount = 0;\n result += p;\n }\n }\n if (quote) {\n result += repeatText('\\\\', bsCount * 2);\n result += '\\\"';\n }\n else {\n result += repeatText('\\\\', bsCount);\n }\n }\n return result;\n}\nexports.argsToCommandLine = argsToCommandLine;\nfunction isCommandLine(args) {\n return typeof args === 'string';\n}\nfunction repeatText(text, count) {\n var result = '';\n for (var i = 0; i < count; i++) {\n result += text;\n }\n return result;\n}\nfunction xOr(arg1, arg2) {\n return ((arg1 && !arg2) || (!arg1 && arg2));\n}\n",
|
|
11
|
-
"\"use strict\";\n/**\n * Copyright (c) 2017, Daniel Imms (MIT License).\n * Copyright (c) 2018, Microsoft Corporation (MIT License).\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nfunction assign(target) {\n var sources = [];\n for (var _i = 1; _i < arguments.length; _i++) {\n sources[_i - 1] = arguments[_i];\n }\n sources.forEach(function (source) { return Object.keys(source).forEach(function (key) { return target[key] = source[key]; }); });\n return target;\n}\nexports.assign = assign;\n",
|
|
12
|
-
"\"use strict\";\n/**\n * Copyright (c) 2012-2015, Christopher Jeffrey, Peter Sunde (MIT License)\n * Copyright (c) 2016, Daniel Imms (MIT License).\n * Copyright (c) 2018, Microsoft Corporation (MIT License).\n */\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar terminal_1 = require(\"./terminal\");\nvar windowsPtyAgent_1 = require(\"./windowsPtyAgent\");\nvar utils_1 = require(\"./utils\");\nvar DEFAULT_FILE = 'cmd.exe';\nvar DEFAULT_NAME = 'Windows Shell';\nvar WindowsTerminal = /** @class */ (function (_super) {\n __extends(WindowsTerminal, _super);\n function WindowsTerminal(file, args, opt) {\n var _this = _super.call(this, opt) || this;\n _this._checkType('args', args, 'string', true);\n // Initialize arguments\n args = args || [];\n file = file || DEFAULT_FILE;\n opt = opt || {};\n opt.env = opt.env || process.env;\n if (opt.encoding) {\n console.warn('Setting encoding on Windows is not supported');\n }\n var env = utils_1.assign({}, opt.env);\n _this._cols = opt.cols || terminal_1.DEFAULT_COLS;\n _this._rows = opt.rows || terminal_1.DEFAULT_ROWS;\n var cwd = opt.cwd || process.cwd();\n var name = opt.name || env.TERM || DEFAULT_NAME;\n var parsedEnv = _this._parseEnv(env);\n // If the terminal is ready\n _this._isReady = false;\n // Functions that need to run after `ready` event is emitted.\n _this._deferreds = [];\n // Create new termal.\n _this._agent = new windowsPtyAgent_1.WindowsPtyAgent(file, args, parsedEnv, cwd, _this._cols, _this._rows, false, opt.conptyInheritCursor);\n _this._socket = _this._agent.outSocket;\n // Not available until `ready` event emitted.\n _this._pid = _this._agent.innerPid;\n _this._fd = _this._agent.fd;\n _this._pty = _this._agent.pty;\n // The forked windows terminal is not available until `ready` event is\n // emitted.\n _this._socket.on('ready_datapipe', function () {\n // These events needs to be forwarded.\n ['connect', 'data', 'end', 'timeout', 'drain'].forEach(function (event) {\n _this._socket.on(event, function () {\n // Wait until the first data event is fired then we can run deferreds.\n if (!_this._isReady && event === 'data') {\n // Terminal is now ready and we can avoid having to defer method\n // calls.\n _this._isReady = true;\n // Execute all deferred methods\n _this._deferreds.forEach(function (fn) {\n // NB! In order to ensure that `this` has all its references\n // updated any variable that need to be available in `this` before\n // the deferred is run has to be declared above this forEach\n // statement.\n fn.run();\n });\n // Reset\n _this._deferreds = [];\n }\n });\n });\n // Shutdown if `error` event is emitted.\n _this._socket.on('error', function (err) {\n // Close terminal session.\n _this._close();\n // EIO, happens when someone closes our child process: the only process\n // in the terminal.\n // node < 0.6.14: errno 5\n // node >= 0.6.14: read EIO\n if (err.code) {\n if (~err.code.indexOf('errno 5') || ~err.code.indexOf('EIO'))\n return;\n }\n // Throw anything else.\n if (_this.listeners('error').length < 2) {\n throw err;\n }\n });\n // Cleanup after the socket is closed.\n _this._socket.on('close', function () {\n _this.emit('exit', _this._agent.exitCode);\n _this._close();\n });\n });\n _this._file = file;\n _this._name = name;\n _this._readable = true;\n _this._writable = true;\n _this._forwardEvents();\n return _this;\n }\n WindowsTerminal.prototype._write = function (data) {\n this._defer(this._doWrite, data);\n };\n WindowsTerminal.prototype._doWrite = function (data) {\n this._agent.inSocket.write(data);\n };\n /**\n * openpty\n */\n WindowsTerminal.open = function (options) {\n throw new Error('open() not supported on windows, use Fork() instead.');\n };\n /**\n * TTY\n */\n WindowsTerminal.prototype.resize = function (cols, rows) {\n var _this = this;\n if (cols <= 0 || rows <= 0 || isNaN(cols) || isNaN(rows) || cols === Infinity || rows === Infinity) {\n throw new Error('resizing must be done using positive cols and rows');\n }\n this._deferNoArgs(function () {\n _this._agent.resize(cols, rows);\n _this._cols = cols;\n _this._rows = rows;\n });\n };\n WindowsTerminal.prototype.clear = function () {\n var _this = this;\n this._deferNoArgs(function () {\n _this._agent.clear();\n });\n };\n WindowsTerminal.prototype.destroy = function () {\n var _this = this;\n this._deferNoArgs(function () {\n _this.kill();\n });\n };\n WindowsTerminal.prototype.kill = function (signal) {\n var _this = this;\n this._deferNoArgs(function () {\n if (signal) {\n throw new Error('Signals not supported on windows.');\n }\n _this._close();\n _this._agent.kill();\n });\n };\n WindowsTerminal.prototype._deferNoArgs = function (deferredFn) {\n var _this = this;\n // If the terminal is ready, execute.\n if (this._isReady) {\n deferredFn.call(this);\n return;\n }\n // Queue until terminal is ready.\n this._deferreds.push({\n run: function () { return deferredFn.call(_this); }\n });\n };\n WindowsTerminal.prototype._defer = function (deferredFn, arg) {\n var _this = this;\n // If the terminal is ready, execute.\n if (this._isReady) {\n deferredFn.call(this, arg);\n return;\n }\n // Queue until terminal is ready.\n this._deferreds.push({\n run: function () { return deferredFn.call(_this, arg); }\n });\n };\n Object.defineProperty(WindowsTerminal.prototype, \"process\", {\n get: function () { return this._name; },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(WindowsTerminal.prototype, \"master\", {\n get: function () { throw new Error('master is not supported on Windows'); },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(WindowsTerminal.prototype, \"slave\", {\n get: function () { throw new Error('slave is not supported on Windows'); },\n enumerable: true,\n configurable: true\n });\n return WindowsTerminal;\n}(terminal_1.Terminal));\nexports.WindowsTerminal = WindowsTerminal;\n",
|
|
13
|
-
"\"use strict\";\nvar __extends = (this && this.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar tty = require(\"tty\");\nvar terminal_1 = require(\"./terminal\");\nvar utils_1 = require(\"./utils\");\nvar requireBinary_1 = require(\"./requireBinary\");\nvar pty = requireBinary_1.requireBinary('pty.node');\nvar helperPath = \"@lydell/node-pty-\" + process.platform + \"-\" + process.arch + \"/spawn-helper\";\nhelperPath = process.platform === 'darwin' ? require.resolve(helperPath) : 'spawn-helper-unused';\nhelperPath = helperPath.replace('app.asar', 'app.asar.unpacked');\nhelperPath = helperPath.replace('node_modules.asar', 'node_modules.asar.unpacked');\nvar DEFAULT_FILE = 'sh';\nvar DEFAULT_NAME = 'xterm';\nvar DESTROY_SOCKET_TIMEOUT_MS = 200;\nvar UnixTerminal = /** @class */ (function (_super) {\n __extends(UnixTerminal, _super);\n function UnixTerminal(file, args, opt) {\n var _a, _b;\n var _this = _super.call(this, opt) || this;\n _this._boundClose = false;\n _this._emittedClose = false;\n if (typeof args === 'string') {\n throw new Error('args as a string is not supported on unix.');\n }\n // Initialize arguments\n args = args || [];\n file = file || DEFAULT_FILE;\n opt = opt || {};\n opt.env = opt.env || process.env;\n _this._cols = opt.cols || terminal_1.DEFAULT_COLS;\n _this._rows = opt.rows || terminal_1.DEFAULT_ROWS;\n var uid = (_a = opt.uid) !== null && _a !== void 0 ? _a : -1;\n var gid = (_b = opt.gid) !== null && _b !== void 0 ? _b : -1;\n var env = utils_1.assign({}, opt.env);\n if (opt.env === process.env) {\n _this._sanitizeEnv(env);\n }\n var cwd = opt.cwd || process.cwd();\n env.PWD = cwd;\n var name = opt.name || env.TERM || DEFAULT_NAME;\n env.TERM = name;\n var parsedEnv = _this._parseEnv(env);\n var encoding = (opt.encoding === undefined ? 'utf8' : opt.encoding);\n var onexit = function (code, signal) {\n // XXX Sometimes a data event is emitted after exit. Wait til socket is\n // destroyed.\n if (!_this._emittedClose) {\n if (_this._boundClose) {\n return;\n }\n _this._boundClose = true;\n // From macOS High Sierra 10.13.2 sometimes the socket never gets\n // closed. A timeout is applied here to avoid the terminal never being\n // destroyed when this occurs.\n var timeout_1 = setTimeout(function () {\n timeout_1 = null;\n // Destroying the socket now will cause the close event to fire\n _this._socket.destroy();\n }, DESTROY_SOCKET_TIMEOUT_MS);\n _this.once('close', function () {\n if (timeout_1 !== null) {\n clearTimeout(timeout_1);\n }\n _this.emit('exit', code, signal);\n });\n return;\n }\n _this.emit('exit', code, signal);\n };\n // fork\n var term = pty.fork(file, args, parsedEnv, cwd, _this._cols, _this._rows, uid, gid, (encoding === 'utf8'), helperPath, onexit);\n _this._socket = new tty.ReadStream(term.fd);\n if (encoding !== null) {\n _this._socket.setEncoding(encoding);\n }\n // setup\n _this._socket.on('error', function (err) {\n // NOTE: fs.ReadStream gets EAGAIN twice at first:\n if (err.code) {\n if (~err.code.indexOf('EAGAIN')) {\n return;\n }\n }\n // close\n _this._close();\n // EIO on exit from fs.ReadStream:\n if (!_this._emittedClose) {\n _this._emittedClose = true;\n _this.emit('close');\n }\n // EIO, happens when someone closes our child process: the only process in\n // the terminal.\n // node < 0.6.14: errno 5\n // node >= 0.6.14: read EIO\n if (err.code) {\n if (~err.code.indexOf('errno 5') || ~err.code.indexOf('EIO')) {\n return;\n }\n }\n // throw anything else\n if (_this.listeners('error').length < 2) {\n throw err;\n }\n });\n _this._pid = term.pid;\n _this._fd = term.fd;\n _this._pty = term.pty;\n _this._file = file;\n _this._name = name;\n _this._readable = true;\n _this._writable = true;\n _this._socket.on('close', function () {\n if (_this._emittedClose) {\n return;\n }\n _this._emittedClose = true;\n _this._close();\n _this.emit('close');\n });\n _this._forwardEvents();\n return _this;\n }\n Object.defineProperty(UnixTerminal.prototype, \"master\", {\n get: function () { return this._master; },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(UnixTerminal.prototype, \"slave\", {\n get: function () { return this._slave; },\n enumerable: true,\n configurable: true\n });\n UnixTerminal.prototype._write = function (data) {\n this._socket.write(data);\n };\n Object.defineProperty(UnixTerminal.prototype, \"fd\", {\n /* Accessors */\n get: function () { return this._fd; },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(UnixTerminal.prototype, \"ptsName\", {\n get: function () { return this._pty; },\n enumerable: true,\n configurable: true\n });\n /**\n * openpty\n */\n UnixTerminal.open = function (opt) {\n var self = Object.create(UnixTerminal.prototype);\n opt = opt || {};\n if (arguments.length > 1) {\n opt = {\n cols: arguments[1],\n rows: arguments[2]\n };\n }\n var cols = opt.cols || terminal_1.DEFAULT_COLS;\n var rows = opt.rows || terminal_1.DEFAULT_ROWS;\n var encoding = (opt.encoding === undefined ? 'utf8' : opt.encoding);\n // open\n var term = pty.open(cols, rows);\n self._master = new tty.ReadStream(term.master);\n if (encoding !== null) {\n self._master.setEncoding(encoding);\n }\n self._master.resume();\n self._slave = new tty.ReadStream(term.slave);\n if (encoding !== null) {\n self._slave.setEncoding(encoding);\n }\n self._slave.resume();\n self._socket = self._master;\n self._pid = -1;\n self._fd = term.master;\n self._pty = term.pty;\n self._file = process.argv[0] || 'node';\n self._name = process.env.TERM || '';\n self._readable = true;\n self._writable = true;\n self._socket.on('error', function (err) {\n self._close();\n if (self.listeners('error').length < 2) {\n throw err;\n }\n });\n self._socket.on('close', function () {\n self._close();\n });\n return self;\n };\n UnixTerminal.prototype.destroy = function () {\n var _this = this;\n this._close();\n // Need to close the read stream so node stops reading a dead file\n // descriptor. Then we can safely SIGHUP the shell.\n this._socket.once('close', function () {\n _this.kill('SIGHUP');\n });\n this._socket.destroy();\n };\n UnixTerminal.prototype.kill = function (signal) {\n try {\n process.kill(this.pid, signal || 'SIGHUP');\n }\n catch (e) { /* swallow */ }\n };\n Object.defineProperty(UnixTerminal.prototype, \"process\", {\n /**\n * Gets the name of the process.\n */\n get: function () {\n if (process.platform === 'darwin') {\n var title = pty.process(this._fd);\n return (title !== 'kernel_task') ? title : this._file;\n }\n return pty.process(this._fd, this._pty) || this._file;\n },\n enumerable: true,\n configurable: true\n });\n /**\n * TTY\n */\n UnixTerminal.prototype.resize = function (cols, rows) {\n if (cols <= 0 || rows <= 0 || isNaN(cols) || isNaN(rows) || cols === Infinity || rows === Infinity) {\n throw new Error('resizing must be done using positive cols and rows');\n }\n pty.resize(this._fd, cols, rows);\n this._cols = cols;\n this._rows = rows;\n };\n UnixTerminal.prototype.clear = function () {\n };\n UnixTerminal.prototype._sanitizeEnv = function (env) {\n // Make sure we didn't start our server from inside tmux.\n delete env['TMUX'];\n delete env['TMUX_PANE'];\n // Make sure we didn't start our server from inside screen.\n // http://web.mit.edu/gnu/doc/html/screen_20.html\n delete env['STY'];\n delete env['WINDOW'];\n // Delete some variables that might confuse our terminal.\n delete env['WINDOWID'];\n delete env['TERMCAP'];\n delete env['COLUMNS'];\n delete env['LINES'];\n };\n return UnixTerminal;\n}(terminal_1.Terminal));\nexports.UnixTerminal = UnixTerminal;\n",
|
|
14
|
-
"\"use strict\";\n/**\n * Copyright (c) 2012-2015, Christopher Jeffrey, Peter Sunde (MIT License)\n * Copyright (c) 2016, Daniel Imms (MIT License).\n * Copyright (c) 2018, Microsoft Corporation (MIT License).\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar terminalCtor;\nif (process.platform === 'win32') {\n terminalCtor = require('./windowsTerminal').WindowsTerminal;\n}\nelse {\n terminalCtor = require('./unixTerminal').UnixTerminal;\n}\n/**\n * Forks a process as a pseudoterminal.\n * @param file The file to launch.\n * @param args The file's arguments as argv (string[]) or in a pre-escaped\n * CommandLine format (string). Note that the CommandLine option is only\n * available on Windows and is expected to be escaped properly.\n * @param options The options of the terminal.\n * @throws When the file passed to spawn with does not exists.\n * @see CommandLineToArgvW https://msdn.microsoft.com/en-us/library/windows/desktop/bb776391(v=vs.85).aspx\n * @see Parsing C++ Comamnd-Line Arguments https://msdn.microsoft.com/en-us/library/17w5ykft.aspx\n * @see GetCommandLine https://msdn.microsoft.com/en-us/library/windows/desktop/ms683156.aspx\n */\nfunction spawn(file, args, opt) {\n return new terminalCtor(file, args, opt);\n}\nexports.spawn = spawn;\n/** @deprecated */\nfunction fork(file, args, opt) {\n return new terminalCtor(file, args, opt);\n}\nexports.fork = fork;\n/** @deprecated */\nfunction createTerminal(file, args, opt) {\n return new terminalCtor(file, args, opt);\n}\nexports.createTerminal = createTerminal;\nfunction open(options) {\n return terminalCtor.open(options);\n}\nexports.open = open;\n",
|
|
15
|
-
"import {\n\ttype Action,\n\ttype ActionExample,\n\ttype Content,\n\ttype HandlerCallback,\n\ttype HandlerOptions,\n\ttype IAgentRuntime,\n\tlogger,\n\ttype Memory,\n\ttype State,\n} from \"@elizaos/core\";\nimport { requireActionSpec } from \"../generated/specs/spec-helpers\";\nimport type { ShellService } from \"../services/shellService\";\n\nconst spec = requireActionSpec(\"CLEAR_SHELL_HISTORY\");\n\nexport const clearHistory: Action = {\n\tname: spec.name,\n\tsimiles: spec.similes ? [...spec.similes] : [],\n\tdescription: spec.description,\n\t\tvalidate: async (runtime: any, message: any, state?: any, options?: any): Promise<boolean> => {\n\t\tconst __avTextRaw = typeof message?.content?.text === 'string' ? message.content.text : '';\n\t\tconst __avText = __avTextRaw.toLowerCase();\n\t\tconst __avKeywords = ['clear', 'shell', 'history'];\n\t\tconst __avKeywordOk =\n\t\t\t__avKeywords.length > 0 &&\n\t\t\t__avKeywords.some((kw) => kw.length > 0 && __avText.includes(kw));\n\t\tconst __avRegex = new RegExp('\\\\b(?:clear|shell|history)\\\\b', 'i');\n\t\tconst __avRegexOk = __avRegex.test(__avText);\n\t\tconst __avSource = String(message?.content?.source ?? message?.source ?? '');\n\t\tconst __avExpectedSource = '';\n\t\tconst __avSourceOk = __avExpectedSource\n\t\t\t? __avSource === __avExpectedSource\n\t\t\t: Boolean(__avSource || state || runtime?.agentId || runtime?.getService);\n\t\tconst __avOptions = options && typeof options === 'object' ? options : {};\n\t\tconst __avInputOk =\n\t\t\t__avText.trim().length > 0 ||\n\t\t\tObject.keys(__avOptions as Record<string, unknown>).length > 0 ||\n\t\t\tBoolean(message?.content && typeof message.content === 'object');\n\n\t\tif (!(__avKeywordOk && __avRegexOk && __avSourceOk && __avInputOk)) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst __avLegacyValidate = async (\n\t\t\truntime: IAgentRuntime,\n\t\t\tmessage: Memory,\n\t\t\t_state: State,\n\t\t): Promise<boolean> => {\n\t\t\tconst shellService = runtime.getService<ShellService>(\"shell\");\n\t\t\tif (!shellService) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tconst text = message.content.text?.toLowerCase() || \"\";\n\t\t\tconst clearKeywords = [\"clear\", \"reset\", \"delete\", \"remove\", \"clean\"];\n\t\t\tconst historyKeywords = [\"history\", \"terminal\", \"shell\", \"command\"];\n\n\t\t\tconst hasClearKeyword = clearKeywords.some((keyword) =>\n\t\t\t\ttext.includes(keyword),\n\t\t\t);\n\t\t\tconst hasHistoryKeyword = historyKeywords.some((keyword) =>\n\t\t\t\ttext.includes(keyword),\n\t\t\t);\n\n\t\t\treturn hasClearKeyword && hasHistoryKeyword;\n\t\t};\n\t\ttry {\n\t\t\treturn Boolean(await (__avLegacyValidate as any)(runtime, message, state, options));\n\t\t} catch {\n\t\t\treturn false;\n\t\t}\n\t},\n\thandler: async (\n\t\truntime: IAgentRuntime,\n\t\tmessage: Memory,\n\t\t_state: State,\n\t\t_options?: HandlerOptions,\n\t\tcallback?: HandlerCallback,\n\t) => {\n\t\tconst shellService = runtime.getService<ShellService>(\"shell\");\n\n\t\tif (!shellService) {\n\t\t\tif (callback) {\n\t\t\t\tawait callback({\n\t\t\t\t\ttext: \"Shell service is not available.\",\n\t\t\t\t\tsource: message.content.source,\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn { success: false, error: \"Shell service is not available.\" };\n\t\t}\n\n\t\tconst conversationId = message.roomId || message.agentId;\n\t\tif (!conversationId) {\n\t\t\tconst errorMsg = \"No conversation ID available\";\n\t\t\tif (callback) {\n\t\t\t\tawait callback({\n\t\t\t\t\ttext: errorMsg,\n\t\t\t\t\tsource: message.content.source,\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn { success: false, error: errorMsg };\n\t\t}\n\t\tshellService.clearCommandHistory(conversationId);\n\n\t\tlogger.info(`Cleared shell history for conversation: ${conversationId}`);\n\n\t\tconst response: Content = {\n\t\t\ttext: \"Shell command history has been cleared.\",\n\t\t\tsource: message.content.source,\n\t\t};\n\n\t\tif (callback) {\n\t\t\tawait callback(response);\n\t\t}\n\t\treturn { success: true, text: response.text };\n\t},\n\texamples: (spec.examples ?? []) as ActionExample[][],\n};\n\nexport default clearHistory;\n",
|
|
16
|
-
"/**\n * Auto-generated canonical action/provider/evaluator docs for plugin-shell.\n * DO NOT EDIT - Generated from prompts/specs/**.\n */\n\nexport type ActionDoc = {\n\tname: string;\n\tdescription: string;\n\tsimiles?: readonly string[];\n\tparameters?: readonly unknown[];\n\texamples?: readonly (readonly unknown[])[];\n};\n\nexport type ProviderDoc = {\n\tname: string;\n\tdescription: string;\n\tposition?: number;\n\tdynamic?: boolean;\n};\n\nexport type EvaluatorDoc = {\n\tname: string;\n\tdescription: string;\n\tsimiles?: readonly string[];\n\talwaysRun?: boolean;\n\texamples?: readonly unknown[];\n};\n\nexport const coreActionsSpec = {\n\tversion: \"1.0.0\",\n\tactions: [\n\t\t{\n\t\t\tname: \"CLEAR_SHELL_HISTORY\",\n\t\t\tdescription:\n\t\t\t\t\"Clears the recorded history of shell commands for the current conversation\",\n\t\t\tsimiles: [\n\t\t\t\t\"RESET_SHELL\",\n\t\t\t\t\"CLEAR_TERMINAL\",\n\t\t\t\t\"CLEAR_HISTORY\",\n\t\t\t\t\"RESET_HISTORY\",\n\t\t\t],\n\t\t\tparameters: [],\n\t\t},\n\t],\n} as const;\nexport const allActionsSpec = {\n\tversion: \"1.0.0\",\n\tactions: [\n\t\t{\n\t\t\tname: \"CLEAR_SHELL_HISTORY\",\n\t\t\tdescription:\n\t\t\t\t\"Clears the recorded history of shell commands for the current conversation\",\n\t\t\tsimiles: [\n\t\t\t\t\"RESET_SHELL\",\n\t\t\t\t\"CLEAR_TERMINAL\",\n\t\t\t\t\"CLEAR_HISTORY\",\n\t\t\t\t\"RESET_HISTORY\",\n\t\t\t],\n\t\t\tparameters: [],\n\t\t},\n\t],\n} as const;\nexport const coreProvidersSpec = {\n\tversion: \"1.0.0\",\n\tproviders: [\n\t\t{\n\t\t\tname: \"SHELL_HISTORY\",\n\t\t\tdescription:\n\t\t\t\t\"Provides recent shell command history, current working directory, and file operations within the restricted environment\",\n\t\t\tdynamic: true,\n\t\t},\n\t],\n} as const;\nexport const allProvidersSpec = {\n\tversion: \"1.0.0\",\n\tproviders: [\n\t\t{\n\t\t\tname: \"SHELL_HISTORY\",\n\t\t\tdescription:\n\t\t\t\t\"Provides recent shell command history, current working directory, and file operations within the restricted environment\",\n\t\t\tdynamic: true,\n\t\t},\n\t],\n} as const;\nexport const coreEvaluatorsSpec = {\n\tversion: \"1.0.0\",\n\tevaluators: [],\n} as const;\nexport const allEvaluatorsSpec = {\n\tversion: \"1.0.0\",\n\tevaluators: [],\n} as const;\n\nexport const coreActionDocs: readonly ActionDoc[] = coreActionsSpec.actions;\nexport const allActionDocs: readonly ActionDoc[] = allActionsSpec.actions;\nexport const coreProviderDocs: readonly ProviderDoc[] =\n\tcoreProvidersSpec.providers;\nexport const allProviderDocs: readonly ProviderDoc[] =\n\tallProvidersSpec.providers;\nexport const coreEvaluatorDocs: readonly EvaluatorDoc[] =\n\tcoreEvaluatorsSpec.evaluators;\nexport const allEvaluatorDocs: readonly EvaluatorDoc[] =\n\tallEvaluatorsSpec.evaluators;\n",
|
|
17
|
-
"/**\n * Helper functions to lookup action/provider/evaluator specs by name.\n * These allow language-specific implementations to import their text content\n * (description, similes, examples) from the centralized specs.\n *\n * DO NOT EDIT the spec data - update prompts/actions.json, prompts/providers.json, prompts/evaluators.json and regenerate.\n */\n\nimport {\n\ttype ActionDoc,\n\tallActionDocs,\n\tallEvaluatorDocs,\n\tallProviderDocs,\n\tcoreActionDocs,\n\tcoreEvaluatorDocs,\n\tcoreProviderDocs,\n\ttype EvaluatorDoc,\n\ttype ProviderDoc,\n} from \"./specs\";\n\n// Build lookup maps for O(1) access\nconst coreActionMap = new Map<string, ActionDoc>(\n\tcoreActionDocs.map((doc) => [doc.name, doc]),\n);\nconst allActionMap = new Map<string, ActionDoc>(\n\tallActionDocs.map((doc) => [doc.name, doc]),\n);\nconst coreProviderMap = new Map<string, ProviderDoc>(\n\tcoreProviderDocs.map((doc) => [doc.name, doc]),\n);\nconst allProviderMap = new Map<string, ProviderDoc>(\n\tallProviderDocs.map((doc) => [doc.name, doc]),\n);\nconst coreEvaluatorMap = new Map<string, EvaluatorDoc>(\n\tcoreEvaluatorDocs.map((doc) => [doc.name, doc]),\n);\nconst allEvaluatorMap = new Map<string, EvaluatorDoc>(\n\tallEvaluatorDocs.map((doc) => [doc.name, doc]),\n);\n\n/**\n * Get an action spec by name from the core specs.\n * @param name - The action name\n * @returns The action spec or undefined if not found\n */\nexport function getActionSpec(name: string): ActionDoc | undefined {\n\treturn coreActionMap.get(name) ?? allActionMap.get(name);\n}\n\n/**\n * Get an action spec by name, throwing if not found.\n * @param name - The action name\n * @returns The action spec\n * @throws Error if the action is not found\n */\nexport function requireActionSpec(name: string): ActionDoc {\n\tconst spec = getActionSpec(name);\n\tif (!spec) {\n\t\tthrow new Error(`Action spec not found: ${name}`);\n\t}\n\treturn spec;\n}\n\n/**\n * Get a provider spec by name from the core specs.\n * @param name - The provider name\n * @returns The provider spec or undefined if not found\n */\nexport function getProviderSpec(name: string): ProviderDoc | undefined {\n\treturn coreProviderMap.get(name) ?? allProviderMap.get(name);\n}\n\n/**\n * Get a provider spec by name, throwing if not found.\n * @param name - The provider name\n * @returns The provider spec\n * @throws Error if the provider is not found\n */\nexport function requireProviderSpec(name: string): ProviderDoc {\n\tconst spec = getProviderSpec(name);\n\tif (!spec) {\n\t\tthrow new Error(`Provider spec not found: ${name}`);\n\t}\n\treturn spec;\n}\n\n/**\n * Get an evaluator spec by name from the core specs.\n * @param name - The evaluator name\n * @returns The evaluator spec or undefined if not found\n */\nexport function getEvaluatorSpec(name: string): EvaluatorDoc | undefined {\n\treturn coreEvaluatorMap.get(name) ?? allEvaluatorMap.get(name);\n}\n\n/**\n * Get an evaluator spec by name, throwing if not found.\n * @param name - The evaluator name\n * @returns The evaluator spec\n * @throws Error if the evaluator is not found\n */\nexport function requireEvaluatorSpec(name: string): EvaluatorDoc {\n\tconst spec = getEvaluatorSpec(name);\n\tif (!spec) {\n\t\tthrow new Error(`Evaluator spec not found: ${name}`);\n\t}\n\treturn spec;\n}\n\n// Re-export types for convenience\nexport type { ActionDoc, ProviderDoc, EvaluatorDoc };\n",
|
|
18
|
-
"/**\n * Allowlist Management\n *\n * Functions for managing the exec approval allowlist.\n * Handles loading, saving, and modifying allowlist entries.\n */\n\nimport crypto from \"node:crypto\";\nimport fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { logger } from \"@elizaos/core\";\nimport type {\n\tCommandResolution,\n\tExecAllowlistEntry,\n\tExecApprovalsAgent,\n\tExecApprovalsDefaults,\n\tExecApprovalsFile,\n\tExecApprovalsResolved,\n\tExecApprovalsSnapshot,\n\tExecAsk,\n\tExecSecurity,\n} from \"./types\";\nimport { EXEC_APPROVAL_DEFAULTS } from \"./types\";\n\n/** Default socket path for external approval UI */\nconst DEFAULT_SOCKET_PATH = \"~/.eliza/exec-approvals.sock\";\n\n/** Default file path for approval configuration */\nconst DEFAULT_FILE_PATH = \"~/.eliza/exec-approvals.json\";\n\n/** Default agent ID */\nconst DEFAULT_AGENT_ID = \"default\";\n\n/**\n * Expand home directory in path\n */\nfunction expandHome(value: string): string {\n\tif (!value) return value;\n\tif (value === \"~\") return os.homedir();\n\tif (value.startsWith(\"~/\")) return path.join(os.homedir(), value.slice(2));\n\treturn value;\n}\n\n/**\n * Hash raw content for change detection\n */\nfunction hashContent(raw: string | null): string {\n\treturn crypto\n\t\t.createHash(\"sha256\")\n\t\t.update(raw ?? \"\")\n\t\t.digest(\"hex\");\n}\n\n/**\n * Get the default approval file path\n */\nexport function getApprovalFilePath(): string {\n\treturn expandHome(DEFAULT_FILE_PATH);\n}\n\n/**\n * Get the default socket path\n */\nexport function getApprovalSocketPath(): string {\n\treturn expandHome(DEFAULT_SOCKET_PATH);\n}\n\n/**\n * Ensure directory exists for a file path\n */\nfunction ensureDir(filePath: string): void {\n\tconst dir = path.dirname(filePath);\n\tfs.mkdirSync(dir, { recursive: true });\n}\n\n/**\n * Normalize allowlist pattern for comparison\n */\nfunction normalizePattern(value: string | undefined): string | null {\n\tconst trimmed = value?.trim() ?? \"\";\n\treturn trimmed ? trimmed.toLowerCase() : null;\n}\n\n/**\n * Ensure all allowlist entries have IDs\n */\nfunction ensureAllowlistIds(\n\tallowlist: ExecAllowlistEntry[] | undefined,\n): ExecAllowlistEntry[] | undefined {\n\tif (!Array.isArray(allowlist) || allowlist.length === 0) {\n\t\treturn allowlist;\n\t}\n\n\tlet changed = false;\n\tconst next = allowlist.map((entry) => {\n\t\tif (entry.id) return entry;\n\t\tchanged = true;\n\t\treturn { ...entry, id: crypto.randomUUID() };\n\t});\n\n\treturn changed ? next : allowlist;\n}\n\n/**\n * Merge legacy agent configuration with current\n */\nfunction mergeLegacyAgent(\n\tcurrent: ExecApprovalsAgent,\n\tlegacy: ExecApprovalsAgent,\n): ExecApprovalsAgent {\n\tconst allowlist: ExecAllowlistEntry[] = [];\n\tconst seen = new Set<string>();\n\n\tconst pushEntry = (entry: ExecAllowlistEntry) => {\n\t\tconst key = normalizePattern(entry.pattern);\n\t\tif (!key || seen.has(key)) return;\n\t\tseen.add(key);\n\t\tallowlist.push(entry);\n\t};\n\n\tfor (const entry of current.allowlist ?? []) pushEntry(entry);\n\tfor (const entry of legacy.allowlist ?? []) pushEntry(entry);\n\n\treturn {\n\t\tsecurity: current.security ?? legacy.security,\n\t\task: current.ask ?? legacy.ask,\n\t\taskFallback: current.askFallback ?? legacy.askFallback,\n\t\tautoAllowSkills: current.autoAllowSkills ?? legacy.autoAllowSkills,\n\t\tallowlist: allowlist.length > 0 ? allowlist : undefined,\n\t};\n}\n\n/**\n * Normalize approval configuration file\n */\nexport function normalizeApprovals(file: ExecApprovalsFile): ExecApprovalsFile {\n\tconst socketPath = file.socket?.path?.trim();\n\tconst token = file.socket?.token?.trim();\n\tconst agents = { ...file.agents };\n\n\t// Handle legacy \"default\" agent\n\tconst legacyDefault = agents.default;\n\tif (legacyDefault) {\n\t\tconst main = agents[DEFAULT_AGENT_ID];\n\t\tagents[DEFAULT_AGENT_ID] = main\n\t\t\t? mergeLegacyAgent(main, legacyDefault)\n\t\t\t: legacyDefault;\n\t\tdelete agents.default;\n\t}\n\n\t// Ensure all allowlist entries have IDs\n\tfor (const [key, agent] of Object.entries(agents)) {\n\t\tconst allowlist = ensureAllowlistIds(agent.allowlist);\n\t\tif (allowlist !== agent.allowlist) {\n\t\t\tagents[key] = { ...agent, allowlist };\n\t\t}\n\t}\n\n\treturn {\n\t\tversion: 1,\n\t\tsocket: {\n\t\t\tpath: socketPath && socketPath.length > 0 ? socketPath : undefined,\n\t\t\ttoken: token && token.length > 0 ? token : undefined,\n\t\t},\n\t\tdefaults: {\n\t\t\tsecurity: file.defaults?.security,\n\t\t\task: file.defaults?.ask,\n\t\t\taskFallback: file.defaults?.askFallback,\n\t\t\tautoAllowSkills: file.defaults?.autoAllowSkills,\n\t\t},\n\t\tagents,\n\t};\n}\n\n/**\n * Generate a secure token\n */\nfunction generateToken(): string {\n\treturn crypto.randomBytes(24).toString(\"base64url\");\n}\n\n/**\n * Read approval configuration snapshot\n */\nexport function readApprovalsSnapshot(): ExecApprovalsSnapshot {\n\tconst filePath = getApprovalFilePath();\n\n\tif (!fs.existsSync(filePath)) {\n\t\tconst file = normalizeApprovals({ version: 1, agents: {} });\n\t\treturn {\n\t\t\tpath: filePath,\n\t\t\texists: false,\n\t\t\traw: null,\n\t\t\tfile,\n\t\t\thash: hashContent(null),\n\t\t};\n\t}\n\n\tconst raw = fs.readFileSync(filePath, \"utf8\");\n\tlet parsed: ExecApprovalsFile | null = null;\n\n\ttry {\n\t\tparsed = JSON.parse(raw) as ExecApprovalsFile;\n\t} catch (parseError) {\n\t\tlogger.warn(\n\t\t\t{ src: \"exec-approval\", parseError, filePath },\n\t\t\t\"Failed to parse approval config snapshot - file may be corrupted\",\n\t\t);\n\t\tparsed = null;\n\t}\n\n\tconst file =\n\t\tparsed?.version === 1\n\t\t\t? normalizeApprovals(parsed)\n\t\t\t: normalizeApprovals({ version: 1, agents: {} });\n\n\tif (parsed && parsed.version !== 1) {\n\t\tlogger.warn(\n\t\t\t{ src: \"exec-approval\", version: parsed.version, filePath },\n\t\t\t\"Approval config snapshot has unexpected version\",\n\t\t);\n\t}\n\n\treturn {\n\t\tpath: filePath,\n\t\texists: true,\n\t\traw,\n\t\tfile,\n\t\thash: hashContent(raw),\n\t};\n}\n\n/**\n * Load approval configuration\n */\nexport function loadApprovals(): ExecApprovalsFile {\n\tconst filePath = getApprovalFilePath();\n\n\ttry {\n\t\tif (!fs.existsSync(filePath)) {\n\t\t\tlogger.debug(\n\t\t\t\t{ src: \"exec-approval\", filePath },\n\t\t\t\t\"Approval config file does not exist, using defaults\",\n\t\t\t);\n\t\t\treturn normalizeApprovals({ version: 1, agents: {} });\n\t\t}\n\n\t\tconst raw = fs.readFileSync(filePath, \"utf8\");\n\t\tlet parsed: ExecApprovalsFile;\n\n\t\ttry {\n\t\t\tparsed = JSON.parse(raw) as ExecApprovalsFile;\n\t\t} catch (parseError) {\n\t\t\tlogger.error(\n\t\t\t\t{ src: \"exec-approval\", parseError, filePath },\n\t\t\t\t\"Failed to parse approval config JSON - file may be corrupted. Using defaults.\",\n\t\t\t);\n\t\t\treturn normalizeApprovals({ version: 1, agents: {} });\n\t\t}\n\n\t\tif (parsed?.version !== 1) {\n\t\t\tlogger.warn(\n\t\t\t\t{ src: \"exec-approval\", version: parsed?.version, filePath },\n\t\t\t\t\"Approval config has unexpected version, using defaults\",\n\t\t\t);\n\t\t\treturn normalizeApprovals({ version: 1, agents: {} });\n\t\t}\n\n\t\treturn normalizeApprovals(parsed);\n\t} catch (error) {\n\t\tlogger.error(\n\t\t\t{ src: \"exec-approval\", error, filePath },\n\t\t\t\"Failed to load approval config - using defaults. This may indicate a permissions issue.\",\n\t\t);\n\t\treturn normalizeApprovals({ version: 1, agents: {} });\n\t}\n}\n\n/**\n * Save approval configuration\n * @throws Error if file cannot be written\n */\nexport function saveApprovals(file: ExecApprovalsFile): void {\n\tconst filePath = getApprovalFilePath();\n\ttry {\n\t\tensureDir(filePath);\n\t\tfs.writeFileSync(filePath, `${JSON.stringify(file, null, 2)}\\n`, {\n\t\t\tmode: 0o600,\n\t\t});\n\n\t\ttry {\n\t\t\tfs.chmodSync(filePath, 0o600);\n\t\t} catch {\n\t\t\t// Best-effort on platforms without chmod (e.g., Windows)\n\t\t}\n\t} catch (error) {\n\t\tlogger.error(\n\t\t\t{ src: \"exec-approval\", error, filePath },\n\t\t\t\"Failed to save approval configuration\",\n\t\t);\n\t\tthrow new Error(\n\t\t\t`Failed to save approval configuration to ${filePath}: ${error}`,\n\t\t);\n\t}\n}\n\n/**\n * Ensure approval configuration exists with socket/token\n * @throws Error if configuration cannot be loaded or saved\n */\nexport function ensureApprovals(): ExecApprovalsFile {\n\tconst loaded = loadApprovals();\n\tconst next = normalizeApprovals(loaded);\n\n\tconst socketPath = next.socket?.path?.trim();\n\tconst token = next.socket?.token?.trim();\n\n\tconst updated: ExecApprovalsFile = {\n\t\t...next,\n\t\tsocket: {\n\t\t\tpath:\n\t\t\t\tsocketPath && socketPath.length > 0\n\t\t\t\t\t? socketPath\n\t\t\t\t\t: getApprovalSocketPath(),\n\t\t\ttoken: token && token.length > 0 ? token : generateToken(),\n\t\t},\n\t};\n\n\t// Try to save - if it fails, we can still return the in-memory config\n\t// but the caller should handle the error appropriately\n\ttry {\n\t\tsaveApprovals(updated);\n\t} catch (error) {\n\t\tlogger.warn(\n\t\t\t{ src: \"exec-approval\", error },\n\t\t\t\"Failed to save approval config during ensureApprovals - \" +\n\t\t\t\t\"returning in-memory config. Changes will not persist.\",\n\t\t);\n\t\t// Re-throw so caller knows something went wrong\n\t\tthrow error;\n\t}\n\n\treturn updated;\n}\n\n/**\n * Normalize security value\n */\nfunction normalizeSecurity(\n\tvalue: ExecSecurity | undefined,\n\tfallback: ExecSecurity,\n): ExecSecurity {\n\tif (value === \"allowlist\" || value === \"full\" || value === \"deny\") {\n\t\treturn value;\n\t}\n\treturn fallback;\n}\n\n/**\n * Normalize ask value\n */\nfunction normalizeAsk(value: ExecAsk | undefined, fallback: ExecAsk): ExecAsk {\n\tif (value === \"always\" || value === \"off\" || value === \"on-miss\") {\n\t\treturn value;\n\t}\n\treturn fallback;\n}\n\n/**\n * Resolve approval configuration for an agent\n * @throws Error if configuration cannot be loaded or saved\n */\nexport function resolveApprovals(\n\tagentId?: string,\n\toverrides?: Partial<ExecApprovalsDefaults>,\n): ExecApprovalsResolved {\n\t// Try to ensure approvals exist (may fail if can't write to disk)\n\t// If it fails, we load what we can and proceed with that\n\tlet file: ExecApprovalsFile;\n\ttry {\n\t\tfile = ensureApprovals();\n\t} catch (error) {\n\t\t// ensureApprovals failed (likely can't write) - use loadApprovals which is read-only\n\t\tlogger.warn(\n\t\t\t{ src: \"exec-approval\", error },\n\t\t\t\"Could not ensure approval config exists - using read-only config\",\n\t\t);\n\t\tfile = loadApprovals();\n\t}\n\n\treturn resolveApprovalsFromFile({\n\t\tfile,\n\t\tagentId,\n\t\toverrides,\n\t\tpath: getApprovalFilePath(),\n\t\tsocketPath: expandHome(file.socket?.path ?? getApprovalSocketPath()),\n\t\ttoken: file.socket?.token ?? \"\",\n\t});\n}\n\n/**\n * Resolve approval configuration from a loaded file\n */\nexport function resolveApprovalsFromFile(params: {\n\tfile: ExecApprovalsFile;\n\tagentId?: string;\n\toverrides?: Partial<ExecApprovalsDefaults>;\n\tpath?: string;\n\tsocketPath?: string;\n\ttoken?: string;\n}): ExecApprovalsResolved {\n\tconst file = normalizeApprovals(params.file);\n\tconst defaults = file.defaults ?? {};\n\tconst agentKey = params.agentId ?? DEFAULT_AGENT_ID;\n\tconst agent = file.agents?.[agentKey] ?? {};\n\tconst wildcard = file.agents?.[\"*\"] ?? {};\n\n\tconst fallbackSecurity =\n\t\tparams.overrides?.security ?? EXEC_APPROVAL_DEFAULTS.security;\n\tconst fallbackAsk = params.overrides?.ask ?? EXEC_APPROVAL_DEFAULTS.ask;\n\tconst fallbackAskFallback =\n\t\tparams.overrides?.askFallback ?? EXEC_APPROVAL_DEFAULTS.askFallback;\n\tconst fallbackAutoAllowSkills =\n\t\tparams.overrides?.autoAllowSkills ?? EXEC_APPROVAL_DEFAULTS.autoAllowSkills;\n\n\tconst resolvedDefaults: Required<ExecApprovalsDefaults> = {\n\t\tsecurity: normalizeSecurity(defaults.security, fallbackSecurity),\n\t\task: normalizeAsk(defaults.ask, fallbackAsk),\n\t\taskFallback: normalizeSecurity(\n\t\t\tdefaults.askFallback ?? fallbackAskFallback,\n\t\t\tfallbackAskFallback,\n\t\t),\n\t\tautoAllowSkills: Boolean(\n\t\t\tdefaults.autoAllowSkills ?? fallbackAutoAllowSkills,\n\t\t),\n\t};\n\n\tconst resolvedAgent: Required<ExecApprovalsDefaults> = {\n\t\tsecurity: normalizeSecurity(\n\t\t\tagent.security ?? wildcard.security ?? resolvedDefaults.security,\n\t\t\tresolvedDefaults.security,\n\t\t),\n\t\task: normalizeAsk(\n\t\t\tagent.ask ?? wildcard.ask ?? resolvedDefaults.ask,\n\t\t\tresolvedDefaults.ask,\n\t\t),\n\t\taskFallback: normalizeSecurity(\n\t\t\tagent.askFallback ?? wildcard.askFallback ?? resolvedDefaults.askFallback,\n\t\t\tresolvedDefaults.askFallback,\n\t\t),\n\t\tautoAllowSkills: Boolean(\n\t\t\tagent.autoAllowSkills ??\n\t\t\t\twildcard.autoAllowSkills ??\n\t\t\t\tresolvedDefaults.autoAllowSkills,\n\t\t),\n\t};\n\n\tconst allowlist = [\n\t\t...(Array.isArray(wildcard.allowlist) ? wildcard.allowlist : []),\n\t\t...(Array.isArray(agent.allowlist) ? agent.allowlist : []),\n\t];\n\n\treturn {\n\t\tpath: params.path ?? getApprovalFilePath(),\n\t\tsocketPath: expandHome(\n\t\t\tparams.socketPath ?? file.socket?.path ?? getApprovalSocketPath(),\n\t\t),\n\t\ttoken: params.token ?? file.socket?.token ?? \"\",\n\t\tdefaults: resolvedDefaults,\n\t\tagent: resolvedAgent,\n\t\tallowlist,\n\t\tfile,\n\t};\n}\n\n/**\n * Match command against allowlist\n */\nexport function matchAllowlist(\n\tentries: ExecAllowlistEntry[],\n\tresolution: CommandResolution | null,\n): ExecAllowlistEntry | null {\n\tif (!entries.length || !resolution?.resolvedPath) {\n\t\treturn null;\n\t}\n\n\tconst resolvedPath = resolution.resolvedPath;\n\n\tfor (const entry of entries) {\n\t\tconst pattern = entry.pattern?.trim();\n\t\tif (!pattern) continue;\n\n\t\tconst hasPath =\n\t\t\tpattern.includes(\"/\") || pattern.includes(\"\\\\\") || pattern.includes(\"~\");\n\t\tif (!hasPath) continue;\n\n\t\tif (matchesPattern(pattern, resolvedPath)) {\n\t\t\treturn entry;\n\t\t}\n\t}\n\n\treturn null;\n}\n\n/**\n * Check if pattern matches target\n */\nfunction matchesPattern(pattern: string, target: string): boolean {\n\tconst trimmed = pattern.trim();\n\tif (!trimmed) return false;\n\n\tconst expanded = trimmed.startsWith(\"~\") ? expandHome(trimmed) : trimmed;\n\tconst hasWildcard = /[*?]/.test(expanded);\n\n\tlet normalizedPattern = expanded;\n\tlet normalizedTarget = target;\n\n\tif (process.platform === \"win32\" && !hasWildcard) {\n\t\tnormalizedPattern = tryRealpath(expanded) ?? expanded;\n\t\tnormalizedTarget = tryRealpath(target) ?? target;\n\t}\n\n\tnormalizedPattern = normalizeMatchTarget(normalizedPattern);\n\tnormalizedTarget = normalizeMatchTarget(normalizedTarget);\n\n\tconst regex = globToRegExp(normalizedPattern);\n\treturn regex.test(normalizedTarget);\n}\n\n/**\n * Normalize path for matching\n */\nfunction normalizeMatchTarget(value: string): string {\n\tif (process.platform === \"win32\") {\n\t\tconst stripped = value.replace(/^\\\\\\\\[?.]\\\\/, \"\");\n\t\treturn stripped.replace(/\\\\/g, \"/\").toLowerCase();\n\t}\n\treturn value.replace(/\\\\\\\\/g, \"/\").toLowerCase();\n}\n\n/**\n * Try to get realpath (resolve symlinks)\n */\nfunction tryRealpath(value: string): string | null {\n\ttry {\n\t\treturn fs.realpathSync(value);\n\t} catch {\n\t\treturn null;\n\t}\n}\n\n/**\n * Convert glob pattern to RegExp\n */\nfunction globToRegExp(pattern: string): RegExp {\n\tlet regex = \"^\";\n\tlet i = 0;\n\n\twhile (i < pattern.length) {\n\t\tconst ch = pattern[i];\n\n\t\tif (ch === \"*\") {\n\t\t\tconst next = pattern[i + 1];\n\t\t\tif (next === \"*\") {\n\t\t\t\tregex += \".*\";\n\t\t\t\ti += 2;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tregex += \"[^/]*\";\n\t\t\ti += 1;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (ch === \"?\") {\n\t\t\tregex += \".\";\n\t\t\ti += 1;\n\t\t\tcontinue;\n\t\t}\n\n\t\tregex += ch.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n\t\ti += 1;\n\t}\n\n\tregex += \"$\";\n\treturn new RegExp(regex, \"i\");\n}\n\n/**\n * Record allowlist usage\n * @returns true if successful, false if save failed\n */\nexport function recordAllowlistUse(\n\tapprovals: ExecApprovalsFile,\n\tagentId: string | undefined,\n\tentry: ExecAllowlistEntry,\n\tcommand: string,\n\tresolvedPath?: string,\n): boolean {\n\tconst target = agentId ?? DEFAULT_AGENT_ID;\n\tconst agents = approvals.agents ?? {};\n\tconst existing = agents[target] ?? {};\n\tconst allowlist = Array.isArray(existing.allowlist) ? existing.allowlist : [];\n\n\tconst nextAllowlist = allowlist.map((item) =>\n\t\titem.pattern === entry.pattern\n\t\t\t? {\n\t\t\t\t\t...item,\n\t\t\t\t\tid: item.id ?? crypto.randomUUID(),\n\t\t\t\t\tlastUsedAt: Date.now(),\n\t\t\t\t\tlastUsedCommand: command,\n\t\t\t\t\tlastResolvedPath: resolvedPath,\n\t\t\t\t}\n\t\t\t: item,\n\t);\n\n\tagents[target] = { ...existing, allowlist: nextAllowlist };\n\tapprovals.agents = agents;\n\n\ttry {\n\t\tsaveApprovals(approvals);\n\t\treturn true;\n\t} catch (error) {\n\t\tlogger.warn(\n\t\t\t{ src: \"exec-approval\", error, pattern: entry.pattern },\n\t\t\t\"Failed to record allowlist usage - continuing without update\",\n\t\t);\n\t\treturn false;\n\t}\n}\n\n/**\n * Add a new allowlist entry\n * @returns true if entry was added, false if already exists or save failed\n */\nexport function addAllowlistEntry(\n\tapprovals: ExecApprovalsFile,\n\tagentId: string | undefined,\n\tpattern: string,\n): boolean {\n\tconst target = agentId ?? DEFAULT_AGENT_ID;\n\tconst agents = approvals.agents ?? {};\n\tconst existing = agents[target] ?? {};\n\tconst allowlist = Array.isArray(existing.allowlist) ? existing.allowlist : [];\n\n\tconst trimmed = pattern.trim();\n\tif (!trimmed) {\n\t\tlogger.warn(\n\t\t\t{ src: \"exec-approval\" },\n\t\t\t\"Attempted to add empty pattern to allowlist\",\n\t\t);\n\t\treturn false;\n\t}\n\n\tif (allowlist.some((entry) => entry.pattern === trimmed)) {\n\t\tlogger.debug(\n\t\t\t{ src: \"exec-approval\", pattern: trimmed },\n\t\t\t\"Pattern already in allowlist\",\n\t\t);\n\t\treturn false;\n\t}\n\n\tallowlist.push({\n\t\tid: crypto.randomUUID(),\n\t\tpattern: trimmed,\n\t\tlastUsedAt: Date.now(),\n\t});\n\n\tagents[target] = { ...existing, allowlist };\n\tapprovals.agents = agents;\n\n\ttry {\n\t\tsaveApprovals(approvals);\n\t\tlogger.info(\n\t\t\t{ src: \"exec-approval\", pattern: trimmed, agentId: target },\n\t\t\t\"Added pattern to allowlist\",\n\t\t);\n\t\treturn true;\n\t} catch (error) {\n\t\tlogger.error(\n\t\t\t{ src: \"exec-approval\", error, pattern: trimmed },\n\t\t\t\"Failed to save allowlist after adding entry\",\n\t\t);\n\t\treturn false;\n\t}\n}\n\n/**\n * Get minimum security level\n */\nexport function minSecurity(a: ExecSecurity, b: ExecSecurity): ExecSecurity {\n\tconst order: Record<ExecSecurity, number> = {\n\t\tdeny: 0,\n\t\tallowlist: 1,\n\t\tfull: 2,\n\t};\n\treturn order[a] <= order[b] ? a : b;\n}\n\n/**\n * Get maximum ask level\n */\nexport function maxAsk(a: ExecAsk, b: ExecAsk): ExecAsk {\n\tconst order: Record<ExecAsk, number> = { off: 0, \"on-miss\": 1, always: 2 };\n\treturn order[a] >= order[b] ? a : b;\n}\n",
|
|
19
|
-
"/**\n * Exec Approval Types\n *\n * Types for command execution approval system in plugin-shell.\n * Provides type definitions for approval configuration, allowlist entries,\n * command analysis, and approval decisions.\n */\n\nimport type { UUID } from \"@elizaos/core\";\n\n/**\n * Security levels for command execution\n */\nexport type ExecSecurity = \"deny\" | \"allowlist\" | \"full\";\n\n/**\n * Ask modes for approval prompts\n */\nexport type ExecAsk = \"off\" | \"on-miss\" | \"always\";\n\n/**\n * Execution host types\n */\nexport type ExecHost = \"sandbox\" | \"gateway\" | \"node\";\n\n/**\n * Default configuration for exec approvals\n */\nexport interface ExecApprovalsDefaults {\n\t/** Security level (deny, allowlist, full) */\n\tsecurity?: ExecSecurity;\n\t/** Ask mode (off, on-miss, always) */\n\task?: ExecAsk;\n\t/** Fallback security when ask is declined */\n\taskFallback?: ExecSecurity;\n\t/** Auto-allow commands from skill definitions */\n\tautoAllowSkills?: boolean;\n}\n\n/**\n * Allowlist entry for permitted commands\n */\nexport interface ExecAllowlistEntry {\n\t/** Unique identifier */\n\tid?: string;\n\t/** Pattern to match (executable path or glob) */\n\tpattern: string;\n\t/** Last time this pattern was used */\n\tlastUsedAt?: number;\n\t/** Last command that matched this pattern */\n\tlastUsedCommand?: string;\n\t/** Last resolved executable path */\n\tlastResolvedPath?: string;\n}\n\n/**\n * Agent-specific approval configuration\n */\nexport interface ExecApprovalsAgent extends ExecApprovalsDefaults {\n\t/** Allowlist entries for this agent */\n\tallowlist?: ExecAllowlistEntry[];\n}\n\n/**\n * Full approval configuration file structure\n */\nexport interface ExecApprovalsFile {\n\t/** Version number (always 1) */\n\tversion: 1;\n\t/** Socket configuration for external approval UI */\n\tsocket?: {\n\t\tpath?: string;\n\t\ttoken?: string;\n\t};\n\t/** Default approval settings */\n\tdefaults?: ExecApprovalsDefaults;\n\t/** Per-agent approval settings */\n\tagents?: Record<string, ExecApprovalsAgent>;\n}\n\n/**\n * Snapshot of approval configuration file\n */\nexport interface ExecApprovalsSnapshot {\n\t/** File path */\n\tpath: string;\n\t/** Whether the file exists */\n\texists: boolean;\n\t/** Raw file content */\n\traw: string | null;\n\t/** Parsed and normalized configuration */\n\tfile: ExecApprovalsFile;\n\t/** Content hash */\n\thash: string;\n}\n\n/**\n * Resolved approval configuration for an agent\n */\nexport interface ExecApprovalsResolved {\n\t/** File path */\n\tpath: string;\n\t/** Socket path for external approval UI */\n\tsocketPath: string;\n\t/** Authentication token */\n\ttoken: string;\n\t/** Resolved default settings */\n\tdefaults: Required<ExecApprovalsDefaults>;\n\t/** Resolved agent-specific settings */\n\tagent: Required<ExecApprovalsDefaults>;\n\t/** Combined allowlist entries */\n\tallowlist: ExecAllowlistEntry[];\n\t/** Full configuration file */\n\tfile: ExecApprovalsFile;\n}\n\n/**\n * Command resolution result\n */\nexport interface CommandResolution {\n\t/** The raw executable from the command */\n\trawExecutable: string;\n\t/** Fully resolved executable path */\n\tresolvedPath?: string;\n\t/** Executable name (basename) */\n\texecutableName: string;\n}\n\n/**\n * Command segment from shell parsing\n */\nexport interface ExecCommandSegment {\n\t/** Raw command text */\n\traw: string;\n\t/** Parsed argument vector */\n\targv: string[];\n\t/** Resolution of the executable */\n\tresolution: CommandResolution | null;\n}\n\n/**\n * Result of command analysis\n */\nexport interface ExecCommandAnalysis {\n\t/** Whether analysis succeeded */\n\tok: boolean;\n\t/** Reason for failure (if any) */\n\treason?: string;\n\t/** Parsed command segments */\n\tsegments: ExecCommandSegment[];\n\t/** Segments grouped by chain operators (&&, ||, ;) */\n\tchains?: ExecCommandSegment[][];\n}\n\n/**\n * Result of allowlist evaluation\n */\nexport interface ExecAllowlistEvaluation {\n\t/** Whether all commands are in the allowlist */\n\tallowlistSatisfied: boolean;\n\t/** Matching allowlist entries */\n\tallowlistMatches: ExecAllowlistEntry[];\n}\n\n/**\n * Combined analysis and allowlist evaluation\n */\nexport interface ExecAllowlistAnalysis {\n\t/** Whether analysis succeeded */\n\tanalysisOk: boolean;\n\t/** Whether allowlist is satisfied */\n\tallowlistSatisfied: boolean;\n\t/** Matching allowlist entries */\n\tallowlistMatches: ExecAllowlistEntry[];\n\t/** Parsed command segments */\n\tsegments: ExecCommandSegment[];\n}\n\n/**\n * Possible approval decisions\n */\nexport type ExecApprovalDecision = \"allow-once\" | \"allow-always\" | \"deny\";\n\n/**\n * Request for exec approval\n */\nexport interface ExecApprovalRequest {\n\t/** Unique request ID */\n\tid: string;\n\t/** The command to execute */\n\tcommand: string;\n\t/** Working directory */\n\tcwd?: string;\n\t/** Execution host */\n\thost?: ExecHost;\n\t/** Security level */\n\tsecurity?: ExecSecurity;\n\t/** Ask mode */\n\task?: ExecAsk;\n\t/** Agent ID */\n\tagentId?: string;\n\t/** Resolved executable path */\n\tresolvedPath?: string;\n\t/** Session key for routing */\n\tsessionKey?: string;\n\t/** Room ID where approval is requested */\n\troomId: UUID;\n\t/** Timeout in milliseconds */\n\ttimeoutMs?: number;\n}\n\n/**\n * Result of exec approval\n */\nexport interface ExecApprovalResult {\n\t/** The decision made */\n\tdecision: ExecApprovalDecision;\n\t/** Whether approval timed out */\n\ttimedOut: boolean;\n\t/** Who resolved the approval */\n\tresolvedBy?: UUID;\n}\n\n/**\n * Configuration for safe binary commands that don't need approval\n */\nexport const DEFAULT_SAFE_BINS = [\n\t\"jq\",\n\t\"grep\",\n\t\"cut\",\n\t\"sort\",\n\t\"uniq\",\n\t\"head\",\n\t\"tail\",\n\t\"tr\",\n\t\"wc\",\n] as const;\n\n/**\n * Default exec approval settings\n */\nexport const EXEC_APPROVAL_DEFAULTS = {\n\tsecurity: \"deny\" as ExecSecurity,\n\task: \"on-miss\" as ExecAsk,\n\taskFallback: \"deny\" as ExecSecurity,\n\tautoAllowSkills: false,\n\ttimeoutMs: 120_000,\n} as const;\n",
|
|
20
|
-
"/**\n * Command Analysis\n *\n * Functions for analyzing shell commands for security evaluation.\n * Parses commands, resolves executables, and evaluates against allowlists.\n */\n\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { matchAllowlist } from \"./allowlist\";\nimport type {\n\tCommandResolution,\n\tExecAllowlistAnalysis,\n\tExecAllowlistEntry,\n\tExecAllowlistEvaluation,\n\tExecCommandAnalysis,\n\tExecCommandSegment,\n} from \"./types\";\nimport { DEFAULT_SAFE_BINS } from \"./types\";\n\n/**\n * Disallowed tokens in pipeline commands\n */\nconst DISALLOWED_PIPELINE_TOKENS = new Set([\n\t\">\",\n\t\"<\",\n\t\"`\",\n\t\"\\n\",\n\t\"\\r\",\n\t\"(\",\n\t\")\",\n]);\n\n/**\n * Escape characters inside double quotes\n */\nconst DOUBLE_QUOTE_ESCAPES = new Set([\"\\\\\", '\"', \"$\", \"`\", \"\\n\", \"\\r\"]);\n\n/**\n * Windows-specific unsupported tokens\n */\nconst WINDOWS_UNSUPPORTED_TOKENS = new Set([\n\t\"&\",\n\t\"|\",\n\t\"<\",\n\t\">\",\n\t\"^\",\n\t\"(\",\n\t\")\",\n\t\"%\",\n\t\"!\",\n\t\"\\n\",\n\t\"\\r\",\n]);\n\n/**\n * Check if next char is a double-quote escape\n */\nfunction isDoubleQuoteEscape(next: string | undefined): next is string {\n\treturn Boolean(next && DOUBLE_QUOTE_ESCAPES.has(next));\n}\n\n/**\n * Check if a file is executable\n */\nfunction isExecutableFile(filePath: string): boolean {\n\ttry {\n\t\tconst stat = fs.statSync(filePath);\n\t\tif (!stat.isFile()) return false;\n\t\tif (process.platform !== \"win32\") {\n\t\t\tfs.accessSync(filePath, fs.constants.X_OK);\n\t\t}\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\n/**\n * Expand home directory\n */\nfunction expandHome(value: string): string {\n\tif (!value) return value;\n\tif (value === \"~\") return require(\"node:os\").homedir();\n\tif (value.startsWith(\"~/\"))\n\t\treturn path.join(require(\"node:os\").homedir(), value.slice(2));\n\treturn value;\n}\n\n/**\n * Parse the first token from a command string\n */\nfunction parseFirstToken(command: string): string | null {\n\tconst trimmed = command.trim();\n\tif (!trimmed) return null;\n\n\tconst first = trimmed[0];\n\tif (first === '\"' || first === \"'\") {\n\t\tconst end = trimmed.indexOf(first, 1);\n\t\tif (end > 1) return trimmed.slice(1, end);\n\t\treturn trimmed.slice(1);\n\t}\n\n\tconst match = /^[^\\s]+/.exec(trimmed);\n\treturn match ? match[0] : null;\n}\n\n/**\n * Resolve executable path from PATH\n */\nfunction resolveExecutablePath(\n\trawExecutable: string,\n\tcwd?: string,\n\tenv?: NodeJS.ProcessEnv,\n): string | undefined {\n\tconst expanded = rawExecutable.startsWith(\"~\")\n\t\t? expandHome(rawExecutable)\n\t\t: rawExecutable;\n\n\tif (expanded.includes(\"/\") || expanded.includes(\"\\\\\")) {\n\t\tif (path.isAbsolute(expanded)) {\n\t\t\treturn isExecutableFile(expanded) ? expanded : undefined;\n\t\t}\n\t\tconst base = cwd?.trim() || process.cwd();\n\t\tconst candidate = path.resolve(base, expanded);\n\t\treturn isExecutableFile(candidate) ? candidate : undefined;\n\t}\n\n\tconst envPath =\n\t\tenv?.PATH ?? env?.Path ?? process.env.PATH ?? process.env.Path ?? \"\";\n\tconst entries = envPath.split(path.delimiter).filter(Boolean);\n\tconst hasExtension =\n\t\tprocess.platform === \"win32\" && path.extname(expanded).length > 0;\n\n\tconst extensions =\n\t\tprocess.platform === \"win32\"\n\t\t\t? hasExtension\n\t\t\t\t? [\"\"]\n\t\t\t\t: (\n\t\t\t\t\t\tenv?.PATHEXT ??\n\t\t\t\t\t\tenv?.Pathext ??\n\t\t\t\t\t\tprocess.env.PATHEXT ??\n\t\t\t\t\t\tprocess.env.Pathext ??\n\t\t\t\t\t\t\".EXE;.CMD;.BAT;.COM\"\n\t\t\t\t\t)\n\t\t\t\t\t\t.split(\";\")\n\t\t\t\t\t\t.map((ext) => ext.toLowerCase())\n\t\t\t: [\"\"];\n\n\tfor (const entry of entries) {\n\t\tfor (const ext of extensions) {\n\t\t\tconst candidate = path.join(entry, expanded + ext);\n\t\t\tif (isExecutableFile(candidate)) {\n\t\t\t\treturn candidate;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn undefined;\n}\n\n/**\n * Resolve command to executable info\n */\nexport function resolveCommandResolution(\n\tcommand: string,\n\tcwd?: string,\n\tenv?: NodeJS.ProcessEnv,\n): CommandResolution | null {\n\tconst rawExecutable = parseFirstToken(command);\n\tif (!rawExecutable) return null;\n\n\tconst resolvedPath = resolveExecutablePath(rawExecutable, cwd, env);\n\tconst executableName = resolvedPath\n\t\t? path.basename(resolvedPath)\n\t\t: rawExecutable;\n\n\treturn { rawExecutable, resolvedPath, executableName };\n}\n\n/**\n * Resolve command from argv\n */\nexport function resolveCommandFromArgv(\n\targv: string[],\n\tcwd?: string,\n\tenv?: NodeJS.ProcessEnv,\n): CommandResolution | null {\n\tconst rawExecutable = argv[0]?.trim();\n\tif (!rawExecutable) return null;\n\n\tconst resolvedPath = resolveExecutablePath(rawExecutable, cwd, env);\n\tconst executableName = resolvedPath\n\t\t? path.basename(resolvedPath)\n\t\t: rawExecutable;\n\n\treturn { rawExecutable, resolvedPath, executableName };\n}\n\n/**\n * Iterator action types\n */\ntype IteratorAction = \"split\" | \"skip\" | \"include\" | { reject: string };\n\n/**\n * Iterate through command while respecting shell quoting\n */\nfunction iterateQuoteAware(\n\tcommand: string,\n\tonChar: (\n\t\tch: string,\n\t\tnext: string | undefined,\n\t\tindex: number,\n\t) => IteratorAction,\n):\n\t| { ok: true; parts: string[]; hasSplit: boolean }\n\t| { ok: false; reason: string } {\n\tconst parts: string[] = [];\n\tlet buf = \"\";\n\tlet inSingle = false;\n\tlet inDouble = false;\n\tlet escaped = false;\n\tlet hasSplit = false;\n\n\tconst pushPart = () => {\n\t\tconst trimmed = buf.trim();\n\t\tif (trimmed) parts.push(trimmed);\n\t\tbuf = \"\";\n\t};\n\n\tfor (let i = 0; i < command.length; i += 1) {\n\t\tconst ch = command[i];\n\t\tconst next = command[i + 1];\n\n\t\tif (escaped) {\n\t\t\tbuf += ch;\n\t\t\tescaped = false;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (!inSingle && !inDouble && ch === \"\\\\\") {\n\t\t\tescaped = true;\n\t\t\tbuf += ch;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (inSingle) {\n\t\t\tif (ch === \"'\") inSingle = false;\n\t\t\tbuf += ch;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (inDouble) {\n\t\t\tif (ch === \"\\\\\" && isDoubleQuoteEscape(next)) {\n\t\t\t\tbuf += ch;\n\t\t\t\tbuf += next;\n\t\t\t\ti += 1;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (ch === \"$\" && next === \"(\") {\n\t\t\t\treturn { ok: false, reason: \"unsupported shell token: $()\" };\n\t\t\t}\n\t\t\tif (ch === \"`\") {\n\t\t\t\treturn { ok: false, reason: \"unsupported shell token: `\" };\n\t\t\t}\n\t\t\tif (ch === \"\\n\" || ch === \"\\r\") {\n\t\t\t\treturn { ok: false, reason: \"unsupported shell token: newline\" };\n\t\t\t}\n\t\t\tif (ch === '\"') inDouble = false;\n\t\t\tbuf += ch;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (ch === \"'\") {\n\t\t\tinSingle = true;\n\t\t\tbuf += ch;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (ch === '\"') {\n\t\t\tinDouble = true;\n\t\t\tbuf += ch;\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst action = onChar(ch, next, i);\n\t\tif (typeof action === \"object\" && \"reject\" in action) {\n\t\t\treturn { ok: false, reason: action.reject };\n\t\t}\n\t\tif (action === \"split\") {\n\t\t\tpushPart();\n\t\t\thasSplit = true;\n\t\t\tcontinue;\n\t\t}\n\t\tif (action === \"skip\") continue;\n\t\tbuf += ch;\n\t}\n\n\tif (escaped || inSingle || inDouble) {\n\t\treturn { ok: false, reason: \"unterminated shell quote/escape\" };\n\t}\n\n\tpushPart();\n\treturn { ok: true, parts, hasSplit };\n}\n\n/**\n * Split command by pipeline operators\n */\nfunction splitShellPipeline(command: string): {\n\tok: boolean;\n\treason?: string;\n\tsegments: string[];\n} {\n\tlet emptySegment = false;\n\n\tconst result = iterateQuoteAware(command, (ch, next) => {\n\t\tif (ch === \"|\" && next === \"|\") {\n\t\t\treturn { reject: \"unsupported shell token: ||\" };\n\t\t}\n\t\tif (ch === \"|\" && next === \"&\") {\n\t\t\treturn { reject: \"unsupported shell token: |&\" };\n\t\t}\n\t\tif (ch === \"|\") {\n\t\t\temptySegment = true;\n\t\t\treturn \"split\";\n\t\t}\n\t\tif (ch === \"&\" || ch === \";\") {\n\t\t\treturn { reject: `unsupported shell token: ${ch}` };\n\t\t}\n\t\tif (DISALLOWED_PIPELINE_TOKENS.has(ch)) {\n\t\t\treturn { reject: `unsupported shell token: ${ch}` };\n\t\t}\n\t\tif (ch === \"$\" && next === \"(\") {\n\t\t\treturn { reject: \"unsupported shell token: $()\" };\n\t\t}\n\t\temptySegment = false;\n\t\treturn \"include\";\n\t});\n\n\tif (!result.ok) {\n\t\treturn { ok: false, reason: result.reason, segments: [] };\n\t}\n\tif (emptySegment || result.parts.length === 0) {\n\t\treturn {\n\t\t\tok: false,\n\t\t\treason:\n\t\t\t\tresult.parts.length === 0 ? \"empty command\" : \"empty pipeline segment\",\n\t\t\tsegments: [],\n\t\t};\n\t}\n\n\treturn { ok: true, segments: result.parts };\n}\n\n/**\n * Tokenize shell segment into argv\n */\nfunction tokenizeShellSegment(segment: string): string[] | null {\n\tconst tokens: string[] = [];\n\tlet buf = \"\";\n\tlet inSingle = false;\n\tlet inDouble = false;\n\tlet escaped = false;\n\n\tconst pushToken = () => {\n\t\tif (buf.length > 0) {\n\t\t\ttokens.push(buf);\n\t\t\tbuf = \"\";\n\t\t}\n\t};\n\n\tfor (let i = 0; i < segment.length; i += 1) {\n\t\tconst ch = segment[i];\n\n\t\tif (escaped) {\n\t\t\tbuf += ch;\n\t\t\tescaped = false;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (!inSingle && !inDouble && ch === \"\\\\\") {\n\t\t\tescaped = true;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (inSingle) {\n\t\t\tif (ch === \"'\") inSingle = false;\n\t\t\telse buf += ch;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (inDouble) {\n\t\t\tconst next = segment[i + 1];\n\t\t\tif (ch === \"\\\\\" && isDoubleQuoteEscape(next)) {\n\t\t\t\tbuf += next;\n\t\t\t\ti += 1;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (ch === '\"') inDouble = false;\n\t\t\telse buf += ch;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (ch === \"'\") {\n\t\t\tinSingle = true;\n\t\t\tcontinue;\n\t\t}\n\t\tif (ch === '\"') {\n\t\t\tinDouble = true;\n\t\t\tcontinue;\n\t\t}\n\t\tif (/\\s/.test(ch)) {\n\t\t\tpushToken();\n\t\t\tcontinue;\n\t\t}\n\n\t\tbuf += ch;\n\t}\n\n\tif (escaped || inSingle || inDouble) return null;\n\tpushToken();\n\treturn tokens;\n}\n\n/**\n * Parse segments from parts\n */\nfunction parseSegmentsFromParts(\n\tparts: string[],\n\tcwd?: string,\n\tenv?: NodeJS.ProcessEnv,\n): ExecCommandSegment[] | null {\n\tconst segments: ExecCommandSegment[] = [];\n\n\tfor (const raw of parts) {\n\t\tconst argv = tokenizeShellSegment(raw);\n\t\tif (!argv || argv.length === 0) return null;\n\n\t\tsegments.push({\n\t\t\traw,\n\t\t\targv,\n\t\t\tresolution: resolveCommandFromArgv(argv, cwd, env),\n\t\t});\n\t}\n\n\treturn segments;\n}\n\n/**\n * Check if running on Windows\n */\nfunction isWindowsPlatform(platform?: string | null): boolean {\n\tconst normalized = String(platform ?? \"\")\n\t\t.trim()\n\t\t.toLowerCase();\n\treturn normalized.startsWith(\"win\");\n}\n\n/**\n * Analyze a shell command\n */\nexport function analyzeShellCommand(params: {\n\tcommand: string;\n\tcwd?: string;\n\tenv?: NodeJS.ProcessEnv;\n\tplatform?: string | null;\n}): ExecCommandAnalysis {\n\tif (isWindowsPlatform(params.platform)) {\n\t\treturn analyzeWindowsCommand(params);\n\t}\n\n\t// Try splitting by chain operators\n\tconst chainParts = splitCommandChain(params.command);\n\tif (chainParts) {\n\t\tconst chains: ExecCommandSegment[][] = [];\n\t\tconst allSegments: ExecCommandSegment[] = [];\n\n\t\tfor (const part of chainParts) {\n\t\t\tconst pipelineSplit = splitShellPipeline(part);\n\t\t\tif (!pipelineSplit.ok) {\n\t\t\t\treturn { ok: false, reason: pipelineSplit.reason, segments: [] };\n\t\t\t}\n\n\t\t\tconst segments = parseSegmentsFromParts(\n\t\t\t\tpipelineSplit.segments,\n\t\t\t\tparams.cwd,\n\t\t\t\tparams.env,\n\t\t\t);\n\t\t\tif (!segments) {\n\t\t\t\treturn {\n\t\t\t\t\tok: false,\n\t\t\t\t\treason: \"unable to parse shell segment\",\n\t\t\t\t\tsegments: [],\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tchains.push(segments);\n\t\t\tallSegments.push(...segments);\n\t\t}\n\n\t\treturn { ok: true, segments: allSegments, chains };\n\t}\n\n\t// No chain operators, parse as simple pipeline\n\tconst split = splitShellPipeline(params.command);\n\tif (!split.ok) {\n\t\treturn { ok: false, reason: split.reason, segments: [] };\n\t}\n\n\tconst segments = parseSegmentsFromParts(\n\t\tsplit.segments,\n\t\tparams.cwd,\n\t\tparams.env,\n\t);\n\tif (!segments) {\n\t\treturn { ok: false, reason: \"unable to parse shell segment\", segments: [] };\n\t}\n\n\treturn { ok: true, segments };\n}\n\n/**\n * Analyze Windows command\n */\nfunction analyzeWindowsCommand(params: {\n\tcommand: string;\n\tcwd?: string;\n\tenv?: NodeJS.ProcessEnv;\n}): ExecCommandAnalysis {\n\tfor (const ch of params.command) {\n\t\tif (WINDOWS_UNSUPPORTED_TOKENS.has(ch)) {\n\t\t\tconst tokenName = ch === \"\\n\" || ch === \"\\r\" ? \"newline\" : ch;\n\t\t\treturn {\n\t\t\t\tok: false,\n\t\t\t\treason: `unsupported windows shell token: ${tokenName}`,\n\t\t\t\tsegments: [],\n\t\t\t};\n\t\t}\n\t}\n\n\tconst argv = tokenizeWindowsSegment(params.command);\n\tif (!argv || argv.length === 0) {\n\t\treturn {\n\t\t\tok: false,\n\t\t\treason: \"unable to parse windows command\",\n\t\t\tsegments: [],\n\t\t};\n\t}\n\n\treturn {\n\t\tok: true,\n\t\tsegments: [\n\t\t\t{\n\t\t\t\traw: params.command,\n\t\t\t\targv,\n\t\t\t\tresolution: resolveCommandFromArgv(argv, params.cwd, params.env),\n\t\t\t},\n\t\t],\n\t};\n}\n\n/**\n * Tokenize Windows command segment\n */\nfunction tokenizeWindowsSegment(segment: string): string[] | null {\n\tconst tokens: string[] = [];\n\tlet buf = \"\";\n\tlet inDouble = false;\n\n\tconst pushToken = () => {\n\t\tif (buf.length > 0) {\n\t\t\ttokens.push(buf);\n\t\t\tbuf = \"\";\n\t\t}\n\t};\n\n\tfor (const ch of segment) {\n\t\tif (ch === '\"') {\n\t\t\tinDouble = !inDouble;\n\t\t\tcontinue;\n\t\t}\n\t\tif (!inDouble && /\\s/.test(ch)) {\n\t\t\tpushToken();\n\t\t\tcontinue;\n\t\t}\n\t\tbuf += ch;\n\t}\n\n\tif (inDouble) return null;\n\tpushToken();\n\treturn tokens.length > 0 ? tokens : null;\n}\n\n/**\n * Split command by chain operators (&&, ||, ;)\n */\nfunction splitCommandChain(command: string): string[] | null {\n\tconst parts: string[] = [];\n\tlet buf = \"\";\n\tlet inSingle = false;\n\tlet inDouble = false;\n\tlet escaped = false;\n\tlet foundChain = false;\n\tlet invalidChain = false;\n\n\tconst pushPart = () => {\n\t\tconst trimmed = buf.trim();\n\t\tif (trimmed) {\n\t\t\tparts.push(trimmed);\n\t\t\tbuf = \"\";\n\t\t\treturn true;\n\t\t}\n\t\tbuf = \"\";\n\t\treturn false;\n\t};\n\n\tfor (let i = 0; i < command.length; i += 1) {\n\t\tconst ch = command[i];\n\t\tconst next = command[i + 1];\n\n\t\tif (escaped) {\n\t\t\tbuf += ch;\n\t\t\tescaped = false;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (!inSingle && !inDouble && ch === \"\\\\\") {\n\t\t\tescaped = true;\n\t\t\tbuf += ch;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (inSingle) {\n\t\t\tif (ch === \"'\") inSingle = false;\n\t\t\tbuf += ch;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (inDouble) {\n\t\t\tif (ch === \"\\\\\" && isDoubleQuoteEscape(next)) {\n\t\t\t\tbuf += ch;\n\t\t\t\tbuf += next;\n\t\t\t\ti += 1;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (ch === '\"') inDouble = false;\n\t\t\tbuf += ch;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (ch === \"'\") {\n\t\t\tinSingle = true;\n\t\t\tbuf += ch;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (ch === '\"') {\n\t\t\tinDouble = true;\n\t\t\tbuf += ch;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (ch === \"&\" && next === \"&\") {\n\t\t\tif (!pushPart()) invalidChain = true;\n\t\t\ti += 1;\n\t\t\tfoundChain = true;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (ch === \"|\" && next === \"|\") {\n\t\t\tif (!pushPart()) invalidChain = true;\n\t\t\ti += 1;\n\t\t\tfoundChain = true;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (ch === \";\") {\n\t\t\tif (!pushPart()) invalidChain = true;\n\t\t\tfoundChain = true;\n\t\t\tcontinue;\n\t\t}\n\n\t\tbuf += ch;\n\t}\n\n\tconst pushedFinal = pushPart();\n\tif (!foundChain) return null;\n\tif (invalidChain || !pushedFinal) return null;\n\treturn parts.length > 0 ? parts : null;\n}\n\n/**\n * Normalize safe bins set\n */\nexport function normalizeSafeBins(entries?: string[]): Set<string> {\n\tif (!Array.isArray(entries)) return new Set();\n\tconst normalized = entries\n\t\t.map((entry) => entry.trim().toLowerCase())\n\t\t.filter((entry) => entry.length > 0);\n\treturn new Set(normalized);\n}\n\n/**\n * Resolve safe bins with defaults\n */\nexport function resolveSafeBins(entries?: string[] | null): Set<string> {\n\tif (entries === undefined) {\n\t\treturn normalizeSafeBins([...DEFAULT_SAFE_BINS]);\n\t}\n\treturn normalizeSafeBins(entries ?? []);\n}\n\n/**\n * Check if path-like token\n */\nfunction isPathLikeToken(value: string): boolean {\n\tconst trimmed = value.trim();\n\tif (!trimmed || trimmed === \"-\") return false;\n\tif (\n\t\ttrimmed.startsWith(\"./\") ||\n\t\ttrimmed.startsWith(\"../\") ||\n\t\ttrimmed.startsWith(\"~\")\n\t)\n\t\treturn true;\n\tif (trimmed.startsWith(\"/\")) return true;\n\treturn /^[A-Za-z]:[\\\\/]/.test(trimmed);\n}\n\n/**\n * Default file existence check\n */\nfunction defaultFileExists(filePath: string): boolean {\n\ttry {\n\t\treturn fs.existsSync(filePath);\n\t} catch {\n\t\treturn false;\n\t}\n}\n\n/**\n * Check if command is safe bin usage (no file args)\n */\nexport function isSafeBinUsage(params: {\n\targv: string[];\n\tresolution: CommandResolution | null;\n\tsafeBins: Set<string>;\n\tcwd?: string;\n\tfileExists?: (filePath: string) => boolean;\n}): boolean {\n\tif (params.safeBins.size === 0) return false;\n\n\tconst resolution = params.resolution;\n\tconst execName = resolution?.executableName?.toLowerCase();\n\tif (!execName) return false;\n\n\tconst matchesSafeBin =\n\t\tparams.safeBins.has(execName) ||\n\t\t(process.platform === \"win32\" &&\n\t\t\tparams.safeBins.has(path.parse(execName).name));\n\n\tif (!matchesSafeBin) return false;\n\tif (!resolution?.resolvedPath) return false;\n\n\tconst cwd = params.cwd ?? process.cwd();\n\tconst exists = params.fileExists ?? defaultFileExists;\n\tconst argv = params.argv.slice(1);\n\n\tfor (const token of argv) {\n\t\tif (!token || token === \"-\") continue;\n\n\t\tif (token.startsWith(\"-\")) {\n\t\t\tconst eqIndex = token.indexOf(\"=\");\n\t\t\tif (eqIndex > 0) {\n\t\t\t\tconst value = token.slice(eqIndex + 1);\n\t\t\t\tif (\n\t\t\t\t\tvalue &&\n\t\t\t\t\t(isPathLikeToken(value) || exists(path.resolve(cwd, value)))\n\t\t\t\t) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (isPathLikeToken(token)) return false;\n\t\tif (exists(path.resolve(cwd, token))) return false;\n\t}\n\n\treturn true;\n}\n\n/**\n * Resolve allowlist candidate path\n */\nfunction resolveAllowlistCandidatePath(\n\tresolution: CommandResolution | null,\n\tcwd?: string,\n): string | undefined {\n\tif (!resolution) return undefined;\n\tif (resolution.resolvedPath) return resolution.resolvedPath;\n\n\tconst raw = resolution.rawExecutable?.trim();\n\tif (!raw) return undefined;\n\n\tconst expanded = raw.startsWith(\"~\") ? expandHome(raw) : raw;\n\tif (!expanded.includes(\"/\") && !expanded.includes(\"\\\\\")) return undefined;\n\n\tif (path.isAbsolute(expanded)) return expanded;\n\n\tconst base = cwd?.trim() || process.cwd();\n\treturn path.resolve(base, expanded);\n}\n\n/**\n * Evaluate segments against allowlist\n */\nfunction evaluateSegments(\n\tsegments: ExecCommandSegment[],\n\tparams: {\n\t\tallowlist: ExecAllowlistEntry[];\n\t\tsafeBins: Set<string>;\n\t\tcwd?: string;\n\t\tskillBins?: Set<string>;\n\t\tautoAllowSkills?: boolean;\n\t},\n): { satisfied: boolean; matches: ExecAllowlistEntry[] } {\n\tconst matches: ExecAllowlistEntry[] = [];\n\tconst allowSkills =\n\t\tparams.autoAllowSkills === true && (params.skillBins?.size ?? 0) > 0;\n\n\tconst satisfied = segments.every((segment) => {\n\t\tconst candidatePath = resolveAllowlistCandidatePath(\n\t\t\tsegment.resolution,\n\t\t\tparams.cwd,\n\t\t);\n\t\tconst candidateResolution =\n\t\t\tcandidatePath && segment.resolution\n\t\t\t\t? { ...segment.resolution, resolvedPath: candidatePath }\n\t\t\t\t: segment.resolution;\n\n\t\tconst match = matchAllowlist(params.allowlist, candidateResolution);\n\t\tif (match) matches.push(match);\n\n\t\tconst safe = isSafeBinUsage({\n\t\t\targv: segment.argv,\n\t\t\tresolution: segment.resolution,\n\t\t\tsafeBins: params.safeBins,\n\t\t\tcwd: params.cwd,\n\t\t});\n\n\t\tconst skillAllow =\n\t\t\tallowSkills && segment.resolution?.executableName\n\t\t\t\t? params.skillBins?.has(segment.resolution.executableName)\n\t\t\t\t: false;\n\n\t\treturn Boolean(match || safe || skillAllow);\n\t});\n\n\treturn { satisfied, matches };\n}\n\n/**\n * Evaluate command against allowlist\n */\nexport function evaluateExecAllowlist(params: {\n\tanalysis: ExecCommandAnalysis;\n\tallowlist: ExecAllowlistEntry[];\n\tsafeBins: Set<string>;\n\tcwd?: string;\n\tskillBins?: Set<string>;\n\tautoAllowSkills?: boolean;\n}): ExecAllowlistEvaluation {\n\tconst allowlistMatches: ExecAllowlistEntry[] = [];\n\n\tif (!params.analysis.ok || params.analysis.segments.length === 0) {\n\t\treturn { allowlistSatisfied: false, allowlistMatches };\n\t}\n\n\t// If analysis contains chains, evaluate each separately\n\tif (params.analysis.chains) {\n\t\tfor (const chainSegments of params.analysis.chains) {\n\t\t\tconst result = evaluateSegments(chainSegments, {\n\t\t\t\tallowlist: params.allowlist,\n\t\t\t\tsafeBins: params.safeBins,\n\t\t\t\tcwd: params.cwd,\n\t\t\t\tskillBins: params.skillBins,\n\t\t\t\tautoAllowSkills: params.autoAllowSkills,\n\t\t\t});\n\n\t\t\tif (!result.satisfied) {\n\t\t\t\treturn { allowlistSatisfied: false, allowlistMatches: [] };\n\t\t\t}\n\t\t\tallowlistMatches.push(...result.matches);\n\t\t}\n\t\treturn { allowlistSatisfied: true, allowlistMatches };\n\t}\n\n\t// No chains, evaluate all segments together\n\tconst result = evaluateSegments(params.analysis.segments, {\n\t\tallowlist: params.allowlist,\n\t\tsafeBins: params.safeBins,\n\t\tcwd: params.cwd,\n\t\tskillBins: params.skillBins,\n\t\tautoAllowSkills: params.autoAllowSkills,\n\t});\n\n\treturn {\n\t\tallowlistSatisfied: result.satisfied,\n\t\tallowlistMatches: result.matches,\n\t};\n}\n\n/**\n * Evaluate shell command for allowlist (combined analysis + evaluation)\n */\nexport function evaluateShellAllowlist(params: {\n\tcommand: string;\n\tallowlist: ExecAllowlistEntry[];\n\tsafeBins: Set<string>;\n\tcwd?: string;\n\tenv?: NodeJS.ProcessEnv;\n\tskillBins?: Set<string>;\n\tautoAllowSkills?: boolean;\n\tplatform?: string | null;\n}): ExecAllowlistAnalysis {\n\tconst chainParts = isWindowsPlatform(params.platform)\n\t\t? null\n\t\t: splitCommandChain(params.command);\n\n\tif (!chainParts) {\n\t\tconst analysis = analyzeShellCommand({\n\t\t\tcommand: params.command,\n\t\t\tcwd: params.cwd,\n\t\t\tenv: params.env,\n\t\t\tplatform: params.platform,\n\t\t});\n\n\t\tif (!analysis.ok) {\n\t\t\treturn {\n\t\t\t\tanalysisOk: false,\n\t\t\t\tallowlistSatisfied: false,\n\t\t\t\tallowlistMatches: [],\n\t\t\t\tsegments: [],\n\t\t\t};\n\t\t}\n\n\t\tconst evaluation = evaluateExecAllowlist({\n\t\t\tanalysis,\n\t\t\tallowlist: params.allowlist,\n\t\t\tsafeBins: params.safeBins,\n\t\t\tcwd: params.cwd,\n\t\t\tskillBins: params.skillBins,\n\t\t\tautoAllowSkills: params.autoAllowSkills,\n\t\t});\n\n\t\treturn {\n\t\t\tanalysisOk: true,\n\t\t\tallowlistSatisfied: evaluation.allowlistSatisfied,\n\t\t\tallowlistMatches: evaluation.allowlistMatches,\n\t\t\tsegments: analysis.segments,\n\t\t};\n\t}\n\n\tconst allowlistMatches: ExecAllowlistEntry[] = [];\n\tconst segments: ExecCommandSegment[] = [];\n\n\tfor (const part of chainParts) {\n\t\tconst analysis = analyzeShellCommand({\n\t\t\tcommand: part,\n\t\t\tcwd: params.cwd,\n\t\t\tenv: params.env,\n\t\t\tplatform: params.platform,\n\t\t});\n\n\t\tif (!analysis.ok) {\n\t\t\treturn {\n\t\t\t\tanalysisOk: false,\n\t\t\t\tallowlistSatisfied: false,\n\t\t\t\tallowlistMatches: [],\n\t\t\t\tsegments: [],\n\t\t\t};\n\t\t}\n\n\t\tsegments.push(...analysis.segments);\n\n\t\tconst evaluation = evaluateExecAllowlist({\n\t\t\tanalysis,\n\t\t\tallowlist: params.allowlist,\n\t\t\tsafeBins: params.safeBins,\n\t\t\tcwd: params.cwd,\n\t\t\tskillBins: params.skillBins,\n\t\t\tautoAllowSkills: params.autoAllowSkills,\n\t\t});\n\n\t\tallowlistMatches.push(...evaluation.allowlistMatches);\n\n\t\tif (!evaluation.allowlistSatisfied) {\n\t\t\treturn {\n\t\t\t\tanalysisOk: true,\n\t\t\t\tallowlistSatisfied: false,\n\t\t\t\tallowlistMatches,\n\t\t\t\tsegments,\n\t\t\t};\n\t\t}\n\t}\n\n\treturn {\n\t\tanalysisOk: true,\n\t\tallowlistSatisfied: true,\n\t\tallowlistMatches,\n\t\tsegments,\n\t};\n}\n\n/**\n * Check if approval is required\n */\nexport function requiresExecApproval(params: {\n\task: \"off\" | \"on-miss\" | \"always\";\n\tsecurity: \"deny\" | \"allowlist\" | \"full\";\n\tanalysisOk: boolean;\n\tallowlistSatisfied: boolean;\n}): boolean {\n\treturn (\n\t\tparams.ask === \"always\" ||\n\t\t(params.ask === \"on-miss\" &&\n\t\t\tparams.security === \"allowlist\" &&\n\t\t\t(!params.analysisOk || !params.allowlistSatisfied))\n\t);\n}\n",
|
|
21
|
-
"/**\n * ExecApprovalService\n *\n * Service for managing command execution approvals in plugin-shell.\n * Integrates with Eliza's ApprovalService for approval UI,\n * and provides allowlist management and command analysis.\n *\n * @example\n * ```typescript\n * const approvalService = runtime.getService('exec_approval') as ExecApprovalService;\n *\n * // Check if command needs approval\n * const check = await approvalService.checkCommand({\n * command: 'rm -rf /tmp/cache',\n * cwd: '/home/user',\n * roomId: message.roomId,\n * });\n *\n * if (check.requiresApproval) {\n * const result = await approvalService.requestApproval(check.request);\n * if (result.decision === 'deny') {\n * return { error: 'Command denied' };\n * }\n * if (result.decision === 'allow-always') {\n * await approvalService.addToAllowlist(command);\n * }\n * }\n * ```\n */\n\nimport type { IAgentRuntime, Task, UUID } from \"@elizaos/core\";\nimport { type ApprovalService, logger, Service } from \"@elizaos/core\";\n\n// Define our own approval options to avoid import issues\nconst EXEC_APPROVAL_OPTIONS: Array<{\n\tname: string;\n\tdescription: string;\n\tisCancel?: boolean;\n}> = [\n\t{ name: \"allow-once\", description: \"Allow this one time\" },\n\t{ name: \"allow-always\", description: \"Always allow this\" },\n\t{ name: \"deny\", description: \"Deny the request\", isCancel: true },\n];\n\nimport {\n\taddAllowlistEntry,\n\tloadApprovals,\n\trecordAllowlistUse,\n\tresolveApprovals,\n} from \"./allowlist\";\nimport {\n\tanalyzeShellCommand,\n\tevaluateShellAllowlist,\n\trequiresExecApproval,\n\tresolveSafeBins,\n} from \"./analysis\";\nimport type {\n\tExecAllowlistEntry,\n\tExecApprovalDecision,\n\tExecApprovalRequest,\n\tExecApprovalResult,\n\tExecApprovalsResolved,\n\tExecAsk,\n\tExecCommandAnalysis,\n\tExecSecurity,\n} from \"./types\";\nimport { EXEC_APPROVAL_DEFAULTS } from \"./types\";\n\n/**\n * Command check result\n */\nexport interface CommandCheckResult {\n\t/** Whether the command can be executed */\n\tallowed: boolean;\n\t/** Whether approval is required */\n\trequiresApproval: boolean;\n\t/** Reason for denial (if not allowed and no approval needed) */\n\treason?: string;\n\t/** Approval request (if approval required) */\n\trequest?: ExecApprovalRequest;\n\t/** Command analysis result */\n\tanalysis: ExecCommandAnalysis;\n\t/** Matching allowlist entries */\n\tallowlistMatches: ExecAllowlistEntry[];\n}\n\n/**\n * ExecApprovalService provides command execution approval management.\n */\nexport class ExecApprovalService extends Service {\n\tstatic serviceType = \"exec_approval\";\n\tcapabilityDescription =\n\t\t\"Manages command execution approvals with allowlist and user confirmation\";\n\n\tprivate approvalConfig: ExecApprovalsResolved | null = null;\n\tprivate safeBins: Set<string>;\n\tprivate skillBins: Set<string>;\n\n\tconstructor(runtime?: IAgentRuntime) {\n\t\tsuper(runtime);\n\t\tthis.safeBins = resolveSafeBins();\n\t\tthis.skillBins = new Set();\n\t}\n\n\t/**\n\t * Start the ExecApprovalService\n\t */\n\tstatic async start(runtime: IAgentRuntime): Promise<Service> {\n\t\tconst service = new ExecApprovalService(runtime);\n\n\t\t// Load config - handle errors gracefully to not crash startup\n\t\ttry {\n\t\t\tservice.approvalConfig = resolveApprovals(runtime.agentId);\n\t\t} catch (error) {\n\t\t\tlogger.error(\n\t\t\t\t{ src: \"service:exec_approval\", error, agentId: runtime.agentId },\n\t\t\t\t\"Failed to load approval config during startup - using in-memory defaults. \" +\n\t\t\t\t\t\"Approvals may not persist. Check file permissions for ~/.eliza/exec-approvals.json\",\n\t\t\t);\n\t\t\t// Use a minimal in-memory config so the service can still function\n\t\t\tservice.approvalConfig = {\n\t\t\t\tpath: \"\",\n\t\t\t\tsocketPath: \"\",\n\t\t\t\ttoken: \"\",\n\t\t\t\tdefaults: {\n\t\t\t\t\tsecurity: \"deny\",\n\t\t\t\t\task: \"on-miss\",\n\t\t\t\t\taskFallback: \"deny\",\n\t\t\t\t\tautoAllowSkills: false,\n\t\t\t\t},\n\t\t\t\tagent: {\n\t\t\t\t\tsecurity: \"deny\",\n\t\t\t\t\task: \"on-miss\",\n\t\t\t\t\taskFallback: \"deny\",\n\t\t\t\t\tautoAllowSkills: false,\n\t\t\t\t},\n\t\t\t\tallowlist: [],\n\t\t\t\tfile: { version: 1, agents: {} },\n\t\t\t};\n\t\t}\n\n\t\tlogger.info(\n\t\t\t{ src: \"service:exec_approval\", agentId: runtime.agentId },\n\t\t\t\"ExecApprovalService started\",\n\t\t);\n\t\treturn service;\n\t}\n\n\t/**\n\t * Stop the ExecApprovalService\n\t */\n\tasync stop(): Promise<void> {\n\t\tlogger.debug(\n\t\t\t{ src: \"service:exec_approval\" },\n\t\t\t\"ExecApprovalService stopped\",\n\t\t);\n\t}\n\n\t/**\n\t * Load/reload configuration\n\t */\n\tloadConfig(agentId?: string): ExecApprovalsResolved {\n\t\tthis.approvalConfig = resolveApprovals(agentId ?? this.runtime?.agentId);\n\t\treturn this.approvalConfig;\n\t}\n\n\t/**\n\t * Get current configuration\n\t */\n\tgetConfig(): ExecApprovalsResolved {\n\t\tif (!this.approvalConfig) {\n\t\t\tthis.approvalConfig = resolveApprovals(this.runtime?.agentId);\n\t\t}\n\t\treturn this.approvalConfig;\n\t}\n\n\t/**\n\t * Set safe binaries that don't need approval\n\t */\n\tsetSafeBins(bins: string[]): void {\n\t\tthis.safeBins = resolveSafeBins(bins);\n\t}\n\n\t/**\n\t * Set skill binaries that are auto-allowed\n\t */\n\tsetSkillBins(bins: string[]): void {\n\t\tthis.skillBins = new Set(bins.map((b) => b.toLowerCase()));\n\t}\n\n\t/**\n\t * Check if a command is allowed to execute\n\t */\n\tasync checkCommand(params: {\n\t\tcommand: string;\n\t\tcwd?: string;\n\t\troomId: UUID;\n\t\tenv?: NodeJS.ProcessEnv;\n\t\tagentId?: string;\n\t}): Promise<CommandCheckResult> {\n\t\tconst config = this.getConfig();\n\n\t\t// Analyze the command\n\t\tconst analysis = analyzeShellCommand({\n\t\t\tcommand: params.command,\n\t\t\tcwd: params.cwd,\n\t\t\tenv: params.env,\n\t\t});\n\n\t\tif (!analysis.ok) {\n\t\t\treturn {\n\t\t\t\tallowed: false,\n\t\t\t\trequiresApproval: false,\n\t\t\t\treason: analysis.reason ?? \"Command analysis failed\",\n\t\t\t\tanalysis,\n\t\t\t\tallowlistMatches: [],\n\t\t\t};\n\t\t}\n\n\t\t// Evaluate against allowlist\n\t\tconst evaluation = evaluateShellAllowlist({\n\t\t\tcommand: params.command,\n\t\t\tallowlist: config.allowlist,\n\t\t\tsafeBins: this.safeBins,\n\t\t\tcwd: params.cwd,\n\t\t\tenv: params.env,\n\t\t\tskillBins: this.skillBins,\n\t\t\tautoAllowSkills: config.agent.autoAllowSkills,\n\t\t});\n\n\t\t// Check security mode\n\t\tconst security = config.agent.security;\n\t\tconst ask = config.agent.ask;\n\n\t\t// Full security mode - always allow\n\t\tif (security === \"full\") {\n\t\t\treturn {\n\t\t\t\tallowed: true,\n\t\t\t\trequiresApproval: false,\n\t\t\t\tanalysis,\n\t\t\t\tallowlistMatches: evaluation.allowlistMatches,\n\t\t\t};\n\t\t}\n\n\t\t// Deny mode - always deny unless explicitly allowed\n\t\tif (security === \"deny\") {\n\t\t\treturn {\n\t\t\t\tallowed: false,\n\t\t\t\trequiresApproval: false,\n\t\t\t\treason: \"Command execution is disabled\",\n\t\t\t\tanalysis,\n\t\t\t\tallowlistMatches: [],\n\t\t\t};\n\t\t}\n\n\t\t// Allowlist mode - check if command is in allowlist\n\t\tif (evaluation.allowlistSatisfied) {\n\t\t\t// Record usage (best-effort, don't fail command if recording fails)\n\t\t\tlet recordingFailed = false;\n\t\t\tfor (const match of evaluation.allowlistMatches) {\n\t\t\t\tconst approvals = loadApprovals();\n\t\t\t\tconst recorded = recordAllowlistUse(\n\t\t\t\t\tapprovals,\n\t\t\t\t\tparams.agentId ?? this.runtime?.agentId,\n\t\t\t\t\tmatch,\n\t\t\t\t\tparams.command,\n\t\t\t\t\tanalysis.segments[0]?.resolution?.resolvedPath,\n\t\t\t\t);\n\t\t\t\tif (!recorded) {\n\t\t\t\t\trecordingFailed = true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (recordingFailed) {\n\t\t\t\tlogger.debug(\n\t\t\t\t\t{ src: \"service:exec_approval\", command: params.command },\n\t\t\t\t\t\"Some allowlist usage records failed to save - command will still proceed\",\n\t\t\t\t);\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tallowed: true,\n\t\t\t\trequiresApproval: false,\n\t\t\t\tanalysis,\n\t\t\t\tallowlistMatches: evaluation.allowlistMatches,\n\t\t\t};\n\t\t}\n\n\t\t// Check if we need to ask for approval\n\t\tconst needsApproval = requiresExecApproval({\n\t\t\task,\n\t\t\tsecurity,\n\t\t\tanalysisOk: analysis.ok,\n\t\t\tallowlistSatisfied: evaluation.allowlistSatisfied,\n\t\t});\n\n\t\tif (!needsApproval) {\n\t\t\t// No approval configured, deny based on fallback\n\t\t\tconst fallback = config.agent.askFallback;\n\t\t\tif (fallback === \"deny\") {\n\t\t\t\treturn {\n\t\t\t\t\tallowed: false,\n\t\t\t\t\trequiresApproval: false,\n\t\t\t\t\treason: \"Command not in allowlist\",\n\t\t\t\t\tanalysis,\n\t\t\t\t\tallowlistMatches: [],\n\t\t\t\t};\n\t\t\t}\n\t\t\t// Fallback is 'full' - allow\n\t\t\treturn {\n\t\t\t\tallowed: true,\n\t\t\t\trequiresApproval: false,\n\t\t\t\tanalysis,\n\t\t\t\tallowlistMatches: [],\n\t\t\t};\n\t\t}\n\n\t\t// Build approval request\n\t\tconst requestId = crypto.randomUUID();\n\t\tconst request: ExecApprovalRequest = {\n\t\t\tid: requestId,\n\t\t\tcommand: params.command,\n\t\t\tcwd: params.cwd,\n\t\t\tsecurity,\n\t\t\task,\n\t\t\tagentId: params.agentId ?? this.runtime?.agentId,\n\t\t\tresolvedPath: analysis.segments[0]?.resolution?.resolvedPath,\n\t\t\troomId: params.roomId,\n\t\t\ttimeoutMs: EXEC_APPROVAL_DEFAULTS.timeoutMs,\n\t\t};\n\n\t\treturn {\n\t\t\tallowed: false,\n\t\t\trequiresApproval: true,\n\t\t\trequest,\n\t\t\tanalysis,\n\t\t\tallowlistMatches: [],\n\t\t};\n\t}\n\n\t/**\n\t * Request approval for a command\n\t */\n\tasync requestApproval(\n\t\trequest: ExecApprovalRequest,\n\t): Promise<ExecApprovalResult> {\n\t\tconst approvalService = this.runtime?.getService(\n\t\t\t\"approval\",\n\t\t) as ApprovalService | null;\n\n\t\tif (!approvalService) {\n\t\t\tlogger.warn(\n\t\t\t\t{ src: \"service:exec_approval\" },\n\t\t\t\t\"ApprovalService not available, denying by default\",\n\t\t\t);\n\t\t\treturn {\n\t\t\t\tdecision: \"deny\",\n\t\t\t\ttimedOut: false,\n\t\t\t};\n\t\t}\n\n\t\t// Build description\n\t\tconst descriptionLines = [\n\t\t\t\"**Exec Approval Required**\",\n\t\t\t\"\",\n\t\t\t`Command: \\`${request.command}\\``,\n\t\t];\n\n\t\tif (request.cwd) {\n\t\t\tdescriptionLines.push(`CWD: \\`${request.cwd}\\``);\n\t\t}\n\t\tif (request.resolvedPath) {\n\t\t\tdescriptionLines.push(`Executable: \\`${request.resolvedPath}\\``);\n\t\t}\n\n\t\tconst description = descriptionLines.join(\"\\n\");\n\n\t\t// Request approval via Eliza's task system\n\t\tconst result = await approvalService.requestApproval({\n\t\t\tname: \"EXEC_APPROVAL\",\n\t\t\tdescription,\n\t\t\troomId: request.roomId,\n\t\t\toptions: EXEC_APPROVAL_OPTIONS,\n\t\t\ttimeoutMs: request.timeoutMs ?? EXEC_APPROVAL_DEFAULTS.timeoutMs,\n\t\t\ttimeoutDefault: \"deny\",\n\t\t\ttags: [\"EXEC\", request.id],\n\t\t\tmetadata: {\n\t\t\t\texecRequest: {\n\t\t\t\t\tid: request.id,\n\t\t\t\t\tcommand: request.command,\n\t\t\t\t\tcwd: request.cwd,\n\t\t\t\t\tsecurity: request.security,\n\t\t\t\t\task: request.ask,\n\t\t\t\t\tagentId: request.agentId,\n\t\t\t\t\tresolvedPath: request.resolvedPath,\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\n\t\tconst decision = mapOptionToDecision(result.selectedOption);\n\n\t\t// If allow-always, add to allowlist\n\t\tif (decision === \"allow-always\" && request.resolvedPath) {\n\t\t\tawait this.addToAllowlist(request.resolvedPath, request.agentId);\n\t\t}\n\n\t\treturn {\n\t\t\tdecision,\n\t\t\ttimedOut: result.timedOut,\n\t\t\tresolvedBy: result.resolvedBy,\n\t\t};\n\t}\n\n\t/**\n\t * Request approval asynchronously (fire and forget with callbacks)\n\t */\n\tasync requestApprovalAsync(\n\t\trequest: ExecApprovalRequest,\n\t\tcallbacks?: {\n\t\t\tonApproved?: (decision: ExecApprovalDecision) => Promise<void>;\n\t\t\tonDenied?: () => Promise<void>;\n\t\t\tonTimeout?: () => Promise<void>;\n\t\t},\n\t): Promise<UUID> {\n\t\tconst approvalService = this.runtime?.getService(\n\t\t\t\"approval\",\n\t\t) as ApprovalService | null;\n\n\t\tif (!approvalService) {\n\t\t\tlogger.warn(\n\t\t\t\t{ src: \"service:exec_approval\" },\n\t\t\t\t\"ApprovalService not available\",\n\t\t\t);\n\t\t\tif (callbacks?.onDenied) {\n\t\t\t\tawait callbacks.onDenied();\n\t\t\t}\n\t\t\tthrow new Error(\"ApprovalService not available\");\n\t\t}\n\n\t\tconst descriptionLines = [\n\t\t\t\"**Exec Approval Required**\",\n\t\t\t\"\",\n\t\t\t`Command: \\`${request.command}\\``,\n\t\t];\n\n\t\tif (request.cwd) {\n\t\t\tdescriptionLines.push(`CWD: \\`${request.cwd}\\``);\n\t\t}\n\n\t\tconst taskId = await approvalService.requestApprovalAsync({\n\t\t\tname: \"EXEC_APPROVAL\",\n\t\t\tdescription: descriptionLines.join(\"\\n\"),\n\t\t\troomId: request.roomId,\n\t\t\toptions: EXEC_APPROVAL_OPTIONS,\n\t\t\ttimeoutMs: request.timeoutMs ?? EXEC_APPROVAL_DEFAULTS.timeoutMs,\n\t\t\ttimeoutDefault: \"deny\",\n\t\t\ttags: [\"EXEC\", request.id],\n\t\t\tmetadata: {\n\t\t\t\texecRequest: {\n\t\t\t\t\tid: request.id,\n\t\t\t\t\tcommand: request.command,\n\t\t\t\t\tcwd: request.cwd,\n\t\t\t\t\tsecurity: request.security,\n\t\t\t\t\task: request.ask,\n\t\t\t\t\tagentId: request.agentId,\n\t\t\t\t\tresolvedPath: request.resolvedPath,\n\t\t\t\t},\n\t\t\t},\n\t\t\tonSelect: async (option: string, _task: Task, _rt: IAgentRuntime) => {\n\t\t\t\tconst decision = mapOptionToDecision(option);\n\n\t\t\t\t// If allow-always, add to allowlist\n\t\t\t\tif (decision === \"allow-always\" && request.resolvedPath) {\n\t\t\t\t\tawait this.addToAllowlist(request.resolvedPath, request.agentId);\n\t\t\t\t}\n\n\t\t\t\tif (decision === \"allow-once\" || decision === \"allow-always\") {\n\t\t\t\t\tif (callbacks?.onApproved) {\n\t\t\t\t\t\tawait callbacks.onApproved(decision);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif (callbacks?.onDenied) {\n\t\t\t\t\t\tawait callbacks.onDenied();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\tonTimeout: async (_task: Task, _rt: IAgentRuntime) => {\n\t\t\t\tif (callbacks?.onTimeout) {\n\t\t\t\t\tawait callbacks.onTimeout();\n\t\t\t\t} else if (callbacks?.onDenied) {\n\t\t\t\t\tawait callbacks.onDenied();\n\t\t\t\t}\n\t\t\t},\n\t\t});\n\n\t\treturn taskId;\n\t}\n\n\t/**\n\t * Add a pattern to the allowlist\n\t * @returns true if pattern was added successfully\n\t */\n\tasync addToAllowlist(pattern: string, agentId?: string): Promise<boolean> {\n\t\tconst approvals = loadApprovals();\n\t\tconst added = addAllowlistEntry(\n\t\t\tapprovals,\n\t\t\tagentId ?? this.runtime?.agentId,\n\t\t\tpattern,\n\t\t);\n\t\tif (added) {\n\t\t\t// Reload config to pick up the new entry\n\t\t\tthis.approvalConfig = null;\n\t\t}\n\t\treturn added;\n\t}\n\n\t/**\n\t * Cancel a pending approval\n\t */\n\tasync cancelApproval(taskId: UUID): Promise<void> {\n\t\tconst approvalService = this.runtime?.getService(\n\t\t\t\"approval\",\n\t\t) as ApprovalService | null;\n\n\t\tif (approvalService) {\n\t\t\tawait approvalService.cancelApproval(taskId);\n\t\t}\n\t}\n\n\t/**\n\t * Get all pending exec approvals for a room\n\t */\n\tasync getPendingApprovals(roomId: UUID): Promise<ExecApprovalRequest[]> {\n\t\tif (!this.runtime) {\n\t\t\tlogger.warn(\n\t\t\t\t{ src: \"service:exec_approval\" },\n\t\t\t\t\"Cannot get pending approvals - runtime not available\",\n\t\t\t);\n\t\t\treturn [];\n\t\t}\n\n\t\ttry {\n\t\t\tconst tasks = await this.runtime.getTasks({\n\t\t\t\troomId,\n\t\t\t\ttags: [\"AWAITING_CHOICE\", \"EXEC\"],\n\t\t\t});\n\n\t\t\tif (!tasks) return [];\n\n\t\t\treturn tasks\n\t\t\t\t.filter((t) => t.metadata?.execRequest)\n\t\t\t\t.map((t) => {\n\t\t\t\t\tconst execRequest = t.metadata?.execRequest as Record<\n\t\t\t\t\t\tstring,\n\t\t\t\t\t\tunknown\n\t\t\t\t\t>;\n\t\t\t\t\treturn {\n\t\t\t\t\t\tid: execRequest.id as string,\n\t\t\t\t\t\tcommand: execRequest.command as string,\n\t\t\t\t\t\tcwd: execRequest.cwd as string | undefined,\n\t\t\t\t\t\tsecurity: execRequest.security as ExecSecurity | undefined,\n\t\t\t\t\t\task: execRequest.ask as ExecAsk | undefined,\n\t\t\t\t\t\tagentId: execRequest.agentId as string | undefined,\n\t\t\t\t\t\tresolvedPath: execRequest.resolvedPath as string | undefined,\n\t\t\t\t\t\troomId,\n\t\t\t\t\t};\n\t\t\t\t});\n\t\t} catch (error) {\n\t\t\tlogger.error(\n\t\t\t\t{ src: \"service:exec_approval\", error, roomId },\n\t\t\t\t\"Failed to get pending approvals\",\n\t\t\t);\n\t\t\treturn [];\n\t\t}\n\t}\n}\n\n/**\n * Map approval option to exec decision\n */\nfunction mapOptionToDecision(option: string): ExecApprovalDecision {\n\tswitch (option) {\n\t\tcase \"allow-once\":\n\t\t\treturn \"allow-once\";\n\t\tcase \"allow-always\":\n\t\t\treturn \"allow-always\";\n\t\tdefault:\n\t\t\treturn \"deny\";\n\t}\n}\n\nexport default ExecApprovalService;\n",
|
|
22
|
-
"import {\n\taddHeader,\n\ttype IAgentRuntime,\n\tlogger,\n\ttype Memory,\n\ttype Provider,\n\ttype State,\n} from \"@elizaos/core\";\nimport { requireProviderSpec } from \"../generated/specs/spec-helpers\";\nimport type { ShellService } from \"../services/shellService\";\nimport type { CommandHistoryEntry, FileOperation } from \"../types\";\n\nconst MAX_OUTPUT_LENGTH = 8000;\nconst TRUNCATE_SEGMENT_LENGTH = 4000;\n\nconst spec = requireProviderSpec(\"SHELL_HISTORY\");\n\nexport const shellHistoryProvider: Provider = {\n\tname: spec.name,\n\tdescription:\n\t\t\"Provides recent shell command history, current working directory, and file operations within the restricted environment\",\n\tposition: 99,\n\t\tdynamic: true,\nget: async (runtime: IAgentRuntime, message: Memory, _state: State) => {\n\nconst shellService = runtime.getService<ShellService>(\"shell\");\n\n\t\tif (!shellService) {\n\t\t\tlogger.warn(\"[shellHistoryProvider] Shell service not found\");\n\t\t\treturn {\n\t\t\t\tvalues: {\n\t\t\t\t\tshellHistory: \"Shell service is not available\",\n\t\t\t\t\tcurrentWorkingDirectory: \"N/A\",\n\t\t\t\t\tallowedDirectory: \"N/A\",\n\t\t\t\t},\n\t\t\t\ttext: addHeader(\"# Shell Status\", \"Shell service is not available\"),\n\t\t\t\tdata: { historyCount: 0, cwd: \"N/A\", allowedDir: \"N/A\" },\n\t\t\t};\n\t\t}\n\n\t\tconst conversationId = message.roomId || message.agentId;\n\t\tif (!conversationId) {\n\t\t\treturn {\n\t\t\t\ttext: \"No conversation ID available\",\n\t\t\t\tvalues: { historyCount: 0, cwd: \"N/A\", allowedDir: \"N/A\" },\n\t\t\t\tdata: { historyCount: 0, cwd: \"N/A\", allowedDir: \"N/A\" },\n\t\t\t};\n\t\t}\n\t\tconst history = shellService.getCommandHistory(conversationId, 10);\n\t\tconst cwd = shellService.getCurrentDirectory(conversationId);\n\t\tconst allowedDir = shellService.getAllowedDirectory();\n\n\t\tlet historyText = \"No commands in history.\";\n\t\tif (history.length > 0) {\n\t\t\thistoryText = history\n\t\t\t\t.map((entry: CommandHistoryEntry) => {\n\t\t\t\t\tlet entryStr = `[${new Date(entry.timestamp).toISOString()}] ${entry.workingDirectory}> ${entry.command}`;\n\n\t\t\t\t\tif (entry.stdout) {\n\t\t\t\t\t\tif (entry.stdout.length > MAX_OUTPUT_LENGTH) {\n\t\t\t\t\t\t\tentryStr += `\\n Output: ${entry.stdout.substring(0, TRUNCATE_SEGMENT_LENGTH)}\\n ... [TRUNCATED] ...\\n ${entry.stdout.substring(entry.stdout.length - TRUNCATE_SEGMENT_LENGTH)}`;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tentryStr += `\\n Output: ${entry.stdout}`;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (entry.stderr) {\n\t\t\t\t\t\tif (entry.stderr.length > MAX_OUTPUT_LENGTH) {\n\t\t\t\t\t\t\tentryStr += `\\n Error: ${entry.stderr.substring(0, TRUNCATE_SEGMENT_LENGTH)}\\n ... [TRUNCATED] ...\\n ${entry.stderr.substring(entry.stderr.length - TRUNCATE_SEGMENT_LENGTH)}`;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tentryStr += `\\n Error: ${entry.stderr}`;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tentryStr += `\\n Exit Code: ${entry.exitCode}`;\n\n\t\t\t\t\tif (entry.fileOperations && entry.fileOperations.length > 0) {\n\t\t\t\t\t\tentryStr += \"\\n File Operations:\";\n\t\t\t\t\t\tentry.fileOperations.forEach((op: FileOperation) => {\n\t\t\t\t\t\t\tif (op.secondaryTarget) {\n\t\t\t\t\t\t\t\tentryStr += `\\n - ${op.type}: ${op.target} → ${op.secondaryTarget}`;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tentryStr += `\\n - ${op.type}: ${op.target}`;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\treturn entryStr;\n\t\t\t\t})\n\t\t\t\t.join(\"\\n\\n\");\n\t\t}\n\n\t\tconst recentFileOps = history\n\t\t\t.filter(\n\t\t\t\t(entry: CommandHistoryEntry) =>\n\t\t\t\t\tentry.fileOperations && entry.fileOperations.length > 0,\n\t\t\t)\n\t\t\t.flatMap((entry: CommandHistoryEntry) => entry.fileOperations ?? [])\n\t\t\t.slice(-5);\n\n\t\tlet fileOpsText = \"\";\n\t\tif (recentFileOps.length > 0) {\n\t\t\tfileOpsText =\n\t\t\t\t\"\\n\\n\" +\n\t\t\t\taddHeader(\n\t\t\t\t\t\"# Recent File Operations\",\n\t\t\t\t\trecentFileOps\n\t\t\t\t\t\t.map((op: FileOperation) => {\n\t\t\t\t\t\t\tif (op.secondaryTarget) {\n\t\t\t\t\t\t\t\treturn `- ${op.type}: ${op.target} → ${op.secondaryTarget}`;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn `- ${op.type}: ${op.target}`;\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.join(\"\\n\"),\n\t\t\t\t);\n\t\t}\n\n\t\tconst text = `Current Directory: ${cwd}\nAllowed Directory: ${allowedDir}\n\n${addHeader(\"# Shell History (Last 10)\", historyText)}${fileOpsText}`;\n\n\t\treturn {\n\t\t\tvalues: {\n\t\t\t\tshellHistory: historyText,\n\t\t\t\tcurrentWorkingDirectory: cwd,\n\t\t\t\tallowedDirectory: allowedDir,\n\t\t\t},\n\t\t\ttext,\n\t\t\tdata: {\n\t\t\t\thistoryCount: history.length,\n\t\t\t\tcwd,\n\t\t\t\tallowedDir,\n\t\t\t},\n\t\t};\n\t},\n};\n\nexport default shellHistoryProvider;\n",
|
|
23
|
-
"import {\n type IAgentRuntime,\n type Memory,\n type Provider,\n type ProviderResult,\n type State\n} from \"@elizaos/core\";\nexport const terminalUsageProvider: Provider = {\n name: \"terminalUsage\",\n description: \"Terminal usage instructions\",\n dynamic: true,\n get: async (\n _runtime: IAgentRuntime,\n _message: Memory,\n _state: State,\n ): Promise<ProviderResult> => {\n// Skip terminal docs for agents that don't need shell access.\n // Set character.settings.DISABLE_TERMINAL = true to save ~100 tokens.\n const settings = _runtime.character?.settings;\n if (settings?.DISABLE_TERMINAL) {\n return { text: \"\" };\n }\n\n return {\n text: [\n \"## Terminal\",\n \"\",\n \"You can run shell commands in the user's embedded terminal using the RUN_IN_TERMINAL action.\",\n \"Use this when the user asks you to run a command, execute a script, install packages, etc.\",\n \"The terminal auto-opens and shows the command output in real time.\",\n ].join(\"\\n\"),\n };\n },\n};\n",
|
|
24
|
-
"/**\n * Enhanced Shell Service with PTY, background execution, and session management\n * Migrated from otto bash-tools.exec.ts, bash-tools.process.ts\n */\n\nimport type { ChildProcessWithoutNullStreams } from \"node:child_process\";\nimport path from \"node:path\";\nimport { type IAgentRuntime, logger, Service } from \"@elizaos/core\";\nimport spawn from \"cross-spawn\";\nimport type {\n\tCommandHistoryEntry,\n\tCommandResult,\n\tExecResult,\n\tExecuteOptions,\n\tFileOperation,\n\tFileOperationType,\n\tFinishedSession,\n\tProcessActionParams,\n\tProcessSession,\n\tPtyHandle,\n\tPtySpawn,\n\tShellConfig,\n} from \"../types\";\nimport {\n\tisForbiddenCommand,\n\tisSafeCommand,\n\tloadShellConfig,\n\tvalidatePath,\n} from \"../utils\";\nimport {\n\tbuildCursorPositionResponse,\n\tencodeKeySequence,\n\tencodePaste,\n\tstripDsrRequests,\n} from \"../utils/ptyKeys\";\nimport {\n\tchunkString,\n\tclampNumber,\n\tcoerceEnv,\n\tderiveSessionName,\n\tformatDuration,\n\tgetShellConfig,\n\tkillSession,\n\tpad,\n\treadEnvInt,\n\tresolveWorkdir,\n\tsanitizeBinaryOutput,\n\tsliceLogLines,\n\ttruncateMiddle,\n} from \"../utils/shellUtils\";\nimport {\n\taddSession,\n\tappendOutput,\n\tcreateSessionSlug,\n\tdeleteSession,\n\tdrainSession,\n\tgetFinishedSession,\n\tgetSession,\n\tlistFinishedSessions,\n\tlistRunningSessions,\n\tmarkBackgrounded,\n\tmarkExited,\n} from \"./processRegistry\";\n\nconst DEFAULT_MAX_OUTPUT = clampNumber(\n\treadEnvInt(\"SHELL_MAX_OUTPUT_CHARS\"),\n\t200_000,\n\t1_000,\n\t200_000,\n);\nconst DEFAULT_PENDING_MAX_OUTPUT = clampNumber(\n\treadEnvInt(\"SHELL_PENDING_MAX_OUTPUT_CHARS\"),\n\t200_000,\n\t1_000,\n\t200_000,\n);\nconst DEFAULT_BACKGROUND_MS = clampNumber(\n\treadEnvInt(\"SHELL_BACKGROUND_MS\"),\n\t10_000,\n\t10,\n\t120_000,\n);\nconst DEFAULT_TIMEOUT_SEC = 1800; // 30 minutes\n\nexport class ShellService extends Service {\n\tpublic static serviceType = \"shell\";\n\tprivate shellConfig: ShellConfig;\n\tprivate currentDirectory: string;\n\tprivate commandHistory: Map<string, CommandHistoryEntry[]>;\n\tprivate maxHistoryPerConversation = 100;\n\tprivate scopeKey?: string;\n\n\tconstructor(runtime: IAgentRuntime) {\n\t\tsuper(runtime);\n\t\tthis.shellConfig = loadShellConfig();\n\t\tthis.currentDirectory = this.shellConfig.allowedDirectory;\n\t\tthis.commandHistory = new Map();\n\t}\n\n\tstatic async start(runtime: IAgentRuntime): Promise<ShellService> {\n\t\tconst instance = new ShellService(runtime);\n\t\tlogger.info(\n\t\t\t\"Shell service initialized with PTY, background execution, and history tracking\",\n\t\t);\n\t\treturn instance;\n\t}\n\n\tasync stop(): Promise<void> {\n\t\t// Clean up all running sessions by killing their processes\n\t\tconst runningSessions = listRunningSessions();\n\t\tfor (const session of runningSessions) {\n\t\t\ttry {\n\t\t\t\tkillSession(session);\n\t\t\t\tlogger.debug(`Killed shell session: ${session.id}`);\n\t\t\t} catch (err) {\n\t\t\t\tlogger.warn(`Failed to kill shell session ${session.id}: ${err}`);\n\t\t\t}\n\t\t}\n\n\t\t// Clear command history\n\t\tthis.commandHistory.clear();\n\n\t\tlogger.info(\n\t\t\t`Shell service stopped, cleaned up ${runningSessions.length} running sessions`,\n\t\t);\n\t}\n\n\tget capabilityDescription(): string {\n\t\treturn \"Execute shell commands with PTY support, background execution, and session management\";\n\t}\n\n\t/**\n\t * Set scope key for session isolation\n\t */\n\tsetScopeKey(scopeKey: string): void {\n\t\tthis.scopeKey = scopeKey;\n\t}\n\n\t/**\n\t * Simple command execution (original API for backward compatibility)\n\t */\n\tasync executeCommand(\n\t\tcommand: string,\n\t\tconversationId?: string,\n\t): Promise<CommandResult> {\n\t\tif (!command || typeof command !== \"string\") {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\tstdout: \"\",\n\t\t\t\tstderr: \"Invalid command\",\n\t\t\t\texitCode: 1,\n\t\t\t\terror: \"Command must be a non-empty string\",\n\t\t\t\texecutedIn: this.currentDirectory,\n\t\t\t};\n\t\t}\n\n\t\t// Sandbox remote mode: route to host capability API\n\t\tif (\n\t\t\tthis.runtime &&\n\t\t\t(this.runtime as unknown as Record<string, unknown>).sandboxMode\n\t\t) {\n\t\t\tconst hostApiUrl =\n\t\t\t\t(this.runtime.getSetting(\"SANDBOX_HOST_API_URL\") as string | null) ??\n\t\t\t\t\"http://localhost:2138\";\n\t\t\tconst runtimeFetch = this.runtime.fetch ?? globalThis.fetch;\n\t\t\tlogger.info(\n\t\t\t\t`[shell:sandbox] routing exec to ${hostApiUrl}: ${command.substring(0, 100)}`,\n\t\t\t);\n\t\t\ttry {\n\t\t\t\tconst response = await runtimeFetch(`${hostApiUrl}/api/sandbox/exec`, {\n\t\t\t\t\tmethod: \"POST\",\n\t\t\t\t\theaders: { \"Content-Type\": \"application/json\" },\n\t\t\t\t\tbody: JSON.stringify({\n\t\t\t\t\t\tcommand,\n\t\t\t\t\t\tworkdir: this.currentDirectory,\n\t\t\t\t\t\ttimeoutMs: 30000,\n\t\t\t\t\t}),\n\t\t\t\t});\n\t\t\t\tconst result = (await response.json()) as {\n\t\t\t\t\texitCode: number;\n\t\t\t\t\tstdout: string;\n\t\t\t\t\tstderr: string;\n\t\t\t\t\tdurationMs: number;\n\t\t\t\t\texecutedInSandbox: boolean;\n\t\t\t\t};\n\t\t\t\tlogger.info(\n\t\t\t\t\t`[shell:sandbox] exec completed: exit=${result.exitCode} duration=${result.durationMs}ms`,\n\t\t\t\t);\n\t\t\t\treturn {\n\t\t\t\t\tsuccess: result.exitCode === 0,\n\t\t\t\t\tstdout: result.stdout,\n\t\t\t\t\tstderr: result.stderr,\n\t\t\t\t\texitCode: result.exitCode,\n\t\t\t\t\texecutedIn: this.currentDirectory,\n\t\t\t\t};\n\t\t\t} catch (err) {\n\t\t\t\tconst errMsg = err instanceof Error ? err.message : String(err);\n\t\t\t\tlogger.error(`[shell:sandbox] exec failed: ${errMsg}`);\n\t\t\t\treturn {\n\t\t\t\t\tsuccess: false,\n\t\t\t\t\tstdout: \"\",\n\t\t\t\t\tstderr: `Sandbox exec failed: ${errMsg}`,\n\t\t\t\t\texitCode: 1,\n\t\t\t\t\terror: \"Sandbox remote execution failed\",\n\t\t\t\t\texecutedIn: this.currentDirectory,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tconst trimmedCommand = command.trim();\n\n\t\tif (!isSafeCommand(trimmedCommand)) {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\tstdout: \"\",\n\t\t\t\tstderr: \"Command contains forbidden patterns\",\n\t\t\t\texitCode: 1,\n\t\t\t\terror: \"Security policy violation\",\n\t\t\t\texecutedIn: this.currentDirectory,\n\t\t\t};\n\t\t}\n\n\t\tif (\n\t\t\tisForbiddenCommand(trimmedCommand, this.shellConfig.forbiddenCommands)\n\t\t) {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\tstdout: \"\",\n\t\t\t\tstderr: \"Command is forbidden by security policy\",\n\t\t\t\texitCode: 1,\n\t\t\t\terror: \"Forbidden command\",\n\t\t\t\texecutedIn: this.currentDirectory,\n\t\t\t};\n\t\t}\n\n\t\tif (trimmedCommand.startsWith(\"cd \")) {\n\t\t\tconst result = await this.handleCdCommand(trimmedCommand);\n\t\t\tthis.addToHistory(conversationId, trimmedCommand, result);\n\t\t\treturn result;\n\t\t}\n\n\t\tconst result = await this.runCommandSimple(trimmedCommand);\n\n\t\tif (result.success) {\n\t\t\tconst fileOps = this.detectFileOperations(\n\t\t\t\ttrimmedCommand,\n\t\t\t\tthis.currentDirectory,\n\t\t\t);\n\t\t\tif (fileOps && conversationId) {\n\t\t\t\tthis.addToHistory(conversationId, trimmedCommand, result, fileOps);\n\t\t\t} else {\n\t\t\t\tthis.addToHistory(conversationId, trimmedCommand, result);\n\t\t\t}\n\t\t} else {\n\t\t\tthis.addToHistory(conversationId, trimmedCommand, result);\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t/**\n\t * Enhanced command execution with PTY, background support, and session management\n\t * This is the main execution method that supports all advanced features\n\t */\n\tasync exec(\n\t\tcommand: string,\n\t\toptions: ExecuteOptions = {},\n\t): Promise<ExecResult> {\n\t\tif (!command || typeof command !== \"string\") {\n\t\t\treturn {\n\t\t\t\tstatus: \"failed\",\n\t\t\t\texitCode: 1,\n\t\t\t\tdurationMs: 0,\n\t\t\t\taggregated: \"Invalid command\",\n\t\t\t\treason: \"Command must be a non-empty string\",\n\t\t\t};\n\t\t}\n\n\t\tconst trimmedCommand = command.trim();\n\n\t\tif (!isSafeCommand(trimmedCommand)) {\n\t\t\treturn {\n\t\t\t\tstatus: \"failed\",\n\t\t\t\texitCode: 1,\n\t\t\t\tdurationMs: 0,\n\t\t\t\taggregated: \"Command contains forbidden patterns\",\n\t\t\t\treason: \"Security policy violation\",\n\t\t\t};\n\t\t}\n\n\t\tif (\n\t\t\tisForbiddenCommand(trimmedCommand, this.shellConfig.forbiddenCommands)\n\t\t) {\n\t\t\treturn {\n\t\t\t\tstatus: \"failed\",\n\t\t\t\texitCode: 1,\n\t\t\t\tdurationMs: 0,\n\t\t\t\taggregated: \"Command is forbidden by security policy\",\n\t\t\t\treason: \"Forbidden command\",\n\t\t\t};\n\t\t}\n\n\t\tconst warnings: string[] = [];\n\t\tconst maxOutput = this.shellConfig.maxOutputChars ?? DEFAULT_MAX_OUTPUT;\n\t\tconst pendingMaxOutput =\n\t\t\tthis.shellConfig.pendingMaxOutputChars ?? DEFAULT_PENDING_MAX_OUTPUT;\n\t\tconst defaultBackgroundMs =\n\t\t\tthis.shellConfig.defaultBackgroundMs ?? DEFAULT_BACKGROUND_MS;\n\t\tconst allowBackground = this.shellConfig.allowBackground ?? true;\n\n\t\t// Resolve background/yield settings\n\t\tconst backgroundRequested = options.background === true;\n\t\tconst yieldRequested = typeof options.yieldMs === \"number\";\n\t\tif (!allowBackground && (backgroundRequested || yieldRequested)) {\n\t\t\twarnings.push(\n\t\t\t\t\"Warning: background execution is disabled; running synchronously.\",\n\t\t\t);\n\t\t}\n\t\tconst yieldWindow = allowBackground\n\t\t\t? backgroundRequested\n\t\t\t\t? 0\n\t\t\t\t: clampNumber(\n\t\t\t\t\t\toptions.yieldMs ?? defaultBackgroundMs,\n\t\t\t\t\t\tdefaultBackgroundMs,\n\t\t\t\t\t\t10,\n\t\t\t\t\t\t120_000,\n\t\t\t\t\t)\n\t\t\t: null;\n\n\t\t// Resolve workdir\n\t\tconst rawWorkdir =\n\t\t\toptions.workdir?.trim() || this.currentDirectory || process.cwd();\n\t\tconst workdir = resolveWorkdir(rawWorkdir, warnings);\n\n\t\t// Build environment\n\t\tconst baseEnv = coerceEnv(process.env);\n\t\tconst mergedEnv = options.env ? { ...baseEnv, ...options.env } : baseEnv;\n\n\t\tconst timeoutSec =\n\t\t\ttypeof options.timeout === \"number\" && options.timeout > 0\n\t\t\t\t? options.timeout\n\t\t\t\t: DEFAULT_TIMEOUT_SEC;\n\t\tconst usePty = options.pty === true;\n\t\tconst notifyOnExit = options.notifyOnExit !== false;\n\n\t\t// Run the process\n\t\tconst handle = await this.runExecProcess({\n\t\t\tcommand: trimmedCommand,\n\t\t\tworkdir,\n\t\t\tenv: mergedEnv,\n\t\t\tusePty,\n\t\t\twarnings,\n\t\t\tmaxOutput,\n\t\t\tpendingMaxOutput,\n\t\t\tnotifyOnExit,\n\t\t\tscopeKey: options.scopeKey ?? this.scopeKey,\n\t\t\tsessionKey: options.sessionKey,\n\t\t\ttimeoutSec,\n\t\t\tonUpdate: options.onUpdate,\n\t\t});\n\n\t\t// Handle background/yield\n\t\tif (allowBackground && yieldWindow !== null) {\n\t\t\tif (yieldWindow === 0) {\n\t\t\t\tmarkBackgrounded(handle.session);\n\t\t\t\treturn {\n\t\t\t\t\tstatus: \"running\",\n\t\t\t\t\tsessionId: handle.session.id,\n\t\t\t\t\tpid: handle.session.pid,\n\t\t\t\t\tstartedAt: handle.startedAt,\n\t\t\t\t\tcwd: handle.session.cwd,\n\t\t\t\t\ttail: handle.session.tail,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// Wait for yieldWindow or completion\n\t\t\tconst raceResult = await Promise.race([\n\t\t\t\thandle.promise,\n\t\t\t\tnew Promise<\"yield\">((resolve) =>\n\t\t\t\t\tsetTimeout(() => resolve(\"yield\"), yieldWindow),\n\t\t\t\t),\n\t\t\t]);\n\n\t\t\tif (raceResult === \"yield\" && !handle.session.exited) {\n\t\t\t\tmarkBackgrounded(handle.session);\n\t\t\t\tconst warningText = warnings.length ? `${warnings.join(\"\\n\")}\\n\\n` : \"\";\n\t\t\t\treturn {\n\t\t\t\t\tstatus: \"running\",\n\t\t\t\t\tsessionId: handle.session.id,\n\t\t\t\t\tpid: handle.session.pid,\n\t\t\t\t\tstartedAt: handle.startedAt,\n\t\t\t\t\tcwd: handle.session.cwd,\n\t\t\t\t\ttail: `${warningText}Command still running (session ${handle.session.id}, pid ${handle.session.pid ?? \"n/a\"}).`,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\t// Process completed within yield window\n\t\t\tconst outcome =\n\t\t\t\traceResult === \"yield\" ? await handle.promise : raceResult;\n\t\t\tconst warningText = warnings.length ? `${warnings.join(\"\\n\")}\\n\\n` : \"\";\n\n\t\t\tif (outcome.status === \"failed\") {\n\t\t\t\treturn {\n\t\t\t\t\tstatus: \"failed\",\n\t\t\t\t\texitCode: outcome.exitCode ?? null,\n\t\t\t\t\tdurationMs: outcome.durationMs,\n\t\t\t\t\taggregated: outcome.aggregated,\n\t\t\t\t\tcwd: workdir,\n\t\t\t\t\ttimedOut: outcome.timedOut,\n\t\t\t\t\treason: `${warningText}${outcome.reason ?? \"Command failed.\"}`,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tstatus: \"completed\",\n\t\t\t\texitCode: outcome.exitCode ?? 0,\n\t\t\t\tdurationMs: outcome.durationMs,\n\t\t\t\taggregated: `${warningText}${outcome.aggregated || \"(no output)\"}`,\n\t\t\t\tcwd: workdir,\n\t\t\t};\n\t\t}\n\n\t\t// Synchronous execution (no yield/background)\n\t\tconst outcome = await handle.promise;\n\t\tconst warningText = warnings.length ? `${warnings.join(\"\\n\")}\\n\\n` : \"\";\n\n\t\tif (outcome.status === \"failed\") {\n\t\t\treturn {\n\t\t\t\tstatus: \"failed\",\n\t\t\t\texitCode: outcome.exitCode ?? null,\n\t\t\t\tdurationMs: outcome.durationMs,\n\t\t\t\taggregated: outcome.aggregated,\n\t\t\t\tcwd: workdir,\n\t\t\t\ttimedOut: outcome.timedOut,\n\t\t\t\treason: `${warningText}${outcome.reason ?? \"Command failed.\"}`,\n\t\t\t};\n\t\t}\n\n\t\treturn {\n\t\t\tstatus: \"completed\",\n\t\t\texitCode: outcome.exitCode ?? 0,\n\t\t\tdurationMs: outcome.durationMs,\n\t\t\taggregated: `${warningText}${outcome.aggregated || \"(no output)\"}`,\n\t\t\tcwd: workdir,\n\t\t};\n\t}\n\n\t/**\n\t * Process management action handler\n\t * Supports: list, poll, log, write, send-keys, submit, paste, kill, clear, remove\n\t */\n\tasync processAction(params: ProcessActionParams): Promise<{\n\t\tsuccess: boolean;\n\t\tmessage: string;\n\t\tdata?: Record<string, unknown>;\n\t}> {\n\t\tconst scopeKey = this.scopeKey;\n\t\tconst isInScope = (session?: { scopeKey?: string } | null) =>\n\t\t\t!scopeKey || session?.scopeKey === scopeKey;\n\n\t\tif (params.action === \"list\") {\n\t\t\tconst running = listRunningSessions()\n\t\t\t\t.filter((s) => isInScope(s))\n\t\t\t\t.map((s) => ({\n\t\t\t\t\tsessionId: s.id,\n\t\t\t\t\tstatus: \"running\",\n\t\t\t\t\tpid: s.pid ?? undefined,\n\t\t\t\t\tstartedAt: s.startedAt,\n\t\t\t\t\truntimeMs: Date.now() - s.startedAt,\n\t\t\t\t\tcwd: s.cwd,\n\t\t\t\t\tcommand: s.command,\n\t\t\t\t\tname: deriveSessionName(s.command),\n\t\t\t\t\ttail: s.tail,\n\t\t\t\t\ttruncated: s.truncated,\n\t\t\t\t}));\n\t\t\tconst finished = listFinishedSessions()\n\t\t\t\t.filter((s) => isInScope(s))\n\t\t\t\t.map((s) => ({\n\t\t\t\t\tsessionId: s.id,\n\t\t\t\t\tstatus: s.status,\n\t\t\t\t\tstartedAt: s.startedAt,\n\t\t\t\t\tendedAt: s.endedAt,\n\t\t\t\t\truntimeMs: s.endedAt - s.startedAt,\n\t\t\t\t\tcwd: s.cwd,\n\t\t\t\t\tcommand: s.command,\n\t\t\t\t\tname: deriveSessionName(s.command),\n\t\t\t\t\ttail: s.tail,\n\t\t\t\t\ttruncated: s.truncated,\n\t\t\t\t\texitCode: s.exitCode ?? undefined,\n\t\t\t\t\texitSignal: s.exitSignal ?? undefined,\n\t\t\t\t}));\n\t\t\tconst sessions = [...running, ...finished]\n\t\t\t\t.slice()\n\t\t\t\t.sort(\n\t\t\t\t\t(\n\t\t\t\t\t\ta: (typeof running)[number] | (typeof finished)[number],\n\t\t\t\t\t\tb: (typeof running)[number] | (typeof finished)[number],\n\t\t\t\t\t) => b.startedAt - a.startedAt,\n\t\t\t\t);\n\t\t\tconst lines = sessions.map((s: (typeof sessions)[number]) => {\n\t\t\t\tconst label = s.name\n\t\t\t\t\t? truncateMiddle(s.name, 80)\n\t\t\t\t\t: truncateMiddle(s.command, 120);\n\t\t\t\treturn `${s.sessionId} ${pad(s.status, 9)} ${formatDuration(s.runtimeMs)} :: ${label}`;\n\t\t\t});\n\t\t\treturn {\n\t\t\t\tsuccess: true,\n\t\t\t\tmessage: lines.join(\"\\n\") || \"No running or recent sessions.\",\n\t\t\t\tdata: { sessions },\n\t\t\t};\n\t\t}\n\n\t\tif (!params.sessionId) {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\tmessage: \"sessionId is required for this action.\",\n\t\t\t};\n\t\t}\n\n\t\tconst session = getSession(params.sessionId);\n\t\tconst finished = getFinishedSession(params.sessionId);\n\t\tconst scopedSession = isInScope(session) ? session : undefined;\n\t\tconst scopedFinished = isInScope(finished) ? finished : undefined;\n\n\t\tswitch (params.action) {\n\t\t\tcase \"poll\": {\n\t\t\t\tif (!scopedSession) {\n\t\t\t\t\tif (scopedFinished) {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tsuccess: true,\n\t\t\t\t\t\t\tmessage:\n\t\t\t\t\t\t\t\t(scopedFinished.tail ||\n\t\t\t\t\t\t\t\t\t`(no output recorded${scopedFinished.truncated ? \" — truncated to cap\" : \"\"})`) +\n\t\t\t\t\t\t\t\t`\\n\\nProcess exited with ${\n\t\t\t\t\t\t\t\t\tscopedFinished.exitSignal\n\t\t\t\t\t\t\t\t\t\t? `signal ${scopedFinished.exitSignal}`\n\t\t\t\t\t\t\t\t\t\t: `code ${scopedFinished.exitCode ?? 0}`\n\t\t\t\t\t\t\t\t}.`,\n\t\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\t\tstatus:\n\t\t\t\t\t\t\t\t\tscopedFinished.status === \"completed\"\n\t\t\t\t\t\t\t\t\t\t? \"completed\"\n\t\t\t\t\t\t\t\t\t\t: \"failed\",\n\t\t\t\t\t\t\t\tsessionId: params.sessionId,\n\t\t\t\t\t\t\t\texitCode: scopedFinished.exitCode ?? undefined,\n\t\t\t\t\t\t\t\taggregated: scopedFinished.aggregated,\n\t\t\t\t\t\t\t\tname: deriveSessionName(scopedFinished.command),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsuccess: false,\n\t\t\t\t\t\tmessage: `No session found for ${params.sessionId}`,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tif (!scopedSession.backgrounded) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsuccess: false,\n\t\t\t\t\t\tmessage: `Session ${params.sessionId} is not backgrounded.`,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tconst { stdout, stderr } = drainSession(scopedSession);\n\t\t\t\tconst exited = scopedSession.exited;\n\t\t\t\tconst exitCode = scopedSession.exitCode ?? 0;\n\t\t\t\tconst exitSignal = scopedSession.exitSignal ?? undefined;\n\t\t\t\tif (exited) {\n\t\t\t\t\tconst status =\n\t\t\t\t\t\texitCode === 0 && exitSignal == null ? \"completed\" : \"failed\";\n\t\t\t\t\tmarkExited(\n\t\t\t\t\t\tscopedSession,\n\t\t\t\t\t\tscopedSession.exitCode ?? null,\n\t\t\t\t\t\tscopedSession.exitSignal ?? null,\n\t\t\t\t\t\tstatus,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tconst status = exited\n\t\t\t\t\t? exitCode === 0 && exitSignal == null\n\t\t\t\t\t\t? \"completed\"\n\t\t\t\t\t\t: \"failed\"\n\t\t\t\t\t: \"running\";\n\t\t\t\tconst output = [stdout.trimEnd(), stderr.trimEnd()]\n\t\t\t\t\t.filter(Boolean)\n\t\t\t\t\t.join(\"\\n\")\n\t\t\t\t\t.trim();\n\t\t\t\treturn {\n\t\t\t\t\tsuccess: true,\n\t\t\t\t\tmessage:\n\t\t\t\t\t\t(output || \"(no new output)\") +\n\t\t\t\t\t\t(exited\n\t\t\t\t\t\t\t? `\\n\\nProcess exited with ${\n\t\t\t\t\t\t\t\t\texitSignal ? `signal ${exitSignal}` : `code ${exitCode}`\n\t\t\t\t\t\t\t\t}.`\n\t\t\t\t\t\t\t: \"\\n\\nProcess still running.\"),\n\t\t\t\t\tdata: {\n\t\t\t\t\t\tstatus,\n\t\t\t\t\t\tsessionId: params.sessionId,\n\t\t\t\t\t\texitCode: exited ? exitCode : undefined,\n\t\t\t\t\t\taggregated: scopedSession.aggregated,\n\t\t\t\t\t\tname: deriveSessionName(scopedSession.command),\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tcase \"log\": {\n\t\t\t\tif (scopedSession) {\n\t\t\t\t\tif (!scopedSession.backgrounded) {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tsuccess: false,\n\t\t\t\t\t\t\tmessage: `Session ${params.sessionId} is not backgrounded.`,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t\tconst { slice, totalLines, totalChars } = sliceLogLines(\n\t\t\t\t\t\tscopedSession.aggregated,\n\t\t\t\t\t\tparams.offset,\n\t\t\t\t\t\tparams.limit,\n\t\t\t\t\t);\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsuccess: true,\n\t\t\t\t\t\tmessage: slice || \"(no output yet)\",\n\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\tstatus: scopedSession.exited ? \"completed\" : \"running\",\n\t\t\t\t\t\t\tsessionId: params.sessionId,\n\t\t\t\t\t\t\ttotalLines,\n\t\t\t\t\t\t\ttotalChars,\n\t\t\t\t\t\t\ttruncated: scopedSession.truncated,\n\t\t\t\t\t\t\tname: deriveSessionName(scopedSession.command),\n\t\t\t\t\t\t},\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tif (scopedFinished) {\n\t\t\t\t\tconst { slice, totalLines, totalChars } = sliceLogLines(\n\t\t\t\t\t\tscopedFinished.aggregated,\n\t\t\t\t\t\tparams.offset,\n\t\t\t\t\t\tparams.limit,\n\t\t\t\t\t);\n\t\t\t\t\tconst status =\n\t\t\t\t\t\tscopedFinished.status === \"completed\" ? \"completed\" : \"failed\";\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsuccess: true,\n\t\t\t\t\t\tmessage: slice || \"(no output recorded)\",\n\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\tstatus,\n\t\t\t\t\t\t\tsessionId: params.sessionId,\n\t\t\t\t\t\t\ttotalLines,\n\t\t\t\t\t\t\ttotalChars,\n\t\t\t\t\t\t\ttruncated: scopedFinished.truncated,\n\t\t\t\t\t\t\texitCode: scopedFinished.exitCode ?? undefined,\n\t\t\t\t\t\t\texitSignal: scopedFinished.exitSignal ?? undefined,\n\t\t\t\t\t\t\tname: deriveSessionName(scopedFinished.command),\n\t\t\t\t\t\t},\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\tsuccess: false,\n\t\t\t\t\tmessage: `No session found for ${params.sessionId}`,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tcase \"write\": {\n\t\t\t\tif (!scopedSession) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsuccess: false,\n\t\t\t\t\t\tmessage: `No active session found for ${params.sessionId}`,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tif (!scopedSession.backgrounded) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsuccess: false,\n\t\t\t\t\t\tmessage: `Session ${params.sessionId} is not backgrounded.`,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tconst stdin = scopedSession.stdin ?? scopedSession.child?.stdin;\n\t\t\t\tif (!stdin || stdin.destroyed) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsuccess: false,\n\t\t\t\t\t\tmessage: `Session ${params.sessionId} stdin is not writable.`,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\t\t\tstdin.write(params.data ?? \"\", (err) => {\n\t\t\t\t\t\tif (err) reject(err);\n\t\t\t\t\t\telse resolve();\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t\tif (params.eof) {\n\t\t\t\t\tstdin.end();\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\tsuccess: true,\n\t\t\t\t\tmessage: `Wrote ${(params.data ?? \"\").length} bytes to session ${params.sessionId}${\n\t\t\t\t\t\tparams.eof ? \" (stdin closed)\" : \"\"\n\t\t\t\t\t}.`,\n\t\t\t\t\tdata: {\n\t\t\t\t\t\tsessionId: params.sessionId,\n\t\t\t\t\t\tname: deriveSessionName(scopedSession.command),\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tcase \"send-keys\": {\n\t\t\t\tif (!scopedSession) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsuccess: false,\n\t\t\t\t\t\tmessage: `No active session found for ${params.sessionId}`,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tif (!scopedSession.backgrounded) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsuccess: false,\n\t\t\t\t\t\tmessage: `Session ${params.sessionId} is not backgrounded.`,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tconst stdin = scopedSession.stdin ?? scopedSession.child?.stdin;\n\t\t\t\tif (!stdin || stdin.destroyed) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsuccess: false,\n\t\t\t\t\t\tmessage: `Session ${params.sessionId} stdin is not writable.`,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tconst { data, warnings } = encodeKeySequence({\n\t\t\t\t\tkeys: params.keys,\n\t\t\t\t\thex: params.hex,\n\t\t\t\t\tliteral: params.literal,\n\t\t\t\t});\n\t\t\t\tif (!data) {\n\t\t\t\t\treturn { success: false, message: \"No key data provided.\" };\n\t\t\t\t}\n\t\t\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\t\t\tstdin.write(data, (err) => {\n\t\t\t\t\t\tif (err) reject(err);\n\t\t\t\t\t\telse resolve();\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t\treturn {\n\t\t\t\t\tsuccess: true,\n\t\t\t\t\tmessage:\n\t\t\t\t\t\t`Sent ${data.length} bytes to session ${params.sessionId}.` +\n\t\t\t\t\t\t(warnings.length ? `\\nWarnings:\\n- ${warnings.join(\"\\n- \")}` : \"\"),\n\t\t\t\t\tdata: {\n\t\t\t\t\t\tsessionId: params.sessionId,\n\t\t\t\t\t\tname: deriveSessionName(scopedSession.command),\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tcase \"submit\": {\n\t\t\t\tif (!scopedSession) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsuccess: false,\n\t\t\t\t\t\tmessage: `No active session found for ${params.sessionId}`,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tif (!scopedSession.backgrounded) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsuccess: false,\n\t\t\t\t\t\tmessage: `Session ${params.sessionId} is not backgrounded.`,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tconst stdin = scopedSession.stdin ?? scopedSession.child?.stdin;\n\t\t\t\tif (!stdin || stdin.destroyed) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsuccess: false,\n\t\t\t\t\t\tmessage: `Session ${params.sessionId} stdin is not writable.`,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\t\t\tstdin.write(\"\\r\", (err) => {\n\t\t\t\t\t\tif (err) reject(err);\n\t\t\t\t\t\telse resolve();\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t\treturn {\n\t\t\t\t\tsuccess: true,\n\t\t\t\t\tmessage: `Submitted session ${params.sessionId} (sent CR).`,\n\t\t\t\t\tdata: {\n\t\t\t\t\t\tsessionId: params.sessionId,\n\t\t\t\t\t\tname: deriveSessionName(scopedSession.command),\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tcase \"paste\": {\n\t\t\t\tif (!scopedSession) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsuccess: false,\n\t\t\t\t\t\tmessage: `No active session found for ${params.sessionId}`,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tif (!scopedSession.backgrounded) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsuccess: false,\n\t\t\t\t\t\tmessage: `Session ${params.sessionId} is not backgrounded.`,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tconst stdin = scopedSession.stdin ?? scopedSession.child?.stdin;\n\t\t\t\tif (!stdin || stdin.destroyed) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsuccess: false,\n\t\t\t\t\t\tmessage: `Session ${params.sessionId} stdin is not writable.`,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tconst payload = encodePaste(\n\t\t\t\t\tparams.text ?? \"\",\n\t\t\t\t\tparams.bracketed !== false,\n\t\t\t\t);\n\t\t\t\tif (!payload) {\n\t\t\t\t\treturn { success: false, message: \"No paste text provided.\" };\n\t\t\t\t}\n\t\t\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\t\t\tstdin.write(payload, (err) => {\n\t\t\t\t\t\tif (err) reject(err);\n\t\t\t\t\t\telse resolve();\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t\treturn {\n\t\t\t\t\tsuccess: true,\n\t\t\t\t\tmessage: `Pasted ${params.text?.length ?? 0} chars to session ${params.sessionId}.`,\n\t\t\t\t\tdata: {\n\t\t\t\t\t\tsessionId: params.sessionId,\n\t\t\t\t\t\tname: deriveSessionName(scopedSession.command),\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tcase \"kill\": {\n\t\t\t\tif (!scopedSession) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsuccess: false,\n\t\t\t\t\t\tmessage: `No active session found for ${params.sessionId}`,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tif (!scopedSession.backgrounded) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsuccess: false,\n\t\t\t\t\t\tmessage: `Session ${params.sessionId} is not backgrounded.`,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tkillSession(scopedSession);\n\t\t\t\tmarkExited(scopedSession, null, \"SIGKILL\", \"failed\");\n\t\t\t\treturn {\n\t\t\t\t\tsuccess: true,\n\t\t\t\t\tmessage: `Killed session ${params.sessionId}.`,\n\t\t\t\t\tdata: { name: deriveSessionName(scopedSession.command) },\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tcase \"clear\": {\n\t\t\t\tif (scopedFinished) {\n\t\t\t\t\tdeleteSession(params.sessionId);\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsuccess: true,\n\t\t\t\t\t\tmessage: `Cleared session ${params.sessionId}.`,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\tsuccess: false,\n\t\t\t\t\tmessage: `No finished session found for ${params.sessionId}`,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tcase \"remove\": {\n\t\t\t\tif (scopedSession) {\n\t\t\t\t\tkillSession(scopedSession);\n\t\t\t\t\tmarkExited(scopedSession, null, \"SIGKILL\", \"failed\");\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsuccess: true,\n\t\t\t\t\t\tmessage: `Removed session ${params.sessionId}.`,\n\t\t\t\t\t\tdata: { name: deriveSessionName(scopedSession.command) },\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tif (scopedFinished) {\n\t\t\t\t\tdeleteSession(params.sessionId);\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsuccess: true,\n\t\t\t\t\t\tmessage: `Removed session ${params.sessionId}.`,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\tsuccess: false,\n\t\t\t\t\tmessage: `No session found for ${params.sessionId}`,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\tsuccess: false,\n\t\t\tmessage: `Unknown action ${params.action as string}`,\n\t\t};\n\t}\n\n\t// ===== Public Service Methods for External Use =====\n\n\t/**\n\t * List all running sessions\n\t */\n\tlistRunningSessions(): ProcessSession[] {\n\t\tconst scopeKey = this.scopeKey;\n\t\treturn listRunningSessions().filter(\n\t\t\t(s) => !scopeKey || s.scopeKey === scopeKey,\n\t\t);\n\t}\n\n\t/**\n\t * List all finished sessions\n\t */\n\tlistFinishedSessions(): FinishedSession[] {\n\t\tconst scopeKey = this.scopeKey;\n\t\treturn listFinishedSessions().filter(\n\t\t\t(s) => !scopeKey || s.scopeKey === scopeKey,\n\t\t);\n\t}\n\n\t/**\n\t * Get a specific session by ID\n\t */\n\tgetSession(id: string): ProcessSession | undefined {\n\t\tconst session = getSession(id);\n\t\tif (!session) return undefined;\n\t\tif (this.scopeKey && session.scopeKey !== this.scopeKey) return undefined;\n\t\treturn session;\n\t}\n\n\t/**\n\t * Get a specific finished session by ID\n\t */\n\tgetFinishedSession(id: string): FinishedSession | undefined {\n\t\tconst session = getFinishedSession(id);\n\t\tif (!session) return undefined;\n\t\tif (this.scopeKey && session.scopeKey !== this.scopeKey) return undefined;\n\t\treturn session;\n\t}\n\n\t/**\n\t * Kill a session by ID\n\t */\n\tkillSessionById(id: string): boolean {\n\t\tconst session = this.getSession(id);\n\t\tif (!session) return false;\n\t\tkillSession(session);\n\t\tmarkExited(session, null, \"SIGKILL\", \"killed\");\n\t\treturn true;\n\t}\n\n\t/**\n\t * Get command history for a conversation\n\t */\n\tgetCommandHistory(\n\t\tconversationId: string,\n\t\tlimit?: number,\n\t): CommandHistoryEntry[] {\n\t\tconst history = this.commandHistory.get(conversationId) || [];\n\t\tif (limit && limit > 0) {\n\t\t\treturn history.slice(-limit);\n\t\t}\n\t\treturn history;\n\t}\n\n\t/**\n\t * Clear command history for a conversation\n\t */\n\tclearCommandHistory(conversationId: string): void {\n\t\tthis.commandHistory.delete(conversationId);\n\t\tlogger.info(`Cleared command history for conversation: ${conversationId}`);\n\t}\n\n\t/**\n\t * Get current working directory\n\t */\n\tgetCurrentDirectory(_conversationId?: string): string {\n\t\treturn this.currentDirectory;\n\t}\n\n\t/**\n\t * Set current working directory\n\t */\n\tsetCurrentDirectory(directory: string): boolean {\n\t\tconst validatedPath = validatePath(\n\t\t\tdirectory,\n\t\t\tthis.shellConfig.allowedDirectory,\n\t\t\tthis.currentDirectory,\n\t\t);\n\t\tif (!validatedPath) {\n\t\t\treturn false;\n\t\t}\n\t\tthis.currentDirectory = validatedPath;\n\t\treturn true;\n\t}\n\n\t/**\n\t * Get allowed directory\n\t */\n\tgetAllowedDirectory(): string {\n\t\treturn this.shellConfig.allowedDirectory;\n\t}\n\n\t/**\n\t * Get shell configuration\n\t */\n\tgetShellConfig(): ShellConfig {\n\t\treturn { ...this.shellConfig };\n\t}\n\n\t// ===== Private Methods =====\n\n\tprivate async handleCdCommand(command: string): Promise<CommandResult> {\n\t\tconst parts = command.split(/\\s+/);\n\t\tif (parts.length < 2) {\n\t\t\tthis.currentDirectory = this.shellConfig.allowedDirectory;\n\t\t\treturn {\n\t\t\t\tsuccess: true,\n\t\t\t\tstdout: `Changed directory to: ${this.currentDirectory}`,\n\t\t\t\tstderr: \"\",\n\t\t\t\texitCode: 0,\n\t\t\t\texecutedIn: this.currentDirectory,\n\t\t\t};\n\t\t}\n\n\t\tconst targetPath = parts.slice(1).join(\" \");\n\t\tconst validatedPath = validatePath(\n\t\t\ttargetPath,\n\t\t\tthis.shellConfig.allowedDirectory,\n\t\t\tthis.currentDirectory,\n\t\t);\n\n\t\tif (!validatedPath) {\n\t\t\treturn {\n\t\t\t\tsuccess: false,\n\t\t\t\tstdout: \"\",\n\t\t\t\tstderr: \"Cannot navigate outside allowed directory\",\n\t\t\t\texitCode: 1,\n\t\t\t\terror: \"Permission denied\",\n\t\t\t\texecutedIn: this.currentDirectory,\n\t\t\t};\n\t\t}\n\n\t\tthis.currentDirectory = validatedPath;\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tstdout: `Changed directory to: ${this.currentDirectory}`,\n\t\t\tstderr: \"\",\n\t\t\texitCode: 0,\n\t\t\texecutedIn: this.currentDirectory,\n\t\t};\n\t}\n\n\tprivate async runCommandSimple(command: string): Promise<CommandResult> {\n\t\treturn new Promise((resolve) => {\n\t\t\tconst useShell =\n\t\t\t\tcommand.includes(\">\") || command.includes(\"<\") || command.includes(\"|\");\n\n\t\t\tlet cmd: string;\n\t\t\tlet args: string[];\n\n\t\t\tif (useShell) {\n\t\t\t\tcmd = \"sh\";\n\t\t\t\targs = [\"-c\", command];\n\t\t\t\tlogger.info(\n\t\t\t\t\t`Executing shell command: sh -c \"${command}\" in ${this.currentDirectory}`,\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tconst parts = command.split(/\\s+/);\n\t\t\t\tcmd = parts[0];\n\t\t\t\targs = parts.slice(1);\n\t\t\t\tlogger.info(\n\t\t\t\t\t`Executing command: ${cmd} ${args.join(\" \")} in ${this.currentDirectory}`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tlet stdout = \"\";\n\t\t\tlet stderr = \"\";\n\t\t\tlet timedOut = false;\n\n\t\t\tconst child = spawn(cmd, args, {\n\t\t\t\tcwd: this.currentDirectory,\n\t\t\t\tenv: process.env,\n\t\t\t\tshell: false,\n\t\t\t});\n\n\t\t\tconst timeout = setTimeout(() => {\n\t\t\t\ttimedOut = true;\n\t\t\t\tchild.kill(\"SIGTERM\");\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tif (!child.killed) {\n\t\t\t\t\t\tchild.kill(\"SIGKILL\");\n\t\t\t\t\t}\n\t\t\t\t}, 5000);\n\t\t\t}, this.shellConfig.timeout);\n\n\t\t\tif (child.stdout) {\n\t\t\t\tchild.stdout.on(\"data\", (data: Buffer) => {\n\t\t\t\t\tstdout += data.toString();\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (child.stderr) {\n\t\t\t\tchild.stderr.on(\"data\", (data: Buffer) => {\n\t\t\t\t\tstderr += data.toString();\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tchild.on(\"exit\", (code) => {\n\t\t\t\tclearTimeout(timeout);\n\n\t\t\t\tif (timedOut) {\n\t\t\t\t\tresolve({\n\t\t\t\t\t\tsuccess: false,\n\t\t\t\t\t\tstdout,\n\t\t\t\t\t\tstderr: `${stderr}\\nCommand timed out`,\n\t\t\t\t\t\texitCode: code,\n\t\t\t\t\t\terror: \"Command execution timeout\",\n\t\t\t\t\t\texecutedIn: this.currentDirectory,\n\t\t\t\t\t});\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tresolve({\n\t\t\t\t\tsuccess: code === 0,\n\t\t\t\t\tstdout,\n\t\t\t\t\tstderr,\n\t\t\t\t\texitCode: code,\n\t\t\t\t\texecutedIn: this.currentDirectory,\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tchild.on(\"error\", (err: Error) => {\n\t\t\t\tclearTimeout(timeout);\n\t\t\t\tresolve({\n\t\t\t\t\tsuccess: false,\n\t\t\t\t\tstdout,\n\t\t\t\t\tstderr: err.message,\n\t\t\t\t\texitCode: 1,\n\t\t\t\t\terror: \"Failed to execute command\",\n\t\t\t\t\texecutedIn: this.currentDirectory,\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\t}\n\n\tprivate async runExecProcess(opts: {\n\t\tcommand: string;\n\t\tworkdir: string;\n\t\tenv: Record<string, string>;\n\t\tusePty: boolean;\n\t\twarnings: string[];\n\t\tmaxOutput: number;\n\t\tpendingMaxOutput: number;\n\t\tnotifyOnExit: boolean;\n\t\tscopeKey?: string;\n\t\tsessionKey?: string;\n\t\ttimeoutSec: number;\n\t\tonUpdate?: (session: ProcessSession) => void;\n\t}): Promise<{\n\t\tsession: ProcessSession;\n\t\tstartedAt: number;\n\t\tpromise: Promise<{\n\t\t\tstatus: \"completed\" | \"failed\";\n\t\t\texitCode: number | null;\n\t\t\texitSignal: NodeJS.Signals | number | null;\n\t\t\tdurationMs: number;\n\t\t\taggregated: string;\n\t\t\ttimedOut: boolean;\n\t\t\treason?: string;\n\t\t}>;\n\t\tkill: () => void;\n\t}> {\n\t\tconst startedAt = Date.now();\n\t\tconst sessionId = createSessionSlug();\n\t\tlet child: ChildProcessWithoutNullStreams | null = null;\n\t\tlet pty: PtyHandle | null = null;\n\t\tlet stdin: ProcessSession[\"stdin\"] | undefined;\n\n\t\tif (opts.usePty) {\n\t\t\tconst { shell, args: shellArgs } = getShellConfig();\n\t\t\ttry {\n\t\t\t\tconst ptyModule = (await import(\"@lydell/node-pty\")) as {\n\t\t\t\t\tspawn?: PtySpawn;\n\t\t\t\t\tdefault?: { spawn?: PtySpawn };\n\t\t\t\t};\n\t\t\t\tconst spawnPty = ptyModule.spawn ?? ptyModule.default?.spawn;\n\t\t\t\tif (!spawnPty) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\"PTY support is unavailable (node-pty spawn not found).\",\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tpty = spawnPty(shell, [...shellArgs, opts.command], {\n\t\t\t\t\tcwd: opts.workdir,\n\t\t\t\t\tenv: opts.env,\n\t\t\t\t\tname: process.env.TERM ?? \"xterm-256color\",\n\t\t\t\t\tcols: 120,\n\t\t\t\t\trows: 30,\n\t\t\t\t});\n\t\t\t\tstdin = {\n\t\t\t\t\tdestroyed: false,\n\t\t\t\t\twrite: (data, cb) => {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tpty?.write(data);\n\t\t\t\t\t\t\tcb?.(null);\n\t\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\t\tcb?.(err as Error);\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tend: () => {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst eof = process.platform === \"win32\" ? \"\\x1a\" : \"\\x04\";\n\t\t\t\t\t\t\tpty?.write(eof);\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\t// ignore EOF errors\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t} catch (err) {\n\t\t\t\tconst errText = String(err);\n\t\t\t\tconst warning = `Warning: PTY spawn failed (${errText}); retrying without PTY.`;\n\t\t\t\tlogger.warn(\n\t\t\t\t\t`exec: PTY spawn failed (${errText}); retrying without PTY.`,\n\t\t\t\t);\n\t\t\t\topts.warnings.push(warning);\n\t\t\t\t// Fall through to non-PTY execution\n\t\t\t}\n\t\t}\n\n\t\tif (!pty) {\n\t\t\tconst { shell, args: shellArgs } = getShellConfig();\n\t\t\tconst proc = spawn(shell, [...shellArgs, opts.command], {\n\t\t\t\tcwd: opts.workdir,\n\t\t\t\tenv: opts.env,\n\t\t\t\tdetached: process.platform !== \"win32\",\n\t\t\t\tstdio: [\"pipe\", \"pipe\", \"pipe\"],\n\t\t\t\twindowsHide: true,\n\t\t\t}) as ChildProcessWithoutNullStreams;\n\t\t\tchild = proc;\n\t\t\tstdin = child.stdin;\n\t\t}\n\n\t\tconst session: ProcessSession = {\n\t\t\tid: sessionId,\n\t\t\tcommand: opts.command,\n\t\t\tscopeKey: opts.scopeKey,\n\t\t\tsessionKey: opts.sessionKey,\n\t\t\tnotifyOnExit: opts.notifyOnExit,\n\t\t\texitNotified: false,\n\t\t\tchild: child ?? undefined,\n\t\t\tstdin,\n\t\t\tpid: child?.pid ?? pty?.pid,\n\t\t\tstartedAt,\n\t\t\tcwd: opts.workdir,\n\t\t\tmaxOutputChars: opts.maxOutput,\n\t\t\tpendingMaxOutputChars: opts.pendingMaxOutput,\n\t\t\ttotalOutputChars: 0,\n\t\t\tpendingStdout: [],\n\t\t\tpendingStderr: [],\n\t\t\tpendingStdoutChars: 0,\n\t\t\tpendingStderrChars: 0,\n\t\t\taggregated: \"\",\n\t\t\ttail: \"\",\n\t\t\texited: false,\n\t\t\texitCode: undefined,\n\t\t\texitSignal: undefined,\n\t\t\ttruncated: false,\n\t\t\tbackgrounded: false,\n\t\t};\n\t\taddSession(session);\n\n\t\tlet settled = false;\n\t\tlet timeoutTimer: NodeJS.Timeout | null = null;\n\t\tlet timeoutFinalizeTimer: NodeJS.Timeout | null = null;\n\t\tlet timedOut = false;\n\t\tconst timeoutFinalizeMs = 1000;\n\t\tlet resolveFn:\n\t\t\t| ((outcome: {\n\t\t\t\t\tstatus: \"completed\" | \"failed\";\n\t\t\t\t\texitCode: number | null;\n\t\t\t\t\texitSignal: NodeJS.Signals | number | null;\n\t\t\t\t\tdurationMs: number;\n\t\t\t\t\taggregated: string;\n\t\t\t\t\ttimedOut: boolean;\n\t\t\t\t\treason?: string;\n\t\t\t }) => void)\n\t\t\t| null = null;\n\n\t\tconst settle = (outcome: {\n\t\t\tstatus: \"completed\" | \"failed\";\n\t\t\texitCode: number | null;\n\t\t\texitSignal: NodeJS.Signals | number | null;\n\t\t\tdurationMs: number;\n\t\t\taggregated: string;\n\t\t\ttimedOut: boolean;\n\t\t\treason?: string;\n\t\t}) => {\n\t\t\tif (settled) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tsettled = true;\n\t\t\tresolveFn?.(outcome);\n\t\t};\n\n\t\tconst finalizeTimeout = () => {\n\t\t\tif (session.exited) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tmarkExited(session, null, \"SIGKILL\", \"failed\");\n\t\t\tconst aggregated = session.aggregated.trim();\n\t\t\tconst reason = `Command timed out after ${opts.timeoutSec} seconds`;\n\t\t\tsettle({\n\t\t\t\tstatus: \"failed\",\n\t\t\t\texitCode: null,\n\t\t\t\texitSignal: \"SIGKILL\",\n\t\t\t\tdurationMs: Date.now() - startedAt,\n\t\t\t\taggregated,\n\t\t\t\ttimedOut: true,\n\t\t\t\treason: aggregated ? `${aggregated}\\n\\n${reason}` : reason,\n\t\t\t});\n\t\t};\n\n\t\tconst onTimeout = () => {\n\t\t\ttimedOut = true;\n\t\t\tkillSession(session);\n\t\t\tif (!timeoutFinalizeTimer) {\n\t\t\t\ttimeoutFinalizeTimer = setTimeout(() => {\n\t\t\t\t\tfinalizeTimeout();\n\t\t\t\t}, timeoutFinalizeMs);\n\t\t\t}\n\t\t};\n\n\t\tif (opts.timeoutSec > 0) {\n\t\t\ttimeoutTimer = setTimeout(() => {\n\t\t\t\tonTimeout();\n\t\t\t}, opts.timeoutSec * 1000);\n\t\t}\n\n\t\tconst emitUpdate = () => {\n\t\t\tif (opts.onUpdate) {\n\t\t\t\topts.onUpdate(session);\n\t\t\t}\n\t\t};\n\n\t\tconst handleStdout = (data: string) => {\n\t\t\tconst str = sanitizeBinaryOutput(data.toString());\n\t\t\tfor (const chunk of chunkString(str)) {\n\t\t\t\tappendOutput(session, \"stdout\", chunk);\n\t\t\t\temitUpdate();\n\t\t\t}\n\t\t};\n\n\t\tconst handleStderr = (data: string) => {\n\t\t\tconst str = sanitizeBinaryOutput(data.toString());\n\t\t\tfor (const chunk of chunkString(str)) {\n\t\t\t\tappendOutput(session, \"stderr\", chunk);\n\t\t\t\temitUpdate();\n\t\t\t}\n\t\t};\n\n\t\tif (pty) {\n\t\t\tconst cursorResponse = buildCursorPositionResponse();\n\t\t\tpty.onData((data) => {\n\t\t\t\tconst raw = data.toString();\n\t\t\t\tconst { cleaned, requests } = stripDsrRequests(raw);\n\t\t\t\tif (requests > 0) {\n\t\t\t\t\tfor (let i = 0; i < requests; i += 1) {\n\t\t\t\t\t\tpty.write(cursorResponse);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\thandleStdout(cleaned);\n\t\t\t});\n\t\t} else if (child) {\n\t\t\tchild.stdout.on(\"data\", handleStdout);\n\t\t\tchild.stderr.on(\"data\", handleStderr);\n\t\t}\n\n\t\tconst promise = new Promise<{\n\t\t\tstatus: \"completed\" | \"failed\";\n\t\t\texitCode: number | null;\n\t\t\texitSignal: NodeJS.Signals | number | null;\n\t\t\tdurationMs: number;\n\t\t\taggregated: string;\n\t\t\ttimedOut: boolean;\n\t\t\treason?: string;\n\t\t}>((resolve) => {\n\t\t\tresolveFn = resolve;\n\t\t\tconst handleExit = (\n\t\t\t\tcode: number | null,\n\t\t\t\texitSignal: NodeJS.Signals | number | null,\n\t\t\t) => {\n\t\t\t\tif (timeoutTimer) {\n\t\t\t\t\tclearTimeout(timeoutTimer);\n\t\t\t\t}\n\t\t\t\tif (timeoutFinalizeTimer) {\n\t\t\t\t\tclearTimeout(timeoutFinalizeTimer);\n\t\t\t\t}\n\t\t\t\tconst durationMs = Date.now() - startedAt;\n\t\t\t\tconst wasSignal = exitSignal != null;\n\t\t\t\tconst isSuccess = code === 0 && !wasSignal && !timedOut;\n\t\t\t\tconst status: \"completed\" | \"failed\" = isSuccess\n\t\t\t\t\t? \"completed\"\n\t\t\t\t\t: \"failed\";\n\t\t\t\tmarkExited(session, code, exitSignal, status);\n\t\t\t\tif (!session.child && session.stdin) {\n\t\t\t\t\tsession.stdin.destroyed = true;\n\t\t\t\t}\n\n\t\t\t\tif (settled) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst aggregated = session.aggregated.trim();\n\t\t\t\tif (!isSuccess) {\n\t\t\t\t\tconst reason = timedOut\n\t\t\t\t\t\t? `Command timed out after ${opts.timeoutSec} seconds`\n\t\t\t\t\t\t: wasSignal && exitSignal\n\t\t\t\t\t\t\t? `Command aborted by signal ${exitSignal}`\n\t\t\t\t\t\t\t: code === null\n\t\t\t\t\t\t\t\t? \"Command aborted before exit code was captured\"\n\t\t\t\t\t\t\t\t: `Command exited with code ${code}`;\n\t\t\t\t\tconst message = aggregated ? `${aggregated}\\n\\n${reason}` : reason;\n\t\t\t\t\tsettle({\n\t\t\t\t\t\tstatus: \"failed\",\n\t\t\t\t\t\texitCode: code ?? null,\n\t\t\t\t\t\texitSignal: exitSignal ?? null,\n\t\t\t\t\t\tdurationMs,\n\t\t\t\t\t\taggregated,\n\t\t\t\t\t\ttimedOut,\n\t\t\t\t\t\treason: message,\n\t\t\t\t\t});\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tsettle({\n\t\t\t\t\tstatus: \"completed\",\n\t\t\t\t\texitCode: code ?? 0,\n\t\t\t\t\texitSignal: exitSignal ?? null,\n\t\t\t\t\tdurationMs,\n\t\t\t\t\taggregated,\n\t\t\t\t\ttimedOut: false,\n\t\t\t\t});\n\t\t\t};\n\n\t\t\tif (pty) {\n\t\t\t\tpty.onExit((event) => {\n\t\t\t\t\tconst rawSignal = event.signal ?? null;\n\t\t\t\t\tconst normalizedSignal = rawSignal === 0 ? null : rawSignal;\n\t\t\t\t\thandleExit(event.exitCode ?? null, normalizedSignal);\n\t\t\t\t});\n\t\t\t} else if (child) {\n\t\t\t\tchild.once(\"close\", (code, exitSignal) => {\n\t\t\t\t\thandleExit(code, exitSignal);\n\t\t\t\t});\n\n\t\t\t\tchild.once(\"error\", (err) => {\n\t\t\t\t\tif (timeoutTimer) {\n\t\t\t\t\t\tclearTimeout(timeoutTimer);\n\t\t\t\t\t}\n\t\t\t\t\tif (timeoutFinalizeTimer) {\n\t\t\t\t\t\tclearTimeout(timeoutFinalizeTimer);\n\t\t\t\t\t}\n\t\t\t\t\tmarkExited(session, null, null, \"failed\");\n\t\t\t\t\tconst aggregated = session.aggregated.trim();\n\t\t\t\t\tconst message = aggregated\n\t\t\t\t\t\t? `${aggregated}\\n\\n${String(err)}`\n\t\t\t\t\t\t: String(err);\n\t\t\t\t\tsettle({\n\t\t\t\t\t\tstatus: \"failed\",\n\t\t\t\t\t\texitCode: null,\n\t\t\t\t\t\texitSignal: null,\n\t\t\t\t\t\tdurationMs: Date.now() - startedAt,\n\t\t\t\t\t\taggregated,\n\t\t\t\t\t\ttimedOut,\n\t\t\t\t\t\treason: message,\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t\treturn {\n\t\t\tsession,\n\t\t\tstartedAt,\n\t\t\tpromise,\n\t\t\tkill: () => killSession(session),\n\t\t};\n\t}\n\n\tprivate addToHistory(\n\t\tconversationId: string | undefined,\n\t\tcommand: string,\n\t\tresult: CommandResult,\n\t\tfileOperations?: FileOperation[],\n\t): void {\n\t\tif (!conversationId) return;\n\n\t\tconst historyEntry: CommandHistoryEntry = {\n\t\t\tcommand,\n\t\t\tstdout: result.stdout,\n\t\t\tstderr: result.stderr,\n\t\t\texitCode: result.exitCode,\n\t\t\ttimestamp: Date.now(),\n\t\t\tworkingDirectory: result.executedIn,\n\t\t\tfileOperations,\n\t\t};\n\n\t\tif (!this.commandHistory.has(conversationId)) {\n\t\t\tthis.commandHistory.set(conversationId, []);\n\t\t}\n\n\t\tconst history = this.commandHistory.get(conversationId);\n\t\tif (!history) {\n\t\t\tthrow new Error(`No history found for conversation ${conversationId}`);\n\t\t}\n\t\thistory.push(historyEntry);\n\n\t\tif (history.length > this.maxHistoryPerConversation) {\n\t\t\thistory.shift();\n\t\t}\n\t}\n\n\tprivate detectFileOperations(\n\t\tcommand: string,\n\t\tcwd: string,\n\t): FileOperation[] | undefined {\n\t\tconst operations: FileOperation[] = [];\n\t\tconst parts = command.trim().split(/\\s+/);\n\t\tconst cmd = parts[0].toLowerCase();\n\n\t\tif (cmd === \"touch\" && parts.length > 1) {\n\t\t\toperations.push({\n\t\t\t\ttype: \"create\" as FileOperationType,\n\t\t\t\ttarget: this.resolvePath(parts[1], cwd),\n\t\t\t});\n\t\t} else if (cmd === \"echo\" && command.includes(\">\")) {\n\t\t\tconst match = command.match(/>\\s*([^\\s]+)$/);\n\t\t\tif (match) {\n\t\t\t\toperations.push({\n\t\t\t\t\ttype: \"write\" as FileOperationType,\n\t\t\t\t\ttarget: this.resolvePath(match[1], cwd),\n\t\t\t\t});\n\t\t\t}\n\t\t} else if (cmd === \"mkdir\" && parts.length > 1) {\n\t\t\toperations.push({\n\t\t\t\ttype: \"mkdir\" as FileOperationType,\n\t\t\t\ttarget: this.resolvePath(parts[1], cwd),\n\t\t\t});\n\t\t} else if (cmd === \"cat\" && parts.length > 1 && !command.includes(\">\")) {\n\t\t\toperations.push({\n\t\t\t\ttype: \"read\" as FileOperationType,\n\t\t\t\ttarget: this.resolvePath(parts[1], cwd),\n\t\t\t});\n\t\t} else if (cmd === \"mv\" && parts.length > 2) {\n\t\t\toperations.push({\n\t\t\t\ttype: \"move\" as FileOperationType,\n\t\t\t\ttarget: this.resolvePath(parts[1], cwd),\n\t\t\t\tsecondaryTarget: this.resolvePath(parts[2], cwd),\n\t\t\t});\n\t\t} else if (cmd === \"cp\" && parts.length > 2) {\n\t\t\toperations.push({\n\t\t\t\ttype: \"copy\" as FileOperationType,\n\t\t\t\ttarget: this.resolvePath(parts[1], cwd),\n\t\t\t\tsecondaryTarget: this.resolvePath(parts[2], cwd),\n\t\t\t});\n\t\t}\n\n\t\treturn operations.length > 0 ? operations : undefined;\n\t}\n\n\tprivate resolvePath(filePath: string, cwd: string): string {\n\t\tif (path.isAbsolute(filePath)) {\n\t\t\treturn filePath;\n\t\t}\n\t\treturn path.join(cwd, filePath);\n\t}\n}\n",
|
|
25
|
-
"import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { logger } from \"@elizaos/core\";\nimport { z } from \"zod\";\nimport type { ShellConfig } from \"../types\";\n\nconst configSchema = z.object({\n\tenabled: z.boolean(),\n\tallowedDirectory: z.string(),\n\ttimeout: z.number().positive().default(30000),\n\tforbiddenCommands: z.array(z.string()),\n\tmaxOutputChars: z.number().positive().default(200000),\n\tpendingMaxOutputChars: z.number().positive().default(200000),\n\tdefaultBackgroundMs: z.number().positive().default(10000),\n\tallowBackground: z.boolean().default(true),\n});\n\nexport const DEFAULT_FORBIDDEN_COMMANDS: readonly string[] = [\n\t\"rm -rf /\",\n\t\"rmdir\",\n\t\"chmod 777\",\n\t\"chown\",\n\t\"chgrp\",\n\t\"shutdown\",\n\t\"reboot\",\n\t\"halt\",\n\t\"poweroff\",\n\t\"kill -9\",\n\t\"killall\",\n\t\"pkill\",\n\t\"sudo rm -rf\",\n\t\"su\",\n\t\"passwd\",\n\t\"useradd\",\n\t\"userdel\",\n\t\"groupadd\",\n\t\"groupdel\",\n\t\"format\",\n\t\"fdisk\",\n\t\"mkfs\",\n\t\"dd if=/dev/zero\",\n\t\"shred\",\n\t\":(){:|:&};:\",\n] as const;\n\nexport function loadShellConfig(): ShellConfig {\n\tconst allowedDirectory = process.env.SHELL_ALLOWED_DIRECTORY || process.cwd();\n\tconst timeout = parseInt(process.env.SHELL_TIMEOUT || \"30000\", 10);\n\tconst maxOutputChars = parseInt(\n\t\tprocess.env.SHELL_MAX_OUTPUT_CHARS || \"200000\",\n\t\t10,\n\t);\n\tconst pendingMaxOutputChars = parseInt(\n\t\tprocess.env.SHELL_PENDING_MAX_OUTPUT_CHARS || \"200000\",\n\t\t10,\n\t);\n\tconst defaultBackgroundMs = parseInt(\n\t\tprocess.env.SHELL_BACKGROUND_MS || \"10000\",\n\t\t10,\n\t);\n\tconst allowBackground = process.env.SHELL_ALLOW_BACKGROUND !== \"false\";\n\n\tconst customForbidden = process.env.SHELL_FORBIDDEN_COMMANDS\n\t\t? process.env.SHELL_FORBIDDEN_COMMANDS.split(\",\").map((cmd) => cmd.trim())\n\t\t: [];\n\n\tconst forbiddenCommands = [\n\t\t...new Set([...DEFAULT_FORBIDDEN_COMMANDS, ...customForbidden]),\n\t];\n\n\tconst config: ShellConfig = {\n\t\tenabled: true,\n\t\tallowedDirectory,\n\t\ttimeout,\n\t\tforbiddenCommands,\n\t\tmaxOutputChars,\n\t\tpendingMaxOutputChars,\n\t\tdefaultBackgroundMs,\n\t\tallowBackground,\n\t};\n\n\tconst parseResult = configSchema.safeParse(config);\n\tif (!parseResult.success) {\n\t\tconst errorMessage =\n\t\t\tparseResult.error.issues?.[0]?.message || parseResult.error.toString();\n\t\tthrow new Error(`Shell plugin configuration error: ${errorMessage}`);\n\t}\n\n\ttry {\n\t\tconst stats = fs.statSync(allowedDirectory);\n\t\tif (!stats.isDirectory()) {\n\t\t\tthrow new Error(\n\t\t\t\t`SHELL_ALLOWED_DIRECTORY is not a directory: ${allowedDirectory}`,\n\t\t\t);\n\t\t}\n\t\tconfig.allowedDirectory = path.resolve(allowedDirectory);\n\t\tlogger.info(\n\t\t\t`Shell plugin enabled with allowed directory: ${config.allowedDirectory}, ` +\n\t\t\t\t`background: ${allowBackground}, timeout: ${timeout}ms`,\n\t\t);\n\t} catch (error) {\n\t\tif (\n\t\t\terror instanceof Error &&\n\t\t\t\"code\" in error &&\n\t\t\t(error as NodeJS.ErrnoException).code === \"ENOENT\"\n\t\t) {\n\t\t\tthrow new Error(\n\t\t\t\t`SHELL_ALLOWED_DIRECTORY does not exist: ${allowedDirectory}`,\n\t\t\t);\n\t\t}\n\t\tthrow error;\n\t}\n\n\treturn config;\n}\n",
|
|
26
|
-
"import path from \"node:path\";\nimport { logger } from \"@elizaos/core\";\n\nexport function validatePath(\n\tcommandPath: string,\n\tallowedDir: string,\n\tcurrentDir: string,\n): string | null {\n\tconst resolvedPath = path.resolve(currentDir, commandPath);\n\tconst normalizedPath = path.normalize(resolvedPath);\n\tconst normalizedAllowed = path.normalize(allowedDir);\n\n\tif (!normalizedPath.startsWith(normalizedAllowed)) {\n\t\tlogger.warn(\n\t\t\t`Path validation failed: ${normalizedPath} is outside allowed directory ${normalizedAllowed}`,\n\t\t);\n\t\treturn null;\n\t}\n\n\treturn normalizedPath;\n}\n\nexport function isSafeCommand(command: string): boolean {\n\tconst pathTraversalPatterns = [/\\.\\.\\//g, /\\.\\.\\\\/g, /\\/\\.\\./g, /\\\\\\.\\./g];\n\n\tconst dangerousPatterns = [\n\t\t/\\$\\(/g,\n\t\t/`[^']*`/g,\n\t\t/\\|\\s*sudo/g,\n\t\t/;\\s*sudo/g,\n\t\t/&\\s*&/g,\n\t\t/\\|\\s*\\|/g,\n\t];\n\n\tfor (const pattern of pathTraversalPatterns) {\n\t\tif (pattern.test(command)) {\n\t\t\tlogger.warn(`Path traversal detected in command: ${command}`);\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tfor (const pattern of dangerousPatterns) {\n\t\tif (pattern.test(command)) {\n\t\t\tlogger.warn(`Dangerous pattern detected in command: ${command}`);\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tconst pipeCount = (command.match(/\\|/g) || []).length;\n\tif (pipeCount > 1) {\n\t\tlogger.warn(`Multiple pipes detected in command: ${command}`);\n\t\treturn false;\n\t}\n\n\treturn true;\n}\n\nexport function extractBaseCommand(fullCommand: string): string {\n\tconst parts = fullCommand.trim().split(/\\s+/);\n\treturn parts[0] || \"\";\n}\n\nexport function isForbiddenCommand(\n\tcommand: string,\n\tforbiddenCommands: string[],\n): boolean {\n\tconst normalizedCommand = command.trim().toLowerCase();\n\n\treturn forbiddenCommands.some((forbidden) => {\n\t\tconst forbiddenLower = forbidden.toLowerCase();\n\n\t\tif (normalizedCommand.startsWith(forbiddenLower)) {\n\t\t\treturn true;\n\t\t}\n\n\t\tif (!forbidden.includes(\" \")) {\n\t\t\tconst baseCommand = extractBaseCommand(command);\n\t\t\tif (baseCommand.toLowerCase() === forbiddenLower) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t});\n}\n",
|
|
27
|
-
"/**\n * PTY Key Encoding - Terminal key sequence encoding utilities\n * Ported from otto pty-keys.ts and pty-dsr.ts\n */\n\nconst ESC = \"\\x1b\";\nconst CR = \"\\r\";\nconst TAB = \"\\t\";\nconst BACKSPACE = \"\\x7f\";\n\nexport const BRACKETED_PASTE_START = `${ESC}[200~`;\nexport const BRACKETED_PASTE_END = `${ESC}[201~`;\n\ntype Modifiers = {\n\tctrl: boolean;\n\talt: boolean;\n\tshift: boolean;\n};\n\nfunction escapeRegExp(value: string): string {\n\treturn value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nconst namedKeyMap = new Map<string, string>([\n\t[\"enter\", CR],\n\t[\"return\", CR],\n\t[\"tab\", TAB],\n\t[\"escape\", ESC],\n\t[\"esc\", ESC],\n\t[\"space\", \" \"],\n\t[\"bspace\", BACKSPACE],\n\t[\"backspace\", BACKSPACE],\n\t[\"up\", `${ESC}[A`],\n\t[\"down\", `${ESC}[B`],\n\t[\"right\", `${ESC}[C`],\n\t[\"left\", `${ESC}[D`],\n\t[\"home\", `${ESC}[1~`],\n\t[\"end\", `${ESC}[4~`],\n\t[\"pageup\", `${ESC}[5~`],\n\t[\"pgup\", `${ESC}[5~`],\n\t[\"ppage\", `${ESC}[5~`],\n\t[\"pagedown\", `${ESC}[6~`],\n\t[\"pgdn\", `${ESC}[6~`],\n\t[\"npage\", `${ESC}[6~`],\n\t[\"insert\", `${ESC}[2~`],\n\t[\"ic\", `${ESC}[2~`],\n\t[\"delete\", `${ESC}[3~`],\n\t[\"del\", `${ESC}[3~`],\n\t[\"dc\", `${ESC}[3~`],\n\t[\"btab\", `${ESC}[Z`],\n\t[\"f1\", `${ESC}OP`],\n\t[\"f2\", `${ESC}OQ`],\n\t[\"f3\", `${ESC}OR`],\n\t[\"f4\", `${ESC}OS`],\n\t[\"f5\", `${ESC}[15~`],\n\t[\"f6\", `${ESC}[17~`],\n\t[\"f7\", `${ESC}[18~`],\n\t[\"f8\", `${ESC}[19~`],\n\t[\"f9\", `${ESC}[20~`],\n\t[\"f10\", `${ESC}[21~`],\n\t[\"f11\", `${ESC}[23~`],\n\t[\"f12\", `${ESC}[24~`],\n\t[\"kp/\", `${ESC}Oo`],\n\t[\"kp*\", `${ESC}Oj`],\n\t[\"kp-\", `${ESC}Om`],\n\t[\"kp+\", `${ESC}Ok`],\n\t[\"kp7\", `${ESC}Ow`],\n\t[\"kp8\", `${ESC}Ox`],\n\t[\"kp9\", `${ESC}Oy`],\n\t[\"kp4\", `${ESC}Ot`],\n\t[\"kp5\", `${ESC}Ou`],\n\t[\"kp6\", `${ESC}Ov`],\n\t[\"kp1\", `${ESC}Oq`],\n\t[\"kp2\", `${ESC}Or`],\n\t[\"kp3\", `${ESC}Os`],\n\t[\"kp0\", `${ESC}Op`],\n\t[\"kp.\", `${ESC}On`],\n\t[\"kpenter\", `${ESC}OM`],\n]);\n\nconst modifiableNamedKeys = new Set([\n\t\"up\",\n\t\"down\",\n\t\"left\",\n\t\"right\",\n\t\"home\",\n\t\"end\",\n\t\"pageup\",\n\t\"pgup\",\n\t\"ppage\",\n\t\"pagedown\",\n\t\"pgdn\",\n\t\"npage\",\n\t\"insert\",\n\t\"ic\",\n\t\"delete\",\n\t\"del\",\n\t\"dc\",\n]);\n\nexport type KeyEncodingRequest = {\n\tkeys?: string[];\n\thex?: string[];\n\tliteral?: string;\n};\n\nexport type KeyEncodingResult = {\n\tdata: string;\n\twarnings: string[];\n};\n\nexport function encodeKeySequence(\n\trequest: KeyEncodingRequest,\n): KeyEncodingResult {\n\tconst warnings: string[] = [];\n\tlet data = \"\";\n\n\tif (request.literal) {\n\t\tdata += request.literal;\n\t}\n\n\tif (request.hex?.length) {\n\t\tfor (const raw of request.hex) {\n\t\t\tconst byte = parseHexByte(raw);\n\t\t\tif (byte === null) {\n\t\t\t\twarnings.push(`Invalid hex byte: ${raw}`);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tdata += String.fromCharCode(byte);\n\t\t}\n\t}\n\n\tif (request.keys?.length) {\n\t\tfor (const token of request.keys) {\n\t\t\tdata += encodeKeyToken(token, warnings);\n\t\t}\n\t}\n\n\treturn { data, warnings };\n}\n\nexport function encodePaste(text: string, bracketed = true): string {\n\tif (!bracketed) {\n\t\treturn text;\n\t}\n\treturn `${BRACKETED_PASTE_START}${text}${BRACKETED_PASTE_END}`;\n}\n\nfunction encodeKeyToken(raw: string, warnings: string[]): string {\n\tconst token = raw.trim();\n\tif (!token) {\n\t\treturn \"\";\n\t}\n\n\tif (token.length === 2 && token.startsWith(\"^\")) {\n\t\tconst ctrl = toCtrlChar(token[1]);\n\t\tif (ctrl) {\n\t\t\treturn ctrl;\n\t\t}\n\t}\n\n\tconst parsed = parseModifiers(token);\n\tconst base = parsed.base;\n\tconst baseLower = base.toLowerCase();\n\n\tif (baseLower === \"tab\" && parsed.mods.shift) {\n\t\treturn `${ESC}[Z`;\n\t}\n\n\tconst baseSeq = namedKeyMap.get(baseLower);\n\tif (baseSeq) {\n\t\tlet seq = baseSeq;\n\t\tif (modifiableNamedKeys.has(baseLower) && hasAnyModifier(parsed.mods)) {\n\t\t\tconst mod = xtermModifier(parsed.mods);\n\t\t\tif (mod > 1) {\n\t\t\t\tconst modified = applyXtermModifier(seq, mod);\n\t\t\t\tif (modified) {\n\t\t\t\t\tseq = modified;\n\t\t\t\t\treturn seq;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (parsed.mods.alt) {\n\t\t\treturn `${ESC}${seq}`;\n\t\t}\n\t\treturn seq;\n\t}\n\n\tif (base.length === 1) {\n\t\treturn applyCharModifiers(base, parsed.mods);\n\t}\n\n\tif (parsed.hasModifiers) {\n\t\twarnings.push(`Unknown key \"${base}\" for modifiers; sending literal.`);\n\t}\n\treturn base;\n}\n\nfunction parseModifiers(token: string): {\n\tmods: Modifiers;\n\tbase: string;\n\thasModifiers: boolean;\n} {\n\tconst mods: Modifiers = { ctrl: false, alt: false, shift: false };\n\tlet rest = token;\n\tlet sawModifiers = false;\n\n\twhile (rest.length > 2 && rest[1] === \"-\") {\n\t\tconst mod = rest[0].toLowerCase();\n\t\tif (mod === \"c\") {\n\t\t\tmods.ctrl = true;\n\t\t} else if (mod === \"m\") {\n\t\t\tmods.alt = true;\n\t\t} else if (mod === \"s\") {\n\t\t\tmods.shift = true;\n\t\t} else {\n\t\t\tbreak;\n\t\t}\n\t\tsawModifiers = true;\n\t\trest = rest.slice(2);\n\t}\n\n\treturn { mods, base: rest, hasModifiers: sawModifiers };\n}\n\nfunction applyCharModifiers(char: string, mods: Modifiers): string {\n\tlet value = char;\n\tif (mods.shift && value.length === 1 && /[a-z]/.test(value)) {\n\t\tvalue = value.toUpperCase();\n\t}\n\tif (mods.ctrl) {\n\t\tconst ctrl = toCtrlChar(value);\n\t\tif (ctrl) {\n\t\t\tvalue = ctrl;\n\t\t}\n\t}\n\tif (mods.alt) {\n\t\tvalue = `${ESC}${value}`;\n\t}\n\treturn value;\n}\n\nfunction toCtrlChar(char: string): string | null {\n\tif (char.length !== 1) {\n\t\treturn null;\n\t}\n\tif (char === \"?\") {\n\t\treturn \"\\x7f\";\n\t}\n\tconst code = char.toUpperCase().charCodeAt(0);\n\tif (code >= 64 && code <= 95) {\n\t\treturn String.fromCharCode(code & 0x1f);\n\t}\n\treturn null;\n}\n\nfunction xtermModifier(mods: Modifiers): number {\n\tlet mod = 1;\n\tif (mods.shift) {\n\t\tmod += 1;\n\t}\n\tif (mods.alt) {\n\t\tmod += 2;\n\t}\n\tif (mods.ctrl) {\n\t\tmod += 4;\n\t}\n\treturn mod;\n}\n\nfunction applyXtermModifier(sequence: string, modifier: number): string | null {\n\tconst escPattern = escapeRegExp(ESC);\n\tconst csiNumber = new RegExp(`^${escPattern}\\\\[(\\\\d+)([~A-Z])$`);\n\tconst csiArrow = new RegExp(`^${escPattern}\\\\[(A|B|C|D|H|F)$`);\n\n\tconst numberMatch = sequence.match(csiNumber);\n\tif (numberMatch) {\n\t\treturn `${ESC}[${numberMatch[1]};${modifier}${numberMatch[2]}`;\n\t}\n\n\tconst arrowMatch = sequence.match(csiArrow);\n\tif (arrowMatch) {\n\t\treturn `${ESC}[1;${modifier}${arrowMatch[1]}`;\n\t}\n\n\treturn null;\n}\n\nfunction hasAnyModifier(mods: Modifiers): boolean {\n\treturn mods.ctrl || mods.alt || mods.shift;\n}\n\nfunction parseHexByte(raw: string): number | null {\n\tconst trimmed = raw.trim().toLowerCase();\n\tconst normalized = trimmed.startsWith(\"0x\") ? trimmed.slice(2) : trimmed;\n\tif (!/^[0-9a-f]{1,2}$/.test(normalized)) {\n\t\treturn null;\n\t}\n\tconst value = Number.parseInt(normalized, 16);\n\tif (Number.isNaN(value) || value < 0 || value > 0xff) {\n\t\treturn null;\n\t}\n\treturn value;\n}\n\n// DSR (Device Status Report) handling\nconst DSR_PATTERN = new RegExp(`${ESC}\\\\[\\\\??6n`, \"g\");\n\nexport function stripDsrRequests(input: string): {\n\tcleaned: string;\n\trequests: number;\n} {\n\tlet requests = 0;\n\tconst cleaned = input.replace(DSR_PATTERN, () => {\n\t\trequests += 1;\n\t\treturn \"\";\n\t});\n\treturn { cleaned, requests };\n}\n\nexport function buildCursorPositionResponse(row = 1, col = 1): string {\n\treturn `\\x1b[${row};${col}R`;\n}\n",
|
|
28
|
-
"/**\n * Shell Utilities - Platform-specific shell configuration and helpers\n * Ported from otto shell-utils.ts and bash-tools.shared.ts\n */\n\nimport type {\n\tChildProcess,\n\tChildProcessWithoutNullStreams,\n\tSpawnOptions,\n} from \"node:child_process\";\nimport { spawn } from \"node:child_process\";\nimport fs, { existsSync, statSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport path from \"node:path\";\n\nconst CHUNK_LIMIT = 8 * 1024;\n\n/**\n * Resolve PowerShell path on Windows\n */\nfunction resolvePowerShellPath(): string {\n\tconst systemRoot = process.env.SystemRoot || process.env.WINDIR;\n\tif (systemRoot) {\n\t\tconst candidate = path.join(\n\t\t\tsystemRoot,\n\t\t\t\"System32\",\n\t\t\t\"WindowsPowerShell\",\n\t\t\t\"v1.0\",\n\t\t\t\"powershell.exe\",\n\t\t);\n\t\tif (fs.existsSync(candidate)) {\n\t\t\treturn candidate;\n\t\t}\n\t}\n\treturn \"powershell.exe\";\n}\n\n/**\n * Resolve shell from PATH\n */\nfunction resolveShellFromPath(name: string): string | undefined {\n\tconst envPath = process.env.PATH ?? \"\";\n\tif (!envPath) {\n\t\treturn undefined;\n\t}\n\tconst entries = envPath.split(path.delimiter).filter(Boolean);\n\tfor (const entry of entries) {\n\t\tconst candidate = path.join(entry, name);\n\t\ttry {\n\t\t\tfs.accessSync(candidate, fs.constants.X_OK);\n\t\t\treturn candidate;\n\t\t} catch {\n\t\t\t// ignore missing or non-executable entries\n\t\t}\n\t}\n\treturn undefined;\n}\n\n/**\n * Get shell configuration for the current platform\n */\nexport function getShellConfig(): { shell: string; args: string[] } {\n\tif (process.platform === \"win32\") {\n\t\t// Use PowerShell instead of cmd.exe on Windows.\n\t\t// Many Windows system utilities write directly to the console via WriteConsole API,\n\t\t// bypassing stdout pipes. PowerShell properly captures and redirects their output.\n\t\treturn {\n\t\t\tshell: resolvePowerShellPath(),\n\t\t\targs: [\"-NoProfile\", \"-NonInteractive\", \"-Command\"],\n\t\t};\n\t}\n\n\tconst envShell = process.env.SHELL?.trim();\n\tconst shellName = envShell ? path.basename(envShell) : \"\";\n\t// Fish rejects common bashisms used by tools, so prefer bash when detected.\n\tif (shellName === \"fish\") {\n\t\tconst bash = resolveShellFromPath(\"bash\");\n\t\tif (bash) {\n\t\t\treturn { shell: bash, args: [\"-c\"] };\n\t\t}\n\t\tconst sh = resolveShellFromPath(\"sh\");\n\t\tif (sh) {\n\t\t\treturn { shell: sh, args: [\"-c\"] };\n\t\t}\n\t}\n\tconst shell = envShell && envShell.length > 0 ? envShell : \"sh\";\n\treturn { shell, args: [\"-c\"] };\n}\n\n/**\n * Sanitize binary output by removing control characters\n */\nexport function sanitizeBinaryOutput(text: string): string {\n\tconst scrubbed = text.replace(/[\\p{Format}\\p{Surrogate}]/gu, \"\");\n\tif (!scrubbed) {\n\t\treturn scrubbed;\n\t}\n\tconst chunks: string[] = [];\n\tfor (const char of scrubbed) {\n\t\tconst code = char.codePointAt(0);\n\t\tif (code == null) {\n\t\t\tcontinue;\n\t\t}\n\t\tif (code === 0x09 || code === 0x0a || code === 0x0d) {\n\t\t\tchunks.push(char);\n\t\t\tcontinue;\n\t\t}\n\t\tif (code < 0x20) {\n\t\t\tcontinue;\n\t\t}\n\t\tchunks.push(char);\n\t}\n\treturn chunks.join(\"\");\n}\n\n/**\n * Kill a process tree (cross-platform)\n */\nexport function killProcessTree(pid: number): void {\n\tif (process.platform === \"win32\") {\n\t\ttry {\n\t\t\tspawn(\"taskkill\", [\"/F\", \"/T\", \"/PID\", String(pid)], {\n\t\t\t\tstdio: \"ignore\",\n\t\t\t\tdetached: true,\n\t\t\t});\n\t\t} catch {\n\t\t\t// ignore errors if taskkill fails\n\t\t}\n\t\treturn;\n\t}\n\n\ttry {\n\t\tprocess.kill(-pid, \"SIGKILL\");\n\t} catch {\n\t\ttry {\n\t\t\tprocess.kill(pid, \"SIGKILL\");\n\t\t} catch {\n\t\t\t// process already dead\n\t\t}\n\t}\n}\n\n/**\n * Kill a session's process\n */\nexport function killSession(session: {\n\tpid?: number;\n\tchild?: ChildProcessWithoutNullStreams;\n}): void {\n\tconst pid = session.pid ?? session.child?.pid;\n\tif (pid) {\n\t\tkillProcessTree(pid);\n\t}\n}\n\n/**\n * Coerce environment object to Record<string, string>\n */\nexport function coerceEnv(\n\tenv?: NodeJS.ProcessEnv | Record<string, string>,\n): Record<string, string> {\n\tconst record: Record<string, string> = {};\n\tif (!env) {\n\t\treturn record;\n\t}\n\tfor (const [key, value] of Object.entries(env)) {\n\t\tif (typeof value === \"string\") {\n\t\t\trecord[key] = value;\n\t\t}\n\t}\n\treturn record;\n}\n\n/**\n * Resolve working directory with fallback\n */\nexport function resolveWorkdir(workdir: string, warnings: string[]): string {\n\tconst current = safeCwd();\n\tconst fallback = current ?? homedir();\n\ttry {\n\t\tconst stats = statSync(workdir);\n\t\tif (stats.isDirectory()) {\n\t\t\treturn workdir;\n\t\t}\n\t} catch {\n\t\t// ignore, fallback below\n\t}\n\twarnings.push(\n\t\t`Warning: workdir \"${workdir}\" is unavailable; using \"${fallback}\".`,\n\t);\n\treturn fallback;\n}\n\nfunction safeCwd(): string | null {\n\ttry {\n\t\tconst cwd = process.cwd();\n\t\treturn existsSync(cwd) ? cwd : null;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\n/**\n * Clamp a number to a range with a default value\n */\nexport function clampNumber(\n\tvalue: number | undefined,\n\tdefaultValue: number,\n\tmin: number,\n\tmax: number,\n): number {\n\tif (value === undefined || Number.isNaN(value)) {\n\t\treturn defaultValue;\n\t}\n\treturn Math.min(Math.max(value, min), max);\n}\n\n/**\n * Read an environment variable as an integer\n */\nexport function readEnvInt(key: string): number | undefined {\n\tconst raw = process.env[key];\n\tif (!raw) {\n\t\treturn undefined;\n\t}\n\tconst parsed = Number.parseInt(raw, 10);\n\treturn Number.isFinite(parsed) ? parsed : undefined;\n}\n\n/**\n * Chunk a string into smaller pieces\n */\nexport function chunkString(input: string, limit = CHUNK_LIMIT): string[] {\n\tconst chunks: string[] = [];\n\tfor (let i = 0; i < input.length; i += limit) {\n\t\tchunks.push(input.slice(i, i + limit));\n\t}\n\treturn chunks;\n}\n\n/**\n * Safely slice a string respecting UTF-16 surrogate pairs\n */\nexport function sliceUtf16Safe(\n\tstr: string,\n\tstart: number,\n\tend?: number,\n): string {\n\tconst effectiveEnd = end ?? str.length;\n\tif (start < 0) {\n\t\tconst adjustedStart = Math.max(0, str.length + start);\n\t\treturn str.slice(adjustedStart, effectiveEnd);\n\t}\n\treturn str.slice(start, effectiveEnd);\n}\n\n/**\n * Truncate string in the middle with ellipsis\n */\nexport function truncateMiddle(str: string, max: number): string {\n\tif (str.length <= max) {\n\t\treturn str;\n\t}\n\tconst half = Math.floor((max - 3) / 2);\n\treturn `${sliceUtf16Safe(str, 0, half)}...${sliceUtf16Safe(str, -half)}`;\n}\n\n/**\n * Slice log lines with optional offset and limit\n */\nexport function sliceLogLines(\n\ttext: string,\n\toffset?: number,\n\tlimit?: number,\n): { slice: string; totalLines: number; totalChars: number } {\n\tif (!text) {\n\t\treturn { slice: \"\", totalLines: 0, totalChars: 0 };\n\t}\n\tconst normalized = text.replace(/\\r\\n/g, \"\\n\");\n\tconst lines = normalized.split(\"\\n\");\n\tif (lines.length > 0 && lines[lines.length - 1] === \"\") {\n\t\tlines.pop();\n\t}\n\tconst totalLines = lines.length;\n\tconst totalChars = text.length;\n\tlet start =\n\t\ttypeof offset === \"number\" && Number.isFinite(offset)\n\t\t\t? Math.max(0, Math.floor(offset))\n\t\t\t: 0;\n\tif (limit !== undefined && offset === undefined) {\n\t\tconst tailCount = Math.max(0, Math.floor(limit));\n\t\tstart = Math.max(totalLines - tailCount, 0);\n\t}\n\tconst end =\n\t\ttypeof limit === \"number\" && Number.isFinite(limit)\n\t\t\t? start + Math.max(0, Math.floor(limit))\n\t\t\t: undefined;\n\treturn { slice: lines.slice(start, end).join(\"\\n\"), totalLines, totalChars };\n}\n\n/**\n * Derive a session name from a command\n */\nexport function deriveSessionName(command: string): string | undefined {\n\tconst tokens = tokenizeCommand(command);\n\tif (tokens.length === 0) {\n\t\treturn undefined;\n\t}\n\tconst verb = tokens[0];\n\tlet target = tokens.slice(1).find((t) => !t.startsWith(\"-\"));\n\tif (!target) {\n\t\ttarget = tokens[1];\n\t}\n\tif (!target) {\n\t\treturn verb;\n\t}\n\tconst cleaned = truncateMiddle(stripQuotes(target), 48);\n\treturn `${stripQuotes(verb)} ${cleaned}`;\n}\n\nfunction tokenizeCommand(command: string): string[] {\n\tconst matches =\n\t\tcommand.match(/(?:[^\\s\"']+|\"(?:\\\\.|[^\"])*\"|'(?:\\\\.|[^'])*')+/g) ?? [];\n\treturn matches.map((token) => stripQuotes(token)).filter(Boolean);\n}\n\nfunction stripQuotes(value: string): string {\n\tconst trimmed = value.trim();\n\tif (\n\t\t(trimmed.startsWith('\"') && trimmed.endsWith('\"')) ||\n\t\t(trimmed.startsWith(\"'\") && trimmed.endsWith(\"'\"))\n\t) {\n\t\treturn trimmed.slice(1, -1);\n\t}\n\treturn trimmed;\n}\n\n/**\n * Format duration in human-readable format\n */\nexport function formatDuration(ms: number): string {\n\tif (ms < 1000) {\n\t\treturn `${ms}ms`;\n\t}\n\tconst seconds = Math.floor(ms / 1000);\n\tif (seconds < 60) {\n\t\treturn `${seconds}s`;\n\t}\n\tconst minutes = Math.floor(seconds / 60);\n\tconst rem = seconds % 60;\n\treturn `${minutes}m${rem.toString().padStart(2, \"0\")}s`;\n}\n\n/**\n * Pad a string to a minimum width\n */\nexport function pad(str: string, width: number): string {\n\tif (str.length >= width) {\n\t\treturn str;\n\t}\n\treturn str + \" \".repeat(width - str.length);\n}\n\n// ===== Spawn Utilities =====\n\nexport type SpawnFallback = {\n\tlabel: string;\n\toptions: SpawnOptions;\n};\n\nexport type SpawnWithFallbackResult = {\n\tchild: ChildProcess;\n\tusedFallback: boolean;\n\tfallbackLabel?: string;\n};\n\ntype SpawnWithFallbackParams = {\n\targv: string[];\n\toptions: SpawnOptions;\n\tfallbacks?: SpawnFallback[];\n\tspawnImpl?: typeof spawn;\n\tretryCodes?: string[];\n\tonFallback?: (err: unknown, fallback: SpawnFallback) => void;\n};\n\nconst DEFAULT_RETRY_CODES = [\"EBADF\"];\n\n/**\n * Format a spawn error for display\n */\nexport function formatSpawnError(err: unknown): string {\n\tif (!(err instanceof Error)) {\n\t\treturn String(err);\n\t}\n\tconst details = err as NodeJS.ErrnoException;\n\tconst parts: string[] = [];\n\tconst message = err.message?.trim();\n\tif (message) {\n\t\tparts.push(message);\n\t}\n\tif (details.code && !message?.includes(details.code)) {\n\t\tparts.push(details.code);\n\t}\n\tif (details.syscall) {\n\t\tparts.push(`syscall=${details.syscall}`);\n\t}\n\tif (typeof details.errno === \"number\") {\n\t\tparts.push(`errno=${details.errno}`);\n\t}\n\treturn parts.join(\" \");\n}\n\nfunction shouldRetry(err: unknown, codes: string[]): boolean {\n\tconst code =\n\t\terr && typeof err === \"object\" && \"code\" in err\n\t\t\t? String((err as { code?: unknown }).code)\n\t\t\t: \"\";\n\treturn code.length > 0 && codes.includes(code);\n}\n\nasync function spawnAndWaitForSpawn(\n\tspawnImpl: typeof spawn,\n\targv: string[],\n\toptions: SpawnOptions,\n): Promise<ChildProcess> {\n\tconst child = spawnImpl(argv[0], argv.slice(1), options);\n\n\treturn await new Promise((resolve, reject) => {\n\t\tlet settled = false;\n\t\tconst cleanup = () => {\n\t\t\tchild.removeListener(\"error\", onError);\n\t\t\tchild.removeListener(\"spawn\", onSpawn);\n\t\t};\n\t\tconst finishResolve = () => {\n\t\t\tif (settled) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tsettled = true;\n\t\t\tcleanup();\n\t\t\tresolve(child);\n\t\t};\n\t\tconst onError = (err: unknown) => {\n\t\t\tif (settled) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tsettled = true;\n\t\t\tcleanup();\n\t\t\treject(err);\n\t\t};\n\t\tconst onSpawn = () => {\n\t\t\tfinishResolve();\n\t\t};\n\t\tchild.once(\"error\", onError);\n\t\tchild.once(\"spawn\", onSpawn);\n\t\t// Ensure mocked spawns that never emit \"spawn\" don't stall.\n\t\tprocess.nextTick(() => {\n\t\t\tif (typeof child.pid === \"number\") {\n\t\t\t\tfinishResolve();\n\t\t\t}\n\t\t});\n\t});\n}\n\n/**\n * Spawn a process with fallback options on certain error codes\n */\nexport async function spawnWithFallback(\n\tparams: SpawnWithFallbackParams,\n): Promise<SpawnWithFallbackResult> {\n\tconst spawnImpl = params.spawnImpl ?? spawn;\n\tconst retryCodes = params.retryCodes ?? DEFAULT_RETRY_CODES;\n\tconst baseOptions = { ...params.options };\n\tconst fallbacks = params.fallbacks ?? [];\n\tconst attempts: Array<{ label?: string; options: SpawnOptions }> = [\n\t\t{ options: baseOptions },\n\t\t...fallbacks.map((fallback) => ({\n\t\t\tlabel: fallback.label,\n\t\t\toptions: { ...baseOptions, ...fallback.options },\n\t\t})),\n\t];\n\n\tlet lastError: unknown;\n\tfor (let index = 0; index < attempts.length; index += 1) {\n\t\tconst attempt = attempts[index];\n\t\ttry {\n\t\t\tconst child = await spawnAndWaitForSpawn(\n\t\t\t\tspawnImpl,\n\t\t\t\tparams.argv,\n\t\t\t\tattempt.options,\n\t\t\t);\n\t\t\treturn {\n\t\t\t\tchild,\n\t\t\t\tusedFallback: index > 0,\n\t\t\t\tfallbackLabel: attempt.label,\n\t\t\t};\n\t\t} catch (err) {\n\t\t\tlastError = err;\n\t\t\tconst nextFallback = fallbacks[index];\n\t\t\tif (!nextFallback || !shouldRetry(err, retryCodes)) {\n\t\t\t\tthrow err;\n\t\t\t}\n\t\t\tparams.onFallback?.(err, nextFallback);\n\t\t}\n\t}\n\n\tthrow lastError;\n}\n",
|
|
29
|
-
"/**\n * Process Registry - Manages running and finished shell sessions\n * Ported from otto bash-process-registry.ts\n */\n\nimport type { FinishedSession, ProcessSession, ProcessStatus } from \"../types\";\n\nconst DEFAULT_JOB_TTL_MS = 30 * 60 * 1000; // 30 minutes\nconst MIN_JOB_TTL_MS = 60 * 1000; // 1 minute\nconst MAX_JOB_TTL_MS = 3 * 60 * 60 * 1000; // 3 hours\nconst DEFAULT_PENDING_OUTPUT_CHARS = 30_000;\n\nfunction clampTtl(value: number | undefined): number {\n\tif (!value || Number.isNaN(value)) {\n\t\treturn DEFAULT_JOB_TTL_MS;\n\t}\n\treturn Math.min(Math.max(value, MIN_JOB_TTL_MS), MAX_JOB_TTL_MS);\n}\n\nlet jobTtlMs = clampTtl(\n\tNumber.parseInt(process.env.SHELL_JOB_TTL_MS ?? \"\", 10),\n);\n\nconst runningSessions = new Map<string, ProcessSession>();\nconst finishedSessions = new Map<string, FinishedSession>();\n\nlet sweeper: NodeJS.Timeout | null = null;\n\nfunction isSessionIdTaken(id: string): boolean {\n\treturn runningSessions.has(id) || finishedSessions.has(id);\n}\n\n// Session slug generation\nconst SLUG_ADJECTIVES = [\n\t\"amber\",\n\t\"briny\",\n\t\"brisk\",\n\t\"calm\",\n\t\"clear\",\n\t\"cool\",\n\t\"crisp\",\n\t\"dawn\",\n\t\"delta\",\n\t\"ember\",\n\t\"faint\",\n\t\"fast\",\n\t\"fresh\",\n\t\"gentle\",\n\t\"glow\",\n\t\"good\",\n\t\"grand\",\n\t\"keen\",\n\t\"kind\",\n\t\"lucky\",\n\t\"marine\",\n\t\"mellow\",\n\t\"mild\",\n\t\"neat\",\n\t\"nimble\",\n\t\"nova\",\n\t\"oceanic\",\n\t\"plaid\",\n\t\"quick\",\n\t\"quiet\",\n\t\"rapid\",\n\t\"salty\",\n\t\"sharp\",\n\t\"swift\",\n\t\"tender\",\n\t\"tidal\",\n\t\"tidy\",\n\t\"tide\",\n\t\"vivid\",\n\t\"warm\",\n\t\"wild\",\n\t\"young\",\n];\n\nconst SLUG_NOUNS = [\n\t\"atlas\",\n\t\"basil\",\n\t\"bison\",\n\t\"bloom\",\n\t\"breeze\",\n\t\"canyon\",\n\t\"cedar\",\n\t\"claw\",\n\t\"cloud\",\n\t\"comet\",\n\t\"coral\",\n\t\"cove\",\n\t\"crest\",\n\t\"daisy\",\n\t\"dune\",\n\t\"ember\",\n\t\"falcon\",\n\t\"fjord\",\n\t\"forest\",\n\t\"glade\",\n\t\"gulf\",\n\t\"harbor\",\n\t\"haven\",\n\t\"kelp\",\n\t\"lagoon\",\n\t\"meadow\",\n\t\"mist\",\n\t\"nexus\",\n\t\"ocean\",\n\t\"orbit\",\n\t\"otter\",\n\t\"pine\",\n\t\"prairie\",\n\t\"reef\",\n\t\"ridge\",\n\t\"river\",\n\t\"rook\",\n\t\"sable\",\n\t\"sage\",\n\t\"shell\",\n\t\"shoal\",\n\t\"shore\",\n\t\"slug\",\n\t\"summit\",\n\t\"trail\",\n\t\"valley\",\n\t\"wharf\",\n\t\"willow\",\n\t\"zephyr\",\n];\n\nfunction randomChoice(values: string[], fallback: string): string {\n\treturn values[Math.floor(Math.random() * values.length)] ?? fallback;\n}\n\nfunction createSlugBase(words = 2): string {\n\tconst parts = [\n\t\trandomChoice(SLUG_ADJECTIVES, \"steady\"),\n\t\trandomChoice(SLUG_NOUNS, \"harbor\"),\n\t];\n\tif (words > 2) {\n\t\tparts.push(randomChoice(SLUG_NOUNS, \"reef\"));\n\t}\n\treturn parts.join(\"-\");\n}\n\nexport function createSessionSlug(isTaken?: (id: string) => boolean): string {\n\tconst isIdTaken = isTaken ?? isSessionIdTaken;\n\tfor (let attempt = 0; attempt < 12; attempt += 1) {\n\t\tconst base = createSlugBase(2);\n\t\tif (!isIdTaken(base)) {\n\t\t\treturn base;\n\t\t}\n\t\tfor (let i = 2; i <= 12; i += 1) {\n\t\t\tconst candidate = `${base}-${i}`;\n\t\t\tif (!isIdTaken(candidate)) {\n\t\t\t\treturn candidate;\n\t\t\t}\n\t\t}\n\t}\n\tfor (let attempt = 0; attempt < 12; attempt += 1) {\n\t\tconst base = createSlugBase(3);\n\t\tif (!isIdTaken(base)) {\n\t\t\treturn base;\n\t\t}\n\t\tfor (let i = 2; i <= 12; i += 1) {\n\t\t\tconst candidate = `${base}-${i}`;\n\t\t\tif (!isIdTaken(candidate)) {\n\t\t\t\treturn candidate;\n\t\t\t}\n\t\t}\n\t}\n\tconst fallback = `${createSlugBase(3)}-${Math.random().toString(36).slice(2, 5)}`;\n\treturn isIdTaken(fallback)\n\t\t? `${fallback}-${Date.now().toString(36)}`\n\t\t: fallback;\n}\n\nexport function addSession(session: ProcessSession): void {\n\trunningSessions.set(session.id, session);\n\tstartSweeper();\n}\n\nexport function getSession(id: string): ProcessSession | undefined {\n\treturn runningSessions.get(id);\n}\n\nexport function getFinishedSession(id: string): FinishedSession | undefined {\n\treturn finishedSessions.get(id);\n}\n\nexport function deleteSession(id: string): void {\n\trunningSessions.delete(id);\n\tfinishedSessions.delete(id);\n}\n\nfunction sumPendingChars(buffer: string[]): number {\n\tlet total = 0;\n\tfor (const chunk of buffer) {\n\t\ttotal += chunk.length;\n\t}\n\treturn total;\n}\n\nfunction capPendingBuffer(\n\tbuffer: string[],\n\tpendingChars: number,\n\tcap: number,\n): number {\n\tif (pendingChars <= cap) {\n\t\treturn pendingChars;\n\t}\n\tconst last = buffer.at(-1);\n\tif (last && last.length >= cap) {\n\t\tbuffer.length = 0;\n\t\tbuffer.push(last.slice(last.length - cap));\n\t\treturn cap;\n\t}\n\twhile (buffer.length && pendingChars - buffer[0].length >= cap) {\n\t\tpendingChars -= buffer[0].length;\n\t\tbuffer.shift();\n\t}\n\tif (buffer.length && pendingChars > cap) {\n\t\tconst overflow = pendingChars - cap;\n\t\tbuffer[0] = buffer[0].slice(overflow);\n\t\tpendingChars = cap;\n\t}\n\treturn pendingChars;\n}\n\nexport function tail(text: string, max = 2000): string {\n\tif (text.length <= max) {\n\t\treturn text;\n\t}\n\treturn text.slice(text.length - max);\n}\n\nexport function trimWithCap(text: string, max: number): string {\n\tif (text.length <= max) {\n\t\treturn text;\n\t}\n\treturn text.slice(text.length - max);\n}\n\nexport function appendOutput(\n\tsession: ProcessSession,\n\tstream: \"stdout\" | \"stderr\",\n\tchunk: string,\n): void {\n\tsession.pendingStdout ??= [];\n\tsession.pendingStderr ??= [];\n\tsession.pendingStdoutChars ??= sumPendingChars(session.pendingStdout);\n\tsession.pendingStderrChars ??= sumPendingChars(session.pendingStderr);\n\tconst buffer =\n\t\tstream === \"stdout\" ? session.pendingStdout : session.pendingStderr;\n\tconst bufferChars =\n\t\tstream === \"stdout\"\n\t\t\t? session.pendingStdoutChars\n\t\t\t: session.pendingStderrChars;\n\tconst pendingCap = Math.min(\n\t\tsession.pendingMaxOutputChars ?? DEFAULT_PENDING_OUTPUT_CHARS,\n\t\tsession.maxOutputChars,\n\t);\n\tbuffer.push(chunk);\n\tlet pendingChars = bufferChars + chunk.length;\n\tif (pendingChars > pendingCap) {\n\t\tsession.truncated = true;\n\t\tpendingChars = capPendingBuffer(buffer, pendingChars, pendingCap);\n\t}\n\tif (stream === \"stdout\") {\n\t\tsession.pendingStdoutChars = pendingChars;\n\t} else {\n\t\tsession.pendingStderrChars = pendingChars;\n\t}\n\tsession.totalOutputChars += chunk.length;\n\tconst aggregated = trimWithCap(\n\t\tsession.aggregated + chunk,\n\t\tsession.maxOutputChars,\n\t);\n\tsession.truncated =\n\t\tsession.truncated ||\n\t\taggregated.length < session.aggregated.length + chunk.length;\n\tsession.aggregated = aggregated;\n\tsession.tail = tail(session.aggregated, 2000);\n}\n\nexport function drainSession(session: ProcessSession): {\n\tstdout: string;\n\tstderr: string;\n} {\n\tconst stdout = session.pendingStdout.join(\"\");\n\tconst stderr = session.pendingStderr.join(\"\");\n\tsession.pendingStdout = [];\n\tsession.pendingStderr = [];\n\tsession.pendingStdoutChars = 0;\n\tsession.pendingStderrChars = 0;\n\treturn { stdout, stderr };\n}\n\nfunction moveToFinished(session: ProcessSession, status: ProcessStatus): void {\n\trunningSessions.delete(session.id);\n\tif (!session.backgrounded) {\n\t\treturn;\n\t}\n\tfinishedSessions.set(session.id, {\n\t\tid: session.id,\n\t\tcommand: session.command,\n\t\tscopeKey: session.scopeKey,\n\t\tstartedAt: session.startedAt,\n\t\tendedAt: Date.now(),\n\t\tcwd: session.cwd,\n\t\tstatus,\n\t\texitCode: session.exitCode,\n\t\texitSignal: session.exitSignal,\n\t\taggregated: session.aggregated,\n\t\ttail: session.tail,\n\t\ttruncated: session.truncated,\n\t\ttotalOutputChars: session.totalOutputChars,\n\t});\n}\n\nexport function markExited(\n\tsession: ProcessSession,\n\texitCode: number | null,\n\texitSignal: NodeJS.Signals | number | null,\n\tstatus: ProcessStatus,\n): void {\n\tsession.exited = true;\n\tsession.exitCode = exitCode;\n\tsession.exitSignal = exitSignal;\n\tsession.tail = tail(session.aggregated, 2000);\n\tmoveToFinished(session, status);\n}\n\nexport function markBackgrounded(session: ProcessSession): void {\n\tsession.backgrounded = true;\n}\n\nexport function listRunningSessions(): ProcessSession[] {\n\treturn Array.from(runningSessions.values()).filter((s) => s.backgrounded);\n}\n\nexport function listFinishedSessions(): FinishedSession[] {\n\treturn Array.from(finishedSessions.values());\n}\n\nexport function clearFinished(): void {\n\tfinishedSessions.clear();\n}\n\nexport function resetProcessRegistryForTests(): void {\n\trunningSessions.clear();\n\tfinishedSessions.clear();\n\tstopSweeper();\n}\n\nexport function setJobTtlMs(value?: number): void {\n\tif (value === undefined || Number.isNaN(value)) {\n\t\treturn;\n\t}\n\tjobTtlMs = clampTtl(value);\n\tstopSweeper();\n\tstartSweeper();\n}\n\nfunction pruneFinishedSessions(): void {\n\tconst cutoff = Date.now() - jobTtlMs;\n\tfor (const [id, session] of finishedSessions.entries()) {\n\t\tif (session.endedAt < cutoff) {\n\t\t\tfinishedSessions.delete(id);\n\t\t}\n\t}\n}\n\nfunction startSweeper(): void {\n\tif (sweeper) {\n\t\treturn;\n\t}\n\tsweeper = setInterval(pruneFinishedSessions, Math.max(30_000, jobTtlMs / 6));\n\tsweeper.unref?.();\n}\n\nfunction stopSweeper(): void {\n\tif (!sweeper) {\n\t\treturn;\n\t}\n\tclearInterval(sweeper);\n\tsweeper = null;\n}\n",
|
|
30
|
-
"import type { Plugin } from \"@elizaos/core\";\nimport { clearHistory } from \"./actions\";\nimport { ExecApprovalService } from \"./approvals\";\nimport { shellHistoryProvider } from \"./providers\";\nimport { terminalUsageProvider } from \"./providers/terminalUsage\";\nimport { ShellService } from \"./services/shellService\";\n\nexport const shellPlugin: Plugin = {\n\tname: \"shell\",\n\tdescription:\n\t\t\"Shell observability and history management providers\",\n\tservices: [ShellService, ExecApprovalService],\n\tactions: [clearHistory],\n\tproviders: [shellHistoryProvider, terminalUsageProvider],\n};\n\nexport default shellPlugin;\n\n// Actions\nexport { clearHistory } from \"./actions/clearHistory\";\n\n// Approvals\nexport {\n\taddAllowlistEntry,\n\tanalyzeShellCommand,\n\ttype CommandCheckResult,\n\ttype CommandResolution,\n\tDEFAULT_SAFE_BINS,\n\tEXEC_APPROVAL_DEFAULTS,\n\ttype ExecAllowlistAnalysis,\n\ttype ExecAllowlistEntry,\n\ttype ExecAllowlistEvaluation,\n\ttype ExecApprovalDecision,\n\ttype ExecApprovalRequest,\n\ttype ExecApprovalResult,\n\tExecApprovalService,\n\ttype ExecApprovalsAgent,\n\ttype ExecApprovalsDefaults,\n\ttype ExecApprovalsFile,\n\ttype ExecApprovalsResolved,\n\ttype ExecApprovalsSnapshot,\n\ttype ExecAsk,\n\ttype ExecCommandAnalysis,\n\ttype ExecCommandSegment,\n\ttype ExecHost,\n\ttype ExecSecurity,\n\tensureApprovals,\n\tevaluateExecAllowlist,\n\tevaluateShellAllowlist,\n\tgetApprovalFilePath,\n\tgetApprovalSocketPath,\n\tisSafeBinUsage,\n\tloadApprovals,\n\tmatchAllowlist,\n\tmaxAsk,\n\tminSecurity,\n\tnormalizeApprovals,\n\tnormalizeSafeBins,\n\treadApprovalsSnapshot,\n\trecordAllowlistUse,\n\trequiresExecApproval,\n\tresolveApprovals,\n\tresolveApprovalsFromFile,\n\tresolveCommandFromArgv,\n\tresolveCommandResolution,\n\tresolveSafeBins,\n\tsaveApprovals,\n} from \"./approvals\";\n\n// Providers\nexport { terminalUsageProvider } from \"./providers/terminalUsage\";\nexport { shellHistoryProvider } from \"./providers/shellHistoryProvider\";\nexport {\n\taddSession,\n\tappendOutput,\n\tclearFinished,\n\tcreateSessionSlug,\n\tdeleteSession,\n\tdrainSession,\n\tgetFinishedSession,\n\tgetSession,\n\tlistFinishedSessions,\n\tlistRunningSessions,\n\tmarkBackgrounded,\n\tmarkExited,\n\tresetProcessRegistryForTests,\n\tsetJobTtlMs,\n\ttail,\n\ttrimWithCap,\n} from \"./services/processRegistry\";\n// Services\nexport { ShellService } from \"./services/shellService\";\n\n// Types\nexport type {\n\tCommandHistoryEntry,\n\tCommandResult,\n\tExecResult,\n\tExecuteOptions,\n\tFileOperation,\n\tFileOperationType,\n\tFinishedSession,\n\tProcessAction,\n\tProcessActionParams,\n\tProcessSession,\n\tProcessStatus,\n\tPtyExitEvent,\n\tPtyHandle,\n\tPtyListener,\n\tPtySpawn,\n\tSessionStdin,\n\tShellConfig,\n} from \"./types\";\n\n// Utilities\nexport {\n\tDEFAULT_FORBIDDEN_COMMANDS,\n\textractBaseCommand,\n\tisForbiddenCommand,\n\tisSafeCommand,\n\tloadShellConfig,\n\tvalidatePath,\n} from \"./utils\";\nexport {\n\tBRACKETED_PASTE_END,\n\tBRACKETED_PASTE_START,\n\tbuildCursorPositionResponse,\n\tencodeKeySequence,\n\tencodePaste,\n\ttype KeyEncodingRequest,\n\ttype KeyEncodingResult,\n\tstripDsrRequests,\n} from \"./utils/ptyKeys\";\nexport {\n\tchunkString,\n\tclampNumber,\n\tcoerceEnv,\n\tderiveSessionName,\n\tformatDuration,\n\tformatSpawnError,\n\tgetShellConfig,\n\tkillProcessTree,\n\tkillSession,\n\tpad,\n\treadEnvInt,\n\tresolveWorkdir,\n\ttype SpawnFallback,\n\ttype SpawnWithFallbackResult,\n\tsanitizeBinaryOutput,\n\tsliceLogLines,\n\tsliceUtf16Safe,\n\tspawnWithFallback,\n\ttruncateMiddle,\n} from \"./utils/shellUtils\";\n"
|
|
31
|
-
],
|
|
32
|
-
"mappings": "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",
|
|
33
|
-
"debugId": "89E93595C791F9E464756E2164756E21",
|
|
34
|
-
"names": []
|
|
35
|
-
}
|