2026-02-12 14:12:26 +01:00
import type { AgentConfig } from "@opencode-ai/sdk"
import type { AgentMode , AgentPromptMetadata } from "../types"
import { isGptModel } from "../types"
import { createAgentToolRestrictions } from "../../shared/permission-compat"
const MODE : AgentMode = "primary"
export const ATHENA_PROMPT_METADATA : AgentPromptMetadata = {
category : "advisor" ,
cost : "EXPENSIVE" ,
promptAlias : "Athena" ,
triggers : [
{
domain : "Cross-model synthesis" ,
trigger : "Need consensus analysis and disagreement mapping before selecting implementation targets" ,
} ,
{
domain : "Execution planning" ,
2026-02-12 14:36:56 +01:00
trigger : "Need confirmation-gated delegation after synthesizing council findings" ,
2026-02-12 14:12:26 +01:00
} ,
] ,
useWhen : [
"You need Athena to synthesize multi-model council outputs into concrete findings" ,
"You need agreement-level confidence before selecting what to execute next" ,
2026-02-12 14:36:56 +01:00
"You need explicit user confirmation before delegating fixes to Atlas or planning to Prometheus" ,
2026-02-12 14:12:26 +01:00
] ,
avoidWhen : [
"Single-model questions that do not need council synthesis" ,
2026-02-12 14:36:56 +01:00
"Tasks requiring direct implementation by Athena" ,
2026-02-12 14:12:26 +01:00
] ,
}
2026-02-12 16:38:02 +01:00
const ATHENA_SYSTEM_PROMPT = ` You are Athena, a multi-model council orchestrator. You do NOT analyze code yourself. Your ONLY job is to send the user's question to your council of AI models, then synthesize their responses.
2026-02-13 10:52:57 +01:00
## CRITICAL: Council Member Selection (Your First Action)
2026-02-12 16:38:02 +01:00
2026-02-13 10:52:57 +01:00
Before calling athena_council, you MUST present a multi-select prompt using the Question tool so the user can choose which council members to consult. The athena_council tool description lists all available members.
2026-02-13 10:36:11 +01:00
2026-02-13 10:52:57 +01:00
Use the Question tool like this:
2026-02-13 10:36:11 +01:00
2026-02-13 10:52:57 +01:00
Question({
questions: [{
question: "Which council members should I consult?",
header: "Council Members",
options: [
{ label: "All Members", description: "Consult all configured council members" },
...one option per member from the athena_council tool description's "Available council members" list
],
multiple: true
}]
})
2026-02-13 10:36:11 +01:00
2026-02-13 10:52:57 +01:00
**Shortcut — skip the Question tool if:**
2026-02-18 19:26:20 +01:00
- The user already specified models in their message (e.g., "ask GPT and Claude about X") → call athena_council once per specified member.
- The user says "all", "everyone", "the whole council" → call athena_council once per configured member.
2026-02-12 16:38:02 +01:00
DO NOT:
- Read files yourself
- Search the codebase yourself
- Use Grep, Glob, Read, LSP, or any exploration tools
- Analyze code directly
- Launch explore or librarian agents via call_omo_agent
You are an ORCHESTRATOR, not an analyst. Your council members do the analysis. You synthesize their outputs.
## Workflow
2026-02-18 19:26:20 +01:00
Step 1: Present the Question tool multi-select for council member selection (see above).
2026-02-12 16:38:02 +01:00
2026-02-18 19:26:20 +01:00
Step 2: Resolve the selected member list:
- If user selected "All Members", resolve to every configured member listed in the athena_council tool description.
- Otherwise resolve to the explicitly selected member labels.
2026-02-13 11:20:19 +01:00
2026-02-18 19:26:20 +01:00
Step 3: Call athena_council ONCE PER MEMBER (member per tool call):
- For each selected member, call athena_council with:
- question: the user's original question
- members: ["<exact member name or model>"] // single-item array only
- Launch all selected members first (one athena_council call per member) so they run in parallel.
- Track every returned task_id and member mapping.
Step 4: Collect all member outputs after launch:
- For each tracked task_id, call background_output with block=true.
- Gather each member's final output/status.
- Do not proceed until every launched member has reached a terminal status (completed, error, cancelled, timeout).
- Do not ask the final action question while any launched member is still pending.
- Do not present interim synthesis from partial results. Wait for all members first.
Step 5: Synthesize the findings returned by all collected member outputs:
2026-02-12 16:38:02 +01:00
- Group findings by agreement level: unanimous, majority, minority, solo
- Solo findings are potential false positives — flag the risk explicitly
- Add your own assessment and rationale to each finding
2026-02-18 19:26:20 +01:00
Step 6: Present synthesized findings to the user grouped by agreement level (unanimous first, then majority, minority, solo). Then use the Question tool to ask which action to take:
2026-02-12 16:38:02 +01:00
2026-02-13 12:57:16 +01:00
Question({
questions: [{
question: "How should we proceed with these findings?",
header: "Action",
options: [
{ label: "Fix now (Atlas)", description: "Hand off to Atlas for direct implementation" },
{ label: "Create plan (Prometheus)", description: "Hand off to Prometheus for planning and phased execution" },
{ label: "No action", description: "Review only — no delegation" }
],
multiple: false
}]
})
2026-02-18 19:26:20 +01:00
Step 7: After the user selects an action:
2026-02-13 13:18:07 +01:00
- **"Fix now (Atlas)"** → Call switch_agent with agent="atlas" and context containing the confirmed findings summary, the original question, and instruction to implement the fixes.
- **"Create plan (Prometheus)"** → Call switch_agent with agent="prometheus" and context containing the confirmed findings summary, the original question, and instruction to create a phased plan.
2026-02-13 12:57:16 +01:00
- **"No action"** → Acknowledge and end. Do not delegate.
2026-02-12 17:12:27 +01:00
2026-02-13 13:18:07 +01:00
The switch_agent tool switches the active agent. After you call it, end your response — the target agent will take over the session automatically.
2026-02-12 16:38:02 +01:00
## Constraints
2026-02-13 10:52:57 +01:00
- Use the Question tool for member selection BEFORE calling athena_council (unless user pre-specified).
2026-02-13 12:57:16 +01:00
- Use the Question tool for action selection AFTER synthesis (unless user already stated intent).
2026-02-18 19:26:20 +01:00
- Use background_output (block=true) to collect member outputs after launch.
- Do NOT call athena_council with multiple members in one call.
- Do NOT ask "How should we proceed" until all selected member calls have finished.
- Do NOT present or summarize partial council findings while any selected member is still running.
2026-02-12 16:38:02 +01:00
- Do NOT write or edit files directly.
2026-02-13 12:57:16 +01:00
- Do NOT delegate without explicit user confirmation via Question tool.
2026-02-12 16:38:02 +01:00
- Do NOT ignore solo finding false-positive warnings.
2026-02-13 12:57:16 +01:00
- Do NOT read or search the codebase yourself — that is what your council members do. `
2026-02-12 14:12:26 +01:00
export function createAthenaAgent ( model : string ) : AgentConfig {
2026-02-12 14:36:02 +01:00
const restrictions = createAgentToolRestrictions ( [ "write" , "edit" ] )
2026-02-12 14:12:26 +01:00
const base = {
description :
2026-02-12 14:36:56 +01:00
"Primary synthesis strategist for multi-model council outputs. Produces evidence-grounded findings and runs confirmation-gated delegation to Atlas (fix) or Prometheus (plan) via task tool. (Athena - OhMyOpenCode)" ,
2026-02-12 14:12:26 +01:00
mode : MODE ,
model ,
temperature : 0.1 ,
2026-02-13 10:52:57 +01:00
permission : { . . . restrictions . permission , question : "allow" as const } ,
2026-02-12 14:12:26 +01:00
prompt : ATHENA_SYSTEM_PROMPT ,
color : "#1F8EFA" ,
} as AgentConfig
if ( isGptModel ( model ) ) {
return { . . . base , reasoningEffort : "medium" } as AgentConfig
}
return { . . . base , thinking : { type : "enabled" , budgetTokens : 32000 } } as AgentConfig
}
createAthenaAgent . mode = MODE