{"repo": "celxca2282-blip/jarbis", "files": {"docs/WORK_REPORT_FULL.md": {"4e8e39e4dbeef5f5753b7b85edb38e4ba308e1fb": {"t": 1785746498.0573158, "n": 24448, "h": "251ff31b8e7594fc", "c": "# JArbis — полный отчёт о проделанной работе\n\n**Проект:** голосовой ассистент для Windows (Python 3.11/3.12) \n**Версия:** 1.0.0 \n**Репозиторий:** https://github.com/celxca2282-blip/JArbis \n**Период работы:** 14 июня 2026 (сессии Ask mode + Agent mode) \n**Дата отчёта:** 14 июня 2026 \n\n---\n\n## Содержание\n\n1. [Краткое резюме](#1-краткое-ресюме)\n2. [Хронология по фазам](#2-хронология-по-фазам)\n3. [Ядро: STT, wake-word, LLM, TTS](#3-ядро-stt-wake-word-llm-tts)\n4. [Команды, сценарии, приложения](#4-команды-сценарии-приложения)\n5. [GUI и UX](#5-gui-и-ux)\n6. [Голоса (TTS) — эволюция](#6-голоса-tts--эволюция)\n7. [Сборка exe и релизы](#7-сборка-exe-и-релизы)\n8. [Подготовка для тестера и VM](#8-подготовка-для-тестера-и-vm)\n9. [GitHub, CI, установка в 1 клик](#9-github-ci-установка-в-1-клик)\n10. [Большой аудит и рефакторинг](#10-большой-аудит-и-рефакторинг)\n11. [Исправления багов (полный список)](#11-исправления-багов-полный-список)\n12. [Тестирование](#12-тестирование)\n13. [Git-коммиты](#13-git-коммиты)\n14. [Структура проекта (итог)](#14-структура-проекта-итог)\n15. [Безопасность и секреты](#15-безопасность-и-секреты)\n16. [Что не сделано / отложено](#16-что-не-сделано--отложено)\n17. [Артефакты сборки](#17-артефакты-сборки)\n18. [Приложение: индекс запросов пользователя](#18-приложение-индекс-запросов-пользователя)\n\n---\n\n## 1. Краткое резюме\n\nЗа одну интенсивную сессию проект прошёл путь от **минимального CLI-скрипта** («попугай с эхо») до **полноценного голосового ассистента** с:\n\n- wake-word («Джарвис») через Vosk / openWakeWord\n- распознаванием речи (faster-whisper)\n- LLM через OpenRouter (DeepSeek и др.)\n- озвучкой Piper HD (офлайн) + Edge TTS + SAPI\n- GUI в стиле Luxify / Iron Man HUD (CustomTkinter)\n- управлением Windows, ярлыками, сценариями, сканом игр\n- быстрым режимом без LLM\n- системным треем\n- **Windows exe** (~1.4 ГБ) без установки Python\n- **GitHub-ready** код с CI, тестами, документацией\n\n**Тесты на конец работ:** **107 passed** (`python -m pytest tests/`).\n\n---\n\n## 2. Хронология по фазам\n\n| Фаза | Время (ориентир) | Суть |\n|------|------------------|------|\n| **0. Прототип** | ночь 14.06 | STT + LLM + TTS + wake-word, базовый main.py |\n| **1. Архитектура** | утро 14.06 | config.py, logging, response_processor, memory, search, tests |\n| **2. Команды Windows** | утро 14.06 | whitelist, SYSTEM_TARGETS, app scanner, STT normalize |\n| **3. GUI v1** | день 14.06 | CustomTkinter, dashboard, настройки, трей |\n| **4. Luxify HUD** | день 14.06 | 2200+ строк UI, theme, орб, страницы |\n| **5. Голоса** | день 14.06 | Silero → Piper HD, voice picker, scroll fix |\n| **6. Exe** | вечер 14.06 | PyInstaller, иконки, bundle fixes |\n| **7. Тестер + GitHub** | вечер 14.06 | очистка dist, гайд, Releases workflow |\n| **8. Аудит + релиз** | вечер 14.06 | requirements split, LLM fallback, CI, install.bat |\n| **9. VM-сборка** | вечер 14.06 | пересборка exe, zip для виртуалки |\n\n---\n\n## 3. Ядро: STT, wake-word, LLM, TTS\n\n### 3.1. Speech-to-Text (`jarvis/voice/stt_module.py`)\n\n| Изменение | Детали |\n|-----------|--------|\n| Whisper на CPU | Убрана принудительная CUDA; `device=cpu`, `compute_type=int8` по умолчанию на CPU |\n| Модель | Дефолт повышен с `base` → `small` → `medium` (quality mode); в exe hook — `small` |\n| CUDA fallback | При ошибке GPU — автоматический откат на CPU |\n| VAD | Silero VAD v6; fallback без `vad_filter` если модель недоступна в bundle |\n| Микрофон | `list_input_devices()`, выбор в GUI, `STT_INPUT_DEVICE`, тест уровня сигнала |\n| Скорость прослушивания | Уменьшена пауза тишины (~1.0 с), `beam_size=3`, margin для confidence |\n| initial_prompt | Динамический prompt с wake-word и топом приложений (меньше галлюцинаций) |\n| Нормализация | Пост-обработка типичных ошибок Whisper (настройки, wifi, блютуз и т.д.) |\n| Frozen exe | `STT_FORCE_CPU=1` через runtime hook `pyi_rth_jarbis.py` |\n\n### 3.2. Wake-word (`jarvis/voice/wake_word_module.py`)\n\n| Изменение | Детали |\n|-----------|--------|\n| openWakeWord | Модель `jarvis`, pyaudio 16 kHz, порог 0.5 |\n| ONNX вместо TFLite | `inference_framework='onnx'` (TFLite не ставится на Win + Py 3.11) |\n| Авто-скачивание моделей | `openwakeword.utils.download_models()` (ручной URL давал 404) |\n| Два движка | `WAKE_WORD_ENGINE`: `vosk` (дефолт) / `openwakeword` |\n| Имя wake-word | `WAKE_WORD_NAME`: «джарвис» / «прием» и т.д. |\n| Vosk RU | Русская модель, KaldiRecognizer, распознавание слова из partial/final |\n| Единый микрофон | Wake-word использует тот же `STT_INPUT_DEVICE`, что и STT |\n| Отображение | TTS и логи показывают «Джарвис», не «прием» |\n\n### 3.3. LLM (`jarvis/ai/llm_module.py`)\n\n| Изменение | Детали |\n|-----------|--------|\n| DeepSeek API | Первоначально `api.deepseek.com`, модель `deepseek-reasoner` |\n| OpenRouter | `https://openrouter.ai/api/v1`, модель `deepseek/deepseek-r1` → `deepseek/deepseek-chat` |\n| Ключ | `OPENAI_API_KEY` (OpenRouter), загрузка через `python-dotenv` |\n| Заголовки | `HTTP-Referer`, `X-Title` для OpenRouter |\n| System prompt | Много итераций: ирония → без ролеплея → лаконичность 1–2 предложения → теги SEARCH/EXEC |\n| Время | Текущее время в каждом запросе (`datetime.now()`) |\n| Поиск | Тег `[SEARCH:...]` → `search_module` → `get_final_answer` |\n| Память | Интеграция с `memory_module`, фразы очистки памяти |\n| Graceful fallback | **Не падает** без ключа: `LlmUnavailableError`, `friendly_llm_error()`, локальные команды работают |\n| История | `CONVERSATION_HISTORY` для контекста |\n\n### 3.4. TTS — базовый (`jarvis/voice/tts_module.py`)\n\n| Изменение | Детали |\n|-----------|--------|\n| Edge-TTS | `ru-RU-DmitryNeural`, pygame для воспроизведения |\n| Temp-файлы | UUID-имена `temp_audio_*.mp3`, cleanup при старте |\n| WinError 32 | try-except вокруг `os.remove`, не удалять пока pygame держит файл |\n| Маршрутизация | `piper` / `edge` / `sapi` / `silero` через `resolve_tts_engine()` |\n| Fast mode | Piper HD вместо Edge/SAPI |\n| Stop | Кнопка «Стоп» в GUI прерывает озвучку |\n| reload | `reload_tts_settings()` после смены голоса в GUI |\n\n### 3.5. Точка входа (`main.py`)\n\n| Изменение | Детали |\n|-----------|--------|\n| GUI по умолчанию | `python main.py` → `JarvisApp` |\n| CLI | `python main.py --cli` → `engine.run_cli_loop()` |\n| Логирование | `logging.basicConfig` в начале, консоль + `data/jarvis.log` |\n| DEBUG_TEXT_MODE | Текстовый ввод вместо STT/wake-word для отладки |\n| Ctrl+Z откат | Восстановлен GUI-лаунчер после случайного отката на старый CLI-цикл |\n| Размер | ~94 строки (логика в `assistant_engine`) |\n\n---\n\n## 4. Команды, сценарии, приложения\n\n### 4.1. `jarvis/commands/commands_module.py`\n\n- Whitelist `ALLOWED_COMMANDS` (блокировка опасных команд)\n- Локальные триггеры (ступень 1, до LLM)\n- `execute_system_command()`, `execute_workflow()`\n- Точечные URI Windows: `SYSTEM_TARGETS` (wifi, bluetooth, display, звук и т.д.)\n- Команды: блокировка ПК, калькулятор, блокнот, громкость, скриншот и др.\n- Thread lock для потокобезопасности (аудит)\n\n### 4.2. `jarvis/ai/response_processor.py`\n\n- Парсинг `[EXEC:...]`, `[SAVE_MEMORY:...]`, `[OPEN_APP:...]`, `[SEARCH:...]`\n- Возврат `(clean_text, commands, memories)` — теги не озвучиваются\n\n### 4.3. `jarvis/ai/memory_module.py`\n\n- Профиль пользователя `data/user_profile.json`\n- Сохранение/чтение фактов из LLM-тегов\n\n### 4.4. `jarvis/ai/search_module.py`\n\n- Веб-поиск через `ddgs` (миграция с `duckduckgo-search`)\n- Результаты передаются в `get_final_answer(original_query=...)`\n\n### 4.5. App scanner (`jarvis/commands/app_scanner.py`)\n\n- Индекс установленных приложений `data/apps_index.json`\n- Кэш, перескан из GUI\n- Голосовое `[OPEN_APP:name]` через fuzzy match\n- Кнопка «Удалить индекс» в настройках\n\n### 4.6. User apps (`jarvis/commands/user_apps_store.py`)\n\n- Ярлыки: exe / url / folder + голосовые триггеры\n- `data/user_apps.json`\n- Тройное подтверждение для «удалить все ручные ярлыки»\n\n### 4.7. Game scanner (`jarvis/commands/game_scanner.py`)\n\n- Steam, Epic, папки Games\n- Превью с чекбоксами перед импортом\n- Кнопка «Удалить скан» — только игры из скана\n\n### 4.8. Сценарии (`jarvis/commands/scenario_store.py`, `scenario_runner.py`)\n\n- Визуальный редактор в GUI\n- Шаги: exe, url, app_index, command, user_app, delay\n- Preset «Начать работу» при первом запуске\n- `data/scenarios.json`\n\n### 4.9. STT utils (`jarvis/core/stt_text_utils.py`)\n\n- `normalize_stt_text()` — исправление типичных ошибок Whisper\n- Вынесено из commands для чистоты архитектуры\n\n### 4.10. Assistant engine (`jarvis/core/assistant_engine.py`)\n\n- Центральный цикл: wake → STT → local → LLM → TTS\n- Event bus, app state, performance profiles\n- Fast mode / quality mode\n- Рефакторинг main.py → engine (аудит)\n\n---\n\n## 5. GUI и UX\n\n### 5.1. Luxify HUD (`jarvis/gui/`)\n\n- **~2200+ строк** UI-кода\n- `theme.py` — палитра, типографика, `panel_frame`, `accent_panel`, `ghost_button`, `badge_label`\n- `hud_background.py`, `status_orb.py` — анимированный орб (idle/wake/listening/thinking/speaking)\n- Страницы: dashboard, apps, scenarios, settings, logs\n- Top bar, nav, stat tiles, conversation bubble\n- **Баг #00d4ff22:** CustomTkinter не поддерживает `#RRGGBBAA` → `blend_colors()`, `soft_tint()`\n\n### 5.2. Dashboard\n\n- Орб статуса, последняя STT-фраза, ответ, мини-лог\n- Анимация индикатора речи пользователя\n- Бейдж `⚡ FAST` / `◆ QUALITY`\n- Refresh после автозапуска движка\n\n### 5.3. Настройки\n\n- Wake-word, STT/TTS, LLM, микрофон (combobox), перескан индекса\n- Voice picker (см. раздел 6)\n- Быстрый режим\n\n### 5.4. UX-исправления\n\n| Проблема | Решение |\n|----------|---------|\n| Тест микрофона «ломался» | Переработан UI теста, понятный feedback |\n| Меню некрасивое | Минималистичный редизайн навигации |\n| Скролл колёсиком в голосах | `scroll_utils.py`, `SmartScrollableFrame`, изоляция вложенного скролла |\n| Срезанные углы у тестера | Подгонка окна под экран, масштаб 100% Windows |\n| Трей | Клик по иконке открывает окно; закрытие X → сворачивание |\n| Логи | Auto-refresh на `logs_page`, экспорт |\n| Уровень микрофона | `MIC_LEVEL` на орбе |\n\n### 5.4. Иконки (`jarvis/gui/assets/`, `scripts/build_icons.py`)\n\n- Из `source_icon.png`: `icon.png`, `icon.ico`, `icon_512.png`\n- Tray: `tray_idle.png`, `tray_listen.png`\n- UI: app, mic, play, scenario, settings\n\n---\n\n## 6. Голоса (TTS) — эволюция\n\n```\nEdge-TTS only\n → + Windows SAPI\n → + Silero v3/v4/v5 (15 пресетов)\n → Piper HD (финал, дефолт)\n```\n\n### 6.1. Silero (legacy)\n\n- `jarvis/voice/silero_tts.py`\n- Скачивание с `models.silero.ai` (обход 403 GitHub / баг torch.hub)\n- Проблемы: дубли пресетов, «под кайфом» (speed 0.85), заторможенность, качество\n- Опционально: `requirements-optional-silero.txt` (~2 ГБ torch)\n\n### 6.2. Piper HD (основной)\n\n- `jarvis/voice/piper_tts.py`\n- Голоса: ruslan (дефолт), dmitri, denis, irina (~60 МБ каждый)\n- HuggingFace `rhasspy/piper-voices`\n- 7 уникальных пресетов в UI\n- `scripts/download_voice.py`\n- Миграция `silero` → `piper` в `load_gui_settings()`\n\n### 6.3. Voice picker (`jarvis/gui/widgets/voice_picker.py`)\n\n- Hero-карточка + «Прослушать»\n- Фильтры: Все / Офлайн / RU / EN\n- Сетка кликабельных карточек\n- Свёрнутая «Тонкая настройка» (Edge, SAPI)\n\n### 6.4. Стек озвучки (итог)\n\n```\nspeak() → resolve_tts_engine()\n ├── piper → piper_tts.speak() [по умолчанию]\n ├── edge → speak_edge() [онлайн]\n ├── sapi → _speak_sapi() [запасной]\n └── silero → speak_silero() [legacy]\n```\n\n---\n\n## 7. Сборка exe и релизы\n\n### 7.1. Инструменты\n\n| Файл | Назначение |\n|------|------------|\n| `jarbis.spec` | PyInstaller spec, onedir bundle |\n| `scripts/build_exe.py` | Запуск сборки |\n| `scripts/pyi_rth_jarbis.py` | Runtime hook: cwd, DLL paths, STT CPU/small |\n| `scripts/exe_bundle_manifest.py` | Список критичных файлов в bundle |\n| `scripts/verify_exe_bundle.py` | Автопроверка dist |\n| `scripts/make_release_zip.py` | Zip для Releases / VM |\n| `scripts/prepare_tester_dist.py` | Очистка dist для тестера |\n\n### 7.2. Исправления exe (критичные)\n\n| # | Симптом | Причина | Исправление |\n|---|---------|---------|-------------|\n| 1 | Exe сразу закрывается | Нет `piper/espeak-ng-data` | Добавлен в `jarbis.spec` |\n| 2 | Wake-word не работает | Нет `libvosk.dll` | Полный пакет `vosk` в spec |\n| 3 | STT падает после wake | Нет `silero_vad_v6.onnx` | `faster_whisper/assets` в spec |\n| 4 | scipy / DLL errors | Неполный bundle | ctranslate2, onnxruntime, certifi |\n| 5 | «Не слышит» | CUDA в exe, другой микрофон | `STT_FORCE_CPU`, единый input device |\n| 6 | Долго «слушает» | Длинная пауза VAD | silence 1.0s, beam 3, confidence margin |\n| 7 | scipy hidden import | PyInstaller | hiddenimports в spec |\n\n### 7.3. config.py для frozen\n\n```python\nif getattr(sys, \"frozen\", False):\n BASE_DIR = Path(sys.executable).resolve().parent\n```\n\nДанные, `.env`, логи — рядом с `JArbis.exe`.\n\n### 7.4. Bundle — обязательные пути\n\n- `_internal/piper/espeak-ng-data/`\n- `_internal/vosk/libvosk.dll`\n- `_internal/faster_whisper/assets/silero_vad_v6.onnx`\n- `_internal/jarvis/gui/assets/icon.ico`\n- `_internal/customtkinter/assets/`\n- `_internal/ctranslate2/`, `_internal/onnxruntime/capi/`\n- `_internal/certifi/cacert.pem`\n\n---\n\n## 8. Подготовка для тестера и VM\n\n### 8.1. `prepare_tester_dist.py` удаляет\n\n**Корень dist:**\n- `.env`, `crash.log`\n\n**data/:**\n- `jarvis.log`, `gui_settings.json`, `user_profile.json`\n- `user_apps.json`, `apps_index.json`, `.tray_hint_shown`\n\n**_internal/:**\n- `.env`, `.env.example` (копия в корне через `.env.example`)\n\n### 8.2. Добавляет в dist\n\n- `КАК_ТЕСТИРОВАТЬ.txt` — полный гайд\n- `УСТАНОВИТЬ.bat` — создаёт `.env` из шаблона\n- `ЗАПУСТИТЬ.bat` — запуск exe\n- `.env.example` в корне\n\n### 8.3. Артефакты (14.06.2026, вечер)\n\n| Путь | Размер |\n|------|--------|\n| `dist/JArbis/` | ~1.4 ГБ |\n| `releases/JArbis-v1.0.0-win64.zip` | ~1.37 ГБ (1 466 671 983 байт) |\n| `dist/JArbis/JArbis.exe` | ~35 МБ |\n\n### 8.4. Инструкция для VM\n\n1. Скопировать zip или папку `dist/JArbis`\n2. `УСТАНОВИТЬ.bat` → `.env`\n3. При необходимости — `OPENAI_API_KEY` в `.env`\n4. `ЗАПУСТИТЬ.bat`\n5. Python не нужен; Windows 10/11 x64, микрофон, интернет на первом запуске\n\n---\n\n## 9. GitHub, CI, установка в 1 клик\n\n### 9.1. GitHub\n\n- Репозиторий: `celxca2282-blip/JArbis`\n- `docs/GITHUB.md` — workflow с тестером\n- `.gitignore` — `.env`, `dist/`, `build/`, логи, модели, личные data\n- `.github/ISSUE_TEMPLATE/bug_report.md`\n- `.github/workflows/ci.yml` — pytest на push\n- `CONTRIBUTING.md`\n\n### 9.2. Releases workflow\n\n```powershell\npython scripts/build_exe.py\npython scripts/make_release_zip.py --version 1.0.0\n```\n\nExe **не в git** — только в GitHub Releases (~2 ГБ).\n\n### 9.3. Установка в 1 клик (исходники)\n\n| Файл | Действие |\n|------|----------|\n| `install.bat` | venv + pip + `.env` + Piper voice |\n| `scripts/install.py` | Логика установки (177 строк) |\n| `ЗАПУСТИТЬ.bat` | Запуск через venv |\n\n### 9.4. Git push (14.06.2026)\n\n3 коммита на `origin/main` (см. раздел 13).\n\n---\n\n## 10. Большой аудит и рефакторинг\n\nПромпт «JArbis — большой аудит» (вечер 14.06):\n\n### 10.1. Requirements\n\n| Файл | Содержимое |\n|------|------------|\n| `requirements.txt` | Runtime (prod) |\n| `requirements-dev.txt` | + pytest, dev tools |\n| `requirements-optional-silero.txt` | torch, torchaudio |\n\n### 10.2. config.py + jarvis/config_env.py\n\n- `env_str`, `env_bool`, `env_int`, `env_float`\n- `apply_gui_mapping()` — GUI settings ↔ env\n- `has_api_key()`, `VERSION = \"1.0.0\"`\n- Единая загрузка `.env` из `BASE_DIR`\n\n### 10.3. LLM graceful degradation\n\n- Без ключа — сообщение пользователю, не crash\n- `friendly_llm_error()`, `LlmUnavailableError`\n\n### 10.4. Тесты\n\n- `pytest.ini`, `tests/conftest.py`\n- Новые: `test_config.py`, `test_llm.py`, `test_engine.py`, `test_install.py`, `test_release_tools.py`\n- Часть тестов вынесена из монолитного `test_jarvis.py`\n\n### 10.5. assistant_engine\n\n- Рефакторинг цикла из main\n- Тесты engine без GUI\n\n### 10.6. Прочее\n\n- TTS Silero optional (не в base requirements)\n- commands lock\n- README обновлён\n- `.env.example` актуализирован\n\n---\n\n## 11. Исправления багов (полный список)\n\n| ID | Область | Проблема | Решение |\n|----|---------|----------|---------|\n| B01 | STT | CUDA float16 в консоли | Принудительный CPU int8 / auto с fallback |\n| B02 | STT | CUDA DLL crash на первой фразе | STT_FORCE_CPU, fallback на CPU |\n| B03 | STT | Галлюцинации initial_prompt | Динамический prompt, модель small/medium |\n| B04 | STT | «Не слышит» в exe | Единый микрофон, CPU, тест peak energy |\n| B05 | STT | Долго слушает после команды | silence_duration ↓, beam ↓, confidence margin |\n| B06 | Wake | tflite не ставится | inference_framework='onnx' |\n| B07 | Wake | 404 при скачивании модели | download_models() |\n| B08 | Wake | «прием» vs «Джарвис» | WAKE_WORD_NAME=джарвис, display name |\n| B09 | Wake | Срабатывает в длинной фразе | Улучшена логика детекции |\n| B10 | LLM | Ролеплей, звёздочки | Жёсткий SYSTEM_PROMPT |\n| B11 | LLM | Crash без API key | Graceful fallback |\n| B12 | LLM | DEBUG prints | Убраны, заменены на logging |\n| B13 | TTS | WinError 32 на temp mp3 | UUID имена, try-except remove |\n| B14 | TTS | temp файлы не удаляются | cleanup() при старте |\n| B15 | Search | duckduckgo-search deprecated | pip install ddgs |\n| B16 | GUI | TclError #RRGGBBAA | blend_colors, soft_tint |\n| B17 | GUI | Ctrl+Z откат main.py | Восстановлен GUI launcher |\n| B18 | GUI | DEBUG_TEXT_MODE включён | Исправлен .env / config default False |\n| B19 | GUI | Скролл всей страницы в voice picker | SmartScrollableFrame |\n| B20 | GUI | Срезанный UI у тестера | window geometry, DPI |\n| B21 | GUI | Dashboard crash TclError | Исправлены цвета/виджеты |\n| B22 | Exe | Мгновенное закрытие | Piper espeak-ng-data в bundle |\n| B23 | Exe | Vosk DLL missing | vosk package в spec |\n| B24 | Exe | VAD onnx missing | faster_whisper assets |\n| B25 | Exe | scipy / hidden imports | jarbis.spec hiddenimports |\n| B26 | Dist | API key у тестера | prepare_tester_dist, no .env |\n| B27 | Dist | gui_settings.json с ключом | Удаляется из dist |\n| B28 | Zip | UnicodeEncodeError в print | Косметический баг в make_release_zip (→ стрелки) |\n| B29 | Silero | Authorization при download | Прямая загрузка models.silero.ai |\n| B30 | Voice | Дубли, slow, «под кайфом» | Piper HD, 7 пресетов |\n| B31 | Mic test | Странное поведение | Переработан UI теста |\n| B32 | Stop button | Речь не останавливается | stop_speech() в TTS/engine |\n\n---\n\n## 12. Тестирование\n\n### 12.1. Итог\n\n```\npython -m pytest tests/\n107 passed in ~11s\n```\n\n### 12.2. Файлы тестов\n\n| Файл | Покрытие |\n|------|----------|\n| `tests/test_jarvis.py` | Основной набор (~88+ тестов): commands, STT utils, TTS, wake, GUI helpers |\n| `tests/test_config.py` | config, env helpers |\n| `tests/test_llm.py` | LLM fallback, prompts |\n| `tests/test_engine.py` | assistant_engine |\n| `tests/test_install.py` | install.py |\n| `tests/test_release_tools.py` | bundle verify, release scripts |\n| `tests/conftest.py` | fixtures, temp paths |\n\n### 12.3. История счётчика\n\n- ~90 тестов — после Piper/GUI сессии\n- 107 тестов — после аудита + install/release tests\n\n---\n\n## 13. Git-коммиты\n\n| Hash | Дата | Сообщение |\n|------|------|-----------|\n| `f001712` | 2026-06-14 | Initial commit: JArbis voice assistant (~84 файла, +13263 строк) |\n| `58b5f0a` | 2026-06-14 | Коротко что изменилось (аудит: requirements, config_env, LLM, CI, tests) |\n| `57baf3a` | 2026-06-14 | Установка в один клик: install.bat, ЗАПУСТИТЬ.bat, bat для exe |\n\n**Remote:** `origin/main` — push выполнен 14.06.2026.\n\n---\n\n## 14. Структура проекта (итог)\n\n```\nJArbis/\n├── main.py # Точка входа GUI/CLI\n├── config.py # Конфиг, VERSION, пути frozen\n├── install.bat # Установка в 1 клик\n├── ЗАПУСТИТЬ.bat # Запуск из venv\n├── jarbis.spec # PyInstaller\n├── requirements.txt\n├── requirements-dev.txt\n├── requirements-optional-silero.txt\n├── .env.example\n├── jarvis/\n│ ├── ai/ # llm, search, memory, response_processor\n│ ├── commands/ # commands, scanner, scenarios, user_apps\n│ ├── core/ # assistant_engine, stt_text_utils, event_bus\n│ ├── gui/ # HUD, pages, widgets, theme, tray\n│ ├── voice/ # stt, tts, piper, silero, wake_word\n│ └── config_env.py\n├── scripts/ # build, install, release, icons, voice download\n├── tests/\n├── docs/\n│ ├── CHANGELOG.md # Лог GUI/голосов/exe (сессия до аудита)\n│ ├── GITHUB.md\n│ └── WORK_REPORT_FULL.md # Этот файл\n└── data/ # user data (не в git)\n ├── jarvis.log\n ├── user_profile.json\n ├── apps_index.json\n ├── user_apps.json\n ├── scenarios.json\n └── temp/\n```\n\n---\n\n## 15. Безопасность и секреты\n\n| Правило | Статус |\n|---------|--------|\n| `.env` в `.gitignore` | ✅ |\n| `data/gui_settings.json` в `.gitignore` | ✅ |\n| API key не в dist для тестера | ✅ (prepare_tester_dist) |\n| Старый dist светил ключ в gui_settings | ⚠️ Рекомендована **смена ключа** OpenRouter |\n| Личные user_apps/profile не копируются в dist | ✅ |\n| exe zip не коммитится | ✅ |\n\n---\n\n## 16. Что не сделано / отложено\n\n- [ ] LICENSE (MIT и т.д.) — не выбран пользователем\n- [ ] GitHub Release с zip — инструкция есть, загрузка вручную\n- [ ] Полный split `test_jarvis.py` на модули\n- [ ] Глубокий рефактор `app_scanner.py` / `commands_module.py`\n- [ ] `confirm_utils.py` — тройное подтверждение удаления (частично в user_apps)\n- [ ] Piper EN / Coqui XTTS / модель ~500 МБ male RU\n- [ ] RVC / клонирование голоса\n- [ ] Исправление UnicodeEncodeError в `make_release_zip.py` (стрелки → ASCII)\n- [ ] Скриншоты в `docs/screenshots/`\n\n---\n\n## 17. Артефакты сборки\n\n### Команды сборки\n\n```powershell\ncd C:\\JArbis\npython scripts/build_exe.py\npython scripts/prepare_tester_dist.py\npython scripts/verify_exe_bundle.py\npython scripts/make_release_zip.py --version 1.0.0\n```\n\n### Результат\n\n- `C:\\JArbis\\dist\\JArbis\\` — готовая папка\n- `C:\\JArbis\\releases\\JArbis-v1.0.0-win64.zip` — архив для VM/тестера/Releases\n\n### Содержимое dist (корень)\n\n- `JArbis.exe`\n- `_internal/`\n- `.env.example`\n- `УСТАНОВИТЬ.bat`\n- `ЗАПУСТИТЬ.bat`\n- `КАК_ТЕСТИРОВАТЬ.txt`\n\n---\n\n## 18. Приложение: индекс запросов пользователя\n\nПолный список задач из сессии (128 user_query в transcript). Сгруппировано по темам.\n\n### Ядро и API\n1. Whisper CPU int8 вместо CUDA\n2. Создать llm_module.py (DeepSeek)\n3. main.py — убрать эхо, вызов get_ai_response\n4. OpenRouter вместо DeepSeek direct\n5. OPENAI_API_KEY, debug headers\n6. python-dotenv\n7. Полноценный ассистент: LLM + speak()\n8. SYSTEM_PROMPT без ролеплея + время\n9. openWakeWord wake-word\n10. ONNX inference framework\n11. Авто-скачивание wake models\n12. download_models() вместо ручного URL\n13. Логирование во всём проекте\n14. vosk + openwakeword dual engine\n15. Лаконичность LLM, задержки, починка ответов\n16. response_processor.py\n17. config.py единый + .gitignore\n18. DEBUG_TEXT_MODE\n19. tests.py / pytest\n20. search_module + [SEARCH:]\n21. ddgs вместо duckduckgo-search\n22. Workflow «Начать работу»\n23. SYSTEM_TARGETS Windows URI\n24. normalize_stt_text после STT\n25. STT quality upgrade (small, VAD, mic)\n26. Wake-word «Джарвис» вместо «прием»\n\n### GUI\n27. GUI CustomTkinter\n28. TclError dashboard fix\n29. Тест микрофона + минималистичное меню\n30. Анимация индикатора речи\n31. Режим вопроса — реализация планов\n32. Удаление сканированных игр\n33. Stop — прервать TTS\n34. Удалить индекс / triple confirm user apps\n35. Идеал fast mode\n36. Luxify HUD 1000+ строк\n37. Терминал — диагностика ошибок\n\n### Голоса\n38. «делай голоса» (Edge/SAPI/Silero)\n39. Ctrl+Z проверка, оптимизация\n40. «делай silero»\n41. Больше озвучек\n42. Voice picker UI\n43. Scroll bug в voice menu\n44. Piper HD вместо Silero\n45. CHANGELOG.md\n\n### Exe и релиз\n46. Иконки + exe\n47. Exe закрывается — fix bundle\n48. Новые ошибки exe (scipy, vosk, vad)\n49. Не слышит микрофон\n50. Проверка всех файлов bundle\n51. Долго слушает — STT tuning\n52. Подготовка dist для тестера + гайд\n53. Баги у тестера (UI, библиотеки)\n54. GitHub организация\n55. Большой аудит промпт\n56. install.bat в 1 клик\n57. git push\n58. exe для виртуалки\n59. Как перенести на VM (VirtualBox shared folder)\n60. **Полный отчёт** (этот документ)\n\n---\n\n## Связанные документы\n\n- `docs/CHANGELOG.md` — детальный лог GUI/голосов/exe (сессия до GitHub-аудита)\n- `docs/GITHUB.md` — workflow с тестером и Releases\n- `README.md` — быстрый старт\n- `CONTRIBUTING.md` — для контрибьюторов\n- `КАК_ТЕСТИРОВАТЬ.txt` — в dist для тестера\n\n---\n\n*Документ сгенерирован по истории разработки, git log, transcript сессии и состоянию кодовой базы на 14.06.2026.*\n"}, "3ae1c118452e8d1c13ddb99595b97bcb115a7539": {"t": 1785764978.8616078, "n": 24448, "h": "251ff31b8e7594fc", "c": "# JArbis — полный отчёт о проделанной работе\n\n**Проект:** голосовой ассистент для Windows (Python 3.11/3.12) \n**Версия:** 1.0.0 \n**Репозиторий:** https://github.com/celxca2282-blip/JArbis \n**Период работы:** 14 июня 2026 (сессии Ask mode + Agent mode) \n**Дата отчёта:** 14 июня 2026 \n\n---\n\n## Содержание\n\n1. [Краткое резюме](#1-краткое-ресюме)\n2. [Хронология по фазам](#2-хронология-по-фазам)\n3. [Ядро: STT, wake-word, LLM, TTS](#3-ядро-stt-wake-word-llm-tts)\n4. [Команды, сценарии, приложения](#4-команды-сценарии-приложения)\n5. [GUI и UX](#5-gui-и-ux)\n6. [Голоса (TTS) — эволюция](#6-голоса-tts--эволюция)\n7. [Сборка exe и релизы](#7-сборка-exe-и-релизы)\n8. [Подготовка для тестера и VM](#8-подготовка-для-тестера-и-vm)\n9. [GitHub, CI, установка в 1 клик](#9-github-ci-установка-в-1-клик)\n10. [Большой аудит и рефакторинг](#10-большой-аудит-и-рефакторинг)\n11. [Исправления багов (полный список)](#11-исправления-багов-полный-список)\n12. [Тестирование](#12-тестирование)\n13. [Git-коммиты](#13-git-коммиты)\n14. [Структура проекта (итог)](#14-структура-проекта-итог)\n15. [Безопасность и секреты](#15-безопасность-и-секреты)\n16. [Что не сделано / отложено](#16-что-не-сделано--отложено)\n17. [Артефакты сборки](#17-артефакты-сборки)\n18. [Приложение: индекс запросов пользователя](#18-приложение-индекс-запросов-пользователя)\n\n---\n\n## 1. Краткое резюме\n\nЗа одну интенсивную сессию проект прошёл путь от **минимального CLI-скрипта** («попугай с эхо») до **полноценного голосового ассистента** с:\n\n- wake-word («Джарвис») через Vosk / openWakeWord\n- распознаванием речи (faster-whisper)\n- LLM через OpenRouter (DeepSeek и др.)\n- озвучкой Piper HD (офлайн) + Edge TTS + SAPI\n- GUI в стиле Luxify / Iron Man HUD (CustomTkinter)\n- управлением Windows, ярлыками, сценариями, сканом игр\n- быстрым режимом без LLM\n- системным треем\n- **Windows exe** (~1.4 ГБ) без установки Python\n- **GitHub-ready** код с CI, тестами, документацией\n\n**Тесты на конец работ:** **107 passed** (`python -m pytest tests/`).\n\n---\n\n## 2. Хронология по фазам\n\n| Фаза | Время (ориентир) | Суть |\n|------|------------------|------|\n| **0. Прототип** | ночь 14.06 | STT + LLM + TTS + wake-word, базовый main.py |\n| **1. Архитектура** | утро 14.06 | config.py, logging, response_processor, memory, search, tests |\n| **2. Команды Windows** | утро 14.06 | whitelist, SYSTEM_TARGETS, app scanner, STT normalize |\n| **3. GUI v1** | день 14.06 | CustomTkinter, dashboard, настройки, трей |\n| **4. Luxify HUD** | день 14.06 | 2200+ строк UI, theme, орб, страницы |\n| **5. Голоса** | день 14.06 | Silero → Piper HD, voice picker, scroll fix |\n| **6. Exe** | вечер 14.06 | PyInstaller, иконки, bundle fixes |\n| **7. Тестер + GitHub** | вечер 14.06 | очистка dist, гайд, Releases workflow |\n| **8. Аудит + релиз** | вечер 14.06 | requirements split, LLM fallback, CI, install.bat |\n| **9. VM-сборка** | вечер 14.06 | пересборка exe, zip для виртуалки |\n\n---\n\n## 3. Ядро: STT, wake-word, LLM, TTS\n\n### 3.1. Speech-to-Text (`jarvis/voice/stt_module.py`)\n\n| Изменение | Детали |\n|-----------|--------|\n| Whisper на CPU | Убрана принудительная CUDA; `device=cpu`, `compute_type=int8` по умолчанию на CPU |\n| Модель | Дефолт повышен с `base` → `small` → `medium` (quality mode); в exe hook — `small` |\n| CUDA fallback | При ошибке GPU — автоматический откат на CPU |\n| VAD | Silero VAD v6; fallback без `vad_filter` если модель недоступна в bundle |\n| Микрофон | `list_input_devices()`, выбор в GUI, `STT_INPUT_DEVICE`, тест уровня сигнала |\n| Скорость прослушивания | Уменьшена пауза тишины (~1.0 с), `beam_size=3`, margin для confidence |\n| initial_prompt | Динамический prompt с wake-word и топом приложений (меньше галлюцинаций) |\n| Нормализация | Пост-обработка типичных ошибок Whisper (настройки, wifi, блютуз и т.д.) |\n| Frozen exe | `STT_FORCE_CPU=1` через runtime hook `pyi_rth_jarbis.py` |\n\n### 3.2. Wake-word (`jarvis/voice/wake_word_module.py`)\n\n| Изменение | Детали |\n|-----------|--------|\n| openWakeWord | Модель `jarvis`, pyaudio 16 kHz, порог 0.5 |\n| ONNX вместо TFLite | `inference_framework='onnx'` (TFLite не ставится на Win + Py 3.11) |\n| Авто-скачивание моделей | `openwakeword.utils.download_models()` (ручной URL давал 404) |\n| Два движка | `WAKE_WORD_ENGINE`: `vosk` (дефолт) / `openwakeword` |\n| Имя wake-word | `WAKE_WORD_NAME`: «джарвис» / «прием» и т.д. |\n| Vosk RU | Русская модель, KaldiRecognizer, распознавание слова из partial/final |\n| Единый микрофон | Wake-word использует тот же `STT_INPUT_DEVICE`, что и STT |\n| Отображение | TTS и логи показывают «Джарвис», не «прием» |\n\n### 3.3. LLM (`jarvis/ai/llm_module.py`)\n\n| Изменение | Детали |\n|-----------|--------|\n| DeepSeek API | Первоначально `api.deepseek.com`, модель `deepseek-reasoner` |\n| OpenRouter | `https://openrouter.ai/api/v1`, модель `deepseek/deepseek-r1` → `deepseek/deepseek-chat` |\n| Ключ | `OPENAI_API_KEY` (OpenRouter), загрузка через `python-dotenv` |\n| Заголовки | `HTTP-Referer`, `X-Title` для OpenRouter |\n| System prompt | Много итераций: ирония → без ролеплея → лаконичность 1–2 предложения → теги SEARCH/EXEC |\n| Время | Текущее время в каждом запросе (`datetime.now()`) |\n| Поиск | Тег `[SEARCH:...]` → `search_module` → `get_final_answer` |\n| Память | Интеграция с `memory_module`, фразы очистки памяти |\n| Graceful fallback | **Не падает** без ключа: `LlmUnavailableError`, `friendly_llm_error()`, локальные команды работают |\n| История | `CONVERSATION_HISTORY` для контекста |\n\n### 3.4. TTS — базовый (`jarvis/voice/tts_module.py`)\n\n| Изменение | Детали |\n|-----------|--------|\n| Edge-TTS | `ru-RU-DmitryNeural`, pygame для воспроизведения |\n| Temp-файлы | UUID-имена `temp_audio_*.mp3`, cleanup при старте |\n| WinError 32 | try-except вокруг `os.remove`, не удалять пока pygame держит файл |\n| Маршрутизация | `piper` / `edge` / `sapi` / `silero` через `resolve_tts_engine()` |\n| Fast mode | Piper HD вместо Edge/SAPI |\n| Stop | Кнопка «Стоп» в GUI прерывает озвучку |\n| reload | `reload_tts_settings()` после смены голоса в GUI |\n\n### 3.5. Точка входа (`main.py`)\n\n| Изменение | Детали |\n|-----------|--------|\n| GUI по умолчанию | `python main.py` → `JarvisApp` |\n| CLI | `python main.py --cli` → `engine.run_cli_loop()` |\n| Логирование | `logging.basicConfig` в начале, консоль + `data/jarvis.log` |\n| DEBUG_TEXT_MODE | Текстовый ввод вместо STT/wake-word для отладки |\n| Ctrl+Z откат | Восстановлен GUI-лаунчер после случайного отката на старый CLI-цикл |\n| Размер | ~94 строки (логика в `assistant_engine`) |\n\n---\n\n## 4. Команды, сценарии, приложения\n\n### 4.1. `jarvis/commands/commands_module.py`\n\n- Whitelist `ALLOWED_COMMANDS` (блокировка опасных команд)\n- Локальные триггеры (ступень 1, до LLM)\n- `execute_system_command()`, `execute_workflow()`\n- Точечные URI Windows: `SYSTEM_TARGETS` (wifi, bluetooth, display, звук и т.д.)\n- Команды: блокировка ПК, калькулятор, блокнот, громкость, скриншот и др.\n- Thread lock для потокобезопасности (аудит)\n\n### 4.2. `jarvis/ai/response_processor.py`\n\n- Парсинг `[EXEC:...]`, `[SAVE_MEMORY:...]`, `[OPEN_APP:...]`, `[SEARCH:...]`\n- Возврат `(clean_text, commands, memories)` — теги не озвучиваются\n\n### 4.3. `jarvis/ai/memory_module.py`\n\n- Профиль пользователя `data/user_profile.json`\n- Сохранение/чтение фактов из LLM-тегов\n\n### 4.4. `jarvis/ai/search_module.py`\n\n- Веб-поиск через `ddgs` (миграция с `duckduckgo-search`)\n- Результаты передаются в `get_final_answer(original_query=...)`\n\n### 4.5. App scanner (`jarvis/commands/app_scanner.py`)\n\n- Индекс установленных приложений `data/apps_index.json`\n- Кэш, перескан из GUI\n- Голосовое `[OPEN_APP:name]` через fuzzy match\n- Кнопка «Удалить индекс» в настройках\n\n### 4.6. User apps (`jarvis/commands/user_apps_store.py`)\n\n- Ярлыки: exe / url / folder + голосовые триггеры\n- `data/user_apps.json`\n- Тройное подтверждение для «удалить все ручные ярлыки»\n\n### 4.7. Game scanner (`jarvis/commands/game_scanner.py`)\n\n- Steam, Epic, папки Games\n- Превью с чекбоксами перед импортом\n- Кнопка «Удалить скан» — только игры из скана\n\n### 4.8. Сценарии (`jarvis/commands/scenario_store.py`, `scenario_runner.py`)\n\n- Визуальный редактор в GUI\n- Шаги: exe, url, app_index, command, user_app, delay\n- Preset «Начать работу» при первом запуске\n- `data/scenarios.json`\n\n### 4.9. STT utils (`jarvis/core/stt_text_utils.py`)\n\n- `normalize_stt_text()` — исправление типичных ошибок Whisper\n- Вынесено из commands для чистоты архитектуры\n\n### 4.10. Assistant engine (`jarvis/core/assistant_engine.py`)\n\n- Центральный цикл: wake → STT → local → LLM → TTS\n- Event bus, app state, performance profiles\n- Fast mode / quality mode\n- Рефакторинг main.py → engine (аудит)\n\n---\n\n## 5. GUI и UX\n\n### 5.1. Luxify HUD (`jarvis/gui/`)\n\n- **~2200+ строк** UI-кода\n- `theme.py` — палитра, типографика, `panel_frame`, `accent_panel`, `ghost_button`, `badge_label`\n- `hud_background.py`, `status_orb.py` — анимированный орб (idle/wake/listening/thinking/speaking)\n- Страницы: dashboard, apps, scenarios, settings, logs\n- Top bar, nav, stat tiles, conversation bubble\n- **Баг #00d4ff22:** CustomTkinter не поддерживает `#RRGGBBAA` → `blend_colors()`, `soft_tint()`\n\n### 5.2. Dashboard\n\n- Орб статуса, последняя STT-фраза, ответ, мини-лог\n- Анимация индикатора речи пользователя\n- Бейдж `⚡ FAST` / `◆ QUALITY`\n- Refresh после автозапуска движка\n\n### 5.3. Настройки\n\n- Wake-word, STT/TTS, LLM, микрофон (combobox), перескан индекса\n- Voice picker (см. раздел 6)\n- Быстрый режим\n\n### 5.4. UX-исправления\n\n| Проблема | Решение |\n|----------|---------|\n| Тест микрофона «ломался» | Переработан UI теста, понятный feedback |\n| Меню некрасивое | Минималистичный редизайн навигации |\n| Скролл колёсиком в голосах | `scroll_utils.py`, `SmartScrollableFrame`, изоляция вложенного скролла |\n| Срезанные углы у тестера | Подгонка окна под экран, масштаб 100% Windows |\n| Трей | Клик по иконке открывает окно; закрытие X → сворачивание |\n| Логи | Auto-refresh на `logs_page`, экспорт |\n| Уровень микрофона | `MIC_LEVEL` на орбе |\n\n### 5.4. Иконки (`jarvis/gui/assets/`, `scripts/build_icons.py`)\n\n- Из `source_icon.png`: `icon.png`, `icon.ico`, `icon_512.png`\n- Tray: `tray_idle.png`, `tray_listen.png`\n- UI: app, mic, play, scenario, settings\n\n---\n\n## 6. Голоса (TTS) — эволюция\n\n```\nEdge-TTS only\n → + Windows SAPI\n → + Silero v3/v4/v5 (15 пресетов)\n → Piper HD (финал, дефолт)\n```\n\n### 6.1. Silero (legacy)\n\n- `jarvis/voice/silero_tts.py`\n- Скачивание с `models.silero.ai` (обход 403 GitHub / баг torch.hub)\n- Проблемы: дубли пресетов, «под кайфом» (speed 0.85), заторможенность, качество\n- Опционально: `requirements-optional-silero.txt` (~2 ГБ torch)\n\n### 6.2. Piper HD (основной)\n\n- `jarvis/voice/piper_tts.py`\n- Голоса: ruslan (дефолт), dmitri, denis, irina (~60 МБ каждый)\n- HuggingFace `rhasspy/piper-voices`\n- 7 уникальных пресетов в UI\n- `scripts/download_voice.py`\n- Миграция `silero` → `piper` в `load_gui_settings()`\n\n### 6.3. Voice picker (`jarvis/gui/widgets/voice_picker.py`)\n\n- Hero-карточка + «Прослушать»\n- Фильтры: Все / Офлайн / RU / EN\n- Сетка кликабельных карточек\n- Свёрнутая «Тонкая настройка» (Edge, SAPI)\n\n### 6.4. Стек озвучки (итог)\n\n```\nspeak() → resolve_tts_engine()\n ├── piper → piper_tts.speak() [по умолчанию]\n ├── edge → speak_edge() [онлайн]\n ├── sapi → _speak_sapi() [запасной]\n └── silero → speak_silero() [legacy]\n```\n\n---\n\n## 7. Сборка exe и релизы\n\n### 7.1. Инструменты\n\n| Файл | Назначение |\n|------|------------|\n| `jarbis.spec` | PyInstaller spec, onedir bundle |\n| `scripts/build_exe.py` | Запуск сборки |\n| `scripts/pyi_rth_jarbis.py` | Runtime hook: cwd, DLL paths, STT CPU/small |\n| `scripts/exe_bundle_manifest.py` | Список критичных файлов в bundle |\n| `scripts/verify_exe_bundle.py` | Автопроверка dist |\n| `scripts/make_release_zip.py` | Zip для Releases / VM |\n| `scripts/prepare_tester_dist.py` | Очистка dist для тестера |\n\n### 7.2. Исправления exe (критичные)\n\n| # | Симптом | Причина | Исправление |\n|---|---------|---------|-------------|\n| 1 | Exe сразу закрывается | Нет `piper/espeak-ng-data` | Добавлен в `jarbis.spec` |\n| 2 | Wake-word не работает | Нет `libvosk.dll` | Полный пакет `vosk` в spec |\n| 3 | STT падает после wake | Нет `silero_vad_v6.onnx` | `faster_whisper/assets` в spec |\n| 4 | scipy / DLL errors | Неполный bundle | ctranslate2, onnxruntime, certifi |\n| 5 | «Не слышит» | CUDA в exe, другой микрофон | `STT_FORCE_CPU`, единый input device |\n| 6 | Долго «слушает» | Длинная пауза VAD | silence 1.0s, beam 3, confidence margin |\n| 7 | scipy hidden import | PyInstaller | hiddenimports в spec |\n\n### 7.3. config.py для frozen\n\n```python\nif getattr(sys, \"frozen\", False):\n BASE_DIR = Path(sys.executable).resolve().parent\n```\n\nДанные, `.env`, логи — рядом с `JArbis.exe`.\n\n### 7.4. Bundle — обязательные пути\n\n- `_internal/piper/espeak-ng-data/`\n- `_internal/vosk/libvosk.dll`\n- `_internal/faster_whisper/assets/silero_vad_v6.onnx`\n- `_internal/jarvis/gui/assets/icon.ico`\n- `_internal/customtkinter/assets/`\n- `_internal/ctranslate2/`, `_internal/onnxruntime/capi/`\n- `_internal/certifi/cacert.pem`\n\n---\n\n## 8. Подготовка для тестера и VM\n\n### 8.1. `prepare_tester_dist.py` удаляет\n\n**Корень dist:**\n- `.env`, `crash.log`\n\n**data/:**\n- `jarvis.log`, `gui_settings.json`, `user_profile.json`\n- `user_apps.json`, `apps_index.json`, `.tray_hint_shown`\n\n**_internal/:**\n- `.env`, `.env.example` (копия в корне через `.env.example`)\n\n### 8.2. Добавляет в dist\n\n- `КАК_ТЕСТИРОВАТЬ.txt` — полный гайд\n- `УСТАНОВИТЬ.bat` — создаёт `.env` из шаблона\n- `ЗАПУСТИТЬ.bat` — запуск exe\n- `.env.example` в корне\n\n### 8.3. Артефакты (14.06.2026, вечер)\n\n| Путь | Размер |\n|------|--------|\n| `dist/JArbis/` | ~1.4 ГБ |\n| `releases/JArbis-v1.0.0-win64.zip` | ~1.37 ГБ (1 466 671 983 байт) |\n| `dist/JArbis/JArbis.exe` | ~35 МБ |\n\n### 8.4. Инструкция для VM\n\n1. Скопировать zip или папку `dist/JArbis`\n2. `УСТАНОВИТЬ.bat` → `.env`\n3. При необходимости — `OPENAI_API_KEY` в `.env`\n4. `ЗАПУСТИТЬ.bat`\n5. Python не нужен; Windows 10/11 x64, микрофон, интернет на первом запуске\n\n---\n\n## 9. GitHub, CI, установка в 1 клик\n\n### 9.1. GitHub\n\n- Репозиторий: `celxca2282-blip/JArbis`\n- `docs/GITHUB.md` — workflow с тестером\n- `.gitignore` — `.env`, `dist/`, `build/`, логи, модели, личные data\n- `.github/ISSUE_TEMPLATE/bug_report.md`\n- `.github/workflows/ci.yml` — pytest на push\n- `CONTRIBUTING.md`\n\n### 9.2. Releases workflow\n\n```powershell\npython scripts/build_exe.py\npython scripts/make_release_zip.py --version 1.0.0\n```\n\nExe **не в git** — только в GitHub Releases (~2 ГБ).\n\n### 9.3. Установка в 1 клик (исходники)\n\n| Файл | Действие |\n|------|----------|\n| `install.bat` | venv + pip + `.env` + Piper voice |\n| `scripts/install.py` | Логика установки (177 строк) |\n| `ЗАПУСТИТЬ.bat` | Запуск через venv |\n\n### 9.4. Git push (14.06.2026)\n\n3 коммита на `origin/main` (см. раздел 13).\n\n---\n\n## 10. Большой аудит и рефакторинг\n\nПромпт «JArbis — большой аудит» (вечер 14.06):\n\n### 10.1. Requirements\n\n| Файл | Содержимое |\n|------|------------|\n| `requirements.txt` | Runtime (prod) |\n| `requirements-dev.txt` | + pytest, dev tools |\n| `requirements-optional-silero.txt` | torch, torchaudio |\n\n### 10.2. config.py + jarvis/config_env.py\n\n- `env_str`, `env_bool`, `env_int`, `env_float`\n- `apply_gui_mapping()` — GUI settings ↔ env\n- `has_api_key()`, `VERSION = \"1.0.0\"`\n- Единая загрузка `.env` из `BASE_DIR`\n\n### 10.3. LLM graceful degradation\n\n- Без ключа — сообщение пользователю, не crash\n- `friendly_llm_error()`, `LlmUnavailableError`\n\n### 10.4. Тесты\n\n- `pytest.ini`, `tests/conftest.py`\n- Новые: `test_config.py`, `test_llm.py`, `test_engine.py`, `test_install.py`, `test_release_tools.py`\n- Часть тестов вынесена из монолитного `test_jarvis.py`\n\n### 10.5. assistant_engine\n\n- Рефакторинг цикла из main\n- Тесты engine без GUI\n\n### 10.6. Прочее\n\n- TTS Silero optional (не в base requirements)\n- commands lock\n- README обновлён\n- `.env.example` актуализирован\n\n---\n\n## 11. Исправления багов (полный список)\n\n| ID | Область | Проблема | Решение |\n|----|---------|----------|---------|\n| B01 | STT | CUDA float16 в консоли | Принудительный CPU int8 / auto с fallback |\n| B02 | STT | CUDA DLL crash на первой фразе | STT_FORCE_CPU, fallback на CPU |\n| B03 | STT | Галлюцинации initial_prompt | Динамический prompt, модель small/medium |\n| B04 | STT | «Не слышит» в exe | Единый микрофон, CPU, тест peak energy |\n| B05 | STT | Долго слушает после команды | silence_duration ↓, beam ↓, confidence margin |\n| B06 | Wake | tflite не ставится | inference_framework='onnx' |\n| B07 | Wake | 404 при скачивании модели | download_models() |\n| B08 | Wake | «прием» vs «Джарвис» | WAKE_WORD_NAME=джарвис, display name |\n| B09 | Wake | Срабатывает в длинной фразе | Улучшена логика детекции |\n| B10 | LLM | Ролеплей, звёздочки | Жёсткий SYSTEM_PROMPT |\n| B11 | LLM | Crash без API key | Graceful fallback |\n| B12 | LLM | DEBUG prints | Убраны, заменены на logging |\n| B13 | TTS | WinError 32 на temp mp3 | UUID имена, try-except remove |\n| B14 | TTS | temp файлы не удаляются | cleanup() при старте |\n| B15 | Search | duckduckgo-search deprecated | pip install ddgs |\n| B16 | GUI | TclError #RRGGBBAA | blend_colors, soft_tint |\n| B17 | GUI | Ctrl+Z откат main.py | Восстановлен GUI launcher |\n| B18 | GUI | DEBUG_TEXT_MODE включён | Исправлен .env / config default False |\n| B19 | GUI | Скролл всей страницы в voice picker | SmartScrollableFrame |\n| B20 | GUI | Срезанный UI у тестера | window geometry, DPI |\n| B21 | GUI | Dashboard crash TclError | Исправлены цвета/виджеты |\n| B22 | Exe | Мгновенное закрытие | Piper espeak-ng-data в bundle |\n| B23 | Exe | Vosk DLL missing | vosk package в spec |\n| B24 | Exe | VAD onnx missing | faster_whisper assets |\n| B25 | Exe | scipy / hidden imports | jarbis.spec hiddenimports |\n| B26 | Dist | API key у тестера | prepare_tester_dist, no .env |\n| B27 | Dist | gui_settings.json с ключом | Удаляется из dist |\n| B28 | Zip | UnicodeEncodeError в print | Косметический баг в make_release_zip (→ стрелки) |\n| B29 | Silero | Authorization при download | Прямая загрузка models.silero.ai |\n| B30 | Voice | Дубли, slow, «под кайфом» | Piper HD, 7 пресетов |\n| B31 | Mic test | Странное поведение | Переработан UI теста |\n| B32 | Stop button | Речь не останавливается | stop_speech() в TTS/engine |\n\n---\n\n## 12. Тестирование\n\n### 12.1. Итог\n\n```\npython -m pytest tests/\n107 passed in ~11s\n```\n\n### 12.2. Файлы тестов\n\n| Файл | Покрытие |\n|------|----------|\n| `tests/test_jarvis.py` | Основной набор (~88+ тестов): commands, STT utils, TTS, wake, GUI helpers |\n| `tests/test_config.py` | config, env helpers |\n| `tests/test_llm.py` | LLM fallback, prompts |\n| `tests/test_engine.py` | assistant_engine |\n| `tests/test_install.py` | install.py |\n| `tests/test_release_tools.py` | bundle verify, release scripts |\n| `tests/conftest.py` | fixtures, temp paths |\n\n### 12.3. История счётчика\n\n- ~90 тестов — после Piper/GUI сессии\n- 107 тестов — после аудита + install/release tests\n\n---\n\n## 13. Git-коммиты\n\n| Hash | Дата | Сообщение |\n|------|------|-----------|\n| `f001712` | 2026-06-14 | Initial commit: JArbis voice assistant (~84 файла, +13263 строк) |\n| `58b5f0a` | 2026-06-14 | Коротко что изменилось (аудит: requirements, config_env, LLM, CI, tests) |\n| `57baf3a` | 2026-06-14 | Установка в один клик: install.bat, ЗАПУСТИТЬ.bat, bat для exe |\n\n**Remote:** `origin/main` — push выполнен 14.06.2026.\n\n---\n\n## 14. Структура проекта (итог)\n\n```\nJArbis/\n├── main.py # Точка входа GUI/CLI\n├── config.py # Конфиг, VERSION, пути frozen\n├── install.bat # Установка в 1 клик\n├── ЗАПУСТИТЬ.bat # Запуск из venv\n├── jarbis.spec # PyInstaller\n├── requirements.txt\n├── requirements-dev.txt\n├── requirements-optional-silero.txt\n├── .env.example\n├── jarvis/\n│ ├── ai/ # llm, search, memory, response_processor\n│ ├── commands/ # commands, scanner, scenarios, user_apps\n│ ├── core/ # assistant_engine, stt_text_utils, event_bus\n│ ├── gui/ # HUD, pages, widgets, theme, tray\n│ ├── voice/ # stt, tts, piper, silero, wake_word\n│ └── config_env.py\n├── scripts/ # build, install, release, icons, voice download\n├── tests/\n├── docs/\n│ ├── CHANGELOG.md # Лог GUI/голосов/exe (сессия до аудита)\n│ ├── GITHUB.md\n│ └── WORK_REPORT_FULL.md # Этот файл\n└── data/ # user data (не в git)\n ├── jarvis.log\n ├── user_profile.json\n ├── apps_index.json\n ├── user_apps.json\n ├── scenarios.json\n └── temp/\n```\n\n---\n\n## 15. Безопасность и секреты\n\n| Правило | Статус |\n|---------|--------|\n| `.env` в `.gitignore` | ✅ |\n| `data/gui_settings.json` в `.gitignore` | ✅ |\n| API key не в dist для тестера | ✅ (prepare_tester_dist) |\n| Старый dist светил ключ в gui_settings | ⚠️ Рекомендована **смена ключа** OpenRouter |\n| Личные user_apps/profile не копируются в dist | ✅ |\n| exe zip не коммитится | ✅ |\n\n---\n\n## 16. Что не сделано / отложено\n\n- [ ] LICENSE (MIT и т.д.) — не выбран пользователем\n- [ ] GitHub Release с zip — инструкция есть, загрузка вручную\n- [ ] Полный split `test_jarvis.py` на модули\n- [ ] Глубокий рефактор `app_scanner.py` / `commands_module.py`\n- [ ] `confirm_utils.py` — тройное подтверждение удаления (частично в user_apps)\n- [ ] Piper EN / Coqui XTTS / модель ~500 МБ male RU\n- [ ] RVC / клонирование голоса\n- [ ] Исправление UnicodeEncodeError в `make_release_zip.py` (стрелки → ASCII)\n- [ ] Скриншоты в `docs/screenshots/`\n\n---\n\n## 17. Артефакты сборки\n\n### Команды сборки\n\n```powershell\ncd C:\\JArbis\npython scripts/build_exe.py\npython scripts/prepare_tester_dist.py\npython scripts/verify_exe_bundle.py\npython scripts/make_release_zip.py --version 1.0.0\n```\n\n### Результат\n\n- `C:\\JArbis\\dist\\JArbis\\` — готовая папка\n- `C:\\JArbis\\releases\\JArbis-v1.0.0-win64.zip` — архив для VM/тестера/Releases\n\n### Содержимое dist (корень)\n\n- `JArbis.exe`\n- `_internal/`\n- `.env.example`\n- `УСТАНОВИТЬ.bat`\n- `ЗАПУСТИТЬ.bat`\n- `КАК_ТЕСТИРОВАТЬ.txt`\n\n---\n\n## 18. Приложение: индекс запросов пользователя\n\nПолный список задач из сессии (128 user_query в transcript). Сгруппировано по темам.\n\n### Ядро и API\n1. Whisper CPU int8 вместо CUDA\n2. Создать llm_module.py (DeepSeek)\n3. main.py — убрать эхо, вызов get_ai_response\n4. OpenRouter вместо DeepSeek direct\n5. OPENAI_API_KEY, debug headers\n6. python-dotenv\n7. Полноценный ассистент: LLM + speak()\n8. SYSTEM_PROMPT без ролеплея + время\n9. openWakeWord wake-word\n10. ONNX inference framework\n11. Авто-скачивание wake models\n12. download_models() вместо ручного URL\n13. Логирование во всём проекте\n14. vosk + openwakeword dual engine\n15. Лаконичность LLM, задержки, починка ответов\n16. response_processor.py\n17. config.py единый + .gitignore\n18. DEBUG_TEXT_MODE\n19. tests.py / pytest\n20. search_module + [SEARCH:]\n21. ddgs вместо duckduckgo-search\n22. Workflow «Начать работу»\n23. SYSTEM_TARGETS Windows URI\n24. normalize_stt_text после STT\n25. STT quality upgrade (small, VAD, mic)\n26. Wake-word «Джарвис» вместо «прием»\n\n### GUI\n27. GUI CustomTkinter\n28. TclError dashboard fix\n29. Тест микрофона + минималистичное меню\n30. Анимация индикатора речи\n31. Режим вопроса — реализация планов\n32. Удаление сканированных игр\n33. Stop — прервать TTS\n34. Удалить индекс / triple confirm user apps\n35. Идеал fast mode\n36. Luxify HUD 1000+ строк\n37. Терминал — диагностика ошибок\n\n### Голоса\n38. «делай голоса» (Edge/SAPI/Silero)\n39. Ctrl+Z проверка, оптимизация\n40. «делай silero»\n41. Больше озвучек\n42. Voice picker UI\n43. Scroll bug в voice menu\n44. Piper HD вместо Silero\n45. CHANGELOG.md\n\n### Exe и релиз\n46. Иконки + exe\n47. Exe закрывается — fix bundle\n48. Новые ошибки exe (scipy, vosk, vad)\n49. Не слышит микрофон\n50. Проверка всех файлов bundle\n51. Долго слушает — STT tuning\n52. Подготовка dist для тестера + гайд\n53. Баги у тестера (UI, библиотеки)\n54. GitHub организация\n55. Большой аудит промпт\n56. install.bat в 1 клик\n57. git push\n58. exe для виртуалки\n59. Как перенести на VM (VirtualBox shared folder)\n60. **Полный отчёт** (этот документ)\n\n---\n\n## Связанные документы\n\n- `docs/CHANGELOG.md` — детальный лог GUI/голосов/exe (сессия до GitHub-аудита)\n- `docs/GITHUB.md` — workflow с тестером и Releases\n- `README.md` — быстрый старт\n- `CONTRIBUTING.md` — для контрибьюторов\n- `КАК_ТЕСТИРОВАТЬ.txt` — в dist для тестера\n\n---\n\n*Документ сгенерирован по истории разработки, git log, transcript сессии и состоянию кодовой базы на 14.06.2026.*\n"}}}}