Снимок: 2026-10-11. Секция хаба Tools, тайл «Данные» / «Data», подпись «Просмотр и правка таблиц SQLite, строк и экспорта». Доступен всегда.
Экраны и навигация
Screen.Databases→DatabasesScreen(375 строк) — список баз.Screen.SqliteDb(dbPath, displayName, kind, builtin)→SQLiteBrowserScreen(729 строк) — браузер базы.AddDatabaseDialog(281) — добавить свою базу (путь или быстрый выбор).
Какие базы видны
| Источник | База | Описание | read-only по умолчанию |
|---|---|---|---|
| Встроенная | ~/.y83-ws/ws-backend.db | Y83 Backend — webai-аккаунты, промпты, провайдеры | да (builtin) |
| Встроенная | ~/.local/share/opencode/opencode.db | OpenCode — сессии | да |
| Приложение | y83-ws.db | Agents & Projects — агенты, проекты, политики | нет (SqliteKind.APP) |
| Приложение | y83-chat.db | Chat Cache — треды и события Codex | нет |
| Пользователь | любая .db | через AddDatabaseDialog | зависит от DbPrefs |
Встроенные ссылки правятся только осознанно — по умолчанию read-only (комментарий в SqliteRef). Режим переключается в самой базе (setReadOnly, sqlite_read_only/sqlite_read_only_1).
Возможности (подробно)
Список баз (DatabasesScreen)
- Метрики по каждой базе (
DbMetric): размер, число таблиц, ошибка —loadMetrics. - Поиск по имени/пути (
setQuery,sqlite_search_by_name_or_path). - Добавление (
addDb+AddDatabaseDialogс быстрым выбором из файлов Termux,dbPickEntries) и удаление из списка (removeDb— файл не трогается,sqlite_will_disappear_from_the_list_the_database_fi). - Обновление (
refresh), понятные ошибки (sqlite_no_access,sqlite_can_t_open).
Просмотр данных (SQLiteBrowserScreen)
Две вкладки:
- Data (
DataTab) — таблицы и строки:- список таблиц (
sqlite_pick_table_data), обновление (refreshTables), - постраничная загрузка строк (
loadFirstPage/loadMore,sqlite_shown_rows/sqlite_load_more), - поиск по таблице: по всем колонкам или по конкретной (
setFilterText/setFilterColumn/scheduleFilter), - раскрытие ячейки (
toggleExpand,rowKeyLabel).
- список таблиц (
- Schema (
SqlTab) — схема таблицы, SQL-запросы.
Правка данных
- Редактирование ячеек:
startEdit/updateEditValue/navigateEdit(переход по Tab/стрелкам)/cancelEdit/saveEdit,parseEditValue— приведение типа. - Ограничения:
sqlite_no_key_hint(без PK правка недоступна),sqlite_this_cell_can_t_be_changed(read-only колонка). - Добавление строки (
insertRow), удаление (deleteRow) — с подтверждением (sqlite_delete_row_title). - Конфликты:
sqlite_row_has_already_changed_list_updated— список обновляется, а не падает.
SQL-консоль
runSql— выполнить запрос,updateSql— редактор,isQuerySql— отличить SELECT от DDL/DML,isDestructiveSql— предупреждение (sqlite_dangerous_query),hasMultipleStatements— запрет (sqlite_single_statement).- История SQL:
DbPrefs.sqlHistory/pushSqlHistory.
Экспорт (SqliteExport.kt)
Форматы по выбору: CSV, JSON, SQL-INSERT (csv/json/sqlInsert), cellText/sqlLiteral/csvCell — корректная экранировка, clean — имя файла, rowsOf — данные.
Где в коде
| Файл | Строк | Роль |
|---|---|---|
ui/sqlite/SQLiteBrowserScreen.kt | 729 | Браузер: Data/Schema, строки, SQL |
ui/sqlite/SqliteBrowserViewModel.kt | 535 | Состояние, загрузка, правка, экспорт |
ui/sqlite/SqliteSource.kt | 427 | Источники данных: file/app/remote, openRo |
ui/sqlite/DatabasesScreen.kt | 375 | Список баз, встроенные, метрики |
ui/sqlite/AddDatabaseDialog.kt | 281 | Диалог добавления базы |
ui/sqlite/DatabasesViewModel.kt | 164 | Список, метрики, add/remove |
ui/sqlite/SqliteExport.kt | 94 | Экспорт CSV/JSON/SQL |
ui/sqlite/DbPrefs.kt | 47 | Read-only, история SQL |
ui/sqlite/DbFileBrowserFilter.kt | 9 | Быстрый выбор файлов |
ui/sqlite/components/ | — | Мелкие компоненты |
Репозиторий: data/repo/SqliteRepository.kt.
Данные и API
| Эндпоинт | Назначение |
|---|---|
POST /api/v1/sqlite/meta | Метаданные базы (таблицы, размер) |
POST /api/v1/sqlite/schema | Схема |
POST /api/v1/sqlite/rows | Чтение строк (постранично) |
POST /api/v1/sqlite/query | Выполнить SELECT |
POST /api/v1/sqlite/execute | Выполнить произвольный SQL |
POST /api/v1/sqlite/update | Обновить строку |
POST /api/v1/sqlite/insert | Вставить строку |
POST /api/v1/sqlite/delete | Удалить строку |
Локальные базы приложения читаются напрямую (SqliteSource.localCount, openRo — read-only-подключение), без backend.
Агент
Команды моста (sqlite_* — 8 штук)
| Команда | Действие |
|---|---|
sqlite_dbs | Список доступных баз |
sqlite_db | Открыть базу (мета/схема) |
sqlite_db_add | Добавить путь базы |
sqlite_db_remove | Убрать из списка |
sqlite_tables | Список таблиц |
sqlite_query | Выполнить запрос |
sqlite_execute | Выполнить SQL (запись) |
sqlite_browser | Открыть экран браузера базы |
MCP-тулы
Отдельных SQLite-тулов в MCP-инвентаре нет. Агент ходит через мост (sqlite_query/sqlite_execute) либо читает БД как файл через file_read (только /mcp).
Подводные камни
- Read-only по умолчанию для встроенных баз. Правка
ws-backend.dbиз приложения требует явного переключения режима — это защита от порчи данных backend. - Только один SQL-оператор за раз (
sqlite_single_statement). - Опасные запросы помечаются (
isDestructiveSql) и требуют подтверждения. - Нет PK — правка невозможна (
sqlite_table_has_no_key_editing_unavailable). - Конкурентные изменения. Список не перезагружается сам: при конфликте показывается подсказка и список обновляется.
- Секретные колонки мост не отдаёт. В ответах
sqlite_queryи SELECT-веткиsqlite_executeзначения колонок видаpassword,authRef,obfsPassword,…token,secret,api_keyприходят заглушкой<redacted>. Имена колонок и счётчики строк сохраняются, поэтому отлаживать запросы можно. removeDbубирает только из списка, файл на диске остаётся.- Локальные базы — read-only-подключение (
openRo), даже если режим разрешает запись: правка идёт через backend-эндпоинты.
Как обновлять
- Каталог:
data/InstrumentCatalog.kt(iddb). - Маршрут:
ui/navigation/Screen.kt(Screen.Databases,Screen.SqliteDb). - Код:
ui/sqlite/*. - Репозиторий:
data/repo/SqliteRepository.kt. - API:
data/api/BackendApiSqlite.kt, роуты —backend/internal/api/v1/routes.go. - Мост:
bridge/BridgeSqliteHandlers.kt, реестр —BridgeCommands.kt.