@elizaos/plugin-shell 2.0.0-alpha.2 → 2.0.0-alpha.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/actions/index.d.ts +1 -0
- package/dist/actions/index.d.ts.map +1 -1
- package/dist/actions/processAction.d.ts +7 -0
- package/dist/actions/processAction.d.ts.map +1 -0
- package/dist/approvals/allowlist.d.ts +76 -0
- package/dist/approvals/allowlist.d.ts.map +1 -0
- package/dist/approvals/analysis.d.ts +76 -0
- package/dist/approvals/analysis.d.ts.map +1 -0
- package/dist/approvals/index.d.ts +12 -0
- package/dist/approvals/index.d.ts.map +1 -0
- package/dist/approvals/service.d.ts +121 -0
- package/dist/approvals/service.d.ts.map +1 -0
- package/dist/approvals/types.d.ts +219 -0
- package/dist/approvals/types.d.ts.map +1 -0
- package/dist/index.d.ts +6 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5069 -446
- package/dist/index.js.map +24 -6
- package/dist/services/index.d.ts +1 -0
- package/dist/services/index.d.ts.map +1 -1
- package/dist/services/processRegistry.d.ts +25 -0
- package/dist/services/processRegistry.d.ts.map +1 -0
- package/dist/services/shellService.d.ts +73 -6
- package/dist/services/shellService.d.ts.map +1 -1
- package/dist/types/index.d.ts +114 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/utils/config.d.ts.map +1 -1
- package/dist/utils/index.d.ts +4 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/processQueue.d.ts +136 -0
- package/dist/utils/processQueue.d.ts.map +1 -0
- package/dist/utils/ptyKeys.d.ts +23 -0
- package/dist/utils/ptyKeys.d.ts.map +1 -0
- package/dist/utils/shellArgv.d.ts +37 -0
- package/dist/utils/shellArgv.d.ts.map +1 -0
- package/dist/utils/shellUtils.d.ts +103 -0
- package/dist/utils/shellUtils.d.ts.map +1 -0
- package/package.json +43 -11
- package/LICENSE +0 -21
package/dist/index.js.map
CHANGED
|
@@ -1,19 +1,37 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../actions/clearHistory.ts", "../generated/specs/specs.ts", "../generated/specs/spec-helpers.ts", "../actions/executeCommand.ts", "../generated/prompts/typescript/prompts.ts", "../providers/shellHistoryProvider.ts", "../services/shellService.ts", "../utils/config.ts", "../utils/pathUtils.ts", "../index.ts"],
|
|
3
|
+
"sources": ["../../../../node_modules/.bun/@lydell+node-pty@1.1.0/node_modules/@lydell/node-pty/eventEmitter2.js", "../../../../node_modules/.bun/@lydell+node-pty@1.1.0/node_modules/@lydell/node-pty/terminal.js", "../../../../node_modules/.bun/@lydell+node-pty@1.1.0/node_modules/@lydell/node-pty/shared/conout.js", "../../../../node_modules/.bun/@lydell+node-pty@1.1.0/node_modules/@lydell/node-pty/windowsConoutConnection.js", "../../../../node_modules/.bun/@lydell+node-pty@1.1.0/node_modules/@lydell/node-pty/requireBinary.js", "../../../../node_modules/.bun/@lydell+node-pty@1.1.0/node_modules/@lydell/node-pty/windowsPtyAgent.js", "../../../../node_modules/.bun/@lydell+node-pty@1.1.0/node_modules/@lydell/node-pty/utils.js", "../../../../node_modules/.bun/@lydell+node-pty@1.1.0/node_modules/@lydell/node-pty/windowsTerminal.js", "../../../../node_modules/.bun/@lydell+node-pty@1.1.0/node_modules/@lydell/node-pty/unixTerminal.js", "../../../../node_modules/.bun/@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", "../actions/executeCommand.ts", "../generated/prompts/typescript/prompts.ts", "../actions/processAction.ts", "../approvals/allowlist.ts", "../approvals/types.ts", "../approvals/analysis.ts", "../approvals/service.ts", "../providers/shellHistoryProvider.ts", "../services/shellService.ts", "../utils/config.ts", "../utils/pathUtils.ts", "../utils/ptyKeys.ts", "../utils/shellUtils.ts", "../services/processRegistry.ts", "../index.ts"],
|
|
4
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",
|
|
5
15
|
"import {\n type Action,\n type ActionExample,\n type Content,\n type HandlerCallback,\n type HandlerOptions,\n type IAgentRuntime,\n logger,\n type Memory,\n type 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 name: spec.name,\n similes: spec.similes ? [...spec.similes] : [],\n description: spec.description,\n validate: async (runtime: IAgentRuntime, message: Memory, _state: State): Promise<boolean> => {\n const shellService = runtime.getService<ShellService>(\"shell\");\n if (!shellService) {\n return false;\n }\n\n const text = message.content.text?.toLowerCase() || \"\";\n const clearKeywords = [\"clear\", \"reset\", \"delete\", \"remove\", \"clean\"];\n const historyKeywords = [\"history\", \"terminal\", \"shell\", \"command\"];\n\n const hasClearKeyword = clearKeywords.some((keyword) => text.includes(keyword));\n const hasHistoryKeyword = historyKeywords.some((keyword) => text.includes(keyword));\n\n return hasClearKeyword && hasHistoryKeyword;\n },\n handler: async (\n runtime: IAgentRuntime,\n message: Memory,\n _state: State,\n _options?: HandlerOptions,\n callback?: HandlerCallback\n ) => {\n const shellService = runtime.getService<ShellService>(\"shell\");\n\n if (!shellService) {\n if (callback) {\n await callback({\n text: \"Shell service is not available.\",\n source: message.content.source,\n });\n }\n return { success: false, error: \"Shell service is not available.\" };\n }\n\n const conversationId = message.roomId || message.agentId;\n if (!conversationId) {\n const errorMsg = \"No conversation ID available\";\n if (callback) {\n await callback({\n text: errorMsg,\n source: message.content.source,\n });\n }\n return { success: false, error: errorMsg };\n }\n shellService.clearCommandHistory(conversationId);\n\n logger.info(`Cleared shell history for conversation: ${conversationId}`);\n\n const response: Content = {\n text: \"Shell command history has been cleared.\",\n source: message.content.source,\n };\n\n if (callback) {\n await callback(response);\n }\n return { success: true, text: response.text };\n },\n examples: (spec.examples ?? []) as ActionExample[][],\n};\n\nexport default clearHistory;\n",
|
|
6
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 name: string;\n description: string;\n similes?: readonly string[];\n parameters?: readonly unknown[];\n examples?: readonly (readonly unknown[])[];\n};\n\nexport type ProviderDoc = {\n name: string;\n description: string;\n position?: number;\n dynamic?: boolean;\n};\n\nexport type EvaluatorDoc = {\n name: string;\n description: string;\n similes?: readonly string[];\n alwaysRun?: boolean;\n examples?: readonly unknown[];\n};\n\nexport const coreActionsSpec = {\n version: \"1.0.0\",\n actions: [\n {\n name: \"CLEAR_SHELL_HISTORY\",\n description: \"Clears the recorded history of shell commands for the current conversation\",\n similes: [\"RESET_SHELL\", \"CLEAR_TERMINAL\", \"CLEAR_HISTORY\", \"RESET_HISTORY\"],\n parameters: [],\n },\n {\n name: \"EXECUTE_COMMAND\",\n description:\n \"Execute shell commands including brew install, npm install, apt-get, system commands, file operations, directory navigation, and scripts.\",\n similes: [\n \"RUN_COMMAND\",\n \"SHELL_COMMAND\",\n \"TERMINAL_COMMAND\",\n \"EXEC\",\n \"RUN\",\n \"EXECUTE\",\n \"CREATE_FILE\",\n \"WRITE_FILE\",\n \"MAKE_FILE\",\n \"INSTALL\",\n \"BREW_INSTALL\",\n \"NPM_INSTALL\",\n \"APT_INSTALL\",\n ],\n parameters: [],\n },\n ],\n} as const;\nexport const allActionsSpec = {\n version: \"1.0.0\",\n actions: [\n {\n name: \"CLEAR_SHELL_HISTORY\",\n description: \"Clears the recorded history of shell commands for the current conversation\",\n similes: [\"RESET_SHELL\", \"CLEAR_TERMINAL\", \"CLEAR_HISTORY\", \"RESET_HISTORY\"],\n parameters: [],\n },\n {\n name: \"EXECUTE_COMMAND\",\n description:\n \"Execute shell commands including brew install, npm install, apt-get, system commands, file operations, directory navigation, and scripts.\",\n similes: [\n \"RUN_COMMAND\",\n \"SHELL_COMMAND\",\n \"TERMINAL_COMMAND\",\n \"EXEC\",\n \"RUN\",\n \"EXECUTE\",\n \"CREATE_FILE\",\n \"WRITE_FILE\",\n \"MAKE_FILE\",\n \"INSTALL\",\n \"BREW_INSTALL\",\n \"NPM_INSTALL\",\n \"APT_INSTALL\",\n ],\n parameters: [],\n },\n ],\n} as const;\nexport const coreProvidersSpec = {\n version: \"1.0.0\",\n providers: [\n {\n name: \"SHELL_HISTORY\",\n description:\n \"Provides recent shell command history, current working directory, and file operations within the restricted environment\",\n dynamic: true,\n },\n ],\n} as const;\nexport const allProvidersSpec = {\n version: \"1.0.0\",\n providers: [\n {\n name: \"SHELL_HISTORY\",\n description:\n \"Provides recent shell command history, current working directory, and file operations within the restricted environment\",\n dynamic: true,\n },\n ],\n} as const;\nexport const coreEvaluatorsSpec = {\n version: \"1.0.0\",\n evaluators: [],\n} as const;\nexport const allEvaluatorsSpec = {\n version: \"1.0.0\",\n evaluators: [],\n} as const;\n\nexport const coreActionDocs: readonly ActionDoc[] = coreActionsSpec.actions;\nexport const allActionDocs: readonly ActionDoc[] = allActionsSpec.actions;\nexport const coreProviderDocs: readonly ProviderDoc[] = coreProvidersSpec.providers;\nexport const allProviderDocs: readonly ProviderDoc[] = allProvidersSpec.providers;\nexport const coreEvaluatorDocs: readonly EvaluatorDoc[] = coreEvaluatorsSpec.evaluators;\nexport const allEvaluatorDocs: readonly EvaluatorDoc[] = allEvaluatorsSpec.evaluators;\n",
|
|
7
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 type ActionDoc,\n allActionDocs,\n allEvaluatorDocs,\n allProviderDocs,\n coreActionDocs,\n coreEvaluatorDocs,\n coreProviderDocs,\n type EvaluatorDoc,\n type ProviderDoc,\n} from \"./specs\";\n\n// Build lookup maps for O(1) access\nconst coreActionMap = new Map<string, ActionDoc>(coreActionDocs.map((doc) => [doc.name, doc]));\nconst allActionMap = new Map<string, ActionDoc>(allActionDocs.map((doc) => [doc.name, doc]));\nconst coreProviderMap = new Map<string, ProviderDoc>(\n coreProviderDocs.map((doc) => [doc.name, doc])\n);\nconst allProviderMap = new Map<string, ProviderDoc>(allProviderDocs.map((doc) => [doc.name, doc]));\nconst coreEvaluatorMap = new Map<string, EvaluatorDoc>(\n coreEvaluatorDocs.map((doc) => [doc.name, doc])\n);\nconst allEvaluatorMap = new Map<string, EvaluatorDoc>(\n allEvaluatorDocs.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 return 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 const spec = getActionSpec(name);\n if (!spec) {\n throw new Error(`Action spec not found: ${name}`);\n }\n return 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 return 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 const spec = getProviderSpec(name);\n if (!spec) {\n throw new Error(`Provider spec not found: ${name}`);\n }\n return 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 return 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 const spec = getEvaluatorSpec(name);\n if (!spec) {\n throw new Error(`Evaluator spec not found: ${name}`);\n }\n return spec;\n}\n\n// Re-export types for convenience\nexport type { ActionDoc, ProviderDoc, EvaluatorDoc };\n",
|
|
8
18
|
"import type { HandlerOptions } from \"@elizaos/core\";\nimport {\n type Action,\n type ActionExample,\n type Content,\n composePromptFromState,\n type HandlerCallback,\n type IAgentRuntime,\n logger,\n type Memory,\n ModelType,\n parseJSONObjectFromText,\n type State,\n} from \"@elizaos/core\";\nimport { commandExtractionTemplate } from \"../generated/prompts/typescript/prompts.js\";\nimport { requireActionSpec } from \"../generated/specs/spec-helpers\";\nimport type { ShellService } from \"../services/shellService\";\nexport { commandExtractionTemplate };\n\nconst extractCommand = async (\n runtime: IAgentRuntime,\n _message: Memory,\n state: State\n): Promise<{ command: string } | null> => {\n const prompt = composePromptFromState({\n state,\n template: commandExtractionTemplate,\n });\n\n for (let i = 0; i < 3; i++) {\n const response = await runtime.useModel(ModelType.TEXT_SMALL, {\n prompt,\n });\n\n const parsedResponse = parseJSONObjectFromText(response) as {\n command?: string;\n } | null;\n if (parsedResponse?.command) {\n return { command: parsedResponse.command };\n }\n }\n return null;\n};\n\nconst spec = requireActionSpec(\"EXECUTE_COMMAND\");\n\nexport const executeCommand: Action = {\n name: spec.name,\n similes: spec.similes ? [...spec.similes] : [],\n description: spec.description,\n validate: async (runtime: IAgentRuntime, message: Memory, _state: State): Promise<boolean> => {\n const shellService = runtime.getService<ShellService>(\"shell\");\n if (!shellService) {\n return false;\n }\n\n const text = message.content.text?.toLowerCase() || \"\";\n const commandKeywords = [\n \"run\",\n \"execute\",\n \"command\",\n \"shell\",\n \"install\",\n \"brew\",\n \"npm\",\n \"create\",\n \"file\",\n \"directory\",\n \"folder\",\n \"list\",\n \"show\",\n \"system\",\n \"info\",\n \"check\",\n \"status\",\n \"cd\",\n \"ls\",\n \"mkdir\",\n \"echo\",\n \"cat\",\n \"touch\",\n \"git\",\n \"build\",\n \"test\",\n ];\n\n const hasCommandKeyword = commandKeywords.some((keyword) => text.includes(keyword));\n const hasDirectCommand = /^(brew|npm|apt|git|ls|cd|echo|cat|touch|mkdir|rm|mv|cp)\\s/i.test(\n message.content.text || \"\"\n );\n\n return hasCommandKeyword || hasDirectCommand;\n },\n handler: async (\n runtime: IAgentRuntime,\n message: Memory,\n state: State,\n _options?: HandlerOptions,\n callback?: HandlerCallback\n ) => {\n const shellService = runtime.getService<ShellService>(\"shell\");\n\n if (!shellService) {\n if (callback) {\n await callback({\n text: \"Shell service is not available.\",\n source: message.content.source,\n });\n }\n return { success: false, error: \"Shell service is not available.\" };\n }\n\n const commandInfo = await extractCommand(runtime, message, state);\n if (!commandInfo?.command) {\n logger.error(\"Failed to extract command from message:\", message.content.text);\n if (callback) {\n await callback({\n text: \"Could not determine which command to execute. Please specify a shell command.\",\n source: message.content.source,\n });\n }\n return { success: false, error: \"Could not extract command.\" };\n }\n\n logger.info(`Extracted command: \"${commandInfo.command}\"`);\n\n try {\n const conversationId = message.roomId || message.agentId;\n const result = await shellService.executeCommand(commandInfo.command, conversationId);\n\n let responseText = \"\";\n\n if (result.success) {\n responseText = `Command executed successfully in ${result.executedIn}\\n\\n`;\n if (result.stdout) {\n responseText += `Output:\\n\\`\\`\\`\\n${result.stdout}\\n\\`\\`\\``;\n } else {\n responseText += \"Command completed with no output.\";\n }\n } else {\n responseText = `Command failed with exit code ${result.exitCode} in ${result.executedIn}\\n\\n`;\n if (result.error) {\n responseText += `Error: ${result.error}\\n`;\n }\n if (result.stderr) {\n responseText += `\\nError output:\\n\\`\\`\\`\\n${result.stderr}\\n\\`\\`\\``;\n }\n }\n\n const response: Content = {\n text: responseText,\n source: message.content.source,\n };\n\n if (callback) {\n await callback(response);\n }\n return { success: result.success, text: responseText };\n } catch (error) {\n logger.error(\"Error executing command:\", error);\n const errorMessage = error instanceof Error ? error.message : String(error);\n if (callback) {\n await callback({\n text: `Failed to execute command: ${errorMessage}`,\n source: message.content.source,\n });\n }\n return { success: false, error: errorMessage };\n }\n },\n examples: (spec.examples ?? []) as ActionExample[][],\n};\n\nexport default executeCommand;\n",
|
|
9
19
|
"/**\n * Auto-generated prompt templates\n * DO NOT EDIT - Generated from ../../../../prompts/*.txt\n *\n * These prompts use Handlebars-style template syntax:\n * - {{variableName}} for simple substitution\n * - {{#each items}}...{{/each}} for iteration\n * - {{#if condition}}...{{/if}} for conditionals\n */\n\nexport const commandExtractionTemplate = `# Extracting shell command from request\n{{recentMessages}}\n\n# Instructions: {{senderName}} wants to execute a shell command. Extract the COMPLETE shell command they want to run.\n\nIMPORTANT: \n1. Always return the FULL executable shell command, not just the content or partial command.\n2. If the user mentions installing something, create the appropriate brew/npm/apt command.\n3. If the user directly provides a command (like \"brew install X\"), use it exactly as provided.\n4. ALWAYS extract a command if the user is asking for ANY kind of system operation.\n\nCommon patterns:\n- \"run ls -la\" -> command: \"ls -la\"\n- \"execute npm test\" -> command: \"npm test\"\n- \"show me the files\" or \"list files\" -> command: \"ls -la\"\n- \"what's in this directory\" -> command: \"ls -la\"\n- \"check git status\" -> command: \"git status\"\n- \"navigate to src folder\" -> command: \"cd src\"\n- \"create a file called test.txt\" -> command: \"touch test.txt\"\n- \"write hello world to a file\" -> command: \"echo 'hello world' > file.txt\"\n- \"create hello.js with javascript code\" -> command: \"echo 'console.log(\\\\\"Hello, World!\\\\\");' > hello.js\"\n- \"create hello_world.py and write a python hello world script inside\" -> command: \"echo 'print(\\\\\"Hello, World!\\\\\")' > hello_world.py\"\n- \"make a new directory\" -> command: \"mkdir newdir\"\n- \"list files inside your filesystem\" -> command: \"ls -la\"\n- \"install orbstack\" or \"brew install orbstack\" -> command: \"brew install orbstack\"\n- \"install mullvad vpn\" -> command: \"brew install --cask mullvad-vpn\"\n- \"get system info\" -> command: \"system_profiler SPHardwareDataType\"\n- \"check memory usage\" -> command: \"vm_stat\"\n- \"install package\" -> command: \"brew install <package>\"\n\nSpecial cases:\n- \"Run it in your shell\" or \"execute it\" -> Extract the command from previous context\n- \"Install these\" -> Look for package names in previous messages\n- Direct commands should be used exactly as provided\n\nKey rules:\n1. For file creation with content, use: echo 'content' > filename\n2. For listing files, use: ls -la (not just ls)\n3. Always include the echo command when writing to files\n4. Include all flags and arguments\n5. When user says \"run it\", \"execute it\", or similar, they want you to run the command\n\nYour response must be formatted as a JSON block:\n\\`\\`\\`json\n{\n \"command\": \"<complete shell command to execute>\"\n}\n\\`\\`\\``;\n\nexport const COMMAND_EXTRACTION_TEMPLATE = commandExtractionTemplate;\n\n",
|
|
20
|
+
"/**\n * Process Action - Manage running exec sessions\n * Supports: list, poll, log, write, send-keys, submit, paste, kill, clear, remove\n */\n\nimport type { Action, ActionResult, IAgentRuntime, Memory, State } from \"@elizaos/core\";\nimport { composePromptFromState, logger, ModelType } from \"@elizaos/core\";\nimport type { ShellService } from \"../services/shellService\";\nimport type { ProcessActionParams } from \"../types\";\n\nconst processActionTemplate = `You are helping extract process management parameters from user messages.\n\nRecent conversation:\n{{recentMessages}}\n\nBased on the conversation, extract the process action parameters:\n- action: The action to perform (list, poll, log, write, send-keys, submit, paste, kill, clear, remove)\n- sessionId: The session ID (required for all actions except \"list\")\n- data: Data to write (for \"write\" action)\n- keys: Array of key tokens (for \"send-keys\" action)\n- literal: Literal string to send (for \"send-keys\" action)\n- text: Text to paste (for \"paste\" action)\n- eof: Whether to close stdin after write (for \"write\" action)\n- offset: Log offset (for \"log\" action)\n- limit: Log limit (for \"log\" action)\n\nRespond with a JSON object containing the extracted parameters:\n\\`\\`\\`json\n{\n \"action\": \"list|poll|log|write|send-keys|submit|paste|kill|clear|remove\",\n \"sessionId\": \"optional-session-id\",\n \"data\": \"optional-data\",\n \"keys\": [\"optional\", \"key\", \"tokens\"],\n \"literal\": \"optional-literal\",\n \"text\": \"optional-paste-text\",\n \"eof\": false,\n \"offset\": 0,\n \"limit\": 100\n}\n\\`\\`\\``;\n\nfunction extractJsonFromResponse(response: string): ProcessActionParams | null {\n const jsonMatch = response.match(/```json\\s*([\\s\\S]*?)\\s*```/);\n if (jsonMatch?.[1]) {\n try {\n return JSON.parse(jsonMatch[1]) as ProcessActionParams;\n } catch {\n // Try without code blocks\n }\n }\n\n try {\n const trimmed = response.trim();\n if (trimmed.startsWith(\"{\") && trimmed.endsWith(\"}\")) {\n return JSON.parse(trimmed) as ProcessActionParams;\n }\n } catch {\n // Fall through\n }\n\n return null;\n}\n\nexport const processAction: Action = {\n name: \"MANAGE_PROCESS\",\n similes: [\n \"PROCESS_LIST\",\n \"PROCESS_POLL\",\n \"PROCESS_LOG\",\n \"PROCESS_WRITE\",\n \"PROCESS_KILL\",\n \"LIST_SESSIONS\",\n \"POLL_SESSION\",\n \"KILL_SESSION\",\n \"CHECK_PROCESS\",\n \"SEND_KEYS\",\n ],\n description:\n \"Manage running shell/exec sessions: list, poll, log, write, send-keys, submit, paste, kill, clear, remove\",\n\n validate: async (_runtime: IAgentRuntime, message: Memory): Promise<boolean> => {\n const text = message.content.text?.toLowerCase() || \"\";\n\n const processKeywords = [\n \"process\",\n \"session\",\n \"sessions\",\n \"list\",\n \"poll\",\n \"log\",\n \"write\",\n \"send-keys\",\n \"send keys\",\n \"submit\",\n \"paste\",\n \"kill\",\n \"clear\",\n \"remove\",\n \"running\",\n \"background\",\n ];\n\n const actionKeywords = [\n \"check\",\n \"show\",\n \"get\",\n \"view\",\n \"manage\",\n \"stop\",\n \"terminate\",\n \"status\",\n ];\n\n const hasProcessKeyword = processKeywords.some((kw) => text.includes(kw));\n const hasActionKeyword = actionKeywords.some((kw) => text.includes(kw));\n\n return hasProcessKeyword || (hasActionKeyword && text.includes(\"session\"));\n },\n\n handler: async (\n runtime: IAgentRuntime,\n message: Memory,\n state?: State\n ): Promise<ActionResult> => {\n const shellService = runtime.getService<ShellService>(\"shell\");\n if (!shellService) {\n return {\n success: false,\n text: \"Shell service is not available.\",\n error: \"Shell service not found\",\n };\n }\n\n // Try to extract parameters from the message\n const composedState = state ?? (await runtime.composeState(message));\n\n const prompt = composePromptFromState({\n state: composedState,\n template: processActionTemplate,\n });\n\n let params: ProcessActionParams | null = null;\n\n // Simple heuristic extraction for common patterns\n const text = message.content.text?.toLowerCase() || \"\";\n\n if (text.includes(\"list\") && (text.includes(\"session\") || text.includes(\"process\"))) {\n params = { action: \"list\" };\n } else {\n // Use LLM for complex extraction\n try {\n const response = await runtime.useModel(ModelType.TEXT_SMALL, {\n prompt,\n });\n params = extractJsonFromResponse(String(response));\n } catch (error) {\n logger.error(\"Failed to extract process parameters:\", error);\n }\n }\n\n if (!params) {\n // Default to list if we can't determine the action\n params = { action: \"list\" };\n }\n\n const result = await shellService.processAction(params);\n\n return {\n success: result.success,\n text: result.message,\n };\n },\n\n examples: [\n [\n {\n name: \"{{user1}}\",\n content: { text: \"List all running processes\" },\n },\n {\n name: \"{{agentName}}\",\n content: {\n text: \"Here are the running sessions:\\ncalm-harbor running 5m30s :: npm install\\nbrisk-reef completed 2m15s :: git status\",\n action: \"MANAGE_PROCESS\",\n },\n },\n ],\n [\n {\n name: \"{{user1}}\",\n content: { text: \"Check the status of session calm-harbor\" },\n },\n {\n name: \"{{agentName}}\",\n content: {\n text: \"Session calm-harbor is still running.\\n\\nOutput:\\nnpm WARN deprecated...\\n\\nProcess still running.\",\n action: \"MANAGE_PROCESS\",\n },\n },\n ],\n [\n {\n name: \"{{user1}}\",\n content: { text: \"Kill the session brisk-reef\" },\n },\n {\n name: \"{{agentName}}\",\n content: {\n text: \"Killed session brisk-reef.\",\n action: \"MANAGE_PROCESS\",\n },\n },\n ],\n ],\n};\n",
|
|
21
|
+
"/**\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 CommandResolution,\n ExecAllowlistEntry,\n ExecApprovalsAgent,\n ExecApprovalsDefaults,\n ExecApprovalsFile,\n ExecApprovalsResolved,\n ExecApprovalsSnapshot,\n ExecAsk,\n ExecSecurity,\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 if (!value) return value;\n if (value === \"~\") return os.homedir();\n if (value.startsWith(\"~/\")) return path.join(os.homedir(), value.slice(2));\n return value;\n}\n\n/**\n * Hash raw content for change detection\n */\nfunction hashContent(raw: string | null): string {\n return crypto\n .createHash(\"sha256\")\n .update(raw ?? \"\")\n .digest(\"hex\");\n}\n\n/**\n * Get the default approval file path\n */\nexport function getApprovalFilePath(): string {\n return expandHome(DEFAULT_FILE_PATH);\n}\n\n/**\n * Get the default socket path\n */\nexport function getApprovalSocketPath(): string {\n return expandHome(DEFAULT_SOCKET_PATH);\n}\n\n/**\n * Ensure directory exists for a file path\n */\nfunction ensureDir(filePath: string): void {\n const dir = path.dirname(filePath);\n fs.mkdirSync(dir, { recursive: true });\n}\n\n/**\n * Normalize allowlist pattern for comparison\n */\nfunction normalizePattern(value: string | undefined): string | null {\n const trimmed = value?.trim() ?? \"\";\n return trimmed ? trimmed.toLowerCase() : null;\n}\n\n/**\n * Ensure all allowlist entries have IDs\n */\nfunction ensureAllowlistIds(\n allowlist: ExecAllowlistEntry[] | undefined\n): ExecAllowlistEntry[] | undefined {\n if (!Array.isArray(allowlist) || allowlist.length === 0) {\n return allowlist;\n }\n\n let changed = false;\n const next = allowlist.map((entry) => {\n if (entry.id) return entry;\n changed = true;\n return { ...entry, id: crypto.randomUUID() };\n });\n\n return changed ? next : allowlist;\n}\n\n/**\n * Merge legacy agent configuration with current\n */\nfunction mergeLegacyAgent(\n current: ExecApprovalsAgent,\n legacy: ExecApprovalsAgent\n): ExecApprovalsAgent {\n const allowlist: ExecAllowlistEntry[] = [];\n const seen = new Set<string>();\n\n const pushEntry = (entry: ExecAllowlistEntry) => {\n const key = normalizePattern(entry.pattern);\n if (!key || seen.has(key)) return;\n seen.add(key);\n allowlist.push(entry);\n };\n\n for (const entry of current.allowlist ?? []) pushEntry(entry);\n for (const entry of legacy.allowlist ?? []) pushEntry(entry);\n\n return {\n security: current.security ?? legacy.security,\n ask: current.ask ?? legacy.ask,\n askFallback: current.askFallback ?? legacy.askFallback,\n autoAllowSkills: current.autoAllowSkills ?? legacy.autoAllowSkills,\n allowlist: allowlist.length > 0 ? allowlist : undefined,\n };\n}\n\n/**\n * Normalize approval configuration file\n */\nexport function normalizeApprovals(file: ExecApprovalsFile): ExecApprovalsFile {\n const socketPath = file.socket?.path?.trim();\n const token = file.socket?.token?.trim();\n const agents = { ...file.agents };\n\n // Handle legacy \"default\" agent\n const legacyDefault = agents.default;\n if (legacyDefault) {\n const main = agents[DEFAULT_AGENT_ID];\n agents[DEFAULT_AGENT_ID] = main ? mergeLegacyAgent(main, legacyDefault) : legacyDefault;\n delete agents.default;\n }\n\n // Ensure all allowlist entries have IDs\n for (const [key, agent] of Object.entries(agents)) {\n const allowlist = ensureAllowlistIds(agent.allowlist);\n if (allowlist !== agent.allowlist) {\n agents[key] = { ...agent, allowlist };\n }\n }\n\n return {\n version: 1,\n socket: {\n path: socketPath && socketPath.length > 0 ? socketPath : undefined,\n token: token && token.length > 0 ? token : undefined,\n },\n defaults: {\n security: file.defaults?.security,\n ask: file.defaults?.ask,\n askFallback: file.defaults?.askFallback,\n autoAllowSkills: file.defaults?.autoAllowSkills,\n },\n agents,\n };\n}\n\n/**\n * Generate a secure token\n */\nfunction generateToken(): string {\n return crypto.randomBytes(24).toString(\"base64url\");\n}\n\n/**\n * Read approval configuration snapshot\n */\nexport function readApprovalsSnapshot(): ExecApprovalsSnapshot {\n const filePath = getApprovalFilePath();\n\n if (!fs.existsSync(filePath)) {\n const file = normalizeApprovals({ version: 1, agents: {} });\n return {\n path: filePath,\n exists: false,\n raw: null,\n file,\n hash: hashContent(null),\n };\n }\n\n const raw = fs.readFileSync(filePath, \"utf8\");\n let parsed: ExecApprovalsFile | null = null;\n\n try {\n parsed = JSON.parse(raw) as ExecApprovalsFile;\n } catch (parseError) {\n logger.warn(\n { src: \"exec-approval\", parseError, filePath },\n \"Failed to parse approval config snapshot - file may be corrupted\"\n );\n parsed = null;\n }\n\n const file =\n parsed?.version === 1\n ? normalizeApprovals(parsed)\n : normalizeApprovals({ version: 1, agents: {} });\n\n if (parsed && parsed.version !== 1) {\n logger.warn(\n { src: \"exec-approval\", version: parsed.version, filePath },\n \"Approval config snapshot has unexpected version\"\n );\n }\n\n return {\n path: filePath,\n exists: true,\n raw,\n file,\n hash: hashContent(raw),\n };\n}\n\n/**\n * Load approval configuration\n */\nexport function loadApprovals(): ExecApprovalsFile {\n const filePath = getApprovalFilePath();\n\n try {\n if (!fs.existsSync(filePath)) {\n logger.debug(\n { src: \"exec-approval\", filePath },\n \"Approval config file does not exist, using defaults\"\n );\n return normalizeApprovals({ version: 1, agents: {} });\n }\n\n const raw = fs.readFileSync(filePath, \"utf8\");\n let parsed: ExecApprovalsFile;\n\n try {\n parsed = JSON.parse(raw) as ExecApprovalsFile;\n } catch (parseError) {\n logger.error(\n { src: \"exec-approval\", parseError, filePath },\n \"Failed to parse approval config JSON - file may be corrupted. Using defaults.\"\n );\n return normalizeApprovals({ version: 1, agents: {} });\n }\n\n if (parsed?.version !== 1) {\n logger.warn(\n { src: \"exec-approval\", version: parsed?.version, filePath },\n \"Approval config has unexpected version, using defaults\"\n );\n return normalizeApprovals({ version: 1, agents: {} });\n }\n\n return normalizeApprovals(parsed);\n } catch (error) {\n logger.error(\n { src: \"exec-approval\", error, filePath },\n \"Failed to load approval config - using defaults. This may indicate a permissions issue.\"\n );\n return normalizeApprovals({ version: 1, agents: {} });\n }\n}\n\n/**\n * Save approval configuration\n * @throws Error if file cannot be written\n */\nexport function saveApprovals(file: ExecApprovalsFile): void {\n const filePath = getApprovalFilePath();\n try {\n ensureDir(filePath);\n fs.writeFileSync(filePath, `${JSON.stringify(file, null, 2)}\\n`, {\n mode: 0o600,\n });\n\n try {\n fs.chmodSync(filePath, 0o600);\n } catch {\n // Best-effort on platforms without chmod (e.g., Windows)\n }\n } catch (error) {\n logger.error(\n { src: \"exec-approval\", error, filePath },\n \"Failed to save approval configuration\"\n );\n throw new Error(`Failed to save approval configuration to ${filePath}: ${error}`);\n }\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 const loaded = loadApprovals();\n const next = normalizeApprovals(loaded);\n\n const socketPath = next.socket?.path?.trim();\n const token = next.socket?.token?.trim();\n\n const updated: ExecApprovalsFile = {\n ...next,\n socket: {\n path: socketPath && socketPath.length > 0 ? socketPath : getApprovalSocketPath(),\n token: token && token.length > 0 ? token : generateToken(),\n },\n };\n\n // Try to save - if it fails, we can still return the in-memory config\n // but the caller should handle the error appropriately\n try {\n saveApprovals(updated);\n } catch (error) {\n logger.warn(\n { src: \"exec-approval\", error },\n \"Failed to save approval config during ensureApprovals - \" +\n \"returning in-memory config. Changes will not persist.\"\n );\n // Re-throw so caller knows something went wrong\n throw error;\n }\n\n return updated;\n}\n\n/**\n * Normalize security value\n */\nfunction normalizeSecurity(value: ExecSecurity | undefined, fallback: ExecSecurity): ExecSecurity {\n if (value === \"allowlist\" || value === \"full\" || value === \"deny\") {\n return value;\n }\n return fallback;\n}\n\n/**\n * Normalize ask value\n */\nfunction normalizeAsk(value: ExecAsk | undefined, fallback: ExecAsk): ExecAsk {\n if (value === \"always\" || value === \"off\" || value === \"on-miss\") {\n return value;\n }\n return 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 agentId?: string,\n overrides?: Partial<ExecApprovalsDefaults>\n): ExecApprovalsResolved {\n // Try to ensure approvals exist (may fail if can't write to disk)\n // If it fails, we load what we can and proceed with that\n let file: ExecApprovalsFile;\n try {\n file = ensureApprovals();\n } catch (error) {\n // ensureApprovals failed (likely can't write) - use loadApprovals which is read-only\n logger.warn(\n { src: \"exec-approval\", error },\n \"Could not ensure approval config exists - using read-only config\"\n );\n file = loadApprovals();\n }\n\n return resolveApprovalsFromFile({\n file,\n agentId,\n overrides,\n path: getApprovalFilePath(),\n socketPath: expandHome(file.socket?.path ?? getApprovalSocketPath()),\n token: file.socket?.token ?? \"\",\n });\n}\n\n/**\n * Resolve approval configuration from a loaded file\n */\nexport function resolveApprovalsFromFile(params: {\n file: ExecApprovalsFile;\n agentId?: string;\n overrides?: Partial<ExecApprovalsDefaults>;\n path?: string;\n socketPath?: string;\n token?: string;\n}): ExecApprovalsResolved {\n const file = normalizeApprovals(params.file);\n const defaults = file.defaults ?? {};\n const agentKey = params.agentId ?? DEFAULT_AGENT_ID;\n const agent = file.agents?.[agentKey] ?? {};\n const wildcard = file.agents?.[\"*\"] ?? {};\n\n const fallbackSecurity = params.overrides?.security ?? EXEC_APPROVAL_DEFAULTS.security;\n const fallbackAsk = params.overrides?.ask ?? EXEC_APPROVAL_DEFAULTS.ask;\n const fallbackAskFallback = params.overrides?.askFallback ?? EXEC_APPROVAL_DEFAULTS.askFallback;\n const fallbackAutoAllowSkills =\n params.overrides?.autoAllowSkills ?? EXEC_APPROVAL_DEFAULTS.autoAllowSkills;\n\n const resolvedDefaults: Required<ExecApprovalsDefaults> = {\n security: normalizeSecurity(defaults.security, fallbackSecurity),\n ask: normalizeAsk(defaults.ask, fallbackAsk),\n askFallback: normalizeSecurity(\n defaults.askFallback ?? fallbackAskFallback,\n fallbackAskFallback\n ),\n autoAllowSkills: Boolean(defaults.autoAllowSkills ?? fallbackAutoAllowSkills),\n };\n\n const resolvedAgent: Required<ExecApprovalsDefaults> = {\n security: normalizeSecurity(\n agent.security ?? wildcard.security ?? resolvedDefaults.security,\n resolvedDefaults.security\n ),\n ask: normalizeAsk(agent.ask ?? wildcard.ask ?? resolvedDefaults.ask, resolvedDefaults.ask),\n askFallback: normalizeSecurity(\n agent.askFallback ?? wildcard.askFallback ?? resolvedDefaults.askFallback,\n resolvedDefaults.askFallback\n ),\n autoAllowSkills: Boolean(\n agent.autoAllowSkills ?? wildcard.autoAllowSkills ?? resolvedDefaults.autoAllowSkills\n ),\n };\n\n const allowlist = [\n ...(Array.isArray(wildcard.allowlist) ? wildcard.allowlist : []),\n ...(Array.isArray(agent.allowlist) ? agent.allowlist : []),\n ];\n\n return {\n path: params.path ?? getApprovalFilePath(),\n socketPath: expandHome(params.socketPath ?? file.socket?.path ?? getApprovalSocketPath()),\n token: params.token ?? file.socket?.token ?? \"\",\n defaults: resolvedDefaults,\n agent: resolvedAgent,\n allowlist,\n file,\n };\n}\n\n/**\n * Match command against allowlist\n */\nexport function matchAllowlist(\n entries: ExecAllowlistEntry[],\n resolution: CommandResolution | null\n): ExecAllowlistEntry | null {\n if (!entries.length || !resolution?.resolvedPath) {\n return null;\n }\n\n const resolvedPath = resolution.resolvedPath;\n\n for (const entry of entries) {\n const pattern = entry.pattern?.trim();\n if (!pattern) continue;\n\n const hasPath = pattern.includes(\"/\") || pattern.includes(\"\\\\\") || pattern.includes(\"~\");\n if (!hasPath) continue;\n\n if (matchesPattern(pattern, resolvedPath)) {\n return entry;\n }\n }\n\n return null;\n}\n\n/**\n * Check if pattern matches target\n */\nfunction matchesPattern(pattern: string, target: string): boolean {\n const trimmed = pattern.trim();\n if (!trimmed) return false;\n\n const expanded = trimmed.startsWith(\"~\") ? expandHome(trimmed) : trimmed;\n const hasWildcard = /[*?]/.test(expanded);\n\n let normalizedPattern = expanded;\n let normalizedTarget = target;\n\n if (process.platform === \"win32\" && !hasWildcard) {\n normalizedPattern = tryRealpath(expanded) ?? expanded;\n normalizedTarget = tryRealpath(target) ?? target;\n }\n\n normalizedPattern = normalizeMatchTarget(normalizedPattern);\n normalizedTarget = normalizeMatchTarget(normalizedTarget);\n\n const regex = globToRegExp(normalizedPattern);\n return regex.test(normalizedTarget);\n}\n\n/**\n * Normalize path for matching\n */\nfunction normalizeMatchTarget(value: string): string {\n if (process.platform === \"win32\") {\n const stripped = value.replace(/^\\\\\\\\[?.]\\\\/, \"\");\n return stripped.replace(/\\\\/g, \"/\").toLowerCase();\n }\n return value.replace(/\\\\\\\\/g, \"/\").toLowerCase();\n}\n\n/**\n * Try to get realpath (resolve symlinks)\n */\nfunction tryRealpath(value: string): string | null {\n try {\n return fs.realpathSync(value);\n } catch {\n return null;\n }\n}\n\n/**\n * Convert glob pattern to RegExp\n */\nfunction globToRegExp(pattern: string): RegExp {\n let regex = \"^\";\n let i = 0;\n\n while (i < pattern.length) {\n const ch = pattern[i];\n\n if (ch === \"*\") {\n const next = pattern[i + 1];\n if (next === \"*\") {\n regex += \".*\";\n i += 2;\n continue;\n }\n regex += \"[^/]*\";\n i += 1;\n continue;\n }\n\n if (ch === \"?\") {\n regex += \".\";\n i += 1;\n continue;\n }\n\n regex += ch.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n i += 1;\n }\n\n regex += \"$\";\n return 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 approvals: ExecApprovalsFile,\n agentId: string | undefined,\n entry: ExecAllowlistEntry,\n command: string,\n resolvedPath?: string\n): boolean {\n const target = agentId ?? DEFAULT_AGENT_ID;\n const agents = approvals.agents ?? {};\n const existing = agents[target] ?? {};\n const allowlist = Array.isArray(existing.allowlist) ? existing.allowlist : [];\n\n const nextAllowlist = allowlist.map((item) =>\n item.pattern === entry.pattern\n ? {\n ...item,\n id: item.id ?? crypto.randomUUID(),\n lastUsedAt: Date.now(),\n lastUsedCommand: command,\n lastResolvedPath: resolvedPath,\n }\n : item\n );\n\n agents[target] = { ...existing, allowlist: nextAllowlist };\n approvals.agents = agents;\n\n try {\n saveApprovals(approvals);\n return true;\n } catch (error) {\n logger.warn(\n { src: \"exec-approval\", error, pattern: entry.pattern },\n \"Failed to record allowlist usage - continuing without update\"\n );\n return false;\n }\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 approvals: ExecApprovalsFile,\n agentId: string | undefined,\n pattern: string\n): boolean {\n const target = agentId ?? DEFAULT_AGENT_ID;\n const agents = approvals.agents ?? {};\n const existing = agents[target] ?? {};\n const allowlist = Array.isArray(existing.allowlist) ? existing.allowlist : [];\n\n const trimmed = pattern.trim();\n if (!trimmed) {\n logger.warn({ src: \"exec-approval\" }, \"Attempted to add empty pattern to allowlist\");\n return false;\n }\n\n if (allowlist.some((entry) => entry.pattern === trimmed)) {\n logger.debug({ src: \"exec-approval\", pattern: trimmed }, \"Pattern already in allowlist\");\n return false;\n }\n\n allowlist.push({\n id: crypto.randomUUID(),\n pattern: trimmed,\n lastUsedAt: Date.now(),\n });\n\n agents[target] = { ...existing, allowlist };\n approvals.agents = agents;\n\n try {\n saveApprovals(approvals);\n logger.info(\n { src: \"exec-approval\", pattern: trimmed, agentId: target },\n \"Added pattern to allowlist\"\n );\n return true;\n } catch (error) {\n logger.error(\n { src: \"exec-approval\", error, pattern: trimmed },\n \"Failed to save allowlist after adding entry\"\n );\n return false;\n }\n}\n\n/**\n * Get minimum security level\n */\nexport function minSecurity(a: ExecSecurity, b: ExecSecurity): ExecSecurity {\n const order: Record<ExecSecurity, number> = { deny: 0, allowlist: 1, full: 2 };\n return order[a] <= order[b] ? a : b;\n}\n\n/**\n * Get maximum ask level\n */\nexport function maxAsk(a: ExecAsk, b: ExecAsk): ExecAsk {\n const order: Record<ExecAsk, number> = { off: 0, \"on-miss\": 1, always: 2 };\n return order[a] >= order[b] ? a : b;\n}\n",
|
|
22
|
+
"/**\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 /** Security level (deny, allowlist, full) */\n security?: ExecSecurity;\n /** Ask mode (off, on-miss, always) */\n ask?: ExecAsk;\n /** Fallback security when ask is declined */\n askFallback?: ExecSecurity;\n /** Auto-allow commands from skill definitions */\n autoAllowSkills?: boolean;\n}\n\n/**\n * Allowlist entry for permitted commands\n */\nexport interface ExecAllowlistEntry {\n /** Unique identifier */\n id?: string;\n /** Pattern to match (executable path or glob) */\n pattern: string;\n /** Last time this pattern was used */\n lastUsedAt?: number;\n /** Last command that matched this pattern */\n lastUsedCommand?: string;\n /** Last resolved executable path */\n lastResolvedPath?: string;\n}\n\n/**\n * Agent-specific approval configuration\n */\nexport interface ExecApprovalsAgent extends ExecApprovalsDefaults {\n /** Allowlist entries for this agent */\n allowlist?: ExecAllowlistEntry[];\n}\n\n/**\n * Full approval configuration file structure\n */\nexport interface ExecApprovalsFile {\n /** Version number (always 1) */\n version: 1;\n /** Socket configuration for external approval UI */\n socket?: {\n path?: string;\n token?: string;\n };\n /** Default approval settings */\n defaults?: ExecApprovalsDefaults;\n /** Per-agent approval settings */\n agents?: Record<string, ExecApprovalsAgent>;\n}\n\n/**\n * Snapshot of approval configuration file\n */\nexport interface ExecApprovalsSnapshot {\n /** File path */\n path: string;\n /** Whether the file exists */\n exists: boolean;\n /** Raw file content */\n raw: string | null;\n /** Parsed and normalized configuration */\n file: ExecApprovalsFile;\n /** Content hash */\n hash: string;\n}\n\n/**\n * Resolved approval configuration for an agent\n */\nexport interface ExecApprovalsResolved {\n /** File path */\n path: string;\n /** Socket path for external approval UI */\n socketPath: string;\n /** Authentication token */\n token: string;\n /** Resolved default settings */\n defaults: Required<ExecApprovalsDefaults>;\n /** Resolved agent-specific settings */\n agent: Required<ExecApprovalsDefaults>;\n /** Combined allowlist entries */\n allowlist: ExecAllowlistEntry[];\n /** Full configuration file */\n file: ExecApprovalsFile;\n}\n\n/**\n * Command resolution result\n */\nexport interface CommandResolution {\n /** The raw executable from the command */\n rawExecutable: string;\n /** Fully resolved executable path */\n resolvedPath?: string;\n /** Executable name (basename) */\n executableName: string;\n}\n\n/**\n * Command segment from shell parsing\n */\nexport interface ExecCommandSegment {\n /** Raw command text */\n raw: string;\n /** Parsed argument vector */\n argv: string[];\n /** Resolution of the executable */\n resolution: CommandResolution | null;\n}\n\n/**\n * Result of command analysis\n */\nexport interface ExecCommandAnalysis {\n /** Whether analysis succeeded */\n ok: boolean;\n /** Reason for failure (if any) */\n reason?: string;\n /** Parsed command segments */\n segments: ExecCommandSegment[];\n /** Segments grouped by chain operators (&&, ||, ;) */\n chains?: ExecCommandSegment[][];\n}\n\n/**\n * Result of allowlist evaluation\n */\nexport interface ExecAllowlistEvaluation {\n /** Whether all commands are in the allowlist */\n allowlistSatisfied: boolean;\n /** Matching allowlist entries */\n allowlistMatches: ExecAllowlistEntry[];\n}\n\n/**\n * Combined analysis and allowlist evaluation\n */\nexport interface ExecAllowlistAnalysis {\n /** Whether analysis succeeded */\n analysisOk: boolean;\n /** Whether allowlist is satisfied */\n allowlistSatisfied: boolean;\n /** Matching allowlist entries */\n allowlistMatches: ExecAllowlistEntry[];\n /** Parsed command segments */\n segments: 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 /** Unique request ID */\n id: string;\n /** The command to execute */\n command: string;\n /** Working directory */\n cwd?: string;\n /** Execution host */\n host?: ExecHost;\n /** Security level */\n security?: ExecSecurity;\n /** Ask mode */\n ask?: ExecAsk;\n /** Agent ID */\n agentId?: string;\n /** Resolved executable path */\n resolvedPath?: string;\n /** Session key for routing */\n sessionKey?: string;\n /** Room ID where approval is requested */\n roomId: UUID;\n /** Timeout in milliseconds */\n timeoutMs?: number;\n}\n\n/**\n * Result of exec approval\n */\nexport interface ExecApprovalResult {\n /** The decision made */\n decision: ExecApprovalDecision;\n /** Whether approval timed out */\n timedOut: boolean;\n /** Who resolved the approval */\n resolvedBy?: UUID;\n}\n\n/**\n * Configuration for safe binary commands that don't need approval\n */\nexport const DEFAULT_SAFE_BINS = [\n \"jq\",\n \"grep\",\n \"cut\",\n \"sort\",\n \"uniq\",\n \"head\",\n \"tail\",\n \"tr\",\n \"wc\",\n] as const;\n\n/**\n * Default exec approval settings\n */\nexport const EXEC_APPROVAL_DEFAULTS = {\n security: \"deny\" as ExecSecurity,\n ask: \"on-miss\" as ExecAsk,\n askFallback: \"deny\" as ExecSecurity,\n autoAllowSkills: false,\n timeoutMs: 120_000,\n} as const;\n",
|
|
23
|
+
"/**\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 CommandResolution,\n ExecAllowlistAnalysis,\n ExecAllowlistEntry,\n ExecAllowlistEvaluation,\n ExecCommandAnalysis,\n ExecCommandSegment,\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\", \"\\r\", \"(\", \")\"]);\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 \"&\",\n \"|\",\n \"<\",\n \">\",\n \"^\",\n \"(\",\n \")\",\n \"%\",\n \"!\",\n \"\\n\",\n \"\\r\",\n]);\n\n/**\n * Check if next char is a double-quote escape\n */\nfunction isDoubleQuoteEscape(next: string | undefined): next is string {\n return Boolean(next && DOUBLE_QUOTE_ESCAPES.has(next));\n}\n\n/**\n * Check if a file is executable\n */\nfunction isExecutableFile(filePath: string): boolean {\n try {\n const stat = fs.statSync(filePath);\n if (!stat.isFile()) return false;\n if (process.platform !== \"win32\") {\n fs.accessSync(filePath, fs.constants.X_OK);\n }\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Expand home directory\n */\nfunction expandHome(value: string): string {\n if (!value) return value;\n if (value === \"~\") return require(\"node:os\").homedir();\n if (value.startsWith(\"~/\")) return path.join(require(\"node:os\").homedir(), value.slice(2));\n return value;\n}\n\n/**\n * Parse the first token from a command string\n */\nfunction parseFirstToken(command: string): string | null {\n const trimmed = command.trim();\n if (!trimmed) return null;\n\n const first = trimmed[0];\n if (first === '\"' || first === \"'\") {\n const end = trimmed.indexOf(first, 1);\n if (end > 1) return trimmed.slice(1, end);\n return trimmed.slice(1);\n }\n\n const match = /^[^\\s]+/.exec(trimmed);\n return match ? match[0] : null;\n}\n\n/**\n * Resolve executable path from PATH\n */\nfunction resolveExecutablePath(\n rawExecutable: string,\n cwd?: string,\n env?: NodeJS.ProcessEnv\n): string | undefined {\n const expanded = rawExecutable.startsWith(\"~\") ? expandHome(rawExecutable) : rawExecutable;\n\n if (expanded.includes(\"/\") || expanded.includes(\"\\\\\")) {\n if (path.isAbsolute(expanded)) {\n return isExecutableFile(expanded) ? expanded : undefined;\n }\n const base = cwd?.trim() || process.cwd();\n const candidate = path.resolve(base, expanded);\n return isExecutableFile(candidate) ? candidate : undefined;\n }\n\n const envPath = env?.PATH ?? env?.Path ?? process.env.PATH ?? process.env.Path ?? \"\";\n const entries = envPath.split(path.delimiter).filter(Boolean);\n const hasExtension = process.platform === \"win32\" && path.extname(expanded).length > 0;\n\n const extensions =\n process.platform === \"win32\"\n ? hasExtension\n ? [\"\"]\n : (\n env?.PATHEXT ??\n env?.Pathext ??\n process.env.PATHEXT ??\n process.env.Pathext ??\n \".EXE;.CMD;.BAT;.COM\"\n )\n .split(\";\")\n .map((ext) => ext.toLowerCase())\n : [\"\"];\n\n for (const entry of entries) {\n for (const ext of extensions) {\n const candidate = path.join(entry, expanded + ext);\n if (isExecutableFile(candidate)) {\n return candidate;\n }\n }\n }\n\n return undefined;\n}\n\n/**\n * Resolve command to executable info\n */\nexport function resolveCommandResolution(\n command: string,\n cwd?: string,\n env?: NodeJS.ProcessEnv\n): CommandResolution | null {\n const rawExecutable = parseFirstToken(command);\n if (!rawExecutable) return null;\n\n const resolvedPath = resolveExecutablePath(rawExecutable, cwd, env);\n const executableName = resolvedPath ? path.basename(resolvedPath) : rawExecutable;\n\n return { rawExecutable, resolvedPath, executableName };\n}\n\n/**\n * Resolve command from argv\n */\nexport function resolveCommandFromArgv(\n argv: string[],\n cwd?: string,\n env?: NodeJS.ProcessEnv\n): CommandResolution | null {\n const rawExecutable = argv[0]?.trim();\n if (!rawExecutable) return null;\n\n const resolvedPath = resolveExecutablePath(rawExecutable, cwd, env);\n const executableName = resolvedPath ? path.basename(resolvedPath) : rawExecutable;\n\n return { 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 command: string,\n onChar: (ch: string, next: string | undefined, index: number) => IteratorAction\n): { ok: true; parts: string[]; hasSplit: boolean } | { ok: false; reason: string } {\n const parts: string[] = [];\n let buf = \"\";\n let inSingle = false;\n let inDouble = false;\n let escaped = false;\n let hasSplit = false;\n\n const pushPart = () => {\n const trimmed = buf.trim();\n if (trimmed) parts.push(trimmed);\n buf = \"\";\n };\n\n for (let i = 0; i < command.length; i += 1) {\n const ch = command[i];\n const next = command[i + 1];\n\n if (escaped) {\n buf += ch;\n escaped = false;\n continue;\n }\n\n if (!inSingle && !inDouble && ch === \"\\\\\") {\n escaped = true;\n buf += ch;\n continue;\n }\n\n if (inSingle) {\n if (ch === \"'\") inSingle = false;\n buf += ch;\n continue;\n }\n\n if (inDouble) {\n if (ch === \"\\\\\" && isDoubleQuoteEscape(next)) {\n buf += ch;\n buf += next;\n i += 1;\n continue;\n }\n if (ch === \"$\" && next === \"(\") {\n return { ok: false, reason: \"unsupported shell token: $()\" };\n }\n if (ch === \"`\") {\n return { ok: false, reason: \"unsupported shell token: `\" };\n }\n if (ch === \"\\n\" || ch === \"\\r\") {\n return { ok: false, reason: \"unsupported shell token: newline\" };\n }\n if (ch === '\"') inDouble = false;\n buf += ch;\n continue;\n }\n\n if (ch === \"'\") {\n inSingle = true;\n buf += ch;\n continue;\n }\n\n if (ch === '\"') {\n inDouble = true;\n buf += ch;\n continue;\n }\n\n const action = onChar(ch, next, i);\n if (typeof action === \"object\" && \"reject\" in action) {\n return { ok: false, reason: action.reject };\n }\n if (action === \"split\") {\n pushPart();\n hasSplit = true;\n continue;\n }\n if (action === \"skip\") continue;\n buf += ch;\n }\n\n if (escaped || inSingle || inDouble) {\n return { ok: false, reason: \"unterminated shell quote/escape\" };\n }\n\n pushPart();\n return { ok: true, parts, hasSplit };\n}\n\n/**\n * Split command by pipeline operators\n */\nfunction splitShellPipeline(command: string): { ok: boolean; reason?: string; segments: string[] } {\n let emptySegment = false;\n\n const result = iterateQuoteAware(command, (ch, next) => {\n if (ch === \"|\" && next === \"|\") {\n return { reject: \"unsupported shell token: ||\" };\n }\n if (ch === \"|\" && next === \"&\") {\n return { reject: \"unsupported shell token: |&\" };\n }\n if (ch === \"|\") {\n emptySegment = true;\n return \"split\";\n }\n if (ch === \"&\" || ch === \";\") {\n return { reject: `unsupported shell token: ${ch}` };\n }\n if (DISALLOWED_PIPELINE_TOKENS.has(ch)) {\n return { reject: `unsupported shell token: ${ch}` };\n }\n if (ch === \"$\" && next === \"(\") {\n return { reject: \"unsupported shell token: $()\" };\n }\n emptySegment = false;\n return \"include\";\n });\n\n if (!result.ok) {\n return { ok: false, reason: result.reason, segments: [] };\n }\n if (emptySegment || result.parts.length === 0) {\n return {\n ok: false,\n reason: result.parts.length === 0 ? \"empty command\" : \"empty pipeline segment\",\n segments: [],\n };\n }\n\n return { ok: true, segments: result.parts };\n}\n\n/**\n * Tokenize shell segment into argv\n */\nfunction tokenizeShellSegment(segment: string): string[] | null {\n const tokens: string[] = [];\n let buf = \"\";\n let inSingle = false;\n let inDouble = false;\n let escaped = false;\n\n const pushToken = () => {\n if (buf.length > 0) {\n tokens.push(buf);\n buf = \"\";\n }\n };\n\n for (let i = 0; i < segment.length; i += 1) {\n const ch = segment[i];\n\n if (escaped) {\n buf += ch;\n escaped = false;\n continue;\n }\n\n if (!inSingle && !inDouble && ch === \"\\\\\") {\n escaped = true;\n continue;\n }\n\n if (inSingle) {\n if (ch === \"'\") inSingle = false;\n else buf += ch;\n continue;\n }\n\n if (inDouble) {\n const next = segment[i + 1];\n if (ch === \"\\\\\" && isDoubleQuoteEscape(next)) {\n buf += next;\n i += 1;\n continue;\n }\n if (ch === '\"') inDouble = false;\n else buf += ch;\n continue;\n }\n\n if (ch === \"'\") {\n inSingle = true;\n continue;\n }\n if (ch === '\"') {\n inDouble = true;\n continue;\n }\n if (/\\s/.test(ch)) {\n pushToken();\n continue;\n }\n\n buf += ch;\n }\n\n if (escaped || inSingle || inDouble) return null;\n pushToken();\n return tokens;\n}\n\n/**\n * Parse segments from parts\n */\nfunction parseSegmentsFromParts(\n parts: string[],\n cwd?: string,\n env?: NodeJS.ProcessEnv\n): ExecCommandSegment[] | null {\n const segments: ExecCommandSegment[] = [];\n\n for (const raw of parts) {\n const argv = tokenizeShellSegment(raw);\n if (!argv || argv.length === 0) return null;\n\n segments.push({\n raw,\n argv,\n resolution: resolveCommandFromArgv(argv, cwd, env),\n });\n }\n\n return segments;\n}\n\n/**\n * Check if running on Windows\n */\nfunction isWindowsPlatform(platform?: string | null): boolean {\n const normalized = String(platform ?? \"\")\n .trim()\n .toLowerCase();\n return normalized.startsWith(\"win\");\n}\n\n/**\n * Analyze a shell command\n */\nexport function analyzeShellCommand(params: {\n command: string;\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n platform?: string | null;\n}): ExecCommandAnalysis {\n if (isWindowsPlatform(params.platform)) {\n return analyzeWindowsCommand(params);\n }\n\n // Try splitting by chain operators\n const chainParts = splitCommandChain(params.command);\n if (chainParts) {\n const chains: ExecCommandSegment[][] = [];\n const allSegments: ExecCommandSegment[] = [];\n\n for (const part of chainParts) {\n const pipelineSplit = splitShellPipeline(part);\n if (!pipelineSplit.ok) {\n return { ok: false, reason: pipelineSplit.reason, segments: [] };\n }\n\n const segments = parseSegmentsFromParts(pipelineSplit.segments, params.cwd, params.env);\n if (!segments) {\n return { ok: false, reason: \"unable to parse shell segment\", segments: [] };\n }\n\n chains.push(segments);\n allSegments.push(...segments);\n }\n\n return { ok: true, segments: allSegments, chains };\n }\n\n // No chain operators, parse as simple pipeline\n const split = splitShellPipeline(params.command);\n if (!split.ok) {\n return { ok: false, reason: split.reason, segments: [] };\n }\n\n const segments = parseSegmentsFromParts(split.segments, params.cwd, params.env);\n if (!segments) {\n return { ok: false, reason: \"unable to parse shell segment\", segments: [] };\n }\n\n return { ok: true, segments };\n}\n\n/**\n * Analyze Windows command\n */\nfunction analyzeWindowsCommand(params: {\n command: string;\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n}): ExecCommandAnalysis {\n for (const ch of params.command) {\n if (WINDOWS_UNSUPPORTED_TOKENS.has(ch)) {\n const tokenName = ch === \"\\n\" || ch === \"\\r\" ? \"newline\" : ch;\n return {\n ok: false,\n reason: `unsupported windows shell token: ${tokenName}`,\n segments: [],\n };\n }\n }\n\n const argv = tokenizeWindowsSegment(params.command);\n if (!argv || argv.length === 0) {\n return { ok: false, reason: \"unable to parse windows command\", segments: [] };\n }\n\n return {\n ok: true,\n segments: [\n {\n raw: params.command,\n argv,\n resolution: resolveCommandFromArgv(argv, params.cwd, params.env),\n },\n ],\n };\n}\n\n/**\n * Tokenize Windows command segment\n */\nfunction tokenizeWindowsSegment(segment: string): string[] | null {\n const tokens: string[] = [];\n let buf = \"\";\n let inDouble = false;\n\n const pushToken = () => {\n if (buf.length > 0) {\n tokens.push(buf);\n buf = \"\";\n }\n };\n\n for (const ch of segment) {\n if (ch === '\"') {\n inDouble = !inDouble;\n continue;\n }\n if (!inDouble && /\\s/.test(ch)) {\n pushToken();\n continue;\n }\n buf += ch;\n }\n\n if (inDouble) return null;\n pushToken();\n return tokens.length > 0 ? tokens : null;\n}\n\n/**\n * Split command by chain operators (&&, ||, ;)\n */\nfunction splitCommandChain(command: string): string[] | null {\n const parts: string[] = [];\n let buf = \"\";\n let inSingle = false;\n let inDouble = false;\n let escaped = false;\n let foundChain = false;\n let invalidChain = false;\n\n const pushPart = () => {\n const trimmed = buf.trim();\n if (trimmed) {\n parts.push(trimmed);\n buf = \"\";\n return true;\n }\n buf = \"\";\n return false;\n };\n\n for (let i = 0; i < command.length; i += 1) {\n const ch = command[i];\n const next = command[i + 1];\n\n if (escaped) {\n buf += ch;\n escaped = false;\n continue;\n }\n\n if (!inSingle && !inDouble && ch === \"\\\\\") {\n escaped = true;\n buf += ch;\n continue;\n }\n\n if (inSingle) {\n if (ch === \"'\") inSingle = false;\n buf += ch;\n continue;\n }\n\n if (inDouble) {\n if (ch === \"\\\\\" && isDoubleQuoteEscape(next)) {\n buf += ch;\n buf += next;\n i += 1;\n continue;\n }\n if (ch === '\"') inDouble = false;\n buf += ch;\n continue;\n }\n\n if (ch === \"'\") {\n inSingle = true;\n buf += ch;\n continue;\n }\n\n if (ch === '\"') {\n inDouble = true;\n buf += ch;\n continue;\n }\n\n if (ch === \"&\" && next === \"&\") {\n if (!pushPart()) invalidChain = true;\n i += 1;\n foundChain = true;\n continue;\n }\n\n if (ch === \"|\" && next === \"|\") {\n if (!pushPart()) invalidChain = true;\n i += 1;\n foundChain = true;\n continue;\n }\n\n if (ch === \";\") {\n if (!pushPart()) invalidChain = true;\n foundChain = true;\n continue;\n }\n\n buf += ch;\n }\n\n const pushedFinal = pushPart();\n if (!foundChain) return null;\n if (invalidChain || !pushedFinal) return null;\n return parts.length > 0 ? parts : null;\n}\n\n/**\n * Normalize safe bins set\n */\nexport function normalizeSafeBins(entries?: string[]): Set<string> {\n if (!Array.isArray(entries)) return new Set();\n const normalized = entries\n .map((entry) => entry.trim().toLowerCase())\n .filter((entry) => entry.length > 0);\n return new Set(normalized);\n}\n\n/**\n * Resolve safe bins with defaults\n */\nexport function resolveSafeBins(entries?: string[] | null): Set<string> {\n if (entries === undefined) {\n return normalizeSafeBins([...DEFAULT_SAFE_BINS]);\n }\n return normalizeSafeBins(entries ?? []);\n}\n\n/**\n * Check if path-like token\n */\nfunction isPathLikeToken(value: string): boolean {\n const trimmed = value.trim();\n if (!trimmed || trimmed === \"-\") return false;\n if (trimmed.startsWith(\"./\") || trimmed.startsWith(\"../\") || trimmed.startsWith(\"~\")) return true;\n if (trimmed.startsWith(\"/\")) return true;\n return /^[A-Za-z]:[\\\\/]/.test(trimmed);\n}\n\n/**\n * Default file existence check\n */\nfunction defaultFileExists(filePath: string): boolean {\n try {\n return fs.existsSync(filePath);\n } catch {\n return false;\n }\n}\n\n/**\n * Check if command is safe bin usage (no file args)\n */\nexport function isSafeBinUsage(params: {\n argv: string[];\n resolution: CommandResolution | null;\n safeBins: Set<string>;\n cwd?: string;\n fileExists?: (filePath: string) => boolean;\n}): boolean {\n if (params.safeBins.size === 0) return false;\n\n const resolution = params.resolution;\n const execName = resolution?.executableName?.toLowerCase();\n if (!execName) return false;\n\n const matchesSafeBin =\n params.safeBins.has(execName) ||\n (process.platform === \"win32\" && params.safeBins.has(path.parse(execName).name));\n\n if (!matchesSafeBin) return false;\n if (!resolution?.resolvedPath) return false;\n\n const cwd = params.cwd ?? process.cwd();\n const exists = params.fileExists ?? defaultFileExists;\n const argv = params.argv.slice(1);\n\n for (const token of argv) {\n if (!token || token === \"-\") continue;\n\n if (token.startsWith(\"-\")) {\n const eqIndex = token.indexOf(\"=\");\n if (eqIndex > 0) {\n const value = token.slice(eqIndex + 1);\n if (value && (isPathLikeToken(value) || exists(path.resolve(cwd, value)))) {\n return false;\n }\n }\n continue;\n }\n\n if (isPathLikeToken(token)) return false;\n if (exists(path.resolve(cwd, token))) return false;\n }\n\n return true;\n}\n\n/**\n * Resolve allowlist candidate path\n */\nfunction resolveAllowlistCandidatePath(\n resolution: CommandResolution | null,\n cwd?: string\n): string | undefined {\n if (!resolution) return undefined;\n if (resolution.resolvedPath) return resolution.resolvedPath;\n\n const raw = resolution.rawExecutable?.trim();\n if (!raw) return undefined;\n\n const expanded = raw.startsWith(\"~\") ? expandHome(raw) : raw;\n if (!expanded.includes(\"/\") && !expanded.includes(\"\\\\\")) return undefined;\n\n if (path.isAbsolute(expanded)) return expanded;\n\n const base = cwd?.trim() || process.cwd();\n return path.resolve(base, expanded);\n}\n\n/**\n * Evaluate segments against allowlist\n */\nfunction evaluateSegments(\n segments: ExecCommandSegment[],\n params: {\n allowlist: ExecAllowlistEntry[];\n safeBins: Set<string>;\n cwd?: string;\n skillBins?: Set<string>;\n autoAllowSkills?: boolean;\n }\n): { satisfied: boolean; matches: ExecAllowlistEntry[] } {\n const matches: ExecAllowlistEntry[] = [];\n const allowSkills = params.autoAllowSkills === true && (params.skillBins?.size ?? 0) > 0;\n\n const satisfied = segments.every((segment) => {\n const candidatePath = resolveAllowlistCandidatePath(segment.resolution, params.cwd);\n const candidateResolution =\n candidatePath && segment.resolution\n ? { ...segment.resolution, resolvedPath: candidatePath }\n : segment.resolution;\n\n const match = matchAllowlist(params.allowlist, candidateResolution);\n if (match) matches.push(match);\n\n const safe = isSafeBinUsage({\n argv: segment.argv,\n resolution: segment.resolution,\n safeBins: params.safeBins,\n cwd: params.cwd,\n });\n\n const skillAllow =\n allowSkills && segment.resolution?.executableName\n ? params.skillBins?.has(segment.resolution.executableName)\n : false;\n\n return Boolean(match || safe || skillAllow);\n });\n\n return { satisfied, matches };\n}\n\n/**\n * Evaluate command against allowlist\n */\nexport function evaluateExecAllowlist(params: {\n analysis: ExecCommandAnalysis;\n allowlist: ExecAllowlistEntry[];\n safeBins: Set<string>;\n cwd?: string;\n skillBins?: Set<string>;\n autoAllowSkills?: boolean;\n}): ExecAllowlistEvaluation {\n const allowlistMatches: ExecAllowlistEntry[] = [];\n\n if (!params.analysis.ok || params.analysis.segments.length === 0) {\n return { allowlistSatisfied: false, allowlistMatches };\n }\n\n // If analysis contains chains, evaluate each separately\n if (params.analysis.chains) {\n for (const chainSegments of params.analysis.chains) {\n const result = evaluateSegments(chainSegments, {\n allowlist: params.allowlist,\n safeBins: params.safeBins,\n cwd: params.cwd,\n skillBins: params.skillBins,\n autoAllowSkills: params.autoAllowSkills,\n });\n\n if (!result.satisfied) {\n return { allowlistSatisfied: false, allowlistMatches: [] };\n }\n allowlistMatches.push(...result.matches);\n }\n return { allowlistSatisfied: true, allowlistMatches };\n }\n\n // No chains, evaluate all segments together\n const result = evaluateSegments(params.analysis.segments, {\n allowlist: params.allowlist,\n safeBins: params.safeBins,\n cwd: params.cwd,\n skillBins: params.skillBins,\n autoAllowSkills: params.autoAllowSkills,\n });\n\n return { allowlistSatisfied: result.satisfied, allowlistMatches: result.matches };\n}\n\n/**\n * Evaluate shell command for allowlist (combined analysis + evaluation)\n */\nexport function evaluateShellAllowlist(params: {\n command: string;\n allowlist: ExecAllowlistEntry[];\n safeBins: Set<string>;\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n skillBins?: Set<string>;\n autoAllowSkills?: boolean;\n platform?: string | null;\n}): ExecAllowlistAnalysis {\n const chainParts = isWindowsPlatform(params.platform) ? null : splitCommandChain(params.command);\n\n if (!chainParts) {\n const analysis = analyzeShellCommand({\n command: params.command,\n cwd: params.cwd,\n env: params.env,\n platform: params.platform,\n });\n\n if (!analysis.ok) {\n return {\n analysisOk: false,\n allowlistSatisfied: false,\n allowlistMatches: [],\n segments: [],\n };\n }\n\n const evaluation = evaluateExecAllowlist({\n analysis,\n allowlist: params.allowlist,\n safeBins: params.safeBins,\n cwd: params.cwd,\n skillBins: params.skillBins,\n autoAllowSkills: params.autoAllowSkills,\n });\n\n return {\n analysisOk: true,\n allowlistSatisfied: evaluation.allowlistSatisfied,\n allowlistMatches: evaluation.allowlistMatches,\n segments: analysis.segments,\n };\n }\n\n const allowlistMatches: ExecAllowlistEntry[] = [];\n const segments: ExecCommandSegment[] = [];\n\n for (const part of chainParts) {\n const analysis = analyzeShellCommand({\n command: part,\n cwd: params.cwd,\n env: params.env,\n platform: params.platform,\n });\n\n if (!analysis.ok) {\n return {\n analysisOk: false,\n allowlistSatisfied: false,\n allowlistMatches: [],\n segments: [],\n };\n }\n\n segments.push(...analysis.segments);\n\n const evaluation = evaluateExecAllowlist({\n analysis,\n allowlist: params.allowlist,\n safeBins: params.safeBins,\n cwd: params.cwd,\n skillBins: params.skillBins,\n autoAllowSkills: params.autoAllowSkills,\n });\n\n allowlistMatches.push(...evaluation.allowlistMatches);\n\n if (!evaluation.allowlistSatisfied) {\n return {\n analysisOk: true,\n allowlistSatisfied: false,\n allowlistMatches,\n segments,\n };\n }\n }\n\n return {\n analysisOk: true,\n allowlistSatisfied: true,\n allowlistMatches,\n segments,\n };\n}\n\n/**\n * Check if approval is required\n */\nexport function requiresExecApproval(params: {\n ask: \"off\" | \"on-miss\" | \"always\";\n security: \"deny\" | \"allowlist\" | \"full\";\n analysisOk: boolean;\n allowlistSatisfied: boolean;\n}): boolean {\n return (\n params.ask === \"always\" ||\n (params.ask === \"on-miss\" &&\n params.security === \"allowlist\" &&\n (!params.analysisOk || !params.allowlistSatisfied))\n );\n}\n",
|
|
24
|
+
"/**\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 name: string;\n description: string;\n isCancel?: boolean;\n}> = [\n { name: \"allow-once\", description: \"Allow this one time\" },\n { name: \"allow-always\", description: \"Always allow this\" },\n { name: \"deny\", description: \"Deny the request\", isCancel: true },\n];\n\nimport {\n addAllowlistEntry,\n loadApprovals,\n recordAllowlistUse,\n resolveApprovals,\n} from \"./allowlist\";\nimport {\n analyzeShellCommand,\n evaluateShellAllowlist,\n requiresExecApproval,\n resolveSafeBins,\n} from \"./analysis\";\nimport type {\n ExecAllowlistEntry,\n ExecApprovalDecision,\n ExecApprovalRequest,\n ExecApprovalResult,\n ExecApprovalsResolved,\n ExecAsk,\n ExecCommandAnalysis,\n ExecSecurity,\n} from \"./types\";\nimport { EXEC_APPROVAL_DEFAULTS } from \"./types\";\n\n/**\n * Command check result\n */\nexport interface CommandCheckResult {\n /** Whether the command can be executed */\n allowed: boolean;\n /** Whether approval is required */\n requiresApproval: boolean;\n /** Reason for denial (if not allowed and no approval needed) */\n reason?: string;\n /** Approval request (if approval required) */\n request?: ExecApprovalRequest;\n /** Command analysis result */\n analysis: ExecCommandAnalysis;\n /** Matching allowlist entries */\n allowlistMatches: ExecAllowlistEntry[];\n}\n\n/**\n * ExecApprovalService provides command execution approval management.\n */\nexport class ExecApprovalService extends Service {\n static serviceType = \"exec_approval\";\n capabilityDescription =\n \"Manages command execution approvals with allowlist and user confirmation\";\n\n private approvalConfig: ExecApprovalsResolved | null = null;\n private safeBins: Set<string>;\n private skillBins: Set<string>;\n\n constructor(runtime?: IAgentRuntime) {\n super(runtime);\n this.safeBins = resolveSafeBins();\n this.skillBins = new Set();\n }\n\n /**\n * Start the ExecApprovalService\n */\n static async start(runtime: IAgentRuntime): Promise<Service> {\n const service = new ExecApprovalService(runtime);\n\n // Load config - handle errors gracefully to not crash startup\n try {\n service.approvalConfig = resolveApprovals(runtime.agentId);\n } catch (error) {\n logger.error(\n { src: \"service:exec_approval\", error, agentId: runtime.agentId },\n \"Failed to load approval config during startup - using in-memory defaults. \" +\n \"Approvals may not persist. Check file permissions for ~/.eliza/exec-approvals.json\"\n );\n // Use a minimal in-memory config so the service can still function\n service.approvalConfig = {\n path: \"\",\n socketPath: \"\",\n token: \"\",\n defaults: {\n security: \"deny\",\n ask: \"on-miss\",\n askFallback: \"deny\",\n autoAllowSkills: false,\n },\n agent: {\n security: \"deny\",\n ask: \"on-miss\",\n askFallback: \"deny\",\n autoAllowSkills: false,\n },\n allowlist: [],\n file: { version: 1, agents: {} },\n };\n }\n\n logger.info(\n { src: \"service:exec_approval\", agentId: runtime.agentId },\n \"ExecApprovalService started\"\n );\n return service;\n }\n\n /**\n * Stop the ExecApprovalService\n */\n async stop(): Promise<void> {\n logger.debug({ src: \"service:exec_approval\" }, \"ExecApprovalService stopped\");\n }\n\n /**\n * Load/reload configuration\n */\n loadConfig(agentId?: string): ExecApprovalsResolved {\n this.approvalConfig = resolveApprovals(agentId ?? this.runtime?.agentId);\n return this.approvalConfig;\n }\n\n /**\n * Get current configuration\n */\n getConfig(): ExecApprovalsResolved {\n if (!this.approvalConfig) {\n this.approvalConfig = resolveApprovals(this.runtime?.agentId);\n }\n return this.approvalConfig;\n }\n\n /**\n * Set safe binaries that don't need approval\n */\n setSafeBins(bins: string[]): void {\n this.safeBins = resolveSafeBins(bins);\n }\n\n /**\n * Set skill binaries that are auto-allowed\n */\n setSkillBins(bins: string[]): void {\n this.skillBins = new Set(bins.map((b) => b.toLowerCase()));\n }\n\n /**\n * Check if a command is allowed to execute\n */\n async checkCommand(params: {\n command: string;\n cwd?: string;\n roomId: UUID;\n env?: NodeJS.ProcessEnv;\n agentId?: string;\n }): Promise<CommandCheckResult> {\n const config = this.getConfig();\n\n // Analyze the command\n const analysis = analyzeShellCommand({\n command: params.command,\n cwd: params.cwd,\n env: params.env,\n });\n\n if (!analysis.ok) {\n return {\n allowed: false,\n requiresApproval: false,\n reason: analysis.reason ?? \"Command analysis failed\",\n analysis,\n allowlistMatches: [],\n };\n }\n\n // Evaluate against allowlist\n const evaluation = evaluateShellAllowlist({\n command: params.command,\n allowlist: config.allowlist,\n safeBins: this.safeBins,\n cwd: params.cwd,\n env: params.env,\n skillBins: this.skillBins,\n autoAllowSkills: config.agent.autoAllowSkills,\n });\n\n // Check security mode\n const security = config.agent.security;\n const ask = config.agent.ask;\n\n // Full security mode - always allow\n if (security === \"full\") {\n return {\n allowed: true,\n requiresApproval: false,\n analysis,\n allowlistMatches: evaluation.allowlistMatches,\n };\n }\n\n // Deny mode - always deny unless explicitly allowed\n if (security === \"deny\") {\n return {\n allowed: false,\n requiresApproval: false,\n reason: \"Command execution is disabled\",\n analysis,\n allowlistMatches: [],\n };\n }\n\n // Allowlist mode - check if command is in allowlist\n if (evaluation.allowlistSatisfied) {\n // Record usage (best-effort, don't fail command if recording fails)\n let recordingFailed = false;\n for (const match of evaluation.allowlistMatches) {\n const approvals = loadApprovals();\n const recorded = recordAllowlistUse(\n approvals,\n params.agentId ?? this.runtime?.agentId,\n match,\n params.command,\n analysis.segments[0]?.resolution?.resolvedPath\n );\n if (!recorded) {\n recordingFailed = true;\n }\n }\n\n if (recordingFailed) {\n logger.debug(\n { src: \"service:exec_approval\", command: params.command },\n \"Some allowlist usage records failed to save - command will still proceed\"\n );\n }\n\n return {\n allowed: true,\n requiresApproval: false,\n analysis,\n allowlistMatches: evaluation.allowlistMatches,\n };\n }\n\n // Check if we need to ask for approval\n const needsApproval = requiresExecApproval({\n ask,\n security,\n analysisOk: analysis.ok,\n allowlistSatisfied: evaluation.allowlistSatisfied,\n });\n\n if (!needsApproval) {\n // No approval configured, deny based on fallback\n const fallback = config.agent.askFallback;\n if (fallback === \"deny\") {\n return {\n allowed: false,\n requiresApproval: false,\n reason: \"Command not in allowlist\",\n analysis,\n allowlistMatches: [],\n };\n }\n // Fallback is 'full' - allow\n return {\n allowed: true,\n requiresApproval: false,\n analysis,\n allowlistMatches: [],\n };\n }\n\n // Build approval request\n const requestId = crypto.randomUUID();\n const request: ExecApprovalRequest = {\n id: requestId,\n command: params.command,\n cwd: params.cwd,\n security,\n ask,\n agentId: params.agentId ?? this.runtime?.agentId,\n resolvedPath: analysis.segments[0]?.resolution?.resolvedPath,\n roomId: params.roomId,\n timeoutMs: EXEC_APPROVAL_DEFAULTS.timeoutMs,\n };\n\n return {\n allowed: false,\n requiresApproval: true,\n request,\n analysis,\n allowlistMatches: [],\n };\n }\n\n /**\n * Request approval for a command\n */\n async requestApproval(request: ExecApprovalRequest): Promise<ExecApprovalResult> {\n const approvalService = this.runtime?.getService(\"approval\") as ApprovalService | null;\n\n if (!approvalService) {\n logger.warn(\n { src: \"service:exec_approval\" },\n \"ApprovalService not available, denying by default\"\n );\n return {\n decision: \"deny\",\n timedOut: false,\n };\n }\n\n // Build description\n const descriptionLines = [\"**Exec Approval Required**\", \"\", `Command: \\`${request.command}\\``];\n\n if (request.cwd) {\n descriptionLines.push(`CWD: \\`${request.cwd}\\``);\n }\n if (request.resolvedPath) {\n descriptionLines.push(`Executable: \\`${request.resolvedPath}\\``);\n }\n\n const description = descriptionLines.join(\"\\n\");\n\n // Request approval via Eliza's task system\n const result = await approvalService.requestApproval({\n name: \"EXEC_APPROVAL\",\n description,\n roomId: request.roomId,\n options: EXEC_APPROVAL_OPTIONS,\n timeoutMs: request.timeoutMs ?? EXEC_APPROVAL_DEFAULTS.timeoutMs,\n timeoutDefault: \"deny\",\n tags: [\"EXEC\", request.id],\n metadata: {\n execRequest: {\n id: request.id,\n command: request.command,\n cwd: request.cwd,\n security: request.security,\n ask: request.ask,\n agentId: request.agentId,\n resolvedPath: request.resolvedPath,\n },\n },\n });\n\n const decision = mapOptionToDecision(result.selectedOption);\n\n // If allow-always, add to allowlist\n if (decision === \"allow-always\" && request.resolvedPath) {\n await this.addToAllowlist(request.resolvedPath, request.agentId);\n }\n\n return {\n decision,\n timedOut: result.timedOut,\n resolvedBy: result.resolvedBy,\n };\n }\n\n /**\n * Request approval asynchronously (fire and forget with callbacks)\n */\n async requestApprovalAsync(\n request: ExecApprovalRequest,\n callbacks?: {\n onApproved?: (decision: ExecApprovalDecision) => Promise<void>;\n onDenied?: () => Promise<void>;\n onTimeout?: () => Promise<void>;\n }\n ): Promise<UUID> {\n const approvalService = this.runtime?.getService(\"approval\") as ApprovalService | null;\n\n if (!approvalService) {\n logger.warn({ src: \"service:exec_approval\" }, \"ApprovalService not available\");\n if (callbacks?.onDenied) {\n await callbacks.onDenied();\n }\n throw new Error(\"ApprovalService not available\");\n }\n\n const descriptionLines = [\"**Exec Approval Required**\", \"\", `Command: \\`${request.command}\\``];\n\n if (request.cwd) {\n descriptionLines.push(`CWD: \\`${request.cwd}\\``);\n }\n\n const taskId = await approvalService.requestApprovalAsync({\n name: \"EXEC_APPROVAL\",\n description: descriptionLines.join(\"\\n\"),\n roomId: request.roomId,\n options: EXEC_APPROVAL_OPTIONS,\n timeoutMs: request.timeoutMs ?? EXEC_APPROVAL_DEFAULTS.timeoutMs,\n timeoutDefault: \"deny\",\n tags: [\"EXEC\", request.id],\n metadata: {\n execRequest: {\n id: request.id,\n command: request.command,\n cwd: request.cwd,\n security: request.security,\n ask: request.ask,\n agentId: request.agentId,\n resolvedPath: request.resolvedPath,\n },\n },\n onSelect: async (option: string, _task: Task, _rt: IAgentRuntime) => {\n const decision = mapOptionToDecision(option);\n\n // If allow-always, add to allowlist\n if (decision === \"allow-always\" && request.resolvedPath) {\n await this.addToAllowlist(request.resolvedPath, request.agentId);\n }\n\n if (decision === \"allow-once\" || decision === \"allow-always\") {\n if (callbacks?.onApproved) {\n await callbacks.onApproved(decision);\n }\n } else {\n if (callbacks?.onDenied) {\n await callbacks.onDenied();\n }\n }\n },\n onTimeout: async (_task: Task, _rt: IAgentRuntime) => {\n if (callbacks?.onTimeout) {\n await callbacks.onTimeout();\n } else if (callbacks?.onDenied) {\n await callbacks.onDenied();\n }\n },\n });\n\n return taskId;\n }\n\n /**\n * Add a pattern to the allowlist\n * @returns true if pattern was added successfully\n */\n async addToAllowlist(pattern: string, agentId?: string): Promise<boolean> {\n const approvals = loadApprovals();\n const added = addAllowlistEntry(approvals, agentId ?? this.runtime?.agentId, pattern);\n if (added) {\n // Reload config to pick up the new entry\n this.approvalConfig = null;\n }\n return added;\n }\n\n /**\n * Cancel a pending approval\n */\n async cancelApproval(taskId: UUID): Promise<void> {\n const approvalService = this.runtime?.getService(\"approval\") as ApprovalService | null;\n\n if (approvalService) {\n await approvalService.cancelApproval(taskId);\n }\n }\n\n /**\n * Get all pending exec approvals for a room\n */\n async getPendingApprovals(roomId: UUID): Promise<ExecApprovalRequest[]> {\n if (!this.runtime) {\n logger.warn(\n { src: \"service:exec_approval\" },\n \"Cannot get pending approvals - runtime not available\"\n );\n return [];\n }\n\n try {\n const tasks = await this.runtime.getTasks({\n roomId,\n tags: [\"AWAITING_CHOICE\", \"EXEC\"],\n });\n\n if (!tasks) return [];\n\n return tasks\n .filter((t) => t.metadata?.execRequest)\n .map((t) => {\n const execRequest = t.metadata?.execRequest as Record<string, unknown>;\n return {\n id: execRequest.id as string,\n command: execRequest.command as string,\n cwd: execRequest.cwd as string | undefined,\n security: execRequest.security as ExecSecurity | undefined,\n ask: execRequest.ask as ExecAsk | undefined,\n agentId: execRequest.agentId as string | undefined,\n resolvedPath: execRequest.resolvedPath as string | undefined,\n roomId,\n };\n });\n } catch (error) {\n logger.error(\n { src: \"service:exec_approval\", error, roomId },\n \"Failed to get pending approvals\"\n );\n return [];\n }\n }\n}\n\n/**\n * Map approval option to exec decision\n */\nfunction mapOptionToDecision(option: string): ExecApprovalDecision {\n switch (option) {\n case \"allow-once\":\n return \"allow-once\";\n case \"allow-always\":\n return \"allow-always\";\n default:\n return \"deny\";\n }\n}\n\nexport default ExecApprovalService;\n",
|
|
10
25
|
"import {\n addHeader,\n type IAgentRuntime,\n logger,\n type Memory,\n type Provider,\n type 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 name: spec.name,\n description:\n \"Provides recent shell command history, current working directory, and file operations within the restricted environment\",\n position: 99,\n get: async (runtime: IAgentRuntime, message: Memory, _state: State) => {\n const shellService = runtime.getService<ShellService>(\"shell\");\n\n if (!shellService) {\n logger.warn(\"[shellHistoryProvider] Shell service not found\");\n return {\n values: {\n shellHistory: \"Shell service is not available\",\n currentWorkingDirectory: \"N/A\",\n allowedDirectory: \"N/A\",\n },\n text: addHeader(\"# Shell Status\", \"Shell service is not available\"),\n data: { historyCount: 0, cwd: \"N/A\", allowedDir: \"N/A\" },\n };\n }\n\n const conversationId = message.roomId || message.agentId;\n if (!conversationId) {\n return {\n text: \"No conversation ID available\",\n values: { historyCount: 0, cwd: \"N/A\", allowedDir: \"N/A\" },\n data: { historyCount: 0, cwd: \"N/A\", allowedDir: \"N/A\" },\n };\n }\n const history = shellService.getCommandHistory(conversationId, 10);\n const cwd = shellService.getCurrentDirectory(conversationId);\n const allowedDir = shellService.getAllowedDirectory();\n\n let historyText = \"No commands in history.\";\n if (history.length > 0) {\n historyText = history\n .map((entry: CommandHistoryEntry) => {\n let entryStr = `[${new Date(entry.timestamp).toISOString()}] ${entry.workingDirectory}> ${entry.command}`;\n\n if (entry.stdout) {\n if (entry.stdout.length > MAX_OUTPUT_LENGTH) {\n entryStr += `\\n Output: ${entry.stdout.substring(0, TRUNCATE_SEGMENT_LENGTH)}\\n ... [TRUNCATED] ...\\n ${entry.stdout.substring(entry.stdout.length - TRUNCATE_SEGMENT_LENGTH)}`;\n } else {\n entryStr += `\\n Output: ${entry.stdout}`;\n }\n }\n\n if (entry.stderr) {\n if (entry.stderr.length > MAX_OUTPUT_LENGTH) {\n entryStr += `\\n Error: ${entry.stderr.substring(0, TRUNCATE_SEGMENT_LENGTH)}\\n ... [TRUNCATED] ...\\n ${entry.stderr.substring(entry.stderr.length - TRUNCATE_SEGMENT_LENGTH)}`;\n } else {\n entryStr += `\\n Error: ${entry.stderr}`;\n }\n }\n\n entryStr += `\\n Exit Code: ${entry.exitCode}`;\n\n if (entry.fileOperations && entry.fileOperations.length > 0) {\n entryStr += \"\\n File Operations:\";\n entry.fileOperations.forEach((op: FileOperation) => {\n if (op.secondaryTarget) {\n entryStr += `\\n - ${op.type}: ${op.target} → ${op.secondaryTarget}`;\n } else {\n entryStr += `\\n - ${op.type}: ${op.target}`;\n }\n });\n }\n\n return entryStr;\n })\n .join(\"\\n\\n\");\n }\n\n const recentFileOps = history\n .filter(\n (entry: CommandHistoryEntry) => entry.fileOperations && entry.fileOperations.length > 0\n )\n .flatMap((entry: CommandHistoryEntry) => entry.fileOperations ?? [])\n .slice(-5);\n\n let fileOpsText = \"\";\n if (recentFileOps.length > 0) {\n fileOpsText =\n \"\\n\\n\" +\n addHeader(\n \"# Recent File Operations\",\n recentFileOps\n .map((op: FileOperation) => {\n if (op.secondaryTarget) {\n return `- ${op.type}: ${op.target} → ${op.secondaryTarget}`;\n }\n return `- ${op.type}: ${op.target}`;\n })\n .join(\"\\n\")\n );\n }\n\n const text = `Current Directory: ${cwd}\nAllowed Directory: ${allowedDir}\n\n${addHeader(\"# Shell History (Last 10)\", historyText)}${fileOpsText}`;\n\n return {\n values: {\n shellHistory: historyText,\n currentWorkingDirectory: cwd,\n allowedDirectory: allowedDir,\n },\n text,\n data: {\n historyCount: history.length,\n cwd,\n allowedDir,\n },\n };\n },\n};\n\nexport default shellHistoryProvider;\n",
|
|
11
|
-
"import path from \"node:path\";\nimport { type IAgentRuntime, logger, Service } from \"@elizaos/core\";\nimport spawn from \"cross-spawn\";\nimport type {\n CommandHistoryEntry,\n CommandResult,\n FileOperation,\n FileOperationType,\n ShellConfig,\n} from \"../types\";\nimport { isForbiddenCommand, isSafeCommand, loadShellConfig, validatePath } from \"../utils\";\n\nexport class ShellService extends Service {\n public static serviceType = \"shell\";\n private shellConfig: ShellConfig;\n private currentDirectory: string;\n private commandHistory: Map<string, CommandHistoryEntry[]>;\n private maxHistoryPerConversation = 100;\n\n constructor(runtime: IAgentRuntime) {\n super(runtime);\n this.shellConfig = loadShellConfig();\n this.currentDirectory = this.shellConfig.allowedDirectory;\n this.commandHistory = new Map();\n }\n\n static async start(runtime: IAgentRuntime): Promise<ShellService> {\n const instance = new ShellService(runtime);\n logger.info(\"Shell service initialized with history tracking\");\n return instance;\n }\n\n async stop(): Promise<void> {\n logger.info(\"Shell service stopped\");\n }\n\n get capabilityDescription(): string {\n return \"Execute shell commands within a restricted directory with history tracking\";\n }\n\n async executeCommand(command: string, conversationId?: string): Promise<CommandResult> {\n if (!this.shellConfig.enabled) {\n return {\n success: false,\n stdout: \"\",\n stderr: \"Shell plugin is disabled. Set SHELL_ENABLED=true to enable.\",\n exitCode: 1,\n error: \"Shell plugin disabled\",\n executedIn: this.currentDirectory,\n };\n }\n\n if (!command || typeof command !== \"string\") {\n return {\n success: false,\n stdout: \"\",\n stderr: \"Invalid command\",\n exitCode: 1,\n error: \"Command must be a non-empty string\",\n executedIn: this.currentDirectory,\n };\n }\n\n const trimmedCommand = command.trim();\n\n if (!isSafeCommand(trimmedCommand)) {\n return {\n success: false,\n stdout: \"\",\n stderr: \"Command contains forbidden patterns\",\n exitCode: 1,\n error: \"Security policy violation\",\n executedIn: this.currentDirectory,\n };\n }\n\n if (isForbiddenCommand(trimmedCommand, this.shellConfig.forbiddenCommands)) {\n return {\n success: false,\n stdout: \"\",\n stderr: \"Command is forbidden by security policy\",\n exitCode: 1,\n error: \"Forbidden command\",\n executedIn: this.currentDirectory,\n };\n }\n\n if (trimmedCommand.startsWith(\"cd \")) {\n const result = await this.handleCdCommand(trimmedCommand);\n this.addToHistory(conversationId, trimmedCommand, result);\n return result;\n }\n\n const result = await this.runCommand(trimmedCommand);\n\n if (result.success) {\n const fileOps = this.detectFileOperations(trimmedCommand, this.currentDirectory);\n if (fileOps && conversationId) {\n this.addToHistory(conversationId, trimmedCommand, result, fileOps);\n } else {\n this.addToHistory(conversationId, trimmedCommand, result);\n }\n } else {\n this.addToHistory(conversationId, trimmedCommand, result);\n }\n\n return result;\n }\n\n private async handleCdCommand(command: string): Promise<CommandResult> {\n const parts = command.split(/\\s+/);\n if (parts.length < 2) {\n this.currentDirectory = this.shellConfig.allowedDirectory;\n return {\n success: true,\n stdout: `Changed directory to: ${this.currentDirectory}`,\n stderr: \"\",\n exitCode: 0,\n executedIn: this.currentDirectory,\n };\n }\n\n const targetPath = parts.slice(1).join(\" \");\n const validatedPath = validatePath(\n targetPath,\n this.shellConfig.allowedDirectory,\n this.currentDirectory\n );\n\n if (!validatedPath) {\n return {\n success: false,\n stdout: \"\",\n stderr: \"Cannot navigate outside allowed directory\",\n exitCode: 1,\n error: \"Permission denied\",\n executedIn: this.currentDirectory,\n };\n }\n\n this.currentDirectory = validatedPath;\n return {\n success: true,\n stdout: `Changed directory to: ${this.currentDirectory}`,\n stderr: \"\",\n exitCode: 0,\n executedIn: this.currentDirectory,\n };\n }\n\n private async runCommand(command: string): Promise<CommandResult> {\n return new Promise((resolve) => {\n const useShell = command.includes(\">\") || command.includes(\"<\") || command.includes(\"|\");\n\n let cmd: string;\n let args: string[];\n\n if (useShell) {\n cmd = \"sh\";\n args = [\"-c\", command];\n logger.info(`Executing shell command: sh -c \"${command}\" in ${this.currentDirectory}`);\n } else {\n const parts = command.split(/\\s+/);\n cmd = parts[0];\n args = parts.slice(1);\n logger.info(`Executing command: ${cmd} ${args.join(\" \")} in ${this.currentDirectory}`);\n }\n\n let stdout = \"\";\n let stderr = \"\";\n let timedOut = false;\n\n const child = spawn(cmd, args, {\n cwd: this.currentDirectory,\n env: process.env,\n shell: false,\n });\n\n const timeout = setTimeout(() => {\n timedOut = true;\n child.kill(\"SIGTERM\");\n setTimeout(() => {\n if (!child.killed) {\n child.kill(\"SIGKILL\");\n }\n }, 5000);\n }, this.shellConfig.timeout);\n\n if (child.stdout) {\n child.stdout.on(\"data\", (data: Buffer) => {\n stdout += data.toString();\n });\n }\n\n if (child.stderr) {\n child.stderr.on(\"data\", (data: Buffer) => {\n stderr += data.toString();\n });\n }\n\n child.on(\"exit\", (code) => {\n clearTimeout(timeout);\n\n if (timedOut) {\n resolve({\n success: false,\n stdout,\n stderr: `${stderr}\\nCommand timed out`,\n exitCode: code,\n error: \"Command execution timeout\",\n executedIn: this.currentDirectory,\n });\n return;\n }\n\n resolve({\n success: code === 0,\n stdout,\n stderr,\n exitCode: code,\n executedIn: this.currentDirectory,\n });\n });\n\n child.on(\"error\", (err: Error) => {\n clearTimeout(timeout);\n resolve({\n success: false,\n stdout,\n stderr: err.message,\n exitCode: 1,\n error: \"Failed to execute command\",\n executedIn: this.currentDirectory,\n });\n });\n });\n }\n\n private addToHistory(\n conversationId: string | undefined,\n command: string,\n result: CommandResult,\n fileOperations?: FileOperation[]\n ): void {\n if (!conversationId) return;\n\n const historyEntry: CommandHistoryEntry = {\n command,\n stdout: result.stdout,\n stderr: result.stderr,\n exitCode: result.exitCode,\n timestamp: Date.now(),\n workingDirectory: result.executedIn,\n fileOperations,\n };\n\n if (!this.commandHistory.has(conversationId)) {\n this.commandHistory.set(conversationId, []);\n }\n\n const history = this.commandHistory.get(conversationId);\n if (!history) {\n throw new Error(`No history found for conversation ${conversationId}`);\n }\n history.push(historyEntry);\n\n if (history.length > this.maxHistoryPerConversation) {\n history.shift();\n }\n }\n\n private detectFileOperations(command: string, cwd: string): FileOperation[] | undefined {\n const operations: FileOperation[] = [];\n const parts = command.trim().split(/\\s+/);\n const cmd = parts[0].toLowerCase();\n\n if (cmd === \"touch\" && parts.length > 1) {\n operations.push({\n type: \"create\" as FileOperationType,\n target: this.resolvePath(parts[1], cwd),\n });\n } else if (cmd === \"echo\" && command.includes(\">\")) {\n const match = command.match(/>\\s*([^\\s]+)$/);\n if (match) {\n operations.push({\n type: \"write\" as FileOperationType,\n target: this.resolvePath(match[1], cwd),\n });\n }\n } else if (cmd === \"mkdir\" && parts.length > 1) {\n operations.push({\n type: \"mkdir\" as FileOperationType,\n target: this.resolvePath(parts[1], cwd),\n });\n } else if (cmd === \"cat\" && parts.length > 1 && !command.includes(\">\")) {\n operations.push({\n type: \"read\" as FileOperationType,\n target: this.resolvePath(parts[1], cwd),\n });\n } else if (cmd === \"mv\" && parts.length > 2) {\n operations.push({\n type: \"move\" as FileOperationType,\n target: this.resolvePath(parts[1], cwd),\n secondaryTarget: this.resolvePath(parts[2], cwd),\n });\n } else if (cmd === \"cp\" && parts.length > 2) {\n operations.push({\n type: \"copy\" as FileOperationType,\n target: this.resolvePath(parts[1], cwd),\n secondaryTarget: this.resolvePath(parts[2], cwd),\n });\n }\n\n return operations.length > 0 ? operations : undefined;\n }\n\n private resolvePath(filePath: string, cwd: string): string {\n if (path.isAbsolute(filePath)) {\n return filePath;\n }\n return path.join(cwd, filePath);\n }\n\n getCommandHistory(conversationId: string, limit?: number): CommandHistoryEntry[] {\n const history = this.commandHistory.get(conversationId) || [];\n if (limit && limit > 0) {\n return history.slice(-limit);\n }\n return history;\n }\n\n clearCommandHistory(conversationId: string): void {\n this.commandHistory.delete(conversationId);\n logger.info(`Cleared command history for conversation: ${conversationId}`);\n }\n\n getCurrentDirectory(_conversationId?: string): string {\n return this.currentDirectory;\n }\n\n getAllowedDirectory(): string {\n return this.shellConfig.allowedDirectory;\n }\n}\n",
|
|
12
|
-
"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 enabled: z.boolean(),\n allowedDirectory: z.string(),\n timeout: z.number().positive().default(30000),\n forbiddenCommands: z.array(z.string()),\n});\n\nexport const DEFAULT_FORBIDDEN_COMMANDS: readonly string[] = [\n \"rm -rf /\",\n \"rmdir\",\n \"chmod 777\",\n \"chown\",\n \"chgrp\",\n \"shutdown\",\n \"reboot\",\n \"halt\",\n \"poweroff\",\n \"kill -9\",\n \"killall\",\n \"pkill\",\n \"sudo rm -rf\",\n \"su\",\n \"passwd\",\n \"useradd\",\n \"userdel\",\n \"groupadd\",\n \"groupdel\",\n \"format\",\n \"fdisk\",\n \"mkfs\",\n \"dd if=/dev/zero\",\n \"shred\",\n \":(){:|:&};:\",\n] as const;\n\nexport function loadShellConfig(): ShellConfig {\n const
|
|
26
|
+
"/**\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 CommandHistoryEntry,\n CommandResult,\n ExecResult,\n ExecuteOptions,\n FileOperation,\n FileOperationType,\n FinishedSession,\n ProcessActionParams,\n ProcessSession,\n PtyHandle,\n PtySpawn,\n ShellConfig,\n} from \"../types\";\nimport { isForbiddenCommand, isSafeCommand, loadShellConfig, validatePath } from \"../utils\";\nimport {\n buildCursorPositionResponse,\n encodeKeySequence,\n encodePaste,\n stripDsrRequests,\n} from \"../utils/ptyKeys\";\nimport {\n chunkString,\n clampNumber,\n coerceEnv,\n deriveSessionName,\n formatDuration,\n getShellConfig,\n killSession,\n pad,\n readEnvInt,\n resolveWorkdir,\n sanitizeBinaryOutput,\n sliceLogLines,\n truncateMiddle,\n} from \"../utils/shellUtils\";\nimport {\n addSession,\n appendOutput,\n createSessionSlug,\n deleteSession,\n drainSession,\n getFinishedSession,\n getSession,\n listFinishedSessions,\n listRunningSessions,\n markBackgrounded,\n markExited,\n} from \"./processRegistry\";\n\nconst DEFAULT_MAX_OUTPUT = clampNumber(\n readEnvInt(\"SHELL_MAX_OUTPUT_CHARS\"),\n 200_000,\n 1_000,\n 200_000\n);\nconst DEFAULT_PENDING_MAX_OUTPUT = clampNumber(\n readEnvInt(\"SHELL_PENDING_MAX_OUTPUT_CHARS\"),\n 200_000,\n 1_000,\n 200_000\n);\nconst DEFAULT_BACKGROUND_MS = clampNumber(readEnvInt(\"SHELL_BACKGROUND_MS\"), 10_000, 10, 120_000);\nconst DEFAULT_TIMEOUT_SEC = 1800; // 30 minutes\n\nexport class ShellService extends Service {\n public static serviceType = \"shell\";\n private shellConfig: ShellConfig;\n private currentDirectory: string;\n private commandHistory: Map<string, CommandHistoryEntry[]>;\n private maxHistoryPerConversation = 100;\n private scopeKey?: string;\n\n constructor(runtime: IAgentRuntime) {\n super(runtime);\n this.shellConfig = loadShellConfig();\n this.currentDirectory = this.shellConfig.allowedDirectory;\n this.commandHistory = new Map();\n }\n\n static async start(runtime: IAgentRuntime): Promise<ShellService> {\n const instance = new ShellService(runtime);\n logger.info(\"Shell service initialized with PTY, background execution, and history tracking\");\n return instance;\n }\n\n async stop(): Promise<void> {\n // Clean up all running sessions by killing their processes\n const runningSessions = listRunningSessions();\n for (const session of runningSessions) {\n try {\n killSession(session);\n logger.debug(`Killed shell session: ${session.id}`);\n } catch (err) {\n logger.warn(`Failed to kill shell session ${session.id}: ${err}`);\n }\n }\n\n // Clear command history\n this.commandHistory.clear();\n\n logger.info(`Shell service stopped, cleaned up ${runningSessions.length} running sessions`);\n }\n\n get capabilityDescription(): string {\n return \"Execute shell commands with PTY support, background execution, and session management\";\n }\n\n /**\n * Set scope key for session isolation\n */\n setScopeKey(scopeKey: string): void {\n this.scopeKey = scopeKey;\n }\n\n /**\n * Simple command execution (original API for backward compatibility)\n */\n async executeCommand(command: string, conversationId?: string): Promise<CommandResult> {\n if (!command || typeof command !== \"string\") {\n return {\n success: false,\n stdout: \"\",\n stderr: \"Invalid command\",\n exitCode: 1,\n error: \"Command must be a non-empty string\",\n executedIn: this.currentDirectory,\n };\n }\n\n const trimmedCommand = command.trim();\n\n if (!isSafeCommand(trimmedCommand)) {\n return {\n success: false,\n stdout: \"\",\n stderr: \"Command contains forbidden patterns\",\n exitCode: 1,\n error: \"Security policy violation\",\n executedIn: this.currentDirectory,\n };\n }\n\n if (isForbiddenCommand(trimmedCommand, this.shellConfig.forbiddenCommands)) {\n return {\n success: false,\n stdout: \"\",\n stderr: \"Command is forbidden by security policy\",\n exitCode: 1,\n error: \"Forbidden command\",\n executedIn: this.currentDirectory,\n };\n }\n\n if (trimmedCommand.startsWith(\"cd \")) {\n const result = await this.handleCdCommand(trimmedCommand);\n this.addToHistory(conversationId, trimmedCommand, result);\n return result;\n }\n\n const result = await this.runCommandSimple(trimmedCommand);\n\n if (result.success) {\n const fileOps = this.detectFileOperations(trimmedCommand, this.currentDirectory);\n if (fileOps && conversationId) {\n this.addToHistory(conversationId, trimmedCommand, result, fileOps);\n } else {\n this.addToHistory(conversationId, trimmedCommand, result);\n }\n } else {\n this.addToHistory(conversationId, trimmedCommand, result);\n }\n\n return result;\n }\n\n /**\n * Enhanced command execution with PTY, background support, and session management\n * This is the main execution method that supports all advanced features\n */\n async exec(command: string, options: ExecuteOptions = {}): Promise<ExecResult> {\n if (!command || typeof command !== \"string\") {\n return {\n status: \"failed\",\n exitCode: 1,\n durationMs: 0,\n aggregated: \"Invalid command\",\n reason: \"Command must be a non-empty string\",\n };\n }\n\n const trimmedCommand = command.trim();\n\n if (!isSafeCommand(trimmedCommand)) {\n return {\n status: \"failed\",\n exitCode: 1,\n durationMs: 0,\n aggregated: \"Command contains forbidden patterns\",\n reason: \"Security policy violation\",\n };\n }\n\n if (isForbiddenCommand(trimmedCommand, this.shellConfig.forbiddenCommands)) {\n return {\n status: \"failed\",\n exitCode: 1,\n durationMs: 0,\n aggregated: \"Command is forbidden by security policy\",\n reason: \"Forbidden command\",\n };\n }\n\n const warnings: string[] = [];\n const maxOutput = this.shellConfig.maxOutputChars ?? DEFAULT_MAX_OUTPUT;\n const pendingMaxOutput = this.shellConfig.pendingMaxOutputChars ?? DEFAULT_PENDING_MAX_OUTPUT;\n const defaultBackgroundMs = this.shellConfig.defaultBackgroundMs ?? DEFAULT_BACKGROUND_MS;\n const allowBackground = this.shellConfig.allowBackground ?? true;\n\n // Resolve background/yield settings\n const backgroundRequested = options.background === true;\n const yieldRequested = typeof options.yieldMs === \"number\";\n if (!allowBackground && (backgroundRequested || yieldRequested)) {\n warnings.push(\"Warning: background execution is disabled; running synchronously.\");\n }\n const yieldWindow = allowBackground\n ? backgroundRequested\n ? 0\n : clampNumber(options.yieldMs ?? defaultBackgroundMs, defaultBackgroundMs, 10, 120_000)\n : null;\n\n // Resolve workdir\n const rawWorkdir = options.workdir?.trim() || this.currentDirectory || process.cwd();\n const workdir = resolveWorkdir(rawWorkdir, warnings);\n\n // Build environment\n const baseEnv = coerceEnv(process.env);\n const mergedEnv = options.env ? { ...baseEnv, ...options.env } : baseEnv;\n\n const timeoutSec =\n typeof options.timeout === \"number\" && options.timeout > 0\n ? options.timeout\n : DEFAULT_TIMEOUT_SEC;\n const usePty = options.pty === true;\n const notifyOnExit = options.notifyOnExit !== false;\n\n // Run the process\n const handle = await this.runExecProcess({\n command: trimmedCommand,\n workdir,\n env: mergedEnv,\n usePty,\n warnings,\n maxOutput,\n pendingMaxOutput,\n notifyOnExit,\n scopeKey: options.scopeKey ?? this.scopeKey,\n sessionKey: options.sessionKey,\n timeoutSec,\n onUpdate: options.onUpdate,\n });\n\n // Handle background/yield\n if (allowBackground && yieldWindow !== null) {\n if (yieldWindow === 0) {\n markBackgrounded(handle.session);\n return {\n status: \"running\",\n sessionId: handle.session.id,\n pid: handle.session.pid,\n startedAt: handle.startedAt,\n cwd: handle.session.cwd,\n tail: handle.session.tail,\n };\n }\n\n // Wait for yieldWindow or completion\n const raceResult = await Promise.race([\n handle.promise,\n new Promise<\"yield\">((resolve) => setTimeout(() => resolve(\"yield\"), yieldWindow)),\n ]);\n\n if (raceResult === \"yield\" && !handle.session.exited) {\n markBackgrounded(handle.session);\n const warningText = warnings.length ? `${warnings.join(\"\\n\")}\\n\\n` : \"\";\n return {\n status: \"running\",\n sessionId: handle.session.id,\n pid: handle.session.pid,\n startedAt: handle.startedAt,\n cwd: handle.session.cwd,\n tail: `${warningText}Command still running (session ${handle.session.id}, pid ${handle.session.pid ?? \"n/a\"}).`,\n };\n }\n\n // Process completed within yield window\n const outcome = raceResult === \"yield\" ? await handle.promise : raceResult;\n const warningText = warnings.length ? `${warnings.join(\"\\n\")}\\n\\n` : \"\";\n\n if (outcome.status === \"failed\") {\n return {\n status: \"failed\",\n exitCode: outcome.exitCode ?? null,\n durationMs: outcome.durationMs,\n aggregated: outcome.aggregated,\n cwd: workdir,\n timedOut: outcome.timedOut,\n reason: `${warningText}${outcome.reason ?? \"Command failed.\"}`,\n };\n }\n\n return {\n status: \"completed\",\n exitCode: outcome.exitCode ?? 0,\n durationMs: outcome.durationMs,\n aggregated: `${warningText}${outcome.aggregated || \"(no output)\"}`,\n cwd: workdir,\n };\n }\n\n // Synchronous execution (no yield/background)\n const outcome = await handle.promise;\n const warningText = warnings.length ? `${warnings.join(\"\\n\")}\\n\\n` : \"\";\n\n if (outcome.status === \"failed\") {\n return {\n status: \"failed\",\n exitCode: outcome.exitCode ?? null,\n durationMs: outcome.durationMs,\n aggregated: outcome.aggregated,\n cwd: workdir,\n timedOut: outcome.timedOut,\n reason: `${warningText}${outcome.reason ?? \"Command failed.\"}`,\n };\n }\n\n return {\n status: \"completed\",\n exitCode: outcome.exitCode ?? 0,\n durationMs: outcome.durationMs,\n aggregated: `${warningText}${outcome.aggregated || \"(no output)\"}`,\n cwd: workdir,\n };\n }\n\n /**\n * Process management action handler\n * Supports: list, poll, log, write, send-keys, submit, paste, kill, clear, remove\n */\n async processAction(params: ProcessActionParams): Promise<{\n success: boolean;\n message: string;\n data?: Record<string, unknown>;\n }> {\n const scopeKey = this.scopeKey;\n const isInScope = (session?: { scopeKey?: string } | null) =>\n !scopeKey || session?.scopeKey === scopeKey;\n\n if (params.action === \"list\") {\n const running = listRunningSessions()\n .filter((s) => isInScope(s))\n .map((s) => ({\n sessionId: s.id,\n status: \"running\",\n pid: s.pid ?? undefined,\n startedAt: s.startedAt,\n runtimeMs: Date.now() - s.startedAt,\n cwd: s.cwd,\n command: s.command,\n name: deriveSessionName(s.command),\n tail: s.tail,\n truncated: s.truncated,\n }));\n const finished = listFinishedSessions()\n .filter((s) => isInScope(s))\n .map((s) => ({\n sessionId: s.id,\n status: s.status,\n startedAt: s.startedAt,\n endedAt: s.endedAt,\n runtimeMs: s.endedAt - s.startedAt,\n cwd: s.cwd,\n command: s.command,\n name: deriveSessionName(s.command),\n tail: s.tail,\n truncated: s.truncated,\n exitCode: s.exitCode ?? undefined,\n exitSignal: s.exitSignal ?? undefined,\n }));\n const sessions = [...running, ...finished]\n .slice()\n .sort(\n (\n a: (typeof running)[number] | (typeof finished)[number],\n b: (typeof running)[number] | (typeof finished)[number]\n ) => b.startedAt - a.startedAt\n );\n const lines = sessions.map((s: (typeof sessions)[number]) => {\n const label = s.name ? truncateMiddle(s.name, 80) : truncateMiddle(s.command, 120);\n return `${s.sessionId} ${pad(s.status, 9)} ${formatDuration(s.runtimeMs)} :: ${label}`;\n });\n return {\n success: true,\n message: lines.join(\"\\n\") || \"No running or recent sessions.\",\n data: { sessions },\n };\n }\n\n if (!params.sessionId) {\n return {\n success: false,\n message: \"sessionId is required for this action.\",\n };\n }\n\n const session = getSession(params.sessionId);\n const finished = getFinishedSession(params.sessionId);\n const scopedSession = isInScope(session) ? session : undefined;\n const scopedFinished = isInScope(finished) ? finished : undefined;\n\n switch (params.action) {\n case \"poll\": {\n if (!scopedSession) {\n if (scopedFinished) {\n return {\n success: true,\n message:\n (scopedFinished.tail ||\n `(no output recorded${scopedFinished.truncated ? \" — truncated to cap\" : \"\"})`) +\n `\\n\\nProcess exited with ${\n scopedFinished.exitSignal\n ? `signal ${scopedFinished.exitSignal}`\n : `code ${scopedFinished.exitCode ?? 0}`\n }.`,\n data: {\n status: scopedFinished.status === \"completed\" ? \"completed\" : \"failed\",\n sessionId: params.sessionId,\n exitCode: scopedFinished.exitCode ?? undefined,\n aggregated: scopedFinished.aggregated,\n name: deriveSessionName(scopedFinished.command),\n },\n };\n }\n return {\n success: false,\n message: `No session found for ${params.sessionId}`,\n };\n }\n if (!scopedSession.backgrounded) {\n return {\n success: false,\n message: `Session ${params.sessionId} is not backgrounded.`,\n };\n }\n const { stdout, stderr } = drainSession(scopedSession);\n const exited = scopedSession.exited;\n const exitCode = scopedSession.exitCode ?? 0;\n const exitSignal = scopedSession.exitSignal ?? undefined;\n if (exited) {\n const status = exitCode === 0 && exitSignal == null ? \"completed\" : \"failed\";\n markExited(\n scopedSession,\n scopedSession.exitCode ?? null,\n scopedSession.exitSignal ?? null,\n status\n );\n }\n const status = exited\n ? exitCode === 0 && exitSignal == null\n ? \"completed\"\n : \"failed\"\n : \"running\";\n const output = [stdout.trimEnd(), stderr.trimEnd()].filter(Boolean).join(\"\\n\").trim();\n return {\n success: true,\n message:\n (output || \"(no new output)\") +\n (exited\n ? `\\n\\nProcess exited with ${\n exitSignal ? `signal ${exitSignal}` : `code ${exitCode}`\n }.`\n : \"\\n\\nProcess still running.\"),\n data: {\n status,\n sessionId: params.sessionId,\n exitCode: exited ? exitCode : undefined,\n aggregated: scopedSession.aggregated,\n name: deriveSessionName(scopedSession.command),\n },\n };\n }\n\n case \"log\": {\n if (scopedSession) {\n if (!scopedSession.backgrounded) {\n return {\n success: false,\n message: `Session ${params.sessionId} is not backgrounded.`,\n };\n }\n const { slice, totalLines, totalChars } = sliceLogLines(\n scopedSession.aggregated,\n params.offset,\n params.limit\n );\n return {\n success: true,\n message: slice || \"(no output yet)\",\n data: {\n status: scopedSession.exited ? \"completed\" : \"running\",\n sessionId: params.sessionId,\n totalLines,\n totalChars,\n truncated: scopedSession.truncated,\n name: deriveSessionName(scopedSession.command),\n },\n };\n }\n if (scopedFinished) {\n const { slice, totalLines, totalChars } = sliceLogLines(\n scopedFinished.aggregated,\n params.offset,\n params.limit\n );\n const status = scopedFinished.status === \"completed\" ? \"completed\" : \"failed\";\n return {\n success: true,\n message: slice || \"(no output recorded)\",\n data: {\n status,\n sessionId: params.sessionId,\n totalLines,\n totalChars,\n truncated: scopedFinished.truncated,\n exitCode: scopedFinished.exitCode ?? undefined,\n exitSignal: scopedFinished.exitSignal ?? undefined,\n name: deriveSessionName(scopedFinished.command),\n },\n };\n }\n return {\n success: false,\n message: `No session found for ${params.sessionId}`,\n };\n }\n\n case \"write\": {\n if (!scopedSession) {\n return {\n success: false,\n message: `No active session found for ${params.sessionId}`,\n };\n }\n if (!scopedSession.backgrounded) {\n return {\n success: false,\n message: `Session ${params.sessionId} is not backgrounded.`,\n };\n }\n const stdin = scopedSession.stdin ?? scopedSession.child?.stdin;\n if (!stdin || stdin.destroyed) {\n return {\n success: false,\n message: `Session ${params.sessionId} stdin is not writable.`,\n };\n }\n await new Promise<void>((resolve, reject) => {\n stdin.write(params.data ?? \"\", (err) => {\n if (err) reject(err);\n else resolve();\n });\n });\n if (params.eof) {\n stdin.end();\n }\n return {\n success: true,\n message: `Wrote ${(params.data ?? \"\").length} bytes to session ${params.sessionId}${\n params.eof ? \" (stdin closed)\" : \"\"\n }.`,\n data: {\n sessionId: params.sessionId,\n name: deriveSessionName(scopedSession.command),\n },\n };\n }\n\n case \"send-keys\": {\n if (!scopedSession) {\n return {\n success: false,\n message: `No active session found for ${params.sessionId}`,\n };\n }\n if (!scopedSession.backgrounded) {\n return {\n success: false,\n message: `Session ${params.sessionId} is not backgrounded.`,\n };\n }\n const stdin = scopedSession.stdin ?? scopedSession.child?.stdin;\n if (!stdin || stdin.destroyed) {\n return {\n success: false,\n message: `Session ${params.sessionId} stdin is not writable.`,\n };\n }\n const { data, warnings } = encodeKeySequence({\n keys: params.keys,\n hex: params.hex,\n literal: params.literal,\n });\n if (!data) {\n return { success: false, message: \"No key data provided.\" };\n }\n await new Promise<void>((resolve, reject) => {\n stdin.write(data, (err) => {\n if (err) reject(err);\n else resolve();\n });\n });\n return {\n success: true,\n message:\n `Sent ${data.length} bytes to session ${params.sessionId}.` +\n (warnings.length ? `\\nWarnings:\\n- ${warnings.join(\"\\n- \")}` : \"\"),\n data: {\n sessionId: params.sessionId,\n name: deriveSessionName(scopedSession.command),\n },\n };\n }\n\n case \"submit\": {\n if (!scopedSession) {\n return {\n success: false,\n message: `No active session found for ${params.sessionId}`,\n };\n }\n if (!scopedSession.backgrounded) {\n return {\n success: false,\n message: `Session ${params.sessionId} is not backgrounded.`,\n };\n }\n const stdin = scopedSession.stdin ?? scopedSession.child?.stdin;\n if (!stdin || stdin.destroyed) {\n return {\n success: false,\n message: `Session ${params.sessionId} stdin is not writable.`,\n };\n }\n await new Promise<void>((resolve, reject) => {\n stdin.write(\"\\r\", (err) => {\n if (err) reject(err);\n else resolve();\n });\n });\n return {\n success: true,\n message: `Submitted session ${params.sessionId} (sent CR).`,\n data: {\n sessionId: params.sessionId,\n name: deriveSessionName(scopedSession.command),\n },\n };\n }\n\n case \"paste\": {\n if (!scopedSession) {\n return {\n success: false,\n message: `No active session found for ${params.sessionId}`,\n };\n }\n if (!scopedSession.backgrounded) {\n return {\n success: false,\n message: `Session ${params.sessionId} is not backgrounded.`,\n };\n }\n const stdin = scopedSession.stdin ?? scopedSession.child?.stdin;\n if (!stdin || stdin.destroyed) {\n return {\n success: false,\n message: `Session ${params.sessionId} stdin is not writable.`,\n };\n }\n const payload = encodePaste(params.text ?? \"\", params.bracketed !== false);\n if (!payload) {\n return { success: false, message: \"No paste text provided.\" };\n }\n await new Promise<void>((resolve, reject) => {\n stdin.write(payload, (err) => {\n if (err) reject(err);\n else resolve();\n });\n });\n return {\n success: true,\n message: `Pasted ${params.text?.length ?? 0} chars to session ${params.sessionId}.`,\n data: {\n sessionId: params.sessionId,\n name: deriveSessionName(scopedSession.command),\n },\n };\n }\n\n case \"kill\": {\n if (!scopedSession) {\n return {\n success: false,\n message: `No active session found for ${params.sessionId}`,\n };\n }\n if (!scopedSession.backgrounded) {\n return {\n success: false,\n message: `Session ${params.sessionId} is not backgrounded.`,\n };\n }\n killSession(scopedSession);\n markExited(scopedSession, null, \"SIGKILL\", \"failed\");\n return {\n success: true,\n message: `Killed session ${params.sessionId}.`,\n data: { name: deriveSessionName(scopedSession.command) },\n };\n }\n\n case \"clear\": {\n if (scopedFinished) {\n deleteSession(params.sessionId);\n return {\n success: true,\n message: `Cleared session ${params.sessionId}.`,\n };\n }\n return {\n success: false,\n message: `No finished session found for ${params.sessionId}`,\n };\n }\n\n case \"remove\": {\n if (scopedSession) {\n killSession(scopedSession);\n markExited(scopedSession, null, \"SIGKILL\", \"failed\");\n return {\n success: true,\n message: `Removed session ${params.sessionId}.`,\n data: { name: deriveSessionName(scopedSession.command) },\n };\n }\n if (scopedFinished) {\n deleteSession(params.sessionId);\n return {\n success: true,\n message: `Removed session ${params.sessionId}.`,\n };\n }\n return {\n success: false,\n message: `No session found for ${params.sessionId}`,\n };\n }\n }\n\n return {\n success: false,\n message: `Unknown action ${params.action as string}`,\n };\n }\n\n // ===== Public Service Methods for External Use =====\n\n /**\n * List all running sessions\n */\n listRunningSessions(): ProcessSession[] {\n const scopeKey = this.scopeKey;\n return listRunningSessions().filter((s) => !scopeKey || s.scopeKey === scopeKey);\n }\n\n /**\n * List all finished sessions\n */\n listFinishedSessions(): FinishedSession[] {\n const scopeKey = this.scopeKey;\n return listFinishedSessions().filter((s) => !scopeKey || s.scopeKey === scopeKey);\n }\n\n /**\n * Get a specific session by ID\n */\n getSession(id: string): ProcessSession | undefined {\n const session = getSession(id);\n if (!session) return undefined;\n if (this.scopeKey && session.scopeKey !== this.scopeKey) return undefined;\n return session;\n }\n\n /**\n * Get a specific finished session by ID\n */\n getFinishedSession(id: string): FinishedSession | undefined {\n const session = getFinishedSession(id);\n if (!session) return undefined;\n if (this.scopeKey && session.scopeKey !== this.scopeKey) return undefined;\n return session;\n }\n\n /**\n * Kill a session by ID\n */\n killSessionById(id: string): boolean {\n const session = this.getSession(id);\n if (!session) return false;\n killSession(session);\n markExited(session, null, \"SIGKILL\", \"killed\");\n return true;\n }\n\n /**\n * Get command history for a conversation\n */\n getCommandHistory(conversationId: string, limit?: number): CommandHistoryEntry[] {\n const history = this.commandHistory.get(conversationId) || [];\n if (limit && limit > 0) {\n return history.slice(-limit);\n }\n return history;\n }\n\n /**\n * Clear command history for a conversation\n */\n clearCommandHistory(conversationId: string): void {\n this.commandHistory.delete(conversationId);\n logger.info(`Cleared command history for conversation: ${conversationId}`);\n }\n\n /**\n * Get current working directory\n */\n getCurrentDirectory(_conversationId?: string): string {\n return this.currentDirectory;\n }\n\n /**\n * Set current working directory\n */\n setCurrentDirectory(directory: string): boolean {\n const validatedPath = validatePath(\n directory,\n this.shellConfig.allowedDirectory,\n this.currentDirectory\n );\n if (!validatedPath) {\n return false;\n }\n this.currentDirectory = validatedPath;\n return true;\n }\n\n /**\n * Get allowed directory\n */\n getAllowedDirectory(): string {\n return this.shellConfig.allowedDirectory;\n }\n\n /**\n * Get shell configuration\n */\n getShellConfig(): ShellConfig {\n return { ...this.shellConfig };\n }\n\n // ===== Private Methods =====\n\n private async handleCdCommand(command: string): Promise<CommandResult> {\n const parts = command.split(/\\s+/);\n if (parts.length < 2) {\n this.currentDirectory = this.shellConfig.allowedDirectory;\n return {\n success: true,\n stdout: `Changed directory to: ${this.currentDirectory}`,\n stderr: \"\",\n exitCode: 0,\n executedIn: this.currentDirectory,\n };\n }\n\n const targetPath = parts.slice(1).join(\" \");\n const validatedPath = validatePath(\n targetPath,\n this.shellConfig.allowedDirectory,\n this.currentDirectory\n );\n\n if (!validatedPath) {\n return {\n success: false,\n stdout: \"\",\n stderr: \"Cannot navigate outside allowed directory\",\n exitCode: 1,\n error: \"Permission denied\",\n executedIn: this.currentDirectory,\n };\n }\n\n this.currentDirectory = validatedPath;\n return {\n success: true,\n stdout: `Changed directory to: ${this.currentDirectory}`,\n stderr: \"\",\n exitCode: 0,\n executedIn: this.currentDirectory,\n };\n }\n\n private async runCommandSimple(command: string): Promise<CommandResult> {\n return new Promise((resolve) => {\n const useShell = command.includes(\">\") || command.includes(\"<\") || command.includes(\"|\");\n\n let cmd: string;\n let args: string[];\n\n if (useShell) {\n cmd = \"sh\";\n args = [\"-c\", command];\n logger.info(`Executing shell command: sh -c \"${command}\" in ${this.currentDirectory}`);\n } else {\n const parts = command.split(/\\s+/);\n cmd = parts[0];\n args = parts.slice(1);\n logger.info(`Executing command: ${cmd} ${args.join(\" \")} in ${this.currentDirectory}`);\n }\n\n let stdout = \"\";\n let stderr = \"\";\n let timedOut = false;\n\n const child = spawn(cmd, args, {\n cwd: this.currentDirectory,\n env: process.env,\n shell: false,\n });\n\n const timeout = setTimeout(() => {\n timedOut = true;\n child.kill(\"SIGTERM\");\n setTimeout(() => {\n if (!child.killed) {\n child.kill(\"SIGKILL\");\n }\n }, 5000);\n }, this.shellConfig.timeout);\n\n if (child.stdout) {\n child.stdout.on(\"data\", (data: Buffer) => {\n stdout += data.toString();\n });\n }\n\n if (child.stderr) {\n child.stderr.on(\"data\", (data: Buffer) => {\n stderr += data.toString();\n });\n }\n\n child.on(\"exit\", (code) => {\n clearTimeout(timeout);\n\n if (timedOut) {\n resolve({\n success: false,\n stdout,\n stderr: `${stderr}\\nCommand timed out`,\n exitCode: code,\n error: \"Command execution timeout\",\n executedIn: this.currentDirectory,\n });\n return;\n }\n\n resolve({\n success: code === 0,\n stdout,\n stderr,\n exitCode: code,\n executedIn: this.currentDirectory,\n });\n });\n\n child.on(\"error\", (err: Error) => {\n clearTimeout(timeout);\n resolve({\n success: false,\n stdout,\n stderr: err.message,\n exitCode: 1,\n error: \"Failed to execute command\",\n executedIn: this.currentDirectory,\n });\n });\n });\n }\n\n private async runExecProcess(opts: {\n command: string;\n workdir: string;\n env: Record<string, string>;\n usePty: boolean;\n warnings: string[];\n maxOutput: number;\n pendingMaxOutput: number;\n notifyOnExit: boolean;\n scopeKey?: string;\n sessionKey?: string;\n timeoutSec: number;\n onUpdate?: (session: ProcessSession) => void;\n }): Promise<{\n session: ProcessSession;\n startedAt: number;\n promise: Promise<{\n status: \"completed\" | \"failed\";\n exitCode: number | null;\n exitSignal: NodeJS.Signals | number | null;\n durationMs: number;\n aggregated: string;\n timedOut: boolean;\n reason?: string;\n }>;\n kill: () => void;\n }> {\n const startedAt = Date.now();\n const sessionId = createSessionSlug();\n let child: ChildProcessWithoutNullStreams | null = null;\n let pty: PtyHandle | null = null;\n let stdin: ProcessSession[\"stdin\"] | undefined;\n\n if (opts.usePty) {\n const { shell, args: shellArgs } = getShellConfig();\n try {\n const ptyModule = (await import(\"@lydell/node-pty\")) as {\n spawn?: PtySpawn;\n default?: { spawn?: PtySpawn };\n };\n const spawnPty = ptyModule.spawn ?? ptyModule.default?.spawn;\n if (!spawnPty) {\n throw new Error(\"PTY support is unavailable (node-pty spawn not found).\");\n }\n pty = spawnPty(shell, [...shellArgs, opts.command], {\n cwd: opts.workdir,\n env: opts.env,\n name: process.env.TERM ?? \"xterm-256color\",\n cols: 120,\n rows: 30,\n });\n stdin = {\n destroyed: false,\n write: (data, cb) => {\n try {\n pty?.write(data);\n cb?.(null);\n } catch (err) {\n cb?.(err as Error);\n }\n },\n end: () => {\n try {\n const eof = process.platform === \"win32\" ? \"\\x1a\" : \"\\x04\";\n pty?.write(eof);\n } catch {\n // ignore EOF errors\n }\n },\n };\n } catch (err) {\n const errText = String(err);\n const warning = `Warning: PTY spawn failed (${errText}); retrying without PTY.`;\n logger.warn(`exec: PTY spawn failed (${errText}); retrying without PTY.`);\n opts.warnings.push(warning);\n // Fall through to non-PTY execution\n }\n }\n\n if (!pty) {\n const { shell, args: shellArgs } = getShellConfig();\n const proc = spawn(shell, [...shellArgs, opts.command], {\n cwd: opts.workdir,\n env: opts.env,\n detached: process.platform !== \"win32\",\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n windowsHide: true,\n }) as ChildProcessWithoutNullStreams;\n child = proc;\n stdin = child.stdin;\n }\n\n const session: ProcessSession = {\n id: sessionId,\n command: opts.command,\n scopeKey: opts.scopeKey,\n sessionKey: opts.sessionKey,\n notifyOnExit: opts.notifyOnExit,\n exitNotified: false,\n child: child ?? undefined,\n stdin,\n pid: child?.pid ?? pty?.pid,\n startedAt,\n cwd: opts.workdir,\n maxOutputChars: opts.maxOutput,\n pendingMaxOutputChars: opts.pendingMaxOutput,\n totalOutputChars: 0,\n pendingStdout: [],\n pendingStderr: [],\n pendingStdoutChars: 0,\n pendingStderrChars: 0,\n aggregated: \"\",\n tail: \"\",\n exited: false,\n exitCode: undefined,\n exitSignal: undefined,\n truncated: false,\n backgrounded: false,\n };\n addSession(session);\n\n let settled = false;\n let timeoutTimer: NodeJS.Timeout | null = null;\n let timeoutFinalizeTimer: NodeJS.Timeout | null = null;\n let timedOut = false;\n const timeoutFinalizeMs = 1000;\n let resolveFn:\n | ((outcome: {\n status: \"completed\" | \"failed\";\n exitCode: number | null;\n exitSignal: NodeJS.Signals | number | null;\n durationMs: number;\n aggregated: string;\n timedOut: boolean;\n reason?: string;\n }) => void)\n | null = null;\n\n const settle = (outcome: {\n status: \"completed\" | \"failed\";\n exitCode: number | null;\n exitSignal: NodeJS.Signals | number | null;\n durationMs: number;\n aggregated: string;\n timedOut: boolean;\n reason?: string;\n }) => {\n if (settled) {\n return;\n }\n settled = true;\n resolveFn?.(outcome);\n };\n\n const finalizeTimeout = () => {\n if (session.exited) {\n return;\n }\n markExited(session, null, \"SIGKILL\", \"failed\");\n const aggregated = session.aggregated.trim();\n const reason = `Command timed out after ${opts.timeoutSec} seconds`;\n settle({\n status: \"failed\",\n exitCode: null,\n exitSignal: \"SIGKILL\",\n durationMs: Date.now() - startedAt,\n aggregated,\n timedOut: true,\n reason: aggregated ? `${aggregated}\\n\\n${reason}` : reason,\n });\n };\n\n const onTimeout = () => {\n timedOut = true;\n killSession(session);\n if (!timeoutFinalizeTimer) {\n timeoutFinalizeTimer = setTimeout(() => {\n finalizeTimeout();\n }, timeoutFinalizeMs);\n }\n };\n\n if (opts.timeoutSec > 0) {\n timeoutTimer = setTimeout(() => {\n onTimeout();\n }, opts.timeoutSec * 1000);\n }\n\n const emitUpdate = () => {\n if (opts.onUpdate) {\n opts.onUpdate(session);\n }\n };\n\n const handleStdout = (data: string) => {\n const str = sanitizeBinaryOutput(data.toString());\n for (const chunk of chunkString(str)) {\n appendOutput(session, \"stdout\", chunk);\n emitUpdate();\n }\n };\n\n const handleStderr = (data: string) => {\n const str = sanitizeBinaryOutput(data.toString());\n for (const chunk of chunkString(str)) {\n appendOutput(session, \"stderr\", chunk);\n emitUpdate();\n }\n };\n\n if (pty) {\n const cursorResponse = buildCursorPositionResponse();\n pty.onData((data) => {\n const raw = data.toString();\n const { cleaned, requests } = stripDsrRequests(raw);\n if (requests > 0) {\n for (let i = 0; i < requests; i += 1) {\n pty.write(cursorResponse);\n }\n }\n handleStdout(cleaned);\n });\n } else if (child) {\n child.stdout.on(\"data\", handleStdout);\n child.stderr.on(\"data\", handleStderr);\n }\n\n const promise = new Promise<{\n status: \"completed\" | \"failed\";\n exitCode: number | null;\n exitSignal: NodeJS.Signals | number | null;\n durationMs: number;\n aggregated: string;\n timedOut: boolean;\n reason?: string;\n }>((resolve) => {\n resolveFn = resolve;\n const handleExit = (code: number | null, exitSignal: NodeJS.Signals | number | null) => {\n if (timeoutTimer) {\n clearTimeout(timeoutTimer);\n }\n if (timeoutFinalizeTimer) {\n clearTimeout(timeoutFinalizeTimer);\n }\n const durationMs = Date.now() - startedAt;\n const wasSignal = exitSignal != null;\n const isSuccess = code === 0 && !wasSignal && !timedOut;\n const status: \"completed\" | \"failed\" = isSuccess ? \"completed\" : \"failed\";\n markExited(session, code, exitSignal, status);\n if (!session.child && session.stdin) {\n session.stdin.destroyed = true;\n }\n\n if (settled) {\n return;\n }\n const aggregated = session.aggregated.trim();\n if (!isSuccess) {\n const reason = timedOut\n ? `Command timed out after ${opts.timeoutSec} seconds`\n : wasSignal && exitSignal\n ? `Command aborted by signal ${exitSignal}`\n : code === null\n ? \"Command aborted before exit code was captured\"\n : `Command exited with code ${code}`;\n const message = aggregated ? `${aggregated}\\n\\n${reason}` : reason;\n settle({\n status: \"failed\",\n exitCode: code ?? null,\n exitSignal: exitSignal ?? null,\n durationMs,\n aggregated,\n timedOut,\n reason: message,\n });\n return;\n }\n settle({\n status: \"completed\",\n exitCode: code ?? 0,\n exitSignal: exitSignal ?? null,\n durationMs,\n aggregated,\n timedOut: false,\n });\n };\n\n if (pty) {\n pty.onExit((event) => {\n const rawSignal = event.signal ?? null;\n const normalizedSignal = rawSignal === 0 ? null : rawSignal;\n handleExit(event.exitCode ?? null, normalizedSignal);\n });\n } else if (child) {\n child.once(\"close\", (code, exitSignal) => {\n handleExit(code, exitSignal);\n });\n\n child.once(\"error\", (err) => {\n if (timeoutTimer) {\n clearTimeout(timeoutTimer);\n }\n if (timeoutFinalizeTimer) {\n clearTimeout(timeoutFinalizeTimer);\n }\n markExited(session, null, null, \"failed\");\n const aggregated = session.aggregated.trim();\n const message = aggregated ? `${aggregated}\\n\\n${String(err)}` : String(err);\n settle({\n status: \"failed\",\n exitCode: null,\n exitSignal: null,\n durationMs: Date.now() - startedAt,\n aggregated,\n timedOut,\n reason: message,\n });\n });\n }\n });\n\n return {\n session,\n startedAt,\n promise,\n kill: () => killSession(session),\n };\n }\n\n private addToHistory(\n conversationId: string | undefined,\n command: string,\n result: CommandResult,\n fileOperations?: FileOperation[]\n ): void {\n if (!conversationId) return;\n\n const historyEntry: CommandHistoryEntry = {\n command,\n stdout: result.stdout,\n stderr: result.stderr,\n exitCode: result.exitCode,\n timestamp: Date.now(),\n workingDirectory: result.executedIn,\n fileOperations,\n };\n\n if (!this.commandHistory.has(conversationId)) {\n this.commandHistory.set(conversationId, []);\n }\n\n const history = this.commandHistory.get(conversationId);\n if (!history) {\n throw new Error(`No history found for conversation ${conversationId}`);\n }\n history.push(historyEntry);\n\n if (history.length > this.maxHistoryPerConversation) {\n history.shift();\n }\n }\n\n private detectFileOperations(command: string, cwd: string): FileOperation[] | undefined {\n const operations: FileOperation[] = [];\n const parts = command.trim().split(/\\s+/);\n const cmd = parts[0].toLowerCase();\n\n if (cmd === \"touch\" && parts.length > 1) {\n operations.push({\n type: \"create\" as FileOperationType,\n target: this.resolvePath(parts[1], cwd),\n });\n } else if (cmd === \"echo\" && command.includes(\">\")) {\n const match = command.match(/>\\s*([^\\s]+)$/);\n if (match) {\n operations.push({\n type: \"write\" as FileOperationType,\n target: this.resolvePath(match[1], cwd),\n });\n }\n } else if (cmd === \"mkdir\" && parts.length > 1) {\n operations.push({\n type: \"mkdir\" as FileOperationType,\n target: this.resolvePath(parts[1], cwd),\n });\n } else if (cmd === \"cat\" && parts.length > 1 && !command.includes(\">\")) {\n operations.push({\n type: \"read\" as FileOperationType,\n target: this.resolvePath(parts[1], cwd),\n });\n } else if (cmd === \"mv\" && parts.length > 2) {\n operations.push({\n type: \"move\" as FileOperationType,\n target: this.resolvePath(parts[1], cwd),\n secondaryTarget: this.resolvePath(parts[2], cwd),\n });\n } else if (cmd === \"cp\" && parts.length > 2) {\n operations.push({\n type: \"copy\" as FileOperationType,\n target: this.resolvePath(parts[1], cwd),\n secondaryTarget: this.resolvePath(parts[2], cwd),\n });\n }\n\n return operations.length > 0 ? operations : undefined;\n }\n\n private resolvePath(filePath: string, cwd: string): string {\n if (path.isAbsolute(filePath)) {\n return filePath;\n }\n return path.join(cwd, filePath);\n }\n}\n",
|
|
27
|
+
"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 enabled: z.boolean(),\n allowedDirectory: z.string(),\n timeout: z.number().positive().default(30000),\n forbiddenCommands: z.array(z.string()),\n maxOutputChars: z.number().positive().default(200000),\n pendingMaxOutputChars: z.number().positive().default(200000),\n defaultBackgroundMs: z.number().positive().default(10000),\n allowBackground: z.boolean().default(true),\n});\n\nexport const DEFAULT_FORBIDDEN_COMMANDS: readonly string[] = [\n \"rm -rf /\",\n \"rmdir\",\n \"chmod 777\",\n \"chown\",\n \"chgrp\",\n \"shutdown\",\n \"reboot\",\n \"halt\",\n \"poweroff\",\n \"kill -9\",\n \"killall\",\n \"pkill\",\n \"sudo rm -rf\",\n \"su\",\n \"passwd\",\n \"useradd\",\n \"userdel\",\n \"groupadd\",\n \"groupdel\",\n \"format\",\n \"fdisk\",\n \"mkfs\",\n \"dd if=/dev/zero\",\n \"shred\",\n \":(){:|:&};:\",\n] as const;\n\nexport function loadShellConfig(): ShellConfig {\n const allowedDirectory = process.env.SHELL_ALLOWED_DIRECTORY || process.cwd();\n const timeout = parseInt(process.env.SHELL_TIMEOUT || \"30000\", 10);\n const maxOutputChars = parseInt(process.env.SHELL_MAX_OUTPUT_CHARS || \"200000\", 10);\n const pendingMaxOutputChars = parseInt(\n process.env.SHELL_PENDING_MAX_OUTPUT_CHARS || \"200000\",\n 10\n );\n const defaultBackgroundMs = parseInt(process.env.SHELL_BACKGROUND_MS || \"10000\", 10);\n const allowBackground = process.env.SHELL_ALLOW_BACKGROUND !== \"false\";\n\n const customForbidden = process.env.SHELL_FORBIDDEN_COMMANDS\n ? process.env.SHELL_FORBIDDEN_COMMANDS.split(\",\").map((cmd) => cmd.trim())\n : [];\n\n const forbiddenCommands = [...new Set([...DEFAULT_FORBIDDEN_COMMANDS, ...customForbidden])];\n\n const config: ShellConfig = {\n enabled: true,\n allowedDirectory,\n timeout,\n forbiddenCommands,\n maxOutputChars,\n pendingMaxOutputChars,\n defaultBackgroundMs,\n allowBackground,\n };\n\n const parseResult = configSchema.safeParse(config);\n if (!parseResult.success) {\n const errorMessage = parseResult.error.issues?.[0]?.message || parseResult.error.toString();\n throw new Error(`Shell plugin configuration error: ${errorMessage}`);\n }\n\n try {\n const stats = fs.statSync(allowedDirectory);\n if (!stats.isDirectory()) {\n throw new Error(`SHELL_ALLOWED_DIRECTORY is not a directory: ${allowedDirectory}`);\n }\n config.allowedDirectory = path.resolve(allowedDirectory);\n logger.info(\n `Shell plugin enabled with allowed directory: ${config.allowedDirectory}, ` +\n `background: ${allowBackground}, timeout: ${timeout}ms`\n );\n } catch (error) {\n if (\n error instanceof Error &&\n \"code\" in error &&\n (error as NodeJS.ErrnoException).code === \"ENOENT\"\n ) {\n throw new Error(`SHELL_ALLOWED_DIRECTORY does not exist: ${allowedDirectory}`);\n }\n throw error;\n }\n\n return config;\n}\n",
|
|
13
28
|
"import path from \"node:path\";\nimport { logger } from \"@elizaos/core\";\n\nexport function validatePath(\n commandPath: string,\n allowedDir: string,\n currentDir: string\n): string | null {\n const resolvedPath = path.resolve(currentDir, commandPath);\n const normalizedPath = path.normalize(resolvedPath);\n const normalizedAllowed = path.normalize(allowedDir);\n\n if (!normalizedPath.startsWith(normalizedAllowed)) {\n logger.warn(\n `Path validation failed: ${normalizedPath} is outside allowed directory ${normalizedAllowed}`\n );\n return null;\n }\n\n return normalizedPath;\n}\n\nexport function isSafeCommand(command: string): boolean {\n const pathTraversalPatterns = [/\\.\\.\\//g, /\\.\\.\\\\/g, /\\/\\.\\./g, /\\\\\\.\\./g];\n\n const dangerousPatterns = [/\\$\\(/g, /`[^']*`/g, /\\|\\s*sudo/g, /;\\s*sudo/g, /&\\s*&/g, /\\|\\s*\\|/g];\n\n for (const pattern of pathTraversalPatterns) {\n if (pattern.test(command)) {\n logger.warn(`Path traversal detected in command: ${command}`);\n return false;\n }\n }\n\n for (const pattern of dangerousPatterns) {\n if (pattern.test(command)) {\n logger.warn(`Dangerous pattern detected in command: ${command}`);\n return false;\n }\n }\n\n const pipeCount = (command.match(/\\|/g) || []).length;\n if (pipeCount > 1) {\n logger.warn(`Multiple pipes detected in command: ${command}`);\n return false;\n }\n\n return true;\n}\n\nexport function extractBaseCommand(fullCommand: string): string {\n const parts = fullCommand.trim().split(/\\s+/);\n return parts[0] || \"\";\n}\n\nexport function isForbiddenCommand(command: string, forbiddenCommands: string[]): boolean {\n const normalizedCommand = command.trim().toLowerCase();\n\n return forbiddenCommands.some((forbidden) => {\n const forbiddenLower = forbidden.toLowerCase();\n\n if (normalizedCommand.startsWith(forbiddenLower)) {\n return true;\n }\n\n if (!forbidden.includes(\" \")) {\n const baseCommand = extractBaseCommand(command);\n if (baseCommand.toLowerCase() === forbiddenLower) {\n return true;\n }\n }\n\n return false;\n });\n}\n",
|
|
14
|
-
"
|
|
29
|
+
"/**\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 ctrl: boolean;\n alt: boolean;\n shift: boolean;\n};\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nconst namedKeyMap = new Map<string, string>([\n [\"enter\", CR],\n [\"return\", CR],\n [\"tab\", TAB],\n [\"escape\", ESC],\n [\"esc\", ESC],\n [\"space\", \" \"],\n [\"bspace\", BACKSPACE],\n [\"backspace\", BACKSPACE],\n [\"up\", `${ESC}[A`],\n [\"down\", `${ESC}[B`],\n [\"right\", `${ESC}[C`],\n [\"left\", `${ESC}[D`],\n [\"home\", `${ESC}[1~`],\n [\"end\", `${ESC}[4~`],\n [\"pageup\", `${ESC}[5~`],\n [\"pgup\", `${ESC}[5~`],\n [\"ppage\", `${ESC}[5~`],\n [\"pagedown\", `${ESC}[6~`],\n [\"pgdn\", `${ESC}[6~`],\n [\"npage\", `${ESC}[6~`],\n [\"insert\", `${ESC}[2~`],\n [\"ic\", `${ESC}[2~`],\n [\"delete\", `${ESC}[3~`],\n [\"del\", `${ESC}[3~`],\n [\"dc\", `${ESC}[3~`],\n [\"btab\", `${ESC}[Z`],\n [\"f1\", `${ESC}OP`],\n [\"f2\", `${ESC}OQ`],\n [\"f3\", `${ESC}OR`],\n [\"f4\", `${ESC}OS`],\n [\"f5\", `${ESC}[15~`],\n [\"f6\", `${ESC}[17~`],\n [\"f7\", `${ESC}[18~`],\n [\"f8\", `${ESC}[19~`],\n [\"f9\", `${ESC}[20~`],\n [\"f10\", `${ESC}[21~`],\n [\"f11\", `${ESC}[23~`],\n [\"f12\", `${ESC}[24~`],\n [\"kp/\", `${ESC}Oo`],\n [\"kp*\", `${ESC}Oj`],\n [\"kp-\", `${ESC}Om`],\n [\"kp+\", `${ESC}Ok`],\n [\"kp7\", `${ESC}Ow`],\n [\"kp8\", `${ESC}Ox`],\n [\"kp9\", `${ESC}Oy`],\n [\"kp4\", `${ESC}Ot`],\n [\"kp5\", `${ESC}Ou`],\n [\"kp6\", `${ESC}Ov`],\n [\"kp1\", `${ESC}Oq`],\n [\"kp2\", `${ESC}Or`],\n [\"kp3\", `${ESC}Os`],\n [\"kp0\", `${ESC}Op`],\n [\"kp.\", `${ESC}On`],\n [\"kpenter\", `${ESC}OM`],\n]);\n\nconst modifiableNamedKeys = new Set([\n \"up\",\n \"down\",\n \"left\",\n \"right\",\n \"home\",\n \"end\",\n \"pageup\",\n \"pgup\",\n \"ppage\",\n \"pagedown\",\n \"pgdn\",\n \"npage\",\n \"insert\",\n \"ic\",\n \"delete\",\n \"del\",\n \"dc\",\n]);\n\nexport type KeyEncodingRequest = {\n keys?: string[];\n hex?: string[];\n literal?: string;\n};\n\nexport type KeyEncodingResult = {\n data: string;\n warnings: string[];\n};\n\nexport function encodeKeySequence(request: KeyEncodingRequest): KeyEncodingResult {\n const warnings: string[] = [];\n let data = \"\";\n\n if (request.literal) {\n data += request.literal;\n }\n\n if (request.hex?.length) {\n for (const raw of request.hex) {\n const byte = parseHexByte(raw);\n if (byte === null) {\n warnings.push(`Invalid hex byte: ${raw}`);\n continue;\n }\n data += String.fromCharCode(byte);\n }\n }\n\n if (request.keys?.length) {\n for (const token of request.keys) {\n data += encodeKeyToken(token, warnings);\n }\n }\n\n return { data, warnings };\n}\n\nexport function encodePaste(text: string, bracketed = true): string {\n if (!bracketed) {\n return text;\n }\n return `${BRACKETED_PASTE_START}${text}${BRACKETED_PASTE_END}`;\n}\n\nfunction encodeKeyToken(raw: string, warnings: string[]): string {\n const token = raw.trim();\n if (!token) {\n return \"\";\n }\n\n if (token.length === 2 && token.startsWith(\"^\")) {\n const ctrl = toCtrlChar(token[1]);\n if (ctrl) {\n return ctrl;\n }\n }\n\n const parsed = parseModifiers(token);\n const base = parsed.base;\n const baseLower = base.toLowerCase();\n\n if (baseLower === \"tab\" && parsed.mods.shift) {\n return `${ESC}[Z`;\n }\n\n const baseSeq = namedKeyMap.get(baseLower);\n if (baseSeq) {\n let seq = baseSeq;\n if (modifiableNamedKeys.has(baseLower) && hasAnyModifier(parsed.mods)) {\n const mod = xtermModifier(parsed.mods);\n if (mod > 1) {\n const modified = applyXtermModifier(seq, mod);\n if (modified) {\n seq = modified;\n return seq;\n }\n }\n }\n if (parsed.mods.alt) {\n return `${ESC}${seq}`;\n }\n return seq;\n }\n\n if (base.length === 1) {\n return applyCharModifiers(base, parsed.mods);\n }\n\n if (parsed.hasModifiers) {\n warnings.push(`Unknown key \"${base}\" for modifiers; sending literal.`);\n }\n return base;\n}\n\nfunction parseModifiers(token: string): {\n mods: Modifiers;\n base: string;\n hasModifiers: boolean;\n} {\n const mods: Modifiers = { ctrl: false, alt: false, shift: false };\n let rest = token;\n let sawModifiers = false;\n\n while (rest.length > 2 && rest[1] === \"-\") {\n const mod = rest[0].toLowerCase();\n if (mod === \"c\") {\n mods.ctrl = true;\n } else if (mod === \"m\") {\n mods.alt = true;\n } else if (mod === \"s\") {\n mods.shift = true;\n } else {\n break;\n }\n sawModifiers = true;\n rest = rest.slice(2);\n }\n\n return { mods, base: rest, hasModifiers: sawModifiers };\n}\n\nfunction applyCharModifiers(char: string, mods: Modifiers): string {\n let value = char;\n if (mods.shift && value.length === 1 && /[a-z]/.test(value)) {\n value = value.toUpperCase();\n }\n if (mods.ctrl) {\n const ctrl = toCtrlChar(value);\n if (ctrl) {\n value = ctrl;\n }\n }\n if (mods.alt) {\n value = `${ESC}${value}`;\n }\n return value;\n}\n\nfunction toCtrlChar(char: string): string | null {\n if (char.length !== 1) {\n return null;\n }\n if (char === \"?\") {\n return \"\\x7f\";\n }\n const code = char.toUpperCase().charCodeAt(0);\n if (code >= 64 && code <= 95) {\n return String.fromCharCode(code & 0x1f);\n }\n return null;\n}\n\nfunction xtermModifier(mods: Modifiers): number {\n let mod = 1;\n if (mods.shift) {\n mod += 1;\n }\n if (mods.alt) {\n mod += 2;\n }\n if (mods.ctrl) {\n mod += 4;\n }\n return mod;\n}\n\nfunction applyXtermModifier(sequence: string, modifier: number): string | null {\n const escPattern = escapeRegExp(ESC);\n const csiNumber = new RegExp(`^${escPattern}\\\\[(\\\\d+)([~A-Z])$`);\n const csiArrow = new RegExp(`^${escPattern}\\\\[(A|B|C|D|H|F)$`);\n\n const numberMatch = sequence.match(csiNumber);\n if (numberMatch) {\n return `${ESC}[${numberMatch[1]};${modifier}${numberMatch[2]}`;\n }\n\n const arrowMatch = sequence.match(csiArrow);\n if (arrowMatch) {\n return `${ESC}[1;${modifier}${arrowMatch[1]}`;\n }\n\n return null;\n}\n\nfunction hasAnyModifier(mods: Modifiers): boolean {\n return mods.ctrl || mods.alt || mods.shift;\n}\n\nfunction parseHexByte(raw: string): number | null {\n const trimmed = raw.trim().toLowerCase();\n const normalized = trimmed.startsWith(\"0x\") ? trimmed.slice(2) : trimmed;\n if (!/^[0-9a-f]{1,2}$/.test(normalized)) {\n return null;\n }\n const value = Number.parseInt(normalized, 16);\n if (Number.isNaN(value) || value < 0 || value > 0xff) {\n return null;\n }\n return value;\n}\n\n// DSR (Device Status Report) handling\nconst DSR_PATTERN = new RegExp(`${ESC}\\\\[\\\\??6n`, \"g\");\n\nexport function stripDsrRequests(input: string): { cleaned: string; requests: number } {\n let requests = 0;\n const cleaned = input.replace(DSR_PATTERN, () => {\n requests += 1;\n return \"\";\n });\n return { cleaned, requests };\n}\n\nexport function buildCursorPositionResponse(row = 1, col = 1): string {\n return `\\x1b[${row};${col}R`;\n}\n",
|
|
30
|
+
"/**\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 ChildProcess,\n ChildProcessWithoutNullStreams,\n SpawnOptions,\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 const systemRoot = process.env.SystemRoot || process.env.WINDIR;\n if (systemRoot) {\n const candidate = path.join(\n systemRoot,\n \"System32\",\n \"WindowsPowerShell\",\n \"v1.0\",\n \"powershell.exe\"\n );\n if (fs.existsSync(candidate)) {\n return candidate;\n }\n }\n return \"powershell.exe\";\n}\n\n/**\n * Resolve shell from PATH\n */\nfunction resolveShellFromPath(name: string): string | undefined {\n const envPath = process.env.PATH ?? \"\";\n if (!envPath) {\n return undefined;\n }\n const entries = envPath.split(path.delimiter).filter(Boolean);\n for (const entry of entries) {\n const candidate = path.join(entry, name);\n try {\n fs.accessSync(candidate, fs.constants.X_OK);\n return candidate;\n } catch {\n // ignore missing or non-executable entries\n }\n }\n return undefined;\n}\n\n/**\n * Get shell configuration for the current platform\n */\nexport function getShellConfig(): { shell: string; args: string[] } {\n if (process.platform === \"win32\") {\n // Use PowerShell instead of cmd.exe on Windows.\n // Many Windows system utilities write directly to the console via WriteConsole API,\n // bypassing stdout pipes. PowerShell properly captures and redirects their output.\n return {\n shell: resolvePowerShellPath(),\n args: [\"-NoProfile\", \"-NonInteractive\", \"-Command\"],\n };\n }\n\n const envShell = process.env.SHELL?.trim();\n const shellName = envShell ? path.basename(envShell) : \"\";\n // Fish rejects common bashisms used by tools, so prefer bash when detected.\n if (shellName === \"fish\") {\n const bash = resolveShellFromPath(\"bash\");\n if (bash) {\n return { shell: bash, args: [\"-c\"] };\n }\n const sh = resolveShellFromPath(\"sh\");\n if (sh) {\n return { shell: sh, args: [\"-c\"] };\n }\n }\n const shell = envShell && envShell.length > 0 ? envShell : \"sh\";\n return { shell, args: [\"-c\"] };\n}\n\n/**\n * Sanitize binary output by removing control characters\n */\nexport function sanitizeBinaryOutput(text: string): string {\n const scrubbed = text.replace(/[\\p{Format}\\p{Surrogate}]/gu, \"\");\n if (!scrubbed) {\n return scrubbed;\n }\n const chunks: string[] = [];\n for (const char of scrubbed) {\n const code = char.codePointAt(0);\n if (code == null) {\n continue;\n }\n if (code === 0x09 || code === 0x0a || code === 0x0d) {\n chunks.push(char);\n continue;\n }\n if (code < 0x20) {\n continue;\n }\n chunks.push(char);\n }\n return chunks.join(\"\");\n}\n\n/**\n * Kill a process tree (cross-platform)\n */\nexport function killProcessTree(pid: number): void {\n if (process.platform === \"win32\") {\n try {\n spawn(\"taskkill\", [\"/F\", \"/T\", \"/PID\", String(pid)], {\n stdio: \"ignore\",\n detached: true,\n });\n } catch {\n // ignore errors if taskkill fails\n }\n return;\n }\n\n try {\n process.kill(-pid, \"SIGKILL\");\n } catch {\n try {\n process.kill(pid, \"SIGKILL\");\n } catch {\n // process already dead\n }\n }\n}\n\n/**\n * Kill a session's process\n */\nexport function killSession(session: {\n pid?: number;\n child?: ChildProcessWithoutNullStreams;\n}): void {\n const pid = session.pid ?? session.child?.pid;\n if (pid) {\n killProcessTree(pid);\n }\n}\n\n/**\n * Coerce environment object to Record<string, string>\n */\nexport function coerceEnv(\n env?: NodeJS.ProcessEnv | Record<string, string>\n): Record<string, string> {\n const record: Record<string, string> = {};\n if (!env) {\n return record;\n }\n for (const [key, value] of Object.entries(env)) {\n if (typeof value === \"string\") {\n record[key] = value;\n }\n }\n return record;\n}\n\n/**\n * Resolve working directory with fallback\n */\nexport function resolveWorkdir(workdir: string, warnings: string[]): string {\n const current = safeCwd();\n const fallback = current ?? homedir();\n try {\n const stats = statSync(workdir);\n if (stats.isDirectory()) {\n return workdir;\n }\n } catch {\n // ignore, fallback below\n }\n warnings.push(`Warning: workdir \"${workdir}\" is unavailable; using \"${fallback}\".`);\n return fallback;\n}\n\nfunction safeCwd(): string | null {\n try {\n const cwd = process.cwd();\n return existsSync(cwd) ? cwd : null;\n } catch {\n return null;\n }\n}\n\n/**\n * Clamp a number to a range with a default value\n */\nexport function clampNumber(\n value: number | undefined,\n defaultValue: number,\n min: number,\n max: number\n): number {\n if (value === undefined || Number.isNaN(value)) {\n return defaultValue;\n }\n return 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 const raw = process.env[key];\n if (!raw) {\n return undefined;\n }\n const parsed = Number.parseInt(raw, 10);\n return 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 const chunks: string[] = [];\n for (let i = 0; i < input.length; i += limit) {\n chunks.push(input.slice(i, i + limit));\n }\n return chunks;\n}\n\n/**\n * Safely slice a string respecting UTF-16 surrogate pairs\n */\nexport function sliceUtf16Safe(str: string, start: number, end?: number): string {\n const effectiveEnd = end ?? str.length;\n if (start < 0) {\n const adjustedStart = Math.max(0, str.length + start);\n return str.slice(adjustedStart, effectiveEnd);\n }\n return 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 if (str.length <= max) {\n return str;\n }\n const half = Math.floor((max - 3) / 2);\n return `${sliceUtf16Safe(str, 0, half)}...${sliceUtf16Safe(str, -half)}`;\n}\n\n/**\n * Slice log lines with optional offset and limit\n */\nexport function sliceLogLines(\n text: string,\n offset?: number,\n limit?: number\n): { slice: string; totalLines: number; totalChars: number } {\n if (!text) {\n return { slice: \"\", totalLines: 0, totalChars: 0 };\n }\n const normalized = text.replace(/\\r\\n/g, \"\\n\");\n const lines = normalized.split(\"\\n\");\n if (lines.length > 0 && lines[lines.length - 1] === \"\") {\n lines.pop();\n }\n const totalLines = lines.length;\n const totalChars = text.length;\n let start =\n typeof offset === \"number\" && Number.isFinite(offset) ? Math.max(0, Math.floor(offset)) : 0;\n if (limit !== undefined && offset === undefined) {\n const tailCount = Math.max(0, Math.floor(limit));\n start = Math.max(totalLines - tailCount, 0);\n }\n const end =\n typeof limit === \"number\" && Number.isFinite(limit)\n ? start + Math.max(0, Math.floor(limit))\n : undefined;\n return { 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 const tokens = tokenizeCommand(command);\n if (tokens.length === 0) {\n return undefined;\n }\n const verb = tokens[0];\n let target = tokens.slice(1).find((t) => !t.startsWith(\"-\"));\n if (!target) {\n target = tokens[1];\n }\n if (!target) {\n return verb;\n }\n const cleaned = truncateMiddle(stripQuotes(target), 48);\n return `${stripQuotes(verb)} ${cleaned}`;\n}\n\nfunction tokenizeCommand(command: string): string[] {\n const matches = command.match(/(?:[^\\s\"']+|\"(?:\\\\.|[^\"])*\"|'(?:\\\\.|[^'])*')+/g) ?? [];\n return matches.map((token) => stripQuotes(token)).filter(Boolean);\n}\n\nfunction stripQuotes(value: string): string {\n const trimmed = value.trim();\n if (\n (trimmed.startsWith('\"') && trimmed.endsWith('\"')) ||\n (trimmed.startsWith(\"'\") && trimmed.endsWith(\"'\"))\n ) {\n return trimmed.slice(1, -1);\n }\n return trimmed;\n}\n\n/**\n * Format duration in human-readable format\n */\nexport function formatDuration(ms: number): string {\n if (ms < 1000) {\n return `${ms}ms`;\n }\n const seconds = Math.floor(ms / 1000);\n if (seconds < 60) {\n return `${seconds}s`;\n }\n const minutes = Math.floor(seconds / 60);\n const rem = seconds % 60;\n return `${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 if (str.length >= width) {\n return str;\n }\n return str + \" \".repeat(width - str.length);\n}\n\n// ===== Spawn Utilities =====\n\nexport type SpawnFallback = {\n label: string;\n options: SpawnOptions;\n};\n\nexport type SpawnWithFallbackResult = {\n child: ChildProcess;\n usedFallback: boolean;\n fallbackLabel?: string;\n};\n\ntype SpawnWithFallbackParams = {\n argv: string[];\n options: SpawnOptions;\n fallbacks?: SpawnFallback[];\n spawnImpl?: typeof spawn;\n retryCodes?: string[];\n onFallback?: (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 if (!(err instanceof Error)) {\n return String(err);\n }\n const details = err as NodeJS.ErrnoException;\n const parts: string[] = [];\n const message = err.message?.trim();\n if (message) {\n parts.push(message);\n }\n if (details.code && !message?.includes(details.code)) {\n parts.push(details.code);\n }\n if (details.syscall) {\n parts.push(`syscall=${details.syscall}`);\n }\n if (typeof details.errno === \"number\") {\n parts.push(`errno=${details.errno}`);\n }\n return parts.join(\" \");\n}\n\nfunction shouldRetry(err: unknown, codes: string[]): boolean {\n const code =\n err && typeof err === \"object\" && \"code\" in err ? String((err as { code?: unknown }).code) : \"\";\n return code.length > 0 && codes.includes(code);\n}\n\nasync function spawnAndWaitForSpawn(\n spawnImpl: typeof spawn,\n argv: string[],\n options: SpawnOptions\n): Promise<ChildProcess> {\n const child = spawnImpl(argv[0], argv.slice(1), options);\n\n return await new Promise((resolve, reject) => {\n let settled = false;\n const cleanup = () => {\n child.removeListener(\"error\", onError);\n child.removeListener(\"spawn\", onSpawn);\n };\n const finishResolve = () => {\n if (settled) {\n return;\n }\n settled = true;\n cleanup();\n resolve(child);\n };\n const onError = (err: unknown) => {\n if (settled) {\n return;\n }\n settled = true;\n cleanup();\n reject(err);\n };\n const onSpawn = () => {\n finishResolve();\n };\n child.once(\"error\", onError);\n child.once(\"spawn\", onSpawn);\n // Ensure mocked spawns that never emit \"spawn\" don't stall.\n process.nextTick(() => {\n if (typeof child.pid === \"number\") {\n finishResolve();\n }\n });\n });\n}\n\n/**\n * Spawn a process with fallback options on certain error codes\n */\nexport async function spawnWithFallback(\n params: SpawnWithFallbackParams\n): Promise<SpawnWithFallbackResult> {\n const spawnImpl = params.spawnImpl ?? spawn;\n const retryCodes = params.retryCodes ?? DEFAULT_RETRY_CODES;\n const baseOptions = { ...params.options };\n const fallbacks = params.fallbacks ?? [];\n const attempts: Array<{ label?: string; options: SpawnOptions }> = [\n { options: baseOptions },\n ...fallbacks.map((fallback) => ({\n label: fallback.label,\n options: { ...baseOptions, ...fallback.options },\n })),\n ];\n\n let lastError: unknown;\n for (let index = 0; index < attempts.length; index += 1) {\n const attempt = attempts[index];\n try {\n const child = await spawnAndWaitForSpawn(spawnImpl, params.argv, attempt.options);\n return {\n child,\n usedFallback: index > 0,\n fallbackLabel: attempt.label,\n };\n } catch (err) {\n lastError = err;\n const nextFallback = fallbacks[index];\n if (!nextFallback || !shouldRetry(err, retryCodes)) {\n throw err;\n }\n params.onFallback?.(err, nextFallback);\n }\n }\n\n throw lastError;\n}\n",
|
|
31
|
+
"/**\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 if (!value || Number.isNaN(value)) {\n return DEFAULT_JOB_TTL_MS;\n }\n return Math.min(Math.max(value, MIN_JOB_TTL_MS), MAX_JOB_TTL_MS);\n}\n\nlet jobTtlMs = clampTtl(Number.parseInt(process.env.SHELL_JOB_TTL_MS ?? \"\", 10));\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 return runningSessions.has(id) || finishedSessions.has(id);\n}\n\n// Session slug generation\nconst SLUG_ADJECTIVES = [\n \"amber\",\n \"briny\",\n \"brisk\",\n \"calm\",\n \"clear\",\n \"cool\",\n \"crisp\",\n \"dawn\",\n \"delta\",\n \"ember\",\n \"faint\",\n \"fast\",\n \"fresh\",\n \"gentle\",\n \"glow\",\n \"good\",\n \"grand\",\n \"keen\",\n \"kind\",\n \"lucky\",\n \"marine\",\n \"mellow\",\n \"mild\",\n \"neat\",\n \"nimble\",\n \"nova\",\n \"oceanic\",\n \"plaid\",\n \"quick\",\n \"quiet\",\n \"rapid\",\n \"salty\",\n \"sharp\",\n \"swift\",\n \"tender\",\n \"tidal\",\n \"tidy\",\n \"tide\",\n \"vivid\",\n \"warm\",\n \"wild\",\n \"young\",\n];\n\nconst SLUG_NOUNS = [\n \"atlas\",\n \"basil\",\n \"bison\",\n \"bloom\",\n \"breeze\",\n \"canyon\",\n \"cedar\",\n \"claw\",\n \"cloud\",\n \"comet\",\n \"coral\",\n \"cove\",\n \"crest\",\n \"daisy\",\n \"dune\",\n \"ember\",\n \"falcon\",\n \"fjord\",\n \"forest\",\n \"glade\",\n \"gulf\",\n \"harbor\",\n \"haven\",\n \"kelp\",\n \"lagoon\",\n \"meadow\",\n \"mist\",\n \"nexus\",\n \"ocean\",\n \"orbit\",\n \"otter\",\n \"pine\",\n \"prairie\",\n \"reef\",\n \"ridge\",\n \"river\",\n \"rook\",\n \"sable\",\n \"sage\",\n \"shell\",\n \"shoal\",\n \"shore\",\n \"slug\",\n \"summit\",\n \"trail\",\n \"valley\",\n \"wharf\",\n \"willow\",\n \"zephyr\",\n];\n\nfunction randomChoice(values: string[], fallback: string): string {\n return values[Math.floor(Math.random() * values.length)] ?? fallback;\n}\n\nfunction createSlugBase(words = 2): string {\n const parts = [randomChoice(SLUG_ADJECTIVES, \"steady\"), randomChoice(SLUG_NOUNS, \"harbor\")];\n if (words > 2) {\n parts.push(randomChoice(SLUG_NOUNS, \"reef\"));\n }\n return parts.join(\"-\");\n}\n\nexport function createSessionSlug(isTaken?: (id: string) => boolean): string {\n const isIdTaken = isTaken ?? isSessionIdTaken;\n for (let attempt = 0; attempt < 12; attempt += 1) {\n const base = createSlugBase(2);\n if (!isIdTaken(base)) {\n return base;\n }\n for (let i = 2; i <= 12; i += 1) {\n const candidate = `${base}-${i}`;\n if (!isIdTaken(candidate)) {\n return candidate;\n }\n }\n }\n for (let attempt = 0; attempt < 12; attempt += 1) {\n const base = createSlugBase(3);\n if (!isIdTaken(base)) {\n return base;\n }\n for (let i = 2; i <= 12; i += 1) {\n const candidate = `${base}-${i}`;\n if (!isIdTaken(candidate)) {\n return candidate;\n }\n }\n }\n const fallback = `${createSlugBase(3)}-${Math.random().toString(36).slice(2, 5)}`;\n return isIdTaken(fallback) ? `${fallback}-${Date.now().toString(36)}` : fallback;\n}\n\nexport function addSession(session: ProcessSession): void {\n runningSessions.set(session.id, session);\n startSweeper();\n}\n\nexport function getSession(id: string): ProcessSession | undefined {\n return runningSessions.get(id);\n}\n\nexport function getFinishedSession(id: string): FinishedSession | undefined {\n return finishedSessions.get(id);\n}\n\nexport function deleteSession(id: string): void {\n runningSessions.delete(id);\n finishedSessions.delete(id);\n}\n\nfunction sumPendingChars(buffer: string[]): number {\n let total = 0;\n for (const chunk of buffer) {\n total += chunk.length;\n }\n return total;\n}\n\nfunction capPendingBuffer(buffer: string[], pendingChars: number, cap: number): number {\n if (pendingChars <= cap) {\n return pendingChars;\n }\n const last = buffer.at(-1);\n if (last && last.length >= cap) {\n buffer.length = 0;\n buffer.push(last.slice(last.length - cap));\n return cap;\n }\n while (buffer.length && pendingChars - buffer[0].length >= cap) {\n pendingChars -= buffer[0].length;\n buffer.shift();\n }\n if (buffer.length && pendingChars > cap) {\n const overflow = pendingChars - cap;\n buffer[0] = buffer[0].slice(overflow);\n pendingChars = cap;\n }\n return pendingChars;\n}\n\nexport function tail(text: string, max = 2000): string {\n if (text.length <= max) {\n return text;\n }\n return text.slice(text.length - max);\n}\n\nexport function trimWithCap(text: string, max: number): string {\n if (text.length <= max) {\n return text;\n }\n return text.slice(text.length - max);\n}\n\nexport function appendOutput(\n session: ProcessSession,\n stream: \"stdout\" | \"stderr\",\n chunk: string\n): void {\n session.pendingStdout ??= [];\n session.pendingStderr ??= [];\n session.pendingStdoutChars ??= sumPendingChars(session.pendingStdout);\n session.pendingStderrChars ??= sumPendingChars(session.pendingStderr);\n const buffer = stream === \"stdout\" ? session.pendingStdout : session.pendingStderr;\n const bufferChars = stream === \"stdout\" ? session.pendingStdoutChars : session.pendingStderrChars;\n const pendingCap = Math.min(\n session.pendingMaxOutputChars ?? DEFAULT_PENDING_OUTPUT_CHARS,\n session.maxOutputChars\n );\n buffer.push(chunk);\n let pendingChars = bufferChars + chunk.length;\n if (pendingChars > pendingCap) {\n session.truncated = true;\n pendingChars = capPendingBuffer(buffer, pendingChars, pendingCap);\n }\n if (stream === \"stdout\") {\n session.pendingStdoutChars = pendingChars;\n } else {\n session.pendingStderrChars = pendingChars;\n }\n session.totalOutputChars += chunk.length;\n const aggregated = trimWithCap(session.aggregated + chunk, session.maxOutputChars);\n session.truncated =\n session.truncated || aggregated.length < session.aggregated.length + chunk.length;\n session.aggregated = aggregated;\n session.tail = tail(session.aggregated, 2000);\n}\n\nexport function drainSession(session: ProcessSession): { stdout: string; stderr: string } {\n const stdout = session.pendingStdout.join(\"\");\n const stderr = session.pendingStderr.join(\"\");\n session.pendingStdout = [];\n session.pendingStderr = [];\n session.pendingStdoutChars = 0;\n session.pendingStderrChars = 0;\n return { stdout, stderr };\n}\n\nfunction moveToFinished(session: ProcessSession, status: ProcessStatus): void {\n runningSessions.delete(session.id);\n if (!session.backgrounded) {\n return;\n }\n finishedSessions.set(session.id, {\n id: session.id,\n command: session.command,\n scopeKey: session.scopeKey,\n startedAt: session.startedAt,\n endedAt: Date.now(),\n cwd: session.cwd,\n status,\n exitCode: session.exitCode,\n exitSignal: session.exitSignal,\n aggregated: session.aggregated,\n tail: session.tail,\n truncated: session.truncated,\n totalOutputChars: session.totalOutputChars,\n });\n}\n\nexport function markExited(\n session: ProcessSession,\n exitCode: number | null,\n exitSignal: NodeJS.Signals | number | null,\n status: ProcessStatus\n): void {\n session.exited = true;\n session.exitCode = exitCode;\n session.exitSignal = exitSignal;\n session.tail = tail(session.aggregated, 2000);\n moveToFinished(session, status);\n}\n\nexport function markBackgrounded(session: ProcessSession): void {\n session.backgrounded = true;\n}\n\nexport function listRunningSessions(): ProcessSession[] {\n return Array.from(runningSessions.values()).filter((s) => s.backgrounded);\n}\n\nexport function listFinishedSessions(): FinishedSession[] {\n return Array.from(finishedSessions.values());\n}\n\nexport function clearFinished(): void {\n finishedSessions.clear();\n}\n\nexport function resetProcessRegistryForTests(): void {\n runningSessions.clear();\n finishedSessions.clear();\n stopSweeper();\n}\n\nexport function setJobTtlMs(value?: number): void {\n if (value === undefined || Number.isNaN(value)) {\n return;\n }\n jobTtlMs = clampTtl(value);\n stopSweeper();\n startSweeper();\n}\n\nfunction pruneFinishedSessions(): void {\n const cutoff = Date.now() - jobTtlMs;\n for (const [id, session] of finishedSessions.entries()) {\n if (session.endedAt < cutoff) {\n finishedSessions.delete(id);\n }\n }\n}\n\nfunction startSweeper(): void {\n if (sweeper) {\n return;\n }\n sweeper = setInterval(pruneFinishedSessions, Math.max(30_000, jobTtlMs / 6));\n sweeper.unref?.();\n}\n\nfunction stopSweeper(): void {\n if (!sweeper) {\n return;\n }\n clearInterval(sweeper);\n sweeper = null;\n}\n",
|
|
32
|
+
"import type { Plugin } from \"@elizaos/core\";\nimport { clearHistory, executeCommand, processAction } from \"./actions\";\nimport { ExecApprovalService } from \"./approvals\";\nimport { shellHistoryProvider } from \"./providers\";\nimport { ShellService } from \"./services/shellService\";\n\nexport const shellPlugin: Plugin = {\n name: \"shell\",\n description:\n \"Execute shell commands with PTY support, background execution, session management, and approval workflows\",\n services: [ShellService, ExecApprovalService],\n actions: [executeCommand, clearHistory, processAction],\n providers: [shellHistoryProvider],\n};\n\nexport default shellPlugin;\n\n// Actions\nexport { clearHistory } from \"./actions/clearHistory\";\nexport { executeCommand } from \"./actions/executeCommand\";\nexport { processAction } from \"./actions/processAction\";\n\n// Approvals\nexport {\n addAllowlistEntry,\n analyzeShellCommand,\n type CommandCheckResult,\n type CommandResolution,\n DEFAULT_SAFE_BINS,\n EXEC_APPROVAL_DEFAULTS,\n type ExecAllowlistAnalysis,\n type ExecAllowlistEntry,\n type ExecAllowlistEvaluation,\n type ExecApprovalDecision,\n type ExecApprovalRequest,\n type ExecApprovalResult,\n ExecApprovalService,\n type ExecApprovalsAgent,\n type ExecApprovalsDefaults,\n type ExecApprovalsFile,\n type ExecApprovalsResolved,\n type ExecApprovalsSnapshot,\n type ExecAsk,\n type ExecCommandAnalysis,\n type ExecCommandSegment,\n type ExecHost,\n type ExecSecurity,\n ensureApprovals,\n evaluateExecAllowlist,\n evaluateShellAllowlist,\n getApprovalFilePath,\n getApprovalSocketPath,\n isSafeBinUsage,\n loadApprovals,\n matchAllowlist,\n maxAsk,\n minSecurity,\n normalizeApprovals,\n normalizeSafeBins,\n readApprovalsSnapshot,\n recordAllowlistUse,\n requiresExecApproval,\n resolveApprovals,\n resolveApprovalsFromFile,\n resolveCommandFromArgv,\n resolveCommandResolution,\n resolveSafeBins,\n saveApprovals,\n} from \"./approvals\";\n\n// Providers\nexport { shellHistoryProvider } from \"./providers/shellHistoryProvider\";\nexport {\n addSession,\n appendOutput,\n clearFinished,\n createSessionSlug,\n deleteSession,\n drainSession,\n getFinishedSession,\n getSession,\n listFinishedSessions,\n listRunningSessions,\n markBackgrounded,\n markExited,\n resetProcessRegistryForTests,\n setJobTtlMs,\n tail,\n trimWithCap,\n} from \"./services/processRegistry\";\n// Services\nexport { ShellService } from \"./services/shellService\";\n\n// Types\nexport type {\n CommandHistoryEntry,\n CommandResult,\n ExecResult,\n ExecuteOptions,\n FileOperation,\n FileOperationType,\n FinishedSession,\n ProcessAction,\n ProcessActionParams,\n ProcessSession,\n ProcessStatus,\n PtyExitEvent,\n PtyHandle,\n PtyListener,\n PtySpawn,\n SessionStdin,\n ShellConfig,\n} from \"./types\";\n\n// Utilities\nexport {\n DEFAULT_FORBIDDEN_COMMANDS,\n extractBaseCommand,\n isForbiddenCommand,\n isSafeCommand,\n loadShellConfig,\n validatePath,\n} from \"./utils\";\nexport {\n BRACKETED_PASTE_END,\n BRACKETED_PASTE_START,\n buildCursorPositionResponse,\n encodeKeySequence,\n encodePaste,\n type KeyEncodingRequest,\n type KeyEncodingResult,\n stripDsrRequests,\n} from \"./utils/ptyKeys\";\nexport {\n chunkString,\n clampNumber,\n coerceEnv,\n deriveSessionName,\n formatDuration,\n formatSpawnError,\n getShellConfig,\n killProcessTree,\n killSession,\n pad,\n readEnvInt,\n resolveWorkdir,\n type SpawnFallback,\n type SpawnWithFallbackResult,\n sanitizeBinaryOutput,\n sliceLogLines,\n sliceUtf16Safe,\n spawnWithFallback,\n truncateMiddle,\n} from \"./utils/shellUtils\";\n"
|
|
15
33
|
],
|
|
16
|
-
"mappings": "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",
|
|
17
|
-
"debugId": "
|
|
34
|
+
"mappings": "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",
|
|
35
|
+
"debugId": "97DD6F9F41EC7B7A64756E2164756E21",
|
|
18
36
|
"names": []
|
|
19
37
|
}
|