Снимок: 2026-10-11. Секция хаба Tools, тайл «Файлы» / «Files», подпись «Просмотр, правка и передача файлов на устройстве и серверах» / «View, edit and transfer files on device and servers». Доступен всегда.
Что это
Плюс просмотрщик текста/картинок/markdown/кода (FileViewerScreen).
Экран и навигация
Маршруты:
Screen.LocalFiles→FileManagerScreenс переключателем источников (showSources = true):termuxплюс каждый SSH-сервер изremote_servers. Выбор источника живёт в шапке: подпись:termux ⌄в терминальном промпте открывает окноFileSourceWindow(секции «Устройство» / «SSH-серверы»); строка чипов над списком убрана, чтобы не занимать место у клавиатуры.Screen.ServerFiles(serverId)→ тот же экран, но источник прибит к серверу (пункт «Файлы» в меню карточки сервера и мостserver_files). Требует только SSH — туннель и codex app-server не нужны.Screen.FsFile(path)→ тот жеFileManagerScreen, ноviewerOnly = true(открытие файла-вложения из чата/моста).- Источник:
FsSource— интерфейс с двумя реализациями (host-local через/api/v1/fs/*, remote через/api/v1/remote/fs/*); варианты собираетfileSourceOptions(ui/files/FileSources.kt), недоступные серверы несут причину и чип гаснет.
Возможности (подробно)
Обзор и навигация
- Старт:
bootstrap→probeLocations— список корней (Termux HOME, sdcard, пользовательскиеaddLocation). loadDir(dir)— листинг,refresh,up/goToPath(path)— навигация,customRoots— свои корни,forgetLastPath— сброс последнего пути.- Хлебные крошки (
breadcrumb), скрытые файлы (toggleHidden), поиск (startSearch/clearSearch— через/api/v1/fs/search).
Сортировка и фильтры
applySort(имя/размер/дата/тип),filterItems,sortItemsвFileFormat.kt.FileSortSheet— bottomSheet выбора сортировки.
Выделение и массовые операции
toggleSelect/selectAll/clearSelection— множественное выделение.- Буфер обмена ФМ:
setClipboard/paste/clearClipboard. - Массовые действия (
FileBulkSheet): копировать, переместить, удалить, скачать/загрузить.copySelectionTo/moveSelectionTo→runOperation.
Создание, переименование, удаление
createFolder,createFile(через/api/v1/fs/mkdir+ запись),rename(через/api/v1/fs/move),delete(через/api/v1/fs/delete).- Диалоги:
FileNameDialog(создать/переименовать),FileActionsSheet,FileMoreSheet,FileNewSheet.
Свойства и размер
loadProperties/closeProperties— панель свойств (FilePropertiesSheet): права, размер, дата, тип.computeSize— рекурсивный размер папки (через/api/v1/fs/du).
Передача файлов (upload/download)
upload— загрузка с устройства в backend-хоста (multipart,/api/v1/fs/upload),downloadFiles/startDownload— скачивание на устройство (через DownloadManager +mediaStoreSink/SAF).- Прогресс:
setTransfer/reportProgress/cancelTransfer— панельFileTransferBarс процентами и отменой.
Просмотр и редактирование
FileViewerScreen(453 строки) +ZoomableImage— просмотр картинок с зумом.guessMime— определение типа по расширению,fileKind/fileKindLabel— категория (изображение/текст/код/markdown/медиа/архив).openFileExternally— открыть системным приложением,shareFileExternally— поделиться,copyTextToClipboard— копировать текст.saveToDownloads— сохранить картинку из просмотрщика.
Ошибки и устойчивость
friendlyFsError— человеческие сообщения вместо сырых кодов.isProtectedPath— защита системных путей от записи.
Где в коде
| Файл | Строк | Роль |
|---|---|---|
ui/files/FileManagerScreen.kt | 983 | Главный экран, PickerBar, открытие/скачивание |
ui/files/FileManagerViewModel.kt | 631 | Состояние, операции, передача, локации |
ui/files/FileSheets.kt | 478 | BottomSheet: действия, массовые, сортировка, свойства, локации |
ui/files/FileViewerScreen.kt | 453 | Просмотрщик, зум картинок |
ui/files/FileRows.kt | 436 | Строки файлов, панели управления/выбора/передачи |
ui/files/FileFormat.kt | 265 | Форматирование, типы файлов, ошибки |
ui/files/FsSource.kt | 137 | Источник: локальный /fs/* или remote /remote/fs/* |
ui/files/FileSources.kt | 96 | Варианты источников (termux + серверы), причины блокировки |
ui/files/FileModels.kt | 107 | Модели данных |
Данные и API
data/api/BackendApiFs.kt + data/api/RemoteFsApi.kt — два параллельных набора по 13 операций (home, list, stat, statfs, du, search, mkdir, move, copy, delete, read, write, upload/download) для локального хоста и remote.
Репозиторий: data/repo/FsRepository.kt. Сеть: data/net/HttpClients (OkHttp). Права на sdcard/фото — через SAF (filemanager.StorageAccess).
Агент
MCP-тулы
file_read(path, mode=lines|bytes, offset, limit, cursor)— прочитать куском, только профиль/mcp.file_write(path, content)— записать атомарно в whitelist-корни (backend/, y83-ws, uploads/, tmp/…), только/mcp.json_query(json|path, query)— запрос по dot-пути к JSON, только/mcp.
В чате Codex агент ходит по файлам через CodexAttach/fs/*, а не через MCP-файловые тулы (их нет в /mcp/codex).
Мост
app_files— список файлов/папок в директории.app_navigate+app_ui_action— открыть ФМ и работать по элементам.
Как агент открывает
app_navigate на Screen.LocalFiles, или MCP file_read/file_write без открытия экрана (предпочтительнее для агента).
Подводные камни
- Два источника, один UI.
FsSourceвыбирается по текущему хосту; один и тот же путь на локальном хосте и на сервере — разные файлы. - Права на sdcard. Через SAF, не через Termux-права — на Android 13+ запись в公共ные папки требует выданного доступа.
- Передача больших файлов.
uploadидёт multipart через OkHttp — при обрыве прогресс теряется, есть только отмена. duна больших папках. Рекурсивный размер — дорогая операция.isProtectedPath. Попытка писать в системные пути блокируется.
Как обновлять
- Каталог:
data/InstrumentCatalog.kt(idfiles). - Маршрут:
ui/navigation/Screen.kt(Screen.LocalFiles,Screen.FsFile),MainRouter. - Код:
ui/files/*. - API:
data/api/BackendApiFs.kt,data/api/RemoteFsApi.kt,backend/internal/api/v1/routes.go(/api/v1/fs/*,/api/v1/remote/fs/*). - Репозиторий:
data/repo/FsRepository.kt.