Source of truth: crates/config/src/lib.rs and merge call sites in crates/cli/src/main.rs / crates/tui/src/app.rs.
Primary files:
- global:
~/.quavil/config.toml - project:
<project>/.quavil/config.toml
Also supported by parser helpers:
- local:
<project>/.quavil/config.local.toml(Config::load_local)
Important caveat:
- current CLI/TUI runtime path merges
global + projectviaConfig::merge. config.local.tomlis parsed by helpers but is not currently merged by default entrypoints.
Config::merge(global, project) is not a naive overwrite. It applies section-specific rules.
- project values override global where explicitly set
- some lists are appended and deduplicated
- some booleans use
ORsemantics - some booleans use
ANDsemantics (more restrictive) - update
release_urlis global-only for security
provider.providers: merged per provider entry (api_key,base_url,model,api_style,max_tokens,temperature)provider.default: project wins only if project default differs from built-in default (openai)mcp.servers: project extends global mapagent.trust.deny_toolsandagent.trust.deny_paths: union + dedupeagent.hooksandagent.commands: concatenated (globalfirst, thenproject)agent.agents.roles: merged map (projectcan add/override role definitions)browser.headless:project.headless && global.headlessmemory.auto_memory:project.auto_memory || global.auto_memoryupdate.enabled:global.enabled && project.enabledindex.enabled:global.enabled && project.enabledindex.auto_context:global.auto_context && project.auto_contextupdate.release_url: taken from global only (project cannot override)
Config contains:
provider: ProviderConfigmodels: ModelsConfigtui: TuiConfigagent: AgentSettingsmcp: McpConfigexternal_notify: ExternalNotifyConfigshell: ShellConfigbrowser: BrowserConfigmemory: MemoryConfigupdate: UpdateConfigindex: IndexConfig
[provider]
default = "openai"
[provider.openai]
model = "gpt-5.3-codex"
[tui]
theme = "dark"
accent = "copper"
show_thinking = true
[agent]
max_steps = 100
auto_compact_threshold = 0.8
subagent_model = "gpt-5.3-codex-xhigh-fast"
[agent.trust]
mode = "limited"
deny_tools = ["git_commit"]
deny_paths = [".env", "secrets/"]
[agent.agents]
max_threads = 4
max_depth = 2
[index]
enabled = true
embedding = "auto"
auto_context = true
auto_context_chunks = 5
exclude = ["target/**", "node_modules/**"]default: default provider id[provider.<id>]entries:api_keybase_urlmodelapi_stylemax_tokenstemperature
Built-in providers are listed in BUILT_IN_PROVIDERS; see docs/providers.md.
max_tokens(default4096)temperature(optional)
markdown(defaulttrue)streaming(defaulttrue)theme(defaultdark)accent(defaultcopper)show_thinking(defaulttrue)output_style:normal|verbose|minimal|structured
bell(defaulttrue)desktop(defaultfalse)min_duration_ms(default5000)
max_stepsmax_tokenscustom_instructionsauto_compact_thresholdcompact_instructionsenforce_todosauto_simplifyauto_commitmodel_profilesubagent_model
mode:off|limited|autoedit|fullallow_tools,allow_pathsdeny_tools,deny_pathsauto_approvealways_askremember_approvals
Trust parser aliases accepted in CLI/config parser:
autoedit,auto_edit,auto-edit
max_retries(default3)initial_backoff_ms(default1000)max_backoff_ms(default30000)
enabledlow_keywordshigh_keywords
See docs/routing.md.
checks: list of{ kind, command }
max_threads(default4)max_depth(default2)roles: map of role definitions
Role definition keys (AgentRoleToml):
descriptionconfig_filesystem_promptmodelmax_stepsread_onlyallowed_toolsdisallowed_tools
enabledpages_projectdomainredact_patterns
enabledapi_key_envmodel
Each [[agent.hooks]] item (HookConfig) supports:
eventcommandhook_type:command|prompt|agentpromptinstructionstoolsmodelpatterntool_nameblocktimeout(default30)
Supported hook events:
session_startuser_prompt_submitpre_tool_usepost_tool_usepost_tool_use_failurepermission_requestnotificationafter_editafter_turnsubagent_startsubagent_endcompact_contextworktree_createworktree_removeconfig_changeteammate_idletask_completed
See docs/hooks.md for runtime behavior and block/feedback semantics.
Two forms are supported:
- stdio:
commandargsenv
- http:
urlheaders
Also see .mcp.json compatibility in docs/mcp.md.
pathenv(map)startup_commands(array)[shell.sandbox]:enabledallow_networkallow_readallow_writeblock_dotfiles(defaulttrue)
enabledexecutable_pathheadless(defaulttrue)
auto_memory(defaulttrue)
enabled(defaulttrue)embedding(auto|voyage|openai|perplexity|tfidf)embedding_modelauto_context(defaulttrue)auto_context_chunks(default5)exclude(glob-like patterns)
enabled(defaulttrue)check_interval_hours(default4)release_url(defaulthttps://get.quavil.com)
webhook_urltelegram_bot_tokentelegram_chat_iddiscord_webhook_urlslack_webhook_url
From crates/cli/src/main.rs:
--trustmutatesconfig.agent.trust.modeat runtimeexec --full_autosetstrust.mode=fullandsandbox_level=workspace-writeexec --sandboxsets runtimeToolContext.sandbox_level
- config dir:
~/.quavil/ - data dir:
~/.quavil/(home-root~/.quavil) - sessions:
<data_dir>/sessions/
See also:
docs/memory.mddocs/sessions.mddocs/self-update.md