diff --git a/.tasks/5f407d28.md b/.tasks/5f407d28.md
index 92adedbff..b13ad8813 100644
--- a/.tasks/5f407d28.md
+++ b/.tasks/5f407d28.md
@@ -1,7 +1,7 @@
---
id: 5f407d28
title: Remove old git diff and file browser screens - keep only file explorer
-status: open
+status: done
deps: []
created: 2026-01-08T16:21:35.362Z
---
diff --git a/packages/app/src/app/_layout.tsx b/packages/app/src/app/_layout.tsx
index d623ac4a5..0feabcd57 100644
--- a/packages/app/src/app/_layout.tsx
+++ b/packages/app/src/app/_layout.tsx
@@ -270,8 +270,6 @@ export default function RootLayout() {
-
-
diff --git a/packages/app/src/app/agent/[serverId]/[agentId].tsx b/packages/app/src/app/agent/[serverId]/[agentId].tsx
index 99c984a77..938b27c94 100644
--- a/packages/app/src/app/agent/[serverId]/[agentId].tsx
+++ b/packages/app/src/app/agent/[serverId]/[agentId].tsx
@@ -192,7 +192,7 @@ function AgentScreenContent({
addImagesRef.current = addImages;
}, []);
- const { isOpen: isExplorerOpen, toggle: toggleExplorer, open: openExplorer, close: closeExplorer } = useExplorerSidebarStore();
+ const { isOpen: isExplorerOpen, toggle: toggleExplorer, open: openExplorer, close: closeExplorer, setActiveTab: setExplorerTab } = useExplorerSidebarStore();
const {
translateX: explorerTranslateX,
backdropOpacity: explorerBackdropOpacity,
@@ -580,29 +580,15 @@ function AgentScreenContent({
const handleViewChanges = useCallback(() => {
handleCloseMenu();
- if (resolvedAgentId) {
- router.push({
- pathname: "/git-diff",
- params: {
- agentId: resolvedAgentId,
- serverId: serverId,
- },
- });
- }
- }, [resolvedAgentId, serverId, router, handleCloseMenu]);
+ setExplorerTab("changes");
+ openExplorer();
+ }, [handleCloseMenu, setExplorerTab, openExplorer]);
const handleBrowseFiles = useCallback(() => {
handleCloseMenu();
- if (resolvedAgentId) {
- router.push({
- pathname: "/file-explorer",
- params: {
- agentId: resolvedAgentId,
- serverId: serverId,
- },
- });
- }
- }, [handleCloseMenu, resolvedAgentId, serverId, router]);
+ setExplorerTab("files");
+ openExplorer();
+ }, [handleCloseMenu, setExplorerTab, openExplorer]);
const handleRefreshAgent = useCallback(() => {
if (!resolvedAgentId || !refreshAgent) {
diff --git a/packages/app/src/app/file-explorer.tsx b/packages/app/src/app/file-explorer.tsx
deleted file mode 100644
index 672fa9753..000000000
--- a/packages/app/src/app/file-explorer.tsx
+++ /dev/null
@@ -1,1802 +0,0 @@
-import { useCallback, useEffect, useMemo, useRef, useState } from "react";
-import {
- ActivityIndicator,
- Alert,
- FlatList,
- Image as RNImage,
- LayoutChangeEvent,
- ListRenderItemInfo,
- RefreshControl,
- ViewToken,
- NativeScrollEvent,
- NativeSyntheticEvent,
- Modal,
- Platform,
- Pressable,
- ScrollView,
- Text,
- View,
- BackHandler,
- useWindowDimensions,
-} from "react-native";
-import { StyleSheet, useUnistyles } from "react-native-unistyles";
-import { router, useFocusEffect, useLocalSearchParams } from "expo-router";
-import * as Clipboard from "expo-clipboard";
-import { File as FSFile, Paths } from "expo-file-system";
-import * as Sharing from "expo-sharing";
-import {
- BottomSheetModal,
- BottomSheetScrollView,
- BottomSheetBackdrop,
- BottomSheetView,
-} from "@gorhom/bottom-sheet";
-import {
- Check,
- Download,
- File,
- FileText,
- Folder,
- Image as ImageIcon,
- LayoutGrid,
- List as ListIcon,
- MoreVertical,
- X,
- XCircle,
-} from "lucide-react-native";
-import { BackHeader } from "@/components/headers/back-header";
-import type { ExplorerEntry } from "@/stores/session-store";
-import type { ConnectionStatus } from "@/contexts/daemon-connections-context";
-import { useDaemonConnections } from "@/contexts/daemon-connections-context";
-import type { DaemonProfile } from "@/contexts/daemon-registry-context";
-import { formatConnectionStatus } from "@/utils/daemons";
-import { useSessionStore } from "@/stores/session-store";
-
-export default function FileExplorerScreen() {
- const {
- agentId,
- path: pathParamRaw,
- file: fileParamRaw,
- serverId,
- } = useLocalSearchParams<{
- agentId: string;
- path?: string | string[];
- file?: string | string[];
- serverId?: string;
- }>();
- const resolvedServerId = typeof serverId === "string" ? serverId : undefined;
- const { connectionStates } = useDaemonConnections();
-
- const session = useSessionStore((state) =>
- resolvedServerId ? state.sessions[resolvedServerId] : undefined
- );
-
- const connectionServerId = resolvedServerId ?? null;
- const connection = connectionServerId ? connectionStates.get(connectionServerId) : null;
- const serverLabel = connection?.daemon.label ?? connectionServerId ?? resolvedServerId ?? "Selected host";
- const connectionStatus = connection?.status ?? "idle";
- const connectionStatusLabel = formatConnectionStatus(connectionStatus);
- const lastError = connection?.lastError ?? null;
-
- if (!session) {
- return (
-
- );
- }
-
- const routeServerId = resolvedServerId ?? session.serverId;
-
- return (
-
- );
-}
-
-type FileExplorerContentProps = {
- serverId: string;
- agentId?: string;
- pathParamRaw?: string | string[];
- fileParamRaw?: string | string[];
-};
-
-type FileExplorerSessionUnavailableProps = {
- agentId?: string;
- serverId?: string;
- serverLabel: string;
- connectionStatus: ConnectionStatus;
- connectionStatusLabel: string;
- lastError: string | null;
-};
-
-function FileExplorerContent({
- serverId,
- agentId,
- pathParamRaw,
- fileParamRaw,
-}: FileExplorerContentProps) {
- const { theme } = useUnistyles();
- const { connectionStates } = useDaemonConnections();
- const daemonProfile = connectionStates.get(serverId)?.daemon;
-
- const agent = useSessionStore((state) =>
- agentId && state.sessions[serverId]
- ? state.sessions[serverId]?.agents.get(agentId)
- : undefined
- );
-
- const explorerState = useSessionStore((state) =>
- agentId && state.sessions[serverId]
- ? state.sessions[serverId]?.fileExplorer.get(agentId)
- : undefined
- );
-
- const methods = useSessionStore((state) => state.sessions[serverId]?.methods);
- const requestDirectoryListing = methods?.requestDirectoryListing;
- const requestFilePreview = methods?.requestFilePreview;
- const requestFileDownloadToken = methods?.requestFileDownloadToken;
- const navigateExplorerBack = methods?.navigateExplorerBack;
- const [viewMode, setViewMode] = useState<"list" | "grid">("list");
- const [selectedEntryPath, setSelectedEntryPath] = useState(null);
- const pendingPathParamRef = useRef(null);
- const pendingFileParamRef = useRef(null);
- const listScrollRef = useRef | null>(null);
- const listScrollOffsetRef = useRef(0);
- const scrollOffsetsByPathRef = useRef