From 18b05e86fbf2d9064f28bed1baacc665d058d1d9 Mon Sep 17 00:00:00 2001 From: David Hill <1879069+iamdavidhill@users.noreply.github.com> Date: Tue, 8 Sep 2026 18:03:10 -0600 Subject: [PATCH] feat(app): add browser shortcut to new-tab menu (#48044) --- packages/app/src/runtime/i18n/en.ts | 1 + packages/app/src/session/browser/model.ts | 18 +++++++++++++++++- .../src/session/files/session-side-panel.tsx | 14 ++++++++++++-- 3 files changed, 30 insertions(+), 3 deletions(-) diff --git a/packages/app/src/runtime/i18n/en.ts b/packages/app/src/runtime/i18n/en.ts index 72e463c693c..3df28354f3e 100644 --- a/packages/app/src/runtime/i18n/en.ts +++ b/packages/app/src/runtime/i18n/en.ts @@ -58,6 +58,7 @@ export const dict = { "command.session.new": "New session", "command.file.open": "Open file", + "command.browser.open": "Open browser", "command.tab.close": "Close tab", "command.tab.reopenClosed": "Reopen closed tab", "command.context.addSelection": "Add selection to context", diff --git a/packages/app/src/session/browser/model.ts b/packages/app/src/session/browser/model.ts index d77617192de..eeecdfd53a7 100644 --- a/packages/app/src/session/browser/model.ts +++ b/packages/app/src/session/browser/model.ts @@ -4,6 +4,7 @@ import { createStore } from "solid-js/store" import { useLanguage } from "@/runtime/i18n/language" import type { BrowserPaneCommand } from "@/runtime/platform/browser-pane" import { useServer } from "@/runtime/server/current" +import { useCommand } from "@/shell/commands/command" import type { SessionModel } from "../model" import { isSessionBrowserTab, sessionBrowserTab } from "../helpers" import { useBrowserAttachments } from "./attachments" @@ -12,6 +13,7 @@ export function createSessionBrowser(session: SessionModel) { const attachments = useBrowserAttachments() const language = useLanguage() const server = useServer() + const commands = useCommand() const [local, setLocal] = createStore({ error: undefined as string | undefined }) const attachment = () => { const sessionID = session.identity.sessionID() @@ -47,6 +49,20 @@ export function createSessionBrowser(session: SessionModel) { if (owner.current()) setLocal("error", language.t("common.requestFailed")) }) } + const open = () => { + if (!available()) return + command({ type: "tabs.open" }) + } + commands.register("session.browser", () => [ + { + id: "browser.open", + title: language.t("command.browser.open"), + category: language.t("command.category.view"), + keybind: "mod+shift+b", + disabled: !available(), + onSelect: open, + }, + ]) createEffect(() => { const sessionID = session.identity.sessionID() if (!sessionID) return @@ -109,7 +125,7 @@ export function createSessionBrowser(session: SessionModel) { error: () => local.error ?? attachment()?.error, registration: () => attachment()?.registration, close: (tabID: Browser.TabID) => session.layout.tabs().close(sessionBrowserTab(tabID)), - open: () => command({ type: "tabs.open" }), + open, command, } } diff --git a/packages/app/src/session/files/session-side-panel.tsx b/packages/app/src/session/files/session-side-panel.tsx index 0c4fd28906e..60afff8aca0 100644 --- a/packages/app/src/session/files/session-side-panel.tsx +++ b/packages/app/src/session/files/session-side-panel.tsx @@ -228,6 +228,7 @@ export function SessionSidePanel(props: { return active !== "review" && active !== "context" && active !== "empty" && !isSessionBrowserTab(active) }) const openFileKeybind = createMemo(() => command.keybindParts("file.open")) + const openBrowserKeybind = createMemo(() => command.keybindParts("browser.open")) const closeTabKeybind = createMemo(() => command.keybindParts("file.close")) createEffect(() => { if (!file.ready()) return @@ -465,7 +466,7 @@ export function SessionSidePanel(props: { placement="bottom" class="flex items-center" > - + } @@ -479,6 +480,7 @@ export function SessionSidePanel(props: { 0}> @@ -491,7 +493,15 @@ export function SessionSidePanel(props: { {language.t("command.file.open")} - + 0}> + + + } + >
{language.t("session.tab.browser")}