diff --git a/internal/config/config.go b/internal/config/config.go index 5185cce..1ed0667 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -327,22 +327,6 @@ type QuietHoursConfig struct { End string `json:"end,omitempty"` // "HH:MM" local time, e.g. "08:00" } -// WeatherConfig configures the weather provider for voice queries. -type WeatherConfig struct { - Provider string `json:"provider,omitempty"` // "open-meteo" or "" → stub - DefaultLocation string `json:"default_location,omitempty"` // e.g. "Moscow" -} - -// ToolConfig — one enabled tool. Name is the spoken verb ("restart"); Cmd is -// the fixed argv prefix (["systemctl","restart"]); Destructive marks acts that -// must not fire from the voice path (they need a confirm on an authed surface). -type ToolConfig struct { - Name string `json:"name"` - Scope string `json:"scope,omitempty"` - Cmd []string `json:"cmd"` - Destructive bool `json:"destructive,omitempty"` -} - // DigestConfig — notification batching / digest mode. When enabled, eligible // nudges (severity ≤ SeverityCeiling) are queued in memory instead of sent // immediately. Every Window duration (or when MaxItems reached), the queue is @@ -477,36 +461,6 @@ type PhraserConfig struct { SwapModels []string `json:"swap_models,omitempty"` } -// EmbedderConfig — paths for the ONNX multilingual embedder. The daemon -// constructs an in-process ONNX embedder when all three paths are non-empty; -// the router's classifier then uses real sentence embeddings instead of the -// floor HashEmbedder stub. Model_path is the ONNX model file, tokenizer_path -// is tokenizer.json (Unigram), lib_path is the ONNX Runtime shared library. -type EmbedderConfig struct { - ModelPath string `json:"model_path,omitempty"` - TokenizerPath string `json:"tokenizer_path,omitempty"` - LibPath string `json:"lib_path,omitempty"` -} - -// WorkerConfig — a unix-socket worker module connection. Used by Stt and -// (via TtsConfig embedding the same fields) by Tts. Socket is the unix -// socket path the worker module listens on (e.g. -// /run/user/$UID/maven/stt.sock). Lang overrides the surface default for -// this module when the user wants different langs for stt vs tts (rare). -type WorkerConfig struct { - Socket string `json:"socket,omitempty"` - Lang string `json:"lang,omitempty"` -} - -// TtsConfig — the tts worker module connection + tts-specific Voice field -// (a named voice when the worker supports multiple; "" ⇒ the worker's -// configured default). -type TtsConfig struct { - Socket string `json:"socket,omitempty"` - Lang string `json:"lang,omitempty"` - Voice string `json:"voice,omitempty"` -} - // Duration — a time.Duration that round-trips through JSON as a string // ("60s", "5m", "1h30m"). Plain time.Duration marshals as a nanosecond int, // which is unreadable in a config file; this wrapper uses ParseDuration. diff --git a/internal/config/voice.go b/internal/config/voice.go index 0a9852f..9d9ca09 100644 --- a/internal/config/voice.go +++ b/internal/config/voice.go @@ -5,6 +5,56 @@ import ( "time" ) +// The blocks nested under voice: the two worker seams, the embedder the +// classifier scores with, the weather provider and the act allowlist. They live +// here because none of them is reachable except through a voice block. + +// WorkerConfig — a unix-socket worker module connection. Used by Stt and +// (via TtsConfig embedding the same fields) by Tts. Socket is the unix +// socket path the worker module listens on (e.g. +// /run/user/$UID/maven/stt.sock). Lang overrides the surface default for +// this module when the user wants different langs for stt vs tts (rare). +type WorkerConfig struct { + Socket string `json:"socket,omitempty"` + Lang string `json:"lang,omitempty"` +} + +// TtsConfig — the tts worker module connection + tts-specific Voice field +// (a named voice when the worker supports multiple; "" ⇒ the worker's +// configured default). +type TtsConfig struct { + Socket string `json:"socket,omitempty"` + Lang string `json:"lang,omitempty"` + Voice string `json:"voice,omitempty"` +} + +// EmbedderConfig — paths for the ONNX multilingual embedder. The daemon +// constructs an in-process ONNX embedder when all three paths are non-empty; +// the router's classifier then uses real sentence embeddings instead of the +// floor HashEmbedder stub. Model_path is the ONNX model file, tokenizer_path +// is tokenizer.json (Unigram), lib_path is the ONNX Runtime shared library. +type EmbedderConfig struct { + ModelPath string `json:"model_path,omitempty"` + TokenizerPath string `json:"tokenizer_path,omitempty"` + LibPath string `json:"lib_path,omitempty"` +} + +// WeatherConfig configures the weather provider for voice queries. +type WeatherConfig struct { + Provider string `json:"provider,omitempty"` // "open-meteo" or "" → stub + DefaultLocation string `json:"default_location,omitempty"` // e.g. "Moscow" +} + +// ToolConfig — one enabled tool. Name is the spoken verb ("restart"); Cmd is +// the fixed argv prefix (["systemctl","restart"]); Destructive marks acts that +// must not fire from the voice path (they need a confirm on an authed surface). +type ToolConfig struct { + Name string `json:"name"` + Scope string `json:"scope,omitempty"` + Cmd []string `json:"cmd"` + Destructive bool `json:"destructive,omitempty"` +} + // Voice defaults, applied in normaliseVoice. const ( DefaultRouterThreshold = 0.55