feat(tui): implement session timeline

This commit is contained in:
Dax Raad
2026-07-20 09:53:07 -04:00
parent 7be95bcd6a
commit c7aa47c144
3 changed files with 21 additions and 2 deletions
@@ -24,6 +24,12 @@ export function DialogMessage(props: {
<DialogSelect <DialogSelect
title="Message Actions" title="Message Actions"
options={[ options={[
{
title: "Jump to",
value: "message.jump",
description: "view message in session",
onSelect: (dialog) => dialog.clear(),
},
{ {
title: "Revert", title: "Revert",
value: "session.revert", value: "session.revert",
@@ -4,10 +4,12 @@ import { DialogSelect, type DialogSelectOption } from "../../ui/dialog-select"
import { Locale } from "../../util/locale" import { Locale } from "../../util/locale"
import { DialogMessage } from "./dialog-message" import { DialogMessage } from "./dialog-message"
import { useDialog } from "../../ui/dialog" import { useDialog } from "../../ui/dialog"
import type { PromptInfo } from "../../prompt/history"
export function DialogTimeline(props: { export function DialogTimeline(props: {
sessionID: string sessionID: string
onMove: (messageID: string) => void onMove: (messageID: string) => void
setPrompt?: (prompt: PromptInfo) => void
}) { }) {
const data = useData() const data = useData()
const dialog = useDialog() const dialog = useDialog()
@@ -26,7 +28,9 @@ export function DialogTimeline(props: {
value: message.id, value: message.id,
footer: Locale.time(message.time.created), footer: Locale.time(message.time.created),
onSelect: (dialog) => { onSelect: (dialog) => {
dialog.replace(() => <DialogMessage messageID={message.id} sessionID={props.sessionID} />) dialog.replace(() => (
<DialogMessage messageID={message.id} sessionID={props.sessionID} setPrompt={props.setPrompt} />
))
}, },
}) })
} }
+10 -1
View File
@@ -53,6 +53,7 @@ import { useDialog } from "../../ui/dialog"
import { DialogSessionRename } from "../../component/dialog-session-rename" import { DialogSessionRename } from "../../component/dialog-session-rename"
import { DialogMessage } from "./dialog-message" import { DialogMessage } from "./dialog-message"
import { DialogFork } from "./dialog-fork" import { DialogFork } from "./dialog-fork"
import { DialogTimeline } from "./dialog-timeline"
import { Sidebar } from "./sidebar" import { Sidebar } from "./sidebar"
import { Composer } from "./composer" import { Composer } from "./composer"
import { filetype } from "../../util/filetype" import { filetype } from "../../util/filetype"
@@ -458,7 +459,15 @@ export function Session() {
id: "session.timeline", id: "session.timeline",
group: "Session", group: "Session",
slash: { name: "timeline" }, slash: { name: "timeline" },
run: () => unavailable("The message timeline"), run: () => {
dialog.replace(() => (
<DialogTimeline
sessionID={route.sessionID}
onMove={jumpToMessage}
setPrompt={(value) => promptRef.current?.set(value)}
/>
))
},
}, },
{ {
title: "Fork session", title: "Fork session",