schema_version = 2

[observability]
backend = "none"
runtime_trace_mode = "none"
runtime_trace_path = "state/runtime-trace.jsonl"
runtime_trace_max_entries = 200

[autonomy]
level = "supervised"
workspace_only = true
allowed_commands = [
    "git",
    "npm",
    "cargo",
    "ls",
    "cat",
    "grep",
    "find",
    "echo",
    "pwd",
    "wc",
    "head",
    "tail",
    "date",
    "delegate",
    "model_routing_config",
    "shell",
    "tool_search",
]
forbidden_paths = [
    "/etc",
    "/root",
    "/home",
    "/usr",
    "/bin",
    "/sbin",
    "/lib",
    "/opt",
    "/boot",
    "/dev",
    "/proc",
    "/sys",
    "/var",
    "/tmp",
    "/proc",
    "/sys",
    "~/.ssh",
    "~/.gnupg",
    "~/.aws",
    "~/.config",
]
max_actions_per_hour = 60
max_cost_per_day_cents = 100
require_approval_for_medium_risk = true
block_high_risk_commands = true
shell_env_passthrough = []
auto_approve = [
    "file_read",
    "memory_recall",
    "cron_add",
    "cron_list",
    "cron_remove",
    "cron_update",
    "cron_run",
    "cron_runs",
    "model_routing_config",
    "schedule",
    "shell",
    "delegate",
    "tool_search",
    "file_write",
]
always_ask = []
allowed_roots = []
non_cli_excluded_tools = []
shell_timeout_secs = 60

[security.sandbox]
backend = "auto"
firejail_args = []

[security.resources]
max_memory_mb = 512
max_cpu_time_seconds = 60
max_subprocesses = 10
memory_monitoring = true

[security.audit]
enabled = true
log_path = "/root/.zeroclaw/audit.log"
max_size_mb = 10
sign_events = false

[security.otp]
enabled = false
method = "totp"
token_ttl_secs = 30
cache_valid_secs = 300
gated_actions = [
    "shell",
    "file_write",
    "browser_open",
    "browser",
    "memory_forget",
]
gated_domains = []
gated_domain_categories = []
challenge_max_attempts = 3

[security.estop]
enabled = false
state_file = "~/.zeroclaw/estop-state.json"
require_otp_to_resume = true

[security.nevis]
enabled = false
instance_url = ""
realm = "master"
client_id = ""
token_validation = "local"
role_mapping = []
require_mfa = false
session_timeout_secs = 3600

[security.webauthn]
enabled = false
rp_id = "localhost"
rp_name = "ZeroClaw"
rp_origin = "http://localhost:42617"

[backup]
enabled = true
max_keep = 10
include_dirs = [
    "config",
    "memory",
    "audit",
    "knowledge",
]
destination_dir = "state/backups"
compress = true
encrypt = false

[data_retention]
enabled = false
retention_days = 90
dry_run = false
categories = []

[cloud_ops]
enabled = false
default_cloud = "aws"
supported_clouds = [
    "aws",
    "azure",
    "gcp",
]
iac_tools = ["terraform"]
cost_threshold_monthly_usd = 20.0
well_architected_frameworks = ["aws-waf"]

[security_ops]
enabled = false
playbooks_dir = "~/.zeroclaw/playbooks"
auto_triage = false
require_approval_for_actions = true
max_auto_severity = "low"
report_output_dir = "~/.zeroclaw/security-reports"

[runtime]
kind = "native"

[runtime.docker]
image = "alpine:3.20"
network = "none"
memory_limit_mb = 512
cpu_limit = 1.0
read_only_rootfs = true
mount_workspace = true
allowed_workspace_roots = []

[reliability]
provider_retries = 2
provider_backoff_ms = 500
fallback_providers = []
api_keys = []
channel_initial_backoff_secs = 2
channel_max_backoff_secs = 60
scheduler_poll_secs = 15
scheduler_retries = 2

[reliability.model_fallbacks]

[scheduler]
enabled = true
max_tasks = 64
max_concurrent = 4

[agent]
compact_context = false
max_tool_iterations = 10
max_history_messages = 50
max_context_tokens = 32000
parallel_tools = false
tool_dispatcher = "auto"
tool_call_dedup_exempt = []
tool_filter_groups = []
context_aware_tools = false
keep_tool_context_turns = 2
max_system_prompt_chars = 0
max_tool_result_chars = 50000

[agent.context_compression]
enabled = true
identifier_policy = "strict"
max_passes = 3
protect_first_n = 3
protect_last_n = 4
source_max_chars = 50000
summary_max_chars = 4000
threshold_ratio = 0.5
timeout_secs = 60
tool_result_retrim_chars = 2000
tool_result_trim_exempt = []

[agent.eval]
enabled = false
max_retries = 1
min_quality_score = 0.5

[agent.history_pruning]
collapse_tool_results = true
enabled = false
keep_recent = 4
max_tokens = 8192

[agent.thinking]
default_level = "medium"

[skills]
open_skills_enabled = false
prompt_injection_mode = "full"
allow_scripts = false

[skills.skill_creation]
enabled = false
max_skills = 500
similarity_threshold = 0.85

[skills.skill_improvement]
cooldown_secs = 3600
enabled = true

[query_classification]
enabled = false
rules = []

[heartbeat]
enabled = false
interval_minutes = 30
two_phase = true
adaptive = false
min_interval_minutes = 5
max_interval_minutes = 120
deadman_timeout_minutes = 0
max_run_history = 100
load_session_context = false
task_timeout_secs = 600

[cron]
enabled = true
max_run_history = 50
catch_up_on_startup = true
jobs = []

[memory]
backend = "sqlite"
auto_save = true
hygiene_enabled = true
archive_after_days = 7
purge_after_days = 30
conversation_retention_days = 30
embedding_provider = "none"
embedding_model = "text-embedding-3-small"
embedding_dimensions = 1536
vector_weight = 0.7
keyword_weight = 0.3
min_relevance_score = 0.4
embedding_cache_size = 10000
chunk_max_tokens = 512
response_cache_enabled = false
response_cache_ttl_minutes = 60
response_cache_max_entries = 5000
response_cache_hot_entries = 256
snapshot_enabled = false
snapshot_on_hygiene = false
auto_hydrate = true
audit_enabled = false
audit_retention_days = 30
conflict_threshold = 0.85
default_namespace = "default"
fts_early_return_score = 0.85
rerank_enabled = false
rerank_threshold = 5
retrieval_stages = ["cache", "fts", "vector"]
search_mode = "hybrid"

[memory.qdrant]
collection = "zeroclaw_memories"

[memory.policy]
max_entries_per_category = 0
max_entries_per_namespace = 0
read_only_namespaces = []

[memory.policy.retention_days_by_category]

[storage.provider.config]
provider = ""
schema = "public"
table = "memories"

[tunnel]
provider = "none"

[gateway]
port = 42617
host = "127.0.0.1"
require_pairing = true
allow_public_bind = false
paired_tokens = []
pair_rate_limit_per_minute = 10
webhook_rate_limit_per_minute = 60
trust_forwarded_headers = false
rate_limit_max_keys = 10000
idempotency_ttl_secs = 300
idempotency_max_keys = 10000
session_persistence = true
session_ttl_hours = 0

[gateway.pairing_dashboard]
code_length = 8
code_ttl_secs = 3600
lockout_secs = 300
max_failed_attempts = 5
max_pending_codes = 3

[composio]
enabled = false
entity_id = "default"

[microsoft365]
enabled = false
auth_flow = "client_credentials"
scopes = ["https://graph.microsoft.com/.default"]
token_cache_encrypted = true

[secrets]
encrypt = true

[browser]
enabled = false
allowed_domains = []
backend = "agent_browser"
native_headless = true
native_webdriver_url = "http://127.0.0.1:9515"

[browser.computer_use]
endpoint = "http://127.0.0.1:8787/v1/actions"
timeout_ms = 15000
allow_remote_endpoint = false
window_allowlist = []

[http_request]
enabled = false
allowed_domains = []
max_response_size = 1000000
timeout_secs = 30
allow_private_hosts = false

[multimodal]
max_images = 4
max_image_size_mb = 5
allow_remote_fetch = false

[web_fetch]
enabled = false
allowed_domains = ["*"]
blocked_domains = []
max_response_size = 500000
timeout_secs = 30
allowed_private_hosts = []

[web_fetch.firecrawl]
api_key_env = "FIRECRAWL_API_KEY"
api_url = "https://api.firecrawl.dev/v1"
enabled = false
mode = "scrape"

[web_search]
enabled = false
provider = "duckduckgo"
max_results = 5
timeout_secs = 15

[project_intel]
enabled = false
default_language = "en"
report_output_dir = "~/.zeroclaw/project-reports"
risk_sensitivity = "medium"
include_git_data = true
include_jira_data = false

[proxy]
enabled = false
no_proxy = []
scope = "zeroclaw"
services = []

[identity]
format = "openclaw"

[cost]
enabled = true
daily_limit_usd = 5.0
monthly_limit_usd = 20.0
warn_at_percent = 80
allow_override = false

[cost.prices."google/gemini-1.5-pro"]
input = 1.25
output = 5.0

[cost.prices."anthropic/claude-opus-4-20250514"]
input = 15.0
output = 75.0

[cost.prices."openai/gpt-4o-mini"]
input = 0.15
output = 0.6

[cost.prices."openai/gpt-4o"]
input = 5.0
output = 15.0

[cost.prices."anthropic/claude-3-haiku"]
input = 0.25
output = 1.25

[cost.prices."anthropic/claude-3.5-sonnet"]
input = 3.0
output = 15.0

[cost.prices."anthropic/claude-sonnet-4-20250514"]
input = 3.0
output = 15.0

[cost.prices."google/gemini-2.0-flash"]
input = 0.1
output = 0.4

[cost.prices."openai/o1-preview"]
input = 15.0
output = 60.0

[cost.enforcement]
mode = "warn"
reserve_percent = 10

[peripherals]
enabled = false
boards = []

[agents]

[agents.Nova]
agentic = true
allowed_tools = ["apify-youtube__streamers--youtube-scraper", "apify-youtube__get-actor-output"]
max_depth = 3
max_iterations = 10
model = "anthropic/claude-sonnet-4.5"
provider = "openrouter"
system_prompt = "workspace/nova/"

[swarms]

[hooks]
enabled = true

[hooks.builtin]
command_logger = false

[hooks.builtin.webhook_audit]
enabled = false
url = ""
tool_patterns = []
include_args = false
max_args_bytes = 4096

[hardware]
enabled = false
transport = "None"
baud_rate = 115200
workspace_datasheets = false

[transcription]
enabled = false
api_url = "https://api.groq.com/openai/v1/audio/transcriptions"
model = "whisper-large-v3-turbo"
max_duration_secs = 120
default_provider = "groq"
transcribe_non_ptt_audio = false

[tts]
enabled = false
default_provider = "openai"
default_voice = "alloy"
default_format = "mp3"
max_text_length = 4096

[mcp]
enabled = true
deferred_loading = true
servers = [{ args = ["mcp-remote", "https://mcp.apify.com/?tools=streamers/youtube-scraper", "--header", "Authorization: "YOUR_APIFY_TOKEN_HERE"], command = "npx", env = {}, headers = {}, name = "apify-youtube", transport = "stdio" }]

[nodes]
enabled = false
max_nodes = 16

[workspace]
enabled = false
workspaces_dir = "~/.zeroclaw/workspaces"
isolate_memory = true
isolate_secrets = true
isolate_audit = true
cross_workspace_search = false

[notion]
enabled = false
api_key = ""
database_id = ""
poll_interval_secs = 5
status_property = "Status"
input_property = "Input"
result_property = "Result"
max_concurrent = 4
recover_stale = true

[node_transport]
enabled = true
shared_secret = ""
max_request_age_secs = 300
require_https = true
allowed_peers = []
mutual_tls = false
connection_pool_size = 4

[browser_delegate]
allowed_domains = []
blocked_domains = []
chrome_profile_dir = ""
cli_binary = "claude"
enabled = false
task_timeout_secs = 120

[channels]
ack_reactions = true
cli = true
debounce_ms = 0
message_timeout_secs = 300
session_backend = "sqlite"
session_persistence = true
session_ttl_hours = 0
show_tool_calls = true

[channels.telegram]
allowed_users = ["5098521169"]
approval_timeout_secs = 120
bot_token = "YOUR_BOT_TOKEN_HERE"
draft_update_interval_ms = 1000
enabled = true
interrupt_on_new_message = false
mention_only = false
stream_mode = "off"

[claude_code]
allowed_tools = ["Read", "Edit", "Bash", "Write"]
enabled = false
env_passthrough = []
max_output_bytes = 2097152
timeout_secs = 600

[claude_code_runner]
enabled = false
session_ttl = 3600
tmux_prefix = "zc-claude-"

[codex_cli]
enabled = false
env_passthrough = []
max_output_bytes = 2097152
timeout_secs = 600

[delegate]
agentic_timeout_secs = 300
timeout_secs = 120

[gemini_cli]
enabled = false
env_passthrough = []
max_output_bytes = 2097152
timeout_secs = 600

[google_workspace]
allowed_operations = []
allowed_services = []
audit_log = false
enabled = false
rate_limit_per_minute = 60
timeout_secs = 30

[image_gen]
api_key_env = "FAL_API_KEY"
default_model = "fal-ai/flux/schnell"
enabled = false

[jira]
allowed_actions = ["get_ticket"]
api_token = ""
base_url = ""
email = ""
enabled = false
timeout_secs = 30

[knowledge]
auto_capture = false
cross_workspace_search = false
db_path = "~/.zeroclaw/knowledge.db"
enabled = false
max_nodes = 100000
suggest_on_query = true

[link_enricher]
enabled = false
max_links = 3
timeout_secs = 10

[linkedin]
api_version = "202602"
enabled = false

[linkedin.content]
github_repos = []
github_users = []
instructions = ""
persona = ""
rss_feeds = []
topics = []

[linkedin.image]
card_accent_color = "#0A66C2"
enabled = false
fallback_card = true
providers = ["stability", "imagen", "dalle", "flux"]
temp_dir = "linkedin/images"

[linkedin.image.dalle]
api_key_env = "OPENAI_API_KEY"
model = "dall-e-3"
size = "1024x1024"

[linkedin.image.flux]
api_key_env = "FAL_API_KEY"
model = "fal-ai/flux/schnell"

[linkedin.image.imagen]
api_key_env = "GOOGLE_VERTEX_API_KEY"
project_id_env = "GOOGLE_CLOUD_PROJECT"
region = "us-central1"

[linkedin.image.stability]
api_key_env = "STABILITY_API_KEY"
model = "stable-diffusion-xl-1024-v1-0"

[media_pipeline]
describe_images = true
enabled = false
summarize_video = true
transcribe_audio = true

[opencode_cli]
enabled = false
env_passthrough = []
max_output_bytes = 2097152
timeout_secs = 600

[pacing]
loop_detection_enabled = true
loop_detection_max_repeats = 3
loop_detection_window_size = 20
loop_ignore_tools = []

[pipeline]
allowed_tools = []
enabled = false
max_steps = 20

[plugins]
auto_discover = false
enabled = false
max_plugins = 50
plugins_dir = "~/.zeroclaw/plugins"

[plugins.security]
signature_mode = "disabled"
trusted_publisher_keys = []

[providers]
fallback = "openrouter"

[providers.models]

[providers.models.openrouter]
api_key = ""YOUR_ENCRYPTED_KEY_HERE"
merge_system_into_user = false
model = "anthropic/claude-sonnet-4.5"
requires_openai_auth = false
temperature = 0.7
timeout_secs = 120

[shell_tool]
timeout_secs = 60

[sop]
approval_timeout_secs = 300
default_execution_mode = "supervised"
max_concurrent_total = 4
max_finished_runs = 100

[text_browser]
enabled = false
timeout_secs = 30

[trust]
correction_penalty = 0.05
decay_half_life_days = 30.0
initial_score = 0.8
regression_threshold = 0.5
success_boost = 0.01

[verifiable_intent]
enabled = false
strictness = "strict"
