import { AgentConversation, type AgentConversationClassNames, type AgentTranscriptClassNames, type ChatComposerClassNames, type PermissionReply, type TranscriptEntry, } from "@sandbox-agent/react"; import { AlertTriangle, Brain, Check, ChevronDown, ChevronRight, ExternalLink, Info, PlayCircle, Send, Shield, Wrench, X } from "lucide-react"; import type { ReactNode } from "react"; import MarkdownText from "./MarkdownText"; const agentLogos: Record = { claude: `${import.meta.env.BASE_URL}logos/claude.svg`, codex: `${import.meta.env.BASE_URL}logos/openai.svg`, opencode: `${import.meta.env.BASE_URL}logos/opencode.svg`, amp: `${import.meta.env.BASE_URL}logos/amp.svg`, pi: `${import.meta.env.BASE_URL}logos/pi.svg`, }; const transcriptClassNames: Partial = { root: "messages", divider: "status-divider", dividerLine: "status-divider-line", dividerText: "status-divider-text", message: "message", messageContent: "message-content", error: "message-error", toolGroupSingle: "tool-group-single", toolGroupContainer: "tool-group-container", toolGroupHeader: "tool-group-header", toolGroupIcon: "tool-group-icon", toolGroupLabel: "tool-group-label", toolGroupChevron: "tool-group-chevron", toolGroupBody: "tool-group", toolItem: "tool-item", toolItemConnector: "tool-item-connector", toolItemDot: "tool-item-dot", toolItemLine: "tool-item-line", toolItemContent: "tool-item-content", toolItemHeader: "tool-item-header", toolItemIcon: "tool-item-icon", toolItemLabel: "tool-item-label", toolItemSpinner: "tool-item-spinner", toolItemLink: "tool-item-link", toolItemChevron: "tool-item-chevron", toolItemBody: "tool-item-body", toolSection: "tool-section", toolSectionTitle: "tool-section-title", toolCode: "tool-code", toolCodeMuted: "muted", permissionPrompt: "permission-prompt", permissionHeader: "permission-header", permissionIcon: "permission-icon", permissionTitle: "permission-title", permissionDescription: "permission-description", permissionActions: "permission-actions", permissionButton: "permission-btn", permissionAutoResolved: "permission-auto-resolved", thinkingRow: "thinking-row", thinkingIndicator: "thinking-indicator", }; const conversationClassNames: Partial = { root: "chat-conversation", transcript: "messages-container", }; const composerClassNames: Partial = { root: "input-container", form: "input-wrapper", submit: "send-button", }; const ThinkingDots = () => ( <> ); export interface InspectorConversationProps { entries: TranscriptEntry[]; sessionError: string | null; eventError?: string | null; messagesEndRef: React.RefObject; onEventClick?: (eventId: string) => void; isThinking?: boolean; agentId?: string; emptyState?: ReactNode; message: string; onMessageChange: (value: string) => void; onSendMessage: () => void; onKeyDown: (event: React.KeyboardEvent) => void; placeholder: string; disabled: boolean; onPermissionReply?: (permissionId: string, reply: PermissionReply) => void; } const InspectorConversation = ({ entries, sessionError, eventError, messagesEndRef, onEventClick, isThinking, agentId, emptyState, message, onMessageChange, onSendMessage, onKeyDown, placeholder, disabled, onPermissionReply, }: InspectorConversationProps) => { return ( !(entry.kind === "meta" && entry.meta?.title === "Available commands update"), renderMessageText: (entry) => , renderInlinePendingIndicator: () => , renderToolItemIcon: (entry) => { if (entry.kind === "tool") { return ; } if (entry.kind === "reasoning") { return ; } return entry.meta?.severity === "error" ? : ; }, renderToolGroupIcon: () => , renderChevron: (expanded) => (expanded ? : ), renderEventLinkContent: () => , onPermissionReply, renderPermissionIcon: () => , renderPermissionOptionContent: ({ option, label, selected }) => ( <> {selected ? option.kind.startsWith("allow") ? : : null} {label} ), renderThinkingState: ({ agentId: activeAgentId }) => (
{activeAgentId && agentLogos[activeAgentId] ? ( ) : ( AI )}
), }} composerClassNames={composerClassNames} composerProps={{ message, onMessageChange, onSubmit: onSendMessage, onKeyDown, placeholder, disabled, submitLabel: "Send", renderSubmitContent: () => , }} /> ); }; export default InspectorConversation;