24f213449e
Pure resolution logic combining a workspace's AgentSpec with the user-level default_agent into a Resolved value carrying Command, Args, and Env. No I/O — PATH lookup stays in shell.ExecAgent and ctask agents check, so Resolve is trivially testable and reusable. BuiltinProfiles enumerates claude and opencode; "custom" is the escape hatch and requires command. Keep BuiltinProfiles in sync with workspace.knownAgentTypes and workspace.IsBuiltinAgentType (Task 1).