"use client"; import { use, useState, useRef, useEffect } from "react"; import { ArrowLeft, Send } from "lucide-react"; import Link from "next/link"; import { useSession, useMessages } from "@/lib/hooks"; import { timeAgo, formatTokens, platformBadgeClass } from "@/lib/utils"; import { MessageBubble } from "@/components/MessageBubble"; export default function SessionReplayPage({ params }: { params: Promise<{ id: string }> }) { const { id } = use(params); const { data: sessionData } = useSession(id); const { data: messagesData, isLoading, refetch } = useMessages(id); const [input, setInput] = useState(""); const [sending, setSending] = useState(false); const inputRef = useRef(null); const session = sessionData?.session; const messages = messagesData?.items || []; const visibleMessages = messages.filter( (m) => m.role === "user" || m.role === "assistant" ).reverse(); // newest first const toolResults = new Map(); for (const m of messages) { if (m.role === "tool" && m.tool_call_id) { toolResults.set(m.tool_call_id, { name: m.tool_name || "tool", content: m.content || "", }); } } const sendMessage = async () => { if (!input.trim() || sending) return; setSending(true); try { await fetch("/api/sessions/" + id + "/chat", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ message: input.trim() }), }); setInput(""); // Poll for response setTimeout(() => refetch(), 2000); setTimeout(() => refetch(), 5000); setTimeout(() => refetch(), 10000); } catch {} setSending(false); }; return (
{/* Header */}
{session?.title || "Session " + id.slice(0, 8)}
{session && (
{session.source} {session.message_count} msgs · {formatTokens(session.input_tokens + session.output_tokens)} · {timeAgo(session.started_at)}
)}
{/* Message input */}
setInput(e.target.value)} onKeyDown={(e) => e.key === "Enter" && sendMessage()} placeholder="Send a message..." className="flex-1 px-4 py-2.5 rounded-xl text-sm outline-none transition-colors" style={{ background: "var(--bg-raised)", border: "1px solid var(--border)", color: "var(--text-1)", }} disabled={sending} />
{/* Messages - newest first */} {isLoading ? (
{[...Array(4)].map((_, i) => (
))}
) : (
{visibleMessages.map((m) => ( ))} {visibleMessages.length === 0 && (

Empty session

)}
)}
); }