import { Divider, Message } from "./index.js";
import { Alert } from "./Alert.js";
import { PerformerEvent } from "@performer/core";
type FilterType = "chat" | "all";
type MessageListProps = {
events: PerformerEvent[];
filter: FilterType;
};
function exclude(filter: FilterType, event: PerformerEvent) {
return (
// exclude system messages from chat view
(filter === "chat" &&
event.type === "message" &&
event.detail.message.role === "system") ||
// exclude tool messages from chat view
(filter === "chat" &&
event.type === "message" &&
event.detail.message.role === "tool") ||
// exclude messages with no content from chat view
(filter === "chat" &&
event.type === "message" &&
!event.detail.message.content) ||
// exclude delta with no content from chat view
(filter === "chat" &&
event.type === "delta" &&
!event.detail.delta.content) ||
// exclude non-root threads from chat view
(filter === "chat" && event.threadId != "root") ||
// exclude life cycle events from chat view
(filter === "chat" && event.type === "lifecycle")
);
}
function getRole(event: PerformerEvent) {
if (event.type === "message") {
return event.detail.message.role;
} else if (event.type === "delta") {
return event.detail.delta.role;
} else {
return undefined;
}
}
function map(filter: FilterType, events: PerformerEvent[]) {
let prevEvent;
let continuation = false;
const items = [];
for (const [index, event] of events.entries()) {
if (exclude(filter, event)) {
continue;
}
if (
prevEvent &&
prevEvent.type === "message" &&
prevEvent.detail.message.role === "user"
) {
continuation = false;
} else if (prevEvent && getRole(prevEvent) !== getRole(event)) {
continuation = false;
} else if (!prevEvent) {
continuation = false;
} else {
continuation = true;
}
// only use continuations in chat view
if (filter !== "chat") {
continuation = false;
}
if (event.type === "message") {
items.push(