From 9a19099747ab4d92c64996a8fb22b690b72b33a9 Mon Sep 17 00:00:00 2001 From: Kiet Ho Date: Tue, 16 Dec 2025 22:59:23 -0800 Subject: [PATCH 1/4] chore(desktop): bump version to 0.0.24 --- apps/desktop/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/desktop/package.json b/apps/desktop/package.json index e960b383f88..5cd0eefbf01 100644 --- a/apps/desktop/package.json +++ b/apps/desktop/package.json @@ -2,7 +2,7 @@ "name": "@superset/desktop", "productName": "Superset", "description": "The last developer tool you'll ever need", - "version": "0.0.23", + "version": "0.0.24", "main": "./dist/main/index.js", "resources": "src/resources", "repository": { From 6912ed2a3daa0f6e09e6962733ae3fd875db0430 Mon Sep 17 00:00:00 2001 From: Kiet Ho Date: Wed, 17 Dec 2025 11:09:10 -0800 Subject: [PATCH 2/4] remove presets --- .../src/lib/trpc/routers/settings/index.ts | 34 ++----------------- 1 file changed, 2 insertions(+), 32 deletions(-) diff --git a/apps/desktop/src/lib/trpc/routers/settings/index.ts b/apps/desktop/src/lib/trpc/routers/settings/index.ts index b84446865d2..6daeff879b1 100644 --- a/apps/desktop/src/lib/trpc/routers/settings/index.ts +++ b/apps/desktop/src/lib/trpc/routers/settings/index.ts @@ -31,39 +31,9 @@ export const createSettingsRouter = () => { getLastUsedApp: publicProcedure.query(() => { return db.data.settings.lastUsedApp ?? "cursor"; }), - - getTerminalPresets: publicProcedure.query(async () => { - const { terminalPresets, terminalPresetsInitialized } = db.data.settings; - - // Handle first-time initialization - if (!terminalPresetsInitialized) { - // If user already has presets (from before the flag existed), preserve them - if (terminalPresets && terminalPresets.length > 0) { - await db.update((data) => { - data.settings.terminalPresetsInitialized = true; - }); - return terminalPresets; - } - - // No existing presets - seed with defaults - const defaultPresetsWithIds: TerminalPreset[] = DEFAULT_PRESETS.map( - (preset) => ({ - id: nanoid(), - ...preset, - }), - ); - - await db.update((data) => { - data.settings.terminalPresets = defaultPresetsWithIds; - data.settings.terminalPresetsInitialized = true; - }); - - return defaultPresetsWithIds; - } - - return terminalPresets ?? []; + getTerminalPresets: publicProcedure.query(() => { + return db.data.settings.terminalPresets ?? []; }), - createTerminalPreset: publicProcedure .input( z.object({ From 0a42d6b7a603b44f06176684303f4ea5e545680a Mon Sep 17 00:00:00 2001 From: Kiet Ho Date: Wed, 17 Dec 2025 11:09:49 -0800 Subject: [PATCH 3/4] Revert "refactor (Desktop): Make it so when you make a new terminal it makes it in your screen (#381)" This reverts commit 6b961f3aa3cee78d8ff01ecb7fe6cbbcbc63ed03. --- .../WorkspaceView/Sidebar/TabsView/index.tsx | 43 ++++--------------- .../desktop/src/renderer/stores/tabs/store.ts | 4 +- .../desktop/src/renderer/stores/tabs/types.ts | 4 +- .../desktop/src/renderer/stores/tabs/utils.ts | 3 +- 4 files changed, 12 insertions(+), 42 deletions(-) diff --git a/apps/desktop/src/renderer/screens/main/components/WorkspaceView/Sidebar/TabsView/index.tsx b/apps/desktop/src/renderer/screens/main/components/WorkspaceView/Sidebar/TabsView/index.tsx index 184a6b0add1..f27941f1913 100644 --- a/apps/desktop/src/renderer/screens/main/components/WorkspaceView/Sidebar/TabsView/index.tsx +++ b/apps/desktop/src/renderer/screens/main/components/WorkspaceView/Sidebar/TabsView/index.tsx @@ -35,7 +35,6 @@ export function TabsView() { const activeWorkspaceId = activeWorkspace?.id; const allTabs = useTabsStore((s) => s.tabs); const addTab = useTabsStore((s) => s.addTab); - const addPane = useTabsStore((s) => s.addPane); const renameTab = useTabsStore((s) => s.renameTab); const reorderTabById = useTabsStore((s) => s.reorderTabById); const activeTabIds = useTabsStore((s) => s.activeTabIds); @@ -55,24 +54,11 @@ export function TabsView() { [activeWorkspaceId, allTabs], ); - const activeTabId = activeWorkspaceId - ? activeTabIds[activeWorkspaceId] - : null; - const handleAddTab = () => { - if (!activeWorkspaceId) return; - - // If there's an active tab, add a pane to it instead of creating a new tab - if (activeTabId) { - const paneId = addPane(activeTabId); - // Fall back to creating a new tab if the active tab no longer exists - if (!paneId) { - addTab(activeWorkspaceId); - } - } else { + if (activeWorkspaceId) { addTab(activeWorkspaceId); + setCommandOpen(false); } - setCommandOpen(false); }; const handleOpenPresetsSettings = () => { @@ -83,28 +69,15 @@ export function TabsView() { const handleSelectPreset = (preset: TerminalPreset) => { if (!activeWorkspaceId) return; - const presetOptions = { + // Pass preset options to addTab - Terminal component will read them from pane state + const { tabId } = addTab(activeWorkspaceId, { initialCommands: preset.commands, initialCwd: preset.cwd || undefined, - name: preset.name || undefined, - }; + }); - // If there's an active tab, add a pane to it instead of creating a new tab - if (activeTabId) { - const paneId = addPane(activeTabId, presetOptions); - // Fall back to creating a new tab if the active tab no longer exists - if (!paneId) { - const { tabId } = addTab(activeWorkspaceId, presetOptions); - if (preset.name) { - renameTab(tabId, preset.name); - } - } - } else { - const { tabId } = addTab(activeWorkspaceId, presetOptions); - // Rename the tab to the preset name only when creating a new tab - if (preset.name) { - renameTab(tabId, preset.name); - } + // Rename the tab to the preset name + if (preset.name) { + renameTab(tabId, preset.name); } setCommandOpen(false); diff --git a/apps/desktop/src/renderer/stores/tabs/store.ts b/apps/desktop/src/renderer/stores/tabs/store.ts index 695ba38a299..8c8bd893a15 100644 --- a/apps/desktop/src/renderer/stores/tabs/store.ts +++ b/apps/desktop/src/renderer/stores/tabs/store.ts @@ -318,12 +318,12 @@ export const useTabsStore = create()( }, // Pane operations - addPane: (tabId, options?: CreatePaneOptions) => { + addPane: (tabId) => { const state = get(); const tab = state.tabs.find((t) => t.id === tabId); if (!tab) return ""; - const newPane = createPane(tabId, "terminal", options); + const newPane = createPane(tabId); // Add pane to layout (append to the right) const newLayout: MosaicNode = { diff --git a/apps/desktop/src/renderer/stores/tabs/types.ts b/apps/desktop/src/renderer/stores/tabs/types.ts index fed013a21d6..f825ccdcf18 100644 --- a/apps/desktop/src/renderer/stores/tabs/types.ts +++ b/apps/desktop/src/renderer/stores/tabs/types.ts @@ -1,6 +1,5 @@ import type { MosaicBranch, MosaicNode } from "react-mosaic-component"; import type { BaseTab, BaseTabsState, Pane, PaneType } from "shared/tabs-types"; -import type { CreatePaneOptions } from "./utils"; // Re-export shared types export type { Pane, PaneType }; @@ -27,7 +26,6 @@ export interface TabsState extends Omit { export interface AddTabOptions { initialCommands?: string[]; initialCwd?: string; - name?: string; } /** @@ -52,7 +50,7 @@ export interface TabsStore extends TabsState { updateTabLayout: (tabId: string, layout: MosaicNode) => void; // Pane operations - addPane: (tabId: string, options?: CreatePaneOptions) => string; + addPane: (tabId: string) => string; removePane: (paneId: string) => void; setFocusedPane: (tabId: string, paneId: string) => void; markPaneAsUsed: (paneId: string) => void; diff --git a/apps/desktop/src/renderer/stores/tabs/utils.ts b/apps/desktop/src/renderer/stores/tabs/utils.ts index 2e07d1bba84..dcea03ce1ce 100644 --- a/apps/desktop/src/renderer/stores/tabs/utils.ts +++ b/apps/desktop/src/renderer/stores/tabs/utils.ts @@ -38,7 +38,6 @@ export const extractPaneIdsFromLayout = ( export interface CreatePaneOptions { initialCommands?: string[]; initialCwd?: string; - name?: string; } /** @@ -55,7 +54,7 @@ export const createPane = ( id, tabId, type, - name: options?.name || "Terminal", + name: "Terminal", isNew: true, initialCommands: options?.initialCommands, initialCwd: options?.initialCwd, From 90f5628cc680d68a2c5f3313823543130f8acb17 Mon Sep 17 00:00:00 2001 From: Kiet Ho Date: Wed, 17 Dec 2025 11:28:04 -0800 Subject: [PATCH 4/4] add opencode support --- .../src/lib/trpc/routers/settings/index.ts | 20 ------------------- .../assets/app-icons/preset-icons/index.ts | 3 +++ .../app-icons/preset-icons/opencode-white.svg | 1 + .../app-icons/preset-icons/opencode.svg | 1 + .../PresetsSettings/PresetsSettings.tsx | 9 +++++++++ .../components/DiffViewer/DiffViewer.tsx | 8 +------- 6 files changed, 15 insertions(+), 27 deletions(-) create mode 100644 apps/desktop/src/renderer/assets/app-icons/preset-icons/opencode-white.svg create mode 100644 apps/desktop/src/renderer/assets/app-icons/preset-icons/opencode.svg diff --git a/apps/desktop/src/lib/trpc/routers/settings/index.ts b/apps/desktop/src/lib/trpc/routers/settings/index.ts index 6daeff879b1..7a2e01202b5 100644 --- a/apps/desktop/src/lib/trpc/routers/settings/index.ts +++ b/apps/desktop/src/lib/trpc/routers/settings/index.ts @@ -1,31 +1,11 @@ import { db } from "main/lib/db"; -import type { TerminalPreset } from "main/lib/db/schemas"; import { nanoid } from "nanoid"; import { DEFAULT_RINGTONE_ID, RINGTONES } from "shared/ringtones"; import { z } from "zod"; import { publicProcedure, router } from "../.."; -/** Valid ringtone IDs for validation */ const VALID_RINGTONE_IDS = RINGTONES.map((r) => r.id); -/** Default presets to load when no presets exist */ -const DEFAULT_PRESETS: Omit[] = [ - { - name: "codex", - description: "Danger mode: All permissions auto-approved", - cwd: "", - commands: [ - 'codex -c model_reasoning_effort="high" --ask-for-approval never --sandbox danger-full-access -c model_reasoning_summary="detailed" -c model_supports_reasoning_summaries=true', - ], - }, - { - name: "claude", - description: "Danger mode: All permissions auto-approved", - cwd: "", - commands: ["claude --dangerously-skip-permissions"], - }, -]; - export const createSettingsRouter = () => { return router({ getLastUsedApp: publicProcedure.query(() => { diff --git a/apps/desktop/src/renderer/assets/app-icons/preset-icons/index.ts b/apps/desktop/src/renderer/assets/app-icons/preset-icons/index.ts index 04eb9cd6f71..688a210b88d 100644 --- a/apps/desktop/src/renderer/assets/app-icons/preset-icons/index.ts +++ b/apps/desktop/src/renderer/assets/app-icons/preset-icons/index.ts @@ -4,6 +4,8 @@ import codexIcon from "./codex.svg"; import codexWhiteIcon from "./codex-white.svg"; import cursorIcon from "./cursor.svg"; import geminiIcon from "./gemini.svg"; +import opencodeIcon from "./opencode.svg"; +import opencodeWhiteIcon from "./opencode-white.svg"; interface PresetIconSet { light: string; @@ -15,6 +17,7 @@ const PRESET_ICONS: Record = { codex: { light: codexIcon, dark: codexWhiteIcon }, gemini: { light: geminiIcon, dark: geminiIcon }, "cursor-agent": { light: cursorIcon, dark: cursorIcon }, + opencode: { light: opencodeIcon, dark: opencodeWhiteIcon }, }; export function getPresetIcon( diff --git a/apps/desktop/src/renderer/assets/app-icons/preset-icons/opencode-white.svg b/apps/desktop/src/renderer/assets/app-icons/preset-icons/opencode-white.svg new file mode 100644 index 00000000000..b79c7332e20 --- /dev/null +++ b/apps/desktop/src/renderer/assets/app-icons/preset-icons/opencode-white.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/desktop/src/renderer/assets/app-icons/preset-icons/opencode.svg b/apps/desktop/src/renderer/assets/app-icons/preset-icons/opencode.svg new file mode 100644 index 00000000000..b79140a5070 --- /dev/null +++ b/apps/desktop/src/renderer/assets/app-icons/preset-icons/opencode.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/desktop/src/renderer/screens/main/components/SettingsView/PresetsSettings/PresetsSettings.tsx b/apps/desktop/src/renderer/screens/main/components/SettingsView/PresetsSettings/PresetsSettings.tsx index ab0982ea917..2faed3e2ff2 100644 --- a/apps/desktop/src/renderer/screens/main/components/SettingsView/PresetsSettings/PresetsSettings.tsx +++ b/apps/desktop/src/renderer/screens/main/components/SettingsView/PresetsSettings/PresetsSettings.tsx @@ -62,6 +62,15 @@ const PRESET_TEMPLATES: PresetTemplate[] = [ commands: ["cursor-agent"], }, }, + { + name: "opencode", + preset: { + name: "opencode", + description: "OpenCode: Open source AI coding agent", + cwd: "", + commands: ["opencode"], + }, + }, ]; export function PresetsSettings() { diff --git a/apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/ChangesContent/components/DiffViewer/DiffViewer.tsx b/apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/ChangesContent/components/DiffViewer/DiffViewer.tsx index 4bc4fc155e3..252228146a7 100644 --- a/apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/ChangesContent/components/DiffViewer/DiffViewer.tsx +++ b/apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/ChangesContent/components/DiffViewer/DiffViewer.tsx @@ -1,5 +1,5 @@ import { DiffEditor, type DiffOnMount } from "@monaco-editor/react"; -import { useCallback, useEffect, useRef } from "react"; +import { useCallback, useRef } from "react"; import { monaco, SUPERSET_THEME } from "renderer/contexts/MonacoProvider"; import type { DiffViewMode, FileContents } from "shared/changes-types"; @@ -40,12 +40,6 @@ export function DiffViewer({ [editable, handleSave], ); - useEffect(() => { - return () => { - modifiedEditorRef.current = null; - }; - }, []); - return (