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.
- package/.claude/agents/code-architect.md +34 -0
- package/.claude/agents/code-explorer.md +51 -0
- package/.claude/agents/code-reviewer.md +46 -0
- package/.claude/commands/feature-dev.md +125 -0
- package/.claude/settings.json +1 -1
- package/.claude/settings.local.json +3 -1
- package/.claude/skills/frontend-design/SKILL.md +42 -0
- package/CHANGELOG.md +31 -16
- package/backend/prisma/migrations/20251116111851_add_execution_trace/migration.sql +22 -22
- package/backend/prisma/migrations/20251120154914_add_panel_api_keys/migration.sql +21 -21
- package/backend/prisma/migrations/20251121110241_add_proxy_table/migration.sql +45 -45
- package/backend/prisma/migrations/migration_lock.toml +2 -2
- package/backend/src/api/routes/auth.js +669 -669
- package/backend/src/api/routes/bots.js +2451 -2451
- package/backend/src/api/routes/panel.js +66 -66
- package/backend/src/api/routes/panelApiKeys.js +179 -179
- package/backend/src/api/routes/plugins.js +376 -376
- package/backend/src/api/routes/system.js +174 -174
- package/backend/src/core/EventGraphManager.js +194 -194
- package/backend/src/core/GraphExecutionEngine.js +28 -1
- package/backend/src/core/node-registries/actions.js +2 -2
- package/backend/src/core/nodes/actions/http_request.js +23 -4
- package/backend/src/core/nodes/actions/send_message.js +2 -12
- package/backend/src/core/nodes/data/string_literal.js +2 -13
- package/backend/src/core/services/BotLifecycleService.js +835 -835
- package/frontend/dist/assets/{index-B1serztM.js → index-DqzDkFsP.js} +185 -185
- package/frontend/dist/index.html +1 -1
- package/package.json +2 -1
- package/CLAUDE.md +0 -284
package/frontend/dist/index.html
CHANGED
|
@@ -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-
|
|
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.
|
|
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/`
|