blockmine 1.23.4 → 1.24.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.
Files changed (642) hide show
  1. package/.claude/settings.json +1 -1
  2. package/.claude/settings.local.json +21 -1
  3. package/.claude/skills/node-development/SKILL.md +317 -0
  4. package/.claude/skills/skill-rules.json +49 -0
  5. package/CHANGELOG.md +50 -32
  6. package/backend/src/ai/plugin-assistant-system-prompt.md +61 -1
  7. package/backend/src/api/routes/aiAssistant.js +562 -103
  8. package/backend/src/api/routes/botUsers.js +30 -10
  9. package/backend/src/api/routes/bots.js +99 -21
  10. package/backend/src/core/BotProcess.js +41 -5
  11. package/backend/src/core/GraphExecutionEngine.js +9 -2
  12. package/backend/src/core/PluginHooks.js +221 -0
  13. package/backend/src/core/PluginManager.js +10 -0
  14. package/backend/src/core/node-registries/container.js +162 -0
  15. package/backend/src/core/node-registries/furnace.js +143 -0
  16. package/backend/src/core/node-registries/inventory.js +181 -0
  17. package/backend/src/core/node-registries/navigation.js +111 -0
  18. package/backend/src/core/nodes/container/close.js +26 -0
  19. package/backend/src/core/nodes/container/deposit.js +88 -0
  20. package/backend/src/core/nodes/container/deposit_all.js +71 -0
  21. package/backend/src/core/nodes/container/find_item.js +77 -0
  22. package/backend/src/core/nodes/container/get_items.js +51 -0
  23. package/backend/src/core/nodes/container/open.js +111 -0
  24. package/backend/src/core/nodes/container/withdraw.js +91 -0
  25. package/backend/src/core/nodes/furnace/close.js +24 -0
  26. package/backend/src/core/nodes/furnace/get_status.js +74 -0
  27. package/backend/src/core/nodes/furnace/open.js +110 -0
  28. package/backend/src/core/nodes/furnace/put_fuel.js +64 -0
  29. package/backend/src/core/nodes/furnace/put_input.js +64 -0
  30. package/backend/src/core/nodes/furnace/take_output.js +69 -0
  31. package/backend/src/core/nodes/inventory/count_item.js +28 -0
  32. package/backend/src/core/nodes/inventory/drop.js +65 -0
  33. package/backend/src/core/nodes/inventory/equip.js +45 -0
  34. package/backend/src/core/nodes/inventory/find_item.js +55 -0
  35. package/backend/src/core/nodes/inventory/get_all.js +45 -0
  36. package/backend/src/core/nodes/inventory/get_held_item.js +63 -0
  37. package/backend/src/core/nodes/inventory/get_slot.js +46 -0
  38. package/backend/src/core/nodes/inventory/has_item.js +35 -0
  39. package/backend/src/core/nodes/inventory/select_slot.js +46 -0
  40. package/backend/src/core/nodes/navigation/follow.js +51 -0
  41. package/backend/src/core/nodes/navigation/go_to.js +53 -0
  42. package/backend/src/core/nodes/navigation/go_to_entity.js +69 -0
  43. package/backend/src/core/nodes/navigation/go_to_player.js +70 -0
  44. package/backend/src/core/nodes/navigation/stop.js +26 -0
  45. package/backend/src/core/services/MinecraftViewerService.js +2 -0
  46. package/frontend/dist/assets/index-BC-NbKXi.css +32 -0
  47. package/frontend/dist/assets/{index-DqzDkFsP.js → index-DqJXZMHY.js} +2024 -1968
  48. package/frontend/dist/index.html +2 -2
  49. package/frontend/dist/minecraft-assets/items/acacia_boat.png +0 -0
  50. package/frontend/dist/minecraft-assets/items/acacia_chest_boat.png +0 -0
  51. package/frontend/dist/minecraft-assets/items/acacia_door.png +0 -0
  52. package/frontend/dist/minecraft-assets/items/acacia_hanging_sign.png +0 -0
  53. package/frontend/dist/minecraft-assets/items/acacia_sign.png +0 -0
  54. package/frontend/dist/minecraft-assets/items/amethyst_shard.png +0 -0
  55. package/frontend/dist/minecraft-assets/items/angler_pottery_sherd.png +0 -0
  56. package/frontend/dist/minecraft-assets/items/apple.png +0 -0
  57. package/frontend/dist/minecraft-assets/items/archer_pottery_sherd.png +0 -0
  58. package/frontend/dist/minecraft-assets/items/armor_stand.png +0 -0
  59. package/frontend/dist/minecraft-assets/items/arms_up_pottery_sherd.png +0 -0
  60. package/frontend/dist/minecraft-assets/items/arrow.png +0 -0
  61. package/frontend/dist/minecraft-assets/items/axolotl_bucket.png +0 -0
  62. package/frontend/dist/minecraft-assets/items/baked_potato.png +0 -0
  63. package/frontend/dist/minecraft-assets/items/bamboo.png +0 -0
  64. package/frontend/dist/minecraft-assets/items/bamboo_chest_raft.png +0 -0
  65. package/frontend/dist/minecraft-assets/items/bamboo_door.png +0 -0
  66. package/frontend/dist/minecraft-assets/items/bamboo_hanging_sign.png +0 -0
  67. package/frontend/dist/minecraft-assets/items/bamboo_raft.png +0 -0
  68. package/frontend/dist/minecraft-assets/items/bamboo_sign.png +0 -0
  69. package/frontend/dist/minecraft-assets/items/barrier.png +0 -0
  70. package/frontend/dist/minecraft-assets/items/beef.png +0 -0
  71. package/frontend/dist/minecraft-assets/items/beetroot.png +0 -0
  72. package/frontend/dist/minecraft-assets/items/beetroot_seeds.png +0 -0
  73. package/frontend/dist/minecraft-assets/items/beetroot_soup.png +0 -0
  74. package/frontend/dist/minecraft-assets/items/bell.png +0 -0
  75. package/frontend/dist/minecraft-assets/items/birch_boat.png +0 -0
  76. package/frontend/dist/minecraft-assets/items/birch_chest_boat.png +0 -0
  77. package/frontend/dist/minecraft-assets/items/birch_door.png +0 -0
  78. package/frontend/dist/minecraft-assets/items/birch_hanging_sign.png +0 -0
  79. package/frontend/dist/minecraft-assets/items/birch_sign.png +0 -0
  80. package/frontend/dist/minecraft-assets/items/black_candle.png +0 -0
  81. package/frontend/dist/minecraft-assets/items/black_dye.png +0 -0
  82. package/frontend/dist/minecraft-assets/items/blade_pottery_sherd.png +0 -0
  83. package/frontend/dist/minecraft-assets/items/blaze_powder.png +0 -0
  84. package/frontend/dist/minecraft-assets/items/blaze_rod.png +0 -0
  85. package/frontend/dist/minecraft-assets/items/blue_candle.png +0 -0
  86. package/frontend/dist/minecraft-assets/items/blue_dye.png +0 -0
  87. package/frontend/dist/minecraft-assets/items/bone.png +0 -0
  88. package/frontend/dist/minecraft-assets/items/bone_meal.png +0 -0
  89. package/frontend/dist/minecraft-assets/items/book.png +0 -0
  90. package/frontend/dist/minecraft-assets/items/bow.png +0 -0
  91. package/frontend/dist/minecraft-assets/items/bow_pulling_0.png +0 -0
  92. package/frontend/dist/minecraft-assets/items/bow_pulling_1.png +0 -0
  93. package/frontend/dist/minecraft-assets/items/bow_pulling_2.png +0 -0
  94. package/frontend/dist/minecraft-assets/items/bowl.png +0 -0
  95. package/frontend/dist/minecraft-assets/items/bread.png +0 -0
  96. package/frontend/dist/minecraft-assets/items/brewer_pottery_sherd.png +0 -0
  97. package/frontend/dist/minecraft-assets/items/brewing_stand.png +0 -0
  98. package/frontend/dist/minecraft-assets/items/brick.png +0 -0
  99. package/frontend/dist/minecraft-assets/items/broken_elytra.png +0 -0
  100. package/frontend/dist/minecraft-assets/items/brown_candle.png +0 -0
  101. package/frontend/dist/minecraft-assets/items/brown_dye.png +0 -0
  102. package/frontend/dist/minecraft-assets/items/brush.png +0 -0
  103. package/frontend/dist/minecraft-assets/items/bucket.png +0 -0
  104. package/frontend/dist/minecraft-assets/items/bundle.png +0 -0
  105. package/frontend/dist/minecraft-assets/items/bundle_filled.png +0 -0
  106. package/frontend/dist/minecraft-assets/items/burn_pottery_sherd.png +0 -0
  107. package/frontend/dist/minecraft-assets/items/cake.png +0 -0
  108. package/frontend/dist/minecraft-assets/items/campfire.png +0 -0
  109. package/frontend/dist/minecraft-assets/items/candle.png +0 -0
  110. package/frontend/dist/minecraft-assets/items/carrot.png +0 -0
  111. package/frontend/dist/minecraft-assets/items/carrot_on_a_stick.png +0 -0
  112. package/frontend/dist/minecraft-assets/items/cauldron.png +0 -0
  113. package/frontend/dist/minecraft-assets/items/chain.png +0 -0
  114. package/frontend/dist/minecraft-assets/items/chainmail_boots.png +0 -0
  115. package/frontend/dist/minecraft-assets/items/chainmail_chestplate.png +0 -0
  116. package/frontend/dist/minecraft-assets/items/chainmail_helmet.png +0 -0
  117. package/frontend/dist/minecraft-assets/items/chainmail_leggings.png +0 -0
  118. package/frontend/dist/minecraft-assets/items/charcoal.png +0 -0
  119. package/frontend/dist/minecraft-assets/items/cherry_boat.png +0 -0
  120. package/frontend/dist/minecraft-assets/items/cherry_chest_boat.png +0 -0
  121. package/frontend/dist/minecraft-assets/items/cherry_door.png +0 -0
  122. package/frontend/dist/minecraft-assets/items/cherry_hanging_sign.png +0 -0
  123. package/frontend/dist/minecraft-assets/items/cherry_sign.png +0 -0
  124. package/frontend/dist/minecraft-assets/items/chest_minecart.png +0 -0
  125. package/frontend/dist/minecraft-assets/items/chicken.png +0 -0
  126. package/frontend/dist/minecraft-assets/items/chorus_fruit.png +0 -0
  127. package/frontend/dist/minecraft-assets/items/clay_ball.png +0 -0
  128. package/frontend/dist/minecraft-assets/items/clock_00.png +0 -0
  129. package/frontend/dist/minecraft-assets/items/clock_01.png +0 -0
  130. package/frontend/dist/minecraft-assets/items/clock_02.png +0 -0
  131. package/frontend/dist/minecraft-assets/items/clock_03.png +0 -0
  132. package/frontend/dist/minecraft-assets/items/clock_04.png +0 -0
  133. package/frontend/dist/minecraft-assets/items/clock_05.png +0 -0
  134. package/frontend/dist/minecraft-assets/items/clock_06.png +0 -0
  135. package/frontend/dist/minecraft-assets/items/clock_07.png +0 -0
  136. package/frontend/dist/minecraft-assets/items/clock_08.png +0 -0
  137. package/frontend/dist/minecraft-assets/items/clock_09.png +0 -0
  138. package/frontend/dist/minecraft-assets/items/clock_10.png +0 -0
  139. package/frontend/dist/minecraft-assets/items/clock_11.png +0 -0
  140. package/frontend/dist/minecraft-assets/items/clock_12.png +0 -0
  141. package/frontend/dist/minecraft-assets/items/clock_13.png +0 -0
  142. package/frontend/dist/minecraft-assets/items/clock_14.png +0 -0
  143. package/frontend/dist/minecraft-assets/items/clock_15.png +0 -0
  144. package/frontend/dist/minecraft-assets/items/clock_16.png +0 -0
  145. package/frontend/dist/minecraft-assets/items/clock_17.png +0 -0
  146. package/frontend/dist/minecraft-assets/items/clock_18.png +0 -0
  147. package/frontend/dist/minecraft-assets/items/clock_19.png +0 -0
  148. package/frontend/dist/minecraft-assets/items/clock_20.png +0 -0
  149. package/frontend/dist/minecraft-assets/items/clock_21.png +0 -0
  150. package/frontend/dist/minecraft-assets/items/clock_22.png +0 -0
  151. package/frontend/dist/minecraft-assets/items/clock_23.png +0 -0
  152. package/frontend/dist/minecraft-assets/items/clock_24.png +0 -0
  153. package/frontend/dist/minecraft-assets/items/clock_25.png +0 -0
  154. package/frontend/dist/minecraft-assets/items/clock_26.png +0 -0
  155. package/frontend/dist/minecraft-assets/items/clock_27.png +0 -0
  156. package/frontend/dist/minecraft-assets/items/clock_28.png +0 -0
  157. package/frontend/dist/minecraft-assets/items/clock_29.png +0 -0
  158. package/frontend/dist/minecraft-assets/items/clock_30.png +0 -0
  159. package/frontend/dist/minecraft-assets/items/clock_31.png +0 -0
  160. package/frontend/dist/minecraft-assets/items/clock_32.png +0 -0
  161. package/frontend/dist/minecraft-assets/items/clock_33.png +0 -0
  162. package/frontend/dist/minecraft-assets/items/clock_34.png +0 -0
  163. package/frontend/dist/minecraft-assets/items/clock_35.png +0 -0
  164. package/frontend/dist/minecraft-assets/items/clock_36.png +0 -0
  165. package/frontend/dist/minecraft-assets/items/clock_37.png +0 -0
  166. package/frontend/dist/minecraft-assets/items/clock_38.png +0 -0
  167. package/frontend/dist/minecraft-assets/items/clock_39.png +0 -0
  168. package/frontend/dist/minecraft-assets/items/clock_40.png +0 -0
  169. package/frontend/dist/minecraft-assets/items/clock_41.png +0 -0
  170. package/frontend/dist/minecraft-assets/items/clock_42.png +0 -0
  171. package/frontend/dist/minecraft-assets/items/clock_43.png +0 -0
  172. package/frontend/dist/minecraft-assets/items/clock_44.png +0 -0
  173. package/frontend/dist/minecraft-assets/items/clock_45.png +0 -0
  174. package/frontend/dist/minecraft-assets/items/clock_46.png +0 -0
  175. package/frontend/dist/minecraft-assets/items/clock_47.png +0 -0
  176. package/frontend/dist/minecraft-assets/items/clock_48.png +0 -0
  177. package/frontend/dist/minecraft-assets/items/clock_49.png +0 -0
  178. package/frontend/dist/minecraft-assets/items/clock_50.png +0 -0
  179. package/frontend/dist/minecraft-assets/items/clock_51.png +0 -0
  180. package/frontend/dist/minecraft-assets/items/clock_52.png +0 -0
  181. package/frontend/dist/minecraft-assets/items/clock_53.png +0 -0
  182. package/frontend/dist/minecraft-assets/items/clock_54.png +0 -0
  183. package/frontend/dist/minecraft-assets/items/clock_55.png +0 -0
  184. package/frontend/dist/minecraft-assets/items/clock_56.png +0 -0
  185. package/frontend/dist/minecraft-assets/items/clock_57.png +0 -0
  186. package/frontend/dist/minecraft-assets/items/clock_58.png +0 -0
  187. package/frontend/dist/minecraft-assets/items/clock_59.png +0 -0
  188. package/frontend/dist/minecraft-assets/items/clock_60.png +0 -0
  189. package/frontend/dist/minecraft-assets/items/clock_61.png +0 -0
  190. package/frontend/dist/minecraft-assets/items/clock_62.png +0 -0
  191. package/frontend/dist/minecraft-assets/items/clock_63.png +0 -0
  192. package/frontend/dist/minecraft-assets/items/coal.png +0 -0
  193. package/frontend/dist/minecraft-assets/items/coast_armor_trim_smithing_template.png +0 -0
  194. package/frontend/dist/minecraft-assets/items/cocoa_beans.png +0 -0
  195. package/frontend/dist/minecraft-assets/items/cod.png +0 -0
  196. package/frontend/dist/minecraft-assets/items/cod_bucket.png +0 -0
  197. package/frontend/dist/minecraft-assets/items/command_block_minecart.png +0 -0
  198. package/frontend/dist/minecraft-assets/items/comparator.png +0 -0
  199. package/frontend/dist/minecraft-assets/items/compass_00.png +0 -0
  200. package/frontend/dist/minecraft-assets/items/compass_01.png +0 -0
  201. package/frontend/dist/minecraft-assets/items/compass_02.png +0 -0
  202. package/frontend/dist/minecraft-assets/items/compass_03.png +0 -0
  203. package/frontend/dist/minecraft-assets/items/compass_04.png +0 -0
  204. package/frontend/dist/minecraft-assets/items/compass_05.png +0 -0
  205. package/frontend/dist/minecraft-assets/items/compass_06.png +0 -0
  206. package/frontend/dist/minecraft-assets/items/compass_07.png +0 -0
  207. package/frontend/dist/minecraft-assets/items/compass_08.png +0 -0
  208. package/frontend/dist/minecraft-assets/items/compass_09.png +0 -0
  209. package/frontend/dist/minecraft-assets/items/compass_10.png +0 -0
  210. package/frontend/dist/minecraft-assets/items/compass_11.png +0 -0
  211. package/frontend/dist/minecraft-assets/items/compass_12.png +0 -0
  212. package/frontend/dist/minecraft-assets/items/compass_13.png +0 -0
  213. package/frontend/dist/minecraft-assets/items/compass_14.png +0 -0
  214. package/frontend/dist/minecraft-assets/items/compass_15.png +0 -0
  215. package/frontend/dist/minecraft-assets/items/compass_16.png +0 -0
  216. package/frontend/dist/minecraft-assets/items/compass_17.png +0 -0
  217. package/frontend/dist/minecraft-assets/items/compass_18.png +0 -0
  218. package/frontend/dist/minecraft-assets/items/compass_19.png +0 -0
  219. package/frontend/dist/minecraft-assets/items/compass_20.png +0 -0
  220. package/frontend/dist/minecraft-assets/items/compass_21.png +0 -0
  221. package/frontend/dist/minecraft-assets/items/compass_22.png +0 -0
  222. package/frontend/dist/minecraft-assets/items/compass_23.png +0 -0
  223. package/frontend/dist/minecraft-assets/items/compass_24.png +0 -0
  224. package/frontend/dist/minecraft-assets/items/compass_25.png +0 -0
  225. package/frontend/dist/minecraft-assets/items/compass_26.png +0 -0
  226. package/frontend/dist/minecraft-assets/items/compass_27.png +0 -0
  227. package/frontend/dist/minecraft-assets/items/compass_28.png +0 -0
  228. package/frontend/dist/minecraft-assets/items/compass_29.png +0 -0
  229. package/frontend/dist/minecraft-assets/items/compass_30.png +0 -0
  230. package/frontend/dist/minecraft-assets/items/compass_31.png +0 -0
  231. package/frontend/dist/minecraft-assets/items/cooked_beef.png +0 -0
  232. package/frontend/dist/minecraft-assets/items/cooked_chicken.png +0 -0
  233. package/frontend/dist/minecraft-assets/items/cooked_cod.png +0 -0
  234. package/frontend/dist/minecraft-assets/items/cooked_mutton.png +0 -0
  235. package/frontend/dist/minecraft-assets/items/cooked_porkchop.png +0 -0
  236. package/frontend/dist/minecraft-assets/items/cooked_rabbit.png +0 -0
  237. package/frontend/dist/minecraft-assets/items/cooked_salmon.png +0 -0
  238. package/frontend/dist/minecraft-assets/items/cookie.png +0 -0
  239. package/frontend/dist/minecraft-assets/items/copper_ingot.png +0 -0
  240. package/frontend/dist/minecraft-assets/items/creeper_banner_pattern.png +0 -0
  241. package/frontend/dist/minecraft-assets/items/crimson_door.png +0 -0
  242. package/frontend/dist/minecraft-assets/items/crimson_hanging_sign.png +0 -0
  243. package/frontend/dist/minecraft-assets/items/crimson_sign.png +0 -0
  244. package/frontend/dist/minecraft-assets/items/crossbow_arrow.png +0 -0
  245. package/frontend/dist/minecraft-assets/items/crossbow_firework.png +0 -0
  246. package/frontend/dist/minecraft-assets/items/crossbow_pulling_0.png +0 -0
  247. package/frontend/dist/minecraft-assets/items/crossbow_pulling_1.png +0 -0
  248. package/frontend/dist/minecraft-assets/items/crossbow_pulling_2.png +0 -0
  249. package/frontend/dist/minecraft-assets/items/crossbow_standby.png +0 -0
  250. package/frontend/dist/minecraft-assets/items/cyan_candle.png +0 -0
  251. package/frontend/dist/minecraft-assets/items/cyan_dye.png +0 -0
  252. package/frontend/dist/minecraft-assets/items/danger_pottery_sherd.png +0 -0
  253. package/frontend/dist/minecraft-assets/items/dark_oak_boat.png +0 -0
  254. package/frontend/dist/minecraft-assets/items/dark_oak_chest_boat.png +0 -0
  255. package/frontend/dist/minecraft-assets/items/dark_oak_door.png +0 -0
  256. package/frontend/dist/minecraft-assets/items/dark_oak_hanging_sign.png +0 -0
  257. package/frontend/dist/minecraft-assets/items/dark_oak_sign.png +0 -0
  258. package/frontend/dist/minecraft-assets/items/diamond.png +0 -0
  259. package/frontend/dist/minecraft-assets/items/diamond_axe.png +0 -0
  260. package/frontend/dist/minecraft-assets/items/diamond_boots.png +0 -0
  261. package/frontend/dist/minecraft-assets/items/diamond_chestplate.png +0 -0
  262. package/frontend/dist/minecraft-assets/items/diamond_helmet.png +0 -0
  263. package/frontend/dist/minecraft-assets/items/diamond_hoe.png +0 -0
  264. package/frontend/dist/minecraft-assets/items/diamond_horse_armor.png +0 -0
  265. package/frontend/dist/minecraft-assets/items/diamond_leggings.png +0 -0
  266. package/frontend/dist/minecraft-assets/items/diamond_pickaxe.png +0 -0
  267. package/frontend/dist/minecraft-assets/items/diamond_shovel.png +0 -0
  268. package/frontend/dist/minecraft-assets/items/diamond_sword.png +0 -0
  269. package/frontend/dist/minecraft-assets/items/disc_fragment_5.png +0 -0
  270. package/frontend/dist/minecraft-assets/items/dragon_breath.png +0 -0
  271. package/frontend/dist/minecraft-assets/items/dried_kelp.png +0 -0
  272. package/frontend/dist/minecraft-assets/items/dune_armor_trim_smithing_template.png +0 -0
  273. package/frontend/dist/minecraft-assets/items/echo_shard.png +0 -0
  274. package/frontend/dist/minecraft-assets/items/egg.png +0 -0
  275. package/frontend/dist/minecraft-assets/items/elytra.png +0 -0
  276. package/frontend/dist/minecraft-assets/items/emerald.png +0 -0
  277. package/frontend/dist/minecraft-assets/items/empty_armor_slot_boots.png +0 -0
  278. package/frontend/dist/minecraft-assets/items/empty_armor_slot_chestplate.png +0 -0
  279. package/frontend/dist/minecraft-assets/items/empty_armor_slot_helmet.png +0 -0
  280. package/frontend/dist/minecraft-assets/items/empty_armor_slot_leggings.png +0 -0
  281. package/frontend/dist/minecraft-assets/items/empty_armor_slot_shield.png +0 -0
  282. package/frontend/dist/minecraft-assets/items/empty_slot_amethyst_shard.png +0 -0
  283. package/frontend/dist/minecraft-assets/items/empty_slot_axe.png +0 -0
  284. package/frontend/dist/minecraft-assets/items/empty_slot_diamond.png +0 -0
  285. package/frontend/dist/minecraft-assets/items/empty_slot_emerald.png +0 -0
  286. package/frontend/dist/minecraft-assets/items/empty_slot_hoe.png +0 -0
  287. package/frontend/dist/minecraft-assets/items/empty_slot_ingot.png +0 -0
  288. package/frontend/dist/minecraft-assets/items/empty_slot_lapis_lazuli.png +0 -0
  289. package/frontend/dist/minecraft-assets/items/empty_slot_pickaxe.png +0 -0
  290. package/frontend/dist/minecraft-assets/items/empty_slot_quartz.png +0 -0
  291. package/frontend/dist/minecraft-assets/items/empty_slot_redstone_dust.png +0 -0
  292. package/frontend/dist/minecraft-assets/items/empty_slot_shovel.png +0 -0
  293. package/frontend/dist/minecraft-assets/items/empty_slot_smithing_template_armor_trim.png +0 -0
  294. package/frontend/dist/minecraft-assets/items/empty_slot_smithing_template_netherite_upgrade.png +0 -0
  295. package/frontend/dist/minecraft-assets/items/empty_slot_sword.png +0 -0
  296. package/frontend/dist/minecraft-assets/items/enchanted_book.png +0 -0
  297. package/frontend/dist/minecraft-assets/items/end_crystal.png +0 -0
  298. package/frontend/dist/minecraft-assets/items/ender_eye.png +0 -0
  299. package/frontend/dist/minecraft-assets/items/ender_pearl.png +0 -0
  300. package/frontend/dist/minecraft-assets/items/experience_bottle.png +0 -0
  301. package/frontend/dist/minecraft-assets/items/explorer_pottery_sherd.png +0 -0
  302. package/frontend/dist/minecraft-assets/items/eye_armor_trim_smithing_template.png +0 -0
  303. package/frontend/dist/minecraft-assets/items/feather.png +0 -0
  304. package/frontend/dist/minecraft-assets/items/fermented_spider_eye.png +0 -0
  305. package/frontend/dist/minecraft-assets/items/filled_map.png +0 -0
  306. package/frontend/dist/minecraft-assets/items/filled_map_markings.png +0 -0
  307. package/frontend/dist/minecraft-assets/items/fire_charge.png +0 -0
  308. package/frontend/dist/minecraft-assets/items/firework_rocket.png +0 -0
  309. package/frontend/dist/minecraft-assets/items/firework_star.png +0 -0
  310. package/frontend/dist/minecraft-assets/items/firework_star_overlay.png +0 -0
  311. package/frontend/dist/minecraft-assets/items/fishing_rod.png +0 -0
  312. package/frontend/dist/minecraft-assets/items/fishing_rod_cast.png +0 -0
  313. package/frontend/dist/minecraft-assets/items/flint.png +0 -0
  314. package/frontend/dist/minecraft-assets/items/flint_and_steel.png +0 -0
  315. package/frontend/dist/minecraft-assets/items/flower_banner_pattern.png +0 -0
  316. package/frontend/dist/minecraft-assets/items/flower_pot.png +0 -0
  317. package/frontend/dist/minecraft-assets/items/friend_pottery_sherd.png +0 -0
  318. package/frontend/dist/minecraft-assets/items/furnace_minecart.png +0 -0
  319. package/frontend/dist/minecraft-assets/items/ghast_tear.png +0 -0
  320. package/frontend/dist/minecraft-assets/items/glass_bottle.png +0 -0
  321. package/frontend/dist/minecraft-assets/items/glistering_melon_slice.png +0 -0
  322. package/frontend/dist/minecraft-assets/items/globe_banner_pattern.png +0 -0
  323. package/frontend/dist/minecraft-assets/items/glow_berries.png +0 -0
  324. package/frontend/dist/minecraft-assets/items/glow_ink_sac.png +0 -0
  325. package/frontend/dist/minecraft-assets/items/glow_item_frame.png +0 -0
  326. package/frontend/dist/minecraft-assets/items/glowstone_dust.png +0 -0
  327. package/frontend/dist/minecraft-assets/items/goat_horn.png +0 -0
  328. package/frontend/dist/minecraft-assets/items/gold_ingot.png +0 -0
  329. package/frontend/dist/minecraft-assets/items/gold_nugget.png +0 -0
  330. package/frontend/dist/minecraft-assets/items/golden_apple.png +0 -0
  331. package/frontend/dist/minecraft-assets/items/golden_axe.png +0 -0
  332. package/frontend/dist/minecraft-assets/items/golden_boots.png +0 -0
  333. package/frontend/dist/minecraft-assets/items/golden_carrot.png +0 -0
  334. package/frontend/dist/minecraft-assets/items/golden_chestplate.png +0 -0
  335. package/frontend/dist/minecraft-assets/items/golden_helmet.png +0 -0
  336. package/frontend/dist/minecraft-assets/items/golden_hoe.png +0 -0
  337. package/frontend/dist/minecraft-assets/items/golden_horse_armor.png +0 -0
  338. package/frontend/dist/minecraft-assets/items/golden_leggings.png +0 -0
  339. package/frontend/dist/minecraft-assets/items/golden_pickaxe.png +0 -0
  340. package/frontend/dist/minecraft-assets/items/golden_shovel.png +0 -0
  341. package/frontend/dist/minecraft-assets/items/golden_sword.png +0 -0
  342. package/frontend/dist/minecraft-assets/items/gray_candle.png +0 -0
  343. package/frontend/dist/minecraft-assets/items/gray_dye.png +0 -0
  344. package/frontend/dist/minecraft-assets/items/green_candle.png +0 -0
  345. package/frontend/dist/minecraft-assets/items/green_dye.png +0 -0
  346. package/frontend/dist/minecraft-assets/items/gunpowder.png +0 -0
  347. package/frontend/dist/minecraft-assets/items/heart_of_the_sea.png +0 -0
  348. package/frontend/dist/minecraft-assets/items/heart_pottery_sherd.png +0 -0
  349. package/frontend/dist/minecraft-assets/items/heartbreak_pottery_sherd.png +0 -0
  350. package/frontend/dist/minecraft-assets/items/honey_bottle.png +0 -0
  351. package/frontend/dist/minecraft-assets/items/honeycomb.png +0 -0
  352. package/frontend/dist/minecraft-assets/items/hopper.png +0 -0
  353. package/frontend/dist/minecraft-assets/items/hopper_minecart.png +0 -0
  354. package/frontend/dist/minecraft-assets/items/host_armor_trim_smithing_template.png +0 -0
  355. package/frontend/dist/minecraft-assets/items/howl_pottery_sherd.png +0 -0
  356. package/frontend/dist/minecraft-assets/items/ink_sac.png +0 -0
  357. package/frontend/dist/minecraft-assets/items/iron_axe.png +0 -0
  358. package/frontend/dist/minecraft-assets/items/iron_boots.png +0 -0
  359. package/frontend/dist/minecraft-assets/items/iron_chestplate.png +0 -0
  360. package/frontend/dist/minecraft-assets/items/iron_door.png +0 -0
  361. package/frontend/dist/minecraft-assets/items/iron_helmet.png +0 -0
  362. package/frontend/dist/minecraft-assets/items/iron_hoe.png +0 -0
  363. package/frontend/dist/minecraft-assets/items/iron_horse_armor.png +0 -0
  364. package/frontend/dist/minecraft-assets/items/iron_ingot.png +0 -0
  365. package/frontend/dist/minecraft-assets/items/iron_leggings.png +0 -0
  366. package/frontend/dist/minecraft-assets/items/iron_nugget.png +0 -0
  367. package/frontend/dist/minecraft-assets/items/iron_pickaxe.png +0 -0
  368. package/frontend/dist/minecraft-assets/items/iron_shovel.png +0 -0
  369. package/frontend/dist/minecraft-assets/items/iron_sword.png +0 -0
  370. package/frontend/dist/minecraft-assets/items/item_frame.png +0 -0
  371. package/frontend/dist/minecraft-assets/items/jungle_boat.png +0 -0
  372. package/frontend/dist/minecraft-assets/items/jungle_chest_boat.png +0 -0
  373. package/frontend/dist/minecraft-assets/items/jungle_door.png +0 -0
  374. package/frontend/dist/minecraft-assets/items/jungle_hanging_sign.png +0 -0
  375. package/frontend/dist/minecraft-assets/items/jungle_sign.png +0 -0
  376. package/frontend/dist/minecraft-assets/items/kelp.png +0 -0
  377. package/frontend/dist/minecraft-assets/items/knowledge_book.png +0 -0
  378. package/frontend/dist/minecraft-assets/items/lantern.png +0 -0
  379. package/frontend/dist/minecraft-assets/items/lapis_lazuli.png +0 -0
  380. package/frontend/dist/minecraft-assets/items/lava_bucket.png +0 -0
  381. package/frontend/dist/minecraft-assets/items/lead.png +0 -0
  382. package/frontend/dist/minecraft-assets/items/leather.png +0 -0
  383. package/frontend/dist/minecraft-assets/items/leather_boots.png +0 -0
  384. package/frontend/dist/minecraft-assets/items/leather_boots_overlay.png +0 -0
  385. package/frontend/dist/minecraft-assets/items/leather_chestplate.png +0 -0
  386. package/frontend/dist/minecraft-assets/items/leather_chestplate_overlay.png +0 -0
  387. package/frontend/dist/minecraft-assets/items/leather_helmet.png +0 -0
  388. package/frontend/dist/minecraft-assets/items/leather_helmet_overlay.png +0 -0
  389. package/frontend/dist/minecraft-assets/items/leather_horse_armor.png +0 -0
  390. package/frontend/dist/minecraft-assets/items/leather_leggings.png +0 -0
  391. package/frontend/dist/minecraft-assets/items/leather_leggings_overlay.png +0 -0
  392. package/frontend/dist/minecraft-assets/items/light.png +0 -0
  393. package/frontend/dist/minecraft-assets/items/light_00.png +0 -0
  394. package/frontend/dist/minecraft-assets/items/light_01.png +0 -0
  395. package/frontend/dist/minecraft-assets/items/light_02.png +0 -0
  396. package/frontend/dist/minecraft-assets/items/light_03.png +0 -0
  397. package/frontend/dist/minecraft-assets/items/light_04.png +0 -0
  398. package/frontend/dist/minecraft-assets/items/light_05.png +0 -0
  399. package/frontend/dist/minecraft-assets/items/light_06.png +0 -0
  400. package/frontend/dist/minecraft-assets/items/light_07.png +0 -0
  401. package/frontend/dist/minecraft-assets/items/light_08.png +0 -0
  402. package/frontend/dist/minecraft-assets/items/light_09.png +0 -0
  403. package/frontend/dist/minecraft-assets/items/light_10.png +0 -0
  404. package/frontend/dist/minecraft-assets/items/light_11.png +0 -0
  405. package/frontend/dist/minecraft-assets/items/light_12.png +0 -0
  406. package/frontend/dist/minecraft-assets/items/light_13.png +0 -0
  407. package/frontend/dist/minecraft-assets/items/light_14.png +0 -0
  408. package/frontend/dist/minecraft-assets/items/light_15.png +0 -0
  409. package/frontend/dist/minecraft-assets/items/light_blue_candle.png +0 -0
  410. package/frontend/dist/minecraft-assets/items/light_blue_dye.png +0 -0
  411. package/frontend/dist/minecraft-assets/items/light_gray_candle.png +0 -0
  412. package/frontend/dist/minecraft-assets/items/light_gray_dye.png +0 -0
  413. package/frontend/dist/minecraft-assets/items/lime_candle.png +0 -0
  414. package/frontend/dist/minecraft-assets/items/lime_dye.png +0 -0
  415. package/frontend/dist/minecraft-assets/items/lingering_potion.png +0 -0
  416. package/frontend/dist/minecraft-assets/items/magenta_candle.png +0 -0
  417. package/frontend/dist/minecraft-assets/items/magenta_dye.png +0 -0
  418. package/frontend/dist/minecraft-assets/items/magma_cream.png +0 -0
  419. package/frontend/dist/minecraft-assets/items/mangrove_boat.png +0 -0
  420. package/frontend/dist/minecraft-assets/items/mangrove_chest_boat.png +0 -0
  421. package/frontend/dist/minecraft-assets/items/mangrove_door.png +0 -0
  422. package/frontend/dist/minecraft-assets/items/mangrove_hanging_sign.png +0 -0
  423. package/frontend/dist/minecraft-assets/items/mangrove_propagule.png +0 -0
  424. package/frontend/dist/minecraft-assets/items/mangrove_sign.png +0 -0
  425. package/frontend/dist/minecraft-assets/items/map.png +0 -0
  426. package/frontend/dist/minecraft-assets/items/melon_seeds.png +0 -0
  427. package/frontend/dist/minecraft-assets/items/melon_slice.png +0 -0
  428. package/frontend/dist/minecraft-assets/items/milk_bucket.png +0 -0
  429. package/frontend/dist/minecraft-assets/items/minecart.png +0 -0
  430. package/frontend/dist/minecraft-assets/items/miner_pottery_sherd.png +0 -0
  431. package/frontend/dist/minecraft-assets/items/mojang_banner_pattern.png +0 -0
  432. package/frontend/dist/minecraft-assets/items/mourner_pottery_sherd.png +0 -0
  433. package/frontend/dist/minecraft-assets/items/mushroom_stew.png +0 -0
  434. package/frontend/dist/minecraft-assets/items/music_disc_11.png +0 -0
  435. package/frontend/dist/minecraft-assets/items/music_disc_13.png +0 -0
  436. package/frontend/dist/minecraft-assets/items/music_disc_5.png +0 -0
  437. package/frontend/dist/minecraft-assets/items/music_disc_blocks.png +0 -0
  438. package/frontend/dist/minecraft-assets/items/music_disc_cat.png +0 -0
  439. package/frontend/dist/minecraft-assets/items/music_disc_chirp.png +0 -0
  440. package/frontend/dist/minecraft-assets/items/music_disc_far.png +0 -0
  441. package/frontend/dist/minecraft-assets/items/music_disc_mall.png +0 -0
  442. package/frontend/dist/minecraft-assets/items/music_disc_mellohi.png +0 -0
  443. package/frontend/dist/minecraft-assets/items/music_disc_otherside.png +0 -0
  444. package/frontend/dist/minecraft-assets/items/music_disc_pigstep.png +0 -0
  445. package/frontend/dist/minecraft-assets/items/music_disc_relic.png +0 -0
  446. package/frontend/dist/minecraft-assets/items/music_disc_stal.png +0 -0
  447. package/frontend/dist/minecraft-assets/items/music_disc_strad.png +0 -0
  448. package/frontend/dist/minecraft-assets/items/music_disc_wait.png +0 -0
  449. package/frontend/dist/minecraft-assets/items/music_disc_ward.png +0 -0
  450. package/frontend/dist/minecraft-assets/items/mutton.png +0 -0
  451. package/frontend/dist/minecraft-assets/items/name_tag.png +0 -0
  452. package/frontend/dist/minecraft-assets/items/nautilus_shell.png +0 -0
  453. package/frontend/dist/minecraft-assets/items/nether_brick.png +0 -0
  454. package/frontend/dist/minecraft-assets/items/nether_sprouts.png +0 -0
  455. package/frontend/dist/minecraft-assets/items/nether_star.png +0 -0
  456. package/frontend/dist/minecraft-assets/items/nether_wart.png +0 -0
  457. package/frontend/dist/minecraft-assets/items/netherite_axe.png +0 -0
  458. package/frontend/dist/minecraft-assets/items/netherite_boots.png +0 -0
  459. package/frontend/dist/minecraft-assets/items/netherite_chestplate.png +0 -0
  460. package/frontend/dist/minecraft-assets/items/netherite_helmet.png +0 -0
  461. package/frontend/dist/minecraft-assets/items/netherite_hoe.png +0 -0
  462. package/frontend/dist/minecraft-assets/items/netherite_ingot.png +0 -0
  463. package/frontend/dist/minecraft-assets/items/netherite_leggings.png +0 -0
  464. package/frontend/dist/minecraft-assets/items/netherite_pickaxe.png +0 -0
  465. package/frontend/dist/minecraft-assets/items/netherite_scrap.png +0 -0
  466. package/frontend/dist/minecraft-assets/items/netherite_shovel.png +0 -0
  467. package/frontend/dist/minecraft-assets/items/netherite_sword.png +0 -0
  468. package/frontend/dist/minecraft-assets/items/netherite_upgrade_smithing_template.png +0 -0
  469. package/frontend/dist/minecraft-assets/items/oak_boat.png +0 -0
  470. package/frontend/dist/minecraft-assets/items/oak_chest_boat.png +0 -0
  471. package/frontend/dist/minecraft-assets/items/oak_door.png +0 -0
  472. package/frontend/dist/minecraft-assets/items/oak_hanging_sign.png +0 -0
  473. package/frontend/dist/minecraft-assets/items/oak_sign.png +0 -0
  474. package/frontend/dist/minecraft-assets/items/orange_candle.png +0 -0
  475. package/frontend/dist/minecraft-assets/items/orange_dye.png +0 -0
  476. package/frontend/dist/minecraft-assets/items/painting.png +0 -0
  477. package/frontend/dist/minecraft-assets/items/paper.png +0 -0
  478. package/frontend/dist/minecraft-assets/items/phantom_membrane.png +0 -0
  479. package/frontend/dist/minecraft-assets/items/piglin_banner_pattern.png +0 -0
  480. package/frontend/dist/minecraft-assets/items/pink_candle.png +0 -0
  481. package/frontend/dist/minecraft-assets/items/pink_dye.png +0 -0
  482. package/frontend/dist/minecraft-assets/items/pink_petals.png +0 -0
  483. package/frontend/dist/minecraft-assets/items/pitcher_plant.png +0 -0
  484. package/frontend/dist/minecraft-assets/items/pitcher_pod.png +0 -0
  485. package/frontend/dist/minecraft-assets/items/plenty_pottery_sherd.png +0 -0
  486. package/frontend/dist/minecraft-assets/items/pointed_dripstone.png +0 -0
  487. package/frontend/dist/minecraft-assets/items/poisonous_potato.png +0 -0
  488. package/frontend/dist/minecraft-assets/items/popped_chorus_fruit.png +0 -0
  489. package/frontend/dist/minecraft-assets/items/porkchop.png +0 -0
  490. package/frontend/dist/minecraft-assets/items/potato.png +0 -0
  491. package/frontend/dist/minecraft-assets/items/potion.png +0 -0
  492. package/frontend/dist/minecraft-assets/items/potion_overlay.png +0 -0
  493. package/frontend/dist/minecraft-assets/items/powder_snow_bucket.png +0 -0
  494. package/frontend/dist/minecraft-assets/items/prismarine_crystals.png +0 -0
  495. package/frontend/dist/minecraft-assets/items/prismarine_shard.png +0 -0
  496. package/frontend/dist/minecraft-assets/items/prize_pottery_sherd.png +0 -0
  497. package/frontend/dist/minecraft-assets/items/pufferfish.png +0 -0
  498. package/frontend/dist/minecraft-assets/items/pufferfish_bucket.png +0 -0
  499. package/frontend/dist/minecraft-assets/items/pumpkin_pie.png +0 -0
  500. package/frontend/dist/minecraft-assets/items/pumpkin_seeds.png +0 -0
  501. package/frontend/dist/minecraft-assets/items/purple_candle.png +0 -0
  502. package/frontend/dist/minecraft-assets/items/purple_dye.png +0 -0
  503. package/frontend/dist/minecraft-assets/items/quartz.png +0 -0
  504. package/frontend/dist/minecraft-assets/items/rabbit.png +0 -0
  505. package/frontend/dist/minecraft-assets/items/rabbit_foot.png +0 -0
  506. package/frontend/dist/minecraft-assets/items/rabbit_hide.png +0 -0
  507. package/frontend/dist/minecraft-assets/items/rabbit_stew.png +0 -0
  508. package/frontend/dist/minecraft-assets/items/raiser_armor_trim_smithing_template.png +0 -0
  509. package/frontend/dist/minecraft-assets/items/raw_copper.png +0 -0
  510. package/frontend/dist/minecraft-assets/items/raw_gold.png +0 -0
  511. package/frontend/dist/minecraft-assets/items/raw_iron.png +0 -0
  512. package/frontend/dist/minecraft-assets/items/recovery_compass_00.png +0 -0
  513. package/frontend/dist/minecraft-assets/items/recovery_compass_01.png +0 -0
  514. package/frontend/dist/minecraft-assets/items/recovery_compass_02.png +0 -0
  515. package/frontend/dist/minecraft-assets/items/recovery_compass_03.png +0 -0
  516. package/frontend/dist/minecraft-assets/items/recovery_compass_04.png +0 -0
  517. package/frontend/dist/minecraft-assets/items/recovery_compass_05.png +0 -0
  518. package/frontend/dist/minecraft-assets/items/recovery_compass_06.png +0 -0
  519. package/frontend/dist/minecraft-assets/items/recovery_compass_07.png +0 -0
  520. package/frontend/dist/minecraft-assets/items/recovery_compass_08.png +0 -0
  521. package/frontend/dist/minecraft-assets/items/recovery_compass_09.png +0 -0
  522. package/frontend/dist/minecraft-assets/items/recovery_compass_10.png +0 -0
  523. package/frontend/dist/minecraft-assets/items/recovery_compass_11.png +0 -0
  524. package/frontend/dist/minecraft-assets/items/recovery_compass_12.png +0 -0
  525. package/frontend/dist/minecraft-assets/items/recovery_compass_13.png +0 -0
  526. package/frontend/dist/minecraft-assets/items/recovery_compass_14.png +0 -0
  527. package/frontend/dist/minecraft-assets/items/recovery_compass_15.png +0 -0
  528. package/frontend/dist/minecraft-assets/items/recovery_compass_16.png +0 -0
  529. package/frontend/dist/minecraft-assets/items/recovery_compass_17.png +0 -0
  530. package/frontend/dist/minecraft-assets/items/recovery_compass_18.png +0 -0
  531. package/frontend/dist/minecraft-assets/items/recovery_compass_19.png +0 -0
  532. package/frontend/dist/minecraft-assets/items/recovery_compass_20.png +0 -0
  533. package/frontend/dist/minecraft-assets/items/recovery_compass_21.png +0 -0
  534. package/frontend/dist/minecraft-assets/items/recovery_compass_22.png +0 -0
  535. package/frontend/dist/minecraft-assets/items/recovery_compass_23.png +0 -0
  536. package/frontend/dist/minecraft-assets/items/recovery_compass_24.png +0 -0
  537. package/frontend/dist/minecraft-assets/items/recovery_compass_25.png +0 -0
  538. package/frontend/dist/minecraft-assets/items/recovery_compass_26.png +0 -0
  539. package/frontend/dist/minecraft-assets/items/recovery_compass_27.png +0 -0
  540. package/frontend/dist/minecraft-assets/items/recovery_compass_28.png +0 -0
  541. package/frontend/dist/minecraft-assets/items/recovery_compass_29.png +0 -0
  542. package/frontend/dist/minecraft-assets/items/recovery_compass_30.png +0 -0
  543. package/frontend/dist/minecraft-assets/items/recovery_compass_31.png +0 -0
  544. package/frontend/dist/minecraft-assets/items/red_candle.png +0 -0
  545. package/frontend/dist/minecraft-assets/items/red_dye.png +0 -0
  546. package/frontend/dist/minecraft-assets/items/redstone.png +0 -0
  547. package/frontend/dist/minecraft-assets/items/repeater.png +0 -0
  548. package/frontend/dist/minecraft-assets/items/rib_armor_trim_smithing_template.png +0 -0
  549. package/frontend/dist/minecraft-assets/items/rotten_flesh.png +0 -0
  550. package/frontend/dist/minecraft-assets/items/saddle.png +0 -0
  551. package/frontend/dist/minecraft-assets/items/salmon.png +0 -0
  552. package/frontend/dist/minecraft-assets/items/salmon_bucket.png +0 -0
  553. package/frontend/dist/minecraft-assets/items/scute.png +0 -0
  554. package/frontend/dist/minecraft-assets/items/sea_pickle.png +0 -0
  555. package/frontend/dist/minecraft-assets/items/seagrass.png +0 -0
  556. package/frontend/dist/minecraft-assets/items/sentry_armor_trim_smithing_template.png +0 -0
  557. package/frontend/dist/minecraft-assets/items/shaper_armor_trim_smithing_template.png +0 -0
  558. package/frontend/dist/minecraft-assets/items/sheaf_pottery_sherd.png +0 -0
  559. package/frontend/dist/minecraft-assets/items/shears.png +0 -0
  560. package/frontend/dist/minecraft-assets/items/shelter_pottery_sherd.png +0 -0
  561. package/frontend/dist/minecraft-assets/items/shulker_shell.png +0 -0
  562. package/frontend/dist/minecraft-assets/items/silence_armor_trim_smithing_template.png +0 -0
  563. package/frontend/dist/minecraft-assets/items/skull_banner_pattern.png +0 -0
  564. package/frontend/dist/minecraft-assets/items/skull_pottery_sherd.png +0 -0
  565. package/frontend/dist/minecraft-assets/items/slime_ball.png +0 -0
  566. package/frontend/dist/minecraft-assets/items/sniffer_egg.png +0 -0
  567. package/frontend/dist/minecraft-assets/items/snort_pottery_sherd.png +0 -0
  568. package/frontend/dist/minecraft-assets/items/snout_armor_trim_smithing_template.png +0 -0
  569. package/frontend/dist/minecraft-assets/items/snowball.png +0 -0
  570. package/frontend/dist/minecraft-assets/items/soul_campfire.png +0 -0
  571. package/frontend/dist/minecraft-assets/items/soul_lantern.png +0 -0
  572. package/frontend/dist/minecraft-assets/items/spawn_egg.png +0 -0
  573. package/frontend/dist/minecraft-assets/items/spawn_egg_overlay.png +0 -0
  574. package/frontend/dist/minecraft-assets/items/spectral_arrow.png +0 -0
  575. package/frontend/dist/minecraft-assets/items/spider_eye.png +0 -0
  576. package/frontend/dist/minecraft-assets/items/spire_armor_trim_smithing_template.png +0 -0
  577. package/frontend/dist/minecraft-assets/items/splash_potion.png +0 -0
  578. package/frontend/dist/minecraft-assets/items/spruce_boat.png +0 -0
  579. package/frontend/dist/minecraft-assets/items/spruce_chest_boat.png +0 -0
  580. package/frontend/dist/minecraft-assets/items/spruce_door.png +0 -0
  581. package/frontend/dist/minecraft-assets/items/spruce_hanging_sign.png +0 -0
  582. package/frontend/dist/minecraft-assets/items/spruce_sign.png +0 -0
  583. package/frontend/dist/minecraft-assets/items/spyglass.png +0 -0
  584. package/frontend/dist/minecraft-assets/items/spyglass_model.png +0 -0
  585. package/frontend/dist/minecraft-assets/items/stick.png +0 -0
  586. package/frontend/dist/minecraft-assets/items/stone_axe.png +0 -0
  587. package/frontend/dist/minecraft-assets/items/stone_hoe.png +0 -0
  588. package/frontend/dist/minecraft-assets/items/stone_pickaxe.png +0 -0
  589. package/frontend/dist/minecraft-assets/items/stone_shovel.png +0 -0
  590. package/frontend/dist/minecraft-assets/items/stone_sword.png +0 -0
  591. package/frontend/dist/minecraft-assets/items/string.png +0 -0
  592. package/frontend/dist/minecraft-assets/items/structure_void.png +0 -0
  593. package/frontend/dist/minecraft-assets/items/sugar.png +0 -0
  594. package/frontend/dist/minecraft-assets/items/sugar_cane.png +0 -0
  595. package/frontend/dist/minecraft-assets/items/suspicious_stew.png +0 -0
  596. package/frontend/dist/minecraft-assets/items/sweet_berries.png +0 -0
  597. package/frontend/dist/minecraft-assets/items/tadpole_bucket.png +0 -0
  598. package/frontend/dist/minecraft-assets/items/tide_armor_trim_smithing_template.png +0 -0
  599. package/frontend/dist/minecraft-assets/items/tipped_arrow_base.png +0 -0
  600. package/frontend/dist/minecraft-assets/items/tipped_arrow_head.png +0 -0
  601. package/frontend/dist/minecraft-assets/items/tnt_minecart.png +0 -0
  602. package/frontend/dist/minecraft-assets/items/torchflower_seeds.png +0 -0
  603. package/frontend/dist/minecraft-assets/items/totem_of_undying.png +0 -0
  604. package/frontend/dist/minecraft-assets/items/trident.png +0 -0
  605. package/frontend/dist/minecraft-assets/items/tropical_fish.png +0 -0
  606. package/frontend/dist/minecraft-assets/items/tropical_fish_bucket.png +0 -0
  607. package/frontend/dist/minecraft-assets/items/turtle_egg.png +0 -0
  608. package/frontend/dist/minecraft-assets/items/turtle_helmet.png +0 -0
  609. package/frontend/dist/minecraft-assets/items/vex_armor_trim_smithing_template.png +0 -0
  610. package/frontend/dist/minecraft-assets/items/ward_armor_trim_smithing_template.png +0 -0
  611. package/frontend/dist/minecraft-assets/items/warped_door.png +0 -0
  612. package/frontend/dist/minecraft-assets/items/warped_fungus_on_a_stick.png +0 -0
  613. package/frontend/dist/minecraft-assets/items/warped_hanging_sign.png +0 -0
  614. package/frontend/dist/minecraft-assets/items/warped_sign.png +0 -0
  615. package/frontend/dist/minecraft-assets/items/water_bucket.png +0 -0
  616. package/frontend/dist/minecraft-assets/items/wayfinder_armor_trim_smithing_template.png +0 -0
  617. package/frontend/dist/minecraft-assets/items/wheat.png +0 -0
  618. package/frontend/dist/minecraft-assets/items/wheat_seeds.png +0 -0
  619. package/frontend/dist/minecraft-assets/items/white_candle.png +0 -0
  620. package/frontend/dist/minecraft-assets/items/white_dye.png +0 -0
  621. package/frontend/dist/minecraft-assets/items/wild_armor_trim_smithing_template.png +0 -0
  622. package/frontend/dist/minecraft-assets/items/wooden_axe.png +0 -0
  623. package/frontend/dist/minecraft-assets/items/wooden_hoe.png +0 -0
  624. package/frontend/dist/minecraft-assets/items/wooden_pickaxe.png +0 -0
  625. package/frontend/dist/minecraft-assets/items/wooden_shovel.png +0 -0
  626. package/frontend/dist/minecraft-assets/items/wooden_sword.png +0 -0
  627. package/frontend/dist/minecraft-assets/items/writable_book.png +0 -0
  628. package/frontend/dist/minecraft-assets/items/written_book.png +0 -0
  629. package/frontend/dist/minecraft-assets/items/yellow_candle.png +0 -0
  630. package/frontend/dist/minecraft-assets/items/yellow_dye.png +0 -0
  631. package/package.json +1 -1
  632. package/frontend/dist/assets/index-t6K1u4OV.css +0 -32
  633. package/screen/console.png +0 -0
  634. package/screen/dashboard.png +0 -0
  635. package/screen/graph_collabe.png +0 -0
  636. package/screen/graph_live_debug.png +0 -0
  637. package/screen/management_command.png +0 -0
  638. package/screen/node_debug_trace.png +0 -0
  639. package/screen/plugin_/320/276/320/261/320/267/320/276/321/200.png +0 -0
  640. package/screen/websocket.png +0 -0
  641. package/screen//320/275/320/260/321/201/321/202/321/200/320/276/320/271/320/272/320/270_/320/276/321/202/320/264/320/265/320/273/321/214/320/275/321/213/321/205_/320/272/320/276/320/274/320/260/320/275/320/264_/320/272/320/260/320/266/320/264/321/203_/320/272/320/276/320/274/320/260/320/275/320/273/320/264/321/203_/320/274/320/276/320/266/320/275/320/276_/320/275/320/260/321/201/321/202/321/200/320/260/320/270/320/262/320/260/321/202/321/214.png +0 -0
  642. package/screen//320/277/320/273/320/260/320/275/320/270/321/200/320/276/320/262/321/211/320/270/320/272_/320/274/320/276/320/266/320/275/320/276_/320/267/320/260/320/264/320/260/320/262/320/260/321/202/321/214_/320/264/320/265/320/271/321/201/321/202/320/262/320/270/321/217_/320/277/320/276_/320/262/321/200/320/265/320/274/320/265/320/275/320/270.png +0 -0
@@ -89,17 +89,37 @@ router.put('/:botId/users/:username', authenticateUniversal, authorize('manageme
89
89
  updateData.isBlacklisted = isBlacklisted;
90
90
  }
91
91
 
92
- if (Array.isArray(groupIds)) {
93
- await prisma.userGroup.deleteMany({ where: { userId: user.id } });
94
- updateData.groups = {
95
- create: groupIds.map(gid => ({ groupId: gid }))
96
- };
97
- }
92
+ // Используем транзакцию для атомарного обновления групп
93
+ const updatedUser = await prisma.$transaction(async (tx) => {
94
+ // Обновляем основные данные пользователя
95
+ if (Object.keys(updateData).length > 0) {
96
+ await tx.user.update({
97
+ where: { id: user.id },
98
+ data: updateData
99
+ });
100
+ }
101
+
102
+ // Обновляем группы если переданы
103
+ if (Array.isArray(groupIds)) {
104
+ // Удаляем старые связи
105
+ await tx.userGroup.deleteMany({ where: { userId: user.id } });
106
+
107
+ // Создаём новые связи
108
+ if (groupIds.length > 0) {
109
+ await tx.userGroup.createMany({
110
+ data: groupIds.map(groupId => ({
111
+ userId: user.id,
112
+ groupId
113
+ }))
114
+ });
115
+ }
116
+ }
98
117
 
99
- const updatedUser = await prisma.user.update({
100
- where: { id: user.id },
101
- data: updateData,
102
- include: { groups: { include: { group: true } } }
118
+ // Возвращаем обновлённого пользователя с группами
119
+ return tx.user.findUnique({
120
+ where: { id: user.id },
121
+ include: { groups: { include: { group: true } } }
122
+ });
103
123
  });
104
124
 
105
125
  botManager.invalidateUserCache(botId, username);
@@ -16,6 +16,7 @@ const apiKeysRouter = require('./apiKeys');
16
16
  const { deepMergeSettings } = require('../../core/utils/settingsMerger');
17
17
  const { checkBotAccess } = require('../middleware/botAccess');
18
18
  const { filterSecretSettings, prepareSettingsForSave, isGroupedSettings } = require('../../core/utils/secretsFilter');
19
+ const PluginHooks = require('../../core/PluginHooks');
19
20
 
20
21
  const multer = require('multer');
21
22
  const archiver = require('archiver');
@@ -793,21 +794,23 @@ router.put('/:botId/plugins/:pluginId', authenticateUniversal, checkBotAccess, a
793
794
  const pluginId = parseInt(req.params.pluginId);
794
795
  const { isEnabled, settings } = req.body;
795
796
  const dataToUpdate = {};
796
-
797
+
798
+ // Получаем текущий плагин для проверки изменения статуса
799
+ const plugin = await prisma.installedPlugin.findUnique({ where: { id: pluginId } });
800
+ if (!plugin) return res.status(404).json({ error: 'Плагин не найден' });
801
+
802
+ const wasEnabled = plugin.isEnabled;
803
+
797
804
  if (typeof isEnabled === 'boolean') dataToUpdate.isEnabled = isEnabled;
798
-
805
+
799
806
  if (settings) {
800
- // Получаем существующий плагин для обработки секретных значений
801
- const plugin = await prisma.installedPlugin.findUnique({ where: { id: pluginId } });
802
- if (!plugin) return res.status(404).json({ error: 'Плагин не найден' });
803
-
804
807
  const manifest = plugin.manifest ? JSON.parse(plugin.manifest) : {};
805
808
  const existingSettings = plugin.settings ? JSON.parse(plugin.settings) : {};
806
809
  const manifestSettings = manifest.settings || {};
807
-
810
+
808
811
  // Определяем тип настроек (обычные или группированные)
809
812
  const isGrouped = isGroupedSettings(manifestSettings);
810
-
813
+
811
814
  // Подготавливаем настройки для сохранения (сохраняем существующие значения для замаскированных секретов)
812
815
  const settingsToSave = prepareSettingsForSave(settings, existingSettings, manifestSettings, isGrouped);
813
816
 
@@ -819,13 +822,26 @@ router.put('/:botId/plugins/:pluginId', authenticateUniversal, checkBotAccess, a
819
822
 
820
823
  dataToUpdate.settings = JSON.stringify(settingsToSave);
821
824
  }
822
-
825
+
823
826
  if (Object.keys(dataToUpdate).length === 0) return res.status(400).json({ error: "Нет данных для обновления" });
824
827
  const updated = await prisma.installedPlugin.update({ where: { id: pluginId }, data: dataToUpdate });
828
+
829
+ // Вызываем хуки onEnable/onDisable если статус изменился
830
+ if (typeof isEnabled === 'boolean' && wasEnabled !== isEnabled) {
831
+ const pluginHooks = new PluginHooks({ prisma });
832
+ if (isEnabled) {
833
+ // Плагин был включён
834
+ await pluginHooks.callOnEnable(pluginId);
835
+ } else {
836
+ // Плагин был выключен
837
+ await pluginHooks.callOnDisable(pluginId);
838
+ }
839
+ }
840
+
825
841
  res.json(updated);
826
- } catch (error) {
842
+ } catch (error) {
827
843
  console.error("[API Error] /plugins/:pluginId PUT:", error);
828
- res.status(500).json({ error: 'Не удалось обновить плагин' });
844
+ res.status(500).json({ error: 'Не удалось обновить плагин' });
829
845
  }
830
846
  });
831
847
 
@@ -837,6 +853,8 @@ router.get('/:botId/management-data', authenticateUniversal, checkBotAccess, aut
837
853
  const page = parseInt(req.query.page) || 1;
838
854
  const pageSize = parseInt(req.query.pageSize) || 100;
839
855
  const searchQuery = req.query.search || '';
856
+ const sortBy = req.query.sortBy || 'username';
857
+ const sortDir = req.query.sortDir === 'desc' ? 'desc' : 'asc';
840
858
 
841
859
  const userSkip = (page - 1) * pageSize;
842
860
 
@@ -850,21 +868,47 @@ router.get('/:botId/management-data', authenticateUniversal, checkBotAccess, aut
850
868
  };
851
869
  }
852
870
 
871
+ // Определяем сортировку (для groups сортируем после получения данных)
872
+ let orderBy = { username: sortDir };
873
+ if (sortBy === 'isBlacklisted') {
874
+ orderBy = { isBlacklisted: sortDir };
875
+ }
876
+ const sortByGroups = sortBy === 'groups';
877
+
853
878
  const [groups, allPermissions] = await Promise.all([
854
879
  prisma.group.findMany({ where: { botId }, include: { permissions: { include: { permission: true } } }, orderBy: { name: 'asc' } }),
855
880
  prisma.permission.findMany({ where: { botId }, orderBy: { name: 'asc' } })
856
881
  ]);
857
882
 
858
- const [users, usersCount] = await Promise.all([
859
- prisma.user.findMany({
883
+ let users;
884
+ let usersCount;
885
+
886
+ if (sortByGroups) {
887
+ // Для сортировки по группам получаем всех пользователей, сортируем, потом пагинируем
888
+ const allUsers = await prisma.user.findMany({
860
889
  where: whereClause,
861
890
  include: { groups: { include: { group: true } } },
862
- orderBy: { username: 'asc' },
863
- take: pageSize,
864
- skip: userSkip,
865
- }),
866
- prisma.user.count({ where: whereClause })
867
- ]);
891
+ });
892
+
893
+ allUsers.sort((a, b) => {
894
+ const diff = a.groups.length - b.groups.length;
895
+ return sortDir === 'asc' ? diff : -diff;
896
+ });
897
+
898
+ usersCount = allUsers.length;
899
+ users = allUsers.slice(userSkip, userSkip + pageSize);
900
+ } else {
901
+ [users, usersCount] = await Promise.all([
902
+ prisma.user.findMany({
903
+ where: whereClause,
904
+ include: { groups: { include: { group: true } } },
905
+ orderBy,
906
+ take: pageSize,
907
+ skip: userSkip,
908
+ }),
909
+ prisma.user.count({ where: whereClause })
910
+ ]);
911
+ }
868
912
 
869
913
  const templatesMap = new Map(commandManager.getCommandTemplates().map(t => [t.name, t]));
870
914
  let dbCommandsFromDb = await prisma.command.findMany({
@@ -1161,7 +1205,24 @@ router.put('/:botId/users/:userId', authorize('management:edit'), async (req, re
1161
1205
  router.post('/start-all', authorize('bot:start_stop'), async (req, res) => {
1162
1206
  try {
1163
1207
  console.log('[API] Получен запрос на запуск всех ботов.');
1164
- const allBots = await prisma.bot.findMany({ include: { server: true, proxy: true } });
1208
+
1209
+ // Определяем фильтр доступа по ботам для пользователя
1210
+ let whereFilter = {};
1211
+ if (req.user && typeof req.user.userId === 'number') {
1212
+ const panelUser = await prisma.panelUser.findUnique({
1213
+ where: { id: req.user.userId },
1214
+ include: { botAccess: { select: { botId: true } } }
1215
+ });
1216
+ if (panelUser && panelUser.allBots === false) {
1217
+ const allowedIds = panelUser.botAccess.map(a => a.botId);
1218
+ whereFilter = { id: { in: allowedIds.length ? allowedIds : [-1] } };
1219
+ }
1220
+ }
1221
+
1222
+ const allBots = await prisma.bot.findMany({
1223
+ where: whereFilter,
1224
+ include: { server: true, proxy: true }
1225
+ });
1165
1226
  let startedCount = 0;
1166
1227
  for (const botConfig of allBots) {
1167
1228
  if (!botManager.bots.has(botConfig.id)) {
@@ -1176,12 +1237,29 @@ router.post('/start-all', authorize('bot:start_stop'), async (req, res) => {
1176
1237
  }
1177
1238
  });
1178
1239
 
1179
- router.post('/stop-all', authorize('bot:start_stop'), (req, res) => {
1240
+ router.post('/stop-all', authorize('bot:start_stop'), async (req, res) => {
1180
1241
  try {
1181
1242
  console.log('[API] Получен запрос на остановку всех ботов.');
1243
+
1244
+ // Определяем фильтр доступа по ботам для пользователя
1245
+ let allowedBotIds = null;
1246
+ if (req.user && typeof req.user.userId === 'number') {
1247
+ const panelUser = await prisma.panelUser.findUnique({
1248
+ where: { id: req.user.userId },
1249
+ include: { botAccess: { select: { botId: true } } }
1250
+ });
1251
+ if (panelUser && panelUser.allBots === false) {
1252
+ allowedBotIds = new Set(panelUser.botAccess.map(a => a.botId));
1253
+ }
1254
+ }
1255
+
1182
1256
  const botIds = Array.from(botManager.bots.keys());
1183
1257
  let stoppedCount = 0;
1184
1258
  for (const botId of botIds) {
1259
+ // Если у пользователя есть ограничения, проверяем доступ
1260
+ if (allowedBotIds !== null && !allowedBotIds.has(botId)) {
1261
+ continue;
1262
+ }
1185
1263
  botManager.stopBot(botId);
1186
1264
  stoppedCount++;
1187
1265
  }
@@ -68,6 +68,7 @@ async function fetchNewConfig(botId, prisma) {
68
68
  where: { id: botId },
69
69
  include: {
70
70
  server: true,
71
+ proxy: true,
71
72
  installedPlugins: {
72
73
  where: { isEnabled: true }
73
74
  },
@@ -317,6 +318,13 @@ process.on('message', async (message) => {
317
318
  }
318
319
  break;
319
320
 
321
+ case 'hotbar_slot':
322
+ if (command.slot !== undefined && command.slot >= 0 && command.slot <= 8) {
323
+ bot.setQuickBarSlot(command.slot);
324
+ sendLog(`[Viewer] Hotbar slot changed to ${command.slot}`);
325
+ }
326
+ break;
327
+
320
328
  case 'place':
321
329
  if (command.position && command.blockType) {
322
330
  const referenceBlock = bot.blockAt(new Vec3(command.position.x, command.position.y, command.position.z));
@@ -403,7 +411,8 @@ process.on('message', async (message) => {
403
411
  };
404
412
 
405
413
  const context = {
406
- bot: botApi,
414
+ bot: bot, // Полный mineflayer bot
415
+ botApi: botApi, // API для обратной совместимости
407
416
  eventArgs: eventArgs || {},
408
417
  players: playerList,
409
418
  botState: bot ? {
@@ -419,7 +428,7 @@ process.on('message', async (message) => {
419
428
  eventArgs: eventArgs
420
429
  };
421
430
 
422
- const engine = new GraphExecutionEngine(NodeRegistry, botApi);
431
+ const engine = new GraphExecutionEngine(NodeRegistry, bot);
423
432
  await engine.execute(graph, context, eventType);
424
433
 
425
434
 
@@ -841,7 +850,8 @@ process.on('message', async (message) => {
841
850
  } : null;
842
851
 
843
852
  const context = {
844
- bot: botInstance.api,
853
+ bot: botInstance, // Полный mineflayer bot для доступа к blockAt, inventory и т.д.
854
+ botApi: botInstance.api, // API для обратной совместимости
845
855
  user,
846
856
  args,
847
857
  typeChat,
@@ -1108,6 +1118,29 @@ process.on('message', async (message) => {
1108
1118
  });
1109
1119
  }
1110
1120
  });
1121
+
1122
+ bot.on('blockUpdate', (oldBlock, newBlock) => {
1123
+ if (process.send && oldBlock && newBlock) {
1124
+ process.send({
1125
+ type: 'viewer:blockUpdate',
1126
+ payload: {
1127
+ position: {
1128
+ x: newBlock.position.x,
1129
+ y: newBlock.position.y,
1130
+ z: newBlock.position.z
1131
+ },
1132
+ oldBlock: {
1133
+ type: oldBlock.type,
1134
+ name: oldBlock.name
1135
+ },
1136
+ newBlock: {
1137
+ type: newBlock.type,
1138
+ name: newBlock.name
1139
+ }
1140
+ }
1141
+ });
1142
+ }
1143
+ });
1111
1144
  } catch (err) {
1112
1145
  sendLog(`[CRITICAL] Критическая ошибка при создании бота: ${err.stack}`);
1113
1146
  process.exit(1);
@@ -1356,6 +1389,8 @@ process.on('message', async (message) => {
1356
1389
  sendLog('[System] Получена команда на перезагрузку плагинов...');
1357
1390
  const newConfig = await fetchNewConfig(bot.config.id, prisma);
1358
1391
  if (newConfig) {
1392
+ // Обновляем конфигурацию бота, сохраняя все поля включая прокси
1393
+ bot.config = { ...bot.config, ...newConfig };
1359
1394
  bot.config.plugins = newConfig.installedPlugins;
1360
1395
  bot.commands.clear();
1361
1396
  await loadCommands(bot, newConfig.commands);
@@ -1426,7 +1461,8 @@ process.on('message', async (message) => {
1426
1461
  const players = bot ? Object.keys(bot.players) : [];
1427
1462
 
1428
1463
  const context = {
1429
- bot: botApi,
1464
+ bot: bot, // Полный mineflayer bot
1465
+ botApi: botApi, // API для обратной совместимости
1430
1466
  players,
1431
1467
  botState: {
1432
1468
  health: bot?.health,
@@ -1449,7 +1485,7 @@ process.on('message', async (message) => {
1449
1485
  eventArgs: eventArgs
1450
1486
  };
1451
1487
 
1452
- const engine = new GraphExecutionEngine(NodeRegistry, botApi);
1488
+ const engine = new GraphExecutionEngine(NodeRegistry, bot);
1453
1489
 
1454
1490
  await engine.execute(graph, context, eventType);
1455
1491
 
@@ -172,8 +172,15 @@ class GraphExecutionEngine {
172
172
  }
173
173
 
174
174
  async traverse(node, fromPinId) {
175
- const connection = this.activeGraph.connections.find(c => c.sourceNodeId === node.id && c.sourcePinId === fromPinId);
176
- if (!connection) return;
175
+ // Находим соединение к СУЩЕСТВУЮЩЕЙ ноде (пропускаем мусорные соединения к удалённым нодам)
176
+ const connection = this.activeGraph.connections.find(c => {
177
+ if (c.sourceNodeId !== node.id || c.sourcePinId !== fromPinId) return false;
178
+ const targetExists = this.activeGraph.nodes.some(n => n.id === c.targetNodeId);
179
+ return targetExists;
180
+ });
181
+ if (!connection) {
182
+ return;
183
+ }
177
184
 
178
185
  const nextNode = this.activeGraph.nodes.find(n => n.id === connection.targetNodeId);
179
186
  if (!nextNode) return;
@@ -0,0 +1,221 @@
1
+ const path = require('path');
2
+ const fse = require('fs-extra');
3
+ const { createRequire } = require('module');
4
+ const { pathToFileURL } = require('url');
5
+ const PluginStore = require('../plugins/PluginStore');
6
+
7
+ /**
8
+ * Сервис для вызова хуков плагинов
9
+ * Поддерживаемые хуки:
10
+ * - onLoad(bot, options) - при загрузке плагина
11
+ * - onUnload({ botId, prisma }) - при удалении плагина
12
+ * - onEnable({ botId, settings, store, prisma }) - при включении плагина
13
+ * - onDisable({ botId, settings, store, prisma }) - при выключении плагина
14
+ * - onUpdate({ botId, oldVersion, newVersion, settings, store, prisma }) - при обновлении плагина
15
+ */
16
+ class PluginHooks {
17
+ constructor({ prisma }) {
18
+ this.prisma = prisma;
19
+ }
20
+
21
+ /**
22
+ * Загружает модуль плагина
23
+ * @private
24
+ */
25
+ async _loadPluginModule(pluginPath, mainFile = 'index.js') {
26
+ const entryPointPath = path.join(pluginPath, mainFile);
27
+
28
+ if (!await fse.pathExists(entryPointPath)) {
29
+ return null;
30
+ }
31
+
32
+ const pluginRequire = createRequire(entryPointPath);
33
+
34
+ // Очищаем кэш для актуальной версии модуля
35
+ try {
36
+ const resolvedPath = require.resolve(entryPointPath);
37
+ if (require.cache[resolvedPath]) {
38
+ delete require.cache[resolvedPath];
39
+ }
40
+ } catch (e) {
41
+ // Игнорируем ошибки очистки кэша
42
+ }
43
+
44
+ try {
45
+ // Пробуем CommonJS
46
+ return pluginRequire(entryPointPath);
47
+ } catch (e) {
48
+ if (e.code === 'ERR_REQUIRE_ESM' || /Cannot use import statement|Unexpected token 'export'/.test(e.message)) {
49
+ // Пробуем ESM
50
+ const moduleUrl = pathToFileURL(entryPointPath).href;
51
+ const esmModule = await import(moduleUrl);
52
+ return esmModule && esmModule.default ? esmModule.default : esmModule;
53
+ }
54
+ throw e;
55
+ }
56
+ }
57
+
58
+ /**
59
+ * Подготавливает настройки плагина
60
+ * @private
61
+ */
62
+ _prepareSettings(plugin) {
63
+ try {
64
+ const manifest = plugin.manifest ? JSON.parse(plugin.manifest) : {};
65
+ const savedSettings = plugin.settings ? JSON.parse(plugin.settings) : {};
66
+ const defaultSettings = {};
67
+
68
+ if (manifest.settings) {
69
+ for (const key in manifest.settings) {
70
+ const config = manifest.settings[key];
71
+ try {
72
+ defaultSettings[key] = JSON.parse(config.default || 'null');
73
+ } catch {
74
+ defaultSettings[key] = config.default;
75
+ }
76
+ }
77
+ }
78
+
79
+ // Мержим дефолтные с сохранёнными
80
+ return { ...defaultSettings, ...savedSettings };
81
+ } catch (e) {
82
+ console.error(`[PluginHooks] Ошибка подготовки настроек:`, e);
83
+ return {};
84
+ }
85
+ }
86
+
87
+ /**
88
+ * Вызывает хук onEnable при включении плагина
89
+ * @param {number} pluginId - ID плагина
90
+ * @returns {Promise<boolean>} - true если хук успешно выполнен
91
+ */
92
+ async callOnEnable(pluginId) {
93
+ const plugin = await this.prisma.installedPlugin.findUnique({ where: { id: pluginId } });
94
+ if (!plugin) {
95
+ console.error(`[PluginHooks] Плагин ${pluginId} не найден`);
96
+ return false;
97
+ }
98
+
99
+ try {
100
+ const manifest = plugin.manifest ? JSON.parse(plugin.manifest) : {};
101
+ const mainFile = manifest.main || 'index.js';
102
+ const pluginModule = await this._loadPluginModule(plugin.path, mainFile);
103
+
104
+ if (!pluginModule || typeof pluginModule.onEnable !== 'function') {
105
+ // Хук не определён - это нормально
106
+ console.log(`[PluginHooks] Плагин ${plugin.name} не имеет хука onEnable`);
107
+ return true;
108
+ }
109
+
110
+ const settings = this._prepareSettings(plugin);
111
+ const store = new PluginStore(this.prisma, plugin.botId, plugin.name);
112
+
113
+ console.log(`[PluginHooks] Вызов onEnable для плагина ${plugin.name}...`);
114
+
115
+ await pluginModule.onEnable({
116
+ botId: plugin.botId,
117
+ settings,
118
+ store,
119
+ prisma: this.prisma
120
+ });
121
+
122
+ console.log(`[PluginHooks] Хук onEnable для ${plugin.name} успешно выполнен`);
123
+ return true;
124
+ } catch (error) {
125
+ console.error(`[PluginHooks] Ошибка выполнения onEnable для ${plugin.name}:`, error);
126
+ return false;
127
+ }
128
+ }
129
+
130
+ /**
131
+ * Вызывает хук onDisable при выключении плагина
132
+ * @param {number} pluginId - ID плагина
133
+ * @returns {Promise<boolean>} - true если хук успешно выполнен
134
+ */
135
+ async callOnDisable(pluginId) {
136
+ const plugin = await this.prisma.installedPlugin.findUnique({ where: { id: pluginId } });
137
+ if (!plugin) {
138
+ console.error(`[PluginHooks] Плагин ${pluginId} не найден`);
139
+ return false;
140
+ }
141
+
142
+ try {
143
+ const manifest = plugin.manifest ? JSON.parse(plugin.manifest) : {};
144
+ const mainFile = manifest.main || 'index.js';
145
+ const pluginModule = await this._loadPluginModule(plugin.path, mainFile);
146
+
147
+ if (!pluginModule || typeof pluginModule.onDisable !== 'function') {
148
+ // Хук не определён - это нормально
149
+ console.log(`[PluginHooks] Плагин ${plugin.name} не имеет хука onDisable`);
150
+ return true;
151
+ }
152
+
153
+ const settings = this._prepareSettings(plugin);
154
+ const store = new PluginStore(this.prisma, plugin.botId, plugin.name);
155
+
156
+ console.log(`[PluginHooks] Вызов onDisable для плагина ${plugin.name}...`);
157
+
158
+ await pluginModule.onDisable({
159
+ botId: plugin.botId,
160
+ settings,
161
+ store,
162
+ prisma: this.prisma
163
+ });
164
+
165
+ console.log(`[PluginHooks] Хук onDisable для ${plugin.name} успешно выполнен`);
166
+ return true;
167
+ } catch (error) {
168
+ console.error(`[PluginHooks] Ошибка выполнения onDisable для ${plugin.name}:`, error);
169
+ return false;
170
+ }
171
+ }
172
+
173
+ /**
174
+ * Вызывает хук onUpdate при обновлении плагина
175
+ * @param {number} pluginId - ID нового плагина
176
+ * @param {string} oldVersion - старая версия
177
+ * @param {string} newVersion - новая версия
178
+ * @returns {Promise<boolean>} - true если хук успешно выполнен
179
+ */
180
+ async callOnUpdate(pluginId, oldVersion, newVersion) {
181
+ const plugin = await this.prisma.installedPlugin.findUnique({ where: { id: pluginId } });
182
+ if (!plugin) {
183
+ console.error(`[PluginHooks] Плагин ${pluginId} не найден`);
184
+ return false;
185
+ }
186
+
187
+ try {
188
+ const manifest = plugin.manifest ? JSON.parse(plugin.manifest) : {};
189
+ const mainFile = manifest.main || 'index.js';
190
+ const pluginModule = await this._loadPluginModule(plugin.path, mainFile);
191
+
192
+ if (!pluginModule || typeof pluginModule.onUpdate !== 'function') {
193
+ // Хук не определён - это нормально
194
+ console.log(`[PluginHooks] Плагин ${plugin.name} не имеет хука onUpdate`);
195
+ return true;
196
+ }
197
+
198
+ const settings = this._prepareSettings(plugin);
199
+ const store = new PluginStore(this.prisma, plugin.botId, plugin.name);
200
+
201
+ console.log(`[PluginHooks] Вызов onUpdate для плагина ${plugin.name} (${oldVersion} → ${newVersion})...`);
202
+
203
+ await pluginModule.onUpdate({
204
+ botId: plugin.botId,
205
+ oldVersion,
206
+ newVersion,
207
+ settings,
208
+ store,
209
+ prisma: this.prisma
210
+ });
211
+
212
+ console.log(`[PluginHooks] Хук onUpdate для ${plugin.name} успешно выполнен`);
213
+ return true;
214
+ } catch (error) {
215
+ console.error(`[PluginHooks] Ошибка выполнения onUpdate для ${plugin.name}:`, error);
216
+ return false;
217
+ }
218
+ }
219
+ }
220
+
221
+ module.exports = PluginHooks;
@@ -5,6 +5,7 @@ const { execSync } = require('child_process');
5
5
  const { PrismaClient } = require('@prisma/client');
6
6
  const AdmZip = require('adm-zip');
7
7
  const semver = require('semver');
8
+ const PluginHooks = require('./PluginHooks');
8
9
 
9
10
  const prisma = new PrismaClient();
10
11
 
@@ -402,6 +403,15 @@ class PluginManager {
402
403
  }
403
404
  }
404
405
 
406
+ // Вызываем хук onUpdate для миграции данных плагина
407
+ try {
408
+ const pluginHooks = new PluginHooks({ prisma });
409
+ await pluginHooks.callOnUpdate(newPlugin.id, oldVersion, newPlugin.version);
410
+ } catch (hookError) {
411
+ console.error(`[PluginManager] Ошибка выполнения хука onUpdate для ${plugin.name}:`, hookError);
412
+ // Не прерываем обновление из-за ошибки в хуке
413
+ }
414
+
405
415
  return newPlugin;
406
416
  }
407
417