Files
letta-code/src/tests/agent/getResumeData.test.ts

130 lines
4.1 KiB
TypeScript

import { describe, expect, mock, test } from "bun:test";
import type Letta from "@letta-ai/letta-client";
import type { AgentState } from "@letta-ai/letta-client/resources/agents/agents";
import type { Message } from "@letta-ai/letta-client/resources/agents/messages";
import { getResumeData } from "../../agent/check-approval";
function makeAgent(overrides: Partial<AgentState> = {}): AgentState {
return {
id: "agent-test",
message_ids: ["msg-last"],
...overrides,
} as AgentState;
}
function makeApprovalMessage(id = "msg-last"): Message {
return {
id,
date: new Date().toISOString(),
message_type: "approval_request_message",
tool_calls: [
{
tool_call_id: "tool-1",
name: "Bash",
arguments: '{"command":"echo hi"}',
},
],
} as unknown as Message;
}
function makeUserMessage(id = "msg-last"): Message {
return {
id,
date: new Date().toISOString(),
message_type: "user_message",
} as Message;
}
describe("getResumeData", () => {
test("includeMessageHistory=false still computes pending approvals without backfill (conversation path)", async () => {
const conversationsRetrieve = mock(async () => ({
in_context_message_ids: ["msg-last"],
}));
const conversationsList = mock(async () => ({
getPaginatedItems: () => [],
}));
const agentsList = mock(async () => ({ items: [] }));
const messagesRetrieve = mock(async () => [makeApprovalMessage()]);
const client = {
conversations: {
retrieve: conversationsRetrieve,
messages: { list: conversationsList },
},
agents: { messages: { list: agentsList } },
messages: { retrieve: messagesRetrieve },
} as unknown as Letta;
const resume = await getResumeData(client, makeAgent(), "conv-abc", {
includeMessageHistory: false,
});
expect(conversationsRetrieve).toHaveBeenCalledTimes(1);
expect(messagesRetrieve).toHaveBeenCalledTimes(1);
expect(conversationsList).toHaveBeenCalledTimes(0);
expect(resume.pendingApprovals).toHaveLength(1);
expect(resume.pendingApprovals[0]?.toolName).toBe("Bash");
expect(resume.messageHistory).toEqual([]);
});
test("includeMessageHistory=false skips default-conversation backfill calls", async () => {
const conversationsRetrieve = mock(async () => ({
in_context_message_ids: ["msg-last"],
}));
const conversationsList = mock(async () => ({
getPaginatedItems: () => [],
}));
const agentsList = mock(async () => ({ items: [] }));
const messagesRetrieve = mock(async () => [makeApprovalMessage()]);
const client = {
conversations: {
retrieve: conversationsRetrieve,
messages: { list: conversationsList },
},
agents: { messages: { list: agentsList } },
messages: { retrieve: messagesRetrieve },
} as unknown as Letta;
const resume = await getResumeData(
client,
makeAgent({ message_ids: ["msg-last"] }),
"default",
{ includeMessageHistory: false },
);
expect(messagesRetrieve).toHaveBeenCalledTimes(1);
expect(agentsList).toHaveBeenCalledTimes(0);
expect(resume.pendingApprovals).toHaveLength(1);
expect(resume.messageHistory).toEqual([]);
});
test("default behavior keeps backfill enabled when options are omitted", async () => {
const conversationsRetrieve = mock(async () => ({
in_context_message_ids: ["msg-last"],
}));
const agentsList = mock(async () => ({
getPaginatedItems: () => [
makeUserMessage("msg-a"),
makeUserMessage("msg-b"),
],
}));
const messagesRetrieve = mock(async () => [makeUserMessage()]);
const client = {
conversations: {
retrieve: conversationsRetrieve,
},
agents: { messages: { list: agentsList } },
messages: { retrieve: messagesRetrieve },
} as unknown as Letta;
const resume = await getResumeData(client, makeAgent(), "default");
expect(messagesRetrieve).toHaveBeenCalledTimes(1);
expect(agentsList).toHaveBeenCalledTimes(1);
expect(resume.pendingApprovals).toHaveLength(0);
expect(resume.messageHistory.length).toBeGreaterThan(0);
});
});