47 lines
2.2 KiB
Go
47 lines
2.2 KiB
Go
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...)}
|
||
}
|