Skip to content

Configuration Reference

Acteon is configured via a TOML file (default: acteon.toml). Every section is optional — sensible defaults are provided for all values.

CLI Options

cargo run -p acteon-server -- [OPTIONS] [COMMAND]

Options:
  -c, --config <PATH>   Path to TOML config file [default: acteon.toml]
      --host <HOST>      Override bind host
      --port <PORT>      Override bind port

Commands:
  encrypt   Encrypt a value for use in auth.toml (reads from stdin)
  migrate   Run database migrations for configured backends, then exit

CLI flags override values in the config file.

Database Migrations

Before starting the server for the first time (or after upgrading), run migrations to create or update database schemas:

# Using the wrapper script (auto-detects backend from config)
scripts/migrate.sh -c acteon.toml

# Or directly via cargo
cargo run -p acteon-server --features postgres -- -c acteon.toml migrate

Migrations are idempotent and safe to run multiple times. They use CREATE TABLE IF NOT EXISTS and ALTER TABLE ADD COLUMN IF NOT EXISTS patterns. Backends that don't require schemas (memory, Redis) are no-ops.

Full Configuration

acteon.toml
# ─── Server ───────────────────────────────────────────────
[server]
host = "127.0.0.1"                  # Bind address
port = 8080                          # Bind port
# shutdown_timeout_seconds = 30      # Graceful shutdown drain time
# max_sse_connections_per_tenant = 10  # Max concurrent SSE connections per tenant

# ─── State Backend ────────────────────────────────────────
[state]
backend = "memory"                   # "memory" | "redis" | "postgres" | "dynamodb"
# url = "redis://localhost:6379"     # Connection URL (redis, postgres, dynamodb-local)
# prefix = "acteon"                  # Key/table prefix
# region = "us-east-1"              # AWS region (DynamoDB only)
# table_name = "acteon_state"       # Table name (DynamoDB only)

# ─── Audit Trail ──────────────────────────────────────────
[audit]
enabled = false                      # Enable audit recording
backend = "memory"                   # "memory" | "postgres" | "clickhouse" | "elasticsearch"
# url = "postgres://..."            # Connection URL
prefix = "acteon_"                   # Table/index prefix
ttl_seconds = 2592000                # Record TTL (30 days)
cleanup_interval_seconds = 3600      # Background cleanup interval
store_payload = true                 # Store action payloads in audit

# ─── Audit Redaction ──────────────────────────────────────
[audit.redact]
enabled = false                      # Enable field redaction
fields = ["password", "token", "api_key", "secret"]  # Fields to redact
placeholder = "[REDACTED]"           # Replacement text

# ─── Rules ────────────────────────────────────────────────
[rules]
# directory = "./rules"              # YAML rule files directory

# ─── Executor ─────────────────────────────────────────────
[executor]
max_retries = 3                      # Max retry attempts per action
timeout_seconds = 30                 # Per-action execution timeout
max_concurrent = 10                  # Max concurrent executions

# ─── Providers ───────────────────────────────────────────
# [[providers]]
# name = "email"
# type = "email"
# from_address = "noreply@example.com"

# [[providers]]
# name = "alert-fanout"
# type = "aws-sns"
# aws_region = "us-east-1"
# topic_arn = "arn:aws:sns:us-east-1:123:alerts"
# aws_endpoint_url = "http://localhost:4566"  # LocalStack

# [[providers]]
# name = "archive"
# type = "aws-s3"
# aws_region = "us-east-1"
# bucket_name = "my-bucket"
# object_prefix = "acteon/"

# ─── Authentication ───────────────────────────────────────
# Users and API keys live in auth.toml, a separate file referenced from
# here. Each principal is authorized via a list of grants that scope them
# to specific tenants, namespaces, providers, and action types. Tenant
# grants support hierarchical matching — a grant on "acme" covers
# "acme.us-east" and "acme.us-east.prod". See the "API Key Scoping"
# feature page for the full grant model and worked examples.
[auth]
enabled = false                      # Enable authentication
# config_path = "auth.toml"         # Path to auth config (relative to acteon.toml)
# watch = true                       # Hot-reload auth.toml on file changes

# ─── Background Processing ───────────────────────────────
[background]
# tick_interval_ms = 1000           # Background loop tick interval
# group_flush_timeout_ms = 60000    # Group flush wait time
# timeout_check_batch_size = 100    # Batch size for timeout checks
# enable_scheduled_actions = false  # Enable scheduled action processing
# scheduled_check_interval = 5     # Scheduled action poll interval (seconds)
# enable_recurring_actions = false  # Enable recurring action processing
# recurring_check_interval_seconds = 5  # Recurring action poll interval (seconds)

# ─── State Machines ───────────────────────────────────────
[[state_machines]]
name = "alert"
initial_state = "firing"
states = ["firing", "acknowledged", "resolved", "stale"]

[[state_machines.transitions]]
from = "firing"
to = "acknowledged"

[[state_machines.transitions]]
from = "acknowledged"
to = "resolved"

[[state_machines.transitions]]
from = "firing"
to = "resolved"

[[state_machines.timeouts]]
state = "firing"
after_seconds = 3600
transition_to = "stale"

# ─── Task Chains ──────────────────────────────────────────
[[chains]]
name = "search-summarize-email"
on_failure = "abort"                 # "abort" | "abort_no_dlq"
# timeout_seconds = 604800          # Chain-level timeout (7 days)

[[chains.steps]]
name = "search"
provider = "search-api"
action_type = "web_search"
# delay_seconds = 0                 # Delay before execution
# on_failure = "abort"              # "abort" | "skip" | "dlq"

[[chains.steps]]
name = "summarize"
provider = "llm"
action_type = "summarize"

[[chains.steps]]
name = "send-email"
provider = "email"
action_type = "send_email"

# ─── Circuit Breaker ─────────────────────────────────────
[circuit_breaker]
enabled = false                      # Enable circuit breakers
failure_threshold = 5                # Consecutive failures to open
success_threshold = 2                # Consecutive successes to close
recovery_timeout_seconds = 60        # Seconds before probing

# Per-provider overrides
# [circuit_breaker.providers.email]
# failure_threshold = 10
# recovery_timeout_seconds = 120
# fallback_provider = "webhook"

# ─── LLM Guardrails ──────────────────────────────────────
[llm_guardrail]
# endpoint = "https://api.openai.com/v1/chat/completions"
# model = "gpt-4"
# api_key_env = "OPENAI_API_KEY"
# policy = "block"                  # "block" | "flag"
# temperature = 0.0
# max_tokens = 256

# ─── Embedding / Semantic Routing ────────────────────────
[embedding]
# enabled = false
# endpoint = "https://api.openai.com/v1/embeddings"
# model = "text-embedding-3-small"
# api_key = ""                      # Supports ENC[...] encrypted values
# timeout_seconds = 10
# fail_open = true                  # Return similarity 0.0 on API failure
# topic_cache_capacity = 10000      # Max cached topic embeddings
# topic_cache_ttl_seconds = 3600    # Topic cache TTL (1 hour)
# text_cache_capacity = 1000        # Max cached text embeddings
# text_cache_ttl_seconds = 60       # Text cache TTL (1 minute)

# ─── Telemetry / Distributed Tracing ────────────────────
[telemetry]
# enabled = false                    # Enable OpenTelemetry tracing
# endpoint = "http://localhost:4317" # OTLP collector endpoint
# service_name = "acteon"            # Service name in traces
# sample_ratio = 1.0                 # 0.0 (none) to 1.0 (all)
# protocol = "grpc"                  # "grpc" (port 4317) or "http" (port 4318)
# timeout_seconds = 10               # Exporter timeout

# [telemetry.resource_attributes]
# "deployment.environment" = "production"
# "service.instance.id" = "acteon-01"

Section Details

[server]

Field Type Default Description
host string "127.0.0.1" Bind address
port u16 8080 Bind port
shutdown_timeout_seconds u64 30 Max time to drain pending tasks on shutdown
max_sse_connections_per_tenant usize 10 Max concurrent SSE stream connections per tenant

[state]

Field Type Default Description
backend string "memory" Backend type
url string Connection URL
prefix string "acteon" Key prefix for all state entries
region string AWS region (DynamoDB only)
table_name string Table name (DynamoDB only)

[audit]

Field Type Default Description
enabled bool false Enable audit trail recording
backend string "memory" Backend type
url string Connection URL
prefix string "acteon_" Table/index prefix
ttl_seconds u64 2592000 Record time-to-live (30 days)
cleanup_interval_seconds u64 3600 Background cleanup frequency
store_payload bool true Include action payloads in audit records

[audit.redact]

Field Type Default Description
enabled bool false Enable field redaction
fields string[] ["password", "token", "api_key", "secret"] Field names to redact
placeholder string "[REDACTED]" Replacement text

[rules]

Field Type Default Description
directory string Path to directory containing YAML rule files

Hot Reload

When a directory is specified, Acteon watches the directory for changes and automatically reloads rules. You can also trigger a manual reload via POST /v1/rules/reload.

[executor]

Field Type Default Description
max_retries u32 3 Maximum retry attempts per action
timeout_seconds u64 30 Per-action execution timeout
max_concurrent usize 10 Maximum concurrent action executions

[auth]

Field Type Default Description
enabled bool false Enable authentication
config_path string Path to auth configuration file
watch bool true Hot-reload auth config on file changes

See Authentication for auth config file format.

[circuit_breaker]

Field Type Default Description
enabled bool false Enable circuit breakers
failure_threshold u32 5 Consecutive failures before opening
success_threshold u32 2 Consecutive successes in HalfOpen to close
recovery_timeout_seconds u64 60 Seconds in Open before probing

[circuit_breaker.providers.<name>]

Field Type Required Description
failure_threshold u32 No Override default failure threshold
success_threshold u32 No Override default success threshold
recovery_timeout_seconds u64 No Override default recovery timeout
fallback_provider string No Provider to reroute to when circuit is open

Per-provider fields inherit from the defaults when not specified. The fallback_provider must reference a registered provider and cannot reference itself.

See Circuit Breaker for feature documentation.

[[state_machines]]

Field Type Description
name string State machine identifier (referenced in rules)
initial_state string State for new events
states string[] Valid state names

[[state_machines.transitions]]

Field Type Description
from string Source state
to string Target state

[[state_machines.timeouts]]

Field Type Description
state string State that triggers timeout
after_seconds u64 Timeout duration
transition_to string Target state on timeout

[[chains]]

Field Type Default Description
name string Chain identifier (referenced in rules)
on_failure string "abort" "abort" or "abort_no_dlq"
timeout_seconds u64 604800 Overall chain timeout (7 days)

See Task Chains for detailed chain configuration.

[embedding]

Field Type Default Description
enabled bool false Enable the embedding provider
endpoint string "https://api.openai.com/v1/embeddings" OpenAI-compatible embeddings API endpoint
model string "text-embedding-3-small" Embedding model name
api_key string "" API key (supports ENC[...] encrypted values)
timeout_seconds u64 10 Request timeout
fail_open bool true Return similarity 0.0 on API failure instead of erroring
topic_cache_capacity u64 10000 Max cached topic embeddings
topic_cache_ttl_seconds u64 3600 Topic cache TTL (1 hour)
text_cache_capacity u64 1000 Max cached text embeddings
text_cache_ttl_seconds u64 60 Text cache TTL (1 minute)

Secret Management

The api_key field supports encrypted values. Set ACTEON_AUTH_KEY and use acteon-server encrypt to generate an ENC[...] token. See Semantic Routing for details.

See Semantic Routing for feature documentation.

[telemetry]

Field Type Default Description
enabled bool false Enable OpenTelemetry distributed tracing
endpoint string "http://localhost:4317" OTLP exporter endpoint
service_name string "acteon" Service name reported in traces
sample_ratio f64 1.0 Sampling ratio (0.0 = none, 1.0 = all requests)
protocol string "grpc" OTLP transport: "grpc" (port 4317) or "http" (port 4318)
timeout_seconds u64 10 Exporter timeout in seconds

[telemetry.resource_attributes]

Arbitrary key-value pairs added to every exported span as OpenTelemetry resource attributes. Useful for tagging deployment environment, region, or instance ID.

See Distributed Tracing for feature documentation.

[[providers]]

Provider configuration. Multiple providers can be defined.

Field Type Required Description
name string Yes Unique provider name used in action dispatch
type string Yes Provider type (see below)

Built-in provider types:

Type Description Extra Fields
"log" Logs actions (no external calls)
"webhook" HTTP webhook url
"slack" Slack webhook webhook_url
"email" Email (SMTP or SES) backend, from_address, smtp_host, aws_region, ...
"twilio" Twilio SMS account_sid, auth_token, from_number
"teams" Microsoft Teams webhook_url
"discord" Discord webhook webhook_url
"pagerduty" PagerDuty events routing_key
"aws-sns" AWS SNS aws_region, topic_arn
"aws-lambda" AWS Lambda aws_region, function_name
"aws-eventbridge" AWS EventBridge aws_region, event_bus_name
"aws-sqs" AWS SQS aws_region, queue_url
"aws-s3" AWS S3 aws_region, bucket_name, object_prefix

Common AWS fields (all optional, shared across all aws-* types and email with backend = "ses"):

Field Type Description
aws_region string AWS region (required for AWS types)
aws_endpoint_url string Endpoint URL override (for LocalStack)
aws_role_arn string IAM role ARN to assume via STS
aws_session_name string STS session name (default: "acteon-aws-provider")
aws_external_id string External ID for cross-account trust policies

See AWS Providers and Native Providers for full payload format documentation.

Environment Variables

Variable Description
RUST_LOG Log verbosity (error, warn, info, debug, trace)
OPENAI_API_KEY API key for LLM guardrail evaluations
ACTEON_AUTH_KEY Hex-encoded 256-bit master key for decrypting ENC[...] config values

Example Configurations

Ready-to-use configs are in the examples/ directory:

File Description
examples/redis.toml Redis state backend
examples/postgres.toml PostgreSQL state + audit
examples/clickhouse.toml ClickHouse audit
examples/elasticsearch-audit.toml Redis state + Elasticsearch audit
examples/dynamodb.toml DynamoDB state backend
examples/full.toml All options documented
examples/aws-event-pipeline/acteon.toml AWS providers (SNS, Lambda, EventBridge, SQS) + DynamoDB
examples/agent-swarm-coordination/acteon.toml Claude Code agent governance with PostgreSQL
# Start with Redis
docker compose up -d
cargo run -p acteon-server -- -c examples/redis.toml

# Start with PostgreSQL
docker compose --profile postgres up -d
scripts/migrate.sh -c examples/postgres.toml
cargo run -p acteon-server --features postgres -- -c examples/postgres.toml