package configserver import ( "errors" "fmt" ) // Сентинельные ошибки домена. MCP-слой различает их, чтобы выбрать между // recoverable-ответом (`errorResult`) и инфраструктурной Go-ошибкой. var ( // ErrNoConfig — не найден ни один конфиг (ни `-config`, ни OMNI_CONFIG_DIR). ErrNoConfig = errors.New("конфиг не найден: задайте -config или per-agent omnichannel-configserver-mcp.json") // ErrReadOnly — модуль в режиме только-чтение, мутация запрещена. ErrReadOnly = errors.New("модуль в режиме read_only: изменяющие инструменты отключены") // ErrConfirmRequired — разрушительная операция без confirm=\"true\". ErrConfirmRequired = errors.New("операция требует confirm=\"true\"") // ErrNoFrontRoots — не заданы front_roots, загрузка фронта запрещена. ErrNoFrontRoots = errors.New("загрузка фронта выключена: не заданы front_roots в конфиге") ) // APIError — доменная ошибка API config_server (4xx/5xx с телом {"error": ...}). // Такие ошибки показываются модели (recoverable), чтобы она могла исправиться. type APIError struct { Status int Message string } func (e *APIError) Error() string { if e.Message == "" { return fmt.Sprintf("config_server вернул HTTP %d", e.Status) } return fmt.Sprintf("config_server (HTTP %d): %s", e.Status, e.Message) } // ValidationError — доменная ошибка модуля (невалидный путь, лимит, политика). // Тоже recoverable: модель может исправить аргументы. type ValidationError struct { Msg string } func (e *ValidationError) Error() string { return e.Msg } // validationErrorf создаёт ValidationError с форматированием. func validationErrorf(format string, args ...any) error { return &ValidationError{Msg: fmt.Sprintf(format, args...)} }