Изменения вводят live-канал OnlineOutbox и фоновую синхронизацию диалогов.

This commit is contained in:
2026-09-30 11:43:49 +03:00
parent 2ad2d65f06
commit 26f94ea83d
12 changed files with 699 additions and 109 deletions
+24 -2
View File
@@ -302,6 +302,30 @@
- **R43.** Полезный признак, что что-то не вынесено: **в экране накопилась логика
длиннее пары десятков строк.** Значит, это место жить в экране не должно.
### 8.4. Кэш наполняется фоново, а не по факту открытия
**Задача:** превью и история должны быть у **всех** диалогов, а не только у тех,
что открывали в этом окне. Раньше «…» в списке стояло именно потому, что запись
появлялась лишь при открытии диалога.
**Схема (на каждого агента):**
1. Одна подписка на **все** события-сообщения
(`outbox.conversationEvents(after=null, conversationId=null)`).
2. На `End`/`Interrupted` любого диалога — догон журнала по watermark'у и
пересчёт превью; данные кладутся в локальный кэш.
3. На старте — догон диалогов, чей `updatedAt` с сервера **новее** нашего
watermark'а, включая **никогда не открытые**.
- **R44.** **Источник истины — журнал, не SSE.** Outbox — короткий bounded tail:
события за время, пока клиент был выключен, из него выпадают. Поэтому догон
идёт по журналу (`updatedAt` / `synced_at`), а SSE лишь триггерит его.
- **R45.** **Открытый диалог фоновый ingest не трогает.** Пока диалог открыт,
его сообщения ведёт сессия; engine пропускает этот диалог, чтобы не дублировать
работу. Общий мьютекс на диалог сериализует запись на транзишене
«открыли / закрыли».
- **R46.** **API менять не нужно** (снимает открытый вопрос из §9): превью
считается локально из журнала, число непрочитанных — `journal.count(after=lastSeen)`.
## 9. Решения, которые ещё не приняты
- Запись: по нажатию или на удержание.
@@ -315,8 +339,6 @@
- **Группы — только на устройстве или на сервере?** Сервер про них не знает
(`STORAGE.md`, §7). Если только у нас — раскладка не поедет между десктопом
и телефоном.
- **Меняем ли API: превью последнего сообщения и число непрочитанных.**
Взять неоткуда, в макете они нарисованы (`STORAGE.md`, §6).
- **Бейдж — число или точка.** Точка сервер не трогает вообще (`STORAGE.md`, §6.2).
- **Где каталог клиента** — `~/.agentik/` или системный («Документы»).
На Android понятие «домашний каталог» своё.