import type { AgentConfig } from "@opencode-ai/sdk" import type { AgentFactory } from "./types" import type { CategoriesConfig, CategoryConfig, GitMasterConfig } from "../config/schema" import type { BrowserAutomationProvider } from "../config/schema" import { DEFAULT_CATEGORIES } from "../tools/delegate-task/constants" import { resolveMultipleSkills } from "../features/opencode-skill-loader/skill-content" export type AgentSource = AgentFactory | AgentConfig export function isFactory(source: AgentSource): source is AgentFactory { return typeof source === "function" } export function buildAgent( source: AgentSource, model: string, categories?: CategoriesConfig, gitMasterConfig?: GitMasterConfig, browserProvider?: BrowserAutomationProvider, disabledSkills?: Set ): AgentConfig { const base = isFactory(source) ? source(model) : { ...source } const categoryConfigs: Record = categories ? { ...DEFAULT_CATEGORIES, ...categories } : DEFAULT_CATEGORIES const agentWithCategory = base as AgentConfig & { category?: string; skills?: string[]; variant?: string } if (agentWithCategory.category) { const categoryConfig = categoryConfigs[agentWithCategory.category] if (categoryConfig) { if (!base.model) { base.model = categoryConfig.model } if (base.temperature === undefined && categoryConfig.temperature !== undefined) { base.temperature = categoryConfig.temperature } if (base.variant === undefined && categoryConfig.variant !== undefined) { base.variant = categoryConfig.variant } } } if (agentWithCategory.skills?.length) { const { resolved } = resolveMultipleSkills(agentWithCategory.skills, { gitMasterConfig, browserProvider, disabledSkills }) if (resolved.size > 0) { const skillContent = Array.from(resolved.values()).join("\n\n") base.prompt = skillContent + (base.prompt ? "\n\n" + base.prompt : "") } } return base }