Skip to content

Tools

Every tool the agent can call is defined in the built-in registry (src/tools/runner.ts). All inputs and outputs are validated with Zod schemas before and after execution. Tools have a risk class (read_only / write / execute) that the permission system uses to decide whether approval is needed.

Filesystem

ToolRiskDescription
fs.listreadList files/directories; supports recursive walk, hidden files, up to 5 000 entries
fs.readreadRead a file as UTF-8 with byte-level offset/limit slicing (max 512 KB per call)
fs.writewriteWrite a full file payload; auto-creates parent directories
fs.editwriteApply Unified Diff patches to one or more files in one call
fs.cdexecuteChange the agent’s working directory for the current run

Search

ToolRiskDescription
search.rgreadFull-text regex search via ripgrep (JSON output, grouped by file with snippets and context lines); falls back to Node walker when rg is not available
search.filesreadList project files respecting .gitignore and standard ignore dirs (node_modules, dist, .git, __pycache__, etc.); uses rg --files or Node walker
search.fuzzyreadFuzzy-score file paths; returns ranked results with match indices

Shell

ToolRiskDescription
shell.execexecuteRun a command through the host shell (bash -lc on Unix, powershell.exe -Command on Windows); timeout up to 120 s; stdout/stderr captured; timedOut flag

Git (exposed only when gitEnabled: true is set on the run)

ToolRiskDescription
git.statusexecutegit status --porcelain=v1 --branch — branch, upstream, ahead/behind, per-file index/worktree status
git.diffexecutegit diff patch + numstat; supports --cached and configurable context lines
git.applywriteApply a patch via git apply; supports --check (dry-run) and --cached
git.commitwritegit commit -m <message>; optionally -a to stage all tracked changes
git.pushexecutePush branch to remote; uses --force-with-lease instead of --force
git.pullexecutePull from remote; optional --rebase

Web

ToolRiskDescription
web.searchexecuteSearch the web and return ranked URLs with snippets; requires web mode cached or live; provider-agnostic (DuckDuckGo, Jina, SearXNG, Brave, Tavily)
web.fetchreadFetch a URL as clean markdown via Jina Reader (primary) or raw HTML fallback; maxChars up to 100 000

Three presets gate what tools the agent may call without asking:

PresetWritesExecute/Shell/Git
chat-readonlyNoNo
agent-defaultGated by approvalGated by approval
exec-fullYesYes

The permission manager evaluates each non-read-only call against the preset and any stored permission rules. The result is one of allow, ask (show an approval dialog in the TUI), or deny.

rg and git are resolved at runtime from: custom path in settings.jsonPATH → bundled fallback. Status for each external tool is visible in umbra doctor.

Add custom tool paths in ~/.umbra/settings.json under tools.customPaths:

{
"tools": {
"customPaths": {
"rg": "/usr/local/bin/rg",
"git": "/opt/homebrew/bin/git"
}
}
}