smart-bot-factory 0.3.7__tar.gz → 0.3.8__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of smart-bot-factory might be problematic. Click here for more details.

Files changed (96) hide show
  1. smart_bot_factory-0.3.8/.pre-commit-config.yaml +23 -0
  2. {smart_bot_factory-0.3.7 → smart_bot_factory-0.3.8}/PKG-INFO +3 -1
  3. {smart_bot_factory-0.3.7 → smart_bot_factory-0.3.8}/publish.py +42 -37
  4. {smart_bot_factory-0.3.7 → smart_bot_factory-0.3.8}/pyproject.toml +3 -1
  5. {smart_bot_factory-0.3.7 → smart_bot_factory-0.3.8}/smart_bot_factory/admin/__init__.py +7 -7
  6. {smart_bot_factory-0.3.7 → smart_bot_factory-0.3.8}/smart_bot_factory/admin/admin_events.py +483 -383
  7. {smart_bot_factory-0.3.7 → smart_bot_factory-0.3.8}/smart_bot_factory/admin/admin_logic.py +234 -158
  8. {smart_bot_factory-0.3.7 → smart_bot_factory-0.3.8}/smart_bot_factory/admin/admin_manager.py +68 -53
  9. {smart_bot_factory-0.3.7 → smart_bot_factory-0.3.8}/smart_bot_factory/admin/admin_tester.py +46 -40
  10. {smart_bot_factory-0.3.7 → smart_bot_factory-0.3.8}/smart_bot_factory/admin/timeout_checker.py +201 -153
  11. smart_bot_factory-0.3.8/smart_bot_factory/aiogram_calendar/__init__.py +14 -0
  12. {smart_bot_factory-0.3.7 → smart_bot_factory-0.3.8}/smart_bot_factory/aiogram_calendar/common.py +12 -18
  13. smart_bot_factory-0.3.8/smart_bot_factory/aiogram_calendar/dialog_calendar.py +259 -0
  14. {smart_bot_factory-0.3.7 → smart_bot_factory-0.3.8}/smart_bot_factory/aiogram_calendar/schemas.py +49 -28
  15. {smart_bot_factory-0.3.7 → smart_bot_factory-0.3.8}/smart_bot_factory/aiogram_calendar/simple_calendar.py +94 -50
  16. {smart_bot_factory-0.3.7 → smart_bot_factory-0.3.8}/smart_bot_factory/analytics/analytics_manager.py +414 -392
  17. {smart_bot_factory-0.3.7 → smart_bot_factory-0.3.8}/smart_bot_factory/cli.py +204 -148
  18. {smart_bot_factory-0.3.7 → smart_bot_factory-0.3.8}/smart_bot_factory/config.py +123 -102
  19. smart_bot_factory-0.3.8/smart_bot_factory/configs/growthmed-october-24/tests/quick_scenarios.yaml +133 -0
  20. {smart_bot_factory-0.3.7 → smart_bot_factory-0.3.8}/smart_bot_factory/core/bot_utils.py +474 -332
  21. {smart_bot_factory-0.3.7 → smart_bot_factory-0.3.8}/smart_bot_factory/core/conversation_manager.py +287 -200
  22. {smart_bot_factory-0.3.7 → smart_bot_factory-0.3.8}/smart_bot_factory/core/decorators.py +1129 -749
  23. {smart_bot_factory-0.3.7 → smart_bot_factory-0.3.8}/smart_bot_factory/core/message_sender.py +287 -266
  24. {smart_bot_factory-0.3.7 → smart_bot_factory-0.3.8}/smart_bot_factory/core/router.py +170 -100
  25. {smart_bot_factory-0.3.7 → smart_bot_factory-0.3.8}/smart_bot_factory/core/router_manager.py +121 -83
  26. {smart_bot_factory-0.3.7 → smart_bot_factory-0.3.8}/smart_bot_factory/core/states.py +4 -3
  27. {smart_bot_factory-0.3.7 → smart_bot_factory-0.3.8}/smart_bot_factory/creation/__init__.py +1 -1
  28. {smart_bot_factory-0.3.7 → smart_bot_factory-0.3.8}/smart_bot_factory/creation/bot_builder.py +320 -242
  29. {smart_bot_factory-0.3.7 → smart_bot_factory-0.3.8}/smart_bot_factory/creation/bot_testing.py +440 -365
  30. {smart_bot_factory-0.3.7 → smart_bot_factory-0.3.8}/smart_bot_factory/dashboard/__init__.py +1 -3
  31. smart_bot_factory-0.3.8/smart_bot_factory/event/__init__.py +7 -0
  32. {smart_bot_factory-0.3.7 → smart_bot_factory-0.3.8}/smart_bot_factory/handlers/handlers.py +676 -472
  33. {smart_bot_factory-0.3.7 → smart_bot_factory-0.3.8}/smart_bot_factory/integrations/openai_client.py +218 -168
  34. {smart_bot_factory-0.3.7 → smart_bot_factory-0.3.8}/smart_bot_factory/integrations/supabase_client.py +928 -637
  35. {smart_bot_factory-0.3.7 → smart_bot_factory-0.3.8}/smart_bot_factory/message/__init__.py +18 -22
  36. {smart_bot_factory-0.3.7 → smart_bot_factory-0.3.8}/smart_bot_factory/router/__init__.py +2 -2
  37. {smart_bot_factory-0.3.7 → smart_bot_factory-0.3.8}/smart_bot_factory/setup_checker.py +162 -126
  38. {smart_bot_factory-0.3.7 → smart_bot_factory-0.3.8}/smart_bot_factory/supabase/__init__.py +1 -1
  39. {smart_bot_factory-0.3.7 → smart_bot_factory-0.3.8}/smart_bot_factory/supabase/client.py +631 -515
  40. smart_bot_factory-0.3.8/smart_bot_factory/utils/__init__.py +9 -0
  41. {smart_bot_factory-0.3.7 → smart_bot_factory-0.3.8}/smart_bot_factory/utils/debug_routing.py +38 -27
  42. {smart_bot_factory-0.3.7 → smart_bot_factory-0.3.8}/smart_bot_factory/utils/prompt_loader.py +153 -120
  43. {smart_bot_factory-0.3.7 → smart_bot_factory-0.3.8}/smart_bot_factory/utils/user_prompt_loader.py +55 -56
  44. {smart_bot_factory-0.3.7 → smart_bot_factory-0.3.8}/smart_bot_factory/utm_link_generator.py +123 -116
  45. {smart_bot_factory-0.3.7 → smart_bot_factory-0.3.8}/uv.lock +38 -1
  46. smart_bot_factory-0.3.8/valera.py +56 -0
  47. smart_bot_factory-0.3.7/best-valera.py +0 -280
  48. smart_bot_factory-0.3.7/bots/best-valera/prompts/final_instructions.txt +0 -214
  49. smart_bot_factory-0.3.7/bots/best-valera/tests/quick_scenarios.yaml +0 -66
  50. smart_bot_factory-0.3.7/bots/valera/tests/quick_scenarios.yaml +0 -66
  51. smart_bot_factory-0.3.7/smart_bot_factory/aiogram_calendar/__init__.py +0 -6
  52. smart_bot_factory-0.3.7/smart_bot_factory/aiogram_calendar/dialog_calendar.py +0 -197
  53. smart_bot_factory-0.3.7/smart_bot_factory/configs/growthmed-october-24/prompts/2product_info.txt +0 -582
  54. smart_bot_factory-0.3.7/smart_bot_factory/configs/growthmed-october-24/prompts/3objection_handling.txt +0 -66
  55. smart_bot_factory-0.3.7/smart_bot_factory/configs/growthmed-october-24/prompts/help_message.txt +0 -28
  56. smart_bot_factory-0.3.7/smart_bot_factory/configs/growthmed-october-24/prompts/welcome_message.txt +0 -8
  57. smart_bot_factory-0.3.7/smart_bot_factory/configs/growthmed-october-24/tests/realistic_scenarios.yaml +0 -108
  58. smart_bot_factory-0.3.7/smart_bot_factory/configs/growthmed-october-24/tests/scenario_examples.yaml +0 -46
  59. smart_bot_factory-0.3.7/smart_bot_factory/configs/growthmed-october-24/welcome_file/welcome_file_msg.txt +0 -16
  60. smart_bot_factory-0.3.7/smart_bot_factory/configs/growthmed-october-24/welcome_file//320/247/320/265/320/272 /320/273/320/270/321/201/321/202 /320/277/320/276 152/320/244/320/227 /320/270 323/320/244/320/227 /320/264/320/273/321/217 /320/274/320/265/320/264/320/270/321/206/320/270/320/275/321/213.pdf +0 -0
  61. smart_bot_factory-0.3.7/smart_bot_factory/event/__init__.py +0 -12
  62. smart_bot_factory-0.3.7/smart_bot_factory/utils/__init__.py +0 -10
  63. {smart_bot_factory-0.3.7 → smart_bot_factory-0.3.8}/.github/ISSUE_TEMPLATE//342/234/250-/320/267/320/260/320/277/321/200/320/276/321/201-/321/204/321/203/320/275/320/272/321/206/320/270/320/270.md" +0 -0
  64. {smart_bot_factory-0.3.7 → smart_bot_factory-0.3.8}/.github/ISSUE_TEMPLATE//360/237/220/233-/320/261/320/260/320/263-/321/200/320/265/320/277/320/276/321/200/321/202.md" +0 -0
  65. {smart_bot_factory-0.3.7 → smart_bot_factory-0.3.8}/.github/workflows/ci.yml +0 -0
  66. {smart_bot_factory-0.3.7 → smart_bot_factory-0.3.8}/.github/workflows/publish-private.yml +0 -0
  67. {smart_bot_factory-0.3.7 → smart_bot_factory-0.3.8}/.github/workflows/publish.yml +0 -0
  68. {smart_bot_factory-0.3.7 → smart_bot_factory-0.3.8}/.gitignore +0 -0
  69. {smart_bot_factory-0.3.7 → smart_bot_factory-0.3.8}/.python-version +0 -0
  70. {smart_bot_factory-0.3.7 → smart_bot_factory-0.3.8}/LICENSE +0 -0
  71. {smart_bot_factory-0.3.7 → smart_bot_factory-0.3.8}/README.md +0 -0
  72. {smart_bot_factory-0.3.7/bots/best-valera → smart_bot_factory-0.3.8/bots/valera}/prompts/1sales_context.txt +0 -0
  73. {smart_bot_factory-0.3.7/bots/best-valera → smart_bot_factory-0.3.8/bots/valera}/prompts/2product_info.txt +0 -0
  74. {smart_bot_factory-0.3.7/bots/best-valera → smart_bot_factory-0.3.8/bots/valera}/prompts/3objection_handling.txt +0 -0
  75. {smart_bot_factory-0.3.7 → smart_bot_factory-0.3.8}/bots/valera/prompts/final_instructions.txt +0 -0
  76. {smart_bot_factory-0.3.7/bots/best-valera → smart_bot_factory-0.3.8/bots/valera}/prompts/help_message.txt +0 -0
  77. {smart_bot_factory-0.3.7/bots/best-valera → smart_bot_factory-0.3.8/bots/valera}/prompts/welcome_message.txt +0 -0
  78. {smart_bot_factory-0.3.7/smart_bot_factory/configs/growthmed-october-24 → smart_bot_factory-0.3.8/bots/valera}/tests/quick_scenarios.yaml +0 -0
  79. {smart_bot_factory-0.3.7/bots/best-valera → smart_bot_factory-0.3.8/bots/valera}/tests/realistic_scenarios.yaml +0 -0
  80. {smart_bot_factory-0.3.7/bots/best-valera → smart_bot_factory-0.3.8/bots/valera}/tests/scenario_examples.yaml +0 -0
  81. {smart_bot_factory-0.3.7/bots/best-valera → smart_bot_factory-0.3.8/bots/valera}/welcome_files/welcome_file_msg.txt +0 -0
  82. {smart_bot_factory-0.3.7/bots/best-valera → smart_bot_factory-0.3.8/bots/valera}/welcome_files//320/247/320/265/320/272 /320/273/320/270/321/201/321/202 /320/277/320/276 152/320/244/320/227 /320/270 323/320/244/320/227 /320/264/320/273/321/217 /320/274/320/265/320/264/320/270/321/206/320/270/320/275/321/213.pdf" +0 -0
  83. {smart_bot_factory-0.3.7 → smart_bot_factory-0.3.8}/smart_bot_factory/__init__.py +0 -0
  84. {smart_bot_factory-0.3.7 → smart_bot_factory-0.3.8}/smart_bot_factory/configs/growthmed-october-24/prompts/1sales_context.txt +0 -0
  85. {smart_bot_factory-0.3.7/bots/valera → smart_bot_factory-0.3.8/smart_bot_factory/configs/growthmed-october-24}/prompts/2product_info.txt +0 -0
  86. {smart_bot_factory-0.3.7/bots/valera → smart_bot_factory-0.3.8/smart_bot_factory/configs/growthmed-october-24}/prompts/3objection_handling.txt +0 -0
  87. {smart_bot_factory-0.3.7 → smart_bot_factory-0.3.8}/smart_bot_factory/configs/growthmed-october-24/prompts/final_instructions.txt +0 -0
  88. {smart_bot_factory-0.3.7/bots/valera → smart_bot_factory-0.3.8/smart_bot_factory/configs/growthmed-october-24}/prompts/help_message.txt +0 -0
  89. {smart_bot_factory-0.3.7/bots/valera → smart_bot_factory-0.3.8/smart_bot_factory/configs/growthmed-october-24}/prompts/welcome_message.txt +0 -0
  90. {smart_bot_factory-0.3.7 → smart_bot_factory-0.3.8}/smart_bot_factory/configs/growthmed-october-24/reports/test_20250924_064229.txt +0 -0
  91. {smart_bot_factory-0.3.7 → smart_bot_factory-0.3.8}/smart_bot_factory/configs/growthmed-october-24/reports/test_20250924_064335.txt +0 -0
  92. {smart_bot_factory-0.3.7 → smart_bot_factory-0.3.8}/smart_bot_factory/configs/growthmed-october-24/reports/test_20250924_064638.txt +0 -0
  93. {smart_bot_factory-0.3.7/bots/valera → smart_bot_factory-0.3.8/smart_bot_factory/configs/growthmed-october-24}/tests/realistic_scenarios.yaml +0 -0
  94. {smart_bot_factory-0.3.7/bots/valera → smart_bot_factory-0.3.8/smart_bot_factory/configs/growthmed-october-24}/tests/scenario_examples.yaml +0 -0
  95. {smart_bot_factory-0.3.7/bots/valera/welcome_files → smart_bot_factory-0.3.8/smart_bot_factory/configs/growthmed-october-24/welcome_file}/welcome_file_msg.txt +0 -0
  96. {smart_bot_factory-0.3.7/bots/valera/welcome_files → smart_bot_factory-0.3.8/smart_bot_factory/configs/growthmed-october-24/welcome_file}//320/247/320/265/320/272 /320/273/320/270/321/201/321/202 /320/277/320/276 152/320/244/320/227 /320/270 323/320/244/320/227 /320/264/320/273/321/217 /320/274/320/265/320/264/320/270/321/206/320/270/320/275/321/213.pdf" +0 -0
@@ -0,0 +1,23 @@
1
+ repos:
2
+ - repo: https://github.com/psf/black
3
+ rev: 23.9.1
4
+ hooks:
5
+ - id: black
6
+ name: black (python)
7
+
8
+ - repo: https://github.com/pycqa/isort
9
+ rev: 5.11.2
10
+ hooks:
11
+ - id: isort
12
+ name: isort (python)
13
+
14
+ - repo: https://github.com/astral-sh/ruff-pre-commit
15
+ rev: v0.14.1
16
+ hooks:
17
+ - id: ruff-check
18
+ name: ruff lint
19
+ args: [--fix]
20
+ types_or: [python, pyi]
21
+ - id: ruff-format
22
+ name: ruff format
23
+ types_or: [python, pyi]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: smart-bot-factory
3
- Version: 0.3.7
3
+ Version: 0.3.8
4
4
  Summary: Библиотека для создания умных чат-ботов
5
5
  Author-email: Kopatych <eserov73@gmail.com>
6
6
  License: MIT
@@ -21,10 +21,12 @@ Classifier: Topic :: Communications :: Chat
21
21
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
22
22
  Requires-Python: >=3.9
23
23
  Requires-Dist: aiofiles>=23.0.0
24
+ Requires-Dist: aiogram-media-group>=0.5.1
24
25
  Requires-Dist: aiogram>=3.4.1
25
26
  Requires-Dist: click>=8.0.0
26
27
  Requires-Dist: openai>=1.12.0
27
28
  Requires-Dist: project-root-finder>=1.9
29
+ Requires-Dist: python-dateutil>=2.9.0.post0
28
30
  Requires-Dist: python-dotenv>=1.0.1
29
31
  Requires-Dist: pytz>=2023.3
30
32
  Requires-Dist: pyyaml>=6.0.2
@@ -12,63 +12,68 @@ import re
12
12
  import shutil
13
13
  import subprocess
14
14
  from pathlib import Path
15
+
15
16
  from dotenv import load_dotenv
16
17
 
17
18
  # Загружаем переменные из .env
18
19
  load_dotenv()
19
20
 
21
+
20
22
  def increment_version(version: str) -> str:
21
23
  """Увеличивает версию на 0.0.1"""
22
- parts = version.split('.')
24
+ parts = version.split(".")
23
25
  if len(parts) != 3:
24
26
  raise ValueError(f"Неверный формат версии: {version}")
25
-
27
+
26
28
  major, minor, patch = map(int, parts)
27
29
  patch += 1
28
-
30
+
29
31
  return f"{major}.{minor}.{patch}"
30
32
 
33
+
31
34
  def update_version_in_toml():
32
35
  """Обновляет версию в pyproject.toml"""
33
36
  toml_path = Path("pyproject.toml")
34
-
37
+
35
38
  if not toml_path.exists():
36
39
  raise FileNotFoundError("pyproject.toml не найден")
37
-
38
- content = toml_path.read_text(encoding='utf-8')
39
-
40
+
41
+ content = toml_path.read_text(encoding="utf-8")
42
+
40
43
  # Находим текущую версию
41
44
  version_match = re.search(r'^version\s*=\s*"([^"]+)"', content, re.MULTILINE)
42
45
  if not version_match:
43
46
  raise ValueError("Версия не найдена в pyproject.toml")
44
-
47
+
45
48
  old_version = version_match.group(1)
46
49
  new_version = increment_version(old_version)
47
-
50
+
48
51
  # Обновляем версию
49
52
  new_content = re.sub(
50
53
  r'^version\s*=\s*"[^"]+"',
51
54
  f'version = "{new_version}"',
52
55
  content,
53
- flags=re.MULTILINE
56
+ flags=re.MULTILINE,
54
57
  )
55
-
56
- toml_path.write_text(new_content, encoding='utf-8')
57
-
58
+
59
+ toml_path.write_text(new_content, encoding="utf-8")
60
+
58
61
  print(f"✅ Версия обновлена: {old_version} → {new_version}")
59
62
  return new_version
60
63
 
64
+
61
65
  def clean_dist():
62
66
  """Очищает папку dist/"""
63
67
  dist_path = Path("dist")
64
-
68
+
65
69
  if dist_path.exists():
66
70
  shutil.rmtree(dist_path)
67
71
  print("✅ Папка dist/ очищена")
68
-
72
+
69
73
  dist_path.mkdir(exist_ok=True)
70
74
  print("✅ Папка dist/ создана")
71
75
 
76
+
72
77
  def build_package():
73
78
  """Собирает пакет через uv build"""
74
79
  print("\n🔨 Сборка пакета...")
@@ -76,13 +81,14 @@ def build_package():
76
81
  print("✅ Пакет собран")
77
82
  return result.returncode == 0
78
83
 
84
+
79
85
  def upload_to_pypi():
80
86
  """Загружает пакет в PyPI через twine"""
81
87
  print("\n📤 Загрузка в PyPI...")
82
-
88
+
83
89
  # Проверяем наличие токена в .env
84
- pypi_token = os.getenv('PYPI_API_TOKEN')
85
-
90
+ pypi_token = os.getenv("PYPI_API_TOKEN")
91
+
86
92
  if not pypi_token:
87
93
  print("⚠️ PYPI_API_TOKEN не найден в .env")
88
94
  print("💡 Добавьте в .env файл:")
@@ -90,58 +96,57 @@ def upload_to_pypi():
90
96
  print("\nИли введите вручную при запросе twine")
91
97
  else:
92
98
  print(f"✅ Используется API токен из .env (длина: {len(pypi_token)} символов)")
93
-
99
+
94
100
  # Twine автоматически использует переменные окружения:
95
101
  # TWINE_USERNAME (по умолчанию "__token__")
96
102
  # TWINE_PASSWORD (PYPI_API_TOKEN)
97
103
  env = os.environ.copy()
98
104
  if pypi_token:
99
- env['TWINE_USERNAME'] = '__token__'
100
- env['TWINE_PASSWORD'] = pypi_token
101
-
105
+ env["TWINE_USERNAME"] = "__token__"
106
+ env["TWINE_PASSWORD"] = pypi_token
107
+
102
108
  # Используем twine через uv run
103
109
  result = subprocess.run(
104
- ["uv", "run", "twine", "upload", "dist/*"],
105
- env=env,
106
- check=True
110
+ ["uv", "run", "twine", "upload", "dist/*"], env=env, check=True
107
111
  )
108
-
112
+
109
113
  print("✅ Пакет загружен в PyPI")
110
114
  return result.returncode == 0
111
115
 
116
+
112
117
  def main():
113
118
  """Основная функция"""
114
119
  try:
115
120
  print("🚀 Начинаем публикацию в PyPI\n")
116
-
121
+
117
122
  # 1. Обновляем версию
118
123
  new_version = update_version_in_toml()
119
-
124
+
120
125
  # 2. Очищаем dist/
121
126
  clean_dist()
122
-
127
+
123
128
  # 3. Собираем пакет
124
129
  build_package()
125
-
130
+
126
131
  # 4. Загружаем в PyPI
127
132
  upload_to_pypi()
128
-
133
+
129
134
  print(f"\n🎉 Успешно! Версия {new_version} опубликована в PyPI")
130
- print(f"\n💡 Не забудьте закоммитить изменения:")
131
- print(f" git add pyproject.toml")
135
+ print("\n💡 Не забудьте закоммитить изменения:")
136
+ print(" git add pyproject.toml")
132
137
  print(f" git commit -m 'Bump version to {new_version}'")
133
138
  print(f" git tag v{new_version}")
134
- print(f" git push && git push --tags")
135
-
139
+ print(" git push && git push --tags")
140
+
136
141
  except subprocess.CalledProcessError as e:
137
142
  print(f"\n❌ Ошибка выполнения команды: {e}")
138
143
  return 1
139
144
  except Exception as e:
140
145
  print(f"\n❌ Ошибка: {e}")
141
146
  return 1
142
-
147
+
143
148
  return 0
144
149
 
150
+
145
151
  if __name__ == "__main__":
146
152
  exit(main())
147
-
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "smart-bot-factory"
3
- version = "0.3.7"
3
+ version = "0.3.8"
4
4
  description = "Библиотека для создания умных чат-ботов"
5
5
  authors = [
6
6
  {name = "Kopatych", email = "eserov73@gmail.com"}
@@ -33,6 +33,8 @@ dependencies = [
33
33
  # CLI интерфейс
34
34
  "click>=8.0.0",
35
35
  "project-root-finder>=1.9",
36
+ "aiogram-media-group>=0.5.1",
37
+ "python-dateutil>=2.9.0.post0",
36
38
  ]
37
39
  requires-python = ">=3.9"
38
40
  readme = "README.md"
@@ -2,17 +2,17 @@
2
2
  Admin модули smart_bot_factory
3
3
  """
4
4
 
5
+ from .admin_events import setup_admin_events_handlers
5
6
  from .admin_logic import setup_admin_handlers
6
7
  from .admin_manager import AdminManager
7
8
  from .admin_tester import test_admin_system
8
9
  from .timeout_checker import check_timeouts, setup_bot_environment
9
- from .admin_events import setup_admin_events_handlers
10
10
 
11
11
  __all__ = [
12
- 'setup_admin_handlers',
13
- 'setup_admin_events_handlers',
14
- 'AdminManager',
15
- 'test_admin_system',
16
- 'check_timeouts',
17
- 'setup_bot_environment'
12
+ "setup_admin_handlers",
13
+ "setup_admin_events_handlers",
14
+ "AdminManager",
15
+ "test_admin_system",
16
+ "check_timeouts",
17
+ "setup_bot_environment",
18
18
  ]