ismeth 5a72f21fc8 refactor(athena): rename session_handoff to switch_agent to avoid confusion with /handoff command
Rename across all layers to eliminate naming ambiguity:
- Tool: session_handoff → switch_agent
- Hook: agent-handoff → agent-switch
- Feature: agent-handoff/ → agent-switch/
- Types: SessionHandoffArgs → SwitchAgentArgs, PendingHandoff → PendingSwitch
- Functions: setPendingHandoff → setPendingSwitch, consumePendingHandoff → consumePendingSwitch

/handoff = inter-session context summary (existing command)
switch_agent = intra-session active agent change (our new tool)
2026-02-24 22:20:54 +09:00

92 lines
2.7 KiB
TypeScript

import { describe, test, expect, beforeEach } from "bun:test"
import { createSwitchAgentTool } from "./tools"
import { consumePendingSwitch, _resetForTesting as resetSwitch } from "../../features/agent-switch"
import { getSessionAgent, _resetForTesting as resetSession } from "../../features/claude-code-session-state"
describe("switch_agent tool", () => {
const sessionID = "test-session-123"
const messageID = "msg-456"
const agent = "athena"
const toolContext = {
sessionID,
messageID,
agent,
abort: new AbortController().signal,
}
beforeEach(() => {
resetSwitch()
resetSession()
})
//#given valid atlas switch args
//#when execute is called
//#then it stores pending switch and updates session agent
test("should queue switch to atlas", async () => {
const tool = createSwitchAgentTool()
const result = await tool.execute(
{ agent: "atlas", context: "Fix the auth bug based on council findings" },
toolContext
)
expect(result).toContain("atlas")
expect(result).toContain("switch")
const entry = consumePendingSwitch(sessionID)
expect(entry).toEqual({
agent: "atlas",
context: "Fix the auth bug based on council findings",
})
expect(getSessionAgent(sessionID)).toBe("atlas")
})
//#given valid prometheus switch args
//#when execute is called
//#then it stores pending switch for prometheus
test("should queue switch to prometheus", async () => {
const tool = createSwitchAgentTool()
const result = await tool.execute(
{ agent: "Prometheus", context: "Create a plan for the refactoring" },
toolContext
)
expect(result).toContain("prometheus")
expect(result).toContain("switch")
const entry = consumePendingSwitch(sessionID)
expect(entry?.agent).toBe("prometheus")
})
//#given an invalid agent name
//#when execute is called
//#then it returns an error
test("should reject invalid agent names", async () => {
const tool = createSwitchAgentTool()
const result = await tool.execute(
{ agent: "librarian", context: "Some context" },
toolContext
)
expect(result).toContain("Invalid switch target")
expect(result).toContain("librarian")
expect(consumePendingSwitch(sessionID)).toBeUndefined()
})
//#given agent name with different casing
//#when execute is called
//#then it normalizes to lowercase
test("should handle case-insensitive agent names", async () => {
const tool = createSwitchAgentTool()
await tool.execute(
{ agent: "ATLAS", context: "Fix things" },
toolContext
)
const entry = consumePendingSwitch(sessionID)
expect(entry?.agent).toBe("atlas")
expect(getSessionAgent(sessionID)).toBe("atlas")
})
})