diff --git a/src/agents/utils.ts b/src/agents/utils.ts index 1f0d0ac..55788d9 100644 --- a/src/agents/utils.ts +++ b/src/agents/utils.ts @@ -1,12 +1,13 @@ import type { AgentConfig } from "@opencode-ai/sdk" -import type { BuiltinAgentName, AgentOverrideConfig, AgentOverrides, AgentFactory } from "./types" +import type { BuiltinAgentName, AgentOverrideConfig, AgentOverrides, AgentFactory, AgentPromptMetadata } from "./types" import { createSisyphusAgent } from "./sisyphus" -import { createOracleAgent } from "./oracle" -import { createLibrarianAgent } from "./librarian" -import { createExploreAgent } from "./explore" -import { createFrontendUiUxEngineerAgent } from "./frontend-ui-ux-engineer" -import { createDocumentWriterAgent } from "./document-writer" -import { createMultimodalLookerAgent } from "./multimodal-looker" +import { createOracleAgent, ORACLE_PROMPT_METADATA } from "./oracle" +import { createLibrarianAgent, LIBRARIAN_PROMPT_METADATA } from "./librarian" +import { createExploreAgent, EXPLORE_PROMPT_METADATA } from "./explore" +import { createFrontendUiUxEngineerAgent, FRONTEND_PROMPT_METADATA } from "./frontend-ui-ux-engineer" +import { createDocumentWriterAgent, DOCUMENT_WRITER_PROMPT_METADATA } from "./document-writer" +import { createMultimodalLookerAgent, MULTIMODAL_LOOKER_PROMPT_METADATA } from "./multimodal-looker" +import type { AvailableAgent } from "./sisyphus-prompt-builder" import { deepMerge } from "../shared" type AgentSource = AgentFactory | AgentConfig @@ -21,6 +22,19 @@ const agentSources: Record = { "multimodal-looker": createMultimodalLookerAgent, } +/** + * Metadata for each agent, used to build Sisyphus's dynamic prompt sections + * (Delegation Table, Tool Selection, Key Triggers, etc.) + */ +const agentMetadata: Partial> = { + oracle: ORACLE_PROMPT_METADATA, + librarian: LIBRARIAN_PROMPT_METADATA, + explore: EXPLORE_PROMPT_METADATA, + "frontend-ui-ux-engineer": FRONTEND_PROMPT_METADATA, + "document-writer": DOCUMENT_WRITER_PROMPT_METADATA, + "multimodal-looker": MULTIMODAL_LOOKER_PROMPT_METADATA, +} + function isFactory(source: AgentSource): source is AgentFactory { return typeof source === "function" } @@ -76,20 +90,20 @@ export function createBuiltinAgents( systemDefaultModel?: string ): Record { const result: Record = {} + const availableAgents: AvailableAgent[] = [] for (const [name, source] of Object.entries(agentSources)) { const agentName = name as BuiltinAgentName - if (disabledAgents.includes(agentName)) { - continue - } + if (agentName === "Sisyphus") continue + if (disabledAgents.includes(agentName)) continue const override = agentOverrides[agentName] - const model = override?.model ?? (agentName === "Sisyphus" ? systemDefaultModel : undefined) + const model = override?.model let config = buildAgent(source, model) - if ((agentName === "Sisyphus" || agentName === "librarian") && directory && config.prompt) { + if (agentName === "librarian" && directory && config.prompt) { const envContext = createEnvContext() config = { ...config, prompt: config.prompt + envContext } } @@ -99,6 +113,33 @@ export function createBuiltinAgents( } result[name] = config + + const metadata = agentMetadata[agentName] + if (metadata) { + availableAgents.push({ + name: agentName, + description: config.description ?? "", + metadata, + }) + } + } + + if (!disabledAgents.includes("Sisyphus")) { + const sisyphusOverride = agentOverrides["Sisyphus"] + const sisyphusModel = sisyphusOverride?.model ?? systemDefaultModel + + let sisyphusConfig = createSisyphusAgent(sisyphusModel, availableAgents) + + if (directory && sisyphusConfig.prompt) { + const envContext = createEnvContext() + sisyphusConfig = { ...sisyphusConfig, prompt: sisyphusConfig.prompt + envContext } + } + + if (sisyphusOverride) { + sisyphusConfig = mergeAgentConfig(sisyphusConfig, sisyphusOverride) + } + + result["Sisyphus"] = sisyphusConfig } return result