docs: сортировка History по темам (sonnet, opus, llm, sse, ux-frontend, upload, infra, plans, tests, base, code-fixes)

This commit is contained in:
“Naeel”
2026-08-24 15:23:31 +03:00
parent 25e4b46e76
commit db7cdbdd84
69 changed files with 0 additions and 0 deletions
@@ -0,0 +1,23 @@
# Waitress + Connection: close — hop-by-hop заголовок
**Дата:** 2026-07-14
**Версия:** 0.0.21 → 0.0.22
---
## Ошибка
`Connection` — hop-by-hop заголовок. Waitress (WSGI) запрещает его использовать в приложении (PEP 3333).
```python
# ❌ НЕЛЬЗЯ
response.headers["Connection"] = "close"
# Ошибка:
AssertionError: Connection is a "hop-by-hop" header; it cannot be used by a WSGI application (see PEP 3333)
```
## Правило
**Никогда не добавлять `Connection` заголовок в Flask/Waitress-приложении.**
Нужно закрывать соединения — только через nginx (upstream keepalive) или uWSGI/gunicorn.
@@ -0,0 +1,48 @@
# SSE: отлов отключения клиента, v0.0.18
**Дата:** 2026-07-14
**Версия:** 0.0.17 → 0.0.18
---
## Проблема
После 2-3 F5 во время обработки — загрузка падает с «Ошибка загрузки: Сеть».
Причина: утечка потоков.
### Механика
1. `process_stream` создаёт SSE-генератор, занимающий поток Waitress (всего 8)
2. `obfuscate_files()` выполняется ~30 сек (LLM-запросы)
3. Пользователь делает F5 → TCP-соединение рвётся
4. Генератор **не знает** что клиент отключился — продолжает обрабатывать файлы
5. Поток занят, не освобождается
6. 2-3 F5 → все 8 потоков заняты → новые запросы не принимаются → «Сеть»
### Почему WSGI не отключает
`yield` в генераторе пишет в буфер WSGI, а не в сокет. Буфер никуда не уходит
(клиент отключён), но генератор об этом не узнаёт — `GeneratorExit` не кидается.
---
## Решение
Добавлен `try/except GeneratorExit` после каждого `yield` в `generate()`:
```python
try:
yield f"event: done..."
except GeneratorExit:
return # клиент отключился, освобождаем поток, НЕ обрабатываем остальные файлы
```
Waitress при отключении клиента кидает `GeneratorExit` при попытке записи в
закрытый сокет. Генератор ловит → выходит → поток освобождается.
---
## Изменённые файлы
- `site/routes/api_bp.py` — `try/except GeneratorExit` в `generate()`
- `site/app.py` — `VERSION = "0.0.18"`