From 72b6879f4b662ddaa7f27ee48454f55024268c7d Mon Sep 17 00:00:00 2001
From: Sergey Korotonozhko <_serezhka_@mail.ru>
Date: Fri, 29 May 2026 02:30:30 +0300
Subject: [PATCH] v1.7.0: refactor max_bot to flat structure, add
VCF+UserModel+NLP history context, portal pages and proxy fixes
- Refactored max_bot from nested packages to flat module structure
- Q2: Extended BotUser model (patronymic, email, org, address, vcf_raw, contact_hash, phone_verified, email_verified, last_interaction, total_conversations, total_tickets)
- Q2: VCF parser (FN, N, TEL, EMAIL, ORG, ADR), upsert on re-contact, NLP history context (_get_user_history_context -> YandexGPT)
- Q1: Broadcast preview modal with 10s confirmation timer
- Q3: CSS var(--white)->var(--bg-card), var(--text)->var(--text-primary)
- Q4: bot_settings showNotification(), editable max_bot_id
- Q5: Webhook secret passthrough via X-Max-Bot-Api-Secret
- Masking sensitive keys, dialog_cleared handler, migrate via _add_column_if_not_exists()
- Rate limit (asyncio.sleep 0.5 per 10), dead code removed, conv.intent context in contact.py
- Portal pages: bot_consent, bot_kb (edit), bot_settings, bot_test, bot_tickets, portal_settings
- Tests: 21/21 passing, added test_yandex_gpt.py, test_email_sender.py
- Deploy: deploy_full.sh, schema.sql, seed_knowledge_base.sql
---
.gitignore | 6 +
.opencode/plans/max_bot_fixes_v2.md | 128 +
aegisone-php/Dockerfile | 23 +
aegisone-php/docker-compose.yml | 28 +
aegisone-php/nginx.conf | 29 +
config.php | 2 +-
gitea/docker-compose.yml | 49 +
index.php | 2 +-
inspect.json | Bin 0 -> 21756 bytes
max_bot/.env.example | 5 -
max_bot/CHANGELOG.md | 45 +-
max_bot/Dockerfile | 10 +-
.../app/__pycache__/__init__.cpython-314.pyc | Bin 150 -> 0 bytes
.../__pycache__/bot_engine.cpython-314.pyc | Bin 14364 -> 0 bytes
.../app/__pycache__/bot_engine.cpython-38.pyc | Bin 5752 -> 0 bytes
.../app/__pycache__/config.cpython-314.pyc | Bin 2062 -> 0 bytes
max_bot/app/__pycache__/config.cpython-38.pyc | Bin 1136 -> 1592 bytes
.../__pycache__/conversation.cpython-314.pyc | Bin 11116 -> 0 bytes
.../__pycache__/conversation.cpython-38.pyc | Bin 4658 -> 0 bytes
.../app/__pycache__/database.cpython-314.pyc | Bin 1341 -> 0 bytes
.../app/__pycache__/database.cpython-38.pyc | Bin 583 -> 638 bytes
.../__pycache__/file_storage.cpython-38.pyc | Bin 1729 -> 0 bytes
max_bot/app/__pycache__/fsm.cpython-314.pyc | Bin 10181 -> 0 bytes
max_bot/app/__pycache__/fsm.cpython-38.pyc | Bin 2887 -> 0 bytes
max_bot/app/__pycache__/main.cpython-314.pyc | Bin 65981 -> 0 bytes
max_bot/app/__pycache__/main.cpython-38.pyc | Bin 27083 -> 0 bytes
.../app/__pycache__/max_api.cpython-314.pyc | Bin 14931 -> 0 bytes
.../app/__pycache__/max_api.cpython-38.pyc | Bin 6804 -> 2874 bytes
.../settings_cache.cpython-314.pyc | Bin 11361 -> 0 bytes
.../__pycache__/settings_cache.cpython-38.pyc | Bin 4949 -> 2074 bytes
.../__pycache__/text_renderer.cpython-314.pyc | Bin 2657 -> 0 bytes
.../__pycache__/text_renderer.cpython-38.pyc | Bin 1315 -> 0 bytes
max_bot/app/bot_engine.py | 268 --
max_bot/app/config.py | 32 +-
max_bot/app/config_reader.py | 61 +
max_bot/app/conversation.py | 142 -
max_bot/app/database.py | 21 +-
max_bot/app/email_sender.py | 80 +
max_bot/app/file_storage.py | 77 -
max_bot/app/fsm.py | 209 -
.../__pycache__/__init__.cpython-314.pyc | Bin 159 -> 0 bytes
.../__pycache__/consent.cpython-314.pyc | Bin 4782 -> 0 bytes
.../__pycache__/consent.cpython-38.pyc | Bin 2264 -> 4855 bytes
.../__pycache__/contact.cpython-38.pyc | Bin 1495 -> 2836 bytes
.../__pycache__/greeting.cpython-314.pyc | Bin 2489 -> 0 bytes
.../__pycache__/greeting.cpython-38.pyc | Bin 1188 -> 7569 bytes
.../__pycache__/handoff.cpython-314.pyc | Bin 2212 -> 0 bytes
.../__pycache__/handoff.cpython-38.pyc | Bin 1568 -> 2636 bytes
.../__pycache__/inquiry.cpython-314.pyc | Bin 8134 -> 0 bytes
.../__pycache__/inquiry.cpython-38.pyc | Bin 2820 -> 3619 bytes
.../__pycache__/main_menu.cpython-314.pyc | Bin 6731 -> 0 bytes
.../__pycache__/main_menu.cpython-38.pyc | Bin 3417 -> 0 bytes
.../__pycache__/out_of_hours.cpython-314.pyc | Bin 3118 -> 0 bytes
max_bot/app/handlers/consent.py | 147 +-
max_bot/app/handlers/contact.py | 98 +-
max_bot/app/handlers/features/__init__.py | 0
.../__pycache__/appointment.cpython-38.pyc | Bin 1948 -> 0 bytes
.../__pycache__/commercial.cpython-38.pyc | Bin 1933 -> 0 bytes
.../__pycache__/my_objects.cpython-38.pyc | Bin 1608 -> 0 bytes
.../__pycache__/photo_report.cpython-38.pyc | Bin 1854 -> 0 bytes
.../__pycache__/quality_rate.cpython-38.pyc | Bin 1243 -> 0 bytes
.../__pycache__/risk_score.cpython-38.pyc | Bin 2998 -> 0 bytes
.../__pycache__/sla_status.cpython-38.pyc | Bin 1566 -> 0 bytes
max_bot/app/handlers/features/appointment.py | 105 -
max_bot/app/handlers/features/broadcasts.py | 44 -
max_bot/app/handlers/features/commercial.py | 101 -
max_bot/app/handlers/features/my_objects.py | 39 -
.../app/handlers/features/notifications.py | 68 -
max_bot/app/handlers/features/photo_report.py | 69 -
max_bot/app/handlers/features/quality_rate.py | 35 -
max_bot/app/handlers/features/reminders.py | 48 -
max_bot/app/handlers/features/risk_score.py | 100 -
max_bot/app/handlers/features/sla_status.py | 54 -
max_bot/app/handlers/features/sla_ticket.py | 155 -
max_bot/app/handlers/greeting.py | 287 +-
max_bot/app/handlers/handoff.py | 112 +-
max_bot/app/handlers/inquiry.py | 228 +-
max_bot/app/handlers/main_menu.py | 103 -
max_bot/app/handlers/out_of_hours.py | 43 -
max_bot/app/integrations/_1c_unf.py | 100 -
max_bot/app/integrations/__init__.py | 0
.../__pycache__/_1c_unf.cpython-314.pyc | Bin 6306 -> 0 bytes
.../__pycache__/_1c_unf.cpython-38.pyc | Bin 2592 -> 0 bytes
.../__pycache__/__init__.cpython-314.pyc | Bin 163 -> 0 bytes
.../__pycache__/portal_db.cpython-314.pyc | Bin 4319 -> 0 bytes
.../__pycache__/portal_db.cpython-38.pyc | Bin 1743 -> 0 bytes
.../__pycache__/yandex_gpt.cpython-314.pyc | Bin 6100 -> 0 bytes
.../__pycache__/yandex_gpt.cpython-38.pyc | Bin 2469 -> 0 bytes
max_bot/app/integrations/portal_db.py | 57 -
max_bot/app/integrations/yandex_gpt.py | 80 -
max_bot/app/keyboards.py | 77 +
max_bot/app/keyboards/__init__.py | 0
.../__pycache__/__init__.cpython-314.pyc | Bin 160 -> 0 bytes
.../__pycache__/inline.cpython-314.pyc | Bin 5998 -> 0 bytes
.../__pycache__/inline.cpython-38.pyc | Bin 3149 -> 0 bytes
max_bot/app/keyboards/inline.py | 90 -
max_bot/app/main.py | 1280 ++----
max_bot/app/max_api.py | 224 +-
max_bot/app/max_notifications.py | 148 -
max_bot/app/models.py | 140 +
max_bot/app/models/__init__.py | 0
.../__pycache__/__init__.cpython-314.pyc | Bin 157 -> 0 bytes
.../models/__pycache__/models.cpython-314.pyc | Bin 18547 -> 0 bytes
.../models/__pycache__/models.cpython-38.pyc | Bin 6467 -> 0 bytes
max_bot/app/models/models.py | 350 --
max_bot/app/settings_cache.py | 152 +-
max_bot/app/text_renderer.py | 34 -
max_bot/app/utils/__init__.py | 0
.../__pycache__/__init__.cpython-314.pyc | Bin 156 -> 0 bytes
.../emotion_detector.cpython-314.pyc | Bin 2233 -> 0 bytes
max_bot/app/utils/emotion_detector.py | 28 -
max_bot/app/yandex_gpt.py | 107 +
max_bot/deploy_full.sh | 162 +
max_bot/docker-compose.yml | 30 +-
max_bot/max_bot_deploy.sh | 142 +-
max_bot/requirements.txt | 21 +-
max_bot/sql/bot_schema.sql | 205 -
.../v1.5.1_broadcast_recipient_ids.sql | 2 -
.../v1.5.2_role_menu_permissions.sql | 26 -
max_bot/sql/migrations/v1.6.0_fixes.sql | 38 -
max_bot/sql/schema.sql | 170 +
max_bot/sql/seed_knowledge_base.sql | 194 +
.../__pycache__/__init__.cpython-314.pyc | Bin 152 -> 0 bytes
.../conftest.cpython-314-pytest-9.0.3.pyc | Bin 5449 -> 0 bytes
.../test_fsm.cpython-314-pytest-9.0.3.pyc | Bin 66950 -> 0 bytes
...test_handlers.cpython-314-pytest-9.0.3.pyc | Bin 24688 -> 0 bytes
.../test_max_api.cpython-314-pytest-9.0.3.pyc | Bin 21059 -> 0 bytes
.../test_webhook.cpython-314-pytest-9.0.3.pyc | Bin 31991 -> 0 bytes
max_bot/tests/conftest.py | 78 -
max_bot/tests/test_email_sender.py | 57 +
max_bot/tests/test_fsm.py | 168 -
max_bot/tests/test_handlers.py | 269 +-
max_bot/tests/test_max_api.py | 145 +-
max_bot/tests/test_webhook.py | 183 -
max_bot/tests/test_yandex_gpt.py | 59 +
max_bot/version.txt | 2 +-
max_bot/ТЗ.md | 112 +
nginx/conf.d/aegisone.conf | 38 +
nginx/conf.d/gitea.conf | 42 +
.../nginx => nginx/conf.d}/max-aegisone.conf | 0
nginx/conf.d/service-aegisone.conf | 70 +
nginx/docker-compose.yml | 21 +
nginx/fix_nginx.sh | 124 +
nginx/nginx.conf | 35 +
other/1c_webhook.md | 529 +++
other/AI-EXISTING-TWO-PROJECT-INSTRUCTION.md | 270 ++
other/VPS_GUIDE.md | 289 ++
.../VPS_SETUP_INSTRUCTION.md | 0
other/aegisone-py-deploy.zip | Bin 0 -> 468743 bytes
other/deploy.sh | 222 +
other/fix_and_deploy.sh | 152 +
other/history.md | 3933 +++++++++++++++++
other/py_deploy_files.txt | 67 +
other/webhook.md | 46 +
portainer/docker-compose.yml | 13 +
py_service/.dockerignore | 6 +
py_service/.env.example | 1 +
py_service/CHANGELOG.md | 57 +
py_service/Dockerfile | 7 +-
py_service/app/dependencies.py | 6 +-
py_service/app/documents_router.py | 317 +-
py_service/app/main.py | 55 +-
py_service/app/models/models.py | 17 +
.../__pycache__/service_pages.cpython-38.pyc | Bin 47362 -> 69200 bytes
py_service/app/routers/service_pages.py | 445 +-
py_service/app/static/css/service-theme.css | 6 +-
py_service/app/static/css/service.css | 72 +
py_service/app/static/js/role-switcher.js | 38 +
py_service/app/static/js/theme.js | 9 +-
py_service/app/templates/_sidebar.html | 16 +-
py_service/app/templates/base.html | 42 +-
py_service/app/templates/dashboard.html | 144 +-
py_service/app/templates/login.html | 1 +
py_service/app/templates/page.html | 143 +-
.../app/templates/pages/bot_broadcasts.html | 241 -
.../app/templates/pages/bot_consent.html | 220 +
py_service/app/templates/pages/bot_kb.html | 239 +
.../app/templates/pages/bot_settings.html | 122 +
py_service/app/templates/pages/bot_test.html | 139 +
.../app/templates/pages/bot_tickets.html | 179 +
py_service/app/templates/pages/formulas.html | 281 ++
.../app/templates/pages/portal_settings.html | 75 +
.../app/templates/pages/role_settings.html | 126 +
py_service/app/templates/pages/users.html | 11 +-
py_service/deploy_docs.sh | 42 +
py_service/deploy_remote.sh | 18 +
py_service/docker-compose.yml | 27 +-
.../docs/AEGISONE_INFRASTRUCTURE_PLAN.md | 836 ++++
py_service/docs/KPI_инженеров.md | 485 ++
py_service/docs/Owner.md | 520 +++
py_service/docs/SEO.md | 488 ++
py_service/docs/SLA.md | 795 ++++
py_service/docs/SQL-запросы.md | 69 +
py_service/docs/Архетиктура бренда.md | 934 ++++
py_service/docs/Архитектура компании.md | 459 ++
py_service/docs/Блог.md | 543 +++
py_service/docs/Воронка.md | 445 ++
py_service/docs/Воронки телеграм и crm.md | 397 ++
py_service/docs/Дашборд инженера.md | 537 +++
py_service/docs/Дашборд техника.md | 424 ++
py_service/docs/Докозательная экспертиза.md | 574 +++
py_service/docs/Инструкция по админ-панели.md | 85 +
py_service/docs/КП и структура аудита.md | 589 +++
py_service/docs/Контент план.md | 503 +++
py_service/docs/Маркеттинг.md | 673 +++
py_service/docs/Опросник-расчет.md | 1087 +++++
py_service/docs/Основа.md | 1518 +++++++
py_service/docs/Сайт и упаковка.md | 1417 ++++++
py_service/docs/Скрипты продаж.md | 340 ++
py_service/docs/УТП и КП.md | 556 +++
py_service/docs/Формулы и расчёты.md | 157 +
py_service/docs/Цифровая модель общая.md | 458 ++
py_service/docs/автоматическая_система_SHS.md | 629 +++
py_service/requirements.txt | 9 +-
py_service/sql/v1.5.0_migration.sql | 98 +
.../sql}/v1.5.5_tables_and_seed.sql | 0
py_service/tests/permission_config.py | 74 -
py_service/tests/test_routes.py | 40 -
py_service/tests/test_routes_defined.py | 34 -
py_service/tests/test_smoke_server.py | 9 -
py_service/version.txt | 2 +-
service/api/tasks.php | 2 +-
service/assets/css/service.css | 242 +
service/inc/auth.php | 2 +-
service/inc/functions.php | 2 +-
service/install.php | 12 +-
service/pages/engineer/incidents.php | 4 +-
service/pages/engineer/tasks.php | 4 +-
service/pages/owner/assignments.php | 2 +-
service/pages/owner/ceo.php | 2 +-
service/pages/owner/coefficients.php | 10 +-
service/pages/owner/kpi_calc.php | 2 +-
service/pages/shared/questionnaire.php | 2 +-
service/pages/technician/checklist.php | 2 +-
234 files changed, 26768 insertions(+), 6240 deletions(-)
create mode 100644 .gitignore
create mode 100644 .opencode/plans/max_bot_fixes_v2.md
create mode 100644 aegisone-php/Dockerfile
create mode 100644 aegisone-php/docker-compose.yml
create mode 100644 aegisone-php/nginx.conf
create mode 100644 gitea/docker-compose.yml
create mode 100644 inspect.json
delete mode 100644 max_bot/.env.example
delete mode 100644 max_bot/app/__pycache__/__init__.cpython-314.pyc
delete mode 100644 max_bot/app/__pycache__/bot_engine.cpython-314.pyc
delete mode 100644 max_bot/app/__pycache__/bot_engine.cpython-38.pyc
delete mode 100644 max_bot/app/__pycache__/config.cpython-314.pyc
delete mode 100644 max_bot/app/__pycache__/conversation.cpython-314.pyc
delete mode 100644 max_bot/app/__pycache__/conversation.cpython-38.pyc
delete mode 100644 max_bot/app/__pycache__/database.cpython-314.pyc
delete mode 100644 max_bot/app/__pycache__/file_storage.cpython-38.pyc
delete mode 100644 max_bot/app/__pycache__/fsm.cpython-314.pyc
delete mode 100644 max_bot/app/__pycache__/fsm.cpython-38.pyc
delete mode 100644 max_bot/app/__pycache__/main.cpython-314.pyc
delete mode 100644 max_bot/app/__pycache__/main.cpython-38.pyc
delete mode 100644 max_bot/app/__pycache__/max_api.cpython-314.pyc
delete mode 100644 max_bot/app/__pycache__/settings_cache.cpython-314.pyc
delete mode 100644 max_bot/app/__pycache__/text_renderer.cpython-314.pyc
delete mode 100644 max_bot/app/__pycache__/text_renderer.cpython-38.pyc
delete mode 100644 max_bot/app/bot_engine.py
create mode 100644 max_bot/app/config_reader.py
delete mode 100644 max_bot/app/conversation.py
create mode 100644 max_bot/app/email_sender.py
delete mode 100644 max_bot/app/file_storage.py
delete mode 100644 max_bot/app/fsm.py
delete mode 100644 max_bot/app/handlers/__pycache__/__init__.cpython-314.pyc
delete mode 100644 max_bot/app/handlers/__pycache__/consent.cpython-314.pyc
delete mode 100644 max_bot/app/handlers/__pycache__/greeting.cpython-314.pyc
delete mode 100644 max_bot/app/handlers/__pycache__/handoff.cpython-314.pyc
delete mode 100644 max_bot/app/handlers/__pycache__/inquiry.cpython-314.pyc
delete mode 100644 max_bot/app/handlers/__pycache__/main_menu.cpython-314.pyc
delete mode 100644 max_bot/app/handlers/__pycache__/main_menu.cpython-38.pyc
delete mode 100644 max_bot/app/handlers/__pycache__/out_of_hours.cpython-314.pyc
delete mode 100644 max_bot/app/handlers/features/__init__.py
delete mode 100644 max_bot/app/handlers/features/__pycache__/appointment.cpython-38.pyc
delete mode 100644 max_bot/app/handlers/features/__pycache__/commercial.cpython-38.pyc
delete mode 100644 max_bot/app/handlers/features/__pycache__/my_objects.cpython-38.pyc
delete mode 100644 max_bot/app/handlers/features/__pycache__/photo_report.cpython-38.pyc
delete mode 100644 max_bot/app/handlers/features/__pycache__/quality_rate.cpython-38.pyc
delete mode 100644 max_bot/app/handlers/features/__pycache__/risk_score.cpython-38.pyc
delete mode 100644 max_bot/app/handlers/features/__pycache__/sla_status.cpython-38.pyc
delete mode 100644 max_bot/app/handlers/features/appointment.py
delete mode 100644 max_bot/app/handlers/features/broadcasts.py
delete mode 100644 max_bot/app/handlers/features/commercial.py
delete mode 100644 max_bot/app/handlers/features/my_objects.py
delete mode 100644 max_bot/app/handlers/features/notifications.py
delete mode 100644 max_bot/app/handlers/features/photo_report.py
delete mode 100644 max_bot/app/handlers/features/quality_rate.py
delete mode 100644 max_bot/app/handlers/features/reminders.py
delete mode 100644 max_bot/app/handlers/features/risk_score.py
delete mode 100644 max_bot/app/handlers/features/sla_status.py
delete mode 100644 max_bot/app/handlers/features/sla_ticket.py
delete mode 100644 max_bot/app/handlers/main_menu.py
delete mode 100644 max_bot/app/handlers/out_of_hours.py
delete mode 100644 max_bot/app/integrations/_1c_unf.py
delete mode 100644 max_bot/app/integrations/__init__.py
delete mode 100644 max_bot/app/integrations/__pycache__/_1c_unf.cpython-314.pyc
delete mode 100644 max_bot/app/integrations/__pycache__/_1c_unf.cpython-38.pyc
delete mode 100644 max_bot/app/integrations/__pycache__/__init__.cpython-314.pyc
delete mode 100644 max_bot/app/integrations/__pycache__/portal_db.cpython-314.pyc
delete mode 100644 max_bot/app/integrations/__pycache__/portal_db.cpython-38.pyc
delete mode 100644 max_bot/app/integrations/__pycache__/yandex_gpt.cpython-314.pyc
delete mode 100644 max_bot/app/integrations/__pycache__/yandex_gpt.cpython-38.pyc
delete mode 100644 max_bot/app/integrations/portal_db.py
delete mode 100644 max_bot/app/integrations/yandex_gpt.py
create mode 100644 max_bot/app/keyboards.py
delete mode 100644 max_bot/app/keyboards/__init__.py
delete mode 100644 max_bot/app/keyboards/__pycache__/__init__.cpython-314.pyc
delete mode 100644 max_bot/app/keyboards/__pycache__/inline.cpython-314.pyc
delete mode 100644 max_bot/app/keyboards/__pycache__/inline.cpython-38.pyc
delete mode 100644 max_bot/app/keyboards/inline.py
delete mode 100644 max_bot/app/max_notifications.py
create mode 100644 max_bot/app/models.py
delete mode 100644 max_bot/app/models/__init__.py
delete mode 100644 max_bot/app/models/__pycache__/__init__.cpython-314.pyc
delete mode 100644 max_bot/app/models/__pycache__/models.cpython-314.pyc
delete mode 100644 max_bot/app/models/__pycache__/models.cpython-38.pyc
delete mode 100644 max_bot/app/models/models.py
delete mode 100644 max_bot/app/text_renderer.py
delete mode 100644 max_bot/app/utils/__init__.py
delete mode 100644 max_bot/app/utils/__pycache__/__init__.cpython-314.pyc
delete mode 100644 max_bot/app/utils/__pycache__/emotion_detector.cpython-314.pyc
delete mode 100644 max_bot/app/utils/emotion_detector.py
create mode 100644 max_bot/app/yandex_gpt.py
create mode 100644 max_bot/deploy_full.sh
delete mode 100644 max_bot/sql/bot_schema.sql
delete mode 100644 max_bot/sql/migrations/v1.5.1_broadcast_recipient_ids.sql
delete mode 100644 max_bot/sql/migrations/v1.5.2_role_menu_permissions.sql
delete mode 100644 max_bot/sql/migrations/v1.6.0_fixes.sql
create mode 100644 max_bot/sql/schema.sql
create mode 100644 max_bot/sql/seed_knowledge_base.sql
delete mode 100644 max_bot/tests/__pycache__/__init__.cpython-314.pyc
delete mode 100644 max_bot/tests/__pycache__/conftest.cpython-314-pytest-9.0.3.pyc
delete mode 100644 max_bot/tests/__pycache__/test_fsm.cpython-314-pytest-9.0.3.pyc
delete mode 100644 max_bot/tests/__pycache__/test_handlers.cpython-314-pytest-9.0.3.pyc
delete mode 100644 max_bot/tests/__pycache__/test_max_api.cpython-314-pytest-9.0.3.pyc
delete mode 100644 max_bot/tests/__pycache__/test_webhook.cpython-314-pytest-9.0.3.pyc
delete mode 100644 max_bot/tests/conftest.py
create mode 100644 max_bot/tests/test_email_sender.py
delete mode 100644 max_bot/tests/test_fsm.py
delete mode 100644 max_bot/tests/test_webhook.py
create mode 100644 max_bot/tests/test_yandex_gpt.py
create mode 100644 max_bot/ТЗ.md
create mode 100644 nginx/conf.d/aegisone.conf
create mode 100644 nginx/conf.d/gitea.conf
rename {max_bot/nginx => nginx/conf.d}/max-aegisone.conf (100%)
create mode 100644 nginx/conf.d/service-aegisone.conf
create mode 100644 nginx/docker-compose.yml
create mode 100644 nginx/fix_nginx.sh
create mode 100644 nginx/nginx.conf
create mode 100644 other/1c_webhook.md
create mode 100644 other/AI-EXISTING-TWO-PROJECT-INSTRUCTION.md
create mode 100644 other/VPS_GUIDE.md
rename VPS_SETUP_INSTRUCTION.md => other/VPS_SETUP_INSTRUCTION.md (100%)
create mode 100644 other/aegisone-py-deploy.zip
create mode 100644 other/deploy.sh
create mode 100644 other/fix_and_deploy.sh
create mode 100644 other/history.md
create mode 100644 other/py_deploy_files.txt
create mode 100644 other/webhook.md
create mode 100644 portainer/docker-compose.yml
create mode 100644 py_service/.dockerignore
create mode 100644 py_service/app/static/js/role-switcher.js
delete mode 100644 py_service/app/templates/pages/bot_broadcasts.html
create mode 100644 py_service/app/templates/pages/bot_consent.html
create mode 100644 py_service/app/templates/pages/bot_kb.html
create mode 100644 py_service/app/templates/pages/bot_settings.html
create mode 100644 py_service/app/templates/pages/bot_test.html
create mode 100644 py_service/app/templates/pages/bot_tickets.html
create mode 100644 py_service/app/templates/pages/formulas.html
create mode 100644 py_service/app/templates/pages/portal_settings.html
create mode 100644 py_service/app/templates/pages/role_settings.html
create mode 100644 py_service/deploy_docs.sh
create mode 100644 py_service/deploy_remote.sh
create mode 100644 py_service/docs/AEGISONE_INFRASTRUCTURE_PLAN.md
create mode 100644 py_service/docs/KPI_инженеров.md
create mode 100644 py_service/docs/Owner.md
create mode 100644 py_service/docs/SEO.md
create mode 100644 py_service/docs/SLA.md
create mode 100644 py_service/docs/SQL-запросы.md
create mode 100644 py_service/docs/Архетиктура бренда.md
create mode 100644 py_service/docs/Архитектура компании.md
create mode 100644 py_service/docs/Блог.md
create mode 100644 py_service/docs/Воронка.md
create mode 100644 py_service/docs/Воронки телеграм и crm.md
create mode 100644 py_service/docs/Дашборд инженера.md
create mode 100644 py_service/docs/Дашборд техника.md
create mode 100644 py_service/docs/Докозательная экспертиза.md
create mode 100644 py_service/docs/Инструкция по админ-панели.md
create mode 100644 py_service/docs/КП и структура аудита.md
create mode 100644 py_service/docs/Контент план.md
create mode 100644 py_service/docs/Маркеттинг.md
create mode 100644 py_service/docs/Опросник-расчет.md
create mode 100644 py_service/docs/Основа.md
create mode 100644 py_service/docs/Сайт и упаковка.md
create mode 100644 py_service/docs/Скрипты продаж.md
create mode 100644 py_service/docs/УТП и КП.md
create mode 100644 py_service/docs/Формулы и расчёты.md
create mode 100644 py_service/docs/Цифровая модель общая.md
create mode 100644 py_service/docs/автоматическая_система_SHS.md
create mode 100644 py_service/sql/v1.5.0_migration.sql
rename {max_bot/sql/migrations => py_service/sql}/v1.5.5_tables_and_seed.sql (100%)
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..25887e1
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,6 @@
+__pycache__/
+*.pyc
+.pytest_cache/
+.env
+logs/
+*.tar.gz
diff --git a/.opencode/plans/max_bot_fixes_v2.md b/.opencode/plans/max_bot_fixes_v2.md
new file mode 100644
index 0000000..16140f8
--- /dev/null
+++ b/.opencode/plans/max_bot_fixes_v2.md
@@ -0,0 +1,128 @@
+# MAX Bot Fixes — Implementation Plan v2
+
+## Phase 1: py_service (no rebuild, restart only)
+
+### 1a. Fix ctx() mojibake
+**File:** `py_service/app/routers/service_pages.py:48`
+```python
+# Add to ctx() dict:
+"page_name": kw.get("active_page", "")
+```
+
+### 1b. Add broadcast page route
+**File:** `py_service/app/routers/service_pages.py` — after line 1396:
+```python
+@router.get("/service/bot-settings/broadcasts")
+async def bot_broadcasts_page(request, db, user):
+ return templates.TemplateResponse("pages/bot_broadcasts.html", ctx(request, user=user, active_page="bot-broadcasts", title="Рассылки"))
+```
+Plus proxy endpoints for broadcast data.
+
+### 1c. Add sidebar link
+**File:** `py_service/app/templates/_sidebar.html` — after bot-storage line:
+```html
+{% if role_permissions.get('bot_broadcasts', True) != False %}Рассылки{% endif %}
+```
+
+### 1d. Create bot_broadcasts.html template
+**File:** `py_service/app/templates/pages/bot_broadcasts.html`
+Basically the broadcast section extracted from bot_analytics.html into its own page.
+
+### 1e. Add try/except to all proxy endpoints
+**File:** `py_service/app/routers/service_pages.py`
+Create helper:
+```python
+async def _proxy(method, path, json_body=None):
+ try:
+ async with aiohttp.ClientSession() as session:
+ async with session.request(method, f"{MAX_BOT_URL}{path}", json=json_body) as resp:
+ return JSONResponse(await resp.json())
+ except Exception as e:
+ return JSONResponse({"error": f"Bot service unavailable: {e}", "ok": False}, status_code=503)
+```
+
+### 1f. Update permission_config.py
+Add ALL missing routes (bot broadcasts, notifications, handoffs, risk-questions, storage, tickets)
+
+## Phase 2: max_bot (rebuild required)
+
+### 2a. Fix feature_key auto_notifications → notifications
+**File:** `max_bot/sql/bot_schema.sql:156` — change `'auto_notifications'` to `'notifications'`
+
+### 2b. Fix commercial_offer → commercial (or vice versa)
+**File:** `max_bot/sql/bot_schema.sql:153` — change `'commercial_offer'` to `'commercial'`
+**File:** `max_bot/app/keyboards/inline.py:20` — ensure payload matches
+
+### 2c. Fix test-run: add role:'bot' to test messages
+**File:** `max_bot/app/max_api.py:71` — add `msg["role"] = "bot"`
+**File:** `max_bot/app/main.py:407` — add `role: 'bot'` when copying greeting
+
+### 2d. Fix flush→commit everywhere
+**Files:** `max_bot/app/main.py`
+- Lines 596, 620, 632, 644 → `db.commit()`
+- Lines 722, 725 → `db.commit()`
+- Lines 740, 755 → `db.commit()`
+- Lines 801, 814 → `db.commit()`
+- Line 852 → `db.commit()`
+
+**File:** `max_bot/app/database.py:15-17` — add session.commit():
+```python
+async def get_db():
+ async with async_session() as session:
+ try:
+ yield session
+ await session.commit()
+ except Exception:
+ await session.rollback()
+ raise
+```
+
+### 2e. SQL migration: add recipient_ids to bot_broadcasts
+**File:** `max_bot/sql/migrations/v1.6.0_fixes.sql`
+```sql
+ALTER TABLE bot_broadcasts ADD COLUMN IF NOT EXISTS recipient_ids JSONB DEFAULT '[]'::jsonb;
+```
+
+### 2f. FSM persistence (optional)
+Create `bot_fsm_states` table + async save/load in FSM class.
+
+### 2g. RMP permissions for engineer (optional)
+Add INSERT for engineer with bot_* menu keys.
+
+## Phase 3: Replace categories
+
+### 3a. SQL migration:
+```sql
+DELETE FROM bot_categories;
+INSERT INTO bot_categories (name, description, icon_emoji, keywords, sort_order) VALUES
+('Аудит безопасности', 'Независимая оценка систем видеонаблюдения, СКУД, ОПС', '🔍', '["аудит","безопасность","оценка","видеонаблюдение","скуд","опс"]', 1),
+('Сервисное обслуживание / SLA', 'Абонентское обслуживание по SLA-контракту', '🛡️', '["сервис","sla","абонентский","обслуживание","контракт"]', 2),
+('Реагирование на инциденты', 'Срочное реагирование при нештатных ситуациях', '🚨', '["инцидент","реагирование","срочный","нештатный","авария"]', 3),
+('Технический надзор', 'Контроль качества при монтаже и пусконаладке', '📐', '["надзор","технический","контроль","качество","монтаж","пусконаладка"]', 4),
+('Проектная документация', 'Разработка и согласование проектной документации', '📄', '["проект","документация","разработка","согласование"]', 5),
+('Риск-инжиниринг', 'Оценка рисков, BCP, DRP, стратегия безопасности', '⚡', '["риск","инжиниринг","bcp","drp","стратегия","безопасность"]', 6),
+('Общий вопрос', 'Консультация или вопрос вне указанных категорий', '💬', '["консультация","вопрос","общий","другое"]', 7);
+```
+
+## Phase 4: Deploy scripts
+
+### 4a. Fix max_bot_deploy.sh rsync
+**File:** `max_bot/max_bot_deploy.sh:32` — change `max_bot/` to `.`
+
+### 4b. Add max_bot hook to main deploy.sh
+**File:** `py_service/deploy.sh` — after docker compose up -d:
+```bash
+echo "Deploying max_bot..."
+bash max_bot/max_bot_deploy.sh
+```
+
+## Phase 5: Changelog
+Create `CHANGELOG.md` with all fixes.
+
+## Deploy Order
+1. SQL migrations on DB
+2. scp + docker exec tee for py_service files
+3. docker compose restart aegisone-app
+4. scp + docker compose build for max_bot
+5. docker compose up -d aegisone-max-bot
+6. Verify health checks
diff --git a/aegisone-php/Dockerfile b/aegisone-php/Dockerfile
new file mode 100644
index 0000000..39796a5
--- /dev/null
+++ b/aegisone-php/Dockerfile
@@ -0,0 +1,23 @@
+FROM php:8.1-fpm
+
+RUN apt-get update && apt-get install -y --no-install-recommends \
+ libpq-dev \
+ libzip-dev \
+ unzip \
+ git \
+ && docker-php-ext-install pdo pdo_pgsql pgsql zip \
+ && rm -rf /var/lib/apt/lists/*
+
+COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
+
+WORKDIR /var/www/html
+
+COPY src/ /var/www/html/
+
+RUN mkdir -p /var/www/html/service/permissions && chmod 777 /var/www/html/service/permissions
+
+RUN if [ -f composer.json ]; then composer install --no-dev --no-interaction 2>/dev/null || true; fi
+
+EXPOSE 9000
+
+CMD ["php-fpm"]
diff --git a/aegisone-php/docker-compose.yml b/aegisone-php/docker-compose.yml
new file mode 100644
index 0000000..c9402f0
--- /dev/null
+++ b/aegisone-php/docker-compose.yml
@@ -0,0 +1,28 @@
+services:
+ nginx:
+ image: nginx:alpine
+ container_name: aegisone-php-nginx
+ network_mode: host
+ volumes:
+ - ./src:/var/www/html:ro
+ - ./nginx.conf:/etc/nginx/conf.d/default.conf:ro
+ depends_on:
+ - php
+ restart: unless-stopped
+
+ php:
+ build:
+ context: .
+ network: host
+ container_name: aegisone-php-fpm
+ network_mode: host
+ volumes:
+ - ./src:/var/www/html
+ environment:
+ DB_TYPE: pgsql
+ DB_HOST: localhost
+ DB_PORT: "5432"
+ DB_NAME: aegisone
+ DB_USER: aegisone
+ DB_PASS: aegisone_pass
+ restart: unless-stopped
diff --git a/aegisone-php/nginx.conf b/aegisone-php/nginx.conf
new file mode 100644
index 0000000..3b4e103
--- /dev/null
+++ b/aegisone-php/nginx.conf
@@ -0,0 +1,29 @@
+server {
+ listen 8080;
+ server_name localhost;
+ root /var/www/html;
+ index index.php index.html;
+
+ charset utf-8;
+
+ location / {
+ try_files $uri $uri/ /index.php?$query_string;
+ }
+
+ location ~ \.php$ {
+ fastcgi_pass 127.0.0.1:9000;
+ fastcgi_index index.php;
+ fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
+ include fastcgi_params;
+ fastcgi_param PHP_VALUE "upload_max_filesize = 50M \n post_max_size = 50M";
+ }
+
+ location ~ /\.ht {
+ deny all;
+ }
+
+ location ~* \.(jpg|jpeg|png|gif|ico|css|js|svg|webp|woff|woff2|ttf|eot)$ {
+ expires 30d;
+ add_header Cache-Control "public, immutable";
+ }
+}
diff --git a/config.php b/config.php
index 487761e..e0db2f7 100644
--- a/config.php
+++ b/config.php
@@ -60,7 +60,7 @@ define('YANDEX_MAP_ADDRESS', '350072, Россия, Краснодарский
// MAX_LINK — (опционально) резервный мессенджер
define('WHATSAPP_LINK', 'https://wa.me/79531137616');
define('TELEGRAM_LINK', 'https://t.me/+79531137616');
-define('MAX_LINK', '');
+define('MAX_LINK', 'https://max.ru/id2311381465_bot');
// ============================
// 6. НАСТРОЙКИ ПОЧТЫ
diff --git a/gitea/docker-compose.yml b/gitea/docker-compose.yml
new file mode 100644
index 0000000..99f3710
--- /dev/null
+++ b/gitea/docker-compose.yml
@@ -0,0 +1,49 @@
+services:
+ server:
+ image: gitea/gitea:latest
+ container_name: gitea
+ network_mode: host
+ environment:
+ USER_UID: 1000
+ USER_GID: 1000
+ GITEA__database__DB_TYPE: postgres
+ GITEA__database__HOST: localhost:5433
+ GITEA__database__NAME: gitea
+ GITEA__database__USER: gitea
+ GITEA__database__PASSWD: gitea_password
+ GITEA__server__DOMAIN: git.aegisone.ru
+ GITEA__server__HTTP_PORT: 3000
+ GITEA__server__ROOT_URL: https://git.aegisone.ru/
+ GITEA__server__SSH_PORT: 2222
+ GITEA__server__DISABLE_SSH: "true"
+ GITEA__server__START_SSH_SERVER: "false"
+ volumes:
+ - gitea_data:/data
+ - /etc/timezone:/etc/timezone:ro
+ - /etc/localtime:/etc/localtime:ro
+ depends_on:
+ db:
+ condition: service_healthy
+ restart: unless-stopped
+
+ db:
+ image: postgres:15-alpine
+ container_name: gitea-db
+ network_mode: host
+ environment:
+ POSTGRES_USER: gitea
+ POSTGRES_PASSWORD: gitea_password
+ POSTGRES_DB: gitea
+ PGPORT: 5433
+ volumes:
+ - gitea_db_data:/var/lib/postgresql/data
+ restart: unless-stopped
+ healthcheck:
+ test: ["CMD-SHELL", "pg_isready -U gitea -h localhost"]
+ interval: 10s
+ timeout: 5s
+ retries: 5
+
+volumes:
+ gitea_data:
+ gitea_db_data:
diff --git a/index.php b/index.php
index 48cdb0b..55879aa 100644
--- a/index.php
+++ b/index.php
@@ -154,7 +154,7 @@ require __DIR__ . '/inc/header.php';
$dsn_cases = 'mysql:host=' . DB_HOST . ';port=' . DB_PORT . ';dbname=' . DB_NAME . ';charset=' . DB_CHARSET;
}
$pdo_cases = new PDO($dsn_cases, DB_USER, DB_PASS, [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC]);
- $stmt_cases = $pdo_cases->query("SELECT title, text, effect FROM cases WHERE is_active=1 ORDER BY sort_order ASC, id ASC");
+ $stmt_cases = $pdo_cases->query("SELECT title, text, effect FROM cases WHERE is_active ORDER BY sort_order ASC, id ASC");
$cases = $stmt_cases->fetchAll();
} catch (\Throwable $e) {
$cases = [];
diff --git a/inspect.json b/inspect.json
new file mode 100644
index 0000000000000000000000000000000000000000..03b56273e0dd22240772065c13e73cd0151a7aeb
GIT binary patch
literal 21756
zcmeI4ZEqXL5y$U!fqn@CwxOr;
zY$aRPzoqPM*2#L=LAIvzd)YvrWu32Ocl3XtE9-jlO?Yx&|N44*U2O(BF6o)O`u5dg
zNxv()(-$nR*!_Egvmefv_2inauj^U*1COsOu-wWn)TWnR>Nn!MEVy7cuj8tIm-Tt6
ze%Cdgj?Op2h!%9-5uSJS
z^_|{+%+<%aJ`352&W;3kV|1m82C?P5M*3FR3`LFRr|+nb_-%e3=;vXqDbV3HpES51
z0^E1v;YFZRIk)3TJAzx3VZZZ3rJQs{6O$5?>2j%eIC77x|R
zbQc?vj{T1MbWOg~NT=-)PqrjMSP$dwlC*g}q3wkzg!a0f14~BCc;`gBGyV2;-z^N+
zdZO*SFd|xV|4dxwI@*c^`*`ai4W+9`(((wCb}zCmS>8E8L3-fciC|7*QN)v0_H@7T
zIbil=p&6l%FG@<;Smvbj&}qtR_nbh^?xBR>qiPtsy8+(T<7Tb>B2kI`EH
zQ+!y|)pI?)IO_LD_14$_p|13FekgduK=DDaN7uT(m3@?6+6nq@4=Y9q}
zA0_yn3C@99&k53{eyu;VxAjoKJ>okj7#G6o{!Fp`T7B#b@@0VAgjIa{ky?R?^J!5q
z2IBC6t{v#!qUODhbO9Ya*2tNO?n}43*0xPufNG-vEEAZz$+~Mkx&d_F`8IfrC|5n$`qC<0&iqr5U5*A_cj6pNY
z&zRGeG;IOHGZfR0HloiP_o)-SelD=#5RXQ~uN}N3&Y1GU-*qG*?SL7Qp
zS8u47CH>-|EyyFfr_XZm)K+y|4Lz65y1!IdT6{>nm_y;<;|8N%fVQTd_GP8l1-YlO
zt*TdiLVQVl#y9GDU!QwAuIXP#=PP;&4-=2^K)-j?0uOFIz~qP*xu$FMv81Qh^^aMo
zAK-Na85mpxY840b%;wND$>Mv-88Uj1P5OU}x(9a`_0*BzFRC9brTH<7I-9hHSg~K*
zmtGXc*m4`&!U)TQ8d`j#XVDSn4rZe-g$`~Jd|cJi;1n2sabqVcDfeV^&8273-7kgP
zzqa1ZXFmq5JC$uc4wS8?{PU5fxz#N5eau6shG7=W=O1jCd0Pgv%CpYp4dBn&TR5*OBk+^3!SUwdD?ELXf`|6SIsGsPewrRPk
zdHh`SGI)ZmL2@6&F|Y2K=mQVriKyoBJ!2$hs?sXAB|fVhNyn_GrkM0Wpddb?Jzt+m
zh~B_7KDEtc`1{BnRPx!4YZuvvN-lc8ew@yy$K!%4_%K8LGLw#DQ}x8>$L&hgK!fos
z#&Mdw^Z9Y9ihYWFtA6J5
z#1+rNVTEHZCBKQBs_bBdvlFc7rQ%9#J#izEz1ypwvt~@jXD#3{Z}dgK6dM^anVdnH
z``|g&WL{q)POKWyQPa30)MwIpa)2kY@h2fhu&DR;>{=(c%~aSFd@zI>%uMKrjXyn)
z_FbSIcn(VE^rlhgSrNieTEi^s^LhO&7b#{sW6{PyIftX{UpHe(o4=|&74O53cWQMY
z#a1xSZAuM4h3QKnmq@3Ur}J-(scG<(JqZHu}N6)a|Gr(Z>QQ1&Om!M4SDE)}z)l>?H^73P~1ZEZ7eijcaB
z^zc|yrL?T=xg?#{ZsMtS)G-gncNRPp99H!341D%U_X5nH87fmvOopv#hs!JV>Mh%j
z!{qgL*o9r!l#=ia?iHG$x^oVb=HGT-bOq+fUWS0
z{4{tJAx%f0Vc-y1@#u%KzKc&rOmiig9|!q9lWrkZ?03ZKrsL~WRzVRc%*GwM<|oI*Rs{aGAcL(
zKQ?8x%V1PflB|bCx@mJ%D$OQy`)?!*?dG6vzzqA~9?*1aX5*_*>2i&~iVXzs+fjU6
z|C<*6WWK50s?%=vdL)PF8J={ig&}KoCTT`@Zjb9ichK9I=_`|`D2w&I{{Kl!)vDm^
z<>u3S`dxxt4s+!hefOcQCH{K$rhMgg_VV+o{roOHzeVZs9VWAvm-di
zYTMG6m0j{;({m`cd?7e7VoT@ow%WZPVg7yX+HBOFP0@cxIj?Q))cQ`V1?hN4_o=?6;v>D^hw71DAL!c^_OVx!)=Ncu#jB0g2TYgf~0@>G&U_27MRV?i?f
zQhVLzCAH}g9!onP7kJ1H463!D>8hZuX^z{H^i$(x^+ylGosN2@PJL6oQLnVEb1dd|
zXtk+-%!I2gFxim|!4=~!+P!aM8kqPCwAuWDQ?`dCdHHCxpC4|L=m0#tSJz5#p!s|>p*$otwY3pJ>n
zTUU?Js-scV`5jdrOqAm-X_K$mr`qGR%75>}kJH!oM+j|d{9~(F=TFUlx?H!Z`H#K%
zoZqe=-+hd)(q=weZvpyc{
z(>)j4MA=+=&srwCqnH)3#O_6=;t}g;JYSyb^RYMaL^j6aaI1#2I>VEI4IZWar>c^b
z6W&|FZ0l>!x!SV7?;u!$18F>O7r}$TPV{60*7Qp~C{~AR(YyNB(`OK@4K~MYlGT=C
zS+E{FJ#z(q^=HQ({N)(lfjkN)bZK1|NASe%=@-9@`I~s|jm~(x2k|eS8J?THEsl&Y?}}p{
zTn%1WKeWX&!^h*@AiO68{|)~PZ;dOwTaLHV^>ju{V$FWCjgMo&Q{ESa-AgWxrb+i4
ziXWjeI}HY5r&hWadV4>*loLH$F3aVqS)(0>AM>zdv@hwL4K(x*Il_-VlC65GGxsRl
zOA^rDi=VTi+hghAS&+8lU@3q-tC5$%o*g9~DhJio*H%ZI-)=wZavaX-@_DQNZuP7d
zqhj{?@-`v#kL;)I7vjBWN5L{Nf27#*TwWM)7B+Hn7lZj6*iYg+&uO!p675_NPy4#J
zpsz;>_J+hFUaS}`DdX$!*=W*UqD-Ps8_I|p@<2{{|u76W$a=V6PcKo
zl3L-CS)3hHoLQ0@pO~7SS)8Aj8k3t?5ucP_5|da^5ECDtnU`4-AFo$Xd5gm)H$SB`
ZC)KWq6=(*?mSPa&6Eh&CS?XI2O+GMlYNXS{i1d>!PTX$P^Km4&K9zKhmX4Blo`x$UHSh
zakPhurk-?^hW`qWqE8uBmLg5*Vfs{26~P&gx=$0;5M1S9`?OJQpDwB+|J5FSpCM}K
zGe(Vlrl_gU95oZV#$)NriRP42r|6+7NrlX_oH}J|p;P~(xg48MaoT)p+7h*Mx_l~{
z$LRs)a|VC~oDradqbn(w={LwS;G#u#FdPkrW_{Cu8;<$TcMW;m)4{-O6#g5B1JP)3
zb~57jjZXz!3X$y&MTeulXh2jR9zNz`MC)WA%7+AgTnGS_pNj+pQSbBn`I$f@;+qVJ
zcFYhB%!H>gT?owj146(r=1l}={d{niKRX*bHy!X#2KdvyNC3(-`2*3wc$5#!gix<>
ztXsN%6azR~|Nb5T^OTnwQ?&jeMfrhNL>;H6XpSC*l+?v3Mimm?q<}gre}n%;^<3DG
zHPFoX&hx%-5UR!agX2*FrGo|}5@&=|fT8hG9}I~zh%@w|`=qAYMnoB-yjPpDkld>6rA
zjoiV<4-DkreMqIoQ4Q(R0P-cc@4pDzR8XbB?4^e!b4a=1$w4P>3LP<27G5k{L-q4;
zABMXgZqt*>AnjsBeX1An(F@^#NQn&T`5J_L&_5vRu{%VfJ|PO7-JBi_=~3brEi%D3
zJ$>3Ye%7THl`v2Qtcj=*0uw?YG9}vhDd>6AFf_7+r{unP)cd`i?3MPV5DL_K!mwB8YHlNz|n%E|;AW;CWXNYz%r4naEdj{x}%^u|?d
z!L|CU^^2#jcPFe(^G8=LdDnDTb&LC!niH0qdC#h~@Y?RHyO*>HYyJGuf7a)%v8Io8
z`AJ>rimr4?kB7B`jxM|d?K`Lk5slx-=4qbiX@;ZgOe!!TKSRgc2~FYu%=q?(A5&m3AIGf5UI>4ParZNkW#%w79OvRLF
z-;_Qn1Ohlm2@R0uQVW&v5ULSWAs~Go*+_Z>n{t-tN?DB=&n7?O>+U_wRBfAbF)r^_#PTzGs5w-s{;`fl?ONJW;i6J
z$$_I9aFR)1VU<_0t(&K_rUG#E+vdrhE;L@vwt18sBTXqo;Ow_vQr8T#JMgO-GgFfG
z)|$db<)7_Z{Wc2YR5L)$mlh0
zTQ^Onys+M@=U6h0yh3Db&!Nq-s>y5GRx0QvSuAXZA*c5!!xpb)NS@R(HslOmvz#|)
zhdjotJXUXxTvt2MGiOMi@G^48XvtP!M-#EQRpx{712(cgobO?64KmH7ZH!Wh;CfoJ
zCV2g3_r~dAg5TbrmMmKtPX0NUgK|&4%2~>dR5*XdB}THfydsL7cKxx6+FsPU{{AHzpo(dD5XB}YDGfWpGLNt&*zBo{YzdR}lSj#C?DL>OiKo1;B3ue~DFtt&MK9qkeN-pa36X6E@Rxi}f&nzGgb
zXJoRBaC@@Sr)9E?a8G2V&&p&O;hMA3!!lV$xV>5Ff=reXt|coyDwAb|donBiIhiaY
z+`g>z^DxFRrD89{*%UkcQll*3Qmv`4^?#J*3u=OH+?M>A5GtZQr
z5A*Qe|He!?npv~{@m4)43fHV$tyKR~>ev%I&C;A~r3ZcgW0c{_lmV?&@9F954L88}
zYsjow!@D=F({@Q5TgwYKf{tH(ur9DpYxM4JdDNOgp0OW3=0BT9)=<6b{$_xx{=Xpb
zD+GRlKo5aW5a=XO4Up--PvA-!HHt6l?3eDKxO|Y1pW(wzaa1if#(T4Mqm{{MgOM+{*u7IBrph&?uW=6zOW6HFKq(MEf74E0`JV}kpF_nL<8re0=}O>SUwtsF#ZgL_9LPq7=|>AU24Wd
zvp|oEny~M}bjary+2_V5AT&P_8hAcuq__VIV{NDE+v-Mlb&mRXxt`Y?9%!p;+~pEg
z;VFoLi@J%R5Q*}$z8TmQm=mT&)08j5XUY=I89Ws&%_f9>(J28Y07}?}I2Tez`MCXDB)Xme0~TH(iR9
zG6~g2b){NLbchB+c-9XoQeX{Iu*G0oa{36uzHGs>6PHG)rz{d|`
zKZ1JyF#bYgS?teZKLP;@a9>0LKZ3;XU}Ef5l!&AoP|OV?0?PbBI^(UsiTxSa3xtC_
z;EjK!EcQJp{4)IghxnInfdb!&eLsFVrR(?L&oa^Ua<j
za2j@_q?Y7Q&qbrq6rxrpxfIW_+UhIgBq$gVK~!D{L_mNV`Jm46i*p!&K@=+ia^@f~lluPvuVOX?%9L#iZ%)9z
z+8pc#GzzfD+MLO{$(H*bctGh1ZZhx-uGxroe`Apu*(_NBqtj)tJKhC@PB?swTl
zU@hOC6{w-$Y!v;BXiaOHMcY}`@zBgnKo}4Dre#$#q@CGjF7Tn#XJE@PQ^O1i*h;ro
zQwYq!79@BBdAQ3IVA{bf&(8U#gV77TfE$R?aLgtGYvuOk5f2p{C%z{lN`rqBb>}*s
z7Qiu&`yxO#T4V%M=+9Yb%(9ob~VB{E7FvIR1Ja(*?
zb9=h_GqhvR@Ppk?gEGTnj>OFM9`g+J^m19H96!<3?-_wwLJdT_lyP8i#B;0!vj>ELPDVR{5Ev!of
zQG2u-EY!uh`$Sz-fL;+Kiv!Y_X9E{bhkSxR(iohbhK+rJL#sKnyDEP!7@gv!jIO4v
z?I+xJ&Dw*)RfF&Zf@TDJ5n$j(IEdg70(i}!L?x<)OHTn`t%Px;>B&+HX0a%YNgXb=
z(m0G;9Cu_`;fNA7>17iv?%>D;88T#Skd7`mFbjhtBsDVFv!~(ALR7dw`ZnpSg4{Jp
zpCg?q)mw7-^jws72H-hauqKa7I8i$>H#<%ifx-e7qJ$KYL1M~in#{Zl>nXBwiJ%|A
zy*S)$e#|SiX;%)60s=H=L_uNqu!(U!Bm`LV`8#THV#U#e>%?64u@GM?Wkm
zT9}A4_SL+iYiF*WS;~cdy}bH)&w~Gj!H?|)i-ie$^>sRKcg+v1<`v8j67bI&`>M&Y
zSpL=71?8%<_~qJ{YL{w2pmXEHR(N#y`%Z`^Ekmr2D(Yo;T2WIDL^`2z)
zzIgS%^l>&Um_Mx86El^>nbOtD=9sB8&Xmc>#|HD|V=o?C+?6oY
z%=dn%G5jfe&3M)LuBI5x+IFe!%N?=8#@qVFbz51|*0^G8OxpIW*!FB#JZpKb>yH>{W&Hb6%!?){%m
zSi6&k?wFw)GZoY`*ELJWuQT^mN}K5uN@+CRK>$Y$jJA&*
zP0Nae<3Q4OV1fNWZ_C!H?|Xx<4!-ep%vzJMo=h4}#tbK+YQJXpui0y_D-!nBq`7s0
zSvA{|=5qMO%;no#?AL7jYH7oQ_KGXc7Ojz^5JJM#o@Co&Y&$t70qvBuRL3pVw>8xt
zn6s6LwTvdLr;>(KF~cb+d~?apk_F}~=2esB^3bum?@L>^5-vo
z{>!7W;uE)xC$?#uyE@4DI}K%gie9a({p+?rZ~M!R1<#dW+)%b=tytQ-+?=p>CJmi2
zL+1l(Y_J{M?9*>nbpy<8Dq0-A4%Io3WDmsH1KY@XNS?G=H{e8yss8%j8_jPp@95st
zy=6$4P9)hAG4=$=`z@S6$w{)6akes6J+{tTHsjTCwmMepC-kZ~TNSJEJ&-4xw<69~
z#HzkP@?`VY#Mzoy-6Wx>@}%UX@Kbm44GwjTvEOl0tTAROzpW`>EooX-y<4&`&K54P
zS6uJ01*@j~q^UX%=WV7Erltkux*5(iEP4{=ngwRfWWBN%PWPCal5A6qZOT}x0-Von
zO~v|W>+b8|PX=BbSZu$pdDpP#!_0WSqo8v>r?{_F*q%{*LMe>TDDDslb~IYjEc)Aq
zmJRl)HLELO-L;@ucfv?pKALbomCSu=LAz?QCrx|erajArH-c~ECrrna?C}_T98~@_
zvwyX)^yRjf+P>KV{yZ3G3f6Sa#l6>?6T1CLX8#Ja{~ny_F&?Jx6;U}y=zCCT$2}co
zbR%lp{gLgkXgKhZq4y(O$32!Rc#8hFbz9MIDcWckExC7;@cj3C40wQh1}eAhBg09^
zWH}&7(GpQ(^hf5_kJy5b*e=Lr>>-6ff#5TqqMIy3=rIfPhN=wl8ccnol^(M(Zyd-4{7oZ0mdCtlaw1+wk2#n(T@Jv1uAs+?n4c^2
z5O>gHrOeNrcEp?Lu?ptrd(?>UFB+?(-m=kS)y!MD4B`b9K!2-^9&2OXYDf9MFwS3JV^5t^NU0IfWK|0c_s699!h?@0d;%(5Y4NZw>ygg|78))Ynfjbqs(_G
z%<~T9H!$zy5^JeCqx)Q)+YMQq)F%4=PE2eon6D#Rbz@K;-%@;87^4);1m}tI`
zSuyWIyp85dn3Z;@u=3H9^bv17kEewIyEZGpt{cTSQgXpT2#ur{1lZZ^gEDXgi5W6VIWy0bU-0U(
z!t0xOpd@Ap-$S-sn+|Dg;ow*}j-wgM*}?*UIr)f{wDs+Ww-|ELQ0IYz>|q0xXLw+%
zW{dp)o4cZzzcesGdGrPa4E?b`@Q
zHBer}1Yq;qTk7Sk0<$6b5bj7B{lLqa*?#%?OV2OXFP%=9UGsgbro7A3m!=mFz<-kq
zUe>J6YYkT$7NbjC!deIKV1*TAdj3#jx&rG;=Q^vutbI{?W!G)CWSe7bGg-fwk{U-`<5;XsYARMV6=Wf|`5^KRtgw#Qv~GyOxUhF#9tDtXo(mgHAEy@A-EeGAR
zkGbV6K)jjmX@$ebMS#C3!;cDkp7dA$SipXAa#hnSz(3BH@|rI?>I
zYLLE1%
z8p5dMmJ4=l8F?QY&eLY?y>4?Ranp$khPY1nCdjKHZY}#$h%GwcmpkAHRrsY)n1%C0
zYOs}tOiS$J@PZ?I1MVrf>)>uT)W6TgKA{$L%A@p3(4*_3v
zU_u`P^c3LAFn*fyXEMKl=M{*16DAQ;BRGfPJc8>8GHywm<(8^23GF3dok+Aw_&Q>Q
z=LldCY%@7zlyW!|m;=FoVuo7)Hb;Zjb1ESYl+%*bw?KqPWBHRmc;OGOoJ?wpS0H3z
zFIhbIuDurCadlGCXvznyIxCm@-*rAgUVn9l%XOFPzFePVa$`*H<`Bs0rq^C{N$}o;
zu?kanlI>n$yLWy!Ut!zt7E^{NaqVtLzu+bxCvSr-0d4^n
zL{zFfU>l_-G7@TcV&1uEa5~Z`?dhgI@d^oK1AuHG^n*h1=@`qC7$VP$YE%&d^f;o0
zG6Wd#BNGd0>{loOH_}KK5ZR7YSoe_d9iX94A_j!lFq(dk(!WQUHmJf4s%nF3_<$<^
zM4_Y=_bC9sV<~#yhgwTg>s-+~7h4nBs(JPA)bK^ty+#e)axZsULATx;Q#t6S-?m!l
I4pQWQ0Xm)OTL1t6
diff --git a/max_bot/app/__pycache__/bot_engine.cpython-38.pyc b/max_bot/app/__pycache__/bot_engine.cpython-38.pyc
deleted file mode 100644
index d0c30c41c7b1496832bca0e4c1fd91347d742064..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 5752
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
a77ke`hyJqin3hpeYIaDE=|7WneenMg91s-%
diff --git a/max_bot/app/__pycache__/config.cpython-314.pyc b/max_bot/app/__pycache__/config.cpython-314.pyc
deleted file mode 100644
index 911d7b34618477bcdecd12639719eead6d8050d9..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 2062
zcmZ`)-ESL35Z^nW?Q+ePpAb|-9?o^@WLBzDwRiO&L6l4R=U~W%#ly;)e>K1Z
z(Y8G9UT_cWlf{LfO=L3FhG|
zx@&HkoR{sQ3wp?6HEQTa$uzpoys01V_n_(!aGr2UBV4`_Jc&oDTfzKhb;YKw3p?nWyjtx7wgI?)4pBz*ZBUzg$K|BL7`G=>lKqyF+^#_Dby^)!<62t
z=~j1Tl+yh&bGcQvP1}KG6}*7SGDWP1sA(Hc0UAgoD0R8c%LdgsXXU*bH(g5ECpcPKEit5>VLh8Ogy>Rl1Lq_H{TMuM1jMJL
z6+d!cZA~5jNj<{G!NQJ!Fp#4jPYPf>9tU+07o`T-Avfd;pAb?2>lArMDoH7_CB0AH
zmNn^B*we-G0QL=FWdQpJa9{uj2e69RJ9OBUVt6IJoxYOZ%Ft_CRs_?Vn>4erBSP8S
zRhrH0WU^xT-OQEMTyC9irngtcNKf0!ENhu<5x%yW&81hi=*pTVV%O6fE1CBIZ>`hq
z+m2E_>!Sbl7C>{m!DP}LcnQZ|cgb106Zz|Ik|flT*nwgGKB*0uLJGfc~(
zbY5auSr_~4vd11nW<23hL_q_J8l*LmZ)98Xna0&tVydy$nwSH1@?2x%$@t`#i(ji>
zU3#26-AtZ-oIKx5p8t0KQF8eQ^HFmB$MI}qy>)c@p^|7#r5-AWUnsKwM4NzkkpNom
zkq$BVwU=5RE9$j8X8&IeuSvVG(ithd5oDGGO$6Y7RAcr7$;$#Vdx1ihjE9(1D;8hXA;&R8a
zT!xogr*!E3-``g+c7BPM*g06mz}>ST{`5(b^fL)PB@<7{>rct_^T4ol;{Hd^2~6!{
VL=N9eK9_-$10Rti&k%V*{tXWc;!VRqROhHVkEoCtHXgtLcC2*Yafx}v=~QZSi@pFan|
zG?btkO0Gf>D8+P^rpbHY6lEf;15Tr!2xkEIplpP*fO}DIg!=&ZqrM2|01u%42oD0z
zqg;dwfQx7#!b5t!H;+DkWV&6)vRu=EG|v>bYkJN+o&};v$Eqm+tt;zg|N3ncCfJ9%<^xxgm5^7
z>6k<`Y`60Pag0&WkGfu%Q#_bs6_0-_rYdcm4A3gutk$yacG&+KM3Ilg3|zAX=B(~A
zfvaQH$#5{Hbr=1S$`)}e+uPffmgtz3x@|R#=BU$h!h9EFz)&>N@`oxOcPqSRSQXAJ
z+98G+7L_)hMKn+KyZlw22T$cm@Lf1eS%Y|{z)*MSPGSjckq+~IRJ31$C-O-C5$px~
z@=!hpgMFC448AGJ7xG-5%2%*_CQsx^X-1vovc*aZR@1N;bD^W(F9AW(&gJj&F!(n3
z8mNCN+m`^2@(qp8@X}HULkcIa7MDI=L)v*EX47
z^hule({X{-NnMRoICf6tLe%)QzMs|(a0ow^{dU=-y$jC0at7@B~ng~G)G
zG0hsOx5J$0K;ttkb{)o%KD+z~`}!!ew#rGk&DIunT-Gpl;Kl=P7$$pAz7l3}bdVT_
zeHeFa>X{614&zOanCgfzb~8|dFvW!%<}oIgWecL7CJw3|P`OzpdX-RJ{94!qYgKr`_j7VS&uBj
f?8Vwel-+nofD&f!bu0H_0%ly5tB}a03dR2bY2++j
literal 1136
zcmZuw&2Abo5cdACEU-YRdZ?O9uc#uC`Xf~lszMT!R7D92Nh|qcIcu|!F80P=(uON}
ziAsHezDb|K*Pi+cJ$1a4G*V-<_N47=K9f3Cz(R)qKSBd@2$R>q@HTB&P9%$9C)e;lW}TKK%s@N7!Kq
zyXQa?d)((G=5~P|1`2?Ez$GAJaR9iC!vcqZE4WhNY8Sy=<+Y`A8C^!KwuxA@iGXaq
z@YlQcVhz@Wi#3-nZmO4_gU!~8fz7cVj>}+pSo=mkAd}j?vMz!8e
zWlYlv1nj(i_438tE)yN}&U$;jQJwKyW=YEILY2g)R_$#|M_+*%{TMJyS-
zkMBrrK>EV`uG1{rj*CQF*^LQSIh)|u_8o_g@2E!rj@wODw^0pitX~CSjHh#DnuJgx
zWKQ#`6q*oKw*HDWwpCQk8fX<{xm#AiH^``h;;6{_Y=(cNR;XqFD}k|xX`8m{M0dYu
zZsCKc9zadzN<66bz74fJbF@UDt^++BVELtCd>5u{dzs33F5+CuR4c3EDy2Q;!MtI2RmHdVd1xz0xVopeQTLrc
D_$CUL
diff --git a/max_bot/app/__pycache__/conversation.cpython-314.pyc b/max_bot/app/__pycache__/conversation.cpython-314.pyc
deleted file mode 100644
index ec9ee8bf735216109aa24b23f0db4f39c1d96f68..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 11116
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
diff --git a/max_bot/app/__pycache__/conversation.cpython-38.pyc b/max_bot/app/__pycache__/conversation.cpython-38.pyc
deleted file mode 100644
index d897b70befde3836ada0edfbbb7ca93f6d68b65b..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 4658
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
Bh&ccN
diff --git a/max_bot/app/__pycache__/fsm.cpython-314.pyc b/max_bot/app/__pycache__/fsm.cpython-314.pyc
deleted file mode 100644
index 96817afc965cedac694e54a8bfb3250146517e22..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 10181
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
o3_uNpIQ;z5XIeSZ!>NfMc0F5XQzqnB
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