Commit graph

40 commits

Author SHA1 Message Date
Hermes Team
144f6a5d59 docs(research): решение и план слияния Hermes Hub → KAgent
Владелец принял направление: один продукт KAgent, функциональность Hermes
переносится нативно, после parity Hermes архивируется. На переходный период
KAgent доделывается на одном сервере, Hermes — на втором.

Ревьюер проверил обе стороны исполнением, а не по аудиту:
- Hermes: CI на main красный; баг pricing fallback реален (safe_dump вместо
  safe_load в telemetry_service.py:164, таблица цен не грузится).
- KAgent (head 131c9b08): лицензии нет; в reasoning-engine/src/server.py
  require_operator_secret стоит на управлении аккаунтами, но НЕ на /v1/execute,
  /v1/decide, /v1/telemetry — расход провайдера открыт без авторизации.
  Поправка к аудиту: последняя активность 18-19 августа, репозиторий замер.

Жёсткий гейт: ключи провайдеров не переезжают в KAgent, пока эти маршруты не
закрыты и это не проверено живым запросом. Сам план миграции положен в
репозиторий как артефакт, чтобы не жил только файлом на столе.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-02 23:29:33 +07:00
Hermes Team
ef00a64f93 docs(research): каталог разведки — разбор Agent Orchestrator и журнал наблюдений
Наработки из новостных сводок оседали в переписке и терялись. Заведён
docs/research/: что рассмотрено для Hub, с вердиктом и причиной по каждому
пункту — отдельно от ARCHITECTURE (что построено).

Разбор Agent Orchestrator: ближайший архитектурный родственник Hub. Перенять
автоматический возврат замечаний исполнителю (у нас его нет — ревьюер правит
руками), ветку и worktree на работника, доску состояния флота; целиком не брать.

Журнал разведки за 31.08–02.09: Fable 5.1 и AgentsView — брать; Hermes v0.21.0 —
сервер обновлять последним (два бага, но 65536 у нас своё, не путать);
Qwen MTP и свежий llama.cpp — на V100 выигрыша нет, проверено в A52.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-02 19:17:44 +07:00
ochenstarik-ui
79ac9cf561 Fix account slot isolation and add background checks with per-account model discovery 2026-08-31 18:42:41 +07:00
ochenstarik-ui
1fbbeacd13 Restore local provider logos and add model-family brand marks 2026-08-31 18:14:34 +07:00
ochenstarik-ui
22bad863c1 Route workflow arrows through row gaps with semantic colors 2026-08-31 16:12:00 +07:00
ochenstarik-ui
f398616291 Center the orchestrator above saved subagent rows 2026-08-31 16:06:40 +07:00
ochenstarik-ui
144196bb01 Refine A48 overview layout and verify authenticated interface 2026-08-31 15:55:26 +07:00
ochenstarik-ui
c3bfcee846 feat(ui): A48 workspace layout draft awaiting authenticated visual QA 2026-08-31 15:25:15 +07:00
Hermes Team
59d57a41ef feat(a31): preflight dependency agent, workflow run state recovery, local concurrency and context guard, PII email masking, and cost-controller token honesty 2026-08-26 09:27:36 +07:00
Hermes Team
83233c891e feat(web): add workflow canvas and live agent workspace 2026-08-26 08:40:20 +07:00
Hermes Team
d7ad3e3165 feat(updater): in-app updates based on main repo release commits (A27 Pass 1) 2026-08-25 17:54:51 +07:00
Hermes Team
3287565773 feat(web): вход Antigravity и Claude из браузера на любой машине
Мастер подключения писал, что на сервере без экрана вход «через веб-интерфейс
невозможен», и отправлял в консоль по SSH либо переносить каталог
agy_profiles руками. GET /api/health отдавал для этих провайдеров жёстко
вписанное supported: false.

Утверждение оказалось ложным. В коде уже были
ProfileOAuthSession.handle_manual_callback_url и
ClaudeOAuthSession.handle_auth_code — оба принимают вставленное вручную
значение и доводят обмен кода на токены. Наружу их просто не вывели. Браузер
нужен где угодно, а не на машине с Hub: владелец открывает ссылку у себя и
возвращает адрес из адресной строки.

Добавлены действия start_redirect_auth, submit_redirect_callback,
poll_redirect_auth, cancel_redirect_auth. auth_flows теперь отражает
настоящие возможности, а не литерал. Обе заглушки в мастере заменены живым
потоком; мёртвая ветка Claude с полем API Key удалена.

Три дефекта, найденных при проверке исполнением:

1. Одна опечатка при вставке убивала сессию: handle_callback ставил
   status="failed" при отсутствии кода или чужом state, и вход приходилось
   начинать заново, хотя ссылка оставалась годной. Для ручного ввода такие
   ошибки больше не конечные; отказ провайдера конечен по-прежнему.
2. Окно слушателя в 5 минут рассчитано на браузер той же машины. При входе с
   другого ПК его не хватает: 20 минут — значение, проверенное на практике.
3. find_free_slot всегда возвращал ag-orch-fallback: занятость определяется по
   файлу учётных данных, а agy на Windows держит их в keyring, поэтому все
   десять слотов выглядят свободными. Вход затёр бы работающий аккаунт. Слот
   теперь выбирает владелец из списка, построенного по снапшоту, с пометкой,
   какие заняты и кем.

Два теста закрепляли снятую заглушку: test_headless_server_auth_matrix требовал
слов «Headless» и «agy» в интерфейсе, test_c_state_mismatch требовал
status == "failed". Первый переведён на проверку настоящего потока, второй
усилен: свойство безопасности (отказ без обмена кода) проверяется по-прежнему,
и дополнительно проверено, что после промаха верная вставка доходит до обмена.

Проверено вживую в браузере: список из 10 слотов с пометкой занятости,
выбранный слот доходит до сервера, ссылка настоящая от accounts.google.com,
поле вставки на месте. 431 passed, 2 skipped; ruff чисто.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-25 09:52:53 +07:00
Hermes Team
0be0a58a5d feat(web): авторизация по коду устройства для Grok и Codex прямо из веба
Владелец упёрся в заглушку «подключение через веб-интерфейс пока не
реализовано» и не смог подключить Grok. Backend был готов давно —
start_grok_oauth и start_codex_oauth возвращают настоящие адрес и код, —
но наружу не выведен: подключить эти провайдеры можно было только из
десктопа.

Добавлены действия start_device_auth и poll_device_auth. Адрес и код
выдаёт ПРОВАЙДЕР, интерфейс их только отображает — никаких подставленных
значений, как было с выдуманными GRK-7842 и CDX-9104.

Клиент показывает ссылку с кнопками «Открыть» и «Копировать», код
крупно и моноширинным, и опрашивает состояние каждые три секунды. Отказ
и просроченный код показываются как окончательные, опрос прекращается —
это работает вместе с правкой 50e4de5, научившей опрос различать
authorization_pending, access_denied и expired_token.

Проверено через веб-API: start отдаёт настоящий адрес accounts.x.ai и
код, poll возвращает pending, несуществующая сессия — честный отказ.

Контракт поднят до 1.4, действий стало двадцать одно.

Это снимает главное препятствие к удалению десктопа: он был
единственным путём подключить Grok и Codex.

Тесты: 414 passed, ruff чисто.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-24 15:20:05 +07:00
Hermes Team
965ef1272c feat(web): routing control center with drag-and-drop, inline models, and 7-view navigation (A24) 2026-08-24 10:53:57 +07:00
Hermes Team
c626d5dd8d Merge antigravity/recovery-and-validation (A23) — принято
Проверено исполнением, оба главных пункта закрыты.

P0-1, восстановление после отказа авторизации: выбран самый честный из
предложенных вариантов — снятие отметки по событию починки, а не по
таймеру. HealthTracker подписывается на EVENT_ACCOUNT_ADDED и
EVENT_ACCOUNT_AUTH_CHANGED. Проверено: профиль с AUTH_REQUIRED после
события возвращается в строй без ручного вмешательства.

P0-2, проверка моделей. Выдуманная модель отклоняется; базовое имя
gemini-3.7-flash принимается (поправка учтена); склеенное
gemini-3.1-pro-high тоже. Главное — при ПУСТОМ кэше выдумка больше не
проходит: молчаливое согласие устранено.

P0-3, ручное обновление списка моделей: действие refresh_models плюс
кнопка в клиенте.

Исправлено при слиянии:

1. Блокировка файла состояния была переведена с неблокирующей на
   БЕСКОНЕЧНО блокирующую. Исходный вариант был неверен — при неудаче
   исключение проглатывалось и запись шла без блокировки, — но
   бесконечное ожидание хуже: на Unix flock(LOCK_EX) висит вечно, и один
   застрявший держатель подвесил бы приложение целиком. Впереди
   Linux-сервер. Ожидание ограничено 5 секундами, дальше честный отказ.
   Проверено: 6 потоков по 5 записей — 0.11 с, ошибок нет.

2. Действие refresh_models не было занесено в контракт. Ровно тот дрейф,
   ради предотвращения которого контракт и существует. Контракт поднят
   до 1.3, действий стало девятнадцать.

Тесты: 370 passed, ruff чисто.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-24 04:17:47 +07:00
Hermes Team
e738dd0c5d feat(web): A21 — паритет веб-интерфейса: аналитика, состояние, события, настройки 2026-08-23 22:59:02 +07:00
Hermes Team
3374246941 Merge A17 (честный статус) и A18 (выбор модели)
A17 принято, проверено на живых профилях владельца: «Работает» больше не
ставится непроверенному профилю. Из 22 профилей теперь 1 «Работает»
(есть записанный успех), 7 «Не проверялся», 11 «Аккаунт не добавлен»,
3 «Отключён». Grok и opengo-1, на которые жаловался владелец, показаны
честно. Добавлено поле last_success_at.

A18 принято частично: действие set_model существует и валидирует модель
по списку провайдера. Но обнаружение моделей (P0-2) не сделано вовсе —
model_discovery_service и зонд не менялись, ручного обновления нет,
кэша на диске нет. Из-за этого set_model отклоняет ЛЮБУЮ модель, включая
настоящую: список провайдера пуст, и валидация не с чем сравнивать.

Правка при слиянии: discover_models запускался в ГЛОБАЛЬНОМ окружении,
где вход agy не выполнен, — при шести рабочих OAuth-профилях. Теперь
принимает profile_id и подменяет HOME/USERPROFILE на каталог профиля,
как это делает adapter.invoke. Таймаут поднят с 10 до 60 секунд.

Это не вылечило симптом, и причина оказалась глубже — см. отчёт.

Тесты: 336 passed, ruff чисто.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-23 22:24:22 +07:00
Hermes Team
4426d402d9 A17: Implement real network verification for profile test and update status snapshot 2026-08-23 22:13:24 +07:00
Hermes Team
05cf17503d feat(router): A18 — выбор модели, действие set_model, персистентный кэш и выбор в веб-клиенте 2026-08-23 22:08:08 +07:00
Hermes Team
4e2e8a9781 docs(web): контракт 1.1 — сервер отдаёт статику
Пропуск версии 1.0: каталог static/ был описан в структуре пакета, но не
сказано, кто его отдаёт. Обе стороны выполнили написанное и не собрались.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-23 20:40:57 +07:00
Hermes Team
e42f262b6d feat(A15): веб-API, общий ActionExecutor и порт путей на Linux
Работа A15 выполнена, но не закоммичена: git в его окружении был
недоступен. Восстановлена ревьюером из рабочего каталога.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-23 19:45:13 +07:00
Hermes Team
7ae4a28a80 docs(web): контракт веб-интерфейса и эталонная фикстура снапшота
Переход на веб-интерфейс. Контракт вынесен отдельным документом, потому
что серверная и клиентская стороны делаются параллельно и до слияния
друг друга не видят: в прошлом раунде расхождение в одном имени модуля
молча оставило выбор моделей пустым навсегда.

Зафиксировано: стек (FastAPI + uvicorn, уже объявлены в pyproject;
клиент — обычный JS без сборки), требования безопасности (127.0.0.1 по
умолчанию, токен для внешнего адреса, тест на отсутствие секретов в
ответе), два эндпоинта поверх готового снапшота и семнадцати действий
_handle_action, правило игнорировать ответы с устаревшим seq.

snapshot.example.json снят с живой машины владельца: 63 профиля,
187 КБ. Почты замаскированы, токенов, ключей и JWT нет — проверено.
Клиентская сторона разрабатывается против этого файла и не блокируется
готовностью сервера.

Отдельно зафиксировано ограничение headless: Codex и Grok работают по
device-code, Antigravity и Claude используют redirect на localhost и на
сервере без экрана не заработают.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-23 19:01:15 +07:00
Hermes Team
6ad546db0d Merge antigravity/contract-stability (A13)
Принято, проверено исполнением.

Устойчивость набора — главный пункт и он закрыт по-настоящему: общий
корень Tk на сессию вместо шести отдельных ctk.CTk(). Десять полных
прогонов подряд дали 316 passed, 2 skipped и НОЛЬ ошибок. До правки
каждый прогон давал до семи ошибок, кочующих между файлами, из-за чего
настоящую поломку приходилось искать перепроверкой в изоляции.

Раздел контракта о границе Hub и Hermes написан: что Hub получает на
каждом вызове (с явным указанием, что роли среди этого нет), чего не
видит, чем управляет и чем не управляет. Варианты связывания профилей
поданы таблицей с оценкой трудоёмкости: 3-4 дня, 8-12 дней, 4-5 дней.
Ни один не реализован без решения владельца, как и требовалось.

Исправлено при слиянии: в документе оказалось 11 символов BEL (0x07) на
месте буквы "a" — последовательности вида \agy-05 были разобраны как
escape. Пострадали 19 идентификаторов: antigravity -> ntigravity,
agy-05 -> gy-05, ag-w2 -> g-w2. Контракт читают оба исполнителя, битые
имена в нём недопустимы.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-23 18:40:27 +07:00
Hermes Team
e6ad500a43 Fix UI test instability and clarify contract boundaries 2026-08-23 18:27:07 +07:00
Hermes Team
999e0fb08e feat(router): A9 — миграция конфигурации, квоты провайдеров, реальные модели, перехват Hermes и токены Codex 2026-08-23 12:45:08 +07:00
Hermes Team
9f72e8ec39 fix(dashboard): unify LeaseManager, warm up initial CPU measurement, add live network speed, and clarify YAML comment support 2026-08-21 22:18:59 +07:00
Hermes Team
69cbefcab6 feat(dashboard): expose telemetry breakdown, provider call_share, host metrics, and active leases 2026-08-21 17:44:56 +07:00
Hermes Team
2b2ccd8fb2 feat(telemetry): implement empirical call telemetry, metrics aggregates, user pricing, and update state contract 2026-08-21 16:57:57 +07:00
Hermes Team
ff8776b963 feat(release): close contract audit v1.2, release feed verification, diagnostic CLI, and failover event logging 2026-08-21 10:05:30 +07:00
Hermes Team
2035c1455f feat(state): close contract gaps v1.1, canonical event publishers, and view model enrichment 2026-08-21 08:20:56 +07:00
Hermes Team
11ce88c18e docs(state): publish UI state contract 2026-08-20 23:46:50 +07:00
Hermes Team
42eddb3627 fix(quota, oauth): enforce data truthfulness, honest quota sources, and fail-closed OAuth
- Removed fabricated used_percent numbers and fake *_api source tags from quota_collector.py
- Marked quota snapshot sources as baseline/estimated and added visual estimation indicators in accounts_view.py
- Eliminated silent fallback on fake user_code/device_code in codex_oauth.py and grok_oauth.py
- Gated mock OAuth sessions strictly behind HERMES_HUB_DEV_MODE=1 with visible UI warnings
- Documented Google, OpenAI, xAI, and Claude OAuth clients in docs/OAUTH_CLIENT.md
- Relocated unused gui_server.py and gui_cockpit.html to legacy/
- Added test_data_truthfulness_and_oauth_security.py covering fail-closed and source truthfulness invariants
- Verified 98 passed tests (100%) and 7/7 release gate checks
2026-08-20 22:11:57 +07:00
Hermes Team
8314d46c43 fix: update canonical installer with dependency resolution and close release blockers 2026-08-20 18:17:08 +07:00
Hermes Team
42dfe2caa6 feat: production update feed architecture, host allowlist, and truthful release gate 2026-08-20 17:25:30 +07:00
Hermes Team
2f5e6d9f7a fix: strengthen secret scanning and oauth configuration 2026-08-20 17:23:40 +07:00
Hermes Team
7926de9ad2 feat(release): recovery stabilization, built-in updater, release gate, and v0.1.1 release pipeline 2026-08-20 16:29:35 +07:00
Hermes Team
2a97e80a3e fix: close P0 release blockers 2026-08-20 16:25:11 +07:00
Hermes Team
7609ad87c2 feat(hub): product stabilization, native windows ux v3, provider icons, and architecture roadmap 2026-08-20 11:01:52 +07:00
Hermes Team
e66248ab09 feat: initialize standalone Hermes Hub 2026-08-20 10:53:49 +07:00
Hermes Team
fdf9eccbdb feat: initialize standalone Hermes Hub 2026-08-20 00:17:11 +07:00