No description
  • HTML 62.4%
  • Kotlin 19.6%
  • Go 13.8%
  • JavaScript 2.7%
  • CSS 1.4%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
2026-10-11 18:24:28 +03:00
.specs chore(specs): закрытие 002-keep-thinking-blocks — дельты в _system/agent.md 2026-10-11 12:12:57 +03:00
android fix: Подсчёт токенов в UI 2026-10-11 18:24:28 +03:00
cmd/creo feat(agent): thinking-блоки сохраняются в истории и UI 2026-10-11 12:11:32 +03:00
internal fix: Подсчёт токенов в UI 2026-10-11 18:24:28 +03:00
protocol feat(agent): thinking-блоки сохраняются в истории и UI 2026-10-11 12:11:32 +03:00
schemas init: начальный коммит проекта Creo 2026-10-11 03:41:59 +03:00
.gitignore init: начальный коммит проекта Creo 2026-10-11 03:41:59 +03:00
.golangci.yml init: начальный коммит проекта Creo 2026-10-11 03:41:59 +03:00
AGENTS.md init: начальный коммит проекта Creo 2026-10-11 03:41:59 +03:00
compose.dev.yml init: начальный коммит проекта Creo 2026-10-11 03:41:59 +03:00
compose.yml init: начальный коммит проекта Creo 2026-10-11 03:41:59 +03:00
creo.service init: начальный коммит проекта Creo 2026-10-11 03:41:59 +03:00
Dockerfile init: начальный коммит проекта Creo 2026-10-11 03:41:59 +03:00
echov5.txt feat(agent): thinking-блоки сохраняются в истории и UI 2026-10-11 12:11:32 +03:00
go.mod feature(agent,webui): исправление склейки сегментов ассистента и markdown-рендеринг 2026-10-11 15:45:07 +03:00
go.sum feature(agent,webui): исправление склейки сегментов ассистента и markdown-рендеринг 2026-10-11 15:45:07 +03:00
Makefile init: начальный коммит проекта Creo 2026-10-11 03:41:59 +03:00
MINDMAP.html fix: Подсчёт токенов в UI 2026-10-11 18:24:28 +03:00
MINDMAP.md fix: Подсчёт токенов в UI 2026-10-11 18:24:28 +03:00
README.md feat(agent): thinking-блоки сохраняются в истории и UI 2026-10-11 12:11:32 +03:00

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. Для пикера cwd list_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 не показывается)