From 55d6e8903de0cd34bd6e971d839606bfd0cbd4bb Mon Sep 17 00:00:00 2001
From: Jay <53023+jayair@users.noreply.github.com>
Date: Sat, 18 Jul 2026 00:09:03 +0000
Subject: [PATCH 1/2] fix(app): disable undo without git
---
packages/app/src/i18n/ar.ts | 1 +
packages/app/src/i18n/br.ts | 1 +
packages/app/src/i18n/bs.ts | 1 +
packages/app/src/i18n/da.ts | 1 +
packages/app/src/i18n/de.ts | 1 +
packages/app/src/i18n/en.ts | 1 +
packages/app/src/i18n/es.ts | 1 +
packages/app/src/i18n/fr.ts | 1 +
packages/app/src/i18n/ja.ts | 1 +
packages/app/src/i18n/ko.ts | 1 +
packages/app/src/i18n/no.ts | 1 +
packages/app/src/i18n/pl.ts | 1 +
packages/app/src/i18n/ru.ts | 1 +
packages/app/src/i18n/th.ts | 1 +
packages/app/src/i18n/tr.ts | 1 +
packages/app/src/i18n/uk.ts | 1 +
packages/app/src/i18n/zh.ts | 1 +
packages/app/src/i18n/zht.ts | 1 +
packages/app/src/pages/session.tsx | 20 +++++++--
.../session-composer-region-controller.ts | 1 +
.../composer/session-composer-region.tsx | 2 +
.../session/composer/session-revert-dock.tsx | 43 +++++++++++--------
.../session/session-history-actions.test.ts | 28 ++++++++++++
.../pages/session/session-history-actions.ts | 17 ++++++++
.../pages/session/use-session-commands.tsx | 19 ++++++--
.../src/components/message-part.tsx | 6 ++-
26 files changed, 127 insertions(+), 27 deletions(-)
create mode 100644 packages/app/src/pages/session/session-history-actions.test.ts
create mode 100644 packages/app/src/pages/session/session-history-actions.ts
diff --git a/packages/app/src/i18n/ar.ts b/packages/app/src/i18n/ar.ts
index 3a992b5d07d4..d75605a94f3f 100644
--- a/packages/app/src/i18n/ar.ts
+++ b/packages/app/src/i18n/ar.ts
@@ -75,6 +75,7 @@ export const dict = {
"command.workspace.toggle.description": "تمكين أو تعطيل مساحات العمل المتعددة في الشريط الجانبي",
"command.session.undo": "تراجع",
"command.session.undo.description": "تراجع عن الرسالة الأخيرة",
+ "command.session.undo.gitRequired": "التراجع غير متاح لأن هذا المشروع لا يستخدم Git.",
"command.session.redo": "إعادة",
"command.session.redo.description": "إعادة الرسالة التي تم التراجع عنها",
"command.session.compact": "ضغط الجلسة",
diff --git a/packages/app/src/i18n/br.ts b/packages/app/src/i18n/br.ts
index e8674cd547e6..baa0eeeefb1a 100644
--- a/packages/app/src/i18n/br.ts
+++ b/packages/app/src/i18n/br.ts
@@ -75,6 +75,7 @@ export const dict = {
"command.workspace.toggle.description": "Habilitar ou desabilitar múltiplos espaços de trabalho na barra lateral",
"command.session.undo": "Desfazer",
"command.session.undo.description": "Desfazer a última mensagem",
+ "command.session.undo.gitRequired": "Desfazer não está disponível porque este projeto não usa Git.",
"command.session.redo": "Refazer",
"command.session.redo.description": "Refazer a última mensagem desfeita",
"command.session.compact": "Compactar sessão",
diff --git a/packages/app/src/i18n/bs.ts b/packages/app/src/i18n/bs.ts
index 7796afd3657e..e58b348e1e17 100644
--- a/packages/app/src/i18n/bs.ts
+++ b/packages/app/src/i18n/bs.ts
@@ -81,6 +81,7 @@ export const dict = {
"command.workspace.toggle.description": "Omogući ili onemogući više radnih prostora u bočnoj traci",
"command.session.undo": "Poništi",
"command.session.undo.description": "Poništi posljednju poruku",
+ "command.session.undo.gitRequired": "Poništavanje nije dostupno jer ovaj projekat ne koristi Git.",
"command.session.redo": "Vrati",
"command.session.redo.description": "Vrati posljednju poništenu poruku",
"command.session.compact": "Sažmi sesiju",
diff --git a/packages/app/src/i18n/da.ts b/packages/app/src/i18n/da.ts
index 79039ae7e1a7..36cb5ca431a3 100644
--- a/packages/app/src/i18n/da.ts
+++ b/packages/app/src/i18n/da.ts
@@ -81,6 +81,7 @@ export const dict = {
"command.workspace.toggle.description": "Aktiver eller deaktiver flere arbejdsområder i sidebjælken",
"command.session.undo": "Fortryd",
"command.session.undo.description": "Fortryd den sidste besked",
+ "command.session.undo.gitRequired": "Fortryd er ikke tilgængelig, fordi dette projekt ikke bruger Git.",
"command.session.redo": "Omgør",
"command.session.redo.description": "Omgør den sidste fortrudte besked",
"command.session.compact": "Komprimér session",
diff --git a/packages/app/src/i18n/de.ts b/packages/app/src/i18n/de.ts
index f267ff2f5f23..d67d0af982b3 100644
--- a/packages/app/src/i18n/de.ts
+++ b/packages/app/src/i18n/de.ts
@@ -79,6 +79,7 @@ export const dict = {
"command.workspace.toggle.description": "Mehrere Arbeitsbereiche in der Seitenleiste aktivieren oder deaktivieren",
"command.session.undo": "Rückgängig",
"command.session.undo.description": "Letzte Nachricht rückgängig machen",
+ "command.session.undo.gitRequired": "Rückgängig ist nicht verfügbar, da dieses Projekt Git nicht verwendet.",
"command.session.redo": "Wiederherstellen",
"command.session.redo.description": "Letzte rückgängig gemachte Nachricht wiederherstellen",
"command.session.compact": "Sitzung komprimieren",
diff --git a/packages/app/src/i18n/en.ts b/packages/app/src/i18n/en.ts
index 1a2d66ecc251..201e3c299dd0 100644
--- a/packages/app/src/i18n/en.ts
+++ b/packages/app/src/i18n/en.ts
@@ -81,6 +81,7 @@ export const dict = {
"command.workspace.toggle.description": "Enable or disable multiple workspaces in the sidebar",
"command.session.undo": "Undo",
"command.session.undo.description": "Undo the last message",
+ "command.session.undo.gitRequired": "Undo is unavailable because this project does not use Git.",
"command.session.redo": "Redo",
"command.session.redo.description": "Redo the last undone message",
"command.session.compact": "Compact session",
diff --git a/packages/app/src/i18n/es.ts b/packages/app/src/i18n/es.ts
index 1412d7dea30f..960d608ab21b 100644
--- a/packages/app/src/i18n/es.ts
+++ b/packages/app/src/i18n/es.ts
@@ -81,6 +81,7 @@ export const dict = {
"command.workspace.toggle.description": "Habilitar o deshabilitar múltiples espacios de trabajo en la barra lateral",
"command.session.undo": "Deshacer",
"command.session.undo.description": "Deshacer el último mensaje",
+ "command.session.undo.gitRequired": "Deshacer no está disponible porque este proyecto no usa Git.",
"command.session.redo": "Rehacer",
"command.session.redo.description": "Rehacer el último mensaje deshecho",
"command.session.compact": "Compactar sesión",
diff --git a/packages/app/src/i18n/fr.ts b/packages/app/src/i18n/fr.ts
index 2df7c88c287e..ede89294e696 100644
--- a/packages/app/src/i18n/fr.ts
+++ b/packages/app/src/i18n/fr.ts
@@ -75,6 +75,7 @@ export const dict = {
"command.workspace.toggle.description": "Activer ou désactiver plusieurs espaces de travail dans la barre latérale",
"command.session.undo": "Annuler",
"command.session.undo.description": "Annuler le dernier message",
+ "command.session.undo.gitRequired": "Annuler n’est pas disponible car ce projet n’utilise pas Git.",
"command.session.redo": "Rétablir",
"command.session.redo.description": "Rétablir le dernier message annulé",
"command.session.compact": "Compacter la session",
diff --git a/packages/app/src/i18n/ja.ts b/packages/app/src/i18n/ja.ts
index 3a02aac430f1..48343067b0af 100644
--- a/packages/app/src/i18n/ja.ts
+++ b/packages/app/src/i18n/ja.ts
@@ -75,6 +75,7 @@ export const dict = {
"command.workspace.toggle.description": "サイドバーでの複数のワークスペースの有効化・無効化",
"command.session.undo": "元に戻す",
"command.session.undo.description": "最後のメッセージを元に戻す",
+ "command.session.undo.gitRequired": "このプロジェクトは Git を使用していないため、元に戻すは利用できません。",
"command.session.redo": "やり直す",
"command.session.redo.description": "元に戻したメッセージをやり直す",
"command.session.compact": "セッションを圧縮",
diff --git a/packages/app/src/i18n/ko.ts b/packages/app/src/i18n/ko.ts
index 233b8c8b5940..2e0831f9bad0 100644
--- a/packages/app/src/i18n/ko.ts
+++ b/packages/app/src/i18n/ko.ts
@@ -71,6 +71,7 @@ export const dict = {
"command.workspace.toggle.description": "사이드바에서 다중 작업 공간 활성화 또는 비활성화",
"command.session.undo": "실행 취소",
"command.session.undo.description": "마지막 메시지 실행 취소",
+ "command.session.undo.gitRequired": "이 프로젝트는 Git을 사용하지 않으므로 실행 취소를 사용할 수 없습니다.",
"command.session.redo": "다시 실행",
"command.session.redo.description": "마지막 실행 취소된 메시지 다시 실행",
"command.session.compact": "세션 압축",
diff --git a/packages/app/src/i18n/no.ts b/packages/app/src/i18n/no.ts
index 3f4e859dc70c..b12ace683f78 100644
--- a/packages/app/src/i18n/no.ts
+++ b/packages/app/src/i18n/no.ts
@@ -80,6 +80,7 @@ export const dict = {
"command.workspace.toggle.description": "Aktiver eller deaktiver flere arbeidsområder i sidefeltet",
"command.session.undo": "Angre",
"command.session.undo.description": "Angre siste melding",
+ "command.session.undo.gitRequired": "Angre er utilgjengelig fordi dette prosjektet ikke bruker Git.",
"command.session.redo": "Gjør om",
"command.session.redo.description": "Gjør om siste angrede melding",
"command.session.compact": "Komprimer sesjon",
diff --git a/packages/app/src/i18n/pl.ts b/packages/app/src/i18n/pl.ts
index a94c3e2766e3..6efc09a3bd2d 100644
--- a/packages/app/src/i18n/pl.ts
+++ b/packages/app/src/i18n/pl.ts
@@ -75,6 +75,7 @@ export const dict = {
"command.workspace.toggle.description": "Włącz lub wyłącz wiele przestrzeni roboczych na pasku bocznym",
"command.session.undo": "Cofnij",
"command.session.undo.description": "Cofnij ostatnią wiadomość",
+ "command.session.undo.gitRequired": "Cofanie jest niedostępne, ponieważ ten projekt nie używa Git.",
"command.session.redo": "Ponów",
"command.session.redo.description": "Ponów ostatnią cofniętą wiadomość",
"command.session.compact": "Kompaktuj sesję",
diff --git a/packages/app/src/i18n/ru.ts b/packages/app/src/i18n/ru.ts
index 8a781f23f580..ebddf5918889 100644
--- a/packages/app/src/i18n/ru.ts
+++ b/packages/app/src/i18n/ru.ts
@@ -81,6 +81,7 @@ export const dict = {
"command.workspace.toggle.description": "Включить или отключить несколько рабочих пространств в боковой панели",
"command.session.undo": "Отменить",
"command.session.undo.description": "Отменить последнее сообщение",
+ "command.session.undo.gitRequired": "Отмена недоступна, потому что этот проект не использует Git.",
"command.session.redo": "Повторить",
"command.session.redo.description": "Повторить отменённое сообщение",
"command.session.compact": "Сжать сессию",
diff --git a/packages/app/src/i18n/th.ts b/packages/app/src/i18n/th.ts
index 089a87d2e4a9..5eae5acd382a 100644
--- a/packages/app/src/i18n/th.ts
+++ b/packages/app/src/i18n/th.ts
@@ -81,6 +81,7 @@ export const dict = {
"command.workspace.toggle.description": "เปิดหรือปิดใช้งานพื้นที่ทำงานหลายรายการในแถบด้านข้าง",
"command.session.undo": "ยกเลิก",
"command.session.undo.description": "ยกเลิกข้อความล่าสุด",
+ "command.session.undo.gitRequired": "ไม่สามารถเลิกทำได้เนื่องจากโปรเจกต์นี้ไม่ได้ใช้ Git",
"command.session.redo": "ทำซ้ำ",
"command.session.redo.description": "ทำซ้ำข้อความที่ถูกยกเลิกล่าสุด",
"command.session.compact": "บีบอัดเซสชัน",
diff --git a/packages/app/src/i18n/tr.ts b/packages/app/src/i18n/tr.ts
index c3b4e262a7f0..437e60809370 100644
--- a/packages/app/src/i18n/tr.ts
+++ b/packages/app/src/i18n/tr.ts
@@ -85,6 +85,7 @@ export const dict = {
"command.workspace.toggle.description": "Kenar çubuğunda birden fazla çalışma alanını göster veya gizle",
"command.session.undo": "Geri al",
"command.session.undo.description": "Son mesajı geri al",
+ "command.session.undo.gitRequired": "Bu proje Git kullanmadığı için geri alma kullanılamıyor.",
"command.session.redo": "Yinele",
"command.session.redo.description": "Son geri alınan mesajı yinele",
"command.session.compact": "Oturumu sıkıştır",
diff --git a/packages/app/src/i18n/uk.ts b/packages/app/src/i18n/uk.ts
index db6f0abd5fc8..91fab3560120 100644
--- a/packages/app/src/i18n/uk.ts
+++ b/packages/app/src/i18n/uk.ts
@@ -81,6 +81,7 @@ export const dict = {
"command.workspace.toggle.description": "Увімкнути або вимкнути декілька робочих областей на бічній панелі",
"command.session.undo": "Скасувати",
"command.session.undo.description": "Скасувати останнє повідомлення",
+ "command.session.undo.gitRequired": "Скасування недоступне, оскільки цей проєкт не використовує Git.",
"command.session.redo": "Повторити",
"command.session.redo.description": "Повторити останнє скасоване повідомлення",
"command.session.compact": "Стиснути сесію",
diff --git a/packages/app/src/i18n/zh.ts b/packages/app/src/i18n/zh.ts
index 79701ee40660..bead784c490c 100644
--- a/packages/app/src/i18n/zh.ts
+++ b/packages/app/src/i18n/zh.ts
@@ -108,6 +108,7 @@ export const dict = {
"command.session.undo": "撤销",
"command.session.undo.description": "撤销上一条消息",
+ "command.session.undo.gitRequired": "此项目未使用 Git,因此无法撤销。",
"command.session.redo": "重做",
"command.session.redo.description": "重做上一条撤销的消息",
"command.session.compact": "精简会话",
diff --git a/packages/app/src/i18n/zht.ts b/packages/app/src/i18n/zht.ts
index f53aa02dc934..34b7b21c9452 100644
--- a/packages/app/src/i18n/zht.ts
+++ b/packages/app/src/i18n/zht.ts
@@ -85,6 +85,7 @@ export const dict = {
"command.workspace.toggle.description": "在側邊欄啟用或停用多個工作區",
"command.session.undo": "復原",
"command.session.undo.description": "復原上一則訊息",
+ "command.session.undo.gitRequired": "此專案未使用 Git,因此無法復原。",
"command.session.redo": "重做",
"command.session.redo.description": "重做上一則復原的訊息",
"command.session.compact": "精簡工作階段",
diff --git a/packages/app/src/pages/session.tsx b/packages/app/src/pages/session.tsx
index 2327cbf735b1..9ecb4d6df4d8 100644
--- a/packages/app/src/pages/session.tsx
+++ b/packages/app/src/pages/session.tsx
@@ -92,6 +92,7 @@ import { TerminalPanel } from "@/pages/session/terminal-panel"
import { TerminalPanelV2 } from "@/pages/session/terminal-panel-v2"
import { useComposerCommands } from "@/pages/session/use-composer-commands"
import { useSessionCommands } from "@/pages/session/use-session-commands"
+import { supportsSessionHistory } from "@/pages/session/session-history-actions"
import { useSessionHashScroll } from "@/pages/session/use-session-hash-scroll"
import { Identifier } from "@/utils/id"
import { diffs as list } from "@/utils/diffs"
@@ -650,6 +651,7 @@ export default function Page() {
}, desktopReviewOpen())
const turnDiffs = createMemo(() => list(lastUserMessage()?.summary?.diffs))
+ const git = createMemo(() => supportsSessionHistory(sync().project?.vcs))
const nogit = createMemo(() => {
const project = sync().project
return !!project && project.vcs !== "git"
@@ -1915,12 +1917,12 @@ export default function Page() {
const restoring = createMemo(() => (restoreMutation.isPending ? restoreMutation.variables : undefined))
const revert = (input: { sessionID: string; messageID: string }) => {
- if (reverting()) return
+ if (reverting() || !git()) return
return revertMutation.mutateAsync(input)
}
const restore = (id: string) => {
- if (!params.id || reverting()) return
+ if (!params.id || reverting() || !git()) return
return restoreMutation.mutateAsync(id)
}
@@ -1955,7 +1957,16 @@ export default function Page() {
download()
}
- const actions = { revert, openAttachment }
+ const actions = {
+ revert,
+ get revertDisabled() {
+ return !git()
+ },
+ get revertDisabledReason() {
+ return nogit() ? language.t("command.session.undo.gitRequired") : undefined
+ },
+ openAttachment,
+ }
createEffect(() => {
const sessionID = params.id
@@ -2187,7 +2198,8 @@ export default function Page() {
? {
items: rolled(),
restoring: restoring(),
- disabled: reverting(),
+ disabled: reverting() || !git(),
+ disabledReason: nogit() ? language.t("command.session.undo.gitRequired") : undefined,
onRestore: restore,
}
: undefined,
diff --git a/packages/app/src/pages/session/composer/session-composer-region-controller.ts b/packages/app/src/pages/session/composer/session-composer-region-controller.ts
index 4073f1c19174..92fdbbfeafea 100644
--- a/packages/app/src/pages/session/composer/session-composer-region-controller.ts
+++ b/packages/app/src/pages/session/composer/session-composer-region-controller.ts
@@ -18,6 +18,7 @@ export type SessionComposerRevertDock = {
items: { id: string; text: string }[]
restoring?: string
disabled?: boolean
+ disabledReason?: string
onRestore: (id: string) => void
}
diff --git a/packages/app/src/pages/session/composer/session-composer-region.tsx b/packages/app/src/pages/session/composer/session-composer-region.tsx
index 600ff41e3def..667c03248c81 100644
--- a/packages/app/src/pages/session/composer/session-composer-region.tsx
+++ b/packages/app/src/pages/session/composer/session-composer-region.tsx
@@ -93,6 +93,7 @@ export function SessionComposerRegion(props: {
items={revert.items}
restoring={revert.restoring}
disabled={revert.disabled}
+ disabledReason={revert.disabledReason}
onRestore={revert.onRestore}
/>
@@ -118,6 +119,7 @@ export function SessionComposerRegion(props: {
items={revert.items}
restoring={revert.restoring}
disabled={revert.disabled}
+ disabledReason={revert.disabledReason}
onRestore={revert.onRestore}
/>
diff --git a/packages/app/src/pages/session/composer/session-revert-dock.tsx b/packages/app/src/pages/session/composer/session-revert-dock.tsx
index d8f022a53780..2ef2490dc77d 100644
--- a/packages/app/src/pages/session/composer/session-revert-dock.tsx
+++ b/packages/app/src/pages/session/composer/session-revert-dock.tsx
@@ -6,6 +6,8 @@ import { IconButton } from "@opencode-ai/ui/icon-button"
import { ButtonV2 } from "@opencode-ai/ui/v2/button-v2"
import { Icon as IconV2 } from "@opencode-ai/ui/v2/icon"
import { IconButtonV2 } from "@opencode-ai/ui/v2/icon-button-v2"
+import { Tooltip } from "@opencode-ai/ui/tooltip"
+import { TooltipV2 } from "@opencode-ai/ui/v2/tooltip-v2"
import { useLanguage } from "@/context/language"
import { useSettings } from "@/context/settings"
@@ -13,6 +15,7 @@ export function SessionRevertDock(props: {
items: { id: string; text: string }[]
restoring?: string
disabled?: boolean
+ disabledReason?: string
onRestore: (id: string) => void
}) {
const language = useLanguage()
@@ -89,15 +92,17 @@ export function SessionRevertDock(props: {
{(item) => (
{item.text}
-
+
+
+
)}
@@ -167,15 +172,17 @@ export function SessionRevertDock(props: {
{item.text}
- props.onRestore(item.id)}
- >
- {language.t("session.revertDock.restore")}
-
+
+ props.onRestore(item.id)}
+ >
+ {language.t("session.revertDock.restore")}
+
+
)}
diff --git a/packages/app/src/pages/session/session-history-actions.test.ts b/packages/app/src/pages/session/session-history-actions.test.ts
new file mode 100644
index 000000000000..bfcfb8ef9c9e
--- /dev/null
+++ b/packages/app/src/pages/session/session-history-actions.test.ts
@@ -0,0 +1,28 @@
+import { describe, expect, test } from "bun:test"
+import { commandPaletteOptions } from "@/context/command"
+import { sessionHistoryActions } from "./session-history-actions"
+
+describe("sessionHistoryActions", () => {
+ test("enables session history actions for Git projects", () => {
+ expect(
+ sessionHistoryActions({
+ vcs: "git",
+ sessionID: "session-1",
+ hasVisibleUserMessage: true,
+ hasRevert: true,
+ }),
+ ).toEqual({ undo: true, redo: true, revert: true })
+ })
+
+ test("disables session history actions for non-Git projects", () => {
+ const actions = sessionHistoryActions({
+ vcs: undefined,
+ sessionID: "session-1",
+ hasVisibleUserMessage: true,
+ hasRevert: true,
+ })
+
+ expect(actions).toEqual({ undo: false, redo: false, revert: false })
+ expect(commandPaletteOptions([{ id: "session.undo", title: "Undo", disabled: !actions.undo }])).toEqual([])
+ })
+})
diff --git a/packages/app/src/pages/session/session-history-actions.ts b/packages/app/src/pages/session/session-history-actions.ts
new file mode 100644
index 000000000000..e0256b99cfce
--- /dev/null
+++ b/packages/app/src/pages/session/session-history-actions.ts
@@ -0,0 +1,17 @@
+export function supportsSessionHistory(vcs?: string) {
+ return vcs === "git"
+}
+
+export function sessionHistoryActions(input: {
+ vcs?: string
+ sessionID?: string
+ hasVisibleUserMessage: boolean
+ hasRevert: boolean
+}) {
+ const git = supportsSessionHistory(input.vcs)
+ return {
+ undo: git && !!input.sessionID && input.hasVisibleUserMessage,
+ redo: git && !!input.sessionID && input.hasRevert,
+ revert: git,
+ }
+}
diff --git a/packages/app/src/pages/session/use-session-commands.tsx b/packages/app/src/pages/session/use-session-commands.tsx
index 275e6ec4bc22..61673a77fdca 100644
--- a/packages/app/src/pages/session/use-session-commands.tsx
+++ b/packages/app/src/pages/session/use-session-commands.tsx
@@ -19,6 +19,7 @@ import { extractPromptFromParts } from "@/utils/prompt"
import { UserMessage } from "@opencode-ai/sdk/v2"
import { useSessionLayout } from "@/pages/session/session-layout"
import { createSessionOwnership } from "./session-ownership"
+import { sessionHistoryActions } from "./session-history-actions"
export type SessionCommandContext = {
navigateMessageByOffset: (offset: number) => void
@@ -101,6 +102,13 @@ export const useSessionCommands = (actions: SessionCommandContext) => {
if (!revert) return userMessages()
return userMessages().filter((m) => m.id < revert)
}
+ const historyActions = () =>
+ sessionHistoryActions({
+ vcs: sync().project?.vcs,
+ sessionID: params.id,
+ hasVisibleUserMessage: visibleUserMessages().length > 0,
+ hasRevert: !!info()?.revert?.messageID,
+ })
const showAllFiles = () => {
if (layout.fileTree.tab() !== "changes") return
@@ -303,6 +311,7 @@ export const useSessionCommands = (actions: SessionCommandContext) => {
}
const undo = async () => {
+ if (!historyActions().undo) return
const sessionID = params.id
if (!sessionID) return
const owner = sessionOwnership.capture()
@@ -331,6 +340,7 @@ export const useSessionCommands = (actions: SessionCommandContext) => {
}
const redo = async () => {
+ if (!historyActions().redo) return
const sessionID = params.id
if (!sessionID) return
const owner = sessionOwnership.capture()
@@ -430,9 +440,12 @@ export const useSessionCommands = (actions: SessionCommandContext) => {
sessionCommand({
id: "session.undo",
title: language.t("command.session.undo"),
- description: language.t("command.session.undo.description"),
+ description:
+ sync().project && sync().project?.vcs !== "git"
+ ? language.t("command.session.undo.gitRequired")
+ : language.t("command.session.undo.description"),
slash: "undo",
- disabled: !params.id || visibleUserMessages().length === 0,
+ disabled: !historyActions().undo,
onSelect: undo,
}),
sessionCommand({
@@ -440,7 +453,7 @@ export const useSessionCommands = (actions: SessionCommandContext) => {
title: language.t("command.session.redo"),
description: language.t("command.session.redo.description"),
slash: "redo",
- disabled: !params.id || !info()?.revert?.messageID,
+ disabled: !historyActions().redo,
onSelect: redo,
}),
sessionCommand({
diff --git a/packages/session-ui/src/components/message-part.tsx b/packages/session-ui/src/components/message-part.tsx
index 601d7839ef97..6d05e6a358a6 100644
--- a/packages/session-ui/src/components/message-part.tsx
+++ b/packages/session-ui/src/components/message-part.tsx
@@ -178,6 +178,8 @@ export type SessionAction = (input: { sessionID: string; messageID: string }) =>
export type UserActions = {
fork?: SessionAction
revert?: SessionAction
+ revertDisabled?: boolean
+ revertDisabledReason?: JSX.Element
openAttachment?: (file: FilePart) => void
}
@@ -1380,9 +1382,9 @@ export function UserMessageDisplay(props: {
event.preventDefault()}
onClick={(event) => {
event.stopPropagation()
From 6cf2c80a98207acfe956fdf505315162ad327348 Mon Sep 17 00:00:00 2001
From: Jay <53023+jayair@users.noreply.github.com>
Date: Sat, 18 Jul 2026 00:21:23 +0000
Subject: [PATCH 2/2] fix(app): shorten undo tooltip
---
packages/app/src/i18n/ar.ts | 2 +-
packages/app/src/i18n/br.ts | 2 +-
packages/app/src/i18n/bs.ts | 2 +-
packages/app/src/i18n/da.ts | 2 +-
packages/app/src/i18n/de.ts | 2 +-
packages/app/src/i18n/en.ts | 2 +-
packages/app/src/i18n/es.ts | 2 +-
packages/app/src/i18n/fr.ts | 2 +-
packages/app/src/i18n/ja.ts | 2 +-
packages/app/src/i18n/ko.ts | 2 +-
packages/app/src/i18n/no.ts | 2 +-
packages/app/src/i18n/pl.ts | 2 +-
packages/app/src/i18n/ru.ts | 2 +-
packages/app/src/i18n/th.ts | 2 +-
packages/app/src/i18n/tr.ts | 2 +-
packages/app/src/i18n/uk.ts | 2 +-
packages/app/src/i18n/zh.ts | 2 +-
packages/app/src/i18n/zht.ts | 2 +-
18 files changed, 18 insertions(+), 18 deletions(-)
diff --git a/packages/app/src/i18n/ar.ts b/packages/app/src/i18n/ar.ts
index d75605a94f3f..e2421493c2e3 100644
--- a/packages/app/src/i18n/ar.ts
+++ b/packages/app/src/i18n/ar.ts
@@ -75,7 +75,7 @@ export const dict = {
"command.workspace.toggle.description": "تمكين أو تعطيل مساحات العمل المتعددة في الشريط الجانبي",
"command.session.undo": "تراجع",
"command.session.undo.description": "تراجع عن الرسالة الأخيرة",
- "command.session.undo.gitRequired": "التراجع غير متاح لأن هذا المشروع لا يستخدم Git.",
+ "command.session.undo.gitRequired": "لم يتم اكتشاف مستودع Git",
"command.session.redo": "إعادة",
"command.session.redo.description": "إعادة الرسالة التي تم التراجع عنها",
"command.session.compact": "ضغط الجلسة",
diff --git a/packages/app/src/i18n/br.ts b/packages/app/src/i18n/br.ts
index baa0eeeefb1a..8a20ca877144 100644
--- a/packages/app/src/i18n/br.ts
+++ b/packages/app/src/i18n/br.ts
@@ -75,7 +75,7 @@ export const dict = {
"command.workspace.toggle.description": "Habilitar ou desabilitar múltiplos espaços de trabalho na barra lateral",
"command.session.undo": "Desfazer",
"command.session.undo.description": "Desfazer a última mensagem",
- "command.session.undo.gitRequired": "Desfazer não está disponível porque este projeto não usa Git.",
+ "command.session.undo.gitRequired": "Nenhum repositório Git detectado",
"command.session.redo": "Refazer",
"command.session.redo.description": "Refazer a última mensagem desfeita",
"command.session.compact": "Compactar sessão",
diff --git a/packages/app/src/i18n/bs.ts b/packages/app/src/i18n/bs.ts
index e58b348e1e17..211e81b89b6d 100644
--- a/packages/app/src/i18n/bs.ts
+++ b/packages/app/src/i18n/bs.ts
@@ -81,7 +81,7 @@ export const dict = {
"command.workspace.toggle.description": "Omogući ili onemogući više radnih prostora u bočnoj traci",
"command.session.undo": "Poništi",
"command.session.undo.description": "Poništi posljednju poruku",
- "command.session.undo.gitRequired": "Poništavanje nije dostupno jer ovaj projekat ne koristi Git.",
+ "command.session.undo.gitRequired": "Git repozitorij nije otkriven",
"command.session.redo": "Vrati",
"command.session.redo.description": "Vrati posljednju poništenu poruku",
"command.session.compact": "Sažmi sesiju",
diff --git a/packages/app/src/i18n/da.ts b/packages/app/src/i18n/da.ts
index 36cb5ca431a3..b97a5713ebb3 100644
--- a/packages/app/src/i18n/da.ts
+++ b/packages/app/src/i18n/da.ts
@@ -81,7 +81,7 @@ export const dict = {
"command.workspace.toggle.description": "Aktiver eller deaktiver flere arbejdsområder i sidebjælken",
"command.session.undo": "Fortryd",
"command.session.undo.description": "Fortryd den sidste besked",
- "command.session.undo.gitRequired": "Fortryd er ikke tilgængelig, fordi dette projekt ikke bruger Git.",
+ "command.session.undo.gitRequired": "Intet Git-repository fundet",
"command.session.redo": "Omgør",
"command.session.redo.description": "Omgør den sidste fortrudte besked",
"command.session.compact": "Komprimér session",
diff --git a/packages/app/src/i18n/de.ts b/packages/app/src/i18n/de.ts
index d67d0af982b3..62876304435f 100644
--- a/packages/app/src/i18n/de.ts
+++ b/packages/app/src/i18n/de.ts
@@ -79,7 +79,7 @@ export const dict = {
"command.workspace.toggle.description": "Mehrere Arbeitsbereiche in der Seitenleiste aktivieren oder deaktivieren",
"command.session.undo": "Rückgängig",
"command.session.undo.description": "Letzte Nachricht rückgängig machen",
- "command.session.undo.gitRequired": "Rückgängig ist nicht verfügbar, da dieses Projekt Git nicht verwendet.",
+ "command.session.undo.gitRequired": "Kein Git-Repository erkannt",
"command.session.redo": "Wiederherstellen",
"command.session.redo.description": "Letzte rückgängig gemachte Nachricht wiederherstellen",
"command.session.compact": "Sitzung komprimieren",
diff --git a/packages/app/src/i18n/en.ts b/packages/app/src/i18n/en.ts
index 201e3c299dd0..e9442921d1bf 100644
--- a/packages/app/src/i18n/en.ts
+++ b/packages/app/src/i18n/en.ts
@@ -81,7 +81,7 @@ export const dict = {
"command.workspace.toggle.description": "Enable or disable multiple workspaces in the sidebar",
"command.session.undo": "Undo",
"command.session.undo.description": "Undo the last message",
- "command.session.undo.gitRequired": "Undo is unavailable because this project does not use Git.",
+ "command.session.undo.gitRequired": "No Git repository detected",
"command.session.redo": "Redo",
"command.session.redo.description": "Redo the last undone message",
"command.session.compact": "Compact session",
diff --git a/packages/app/src/i18n/es.ts b/packages/app/src/i18n/es.ts
index 960d608ab21b..34ef72ae83e7 100644
--- a/packages/app/src/i18n/es.ts
+++ b/packages/app/src/i18n/es.ts
@@ -81,7 +81,7 @@ export const dict = {
"command.workspace.toggle.description": "Habilitar o deshabilitar múltiples espacios de trabajo en la barra lateral",
"command.session.undo": "Deshacer",
"command.session.undo.description": "Deshacer el último mensaje",
- "command.session.undo.gitRequired": "Deshacer no está disponible porque este proyecto no usa Git.",
+ "command.session.undo.gitRequired": "No se detectó ningún repositorio Git",
"command.session.redo": "Rehacer",
"command.session.redo.description": "Rehacer el último mensaje deshecho",
"command.session.compact": "Compactar sesión",
diff --git a/packages/app/src/i18n/fr.ts b/packages/app/src/i18n/fr.ts
index ede89294e696..6c5dbdad962e 100644
--- a/packages/app/src/i18n/fr.ts
+++ b/packages/app/src/i18n/fr.ts
@@ -75,7 +75,7 @@ export const dict = {
"command.workspace.toggle.description": "Activer ou désactiver plusieurs espaces de travail dans la barre latérale",
"command.session.undo": "Annuler",
"command.session.undo.description": "Annuler le dernier message",
- "command.session.undo.gitRequired": "Annuler n’est pas disponible car ce projet n’utilise pas Git.",
+ "command.session.undo.gitRequired": "Aucun dépôt Git détecté",
"command.session.redo": "Rétablir",
"command.session.redo.description": "Rétablir le dernier message annulé",
"command.session.compact": "Compacter la session",
diff --git a/packages/app/src/i18n/ja.ts b/packages/app/src/i18n/ja.ts
index 48343067b0af..caa613943bbc 100644
--- a/packages/app/src/i18n/ja.ts
+++ b/packages/app/src/i18n/ja.ts
@@ -75,7 +75,7 @@ export const dict = {
"command.workspace.toggle.description": "サイドバーでの複数のワークスペースの有効化・無効化",
"command.session.undo": "元に戻す",
"command.session.undo.description": "最後のメッセージを元に戻す",
- "command.session.undo.gitRequired": "このプロジェクトは Git を使用していないため、元に戻すは利用できません。",
+ "command.session.undo.gitRequired": "Git リポジトリが検出されませんでした",
"command.session.redo": "やり直す",
"command.session.redo.description": "元に戻したメッセージをやり直す",
"command.session.compact": "セッションを圧縮",
diff --git a/packages/app/src/i18n/ko.ts b/packages/app/src/i18n/ko.ts
index 2e0831f9bad0..1dbe2cd2e451 100644
--- a/packages/app/src/i18n/ko.ts
+++ b/packages/app/src/i18n/ko.ts
@@ -71,7 +71,7 @@ export const dict = {
"command.workspace.toggle.description": "사이드바에서 다중 작업 공간 활성화 또는 비활성화",
"command.session.undo": "실행 취소",
"command.session.undo.description": "마지막 메시지 실행 취소",
- "command.session.undo.gitRequired": "이 프로젝트는 Git을 사용하지 않으므로 실행 취소를 사용할 수 없습니다.",
+ "command.session.undo.gitRequired": "Git 저장소가 감지되지 않았습니다",
"command.session.redo": "다시 실행",
"command.session.redo.description": "마지막 실행 취소된 메시지 다시 실행",
"command.session.compact": "세션 압축",
diff --git a/packages/app/src/i18n/no.ts b/packages/app/src/i18n/no.ts
index b12ace683f78..e359b1a7dcc9 100644
--- a/packages/app/src/i18n/no.ts
+++ b/packages/app/src/i18n/no.ts
@@ -80,7 +80,7 @@ export const dict = {
"command.workspace.toggle.description": "Aktiver eller deaktiver flere arbeidsområder i sidefeltet",
"command.session.undo": "Angre",
"command.session.undo.description": "Angre siste melding",
- "command.session.undo.gitRequired": "Angre er utilgjengelig fordi dette prosjektet ikke bruker Git.",
+ "command.session.undo.gitRequired": "Fant ikke noe Git-repositorium",
"command.session.redo": "Gjør om",
"command.session.redo.description": "Gjør om siste angrede melding",
"command.session.compact": "Komprimer sesjon",
diff --git a/packages/app/src/i18n/pl.ts b/packages/app/src/i18n/pl.ts
index 6efc09a3bd2d..3094c52e4456 100644
--- a/packages/app/src/i18n/pl.ts
+++ b/packages/app/src/i18n/pl.ts
@@ -75,7 +75,7 @@ export const dict = {
"command.workspace.toggle.description": "Włącz lub wyłącz wiele przestrzeni roboczych na pasku bocznym",
"command.session.undo": "Cofnij",
"command.session.undo.description": "Cofnij ostatnią wiadomość",
- "command.session.undo.gitRequired": "Cofanie jest niedostępne, ponieważ ten projekt nie używa Git.",
+ "command.session.undo.gitRequired": "Nie wykryto repozytorium Git",
"command.session.redo": "Ponów",
"command.session.redo.description": "Ponów ostatnią cofniętą wiadomość",
"command.session.compact": "Kompaktuj sesję",
diff --git a/packages/app/src/i18n/ru.ts b/packages/app/src/i18n/ru.ts
index ebddf5918889..15bc83525bfb 100644
--- a/packages/app/src/i18n/ru.ts
+++ b/packages/app/src/i18n/ru.ts
@@ -81,7 +81,7 @@ export const dict = {
"command.workspace.toggle.description": "Включить или отключить несколько рабочих пространств в боковой панели",
"command.session.undo": "Отменить",
"command.session.undo.description": "Отменить последнее сообщение",
- "command.session.undo.gitRequired": "Отмена недоступна, потому что этот проект не использует Git.",
+ "command.session.undo.gitRequired": "Репозиторий Git не обнаружен",
"command.session.redo": "Повторить",
"command.session.redo.description": "Повторить отменённое сообщение",
"command.session.compact": "Сжать сессию",
diff --git a/packages/app/src/i18n/th.ts b/packages/app/src/i18n/th.ts
index 5eae5acd382a..c2bfdefcf937 100644
--- a/packages/app/src/i18n/th.ts
+++ b/packages/app/src/i18n/th.ts
@@ -81,7 +81,7 @@ export const dict = {
"command.workspace.toggle.description": "เปิดหรือปิดใช้งานพื้นที่ทำงานหลายรายการในแถบด้านข้าง",
"command.session.undo": "ยกเลิก",
"command.session.undo.description": "ยกเลิกข้อความล่าสุด",
- "command.session.undo.gitRequired": "ไม่สามารถเลิกทำได้เนื่องจากโปรเจกต์นี้ไม่ได้ใช้ Git",
+ "command.session.undo.gitRequired": "ไม่พบที่เก็บ Git",
"command.session.redo": "ทำซ้ำ",
"command.session.redo.description": "ทำซ้ำข้อความที่ถูกยกเลิกล่าสุด",
"command.session.compact": "บีบอัดเซสชัน",
diff --git a/packages/app/src/i18n/tr.ts b/packages/app/src/i18n/tr.ts
index 437e60809370..2899af0912a2 100644
--- a/packages/app/src/i18n/tr.ts
+++ b/packages/app/src/i18n/tr.ts
@@ -85,7 +85,7 @@ export const dict = {
"command.workspace.toggle.description": "Kenar çubuğunda birden fazla çalışma alanını göster veya gizle",
"command.session.undo": "Geri al",
"command.session.undo.description": "Son mesajı geri al",
- "command.session.undo.gitRequired": "Bu proje Git kullanmadığı için geri alma kullanılamıyor.",
+ "command.session.undo.gitRequired": "Git deposu algılanmadı",
"command.session.redo": "Yinele",
"command.session.redo.description": "Son geri alınan mesajı yinele",
"command.session.compact": "Oturumu sıkıştır",
diff --git a/packages/app/src/i18n/uk.ts b/packages/app/src/i18n/uk.ts
index 91fab3560120..c7a243f1e221 100644
--- a/packages/app/src/i18n/uk.ts
+++ b/packages/app/src/i18n/uk.ts
@@ -81,7 +81,7 @@ export const dict = {
"command.workspace.toggle.description": "Увімкнути або вимкнути декілька робочих областей на бічній панелі",
"command.session.undo": "Скасувати",
"command.session.undo.description": "Скасувати останнє повідомлення",
- "command.session.undo.gitRequired": "Скасування недоступне, оскільки цей проєкт не використовує Git.",
+ "command.session.undo.gitRequired": "Репозиторій Git не виявлено",
"command.session.redo": "Повторити",
"command.session.redo.description": "Повторити останнє скасоване повідомлення",
"command.session.compact": "Стиснути сесію",
diff --git a/packages/app/src/i18n/zh.ts b/packages/app/src/i18n/zh.ts
index bead784c490c..38065d5f6194 100644
--- a/packages/app/src/i18n/zh.ts
+++ b/packages/app/src/i18n/zh.ts
@@ -108,7 +108,7 @@ export const dict = {
"command.session.undo": "撤销",
"command.session.undo.description": "撤销上一条消息",
- "command.session.undo.gitRequired": "此项目未使用 Git,因此无法撤销。",
+ "command.session.undo.gitRequired": "未检测到 Git 仓库",
"command.session.redo": "重做",
"command.session.redo.description": "重做上一条撤销的消息",
"command.session.compact": "精简会话",
diff --git a/packages/app/src/i18n/zht.ts b/packages/app/src/i18n/zht.ts
index 34b7b21c9452..e99b548afaa5 100644
--- a/packages/app/src/i18n/zht.ts
+++ b/packages/app/src/i18n/zht.ts
@@ -85,7 +85,7 @@ export const dict = {
"command.workspace.toggle.description": "在側邊欄啟用或停用多個工作區",
"command.session.undo": "復原",
"command.session.undo.description": "復原上一則訊息",
- "command.session.undo.gitRequired": "此專案未使用 Git,因此無法復原。",
+ "command.session.undo.gitRequired": "未偵測到 Git 儲存庫",
"command.session.redo": "重做",
"command.session.redo.description": "重做上一則復原的訊息",
"command.session.compact": "精簡工作階段",