107 lines
3.1 KiB
TypeScript
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);
|
|
});
|