Parent Epic
Part of #396 (unify agent abstraction layer)
Problem
Agent type alias resolution exists in 3 separate places:
internal/prime/agent_type.go:CanonicalAgentType() — maps "claude"→"claude-code", "gemini-cli"→"gemini", etc.
internal/session/adapters/*.go:init() — each adapter registers with aliases
cmd/ox/agent_hook.go:resolveAgentType() — another alias resolution for hook context
These can drift out of sync. When adding a new agent, all 3 must be updated.
Proposed Solution
Define aliases in agent metadata (from P1). Then:
CanonicalAgentType() iterates registry metadata to find matching alias
- Adapter
Register() calls use aliases from metadata
resolveAgentType() delegates to CanonicalAgentType()
Single source of truth: Agent.Metadata().Aliases.
Dependency
Depends on P1 (Agent.Metadata() interface).
Files to Change
internal/prime/agent_type.go — simplify using registry aliases
cmd/ox/agent_hook.go — delete resolveAgentType(), use canonical function
internal/session/adapters/*.go — derive aliases from metadata (or keep init() but validate against metadata)
Risk
- Blast radius: Small (2-3 files)
- Behavior change: None — alias resolution is centralized
Parent Epic
Part of #396 (unify agent abstraction layer)
Problem
Agent type alias resolution exists in 3 separate places:
internal/prime/agent_type.go:CanonicalAgentType()— maps "claude"→"claude-code", "gemini-cli"→"gemini", etc.internal/session/adapters/*.go:init()— each adapter registers with aliasescmd/ox/agent_hook.go:resolveAgentType()— another alias resolution for hook contextThese can drift out of sync. When adding a new agent, all 3 must be updated.
Proposed Solution
Define aliases in agent metadata (from P1). Then:
CanonicalAgentType()iterates registry metadata to find matching aliasRegister()calls use aliases from metadataresolveAgentType()delegates toCanonicalAgentType()Single source of truth:
Agent.Metadata().Aliases.Dependency
Depends on P1 (Agent.Metadata() interface).
Files to Change
internal/prime/agent_type.go— simplify using registry aliasescmd/ox/agent_hook.go— deleteresolveAgentType(), use canonical functioninternal/session/adapters/*.go— derive aliases from metadata (or keep init() but validate against metadata)Risk