11import type { AgentConfig } from "@opencode-ai/sdk"
22import type { BuiltinAgentName , AgentOverrideConfig , AgentOverrides , AgentFactory , AgentPromptMetadata } from "./types"
3+ import type { CategoriesConfig , CategoryConfig } from "../config/schema"
34import { createSisyphusAgent } from "./sisyphus"
45import { createOracleAgent , ORACLE_PROMPT_METADATA } from "./oracle"
56import { createLibrarianAgent , LIBRARIAN_PROMPT_METADATA } from "./librarian"
@@ -47,19 +48,29 @@ function isFactory(source: AgentSource): source is AgentFactory {
4748 return typeof source === "function"
4849}
4950
50- export function buildAgent ( source : AgentSource , model ?: string ) : AgentConfig {
51+ export function buildAgent (
52+ source : AgentSource ,
53+ model ?: string ,
54+ categories ?: CategoriesConfig
55+ ) : AgentConfig {
5156 const base = isFactory ( source ) ? source ( model ) : source
57+ const categoryConfigs : Record < string , CategoryConfig > = categories
58+ ? { ...DEFAULT_CATEGORIES , ...categories }
59+ : DEFAULT_CATEGORIES
5260
53- const agentWithCategory = base as AgentConfig & { category ?: string ; skills ?: string [ ] }
61+ const agentWithCategory = base as AgentConfig & { category ?: string ; skills ?: string [ ] ; variant ?: string }
5462 if ( agentWithCategory . category ) {
55- const categoryConfig = DEFAULT_CATEGORIES [ agentWithCategory . category ]
63+ const categoryConfig = categoryConfigs [ agentWithCategory . category ]
5664 if ( categoryConfig ) {
5765 if ( ! base . model ) {
5866 base . model = categoryConfig . model
5967 }
6068 if ( base . temperature === undefined && categoryConfig . temperature !== undefined ) {
6169 base . temperature = categoryConfig . temperature
6270 }
71+ if ( base . variant === undefined && categoryConfig . variant !== undefined ) {
72+ base . variant = categoryConfig . variant
73+ }
6374 }
6475 }
6576
@@ -118,11 +129,16 @@ export function createBuiltinAgents(
118129 disabledAgents : BuiltinAgentName [ ] = [ ] ,
119130 agentOverrides : AgentOverrides = { } ,
120131 directory ?: string ,
121- systemDefaultModel ?: string
132+ systemDefaultModel ?: string ,
133+ categories ?: CategoriesConfig
122134) : Record < string , AgentConfig > {
123135 const result : Record < string , AgentConfig > = { }
124136 const availableAgents : AvailableAgent [ ] = [ ]
125137
138+ const mergedCategories = categories
139+ ? { ...DEFAULT_CATEGORIES , ...categories }
140+ : DEFAULT_CATEGORIES
141+
126142 for ( const [ name , source ] of Object . entries ( agentSources ) ) {
127143 const agentName = name as BuiltinAgentName
128144
@@ -133,7 +149,7 @@ export function createBuiltinAgents(
133149 const override = agentOverrides [ agentName ]
134150 const model = override ?. model
135151
136- let config = buildAgent ( source , model )
152+ let config = buildAgent ( source , model , mergedCategories )
137153
138154 if ( agentName === "librarian" && directory && config . prompt ) {
139155 const envContext = createEnvContext ( )
0 commit comments