docs: v0.0.64-0.0.67 (тикеры/оценки, блокировки UI, фикс имён ZIP) + README History
This commit is contained in:
@@ -101,6 +101,8 @@
|
||||
- **2026-08-20-upload-limits.md** — v0.0.50: лимиты загрузки (>100МБ/файл, >1ГБ сумма) + красная подсветка в таблице.
|
||||
- **2026-08-24-interrupt-eta-design.md** — дизайн: TTL-фикс + прерывание с сохранением + оценка времени + UI.
|
||||
- **2026-08-24-interrupt-eta-implemented.md** — v0.0.63: реализовано прерывание с сохранением + ETA + UI-таблица.
|
||||
- **2026-08-24-time-tickers-estimates.md** — v0.0.64–0.0.65: тикер текущего файла на всех этапах, мгновенные оценки времени по файлам и суммарно.
|
||||
- **2026-08-24-ui-locks-session-freeze.md** — v0.0.66: блокировки UI (выбор/удаление) на время работы, заморозка сессии + кнопка «Новая сессия».
|
||||
|
||||
## upload/ — загрузка файлов
|
||||
|
||||
@@ -119,6 +121,7 @@
|
||||
- **2026-08-20-v1-v2-implemented.md** — v0.0.54: В2 (фикс кракозябр имён zip) + В1 (фильтр таблиц, эффект≈0).
|
||||
- **2026-08-20-honest-answer-and-A-implemented.md** — v0.0.55: честный ответ Sonnet + реализация А (threading .doc, кэш regex).
|
||||
- **2026-08-20-csv-out-of-zip.md** — v0.0.56: КРИТИЧНО — mapping.csv (ключ расшифровки) убран из ZIP.
|
||||
- **2026-08-24-zip-name-cyrillic-frontend.md** — v0.0.67: фикс кириллических имён из ZIP на фронте (UTF-8 без флага → CP866-мусор), согласовано с бэком.
|
||||
|
||||
## tests/ — тесты и бенчмарки
|
||||
|
||||
|
||||
@@ -0,0 +1,29 @@
|
||||
# v0.0.67 — Фикс кириллических имён из ZIP на фронтенде (2026-08-24)
|
||||
|
||||
_code-fixes. Имя `TKM_6й_Семестр_ЭКЗАМЕН.docx` из архива отображалось как
|
||||
`TKM_6╨╣_╨б╨╡╨╝╨╡╤Б╤В╤А_...` (мусор)._
|
||||
|
||||
## Причина
|
||||
Архиватор записал имя **в UTF-8, но без UTF-8-флага** (bit 11). Фронт (`decodeZipName`)
|
||||
видел «флага нет», шёл в legacy-ветку и декодировал **UTF-8-байты как CP866** →
|
||||
`D0 99` («й») → `╨╣` (псевдографика CP866).
|
||||
|
||||
## Фикс (index.html, `decodeZipName`)
|
||||
- Первым делом — **строгая проверка UTF-8** (`TextDecoder('utf-8', {fatal:true})`):
|
||||
если байты — валидный UTF-8 с кириллицей или печатаемым текстом → берём как есть.
|
||||
- Только если строгий UTF-8 не проходит (реальные CP437/CP866 из 1С) — legacy-путь
|
||||
(CP437 → CP866) не меняется.
|
||||
- CP866-кириллица (0x80–0xAF) — это продолжения UTF-8 без ведущих байтов, поэтому
|
||||
строгий UTF-8 для них честно падает и legacy-путь работает как раньше.
|
||||
|
||||
## Согласованность с бэком
|
||||
Бэк (`extractor.py`, `_decode_name`) это уже умел (v0.0.54, «В2 — фикс кракозябр имён zip»).
|
||||
Теперь фронт и бэк обрабатывают имена ZIP одинаково.
|
||||
|
||||
## Проверка (node)
|
||||
- `TKM_6й_Семестр_ЭКЗАМЕН.docx` (UTF-8 без флага) — декодируется верно ✅.
|
||||
- ASCII — ✅. Legacy CP437/CP866-путь не тронут.
|
||||
- `node --check` — OK.
|
||||
|
||||
## Версия
|
||||
- 0.0.66 → 0.0.67.
|
||||
@@ -0,0 +1,30 @@
|
||||
# v0.0.64–0.0.65 — Тикеры времени и оценки обработки по файлам (2026-08-24)
|
||||
|
||||
_ux-frontend. Продолжение v0.0.63 (прерывание/ETA). По итогам замечаний: тикеры/оценки
|
||||
должны быть видны СРАЗУ и на ВСЕХ этапах, а не только в LLM-фазе._
|
||||
|
||||
## Проблема (v0.0.63)
|
||||
- Подсветка «▶ Текущий файл» и оценки появлялись только в LLM-фазе.
|
||||
- На этапе извлечения (долгие PDF, .doc через liberta) таблица показывала всё
|
||||
«○ Ожидают —», без текущего файла и оценок — юзер не видел никакого прогресса.
|
||||
|
||||
## v0.0.64 — тикер текущего файла на всех этапах + самокалибровка
|
||||
- `start` (этап извлечения): файл, который обрабатывается сейчас, помечается `current`
|
||||
(предыдущий демотируется), тикер `прошло/осталось` идёт через `procRefresh` (1с).
|
||||
- Замер скорости извлечения: по предыдущему «текущему» файлу считается `procExtractRate`
|
||||
(сек/МБ) — оценки «ожидающих» калибруются по факту, а не по константе.
|
||||
- `extract_done`: снимает подсветку извлечения (LLM-фаза назначает текущий через `file_start`).
|
||||
- Оценки у «ожидающих»: LLM (`chars × rate`) либо грубая по размеру (сек/МБ).
|
||||
|
||||
## v0.0.65 — мгновенные оценки (ещё до старта)
|
||||
- При выборе файлов (простой режим) у каждого файла в «Статусе» — `~X` (по размеру,
|
||||
`EST_MB_SEC = 12` с/МБ).
|
||||
- В шапке таблицы — суммарная оценка: `N файлов · S МБ · ~T`.
|
||||
- Подсказка: «⏱ Время обработки каждого файла — ориентировочное (обновляется по факту)».
|
||||
|
||||
## Проверка
|
||||
- `node --check` — OK; `py_compile` — OK.
|
||||
- Локально: имя из ZIP декодируется корректно (см. v0.0.67).
|
||||
|
||||
## Версии
|
||||
- 0.0.63 → 0.0.64 (тикеры на всех этапах) → 0.0.65 (мгновенные оценки).
|
||||
@@ -0,0 +1,34 @@
|
||||
# v0.0.66 — Блокировки UI: предсказуемое поведение во всех состояниях (2026-08-24)
|
||||
|
||||
_ux-frontend. По замечанию: во время обработки «Выбрать файлы» оставалась активной —
|
||||
юзер мог менять список и ломать состояние/индексы. Требование: ВСЁ предсказуемо,
|
||||
учтены ВСЕ действия юзера._
|
||||
|
||||
## Состояния и доступные действия
|
||||
|
||||
| Состояние | Выбрать файлы | ✕ удалить | Обфусцировать | Прервать | Скачать | Новая сессия |
|
||||
|---|---|---|---|---|---|---|
|
||||
| Простой | ✅ | ✅ | ✅ | — | — | — |
|
||||
| Загрузка (1/2) | 🔒 | 🔒 | 🔒 | — | — | — |
|
||||
| Обработка (2/2) | 🔒 | 🔒 | 🔒 | ✅ | — | — |
|
||||
| Результат готов | 🔒 | 🔒 | 🔒 | — | ✅ | ✅ |
|
||||
| Ошибка | ✅ | ✅ | ✅ | — | — | — |
|
||||
|
||||
## Реализация
|
||||
- Глобальный флаг `busy` + `setBusy(b)`: блокирует `fileInput` и скрывает кнопки «✕»
|
||||
(CSS `body.busy .remove-btn { display:none }`).
|
||||
- Двойная защита: обработчики `change` (выбор файлов) и `rm` (удаление) игнорируют
|
||||
вызовы при `busy`.
|
||||
- `uploadFiles()`: guard `if (busy) return` + `setBusy(true)`; ранние выходы (ошибки
|
||||
фазы 1, test-режим) — `setBusy(false)`.
|
||||
- **Заморозка сессии после результата**: `complete`/`cancelled` → `sessionDone=true`,
|
||||
`fi`/`uploadBtn` выключены, показаны «Скачать» и новая кнопка **«🔄 Новая сессия»**
|
||||
(`resetAll`). Ошибки — снимают блокировку (можно повторить).
|
||||
- При закрытии вкладки (beforeunload) — `resetAll` сбрасывает всё.
|
||||
|
||||
## Найденный и исправленный баг при правке
|
||||
- При добавлении заморозки случайно затёрлась строка `activeES.addEventListener('complete', ...)`
|
||||
— JS-синтаксис сломался («Missing catch»). Восстановлено ДО пуша; `node --check` — OK.
|
||||
|
||||
## Проверка
|
||||
- `node --check` (извлечённый <script>) — OK; `py_compile` — OK.
|
||||
Reference in New Issue
Block a user