Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Config Reference

ZeroClaw is configured via a TOML file. All fields are optional unless noted.

SectionDescription
a2a[a2a] section wrapper. Kept as a
acpACP (Agent Client Protocol) server configuration ([acp] section).
agentsAliased agents in this install. Each entry under [agents.<alias>]
backupBackup tool configuration ([backup] section).
browserBrowser automation configuration ([browser] section).
browser_delegate
channelsTop-level channel configurations ([channels] section).
claude_codeClaude Code CLI tool configuration ([claude_code] section).
claude_code_runnerClaude Code task runner configuration ([claude_code_runner] section).
cloud_opsControls the read-only cloud transformation analysis tools:
codex_cliCodex CLI tool configuration ([codex_cli] section).
composioComposio managed OAuth tools integration ([composio] section).
conversational_aiConversational AI agent builder configuration ([conversational_ai] section).
costCost tracking and budget enforcement configuration ([cost] section).
cronDeclarative cron jobs ([cron.<alias>]), alias-keyed.
data_retentionData retention and purge configuration ([data_retention] section).
delegateGlobal delegate tool configuration for default timeout values.
embedding_routesEmbedding-routing rules — route hint:<name> to specific
escalationEscalation routing configuration ([escalation] section).
evalConfiguration for the agent evaluation harness ([eval]), surfaced via the
file_downloadStandalone file download tool configuration ([file_download]).
file_uploadStandalone file upload tool configuration ([file_upload]).
file_upload_bundleStandalone multi-file bundle upload tool configuration
gatewayGateway server configuration ([gateway] section).
gemini_cliGemini CLI tool configuration ([gemini_cli] section).
google_workspaceGoogle Workspace CLI (gws) tool configuration ([google_workspace] section).
hardwareWizard-driven hardware configuration for physical world interaction.
heartbeatHeartbeat configuration for periodic health pings ([heartbeat] section).
hooks
http_requestHTTP request tool configuration ([http_request] section).
image_genStandalone image generation tool configuration ([image_gen]).
jiraJira integration configuration ([jira]).
knowledgeKnowledge graph configuration for capturing and reusing expertise.
knowledge_bundlesNamed knowledge bundles ([knowledge_bundles.<alias>]).
link_enricherAutomatic link understanding for inbound channel messages ([link_enricher]).
linkedinLinkedIn integration configuration ([linkedin] section).
localeLocale for tool descriptions (e.g. "en", "zh-CN").
mcpExternal MCP client configuration ([mcp] section).
mcp_bundlesNamed MCP server bundles ([mcp_bundles.<alias>]).
media_pipelineAutomatic media understanding pipeline configuration ([media_pipeline]).
memoryMemory backend configuration ([memory] section).
microsoft365Microsoft 365 integration via Microsoft Graph API ([microsoft365] section).
model_routesModel-routing rules — route hint:<name> to specific
multimodalMultimodal (image) handling configuration ([multimodal] section).
node_transportSecure transport configuration for inter-node communication ([node_transport]).
nodesConfiguration for the dynamic node discovery system ([nodes]).
notionNotion integration configuration ([notion]).
observabilityObservability backend configuration ([observability] section).
onboard_stateMulti-client workspace isolation configuration.
opencode_cliOpenCode CLI tool configuration ([opencode_cli] section).
pacingPacing controls for slow/local LLM workloads ([pacing] section).
peer_groupsNamed peer groups ([peer_groups.<name>]). Each entry binds a
peripheralsPeripheral board integration configuration ([peripherals] section).
pipelinePipeline tool configuration ([pipeline] section).
pluginsPlugin system configuration.
project_intelProject delivery intelligence configuration ([project_intel] section).
providersTop-level wrapper for every provider category. TOML root sees a
proxyProxy configuration for outbound HTTP/HTTPS/SOCKS5 traffic ([proxy] section).
query_classificationAutomatic query classification — classifies user messages by keyword/pattern
reliabilityReliability and supervision configuration ([reliability] section).
risk_profilesNamed risk/autonomy profiles ([risk_profiles.<alias>]).
runtimeRuntime adapter configuration ([runtime] section).
runtime_profilesNamed runtime/LLM execution profiles ([runtime_profiles.<alias>]).
schedulerScheduler configuration for periodic task execution ([scheduler] section).
schema_versionConfig file schema version.
secretsSecrets encryption configuration ([secrets] section).
securitySecurity configuration for audit logging, OTP, e-stop, IAM/SSO, and WebAuthn.
security_opsManaged Cybersecurity Service (MCSS) dashboard agent configuration ([security_ops]).
shell_toolShell tool configuration ([shell_tool] section).
skill_bundlesNamed skill bundles ([skill_bundles.<alias>]).
skillsSkills loading configuration ([skills] section).
sopStandard Operating Procedures engine configuration ([sop]).
storagePersistent storage configuration ([storage] section).
text_browserText browser tool configuration ([text_browser] section).
todotrackerZeroCode live task tracker configuration ([todotracker] section).
transcriptionVoice transcription configuration with multi-provider support.
trust
ttsText-to-Speech subsystem configuration ([tts]).
tunnelTunnel configuration for exposing the gateway publicly ([tunnel] section).
verifiable_intentVerifiable Intent (VI) credential verification and issuance ([verifiable_intent] section).
web_fetchWeb fetch tool configuration ([web_fetch] section).
web_searchWeb search tool configuration ([web_search] section).
wssWebSocket Secure (WSS) transport for remote TUI-to-daemon connections ([wss]).

a2a

[a2a] section wrapper. Kept as a dedicated wrapper so the a2a table can host sibling sub-tables (outbound client config, signing) in later slices without moving server.

Server-level exposure gate for A2A agent discovery. Default-closed: the server serves nothing until [a2a.server] enabled = true, and even then only aliases that opt in via [agents.<alias>.a2a] published = true appear. The discovery routes serve on the gateway’s own listener; public exposure follows the gateway’s bind posture. See crates/zeroclaw-gateway/src/a2a.rs.

KeyTypeDefaultDescription
serverobject[a2a.server] — inbound A2A discovery server.

a2a.server

[a2a.server] — inbound A2A discovery server.

Wrapped under [a2a.server] (two-level) via [A2aServerSection] so the a2a table can grow sibling sub-tables later (e.g. client config) without a breaking move.

KeyTypeDefaultDescription
bindstring?Optional advertise-only host override for card endpoint URLs. The
enabledboolfalseMaster switch for the inbound A2A surface. Default false: no
portinteger?Optional advertise-only port override, paired with bind. None
public_base_urlstring""Externally reachable base URL advertised in card endpoint fields

acp

ACP (Agent Client Protocol) server configuration ([acp] section).

KeyTypeDefaultDescription
default_agentstring?Agent alias to use when session/new omits agentAlias and more than
max_sessionsinteger10Maximum number of concurrent ACP sessions. Default: 10.
session_timeout_secsinteger3600Idle session timeout in seconds. Sessions with no activity for this

agents

Aliased agents in this install. Each entry under [agents.<alias>] is one user-facing agent with its own identity, channels, model provider, risk profile, workspace, and memory scope. DelegateTool consults this map when one agent delegates a subtask to another.

agents.<alias>

Configuration for an aliased agent. Each [agents.<alias>] TOML block deserializes into one of these. The DelegateTool looks up entries here to dispatch a subtask to a named sibling agent.

KeyTypeDefaultDescription
a2aobjectPer-alias A2A publication block ([agents.<alias>.a2a]).
acp_enable_mcpboolfalseInitialize this agent’s mcp_bundles tools when it serves an ACP
channelsstring[][]Channel aliases this agent handles (e.g. ["telegram.<alias>", "discord.<alias>"]).
classifier_providerstringReference to a configured [providers.models.<type>.<alias>] entry.
cron_jobsstring[][]Cron job aliases. Each entry references cron[key], a declarative
delegate_same_risk_profilebooltrueAuto-allow delegation to every agent sharing this agent’s risk
delegatesobject[][]Explicit delegate roster: additional agent aliases this agent may
enabledbooltrueWhether this agent is active. Set false to disable without removing the definition.
identityobjectIdentity format configuration ([identity] section).
knowledge_bundlesstring[][]Knowledge bundle aliases. Additive: the agent loads every listed
mcp_bundlesstring[][]MCP bundle aliases. Each entry references mcp_bundles[key], a named
memoryobjectPer-agent memory backend selection, nested under
model_providerstringReference to a configured [providers.models.<type>.<alias>] entry.
precheckobjectChannel reply-intent precheck configuration.
risk_profilestringReference to a configured [risk_profiles.<type>.<alias>] entry.
runtime_profilestringReference to a configured [runtime_profiles.<type>.<alias>] entry.
skill_bundlesstring[][]Skill bundle aliases. Each entry resolves to
summary_providerstringReference to a configured [providers.models.<type>.<alias>] entry.
transcription_providerstringReference to a configured [providers.transcription.<type>.<alias>] entry.
tts_providerstringReference to a configured [providers.tts.<type>.<alias>] entry.
workspaceobjectPer-agent filesystem and cross-agent access settings, nested under

agents.<alias>.a2a

Per-alias A2A publication block ([agents.<alias>.a2a]).

Default-closed second gate: even with the server enabled, an alias is absent from discovery until published = true. exposed_skills is a filter over the alias’s resolved skill set (from skill_bundles / mcp_bundles), never a parallel registry: empty means expose no skills on the card; a non-empty list selects which resolved skill ids appear. The bundles remain the single source of truth for what the agent can do.

KeyTypeDefaultDescription
exposed_skillsstring[][]Filter selecting which resolved skill ids appear on this alias’s
publishedboolfalsePublish this alias as a discoverable A2A agent. Default false:

agents.<alias>.identity

Identity format configuration ([identity] section).

Supports "openclaw" (default) or "aieos" identity documents.

KeyTypeDefaultDescription
aieos_inlinestring?nullInline AIEOS JSON (alternative to file path)
aieos_pathstring?nullPath to AIEOS JSON file (relative to workspace)
formatstring"openclaw"Identity format: “openclaw” (default) or “aieos”

agents.<alias>.memory

Per-agent memory backend selection, nested under [agents.<alias>.memory].

The backend field is locked at agent creation and immutable on subsequent loads (Config::validate() enforces this against the persisted on-disk state). Cross-backend memory sharing across the per-agent read_memory_from allowlist is rejected at validation: allowlist entries must point at same-backend siblings.

KeyTypeDefaultDescription
backendtablePer-agent memory backend selector.

agents.<alias>.precheck

Channel reply-intent precheck configuration.

The precheck runs a lightweight REPLY / NO_REPLY classifier before the main agent loop so group-chat messages that are not addressed to the assistant do not trigger a full tool-using turn.

In V3 multi-agent configs this block is configured inside each agent as [agents.<alias>.precheck]. Defaults preserve the current behavior: the classifier is enabled, model/provider selection follows the agent’s classifier_provider ref when configured and otherwise reuses the active route model, and provider errors or timeouts fail open to REPLY. timeout_secs must be greater than zero.

KeyTypeDefaultDescription
enabledbooltrueWhen false, the precheck is skipped entirely for this agent and every
timeout_secsinteger5Hard ceiling (seconds) on the precheck LLM call. On timeout the

agents.<alias>.workspace

Per-agent filesystem and cross-agent access settings, nested under [agents.<alias>.workspace].

path = None means derive the working directory from the install root and agent alias (<install>/agents/<alias>/workspace/); set Some(path) to put a specific agent’s workspace on a different disk or filesystem. The access map is the inbound cross-agent filesystem allowlist (key = sibling agent alias, value = read/write/read+write grant); empty means jailed. unrestricted_filesystem is the escape hatch for agents that genuinely need to read or write outside any per-agent scope; off by default and audited.

read_memory_from is the cross-agent memory allowlist (parallel to access but for the memory layer). The schema validates entries for cross-reference and same-backend invariants at config load.

KeyTypeDefaultDescription
accessmap{}Cross-agent filesystem allowlist (inbound declaration). Key is
pathstring?Optional explicit workspace path. None = derive from
read_memory_fromstring[][]Cross-agent memory allowlist (inbound declaration). Each alias
unrestricted_filesystemboolfalseEscape hatch: when true, the agent can read or write anywhere

backup

Backup tool configuration ([backup] section).

KeyTypeDefaultDescription
compressbooltrueCompress backup archives.
destination_dirstring"state/backups"Output directory for backup archives (relative to workspace root).
enabledbooltrueEnable the backup tool.
encryptboolfalseEncrypt backup archives (requires a configured secret store key).
include_dirsstring[]["config","memory","audit","knowledge"]Workspace subdirectories to include in backups.
max_keepinteger10Maximum number of backups to keep (oldest are pruned).
schedule_cronstring?nullOptional cron expression for scheduled automatic backups.
schedule_timezonestring?nullIANA timezone for schedule_cron.

browser

Browser automation configuration ([browser] section).

Controls the browser_open tool and browser automation backends.

KeyTypeDefaultDescription
allowed_domainsstring[]["*"]Allowed domains for browser_open (exact or subdomain match)
allowed_private_hostsstring[][]Private/internal hosts allowed to bypass SSRF protection.
backendstring"agent_browser"Browser automation backend: “agent_browser” | “rust_native” | “computer_use” | “auto”
computer_useobjectComputer-use sidecar configuration ([browser.computer_use] section).
enabledbooltrueEnable browser_open tool (opens URLs in the system browser without scraping)
headedbool?nullShow browser window for agent_browser backend. When unset, inherits AGENT_BROWSER_HEADED.
native_chrome_pathstring?nullOptional Chrome/Chromium executable path for rust-native backend
native_headlessbooltrueHeadless mode for rust-native backend
native_webdriver_urlstring"http://127.0.0.1:9515"WebDriver endpoint URL for rust-native backend (e.g. http://127.0.0.1:9515)
session_namestring?nullBrowser session name (for agent-browser automation)

browser.computer_use

Computer-use sidecar configuration ([browser.computer_use] section).

Delegates OS-level mouse, keyboard, and screenshot actions to a local sidecar.

KeyTypeDefaultDescription
allow_remote_endpointboolfalseAllow remote/public endpoint for computer-use sidecar (default: false)
api_key 🔑string?nullOptional bearer token for computer-use sidecar
endpointstring"http://127.0.0.1:8787/v1/actions"Sidecar endpoint for computer-use actions (OS-level mouse/keyboard/screenshot)
max_coordinate_xinteger?nullOptional X-axis boundary for coordinate-based actions
max_coordinate_yinteger?nullOptional Y-axis boundary for coordinate-based actions
timeout_msinteger15000Per-action request timeout in milliseconds
window_allowliststring[][]Optional window title/process allowlist forwarded to sidecar policy

browser_delegate

KeyTypeDefaultDescription
allowed_domainsstring[][]
blocked_domainsstring[][]
chrome_profile_dirstring""
cli_binarystring"claude"
enabledboolfalse
task_timeout_secsinteger120

channels

Top-level channel configurations ([channels] section).

each channel type is a keyed table of named instances (aliases). [channels.telegram.default] is the conventional single-instance key. Access via config.channels.telegram.get("default").

KeyTypeDefaultDescription
ack_reactionsbooltrueWhether to add acknowledgement reactions (👀 on receipt, ✅/⚠️ on
amqpmapAMQP channel instances ([channels.amqp.<alias>]).
blueskymapBluesky channel instances ([channels.bluesky.<alias>]).
clawdtalkmapClawdTalk voice channel instances ([channels.clawdtalk.<alias>]).
clibooltrueEnable the CLI interactive channel. Default: true.
debounce_msinteger0Inbound message debounce window in milliseconds. When a sender fires
dingtalkmapDingTalk channel instances ([channels.dingtalk.<alias>]).
discordmapDiscord bot channel instances ([channels.discord.<alias>]).
emailmapEmail channel instances ([channels.email.<alias>]).
filesystemmapFilesystem SOP listener instances ([channels.filesystem.<alias>]).
gitmapGit-forge channel instances ([channels.git.<alias>]). GitHub is
gmail_pushmapGmail Pub/Sub push notification channel instances ([channels.gmail_push.<alias>]).
imessagemapiMessage channel instances ([channels.imessage.<alias>], macOS only).
ircmapIRC channel instances ([channels.irc.<alias>]).
larkmapLark channel instances ([channels.lark.<alias>]).
linemapLINE Messaging API channel instances ([channels.line.<alias>]).
linqmapLinq Partner API channel instances ([channels.linq.<alias>]).
matrixmapMatrix channel instances ([channels.matrix.<alias>]).
mattermostmapMattermost bot channel instances ([channels.mattermost.<alias>]).
max_concurrent_per_channelinteger4Per-channel multiplier for the global channel message in-flight budget.
message_timeout_secsinteger300Base timeout in seconds for processing a single channel message (LLM + tools).
mochatmapMochat customer service channel instances ([channels.mochat.<alias>]).
mqttmapMQTT channel instances ([channels.mqtt.<alias>]).
nextcloud_talkmapNextcloud Talk bot channel instances ([channels.nextcloud_talk.<alias>]).
nostrmap
qqmapQQ Official Bot channel instances ([channels.qq.<alias>]).
redditmapReddit channel instances ([channels.reddit.<alias>]).
session_backendstring"sqlite"Session persistence backend: "jsonl" (legacy) or "sqlite" (new default).
session_persistencebooltruePersist channel conversation history to JSONL files so sessions survive
session_ttl_hoursinteger0Auto-archive stale sessions older than this many hours. 0 disables. Default: 0.
show_tool_callsboolfalseWhether to send tool-call notification messages (e.g. 🔧 web_search_tool: …)
signalmapSignal channel instances ([channels.signal.<alias>]).
slackmapSlack bot channel instances ([channels.slack.<alias>]).
telegrammapTelegram bot channel instances ([channels.telegram.<alias>]).
twitchmapTwitch chat channel instances ([channels.twitch.<alias>]).
twittermapX/Twitter channel instances ([channels.twitter.<alias>]).
voice_callmapVoice call channel instances ([channels.voice_call.<alias>]).
voice_duplexmapVoice duplex instances ([channels.voice_duplex.<alias>]).
voice_wakemapVoice wake word detection channel instances ([channels.voice_wake.<alias>]).
watimapWATI WhatsApp Business API channel instances ([channels.wati.<alias>]).
webhookmapWebhook channel instances ([channels.webhook.<alias>]).
wechatmapWeChat personal iLink Bot channel instances ([channels.wechat.<alias>]).
wecommapWeCom (WeChat Enterprise) Bot Webhook channel instances ([channels.wecom.<alias>]).
wecom_wsmapWeCom AI Bot WebSocket channel instances ([channels.wecom_ws.<alias>]).
whatsappmapWhatsApp channel instances ([channels.whatsapp.<alias>]).

claude_code

Claude Code CLI tool configuration ([claude_code] section).

Delegates coding tasks to the claude -p CLI. Authentication uses the binary’s own OAuth session (Max subscription) by default — no API key needed unless env_passthrough includes ANTHROPIC_API_KEY.

KeyTypeDefaultDescription
allowed_toolsstring[]["Read","Edit","Bash","Write"]Claude Code tools the subprocess is allowed to use
enabledboolfalseEnable the claude_code tool
env_passthroughstring[][]Extra env vars passed to the claude subprocess (e.g. ANTHROPIC_API_KEY for API-key billing)
max_output_bytesinteger2097152Maximum output size in bytes (2MB default)
system_promptstring?nullOptional system prompt appended to Claude Code invocations
timeout_secsinteger600Maximum execution time in seconds (coding tasks can be long)

claude_code_runner

Claude Code task runner configuration ([claude_code_runner] section).

Spawns Claude Code in a tmux session with HTTP hooks that POST tool execution events back to ZeroClaw’s gateway, updating a Slack message in-place with progress plus an SSH handoff link.

KeyTypeDefaultDescription
enabledboolfalseEnable the claude_code_runner tool
session_ttlinteger3600Session time-to-live in seconds before auto-cleanup (default: 3600)
ssh_hoststring?nullSSH host for session handoff links (e.g. “myhost.example.com”)
tmux_prefixstring"zc-claude-"Prefix for tmux session names (default: “zc-claude-”)

cloud_ops

Controls the read-only cloud transformation analysis tools: IaC review, migration assessment, cost analysis, and architecture review.

KeyTypeDefaultDescription
cost_threshold_monthly_usdnumber100.0Monthly USD threshold to flag cost items. Default: 100.0.
default_cloudstring"aws"Default cloud model_provider for analysis context. Default: “aws”.
enabledboolfalseEnable cloud operations tools. Default: false.
iac_toolsstring[]["terraform"]Supported IaC tools for review. Default: [terraform].
supported_cloudsstring[]["aws","azure","gcp"]Supported cloud model_providers. Default: [aws, azure, gcp].
well_architected_frameworksstring[]["aws-waf"]Well-Architected Frameworks to check against. Default: [aws-waf].

codex_cli

Codex CLI tool configuration ([codex_cli] section).

Delegates coding tasks to the codex exec CLI. Authentication uses the binary’s own session by default — no API key needed unless env_passthrough includes OPENAI_API_KEY.

KeyTypeDefaultDescription
enabledboolfalseEnable the codex_cli tool
env_passthroughstring[][]Extra env vars passed to the codex subprocess (e.g. OPENAI_API_KEY)
extra_argsstring[][]Extra CLI arguments appended to codex exec before the prompt.
max_output_bytesinteger2097152Maximum output size in bytes (2MB default)
timeout_secsinteger600Maximum execution time in seconds (coding tasks can be long)

composio

Composio managed OAuth tools integration ([composio] section).

Provides access to 1000+ OAuth-connected tools via the Composio platform.

KeyTypeDefaultDescription
api_key 🔑string?nullComposio API key (stored encrypted when secrets.encrypt = true)
enabledboolfalseEnable Composio integration for 1000+ OAuth tools
entity_idstring"default"Default entity ID for multi-user setups

conversational_ai

Conversational AI agent builder configuration ([conversational_ai] section).

Status: Reserved for future use. This configuration is parsed but not yet consumed by the runtime. Setting enabled = true will produce a startup warning.

KeyTypeDefaultDescription
analytics_enabledboolfalseEnable conversation analytics tracking. Default: false (privacy-by-default).
auto_detect_languagebooltrueAutomatically detect user language from message content. Default: true.
conversation_timeout_secsinteger1800Conversation timeout in seconds (inactivity). Default: 1800.
default_languagestring"en"Default language for conversations (BCP-47 tag). Default: “en”.
enabledboolfalseEnable conversational AI features. Default: false.
escalation_confidence_thresholdnumber0.3Intent confidence below this threshold triggers escalation. Default: 0.3.
knowledge_base_toolstring?nullOptional tool name for RAG-based knowledge base lookup during conversations.
max_conversation_turnsinteger50Maximum conversation turns before auto-ending. Default: 50.
supported_languagesstring[]["en","de","fr","it"]Supported languages for conversations. Default: [en, de, fr, it].

cost

Cost tracking and budget enforcement configuration ([cost] section).

KeyTypeDefaultDescription
allow_overrideboolfalseAllow requests to exceed budget with –override flag (default: false)
daily_limit_usdnumber10.0Daily spending limit in USD (default: 10.00)
enabledbooltrueEnable cost tracking (default: true)
enforcementobjectConfiguration for cost enforcement behavior when budget limits are reached.
monthly_limit_usdnumber100.0Monthly spending limit in USD (default: 100.00)
ratesobject[cost.rates] — top-level rate-sheet namespace. Mirrors the
track_per_agentbooltrueStamp each recorded cost entry with the originating agent alias so
warn_at_percentinteger80Warn when spending reaches this percentage of limit (default: 80)

cost.enforcement

Configuration for cost enforcement behavior when budget limits are reached.

KeyTypeDefaultDescription
modestring"warn"Enforcement mode: “warn”, “block”, or “route_down”.
reserve_percentinteger10Reserve this percentage of budget for critical operations.
route_down_modelstring?nullModel hint to route to when budget is exceeded (used with “route_down” mode).

cost.rates

[cost.rates] — top-level rate-sheet namespace. Mirrors the [providers.*] shape so each subsection here points at the same kind of resource its [providers.*] counterpart configures.

KeyTypeDefaultDescription
providersobject[cost.rates.providers.*] — provider-shaped rate sheets. Each field
toolsmap{}[cost.rates.tools.<name>] — per-call rates for tools that

cost.rates.providers

[cost.rates.providers.*] — provider-shaped rate sheets. Each field here mirrors a corresponding field on [providers.*] with the trailing alias segment replaced by the resource the rate prices. The inner typed wrappers carry the per-provider-type slot layout and own dispatch (their slot list is the single source of truth, shared with their providers counterpart via the for_each_*_provider_slot! macros in [crate::providers]).

KeyTypeDefaultDescription
modelsobject[cost.rates.providers.models.<type>.<model>] — token-cost rates
transcriptionobjectcost.rates.providers.transcription.<type>.<model>
ttsobjectcost.rates.providers.tts.<type>.<voice>

cron

Declarative cron jobs ([cron.<alias>]), alias-keyed.

Each entry is a named scheduled job synced into the database at scheduler startup. Subsystem runtime knobs (enable/disable, catch-up, run-history retention) live on [scheduler].

cron.<alias>

A declarative cron job definition ([cron.<alias>]).

Stored alias-keyed on Config.cron. The map key serves as the stable job id. Synced into the database at scheduler startup with source = "declarative", distinguishing them from jobs created imperatively via CLI or API. Declarative config takes precedence on each sync: if the config changes, the DB is updated to match. Imperative jobs are never deleted by sync.

KeyTypeDefaultDescription
allowed_toolsstring[]?nullOptional allowlist of tool names for agent jobs. When omitted, scheduler
commandstring?nullShell command to run (required when job_type = "shell").
deliveryobjectDelivery configuration for declarative cron jobs.
enabledbooltrueWhether the job is enabled. Default: true.
job_typestring"shell"Job type: "shell" (default) or "agent".
modelstring?nullModel override for agent jobs.
namestring?nullHuman-readable name.
promptstring?nullAgent prompt (required when job_type = "agent").
scheduletableSchedule variant for declarative cron jobs.
session_targetstring?nullSession target: "isolated" (default) or "main".
uses_memorybooltrueWhether to recall and inject memory context before this agent job runs.

cron.<alias>.delivery

Delivery configuration for declarative cron jobs.

KeyTypeDefaultDescription
best_effortbooltrueBest-effort delivery. Default: true.
channelstring?nullChannel name (e.g. "telegram", "discord").
modestring"none"Delivery mode: "none" or "announce".
thread_idstring?Optional thread/conversation identifier carried into the outbound send.
tostring?nullTarget/recipient identifier.

data_retention

Data retention and purge configuration ([data_retention] section).

KeyTypeDefaultDescription
categoriesstring[][]Limit retention enforcement to specific data categories (empty = all).
dry_runboolfalsePreview what would be deleted without actually removing anything.
enabledboolfalseEnable the data_management tool.
retention_daysinteger90Days of data to retain before purge eligibility.

delegate

Global delegate tool configuration for default timeout values.

KeyTypeDefaultDescription
agentic_timeout_secsinteger300Default timeout in seconds for agentic sub-agent runs.
timeout_secsinteger120Default timeout in seconds for non-agentic sub-agent model_provider calls.

embedding_routes

Embedding-routing rules — route hint:<name> to specific model_provider + model combos for embedding requests.

escalation

Escalation routing configuration ([escalation] section).

Controls which channels receive alert notifications when escalate_to_human is called with high or critical urgency. Channels are identified by name (e.g. "telegram", "slack"). Alerts are sent best-effort and do not block the escalation.

KeyTypeDefaultDescription
alert_channelsstring[][]Channel names to alert on high/critical escalations (default: empty).

eval

Configuration for the agent evaluation harness ([eval]), surfaced via the zeroclaw eval command. Distinct from [agent.eval], which is the in-loop response-quality scorer.

KeyTypeDefaultDescription
modestring"replay"Default execution mode (replay or live) used when --mode is omitted.
suite_dirstring"evals"Default directory of *.json trace fixtures used when --suite is omitted.

file_download

Standalone file download tool configuration ([file_download]).

When url is set to a non-empty value, registers a file_download tool that GETs a file from the configured endpoint and writes it to the agent’s workspace filesystem. The LLM supplies only a document identifier and a workspace-relative destination path; the endpoint URL comes solely from this config and is never model-controlled. Response bytes are streamed to disk and never loaded into model context.

When url is None or empty, the tool is not registered.

KeyTypeDefaultDescription
headers 🔑map{}Static HTTP headers attached to every download request — typically an
max_file_size_bytesinteger26214400Maximum download size in bytes. Enforced while streaming: the transfer
timeout_secsinteger120Request timeout in seconds. Default: 120.
urlstring?nullDownload endpoint URL. Tool is disabled when this is None or empty.

file_upload

Standalone file upload tool configuration ([file_upload]).

When url is set to a non-empty value, registers a file_upload tool that POSTs files from the agent’s local filesystem to the configured endpoint using multipart/form-data. The LLM provides only a file path; the host reads the bytes and uploads them without ever including file content in the model context.

When url is None or empty, the tool is not registered.

KeyTypeDefaultDescription
field_namestring"file"Multipart form-field name for the file part. Default: file.
headers 🔑map{}Static HTTP headers attached to every upload request. Same shape as
max_file_size_bytesinteger26214400Maximum file size in bytes. Larger files are rejected before any
methodstring"POST"HTTP method. Only POST (default) and PUT are accepted.
timeout_secsinteger60Request timeout in seconds. Default: 60.
urlstring?nullUpload endpoint URL. Tool is disabled when this is None or empty.

file_upload_bundle

Standalone multi-file bundle upload tool configuration ([file_upload_bundle]).

When url is set to a non-empty value, registers a file_upload_bundle tool that POSTs N files from the agent’s local filesystem to the configured endpoint as a single multipart/form-data request. The LLM provides only file paths; the host reads the bytes.

When url is None or empty, the tool is not registered.

KeyTypeDefaultDescription
field_namestring"file"Multipart form-field name reused across every file part. Default: file.
headers 🔑map{}Static HTTP headers attached to every upload request.
max_file_size_bytesinteger10485760Maximum per-file size in bytes. Default: 10 MiB.
max_filesinteger16Maximum number of files per call. Default: 16.
max_response_body_bytesinteger4096Maximum response body bytes to read from the upload endpoint.
max_total_size_bytesinteger33554432Maximum cumulative size across every file in one call. Default: 32 MiB.
methodstring"POST"HTTP method. Only POST (default) and PUT are accepted.
timeout_secsinteger120Request timeout in seconds. Default: 120.
urlstring?nullUpload endpoint URL. Tool is disabled when this is None or empty.

gateway

Gateway server configuration ([gateway] section).

Controls the HTTP gateway for webhook and pairing endpoints.

KeyTypeDefaultDescription
allow_public_bindboolfalseAllow binding to non-localhost without a tunnel (default: false)
allow_remote_adminboolfalseAllow authenticated remote callers to use admin endpoints that are
hoststring"127.0.0.1"Gateway host (default: 127.0.0.1)
idempotency_max_keysinteger10000Maximum distinct idempotency keys retained in memory.
idempotency_ttl_secsinteger300TTL for webhook idempotency keys.
long_running_request_timeout_secsinteger600HTTP request timeout (seconds) for POST /api/cron/{id}/run, which
pair_rate_limit_per_minuteinteger10Max /pair requests per minute per client key.
paired_tokens 🔑string[][]Paired bearer tokens (managed automatically, not user-edited)
pairing_dashboardobjectPairing dashboard configuration ([gateway.pairing_dashboard]).
path_prefixstring?nullOptional URL path prefix for reverse-proxy deployments.
portinteger42617Gateway port (default: 42617)
rate_limit_max_keysinteger10000Maximum distinct client keys tracked by gateway rate limiter maps.
request_timeout_secsinteger30HTTP request timeout (seconds) for gateway routes other than the
require_pairingbooltrueRequire pairing before accepting requests (default: true)
session_persistencebooltruePersist gateway WebSocket chat sessions to SQLite. Default: true.
session_ttl_hoursinteger0Auto-archive stale gateway sessions older than N hours. 0 = disabled. Default: 0.
tlsobjectTLS configuration for the gateway server ([gateway.tls]).
trust_forwarded_headersboolfalseTrust proxy-forwarded client IP headers (X-Forwarded-For, X-Real-IP).
web_dist_dirstring?nullPath to the web dashboard dist directory. When set, the gateway
webhook_rate_limit_per_minuteinteger60Max /webhook requests per minute per client key.

gateway.pairing_dashboard

Pairing dashboard configuration ([gateway.pairing_dashboard]).

KeyTypeDefaultDescription
code_lengthinteger8Length of pairing codes (default: 8)
code_ttl_secsinteger3600Time-to-live for pending pairing codes in seconds (default: 3600)
lockout_secsinteger300Lockout duration in seconds after max attempts (default: 300)
max_failed_attemptsinteger5Maximum failed pairing attempts before lockout (default: 5)
max_pending_codesinteger3Maximum concurrent pending pairing codes (default: 3)

gateway.tls

TLS configuration for the gateway server ([gateway.tls]).

KeyTypeDefaultDescription
cert_path*stringPath to the PEM-encoded server certificate file.
client_authobjectClient certificate authentication (mTLS) configuration ([gateway.tls.client_auth]).
enabledboolfalseEnable TLS for the gateway (default: false).
key_path*stringPath to the PEM-encoded server private key file.

gateway.tls.client_auth

Client certificate authentication (mTLS) configuration ([gateway.tls.client_auth]).

KeyTypeDefaultDescription
ca_cert_pathstring""Path to the PEM-encoded CA certificate used to verify client certs.
enabledboolfalseEnable client certificate verification (default: false).
pinned_certsstring[][]Optional SHA-256 fingerprints for certificate pinning.
require_client_certbooltrueReject connections that do not present a valid client certificate (default: true).

gemini_cli

Gemini CLI tool configuration ([gemini_cli] section).

Delegates coding tasks to the gemini -p CLI. Authentication uses the binary’s own session by default — no API key needed unless env_passthrough includes GOOGLE_API_KEY.

KeyTypeDefaultDescription
enabledboolfalseEnable the gemini_cli tool
env_passthroughstring[][]Extra env vars passed to the gemini subprocess (e.g. GOOGLE_API_KEY)
max_output_bytesinteger2097152Maximum output size in bytes (2MB default)
timeout_secsinteger600Maximum execution time in seconds (coding tasks can be long)

google_workspace

Google Workspace CLI (gws) tool configuration ([google_workspace] section).

Defaults

  • enabled: false (tool is not registered unless explicitly opted-in).
  • allowed_services: empty vector, which grants access to the full default service set: drive, sheets, gmail, calendar, docs, slides, tasks, people, chat, classroom, forms, keep, meet, events.
  • allowed_operations: empty vector, which preserves the legacy behavior of allowing any resource/method under the allowed service set.
  • credentials_path: None (uses default gws credential discovery).
  • default_account: None (uses the gws active account).
  • rate_limit_per_minute: 60.
  • timeout_secs: 30.
  • audit_log: false.

Compatibility

Configs that omit the [google_workspace] section entirely are treated as GoogleWorkspaceConfig::default() (disabled, all defaults allowed). Adding the section is purely opt-in and does not affect other config sections.

Rollback / Migration

To revert, remove the [google_workspace] section from the config file (or set enabled = false). No data migration is required; the tool simply stops being registered.

KeyTypeDefaultDescription
allowed_operationsobject[][]Restrict which resource/method combinations the agent can access.
allowed_servicesstring[][]Restrict which Google Workspace services the agent can access.
audit_logboolfalseEnable audit logging of every gws invocation (service, resource,
credentials_pathstring?nullPath to service account JSON or OAuth client credentials file.
default_accountstring?nullDefault Google account email to pass to gws --account.
enabledboolfalseEnable the google_workspace tool. Default: false.
rate_limit_per_minuteinteger60Maximum number of gws API calls allowed per minute. Default: 60.
timeout_secsinteger30Command execution timeout in seconds. Default: 30.

hardware

Wizard-driven hardware configuration for physical world interaction.

KeyTypeDefaultDescription
baud_rateinteger115200Baud rate negotiated on the serial link. 115200 matches the common Arduino / ESP32 bootloader default; bump to 230400+ when your firmware explicitly supports faster rates and you need the throughput.
enabledboolfalseOpt in to direct physical-hardware control — GPIO pins, USB-tethered microcontrollers (Arduino, ESP32, Nucleo), or SWD/JTAG debug probes. Leave off for software-only use; turning it on without the right transport configured does nothing.
probe_targetstring?nullTarget chip identifier for transport = probe (e.g. STM32F401RE, nRF52840_xxAA). Passed straight to probe-rs for flash/debug operations; must match a chip probe-rs recognizes.
serial_portstring?nullTTY path for the serial transport — e.g. /dev/ttyACM0 on Linux, /dev/tty.usbmodem1 on macOS, COM3 on Windows. Ignored for other transports.
transportNone | Native | Serial | ProbeHardware transport mode.
workspace_datasheetsboolfalseIndex pre-converted .md and .txt datasheets from the workspace into

heartbeat

Heartbeat configuration for periodic health pings ([heartbeat] section).

KeyTypeDefaultDescription
adaptiveboolfalseEnable adaptive intervals that back off on failures and speed up for
agentstring""Configured agent alias the heartbeat worker runs as. Required
deadman_channelstring?nullChannel for dead-man’s switch alerts (e.g. telegram). Falls back to
deadman_timeout_minutesinteger0Dead-man’s switch timeout in minutes. If the heartbeat has not ticked
deadman_tostring?nullRecipient for dead-man’s switch alerts. Falls back to to.
enabledboolfalseEnable periodic heartbeat pings. Default: false. When enabled,
interval_minutesinteger30Interval in minutes between heartbeat pings. Minimum: 1. Default: 30.
load_session_contextboolfalseLoad the channel session history before each heartbeat task execution so
max_interval_minutesinteger120Maximum interval in minutes when adaptive mode backs off. Default: 120.
max_run_historyinteger100Maximum number of heartbeat run history records to retain. Default: 100.
messagestring?nullOptional fallback task text when HEARTBEAT.md has no task entries.
min_interval_minutesinteger5Minimum interval in minutes when adaptive mode is enabled. Default: 5.
targetstring?nullOptional delivery channel for heartbeat output (for example: telegram).
task_timeout_secsinteger600Maximum wall-clock seconds allowed for a single agent invocation
tostring?nullOptional delivery recipient/chat identifier (required when target is
two_phasebooltrueEnable two-phase heartbeat: Phase 1 asks LLM whether to run, Phase 2

hooks

KeyTypeDefaultDescription
builtinobject
enabledbooltrueEnable lifecycle hook execution.

hooks.builtin

KeyTypeDefaultDescription
command_loggerboolfalseEnable the command-logger hook (logs tool calls for auditing).
webhook_auditobjectConfiguration for the webhook-audit builtin hook.

hooks.builtin.webhook_audit

Configuration for the webhook-audit builtin hook.

Sends an HTTP POST with a JSON body to an external endpoint each time a tool call matches one of the configured patterns. Useful for centralised audit logging, SIEM ingestion, or compliance pipelines.

KeyTypeDefaultDescription
enabledboolfalseEnable the webhook-audit hook. Default: false.
include_argsboolfalseInclude tool call arguments in the audit payload. Default: false.
max_args_bytesinteger4096Maximum size (in bytes) of serialised arguments included in a single
tool_patternsstring[][]Glob patterns for tool names to audit (e.g. ["Bash", "Write"]).
urlstring""Target URL that will receive the audit POST requests.

http_request

HTTP request tool configuration ([http_request] section).

Domain filtering: allowed_domains controls which hosts are reachable (use ["*"] for all public hosts, which is the default). If allowed_domains is empty, all requests are rejected.

KeyTypeDefaultDescription
allow_private_hostsboolfalseAllow requests to private/LAN hosts (RFC 1918, loopback, link-local, .local).
allowed_domainsstring[]["*"]Allowed domains for HTTP requests (exact or subdomain match)
allowed_private_hostsstring[][]Private/internal hosts explicitly allowed to bypass SSRF protection.
enabledbooltrueEnable http_request tool for API interactions
max_response_sizeinteger1000000Maximum response size in bytes (default: 1MB, 0 = unlimited)
secrets 🔑map{}Named authorization secrets for auth_secret requests.
timeout_secsinteger30Request timeout in seconds (default: 30)

image_gen

Standalone image generation tool configuration ([image_gen]).

When enabled, registers an image_gen tool that generates images via fal.ai’s synchronous API (Flux / Nano Banana models) and saves them to the workspace images/ directory.

KeyTypeDefaultDescription
api_key_envstring"FAL_API_KEY"Environment variable name holding the fal.ai API key.
default_modelstring"fal-ai/flux/schnell"Default fal.ai model identifier.
enabledboolfalseEnable the standalone image generation tool. Default: false.

jira

Jira integration configuration ([jira]).

When enabled = true, registers the jira tool which can get tickets, search with JQL, and add comments. Requires base_url and api_token (or the JIRA_API_TOKEN env var).

Defaults

  • enabled: false
  • allowed_actions: ["get_ticket"] — read-only by default. Add "search_tickets" or "comment_ticket" to unlock them.
  • timeout_secs: 30

Auth

Jira Cloud uses HTTP Basic auth: email + api_token. Jira Server/Data Center uses Bearer token auth: omit email and set api_token to a personal access token. api_token is stored encrypted at rest; set it here or via JIRA_API_TOKEN.

KeyTypeDefaultDescription
allowed_actionsstring[]["get_ticket"]Actions the agent is permitted to call.
api_token 🔑string""Jira API token. Encrypted at rest. Falls back to JIRA_API_TOKEN env var.
base_urlstring""Atlassian instance base URL, e.g. https://yourco.atlassian.net.
emailstring?Jira account email used for Basic auth (Cloud).
enabledboolfalseEnable the jira tool. Default: false.
timeout_secsinteger30Request timeout in seconds. Default: 30.

knowledge

Knowledge graph configuration for capturing and reusing expertise.

KeyTypeDefaultDescription
auto_captureboolfalseAutomatically capture knowledge from conversations. Default: false.
db_pathstring"/home/runner/.zeroclaw/knowledge.db"Path to the knowledge graph SQLite database.
enabledboolfalseEnable the knowledge graph tool. Default: false.
max_nodesinteger100000Maximum number of knowledge nodes. Default: 100000.
suggest_on_querybooltrueProactively suggest relevant knowledge on queries. Default: true.

knowledge_bundles

Named knowledge bundles ([knowledge_bundles.<alias>]).

knowledge_bundles.<alias>

Named knowledge bundle ([knowledge_bundles.<alias>]).

A reusable set of knowledge sources (documents, URLs, or RAG corpus paths) that can be attached to an agent by alias.

KeyTypeDefaultDescription
sourcesstring[][]Paths or URLs to include in this knowledge bundle.
tagsstring[][]Tags for filtering or categorising sources within the bundle.

Automatic link understanding for inbound channel messages ([link_enricher]).

When enabled, URLs in incoming messages are automatically fetched and summarised. The summary is prepended to the message before the agent processes it, giving the LLM context about linked pages without an explicit tool call.

KeyTypeDefaultDescription
enabledboolfalseEnable the link enricher pipeline stage (default: false)
max_linksinteger3Maximum number of links to fetch per message (default: 3)
timeout_secsinteger10Per-link fetch timeout in seconds (default: 10)

linkedin

LinkedIn integration configuration ([linkedin] section).

When enabled, the linkedin tool is registered in the agent tool surface. Requires LINKEDIN_* credentials in the workspace .env file.

KeyTypeDefaultDescription
api_versionstring"202602"LinkedIn REST API version header (YYYYMM format).
contentobjectContent strategy configuration for LinkedIn auto-posting ([linkedin.content]).
enabledboolfalseEnable the LinkedIn tool.
imageobjectImage generation configuration for LinkedIn posts ([linkedin.image]).

linkedin.content

Content strategy configuration for LinkedIn auto-posting ([linkedin.content]).

The agent reads this via the linkedin get_content_strategy action to know what feeds to check, which repos to highlight, and how to write posts.

KeyTypeDefaultDescription
github_reposstring[][]GitHub repositories to highlight (format: owner/repo).
github_usersstring[][]GitHub usernames whose public activity to reference.
instructionsstring""Freeform posting instructions for the AI agent.
personastring""Professional persona description (name, role, expertise).
rss_feedsstring[][]RSS feed URLs to monitor for topic inspiration (titles only).
topicsstring[][]Topics of expertise and interest for post themes.

linkedin.image

Image generation configuration for LinkedIn posts ([linkedin.image]).

KeyTypeDefaultDescription
card_accent_colorstring"#0A66C2"Accent color for the fallback card (CSS hex).
dalleobjectOpenAI DALL-E settings ([linkedin.image.dalle]).
enabledboolfalseEnable image generation for posts.
fallback_cardbooltrueGenerate a branded SVG text card when all AI model_providers fail.
fluxobjectFlux (fal.ai) image generation settings ([linkedin.image.flux]).
imagenobjectGoogle Imagen (Vertex AI) settings ([linkedin.image.imagen]).
providersstring[]["stability","imagen","dalle","flux"]ModelProvider priority order. Tried in sequence; first success wins.
stabilityobjectStability AI image generation settings ([linkedin.image.stability]).
temp_dirstring"linkedin/images"Temp directory for generated images, relative to workspace.

linkedin.image.dalle

OpenAI DALL-E settings ([linkedin.image.dalle]).

KeyTypeDefaultDescription
api_key_envstring"OPENAI_API_KEY"Environment variable name holding the OpenAI API key.
modelstring"dall-e-3"DALL-E model identifier.
sizestring"1024x1024"Image dimensions.

linkedin.image.flux

Flux (fal.ai) image generation settings ([linkedin.image.flux]).

KeyTypeDefaultDescription
api_key_envstring"FAL_API_KEY"Environment variable name holding the fal.ai API key.
modelstring"fal-ai/flux/schnell"Flux model identifier.

linkedin.image.imagen

Google Imagen (Vertex AI) settings ([linkedin.image.imagen]).

KeyTypeDefaultDescription
api_key_envstring"GOOGLE_VERTEX_API_KEY"Environment variable name holding the API key.
project_id_envstring"GOOGLE_CLOUD_PROJECT"Environment variable for the Google Cloud project ID.
regionstring"us-central1"Vertex AI region.

linkedin.image.stability

Stability AI image generation settings ([linkedin.image.stability]).

KeyTypeDefaultDescription
api_key_envstring"STABILITY_API_KEY"Environment variable name holding the API key.
modelstring"stable-diffusion-xl-1024-v1-0"Stability model identifier.

locale

Locale for tool descriptions (e.g. "en", "zh-CN").

When set, tool descriptions shown in system prompts are loaded from Fluent .ftl locale files. Falls back to embedded English, then to hardcoded descriptions.

If omitted or empty, the locale is auto-detected from the host system’s locale (defaulting to "en" if that can’t be determined).

mcp

External MCP client configuration ([mcp] section).

KeyTypeDefaultDescription
deferred_loadingboolfalseLoad MCP tool schemas on-demand via tool_search instead of eagerly
enabledbooltrueEnable MCP tool loading.
serversobject[][]Configured MCP servers. The #[nested] annotation makes the macro

mcp_bundles

Named MCP server bundles ([mcp_bundles.<alias>]).

mcp_bundles.<alias>

Named MCP server bundle ([mcp_bundles.<alias>]).

A reusable group of MCP servers granted to an agent that references the bundle by alias in agents.<alias>.mcp_bundles. Server IDs are matched against [mcp.servers] by name. Resolution is secure by default (see Config::mcp_servers_for_bundles): an ID with no matching server grants nothing, and exclude wins over servers across every bundle an agent references.

KeyTypeDefaultDescription
excludestring[][]MCP server IDs removed from the grant. Deny wins: a name listed here is
serversstring[][]MCP server IDs ([mcp.servers].name) granted by this bundle.

media_pipeline

Automatic media understanding pipeline configuration ([media_pipeline]).

When enabled, inbound channel messages with media attachments are pre-processed before reaching the agent: audio is transcribed, images are annotated, and videos are summarised.

KeyTypeDefaultDescription
describe_imagesbooltrueAdd image descriptions when a vision-capable model is active.
enabledboolfalseMaster toggle for the media pipeline (default: false).
summarize_videobooltrueSummarize video attachments (placeholder — requires external API).
transcribe_audiobooltrueTranscribe audio attachments using the configured transcription model_provider.

memory

Memory backend configuration ([memory] section).

Controls conversation memory storage, embeddings, hybrid search, response caching, and memory snapshot/hydration. Backend-specific connection settings live under [storage.<backend>.<alias>]; this section selects which storage instance to use via the backend dotted reference.

KeyTypeDefaultDescription
archive_after_daysinteger7Move daily/session files to the archive directory after this many days. Keeps the hot working set small without deleting history.
audit_enabledboolfalseEnable audit logging of memory operations.
audit_retention_daysinteger30Retention period for audit entries in days (default: 30).
auto_hydratebooltrueAuto-hydrate from MEMORY_SNAPSHOT.md when brain.db is missing
auto_reindex_on_identity_changeboolfalseAutomatically re-embed all memories in the background when a change of embedding provider/model/dimensions is detected at startup (after the stale vectors have been cleared). Costs one embedding API call per memory, so it’s off by default — leave it off for large stores and run zeroclaw memory reindex explicitly instead.
auto_savebooltrueAuto-save what you tell ZeroClaw into memory as conversation history — the agent’s own replies are not saved. Turn off if you want memory to only hold things you explicitly record via the memory tool.
backendstring"sqlite"Dotted reference to the active storage instance: <backend>.<alias>
chunk_max_tokensinteger512Max tokens per chunk for document splitting
conflict_supersede_enabledbooltrueEnable reversible supersede soft-hide machinery when wired.
conflict_thresholdnumber0.85Cosine similarity threshold for conflict detection (0.0–1.0).
conversation_retention_daysinteger30Delete conversation rows older than this many days from the DB (sqlite backend only). Age is measured by updated_at (last write time). 0 = keep forever.
core_max_bytesinteger0Maximum Core bytes before budget compaction. 0 = unbounded.
core_max_rowsinteger0Maximum Core rows before budget compaction. 0 = unbounded.
core_retention_daysinteger0Delete core memory rows older than this many days from the DB. Age is measured by created_at (first-write time). Neither recall nor ordinary rewrites refresh created_at under the current SQLite upsert, so core retention is an absolute age limit from first write. Set this to a generously large window for durable core memories, or keep 0 = keep forever.
daily_max_rowsinteger0Maximum Daily rows before budget compaction. 0 = unbounded.
daily_retention_daysinteger0Delete daily memory rows older than this many days from the DB. Age is measured by updated_at (last write time). 0 = keep forever.
dedup_actiontableWrite-time duplicate handling policy for memory entries.
dedup_jaccard_thresholdnumber0.8Jaccard threshold for text-only duplicate detection.
dedup_on_writeboolfalseEnable write-time near-duplicate detection.
default_namespacestring"default"Default namespace for memory entries.
embedding_api_key 🔑string?Optional API key for the embedding endpoint. When set, embedding calls use this key instead of inheriting one from the seed model provider — decoupling embeddings from the chat model. Use it when the chat model runs on a provider that carries no usable embedding credential (e.g. an OAuth-only provider) while embeddings keep hitting an openai/custom: endpoint with their own key. Leave unset to inherit the seed provider’s key (backward-compatible default).
embedding_cache_sizeinteger10000Max embedding cache entries before LRU eviction
embedding_dimensionsinteger1536Vector width produced by the embedding model — must match the model’s native dimension or vectors won’t store correctly. Look up the number on the model_provider’s model page.
embedding_modelstring"text-embedding-3-small"Embedding model identifier — must match a model your chosen embedding model_provider serves (e.g. text-embedding-3-small for OpenAI). Changing this invalidates existing embeddings: the change is detected at startup and stale vectors are cleared automatically; run zeroclaw memory reindex to re-embed (or set auto_reindex_on_identity_change).
embedding_providerstring"none"Source of embedding vectors for semantic search. none = keyword-only retrieval (no API calls, no vector cost); openai = OpenAI’s embedding API; custom:URL = any OpenAI-compatible embedding endpoint (LiteLLM, local gateway, etc.).
evict_ordertableMemory budget eviction order.
fts_early_return_scorenumber0.85FTS score above which to early-return without vector search (0.0–1.0).
hygiene_enabledbooltrueRun the periodic hygiene pass that archives stale daily/session files and enforces retention windows. Leave on unless you want to manage cleanup yourself.
keyword_weightnumber0.3How heavily BM25 (keyword) overlap counts when search_mode = hybrid. Raise toward 1.0 for exact-term matching; lower it when paraphrases should still score well.
min_relevance_scorenumber0.4Minimum hybrid score (0.0–1.0) for a memory to be included in context.
pin_min_importancenumber1.01Pin entries at or above this importance. >1.0 means disabled.
pin_namespacesstring[][]Namespaces protected from budget eviction.
policyobjectMemory policy configuration ([memory.policy] section).
purge_after_daysinteger30Delete archived files permanently after this many days. Set high if you need long-term history; set low for privacy / disk-space reasons.
rerank_enabledboolfalseEnable LLM reranking when candidate count exceeds threshold.
rerank_thresholdinteger5Minimum candidate count to trigger reranking.
response_cache_enabledboolfalseEnable LLM response caching to avoid paying for duplicate prompts
response_cache_hot_entriesinteger256Max in-memory hot cache entries for the two-tier response cache (default: 256)
response_cache_max_entriesinteger5000Max number of cached responses before LRU eviction (default: 5000)
response_cache_ttl_minutesinteger60TTL in minutes for cached responses (default: 60)
retrieval_stagesstring[]["cache","fts","vector"]Retrieval stages to execute in order. Valid: “cache”, “fts”, “vector”.
search_modetableSearch strategy for memory recall.
snapshot_enabledboolfalseEnable periodic export of core memories to MEMORY_SNAPSHOT.md
snapshot_on_hygieneboolfalseRun snapshot during hygiene passes (heartbeat-driven)
vector_weightnumber0.7How heavily vector (semantic) similarity counts when search_mode = hybrid. Raise toward 1.0 to favor meaning-based matches; lower it to lean on keyword overlap instead.

memory.policy

Memory policy configuration ([memory.policy] section).

KeyTypeDefaultDescription
max_entries_per_categoryinteger0Maximum entries per category (0 = unlimited).
max_entries_per_namespaceinteger0Maximum entries per namespace (0 = unlimited).
read_only_namespacesstring[][]Namespaces that are read-only (writes are rejected).
retention_days_by_categorymap{}Retention days by category (overrides global). Keys: “core”, “daily”, “conversation”.

microsoft365

Microsoft 365 integration via Microsoft Graph API ([microsoft365] section).

Provides access to Outlook mail, Teams messages, Calendar events, OneDrive files, and SharePoint search.

KeyTypeDefaultDescription
auth_flowstring"client_credentials"Authentication flow: “client_credentials” or “device_code”
client_idstring?nullAzure AD application (client) ID
client_secret 🔑string?nullAzure AD client secret (stored encrypted when secrets.encrypt = true)
enabledboolfalseEnable Microsoft 365 integration
scopesstring[]["https://graph.microsoft.com/.default"]OAuth scopes to request
tenant_idstring?nullAzure AD tenant ID
token_cache_encryptedbooltrueEncrypt the token cache file on disk
user_idstring?nullUser principal name or “me” (for delegated flows)

model_routes

Model-routing rules — route hint:<name> to specific model_provider + model combos.

multimodal

Multimodal (image) handling configuration ([multimodal] section).

Privacy and cost note

Tool results that print real local image paths (e.g. shell tools doing ls /pictures or find . -name '*.png') are canonicalized into [IMAGE:...] markers and base64-inlined into the next provider request. This means image bytes that previously stayed local will be uploaded to the configured provider when surfaced by a tool.

max_images (and the trim_old_images LRU policy) bounds the per-request image budget, but operators running shell-style tools over directories of personal or sensitive images should be aware of the upload semantics. See docs/book/src/contributing/privacy.md for the project’s privacy stance.

KeyTypeDefaultDescription
allow_remote_fetchboolfalseAllow fetching remote image URLs (http/https). Disabled by default.
max_image_size_mbinteger5Maximum image payload size in MiB before base64 encoding.
max_image_turnsinteger0Maximum age of images in conversation turns.
max_imagesinteger4Maximum number of image attachments accepted per request.
vision_modelstring?nullModel to use when routing to the vision model_provider (e.g. "llava:7b").
vision_model_providerstring?nullModelProvider name to use for vision/image messages (e.g. "ollama").

node_transport

Secure transport configuration for inter-node communication ([node_transport]).

KeyTypeDefaultDescription
allowed_peersstring[][]Allow specific node IPs/CIDRs.
connection_pool_sizeinteger4Maximum number of connections per peer.
enabledbooltrueEnable the secure transport layer.
max_request_age_secsinteger300Maximum age of signed requests in seconds (replay protection).
mutual_tlsboolfalseRequire client certificates (mutual TLS).
require_httpsbooltrueRequire HTTPS for all node communication.
shared_secret 🔑string""Shared secret for HMAC authentication between nodes.
tls_cert_pathstring?nullPath to TLS certificate file.
tls_key_pathstring?nullPath to TLS private key file.

nodes

Configuration for the dynamic node discovery system ([nodes]).

When enabled, external processes/devices can connect via WebSocket at /ws/nodes and advertise their capabilities at runtime.

KeyTypeDefaultDescription
auth_token 🔑string?nullOptional bearer token for node authentication.
enabledboolfalseEnable dynamic node discovery endpoint.
max_nodesinteger16Maximum number of concurrent node connections.

notion

Notion integration configuration ([notion]).

When enabled = true, the agent polls a Notion database for pending tasks and exposes a notion tool for querying, reading, creating, and updating pages. Requires api_key (or the NOTION_API_KEY env var) and database_id.

KeyTypeDefaultDescription
api_key 🔑string""
database_idstring""
enabledboolfalse
input_propertystring"Input"
max_concurrentinteger4
poll_interval_secsinteger5
recover_stalebooltrue
result_propertystring"Result"
status_propertystring"Status"

observability

Observability backend configuration ([observability] section).

KeyTypeDefaultDescription
backendnone | log | verbose | prometheus | otelObservability sink backend.
log_llm_request_payloadoff | redacted | fullLLM request payload capture policy. Mirrors [LogToolIo] but gates the
log_persistencetableJSONL log persistence mode.
log_persistence_max_bytesinteger0Size threshold in bytes that triggers an archive rotation when
log_persistence_max_entriesinteger200Maximum entries retained when log_persistence = "rolling".
log_persistence_pathstring"state/runtime-trace.jsonl"Log persistence file path. Relative paths resolve under workspace_dir.
log_persistence_retention_max_age_daysinteger0Retention cap on the age (in days) of rotated archive files when
log_persistence_retention_max_filesinteger7Retention cap on the number of rotated archive files kept alongside the
log_persistence_rotate_dailybooltrueRotate the active file to an archive on a UTC day boundary when
log_tool_iooff | redacted | fullTool I/O capture policy.
log_tool_io_denyliststring[][]Tool names whose I/O is never logged beyond name + outcome + duration
log_tool_io_truncate_bytesinteger40960Truncate the captured tool input and output at this many bytes when
otel_endpointstring?nullOTLP endpoint (e.g. "http://localhost:4318"). Only used when backend = "otel".
otel_genai_contentoff | redacted | fullOTel content capture policy. Mirrors [LogToolIo] but gates OTel span
otel_genai_content_max_charsinteger1000Per-field character truncation limit for OTel GenAI content when
otel_headers 🔑map?nullOptional HTTP headers sent with every OTLP export request (e.g. authorization).
otel_service_namestring?nullService name reported to the OTel collector. Defaults to “zeroclaw”.
otel_tool_iooff | redacted | fullOTel content capture policy. Mirrors [LogToolIo] but gates OTel span
otel_tool_io_max_charsinteger1000Per-field character truncation limit for OTel tool I/O when

onboard_state

Multi-client workspace isolation configuration.

When enabled, each client engagement gets an isolated workspace with separate memory, audit, secrets, and tool restrictions. Opaque state the Quickstart flow writes so it can tell, on a re-run, which sections the user has already walked through at least once — which lets it offer “Reconfigure? [y/N]” skip gates instead of forcing users through every field again.

This is meta-state about the Quickstart flow, not user-facing config.

KeyTypeDefaultDescription
completed_sectionsstring[][]Section keys the user has completed at least once.
quickstart_completedboolfalsetrue once the Quickstart has applied a BuilderSubmission

opencode_cli

OpenCode CLI tool configuration ([opencode_cli] section).

Delegates coding tasks to the opencode run CLI. Authentication uses the binary’s own session by default — no API key needed unless env_passthrough includes provider-specific keys.

KeyTypeDefaultDescription
enabledboolfalseEnable the opencode_cli tool
env_passthroughstring[][]Extra env vars passed to the opencode subprocess
max_output_bytesinteger2097152Maximum output size in bytes (2MB default)
timeout_secsinteger600Maximum execution time in seconds (coding tasks can be long)

pacing

Pacing controls for slow/local LLM workloads ([pacing] section).

All fields are optional and default to values that preserve existing behavior. When set, they extend — not replace — the existing timeout and loop-detection subsystems.

KeyTypeDefaultDescription
loop_detection_enabledbooltrueEnable pattern-based loop detection (exact repeat, ping-pong,
loop_detection_max_repeatsinteger3Number of consecutive identical tool+args calls before the first
loop_detection_min_elapsed_secsinteger?nullMinimum elapsed seconds before loop detection activates.
loop_detection_window_sizeinteger20Sliding window size for the pattern-based loop detector.
loop_ignore_toolsstring[][]Tool names excluded from identical-output / alternating-pattern loop
message_timeout_scale_maxinteger?nullOverride for the hardcoded timeout scaling cap (default: 4).
step_timeout_secsinteger?nullPer-step timeout in seconds: the maximum time allowed for a single

peer_groups

Named peer groups ([peer_groups.<name>]). Each entry binds a channel, a list of member agents, and optional non-agent (external) members and a per-group blocklist. Mutual opt-in: two agents become peers only when both appear in the same group’s agents. Empty by default for single-agent installs. See crate::multi_agent::PeerGroupConfig.

peer_groups.<alias>

[peer_groups.<name>] — mutual-opt-in peer group on a channel type.

KeyTypeDefaultDescription
admin_for_agent_scopeboolfalseWhen true, members of this peer group are authorized to issue
agentsstring[][]Member agents by alias.
channelstringReference to a configured [channels.<type>.<alias>] entry.
external_peersstring[][]Non-agent members by channel-native username.
ignorestring[][]Per-group blocklist; subtracts from the resolved peer set.
output_modalitytablePreferred output modality for a peer group.

peripherals

Peripheral board integration configuration ([peripherals] section).

Boards become agent tools when enabled.

KeyTypeDefaultDescription
boardsobject[][]Board configurations (nucleo-f401re, rpi-gpio, etc.)
datasheet_dirstring?nullPath to datasheet docs (relative to workspace) for RAG retrieval.
enabledboolfalseEnable peripheral support (boards become agent tools)

pipeline

Pipeline tool configuration ([pipeline] section).

KeyTypeDefaultDescription
allowed_toolsstring[][]Tools allowed in pipeline steps. Steps referencing tools not on this
enabledboolfalseEnable the execute_pipeline meta-tool.
max_stepsinteger20Maximum number of steps allowed in a single pipeline invocation.

plugins

Plugin system configuration.

KeyTypeDefaultDescription
auto_discoverboolfalseAuto-discover and load plugins on startup
enabledboolfalseEnable the plugin system (default: false)
entriesobject[][]
limitsobjectPer-call WASM execution limits ([plugins.limits]).
max_pluginsinteger50Maximum number of plugins that can be loaded
plugins_dirstring"/home/runner/.zeroclaw/plugins"Directory where plugins are stored
securityobjectPlugin signature verification configuration ([plugins.security]).

plugins.limits

Per-call WASM execution limits ([plugins.limits]).

Bounds a single plugin call so a runaway or malicious component traps instead of hanging the host or exhausting memory. call_fuel caps instructions per call; the memory, table, and instance ceilings bound a store’s growth. Every value is operator-tunable and validated as non-zero.

KeyTypeDefaultDescription
call_fuelinteger1000000000Fuel budget per plugin call (wasmtime instruction units).
max_instancesinteger64Maximum component instances a plugin store may create.
max_memory_mbinteger256Maximum linear memory a plugin store may grow to, in megabytes.
max_table_elementsinteger100000Maximum table elements a plugin store may allocate.

plugins.security

Plugin signature verification configuration ([plugins.security]).

Controls Ed25519 signature verification for plugin manifests. In strict mode, only plugins signed by a trusted publisher key are loaded. In permissive mode, unsigned or untrusted plugins produce warnings but are still loaded. In disabled mode (the default), no signature checking occurs.

KeyTypeDefaultDescription
signature_modestring"disabled"Signature enforcement mode: “disabled”, “permissive”, or “strict”.
trusted_publisher_keysstring[][]Hex-encoded Ed25519 public keys of trusted plugin publishers.

project_intel

Project delivery intelligence configuration ([project_intel] section).

KeyTypeDefaultDescription
default_languagestring"en"Default report language (en, de, fr, it). Default: “en”.
enabledboolfalseEnable the project_intel tool. Default: false.
include_git_databooltrueInclude git log data in reports. Default: true.
include_jira_databoolfalseInclude Jira data in reports. Default: false.
jira_base_urlstring?nullJira instance base URL (required if include_jira_data is true).
report_output_dirstring"/home/runner/.zeroclaw/project-reports"Output directory for generated reports.
risk_sensitivitystring"medium"Risk detection sensitivity: low, medium, high. Default: “medium”.
templates_dirstring?nullOptional custom templates directory.

providers

Top-level wrapper for every provider category. TOML root sees a single [providers] table with one sub-key per category:

[providers.models.anthropic.default]
api_key = "..."

[providers.tts.openai.default]
api_key = "..."

[providers.transcription.groq.default]
api_key = "..."

Each category keeps its own typed-slot internals (so per-family endpoints and extras stay validated at the type level); this wrapper just gives them a shared top-level home.

KeyTypeDefaultDescription
modelsobjectTyped model provider container — one slot per canonical model_provider type.
transcriptionobjectTyped transcription-provider container — one slot per STT family.
ttsobjectTyped TTS-provider container — one slot per TTS family. Mirrors

providers.models

Typed model provider container — one slot per canonical model_provider type.

Replaces the HashMap<String, HashMap<String, ModelProviderConfig>> with a typed struct so each family’s per-alias map carries its own typed config (with the family’s *Endpoint enum and family-specific extras visible at the type level).

TOML shape is preserved byte-identical: each named field deserializes from the same [providers.models.<type>.<alias>] block as before.

Adding a new model_provider family means: define the typed config in schema.rs, then add one row to for_each_model_provider_slot!, and every helper picks up the new slot automatically.

One slot per family (ai21, aihubmix, anthropic, anyscale, arcee, astrai, atomic_chat, avian, azure, baichuan, baseten, bedrock, cerebras, cloudflare, cohere, copilot, custom, deepinfra, deepmyst, deepseek, doubao, featherless, fireworks, friendli, gemini, gemini_cli, github_models, glm, groq, huggingface, hunyuan, hyperbolic, inception, kilo, kilocli, lambda_ai, lepton, litellm, llamacpp, lmstudio, manifest, minimax, mistral, moonshot, morph, nearai, nebius, novita, nscale, nvidia, ollama, openai, opencode, openrouter, osaurus, ovh, perplexity, qianfan, qwen, reka, sambanova, sglang, siliconflow, stepfun, synthetic, telnyx, together, upstage, venice, vercel, vllm, xai, yi, zai). Each slot is a [providers.models.<slot>.<alias>] map; see the dedicated section page for the per-field reference.

providers.transcription

Typed transcription-provider container — one slot per STT family. Mirrors ModelProviders / TtsProviders. Closed set of 6 families: groq, openai, deepgram, assemblyai, google, local_whisper.

One slot per family (assemblyai, deepgram, google, groq, local_whisper, openai). Each slot is a [providers.transcription.<slot>.<alias>] map; see the dedicated section page for the per-field reference.

providers.tts

Typed TTS-provider container — one slot per TTS family. Mirrors ModelProviders but smaller (TTS has a closed set of 5 families: openai, elevenlabs, google, edge, piper). No catch-all needed.

One slot per family (edge, elevenlabs, google, openai, piper). Each slot is a [providers.tts.<slot>.<alias>] map; see the dedicated section page for the per-field reference.

proxy

Proxy configuration for outbound HTTP/HTTPS/SOCKS5 traffic ([proxy] section).

KeyTypeDefaultDescription
all_proxystring?nullFallback proxy URL for all schemes.
enabledboolfalseEnable proxy support for selected scope.
http_proxystring?nullProxy URL for HTTP requests (supports http, https, socks5, socks5h).
https_proxystring?nullProxy URL for HTTPS requests (supports http, https, socks5, socks5h).
no_proxystring[][]No-proxy bypass list. Same format as NO_PROXY.
scopetableProxy application scope — determines which outbound traffic uses the proxy.
servicesstring[][]Service selectors used when scope = “services”.

query_classification

Automatic query classification — classifies user messages by keyword/pattern and routes to the appropriate model hint. Disabled by default.

KeyTypeDefaultDescription
enabledboolfalseEnable automatic query classification. Default: false.
rulesobject[][]Classification rules evaluated in priority order.

reliability

Reliability and supervision configuration ([reliability] section).

Controls model_provider retries, API key rotation, and channel restart backoff.

KeyTypeDefaultDescription
api_keys 🔑string[][]Additional API keys for round-robin rotation on rate-limit (429) errors.
channel_initial_backoff_secsinteger2Initial backoff for channel/daemon restarts.
channel_max_backoff_secsinteger60Max backoff for channel/daemon restarts.
provider_backoff_msinteger500Base backoff (ms) for model_provider retry delay.
provider_retriesinteger2Retries per model_provider before bailing.
scheduler_poll_secsinteger15Scheduler polling cadence in seconds.
scheduler_retriesinteger2Max retries for cron job execution attempts.

risk_profiles

Named risk/autonomy profiles ([risk_profiles.<alias>]).

risk_profiles.<alias>

Named risk/autonomy profile ([risk_profiles.<alias>]).

Unified policy surface. Agents reference a profile by alias and the runtime resolves through it for shell command allowlists, approval gates, sandbox/resource limits, and delegation guardrails. The conventional risk_profiles["default"] is the resolution target for non-agent contexts (orchestrator init, cron worker startup); the Default impl below mirrors the legacy safety-first defaults so a fresh install behaves the same as a config from before the per-profile split.

KeyTypeDefaultDescription
allowed_commandsstring[]["git","npm","cargo","ls","cat","grep","find","echo","pwd","wc","head","tail","date","df","du","uname","uptime","hostname","python","python3","pip","node","free"]Allowlist of executable names for shell execution.
allowed_rootsstring[][]Extra directory roots the agent may access.
allowed_toolsstring[][]Tools the agent may call in agentic mode. Empty = inherit / no
always_askstring[][]Tools that always require approval in this profile.
approval_routeobjectRoute a risk profile’s tool approvals to a DISTINCT approver channel instead of the
auto_approvestring[]["file_read","memory_recall","web_search_tool","web_fetch","calculator","glob_search","content_search","image_info","weather","tool_search","browser","browser_open"]Tools that never require approval in this profile.
block_high_risk_commandsbooltrueBlock high-risk commands even when allowlisted.
delegation_policyobjectWhether a risk profile may delegate work to other agents.
excluded_toolsstring[][]Tools excluded from non-CLI channels under this profile.
firejail_argsstring[][]Extra arguments forwarded to firejail when sandbox_backend = “firejail”.
forbidden_pathsstring[]["/etc","/root","/home","/usr","/bin","/sbin","/lib","/opt","/boot","/dev","/proc","/sys","/var","/tmp","~/.ssh","~/.gnupg","~/.aws","~/.config"]Explicit path denylist.
leveltableHow much autonomy the agent has.
require_approval_for_medium_riskbooltrueRequire approval for medium-risk operations.
sandbox_backendstring?nullSandbox backend identifier (e.g. "firejail", "landlock"). None inherits.
sandbox_enabledbool?nullWhether the sandbox is enabled for this profile. None inherits global.
shell_env_passthroughstring[][]Environment variable names passed through to shell subprocesses.
workspace_onlybooltrueRestrict filesystem access to workspace-relative paths. Default: false.

risk_profiles.<alias>.approval_route

Route a risk profile’s tool approvals to a DISTINCT approver channel instead of the channel that triggered the run — closing the cross-channel-HITL gap (an agent’s gated actions can be approved by a separate ops channel / a different principal).

Option<ApprovalRoute> on a risk profile: ABSENT ⇒ today’s behavior (the originating channel approves). Present ⇒ the gate asks approver_channel (a channel registry key, platform-qualified <channel>.<alias> such as matrix.ops, NOT the originator), bounded by timeout_secs, fail-closed by default.

Consulted on both the interactive channel-driven path and the non-interactive turn path (gateway chat/webhook dispatch and agent-to-agent peer messages, which run without an originating channel). The non-interactive path resolves approver_channel from the live daemon channel registry; with no live registry/approver it keeps the non-interactive default (fail-closed deny under the default on_no_approver).

KeyTypeDefaultDescription
approver_channel*stringA registered channel name (NOT the originator) — the distinct-approver hop.
on_no_approvertableWhat to do when a configured approver cannot be reached. Default FAIL-CLOSED.
timeout_secsinteger120Bound the approver’s response window; a timeout denies (DoS guard). Default 120s.

risk_profiles.<alias>.delegation_policy

Whether a risk profile may delegate work to other agents.

Forbidden (the default) means a profile cannot delegate at all; Allow permits delegation. The set of reachable targets is not an explicit allow-list — delegation is gated on the caller and target sharing a risk profile, so the shared profile determines who is reachable.

Wire format: { mode = "forbidden" } or { mode = "allow" }. The struct shape lets the prop layer expose mode as an editable enum leaf.

KeyTypeDefaultDescription
modetableDelegation mode for a risk profile.

runtime

Runtime adapter configuration ([runtime] section).

KeyTypeDefaultDescription
dockerobjectDocker runtime configuration ([runtime.docker] section).
kindnative | docker | cloudflareRuntime adapter kind.
reasoning_effortstring?nullOptional reasoning effort for model_providers that expose a level control.
reasoning_enabledbool?nullGlobal reasoning override for model_providers that expose explicit controls.
shellstring?nullShell binary the native runtime uses for command execution.

runtime.docker

Docker runtime configuration ([runtime.docker] section).

KeyTypeDefaultDescription
allowed_workspace_rootsstring[][]Optional workspace root allowlist for Docker mount validation.
cpu_limitnumber?1.0Optional CPU limit (None = no explicit limit).
imagestring"alpine:3.20"Runtime image used to execute shell commands.
memory_limit_mbinteger?512Optional memory limit in MB (None = no explicit limit).
mount_workspacebooltrueMount configured workspace into /workspace.
networkstring"none"Docker network mode (none, bridge, etc.).
read_only_rootfsbooltrueMount root filesystem as read-only.

runtime_profiles

Named runtime/LLM execution profiles ([runtime_profiles.<alias>]).

runtime_profiles.<alias>

Named runtime/LLM execution profile ([runtime_profiles.<alias>]).

Reusable operational tuning: agentic mode, iteration caps, context budget, parallel dispatch, resource ceilings, recursion depth, and the budget knobs that SecurityPolicy enforces with subagent parent-subset discipline. Anything authorization-shaped (allowed commands/tools/paths, approval gates, sandbox) lives on [risk_profiles.<alias>]. Anything model-provider shaped (model, temperature, max_tokens, timeout_secs) lives on [providers.models.<type>.<alias>].

KeyTypeDefaultDescription
agenticboolfalseEnable agentic (multi-turn tool-call loop) mode.
agentic_timeout_secsinteger?nullAgentic delegate run timeout in seconds. None inherits global.
auto_classifyobject
compact_contextbool?nullUse compact bootstrap (6000 chars / 2 RAG chunks). None inherits.
context_compressionobject
delegation_timeout_secsinteger?nullDelegate call timeout in seconds. None inherits global delegate timeout.
evalobject
history_pruningobject
keep_tool_context_turnsinteger?nullNumber of recent turns whose full tool context is preserved. None inherits.
max_actions_per_hourinteger20Maximum actions allowed per hour. 0 is a hard zero budget — the
max_context_tokensinteger?nullMaximum estimated tokens for context before compaction. None inherits.
max_cost_per_day_centsinteger500Maximum cost per day in cents. 0 inherits the global limit.
max_delegation_depthinteger0Maximum delegation recursion depth. 0 inherits the default.
max_history_messagesinteger?nullMaximum conversation history messages retained per session. None inherits.
max_system_prompt_charsinteger?nullMaximum characters for the assembled system prompt. None inherits.
max_tool_iterationsinteger0Maximum tool-call iterations in agentic mode. 0 inherits the global default.
max_tool_result_charsinteger?nullMaximum characters for a single tool result. None inherits.
memory_recall_limitinteger?nullMaximum memory entries injected per turn. None inherits global default (5).
parallel_toolsbool?nullEnable parallel tool execution per iteration. None inherits.
prompt_injection_modetableSkills loading configuration ([skills] section).
shell_timeout_secsinteger60Shell subprocess timeout in seconds. 0 inherits the global timeout.
strict_tool_parsingboolfalse
thinkingobjectConfiguration for thinking/reasoning level control.
tool_call_dedup_exemptstring[][]Tools exempt from within-turn dedup check.
tool_dispatcherstring?nullTool dispatch strategy (e.g. "auto"). None inherits.
tool_filter_groupsobject[][]
tool_receiptsobjectHMAC tool execution receipt configuration, per agent

runtime_profiles.<alias>.auto_classify

KeyTypeDefaultDescription
complex_hintstring?null
cost_optimized_hintstring"cost-optimized"
simple_hintstring?null
standard_hintstring?null

runtime_profiles.<alias>.context_compression

KeyTypeDefaultDescription
enabledbooltrue
identifier_policystring"strict"
max_passesinteger3
protect_first_ninteger3
protect_last_ninteger4
source_max_charsinteger50000
summary_max_charsinteger4000
summary_modelstring?nullDEPRECATED bare model id — historically swapped onto the AGENT’s own
summary_providerstringReference to a configured [providers.models.<type>.<alias>] entry.
threshold_rationumber0.5
timeout_secsinteger60
tool_result_retrim_charsinteger2000
tool_result_trim_exemptstring[][]

runtime_profiles.<alias>.eval

KeyTypeDefaultDescription
enabledboolfalse
max_retriesinteger1
min_quality_scorenumber0.5

runtime_profiles.<alias>.history_pruning

KeyTypeDefaultDescription
collapse_tool_resultsbooltrue
enabledboolfalse
keep_recentinteger4
max_tokensinteger8192

runtime_profiles.<alias>.thinking

Configuration for thinking/reasoning level control.

KeyTypeDefaultDescription
budget_tokensmap{}
default_leveloff | minimal | low | medium | high | maxHow deeply the model should reason for a given message.
native_thinkingboolfalseOpt-in flag for provider-native extended thinking. When true, the

runtime_profiles.<alias>.tool_receipts

HMAC tool execution receipt configuration, per agent ([agents.<alias>.tool_receipts]).

Receipts are short HMAC-SHA256 tags appended to tool results so the model cannot claim it ran a tool that never actually executed. See docs/book/src/security/tool-receipts.md.

KeyTypeDefaultDescription
enabledboolfalseGenerate HMAC receipts on every tool execution. Default: false.
inject_system_promptbooltrueInject the receipt-echo instruction into the system prompt so the
show_in_responseboolfalseAppend a trailing Tool receipts: block to user-visible replies so

scheduler

Scheduler configuration for periodic task execution ([scheduler] section).

Owns the cron-runtime knobs: per-job declarations live on Config.cron: HashMap<String, CronJobDecl> (alias-keyed), while the scheduler loop’s runtime behavior (enabled, polling cap, catch-up) lives here.

KeyTypeDefaultDescription
catch_up_on_startupbooltrueRun all overdue jobs at scheduler startup. Default: true.
enabledbooltrueEnable the built-in scheduler loop. When false, no cron jobs run.
max_concurrentinteger4Maximum tasks executed in parallel within a single polling cycle.
max_run_historyinteger50Maximum number of historical cron run records to retain. Default: 50.
max_tasksinteger64Maximum number of persisted scheduled tasks per polling cycle.

schema_version

Config file schema version.

secrets

Secrets encryption configuration ([secrets] section).

KeyTypeDefaultDescription
encryptbooltrueEnable encryption for API keys and tokens at rest

security

Security configuration for audit logging, OTP, e-stop, IAM/SSO, and WebAuthn.

Sandbox backend and resource limits live on per-agent risk profiles (see RiskProfileConfig::sandbox_* and RiskProfileConfig::max_*); the runtime resolves them via Config::active_risk_profile(agent_alias).

KeyTypeDefaultDescription
auditobjectAudit logging configuration
estopmapEmergency stop configuration.
leak_detectionobjectOutbound credential leak detection configuration.
nevismapNevis IAM integration configuration.
otpmapSecurity OTP configuration.
webauthnobjectWebAuthn / FIDO2 hardware key authentication configuration ([security.webauthn]).

security.audit

Audit logging configuration

KeyTypeDefaultDescription
enabledbooltrueEnable audit logging
log_pathstring"audit.log"Path to audit log file (relative to zeroclaw dir)
max_size_mbinteger100Maximum log size in MB before rotation
sign_eventsboolfalseSign events with HMAC for tamper evidence

security.estop

Emergency stop configuration.

KeyTypeDefaultDescription
enabledboolfalseEnable emergency stop controls.
require_otp_to_resumebooltrueRequire a valid OTP before resume operations.
state_filestring"/home/runner/.zeroclaw/estop-state.json"File path used to persist estop state.

security.leak_detection

Outbound credential leak detection configuration.

These settings control the final guardrail pass over outbound channel responses before they are delivered. Deterministic credential patterns include API keys, private keys, database URLs, bot tokens, and related token syntax. The high-entropy pass is a separate heuristic for standalone opaque tokens.

KeyTypeDefaultDescription
enabledbooltrueEnable outbound credential leak detection and redaction.
high_entropy_tokensbooltrueEnable high-entropy token redaction; deterministic patterns still run when false.
sensitivitynumber0.7Detection sensitivity from 0.0 to 1.0; higher is more aggressive.

security.nevis

Nevis IAM integration configuration.

When enabled is true, ZeroClaw validates incoming requests against a Nevis Security Suite instance and maps Nevis roles to tool/workspace permissions.

KeyTypeDefaultDescription
client_idstring""OAuth2 client ID registered in Nevis.
client_secret 🔑string?nullOAuth2 client secret. Encrypted via SecretStore when stored on disk.
enabledboolfalseEnable Nevis IAM integration. Defaults to false for backward compatibility.
instance_urlstring""Base URL of the Nevis instance (e.g. https://nevis.example.com).
jwks_urlstring?nullJWKS endpoint URL for local token validation.
realmstring"master"Nevis realm to authenticate against.
require_mfaboolfalseRequire MFA verification for all Nevis-authenticated requests.
role_mappingmap[][]Nevis role to ZeroClaw permission mappings.
session_timeout_secsinteger3600Session timeout in seconds.
token_validationstring"local"Token validation strategy: "local" (JWKS) or "remote" (introspection).

security.otp

Security OTP configuration.

KeyTypeDefaultDescription
cache_valid_secsinteger300Reuse window for recently validated OTP codes.
challenge_max_attemptsinteger3Maximum number of OTP challenge attempts before lockout.
enabledboolfalseEnable OTP gating. Defaults to disabled for backward compatibility.
gated_actionsstring[]["shell","file_write","browser_open","browser","memory_forget"]Tool/action names gated by OTP. Empty or malformed entries are rejected
gated_domain_categoriesstring[][]Domain-category presets expanded into gated_domains.
gated_domainsstring[][]Explicit domain patterns gated by OTP.
methodtableOTP validation strategy.
token_ttl_secsinteger30TOTP time-step in seconds.

security.webauthn

WebAuthn / FIDO2 hardware key authentication configuration ([security.webauthn]).

Enables registration and authentication via hardware security keys (YubiKey, SoloKey, etc.) and platform authenticators (Touch ID, Windows Hello).

KeyTypeDefaultDescription
enabledboolfalseEnable WebAuthn authentication. Default: false.
rp_idstring"localhost"Relying Party ID (domain name, e.g. “example.com”). Default: “localhost”.
rp_namestring"ZeroClaw"Relying Party display name. Default: “ZeroClaw”.
rp_originstring"http://localhost:42617"Relying Party origin URL (e.g. "https://example.com"). Default: "http://localhost:42617".

security_ops

Managed Cybersecurity Service (MCSS) dashboard agent configuration ([security_ops]).

KeyTypeDefaultDescription
auto_triageboolfalseAutomatically triage incoming alerts without user prompt.
enabledboolfalseEnable security operations tools.
max_auto_severitystring"low"Maximum severity level that can be auto-remediated without approval.
playbooks_dirstring"/home/runner/.zeroclaw/playbooks"Directory containing incident response playbook definitions (JSON).
report_output_dirstring"/home/runner/.zeroclaw/security-reports"Directory for generated security reports.
require_approval_for_actionsbooltrueRequire human approval before executing playbook actions.
siem_integrationstring?nullOptional SIEM webhook URL for alert ingestion.

shell_tool

Shell tool configuration ([shell_tool] section).

Controls the behaviour of the shell execution tool. The main tunable is timeout_secs — the maximum wall-clock time a single shell command may run before it is killed.

KeyTypeDefaultDescription
timeout_secsinteger60Maximum shell command execution time in seconds (default: 60).

skill_bundles

Named skill bundles ([skill_bundles.<alias>]).

skill_bundles.<alias>

Named skill bundle ([skill_bundles.<alias>]).

A reusable group of skills that can be attached to an agent or channel by alias, controlling which skills are loaded and from where.

KeyTypeDefaultDescription
directorystring?nullDirectory path (relative to workspace root) to load skills from.
excludestring[][]Skill names to exclude from this bundle.
includestring[][]Skill names to include. Empty means include all skills in directory.

skills

Skills loading configuration ([skills] section).

KeyTypeDefaultDescription
allow_scriptsboolfalseAllow script-like files in skills (.sh, .bash, .ps1, shebang shell files).
extra_registriesobject[]Additional user-configured skill registries, installed via
install_suggestionsobjectPrompt-triggered skill install suggestions ([skills.install_suggestions] section).
open_skills_dirstring?nullOptional path to a local open-skills repository.
open_skills_enabledboolfalseEnable loading and syncing the community open-skills repository.
prompt_injection_modetableSkills loading configuration ([skills] section).
registry_urlstring?nullURL of the skills registry repository for bare-name installs.
skill_creationobjectAutonomous skill creation configuration ([skills.skill_creation] section).
skill_improvementobjectSkill self-improvement configuration ([skills.skill-improvement] section).

skills.install_suggestions

Prompt-triggered skill install suggestions ([skills.install_suggestions] section).

KeyTypeDefaultDescription
enabledboolfalseEnable suggestions for installable skills before normal agent turns.

skills.skill_creation

Autonomous skill creation configuration ([skills.skill_creation] section).

KeyTypeDefaultDescription
enabledboolfalseEnable automatic skill creation after successful multi-step tasks.
max_final_answer_charsinteger2000Maximum characters of the final assistant answer fed into the
max_skillsinteger500Maximum number of auto-generated skills to keep.
max_task_charsinteger1000Maximum characters of the task description fed into the reflection
max_tool_trace_charsinteger4000Maximum characters of the rendered tool-call trace fed into the
reflection_enabledboolfalseSynthesize a canonical SKILL.md from the execution trace via a
similarity_thresholdnumber0.85Embedding similarity threshold for deduplication.

skills.skill_improvement

Skill self-improvement configuration ([skills.skill-improvement] section).

Controls the post-turn background review fork that may patch, expand, or archive skills based on what the conversation revealed. The fork runs in a restricted toolset (only skills_list, skill_view, skill_manage) and never touches the user-visible conversation.

KeyTypeDefaultDescription
cooldown_secsinteger3600Minimum interval (in seconds) between reviews for the same skill.
enabledboolfalseEnable the background skill-review fork. Default: false.
max_review_iterationsinteger8Maximum tool-call iterations the review fork itself is allowed to make.
nudge_interval_iterationsinteger10Spawn a review fork once at least this many tool-call iterations have

sop

Standard Operating Procedures engine configuration ([sop]).

The default_execution_mode field uses the SopExecutionMode type from sop::types (re-exported via sop::SopExecutionMode). To avoid circular module references, config stores it using the same enum definition.

KeyTypeDefaultDescription
approval_modetableWHO may clear a SOP approval gate. Layered with execution_mode / priority /
approval_timeout_actiontableWhat happens to a SOP approval gate when it times out. Default is fail-closed:
approval_timeout_secsinteger300Approval timeout in seconds. When a run waits for approval longer than
default_execution_modestring"supervised"Default execution mode for SOPs that omit execution_mode.
maintenance_interval_secsinteger60How often (seconds) the daemon runs the SOP maintenance tick: fire
max_concurrent_totalinteger4Maximum total concurrent SOP runs across all SOPs.
max_finished_runsinteger100Maximum number of finished runs kept in memory for status queries.
max_step_retriesinteger2Maximum retries allowed by a step failure policy.
max_step_visitsinteger256Maximum times a routed SOP run can visit one step.
persist_runsboolfalsePersist run state durably across restarts. Default false keeps today’s
procedural_memory_enabledboolfalseEnable SOP procedural-memory proposal tooling. Default false keeps
run_state_dirstring?nullDirectory for the durable run store (created mode-0700). When omitted,
run_store_backendtableDurable SOP run-state backend selector. A closed, compile-time-known set, so it
sops_dirstring?nullDirectory containing SOP definitions (subdirs with SOP.toml + SOP.md).
step_mandatory_toolsstring[]["sop_advance","sop_approve","sop_status"]Tool names that remain available while step scope is enforced.
step_schema_enforcebooltrueEnforce per-step input/output schemas when a step declares them.
step_scope_enforceboolfalseEnforce per-step tool scope. Default false keeps tools: advisory.
untrusted_frame_warningbooltrueInclude the explanatory warning text inside untrusted-content frames.
untrusted_guard_sensitivitynumber0.7Prompt-guard and outbound-redaction sensitivity for untrusted SOP content.
untrusted_input_guardstring"warn"Prompt-guard action for untrusted SOP trigger input: warn, block, or sanitize.
untrusted_outbound_redactbooltrueRedact outbound SOP content before persistence/audit consumers write it.
untrusted_payload_max_bytesinteger8192Maximum bytes accepted from untrusted SOP trigger payload/topic content

storage

Persistent storage configuration ([storage] section).

Storage is a two-tier alias-keyed map: [storage.<backend>.<alias>], parallel to [providers.models.<type>.<alias>]. Each backend has its own typed config struct. MemoryConfig.backend carries a dotted reference ("sqlite.default", "postgres.work") that resolves to one of these entries via [Config::resolve_active_storage].

One slot per family (lucid, markdown, postgres, qdrant, sqlite). Each slot is a [storage.<slot>.<alias>] map; see the dedicated section page for the per-field reference.

text_browser

Text browser tool configuration ([text_browser] section).

Uses text-based browsers (lynx, links, w3m) to render web pages as plain text. Designed for headless/SSH environments without graphical browsers.

KeyTypeDefaultDescription
allowed_private_hostsstring[][]Private/internal hosts allowed to bypass SSRF protection.
enabledboolfalseEnable text_browser tool
preferred_browserstring?nullPreferred text browser (“lynx”, “links”, or “w3m”). If unset, auto-detects.
timeout_secsinteger30Request timeout in seconds (default: 30)

todotracker

ZeroCode live task tracker configuration ([todotracker] section).

Read-only visual tracker driven by the model’s TodoWrite tool.

KeyTypeDefaultDescription
enabledbooltrueMaster switch. When false the tracker never renders and never
enabled_at_startboolfalseWhether the panel is visible at launch (when enabled). When
locationtableLocation of the ZeroCode TodoWrite tracker panel.
max_heightinteger5Bottom-strip maximum height in rows (grows up to this). Ignored for
widthinteger32Side-panel target column width (left/right). Runtime-clamped to at

transcription

Voice transcription configuration with multi-provider support.

The top-level api_url, model, and api_key fields remain for backward compatibility with existing Groq-based configurations.

KeyTypeDefaultDescription
api_key 🔑string?nullAPI key used for transcription requests (Groq transcription provider).
api_urlstring"https://api.groq.com/openai/v1/audio/transcriptions"Whisper API endpoint URL (Groq transcription provider).
assemblyaiobjectAssemblyAI STT model_provider configuration ([transcription.assemblyai]).
deepgramobjectDeepgram STT model_provider configuration ([transcription.deepgram]).
enabledboolfalseEnable voice transcription for channels that support it.
googleobjectGoogle Cloud Speech-to-Text model_provider configuration ([transcription.google]).
initial_promptstring?nullOptional initial prompt to bias transcription toward expected vocabulary
languagestring?nullOptional language hint (ISO-639-1, e.g. “en”, “ru”) for Groq transcription provider.
local_whisperobjectLocal/self-hosted Whisper-compatible STT endpoint ([transcription.local_whisper]).
max_audio_bytesinteger?nullOptional global audio size upper bound in bytes, enforced before
max_duration_secsinteger120Maximum voice duration in seconds (messages longer than this are skipped).
modelstring"whisper-large-v3-turbo"Whisper model name (Groq transcription provider).
openaiobjectOpenAI Whisper STT model_provider configuration ([transcription.openai]).
transcribe_non_ptt_audioboolfalseAlso transcribe non-PTT (forwarded/regular) audio messages on WhatsApp,

transcription.assemblyai

AssemblyAI STT model_provider configuration ([transcription.assemblyai]).

KeyTypeDefaultDescription
api_key 🔑string?nullAssemblyAI API key.

transcription.deepgram

Deepgram STT model_provider configuration ([transcription.deepgram]).

KeyTypeDefaultDescription
api_key 🔑string?nullDeepgram API key.
modelstring"nova-2"Deepgram model name (default: “nova-2”).

transcription.google

Google Cloud Speech-to-Text model_provider configuration ([transcription.google]).

KeyTypeDefaultDescription
api_key 🔑string?nullGoogle Cloud API key.
language_codestring"en-US"BCP-47 language code (default: “en-US”).

transcription.local_whisper

Local/self-hosted Whisper-compatible STT endpoint ([transcription.local_whisper]).

Configures a self-hosted STT endpoint. Can be on localhost, a private network host, or any reachable URL.

KeyTypeDefaultDescription
bearer_token 🔑string?nullBearer token for endpoint authentication.
max_audio_bytesinteger26214400Maximum audio file size in bytes accepted by this endpoint.
timeout_secsinteger300Request timeout in seconds. Defaults to 300 (large files on local GPU).
url*stringHTTP or HTTPS endpoint URL, e.g. "http://10.10.0.1:8001/v1/transcribe".

transcription.openai

OpenAI Whisper STT model_provider configuration ([transcription.openai]).

KeyTypeDefaultDescription
api_key 🔑string?nullOpenAI API key for Whisper transcription.
modelstring"whisper-1"Whisper model name (default: “whisper-1”).

trust

KeyTypeDefaultDescription
correction_penaltynumber0.05
decay_half_life_daysnumber30.0
initial_scorenumber0.8
regression_thresholdnumber0.5
success_boostnumber0.01

tts

Text-to-Speech subsystem configuration ([tts]).

Per-instance TTS configs live under [tts_providers.<type>.<alias>] (parallel to providers.models). What remains here are the global runtime knobs that apply to every model_provider invocation.

KeyTypeDefaultDescription
default_formatstring"mp3"Default audio output format ("mp3", "opus", "wav").
default_voicestring"alloy"Default voice ID passed to the selected tts provider.
enabledboolfalseEnable TTS synthesis.
max_text_lengthinteger4096Maximum input text length in characters (default 4096).

tunnel

Tunnel configuration for exposing the gateway publicly ([tunnel] section).

Supported model_providers: "none" (default), "cloudflare", "tailscale", "ngrok", "openvpn", "pinggy", "custom".

KeyTypeDefaultDescription
cloudflareobject
customobject
ngrokobject
openvpnobjectOpenVPN tunnel configuration ([tunnel.openvpn]).
pinggyobject
tailscaleobject
tunnel_providerstring"none"How the gateway gets exposed to the public internet so webhooks (Telegram, Slack, etc.) can reach it. none = keep it local, no tunnel; cloudflare = Cloudflare Tunnel via cloudflared (needs a Zero Trust account and token); tailscale = Tailscale Funnel/Serve (tailnet-only or public, no account beyond tailscale); ngrok = ngrok agent with auth token; openvpn = bring-your-own OpenVPN egress; pinggy = Pinggy SSH tunnels (quick one-shot URLs); custom = run an arbitrary command you define under [tunnel.custom].

tunnel.cloudflare

KeyTypeDefaultDescription
token 🔑string""Cloudflare Tunnel token (from Zero Trust dashboard)

tunnel.custom

KeyTypeDefaultDescription
health_urlstring?nullOptional URL to check tunnel health
start_commandstring""Command template to start the tunnel. Use {port} and {host} placeholders.
url_patternstring?nullOptional regex to extract public URL from command stdout

tunnel.ngrok

KeyTypeDefaultDescription
auth_token 🔑string""ngrok auth token
domainstring?nullOptional custom domain

tunnel.openvpn

OpenVPN tunnel configuration ([tunnel.openvpn]).

Required when tunnel.tunnel_provider = "openvpn". Omitting this section entirely preserves previous behavior. Setting tunnel.tunnel_provider = "none" (or removing the [tunnel.openvpn] block) cleanly reverts to no-tunnel mode.

Defaults: connect_timeout_secs = 30.

KeyTypeDefaultDescription
advertise_addressstring?nullAdvertised address once VPN is connected (e.g., "10.8.0.2:42617").
auth_filestring?nullOptional path to auth credentials file (--auth-user-pass).
config_file*stringPath to .ovpn configuration file (must not be empty).
connect_timeout_secsinteger30Connection timeout in seconds (default: 30, must be > 0).
extra_argsstring[][]Extra openvpn CLI arguments forwarded verbatim.

tunnel.pinggy

KeyTypeDefaultDescription
regionstring?nullServer region: "us" (USA), "eu" (Europe), "ap" (Asia), "br" (South America), "au" (Australia), or omit for auto.
token 🔑string?nullPinggy access token (optional — free tier works without one).

tunnel.tailscale

KeyTypeDefaultDescription
funnelboolfalseUse Tailscale Funnel (public internet) vs Serve (tailnet only)
hostnamestring?nullOptional hostname override

verifiable_intent

Verifiable Intent (VI) credential verification and issuance ([verifiable_intent] section).

KeyTypeDefaultDescription
enabledboolfalseEnable VI credential verification on commerce tool calls (default: false).
strictnessstring"strict"Strictness mode for constraint evaluation: “strict” (fail-closed on unknown

web_fetch

Web fetch tool configuration ([web_fetch] section).

Fetches web pages and converts HTML to plain text for LLM consumption. Domain filtering: allowed_domains controls which hosts are reachable (use ["*"] for all public hosts). blocked_domains takes priority over allowed_domains. If allowed_domains is empty, all requests are rejected (deny-by-default).

KeyTypeDefaultDescription
allowed_domainsstring[]["*"]Allowed domains for web fetch (exact or subdomain match; ["*"] = all public hosts)
allowed_private_hostsstring[][]Private/internal hosts allowed to bypass SSRF protection (e.g. ["192.168.1.10", "internal.local"]).
blocked_domainsstring[][]Blocked domains (exact or subdomain match; always takes priority over allowed_domains)
enabledbooltrueEnable web_fetch tool for fetching web page content
firecrawlobjectFirecrawl fallback configuration for JS-heavy and bot-blocked sites.
max_response_sizeinteger500000Maximum response size in bytes (default: 500KB, plain text is much smaller than raw HTML)
timeout_secsinteger30Request timeout in seconds (default: 30)

web_fetch.firecrawl

Firecrawl fallback configuration for JS-heavy and bot-blocked sites.

When enabled, if the standard web fetch fails (HTTP error, empty body, or body shorter than 100 characters suggesting a JS-only page), the tool falls back to the Firecrawl API for stealth content extraction.

KeyTypeDefaultDescription
api_key_envstring"FIRECRAWL_API_KEY"Environment variable name for the Firecrawl API key
api_urlstring"https://api.firecrawl.dev/v1"Firecrawl API base URL
enabledboolfalseEnable Firecrawl fallback
modetableFirecrawl fallback mode: scrape a single page or crawl linked pages.

Web search tool configuration ([web_search] section).

KeyTypeDefaultDescription
bocha_api_key 🔑string?nullBocha AI Web Search API key (required if search_provider is "bocha"). Obtain at https://open.bochaai.com.
brave_api_key 🔑string?nullBrave Search API key (required if search_provider is “brave”)
enabledbooltrueEnable web_search_tool for web searches
jina_api_key 🔑string?nullJina AI API key (required if search_provider is “jina”)
max_resultsinteger5Maximum results per search (1-10)
search_providerstring"duckduckgo"Search provider: “duckduckgo” (free), “brave” (requires API key), “tavily” (requires API key), “searxng” (self-hosted), “jina” (requires API key), or “bocha” (Bocha AI, requires API key — Chinese-friendly, https://open.bochaai.com)
searxng_instance_urlstring?nullSearXNG instance URL (required if search_provider is "searxng"), e.g. "https://searx.example.com".
tavily_api_key 🔑string?nullTavily Search API key (required if search_provider is “tavily”)
timeout_secsinteger15Request timeout in seconds

wss

WebSocket Secure (WSS) transport for remote TUI-to-daemon connections ([wss]).

When enabled, the daemon listens for TLS-encrypted WebSocket connections on the configured bind address and port. TUI clients connect via --connect wss://host:port.

KeyTypeDefaultDescription
bindstring"0.0.0.0"Bind address for the WSS listener (default: “0.0.0.0”).
cert_pathstring""Path to the PEM-encoded server certificate file.
enabledboolfalseEnable the WSS listener (default: false).
key_pathstring""Path to the PEM-encoded server private key file.
portinteger9781Port for the WSS listener (default: 9781).