agent_coder
|
22f687c39e
|
feat(ai-chat): авто-реконнект к detached-рану после живого обрыва SSE
Автономный ран продолжается на сервере при обрыве SSE (Safari роняет длинный
стрим), но клиент показывал баннер 'Lost connection' и мёртвую вкладку до ручной
перезагрузки: resumeStream() звался только на mount. Добавлен недостающий триггер.
- chat-thread.tsx: в onFinish на живом isDisconnect (гард !wasResumed &&
autonomousRunsEnabled && mounted && assistant) -> beginReconnect с экспон.
backoff (1/2/4/8/16с, лимит 5). Стоп: status->streaming / 2xx re-attach /
терминальный хвост reconcile / stop / unmount. Исчерпание -> Retry.
- Дедуп (главный риск): зеркалит mount strip/anchor — пиннит текущий streaming-ряд
как anchor (id ассистент-строки), стрипает его из стора ДО replay, сервер
?expect=live&anchor=<id> пересобирает без дублей; на отказе/204 строка
восстанавливается через onNoActiveStream (контент не теряется).
- 204/overflow -> degraded poll через существующий onNoActiveStream.
- RUN_STREAM_MAX_BUFFER_BYTES 4->32МБ (марафонские раны 11-25мин переполняли 4МБ);
204->poll остаётся backstop. Degraded-poll: фиксированный 10-мин-от-старта кап
заменён на inactivity-кап (продлевается пока приходят новые ряды).
- UI: баннер 'reconnecting… (N/5)' + ручной Retry на исчерпании.
closes #430
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-07-10 02:51:58 +03:00 |
|