From 13dedb802736c41a6503741e82fe37cfef048c06 Mon Sep 17 00:00:00 2001 From: Dax Raad Date: Sun, 28 Sep 2025 03:56:37 -0400 Subject: [PATCH] sync --- .../cmd/tui/component/prompt/autocomplete.tsx | 39 +----------- .../src/cli/cmd/tui/routes/session/index.tsx | 59 ++++++++++++++++++- 2 files changed, 60 insertions(+), 38 deletions(-) diff --git a/packages/opencode/src/cli/cmd/tui/component/prompt/autocomplete.tsx b/packages/opencode/src/cli/cmd/tui/component/prompt/autocomplete.tsx index 1353551ca..44e623654 100644 --- a/packages/opencode/src/cli/cmd/tui/component/prompt/autocomplete.tsx +++ b/packages/opencode/src/cli/cmd/tui/component/prompt/autocomplete.tsx @@ -110,47 +110,12 @@ export function Autocomplete(props: { { display: "/undo", description: "undo the last message", - onSelect: () => { - const revert = s.revert?.messageID - const message = (sync.data.message[s.id] ?? []).findLast( - (x) => (!revert || x.id < revert) && x.role === "user", - ) - if (!message) return - sdk.session.revert({ - path: { - id: s.id, - }, - body: { - messageID: message.id, - }, - }) - }, + onSelect: () => command.trigger("session.undo"), }, { display: "/redo", description: "redo the last message", - onSelect: () => { - const messageID = s.revert?.messageID - if (!messageID) return - const messages = sync.data.message[s.id] ?? [] - const message = messages.find((x) => x.role === "user" && x.id > messageID) - if (!message) { - sdk.session.unrevert({ - path: { - id: s.id, - }, - }) - return - } - sdk.session.revert({ - path: { - id: s.id, - }, - body: { - messageID: message.id, - }, - }) - }, + onSelect: () => command.trigger("session.redo"), }, { display: "/compact", diff --git a/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx b/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx index 1e0c9ba67..97484ae82 100644 --- a/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx +++ b/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx @@ -48,6 +48,10 @@ export function Session() { if (keybind.match("messages_page_down", evt)) scroll.scrollBy(scroll.height / 2) }) + function toBottom() { + scroll.scrollTo(scroll.scrollHeight) + } + const local = useLocal() const command = useCommandDialog() @@ -100,6 +104,59 @@ export function Session() { dialog.clear() }, }, + { + title: "Undo", + value: "session.undo", + keybind: "messages_undo", + category: "Session", + onSelect: (dialog) => { + const revert = session().revert?.messageID + const message = messages().findLast((x) => (!revert || x.id < revert) && x.role === "user") + if (!message) return + sdk.session + .revert({ + path: { + id: route.sessionID, + }, + body: { + messageID: message.id, + }, + }) + .then(() => setTimeout(() => toBottom(), 100)) + dialog.clear() + }, + }, + { + title: "Redo", + value: "session.redo", + keybind: "messages_redo", + category: "Session", + onSelect: () => { + const messageID = session().revert?.messageID + if (!messageID) return + const message = messages().find((x) => x.role === "user" && x.id > messageID) + if (!message) { + sdk.session + .unrevert({ + path: { + id: route.sessionID, + }, + }) + .then(() => setTimeout(() => toBottom(), 100)) + return + } + sdk.session + .revert({ + path: { + id: route.sessionID, + }, + body: { + messageID: message.id, + }, + }) + .then(() => setTimeout(() => toBottom(), 100)) + }, + }, ]) const revert = createMemo(() => { @@ -178,7 +235,7 @@ export function Session() { { - scroll.scrollTo(scroll.scrollHeight) + toBottom() }} sessionID={route.sessionID} />