blockmine 1.23.0 → 1.23.2

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 (29) hide show
  1. package/.claude/agents/code-architect.md +34 -0
  2. package/.claude/agents/code-explorer.md +51 -0
  3. package/.claude/agents/code-reviewer.md +46 -0
  4. package/.claude/commands/feature-dev.md +125 -0
  5. package/.claude/settings.json +1 -1
  6. package/.claude/settings.local.json +3 -1
  7. package/.claude/skills/frontend-design/SKILL.md +42 -0
  8. package/CHANGELOG.md +31 -16
  9. package/backend/prisma/migrations/20251116111851_add_execution_trace/migration.sql +22 -22
  10. package/backend/prisma/migrations/20251120154914_add_panel_api_keys/migration.sql +21 -21
  11. package/backend/prisma/migrations/20251121110241_add_proxy_table/migration.sql +45 -45
  12. package/backend/prisma/migrations/migration_lock.toml +2 -2
  13. package/backend/src/api/routes/auth.js +669 -669
  14. package/backend/src/api/routes/bots.js +2451 -2451
  15. package/backend/src/api/routes/panel.js +66 -66
  16. package/backend/src/api/routes/panelApiKeys.js +179 -179
  17. package/backend/src/api/routes/plugins.js +376 -376
  18. package/backend/src/api/routes/system.js +174 -174
  19. package/backend/src/core/EventGraphManager.js +194 -194
  20. package/backend/src/core/GraphExecutionEngine.js +28 -1
  21. package/backend/src/core/node-registries/actions.js +2 -2
  22. package/backend/src/core/nodes/actions/http_request.js +23 -4
  23. package/backend/src/core/nodes/actions/send_message.js +2 -12
  24. package/backend/src/core/nodes/data/string_literal.js +2 -13
  25. package/backend/src/core/services/BotLifecycleService.js +835 -835
  26. package/frontend/dist/assets/{index-B1serztM.js → index-DqzDkFsP.js} +185 -185
  27. package/frontend/dist/index.html +1 -1
  28. package/package.json +2 -1
  29. package/CLAUDE.md +0 -284
@@ -42,7 +42,7 @@
42
42
  <meta name="msapplication-TileColor" content="#da532c">
43
43
  <meta name="theme-color" content="#ffffff">
44
44
 
45
- <script type="module" crossorigin src="/assets/index-B1serztM.js"></script>
45
+ <script type="module" crossorigin src="/assets/index-DqzDkFsP.js"></script>
46
46
  <link rel="stylesheet" crossorigin href="/assets/index-t6K1u4OV.css">
47
47
  </head>
48
48
  <body>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "blockmine",
3
- "version": "1.23.0",
3
+ "version": "1.23.2",
4
4
  "description": "Мощная панель управления ботами для Майнкрафта.",
5
5
  "author": "merka",
6
6
  "license": "MIT",
@@ -40,6 +40,7 @@
40
40
  "@radix-ui/react-icons": "^1.3.2",
41
41
  "adm-zip": "^0.5.16",
42
42
  "archiver": "^7.0.1",
43
+ "awilix": "^12.0.5",
43
44
  "bcryptjs": "^2.4.3",
44
45
  "cmdk": "^1.1.1",
45
46
  "cron-parser": "^5.3.0",
package/CLAUDE.md DELETED
@@ -1,284 +0,0 @@
1
- # Документация для разработки BlockMine
2
-
3
-
4
- НИКОГДА НЕ ДОБАВЛЯЙ КОММЕНТАРИИ К ПОНЯТНОМУ КОДУ. router.use понятно что роутер подключает
5
- Старайся дополнять CLAUDE.md чем то новым и новыми функциями которые могут понадобится агентам
6
-
7
- Этот документ содержит инструкции для AI-ассистентов и разработчиков по работе с кодовой базой BlockMine.
8
-
9
- ## Содержание
10
-
11
- - [Добавление новых нод в визуальный редактор](#добавление-новых-нод-в-визуальный-редактор)
12
-
13
- ---
14
-
15
- ## Добавление новых нод в визуальный редактор
16
-
17
- Ноды в BlockMine состоят из двух частей: frontend (React/TypeScript) и backend (Node.js). Для добавления новой ноды необходимо внести изменения в оба места.
18
-
19
- ### 1. Frontend: Создание определения ноды
20
-
21
- Ноды организованы по категориям в директории `frontend/src/components/visual-editor/nodes/`.
22
-
23
- #### Пример: Нода события "При запуске бота"
24
-
25
- **Шаг 1: Создайте файл определения ноды**
26
-
27
- Создайте файл в соответствующей категории, например:
28
- ```
29
- frontend/src/components/visual-editor/nodes/event/eventBotStartup.js
30
- ```
31
-
32
- ```javascript
33
- import { NodeDefinition } from '../../core/registry';
34
-
35
- /**
36
- * Определение ноды event:botStartup
37
- * Срабатывает один раз при запуске бота
38
- */
39
- export const eventBotStartupDefinition = new NodeDefinition({
40
- type: 'event:botStartup', // Уникальный тип ноды (формат: category:name)
41
- category: 'event', // Категория для группировки в UI
42
- label: '🚀 При запуске бота', // Отображаемое название
43
- description: 'Срабатывает один раз при запуске бота',
44
-
45
- computeInputs: (data) => [], // Входные пины (можно вычислять динамически)
46
-
47
- computeOutputs: (data) => [ // Выходные пины
48
- { id: 'exec', name: 'Выполнить', type: 'Exec' },
49
- ],
50
-
51
- theme: { // Цветовая схема ноды
52
- headerColor: '#8b5cf6',
53
- accentColor: '#a78bfa',
54
- },
55
- });
56
-
57
- export default eventBotStartupDefinition;
58
- ```
59
-
60
- **Шаг 2: Экспортируйте из index.js категории**
61
-
62
- В файле `frontend/src/components/visual-editor/nodes/event/index.js`:
63
-
64
- ```javascript
65
- export { eventBotStartupDefinition } from './eventBotStartup';
66
- ```
67
-
68
- **Шаг 3: Зарегистрируйте ноду в главном реестре**
69
-
70
- В файле `frontend/src/components/visual-editor/nodes/index.js`:
71
-
72
- 1. Добавьте импорт:
73
- ```javascript
74
- import {
75
- eventCommandDefinition,
76
- eventBotStartupDefinition, // Добавить
77
- // ...
78
- } from './event';
79
- ```
80
-
81
- 2. Зарегистрируйте в функции `registerAllNodes()`:
82
- ```javascript
83
- export function registerAllNodes() {
84
- // ...
85
- // Event category
86
- NodeRegistry.register(eventCommandDefinition);
87
- NodeRegistry.register(eventBotStartupDefinition); // Добавить
88
- // ...
89
- }
90
- ```
91
-
92
- ### 2. Backend: Регистрация типа ноды
93
-
94
- **Шаг 1: Зарегистрируйте ноду в соответствующем registry файле**
95
-
96
- Найдите или создайте файл реестра для категории в `backend/src/core/node-registries/`.
97
-
98
- Для событий это файл `backend/src/core/node-registries/events.js`:
99
-
100
- ```javascript
101
- function registerNodes(registry) {
102
- // ... существующие ноды
103
-
104
- registry.registerNodeType({
105
- type: 'event:botStartup',
106
- label: '🚀 При запуске бота',
107
- category: 'События',
108
- description: 'Срабатывает один раз при запуске бота.',
109
- graphType: GRAPH_TYPES.EVENT,
110
- pins: {
111
- inputs: [],
112
- outputs: [
113
- { id: 'exec', name: 'Выполнить', type: 'Exec' },
114
- ]
115
- }
116
- });
117
- }
118
- ```
119
-
120
- ### 3. Backend: Добавление логики выполнения (для нод действий)
121
-
122
- Если нода выполняет какое-то действие (не события), необходимо создать обработчик в `backend/src/core/node-handlers/`.
123
-
124
- **Пример структуры обработчика:**
125
-
126
- ```javascript
127
- module.exports = async (nodeId, inputData, context) => {
128
- const { botManager, botId, state } = context;
129
-
130
- // Ваша логика здесь
131
-
132
- return {
133
- outputs: {
134
- result: 'значение',
135
- // ...
136
- }
137
- };
138
- };
139
- ```
140
-
141
- ### 4. Backend: Триггеры событий (для event нод)
142
-
143
- Если вы создаете event ноду, нужно добавить вызов события в соответствующем месте кода.
144
-
145
- **Пример: Событие запуска бота**
146
-
147
- В файле `backend/src/core/services/BotLifecycleService.js`, метод `_handleBotReady()`:
148
-
149
- ```javascript
150
- _handleBotReady(botId) {
151
- this.emitStatusUpdate(botId, 'running', 'Бот успешно подключился к серверу.');
152
- this.crashCounters.delete(botId);
153
-
154
- // ... Socket.IO код
155
-
156
- // Триггерим событие запуска бота
157
- if (this.eventGraphManager) {
158
- this.eventGraphManager.handleEvent(botId, 'botStartup', {});
159
- }
160
- }
161
- ```
162
-
163
- ### 5. Структура типов нод
164
-
165
- #### Типы пинов
166
-
167
- - **Exec** - пин выполнения (flow control)
168
- - **String** - строка
169
- - **Number** - число
170
- - **Boolean** - булево значение
171
- - **Object** - объект
172
- - **Array** - массив
173
- - **User** - объект пользователя
174
- - **Wildcard** - любой тип (динамический)
175
-
176
- #### Категории нод
177
-
178
- - **event** - События (триггеры графов)
179
- - **action** - Действия (отправка сообщений, HTTP запросы)
180
- - **flow** - Управление потоком (ветвления, циклы)
181
- - **data** - Данные (литералы, переменные)
182
- - **logic** - Логические операции
183
- - **math** - Математические операции
184
- - **string** - Операции со строками
185
- - **array** - Операции с массивами
186
- - **object** - Операции с объектами
187
- - **time** - Работа с датой/временем
188
- - **user** - Работа с пользователями
189
- - **bot** - Информация о боте
190
- - **debug** - Отладка
191
-
192
- ### 6. Ноды с настройками (Settings Component)
193
-
194
- Если нода требует UI для настроек, создайте компонент настроек:
195
-
196
- **Пример: StringLiteralSettings.jsx**
197
-
198
- ```javascript
199
- import React from 'react';
200
- import { AutosizeInput } from '@/components/ui/AutosizeInput';
201
-
202
- const StringLiteralSettings = ({ nodeId, data, updateNodeData }) => {
203
- return (
204
- <div className="p-2 w-full">
205
- <AutosizeInput
206
- className="nodrag bg-slate-900 border-slate-500 rounded-md py-1 px-2 text-sm resize-none overflow-hidden w-full"
207
- value={data.value ?? ''}
208
- onChange={(e) => updateNodeData(nodeId, { value: e.target.value })}
209
- placeholder="Привет, {username}!"
210
- />
211
- </div>
212
- );
213
- };
214
-
215
- export default StringLiteralSettings;
216
- ```
217
-
218
- Затем подключите его в определении ноды:
219
-
220
- ```javascript
221
- import StringLiteralSettings from './StringLiteralSettings';
222
-
223
- export const stringLiteralDefinition = new NodeDefinition({
224
- // ...
225
- SettingsComponent: StringLiteralSettings,
226
- // ...
227
- });
228
- ```
229
-
230
- ### 7. Динамические пины (computeInputs/computeOutputs)
231
-
232
- Ноды могут иметь динамическое количество пинов в зависимости от данных:
233
-
234
- ```javascript
235
- computeInputs: (data) => {
236
- const inputs = [
237
- { id: 'value', name: 'Текст', type: 'String', required: false, inlineField: true }
238
- ];
239
-
240
- // Динамически добавляем пины для переменных
241
- const text = data.value || '';
242
- const variablePattern = /\{([a-zA-Z_][a-zA-Z0-9_]*)\}/g;
243
- const matches = [...text.matchAll(variablePattern)];
244
- const uniqueVars = [...new Set(matches.map(m => m[1]))];
245
-
246
- uniqueVars.forEach(varName => {
247
- inputs.push({
248
- id: `var_${varName}`,
249
- name: varName,
250
- type: 'Wildcard',
251
- });
252
- });
253
-
254
- return inputs;
255
- },
256
- ```
257
-
258
- ### 8. Проверка работоспособности
259
-
260
- После добавления ноды:
261
-
262
- 1. Перезапустите frontend (если используете HMR, изменения применятся автоматически)
263
- 2. Перезапустите backend
264
- 3. Откройте визуальный редактор
265
- 4. Проверьте, что нода появилась в списке доступных нод
266
- 5. Создайте граф с новой нодой и протестируйте её работу
267
-
268
- ### 9. Автоматическое распознавание событий
269
-
270
- Система автоматически распознаёт event ноды при сохранении графа:
271
-
272
- - В файле `backend/src/api/routes/eventGraphs.js` код автоматически извлекает все ноды типа `event:*` из графа
273
- - Создаются соответствующие триггеры в таблице `EventGraphTrigger`
274
- - При загрузке графов для бота (`EventGraphManager.loadGraphsForBot`), графы группируются по типам событий
275
-
276
- Это означает, что для новых event нод не требуется дополнительная регистрация триггеров - достаточно правильно назвать тип ноды (формат: `event:название_события`).
277
-
278
- ---
279
-
280
- ## Дополнительные ресурсы
281
-
282
- - Примеры нод: `frontend/src/components/visual-editor/nodes/`
283
- - Обработчики нод: `backend/src/core/node-handlers/`
284
- - Регистрация нод: `backend/src/core/node-registries/`