From 45c6f3b7f03ae7b771e75f2fb6920c3673cb83af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CNaeel=E2=80=9D?= Date: Mon, 24 Aug 2026 15:55:55 +0300 Subject: [PATCH] =?UTF-8?q?docs:=20v0.0.64-0.0.67=20(=D1=82=D0=B8=D0=BA?= =?UTF-8?q?=D0=B5=D1=80=D1=8B/=D0=BE=D1=86=D0=B5=D0=BD=D0=BA=D0=B8,=20?= =?UTF-8?q?=D0=B1=D0=BB=D0=BE=D0=BA=D0=B8=D1=80=D0=BE=D0=B2=D0=BA=D0=B8=20?= =?UTF-8?q?UI,=20=D1=84=D0=B8=D0=BA=D1=81=20=D0=B8=D0=BC=D1=91=D0=BD=20ZIP?= =?UTF-8?q?)=20+=20README=20History?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- History/README.md | 3 ++ .../2026-08-24-zip-name-cyrillic-frontend.md | 29 ++++++++++++++++ .../2026-08-24-time-tickers-estimates.md | 30 ++++++++++++++++ .../2026-08-24-ui-locks-session-freeze.md | 34 +++++++++++++++++++ 4 files changed, 96 insertions(+) create mode 100644 History/code-fixes/2026-08-24-zip-name-cyrillic-frontend.md create mode 100644 History/ux-frontend/2026-08-24-time-tickers-estimates.md create mode 100644 History/ux-frontend/2026-08-24-ui-locks-session-freeze.md diff --git a/History/README.md b/History/README.md index f2fd5ff..20726b4 100644 --- a/History/README.md +++ b/History/README.md @@ -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/ — тесты и бенчмарки diff --git a/History/code-fixes/2026-08-24-zip-name-cyrillic-frontend.md b/History/code-fixes/2026-08-24-zip-name-cyrillic-frontend.md new file mode 100644 index 0000000..4e15bdf --- /dev/null +++ b/History/code-fixes/2026-08-24-zip-name-cyrillic-frontend.md @@ -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. diff --git a/History/ux-frontend/2026-08-24-time-tickers-estimates.md b/History/ux-frontend/2026-08-24-time-tickers-estimates.md new file mode 100644 index 0000000..244248d --- /dev/null +++ b/History/ux-frontend/2026-08-24-time-tickers-estimates.md @@ -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 (мгновенные оценки). diff --git a/History/ux-frontend/2026-08-24-ui-locks-session-freeze.md b/History/ux-frontend/2026-08-24-ui-locks-session-freeze.md new file mode 100644 index 0000000..cb6e5f2 --- /dev/null +++ b/History/ux-frontend/2026-08-24-ui-locks-session-freeze.md @@ -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` (извлечённый