From 043e74a869030bcc9551722dab032f041b7204fe Mon Sep 17 00:00:00 2001 From: Benjamin Shafii Date: Sat, 4 Apr 2026 13:09:23 -0700 Subject: [PATCH] fix(app): remove dead shell and session rail code --- apps/app/src/app/app.tsx | 186 +---- .../app/components/session/context-panel.tsx | 389 ----------- .../src/app/components/session/sidebar.tsx | 634 ------------------ apps/app/src/app/context/workspace.ts | 92 --- apps/app/src/app/pages/config.tsx | 48 -- apps/app/src/app/pages/session.tsx | 17 - apps/app/src/app/pages/settings.tsx | 10 - apps/app/src/app/shell/settings-shell.tsx | 22 +- 8 files changed, 9 insertions(+), 1389 deletions(-) delete mode 100644 apps/app/src/app/components/session/context-panel.tsx delete mode 100644 apps/app/src/app/components/session/sidebar.tsx diff --git a/apps/app/src/app/app.tsx b/apps/app/src/app/app.tsx index 871c33698..9b4c82e60 100644 --- a/apps/app/src/app/app.tsx +++ b/apps/app/src/app/app.tsx @@ -11,8 +11,6 @@ import { import { useLocation, useNavigate } from "@solidjs/router"; -import type { Session } from "@opencode-ai/sdk/v2/client"; - import { getVersion } from "@tauri-apps/api/app"; import { getCurrentWebview } from "@tauri-apps/api/webview"; import ModelPickerModal from "./components/model-picker-modal"; @@ -39,9 +37,8 @@ import { CreateWorkspaceModal, } from "./workspace"; import SessionView from "./pages/session"; -import { clearDevLogs, recordDevLog } from "./lib/dev-log"; -import { unwrap } from "./lib/opencode"; -import { clearPerfLogs, finishPerf, perfNow, recordPerfLog } from "./lib/perf-log"; +import { clearDevLogs } from "./lib/dev-log"; +import { clearPerfLogs } from "./lib/perf-log"; import { deepLinkBridgeEvent, drainPendingDeepLinks, type DeepLinkBridgeDetail } from "./lib/deep-link-bridge"; import { HIDE_TITLEBAR_PREF_KEY, @@ -58,7 +55,6 @@ import type { View, WorkspaceDisplay, WorkspaceSessionGroup, - ComposerDraft, ProviderListItem, OpencodeConnectStatus, } from "./types"; @@ -75,7 +71,6 @@ import { lastUserModelFromMessages, readStartupPreference, safeStringify, - addOpencodeCacheHint, } from "./utils"; import { applyThemeMode, @@ -94,7 +89,6 @@ import { ModelControlsProvider } from "./app-settings/model-controls-provider"; import { createModelControlsStore } from "./app-settings/model-controls-store"; import { useSessionDisplayPreferences } from "./app-settings/session-display-preferences"; import { - describeDirectoryScope, shouldRedirectMissingSessionAfterScopedLoad, } from "./lib/session-scope"; import { createExtensionsStore } from "./context/extensions"; @@ -105,8 +99,6 @@ import { useGlobalSync } from "./context/global-sync"; import { createWorkspaceStore } from "./context/workspace"; import { updaterEnvironment, - readOpencodeConfig, - writeOpencodeConfig, setWindowDecorations, } from "./lib/tauri"; import { @@ -126,7 +118,6 @@ import { normalizeOpenworkServerUrl, readOpenworkServerSettings, writeOpenworkServerSettings, - type OpenworkServerDiagnostics, type OpenworkServerSettings, } from "./lib/openwork-server"; import { @@ -154,28 +145,10 @@ export default function App() { ? import.meta.env.VITE_OPENWORK_WORKSPACE_ID.trim() || null : null; - // Workspace switch tracing is noisy, so only emit in developer mode. - // (OpenWork already has a developer mode toggle in Settings.) - const wsDebugEnabled = () => developerMode(); - - const wsDebug = (label: string, payload?: unknown) => { - if (!wsDebugEnabled()) return; - try { - recordDevLog(true, { level: "debug", source: "app", label, payload }); - if (payload === undefined) { - console.log(`[WSDBG] ${label}`); - } else { - console.log(`[WSDBG] ${label}`, payload); - } - } catch { - // ignore - } - }; const location = useLocation(); const navigate = useNavigate(); const [creatingSession, setCreatingSession] = createSignal(false); - const [sessionViewLockUntil] = createSignal(0); const currentView = createMemo(() => { const path = location.pathname.toLowerCase(); if (path.startsWith("/session")) return "session"; @@ -203,9 +176,6 @@ export default function App() { if (next === "settings" && creatingSession()) { return; } - if (next === "settings" && Date.now() < sessionViewLockUntil()) { - return; - } if (next === "session") { if (sessionId) { goToSession(sessionId); @@ -496,25 +466,6 @@ export default function App() { goToSettings(nextTab); }; - const mapLegacySurfaceToSettingsTab = (surface: string): SettingsTab => { - switch (surface) { - case "scheduled": - return "automations"; - case "skills": - return "skills"; - case "plugins": - case "mcp": - return "extensions"; - case "identities": - return "messaging"; - case "config": - return "advanced"; - case "settings": - default: - return "general"; - } - }; - let markReloadRequiredHandler: ((reason: ReloadReason, trigger?: ReloadTrigger) => void) | undefined; const markReloadRequired = (reason: ReloadReason, trigger?: ReloadTrigger) => { markReloadRequiredHandler?.(reason, trigger); @@ -878,30 +829,6 @@ export default function App() { bundlesStore, }); - const logWorkspaceScopeSnapshot = (label: string, extra?: Record) => { - if (!developerMode()) return; - const activeWorkspace = workspaceStore.selectedWorkspaceInfo(); - const selectedWorkspaceId = workspaceStore.selectedWorkspaceId().trim(); - const selectedWorkspaceRoot = workspaceStore.selectedWorkspaceRoot().trim(); - const engineInfo = workspaceStore.engine(); - const map = readSessionByWorkspace(); - wsDebug(label, { - selectedWorkspaceId: selectedWorkspaceId || null, - activeWorkspaceType: activeWorkspace?.workspaceType ?? null, - selectedWorkspacePath: activeWorkspace?.path?.trim() ?? null, - activeWorkspaceDirectory: activeWorkspace?.directory?.trim() ?? null, - selectedWorkspaceRoot: selectedWorkspaceRoot || null, - activeWorkspaceScope: describeDirectoryScope(selectedWorkspaceRoot), - clientDirectory: clientDirectory().trim() || null, - clientDirectoryScope: describeDirectoryScope(clientDirectory().trim()), - engineProjectDir: engineInfo?.projectDir?.trim() ?? null, - engineProjectScope: describeDirectoryScope(engineInfo?.projectDir?.trim() ?? null), - lastSessionForActiveWorkspace: selectedWorkspaceId ? map[selectedWorkspaceId] ?? null : null, - lastSessionMapKeys: Object.keys(map), - ...extra, - }); - }; - const sidebarSessionsStore = createSidebarSessionsStore({ workspaces: () => workspaceStore.workspaces(), engine: () => workspaceStore.engine(), @@ -1294,40 +1221,6 @@ export default function App() { return Date.now() - lastCheckedAt >= UPDATE_AUTO_CHECK_EVERY_MS; }; - const workspaceAutoReloadAvailable = createMemo(() => - false, - ); - - const workspaceAutoReloadEnabled = createMemo(() => { - if (!workspaceAutoReloadAvailable()) return false; - const cfg = workspaceStore.workspaceConfig(); - return Boolean(cfg?.reload?.auto); - }); - - const workspaceAutoReloadResumeEnabled = createMemo(() => { - if (!workspaceAutoReloadAvailable()) return false; - const cfg = workspaceStore.workspaceConfig(); - return Boolean(cfg?.reload?.resume); - }); - - const setWorkspaceAutoReloadEnabled = async (next: boolean) => { - if (!workspaceAutoReloadAvailable()) return; - const cfg = workspaceStore.workspaceConfig(); - const resume = Boolean(cfg?.reload?.resume); - await workspaceStore.persistReloadSettings({ auto: next, resume: next ? resume : false }); - }; - - const setWorkspaceAutoReloadResumeEnabled = async (next: boolean) => { - if (!workspaceAutoReloadAvailable()) return; - const cfg = workspaceStore.workspaceConfig(); - const auto = Boolean(cfg?.reload?.auto); - await workspaceStore.persistReloadSettings({ auto, resume: auto ? next : false }); - }; - - const reloadWorkspaceEngineAndResume = async () => { - await reloadWorkspaceEngine(); - }; - const isActiveSessionStatus = (status: string | null | undefined) => status === "running" || status === "retry"; @@ -1362,14 +1255,9 @@ export default function App() { // ignore and continue stopping the rest before reload } } - await reloadWorkspaceEngineAndResume(); + await reloadWorkspaceEngine(); }; - onMount(() => { - // OpenCode hot reload drives freshness now; OpenWork no longer listens for - // legacy reload-required events. - }); - const { projectDir: workspaceProjectDir, stopHost, @@ -1451,26 +1339,15 @@ export default function App() { }); }); - const activeAuthorizedDirs = createMemo(() => workspaceStore.authorizedDirs()); const selectedWorkspaceDisplay = createMemo(() => workspaceStore.selectedWorkspaceDisplay()); const resolvedActiveWorkspaceConfig = createMemo( () => activeWorkspaceServerConfig() ?? workspaceStore.workspaceConfig(), ); - const refreshActiveWorkspaceServerConfig = workspaceStore.refreshRuntimeWorkspaceConfig; const activePermissionMemo = createMemo(() => activePermission()); const [expandedStepIds, setExpandedStepIds] = createSignal>( new Set() ); - const [expandedSidebarSections, setExpandedSidebarSections] = createSignal({ - progress: true, - artifacts: true, - context: false, - plugins: false, - mcp: false, - skills: true, - authorizedFolders: false, - }); const [autoConnectAttempted, setAutoConnectAttempted] = createSignal(false); const [appVersion, setAppVersion] = createSignal(null); @@ -1961,7 +1838,6 @@ export default function App() { completeProviderAuthOAuth, refreshProviders, submitProviderApiKey, - view: currentView(), setView, toggleSettings: () => toggleSettingsView("general"), startupPreference: startupPreference(), @@ -1969,7 +1845,6 @@ export default function App() { clientConnected: Boolean(client()), busy: busy(), busyHint: busyHint(), - busyLabel: busyLabel(), newTaskDisabled: newTaskDisabled(), headerStatus: headerStatus(), error: error(), @@ -1999,14 +1874,9 @@ export default function App() { resetOpenworkServerSettings, testOpenworkServerConnection, canReloadWorkspace: canReloadWorkspace(), - reloadWorkspaceEngine: reloadWorkspaceEngineAndResume, + reloadWorkspaceEngine, reloadBusy: reloadBusy(), reloadError: reloadError(), - workspaceAutoReloadAvailable: workspaceAutoReloadAvailable(), - workspaceAutoReloadEnabled: workspaceAutoReloadEnabled(), - setWorkspaceAutoReloadEnabled, - workspaceAutoReloadResumeEnabled: workspaceAutoReloadResumeEnabled(), - setWorkspaceAutoReloadResumeEnabled, selectedWorkspaceDisplay: selectedWorkspaceDisplay(), workspaces: workspaceStore.workspaces(), selectedWorkspaceId: workspaceStore.selectedWorkspaceId(), @@ -2017,12 +1887,8 @@ export default function App() { testWorkspaceConnection: workspaceStore.testWorkspaceConnection, recoverWorkspace: workspaceStore.recoverWorkspace, openCreateWorkspace: () => workspaceStore.setCreateWorkspaceOpen(true), - pickFolderWorkspace: workspaceStore.createWorkspaceFromPickedFolder, - openCreateRemoteWorkspace: () => workspaceStore.setCreateRemoteWorkspaceOpen(true), connectRemoteWorkspace: workspaceStore.createRemoteWorkspaceFlow, openTeamBundle: bundlesStore.openTeamBundle, - importWorkspaceConfig: workspaceStore.importWorkspaceConfig, - importingWorkspaceConfig: workspaceStore.importingWorkspaceConfig(), exportWorkspaceConfig: workspaceStore.exportWorkspaceConfig, exportWorkspaceBusy: workspaceStore.exportingWorkspaceConfig(), createWorkspaceOpen: workspaceStore.createWorkspaceOpen(), @@ -2034,10 +1900,8 @@ export default function App() { openRenameWorkspace: workspaceStore.openRenameWorkspace, editWorkspaceConnection: workspaceStore.openWorkspaceConnectionSettings, forgetWorkspace: workspaceStore.forgetWorkspace, - stopSandbox: workspaceStore.stopSandbox, schedulerPluginInstalled: schedulerPluginInstalled(), selectedWorkspaceRoot: workspaceStore.selectedWorkspaceRoot().trim(), - isRemoteWorkspace: workspaceStore.selectedWorkspaceDisplay().workspaceType === "remote", skillsAccessHint, canInstallSkillCreator, canUseDesktopTools, @@ -2048,7 +1912,6 @@ export default function App() { addPlugin, createSessionInWorkspace, createSessionAndOpen, - selectSession: selectSession, hideTitlebar: hideTitlebar(), toggleHideTitlebar: () => setHideTitlebar((v) => !v), updateAutoCheck: updateAutoCheck(), @@ -2116,7 +1979,6 @@ export default function App() { providerAuthWorkerType: providerAuthWorkerType(), selectedSessionId: activeSessionId(), setView, - settingsTab: settingsTab(), setSettingsTab, toggleSettings: () => toggleSettingsView("general"), selectedWorkspaceDisplay: selectedWorkspaceDisplay(), @@ -2133,10 +1995,6 @@ export default function App() { editWorkspaceConnection: workspaceStore.openWorkspaceConnectionSettings, forgetWorkspace: workspaceStore.forgetWorkspace, openCreateWorkspace: () => workspaceStore.setCreateWorkspaceOpen(true), - pickFolderWorkspace: workspaceStore.createWorkspaceFromPickedFolder, - openCreateRemoteWorkspace: () => workspaceStore.setCreateRemoteWorkspaceOpen(true), - importWorkspaceConfig: workspaceStore.importWorkspaceConfig, - importingWorkspaceConfig: workspaceStore.importingWorkspaceConfig(), exportWorkspaceConfig: workspaceStore.exportWorkspaceConfig, exportWorkspaceBusy: workspaceStore.exportingWorkspaceConfig(), clientConnected: Boolean(client()), @@ -2154,21 +2012,15 @@ export default function App() { orchestratorStatus: orchestratorStatusState(), opencodeRouterInfo: opencodeRouterInfoState(), appVersion: appVersion(), - stopHost, headerStatus: headerStatus(), busyHint: busyHint(), updateStatus: updateStatus(), - updateEnv: updateEnv(), anyActiveRuns: anyActiveRuns(), installUpdateAndRestart, - activePlugins: sidebarPluginList(), - activePluginStatus: sidebarPluginStatus(), skills: skills(), - skillsStatus: skillsStatus(), newTaskDisabled: newTaskDisabled(), workspaceSessionGroups: sidebarWorkspaceGroups(), openRenameWorkspace: workspaceStore.openRenameWorkspace, - selectSession: selectSession, messages: visibleMessages(), getSessionById: sessionById, getMessagesBySessionId: messagesBySessionId, @@ -2180,10 +2032,7 @@ export default function App() { sessionCompactionState: selectedSessionCompactionState(), expandedStepIds: expandedStepIds(), setExpandedStepIds: setExpandedStepIds, - expandedSidebarSections: expandedSidebarSections(), - setExpandedSidebarSections: setExpandedSidebarSections, workingFiles: activeWorkingFiles(), - authorizedDirs: activeAuthorizedDirs(), busy: busy(), prompt: prompt(), setPrompt: setPrompt, @@ -2240,23 +2089,12 @@ export default function App() { return "general"; }; - const initialRoute = () => { - if (typeof window === "undefined") return "/session"; - return "/session"; - }; - createEffect(() => { const rawPath = location.pathname.trim(); const path = rawPath.toLowerCase(); if (path === "" || path === "/") { - navigate(initialRoute(), { replace: true }); - return; - } - - if (path.startsWith("/dashboard")) { - const [, , tabSegment] = path.split("/"); - goToSettings(mapLegacySurfaceToSettingsTab(tabSegment ?? "settings"), { replace: true }); + navigate("/session", { replace: true }); return; } @@ -2315,16 +2153,6 @@ export default function App() { return; } - if (path.startsWith("/proto-v1-ux") || path.startsWith("/proto")) { - if (isTauriRuntime()) { - navigate("/settings/automations", { replace: true }); - return; - } - - navigate("/settings/automations", { replace: true }); - return; - } - const fallback = activeSessionId(); if (fallback) { goToSession(fallback, { replace: true }); @@ -2389,7 +2217,7 @@ export default function App() { activeSessions={activeReloadBlockingSessions()} isRemoteWorkspace={selectedWorkspaceDisplay().workspaceType === "remote"} onForceStopSession={(sessionID) => abortSession(sessionID)} - onReloadEngine={() => reloadWorkspaceEngineAndResume()} + onReloadEngine={() => reloadWorkspaceEngine()} /> { void (activeReloadBlockingSessions().length > 0 ? forceStopActiveSessionsAndReload() - : reloadWorkspaceEngineAndResume()); + : reloadWorkspaceEngine()); }} onDismissReload={clearReloadRequired} /> diff --git a/apps/app/src/app/components/session/context-panel.tsx b/apps/app/src/app/components/session/context-panel.tsx deleted file mode 100644 index c5339e5b7..000000000 --- a/apps/app/src/app/components/session/context-panel.tsx +++ /dev/null @@ -1,389 +0,0 @@ -import { For, Show } from "solid-js"; -import { ChevronDown, Circle, File, Folder, Package } from "lucide-solid"; - -import { useConnections } from "../../connections/provider"; -import { SUGGESTED_PLUGINS } from "../../constants"; -import { t } from "../../../i18n"; -import type { McpStatus, SkillCard } from "../../types"; -import { stripPluginVersion } from "../../utils/plugins"; - -export type ContextPanelProps = { - activePlugins: string[]; - activePluginStatus: string | null; - skills: SkillCard[]; - skillsStatus: string | null; - authorizedDirs: string[]; - workingFiles: string[]; - workspaceRoot?: string; - expandedSections: { - context: boolean; - plugins: boolean; - mcp: boolean; - skills: boolean; - authorizedFolders: boolean; - }; - onToggleSection: (section: "context" | "plugins" | "mcp" | "skills" | "authorizedFolders") => void; - onFileClick?: (path: string) => void; -}; - -const humanizePlugin = (name: string) => { - const cleaned = name - .replace(/^@[^/]+\//, "") - .replace(/[-_]+/g, " ") - .replace(/\b(opencode|plugin)\b/gi, "") - .trim(); - return cleaned - .split(" ") - .filter(Boolean) - .map((word) => word.charAt(0).toUpperCase() + word.slice(1)) - .join(" ") - .trim(); -}; - -const matchSuggestedPlugin = (name: string) => { - const normalized = stripPluginVersion(name).toLowerCase(); - if (!normalized) return null; - return ( - SUGGESTED_PLUGINS.find((plugin) => { - const candidates = [plugin.packageName, plugin.name, ...(plugin.aliases ?? [])] - .map((candidate) => stripPluginVersion(candidate).toLowerCase()) - .filter(Boolean); - return candidates.includes(normalized); - }) ?? null - ); -}; - -const humanizeSkill = (name: string) => { - const cleaned = name.replace(/^@[^/]+\//, "").replace(/[-_]+/g, " ").trim(); - if (!cleaned) return name; - return cleaned - .split(" ") - .filter(Boolean) - .map((word) => word.charAt(0).toUpperCase() + word.slice(1)) - .join(" ") - .trim(); -}; - -const splitPathSegments = (value: string) => value.split(/[/\\]/).filter(Boolean); - -const toWorkspaceRelative = (file: string, root?: string) => { - const normalizedRoot = (root ?? "").trim().replace(/[\\/]+/g, "/").replace(/\/+$/, ""); - if (!normalizedRoot) return file; - const normalizedFile = file.replace(/[\\/]+/g, "/"); - const rootKey = normalizedRoot.toLowerCase(); - const fileKey = normalizedFile.toLowerCase(); - if (fileKey === rootKey) return normalizedFile.split("/").pop() ?? normalizedFile; - if (fileKey.startsWith(`${rootKey}/`)) { - return normalizedFile.slice(normalizedRoot.length + 1); - } - return normalizedFile; -}; - -const getSmartFileName = (files: string[], file: string): string => { - if (!file) return ""; - const segments = splitPathSegments(file); - const basename = segments[segments.length - 1] ?? file; - - const duplicates = files.filter((candidate) => { - const candidateSegments = splitPathSegments(candidate); - return (candidateSegments[candidateSegments.length - 1] ?? candidate) === basename; - }); - - if (duplicates.length <= 1) { - return basename; - } - - for (let i = 2; i <= segments.length; i += 1) { - const shortPath = segments.slice(-i).join("/"); - const isUnique = duplicates.every((candidate) => { - if (candidate === file) return true; - const candidateSegments = splitPathSegments(candidate); - return candidateSegments.slice(-i).join("/") !== shortPath; - }); - if (isUnique) return shortPath; - } - - return file; -}; - -const mcpStatusLabel = (status?: McpStatus, disabled?: boolean) => { - if (disabled) return t("context_panel.mcp_disabled"); - if (!status) return t("context_panel.mcp_disconnected"); - switch (status.status) { - case "connected": - return t("context_panel.mcp_connected"); - case "needs_auth": - return t("context_panel.mcp_needs_auth"); - case "needs_client_registration": - return t("context_panel.mcp_register_client"); - case "failed": - return t("context_panel.mcp_failed"); - default: - return t("context_panel.mcp_disconnected"); - } -}; - -const mcpStatusDot = (status?: McpStatus, disabled?: boolean) => { - if (disabled) return "bg-gray-7"; - if (!status) return "bg-gray-7"; - switch (status.status) { - case "connected": - return "bg-green-9"; - case "needs_auth": - case "needs_client_registration": - return "bg-amber-9"; - case "failed": - return "bg-red-9"; - default: - return "bg-gray-7"; - } -}; - -export default function ContextPanel(props: ContextPanelProps) { - const connections = useConnections(); - const displayFiles = () => - props.workingFiles.map((entry) => toWorkspaceRelative(entry, props.workspaceRoot)); - - return ( -
-
- - -
- -
- - -
-
- - {props.activePluginStatus ?? t("context_panel.no_plugins")} -
- } - > - - {(plugin) => { - const suggested = matchSuggestedPlugin(plugin); - const normalized = stripPluginVersion(plugin) || plugin; - const label = humanizePlugin(suggested?.name ?? normalized) || normalized; - const description = suggested?.description?.trim(); - const detail = description || (normalized !== label ? normalized : ""); - return ( -
- -
-
{label}
- -
- {detail} -
-
-
-
- ); - }} -
- -
-
- -
- -
- - -
-
- - {connections.mcpStatus() ?? t("context_panel.no_mcp")} -
- } - > - - {(entry) => { - const status = () => connections.mcpStatuses()[entry.name]; - const disabled = () => entry.config.enabled === false; - const detail = - entry.config.type === "remote" - ? entry.config.url - : entry.config.command?.join(" "); - return ( -
- -
-
{entry.name}
-
- {mcpStatusLabel(status(), disabled())} - {detail ? ` - ${detail}` : ""} -
-
-
- ); - }} -
- -
-
- - - -
- - -
-
- - {props.skillsStatus ?? t("context_panel.no_skills")} -
- } - > - - {(skill) => { - const label = humanizeSkill(skill.name) || skill.name; - const description = skill.description?.trim(); - const trigger = skill.trigger?.trim(); - const subtitle = trigger || description; - return ( -
- -
-
{label}
- -
- {subtitle} -
-
-
-
- ); - }} -
- -
-
- - - -
- - -
-
- {t("context_panel.none_yet")}
} - > - - {(folder) => ( -
- - - {folder.split(/[/\\]/).pop()} - -
- )} -
- -
-
- - - - - ); -} diff --git a/apps/app/src/app/components/session/sidebar.tsx b/apps/app/src/app/components/session/sidebar.tsx deleted file mode 100644 index db559e5a9..000000000 --- a/apps/app/src/app/components/session/sidebar.tsx +++ /dev/null @@ -1,634 +0,0 @@ -import { For, Show, createEffect, createMemo, createSignal, onCleanup } from "solid-js"; -import { Check, ChevronDown, GripVertical, Loader2, Plus, RefreshCcw, Settings, Square, Trash2 } from "lucide-solid"; -import { t } from "../../../i18n"; - -import type { TodoItem, WorkspaceConnectionState } from "../../types"; -import type { WorkspaceInfo } from "../../lib/tauri"; - -type SessionSummary = { - id: string; - title: string; - slug?: string | null; -}; - -type WorkspaceSessionGroup = { - workspace: WorkspaceInfo; - sessions: SessionSummary[]; -}; - -export type SidebarSectionState = { - progress: boolean; - artifacts: boolean; - context: boolean; - plugins: boolean; - mcp: boolean; - skills: boolean; - authorizedFolders: boolean; -}; - -export type SidebarProps = { - todos: TodoItem[]; - expandedSections: SidebarSectionState; - onToggleSection: (section: keyof SidebarSectionState) => void; - workspaceGroups: WorkspaceSessionGroup[]; - selectedWorkspaceId: string; - connectingWorkspaceId?: string | null; - workspaceConnectionStateById: Record; - onSelectWorkspace: (workspaceId: string) => void; - onCreateWorkspace: () => void; - onEditWorkspace: (workspaceId: string) => void; - onTestWorkspaceConnection: (workspaceId: string) => void; - onForgetWorkspace: (workspaceId: string) => void; - onStopSandbox?: (workspaceId: string) => void; - onReorderWorkspace: (fromId: string, toId: string | null) => void; - onSelectSession: (workspaceId: string, sessionId: string) => void; - selectedSessionId: string | null; - sessionStatusById: Record; - onCreateSession: () => void; - onDeleteSession: (id: string) => void; - newTaskDisabled: boolean; -}; - -export default function SessionSidebar(props: SidebarProps) { - const MAX_SESSIONS_PREVIEW = 8; - const realTodos = createMemo(() => props.todos.filter((todo) => todo.content.trim())); - const WORKSPACE_COLLAPSE_KEY = "openwork.workspace-collapse.v1"; - const readWorkspaceCollapse = () => { - if (typeof window === "undefined") return {} as Record; - try { - const raw = window.localStorage.getItem(WORKSPACE_COLLAPSE_KEY); - if (!raw) return {} as Record; - const parsed = JSON.parse(raw); - if (!parsed || typeof parsed !== "object") return {} as Record; - return parsed as Record; - } catch { - return {} as Record; - } - }; - const writeWorkspaceCollapse = (next: Record) => { - if (typeof window === "undefined") return; - try { - window.localStorage.setItem(WORKSPACE_COLLAPSE_KEY, JSON.stringify(next)); - } catch { - // ignore - } - }; - const [collapsedById, setCollapsedById] = createSignal>(readWorkspaceCollapse()); - const [draggingWorkspaceId, setDraggingWorkspaceId] = createSignal(null); - const [dragOverWorkspaceId, setDragOverWorkspaceId] = createSignal(null); - const [showAllSessionsByWorkspaceId, setShowAllSessionsByWorkspaceId] = createSignal< - Record - >({}); - const workspaceLabel = (workspace: WorkspaceInfo) => - workspace.displayName?.trim() || - workspace.openworkWorkspaceName?.trim() || - workspace.name?.trim() || - workspace.path?.trim() || - "Worker"; - - const workspacePathLabel = (workspace: WorkspaceInfo) => { - if (workspace.workspaceType === "remote") { - if (workspace.remoteType === "openwork") { - return ( - workspace.openworkHostUrl?.trim() || - workspace.baseUrl?.trim() || - workspace.path?.trim() || - "" - ); - } - return workspace.baseUrl?.trim() || workspace.path?.trim() || ""; - } - return workspace.path?.trim() || ""; - }; - - const workspaceDetailLabel = (workspace: WorkspaceInfo) => { - if (workspace.workspaceType !== "remote") return ""; - return workspace.openworkWorkspaceName?.trim() || workspace.directory?.trim() || ""; - }; - - const toggleWorkspaceCollapse = (workspaceId: string) => { - setCollapsedById((prev) => { - const next = { ...prev, [workspaceId]: !prev[workspaceId] }; - writeWorkspaceCollapse(next); - return next; - }); - }; - - const isWorkspaceCollapsed = (workspaceId: string) => Boolean(collapsedById()[workspaceId]); - const isShowingAllSessions = (workspaceId: string) => - Boolean(showAllSessionsByWorkspaceId()[workspaceId]); - const toggleShowAllSessions = (workspaceId: string) => { - setShowAllSessionsByWorkspaceId((prev) => ({ - ...prev, - [workspaceId]: !prev[workspaceId], - })); - }; - - const handleDragStart = (event: DragEvent, workspaceId: string) => { - event.dataTransfer?.setData("text/plain", workspaceId); - if (event.dataTransfer) { - event.dataTransfer.effectAllowed = "move"; - } - setDraggingWorkspaceId(workspaceId); - }; - - const handleDragOver = (event: DragEvent, workspaceId: string | null) => { - if (!draggingWorkspaceId()) return; - event.preventDefault(); - if (event.dataTransfer) { - event.dataTransfer.dropEffect = "move"; - } - setDragOverWorkspaceId(workspaceId); - }; - - const handleDragLeave = (workspaceId: string | null) => { - if (dragOverWorkspaceId() === workspaceId) { - setDragOverWorkspaceId(null); - } - }; - - const handleDrop = (event: DragEvent, workspaceId: string | null) => { - event.preventDefault(); - const dragId = draggingWorkspaceId() ?? event.dataTransfer?.getData("text/plain") ?? null; - if (!dragId) return; - if (workspaceId && dragId === workspaceId) { - setDraggingWorkspaceId(null); - setDragOverWorkspaceId(null); - return; - } - props.onReorderWorkspace(dragId, workspaceId); - setDraggingWorkspaceId(null); - setDragOverWorkspaceId(null); - }; - - const handleDragEnd = () => { - setDraggingWorkspaceId(null); - setDragOverWorkspaceId(null); - }; - - const progressDots = createMemo(() => { - const activeTodos = realTodos(); - const total = activeTodos.length; - if (!total) return [] as boolean[]; - const completed = activeTodos.filter((todo) => todo.status === "completed").length; - return Array.from({ length: total }, (_, idx) => idx < completed); - }); - - const [contextMenu, setContextMenu] = createSignal(null); - let contextMenuRef: HTMLDivElement | undefined; - const [contextMenuSize, setContextMenuSize] = createSignal({ width: 188, height: 96 }); - - const closeContextMenu = () => setContextMenu(null); - - const openContextMenu = (event: MouseEvent, sessionId: string) => { - event.preventDefault(); - event.stopPropagation(); - setContextMenu({ sessionId, x: event.clientX, y: event.clientY }); - }; - - const contextMenuStyle = createMemo(() => { - const menu = contextMenu(); - if (!menu) return undefined; - const size = contextMenuSize(); - const width = size.width; - const height = size.height; - if (typeof window === "undefined") { - return { left: `${menu.x}px`, top: `${menu.y}px` }; - } - const maxX = Math.max(12, window.innerWidth - width - 12); - const maxY = Math.max(12, window.innerHeight - height - 12); - return { - left: `${Math.min(menu.x, maxX)}px`, - top: `${Math.min(menu.y, maxY)}px`, - }; - }); - - createEffect(() => { - if (!contextMenu()) return; - const onKeyDown = (event: KeyboardEvent) => { - if (event.key === "Escape") { - closeContextMenu(); - } - }; - window.addEventListener("keydown", onKeyDown); - onCleanup(() => window.removeEventListener("keydown", onKeyDown)); - }); - - createEffect(() => { - const ids = new Set(props.workspaceGroups.map((group) => group.workspace.id)); - setCollapsedById((prev) => { - let changed = false; - const next: Record = {}; - for (const [id, value] of Object.entries(prev)) { - if (ids.has(id)) { - next[id] = value; - } else { - changed = true; - } - } - if (!changed) return prev; - writeWorkspaceCollapse(next); - return next; - }); - setShowAllSessionsByWorkspaceId((prev) => { - const next: Record = {}; - let changed = false; - for (const [id, value] of Object.entries(prev)) { - if (ids.has(id)) { - next[id] = value; - } else { - changed = true; - } - } - return changed ? next : prev; - }); - }); - - createEffect(() => { - if (!contextMenu()) return; - queueMicrotask(() => { - if (!contextMenuRef || typeof window === "undefined") return; - const rect = contextMenuRef.getBoundingClientRect(); - if (!rect.width || !rect.height) return; - setContextMenuSize({ width: rect.width, height: rect.height }); - }); - }); - - return ( -
-
- -
- -
-
-
-
{t("dashboard.workspaces")}
-
-
- 0} - fallback={ -
- {t("sidebar.no_workspaces")} -
- } - > - - {(group) => { - const isActive = () => props.selectedWorkspaceId === group.workspace.id; - const isConnecting = () => props.connectingWorkspaceId === group.workspace.id; - const pathLabel = () => workspacePathLabel(group.workspace); - const detailLabel = () => workspaceDetailLabel(group.workspace); - const isSandboxWorkspace = () => - group.workspace.workspaceType === "remote" && - (group.workspace.sandboxBackend === "docker" || - Boolean(group.workspace.sandboxRunId?.trim()) || - Boolean(group.workspace.sandboxContainerName?.trim())); - const sessions = () => group.sessions; - const connectionState = () => props.workspaceConnectionStateById[group.workspace.id]; - const connectionStatus = () => connectionState()?.status ?? "idle"; - const connectionMessage = () => connectionState()?.message?.trim() ?? ""; - const isActivelyConnecting = () => isConnecting() && connectionStatus() === "connecting"; - const hasPendingSwitch = () => { - const pendingId = props.connectingWorkspaceId; - if (!pendingId || pendingId === props.selectedWorkspaceId) return false; - const pendingStatus = props.workspaceConnectionStateById[pendingId]?.status ?? "idle"; - return pendingStatus === "connecting"; - }; - const allowActions = () => !hasPendingSwitch() || isConnecting() || isActive(); - const connectionDotClass = () => { - if (connectionStatus() === "connected") return "bg-green-9"; - if (connectionStatus() === "connecting") return "bg-amber-9 animate-pulse"; - if (connectionStatus() === "error") return "bg-red-9"; - return "bg-gray-7"; - }; - const collapsed = () => isWorkspaceCollapsed(group.workspace.id); - const dragOver = () => dragOverWorkspaceId() === group.workspace.id; - const showingAll = () => isShowingAllSessions(group.workspace.id); - const visibleSessions = () => - showingAll() ? sessions() : sessions().slice(0, MAX_SESSIONS_PREVIEW); - const hasMoreSessions = () => sessions().length > MAX_SESSIONS_PREVIEW; - - return ( -
handleDragOver(event, group.workspace.id)} - onDragLeave={() => handleDragLeave(group.workspace.id)} - onDrop={(event) => handleDrop(event, group.workspace.id)} - > -
- -
- - -
-
- -
- -
- {connectionMessage()} -
-
-
- - - - - - - - -
- 0} - fallback={ -
- {t("sidebar.no_sessions_yet")} -
- } - > - - {(session) => ( - - )} - - - - -
-
-
-
- ); - }} -
-
-
- -
-
-
- -
- 0}> - - -
-
- - - {(menu) => ( -
{ - event.preventDefault(); - closeContextMenu(); - }} - > - -
- )} -
-
- ); -} diff --git a/apps/app/src/app/context/workspace.ts b/apps/app/src/app/context/workspace.ts index 751b2a4f2..79f035135 100644 --- a/apps/app/src/app/context/workspace.ts +++ b/apps/app/src/app/context/workspace.ts @@ -42,7 +42,6 @@ import { engineStart, engineStop, sandboxDoctor, - sandboxStop, orchestratorInstanceDispose, orchestratorStartDetached, orchestratorWorkspaceActivate, @@ -3077,63 +3076,6 @@ export function createWorkspaceStore(options: { } } - async function stopSandbox(workspaceId: string) { - if (!isTauriRuntime()) { - options.setError(t("app.error.tauri_required", currentLocale())); - return; - } - - const id = workspaceId.trim(); - if (!id) return; - - const workspace = workspaces().find((entry) => entry.id === id) ?? null; - const containerName = workspace?.sandboxContainerName?.trim() ?? ""; - if (!containerName) { - options.setError("Sandbox container name missing."); - return; - } - - options.setBusy(true); - options.setBusyLabel("Stopping sandbox..."); - options.setBusyStartedAt(Date.now()); - options.setError(null); - - try { - const result = await sandboxStop(containerName); - if (!result.ok) { - const details = [result.stderr?.trim(), result.stdout?.trim()] - .filter(Boolean) - .join("\n") - .trim(); - throw new Error(details || `Failed to stop sandbox (status ${result.status})`); - } - - // If the user stopped the runtime-connected workspace, proactively disconnect the client. - if (connectedWorkspaceId() === id) { - options.setClient(null); - options.setConnectedVersion(null); - setConnectedWorkspaceId(null); - if (isTauriRuntime()) { - try { - await workspaceSetRuntimeActive(null); - } catch { - // ignore - } - } - options.setSseConnected(false); - } - - updateWorkspaceConnectionState(id, { status: "error", message: "Sandbox stopped." }); - } catch (e) { - const message = e instanceof Error ? e.message : safeStringify(e); - options.setError(addOpencodeCacheHint(message)); - } finally { - options.setBusy(false); - options.setBusyLabel(null); - options.setBusyStartedAt(null); - } - } - async function pickWorkspaceFolder() { if (!isTauriRuntime()) { options.setError(t("app.error.tauri_required", currentLocale())); @@ -3169,12 +3111,6 @@ export function createWorkspaceStore(options: { return joinNativePath(joinNativePath(base, DEFAULT_WORKSPACE_HOME_FOLDER_NAME), FIRST_RUN_WELCOME_WORKSPACE_NAME); } - async function createWorkspaceFromPickedFolder() { - const folder = await pickWorkspaceFolder(); - if (!folder) return false; - return createWorkspaceFlow("minimal", folder); - } - async function exportWorkspaceConfig(workspaceId?: string) { if (exportingWorkspaceConfig()) return; if (!isTauriRuntime()) { @@ -3764,31 +3700,6 @@ export function createWorkspaceStore(options: { setWorkspaceConfig(cfg); } - async function persistReloadSettings(next: { auto?: boolean; resume?: boolean }) { - if (!isTauriRuntime()) return; - if (selectedWorkspaceInfo()?.workspaceType === "remote") return; - const root = selectedWorkspacePath().trim(); - if (!root) return; - - const existing = workspaceConfig(); - const cfg: WorkspaceOpenworkConfig = { - version: existing?.version ?? 1, - workspace: existing?.workspace ?? null, - authorizedRoots: Array.isArray(existing?.authorizedRoots) ? existing!.authorizedRoots : authorizedDirs(), - blueprint: existing?.blueprint ?? null, - reload: { - auto: Boolean(next.auto), - resume: Boolean(next.resume), - }, - }; - - const persistedViaServer = await persistWorkspaceConfigToOpenworkServer(cfg).catch(() => false); - if (!persistedViaServer) { - await workspaceOpenworkWrite({ workspacePath: root, config: cfg }); - } - setWorkspaceConfig(cfg); - } - async function addAuthorizedDir() { if (selectedWorkspaceInfo()?.workspaceType === "remote") return; const next = newAuthorizedDir().trim(); @@ -4119,7 +4030,6 @@ export function createWorkspaceStore(options: { testWorkspaceConnection, connectToServer, createWorkspaceFlow, - createWorkspaceFromPickedFolder, createSandboxFlow, createRemoteWorkspaceFlow, updateRemoteWorkspaceFlow, @@ -4132,7 +4042,6 @@ export function createWorkspaceStore(options: { saveWorkspaceConnectionSettings, forgetWorkspace, recoverWorkspace, - stopSandbox, pickWorkspaceFolder, exportWorkspaceConfig, importWorkspaceConfig, @@ -4152,7 +4061,6 @@ export function createWorkspaceStore(options: { addAuthorizedDirFromPicker, removeAuthorizedDir, removeAuthorizedDirAtIndex, - persistReloadSettings, setEngineInstallLogs, refreshSandboxDoctor, sandboxCreateProgress, diff --git a/apps/app/src/app/pages/config.tsx b/apps/app/src/app/pages/config.tsx index fd3828f6d..d84183377 100644 --- a/apps/app/src/app/pages/config.tsx +++ b/apps/app/src/app/pages/config.tsx @@ -34,12 +34,6 @@ export type ConfigViewProps = { reloadBusy: boolean; reloadError: string | null; - workspaceAutoReloadAvailable: boolean; - workspaceAutoReloadEnabled: boolean; - setWorkspaceAutoReloadEnabled: (value: boolean) => void | Promise; - workspaceAutoReloadResumeEnabled: boolean; - setWorkspaceAutoReloadResumeEnabled: (value: boolean) => void | Promise; - developerMode: boolean; }; @@ -180,9 +174,6 @@ export default function ConfigView(props: ConfigViewProps) { }, reload: { canReloadWorkspace: props.canReloadWorkspace, - autoReloadAvailable: props.workspaceAutoReloadAvailable, - autoReloadEnabled: props.workspaceAutoReloadEnabled, - autoReloadResumeEnabled: props.workspaceAutoReloadResumeEnabled, }, sharing: { hostConnectUrl: hostConnectUrl() || null, @@ -269,45 +260,6 @@ export default function ConfigView(props: ConfigViewProps) { -
-
-
{t("config.auto_reload_title")}
-
{t("config.auto_reload_desc")}
- -
{t("config.auto_reload_unavailable")}
-
-
- -
- -
-
-
{t("config.resume_sessions_title")}
-
- {t("config.resume_sessions_desc")} -
-
- -
diff --git a/apps/app/src/app/pages/session.tsx b/apps/app/src/app/pages/session.tsx index ebc016659..626ff015f 100644 --- a/apps/app/src/app/pages/session.tsx +++ b/apps/app/src/app/pages/session.tsx @@ -98,7 +98,6 @@ import Composer from "../components/session/composer"; import type { ComposerNotice } from "../components/session/composer-notice"; import { createSessionScrollController } from "../components/session/scroll-controller"; import WorkspaceSessionList from "../components/session/workspace-session-list"; -import type { SidebarSectionState } from "../components/session/sidebar"; import FlyoutItem from "../components/flyout-item"; import QuestionModal from "../components/question-modal"; import { @@ -116,7 +115,6 @@ import { export type SessionViewProps = { selectedSessionId: string | null; setView: (view: View, sessionId?: string) => void; - settingsTab: SettingsTab; setSettingsTab: (tab: SettingsTab) => void; toggleSettings: () => void; selectedWorkspaceDisplay: WorkspaceDisplay; @@ -133,10 +131,6 @@ export type SessionViewProps = { editWorkspaceConnection: (workspaceId: string) => void; forgetWorkspace: (workspaceId: string) => void; openCreateWorkspace: () => void; - pickFolderWorkspace: () => Promise; - openCreateRemoteWorkspace: () => void; - importWorkspaceConfig: () => void; - importingWorkspaceConfig: boolean; exportWorkspaceConfig: (workspaceId?: string) => void; exportWorkspaceBusy: boolean; clientConnected: boolean; @@ -154,7 +148,6 @@ export type SessionViewProps = { orchestratorStatus: OrchestratorStatus | null; opencodeRouterInfo: OpenCodeRouterInfo | null; appVersion: string | null; - stopHost: () => void; headerStatus: string; busyHint: string | null; updateStatus: { @@ -167,13 +160,11 @@ export type SessionViewProps = { downloadedBytes?: number; message?: string; } | null; - updateEnv: { supported?: boolean; reason?: string | null } | null; anyActiveRuns: boolean; installUpdateAndRestart: () => void; newTaskDisabled: boolean; workspaceSessionGroups: WorkspaceSessionGroup[]; openRenameWorkspace: (workspaceId: string) => void; - selectSession: (sessionId: string) => Promise | void; messages: MessageWithParts[]; getSessionById: (sessionId: string | null) => Session | null; getMessagesBySessionId: (sessionId: string | null) => MessageWithParts[]; @@ -187,16 +178,8 @@ export type SessionViewProps = { setExpandedStepIds: ( updater: (current: Set) => Set, ) => Set; - expandedSidebarSections: SidebarSectionState; - setExpandedSidebarSections: ( - updater: (current: SidebarSectionState) => SidebarSectionState, - ) => SidebarSectionState; workingFiles: string[]; - authorizedDirs: string[]; - activePlugins: string[]; - activePluginStatus: string | null; skills: SkillCard[]; - skillsStatus: string | null; busy: boolean; prompt: string; setPrompt: (value: string) => void; diff --git a/apps/app/src/app/pages/settings.tsx b/apps/app/src/app/pages/settings.tsx index e20aa0afb..db36b27bf 100644 --- a/apps/app/src/app/pages/settings.tsx +++ b/apps/app/src/app/pages/settings.tsx @@ -199,11 +199,6 @@ export type SettingsViewProps = { reloadWorkspaceEngine: () => Promise; reloadBusy: boolean; reloadError: string | null; - workspaceAutoReloadAvailable: boolean; - workspaceAutoReloadEnabled: boolean; - setWorkspaceAutoReloadEnabled: (value: boolean) => void | Promise; - workspaceAutoReloadResumeEnabled: boolean; - setWorkspaceAutoReloadResumeEnabled: (value: boolean) => void | Promise; connectRemoteWorkspace: (input: { openworkHostUrl?: string | null; openworkToken?: string | null; @@ -2225,11 +2220,6 @@ export default function SettingsView(props: SettingsViewProps) { reloadWorkspaceEngine={props.reloadWorkspaceEngine} reloadBusy={props.reloadBusy} reloadError={props.reloadError} - workspaceAutoReloadAvailable={props.workspaceAutoReloadAvailable} - workspaceAutoReloadEnabled={props.workspaceAutoReloadEnabled} - setWorkspaceAutoReloadEnabled={props.setWorkspaceAutoReloadEnabled} - workspaceAutoReloadResumeEnabled={props.workspaceAutoReloadResumeEnabled} - setWorkspaceAutoReloadResumeEnabled={props.setWorkspaceAutoReloadResumeEnabled} developerMode={props.developerMode} /> diff --git a/apps/app/src/app/shell/settings-shell.tsx b/apps/app/src/app/shell/settings-shell.tsx index 8643148e8..7cedc6155 100644 --- a/apps/app/src/app/shell/settings-shell.tsx +++ b/apps/app/src/app/shell/settings-shell.tsx @@ -93,7 +93,6 @@ export type SettingsShellProps = { ) => Promise<{ connected: boolean; pending?: boolean; message?: string }>; submitProviderApiKey: (providerId: string, apiKey: string) => Promise; refreshProviders: () => Promise; - view: View; setView: (view: View, sessionId?: string) => void; toggleSettings: () => void; startupPreference: StartupPreference | null; @@ -101,7 +100,6 @@ export type SettingsShellProps = { clientConnected: boolean; busy: boolean; busyHint: string | null; - busyLabel: string | null; newTaskDisabled: boolean; headerStatus: string; error: string | null; @@ -135,11 +133,6 @@ export type SettingsShellProps = { reloadWorkspaceEngine: () => Promise; reloadBusy: boolean; reloadError: string | null; - workspaceAutoReloadAvailable: boolean; - workspaceAutoReloadEnabled: boolean; - setWorkspaceAutoReloadEnabled: (value: boolean) => void | Promise; - workspaceAutoReloadResumeEnabled: boolean; - setWorkspaceAutoReloadResumeEnabled: (value: boolean) => void | Promise; selectedWorkspaceDisplay: WorkspaceInfo; workspaces: WorkspaceInfo[]; selectedWorkspaceId: string; @@ -150,7 +143,6 @@ export type SettingsShellProps = { testWorkspaceConnection: (workspaceId: string) => Promise | boolean; recoverWorkspace: (workspaceId: string) => Promise | boolean; openCreateWorkspace: () => void; - openCreateRemoteWorkspace: () => void; connectRemoteWorkspace: (input: { openworkHostUrl?: string | null; openworkToken?: string | null; @@ -163,8 +155,6 @@ export type SettingsShellProps = { templateData: unknown; organizationName?: string | null; }) => Promise | void; - importWorkspaceConfig: () => void; - importingWorkspaceConfig: boolean; exportWorkspaceConfig: (workspaceId?: string) => void; exportWorkspaceBusy: boolean; workspaceSessionGroups: WorkspaceSessionGroup[]; @@ -172,10 +162,8 @@ export type SettingsShellProps = { openRenameWorkspace: (workspaceId: string) => void; editWorkspaceConnection: (workspaceId: string) => void; forgetWorkspace: (workspaceId: string) => void; - stopSandbox: (workspaceId: string) => void; schedulerPluginInstalled: boolean; selectedWorkspaceRoot: string; - isRemoteWorkspace: boolean; skillsAccessHint?: string | null; canInstallSkillCreator: boolean; canUseDesktopTools: boolean; @@ -201,7 +189,6 @@ export type SettingsShellProps = { addPlugin: (pluginNameOverride?: string) => void; createSessionInWorkspace: (workspaceId: string, initialPrompt?: string) => Promise | string | void; createSessionAndOpen: (initialPrompt?: string) => Promise | string | void; - selectSession: (sessionId: string) => Promise | void; hideTitlebar: boolean; toggleHideTitlebar: () => void; opencodeEnableExa: boolean; @@ -1243,13 +1230,8 @@ export default function SettingsShell(props: SettingsShellProps) { reloadWorkspaceEngine={props.reloadWorkspaceEngine} reloadBusy={props.reloadBusy} reloadError={props.reloadError} - workspaceAutoReloadAvailable={props.workspaceAutoReloadAvailable} - workspaceAutoReloadEnabled={props.workspaceAutoReloadEnabled} - setWorkspaceAutoReloadEnabled={props.setWorkspaceAutoReloadEnabled} - workspaceAutoReloadResumeEnabled={props.workspaceAutoReloadResumeEnabled} - setWorkspaceAutoReloadResumeEnabled={props.setWorkspaceAutoReloadResumeEnabled} - connectRemoteWorkspace={props.connectRemoteWorkspace} - openTeamBundle={props.openTeamBundle} + connectRemoteWorkspace={props.connectRemoteWorkspace} + openTeamBundle={props.openTeamBundle} />