Skip to content
AGH RuntimeConfiguration

config.toml

Complete AGH config.toml schema, defaults, valid values, merge behavior, and annotated examples.

Audience
Operators running durable agent work
Focus
Configuration guidance shaped for scanability, day-two clarity, and operator context.

config.toml is the main AGH runtime configuration file. AGH loads the built-in defaults, then overlays global and workspace files when they exist.

FileScopeLoaded when
$AGH_HOME/config.tomlGlobalEvery config load. Defaults to ~/.agh/config.toml.
$AGH_HOME/mcp.jsonGlobal MCP sidecarAfter global TOML.
<workspace>/.agh/config.tomlWorkspace overlayOnly when a workspace root is resolved for the session or command.
<workspace>/.agh/mcp.jsonWorkspace MCP sidecarAfter workspace TOML.

Unknown TOML keys are errors. Sandbox profiles are implemented under [sandboxes.<name>]; the old Use only [sandboxes.<name>] for session execution boundaries.

Quick Reference

SectionPurposeDefault
[daemon]Unix domain socket path for CLI and UDS API traffic.socket = "$AGH_HOME/daemon.sock"
[http]HTTP and SSE bind address.host = "localhost", port = 2123
[defaults]Default agent, provider, and sandbox resolution.agent = "general", provider = "", sandbox = ""
[limits]Daemon-level session and agent caps.max_sessions = 10, max_concurrent_agents = 20
[session.limits]Session-scoped wall-clock timeout.timeout = "0s"
[session.supervision]Runtime activity heartbeat, progress, warning, and inactivity timeout controls.heartbeat 30 seconds, progress 10 minutes, warning 15 minutes, timeout 30 minutes
[agents.soul]Optional SOUL.md parsing, body limits, and compact projection budget.enabled, 32 KiB body, 2 KiB compact projection
[agents.heartbeat]Optional HEARTBEAT.md policy bounds, wake cadence/limits, and health timing.enabled, 32 KiB body, 5 min/30 min intervals, 25 wakes per cycle, 168 h retention
[permissions]Default permission mode.mode = "approve-all"
[tools]Tool registry lifecycle, hosted MCP enablement, and result budget defaults.enabled, hosted MCP enabled, 256 KiB result default
[tools.hosted_mcp]Hosted MCP session bind nonce lifecycle.30 seconds
[tools.policy]External tool source defaults, approval timeout, and trusted sources.external tools disabled, 120 second approval timeout, no trusted sources
[[mcp_servers]]Top-level MCP servers passed to agents.empty list
[providers.<name>]Built-in provider override or custom provider definition.empty map plus built-ins
[sandboxes.<name>]Local or provider-backed execution sandbox profiles.local backend when no profile is selected
[observability]Event summary retention and global byte cap.enabled, 7 days, 1 GiB
[observability.transcripts]Transcript segment sizing and per-session cap.enabled, 1 MiB segments, 256 MiB per session
[log]Structured log level.level = "info"
[memory]Persistent memory runtime and global memory directory.enabled, $AGH_HOME/memory
[memory.dream]Background memory consolidation.enabled, agent general, 24 hours, 3 sessions, 30 minutes
[skills]Skill discovery, polling, disable list, and marketplace trust gates.enabled, poll every 3 seconds
[skills.marketplace]Skill registry override.unset
[extensions.marketplace]Extension registry override.unset
[automation]Automation scheduler defaults.enabled, UTC, 5 concurrent jobs
[[automation.jobs]]Scheduled automation jobs.empty list
[[automation.triggers]]Event-driven automation triggers.empty list
[autonomy.coordinator]Coordinator session bootstrap for workspace-scoped task runs.disabled, agent coordinator, TTL 2 hours, 5 children, 1 active per workspace
[[hooks.declarations]]Config-defined runtime hooks.empty list
[network]Experimental AGH network runtime.enabled, channel default

Load And Merge Order

OrderSourceMerge behavior
1Built-in defaultsBase config.
2$AGH_HOME/config.tomlScalar fields replace defaults. TOML MCP and provider MCP entries merge by name.
3$AGH_HOME/mcp.jsonSame-name MCP servers replace the whole server object.
4<workspace>/.agh/config.tomlWorkspace overlay applies over global config.
5<workspace>/.agh/mcp.jsonSame-name MCP servers replace the whole server object after workspace TOML.
6Path normalization and validation~ is expanded for daemon.socket and memory.global_dir; invalid values fail startup.

TOML [[mcp_servers]] entries merge fields by name: non-empty command, non-empty args, and new env keys overlay the existing server. JSON sidecars replace same-name servers as whole objects.

Daemon boot uses the home config for boot-time daemon settings. The general config loader applies global and workspace MCP sidecars for session and runtime resolution.

Complete Annotated Example

# ~/.agh/config.toml

[daemon]
# Path to the Unix domain socket used by AGH CLI commands.
socket = "~/.agh/daemon.sock"

[http]
# HTTP/SSE API bind address.
host = "localhost"
port = 2123

[defaults]
# Agent name used when a command or API request does not specify one.
agent = "general"
# Provider used by AGENT.md files that omit provider.
provider = "claude"
# Sandbox profile used when a workspace does not set sandbox_ref.
sandbox = "local"

[limits]
# Positive daemon-wide limits.
max_sessions = 10
max_concurrent_agents = 20

[session.limits]
# 0 means no configured wall-clock timeout. Use Go durations such as "30m" or "2h".
timeout = "0s"

[session.supervision]
# Short heartbeats update durable liveness only. They are not persisted as session events.
activity_heartbeat_interval = "30s"
# 0 disables periodic progress events.
progress_notify_interval = "10m"
# 0 disables inactivity warnings.
inactivity_warning_after = "15m"
# 0 disables inactivity timeout.
inactivity_timeout = "30m"
# Grace period after cooperative prompt cancel before AGH stops the session as timeout.
timeout_cancel_grace = "30s"

[agents.soul]
# Disabling pauses prompt injection but keeps inspect/validate/write/delete/history/rollback available.
enabled = true
# Hard cap for SOUL.md body bytes after normalization.
max_body_bytes = 32768
# Compact /agent/context projection budget. Must be <= max_body_bytes.
context_projection_bytes = 2048

[agents.heartbeat]
# Disabling pauses wake decisions but keeps managed authoring available for repair.
enabled = true
# Bounded HEARTBEAT.md body size (snapshot uses normalized body).
max_body_bytes = 32768
# Compact projection budget for status surfaces.
context_projection_bytes = 4096
# Hard floor for authored preferences.min_interval. Files below this are clamped.
min_interval = "5m"
# Default cadence baseline used when authored files omit min_interval.
default_interval = "30m"
# Cooldown between wakes for a single session.
wake_cooldown = "1m"
# Maximum scheduler-cycle wakes across the daemon.
max_wakes_per_cycle = 25
# When true, wake only sessions in active runtime state.
active_session_only = true
# When true, authored active_hours/quiet_windows preferences are honored within bounds.
allow_active_hours_preferences = true
# Retention for agent_heartbeat_wake_events audit rows. Minimum 1h.
wake_event_retention = "168h"
# Idle age before metadata-only presence is treated as stale for wake eligibility.
session_health_stale_after = "2m"
# Minimum interval between session.health.update.after hook fires for the same session.
session_health_hook_min_interval = "1m"

[permissions]
# Valid values: deny-all, approve-reads, approve-all.
mode = "approve-all"

[tools]
# Disables registry dispatch and hosted MCP exposure when false.
enabled = true
# Enables AGH-hosted local MCP projection for session-visible tools.
hosted_mcp_enabled = true
# Default result cap for tool descriptors that do not set a smaller cap.
default_max_result_bytes = 262144

[tools.hosted_mcp]
# Non-secret launch correlation nonce lifetime before UDS peer binding.
bind_nonce_ttl_seconds = 30

[tools.policy]
# Valid values: disabled, ask, enabled.
external_default = "disabled"
# Bounded wait for daemon-mediated approval flows.
approval_timeout_seconds = 120
# External read-only sources trusted for approve-reads. Entries use kind:owner.
trusted_sources = []

[[mcp_servers]]
name = "filesystem"
command = "npx"
args = ["-y", "@modelcontextprotocol/server-filesystem", "/Users/you/work"]
env = { LOG_LEVEL = "info" }

[[mcp_servers]]
name = "remote-docs"
transport = "sse"
url = "https://mcp.example.com/sse"

[mcp_servers.auth]
type = "oauth2_pkce"
issuer_url = "https://auth.example.com"
client_id = "agh-desktop"
client_secret_ref = "env:REMOTE_DOCS_MCP_CLIENT_SECRET"
scopes = ["mcp.read", "mcp.write"]

[providers.claude]
# Overrides the built-in Claude provider command/model/credential slot.
command = "npx -y @agentclientprotocol/claude-agent-acp@latest"
default_model = "claude-sonnet-4-6"

[[providers.claude.credential_slots]]
name = "api_key"
target_env = "ANTHROPIC_API_KEY"
secret_ref = "env:ANTHROPIC_API_KEY"
kind = "api_key"
required = false

[[providers.claude.mcp_servers]]
name = "github"
command = "npx"
args = ["-y", "@modelcontextprotocol/server-github"]
secret_env = { GITHUB_TOKEN = "env:GITHUB_TOKEN" }

[sandboxes.local]
backend = "local"
sync_mode = "none"
persistence = "reuse"
runtime_root = "~"

[sandboxes.daytona-dev]
backend = "daytona"
sync_mode = "session-bidirectional"
persistence = "reuse"
runtime_root = "/home/daytona/workspace"

[sandboxes.daytona-dev.env]
NODE_ENV = "development"

[sandboxes.daytona-dev.network]
allow_public_ingress = false
allow_outbound = true
allow_list = ["api.example.test"]
deny_list = ["metadata.google.internal"]

[sandboxes.daytona-dev.daytona]
api_url = "https://app.daytona.io/api"
target = "team-default"
snapshot = "snap-agent-base"
image = "ubuntu:24.04"
class = "cpu-2"
auto_stop = "30m"
auto_archive = "24h"

[observability]
enabled = true
retention_days = 7
max_global_bytes = 1073741824

[observability.transcripts]
enabled = true
segment_bytes = 1048576
max_bytes_per_session = 268435456

[log]
level = "info"

[memory]
enabled = true
global_dir = "~/.agh/memory"

[memory.dream]
enabled = true
agent = "general"
min_hours = 24
min_sessions = 3
check_interval = "30m"

[skills]
enabled = true
disabled_skills = ["experimental-skill"]
poll_interval = "3s"
allowed_marketplace_mcp = ["clawhub:@team/search-skill"]
allowed_marketplace_hooks = ["clawhub:@team/format-hook"]

[skills.marketplace]
registry = "clawhub"
base_url = "https://registry.example.com"

[extensions.marketplace]
registry = "github"
base_url = "https://api.github.com"

[automation]
enabled = true
timezone = "UTC"
max_concurrent_jobs = 5
default_fire_limit = { max = 12, window = "1h" }

[[automation.jobs]]
scope = "workspace"
name = "daily-doc-check"
agent = "docs"
workspace = "workspace-id-or-path"
prompt = "Review changed docs and report stale links."
enabled = true
fire_limit = { max = 2, window = "24h" }

[automation.jobs.schedule]
mode = "cron"
expr = "0 9 * * 1-5"

[automation.jobs.retry]
strategy = "backoff"
max_retries = 3
base_delay = "2s"

[[automation.triggers]]
scope = "workspace"
workspace = "workspace-id-or-path"
name = "failed-session-summary"
agent = "general"
prompt = "Summarize why session {{ index .Data \"session_id\" }} stopped."
event = "session.stopped"
enabled = true

[automation.triggers.filter]
kind = "session.stopped"
data.stop_reason = "error"

[autonomy.coordinator]
# Disabled by default. When enabled, a workspace-scoped coordinated task run may start
# one coordinator session for that workspace after publish, start, approval, or an
# equivalent execution boundary enqueues the run.
enabled = false
agent_name = "coordinator"
# Optional provider/model overrides. Empty values fall through to agent/provider defaults.
provider = ""
model = ""
default_ttl = "2h"
max_children = 5
max_active_per_workspace = 1

[[hooks.declarations]]
name = "record-session-start"
event = "session.post_create"
mode = "async"
required = false
priority = 500
timeout = "5s"
command = "printf"
args = ["session started\n"]
env = { HOOK_LOG = "1" }

[hooks.declarations.matcher]
agent_name = "general"

[network]
enabled = true
default_channel = "default"
port = -1
max_payload = 1048576
greet_interval = 30
max_replay_age = 300
max_queue_depth = 100

[daemon]

FieldTypeDefaultValid valuesDescription
socketstring path$AGH_HOME/daemon.sockNon-empty path. ~ is expanded.Unix domain socket used by CLI IPC and the UDS API server.

[http]

FieldTypeDefaultValid valuesDescription
hoststringlocalhostNon-empty host or bind address.HTTP/SSE server host.
portinteger21231 through 65535HTTP/SSE server port.

[defaults]

FieldTypeDefaultValid valuesDescription
agentstringgeneralNon-empty agent name.Agent selected when a command or API request omits an agent.
providerstringemptyBuilt-in provider name or configured provider key.Provider selected when an AGENT.md omits provider. Empty is valid until an agent without provider is resolved.

[limits]

FieldTypeDefaultValid valuesDescription
max_sessionsinteger10Positive integer.Daemon-wide cap for sessions retained in active runtime state.
max_concurrent_agentsinteger20Positive integer.Daemon-wide cap for concurrently running agent subprocesses.

[session.limits]

FieldTypeDefaultValid valuesDescription
timeoutduration0sZero or positive Go duration.Session-level wall-clock timeout. Zero means no configured wall-clock timeout.

[session.supervision]

Session supervision keeps long-running prompts observable without turning every heartbeat into a stored event. AGH updates session metadata on short heartbeats and only writes durable events for lower-frequency progress, warnings, and timeout classification.

This timeout is based on inactivity, not total runtime. A prompt can run for hours as long as AGH continues to observe runtime activity or controlled waiting heartbeats.

FieldTypeDefaultValid valuesDescription
activity_heartbeat_intervalduration30sPositive Go duration.Cadence for metadata-only activity heartbeats while a prompt is waiting on ACP/provider work.
progress_notify_intervalduration10mZero or positive Go duration.Cadence for persisted runtime_progress events. Zero disables periodic progress events.
inactivity_warning_afterduration15mZero or positive Go duration.Idle age before AGH emits one runtime_warning. Zero disables the warning.
inactivity_timeoutduration30mZero or positive Go duration.Idle age before AGH cancels the prompt cooperatively. Zero disables inactivity timeout.
timeout_cancel_graceduration30sPositive Go duration.Grace period after timeout cancel before AGH stops the session with stop reason timeout.

[agents.soul]

[agents.soul] controls the optional SOUL.md authored persona artifact. Config owns body limits, compact projection budget, and the enabled toggle. SOUL.md cannot redefine any of these keys, and forbidden operational fields in SOUL.md are rejected. See Agent Soul.

FieldTypeDefaultValid valuesDescription
enabledbooleantruetrue or falseWhen false, AGH stops injecting Soul into prompts and /agent/context but keeps inspect/validate/write/delete/history/rollback available.
max_body_bytesinteger32768Positive integer.Maximum normalized SOUL.md body size. Files beyond this fail validation with oversized_body.
context_projection_bytesinteger2048Positive integer; must be <= max_body_bytes.Compact /agent/context.soul projection budget.

Workspace overlay merges scalar fields predictably; setting any key zero-clamps to the validated positive value or fails with a typed validation error. Disabling at runtime does not clear stored snapshots; managed authoring keeps working so operators can repair a broken file.

[agents.heartbeat]

[agents.heartbeat] controls the optional HEARTBEAT.md advisory wake policy and the runtime health/wake-audit subsystem. Config owns cadence, rate limits, retention, and stale thresholds; authored files express bounded preferences only. See Agent Heartbeat.

FieldTypeDefaultValid valuesDescription
enabledbooleantruetrue or falseWhen false, AGH disables wake decisions but keeps managed authoring available so operators can repair a broken policy.
max_body_bytesinteger32768Positive integer; capped at the runtime hard limit.Maximum normalized HEARTBEAT.md body size; oversized files fail validation.
context_projection_bytesinteger4096Positive integer; must be <= max_body_bytes.Compact projection budget for status responses.
min_intervalduration5mPositive Go duration; must be <= default_interval.Hard floor for authored preferences.min_interval. Files below this are clamped with heartbeat_preference_clamped.
default_intervalduration30mPositive Go duration.Default cadence baseline used when authored files omit min_interval.
wake_cooldownduration1mPositive Go duration.Cooldown between wakes targeting the same session.
max_wakes_per_cycleinteger25Positive integer.Daemon-wide cap on wakes per scheduler cycle. Excess wakes return heartbeat_rate_limited.
active_session_onlybooleantruetrue or falseWhen true, only sessions reported as active and attachable are wake-eligible.
allow_active_hours_preferencesbooleantruetrue or falseWhen false, authored active_hours/quiet_windows are ignored with heartbeat_preference_ignored.
wake_event_retentionduration168hPositive Go duration; minimum 1h.Retention for agent_heartbeat_wake_events audit rows. Cleanup runs at boot and during scheduler maintenance cycles.
session_health_stale_afterduration2mPositive Go duration.Idle age before metadata-only presence becomes stale for wake eligibility.
session_health_hook_min_intervalduration1mPositive Go duration.Minimum interval between session.health.update.after hook fires for the same session; metadata-only touches are coalesced.

[agents.heartbeat] does not own task-run lease heartbeat (task_runs + ClaimNextRun + HeartbeatRunLease), [session.supervision] activity heartbeat, or AGH Network [network] greet presence. Those four authorities remain independent.

HEARTBEAT.md snapshot digest covers the normalized body, canonical frontmatter JSON, and a canonical digest of the resolved [agents.heartbeat] config subset. Editing any field that affects parsing, preference resolution, eligibility, retention, or coalescing invalidates the digest and triggers a fresh resolution at the next wake decision.

[permissions]

FieldTypeDefaultValid valuesDescription
modestringapprove-alldeny-all, approve-reads, approve-allDefault permission policy used when an agent definition does not override permissions.

[tools]

Tool registry configuration is loaded before runtime policy and dispatch consume it. These keys only establish defaults and parse-time guardrails; dispatch still revalidates visibility, permission, availability, hooks, and approval state per call. When enabled = true, the runtime injects the agh__bootstrap and agh__catalog discovery toolsets for every agent unless effective policy denies them, and a startup prompt section teaches the search → info → invoke loop.

FieldTypeDefaultValid valuesDescription
enabledbooleantruetrue or false.When false, disables AGH-owned registry dispatch and hosted MCP exposure.
hosted_mcp_enabledbooleantruetrue or false.Allows AGH to expose the local hosted MCP proxy for session-visible tools.
default_max_result_bytesinteger2621440 through 16777216.Result cap used when a descriptor does not specify a smaller limit.

[tools.hosted_mcp]

FieldTypeDefaultValid valuesDescription
bind_nonce_ttl_secondsinteger301 through 300 seconds.Lifetime for the non-secret hosted MCP bind nonce before UDS peer binding.

[tools.policy]

FieldTypeDefaultValid valuesDescription
external_defaultstringdisableddisabled, ask, enabled.Default executable policy for extension, MCP, and dynamic tools before explicit tool/source grants.
approval_timeout_secondsinteger1201 through 600 seconds.Maximum wait for daemon-mediated approval flows.
trusted_sourcesstring array[]mcp:<server> or extension:<name>.External read-only sources trusted for approve-reads; MCP entries must reference configured MCP servers.

trusted_sources does not store credentials. Remote MCP OAuth tokens remain in the MCP auth store, and hosted MCP bind nonces are transient session launch state.

[[mcp_servers]]

Top-level MCP servers are merged with provider, agent, and skill MCP servers during session startup. They can point at local stdio processes or remote HTTP/SSE MCP endpoints.

FieldTypeDefaultValid valuesDescription
namestringrequiredNon-empty after trimming.Stable server key used for merge and replacement.
transportstringinferredstdio, http, sse.Transport kind. Command servers default to stdio; URL servers default to http.
commandstringrequired for stdioNon-empty command.Executable command for a local stdio MCP server. Invalid for remote transports.
urlstring URLrequired for remoteAbsolute URL.Remote MCP endpoint for http or sse transports. Invalid for stdio.
authobjectemptyOAuth 2.1 PKCE settings.Remote auth metadata and client settings. Invalid for stdio.
argsstring arrayemptyStrings.Process arguments passed to the command.
envstring mapemptyString keys and values.Literal environment values passed to the MCP server. AGH does not perform shell expansion.
secret_envstring mapemptyenv:NAME or vault:mcp/<server>/env/<KEY> refs.Secret environment bindings for stdio servers. Values are resolved at launch and redacted from diagnostics.

OAuth-enabled remote servers store only metadata in config. Token material is kept in the AGH Vault as encrypted refs and is exposed through API, settings, CLI, logs, and the agent-callable agh__mcp_auth_status tool only as redacted status. Login/logout happen on CLI and HTTP. These are operator-only management flows.

auth fieldTypeRequiredDescription
typestringyesMust be oauth2_pkce.
client_idstringyesOAuth client ID.
client_secret_refstringnoenv:NAME or vault:mcp/<server>/oauth/client-secret ref containing the client secret, when required.
issuer_urlstring URLconditionalIssuer for OAuth metadata discovery.
metadata_urlstring URLconditionalExplicit OAuth authorization-server metadata URL.
authorization_urlstring URLconditionalDirect authorization endpoint. Pair with token_url.
token_urlstring URLconditionalDirect token endpoint. Pair with authorization_url.
revocation_urlstring URLnoOptional endpoint used by agh mcp auth logout.
scopesstring arraynoRequested OAuth scopes.

Configure one of metadata_url, issuer_url, or both authorization_url and token_url, then authenticate with:

agh mcp auth login remote-docs
agh mcp auth status remote-docs
agh mcp auth status remote-docs --refresh
agh mcp auth logout remote-docs

Agents can read the same redacted status from inside a session through the agh__mcp_auth_status tool. The tool never triggers an OAuth browser flow; missing or expired authentication is repaired through the operator login/logout commands above.

[providers.<name>]

Provider keys override built-ins with the same name or create a custom provider. Built-ins are claude, codex, gemini, opencode, copilot, cursor, kiro, blackbox, cline, goose, hermes, junie, kimi-cli, openclaw, openhands, qoder, qwen-code, pi, openrouter, zai, moonshot, vercel-ai-gateway, xai, minimax, mistral, and groq.

FieldTypeDefaultValid valuesDescription
commandstringBuilt-in command or empty for custom providers.Required after built-in plus override resolution.ACP launch command for this provider.
display_namestringBuilt-in label or empty.Any string.Operator-facing label shown in settings and provider pickers.
default_modelstringBuilt-in model or empty.Any string.Model used when an agent omits model; Pi-backed providers receive it in session config.
harnessstringacp unless a built-in sets pi_acp.acp, pi_acp.Launch strategy. pi_acp routes the provider through Pi's ACP adapter.
runtime_providerstringProvider key.Harness-specific provider id.Downstream provider id used by Pi and other harnesses.
transportstringempty.Harness-specific string.Optional Pi models override transport/API family.
base_urlstringempty.URL string.Optional Pi models override base URL for custom gateways.
credential_slotsarrayBuilt-in slots for providers that need one.See below.Bound secret refs injected into provider subprocess environment variables at launch.
mcp_serversarray of MCP server objectsempty.Same shape as [[mcp_servers]].Provider-specific MCP servers merged after top-level config and before agent MCP servers.

Credential slots use this shape:

[[providers.openrouter.credential_slots]]
name = "api_key"
target_env = "OPENROUTER_API_KEY"
secret_ref = "vault:providers/openrouter/api-key"
kind = "api_key"
required = true

secret_ref supports env:NAME for operator-managed environment variables and vault:providers/<provider>/<slot> for AGH-managed encrypted provider credentials written through the settings API, agh vault, or web provider editor. The vault: form accepts lowercase provider/slot identifiers only, with letters, numbers, hyphens, underscores, or dots; arbitrary vault paths are not valid provider credential refs.

The slot required flag is enforced at session start for both env: and vault: refs. Direct ACP built-ins keep their default API-key slots optional because the underlying CLI may already be logged in; Pi-backed API-key providers keep their built-in API-key slots required.

Built-inHarnessRuntime providerDefault modelAPI key env
claudeacpclaudeclaude-sonnet-4-6ANTHROPIC_API_KEY
codexacpcodexgpt-5.4OPENAI_API_KEY
geminiacpgeminigemini-3.1-pro-previewGEMINI_API_KEY
opencodeacpopencodenonenone
copilotacpcopilotnonenone
cursoracpcursornonenone
kiroacpkirononenone
blackboxacpblackboxnoneBLACKBOX_API_KEY
clineacpclinenonenone
gooseacpgoosenonenone
hermesacphermesnonenone
junieacpjunienonenone
kimi-cliacpkimi-clinoneKIMI_API_KEY
openclawacpopenclawnonenone
openhandsacpopenhandsnonenone
qoderacpqodernoneQODER_PERSONAL_ACCESS_TOKEN
qwen-codeacpqwen-codeqwen3.6-plusnone
pipi_acpanthropicclaude-opus-4-7ANTHROPIC_API_KEY
openrouterpi_acpopenrouteropenai/gpt-5.4OPENROUTER_API_KEY
zaipi_acpzaiglm-4.6ZAI_API_KEY
moonshotpi_acpkimi-codingkimi-k2-thinkingKIMI_API_KEY
vercel-ai-gatewaypi_acpvercel-ai-gatewayanthropic/claude-opus-4-7AI_GATEWAY_API_KEY
xaipi_acpxaigrok-4-fast-non-reasoningXAI_API_KEY
minimaxpi_acpminimaxMiniMax-M2.1MINIMAX_API_KEY
mistralpi_acpmistraldevstral-medium-latestMISTRAL_API_KEY
groqpi_acpgroqopenai/gpt-oss-120bGROQ_API_KEY

[observability]

FieldTypeDefaultValid valuesDescription
enabledbooleantruetrue or falseEnables global event summary and health observation paths.
retention_daysinteger7Zero or positive.Retention window for global event summaries, token stats, and permission logs. 0 keeps history.
max_global_bytesinteger1073741824Positive integer.Size cap for global observability storage.

[observability.transcripts]

FieldTypeDefaultValid valuesDescription
enabledbooleantruetrue or falseEnables transcript capture from persisted session events.
segment_bytesinteger1048576Positive integer.Segment size for transcript retention.
max_bytes_per_sessioninteger268435456Positive integer.Per-session transcript byte cap.

[log]

FieldTypeDefaultValid valuesDescription
levelstringinfodebug, info, warn, errorStructured daemon log level.

[memory]

FieldTypeDefaultValid valuesDescription
enabledbooleantruetrue or falseEnables memory assembly and consolidation runtime paths.
global_dirstring path$AGH_HOME/memoryNon-empty path when set. ~ is expanded.Global memory directory. Blank overlays are ignored and keep the previous value.

[memory.dream]

If enabled = false, the remaining dream validation is skipped.

FieldTypeDefaultValid valuesDescription
enabledbooleantruetrue or falseEnables background dream consolidation.
agentstringgeneralNon-empty when enabled.Agent used for consolidation sessions.
min_hoursfloat24Positive number.Minimum age threshold before consolidation.
min_sessionsinteger3Positive integer.Minimum session count threshold before consolidation.
check_intervalduration30mPositive Go duration.Background check interval.

[skills]

If enabled = false, skill polling and marketplace validation are skipped.

FieldTypeDefaultValid valuesDescription
enabledbooleantruetrue or falseEnables skill catalog discovery and polling.
disabled_skillsstring arrayemptySkill names.Replaces the disabled-skill list in overlays.
poll_intervalduration3sPositive Go duration.Filesystem poll interval for skill catalog refresh.
allowed_marketplace_mcpstring arrayemptyMarketplace slug, registry:slug, or verified hash.Trust allowlist for MCP servers declared by marketplace skills.
allowed_marketplace_hooksstring arrayemptyMarketplace slug, registry:slug, or verified hash.Trust allowlist for hooks declared by marketplace skills.

[skills.marketplace]

FieldTypeDefaultValid valuesDescription
registrystringemptyEmpty or clawhub. Required when base_url is set.Skill marketplace registry adapter.
base_urlstring URLemptyEmpty or http or https URL with host.Registry base URL override.

[extensions.marketplace]

FieldTypeDefaultValid valuesDescription
registrystringemptyEmpty or github. Required when base_url is set.Extension marketplace registry adapter.
base_urlstring URLemptyEmpty or http or https URL with host.Registry base URL override. http is accepted but logs a warning.

[automation]

FieldTypeDefaultValid valuesDescription
enabledbooleantruetrue or falseEnables config-defined automation jobs and triggers.
timezonestringUTCIANA timezone loadable by Go, such as UTC or America/Sao_Paulo.Schedule timezone for automation.
max_concurrent_jobsinteger5Positive integer.Global automation concurrency cap.
default_fire_limitobject{ max = 12, window = "1h" }max positive, window positive Go duration.Default rolling fire limit copied into jobs and triggers that omit their own limit.

[[automation.jobs]]

Jobs are appended by overlays; they do not replace earlier jobs with the same name.

FieldTypeDefaultValid valuesDescription
scopestringrequiredglobal or workspaceBinding scope.
namestringrequiredNon-empty.Job name.
agentstringrequired unless task is configuredNon-empty.Agent that handles the scheduled prompt.
workspacestringrequired when scope = "workspace", empty when scope = "global"Workspace ID or root accepted by the automation resolver.Workspace binding.
promptstringrequired unless task is configuredNon-empty.Prompt submitted when the job fires.
schedule.modestringrequiredcron, every, atSchedule mode.
schedule.exprstringemptyRequired only for cron; standard five-field cron.Cron expression.
schedule.intervalstringemptyRequired only for every; positive Go duration.Repeating interval.
schedule.timestringemptyRequired only for at; RFC3339 timestamp.One-shot fire time.
task.titlestringemptyAny string.Task title when the job materializes a task instead of starting an agent session.
task.descriptionstringemptyAny string.Task description.
task.ownerobjectemptyTask ownership object.Owner metadata validated by the task package.
task.network_channelstringemptyValid network channel.Network channel attached to generated tasks.
enabledbooleantruetrue or falseEnables this job.
retry.strategystringnonenone or backoffRetry behavior. Must be none when task is configured.
retry.max_retriesinteger00 for none; positive for backoff.Maximum retry count.
retry.base_delaystringemptyEmpty for none; positive Go duration for backoff.Base backoff delay.
fire_limitobject[automation].default_fire_limitmax positive, window positive Go duration.Per-job fire limit.

[[automation.triggers]]

Triggers are appended by overlays; they do not replace earlier triggers with the same name.

FieldTypeDefaultValid valuesDescription
scopestringrequiredglobal or workspaceBinding scope.
namestringrequiredNon-empty.Trigger name.
agentstringrequiredNon-empty.Agent that handles the trigger prompt.
workspacestringrequired when scope = "workspace", empty when scope = "global"Workspace ID or root accepted by the automation resolver.Workspace binding.
promptstringrequiredValid Go template over the activation envelope.Prompt submitted when the trigger fires.
eventstringrequiredNon-empty; webhook has extra requirements.Event name.
filterstring mapemptyKeys kind, scope, workspace_id, source, or data.<field>; values non-empty.Activation-envelope filter.
enabledbooleantruetrue or falseEnables this trigger.
retry.strategystringnonenone or backoffRetry behavior.
retry.max_retriesinteger00 for none; positive for backoff.Maximum retry count.
retry.base_delaystringemptyEmpty for none; positive Go duration for backoff.Base backoff delay.
fire_limitobject[automation].default_fire_limitmax positive, window positive Go duration.Per-trigger fire limit.
endpoint_slugstringemptyRequired when event = "webhook"; empty otherwise.Webhook endpoint slug.
webhook_secret_refstringemptyRequired when event = "webhook"; must be env:NAME or vault:automation/...; empty otherwise.Secret ref used to validate webhook requests.

See Vault for the CLI, HTTP, UDS, web, and session-scoped surfaces that store and inspect encrypted AGH-managed secret refs.

[autonomy.coordinator]

Coordinator config controls whether AGH may start a workspace coordinator when executable task-run work is enqueued. Task creation is not executable work. Creating or saving a task does not enqueue a run, create a coordination channel, or spawn a coordinator. Publish, start, approval, and equivalent run-enqueue APIs are the execution boundary.

Coordinator launch only applies to workspace-scoped coordinated runs with a stable coordination_channel_id. Global runs and intent-only tasks do not start coordinators in the MVP.

FieldTypeDefaultValid valuesDescription
enabledbooleanfalsetrue or falseAllows coordinator bootstrap after a coordinated workspace run is enqueued.
agent_namestringcoordinatorNon-empty when enabled.Agent definition used for managed coordinator sessions.
providerstringemptyEmpty or a configured provider key.Optional provider override for the coordinator agent.
modelstringemptyEmpty or provider-supported model string.Optional model override. If set, provider or provider default resolution must exist.
default_ttlduration2h1m through 24h.Lifetime assigned to managed coordinator sessions.
max_childreninteger50 through 5.Maximum safe-spawn children a coordinator may hold at once.
max_active_per_workspaceinteger1Must be 1 in the MVP.Enforces one active managed coordinator per workspace.

Provider and model resolution is intentionally narrow. The daemon applies:

  1. Workspace .agh/config.toml override for the resolved workspace.
  2. Global $AGH_HOME/config.toml.
  3. The bundled/default coordinator agent definition and provider defaults.

Safe-spawn limits still apply after a coordinator starts. Coordinator children inherit the workspace and coordination channel, must use a positive TTL, and can only narrow the coordinator's permission set.

[[hooks.declarations]]

Config hooks merge by name; a later overlay replaces the whole hook declaration with the same name.

FieldTypeDefaultValid valuesDescription
namestringrequiredNon-empty.Hook declaration name.
eventstringrequiredCurrent dot-form hook event.Event that triggers the hook.
modestringasyncsync or async; sync only for sync-eligible events.Dispatch mode.
requiredbooleanfalsetrue or false; required hooks must be sync.Whether a hook failure blocks the source operation.
priorityintegerConfig source default 500 when omitted.Integer.Ordering priority.
timeoutduration0s; subprocess executor uses 5 seconds when zero.Non-negative Go duration.Hook timeout.
matcherobjectemptySupported matcher fields listed below.Narrows hook eligibility.
commandstringemptyRequired for subprocess hooks unless nested executor fields are used.Subprocess command.
argsstring arrayemptyStrings.Subprocess arguments.
envstring mapemptyString keys and values.Explicit hook environment values.
executor.kindstringsubprocess when a command is present.subprocess or wasm for user config. native is internal only.Executor kind.
executor.commandstringemptySame as command.Nested command form. Cannot be mixed with top-level command/args/env.
executor.argsstring arrayemptyStrings.Nested args form.
executor.envstring mapemptyString keys and values.Nested env form.

Supported matcher fields are agent_name, agent_type, workspace_id, workspace_root, session_type, input_class, acp_event_type, turn_id, tool_name, tool_namespace, tool_read_only, decision_class, message_role, message_delta_type, compaction_reason, and compaction_strategy.

Current hook events are:

session.pre_create
session.post_create
session.pre_resume
session.post_resume
session.pre_stop
session.post_stop
input.pre_submit
prompt.post_assemble
event.pre_record
event.post_record
automation.job.pre_fire
automation.job.post_fire
automation.trigger.pre_fire
automation.trigger.post_fire
automation.run.completed
automation.run.failed
agent.pre_start
agent.spawned
agent.crashed
agent.stopped
turn.start
turn.end
message.start
message.delta
message.end
tool.pre_call
tool.post_call
tool.post_error
permission.request
permission.resolved
permission.denied
context.pre_compact
context.post_compact

[network]

FieldTypeDefaultValid valuesDescription
enabledbooleantruetrue or falseEnables the embedded AGH network runtime.
default_channelstringdefaultRegex ^[a-z0-9][a-z0-9_-]{0,63}$Default network channel for sessions.
portinteger-1-1 or 1 through 65535Network listener port. -1 lets the runtime choose.
max_payloadinteger bytes1048576Positive integer no greater than 2147483647.Maximum network payload size.
greet_intervalinteger seconds30Positive integer seconds.Peer greeting interval.
max_replay_ageinteger seconds300Positive integer seconds.Maximum replay window for network messages.
max_queue_depthinteger100Positive integer.Maximum queued network messages.
  • mcp.json documents JSON sidecars and whole-object replacement.
  • AGENT.md documents agent-local mcp_servers and hooks.
  • File Locations lists the exact global and workspace paths.

On this page