TUI client for eva kernel
  • Python 94.2%
  • Nix 5.8%
Find a file
Aleksandr 75ac6dba89 ctrl+f ходит по живому списку папок из ядра
Своя → остальные из /v1/chats/folders (android, telegram, …) → все;
статический цикл tui/telegram больше не прячет чужие полки.

Co-Authored-By: Eva
2026-07-06 23:39:05 +03:00
src/eva_tui ctrl+f ходит по живому списку папок из ядра 2026-07-06 23:39:05 +03:00
.gitignore Терминальный клиент: Textual поверх API ядра 2026-07-02 16:30:10 +03:00
AGENTS.md Терминальный клиент: Textual поверх API ядра 2026-07-02 16:30:10 +03:00
flake.lock Терминальный клиент: Textual поверх API ядра 2026-07-02 16:30:10 +03:00
flake.nix Токен: token_file на всех слоях, обёртка отдаёт путь 2026-07-03 15:09:29 +03:00
pyproject.toml Терминальный клиент: Textual поверх API ядра 2026-07-02 16:30:10 +03:00
README.md ctrl+f ходит по живому списку папок из ядра 2026-07-06 23:39:05 +03:00

eva-tui 💻

Я в твоём терминале, Господин. Textual + httpx, тонкий клиент к eva-kernel — весь ум в ядре, здесь только лента и клавиши.

Что умеет

  • Чаты — живут в папке tui, не смешиваясь с telegram и android; создать ctrl+n (Enter — обычный, t — временный; название чату придумает модель по первому сообщению), удалить ctrl+x (с подтверждением), обновить ctrl+r. ctrl+f переключает папку: своя → остальные из базы (android, telegram, …) → все — одни и те же чаты видны из любого клиента, просто с разных полок.
  • Стриминг — ответ капает дельтами в один виджет; вызовы инструментов показываются пометками ⚙ с краткими аргументами по ходу тура. Пока тур жив, над полем ввода крутится статус со спиннером, сменными глаголами и секундомером; Esc останавливает генерацию (частичный ответ сохраняется в ядре).
  • Кнопочные вопросы — когда Ева спрашивает через ask_questions, варианты появляются кнопками прямо в ленте (плюс «💬 Дообсудить»); после ответа кнопки сменяются «/»-записью тула.
  • Markdown — ответы Евы рендерятся markdown'ом (код, списки, таблицы); реплики пользователя показываются как есть.
  • История страницами — открывается хвост из 50 сообщений, PageUp у верхнего края догружает старше. Вся история не тянется никогда.
  • Спикеры — чужие реплики в общих чатах подписаны именем личности из базы ядра (жёлтым); свои — you.
  • О чатеctrl+o: метаданные, саммари компакции и компакция по кнопке (c). Спросить Еву о саммари можно прямо в чате — тур его видит.
  • Расходctrl+s: окна час/сегодня/неделя/месяц (14), итог, триаж, разбивка по моделям и чатам.
  • Телеграм-настройкиctrl+d: дебаунс триажа, потолок ответа и краткость по чатам и пользователям; Enter — правка, пустое поле — глобальная логика ядра.

Запуск

nix develop -c python -m eva_tui.app --url http://127.0.0.1:8090
# или: nix run . -- --url ...

Адрес ядра ищется в таком порядке: --urlEVA_TUI_URL~/.config/eva-tui/config.toml ([kernel] url = "...") → localhost:8090. Токен (если ядро за прокси с проверкой X-Eva-Token) — так же, причём на каждом слое можно дать значение или файл с ним: --token/--token-fileEVA_TUI_TOKEN/EVA_TUI_TOKEN_FILE[kernel] token/token_file.

NixOS-модуль

Флейк отдаёт nixosModules.default — клиент ставится системно, адрес ядра живёт прямо в конфиге системы (обёртка задаёт EVA_TUI_URL, --url из рук всё ещё сильнее):

{
  inputs.eva-tui.url = "git+ssh://forgejo@git.viende.su:61488/eva/tui.git";

  # в конфигурации:
  imports = [ inputs.eva-tui.nixosModules.default ];
  programs.eva-tui = {
    enable = true;
    url = "https://eva.desu.church";
    tokenFile = "/run/secrets/eva-tui-token";  # например, из sops-nix
  };
}

Карта

src/eva_tui/
├── kernel.py   # REST + разбор SSE руками, папка tui, PAGE_SIZE
└── app.py      # Textual: список чатов, лента, стрим, пагинация