agent-orchestrator/backend/internal/domain/agentconfig.go

49 lines
2.0 KiB
Go

package domain
import "fmt"
// PermissionMode controls how much review an agent requires before acting. It
// lives in domain (not ports) so the typed AgentConfig can carry it; ports
// re-exports it as a type alias so agent adapters keep referring to
// ports.PermissionMode unchanged.
type PermissionMode string
// The permission modes adapters map onto their agent's native approval flags.
const (
// PermissionModeDefault is special: adapters emit no flag for it so the
// agent resolves its starting mode from the user's own config (e.g.
// Claude's TUI reading ~/.claude/settings.json defaultMode).
PermissionModeDefault PermissionMode = "default"
PermissionModeAcceptEdits PermissionMode = "accept-edits"
PermissionModeAuto PermissionMode = "auto"
PermissionModeBypassPermissions PermissionMode = "bypass-permissions"
)
// AgentConfig is the typed per-project agent configuration. It replaces the
// former free-form map so the fields are validated and the API/UI render a
// real form rather than arbitrary JSON. An empty value (IsZero) means unset.
type AgentConfig struct {
// Model overrides the agent's default model (e.g. claude-opus-4-5).
Model string `json:"model,omitempty"`
// Permissions sets the agent's starting permission mode. Empty defers to
// the agent's own configuration.
Permissions PermissionMode `json:"permissions,omitempty"`
}
// IsZero reports whether the config carries no settings, so storage can persist
// SQL NULL and resolution can skip an empty config.
func (c AgentConfig) IsZero() bool {
return c == AgentConfig{}
}
// Validate rejects values outside the typed vocabulary so a bad config is
// refused when it is set (CLI/API) rather than silently dropped at spawn.
func (c AgentConfig) Validate() error {
switch c.Permissions {
case "", PermissionModeDefault, PermissionModeAcceptEdits, PermissionModeAuto, PermissionModeBypassPermissions:
return nil
default:
return fmt.Errorf("invalid permissions %q: want one of default, accept-edits, auto, bypass-permissions", c.Permissions)
}
}