Documentation
¶
Overview ¶
Package config — the Configurable interface.
Tools, scanners, skills, and any other extension point that wants to surface settings in the v2.0 Advanced tab implements Configurable. The Settings page enumerates registered things, calls ConfigSchema() on each, renders a card, and pushes user edits back through ApplyConfig().
The interface is OPTIONAL — a tool that doesn't implement it gets rendered as a basic on/off toggle, same as today. Implementing it means a third-party tool can ship with rich settings without touching any of the Settings page code.
Design notes:
- Schema is a tiny JSON-schema-shaped struct, not full JSON Schema. Validation lives in ApplyConfig; the Schema is purely for UI rendering hints.
- ApplyConfig takes map[string]any (the parsed YAML/JSON kv) and returns an error. Returning an error keeps the prior value and surfaces the message in the Settings toast bar.
- We deliberately do NOT use reflection to derive Schema from struct tags. Two reasons: (1) it makes the Schema explicit and greppable; (2) Go reflection over generic interface fields is a wormhole we don't want users falling into.
Package config — v2.0 settings hierarchy loader.
The layered loader merges five sources in precedence order:
layer 0: DefaultUserOverrides (the yolo profile) layer 1: /etc/overkill/user.yaml (system defaults; ops-set) layer 2: ~/.config/overkill/user.yaml (user, the normal case) layer 3: $WORKSPACE/.overkill/user.yaml (per-project tweaks) layer 4: /etc/overkill/enforced.yaml (admin lock — LAST WORD)
Each later layer wins on a per-field basis. The enforced layer applies AFTER the user/workspace layers so an org deployment can guarantee specific settings (e.g. "MCP shield always on") while still letting users tweak the rest.
Implementation: YAML merge happens at the struct level via a per-field overlay. We deliberately avoid reflection — each field merge is explicit so we can document the per-field semantic in one place. Maps/slices REPLACE rather than append; pointers preserve nil-means-unset.
Package config — profile presets for v2.0 Control.
Five named one-click profiles flip a coordinated set of fields:
yolo — vibe coder defaults. Scanners off, auto-approve all,
no confirmations. The bed-coder profile.
default — sane developer defaults. CommandScanner on, write
confirms on destructive ops, no auto-approve.
paranoid — production-repo posture. Every scanner on, MCP
default-deny via mcpshield, cost cap enabled.
enterprise — paranoid + receipt-chain verify on boot, flight
recorder always-on, telemetry forwarded to operator.
remote — bridge / API-originated jobs. CommandScanner on,
no auto-approve, pty_shell denied, shell/patch/git-push
require explicit approval, web fetches restricted to
operator-configured allowlist (empty by default).
Switching profiles rewrites the affected fields in-memory. Users in the Settings → Advanced view can still flip individual switches after a profile is applied; the picker UI shows "modified" so it's clear the active state has drifted from the named profile.
Package config — v2.0 user-overrides layer.
The legacy config (config.go) is TOML and centred on system-level wiring: provider credentials, daemon listen addresses, MCP servers that ship with the binary. The v2.0 user-overrides layer is YAML and centred on what users want to tweak at runtime: model picker, scanner toggles, system-prompt patches, persona, board pipeline.
It lives at `~/.config/overkill/user.yaml`, loads on boot, and is hot-reloaded on save via the hotreload package. Atomic writes so a crash mid-save never strands the file.
Precedence (lowest → highest, last wins on conflict):
- baked defaults (DefaultUserOverrides)
- system overrides /etc/overkill/user.yaml
- user overrides ~/.config/overkill/user.yaml
- workspace overrides $PWD/.overkill/user.yaml
- admin-enforced /etc/overkill/enforced.yaml (LOCKED — can't be overridden by user/workspace)
Admin-enforced sits on top so an org deployment can lock down a subset (e.g. scanners always-on) while users still control the rest (e.g. model picker, persona, vim mode).
Index ¶
- Constants
- Variables
- func ApplyProfile(u *UserOverrides, profile string) error
- func BuiltinThemes() []string
- func ConfigDir() (string, error)
- func ConfigPath() (string, error)
- func Doctor() ([]string, error)
- func FormatOption(opt WizardOption) string
- func MaskKey(s string) string
- func ProviderModels(entries []ModelConfig) []providers.Model
- func ProviderToCatalogID(key string) (string, bool)
- func SaveUserOverrides(path string, u *UserOverrides) error
- func ThemesDir() (string, error)
- func UserOverridesPath() (string, error)
- func ValidateField(f Field, raw any) error
- type ACPConfig
- type ACPPeerConfig
- type AdvancedSettings
- type AgentConfig
- type AutoMemoryConfig
- type BasicSettings
- type BoardOvenAction
- type BoardPipelineStep
- type BoardUserConfig
- type BridgeConfig
- type BrowserConfig
- type Category
- type CompactionConfig
- type CompactionUserConfig
- type Config
- func (c *Config) MaskSecrets() *Config
- func (c *Config) Migrate() (*Config, []string, error)
- func (c *Config) PersistencePath() (string, error)
- func (c *Config) RedactionSecrets() []string
- func (c *Config) ResolveSecrets() error
- func (c *Config) ResolveSecretsWithStore(store credentials.Store) error
- func (c *Config) Save(path string) error
- func (c *Config) SaveWithCredentials(path string, store credentials.Store) error
- func (c *Config) Validate() []error
- func (c *Config) Warnings() []Warning
- type Configurable
- type CostConfig
- type CronConfig
- type DiscordConfig
- type Field
- type FieldKind
- type GatewayConfig
- type HookEntry
- type HooksUserConfig
- type ImageGenConfig
- type LSPConfig
- type LSPServer
- type LayerSources
- type LocalDatabaseConfig
- type MCPConfig
- type MCPServer
- type MCPServerUserConfig
- type MatrixConfig
- type MattermostConfig
- type MemoryUserConfig
- type ModelConfig
- type OuroborosConfig
- type PermissionsUserConfig
- type PersonaUserConfig
- type PersonalityConfig
- type PluginsConfig
- type PromptOverride
- type ProviderConfig
- type ProviderSetup
- type ProviderUserConfig
- type QuickSetup
- type Rating
- type RedTeamConfig
- type RewriterConfig
- type ScannerOnOff
- type ScannerToggles
- type Schema
- type SecurityConfig
- type SessionConfig
- type SetupStep
- type SetupWizard
- func (sw *SetupWizard) AllProviders() map[string]ProviderSetup
- func (sw *SetupWizard) ApplyStep(stepID string, value string)
- func (sw *SetupWizard) AvailableProviders() []ProviderSetup
- func (sw *SetupWizard) AvailableProvidersByName() map[string]ProviderSetup
- func (sw *SetupWizard) ProviderSteps(providerName string) []SetupStep
- func (sw *SetupWizard) Steps() []SetupStep
- func (sw *SetupWizard) ValidateStep(stepID string, value string) error
- type ShareConfig
- type SignalConfig
- type SkillsConfig
- type SkillsUserConfig
- type SlackConfig
- type SyncConfig
- type SyncFileConfig
- type SyncGitConfig
- type SyncS3Config
- type TTSConfig
- type TelegramConfig
- type TelemetryUserConfig
- type ThinkingConfig
- type ThinkingLevel
- type ToolUserConfig
- type UIConfig
- type UserOverrides
- type VisionConfig
- type Warning
- type WhatsAppCloudConfig
- type WhatsAppConfig
- type WhatsAppWhatsmeowConfig
- type WizardCatalog
- type WizardOption
Constants ¶
const ( DefaultWebUIAddr = "127.0.0.1:8420" DefaultSSEDashboardAddr = "127.0.0.1:7802" DefaultSOPWebhookAddr = "127.0.0.1:7801" DefaultWhatsAppCloudAddr = "127.0.0.1:7798" DefaultACPAddr = "127.0.0.1:7777" )
Network defaults — well-known ports for Overkill's sub-services. Each service uses a dedicated loopback port so they can coexist without port conflicts.
const CurrentVersion = 1
const SandboxAvailable = false
SandboxAvailable describes enforced process/filesystem isolation across tools. Workspace path checks and command deny patterns do not provide that boundary.
const UserOverridesSchemaVersion = 1
UserOverridesSchemaVersion bumps on breaking renames. The loader runs forward migrations transparently; the file is rewritten with the new version on save.
Variables ¶
var AvailableProfiles = []string{"yolo", "default", "paranoid", "enterprise", "remote"}
AvailableProfiles is the canonical ordered list — order matches the Settings UI presentation (least-restrictive first).
var ErrSandboxUnsupported = errors.New("config: security.sandbox_enabled=true is unsupported: no execution sandbox is enforced; set security.sandbox_enabled=false")
Functions ¶
func ApplyProfile ¶
func ApplyProfile(u *UserOverrides, profile string) error
ApplyProfile mutates u to match the named profile. Returns an error on an unknown profile name; an empty profile is treated as "yolo" (the documented default).
func BuiltinThemes ¶
func BuiltinThemes() []string
BuiltinThemes is the stable config.theme protocol inventory. Terminal palette colours are supplied by its renderer; this list admits every shipped palette.
func ConfigPath ¶
func FormatOption ¶
func FormatOption(opt WizardOption) string
FormatOption renders a WizardOption for terminal/TUI display.
func MaskKey ¶
MaskKey returns s with the middle redacted, preserving any known key prefix plus the last 4 characters. For a typical OpenAI key "sk-8c9c6b39a2e7406ca5bf06ac" this yields "sk-8c...06ac".
func ProviderModels ¶
func ProviderModels(entries []ModelConfig) []providers.Model
ProviderModels translates explicit model configuration without ever using legacy max_tokens (context capacity) as an output limit.
func ProviderToCatalogID ¶
ProviderToCatalogID returns the models.dev catalog ID for a setup wizard provider key, or ("", false) if no mapping exists.
func SaveUserOverrides ¶
func SaveUserOverrides(path string, u *UserOverrides) error
SaveUserOverrides writes the file atomically. Bumps SchemaVersion to the current one so a fresh write always reflects the binary's expected shape.
func ThemesDir ¶
ThemesDir returns the path to the user's custom theme directory (~/.overkill/themes), creating it if it doesn't exist.
func UserOverridesPath ¶
UserOverridesPath returns the canonical XDG path. Honours $XDG_CONFIG_HOME; falls back to ~/.config/overkill/user.yaml.
func ValidateField ¶
ValidateField returns nil when the raw value passes Kind / range / required checks. Used by ApplyConfig implementations and (for dry-run previews) by the Settings page before the user clicks save.
Types ¶
type ACPConfig ¶
type ACPConfig struct {
Peers []ACPPeerConfig `toml:"peers"`
Listen string `toml:"listen"`
Token string `toml:"token"`
AllowedOrigins []string `toml:"allowed_origins"`
Enabled bool `toml:"enabled"`
}
type ACPPeerConfig ¶
type ACPPeerConfig struct {
Name string `toml:"name"`
URL string `toml:"url"`
TokenFile string `toml:"token_file"`
}
ACPConfig governs the Agent Communication Protocol server.
type AdvancedSettings ¶
type AdvancedSettings struct {
SystemPrompt PromptOverride `yaml:"system_prompt,omitempty"`
Tools map[string]ToolUserConfig `yaml:"tools,omitempty"`
Scanners ScannerToggles `yaml:"scanners,omitempty"`
Compaction CompactionUserConfig `yaml:"compaction,omitempty"`
MCPServers []MCPServerUserConfig `yaml:"mcp_servers,omitempty"`
Skills SkillsUserConfig `yaml:"skills,omitempty"`
Hooks HooksUserConfig `yaml:"hooks,omitempty"`
Memory MemoryUserConfig `yaml:"memory,omitempty"`
Providers map[string]ProviderUserConfig `yaml:"providers,omitempty"`
Persona PersonaUserConfig `yaml:"persona,omitempty"`
Telemetry TelemetryUserConfig `yaml:"telemetry,omitempty"`
Permissions PermissionsUserConfig `yaml:"permissions,omitempty"`
Board BoardUserConfig `yaml:"board,omitempty"`
}
AdvancedSettings — everything else. Nil sub-sections mean "use default."
type AgentConfig ¶
type AgentConfig struct {
Instructions instructions.Config `toml:"instructions"`
Name string `toml:"name"`
DefaultProvider string `toml:"default_provider"`
DefaultModel string `toml:"default_model"`
MaxTurns int `toml:"max_turns"`
MaxOutputTokens int `toml:"max_output_tokens"`
SpecDriven bool `toml:"spec_driven"`
SystemPromptOverrides map[string]string `toml:"system_prompt_overrides"`
// SystemPrompt is a user-editable base system prompt. When non-empty,
// it's prepended to the personality-generated prompt. Changing it
// mid-session triggers context compaction + a fresh conversation.
SystemPrompt string `toml:"system_prompt"`
}
type AutoMemoryConfig ¶
type AutoMemoryConfig struct {
Enabled bool `toml:"enabled"`
MinNewMessages int `toml:"min_new_messages"`
}
AutoMemoryConfig enables provider-backed extraction only by explicit opt-in.
type BasicSettings ¶
type BasicSettings struct {
Model string `yaml:"model,omitempty"`
ContextBudget float64 `yaml:"context_budget,omitempty"` // 0.0-1.0 fraction of the model's window
Tools map[string]bool `yaml:"tools,omitempty"` // name → enabled
Theme string `yaml:"theme,omitempty"`
VimMode *bool `yaml:"vim_mode,omitempty"`
CostCapMonthly float64 `yaml:"cost_cap_monthly,omitempty"` // USD; 0 = no cap (just track)
AutoCompactPercent float64 `yaml:"auto_compact_percent,omitempty"`
ConfirmWrites *bool `yaml:"confirm_writes,omitempty"`
}
BasicSettings — the 8 controls a daily user touches. Fits one screen.
type BoardOvenAction ¶
type BoardPipelineStep ¶
type BoardUserConfig ¶
type BoardUserConfig struct {
Enabled *bool `yaml:"enabled,omitempty"`
AutoDispatch *bool `yaml:"auto_dispatch,omitempty"`
MaxConcurrent int `yaml:"max_concurrent,omitempty"`
DefaultEffort string `yaml:"default_effort,omitempty"`
DefaultPriority string `yaml:"default_priority,omitempty"`
ReviewPipeline []BoardPipelineStep `yaml:"review_pipeline,omitempty"`
OvenActions []BoardOvenAction `yaml:"oven_actions,omitempty"`
}
type BridgeConfig ¶
type BridgeConfig struct {
Workspace string `toml:"workspace"` // canonical server-side workspace; defaults to startup cwd
Enabled bool `toml:"enabled"`
Listen string `toml:"listen"` // default 127.0.0.1:7799
Token string `toml:"token"` // shared secret; empty disables auth
}
BridgeConfig governs the HTTP webhook bridge for sidecar gateways (Baileys WhatsApp, discord.js, SMS relays, iMessage bridges). Listens on loopback by default; expose only behind a reverse proxy if you need remote access.
type BrowserConfig ¶
type BrowserConfig struct {
Enabled bool `toml:"enabled"`
Headless bool `toml:"headless"`
ChromePath string `toml:"chrome_path"`
UserAgent string `toml:"user_agent"`
AllowedHosts []string `toml:"allowed_hosts"`
BlockedHosts []string `toml:"blocked_hosts"`
Timeout time.Duration `toml:"timeout"`
}
BrowserConfig governs the agentic browser. Off by default — tools are not registered when Enabled is false.
type Category ¶
type Category string
Category groups setup options (provider, gateway, tts, database).
type CompactionConfig ¶
type CompactionConfig struct {
// Strategy is auto (durable Seahorse with PostgreSQL, otherwise LCM),
// seahorse, lcm or legacy. UseLCM=false retains the legacy kill switch.
Strategy string `toml:"strategy,omitempty"`
SoftTriggerPercent int `toml:"soft_trigger_percent"`
HardTriggerPercent int `toml:"hard_trigger_percent"`
PreserveMessages int `toml:"preserve_messages"`
MaxSummaryTokens int `toml:"max_summary_tokens"`
// Model overrides the model used for the summarisation LLM call.
// Empty falls back to the same provider's cheapest listed model at runtime.
Model string `toml:"model,omitempty"`
// UseLCM enables the selected compactor strategy. When false, manual
// compaction retains the legacy single-call path and automatic strategy
// compaction is disabled. Defaults to true for compatibility.
UseLCM bool `toml:"use_lcm"`
// PromptCompress, when true, runs the assembled system prompt through
// the LLMLingua-style compressor on high-utilization turns (≥0.7).
// Off by default — adds a per-turn LLM round-trip when triggered.
PromptCompress bool `toml:"prompt_compress"`
}
func (CompactionConfig) ResolveStrategy ¶
func (c CompactionConfig) ResolveStrategy(durable bool) (string, error)
ResolveStrategy preserves use_lcm=false as the legacy kill switch. Auto uses durable DAG memory when a PostgreSQL pool exists, otherwise existing LCM. An explicit durable selection must never silently downgrade.
type CompactionUserConfig ¶
type CompactionUserConfig struct {
Enabled *bool `yaml:"enabled,omitempty"`
Model string `yaml:"model,omitempty"`
SoftThreshold float64 `yaml:"soft_threshold,omitempty"`
HardThreshold float64 `yaml:"hard_threshold,omitempty"`
PreserveLast int `yaml:"preserve_last,omitempty"`
Strategy string `yaml:"strategy,omitempty"` // lcm | summarize-and-truncate | aggressive
}
type Config ¶
type Config struct {
AutoMemory AutoMemoryConfig `toml:"auto_memory"`
Version int `toml:"version"`
Agent AgentConfig `toml:"agent"`
Thinking ThinkingConfig `toml:"thinking"`
Providers []ProviderConfig `toml:"providers"`
TTS TTSConfig `toml:"tts"`
Personality PersonalityConfig `toml:"personality"`
Security SecurityConfig `toml:"security"`
Session SessionConfig `toml:"session"`
Cost CostConfig `toml:"cost"`
Compaction CompactionConfig `toml:"compaction"`
MCP MCPConfig `toml:"mcp"`
LSP LSPConfig `toml:"lsp"`
Skills SkillsConfig `toml:"skills"`
UI UIConfig `toml:"ui"`
Sync SyncConfig `toml:"sync"`
ACP ACPConfig `toml:"acp"`
Plugins PluginsConfig `toml:"plugins"`
Slack SlackConfig `toml:"slack"`
Gateways GatewayConfig `toml:"gateways"`
Cron CronConfig `toml:"cron"`
Vision VisionConfig `toml:"vision"`
Browser BrowserConfig `toml:"browser"`
Rewriter RewriterConfig `toml:"rewriter"`
Ouroboros OuroborosConfig `toml:"ouroboros"`
RedTeam RedTeamConfig `toml:"red_team"`
ImageGen ImageGenConfig `toml:"image_gen"`
// DatabaseURL is the PostgreSQL connection string for persistent stores
// (learning corrections, etc.). Falls back to DATABASE_URL env var.
// Example: "postgres://user:***@localhost:5432/overkill?sslmode=disable"
DatabaseURL string `toml:"database_url"`
LocalDatabase LocalDatabaseConfig `toml:"local_database"`
// contains filtered or unexported fields
}
func (*Config) MaskSecrets ¶
func (*Config) PersistencePath ¶
PersistencePath returns the selected loaded profile, or the default for a new config.
func (*Config) RedactionSecrets ¶
RedactionSecrets is for trusted local recorders. It must never be exposed by an API or logged: it contains resolved credentials, not masked settings.
func (*Config) ResolveSecrets ¶
func (*Config) ResolveSecretsWithStore ¶
func (c *Config) ResolveSecretsWithStore(store credentials.Store) error
ResolveSecretsWithStore publishes only after all fields resolve. Binding snapshots preserve reference templates through future unrelated Save calls.
func (*Config) SaveWithCredentials ¶
func (c *Config) SaveWithCredentials(path string, store credentials.Store) error
SaveWithCredentials stages new immutable vault entries before atomically publishing reference-only TOML. Failure never falls back to plaintext. Old entries are deliberately retained for backups and concurrently loaded profiles.
type Configurable ¶
type Configurable interface {
// ConfigSchema returns the descriptor the Settings UI renders.
// Returning nil opts the implementer out of the rich-card flow
// (the basic on/off toggle still works).
ConfigSchema() *Schema
// ApplyConfig is called when the user saves the settings card.
// Implementations validate + apply atomically. Returning an
// error keeps the prior in-memory state and surfaces the
// message to the user.
ApplyConfig(raw map[string]any) error
}
Configurable is implemented by anything that wants a per-instance settings card in the Advanced tab.
type CostConfig ¶
type CostConfig struct {
DailyLimitUSD float64 `toml:"daily_limit_usd"`
PerTaskLimitUSD float64 `toml:"per_task_limit_usd"`
// RollingWindowHrs is the look-back window for RollingLimitUSD.
// Default 5 hours per master plan §4.5. Ignored when
// RollingLimitUSD is 0.
RollingWindowHrs int `toml:"rolling_window_hrs"`
// RollingLimitUSD caps total spend over the last RollingWindowHrs.
// 0 disables the rolling cap entirely. Exceeding the limit sets
// BudgetStatus.ShouldAbort; crossing WarnAtPercent of it sets
// ShouldWarn. Caps daily-spike protection independently of the
// daily limit (different bucket: 5h vs 24h).
RollingLimitUSD float64 `toml:"rolling_limit_usd"`
WarnAtPercent int `toml:"warn_at_percent"`
}
type CronConfig ¶
type CronConfig struct {
// IdleWindowSec is how long (in seconds) the agent must be idle before
// buffered cron outputs are flushed through the gateway.
// Default 300 (5 minutes).
IdleWindowSec int `toml:"idle_window_sec"`
}
CronConfig governs the cron scheduler's behaviour. Cron jobs produce output asynchronously; we hold that output until the agent is idle.
type DiscordConfig ¶
type DiscordConfig struct {
Enabled bool `toml:"enabled"`
BotToken string `toml:"bot_token"`
AllowedGuilds []string `toml:"allowed_guilds"` // empty = any
AllowedChannels []string `toml:"allowed_channels"` // empty = any
// RequireMention, when true, makes the bot ignore guild messages
// that don't @mention it. DMs always work regardless. Default true
// (set explicitly in config if you want the bot to react to every
// channel message — usually a bad idea).
RequireMention bool `toml:"require_mention"`
// NotifyChannelID is the channel the gateway pushes unsolicited
// notifications to (§7.1 Layer 6). Empty = no Discord push
// delivery.
NotifyChannelID string `toml:"notify_channel_id"`
// CutoffSec is the sliding window for Discord edit rate limiting
// in seconds. Default 5.
CutoffSec int `toml:"cutoff_sec"`
// CleanupSec is the interval in seconds for cleaning up stale
// edit rate limit entries. Default 600 (10 minutes).
CleanupSec int `toml:"cleanup_sec"`
}
DiscordConfig governs the optional Discord bot gateway. Off by default; token may also come from DISCORD_BOT_TOKEN at runtime.
The bot responds in DMs unconditionally and in guild channels only when @mentioned. AllowedGuilds/AllowedChannels restrict where the bot replies — empty lists mean "any guild/channel the bot can see".
type Field ¶
type Field struct {
Key string `json:"key"`
Label string `json:"label"`
Kind FieldKind `json:"kind"`
Description string `json:"description,omitempty"`
Default any `json:"default,omitempty"`
Options []string `json:"options,omitempty"` // for Kind=enum
// Min / Max apply to int / float fields. Zero means "no bound."
Min float64 `json:"min,omitempty"`
Max float64 `json:"max,omitempty"`
// Required: an empty value on save returns a validation error.
Required bool `json:"required,omitempty"`
}
Field is one row in a settings card.
type FieldKind ¶
type FieldKind string
FieldKind is the renderer hint for the Settings UI.
const ( FieldString FieldKind = "string" FieldInt FieldKind = "int" FieldFloat FieldKind = "float" FieldBool FieldKind = "bool" FieldEnum FieldKind = "enum" // values come from Field.Options FieldList FieldKind = "list" // string[]; one entry per line in the UI FieldSecret FieldKind = "secret" // string, masked in the UI FieldText FieldKind = "text" // multi-line string (system_prompt etc.) )
type GatewayConfig ¶
type GatewayConfig struct {
Telegram TelegramConfig `toml:"telegram"`
Discord DiscordConfig `toml:"discord"`
Slack SlackConfig `toml:"slack"`
WhatsApp WhatsAppConfig `toml:"whatsapp"`
Bridge BridgeConfig `toml:"bridge"`
Signal SignalConfig `toml:"signal"`
Matrix MatrixConfig `toml:"matrix"`
Mattermost MattermostConfig `toml:"mattermost"`
// MaxTextLen caps the text per inbound message to prevent OOM from
// huge pastes. Default 100000.
MaxTextLen int `toml:"max_text_len"`
// MaxImageBytes caps total image bytes per message. Default 20000000.
MaxImageBytes int `toml:"max_image_bytes"`
// RateLimitPerMin is the rate limit per sender per minute. Default 10.
RateLimitPerMin int `toml:"rate_limit_per_min"`
// UpdateEveryMs is the batch reply edit interval in milliseconds. Default 750ms.
UpdateEveryMs int `toml:"update_every_ms"`
// BackoffInitialSec is the initial backoff in seconds for gateway hub
// restarts. Default 1.
BackoffInitialSec int `toml:"backoff_initial_sec"`
// BackoffMaxSec is the maximum backoff cap in seconds for gateway hub
// restarts. Default 30.
BackoffMaxSec int `toml:"backoff_max_sec"`
}
GatewayConfig wires all remote messaging gateways. Each sub-section is independently togglable so users can run telegram alone, discord alone, whatsapp alone, the bridge alone, or any combination.
type HooksUserConfig ¶
type ImageGenConfig ¶
type ImageGenConfig struct {
Provider string `toml:"provider"` // "openai" | "stability" | "replicate"
OpenAIKey string `toml:"openai_key"` // falls back to OPENAI_API_KEY
StabilityKey string `toml:"stability_key"` // falls back to STABILITY_API_KEY
ReplicateToken string `toml:"replicate_token"` // falls back to REPLICATE_API_TOKEN
}
ImageGenConfig governs text-to-image generation (image_gen tool). Provider can be "openai" (DALL-E 3), "stability" (Stability AI), or "replicate" (Flux Schnell). API keys fall back to env vars: OPENAI_API_KEY, STABILITY_API_KEY, REPLICATE_API_TOKEN.
type LayerSources ¶
type LayerSources struct {
SystemFile string
UserFile string
WorkspaceFile string
EnforcedFile string
}
LayerSources is the set of files the hierarchy loader reads. Empty paths are skipped. Use DiscoverLayerSources to populate from environment + conventional paths.
func DiscoverLayerSources ¶
func DiscoverLayerSources(cwd string) (LayerSources, error)
DiscoverLayerSources resolves the conventional paths. The workspace file is rooted at cwd; pass empty cwd to skip the workspace layer.
type LocalDatabaseConfig ¶
type LocalDatabaseConfig struct {
Enabled bool `toml:"enabled"`
BinDir string `toml:"bin_dir"`
DataDir string `toml:"data_dir"`
}
LocalDatabaseConfig explicitly opts ordinary commands into a private, persistent PostgreSQL cluster. An external DATABASE_URL/database_url always takes priority. BinDir must point to already-installed postgres, initdb, and pg_ctl binaries.
type MCPConfig ¶
type MCPConfig struct {
Servers []MCPServer `toml:"servers"`
}
func (MCPConfig) ValidateLimits ¶
type MCPServer ¶
type MCPServer struct {
Name string `toml:"name"`
Command string `toml:"command"`
Args []string `toml:"args"`
Env map[string]string `toml:"env"`
Enabled *bool `toml:"enabled,omitempty"` // nil preserves legacy default-on; explicit false disables launch.
// mcpshield capability — empty/zero means "trusted, no caps"
// (legacy default). Explicit tool lists apply even with trusted=true.
// Paths require an explicit local workspace and per-tool argument bindings.
// Users locking down a server set one or more
// of these to opt into the policy gate.
PathWorkspace string `toml:"path_workspace,omitempty"` // Local child cwd/base for declared path arguments.
PathArgumentBindings map[string][]string `toml:"path_argument_bindings,omitempty"` // Tool -> RFC6901 pointers; empty list explicitly means no path inputs.
AllowedTools []string `toml:"allowed_tools,omitempty"`
AllowedPathPrefixes []string `toml:"allowed_path_prefixes,omitempty"`
MaxBytesPerCall int `toml:"max_bytes_per_call,omitempty"`
Trusted *bool `toml:"trusted,omitempty"` // nil = default trusted
}
type MCPServerUserConfig ¶
type MCPServerUserConfig struct {
Name string `yaml:"name"`
Enabled *bool `yaml:"enabled,omitempty"`
AllowedTools []string `yaml:"allowed_tools,omitempty"`
AllowedPathPrefixes []string `yaml:"allowed_path_prefixes,omitempty"`
MaxBytesPerCall int `yaml:"max_bytes_per_call,omitempty"`
Trusted *bool `yaml:"trusted,omitempty"`
}
type MatrixConfig ¶
type MatrixConfig struct {
Enabled bool `toml:"enabled"`
HomeserverURL string `toml:"homeserver_url"` // default https://matrix.org
UserID string `toml:"user_id"` // @user:homeserver
AccessToken string `toml:"access_token"` // env: MATRIX_ACCESS_TOKEN
Password string `toml:"password"` // for auto-login if no token
// NotifyRoomID is the Matrix room ID (e.g. "!abc123:homeserver")
// the gateway pushes unsolicited notifications to (§7.1 Layer 6).
// Empty = no Matrix push delivery.
NotifyRoomID string `toml:"notify_room_id"`
// SeenTTLSec caps how long (in seconds) a seen event ID is
// remembered for deduplication. Default 600 (10 minutes).
SeenTTLSec int `toml:"seen_ttl_sec"`
// MemberCountTTLSec expires cached member counts so routing decisions
// don't stay permanently stale after membership changes.
// Default 300 (5 minutes).
MemberCountTTLSec int `toml:"member_count_ttl_sec"`
}
MatrixConfig governs the optional Matrix (Element, etc.) gateway via raw HTTP against the Matrix Client-Server API. Off by default. If AccessToken is empty but Password is set, the bot auto-logs in with m.login.password to obtain a token at startup.
type MattermostConfig ¶
type MattermostConfig struct {
Enabled bool `toml:"enabled"`
ServerURL string `toml:"server_url"` // e.g. https://mattermost.example.com
BotToken string `toml:"bot_token"` // env: MATTERMOST_BOT_TOKEN
TeamName string `toml:"team_name"` // team the bot joins
// NotifyChannelID is the Mattermost channel ID the gateway pushes
// unsolicited notifications to (§7.1 Layer 6). Empty = no Mattermost push delivery.
NotifyChannelID string `toml:"notify_channel_id"`
}
MattermostConfig governs the optional Mattermost bot gateway. Uses the Mattermost WebSocket API for real-time events and the REST API for posting messages. Off by default.
type MemoryUserConfig ¶
type ModelConfig ¶
type ModelConfig struct {
ID string `toml:"id"`
Name string `toml:"name"`
MaxTokens int `toml:"max_tokens"` // Legacy context capacity; never an output limit.
ContextWindow int `toml:"context_window"` // Takes precedence over max_tokens.
MaxOutputTokens int `toml:"max_output_tokens"` // Independent completion ceiling; zero uses provider defaults.
CostIn float64 `toml:"cost_in"`
CostOut float64 `toml:"cost_out"`
CostCacheIn float64 `toml:"cost_cache_in"`
CostCacheOut float64 `toml:"cost_cache_out"`
}
type OuroborosConfig ¶
type OuroborosConfig struct {
Enabled bool `toml:"enabled"`
Provider string `toml:"provider"` // e.g. "openai", "anthropic"
Model string `toml:"model"` // model id on the review provider
APIKey string `toml:"api_key"` // falls back to <PROVIDER>_API_KEY
BaseURL string `toml:"base_url"` // optional override
StrictMode bool `toml:"strict_mode"` // when true, warnings also block
// SystemPrompt overrides the default adversarial reviewer prompt.
// When empty, the built-in prompt is used.
SystemPrompt string `toml:"system_prompt"`
}
OuroborosConfig governs the Ouroboros adversarial-review wall (master plan §6.5 Wall 1). The wall MUST run against a different provider/model than the main agent — otherwise it's just the agent grading its own homework. Off by default.
type PermissionsUserConfig ¶
type PermissionsUserConfig struct {
AutoApproveAll *bool `yaml:"auto_approve_all,omitempty"`
SkipDestructiveConfirm *bool `yaml:"skip_destructive_confirm,omitempty"`
// RequireApprovalTools lists tool names that must always prompt for
// operator approval even when AutoApproveAll is false. Used by the
// "remote" profile to gate shell, patch, and git-push variants.
RequireApprovalTools []string `yaml:"require_approval_tools,omitempty"`
// DeniedTools lists tool names that are unconditionally blocked.
DeniedTools []string `yaml:"denied_tools,omitempty"`
// AllowedWebDomains restricts web-fetch calls to this domain list.
// An empty slice means no restriction (fetch anything). The "remote"
// profile leaves this empty by default; operators fill it in.
AllowedWebDomains []string `yaml:"allowed_web_domains,omitempty"`
}
type PersonaUserConfig ¶
type PersonalityConfig ¶
type PluginsConfig ¶
PluginsConfig governs the subprocess plugin runtime. Disabled is a list of plugin names to skip during discovery (used by /plugins toggle).
type PromptOverride ¶
type PromptOverride struct {
Mode string `yaml:"mode,omitempty"` // "default" | "patch" | "replace"
Patch string `yaml:"patch,omitempty"` // unified diff over the baseline
Replace string `yaml:"replace,omitempty"` // full override (Go text/template)
Variables map[string]string `yaml:"variables,omitempty"` // template vars exposed to Replace
}
PromptOverride lets the user patch or replace the baked system prompt. Mode picks which strategy applies; the other fields are ignored on a mode mismatch.
type ProviderConfig ¶
type ProviderConfig struct {
Name string `json:"name,omitempty" toml:"name"`
Type string `json:"type,omitempty" toml:"type"`
APIKey string `json:"apiKey,omitempty" toml:"api_key"`
AuthType string `json:"authType,omitempty" toml:"auth_type"`
BaseURL string `json:"baseUrl,omitempty" toml:"base_url"`
Models []ModelConfig `json:"models,omitempty" toml:"models"`
Headers map[string]string `json:"headers,omitempty" toml:"headers"`
}
func (ProviderConfig) ProviderModels ¶
func (p ProviderConfig) ProviderModels() []providers.Model
ProviderModels returns the explicitly configured model metadata.
type ProviderSetup ¶
type ProviderUserConfig ¶
type ProviderUserConfig struct {
APIKeyRef string `yaml:"api_key,omitempty"` // "${secret:openai_key}" or literal
BaseURL string `yaml:"base_url,omitempty"`
Models map[string]any `yaml:"models,omitempty"`
}
ProviderUserConfig — credentials reference. Actual secrets live in the sibling secrets.yaml so a casual `cat user.yaml` paste doesn't leak keys. ${secret:openai_key} indirection.
type QuickSetup ¶
type QuickSetup struct {
Provider string `json:"provider"`
Model string `json:"model"`
Gateway string `json:"gateway"`
TTS string `json:"tts"`
Database string `json:"database"`
ReviewProvider string `json:"review_provider"`
ReviewModel string `json:"review_model"`
}
QuickSetup bundles the recommended defaults for a one-click setup.
type RedTeamConfig ¶
type RedTeamConfig struct {
Enabled bool `toml:"enabled"`
Provider string `toml:"provider"` // e.g. "deepseek", "openai"
Model string `toml:"model"` // model id on the test-gen provider
APIKey string `toml:"api_key"` // falls back to <PROVIDER>_API_KEY
BaseURL string `toml:"base_url"` // optional override
MaxTests int `toml:"max_tests"` // max tests per changed file (default 5)
// SystemPrompt overrides the default adversarial test generator prompt.
// When empty, the built-in prompt is used.
SystemPrompt string `toml:"system_prompt"`
}
RedTeamConfig governs the red-team adversarial test generator (master plan §6.5, Wall 1 extension). Unlike Ouroboros (which reviews code for bugs), RedTeam writes and runs actual adversarial tests. The generator MUST use a separate provider/model from the build agent — otherwise it's the agent trying to break its own code. Off by default.
type RewriterConfig ¶
type RewriterConfig struct {
Enabled bool `toml:"enabled"`
StripSycophancy bool `toml:"strip_sycophancy"`
AntiPatternGuard bool `toml:"anti_pattern_guard"`
LLMRewrite bool `toml:"llm_rewrite"`
Model string `toml:"model"`
}
RewriterConfig governs the prompt rewriter middleware (master plan §4.10). Disabled by default. When Enabled is true the agent pipes each user message through the rewriter before constructing the provider request.
type ScannerOnOff ¶
type ScannerOnOff struct {
Enabled *bool `yaml:"enabled"`
}
type ScannerToggles ¶
type ScannerToggles struct {
Command ScannerOnOff `yaml:"command,omitempty"`
Injection ScannerOnOff `yaml:"injection,omitempty"`
PromptInjectBrowser ScannerOnOff `yaml:"prompt_inject_browser,omitempty"`
}
ScannerToggles controls each scanner family. Defaults are dictated by the active profile (see ApplyProfile).
type Schema ¶
type Schema struct {
Name string `json:"name"`
Description string `json:"description,omitempty"`
Fields []Field `json:"fields"`
// Category groups multiple Configurables in the Advanced tab
// (e.g. "scanners", "tools", "memory"). Empty falls back to
// "tools".
Category string `json:"category,omitempty"`
}
Schema describes a settings card. The shape mirrors a stripped JSON Schema: a name, a description, and a flat list of fields. Nested objects aren't supported — flatten with dotted names if you need hierarchy.
type SecurityConfig ¶
type SecurityConfig struct {
AutonomyLevel string `toml:"autonomy_level"`
DenyPatterns []string `toml:"deny_patterns"`
ForbiddenPaths []string `toml:"forbidden_paths"`
MaxCommandLen int `toml:"max_command_len"`
// SandboxEnabled is retained for config compatibility; true is unsupported.
SandboxEnabled bool `toml:"sandbox_enabled"`
}
func (SecurityConfig) ValidateSupported ¶
func (s SecurityConfig) ValidateSupported() error
ValidateSupported rejects requested security guarantees the runtime cannot enforce. It never clears an explicit request or treats deny rules as isolation.
type SessionConfig ¶
type SetupWizard ¶
type SetupWizard struct {
// contains filtered or unexported fields
}
func NewSetupWizard ¶
func NewSetupWizard(cfg *Config) *SetupWizard
func (*SetupWizard) AllProviders ¶
func (sw *SetupWizard) AllProviders() map[string]ProviderSetup
AllProviders returns the full provider map (canonical key → ProviderSetup).
func (*SetupWizard) ApplyStep ¶
func (sw *SetupWizard) ApplyStep(stepID string, value string)
func (*SetupWizard) AvailableProviders ¶
func (sw *SetupWizard) AvailableProviders() []ProviderSetup
func (*SetupWizard) AvailableProvidersByName ¶
func (sw *SetupWizard) AvailableProvidersByName() map[string]ProviderSetup
func (*SetupWizard) ProviderSteps ¶
func (sw *SetupWizard) ProviderSteps(providerName string) []SetupStep
func (*SetupWizard) Steps ¶
func (sw *SetupWizard) Steps() []SetupStep
func (*SetupWizard) ValidateStep ¶
func (sw *SetupWizard) ValidateStep(stepID string, value string) error
type ShareConfig ¶
type ShareConfig struct {
}
ShareConfig governs the /share command and `overkill share` CLI.
type SignalConfig ¶
type SignalConfig struct {
Enabled bool `toml:"enabled"`
RestAPIURL string `toml:"rest_api_url"` // default http://localhost:8080
Account string `toml:"account"` // E.164 phone number
AuthToken string `toml:"auth_token"` // Bearer token for signal-cli auth
// NotifyNumber is the E.164 phone number the gateway pushes
// unsolicited notifications to (§7.1 Layer 6). Empty = no Signal push delivery.
NotifyNumber string `toml:"notify_number"`
// SeenTTLSec caps how long (in seconds) a seen message hash is
// remembered for deduplication. Default 600 (10 minutes).
SeenTTLSec int `toml:"seen_ttl_sec"`
}
SignalConfig governs the optional Signal gateway via signal-cli REST API. Off by default; requires signal-cli daemon running with --rest-api.
type SkillsConfig ¶
type SkillsConfig struct {
Enabled []string `toml:"enabled"`
}
type SkillsUserConfig ¶
type SlackConfig ¶
type SlackConfig struct {
Enabled bool `toml:"enabled"`
AppToken string `toml:"app_token"` // xapp-... (Socket Mode)
BotToken string `toml:"bot_token"` // xoxb-... (Web API)
AllowedUsers []string `toml:"allowed_users"` // empty = all users allowed
AllowedChannels []string `toml:"allowed_channels"` // empty = all where invited
// NotifyChannelID is the channel the gateway pushes unsolicited
// notifications to (§7.1 Layer 6). Empty = no Slack push delivery.
NotifyChannelID string `toml:"notify_channel_id"`
}
SlackConfig governs the optional Slack bot gateway. Off by default; tokens may also come from SLACK_BOT_TOKEN / SLACK_APP_TOKEN at runtime. Supports Socket Mode (preferred — no public webhook URL needed) with fallback to Events API if Socket Mode is unavailable.
type SyncConfig ¶
type SyncConfig struct {
Backend string `toml:"backend"`
AutoPush bool `toml:"auto_push"`
S3 SyncS3Config `toml:"s3"`
Git SyncGitConfig `toml:"git"`
File SyncFileConfig `toml:"file"`
// PushTimeoutSec is the timeout in seconds for auto-push sync operations.
// Default 30.
PushTimeoutSec int `toml:"push_timeout_sec"`
}
SyncConfig governs cross-machine session sync. Backend can be one of "" (disabled), "file", "s3", or "git".
type SyncFileConfig ¶
type SyncFileConfig struct {
Path string `toml:"path"`
}
type SyncGitConfig ¶
type SyncS3Config ¶
type TTSConfig ¶
type TTSConfig struct {
Provider string `toml:"provider"` // default provider: "edge"|"kittentts"|"openai"|"elevenlabs"
OpenAIKey string `toml:"openai_key"` // falls back to OPENAI_API_KEY
ElevenLabsKey string `toml:"elevenlabs_key"` // falls back to ELEVENLABS_API_KEY
Voice string `toml:"voice"` // default voice for the provider
}
TTSConfig governs text-to-speech settings for the tts.speak tool.
type TelegramConfig ¶
type TelegramConfig struct {
Enabled bool `toml:"enabled"`
BotToken string `toml:"bot_token"`
AllowedChats []int64 `toml:"allowed_chats"` // empty = any chat the bot is in
// NotifyChatID is the chat the gateway pushes unsolicited
// notifications to (§7.1 Layer 6 task-completion alerts). When
// zero, Telegram is not used for push delivery even if the
// gateway is otherwise enabled.
NotifyChatID int64 `toml:"notify_chat_id"`
}
TelegramConfig governs the optional Telegram bot gateway. Off by default; token may also come from TELEGRAM_BOT_TOKEN at runtime.
type TelemetryUserConfig ¶
type ThinkingConfig ¶
type ThinkingConfig struct {
// Level sets the thinking budget. Supported values:
// off, minimal, low, medium, high, x-high.
// Default is "off" (no thinking tokens surfaced).
Level ThinkingLevel `toml:"level"`
}
ThinkingConfig governs extended thinking / chain-of-thought visibility. Providers that support thinking (Anthropic, DeepSeek R1, OpenAI o-series) surface internal reasoning tokens as the agent streams.
type ThinkingLevel ¶
type ThinkingLevel string
ThinkingLevel controls how much internal reasoning/thinking the model exposes. Not all providers support all levels — unsupported levels are silently downgraded to the nearest supported option.
const ( ThinkingOff ThinkingLevel = "off" ThinkingMinimal ThinkingLevel = "minimal" ThinkingLow ThinkingLevel = "low" ThinkingMedium ThinkingLevel = "medium" ThinkingHigh ThinkingLevel = "high" ThinkingXHigh ThinkingLevel = "x-high" )
func (ThinkingLevel) BudgetTokens ¶
func (t ThinkingLevel) BudgetTokens() int
ThinkingBudgetTokens maps each ThinkingLevel to a budget_tokens value for Anthropic (and any other provider that uses token-budget thinking).
func (ThinkingLevel) Next ¶
func (t ThinkingLevel) Next() ThinkingLevel
Next returns the next level in the cycle. Wraps from x-high back to off.
func (ThinkingLevel) Valid ¶
func (t ThinkingLevel) Valid() bool
Valid returns whether the level is a known value.
type ToolUserConfig ¶
type ToolUserConfig struct {
Enabled bool `yaml:"enabled"`
Config map[string]any `yaml:"config,omitempty"`
}
ToolUserConfig is the per-tool user override. Enabled mirrors the Basic-tab toggle for visibility; Config is the kv blob the tool's ApplyConfig handler consumes.
type UIConfig ¶
UIConfig controls TUI-level cosmetics. Animations is a soft kill-switch for every animated component — useful over slow SSH or in dumb terminals.
type UserOverrides ¶
type UserOverrides struct {
SchemaVersion int `yaml:"schema_version"`
Profile string `yaml:"profile,omitempty"` // yolo|default|paranoid|enterprise (see ApplyProfile)
Basic BasicSettings `yaml:"basic"`
Advanced AdvancedSettings `yaml:"advanced"`
}
UserOverrides is the v2.0 user-controlled configuration. Every field is optional with a zero-value-means-default convention so partial files load cleanly.
func DefaultUserOverrides ¶
func DefaultUserOverrides() *UserOverrides
DefaultUserOverrides returns the baked-in starting point. Identical to applying the "yolo" profile against an empty struct — see ApplyProfile for the actual field values.
func LoadHierarchical ¶
func LoadHierarchical(src LayerSources) (*UserOverrides, error)
LoadHierarchical returns the merged UserOverrides from all layers. Missing files are silently skipped. A parse error in any single layer fails the whole load — we don't want to half-apply an enforced.yaml that the operator expected to lock things down.
func LoadUserOverrides ¶
func LoadUserOverrides(path string) (*UserOverrides, error)
LoadUserOverrides reads the user.yaml at path. Missing file is fine (returns DefaultUserOverrides); parse errors are surfaced because silently dropping a hand-written config is worse than failing loud.
type VisionConfig ¶
type VisionConfig struct {
Enabled bool `toml:"enabled"`
Provider string `toml:"provider"` // "anthropic"
APIKey string `toml:"api_key"` // falls back to ANTHROPIC_API_KEY
Model string `toml:"model"` // e.g. claude-sonnet-4-5-20250929
}
VisionConfig governs the standalone vision describer used by remote gateways for inbound photos and by the vision_describe tool. Off by default; provider must be "anthropic" today (more to come).
type WhatsAppCloudConfig ¶
type WhatsAppCloudConfig struct {
PhoneNumberID string `toml:"phone_number_id"`
AccessToken string `toml:"access_token"` // env: WHATSAPP_CLOUD_ACCESS_TOKEN
AppSecret string `toml:"app_secret"` // env: WHATSAPP_CLOUD_APP_SECRET
VerifyToken string `toml:"verify_token"` // env: WHATSAPP_CLOUD_VERIFY_TOKEN
// Listen is the HTTP bind address for the webhook server. Place
// behind a reverse proxy that terminates HTTPS — Meta only
// delivers webhooks to HTTPS endpoints. Default from config.DefaultWhatsAppCloudAddr.
Listen string `toml:"listen"`
// SeenTTLSec caps how long (in seconds) a seen message ID is
// remembered for deduplication. Default 600 (10 minutes).
SeenTTLSec int `toml:"seen_ttl_sec"`
}
WhatsAppCloudConfig holds settings for the Meta Cloud API backend.
type WhatsAppConfig ¶
type WhatsAppConfig struct {
Enabled bool `toml:"enabled"`
Backend string `toml:"backend"` // "whatsmeow" | "cloud"
// AllowedFrom restricts which sender phone numbers the bot
// responds to (E.164 form, no leading +). Empty = any.
AllowedFrom []string `toml:"allowed_from"`
// Whatsmeow sub-config — only consulted when Backend = "whatsmeow".
Whatsmeow WhatsAppWhatsmeowConfig `toml:"whatsmeow"`
// Cloud sub-config — only consulted when Backend = "cloud".
Cloud WhatsAppCloudConfig `toml:"cloud"`
// NotifyJID is the WhatsApp JID (e.g. "1234567890@s.whatsapp.net")
// the gateway pushes unsolicited notifications to (§7.1 Layer 6).
// Empty = no WhatsApp push delivery.
NotifyJID string `toml:"notify_jid"`
}
WhatsAppConfig governs the optional WhatsApp gateway. Two backends:
- "whatsmeow": Go-native unofficial client. Personal use only; TOS gray-area. Strict upgrade over Baileys-Node-sidecar — same posture, no Node runtime. Requires a one-time QR pair via `overkill whatsapp pair`.
- "cloud": WhatsApp Business Cloud API. Official, production- grade, paid per conversation at scale. 24h messaging window applies for free-form messages. Requires Meta Business verification + a public HTTPS webhook (reverse proxy).
Backend is a config-level switch — pick at config write time, not per-message. Both backends share the same Inbound/Reply contract through the gateway dispatcher.
type WhatsAppWhatsmeowConfig ¶
type WhatsAppWhatsmeowConfig struct {
// StorePath is the SQLite file holding the device keys. Created
// by `overkill whatsapp pair`. Default: ~/.overkill/whatsapp.db
StorePath string `toml:"store_path"`
}
WhatsAppWhatsmeowConfig holds settings for the unofficial backend.
type WizardCatalog ¶
type WizardCatalog struct {
Providers []WizardOption `json:"providers"`
Gateways []WizardOption `json:"gateways"`
TTS []WizardOption `json:"tts"`
Databases []WizardOption `json:"databases"`
Review []WizardOption `json:"review"`
}
WizardCatalog is the complete set of setup options with ⭐ ratings.
func BuildWizardCatalog ¶
func BuildWizardCatalog() WizardCatalog
BuildWizardCatalog returns the full catalog of setup options with star ratings and descriptions. Ratings reflect Overkill's recommended defaults for a new user getting started quickly.
func (WizardCatalog) ApplyQuickSetup ¶
func (c WizardCatalog) ApplyQuickSetup(cfg *Config) error
ApplyQuickSetup applies the recommended defaults to a config.
func (WizardCatalog) Recommend ¶
func (c WizardCatalog) Recommend(cat Category) *WizardOption
Recommend returns the top-rated option for a category.
func (WizardCatalog) RecommendedQuickSetup ¶
func (c WizardCatalog) RecommendedQuickSetup() QuickSetup
RecommendedQuickSetup returns the one-click recommended setup.
type WizardOption ¶
type WizardOption struct {
ID string `json:"id"`
Name string `json:"name"`
Description string `json:"description"`
Rating Rating `json:"rating"`
Stars string `json:"stars"` // pre-rendered for TUI
Category Category `json:"category"`
APIKeyEnv string `json:"api_key_env,omitempty"`
DefaultBase string `json:"default_base,omitempty"`
Models []string `json:"models,omitempty"`
RequiresKey bool `json:"requires_key"`
Tags []string `json:"tags,omitempty"` // "free", "local", "cloud", "recommended"
}
WizardOption is one selectable option in the setup wizard. Each option has a rating (⭐ 1–5), a description, and optional configuration hints (env var for API key, default base URL, etc).
func SortedOptions ¶
func SortedOptions(options []WizardOption) []WizardOption
Sorted returns options sorted by rating (highest first).