feat(plugin): add session agent resolver for subagent_type lookup

This commit is contained in:
YeonGyu-Kim 2026-02-13 12:02:27 +09:00
parent f6fbac458e
commit 6fb933f99b
2 changed files with 132 additions and 0 deletions

View File

@ -0,0 +1,96 @@
import { describe, expect, test } from "bun:test"
import { resolveSessionAgent } from "./session-agent-resolver"
describe("resolveSessionAgent", () => {
test("returns agent from first message with agent field", async () => {
//#given
const client = {
session: {
messages: async () => ({
data: [
{ info: { role: "user" } },
{ info: { role: "assistant", agent: "explore" } },
{ info: { role: "assistant", agent: "oracle" } },
],
}),
},
}
//#when
const agent = await resolveSessionAgent(client, "ses_test")
//#then
expect(agent).toBe("explore")
})
test("skips messages without agent field", async () => {
//#given
const client = {
session: {
messages: async () => ({
data: [
{ info: { role: "user" } },
{ info: { role: "system" } },
{ info: { role: "assistant", agent: "plan" } },
],
}),
},
}
//#when
const agent = await resolveSessionAgent(client, "ses_test")
//#then
expect(agent).toBe("plan")
})
test("returns undefined when no messages have agent", async () => {
//#given
const client = {
session: {
messages: async () => ({
data: [
{ info: { role: "user" } },
{ info: { role: "assistant" } },
],
}),
},
}
//#when
const agent = await resolveSessionAgent(client, "ses_test")
//#then
expect(agent).toBeUndefined()
})
test("returns undefined when session has no messages", async () => {
//#given
const client = {
session: {
messages: async () => ({ data: [] }),
},
}
//#when
const agent = await resolveSessionAgent(client, "ses_test")
//#then
expect(agent).toBeUndefined()
})
test("returns undefined when API call fails", async () => {
//#given
const client = {
session: {
messages: async () => { throw new Error("API error") },
},
}
//#when
const agent = await resolveSessionAgent(client, "ses_test")
//#then
expect(agent).toBeUndefined()
})
})

View File

@ -0,0 +1,36 @@
import { log } from "../shared"
interface SessionMessage {
info?: {
agent?: string
role?: string
}
}
type SessionClient = {
session: {
messages: (opts: { path: { id: string } }) => Promise<{ data?: SessionMessage[] }>
}
}
export async function resolveSessionAgent(
client: SessionClient,
sessionId: string,
): Promise<string | undefined> {
try {
const messagesResp = await client.session.messages({ path: { id: sessionId } })
const messages = (messagesResp.data ?? []) as SessionMessage[]
for (const msg of messages) {
if (msg.info?.agent) {
return msg.info.agent
}
}
} catch (error) {
log("[session-agent-resolver] Failed to resolve agent from session", {
sessionId,
error: String(error),
})
}
return undefined
}