evOo-local/packages/core/src/thread-message-updates.test.ts
cynarAI 6c7eed7580 Initial clean evOo-local from f00577b
Fresh history cut from cynarAI/evoo antigravity-handoff/project-timeline
(Voice First + project timeline). Brand docs/titles as evOo; keep @rakazo/*
packages as tech debt. Excludes node_modules, caches, secrets, voice blobs.
2026-09-20 17:15:16 +02:00

52 lines
2.0 KiB
TypeScript

import type { MessageBlock } from "@rakazo/contracts";
import { describe, expect, it } from "vitest";
import { takeLiveMessage, updateCloudAgentMessages } from "./thread-message-updates.js";
const cloud = (agentId: string): MessageBlock => ({
kind: "cloud_agent",
agentId,
title: "Agent",
status: "running",
url: "",
});
describe("shared message updates", () => {
it("takes only the matching run and drops obsolete unscoped progress in order", () => {
const messages = [
{ id: "first" },
{ id: "progress:legacy" },
{ id: "progress:current", runId: "current" },
{ id: "progress:other", runId: "other" },
{ id: "last" },
];
const result = takeLiveMessage(messages, "progress:current");
expect(result.previous).toBe(messages[2]);
expect(result.remaining).toEqual([messages[0], messages[3], messages[4]]);
expect(messages).toHaveLength(5);
});
it("updates every matching cloud block while preserving metadata and unrelated messages", () => {
const messages = [
{ id: "first", replyToMessageId: "reply", blocks: [cloud("agent"), cloud("other")] },
{ id: "second", replyToMessageId: "reply", blocks: [cloud("agent")] },
{
id: "third",
replyToMessageId: "reply",
blocks: [{ kind: "text", text: "unchanged" } as MessageBlock],
},
];
const result = updateCloudAgentMessages(messages, {
messageId: "first",
agentId: "agent",
status: "finished",
});
expect(result.map((message) => message.id)).toEqual(["first", "second", "third"]);
expect(result[0]?.replyToMessageId).toBe("reply");
expect(result[0]?.blocks[0]).toMatchObject({ agentId: "agent", status: "finished" });
expect(result[1]?.blocks[0]).toMatchObject({ agentId: "agent", status: "finished" });
expect(result[0]?.blocks[1]).toBe(messages[0]?.blocks[1]);
expect(result[2]).toBe(messages[2]);
expect(messages[0]?.blocks[0]).toMatchObject({ status: "running" });
});
});