import { Show, Match, Switch } from "solid-js" import ToolCall from "./tool-call" import { isItemExpanded, toggleItemExpanded } from "../stores/tool-call-state" import { Markdown } from "./markdown" import { useTheme } from "../lib/theme" import { useConfig } from "../stores/preferences" import { partHasRenderableText, SDKPart, TextPart, ClientPart } from "../types/message" type ToolCallPart = Extract interface MessagePartProps { part: ClientPart messageType?: "user" | "assistant" instanceId: string sessionId: string } export default function MessagePart(props: MessagePartProps) { const { isDark } = useTheme() const { preferences } = useConfig() const partType = () => props.part?.type || "" const reasoningId = () => `reasoning-${props.part?.id || ""}` const isReasoningExpanded = () => isItemExpanded(reasoningId()) const isAssistantMessage = () => props.messageType === "assistant" const textContainerClass = () => (isAssistantMessage() ? "message-text message-text-assistant" : "message-text") const plainTextContent = () => { const part = props.part if ((part.type === "text" || part.type === "reasoning") && typeof part.text === "string") { return part.text } return "" } const createTextPartForMarkdown = (): TextPart => { const part = props.part if ((part.type === "text" || part.type === "reasoning") && typeof part.text === "string") { return { id: part.id, type: "text", text: part.text, synthetic: part.type === "text" ? part.synthetic : false, version: (part as { version?: number }).version } } return { id: part.id, type: "text", text: "", synthetic: false } } function handleReasoningClick(e: Event) { e.preventDefault() toggleItemExpanded(reasoningId()) } return (
{plainTextContent()}} >
{isReasoningExpanded() ? "▼" : "▶"} Reasoning
) }