Menu
popagent
publicLatest change bbbda111dae473952af172e96453b5ddc06a1e43 - Replace Hindsight with native memory tools by Ólafur Búi Ólafsson
import { afterAll, describe, expect, test } from "bun:test";
import { RequestContext } from "@mastra/core/request-context";
import { longTermMemory } from "../long-term-memory";
import { editMemory, recallMemory, reflectMemory, retainMemory } from "./memory";
const resourceId = `memory-tools-${crypto.randomUUID()}`;
const requestContext = new RequestContext();
requestContext.set("popagent.resourceId", resourceId);
requestContext.set("popagent.sessionId", "memory-tool-session");
afterAll(() => longTermMemory.storage.db.none(
"DELETE FROM popagent_memories WHERE resource_id = $1",
[resourceId],
));
describe("memory tools", () => {
test("retain, recall, reflect, update, and forget durable memories", async () => {
expect(await retainMemory.execute?.(
{ key: "user.editor", fact: "The user prefers Helix for quick edits.", importance: 0.9 },
{ requestContext } as never,
)).toEqual({ remembered: true });
const recalled = await recallMemory.execute?.(
{ query: "preferred editor", limit: 5 },
{ requestContext } as never,
) as { memories: Array<{ id: string; content: string }> };
expect(recalled.memories[0]?.content).toContain("Helix");
const reflected = await reflectMemory.execute?.(
{ query: "What editing workflow does the user prefer?", limit: 10 },
{ requestContext } as never,
) as { evidence: Array<{ id: string }> };
expect(reflected.evidence).toContainEqual(expect.objectContaining({ id: recalled.memories[0]!.id }));
expect(await editMemory.execute?.(
{ id: recalled.memories[0]!.id, action: "update", content: "The user prefers Neovim for quick edits.", key: "user.editor", importance: 0.95 },
{ requestContext } as never,
)).toEqual(expect.objectContaining({ updated: true }));
expect((await longTermMemory.recall({ resourceId, query: "Neovim" }))[0]?.content).toContain("Neovim");
expect(await editMemory.execute?.(
{ id: recalled.memories[0]!.id, action: "forget" },
{ requestContext } as never,
)).toEqual({ forgotten: true });
});
});