@elizaos/plugin-shell 2.0.3-beta.2 → 2.0.3-beta.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.
Files changed (56) hide show
  1. package/dist/approvals/allowlist.d.ts +76 -0
  2. package/dist/approvals/allowlist.d.ts.map +1 -0
  3. package/dist/approvals/analysis.d.ts +76 -0
  4. package/dist/approvals/analysis.d.ts.map +1 -0
  5. package/dist/approvals/index.d.ts +12 -0
  6. package/dist/approvals/index.d.ts.map +1 -0
  7. package/dist/approvals/service.d.ts +121 -0
  8. package/dist/approvals/service.d.ts.map +1 -0
  9. package/dist/approvals/types.d.ts +219 -0
  10. package/dist/approvals/types.d.ts.map +1 -0
  11. package/dist/auto-enable.d.ts +4 -0
  12. package/dist/auto-enable.d.ts.map +1 -0
  13. package/dist/generated/specs/spec-helpers.d.ts +36 -0
  14. package/dist/generated/specs/spec-helpers.d.ts.map +1 -0
  15. package/dist/generated/specs/specs.d.ts +48 -0
  16. package/dist/generated/specs/specs.d.ts.map +1 -0
  17. package/dist/index.browser.d.ts +4 -0
  18. package/dist/index.browser.d.ts.map +1 -0
  19. package/dist/index.d.ts +13 -0
  20. package/dist/index.d.ts.map +1 -0
  21. package/dist/index.js +4284 -0
  22. package/dist/index.js.map +24 -0
  23. package/dist/prompts.d.ts +11 -0
  24. package/dist/prompts.d.ts.map +1 -0
  25. package/dist/providers/index.d.ts +2 -0
  26. package/dist/providers/index.d.ts.map +1 -0
  27. package/dist/providers/shellHistoryProvider.d.ts +4 -0
  28. package/dist/providers/shellHistoryProvider.d.ts.map +1 -0
  29. package/dist/services/index.d.ts +3 -0
  30. package/dist/services/index.d.ts.map +1 -0
  31. package/dist/services/processRegistry.d.ts +25 -0
  32. package/dist/services/processRegistry.d.ts.map +1 -0
  33. package/dist/services/shellService.d.ts +95 -0
  34. package/dist/services/shellService.d.ts.map +1 -0
  35. package/dist/types/index.d.ts +144 -0
  36. package/dist/types/index.d.ts.map +1 -0
  37. package/dist/utils/config.d.ts +4 -0
  38. package/dist/utils/config.d.ts.map +1 -0
  39. package/dist/utils/index.d.ts +7 -0
  40. package/dist/utils/index.d.ts.map +1 -0
  41. package/dist/utils/pathUtils.d.ts +5 -0
  42. package/dist/utils/pathUtils.d.ts.map +1 -0
  43. package/dist/utils/processQueue.d.ts +136 -0
  44. package/dist/utils/processQueue.d.ts.map +1 -0
  45. package/dist/utils/ptyKeys.d.ts +23 -0
  46. package/dist/utils/ptyKeys.d.ts.map +1 -0
  47. package/dist/utils/shellArgv.d.ts +37 -0
  48. package/dist/utils/shellArgv.d.ts.map +1 -0
  49. package/dist/utils/shellUtils.d.ts +103 -0
  50. package/dist/utils/shellUtils.d.ts.map +1 -0
  51. package/dist/utils/terminalCapabilities.d.ts +30 -0
  52. package/dist/utils/terminalCapabilities.d.ts.map +1 -0
  53. package/dist/vitest.config.d.ts +3 -0
  54. package/dist/vitest.config.d.ts.map +1 -0
  55. package/package.json +5 -4
  56. package/registry-entry.json +94 -0
@@ -0,0 +1,24 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../approvals/allowlist.ts", "../approvals/types.ts", "../approvals/analysis.ts", "../approvals/service.ts", "../providers/shellHistoryProvider.ts", "../generated/specs/specs.ts", "../generated/specs/spec-helpers.ts", "../services/shellService.ts", "../utils/config.ts", "../utils/pathUtils.ts", "../utils/ptyKeys.ts", "../utils/shellUtils.ts", "../utils/terminalCapabilities.ts", "../services/processRegistry.ts", "../index.ts"],
4
+ "sourcesContent": [
5
+ "/**\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, resolveStateDir } 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 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 path.join(resolveStateDir(), \"exec-approvals.json\");\n}\n\n/**\n * Get the default socket path\n */\nexport function getApprovalSocketPath(): string {\n return path.join(resolveStateDir(), \"exec-approvals.sock\");\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> = {\n deny: 0,\n allowlist: 1,\n full: 2,\n };\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",
6
+ "/**\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",
7
+ "/**\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): {\n ok: boolean;\n reason?: string;\n segments: string[];\n} {\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 as { reason: string }).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 {\n ok: false,\n reason: \"unable to parse shell segment\",\n segments: [],\n };\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 {\n ok: false,\n reason: \"unable to parse windows command\",\n segments: [],\n };\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 {\n allowlistSatisfied: result.satisfied,\n allowlistMatches: result.matches,\n };\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",
8
+ "/**\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 state-dir file permissions.\"\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 agentIds: [this.runtime.agentId],\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",
9
+ "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 descriptionCompressed: \"Recent shell history, cwd, and file ops in restricted env.\",\n position: 99,\n contexts: [\"terminal\", \"code\"],\n contextGate: { anyOf: [\"terminal\", \"code\"] },\n cacheStable: false,\n cacheScope: \"turn\",\n dynamic: true,\n get: async (runtime: IAgentRuntime, message: Memory, _state: State) => {\n try {\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 } catch {\n return {\n values: {\n shellHistory: \"\",\n currentWorkingDirectory: \"N/A\",\n allowedDirectory: \"N/A\",\n },\n text: \"\",\n data: { historyCount: 0, cwd: \"N/A\", allowedDir: \"N/A\" },\n };\n }\n },\n};\n\nexport default shellHistoryProvider;\n",
10
+ "/**\n * Auto-generated canonical action/provider docs for plugin-shell.\n * DO NOT EDIT - Generated from prompts/specs/**.\n */\n\nexport type ActionDoc = {\n name: string;\n description: string;\n descriptionCompressed?: 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 descriptionCompressed?: string;\n position?: number;\n dynamic?: boolean;\n};\n\nexport const coreActionsSpec = {\n version: \"1.0.0\",\n actions: [],\n} as const;\nexport const allActionsSpec = {\n version: \"1.0.0\",\n actions: [],\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;\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;\n",
11
+ "/**\n * Helper functions to lookup action/provider 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 and regenerate.\n */\n\nimport {\n type ActionDoc,\n allActionDocs,\n allProviderDocs,\n coreActionDocs,\n coreProviderDocs,\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]));\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// Re-export types for convenience\nexport type { ActionDoc, ProviderDoc };\n",
12
+ "/**\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 { isCloudExecutionMode, shouldUseSandboxExecution } from \"@elizaos/shared\";\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 resolveWorkdir,\n sanitizeBinaryOutput,\n sliceLogLines,\n truncateMiddle,\n} from \"../utils/shellUtils\";\nimport {\n detectTerminalSupport,\n missingTerminalToolForCommand,\n missingToolMessage,\n} from \"../utils/terminalCapabilities\";\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_TIMEOUT_SEC = 1800; // 30 minutes\n\ninterface RuntimeSandboxManager {\n getState?: () => string;\n isReady?: () => boolean;\n start?: () => Promise<void>;\n exec: (options: {\n command: string;\n workdir?: string;\n env?: Record<string, string>;\n timeoutMs?: number;\n stdin?: string;\n }) => Promise<{\n exitCode: number;\n stdout: string;\n stderr: string;\n durationMs: number;\n executedInSandbox: boolean;\n }>;\n}\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 private getSandboxManager(): RuntimeSandboxManager | null {\n const candidate = (\n this.runtime as unknown as {\n getSandboxManager?: () => RuntimeSandboxManager | null;\n }\n ).getSandboxManager?.();\n return candidate ?? null;\n }\n\n private toSandboxWorkdir(workdir: string): string | undefined {\n const relative = path.relative(process.cwd(), path.resolve(workdir));\n if (relative === \"\") return \"/workspace\";\n if (!relative.startsWith(\"..\") && !path.isAbsolute(relative)) {\n return `/workspace/${relative}`;\n }\n return undefined;\n }\n\n private async runSandboxCommand(\n command: string,\n workdir: string,\n timeoutMs: number,\n env?: Record<string, string>\n ): Promise<CommandResult> {\n const sandboxManager = this.getSandboxManager();\n if (!sandboxManager) {\n logger.error(\"[shell:sandbox] local-safe denied: SandboxManager unavailable\");\n return {\n success: false,\n stdout: \"\",\n stderr:\n \"local-safe mode requires SandboxManager, but no sandbox manager is available for command execution.\",\n exitCode: 1,\n error: \"Sandbox unavailable\",\n executedIn: workdir,\n };\n }\n\n const sandboxWorkdir = this.toSandboxWorkdir(workdir);\n if (!sandboxWorkdir) {\n return {\n success: false,\n stdout: \"\",\n stderr: `local-safe mode can only execute inside the sandbox workspace; cwd is outside process workspace: ${workdir}`,\n exitCode: 1,\n error: \"Sandbox unavailable\",\n executedIn: workdir,\n };\n }\n\n logger.info(`[shell:sandbox] routing exec via SandboxManager: ${command.substring(0, 100)}`);\n const result = await sandboxManager.exec({\n command,\n workdir: sandboxWorkdir,\n timeoutMs,\n env,\n });\n logger.info(\n `[shell:sandbox] exec completed: exit=${result.exitCode} duration=${result.durationMs}ms executedInSandbox=${result.executedInSandbox}`\n );\n return {\n success: result.exitCode === 0,\n stdout: result.stdout,\n stderr: result.stderr,\n exitCode: result.exitCode,\n executedIn: workdir,\n };\n }\n\n private localTerminalUnsupportedMessage(): string | null {\n const support = detectTerminalSupport();\n return support.supported\n ? null\n : (support.message ?? \"Local terminal execution is unavailable.\");\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 if (isCloudExecutionMode(this.runtime)) {\n logger.error(\"[shell:cloud] local exec disabled in cloud mode\");\n return {\n success: false,\n stdout: \"\",\n stderr: \"Local shell execution disabled in cloud mode.\",\n exitCode: 1,\n error: \"Local shell execution disabled in cloud mode.\",\n executedIn: this.currentDirectory,\n };\n }\n\n const unsupported = this.localTerminalUnsupportedMessage();\n if (unsupported) {\n logger.error(`[shell:unsupported] ${unsupported}`);\n return {\n success: false,\n stdout: \"\",\n stderr: unsupported,\n exitCode: 1,\n error: unsupported,\n executedIn: this.currentDirectory,\n };\n }\n\n // Sandbox remote mode: route to host capability API\n if (\n !shouldUseSandboxExecution(this.runtime) &&\n this.runtime &&\n \"sandboxMode\" in this.runtime &&\n this.runtime.sandboxMode\n ) {\n const hostApiUrl =\n (this.runtime.getSetting(\"SANDBOX_HOST_API_URL\") as string | null) ??\n \"http://localhost:2138\";\n const runtimeFetch = this.runtime.fetch ?? globalThis.fetch;\n logger.info(`[shell:sandbox] routing exec to ${hostApiUrl}: ${command.substring(0, 100)}`);\n try {\n const response = await runtimeFetch(`${hostApiUrl}/api/sandbox/exec`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n command,\n workdir: this.currentDirectory,\n timeoutMs: 30000,\n }),\n });\n const result = (await response.json()) as {\n exitCode: number;\n stdout: string;\n stderr: string;\n durationMs: number;\n executedInSandbox: boolean;\n };\n logger.info(\n `[shell:sandbox] exec completed: exit=${result.exitCode} duration=${result.durationMs}ms`\n );\n return {\n success: result.exitCode === 0,\n stdout: result.stdout,\n stderr: result.stderr,\n exitCode: result.exitCode,\n executedIn: this.currentDirectory,\n };\n } catch (err) {\n const errMsg = err instanceof Error ? err.message : String(err);\n logger.error(`[shell:sandbox] exec failed: ${errMsg}`);\n return {\n success: false,\n stdout: \"\",\n stderr: `Sandbox exec failed: ${errMsg}`,\n exitCode: 1,\n error: \"Sandbox remote execution failed\",\n executedIn: this.currentDirectory,\n };\n }\n }\n\n const trimmedCommand = command.trim();\n\n const missingTool = missingTerminalToolForCommand(trimmedCommand);\n if (missingTool) {\n const message = missingToolMessage(missingTool);\n return {\n success: false,\n stdout: \"\",\n stderr: message,\n exitCode: 1,\n error: message,\n executedIn: this.currentDirectory,\n };\n }\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 = shouldUseSandboxExecution(this.runtime)\n ? await this.runSandboxCommand(trimmedCommand, this.currentDirectory, 30_000)\n : 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 if (isCloudExecutionMode(this.runtime)) {\n logger.error(\"[shell:cloud] local exec disabled in cloud mode\");\n return {\n status: \"failed\",\n exitCode: 1,\n durationMs: 0,\n aggregated: \"\",\n reason: \"Local shell execution disabled in cloud mode.\",\n };\n }\n\n const unsupported = this.localTerminalUnsupportedMessage();\n if (unsupported) {\n logger.error(`[shell:unsupported] ${unsupported}`);\n return {\n status: \"failed\",\n exitCode: 1,\n durationMs: 0,\n aggregated: \"\",\n reason: unsupported,\n };\n }\n\n const trimmedCommand = command.trim();\n\n const missingTool = missingTerminalToolForCommand(trimmedCommand);\n if (missingTool) {\n const message = missingToolMessage(missingTool);\n return {\n status: \"failed\",\n exitCode: 1,\n durationMs: 0,\n aggregated: \"\",\n reason: message,\n };\n }\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;\n const pendingMaxOutput = this.shellConfig.pendingMaxOutputChars;\n const defaultBackgroundMs = this.shellConfig.defaultBackgroundMs;\n const allowBackground = this.shellConfig.allowBackground;\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 resolvedWorkdir = resolveWorkdir(rawWorkdir, warnings);\n const validatedWorkdir = validatePath(\n resolvedWorkdir,\n this.shellConfig.allowedDirectory,\n this.currentDirectory\n );\n if (!validatedWorkdir) {\n return {\n status: \"failed\",\n exitCode: 1,\n durationMs: 0,\n aggregated: \"\",\n reason: `workdir is outside allowed directory: ${resolvedWorkdir}`,\n };\n }\n const workdir = validatedWorkdir;\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 if (shouldUseSandboxExecution(this.runtime)) {\n if (backgroundRequested || yieldRequested || usePty) {\n warnings.push(\n \"Warning: local-safe sandbox execution runs synchronously; background, yield, and PTY options are ignored.\"\n );\n }\n const startedAt = Date.now();\n const sandboxResult = await this.runSandboxCommand(\n trimmedCommand,\n workdir,\n timeoutSec * 1000,\n mergedEnv\n );\n const warningText = warnings.length ? `${warnings.join(\"\\n\")}\\n\\n` : \"\";\n const aggregated = [sandboxResult.stdout, sandboxResult.stderr].filter(Boolean).join(\"\\n\");\n if (!sandboxResult.success) {\n return {\n status: \"failed\",\n exitCode: sandboxResult.exitCode,\n durationMs: Date.now() - startedAt,\n aggregated,\n cwd: workdir,\n reason: `${warningText}${sandboxResult.error ?? sandboxResult.stderr}`,\n };\n }\n return {\n status: \"completed\",\n exitCode: sandboxResult.exitCode,\n durationMs: Date.now() - startedAt,\n aggregated: `${warningText}${aggregated || \"(no output)\"}`,\n cwd: workdir,\n };\n }\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 const shell = getShellConfig();\n cmd = shell.shell;\n args = [...shell.args, command];\n logger.info(\n `Executing shell command: ${cmd} ${shell.args.join(\" \")} \"${command}\" in ${this.currentDirectory}`\n );\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,\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, 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",
13
+ "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",
14
+ "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 const relative = path.relative(normalizedAllowed, normalizedPath);\n\n if (relative.startsWith(\"..\") || path.isAbsolute(relative)) {\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",
15
+ "/**\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): {\n cleaned: string;\n requests: number;\n} {\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",
16
+ "/**\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 { existsSync, statSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport path from \"node:path\";\nimport { resolveExecutable, resolveTerminalShell } from \"./terminalCapabilities\";\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 (existsSync(candidate)) {\n return candidate;\n }\n }\n return \"powershell.exe\";\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 = resolveExecutable(\"bash\");\n if (bash) {\n return { shell: bash, args: [\"-c\"] };\n }\n const sh = resolveExecutable(\"sh\");\n if (sh) {\n return { shell: sh, args: [\"-c\"] };\n }\n }\n const resolved = resolveTerminalShell();\n return { shell: resolved.shell, args: resolved.args };\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",
17
+ "import fs from \"node:fs\";\nimport path from \"node:path\";\n\nexport const TERMINAL_TOOL_NAMES = [\n \"sh\",\n \"git\",\n \"rg\",\n \"bun\",\n \"acpx\",\n \"codex\",\n \"claude\",\n \"opencode\",\n] as const;\n\nexport type TerminalToolName = (typeof TERMINAL_TOOL_NAMES)[number];\n\nexport interface ToolCapability {\n name: TerminalToolName;\n path?: string;\n available: boolean;\n}\n\nexport interface ShellResolution {\n shell: string;\n args: string[];\n available: boolean;\n source: \"env:CODING_TOOLS_SHELL\" | \"env:SHELL\" | \"candidate\" | \"fallback\";\n warning?: string;\n}\n\nexport type TerminalUnsupportedReason =\n | \"store_build\"\n | \"vanilla_mobile\"\n | \"not_local_yolo\"\n | \"missing_shell\";\n\nexport interface TerminalSupport {\n supported: boolean;\n reason?: TerminalUnsupportedReason;\n message?: string;\n}\n\nconst ANDROID_PATH_ENTRIES = [\"/system/bin\", \"/system/xbin\", \"/vendor/bin\"];\n\nexport function isAndroidRuntime(): boolean {\n return (\n process.env.ELIZA_PLATFORM?.trim().toLowerCase() === \"android\" ||\n Boolean(process.env.ANDROID_ROOT || process.env.ANDROID_DATA)\n );\n}\n\nfunction isIosRuntime(): boolean {\n return process.env.ELIZA_PLATFORM?.trim().toLowerCase() === \"ios\";\n}\n\nfunction isTruthyEnv(value: string | undefined): boolean {\n if (!value) return false;\n return [\"1\", \"true\", \"yes\", \"on\"].includes(value.trim().toLowerCase());\n}\n\nfunction isStoreBuild(): boolean {\n const variant = process.env.ELIZA_BUILD_VARIANT ?? \"\";\n return variant.trim().toLowerCase() === \"store\";\n}\n\nfunction runtimeMode(): string {\n return (\n process.env.ELIZA_RUNTIME_MODE ??\n process.env.RUNTIME_MODE ??\n process.env.LOCAL_RUNTIME_MODE ??\n \"\"\n )\n .trim()\n .toLowerCase();\n}\n\nexport function isAospTerminalRuntime(): boolean {\n return isAndroidRuntime() && isTruthyEnv(process.env.ELIZA_AOSP_BUILD);\n}\n\nfunction executableExists(candidate: string): boolean {\n try {\n fs.accessSync(candidate, fs.constants.X_OK);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction pathEntries(): string[] {\n const entries = (process.env.PATH ?? \"\")\n .split(path.delimiter)\n .map((entry) => entry.trim())\n .filter(Boolean);\n if (isAndroidRuntime()) {\n for (const entry of ANDROID_PATH_ENTRIES) {\n if (!entries.includes(entry)) entries.push(entry);\n }\n }\n return entries;\n}\n\nexport function resolveExecutable(nameOrPath: string): string | undefined {\n const trimmed = nameOrPath.trim();\n if (!trimmed) return undefined;\n if (trimmed.includes(\"/\") || path.isAbsolute(trimmed)) {\n return executableExists(trimmed) ? trimmed : undefined;\n }\n for (const entry of pathEntries()) {\n const candidate = path.join(entry, trimmed);\n if (executableExists(candidate)) return candidate;\n }\n return undefined;\n}\n\nfunction firstExecutable(candidates: readonly string[]): string | undefined {\n for (const candidate of candidates) {\n const resolved = resolveExecutable(candidate);\n if (resolved) return resolved;\n }\n return undefined;\n}\n\nexport function resolveTerminalShell(): ShellResolution {\n const explicitEntries = [\n [\"CODING_TOOLS_SHELL\", process.env.CODING_TOOLS_SHELL] as const,\n [\"SHELL\", process.env.SHELL] as const,\n ];\n for (const [key, raw] of explicitEntries) {\n const value = raw?.trim();\n if (!value) continue;\n const resolved = resolveExecutable(value);\n if (resolved) {\n return {\n shell: resolved,\n args: [\"-c\"],\n available: true,\n source: key === \"CODING_TOOLS_SHELL\" ? \"env:CODING_TOOLS_SHELL\" : \"env:SHELL\",\n };\n }\n }\n\n const candidates = isAndroidRuntime()\n ? [\"/system/bin/sh\", \"sh\"]\n : [\"/bin/bash\", \"bash\", \"/bin/sh\", \"sh\"];\n const shell = firstExecutable(candidates);\n if (shell) {\n return {\n shell,\n args: [\"-c\"],\n available: true,\n source: \"candidate\",\n };\n }\n\n return {\n shell: isAndroidRuntime() ? \"/system/bin/sh\" : \"sh\",\n args: [\"-c\"],\n available: false,\n source: \"fallback\",\n warning: isAndroidRuntime()\n ? \"No executable POSIX shell was detected. Android direct/AOSP local-yolo builds must expose /system/bin/sh or set CODING_TOOLS_SHELL to an executable shell.\"\n : \"No executable POSIX shell was detected. Set SHELL or CODING_TOOLS_SHELL to an executable shell.\",\n };\n}\n\nexport function detectTerminalCapabilities(): ToolCapability[] {\n return TERMINAL_TOOL_NAMES.map((name) => {\n if (name === \"sh\") {\n const shell = resolveTerminalShell();\n return {\n name,\n path: shell.available ? shell.shell : undefined,\n available: shell.available,\n };\n }\n const resolved = resolveExecutable(name);\n return {\n name,\n path: resolved,\n available: Boolean(resolved),\n };\n });\n}\n\nexport function formatTerminalCapabilities(capabilities = detectTerminalCapabilities()): string {\n return capabilities\n .map((capability) =>\n capability.available\n ? `${capability.name}=ok(${capability.path})`\n : `${capability.name}=missing`\n )\n .join(\" \");\n}\n\nexport function missingToolMessage(tool: TerminalToolName): string {\n if (tool === \"sh\") {\n return resolveTerminalShell().warning ?? \"No executable shell was detected.\";\n }\n const suffix = isAndroidRuntime()\n ? \" On Android direct/AOSP builds, ensure the binary is staged into the agent image and PATH includes /system/bin or the tool's install directory.\"\n : \" Install it or add it to PATH.\";\n return `${tool} CLI is not available in PATH.${suffix}`;\n}\n\nexport function missingTerminalToolForCommand(command: string): TerminalToolName | undefined {\n const tokens = command.trim().split(/\\s+/).filter(Boolean);\n let index = 0;\n while (tokens[index] && /^[A-Za-z_][A-Za-z0-9_]*=/.test(tokens[index])) {\n index += 1;\n }\n const first = tokens[index]?.replace(/^[\"']|[\"']$/g, \"\");\n if (!first) return undefined;\n const name = path.basename(first) as TerminalToolName;\n if (!(TERMINAL_TOOL_NAMES as readonly string[]).includes(name) || name === \"sh\") {\n return undefined;\n }\n return resolveExecutable(first) ? undefined : name;\n}\n\nexport function detectTerminalSupport(): TerminalSupport {\n if (isStoreBuild()) {\n return {\n supported: false,\n reason: \"store_build\",\n message:\n \"Local terminal execution is unavailable in store builds because the OS sandbox blocks spawning local shells and developer CLIs.\",\n };\n }\n\n if (isIosRuntime()) {\n return {\n supported: false,\n reason: \"vanilla_mobile\",\n message:\n \"Local terminal execution is unavailable on iOS because the runtime does not expose shell, coding, or orchestrator subprocess capabilities.\",\n };\n }\n\n if (isAndroidRuntime()) {\n if (runtimeMode() !== \"local-yolo\") {\n return {\n supported: false,\n reason: \"not_local_yolo\",\n message:\n \"Android direct/AOSP terminal execution requires ELIZA_RUNTIME_MODE=local-yolo so commands run in the local agent environment.\",\n };\n }\n const shell = resolveTerminalShell();\n if (!shell.available) {\n return {\n supported: false,\n reason: \"missing_shell\",\n message:\n shell.warning ??\n \"Android direct/AOSP terminal execution requires an executable shell. Set CODING_TOOLS_SHELL or SHELL to a staged shell binary.\",\n };\n }\n }\n\n return { supported: true };\n}\n",
18
+ "/**\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): {\n stdout: string;\n stderr: string;\n} {\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",
19
+ "import type { Plugin } from \"@elizaos/core\";\nimport { ExecApprovalService } from \"./approvals\";\nimport { shellHistoryProvider } from \"./providers\";\nimport { ShellService } from \"./services/shellService\";\n\nfunction terminalSupportedByEnv(env: Record<string, string | undefined>): boolean {\n const variant = (env.ELIZA_BUILD_VARIANT ?? \"\").trim().toLowerCase();\n if (variant === \"store\") return false;\n const platform = env.ELIZA_PLATFORM?.trim().toLowerCase();\n const mobile =\n platform === \"android\" || platform === \"ios\" || Boolean(env.ANDROID_ROOT || env.ANDROID_DATA);\n if (!mobile) return true;\n const mode = (env.ELIZA_RUNTIME_MODE ?? env.RUNTIME_MODE ?? env.LOCAL_RUNTIME_MODE ?? \"\")\n .trim()\n .toLowerCase();\n return platform === \"android\" && mode === \"local-yolo\";\n}\n\nexport const shellPlugin: Plugin = {\n name: \"shell\",\n description: \"Shell observability and history management providers\",\n services: [ShellService, ExecApprovalService],\n actions: [],\n providers: [shellHistoryProvider],\n async dispose(runtime) {\n await runtime.getService<ShellService>(ShellService.serviceType)?.stop();\n await runtime.getService<ExecApprovalService>(ExecApprovalService.serviceType)?.stop();\n },\n // Self-declared auto-enable: activate when features.shell is enabled.\n autoEnable: {\n shouldEnable: (env, config) => {\n const f = (config.features as Record<string, unknown> | undefined)?.shell;\n return (\n (f === true ||\n (typeof f === \"object\" &&\n f !== null &&\n (f as { enabled?: unknown }).enabled !== false)) &&\n terminalSupportedByEnv(env as Record<string, string | undefined>)\n );\n },\n },\n};\n\nexport default shellPlugin;\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\";\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\";\nexport {\n detectTerminalCapabilities,\n formatTerminalCapabilities,\n isAndroidRuntime,\n missingTerminalToolForCommand,\n missingToolMessage,\n resolveExecutable,\n resolveTerminalShell,\n type ShellResolution,\n TERMINAL_TOOL_NAMES,\n type TerminalToolName,\n type ToolCapability,\n} from \"./utils/terminalCapabilities\";\n"
20
+ ],
21
+ "mappings": "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",
22
+ "debugId": "84725595753D266B64756E2164756E21",
23
+ "names": []
24
+ }