Files
2026-07-13 11:59:58 +08:00

107 lines
3.1 KiB
TypeScript

import { expect, test } from "@rstest/core";
import {
SIDECAR_METADATA_KEY,
buildSidecarThreadMetadata,
isSidecarThread,
shouldShowInPrimaryThreadLists,
} from "@/core/sidecar/thread";
test("builds sidecar thread metadata from parent thread and context", () => {
const metadata = buildSidecarThreadMetadata("parent-1", {
type: "referenced_message",
label: "Assistant message",
messageId: "msg-1",
role: "assistant",
content: "Answer",
});
expect(metadata).toEqual({
[SIDECAR_METADATA_KEY]: true,
parent_thread_id: "parent-1",
sidecar_context_type: "referenced_message",
sidecar_context_label: "Assistant message",
sidecar_context_count: 1,
referenced_message_id: "msg-1",
referenced_message_ids: ["msg-1"],
referenced_message_role: "assistant",
referenced_message_roles: ["assistant"],
});
});
test("builds searchable sidecar thread metadata from multiple contexts", () => {
const metadata = buildSidecarThreadMetadata("parent-1", [
{
type: "referenced_message",
label: "Assistant message #1",
messageId: "msg-1",
role: "assistant",
content: "First answer",
},
{
type: "referenced_message",
label: "User message #2",
messageId: "msg-2",
role: "user",
content: "Follow-up request",
},
] as never);
expect(metadata).toMatchObject({
[SIDECAR_METADATA_KEY]: true,
parent_thread_id: "parent-1",
sidecar_context_type: "referenced_message",
sidecar_context_label: "Assistant message #1",
referenced_message_id: "msg-1",
referenced_message_role: "assistant",
sidecar_context_count: 2,
referenced_message_ids: ["msg-1", "msg-2"],
referenced_message_roles: ["assistant", "user"],
});
});
test("keeps referenced ids/roles parallel when quoting one message twice", () => {
const metadata = buildSidecarThreadMetadata("parent-1", [
{
type: "referenced_message",
label: "Selected assistant text #1",
messageId: "msg-1",
role: "assistant",
content: "First fragment",
},
{
type: "referenced_message",
label: "Selected assistant text #1",
messageId: "msg-1",
role: "assistant",
content: "Second fragment",
},
] as never);
expect(metadata.sidecar_context_count).toBe(2);
expect(metadata.referenced_message_ids).toEqual(["msg-1", "msg-1"]);
expect(metadata.referenced_message_roles).toEqual(["assistant", "assistant"]);
expect(metadata.referenced_message_ids).toHaveLength(
metadata.referenced_message_roles.length,
);
expect(metadata.referenced_message_ids).toHaveLength(
metadata.sidecar_context_count,
);
});
test("identifies sidecar threads and hides them from primary thread lists", () => {
const sidecar = {
thread_id: "sidecar-1",
metadata: { [SIDECAR_METADATA_KEY]: true },
};
const primary = {
thread_id: "primary-1",
metadata: {},
};
expect(isSidecarThread(sidecar)).toBe(true);
expect(shouldShowInPrimaryThreadLists(sidecar)).toBe(false);
expect(isSidecarThread(primary)).toBe(false);
expect(shouldShowInPrimaryThreadLists(primary)).toBe(true);
});