diff --git a/src/plugin/session-agent-resolver.test.ts b/src/plugin/session-agent-resolver.test.ts new file mode 100644 index 00000000..a84e51a5 --- /dev/null +++ b/src/plugin/session-agent-resolver.test.ts @@ -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() + }) +}) diff --git a/src/plugin/session-agent-resolver.ts b/src/plugin/session-agent-resolver.ts new file mode 100644 index 00000000..8d9837ff --- /dev/null +++ b/src/plugin/session-agent-resolver.ts @@ -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 { + 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 +}