import type { TaskConversationResponse, SupervisorConversationResponse, } from "../../lib/api"; import { ConversationMessage } from "./ConversationMessage"; interface ConversationViewProps { conversation: TaskConversationResponse | SupervisorConversationResponse; } // Type guard for task conversation function isTaskConversation( conv: TaskConversationResponse | SupervisorConversationResponse ): conv is TaskConversationResponse { return "taskId" in conv; } // Type guard for supervisor conversation function isSupervisorConversation( conv: TaskConversationResponse | SupervisorConversationResponse ): conv is SupervisorConversationResponse { return "supervisorTaskId" in conv; } export function ConversationView({ conversation }: ConversationViewProps) { const messages = conversation.messages; return (
{/* Header info */}
{isTaskConversation(conversation) ? (
{conversation.taskName} {conversation.status}
) : isSupervisorConversation(conversation) ? (
Supervisor {conversation.phase}
) : null}
{messages.length} messages {isTaskConversation(conversation) && conversation.totalTokens && ( {conversation.totalTokens.toLocaleString()} tokens )} {isTaskConversation(conversation) && conversation.totalCost !== null && conversation.totalCost > 0 && ( ${conversation.totalCost.toFixed(4)} )}
{/* Spawned tasks (supervisor only) */} {isSupervisorConversation(conversation) && conversation.spawnedTasks.length > 0 && (
Spawned: {conversation.spawnedTasks.map((task) => ( {task.taskName} ))}
)}
{/* Messages */}
{messages.length === 0 ? (
No messages
) : (
{messages.map((message, index) => ( ))}
)}
); }