From b67fd167c95c10c6f7713753763696c7676c8547 Mon Sep 17 00:00:00 2001 From: Ryan Vogel Date: Sat, 14 Feb 2026 15:59:53 -0500 Subject: [PATCH] fix: let users clear sidebar modified files without mutating diff state --- .../src/cli/cmd/tui/routes/session/index.tsx | 41 ++++++++++++++++++- .../cli/cmd/tui/routes/session/sidebar.tsx | 7 +++- 2 files changed, 44 insertions(+), 4 deletions(-) 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 e83b9abe98..5e4edfc491 100644 --- a/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx +++ b/packages/opencode/src/cli/cmd/tui/routes/session/index.tsx @@ -152,6 +152,18 @@ export function Session() { const [showHeader, setShowHeader] = kv.signal("header_visible", true) const [diffWrapMode] = kv.signal<"word" | "none">("diff_wrap_mode", "word") const [animationsEnabled, setAnimationsEnabled] = kv.signal("animations_enabled", true) + const [clearedDiff, setClearedDiff] = createSignal>({}) + const diff = createMemo(() => sync.data.session_diff[route.sessionID] ?? []) + const diffStamp = createMemo(() => + diff() + .map((item) => `${item.file}:${item.additions}:${item.deletions}`) + .join("\n"), + ) + const diffHidden = createMemo(() => { + const mark = clearedDiff()[route.sessionID] + if (!mark) return false + return mark === diffStamp() + }) const wide = createMemo(() => dimensions().width > 120) const sidebarVisible = createMemo(() => { @@ -163,6 +175,18 @@ export function Session() { const showTimestamps = createMemo(() => timestamps() === "show") const contentWidth = createMemo(() => dimensions().width - (sidebarVisible() ? 42 : 0) - 4) + createEffect(() => { + const mark = clearedDiff()[route.sessionID] + if (!mark) return + if (mark === diffStamp()) return + setClearedDiff((prev) => { + if (!prev[route.sessionID]) return prev + const next = { ...prev } + delete next[route.sessionID] + return next + }) + }) + const scrollAcceleration = createMemo(() => { const tui = sync.data.config.tui if (tui?.scroll_acceleration?.enabled) { @@ -526,6 +550,19 @@ export function Session() { dialog.clear() }, }, + { + title: "Clear Modified", + value: "session.modified.clear", + category: "Session", + enabled: !session()?.parentID && !diffHidden() && diff().length > 0, + onSelect: (dialog) => { + setClearedDiff((prev) => ({ + ...prev, + [route.sessionID]: diffStamp(), + })) + dialog.clear() + }, + }, { title: conceal() ? "Disable code concealment" : "Enable code concealment", value: "session.toggle.conceal", @@ -1120,7 +1157,7 @@ export function Session() { - + - + diff --git a/packages/opencode/src/cli/cmd/tui/routes/session/sidebar.tsx b/packages/opencode/src/cli/cmd/tui/routes/session/sidebar.tsx index 4ffe91558e..e6bceb76ee 100644 --- a/packages/opencode/src/cli/cmd/tui/routes/session/sidebar.tsx +++ b/packages/opencode/src/cli/cmd/tui/routes/session/sidebar.tsx @@ -12,11 +12,14 @@ import { useDirectory } from "../../context/directory" import { useKV } from "../../context/kv" import { TodoItem } from "../../component/todo-item" -export function Sidebar(props: { sessionID: string; overlay?: boolean }) { +export function Sidebar(props: { sessionID: string; overlay?: boolean; hideDiff?: boolean }) { const sync = useSync() const { theme } = useTheme() const session = createMemo(() => sync.session.get(props.sessionID)!) - const diff = createMemo(() => sync.data.session_diff[props.sessionID] ?? []) + const diff = createMemo(() => { + if (props.hideDiff) return [] + return sync.data.session_diff[props.sessionID] ?? [] + }) const todo = createMemo(() => sync.data.todo[props.sessionID] ?? []) const messages = createMemo(() => sync.data.message[props.sessionID] ?? [])