blockmine 1.19.1 → 1.21.0
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/settings.local.json +23 -0
- package/CHANGELOG.md +23 -0
- package/backend/src/core/BotManager.js +34 -4
- package/backend/src/core/BotProcess.js +8 -0
- package/backend/src/core/BreakLoopSignal.js +8 -0
- package/backend/src/core/EventGraphManager.js +5 -0
- package/backend/src/core/GraphExecutionEngine.js +37 -629
- package/backend/src/core/NodeRegistry.js +146 -2
- package/backend/src/core/nodes/action_bot_look_at.js +36 -0
- package/backend/src/core/nodes/action_bot_set_variable.js +32 -0
- package/backend/src/core/nodes/action_http_request.js +98 -0
- package/backend/src/core/nodes/action_send_log.js +23 -0
- package/backend/src/core/nodes/action_send_message.js +32 -0
- package/backend/src/core/nodes/array_add_element.js +23 -0
- package/backend/src/core/nodes/array_contains.js +40 -0
- package/backend/src/core/nodes/array_find_index.js +23 -0
- package/backend/src/core/nodes/array_get_by_index.js +23 -0
- package/backend/src/core/nodes/array_get_random_element.js +32 -0
- package/backend/src/core/nodes/array_remove_by_index.js +30 -0
- package/backend/src/core/nodes/bot_get_position.js +20 -0
- package/backend/src/core/nodes/data_array_literal.js +31 -0
- package/backend/src/core/nodes/data_boolean_literal.js +21 -0
- package/backend/src/core/nodes/data_cast.js +34 -0
- package/backend/src/core/nodes/data_get_argument.js +23 -0
- package/backend/src/core/nodes/data_get_bot_look.js +14 -0
- package/backend/src/core/nodes/data_get_entity_field.js +18 -0
- package/backend/src/core/nodes/data_get_server_players.js +18 -0
- package/backend/src/core/nodes/data_get_user_field.js +40 -0
- package/backend/src/core/nodes/data_get_variable.js +23 -0
- package/backend/src/core/nodes/data_length.js +25 -0
- package/backend/src/core/nodes/data_make_object.js +31 -0
- package/backend/src/core/nodes/data_number_literal.js +21 -0
- package/backend/src/core/nodes/data_string_literal.js +34 -0
- package/backend/src/core/nodes/debug_log.js +16 -0
- package/backend/src/core/nodes/flow_branch.js +15 -0
- package/backend/src/core/nodes/flow_break.js +14 -0
- package/backend/src/core/nodes/flow_for_each.js +39 -0
- package/backend/src/core/nodes/flow_sequence.js +16 -0
- package/backend/src/core/nodes/flow_switch.js +47 -0
- package/backend/src/core/nodes/flow_while.js +64 -0
- package/backend/src/core/nodes/logic_compare.js +33 -0
- package/backend/src/core/nodes/logic_operation.js +35 -0
- package/backend/src/core/nodes/math_operation.js +31 -0
- package/backend/src/core/nodes/math_random_number.js +43 -0
- package/backend/src/core/nodes/object_create.js +40 -0
- package/backend/src/core/nodes/object_delete.js +26 -0
- package/backend/src/core/nodes/object_get.js +23 -0
- package/backend/src/core/nodes/object_has_key.js +30 -0
- package/backend/src/core/nodes/object_set.js +27 -0
- package/backend/src/core/nodes/string_concat.js +27 -0
- package/backend/src/core/nodes/string_contains.js +41 -0
- package/backend/src/core/nodes/string_ends_with.js +43 -0
- package/backend/src/core/nodes/string_equals.js +36 -0
- package/backend/src/core/nodes/string_length.js +36 -0
- package/backend/src/core/nodes/string_matches.js +39 -0
- package/backend/src/core/nodes/string_split.js +37 -0
- package/backend/src/core/nodes/string_starts_with.js +43 -0
- package/backend/src/core/nodes/user_check_blacklist.js +37 -0
- package/backend/src/core/nodes/user_get_groups.js +36 -0
- package/backend/src/core/nodes/user_get_permissions.js +36 -0
- package/backend/src/core/nodes/user_set_blacklist.js +37 -0
- package/frontend/dist/assets/index-B9GedHEa.js +8352 -0
- package/frontend/dist/assets/index-zLiy9MDx.css +1 -0
- package/frontend/dist/index.html +2 -2
- package/frontend/package.json +1 -0
- package/nul +0 -0
- package/package.json +1 -1
- package/.kiro/steering/product.md +0 -27
- package/.kiro/steering/structure.md +0 -89
- package/.kiro/steering/tech.md +0 -94
- package/frontend/dist/assets/index-BFd7YoAj.css +0 -1
- package/frontend/dist/assets/index-DxdxTe6I.js +0 -8352
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
{
|
|
2
|
+
"permissions": {
|
|
3
|
+
"allow": [
|
|
4
|
+
"Bash(netstat:*)",
|
|
5
|
+
"Bash(findstr:*)",
|
|
6
|
+
"WebSearch",
|
|
7
|
+
"Bash(git checkout:*)",
|
|
8
|
+
"mcp__chrome-devtools__list_console_messages",
|
|
9
|
+
"mcp__chrome-devtools__take_screenshot",
|
|
10
|
+
"mcp__chrome-devtools__take_snapshot",
|
|
11
|
+
"mcp__chrome-devtools__evaluate_script",
|
|
12
|
+
"mcp__chrome-devtools__navigate_page",
|
|
13
|
+
"mcp__chrome-devtools__wait_for",
|
|
14
|
+
"mcp__chrome-devtools__get_console_message",
|
|
15
|
+
"Bash(timeout /t 2 /nobreak)",
|
|
16
|
+
"mcp__chrome-devtools__list_network_requests",
|
|
17
|
+
"WebFetch(domain:localhost)",
|
|
18
|
+
"WebFetch(domain:github.com)"
|
|
19
|
+
],
|
|
20
|
+
"deny": [],
|
|
21
|
+
"ask": []
|
|
22
|
+
}
|
|
23
|
+
}
|
package/CHANGELOG.md
CHANGED
|
@@ -1,6 +1,29 @@
|
|
|
1
1
|
# История версий
|
|
2
2
|
|
|
3
3
|
|
|
4
|
+
## [1.21.0](https://github.com/blockmineJS/blockmine/compare/v1.20.0...v1.21.0) (2025-10-26)
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
### 🛠 Рефакторинг
|
|
8
|
+
|
|
9
|
+
* [graph-system] все ноды отрефакторены и перенесены. [@claude](https://github.com/claude) author ([55db1b8](https://github.com/blockmineJS/blockmine/commit/55db1b89dbe470691db129a72c7efe55030acfa6))
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
### ✨ Новые возможности
|
|
13
|
+
|
|
14
|
+
* [graph-system] пкм. по названию переменной можно найти - Получить/Установить переменную ([83b822f](https://github.com/blockmineJS/blockmine/commit/83b822ff1d278dfb9e280909c81ab32fd0e58bc3))
|
|
15
|
+
* [graph-system] конвертация нод при подключения не к тем типам ([03deac8](https://github.com/blockmineJS/blockmine/commit/03deac83c9468199a8f6ae2b2480248c52a39e57))
|
|
16
|
+
* добавление виртуализации для списков плагинов и ботов ([ea7746f](https://github.com/blockmineJS/blockmine/commit/ea7746f5c7f05ed74e6893bb27774d8541e0c57f))
|
|
17
|
+
* новая нода для http запросов ([3565d06](https://github.com/blockmineJS/blockmine/commit/3565d06bff419c2d2665eba719a4c94696db00ae))
|
|
18
|
+
|
|
19
|
+
## [1.20.0](https://github.com/blockmineJS/blockmine/compare/v1.19.1...v1.20.0) (2025-10-23)
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
### ✨ Новые возможности
|
|
23
|
+
|
|
24
|
+
* если бот падает 5 раз с критической ошибкой, то перезапуск отменяется ([2ba022f](https://github.com/blockmineJS/blockmine/commit/2ba022fff038cc83bb1edfa04d3edf97fc76c255))
|
|
25
|
+
* action:send_message to support dynamic variables. example. Сообщение: привет, {username} ([457639d](https://github.com/blockmineJS/blockmine/commit/457639d70e7a8933f0508d93196a2be6951f1a0a))
|
|
26
|
+
|
|
4
27
|
### [1.19.1](https://github.com/blockmineJS/blockmine/compare/v1.19.0...v1.19.1) (2025-10-01)
|
|
5
28
|
|
|
6
29
|
|
|
@@ -52,6 +52,7 @@ class BotManager {
|
|
|
52
52
|
this.playerListCache = new Map();
|
|
53
53
|
this.eventGraphManager = null;
|
|
54
54
|
this.uiSubscriptions = new Map();
|
|
55
|
+
this.crashCounters = new Map();
|
|
55
56
|
|
|
56
57
|
getInstanceId();
|
|
57
58
|
setInterval(() => this.updateAllResourceUsage(), 5000);
|
|
@@ -393,7 +394,13 @@ class BotManager {
|
|
|
393
394
|
|
|
394
395
|
const fullBotConfig = { ...decryptedConfig, plugins: sortedPlugins };
|
|
395
396
|
const botProcessPath = path.resolve(__dirname, 'BotProcess.js');
|
|
396
|
-
const child = fork(botProcessPath, [], {
|
|
397
|
+
const child = fork(botProcessPath, [], {
|
|
398
|
+
stdio: ['pipe', 'pipe', 'pipe', 'ipc'],
|
|
399
|
+
env: {
|
|
400
|
+
...process.env,
|
|
401
|
+
NODE_PATH: path.resolve(__dirname, '../../../node_modules')
|
|
402
|
+
}
|
|
403
|
+
});
|
|
397
404
|
|
|
398
405
|
child.botConfig = botConfig;
|
|
399
406
|
|
|
@@ -440,6 +447,7 @@ class BotManager {
|
|
|
440
447
|
break;
|
|
441
448
|
case 'bot_ready':
|
|
442
449
|
this.emitStatusUpdate(botId, 'running', 'Бот успешно подключился к серверу.');
|
|
450
|
+
this.crashCounters.delete(botId);
|
|
443
451
|
break;
|
|
444
452
|
case 'validate_and_run_command':
|
|
445
453
|
await this.handleCommandValidation(botConfig, message);
|
|
@@ -527,13 +535,35 @@ class BotManager {
|
|
|
527
535
|
this.bots.delete(botId);
|
|
528
536
|
this.resourceUsage.delete(botId);
|
|
529
537
|
this.botConfigs.delete(botId);
|
|
530
|
-
|
|
538
|
+
|
|
531
539
|
this.emitStatusUpdate(botId, 'stopped', `Процесс завершился с кодом ${code} (сигнал: ${signal || 'none'}).`);
|
|
532
540
|
this.updateAllResourceUsage();
|
|
533
541
|
|
|
534
542
|
if (code === 1) {
|
|
535
|
-
|
|
536
|
-
|
|
543
|
+
const MAX_RESTART_ATTEMPTS = 5;
|
|
544
|
+
const RESTART_COOLDOWN = 60000;
|
|
545
|
+
|
|
546
|
+
const counter = this.crashCounters.get(botId) || { count: 0, firstCrash: Date.now() };
|
|
547
|
+
const timeSinceFirstCrash = Date.now() - counter.firstCrash;
|
|
548
|
+
|
|
549
|
+
if (timeSinceFirstCrash > RESTART_COOLDOWN) {
|
|
550
|
+
counter.count = 0;
|
|
551
|
+
counter.firstCrash = Date.now();
|
|
552
|
+
}
|
|
553
|
+
|
|
554
|
+
counter.count++;
|
|
555
|
+
this.crashCounters.set(botId, counter);
|
|
556
|
+
|
|
557
|
+
if (counter.count >= MAX_RESTART_ATTEMPTS) {
|
|
558
|
+
console.log(`[BotManager] Бот ${botId} упал ${counter.count} раз подряд. Автоперезапуск остановлен.`);
|
|
559
|
+
this.appendLog(botId, `[SYSTEM] Обнаружено ${counter.count} критических ошибок подряд.`);
|
|
560
|
+
this.appendLog(botId, `[SYSTEM] Исправьте проблему и запустите бота вручную.`);
|
|
561
|
+
this.crashCounters.delete(botId);
|
|
562
|
+
return;
|
|
563
|
+
}
|
|
564
|
+
|
|
565
|
+
console.log(`[BotManager] Обнаружена ошибка с кодом 1 для бота ${botId}. Попытка ${counter.count}/${MAX_RESTART_ATTEMPTS}. Перезапуск через 5 секунд...`);
|
|
566
|
+
this.appendLog(botId, `[SYSTEM] Обнаружена критическая ошибка, перезапуск через 5 секунд... (попытка ${counter.count}/${MAX_RESTART_ATTEMPTS})`);
|
|
537
567
|
setTimeout(() => {
|
|
538
568
|
console.log(`[BotManager] Перезапуск бота ${botId}...`);
|
|
539
569
|
this.startBot(botConfig);
|
|
@@ -606,6 +606,14 @@ process.on('message', async (message) => {
|
|
|
606
606
|
sendEvent('botDied', { user: { username: bot.username } });
|
|
607
607
|
});
|
|
608
608
|
|
|
609
|
+
bot.on('health', () => {
|
|
610
|
+
sendEvent('health', {
|
|
611
|
+
health: bot.health,
|
|
612
|
+
food: bot.food,
|
|
613
|
+
saturation: bot.foodSaturation
|
|
614
|
+
});
|
|
615
|
+
});
|
|
616
|
+
|
|
609
617
|
bot.on('kicked', (reason) => {
|
|
610
618
|
let reasonText;
|
|
611
619
|
try { reasonText = JSON.parse(reason).text || reason; } catch (e) { reasonText = reason; }
|
|
@@ -173,6 +173,11 @@ class EventGraphManager {
|
|
|
173
173
|
case 'botDied':
|
|
174
174
|
context.user = args.user;
|
|
175
175
|
break;
|
|
176
|
+
case 'health':
|
|
177
|
+
context.health = args.health;
|
|
178
|
+
context.food = args.food;
|
|
179
|
+
context.saturation = args.saturation;
|
|
180
|
+
break;
|
|
176
181
|
case 'tick':
|
|
177
182
|
break;
|
|
178
183
|
case 'entitySpawn':
|