6.0 KiB
summary, read_when
| summary | read_when | ||
|---|---|---|---|
| Exec tool usage, stdin modes, and TTY support |
|
Exec tool
Run shell commands in the workspace. Supports foreground + background execution via process.
If process is disallowed, exec runs synchronously and ignores yieldMs/background.
Background sessions are scoped per agent; process only sees sessions from the same agent.
Parameters
command(required)workdir(defaults to cwd)env(key/value overrides)yieldMs(default 10000): auto-background after delaybackground(bool): background immediatelytimeout(seconds, default 1800): kill on expirypty(bool): run in a pseudo-terminal when available (TTY-only CLIs, coding agents, terminal UIs)host(sandbox | gateway | node): where to executesecurity(deny | allowlist | full): enforcement mode forgateway/nodeask(off | on-miss | always): approval prompts forgateway/nodenode(string): node id/name forhost=nodeelevated(bool): request elevated mode (gateway host);security=fullis only forced when elevated resolves tofull
Notes:
hostdefaults tosandbox.elevatedis ignored when sandboxing is off (exec already runs on the host).gateway/nodeapprovals are controlled by~/.clawdbot/exec-approvals.json.noderequires a paired node (companion app or headless node host).- If multiple nodes are available, set
exec.nodeortools.exec.nodeto select one. - On non-Windows hosts, exec uses
SHELLwhen set; ifSHELLisfish, it prefersbash(orsh) fromPATHto avoid fish-incompatible scripts, then falls back toSHELLif neither exists. - Important: sandboxing is off by default. If sandboxing is off,
host=sandboxruns directly on the gateway host (no container) and does not require approvals. To require approvals, run withhost=gatewayand configure exec approvals (or enable sandboxing).
Config
tools.exec.notifyOnExit(default: true): when true, backgrounded exec sessions enqueue a system event and request a heartbeat on exit.tools.exec.approvalRunningNoticeMs(default: 10000): emit a single “running” notice when an approval-gated exec runs longer than this (0 disables).tools.exec.host(default:sandbox)tools.exec.security(default:denyfor sandbox,allowlistfor gateway + node when unset)tools.exec.ask(default:on-miss)tools.exec.node(default: unset)tools.exec.pathPrepend: list of directories to prepend toPATHfor exec runs.tools.exec.safeBins: stdin-only safe binaries that can run without explicit allowlist entries.
Example:
{
tools: {
exec: {
pathPrepend: ["~/bin", "/opt/oss/bin"]
}
}
}
PATH handling
host=gateway: merges your login-shellPATHinto the exec environment (unless the exec call already setsenv.PATH). The daemon itself still runs with a minimalPATH:- macOS:
/opt/homebrew/bin,/usr/local/bin,/usr/bin,/bin - Linux:
/usr/local/bin,/usr/bin,/bin
- macOS:
host=sandbox: runssh -lc(login shell) inside the container, so/etc/profilemay resetPATH. Clawdbot prependsenv.PATHafter profile sourcing;tools.exec.pathPrependapplies here too.host=node: only env overrides you pass are sent to the node.tools.exec.pathPrependonly applies if the exec call already setsenv.PATH. Headless node hosts acceptPATHonly when it prepends the node host PATH (no replacement). macOS nodes dropPATHoverrides entirely.
Per-agent node binding (use the agent list index in config):
clawdbot config get agents.list
clawdbot config set agents.list[0].tools.exec.node "node-id-or-name"
Control UI: the Nodes tab includes a small “Exec node binding” panel for the same settings.
Session overrides (/exec)
Use /exec to set per-session defaults for host, security, ask, and node.
Send /exec with no arguments to show the current values.
Example:
/exec host=gateway security=allowlist ask=on-miss node=mac-1
Exec approvals (companion app / node host)
Sandboxed agents can require per-request approval before exec runs on the gateway or node host.
See Exec approvals for the policy, allowlist, and UI flow.
When approvals are required, the exec tool returns immediately with
status: "approval-pending" and an approval id. Once approved (or denied / timed out),
the Gateway emits system events (Exec finished / Exec denied). If the command is still
running after tools.exec.approvalRunningNoticeMs, a single Exec running notice is emitted.
Allowlist + safe bins
Allowlist enforcement matches resolved binary paths only (no basename matches). When
security=allowlist, shell commands are auto-allowed only if every pipeline segment is
allowlisted or a safe bin. Chaining (;, &&, ||) and redirections are rejected in
allowlist mode.
Examples
Foreground:
{"tool":"exec","command":"ls -la"}
Background + poll:
{"tool":"exec","command":"npm run build","yieldMs":1000}
{"tool":"process","action":"poll","sessionId":"<id>"}
Send keys (tmux-style):
{"tool":"process","action":"send-keys","sessionId":"<id>","keys":["Enter"]}
{"tool":"process","action":"send-keys","sessionId":"<id>","keys":["C-c"]}
{"tool":"process","action":"send-keys","sessionId":"<id>","keys":["Up","Up","Enter"]}
Submit (send CR only):
{"tool":"process","action":"submit","sessionId":"<id>"}
Paste (bracketed by default):
{"tool":"process","action":"paste","sessionId":"<id>","text":"line1\nline2\n"}
apply_patch (experimental)
apply_patch is a subtool of exec for structured multi-file edits.
Enable it explicitly:
{
tools: {
exec: {
applyPatch: { enabled: true, allowModels: ["gpt-5.2"] }
}
}
}
Notes:
- Only available for OpenAI/OpenAI Codex models.
- Tool policy still applies;
allow: ["exec"]implicitly allowsapply_patch. - Config lives under
tools.exec.applyPatch.