Files
oh-my-opencode/src/agents/athena/athena-config-injection.test.ts
T

115 lines
5.5 KiB
TypeScript

/// <reference types="bun-types" />
import { describe, expect, it } from "bun:test"
import { createAthenaAgent } from "./agent"
describe("Athena prompt config injection placeholders", () => {
const athenaConfig = createAthenaAgent("anthropic/claude-opus-4-6")
describe("#given the Athena agent prompt", () => {
describe("#when checking for runtime injection placeholders", () => {
it("#then contains RETRY_ON_FAIL placeholder", () => {
expect(athenaConfig.prompt).toContain("{RETRY_ON_FAIL}")
})
it("#then contains STUCK_THRESHOLD_SECONDS placeholder", () => {
expect(athenaConfig.prompt).toContain("{STUCK_THRESHOLD_SECONDS}")
})
it("#then contains MEMBER_MAX_RUNNING_SECONDS placeholder", () => {
expect(athenaConfig.prompt).toContain("{MEMBER_MAX_RUNNING_SECONDS}")
})
it("#then contains quorum reference", () => {
expect(athenaConfig.prompt).toContain("quorum")
})
it("#then contains timeout reference with 30000", () => {
expect(athenaConfig.prompt).toContain("30000")
})
it("#then contains RETRY_FAILED_IF_OTHERS_FINISHED placeholder", () => {
expect(athenaConfig.prompt).toContain("{RETRY_FAILED_IF_OTHERS_FINISHED}")
})
it("#then contains CANCEL_RETRYING_ON_QUORUM placeholder", () => {
expect(athenaConfig.prompt).toContain("{CANCEL_RETRYING_ON_QUORUM}")
})
it("#then avoids session_id continuation retry instruction", () => {
expect(athenaConfig.prompt).not.toContain("Retries: use task(session_id=<member_session_id>")
})
it("#then uses sequential workflow step numbering", () => {
expect(athenaConfig.prompt).toContain("Step 12: Synthesize")
expect(athenaConfig.prompt).toContain("Step 13: Determine follow-up path from council_finalize runtime guidance")
expect(athenaConfig.prompt).toContain("Step 14: Execute the runtime guidance action flow")
expect(athenaConfig.prompt).toContain("Step 15: Fallback behavior if runtime guidance is missing")
})
it("#then omits legacy mixed step labels", () => {
expect(athenaConfig.prompt).not.toContain("Step 1.5")
expect(athenaConfig.prompt).not.toContain("Step 4.5")
expect(athenaConfig.prompt).not.toContain("Step 7A")
expect(athenaConfig.prompt).not.toContain("Step 7B")
})
it("#then uses tagged prompt sections for consistency", () => {
expect(athenaConfig.prompt).toContain("<identity>")
expect(athenaConfig.prompt).toContain("<workflow>")
expect(athenaConfig.prompt).toContain("<synthesis_rules>")
expect(athenaConfig.prompt).toContain("<action_paths>")
expect(athenaConfig.prompt).toContain("<constraints>")
})
it("#then places council setup after step 1 and removes first-action wording", () => {
const prompt = athenaConfig.prompt ?? ""
expect(prompt).not.toContain("CRITICAL: Council Setup (Your First Action)")
const step1Index = prompt.indexOf("Step 1: Understand the question and decide the route.")
const step2Index = prompt.indexOf("Step 2: Council setup (default flow before launch).")
expect(step1Index).toBeGreaterThan(-1)
expect(step2Index).toBeGreaterThan(step1Index)
})
it("#then uses primary-objective wording for step 3 classification", () => {
const prompt = athenaConfig.prompt ?? ""
expect(prompt).toContain("Step 3: Classify the question intent by primary objective.")
expect(prompt).not.toContain("Classification disambiguation rule:")
})
it("#then requires question tool routing in self-answerable path", () => {
expect(athenaConfig.prompt).toContain("Athena MUST ask the user to choose direct answer vs council using the Question tool")
expect(athenaConfig.prompt).toContain("header: \"Routing\"")
expect(athenaConfig.prompt).toContain("label: \"Answer directly\"")
expect(athenaConfig.prompt).toContain("label: \"Consult council\"")
})
it("#then requires question tool clarifications in ambiguous council path", () => {
expect(athenaConfig.prompt).toContain("Use the Question tool (not open-ended free text) for 1-2 targeted clarifications")
expect(athenaConfig.prompt).toContain("Formulate the questions and options dynamically")
expect(athenaConfig.prompt).not.toContain("header: \"Output Type\"")
expect(athenaConfig.prompt).not.toContain("header: \"Scope\"")
})
it("#then keeps intent classification anchored to step 3 wording", () => {
expect(athenaConfig.prompt).toContain("Step 3: Classify the question intent by primary objective.")
expect(athenaConfig.prompt).toContain("Then proceed to Step 2.")
expect(athenaConfig.prompt).not.toContain("Then classify intent and proceed to Step 2.")
expect(athenaConfig.prompt).not.toContain("Classify intent immediately and proceed to Step 2.")
})
it("#then excludes non-interactive mode branch from runtime prompt", () => {
expect(athenaConfig.prompt).not.toContain("Non-interactive mode (Question tool unavailable)")
})
it("#then requires passing intent to council_finalize and honoring injected runtime guidance", () => {
expect(athenaConfig.prompt).toContain("intent=\"{intent from Step 3}\"")
expect(athenaConfig.prompt).toContain("runtime guidance message injected by council_finalize")
expect(athenaConfig.prompt).toContain("<athena_runtime_guidance>")
})
})
})
})