Configuration

Swarm uses a centralized configuration file at ~/.swarm/settings.json that defines projects, agents, providers, permissions, and more. The config system distinguishes between raw (as-written) and resolved (fully-defaulted) types.

Settings File Location

~/.swarm/settings.json

Created automatically by swarm init, or manually. The file uses JSON format with a required version field and project entries keyed by absolute path.

File Structure

{
  "version": 2,
  "/absolute/path/to/project": {
    "providers": { ... },
    "agents": [ ... ],
    "supervisor": { ... },
    "defaults": { ... },
    "permissions": { ... },
    "hooks": { ... },
    "mcpServers": { ... },
    "wasm_tools": [ ... ],
    "sub_agent_defaults": { ... }
  }
}

Version

The version field must be 1 or 2. Version 2 is the current schema. Versions above the supported maximum are rejected.

Providers

Named provider blocks describe how to reach an LLM API:

"providers": {
  "default": {
    "type": "anthropic",
    "api_key_env": "ANTHROPIC_API_KEY",
    "base_url": null,
    "max_retries": null,
    "timeout": null
  }
}
FieldTypeRequiredDefaultDescription
typeStringYesProvider type (currently only "anthropic")
api_key_envStringNo"ANTHROPIC_API_KEY"Environment variable holding the API key
base_urlStringNonullCustom API base URL
max_retriesu32NonullMax retries for transient failures
timeoutu64NonullRequest timeout in seconds

If no providers block is defined, an implicit "default" Anthropic provider is created.

Agents

An array of agent definitions (at least one required):

"agents": [
  {
    "name": "backend",
    "prompt": "You are a backend engineer. Focus on API and data layer.",
    "model": "sonnet",
    "provider": "default",
    "permissions": { ... },
    "delegate_mode": false,
    "mode": "code"
  }
]
FieldTypeRequiredDefaultDescription
nameStringYesUnique name matching [a-z][a-z0-9-]*
promptStringYesSystem prompt text, or @path/to/file to load from file
modelStringNodefaults.model or "sonnet"Model identifier
providerStringNodefaults.provider or "default"Provider name
permissionsPermissionsConfigNonullAgent-level permission overrides
delegate_modeboolNofalseLegacy flag for delegate mode
modeStringNoSee resolutionAgent execution mode

Prompt resolution: If the prompt starts with @, the remainder is treated as a file path relative to the project root, and the file contents are loaded as the prompt.

Mode resolution priority: agent.mode > defaults.mode > delegate_mode compat ("delegate" if true) > "code"

Supervisor

Optional supervisor configuration:

"supervisor": {
  "prompt": "Custom supervisor prompt",
  "model": "sonnet"
}
FieldTypeRequiredDefault
promptStringNoBuilt-in merge-focused supervisor prompt
modelStringNodefaults.model

Defaults

Project-wide defaults applied when agent-level values are not specified:

"defaults": {
  "model": "sonnet",
  "provider": "default",
  "session_timeout": null,
  "commit_interval": 300,
  "max_consecutive_errors": 5,
  "max_total_errors": 20,
  "mode": "code",
  "liveness": { ... }
}
FieldTypeDefaultDescription
modelString"sonnet"Default model for agents and supervisor
providerString"default"Default provider name
session_timeoutu64nullSession timeout in seconds (none = no timeout)
commit_intervalu64300Auto-commit interval in seconds
max_consecutive_errorsu325Consecutive errors before agent stops
max_total_errorsu3220Total errors before agent stops
modeStringnullDefault agent mode
livenessLivenessConfigSee belowLiveness monitoring settings

Liveness Configuration

Controls idle detection, nudging, and stall monitoring:

"liveness": {
  "enabled": true,
  "idle_nudge_after_secs": 120,
  "idle_nudge_interval_secs": 300,
  "max_nudges": 3,
  "idle_warn_after_secs": 600,
  "stall_timeout_secs": 900,
  "auto_interrupt_stalled": false
}
FieldTypeDefaultDescription
enabledbooltrueEnable/disable liveness monitoring
idle_nudge_after_secsu64?120Seconds idle before first nudge
idle_nudge_interval_secsu64?300Seconds between subsequent nudges
max_nudgesu323Maximum nudge messages per idle episode
idle_warn_after_secsu64?600Seconds idle before warning hook fires
stall_timeout_secsu64?900Seconds without heartbeat before stall detection
auto_interrupt_stalledboolfalseAuto-interrupt stalled agents

Permissions

Project-level permission rules (also available per-agent):

"permissions": {
  "allow": ["Bash(npm run *)"],
  "ask": ["Bash(rm *)"],
  "deny": ["Bash(curl *)"],
  "default_mode": "ask"
}

See Permissions for full details.

Resolution Cascade

When the configuration is loaded, raw values are resolved into fully-defaulted types:

Agent model    = agent.model    ?? defaults.model    ?? "sonnet"
Agent provider = agent.provider ?? defaults.provider ?? "default"
Agent mode     = agent.mode     ?? defaults.mode     ?? (delegate_mode ? "delegate" : "code")

The ResolvedConfig struct has no Option fields — every value is filled in.

Validation Rules

The config loader validates:

  1. Version — Must be 1 or 2 (no higher)
  2. At least one agent — The agents array cannot be empty
  3. Agent names — Must match [a-z][a-z0-9-]* and be unique
  4. Provider references — All agent.provider and defaults.provider values must reference a defined provider
  5. Provider types — Cannot be empty strings
  6. WASM tool names — Must match [a-z][a-z0-9_-]*, be unique, have non-empty paths
  7. WASM capabilities — Must be one of: Logging, WorkspaceRead, HttpRequest, ToolInvoke, SecretCheck