import React, { useState } from 'react' import { createFileRoute } from '@tanstack/react-router' import { SubBar } from '../shell/SubBar' import { Tag } from '../primitives' import { useSession } from '../features/session/useSession' import { TurnList } from '../features/session/TurnList' import { Transcript } from '../features/session/Transcript' import { AuthError, APIError } from '../api/client' import '../styles/session.css' export const Route = createFileRoute('/session/$tool/$host/$id')({ component: SessionRoute, }) function SessionRoute(): React.JSX.Element { const { tool, host, id } = Route.useParams() const { data: session, isLoading, error } = useSession(tool, host, id) const firstSeq = session?.turns[0]?.i ?? 0 const [selected, setSelected] = useState(firstSeq) // When turns load and selected hasn't been set yet (still at 0), set to first const effectiveSelected = session != null && selected === 0 && session.turns.length > 0 ? session.turns[0].i : selected function handleSelect(seq: number): void { setSelected(seq) const el = document.getElementById(`turn-${seq}`) if (el != null) { el.scrollIntoView({ behavior: 'smooth', block: 'start' }) } } if (isLoading) { return ( <> {tool} {host}
loading session…
) } if (error != null) { if (error instanceof AuthError) { return ( <> {tool} {host}
not authenticated
Sign in to view this session.
) } const detail = error instanceof APIError ? error.message : String(error) return ( <> {tool} {host}
error
{detail}
) } if (session == null) { return <> } const summaryPreview = session.summary.length > 56 ? session.summary.slice(0, 56) + '…' : session.summary return ( <> {session.cwd !== '' && ( {session.cwd} )} {summaryPreview} {tool} {host} {session.model != null && ( {session.model} )} {session.turns.length} turns
) }