/architecture

Один цикл событий, ни одной гонки отрисовки

Агент живёт в отдельной задаче и добирается до интерфейса только событиями. То, что рисует, не меняет состояние; то, что думает, не трогает экран.

62k

строк Rust в 207 файлах

~900

тестов, и ни один не ходит в сеть

51

слэш-команда, по файлу на каждую

16

встроенных инструментов до первого MCP-сервера

── форма

Всё висит на одном select!

Беседы владеют своим состоянием, рантайм владеет ходами, а рендер не владеет ничем.

one tokio::select! loop

mainApp (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 и ответом

Шесть шагов, и остановить можно на любом.

  1. 01

    Сопоставление

    Промпт оценивается против скиллов и MCP-инструментов. Лучшие совпадения становятся одноразовой подсказкой, которая не остаётся в истории беседы.

  2. 02

    Отправка

    Провайдер форкает сессию под этот чат. У DeepSeek это значит локально решить SHA-3 proof-of-work, а затем принимать ответ потоком по SSE.

  3. 03

    Вызовы

    Вызовы инструментов достаются из потока: родные — там, где провайдер их отдаёт, разобранные — везде остальном, с идентификатором от самого провайдера.

  4. 04

    Подтверждение

    Всё с побочными эффектами упирается в модалку с читаемым предпросмотром: настоящий дифф для edit, сам текст для write и пометка для путей вне рабочей папки.

  5. 05

    Чекпоинт

    Перед записью прежнее содержимое уходит в журнал только-на-дозапись. /undo возвращает его — и отказывается, если файл изменился после правки: значит, его правил кто-то ещё.

  6. 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

Перейти к загрузке

deepseek · deepseek-chatctx:0% · | [streaming]