- HTML 62.4%
- Kotlin 19.6%
- Go 13.8%
- JavaScript 2.7%
- CSS 1.4%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
| .specs | ||
| android | ||
| cmd/creo | ||
| internal | ||
| protocol | ||
| schemas | ||
| .gitignore | ||
| .golangci.yml | ||
| AGENTS.md | ||
| compose.dev.yml | ||
| compose.yml | ||
| creo.service | ||
| Dockerfile | ||
| echov5.txt | ||
| go.mod | ||
| go.sum | ||
| Makefile | ||
| MINDMAP.html | ||
| MINDMAP.md | ||
| README.md | ||
Creo
Кодинговый агент, которым пользуешься с телефона, а считает сервер.
Creo — это два компонента в одном репозитории:
- Сервер (
cmd/creo, Go) — встроенный ReAct-агент: диалог с LLM, инструменты (bash/read/write/edit), скиллы, компакция контекста, сессии. Наружу смотрит WebSocket-каналом/rpc(protocol v1) и HTTP-вложениями. - Android-клиент (
android/) — тонкий терминал: чат, стрим ответа, история с поиском, вложения, смена модели. Вся логика и ключи провайдеров — на сервере.
Android ──WS /rpc (protocol v1)──> creo-сервер ──ReAct-цикл──> LLM
──HTTP /attachments──────> │ bash/read/write/edit
│ сессии .jsonl, скиллы
Ничего не уходит с машины: ключи провайдеров, файлы проектов и история сессий остаются на хосте, телефон — только пульт.
Сборка и тесты
make build # bin/creo
make test # go test ./...
make lint # golangci-lint (go tool)
make generate # протокольные типы из schemas/runtime.schema.json
Протокольные типы (protocol/runtime.gen.go) генерируются из JSON Schema —
контракт зафиксирован, а не описан словами.
Конфигурация
Переменные окружения (плюс .env рядом с запуском):
| Переменная | По умолчанию | Смысл |
|---|---|---|
CREO_ADDR |
127.0.0.1:8787 |
адрес HTTP/WS |
CREO_AUTH_TOKEN |
— | Bearer-токен (обязателен; CREO_ALLOW_ANONYMOUS=1 — только для разработки) |
CREO_CWD |
текущий каталог | проект по умолчанию |
CREO_ALLOWED_ROOTS |
[CREO_CWD] |
корни, внутри которых агенту разрешено работать |
CREO_PROJECT_DIRS |
— | каталоги, которые пикер телефона показывает при создании сессии |
CREO_SESSION_DIR |
~/.local/state/creo/sessions |
каталог сессий (.jsonl, подкаталог на проект) |
CREO_ATTACHMENT_DIR |
~/.local/state/creo/attachments |
хранилище вложений |
CREO_ATTACHMENT_MAX_BYTES |
10485760 |
максимум на вложение |
CREO_MAX_PAYLOAD_BYTES |
1048576 |
лимит WS-кадра |
CREO_REPLAY_LIMIT |
2000 |
буфер replay на воркер |
CREO_WORKER_IDLE |
30m |
сборка воркеров без контроллера |
CREO_HEARTBEAT |
30s |
WS-ping |
CREO_REQUEST_LIMIT_PER_MINUTE |
600 |
лимит запросов на соединение |
CREO_MANAGEMENT_TIMEOUT |
15s |
таймаут management-команд |
CREO_ENGINE_CONFIG |
~/.config/creo/agent.json |
конфиг провайдеров и модели |
LOG_LEVEL / LOG_FORMAT |
info / text |
журналирование |
OTEL_EXPORTER_OTLP_ENDPOINT |
— | экспорт трейсов (/metrics — Prometheus) |
Конфиг движка (~/.config/creo/agent.json) — провайдеры, ключи, модели:
{
"defaultProvider": "zai",
"defaultModel": "glm-5.3-flash",
"providers": {
"zai": {
"api": "openai-completions",
"apiKey": "…",
"baseUrl": "https://api.z.ai/api/coding/paas/v4",
"models": [{ "id": "glm-5.3-flash", "contextWindow": 1000000 }]
},
"ollama": { "api": "ollama", "baseUrl": "http://localhost:11434", "models": [...] }
}
}
Модель переключается на ходу (set_model) — агент сам соберёт провайдера из
этого конфига. Уровень мышления: off…max, уходит в провайдер как
reasoning_effort (openai-совместимые) или think (ollama).
Протокол v1
GET /healthz— статус без авторизации;GET /metrics— Prometheus.WS /rpc— Bearer-токен на upgrade; один JSON-объект на текстовый кадр; бинарные кадры и неизвестные поля конвертов отвергаются.- Control-plane:
list_projects,list_sessions,list_workers,create_session,attach_session,rename_session,detach_worker,stop_worker,export_session,get_session_history,search_session_history. Для пикера cwdlist_projectsумеет ls-режим (params.path→ подкаталоги + родитель, с проверкой allowed-корней). - Данные-плейн: кадр
commandисполняет агент —prompt,steer,follow_up,abort,compact(сcustomInstructions),set_model,set_thinking_level,get_state,get_session_stats,get_messages,get_entries,get_commands— плюс/командыв чате:/compact, скиллы по имени. - Стрим:
message_update— накопительный снимок ответа; tool-события —tool_execution_start/update/endсtoolCallId; отвал клиента не убивает ход — агент продолжает, повторное подключение получает дельту поsinceSeqилиreplay_reset+ перечитывание истории по durable Entry ID. - Вложения — мимо WebSocket:
POST/GET /attachments(до 10 МиБ, ≤5 на промпт); картинки превращаются вImageContent, прочие файлы — маркер<attachments>…</attachments>в тексте промпта.
Контракт целиком — schemas/runtime.schema.json; типы генерируются
(make generate).
Android-клиент
cd android && ./gradlew assembleDebug
# apk: android/app/build/outputs/apk/debug/app-debug.apk
Готовый apk — creo-app-debug.apk в корне. В настройках: WebSocket-адрес
(ws://<host>:8787/rpc) и Bearer-токен. Локализация — русская/английская по
локали устройства. Иконка — во всех плотностях + adaptive (foreground/
monochrome).
Веб-клиент
Встроен в бинарь (go:embed, без npm/vite — только vendored Alpine.js 3).
Доступен на http://<host>:8787/ сразу после запуска сервиса.
Вход: токен из CREO_AUTH_TOKEN; после POST /login сервер ставит cookie
creo_token (HttpOnly, SameSite=Strict) — сам токен в браузере нигде не
хранится. Выход — кнопка «Выйти» в сайдбаре.
Возможности:
- сессии: список с поиском, создание через ls-браузер разрешённых каталогов,
переименование, остановка воркера; активная сессия — по
#/session/<id>(переживает F5); - чат: стрим ответа в одной карточке, карточки инструментов, abort хода,
follow-up во время стрима, slash-команды
/compact,/thinking <уровень>,/model <id>,/имя_скилла; - история: пагинация «Показать ещё», поиск с фильтрами (промпты/инструменты/ ошибки/файлы) и переходом к найденной записи;
- модели и мышление: выбор из
get_available_models, уровниoff…max; - вложения: кнопка или drag&drop, до 5 файлов на промпт, картинки из ответов рендерятся;
- статистика: токены и заполнение контекста в топбаре;
- локализация ru/en по
navigator.language.
Docker
CREO_AUTH_TOKEN=… CREO_WORKSPACE=~/creo-workspace docker compose up --build
systemd (user)
Юнит — creo.service в корне проекта:
cp creo.service ~/.config/systemd/user/
systemctl --user daemon-reload
systemctl --user enable --now creo.service
loginctl enable-linger # жить без активной сессии
Дорожная карта
- Сервер на Go: встроенный ReAct-агент, protocol v1
- Android-клиент на нейтральном протоколе
- Браузер директорий в пикере cwd (cd/ls-навигация)
- MCP-инструменты в реестре команд агента
- Стриминг thinking-блоков (сейчас reasoning не показывается)