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
@@ -48,7 +48,7 @@
48
48
  },
49
49
 
50
50
  "flow:for_each": {
51
- "label": "🔁 Перебор массива (цикл)",
51
+ "label": "Перебор массива (цикл)",
52
52
  "description": "Выполняет \"Тело цикла\" для каждого элемента в \"Массиве\"",
53
53
  "pins": {
54
54
  "loop_body": "Тело цикла",
@@ -59,7 +59,7 @@
59
59
  },
60
60
 
61
61
  "flow:while": {
62
- "label": "🔁 Цикл While",
62
+ "label": "Цикл While",
63
63
  "description": "Выполняет \"Тело цикла\" пока условие истинно",
64
64
  "pins": {
65
65
  "condition": "Условие",
@@ -70,12 +70,12 @@
70
70
  },
71
71
 
72
72
  "flow:break": {
73
- "label": "🛑 Выйти из цикла",
73
+ "label": "Выйти из цикла",
74
74
  "description": "Немедленно прерывает выполнение цикла (For Each Loop) и передает управление на его выход Completed"
75
75
  },
76
76
 
77
77
  "flow:delay": {
78
- "label": "⏱️ Задержка",
78
+ "label": "Задержка",
79
79
  "description": "Ожидает указанное количество миллисекунд, затем продолжает выполнение",
80
80
  "pins": {
81
81
  "delay": "Задержка (мс)",
@@ -127,7 +127,7 @@
127
127
  },
128
128
 
129
129
  "data:number_literal": {
130
- "label": "🔢 Число",
130
+ "label": "Число",
131
131
  "description": "Простое числовое значение."
132
132
  },
133
133
 
@@ -240,7 +240,7 @@
240
240
  },
241
241
 
242
242
  "math:random_number": {
243
- "label": "🎲 Случайное число",
243
+ "label": "Случайное число",
244
244
  "description": "Генерирует случайное число в заданном диапазоне",
245
245
  "pins": {
246
246
  "min": "Мин",
@@ -461,7 +461,7 @@
461
461
  },
462
462
 
463
463
  "action:send_message": {
464
- "label": "🗣️ Отправить сообщение",
464
+ "label": "Отправить сообщение",
465
465
  "description": "Отправляет сообщение в чат. Поддерживает переменные в формате {varName}",
466
466
  "pins": {
467
467
  "chat_type": "Тип чата",
@@ -491,7 +491,7 @@
491
491
  },
492
492
 
493
493
  "action:send_log": {
494
- "label": "📝 Лог",
494
+ "label": "Лог",
495
495
  "description": "Отправляет сообщение в логи бота"
496
496
  },
497
497
 
@@ -505,7 +505,7 @@
505
505
  },
506
506
 
507
507
  "action:bot_look_at": {
508
- "label": "👀 Смотреть на",
508
+ "label": "Смотреть на",
509
509
  "description": "Поворачивает голову бота на цель",
510
510
  "pins": {
511
511
  "target": "Цель",
@@ -529,17 +529,71 @@
529
529
 
530
530
  "action:create_command": {
531
531
  "label": "Создать команду",
532
- "description": "Создаёт новую команду"
532
+ "description": "Создаёт новую команду",
533
+ "pins": {
534
+ "exec": "Выполнить",
535
+ "name": "Имя команды",
536
+ "description": "Описание",
537
+ "aliases": "Алиасы",
538
+ "cooldown": "Кулдаун (сек)",
539
+ "allowedChatTypes": "Типы чата",
540
+ "permissionName": "Название права",
541
+ "temporary": "Временная?",
542
+ "commandId": "ID команды",
543
+ "success": "Успешно?"
544
+ },
545
+ "placeholders": {
546
+ "name": "моя-команда",
547
+ "description": "Описание команды",
548
+ "aliases": "[\"алиас1\", \"алиас2\"]",
549
+ "cooldown": "0",
550
+ "allowedChatTypes": "[\"chat\", \"private\"]",
551
+ "permissionName": "модератор"
552
+ },
553
+ "options": {
554
+ "temporary": {
555
+ "false": "Постоянная",
556
+ "true": "Временная"
557
+ }
558
+ }
533
559
  },
534
560
 
535
561
  "action:update_command": {
536
562
  "label": "Обновить команду",
537
- "description": "Обновляет существующую команду"
563
+ "description": "Обновляет существующую команду",
564
+ "pins": {
565
+ "exec": "Выполнить",
566
+ "commandName": "Имя команды",
567
+ "newName": "Новое имя",
568
+ "description": "Описание",
569
+ "aliases": "Алиасы",
570
+ "cooldown": "Кулдаун (сек)",
571
+ "allowedChatTypes": "Типы чата",
572
+ "permissionName": "Название права",
573
+ "success": "Успешно?"
574
+ },
575
+ "placeholders": {
576
+ "commandName": "моя-команда",
577
+ "newName": "новая-команда",
578
+ "description": "Новое описание команды",
579
+ "aliases": "[\"алиас1\", \"алиас2\"]",
580
+ "cooldown": "0",
581
+ "allowedChatTypes": "[\"chat\", \"private\"]",
582
+ "permissionName": "модератор"
583
+ }
538
584
  },
539
585
 
540
586
  "action:delete_command": {
541
587
  "label": "Удалить команду",
542
- "description": "Удаляет команду"
588
+ "description": "Удаляет команду",
589
+ "pins": {
590
+ "exec": "Выполнить",
591
+ "commandName": "Имя команды",
592
+ "success": "Успешно?"
593
+ },
594
+ "placeholders": {
595
+ "commandName": "моя-команда"
596
+ }
543
597
  },
544
598
 
545
599
  "time:datetime_literal": {
@@ -645,7 +699,7 @@
645
699
  },
646
700
 
647
701
  "event:command": {
648
- "label": "▶️ При выполнении команды",
702
+ "label": "При выполнении команды",
649
703
  "description": "Стартовая точка для графа команды",
650
704
  "pins": {
651
705
  "command_name": "Имя команды",
@@ -658,7 +712,7 @@
658
712
  },
659
713
 
660
714
  "event:chat": {
661
- "label": "💬 Сообщение в чате",
715
+ "label": "Сообщение в чате",
662
716
  "description": "Срабатывает, когда в чат приходит сообщение",
663
717
  "pins": {
664
718
  "username": "Игрок",
@@ -668,57 +722,57 @@
668
722
  },
669
723
 
670
724
  "event:raw_message": {
671
- "label": "📨 Сырое сообщение",
725
+ "label": "Сырое сообщение",
672
726
  "description": "Срабатывает при получении любого сообщения"
673
727
  },
674
728
 
675
729
  "event:player_joined": {
676
- "label": "👋 Игрок зашёл",
730
+ "label": "Игрок зашёл",
677
731
  "description": "Срабатывает когда игрок заходит на сервер"
678
732
  },
679
733
 
680
734
  "event:player_left": {
681
- "label": "👋 Игрок вышел",
735
+ "label": "Игрок вышел",
682
736
  "description": "Срабатывает когда игрок выходит с сервера"
683
737
  },
684
738
 
685
739
  "event:entity_spawn": {
686
- "label": "🐾 Сущность появилась",
740
+ "label": "Сущность появилась",
687
741
  "description": "Срабатывает при появлении сущности"
688
742
  },
689
743
 
690
744
  "event:entity_moved": {
691
- "label": "🏃 Сущность двигается",
745
+ "label": "Сущность двигается",
692
746
  "description": "Срабатывает при движении сущности"
693
747
  },
694
748
 
695
749
  "event:entity_gone": {
696
- "label": "💨 Сущность исчезла",
750
+ "label": "Сущность исчезла",
697
751
  "description": "Срабатывает когда сущность пропадает"
698
752
  },
699
753
 
700
754
  "event:bot_died": {
701
- "label": "💀 Бот умер",
755
+ "label": "Бот умер",
702
756
  "description": "Срабатывает когда бот умирает"
703
757
  },
704
758
 
705
759
  "event:bot_startup": {
706
- "label": "🚀 Запуск бота",
760
+ "label": "Запуск бота",
707
761
  "description": "Срабатывает при запуске бота"
708
762
  },
709
763
 
710
764
  "event:health": {
711
- "label": "❤️ Здоровье",
765
+ "label": "Здоровье",
712
766
  "description": "Срабатывает при изменении здоровья"
713
767
  },
714
768
 
715
769
  "event:websocket_call": {
716
- "label": "🔌 WebSocket вызов",
770
+ "label": "WebSocket вызов",
717
771
  "description": "Срабатывает при WebSocket вызове"
718
772
  },
719
773
 
720
774
  "inventory:get_all": {
721
- "label": "📦 Весь инвентарь",
775
+ "label": "Весь инвентарь",
722
776
  "description": "Возвращает весь инвентарь бота как массив предметов",
723
777
  "pins": {
724
778
  "items": "Предметы",
@@ -729,7 +783,7 @@
729
783
  },
730
784
 
731
785
  "inventory:find_item": {
732
- "label": "🔍 Найти предмет",
786
+ "label": "Найти предмет",
733
787
  "description": "Находит предмет в инвентаре",
734
788
  "pins": {
735
789
  "itemName": "Имя предмета",
@@ -744,7 +798,7 @@
744
798
  },
745
799
 
746
800
  "inventory:count_item": {
747
- "label": "🔢 Подсчитать предметы",
801
+ "label": "Подсчитать предметы",
748
802
  "description": "Подсчитывает количество предметов",
749
803
  "pins": {
750
804
  "itemName": "Имя предмета",
@@ -755,7 +809,7 @@
755
809
  },
756
810
 
757
811
  "inventory:has_item": {
758
- "label": "Есть предмет?",
812
+ "label": "Есть предмет?",
759
813
  "description": "Проверяет наличие предмета",
760
814
  "pins": {
761
815
  "itemName": "Имя предмета",
@@ -770,7 +824,7 @@
770
824
  },
771
825
 
772
826
  "inventory:get_slot": {
773
- "label": "📍 Получить слот",
827
+ "label": "Получить слот",
774
828
  "description": "Получает предмет из слота",
775
829
  "pins": {
776
830
  "slotNumber": "Номер слота",
@@ -783,7 +837,7 @@
783
837
  },
784
838
 
785
839
  "inventory:get_held_item": {
786
- "label": "Предмет в руке",
840
+ "label": "Предмет в руке",
787
841
  "description": "Возвращает предмет в руке",
788
842
  "pins": {
789
843
  "hand": "Рука",
@@ -800,7 +854,7 @@
800
854
  },
801
855
 
802
856
  "inventory:equip": {
803
- "label": "🛡️ Экипировать",
857
+ "label": "Экипировать",
804
858
  "description": "Экипирует предмет",
805
859
  "pins": {
806
860
  "itemName": "Предмет",
@@ -813,7 +867,7 @@
813
867
  },
814
868
 
815
869
  "inventory:drop": {
816
- "label": "🗑️ Выбросить",
870
+ "label": "Выбросить",
817
871
  "description": "Выбрасывает предмет",
818
872
  "pins": {
819
873
  "itemName": "Предмет",
@@ -828,7 +882,7 @@
828
882
  },
829
883
 
830
884
  "inventory:select_slot": {
831
- "label": "👆 Выбрать слот",
885
+ "label": "Выбрать слот",
832
886
  "description": "Выбирает слот в хотбаре",
833
887
  "pins": {
834
888
  "slot": "Слот",
@@ -839,7 +893,7 @@
839
893
  },
840
894
 
841
895
  "navigation:go_to": {
842
- "label": "🚶 Идти к",
896
+ "label": "Идти к",
843
897
  "description": "Перемещает бота к указанным координатам используя pathfinding",
844
898
  "pins": {
845
899
  "range": "Радиус",
@@ -851,7 +905,7 @@
851
905
  },
852
906
 
853
907
  "navigation:go_to_player": {
854
- "label": "🚶 Идти к игроку",
908
+ "label": "Идти к игроку",
855
909
  "description": "Перемещает бота к игроку",
856
910
  "pins": {
857
911
  "playerName": "Имя игрока",
@@ -866,7 +920,7 @@
866
920
  },
867
921
 
868
922
  "navigation:go_to_entity": {
869
- "label": "🚶 Идти к сущности",
923
+ "label": "Идти к сущности",
870
924
  "description": "Перемещает бота к сущности",
871
925
  "pins": {
872
926
  "entity": "Сущность",
@@ -879,7 +933,7 @@
879
933
  },
880
934
 
881
935
  "navigation:follow": {
882
- "label": "🚶 Следовать",
936
+ "label": "Следовать",
883
937
  "description": "Бот следует за целью",
884
938
  "pins": {
885
939
  "target": "Цель",
@@ -892,12 +946,12 @@
892
946
  },
893
947
 
894
948
  "navigation:stop": {
895
- "label": "🛑 Остановить движение",
949
+ "label": "Остановить движение",
896
950
  "description": "Останавливает движение бота"
897
951
  },
898
952
 
899
953
  "container:open": {
900
- "label": "📦 Контейнер: открыть",
954
+ "label": "Контейнер: открыть",
901
955
  "description": "Открывает контейнер (сундук, бочку) по координатам",
902
956
  "pins": {
903
957
  "x": "X",
@@ -916,12 +970,12 @@
916
970
  },
917
971
 
918
972
  "container:close": {
919
- "label": "📦 Контейнер: закрыть",
973
+ "label": "Контейнер: закрыть",
920
974
  "description": "Закрывает открытый контейнер"
921
975
  },
922
976
 
923
977
  "container:get_items": {
924
- "label": "📦 Предметы контейнера",
978
+ "label": "Предметы контейнера",
925
979
  "description": "Получает список предметов из открытого контейнера",
926
980
  "pins": {
927
981
  "container": "Контейнер",
@@ -934,7 +988,7 @@
934
988
  },
935
989
 
936
990
  "container:deposit": {
937
- "label": "📥 Положить в контейнер",
991
+ "label": "Положить в контейнер",
938
992
  "description": "Кладёт предмет из инвентаря в открытый контейнер",
939
993
  "pins": {
940
994
  "itemName": "Предмет",
@@ -949,7 +1003,7 @@
949
1003
  },
950
1004
 
951
1005
  "container:withdraw": {
952
- "label": "📤 Взять из контейнера",
1006
+ "label": "Взять из контейнера",
953
1007
  "description": "Забирает предмет из контейнера в инвентарь",
954
1008
  "pins": {
955
1009
  "itemName": "Предмет",
@@ -964,7 +1018,7 @@
964
1018
  },
965
1019
 
966
1020
  "container:deposit_all": {
967
- "label": "📥 Положить всё",
1021
+ "label": "Положить всё",
968
1022
  "description": "Кладёт все предметы (или определённого типа) в контейнер",
969
1023
  "pins": {
970
1024
  "itemName": "Предмет",
@@ -977,7 +1031,7 @@
977
1031
  },
978
1032
 
979
1033
  "container:find_item": {
980
- "label": "🔍 Найти в контейнере",
1034
+ "label": "Найти в контейнере",
981
1035
  "description": "Ищет предмет в открытом контейнере",
982
1036
  "pins": {
983
1037
  "itemName": "Предмет",
@@ -994,7 +1048,7 @@
994
1048
  },
995
1049
 
996
1050
  "furnace:open": {
997
- "label": "🔥 Печка: открыть",
1051
+ "label": "Печка: открыть",
998
1052
  "description": "Открывает печку (обычную, плавильную, коптильню) по координатам",
999
1053
  "pins": {
1000
1054
  "x": "X",
@@ -1013,12 +1067,12 @@
1013
1067
  },
1014
1068
 
1015
1069
  "furnace:close": {
1016
- "label": "🔥 Печка: закрыть",
1070
+ "label": "Печка: закрыть",
1017
1071
  "description": "Закрывает печку"
1018
1072
  },
1019
1073
 
1020
1074
  "furnace:put_input": {
1021
- "label": "🔥 Печка: положить ресурс",
1075
+ "label": "Печка: положить ресурс",
1022
1076
  "description": "Кладёт предмет в слот плавки печки",
1023
1077
  "pins": {
1024
1078
  "itemName": "Предмет",
@@ -1031,7 +1085,7 @@
1031
1085
  },
1032
1086
 
1033
1087
  "furnace:put_fuel": {
1034
- "label": "🔥 Печка: положить топливо",
1088
+ "label": "Печка: положить топливо",
1035
1089
  "description": "Кладёт топливо в слот топлива печки",
1036
1090
  "pins": {
1037
1091
  "itemName": "Топливо",
@@ -1044,7 +1098,7 @@
1044
1098
  },
1045
1099
 
1046
1100
  "furnace:take_output": {
1047
- "label": "🔥 Печка: забрать",
1101
+ "label": "Печка: забрать",
1048
1102
  "description": "Забирает готовый предмет из слота результата печки",
1049
1103
  "pins": {
1050
1104
  "item": "Предмет",
@@ -1057,7 +1111,7 @@
1057
1111
  },
1058
1112
 
1059
1113
  "furnace:get_status": {
1060
- "label": "🔥 Печка: статус",
1114
+ "label": "Печка: статус",
1061
1115
  "description": "Получает текущий статус печки (топливо, прогресс, предметы в слотах)",
1062
1116
  "pins": {
1063
1117
  "inputItem": "Ресурс",
@@ -7,6 +7,7 @@
7
7
  "actions": {
8
8
  "checkUpdates": "Проверить обновления",
9
9
  "installLocal": "Установить локально",
10
+ "installGithub": "Установить с GitHub",
10
11
  "createPlugin": "Создать плагин",
11
12
  "install": "Установить",
12
13
  "uninstall": "Удалить",
@@ -71,10 +72,104 @@
71
72
  "deleting": "Удаление..."
72
73
  },
73
74
  "localInstall": {
74
- "title": "Установка локального плагина",
75
- "description": "Введите путь к папке плагина на сервере",
76
- "pathLabel": "Путь к плагину",
77
- "pathPlaceholder": "/путь/к/папке/плагина",
75
+ "title": "Установить плагин локально",
76
+ "description": "Укажите полный путь к папке с плагином на сервере, где запущена панель. Папка должна содержать валидный package.json.",
77
+ "pathLabel": "Путь к папке плагина",
78
+ "pathPlaceholder": "Например, /home/user/my-bot-plugins/super-plugin",
79
+ "install": "Установить"
80
+ },
81
+ "settingsDialog": {
82
+ "title": "Плагин: {{name}}",
83
+ "description": "Управление настройками и информацией о плагине",
84
+ "emptySettings": "У этого плагина нет настроек.",
85
+ "clearData": "Очистить данные",
86
+ "selectPlaceholder": "Выберите значение",
87
+ "unknownSettingType": "Неизвестный тип настройки: {{type}}",
88
+ "confirmClearData": "Вы уверены, что хотите удалить все данные плагина \"{{name}}\"? Это действие необратимо.",
89
+ "confirmDeleteKey": "Удалить ключ \"{{key}}\"?",
90
+ "tabs": {
91
+ "settings": "Настройки",
92
+ "data": "Данные",
93
+ "info": "Информация"
94
+ },
95
+ "jsonEditor": {
96
+ "title": "Редактор конфигурации JSON",
97
+ "description": "Внесите изменения и сохраните.",
98
+ "descriptionWithSyntax": "Внесите изменения и сохраните. Редактор подсветит синтаксические ошибки.",
99
+ "invalidJson": "Ошибка: Невалидный JSON. Проверьте синтаксис.",
100
+ "apply": "Применить",
101
+ "applyAndSave": "Применить и сохранить"
102
+ },
103
+ "proxy": {
104
+ "selectPlaceholder": "Выберите прокси",
105
+ "none": "Без прокси",
106
+ "custom": "Настроить вручную",
107
+ "host": "Хост",
108
+ "port": "Порт",
109
+ "type": "Тип",
110
+ "username": "Имя пользователя",
111
+ "password": "Пароль",
112
+ "optional": "Опционально"
113
+ },
114
+ "permissions": {
115
+ "addEntries": "Недостаточно прав для добавления записей",
116
+ "generic": "Недостаточно прав",
117
+ "editData": "Недостаточно прав для изменения данных",
118
+ "save": "Недостаточно прав для сохранения настроек"
119
+ },
120
+ "validation": {
121
+ "emptyKey": "Ключ не может быть пустым",
122
+ "invalidJsonValue": "Значение должно быть валидным JSON"
123
+ },
124
+ "data": {
125
+ "searchPlaceholder": "Поиск по ключу",
126
+ "refresh": "Обновить",
127
+ "addEntry": "Добавить запись",
128
+ "empty": "Нет данных",
129
+ "editEntry": "Редактировать запись",
130
+ "newEntry": "Новая запись",
131
+ "editEntryDescription": "Измените JSON значение и сохраните.",
132
+ "newEntryDescription": "Укажите ключ и JSON значение.",
133
+ "keyLabel": "Ключ",
134
+ "keyPlaceholder": "Например, state",
135
+ "jsonValue": "JSON значение",
136
+ "columns": {
137
+ "key": "Ключ",
138
+ "updated": "Обновлено",
139
+ "actions": "Действия"
140
+ }
141
+ },
142
+ "toasts": {
143
+ "savedSettings": "Настройки плагина сохранены.",
144
+ "clearedData": "Данные плагина успешно очищены.",
145
+ "entryDeleted": "Запись удалена",
146
+ "entrySaved": "Запись сохранена"
147
+ },
148
+ "loadError": "Не удалось загрузить настройки плагина."
149
+ },
150
+ "githubInstall": {
151
+ "title": "Установка с GitHub",
152
+ "description": "Вставьте ссылку на публичный GitHub-репозиторий. В нем должен быть валидный package.json плагина.",
153
+ "previewStepDescription": "Проверьте репозиторий, при необходимости выберите версию и установите плагин.",
154
+ "urlLabel": "URL репозитория",
155
+ "urlPlaceholder": "https://github.com/owner/repository",
156
+ "urlHint": "Вставьте прямую ссылку на GitHub-репозиторий. Предпросмотр откроется на следующем шаге.",
157
+ "loadPreview": "Загрузить предпросмотр",
158
+ "loadingPreview": "Загрузка предпросмотра...",
159
+ "continue": "Далее",
160
+ "back": "Назад",
161
+ "previewTitle": "Предпросмотр репозитория",
162
+ "defaultBranch": "Основная ветка",
163
+ "latestRelease": "Последний релиз",
164
+ "selectVersion": "Версия для установки",
165
+ "versionLatest": "Актуальное состояние ветки",
166
+ "versionRelease": "Последний релиз",
167
+ "versionTagPrefix": "Тег",
168
+ "versionHint": "Оставьте актуальное состояние ветки для обычной установки или выберите релизный тег.",
169
+ "noTags": "Теги не найдены",
170
+ "readmeTitle": "README",
171
+ "noReadme": "GitHub API не вернул README для этого репозитория.",
172
+ "previewHint": "Загрузите предпросмотр репозитория, чтобы выбрать релиз или тег перед установкой.",
78
173
  "install": "Установить"
79
174
  },
80
175
  "createDialog": {
@@ -99,6 +194,10 @@
99
194
  "all": "Все",
100
195
  "noResults": "Плагины не найдены"
101
196
  },
197
+ "toasts": {
198
+ "statusUpdating": "Обновляем статус плагина...",
199
+ "statusUpdated": "Статус плагина обновлен."
200
+ },
102
201
  "details": {
103
202
  "version": "Версия",
104
203
  "author": "Автор",
@@ -3,6 +3,8 @@
3
3
  "description": "Создайте аккаунт администратора для панели BlockMine.",
4
4
  "username": "Имя администратора",
5
5
  "password": "Пароль (мин. 4 символа)",
6
+ "showPassword": "Показать пароль",
7
+ "hidePassword": "Скрыть пароль",
6
8
  "confirmPassword": "Подтвердите пароль",
7
9
  "submit": "Создать",
8
10
  "errors": {