import type { AgentConfig } from "@opencode-ai/sdk" import type { AgentOverrides } from "../types" import type { CategoryConfig } from "../../config/schema" import type { AvailableAgent, AvailableCategory, AvailableSkill } from "../dynamic-agent-prompt-builder" import { AGENT_MODEL_REQUIREMENTS, isAnyProviderConnected } from "../../shared" import { createHephaestusAgent } from "../hephaestus" import { applyEnvironmentContext } from "./environment-context" import { applyCategoryOverride, mergeAgentConfig } from "./agent-overrides" import { applyModelResolution, getFirstFallbackModel } from "./model-resolution" import { getGptApplyPatchPermission } from "../gpt-apply-patch-guard" import { applyFrontierToolSchemaPermission } from "../frontier-tool-schema-guard" export function maybeCreateHephaestusConfig(input: { disabledAgents: string[] agentOverrides: AgentOverrides availableModels: Set systemDefaultModel?: string isFirstRunNoCache: boolean availableAgents: AvailableAgent[] availableSkills: AvailableSkill[] availableCategories: AvailableCategory[] mergedCategories: Record directory?: string useTaskSystem: boolean disableOmoEnv?: boolean }): AgentConfig | undefined { const { disabledAgents, agentOverrides, availableModels, systemDefaultModel, isFirstRunNoCache, availableAgents, availableSkills, availableCategories, mergedCategories, directory, useTaskSystem, disableOmoEnv = false, } = input if (disabledAgents.includes("hephaestus")) return undefined const hephaestusOverride = agentOverrides["hephaestus"] const hephaestusRequirement = AGENT_MODEL_REQUIREMENTS["hephaestus"] const hasHephaestusExplicitConfig = hephaestusOverride !== undefined const hasRequiredProvider = !hephaestusRequirement?.requiresProvider || hasHephaestusExplicitConfig || isFirstRunNoCache || isAnyProviderConnected(hephaestusRequirement.requiresProvider, availableModels) if (!hasRequiredProvider) return undefined let hephaestusResolution = applyModelResolution({ userModel: hephaestusOverride?.model, requirement: hephaestusRequirement, availableModels, systemDefaultModel, }) if (isFirstRunNoCache && !hephaestusOverride?.model) { hephaestusResolution = getFirstFallbackModel(hephaestusRequirement) } if (!hephaestusResolution) return undefined const { model: hephaestusModel, variant: hephaestusResolvedVariant } = hephaestusResolution let hephaestusConfig = createHephaestusAgent( hephaestusModel, availableAgents, undefined, availableSkills, availableCategories, useTaskSystem ) hephaestusConfig = { ...hephaestusConfig, variant: hephaestusResolvedVariant ?? "medium" } const hepOverrideCategory = (hephaestusOverride as Record | undefined)?.category as string | undefined if (hepOverrideCategory) { hephaestusConfig = applyCategoryOverride(hephaestusConfig, hepOverrideCategory, mergedCategories) } hephaestusConfig = applyEnvironmentContext(hephaestusConfig, directory, { disableOmoEnv }) if (hephaestusOverride) { hephaestusConfig = mergeAgentConfig(hephaestusConfig, hephaestusOverride, directory) } const resolvedModel = hephaestusConfig.model ?? "" hephaestusConfig.permission = applyFrontierToolSchemaPermission( hephaestusConfig.permission, resolvedModel, hephaestusOverride?.permission, (hephaestusOverride as { tools?: Record } | undefined)?.tools ) const gptDeny = getGptApplyPatchPermission(resolvedModel) if (Object.keys(gptDeny).length > 0 && hephaestusConfig.permission) { Object.assign(hephaestusConfig.permission, gptDeny) } return hephaestusConfig }