blockmine 1.25.0 → 1.27.1

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.
Files changed (165) hide show
  1. package/CHANGELOG.md +46 -1
  2. package/backend/cli.js +1 -1
  3. package/backend/package.json +2 -2
  4. package/backend/prisma/migrations/20260328173000_add_plugin_source_ref/migration.sql +2 -0
  5. package/backend/prisma/migrations/migration_lock.toml +2 -2
  6. package/backend/prisma/schema.prisma +2 -0
  7. package/backend/src/api/routes/apiKeys.js +8 -0
  8. package/backend/src/api/routes/bots.js +258 -9
  9. package/backend/src/api/routes/eventGraphs.js +151 -1
  10. package/backend/src/api/routes/health.js +38 -0
  11. package/backend/src/api/routes/nodeRegistry.js +63 -0
  12. package/backend/src/api/routes/plugins.js +254 -29
  13. package/backend/src/container.js +11 -8
  14. package/backend/src/core/BotCommandLoader.js +161 -0
  15. package/backend/src/core/BotConnection.js +125 -0
  16. package/backend/src/core/BotEventHandlers.js +234 -0
  17. package/backend/src/core/BotIPCHandler.js +445 -0
  18. package/backend/src/core/BotManager.js +15 -7
  19. package/backend/src/core/BotProcess.js +75 -142
  20. package/backend/src/core/EventGraphManager.js +7 -3
  21. package/backend/src/core/GraphDebugHandler.js +229 -0
  22. package/backend/src/core/GraphDebugIPC.js +117 -0
  23. package/backend/src/core/GraphExecutionEngine.js +545 -978
  24. package/backend/src/core/GraphTraversal.js +80 -0
  25. package/backend/src/core/GraphValidation.js +73 -0
  26. package/backend/src/core/NodeDefinition.js +138 -0
  27. package/backend/src/core/NodeRegistry.js +153 -141
  28. package/backend/src/core/PluginManager.js +272 -31
  29. package/backend/src/core/RewindSignal.js +9 -0
  30. package/backend/src/core/config/ConfigValidator.js +72 -0
  31. package/backend/src/core/config/FeatureFlags.js +52 -0
  32. package/backend/src/core/config/__tests__/ConfigValidator.test.js +232 -0
  33. package/backend/src/core/domain/entities/Bot.js +39 -0
  34. package/backend/src/core/domain/entities/Command.js +41 -0
  35. package/backend/src/core/domain/entities/EventGraph.js +39 -0
  36. package/backend/src/core/domain/entities/Plugin.js +45 -0
  37. package/backend/src/core/domain/entities/User.js +40 -0
  38. package/backend/src/core/domain/services/DependencyResolver.js +168 -0
  39. package/backend/src/core/domain/services/GraphValidator.js +117 -0
  40. package/backend/src/core/domain/services/PermissionChecker.js +34 -0
  41. package/backend/src/core/domain/services/__tests__/DependencyResolver.test.js +126 -0
  42. package/backend/src/core/domain/valueObjects/BotConfig.js +27 -0
  43. package/backend/src/core/domain/valueObjects/DependencyGraph.js +86 -0
  44. package/backend/src/core/domain/valueObjects/PluginManifest.js +36 -0
  45. package/backend/src/core/errors/BaseError.js +29 -0
  46. package/backend/src/core/errors/ErrorHandler.js +81 -0
  47. package/backend/src/core/errors/__tests__/ErrorHandler.test.js +188 -0
  48. package/backend/src/core/errors/index.js +68 -0
  49. package/backend/src/core/infrastructure/BatchingUtility.js +66 -0
  50. package/backend/src/core/infrastructure/CircuitBreaker.js +103 -0
  51. package/backend/src/core/infrastructure/ConnectionPool.js +81 -0
  52. package/backend/src/core/infrastructure/RateLimiter.js +64 -0
  53. package/backend/src/core/infrastructure/__tests__/BatchingUtility.test.js +86 -0
  54. package/backend/src/core/infrastructure/__tests__/CircuitBreaker.test.js +156 -0
  55. package/backend/src/core/infrastructure/__tests__/ConnectionPool.test.js +146 -0
  56. package/backend/src/core/infrastructure/__tests__/RateLimiter.test.js +171 -0
  57. package/backend/src/core/ipc/botApiFactory.js +72 -0
  58. package/backend/src/core/ipc/ipcMessageTypes.js +115 -0
  59. package/backend/src/core/logging/AuditLogger.js +61 -0
  60. package/backend/src/core/logging/StructuredLogger.js +80 -0
  61. package/backend/src/core/logging/__tests__/StructuredLogger.test.js +213 -0
  62. package/backend/src/core/logging/index.js +7 -0
  63. package/backend/src/core/metrics/MetricsCollector.js +104 -0
  64. package/backend/src/core/metrics/__tests__/MetricsCollector.test.js +131 -0
  65. package/backend/src/core/node-registries/actionsNodes.js +191 -0
  66. package/backend/src/core/node-registries/arraysNodes.js +152 -0
  67. package/backend/src/core/node-registries/botNodes.js +48 -0
  68. package/backend/src/core/node-registries/containerNodes.js +141 -0
  69. package/backend/src/core/node-registries/dataNodes.js +284 -0
  70. package/backend/src/core/node-registries/debugNodes.js +23 -0
  71. package/backend/src/core/node-registries/eventsNodes.js +223 -0
  72. package/backend/src/core/node-registries/flowNodes.js +151 -0
  73. package/backend/src/core/node-registries/furnaceNodes.js +123 -0
  74. package/backend/src/core/node-registries/index.js +108 -0
  75. package/backend/src/core/node-registries/inventory.js +102 -106
  76. package/backend/src/core/node-registries/logicNodes.js +54 -0
  77. package/backend/src/core/node-registries/mathNodes.js +38 -0
  78. package/backend/src/core/node-registries/navigationNodes.js +109 -0
  79. package/backend/src/core/node-registries/objectsNodes.js +90 -0
  80. package/backend/src/core/node-registries/stringsNodes.js +165 -0
  81. package/backend/src/core/node-registries/timeNodes.js +105 -0
  82. package/backend/src/core/node-registries/typeNodes.js +22 -0
  83. package/backend/src/core/node-registries/usersNodes.js +126 -0
  84. package/backend/src/core/nodes/arrays/shuffle.js +14 -0
  85. package/backend/src/core/nodes/bot/get_name.js +8 -0
  86. package/backend/src/core/nodes/bot/stop_bot.js +5 -0
  87. package/backend/src/core/nodes/container/open.js +101 -111
  88. package/backend/src/core/nodes/data/store_read.js +26 -0
  89. package/backend/src/core/nodes/data/store_write.js +23 -0
  90. package/backend/src/core/nodes/event/call_event.js +31 -0
  91. package/backend/src/core/nodes/event/custom_event.js +8 -0
  92. package/backend/src/core/nodes/flow/timer.js +35 -0
  93. package/backend/src/core/nodes/inventory/drop.js +73 -65
  94. package/backend/src/core/nodes/inventory/equip.js +54 -45
  95. package/backend/src/core/nodes/inventory/select_slot.js +48 -46
  96. package/backend/src/core/nodes/navigation/follow.js +54 -51
  97. package/backend/src/core/nodes/navigation/go_to.js +41 -53
  98. package/backend/src/core/nodes/navigation/go_to_entity.js +65 -69
  99. package/backend/src/core/nodes/navigation/go_to_player.js +65 -70
  100. package/backend/src/core/nodes/navigation/stop.js +17 -26
  101. package/backend/src/core/nodes/users/add_to_group.js +24 -0
  102. package/backend/src/core/nodes/users/check_permission.js +26 -0
  103. package/backend/src/core/nodes/users/remove_from_group.js +24 -0
  104. package/backend/src/core/services/BotIPCMessageRouter.js +337 -0
  105. package/backend/src/core/services/BotLifecycleService.js +41 -632
  106. package/backend/src/core/services/CacheManager.js +83 -23
  107. package/backend/src/core/services/CrashRestartManager.js +42 -0
  108. package/backend/src/core/services/DebugSessionManager.js +114 -12
  109. package/backend/src/core/services/EventGraphService.js +69 -0
  110. package/backend/src/core/services/MinecraftBotManager.js +9 -1
  111. package/backend/src/core/services/PluginManagementService.js +84 -0
  112. package/backend/src/core/services/TestModeContext.js +65 -0
  113. package/backend/src/core/services/__tests__/CacheManager.test.js +168 -0
  114. package/backend/src/core/services.js +1 -11
  115. package/backend/src/core/validation/InputValidator.js +167 -0
  116. package/backend/src/core/validation/__tests__/InputValidator.test.js +296 -0
  117. package/backend/src/real-time/botApi/index.js +1 -1
  118. package/backend/src/real-time/socketHandler.js +26 -0
  119. package/backend/src/server.js +10 -5
  120. package/frontend/dist/assets/{browser-ponyfill-DN7pwmHT.js → browser-ponyfill-D8y0Ty7C.js} +1 -1
  121. package/frontend/dist/assets/index-CFJLS0dk.css +32 -0
  122. package/frontend/dist/assets/{index-LSy71uwm.js → index-D91UGNMG.js} +1880 -1881
  123. package/frontend/dist/index.html +2 -2
  124. package/frontend/dist/locales/en/bots.json +4 -1
  125. package/frontend/dist/locales/en/common.json +7 -1
  126. package/frontend/dist/locales/en/login.json +2 -0
  127. package/frontend/dist/locales/en/management.json +79 -1
  128. package/frontend/dist/locales/en/nodes.json +59 -4
  129. package/frontend/dist/locales/en/plugin-detail.json +24 -4
  130. package/frontend/dist/locales/en/plugins.json +226 -7
  131. package/frontend/dist/locales/en/setup.json +2 -0
  132. package/frontend/dist/locales/en/sidebar.json +171 -3
  133. package/frontend/dist/locales/en/visual-editor.json +230 -31
  134. package/frontend/dist/locales/ru/bots.json +4 -1
  135. package/frontend/dist/locales/ru/login.json +2 -0
  136. package/frontend/dist/locales/ru/management.json +79 -1
  137. package/frontend/dist/locales/ru/minecraft-viewer.json +3 -0
  138. package/frontend/dist/locales/ru/nodes.json +105 -51
  139. package/frontend/dist/locales/ru/plugins.json +103 -4
  140. package/frontend/dist/locales/ru/setup.json +2 -0
  141. package/frontend/dist/locales/ru/sidebar.json +171 -3
  142. package/frontend/dist/locales/ru/visual-editor.json +232 -33
  143. package/frontend/package.json +2 -0
  144. package/nul +12 -0
  145. package/package.json +3 -3
  146. package/scripts/postinstall.js +38 -0
  147. package/backend/package-lock.json +0 -6801
  148. package/backend/src/core/node-registries/actions.js +0 -202
  149. package/backend/src/core/node-registries/arrays.js +0 -155
  150. package/backend/src/core/node-registries/bot.js +0 -23
  151. package/backend/src/core/node-registries/container.js +0 -162
  152. package/backend/src/core/node-registries/data.js +0 -290
  153. package/backend/src/core/node-registries/debug.js +0 -26
  154. package/backend/src/core/node-registries/events.js +0 -201
  155. package/backend/src/core/node-registries/flow.js +0 -139
  156. package/backend/src/core/node-registries/furnace.js +0 -143
  157. package/backend/src/core/node-registries/logic.js +0 -62
  158. package/backend/src/core/node-registries/math.js +0 -42
  159. package/backend/src/core/node-registries/navigation.js +0 -111
  160. package/backend/src/core/node-registries/objects.js +0 -98
  161. package/backend/src/core/node-registries/strings.js +0 -187
  162. package/backend/src/core/node-registries/time.js +0 -113
  163. package/backend/src/core/node-registries/type.js +0 -25
  164. package/backend/src/core/node-registries/users.js +0 -79
  165. package/frontend/dist/assets/index-SfhKxI4-.css +0 -32
@@ -1,10 +1,8 @@
1
1
  {
2
2
  "dashboard": "Дашборд",
3
3
  "scheduler": "Планировщик",
4
- "graphStore": "Магазин графов",
5
4
  "apiKeys": "API Ключи",
6
5
  "proxy": "Прокси",
7
- "changelog": "История версий",
8
6
  "bots": "Боты",
9
7
  "admin": "Администрирование",
10
8
  "servers": "Серверы",
@@ -14,8 +12,178 @@
14
12
  "createBotDescription": "Заполните информацию ниже, чтобы добавить нового бота в панель.",
15
13
  "importBot": "Импорт бота",
16
14
  "logout": "Выйти",
17
- "whatsNew": "Что нового?",
15
+ "brandToggle": {
16
+ "hide": "Скрыть логотип",
17
+ "show": "Показать логотип"
18
+ },
19
+ "logoutDialog": {
20
+ "title": "Выйти из аккаунта?",
21
+ "description": "Текущая сессия будет завершена, и для входа снова потребуется пароль.",
22
+ "cancel": "Отмена",
23
+ "confirm": "Выйти"
24
+ },
18
25
  "openMenu": "Открыть меню",
26
+ "whatsNew": "Что нового?",
27
+ "askQuestion": "Задать вопрос",
28
+ "theme": {
29
+ "label": "Тема",
30
+ "light": "Светлая",
31
+ "dark": "Тёмная",
32
+ "system": "Системная",
33
+ "custom": "Кастомная",
34
+ "editor": {
35
+ "title": "Кастомная тема",
36
+ "description": "Настрой основные цвета панели, не трогая статусные акценты и зелёные индикаторы установленных плагинов.",
37
+ "sections": {
38
+ "surface": {
39
+ "title": "Основа",
40
+ "description": "Эти цвета отвечают за фон страницы, карточки, попапы и основной читаемый текст."
41
+ },
42
+ "brand": {
43
+ "title": "Акцент",
44
+ "description": "Здесь настраивается главный фирменный цвет, активные кнопки, ring и выделенные действия."
45
+ },
46
+ "ui": {
47
+ "title": "Интерфейс",
48
+ "description": "Дополнительные блоки, приглушённый текст, границы, поля ввода и вторичные поверхности."
49
+ },
50
+ "graphEditor": {
51
+ "title": "Граф-редактор",
52
+ "description": "Эти цвета управляют шапкой нод, телом нод и карточками перетаскиваемых нод в левой панели."
53
+ },
54
+ "scrollbar": {
55
+ "title": "Скроллбары",
56
+ "description": "Подгони цвета ползунков и кнопок скроллбара под стиль панели."
57
+ }
58
+ },
59
+ "preview": {
60
+ "title": "Живой предпросмотр",
61
+ "description": "Пока кастомная тема активна, изменения применяются сразу.",
62
+ "active": "Кастом активен",
63
+ "inactive": "Только предпросмотр",
64
+ "cardTitle": "Пример интерфейса",
65
+ "cardDescription": "Быстрый взгляд на то, как основные токены сочетаются друг с другом.",
66
+ "primaryBadge": "Primary",
67
+ "secondary": "Вторичный",
68
+ "muted": "Приглушённый",
69
+ "accent": "Акцент"
70
+ },
71
+ "baseTheme": {
72
+ "title": "Базовый режим",
73
+ "description": "Выбери, от какой структуры должна наследоваться кастомная тема: светлой или тёмной. Для полной смены палитры используй пресеты ниже."
74
+ },
75
+ "actions": {
76
+ "resetCurrent": "Сбросить текущую палитру",
77
+ "useDarkPreset": "Взять тёмный пресет",
78
+ "useLightPreset": "Взять светлый пресет"
79
+ },
80
+ "note": {
81
+ "title": "Что меняется",
82
+ "description": "Этот редактор влияет на основную палитру панели, цвета нод в граф-редакторе, кнопки, границы, поля ввода, muted-блоки и скроллбары. Специальные цвета вроде зелёного статуса установленных плагинов не меняются."
83
+ },
84
+ "picker": {
85
+ "title": "Палитра цвета",
86
+ "description": "Используй быстрые swatch-цвета или точно подгони оттенок через HSL-слайдеры.",
87
+ "hue": "Тон",
88
+ "saturation": "Насыщенность",
89
+ "lightness": "Светлота"
90
+ },
91
+ "colors": {
92
+ "background": {
93
+ "label": "Фон",
94
+ "description": "Главный фон приложения."
95
+ },
96
+ "foreground": {
97
+ "label": "Основной текст",
98
+ "description": "Главный читаемый цвет текста."
99
+ },
100
+ "card": {
101
+ "label": "Фон карточек",
102
+ "description": "Карточки, панели и основные блоки."
103
+ },
104
+ "cardForeground": {
105
+ "label": "Текст карточек",
106
+ "description": "Читаемый текст внутри карточек."
107
+ },
108
+ "popover": {
109
+ "label": "Фон попапов",
110
+ "description": "Меню, выпадашки и плавающие окна."
111
+ },
112
+ "popoverForeground": {
113
+ "label": "Текст попапов",
114
+ "description": "Текст внутри меню и popover-элементов."
115
+ },
116
+ "primary": {
117
+ "label": "Главный акцент",
118
+ "description": "Основные кнопки и выбранные состояния."
119
+ },
120
+ "primaryForeground": {
121
+ "label": "Текст на primary",
122
+ "description": "Текст на основных акцентных кнопках."
123
+ },
124
+ "secondary": {
125
+ "label": "Вторичная поверхность",
126
+ "description": "Вспомогательные кнопки и мягкие блоки."
127
+ },
128
+ "secondaryForeground": {
129
+ "label": "Текст secondary",
130
+ "description": "Текст на вторичных поверхностях."
131
+ },
132
+ "muted": {
133
+ "label": "Muted-поверхность",
134
+ "description": "Спокойные контейнеры и приглушённые подложки."
135
+ },
136
+ "mutedForeground": {
137
+ "label": "Muted-текст",
138
+ "description": "Вторичные описания и подсказки."
139
+ },
140
+ "accent": {
141
+ "label": "Акцентная поверхность",
142
+ "description": "Hover-состояния и выделенные зоны UI."
143
+ },
144
+ "accentForeground": {
145
+ "label": "Текст accent",
146
+ "description": "Текст на accent-поверхностях."
147
+ },
148
+ "border": {
149
+ "label": "Границы",
150
+ "description": "Обводки карточек и разделители."
151
+ },
152
+ "input": {
153
+ "label": "Границы input",
154
+ "description": "Поля ввода, select и контуры контролов."
155
+ },
156
+ "ring": {
157
+ "label": "Focus ring",
158
+ "description": "Подсветка активного поля и клавиатурного фокуса."
159
+ },
160
+ "graphHeader": {
161
+ "label": "Заголовок ноды",
162
+ "description": "Цвет шапки граф-ноды и карточек нод в левой панели."
163
+ },
164
+ "graphSurface": {
165
+ "label": "Тело ноды",
166
+ "description": "Основной цвет тела ноды внутри визуального редактора."
167
+ },
168
+ "graphInput": {
169
+ "label": "Поле ввода ноды",
170
+ "description": "Цвет инпутов и select-полей внутри нод и их настроек."
171
+ },
172
+ "scrollbarThumb": {
173
+ "label": "Ползунок скролла",
174
+ "description": "Основной draggable-элемент скроллбара."
175
+ },
176
+ "scrollbarThumbHover": {
177
+ "label": "Hover у скролла",
178
+ "description": "Цвет ползунка при наведении."
179
+ },
180
+ "scrollbarButtonBg": {
181
+ "label": "Кнопка скролла",
182
+ "description": "Фон кнопок со стрелками у классических скроллбаров."
183
+ }
184
+ }
185
+ }
186
+ },
19
187
  "botImported": "Бот \"{{name}}\" успешно импортирован.",
20
188
  "botOrderError": "Не удалось обновить порядок ботов",
21
189
  "contribute": {
@@ -2,7 +2,8 @@
2
2
  "loading": "Загрузка редактора...",
3
3
  "loadingSettings": "Загрузка настроек...",
4
4
  "editor": {
5
- "title": "Редактор"
5
+ "title": "Редактор",
6
+ "botFallback": "Бот {{id}}"
6
7
  },
7
8
  "createGraph": {
8
9
  "title": "Создать новый граф событий",
@@ -103,40 +104,96 @@
103
104
  "advanced": "Расширенный",
104
105
  "operator": "Оператор:",
105
106
  "addPin": "Добавить пин",
106
- "httpMethod": "HTTP Method:"
107
+ "httpMethod": "HTTP Method:",
108
+ "value": "Значение:",
109
+ "number": "Число:",
110
+ "targetType": "Целевой тип:",
111
+ "selectType": "Выберите тип...",
112
+ "checkType": "Проверить тип:",
113
+ "add": "Добавить",
114
+ "remove": "Удалить",
115
+ "addField": "Добавить поле",
116
+ "removeField": "Удалить поле",
117
+ "cases": "Case'ы:",
118
+ "comparePlaceholder": "Значение для сравнения",
119
+ "autoCompareHint": "Автоматически определяет тип сравнения: числа, строки, массивы, объекты",
120
+ "selectIn3dViewer": "Выбрать в 3D Viewer",
121
+ "selectContainerIn3dViewer": "Выбрать сундук в 3D Viewer",
122
+ "selectFurnaceIn3dViewer": "Выбрать печку в 3D Viewer",
123
+ "jsonObject": "JSON объект:",
124
+ "minimumDefault": "Минимум (по умолчанию)",
125
+ "maximumDefault": "Максимум (по умолчанию)",
126
+ "usedWhenPinDisconnected": "Используется, если пин {{pin}} не подключен",
127
+ "selectOperation": "Выберите операцию...",
128
+ "booleanTrue": "True (Истина)",
129
+ "booleanFalse": "False (Ложь)",
130
+ "castString": "String (Текст)",
131
+ "castNumber": "Number (Число)",
132
+ "castBoolean": "Boolean (Да / Нет)",
133
+ "typeString": "String (Строка)",
134
+ "typeNumber": "Number (Число)",
135
+ "typeNumericString": "Числовая строка (\"100\")",
136
+ "typeBoolean": "Boolean (Да / Нет)",
137
+ "typeArray": "Array (Массив)",
138
+ "typeObject": "Object (Объект)",
139
+ "typeNull": "Null / Undefined (Пусто)",
140
+ "compareEquals": "Равно (==)",
141
+ "compareNotEquals": "Не равно (!=)",
142
+ "compareGreater": "Больше (>)",
143
+ "compareLess": "Меньше (<)",
144
+ "compareGreaterOrEqual": "Больше или равно (>=)",
145
+ "compareLessOrEqual": "Меньше или равно (<=)",
146
+ "logicAnd": "И (AND)",
147
+ "logicOr": "ИЛИ (OR)",
148
+ "logicNot": "НЕ (NOT)",
149
+ "mathAdd": "Сложение (+)",
150
+ "mathSubtract": "Вычитание (-)",
151
+ "mathMultiply": "Умножение (*)",
152
+ "mathDivide": "Деление (/)",
153
+ "timeBefore": "Раньше (<)",
154
+ "timeAfter": "Позже (>)",
155
+ "timeEqual": "Равны (=)",
156
+ "timeBeforeOrEqual": "Раньше или равно (≤)",
157
+ "timeAfterOrEqual": "Позже или равно (≥)",
158
+ "stringLiteralPlaceholder": "Привет, {username}!"
107
159
  },
108
160
  "contextMenu": {
109
161
  "searchPlaceholder": "Введите команду или поиск...",
110
162
  "noResults": "Ничего не найдено.",
111
- "variablesGroup": "📦 Переменные",
112
- "argumentsGroup": "🎯 Аргументы",
113
- "getVariable": "📤 Получить переменную {{name}}",
114
- "setVariable": "📥 Задать переменную {{name}}",
115
- "getArgument": "📤 Получить аргумент {{name}}"
163
+ "variablesGroup": "Переменные",
164
+ "argumentsGroup": "Аргументы",
165
+ "getVariable": "Получить переменную {{name}}",
166
+ "setVariable": "Задать переменную {{name}}",
167
+ "getArgument": "Получить аргумент {{name}}"
116
168
  },
117
169
  "nodePanel": {
118
170
  "title": "Добавить ноду",
119
171
  "categories": {
120
- "data": "📊 Данные",
121
- "flow": "🔀 Управление",
122
- "math": "🔢 Математика",
123
- "logic": "🧠 Логика",
124
- "string": "📝 Строки",
125
- "array": "📦 Массивы",
126
- "object": "🗃️ Объекты",
127
- "action": "Действия",
128
- "time": "Время",
129
- "user": "👤 Пользователи",
130
- "type": "🔄 Типы",
131
- "bot": "🤖 Бот",
132
- "debug": "🐛 Отладка",
133
- "inventory": "🎒 Инвентарь",
134
- "navigation": "🧭 Навигация",
135
- "container": "📦 Контейнеры",
136
- "furnace": "🔥 Печка",
137
- "event": "📡 События"
172
+ "data": "Данные",
173
+ "flow": "Управление",
174
+ "math": "Математика",
175
+ "logic": "Логика",
176
+ "string": "Строки",
177
+ "array": "Массивы",
178
+ "object": "Объекты",
179
+ "action": "Действия",
180
+ "time": "Время",
181
+ "user": "Пользователи",
182
+ "type": "Типы",
183
+ "bot": "Бот",
184
+ "debug": "Отладка",
185
+ "inventory": "Инвентарь",
186
+ "navigation": "Навигация",
187
+ "container": "Контейнеры",
188
+ "furnace": "Печка",
189
+ "event": "События",
190
+ "websocket": "WebSocket API"
138
191
  }
139
192
  },
193
+ "collaboration": {
194
+ "online": "В сети ({{count}})",
195
+ "editing": "Редактирование"
196
+ },
140
197
  "debugControls": {
141
198
  "paused": "На паузе",
142
199
  "continue": "Продолжить (F5)",
@@ -155,7 +212,7 @@
155
212
  "users_few": "{{count}} пользователя",
156
213
  "users_many": "{{count}} пользователей",
157
214
  "connectedUsers": "Подключенные пользователи:",
158
- "onPause": "⏸️ На паузе",
215
+ "onPause": "На паузе",
159
216
  "pausedDescription": "Выполнение приостановлено на брейкпоинте. Используйте элементы управления для продолжения.",
160
217
  "breakpoints": "Брейкпоинты",
161
218
  "noBreakpoints": "Нет брейкпоинтов",
@@ -169,7 +226,12 @@
169
226
  "normalModeDesc": "Редактирование графа. Включите <strong>Live режим</strong> для отладки в реальном времени с брейкпоинтами.",
170
227
  "traceModeTitle": "Режим трассировки:",
171
228
  "traceModeDesc": "Просмотр трассировок выполнения после завершения команд. Переключитесь в <strong>Live режим</strong> для отладки в реальном времени с брейкпоинтами.",
172
- "editValue": "Редактировать значение"
229
+ "editValue": "Редактировать значение",
230
+ "connection": "Подключение",
231
+ "status": "Статус:",
232
+ "usersLabel": "Пользователей:",
233
+ "tipTitle": "Подсказка",
234
+ "liveModeTip": "Запустите тестовый прогон или дождитесь срабатывания брейкпоинта. На паузе появится панель с входными значениями и управлением шагами."
173
235
  },
174
236
  "traceViewer": {
175
237
  "completed": "Завершено",
@@ -181,19 +243,88 @@
181
243
  "inputs": "Входы:",
182
244
  "outputs": "Выходы:"
183
245
  },
246
+ "traceStepInfo": {
247
+ "title": "Информация о шаге",
248
+ "empty": "Выберите шаг для просмотра деталей",
249
+ "stepOf": "Шаг {{step}} из {{total}}",
250
+ "node": "Нода",
251
+ "name": "Название:",
252
+ "type": "Тип:",
253
+ "id": "ID:",
254
+ "unknown": "Неизвестно",
255
+ "status": "Статус",
256
+ "result": "Результат:",
257
+ "success": "Успешно",
258
+ "error": "Ошибка",
259
+ "time": "Время:",
260
+ "inputs": "Входные данные",
261
+ "outputs": "Выходные данные",
262
+ "path": "Путь выполнения"
263
+ },
264
+ "valueEditor": {
265
+ "title": "Редактировать значение",
266
+ "jsonObjectArray": "JSON объект / массив",
267
+ "jsonHint": "💡 Используйте корректный JSON формат",
268
+ "value": "Значение",
269
+ "placeholder": "Введите значение",
270
+ "scalarHint": "💡 Поддерживаются: строки, числа, true/false, null",
271
+ "currentValue": "Текущее значение:",
272
+ "empty": "(пусто)",
273
+ "cancel": "Отмена",
274
+ "save": "Сохранить",
275
+ "invalidJson": "Некорректный JSON: {{message}}"
276
+ },
277
+ "nodeHelp": {
278
+ "flowBreak": {
279
+ "intro": "Нода Break прерывает выполнение цикла.",
280
+ "item1": "Используется внутри циклов For Each и While",
281
+ "item2": "При выполнении немедленно прерывает цикл",
282
+ "item3": "Управление передаётся на выход Completed цикла",
283
+ "note": "Примечание: у этой ноды нет выходных пинов, потому что выполнение продолжается с выхода Completed родительского цикла."
284
+ },
285
+ "flowDelay": {
286
+ "label": "Задержка в миллисекундах (по умолчанию)",
287
+ "intro": "Нода Delay приостанавливает выполнение графа.",
288
+ "item1": "1000 мс = 1 секунда",
289
+ "item2": "Можно указать задержку через пин или в настройках",
290
+ "item3": "Если значение отрицательное или не число, задержка будет 0 мс",
291
+ "note": "Примечание: задержка работает асинхронно и не блокирует другие процессы приложения."
292
+ },
293
+ "flowForEach": {
294
+ "intro": "Цикл For Each проходит по каждому элементу массива.",
295
+ "item1": "Подключите массив к входу Array",
296
+ "item2": "Используйте выход Element для получения текущего элемента",
297
+ "item3": "Используйте выход Index для получения текущего индекса",
298
+ "item4": "Тело цикла выполняется для каждого элемента",
299
+ "item5": "После завершения срабатывает выход Completed",
300
+ "note": "Примечание: цикл можно прервать с помощью ноды Break."
301
+ },
302
+ "flowWhile": {
303
+ "intro": "Цикл While выполняется, пока условие истинно.",
304
+ "item1": "Подключите boolean значение к входу Condition",
305
+ "item2": "Используйте выход Iteration для получения номера итерации",
306
+ "item3": "Тело цикла выполняется на каждой итерации",
307
+ "item4": "После завершения срабатывает выход Completed",
308
+ "warning": "⚠️ Важно: максимальное количество итераций — 1000. Убедитесь, что условие может стать false, иначе цикл будет прерван.",
309
+ "note": "Примечание: цикл можно прервать досрочно с помощью ноды Break."
310
+ },
311
+ "mathRandom": {
312
+ "note": "Примечание: если min или max содержат точку или запятую, будет сгенерировано float-число, иначе — целое."
313
+ }
314
+ },
184
315
  "whatIfEditor": {
185
316
  "title": "Выполнение приостановлено",
186
317
  "node": "Нода:",
187
318
  "editHint": "Редактируйте значения прямо на нодах - кликните на зелёные бейджи с данными",
188
319
  "syncHint": "Все изменения синхронизируются в реальном времени между пользователями",
189
- "graphVariables": "📦 Переменные графа",
320
+ "graphVariables": "Переменные графа",
190
321
  "continue": "Продолжить (F5)",
191
322
  "stop": "Стоп",
192
323
  "modified": "Изменено",
193
324
  "empty": "(пусто)",
194
- "changesWarning_one": "⚠️ Вы изменили {{count}} значение. Нажмите \"Продолжить\" для применения изменений.",
195
- "changesWarning_few": "⚠️ Вы изменили {{count}} значения. Нажмите \"Продолжить\" для применения изменений.",
196
- "changesWarning_many": "⚠️ Вы изменили {{count}} значений. Нажмите \"Продолжить\" для применения изменений."
325
+ "changesWarning_one": "Вы изменили {{count}} значение. Нажмите \"Продолжить\" для применения изменений.",
326
+ "changesWarning_few": "Вы изменили {{count}} значения. Нажмите \"Продолжить\" для применения изменений.",
327
+ "changesWarning_many": "Вы изменили {{count}} значений. Нажмите \"Продолжить\" для применения изменений."
197
328
  },
198
329
  "breakpointDialog": {
199
330
  "editTitle": "Редактировать брейкпоинт",
@@ -203,12 +334,12 @@
203
334
  "conditionPlaceholder": "user.username === 'admin'",
204
335
  "conditionHelp": "JavaScript выражение. Оставьте пустым для безусловной остановки.",
205
336
  "availableVars": "Доступные переменные:",
206
- "howItWorksTitle": "💡 Как работают условия:",
337
+ "howItWorksTitle": "Как работают условия:",
207
338
  "howItWorks1": "Выполнение остановится только если условие вернёт <code class=\"text-green-400\">true</code>",
208
339
  "howItWorks2": "Используйте <code class=\"text-blue-400\">user</code> для проверки пользователя (username, id)",
209
340
  "howItWorks3": "Используйте <code class=\"text-blue-400\">args</code> для проверки аргументов команды",
210
341
  "howItWorks4": "Используйте <code class=\"text-blue-400\">variables</code> для проверки переменных графа",
211
- "examplesTitle": "📋 Примеры условий:",
342
+ "examplesTitle": "Примеры условий:",
212
343
  "exampleAdmin": "Остановиться только для админа:",
213
344
  "exampleCount": "Остановиться если число больше 10:",
214
345
  "exampleDebug": "Остановиться в режиме отладки:",
@@ -217,5 +348,73 @@
217
348
  "update": "Обновить",
218
349
  "add": "Добавить",
219
350
  "breakpoint": "брейкпоинт"
351
+ },
352
+ "debugStepInfo": {
353
+ "title": "Отладка",
354
+ "empty": "Запустите граф или включите тестовый режим — здесь появятся данные текущего шага.",
355
+ "stepNumber": "Шаг {{n}}",
356
+ "testStepNumber": "Тестовый шаг {{n}}",
357
+ "paused": "На паузе",
358
+ "controls": "Управление",
359
+ "whatIf": "Что если (изменить значения)",
360
+ "historyDepth": "Глубина истории:",
361
+ "unknown": "Неизвестно"
362
+ },
363
+ "eventNodes": {
364
+ "addPin": "Добавить пин",
365
+ "pinName": "Имя:",
366
+ "pinNamePlaceholder": "Имя пина",
367
+ "pinType": "Тип:",
368
+ "confirmPin": "Добавить",
369
+ "cancelPin": "Отмена",
370
+ "deletePin": "Удалить",
371
+ "eventName": "Имя события:",
372
+ "eventNamePlaceholder": "Моё событие",
373
+ "selectEvent": "Выбрать событие:",
374
+ "noEvents": "Нет доступных событий",
375
+ "selectEventPlaceholder": "Выберите событие..."
376
+ },
377
+ "testMode": {
378
+ "title": "Режим теста",
379
+ "description": "Запустить граф пошагово с эмулированным событием. Можно менять значения и откатываться назад.",
380
+ "startButton": "Запустить тест",
381
+ "exitButton": "Выйти из теста",
382
+ "running": "идёт",
383
+ "idle": "ожидание",
384
+ "startTitle": "Запуск тестового прогона",
385
+ "startRun": "Запустить",
386
+ "cancel": "Отмена",
387
+ "close": "Закрыть",
388
+ "eventTypeLabel": "Тип события",
389
+ "noFields": "Дополнительные данные не нужны",
390
+ "stepBack": "Назад",
391
+ "stepBackTitle": "Откатить на 1 шаг",
392
+ "step": "шаг {{n}}",
393
+ "runNodeTitle": "Запуск ноды изолированно",
394
+ "runSelectedNode": "Запустить эту ноду ({{type}})",
395
+ "runIsolated": "Запустить",
396
+ "noInputPins": "У этой ноды нет входных пинов с данными",
397
+ "valueOrJson": "значение или JSON",
398
+ "executed": "Выполнено",
399
+ "error": "Ошибка",
400
+ "outputs": "Выходы:",
401
+ "fields": {
402
+ "username": "Имя пользователя",
403
+ "message": "Сообщение",
404
+ "health": "Здоровье (0-20)",
405
+ "food": "Сытость (0-20)",
406
+ "commandArgsJson": "Аргументы команды (JSON)"
407
+ },
408
+ "events": {
409
+ "chat": "Сообщение в чате",
410
+ "playerJoined": "Игрок зашёл",
411
+ "playerLeft": "Игрок вышел",
412
+ "health": "Изменение здоровья",
413
+ "botDied": "Смерть бота",
414
+ "entitySpawn": "Появление сущности",
415
+ "entityGone": "Исчезновение сущности",
416
+ "botStartup": "Запуск бота",
417
+ "command": "Команда"
418
+ }
220
419
  }
221
420
  }
@@ -41,6 +41,8 @@
41
41
  "cmdk": "^1.1.1",
42
42
  "cron-parser": "^5.3.0",
43
43
  "diff": "^8.0.2",
44
+ "dompurify": "^3.3.3",
45
+ "github-markdown-css": "^5.9.0",
44
46
  "i18next": "^25.7.1",
45
47
  "i18next-browser-languagedetector": "^8.2.0",
46
48
  "i18next-http-backend": "^3.0.2",
package/nul ADDED
@@ -0,0 +1,12 @@
1
+ D\:\\webstormproject\\blockmine\\backend\\src\\core:
2
+ __tests__ GraphExecutionEngine.js PluginService.js
3
+ BotHistoryStore.js ipc PrismaService.js
4
+ BotManager.js MessageQueue.js services
5
+ BotManager.old.js node-registries services.js
6
+ BotProcess.js nodeRegistry system
7
+ BreakLoopSignal.js NodeRegistry.js TaskScheduler.js
8
+ commands nodes UserService.js
9
+ config PermissionManager.js utils
10
+ constants PluginHooks.js validation
11
+ DependencyService.js PluginLoader.js
12
+ EventGraphManager.js PluginManager.js
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "blockmine",
3
- "version": "1.25.0",
3
+ "version": "1.27.1",
4
4
  "description": "Мощная панель управления ботами для Майнкрафта.",
5
5
  "author": "merka",
6
6
  "license": "MIT",
@@ -25,7 +25,7 @@
25
25
  ],
26
26
  "scripts": {
27
27
  "dev": "concurrently \"npm run dev --workspace=backend\" \"npm run dev --workspace=frontend\"",
28
- "postinstall": "npm install --workspace=frontend --ignore-scripts && prisma generate --schema=./backend/prisma/schema.prisma",
28
+ "postinstall": "node scripts/postinstall.js",
29
29
  "build": "npm run build --workspace=frontend",
30
30
  "prepublishOnly": "npm run build",
31
31
  "prepare": "husky",
@@ -36,7 +36,7 @@
36
36
  },
37
37
  "dependencies": {
38
38
  "@monaco-editor/react": "^4.7.0",
39
- "@octokit/rest": "^22.0.1",
39
+ "@octokit/rest": "^20.1.1",
40
40
  "@prisma/client": "^5.14.0",
41
41
  "@radix-ui/react-icons": "^1.3.2",
42
42
  "adm-zip": "^0.5.16",
@@ -0,0 +1,38 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Postinstall script для blockmine
4
+ * Устанавливает зеркало Prisma для РФ и запускает установку
5
+ */
6
+
7
+ const { execSync } = require('child_process');
8
+
9
+ // Устанавливаем зеркало Prisma для РФ (если не установлено вручную)
10
+ if (!process.env.PRISMA_ENGINES_MIRROR) {
11
+ process.env.PRISMA_ENGINES_MIRROR = 'https://registry.npmmirror.com/-/binary/prisma/';
12
+ }
13
+ if (!process.env.PRISMA_BINARIES_MIRROR) {
14
+ process.env.PRISMA_BINARIES_MIRROR = 'https://registry.npmmirror.com/-/binary/prisma/';
15
+ }
16
+
17
+ console.log('[BlockMine] Running postinstall...');
18
+
19
+ try {
20
+ // Устанавливаем frontend зависимости без скриптов
21
+ console.log('[BlockMine] Installing frontend dependencies...');
22
+ execSync('npm install --workspace=frontend --ignore-scripts', {
23
+ stdio: 'inherit',
24
+ env: process.env
25
+ });
26
+
27
+ // Генерируем Prisma клиент с зеркалом
28
+ console.log('[BlockMine] Generating Prisma client...');
29
+ execSync('prisma generate --schema=./backend/prisma/schema.prisma', {
30
+ stdio: 'inherit',
31
+ env: process.env
32
+ });
33
+
34
+ console.log('[BlockMine] Postinstall completed successfully!');
35
+ } catch (error) {
36
+ console.error('[BlockMine] Postinstall failed:', error.message);
37
+ process.exit(1);
38
+ }