Files

1 line
64 KiB
JSON
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{"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"}}}}