Hermes Agent
64f0efde37
fix: детект обрыва связи ≤5с (ping 15с→5с) — пауза при обрыве обязательна
...
Требование пользователя (проверено на железе): при потере связи видео
обязательно ставится на паузу и быстро. Было: ping 15с + таймаут 15с на
обоих концах — обрыв замечался до ~35с (видео убегало, звук вставал —
рассинхрон). Стало: pingIntervalMillis 5с (lib-core Ktor), pingPeriod/
timeoutMillis 5с (app-phone OkHttp) — детект ≤10с.
Железо: обрыв → «связь потеряна — пауза» → «связь восстановлена —
продолжаю» → diff 139. Визуально подтверждено пользователем.
2026-08-19 21:21:43 +03:00
Hermes Agent
49dac8b33f
fix(app-phone): звук при watch (диагностика+подстраховка mirrorByItem) + качка не воскресает после удаления
...
- onWatch: явные логи в каждой точке отказа (watch result / audio source / уже играет / не скачано / mediaDir пуст), свежий mirrorByItem если files не догрузился, звук стартует с позиции очков при уже идущем видео
- resolveAudioSource → resolveAudioSourceDetailed (AudioSourceResult с причиной null)
- DownloadManager: поколения generations — delete() инвалидирует старую корутину (не воскрешает качку), ensureActive перед .part/rename, jobs.remove(itemId, job)
- Тесты 62/0 (в т.ч. поколения — поймали null != 0L)
Инфраструктурный блокер (не код): SeaweedFS на Server3 76.66 в IO-шторме (load ~184, wa 20%, чужой yt-dlp на хосте) — большие GET с s3.binom.pw висят/рвутся с ~14:00; качка на очки FAILED по этой причине.
2026-08-19 17:19:53 +03:00
Hermes Agent
6069400b88
feat(app-phone): полноценный UI телефона — каталог Jellyfin, детали, пульт очков, реальное скачивание с S3
...
- 4 экрана по макету sketches/phone-ui: Каталог (табы Фильмы/Сериалы/Папки, поиск, бейджи зеркала), Детали (озвучки, статус конвертации, чипы скачивания), Очки (пульт, статус), Чат-заглушка
- S3 SigV4 presign (S3Presigner): mirror-client read-only креды; watch() и DownloadManager подписывают URL (бакет приватный)
- DownloadManager: реальное скачивание video+audio с прогрессом, readTimeout=0 (длинные файлы)
- PhoneActions.watch: параметр presign (app-host работает без изменений)
- TESTING.md: блок телефонных кейсов TP-1..6
2026-08-19 09:13:56 +03:00
Hermes Agent
298d8e0b69
feat: сетевая часть для app-phone (WS-сервер) и app-glasses (WS-клиент), PhoneState/PhoneActions → lib-core
...
lib-core:
- core/phone/: PhoneState, PhoneActions, GlassesSender (интерфейс) — перенесены из app-host
- core/net/: GlassesWsClient — KMP WS-клиент очков (реконнект, Hello, send GlassesToHost)
- GlassesWsClientTest + PhoneActionsTest (перенесён)
app-phone (Android):
- GlassesServer: Ktor WS-сервер (CIO) 0.0.0.0:8080/ws/glasses, принимает очки, Welcome из стейта
- PhoneApp (Application): клиенты, стейт, действия, сервер
- PhoneConfig: креды Jellyfin/Mirror
- MainActivity: статус сервера (порт, счётчик подключений)
- GlassesServerTest: hello→welcome, gesture
app-glasses (Android):
- GlassesApp (Application), HostConnection: WS-клиент к телефону, Hello, реконнект, обработка HostToGlasses (PlayVideo/SetMode и т.д.), StateFlow для UI
- MainActivity: статус подключения
app-host: PhoneActions/PhoneState удалены (теперь lib-core), адаптирован под GlassesSender
171 тест, 0 провалов; app-host жив (catalog/watch/status работают через lib-core)
2026-08-11 15:06:07 +03:00
Hermes Agent
f0f1f71575
feat: app-host → телефон-эмулятор (Jellyfin + mirror + стейт + команды)
...
- Config.kt: env > application.properties > дефолты (креды не в коде)
- PhoneState.kt: единый стейт — mode, currentItem, audioIndex, mirrorStatus, activeSessionId, сессии (эмуляция), downloaded
- PhoneActions.kt: catalog (с бейджами зеркал), open, watch (PlayVideo на очки), makeMirror, mirrorStatus, download/delete, sessions/selectSession, status
- Main.kt: новые консольные команды (catalog/open/watch/mirror/dl/rm/sessions/session/status)
- GlassesHub: Welcome берёт mode/sessionId из стейта, glasses_off → пауза
- JellyfinClient.item() — элемент по id (для open/watch)
- 58 тестов, 130 всего, все зелёные; живые проверки: catalog (реальный Jellyfin), watch (PlayVideo с s3-url), status (стейт обновляется)
2026-08-11 14:37:43 +03:00
Hermes Agent
d95d289d29
feat: HTTP-клиенты Jellyfin + media-mirror в lib-core (KMP, Ktor)
...
media/JellyfinClient: users, rootItems, items, search, allItems, posterUrl (X-Emby-Token)
media/MirrorClient: createMirror, mirrorByItem (404→null), list, delete, scan (X-API-Key)
media/HttpClient: defaultHttpClient (ContentNegotiation+json, таймауты, ApiClientException)
Ktor 3.3.0 (совместим с Kotlin 2.2; 3.5.2 требует Kotlin 2.3 — не берём)
17 тестов (MockEngine): пути, методы, заголовки, JSON, 201/404, round-trip DTO.
Проверено на живых серверах: Jellyfin (6 users, корень, поиск 'дюна'), mirror (by-item done + url, список done)
2026-08-11 12:59:44 +03:00
Hermes Agent
9271517b3c
feat: WS-протокол очки↔телефон + app-host (JVM Ktor-сервер)
...
lib-core (commonMain):
- Messages.kt: GlassesToHost (hello, gesture, glasses_status, playback_position, glasses_off)
- HostToGlasses.kt: Welcome, SetMode, MediaCommandMsg, PlayVideo, AssistantStateMsg, ShowText, ChatSessionMsg
- AssistantState enum (IDLE/LISTENING/THINKING/SPEAKING)
- round-trip тесты сериализации обоих направлений
app-host (переведён с Android на JVM):
- Ktor WS-сервер 0.0.0.0:8080/ws/glasses — очки подключаются как WS-клиенты
- GlassesHub: broadcast всем очкам, счётчик подключений (StateFlow)
- консольный ввод: play/mode/state/text/session/cmd/exit — команды от «телефона»
- логирование всех сообщений обоих направлений
- HostServerTest: hello→welcome, счётчик подключений
Проверено: сборка зелёная, 21 тест 0 провалов, живой WS-цикл (hello→welcome, gesture, статус, позиция, glasses_off)
2026-08-11 12:35:30 +03:00
Hermes Agent
5268a12d20
view-mate: болванка + концепт + эскизы + сценарии (единый коммит, история очищена от hprof/build)
2026-08-11 11:34:50 +03:00