Files
wehub-resource-sync 426e9eeabd
Benchmark Bridge Tests / benchmark (bunx @biomejs/biome check packages/lifeops-bench/src, benchmark-lint) (push) Waiting to run
Benchmark Bridge Tests / benchmark (bunx vitest run --config packages/lifeops-bench/vitest.config.ts --root packages/lifeops-bench --passWithNoTests, benchmark-tests) (push) Waiting to run
Build Agent Image / build-and-push (push) Waiting to run
Chat shell gestures / Chat shell gesture + parity e2e (push) Waiting to run
ci / test (push) Waiting to run
ci / lint-and-format (push) Waiting to run
ci / build (push) Waiting to run
ci / dev-startup (push) Waiting to run
Cloud Gateway Discord / Test (push) Waiting to run
Cloud Gateway Webhook / Test (push) Waiting to run
Cloud Tests / lint-and-types (push) Waiting to run
Cloud Tests / unit-tests (push) Waiting to run
Cloud Tests / integration-tests (push) Waiting to run
Cloud Tests / e2e-tests (push) Blocked by required conditions
CodeQL Advanced / Analyze (javascript-typescript) (push) Waiting to run
Deploy Apps Worker (Product 2) / Determine environment (push) Waiting to run
Deploy Apps Worker (Product 2) / Deploy apps worker to apps-control host (${{ needs.determine-env.outputs.environment }}) (push) Blocked by required conditions
Deploy Eliza Provisioning Worker / Determine environment (push) Waiting to run
Deploy Eliza Provisioning Worker / Deploy worker to Hetzner host (${{ needs.determine-env.outputs.environment }} @ ${{ needs.determine-env.outputs.deployment_sha }}) (push) Blocked by required conditions
Dev Smoke / Classify changed paths (push) Waiting to run
Dev Smoke / bun run dev onboarding chat (push) Blocked by required conditions
Dev Smoke / Vite HMR dependency-level smoke (push) Blocked by required conditions
Electrobun Submodule Guard / electrobun gitlink is fetchable (push) Waiting to run
gitleaks / gitleaks (push) Waiting to run
Markdown Links / Relative Markdown Links (push) Waiting to run
Publish @elizaos/example-code / check_npm (push) Waiting to run
Publish @elizaos/example-code / publish_npm (push) Blocked by required conditions
Publish @elizaos/plugin-elizacloud / verify_version (push) Waiting to run
Publish @elizaos/plugin-elizacloud / publish_npm (push) Blocked by required conditions
Quality (Extended) / Homepage Build (PR smoke) (push) Waiting to run
Quality (Extended) / Comment-only diff guard (push) Waiting to run
Quality (Extended) / Format + Type Safety Ratchet (push) Waiting to run
Quality (Extended) / Develop Gate (secret scan + UI determinism) (push) Waiting to run
Quality (Extended) / Develop Gate (lint) (push) Waiting to run
Sandbox Live Smoke / Sandbox live smoke (push) Waiting to run
Snap Build & Test / Build Snap (amd64) (push) Waiting to run
Snap Build & Test / Build Snap (arm64) (push) Waiting to run
supply-chain / sbom (push) Waiting to run
supply-chain / vulnerability-scan (push) Waiting to run
Build, Push & Deploy to Phala Cloud / build-and-push (push) Waiting to run
Test Packaging / Validate Packaging Configs (push) Waiting to run
Test Packaging / PyPI on Python ${{ matrix.python }} (push) Waiting to run
Test Packaging / Pack & Test JS Tarballs (push) Waiting to run
Test Packaging / elizaos CLI global-install smoke (node + bun) (push) Waiting to run
UI Fixture E2E / ui-fixture-e2e (push) Waiting to run
UI Fixture E2E / fixture-e2e (push) Waiting to run
UI Story Gate / story-gate (push) Waiting to run
vault-ci / test (macos-latest) (push) Waiting to run
vault-ci / test (ubuntu-latest) (push) Waiting to run
vault-ci / test (windows-latest) (push) Waiting to run
vault-ci / app-core wiring tests (push) Waiting to run
verify-patches / verify patches/CHECKSUMS.sha256 (push) Waiting to run
Voice Benchmark Smoke / voice-emotion fixture smoke (push) Waiting to run
Voice Benchmark Smoke / voiceagentbench fixture smoke (push) Waiting to run
Voice Benchmark Smoke / voicebench-quality unit smoke (push) Waiting to run
Voice Benchmark Smoke / voicebench TypeScript unit (no audio) (push) Waiting to run
Voice Benchmark Smoke / voice bench smoke summary (push) Blocked by required conditions
Windows CI / windows ([bun run --cwd packages/app-core test bun run --cwd packages/elizaos test bun run --cwd packages/cloud/shared test], app-and-cli) (push) Waiting to run
Windows CI / windows ([bun run --cwd packages/scenario-runner test bun run --cwd packages/vault test bun run --cwd packages/security test bun run --cwd plugins/plugin-coding-tools test], framework-packages) (push) Waiting to run
Windows CI / windows ([bun run --cwd plugins/plugin-elizacloud test bun run --cwd plugins/plugin-discord test bun run --cwd plugins/plugin-anthropic test bun run --cwd plugins/plugin-openai test bun run --cwd plugins/plugin-app-control test bun run --cwd plugins/pl… (push) Waiting to run
Windows CI / windows ([node packages/scripts/run-turbo.mjs run build --filter=@elizaos/core --filter=@elizaos/shared --filter=@elizaos/agent --concurrency=4 node packages/scripts/run-bash-linux-only.mjs scripts/verify-riscv64-buildpaths.sh node packages/scripts/run… (push) Waiting to run
Windows CI / windows ([node packages/scripts/run-turbo.mjs run typecheck --filter=@elizaos/core --filter=@elizaos/shared --filter=@elizaos/cloud-shared --concurrency=4 bun run --cwd packages/core test bun run --cwd packages/shared test], core-runtime, 75) (push) Waiting to run
Test Packaging / Build & Test PyPI Package (push) Waiting to run
Voice Workbench / headless workbench (mocked backends) (push) Has been cancelled
Voice Workbench / real acoustic lane (nightly, provisioned only) (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 12:43:05 +08:00

4.2 KiB

@elizaos/plugin-shell

Shell command execution plugin for elizaOS. Adds sandboxed shell access, PTY support, background session management, command approval, and shell history to an Eliza agent.

What it does

  • Executes shell commands restricted to a configured directory (SHELL_ALLOWED_DIRECTORY).
  • Supports interactive terminal applications via PTY (@lydell/node-pty, optional).
  • Runs long commands in the background with named sessions; poll, send-keys, paste, and kill them later.
  • Maintains per-conversation command history with stdout/stderr/exit-code capture.
  • Provides the SHELL_HISTORY context provider so the agent always knows its cwd and recent commands.
  • Provides ExecApprovalService to gate commands through an allowlist and user-approval flow.

The agent-facing SHELL action that exposes shell execution is in @elizaos/plugin-coding-tools, which consumes this plugin's services. Its action parameter (list/poll/kill/etc.) drives ShellService.processAction().

Installation

bun add @elizaos/plugin-shell

Configuration

# Required — commands cannot execute outside this directory
SHELL_ALLOWED_DIRECTORY=/path/to/safe/workspace

# Optional
SHELL_TIMEOUT=30000                  # per-command timeout ms (simple executeCommand)
SHELL_FORBIDDEN_COMMANDS=rm,mv       # comma-separated additions to the default blocklist
SHELL_MAX_OUTPUT_CHARS=200000        # max captured output chars per session
SHELL_BACKGROUND_MS=10000            # yield window before auto-backgrounding (ms)
SHELL_ALLOW_BACKGROUND=true          # set "false" to disable background execution
SHELL_JOB_TTL_MS=1800000            # finished session record TTL (ms)

SHELL_ALLOWED_DIRECTORY must point to an existing directory. The service throws at start if it is missing.

Enabling

Auto-enabled when config.features.shell is truthy. Not available on iOS, ELIZA_BUILD_VARIANT=store builds, or Android unless ELIZA_RUNTIME_MODE=local-yolo.

To enable explicitly in a character file:

import shellPlugin from "@elizaos/plugin-shell";

const character = {
  plugins: [shellPlugin],
};

Security

  • All commands execute within SHELL_ALLOWED_DIRECTORY. Path traversal and absolute paths outside the boundary are rejected.
  • A built-in blocklist prevents the most destructive commands (see DEFAULT_FORBIDDEN_COMMANDS in utils/config.ts).
  • Additional forbidden commands can be added via SHELL_FORBIDDEN_COMMANDS.
  • Commands time out automatically. Output is capped at SHELL_MAX_OUTPUT_CHARS.
  • ExecApprovalService can gate commands through an allowlist + user approval before execution.
  • Local execution is disabled in cloud mode (isCloudExecutionMode).

Process actions

Background sessions support these operations via ShellService.processAction():

Action Description
list List all running and finished sessions
poll Drain new output from a running session
log Read session output with offset/limit pagination
write Write raw data to session stdin
send-keys Send terminal key sequences (arrows, ctrl+c, etc.)
submit Send carriage return (Enter)
paste Paste text with bracketed paste mode
kill Kill a running session
clear Remove a finished session record
remove Kill (if running) and remove a session

Usage from code

import { ShellService } from "@elizaos/plugin-shell";

// Simple synchronous execution
const shellService = runtime.getService<ShellService>("shell");
const result = await shellService.executeCommand("ls -la", conversationId);

// Advanced: PTY + background
const execResult = await shellService.exec("bun install", {
  pty: true,
  yieldMs: 5000,   // background after 5 s if still running
  timeout: 300,    // 5-minute hard timeout (seconds)
  workdir: "/project",
});

if (execResult.status === "running") {
  // Poll later
  const poll = await shellService.processAction({
    action: "poll",
    sessionId: execResult.sessionId,
  });
}

Development

bun run --cwd plugins/plugin-shell build    # build dist/
bun run --cwd plugins/plugin-shell test     # vitest
bun run --cwd plugins/plugin-shell dev      # hot-reload build