❯ /architecture▊
Один цикл событий, ни одной гонки отрисовки
Агент живёт в отдельной задаче и добирается до интерфейса только событиями. То, что рисует, не меняет состояние; то, что думает, не трогает экран.
62k
строк Rust в 207 файлах
~900
тестов, и ни один не ходит в сеть
51
слэш-команда, по файлу на каждую
16
встроенных инструментов до первого MCP-сервера
── форма
Всё висит на одном select!
Беседы владеют своим состоянием, рантайм владеет ходами, а рендер не владеет ничем.
one tokio::select! loop
main ─ App (thin coordinator on a single select! loop)
├─ AppState
│ └─ Conversations ── focused + background chats
each owns: messages · forked session · agent task
├─ AgentRuntime.spawn(TurnSpec) ── the one place a turn starts
│ └─ run_agent_loop ── LLM ↔ tools, events tagged by id
│ ├─ semantic hint ── skills + MCP tools per prompt
│ └─ task tool ⇒ sub-agent (fg) | detached (bg)
├─ SemanticService ── e5-small ONNX + TF-IDF + RRF
├─ ToolRegistry ── bash · edit · write · task · todo …
├─ MCPManager ── stdio / http / sse, OAuth in the keyring
├─ providers ── DeepSeek web · OpenAI · Anthropic · Gemini
└─ TUI render ── reads the focused chat; never mutates
Тяжёлая арифметика — эмбеддинги ONNX, SHA-3 proof-of-work — уходит на блокирующие потоки, поэтому долгий хеш никогда не стоит вам кадра.
── один ход
Что происходит между Enter и ответом
Шесть шагов, и остановить можно на любом.
01
Сопоставление
Промпт оценивается против скиллов и MCP-инструментов. Лучшие совпадения становятся одноразовой подсказкой, которая не остаётся в истории беседы.
02
Отправка
Провайдер форкает сессию под этот чат. У DeepSeek это значит локально решить SHA-3 proof-of-work, а затем принимать ответ потоком по SSE.
03
Вызовы
Вызовы инструментов достаются из потока: родные — там, где провайдер их отдаёт, разобранные — везде остальном, с идентификатором от самого провайдера.
04
Подтверждение
Всё с побочными эффектами упирается в модалку с читаемым предпросмотром: настоящий дифф для edit, сам текст для write и пометка для путей вне рабочей папки.
05
Чекпоинт
Перед записью прежнее содержимое уходит в журнал только-на-дозапись. /undo возвращает его — и отказывается, если файл изменился после правки: значит, его правил кто-то ещё.
06
Оценка
В режиме GOAL второй агент сверяет результат с вашими критериями успеха и либо подписывает, либо отправляет в цикл конкретные правки.
── src/
Где что лежит
Слои держит граф модулей: инструменты ничего не знают о приложении, рендер ничего не знает о провайдерах.
- app/
- Координатор: беседы, цикл событий, рантайм агента, клавиши, GOAL, экран поиска, панель провайдеров.
- provider/
- DeepSeek web (авторизация, PoW, SSE, сессии) плюс клиенты OpenAI-compat, Anthropic Messages и Gemini.
- agent/
- Цикл агента, запуск суб-агентов, разбор вызовов инструментов.
- semantic/
- Локальный RAG: эмбеддер, гибридный индекс, корпуса, хранилище истории, eval-харнесс.
- tools/
- Шелл и PTY, edit и write, todo, таймеры, task и семантические встроенные инструменты.
- mcp/
- Клиенты, транспорты, поиск конфигов по восьми источникам, менеджер, OAuth.
- server/
- OpenAI-совместимый шлюз: маршрутизация каталога, транспорт на hyper, сам диалект.
- tui/
- Экраны ratatui, виджеты, разметка markdown — и таблица тем, которую позаимствовал этот сайт.
- update/
- Каналы, сверка манифеста, подготовленная подмена бинарника.
- acp/
- Режим сервера Agent Client Protocol: JSON-RPC поверх stdio, для IDE, которые его понимают.
── ограничители
Части, которые говорят «нет»
Агент с шеллом — это поверхность атаки. Вот места, где он намеренно менее удобен.
- разрешения с областью
- Правило — это инструмент плюс область: bash · cargo test разрешает только такой префикс, edit · <папка> — только запись в неё. Составной команде область не выводится вовсе: git status && rm -rf / начинается с git status.
- чекпоинты
- Каждая правка edit и write сперва попадает в журнал. Файлы, похожие на секреты (.env, *.pem, id_rsa), и всё крупнее 8 МиБ не копируются никуда — такая правка честно помечается необратимой.
- хранилище ключей
- Сессия DeepSeek и OAuth-токены MCP лежат зашифрованными в системном хранилище ключей, а не в текстовом конфиге.
- чужой текст
- Проектные инструкции (AGENTS.md, CLAUDE.md…) приходят из чужого репозитория: символические ссылки не разыменовываются, текст едет в конверте с одноразовой меткой, а абсолютные правила повторяются после конверта.
- закрытые файлы
- Инструмент edit отказывается писать в конфигурацию самого агента и в MCP-конфиги и прерывается, если файл изменился с момента чтения.
── доказательства
Измерено, а не заявлено
Утверждения на этой странице проверяются в репозитории, и большинство из них проверяется на каждом пуше.
- ~900 тестов
- Модульные тесты без сети, прогоняются на Windows, Linux и macOS.
- MRR-эвалы
- Качество поиска — число, а не ощущение: 0.927 для скиллов, 0.836 для MCP-инструментов.
- полевая лестница
- Сценарный харнесс гоняет агента на настоящих задачах — и заваливает прогон, где каждый вызов инструмента вернул ошибку, а итог звучал прилично.
- ворота
- fmt, clippy -D warnings и тесты блокируют коммит локально и слияние в CI.
- --locked
- Cargo.lock под контролем git, и CI собирает из него: релиз — ровно тот набор зависимостей, на котором прошли тесты.
ci
✓ cargo fmt --check
✓ cargo clippy -- -D warnings
✓ cargo test --bin pooprusteek ~900 tests, no network
✓ cargo test semantic::eval -- --ignored
skills MRR 0.927
mcp tools MRR 0.836
✓ build: windows x64/arm64 · linux x64/arm64 · macos arm64
✓ package: pooprusteek-setup.exe + install.sh + manifest