config

package
v0.11.0-beta.2 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Oct 23, 2026 License: Apache-2.0, MIT Imports: 20 Imported by: 0

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):

  1. baked defaults (DefaultUserOverrides)
  2. system overrides /etc/overkill/user.yaml
  3. user overrides ~/.config/overkill/user.yaml
  4. workspace overrides $PWD/.overkill/user.yaml
  5. 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

View Source
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.

View Source
const CurrentVersion = 1
View Source
const SandboxAvailable = false

SandboxAvailable describes enforced process/filesystem isolation across tools. Workspace path checks and command deny patterns do not provide that boundary.

View Source
const SandboxUnavailableReason = "execution sandbox unavailable: tools are not isolated from the host"
View Source
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

View Source
var AvailableProfiles = []string{"yolo", "default", "paranoid", "enterprise", "remote"}

AvailableProfiles is the canonical ordered list — order matches the Settings UI presentation (least-restrictive first).

View Source
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 ConfigDir

func ConfigDir() (string, error)

func ConfigPath

func ConfigPath() (string, error)

func Doctor

func Doctor() ([]string, error)

func FormatOption

func FormatOption(opt WizardOption) string

FormatOption renders a WizardOption for terminal/TUI display.

func MaskKey

func MaskKey(s string) string

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

func ProviderToCatalogID(key string) (string, bool)

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

func ThemesDir() (string, error)

ThemesDir returns the path to the user's custom theme directory (~/.overkill/themes), creating it if it doesn't exist.

func UserOverridesPath

func UserOverridesPath() (string, error)

UserOverridesPath returns the canonical XDG path. Honours $XDG_CONFIG_HOME; falls back to ~/.config/overkill/user.yaml.

func ValidateField

func ValidateField(f Field, raw any) error

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 BoardOvenAction struct {
	Kind     string         `yaml:"kind"`
	AutoFire bool           `yaml:"auto_fire,omitempty"`
	Args     map[string]any `yaml:"args,omitempty"`
}

type BoardPipelineStep

type BoardPipelineStep struct {
	Subagent    string         `yaml:"subagent"`
	BlockOnFail bool           `yaml:"block_on_fail"`
	Args        map[string]any `yaml:"args,omitempty"`
}

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).

const (
	CategoryProvider Category = "provider"
	CategoryGateway  Category = "gateway"
	CategoryTTS      Category = "tts"
	CategoryDatabase Category = "database"
	CategoryReview   Category = "review"
)

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"`
	Share       ShareConfig       `toml:"share"`
	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 Default

func Default() *Config

func Load

func Load(path string) (*Config, error)

func (*Config) MaskSecrets

func (c *Config) MaskSecrets() *Config

func (*Config) Migrate

func (c *Config) Migrate() (*Config, []string, error)

func (*Config) PersistencePath

func (c *Config) PersistencePath() (string, error)

PersistencePath returns the selected loaded profile, or the default for a new config.

func (*Config) RedactionSecrets

func (c *Config) RedactionSecrets() []string

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 (c *Config) ResolveSecrets() error

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) Save

func (c *Config) Save(path string) error

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.

func (*Config) Validate

func (c *Config) Validate() []error

func (*Config) Warnings

func (c *Config) Warnings() []Warning

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 HookEntry

type HookEntry struct {
	Matcher     string `yaml:"matcher,omitempty"`
	Command     string `yaml:"command"`
	Description string `yaml:"description,omitempty"`
}

type HooksUserConfig

type HooksUserConfig struct {
	PreToolUse  []HookEntry `yaml:"pre_tool_use,omitempty"`
	PostToolUse []HookEntry `yaml:"post_tool_use,omitempty"`
	OnError     []HookEntry `yaml:"on_error,omitempty"`
	OnStop      []HookEntry `yaml:"on_stop,omitempty"`
}

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 LSPConfig

type LSPConfig struct {
	Servers []LSPServer `toml:"servers"`

	// MaxMessageBytes caps the maximum size of an LSP message in bytes.
	// Messages exceeding this cap are rejected to prevent OOM.
	// Default 33554432 (32 MiB).
	MaxMessageBytes int `toml:"max_message_bytes"`
}

type LSPServer

type LSPServer struct {
	Language  string   `toml:"language"`
	Command   string   `toml:"command"`
	Args      []string `toml:"args"`
	Filetypes []string `toml:"filetypes"`
}

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

func (c MCPConfig) ValidateLimits() error

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 MemoryUserConfig struct {
	Enabled        *bool  `yaml:"enabled,omitempty"`
	MaxEntries     int    `yaml:"max_entries,omitempty"`
	TTLDays        int    `yaml:"ttl_days,omitempty"`
	EmbeddingModel string `yaml:"embedding_model,omitempty"`
}

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 PersonaUserConfig struct {
	Tone      string `yaml:"tone,omitempty"`      // terse | normal | verbose
	Style     string `yaml:"style,omitempty"`     // senior | pair | tutor | brutal
	Directive string `yaml:"directive,omitempty"` // appended to system prompt
}

type PersonalityConfig

type PersonalityConfig struct {
	Level    string `toml:"level"`
	Language string `toml:"language"`
}

type PluginsConfig

type PluginsConfig struct {
	Disabled []string `toml:"disabled"`
	Dir      string   `toml:"dir"`
}

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 ProviderSetup struct {
	Name         string
	APIKeyEnv    string
	DefaultBase  string
	AltEndpoints []string
	Models       []string
}

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 Rating

type Rating int

Rating is a 0–5 star recommendation strength.

const (
	RatingNone        Rating = 0
	RatingOne         Rating = 1
	RatingTwo         Rating = 2
	RatingThree       Rating = 3
	RatingFour        Rating = 4
	RatingFive        Rating = 5
	RatingRecommended Rating = 5
)

func (Rating) Stars

func (r Rating) Stars() string

func (Rating) String

func (r Rating) String() string

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 SessionConfig struct {
	AutoTitle   bool   `toml:"auto_title"`
	MaxSessions int    `toml:"max_sessions"`
	DataDir     string `toml:"data_dir"`
}

type SetupStep

type SetupStep struct {
	ID       string
	Prompt   string
	Options  []string
	Default  string
	Validate func(string) error
}

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 {
	Backend     string `toml:"backend"`      // "gist" | "transfer-sh"
	GitHubToken string `toml:"github_token"` // PAT with gist scope
}

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 SkillsUserConfig struct {
	CustomPath string          `yaml:"custom_path,omitempty"`
	AutoLoad   *bool           `yaml:"auto_load,omitempty"`
	Active     map[string]bool `yaml:"active,omitempty"`
}

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 SyncGitConfig struct {
	RemoteURL string `toml:"remote_url"`
	Branch    string `toml:"branch"`
	LocalDir  string `toml:"local_dir"`
}

type SyncS3Config

type SyncS3Config struct {
	Endpoint  string `toml:"endpoint"`
	Bucket    string `toml:"bucket"`
	Region    string `toml:"region"`
	AccessKey string `toml:"access_key"`
	SecretKey string `toml:"secret_key"`
	Prefix    string `toml:"prefix"`
	UseSSL    bool   `toml:"use_ssl"`
}

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 TelemetryUserConfig struct {
	EventLog       *bool `yaml:"event_log,omitempty"`
	FlightRecorder *bool `yaml:"flight_recorder,omitempty"`
	RetentionDays  int   `yaml:"retention_days,omitempty"`
	VerifyOnBoot   *bool `yaml:"verify_on_boot,omitempty"`
}

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

type UIConfig struct {
	Animations bool   `toml:"animations"`
	Theme      string `toml:"theme"`
}

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 Warning

type Warning string

func (Warning) String

func (w Warning) String() string

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).

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL