49 lines
2.0 KiB
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)
|
|
}
|
|
}
|