import { useMemo } from 'react' import type { Message, StaticVarSegment } from '../types/protocol' import SessionBar from './SessionBar' import MessageBubble from './MessageBubble' interface MessageListProps { messages: Message[] } /** * 从所有 system 消息中提取 static_var 片段, * 构建会话变量映射表并从消息体中移除这些片段。 */ function extractSessionVars(messages: Message[]): { variables: StaticVarSegment[] varMap: Record cleanedMessages: Message[] } { const variables: StaticVarSegment[] = [] const varMap: Record = {} const cleanedMessages = messages.map((msg) => { const staticVars: StaticVarSegment[] = [] const remaining = msg.segments.filter((seg) => { if (seg.kind === 'static_var') { staticVars.push(seg) return false // 从消息体中移除 } return true }) // 收集变量 for (const v of staticVars) { variables.push(v) varMap[v.name] = v.value } return { ...msg, segments: remaining } }) return { variables, varMap, cleanedMessages } } export default function MessageList({ messages }: MessageListProps) { const { variables, varMap, cleanedMessages } = useMemo( () => extractSessionVars(messages), [messages] ) if (cleanedMessages.length === 0) { return (
选择一个 Demo 场景开始
) } return (
{/* 会话变量横栏 —— 在对话气泡之外 */} {/* 消息列表 */}
{cleanedMessages.map((msg) => ( ))}
) }