import type { ApiClient } from '@/api/client' import type { AgentStateRequest, DecryptedMessage, Session } from '@/types/api' import { Button } from '@/components/ui/button' import { SessionHeader } from '@/components/SessionHeader' import { PermissionPanel } from '@/components/PermissionPanel' import { MessageBubble } from '@/components/MessageBubble' import { ChatInput } from '@/components/ChatInput' import { useScrollToBottom } from '@/hooks/useScrollToBottom' function getFirstPendingRequest(session: Session): { requestId: string; request: AgentStateRequest } | null { const requests = session.agentState?.requests ?? null if (!requests) return null const entries = Object.entries(requests) if (entries.length === 0) return null const [requestId, request] = entries[0] return { requestId, request } } export function SessionChat(props: { api: ApiClient session: Session messages: DecryptedMessage[] messagesWarning: string | null hasMoreMessages: boolean isLoadingMessages: boolean isLoadingMoreMessages: boolean isSending: boolean onBack: () => void onRefresh: () => void onLoadMore: () => void onSend: (text: string) => void onRetryMessage?: (localId: string) => void }) { const pending = getFirstPendingRequest(props.session) const scrollRef = useScrollToBottom([props.messages.length]) const controlsDisabled = !props.session.active return (
{controlsDisabled ? (
Session is inactive. Controls are disabled.
) : null}
{props.messagesWarning ? (
{props.messagesWarning}
) : null} {props.hasMoreMessages ? (
) : null} {props.isLoadingMessages ? (
Loading…
) : (
{props.messages.map((m) => ( props.onRetryMessage!(m.localId!) : undefined } /> ))}
)}
{pending ? ( ) : null}
) }