From 38be581b0a0fffde730ed64885e5c60e521f2ddf Mon Sep 17 00:00:00 2001 From: Ariane Emory Date: Wed, 20 May 2026 05:11:38 -0400 Subject: [PATCH] fix: hide session pinning feature to avoid conflict with bookmarking The dev branch has a built-in session pinning feature that uses local storage and shows slot numbers. This conflicts with the feat/session-bookmarks branch which provides a more robust server-synced bookmarking system. Changes: - Remove pin/unpin action from session list dialog - Remove slot number gutters from session list items - Remove quick-switch footer hints - Remove pin-related tips from tips view The keybind definition and local storage are preserved to maintain backward compatibility with existing user configurations. The feature is simply no longer exposed in the UI. --- .../cmd/tui/component/dialog-session-list.tsx | 48 ++----------------- .../tui/feature-plugins/home/tips-view.tsx | 13 +---- 2 files changed, 6 insertions(+), 55 deletions(-) diff --git a/packages/opencode/src/cli/cmd/tui/component/dialog-session-list.tsx b/packages/opencode/src/cli/cmd/tui/component/dialog-session-list.tsx index 17653af6b9a9..704dc2aa1553 100644 --- a/packages/opencode/src/cli/cmd/tui/component/dialog-session-list.tsx +++ b/packages/opencode/src/cli/cmd/tui/component/dialog-session-list.tsx @@ -7,7 +7,6 @@ import { Locale } from "@/util/locale" import { useProject } from "@tui/context/project" import { useTheme } from "../context/theme" import { useSDK } from "../context/sdk" -import { useLocal } from "../context/local" import { Flag } from "@opencode-ai/core/flag/flag" import { DialogSessionRename } from "./dialog-session-rename" import { createDebouncedSignal } from "../util/signal" @@ -26,13 +25,10 @@ export function DialogSessionList() { const project = useProject() const { theme } = useTheme() const sdk = useSDK() - const local = useLocal() const toast = useToast() const [toDelete, setToDelete] = createSignal() const [search, setSearch] = createDebouncedSignal("", 150) const deleteHint = useCommandShortcut("session.delete") - const quickSwitch1 = useCommandShortcut("session.quick_switch.1") - const quickSwitch9 = useCommandShortcut("session.quick_switch.9") const [searchResults, { refetch }] = createResource( () => ({ query: search(), filter: sync.session.query() }), @@ -132,16 +128,7 @@ export function DialogSessionList() { const [browseOrder] = createSignal(orderByRecency(sync.data.session)) - const quickSwitchHint = createMemo(() => { - const first = quickSwitch1() - const last = quickSwitch9() - if (!first || !last) return undefined - return quickSwitchRange(first, last) - }) - const quickSwitchFooterHints = createMemo(() => { - const hint = quickSwitchHint() - return hint && local.session.slots().length > 0 ? [{ title: "switch", label: hint }] : [] - }) + const options = createMemo(() => { const today = new Date().toDateString() @@ -154,9 +141,7 @@ export function DialogSessionList() { const searchResult = searchResults() const displayOrder = searchResult ? orderByRecency(searchResult) : browseOrder() - const pinned = local.session.pinned().filter((id) => sessionMap.has(id)) - const pinnedSet = new Set(pinned) - const slotByID = new Map(local.session.slots().map((id, i) => [id, i + 1])) + function buildOption(id: string, category: string) { const x = sessionMap.get(id) @@ -183,12 +168,7 @@ export function DialogSessionList() { const isDeleting = toDelete() === x.id const status = sync.data.session_status?.[x.id] const isWorking = status?.type === "busy" || status?.type === "retry" - const slot = slotByID.get(x.id) - const gutter = isWorking - ? () => - : slot !== undefined - ? () => {slot} - : undefined + const gutter = isWorking ? () => : undefined return { title: isDeleting ? `Press ${deleteHint()} again to confirm` : x.title, bg: isDeleting ? theme.error : undefined, @@ -199,8 +179,7 @@ export function DialogSessionList() { } } - const remaining = displayOrder - .filter((id) => !pinnedSet.has(id)) + return displayOrder .map((id) => { const x = sessionMap.get(id) if (!x) return undefined @@ -208,8 +187,6 @@ export function DialogSessionList() { return buildOption(id, label === today ? "Today" : label) }) .filter((x) => x !== undefined) - - return [...pinned.map((id) => buildOption(id, "Pinned")).filter((x) => x !== undefined), ...remaining] }) onMount(() => { @@ -233,15 +210,7 @@ export function DialogSessionList() { }) dialog.clear() }} - actions={[ - { - command: "session.pin.toggle", - title: "pin/unpin", - onTrigger: (option: { value: string }) => { - local.session.togglePin(option.value) - }, - }, - { + actions={[{ command: "session.delete", title: "delete", onTrigger: async (option) => { @@ -297,13 +266,6 @@ export function DialogSessionList() { }, }, ]} - footerHints={quickSwitchFooterHints()} /> ) } - -function quickSwitchRange(first: string, last: string) { - const prefix = first.slice(0, -1) - if (first.endsWith("1") && last === `${prefix}9`) return `${prefix}1-9` - return `${first} through ${last}` -} diff --git a/packages/opencode/src/cli/cmd/tui/feature-plugins/home/tips-view.tsx b/packages/opencode/src/cli/cmd/tui/feature-plugins/home/tips-view.tsx index a40798352bab..63e5c60c2b7c 100644 --- a/packages/opencode/src/cli/cmd/tui/feature-plugins/home/tips-view.tsx +++ b/packages/opencode/src/cli/cmd/tui/feature-plugins/home/tips-view.tsx @@ -33,9 +33,6 @@ type Shortcuts = { sessionList: TipShortcut sessionNew: TipShortcut sessionParent: TipShortcut - sessionPinToggle: TipShortcut - sessionQuickSwitch1: TipShortcut - sessionQuickSwitch9: TipShortcut sessionSidebarToggle: TipShortcut sessionTimeline: TipShortcut statusView: TipShortcut @@ -123,9 +120,6 @@ export function Tips(props: { api: TuiPluginApi; connected?: boolean }) { sessionList: useCommandShortcut("session.list"), sessionNew: useCommandShortcut("session.new"), sessionParent: configShortcut(props.api, "session.parent"), - sessionPinToggle: configShortcut(props.api, "session.pin.toggle"), - sessionQuickSwitch1: useCommandShortcut("session.quick_switch.1"), - sessionQuickSwitch9: useCommandShortcut("session.quick_switch.9"), sessionSidebarToggle: configShortcut(props.api, "session.sidebar.toggle"), sessionTimeline: configShortcut(props.api, "session.timeline"), statusView: useCommandShortcut("opencode.status"), @@ -175,12 +169,7 @@ const TIPS: Tip[] = [ (shortcuts) => `Use ${commandText("/models", shortcuts.modelList())} to see and switch between available AI models`, (shortcuts) => `Use ${commandText("/themes", shortcuts.themeList())} to switch between ${themeCount} built-in themes`, (shortcuts) => `Use ${commandText("/new", shortcuts.sessionNew())} to start a fresh conversation session`, - (shortcuts) => `Use ${commandText("/sessions", shortcuts.sessionList())} to list, pin, and continue sessions`, - (shortcuts) => press(shortcuts.sessionPinToggle(), "in the session list to pin a session so it stays at the top"), - (shortcuts) => - shortcuts.sessionQuickSwitch1() && shortcuts.sessionQuickSwitch9() - ? `Pinned sessions are assigned quick slots; use ${shortcutText(shortcuts.sessionQuickSwitch1())} through ${shortcutText(shortcuts.sessionQuickSwitch9())} to switch` - : undefined, + (shortcuts) => `Use ${commandText("/sessions", shortcuts.sessionList())} to list and continue sessions`, "Run {highlight}/compact{/highlight} to summarize long sessions near context limits", (shortcuts) => `Use ${commandText("/export", shortcuts.sessionExport())} to save the conversation as Markdown`, (shortcuts) => press(shortcuts.messagesCopy(), "to copy the assistant's last message to clipboard"),