import { html, useEffect, useRef } from '../lib/preact.js'; import { getStatusMeta } from '../utils/status.js'; import { formatDuration, getContextUsageSummary } from '../utils/formatting.js'; import { ChatMessages } from './ChatMessages.js'; import { QuestionBlock } from './QuestionBlock.js'; import { SimpleInput } from './SimpleInput.js'; export function SessionCard({ session, onClick, conversation, onFetchConversation, onRespond, onDismiss }) { const hasQuestions = session.pending_questions && session.pending_questions.length > 0; const statusMeta = getStatusMeta(session.status); const agent = session.agent === 'codex' ? 'codex' : 'claude'; const agentHeaderClass = agent === 'codex' ? 'agent-header-codex' : 'agent-header-claude'; const contextUsage = getContextUsageSummary(session.context_usage); // Fetch conversation when card mounts useEffect(() => { if (!conversation && onFetchConversation) { onFetchConversation(session.session_id, session.project_dir, agent); } }, [session.session_id, session.project_dir, agent, conversation, onFetchConversation]); const chatPaneRef = useRef(null); // Scroll chat pane to bottom when conversation loads or updates useEffect(() => { const el = chatPaneRef.current; if (el) el.scrollTop = el.scrollHeight; }, [conversation]); const handleDismissClick = (e) => { e.stopPropagation(); onDismiss(session.session_id); }; return html`
onClick(session)} >
${session.project || session.name || 'Session'}
${statusMeta.label} ${agent} ${session.cwd && html` ${session.cwd.split('/').slice(-2).join('/')} `}
${contextUsage && html`
${contextUsage.headline} ${contextUsage.detail} ${contextUsage.trail && html`${contextUsage.trail}`}
`}
${formatDuration(session.started_at)} ${session.status === 'done' && html` `}
<${ChatMessages} messages=${conversation || []} status=${session.status} />
${hasQuestions ? html` <${QuestionBlock} questions=${session.pending_questions} sessionId=${session.session_id} status=${session.status} onRespond=${onRespond} /> ` : html` <${SimpleInput} sessionId=${session.session_id} status=${session.status} onRespond=${onRespond} /> `}
`; }