diff --git a/nodejs/conf/base.js b/nodejs/conf/base.js
index 532bd3e..a280cdd 100644
--- a/nodejs/conf/base.js
+++ b/nodejs/conf/base.js
@@ -13,6 +13,25 @@ module.exports = {
"plugings": {
"swing": {},
},
+ "storage": {
+ "dbPath": "./storage/storage.db",
+ "scanRadius": 30,
+ "homePos": null,
+ "categories": {
+ "minerals": ["diamond", "netherite_ingot", "gold_ingot", "iron_ingot", "copper_ingot", "emerald", "redstone", "lapis_lazuli", "raw_iron", "raw_gold", "raw_copper"],
+ "food": ["bread", "cooked_porkchop", "cooked_beef", "steak", "golden_apple", "cooked_chicken", "cooked_mutton", "carrot", "potato", "baked_potato", "golden_carrot"],
+ "tools": ["wooden_sword", "stone_sword", "iron_sword", "diamond_sword", "netherite_sword", "wooden_pickaxe", "stone_pickaxe", "iron_pickaxe", "diamond_pickaxe", "netherite_pickaxe", "wooden_axe", "stone_axe", "iron_axe", "diamond_axe", "netherite_axe", "fishing_rod", "shears"],
+ "armor": ["leather_helmet", "iron_helmet", "diamond_helmet", "netherite_helmet", "leather_chestplate", "iron_chestplate", "diamond_chestplate", "netherite_chestplate", "leather_leggings", "iron_leggings", "diamond_leggings", "netherite leggings", "leather_boots", "iron_boots", "diamond_boots", "netherite_boots"],
+ "blocks": ["stone", "dirt", "cobblestone", "oak_planks", "spruce_planks", "birch_planks", "oak_log", "spruce_log", "birch_log", "cobblestone_stairs", "stone_bricks", "deepslate", "diorite", "granite", "andesite", "tuff", "calcite", "copper_ore", "deepslate_copper_ore", "raw_iron", "raw_gold", "deepslate_gold_ore", "raw_copper"],
+ "redstone": ["redstone", "repeater", "comparator", "piston", "sticky_piston", "redstone_torch", "lever", "tripwire_hook", "redstone_block", "observer", "dropper", "hopper", "dispenser",],
+ "misc": [] // Everything else falls here
+ },
+ "inboxShulkerName": "INBOX",
+ "outboxShulkerName": "OUTBOX",
+ "newShulkersName": "EMPTY",
+ "webPort": 3000,
+ "webHost": "0.0.0.0"
+ },
"ai":{
// AI provider: 'gemini' (default) or 'ollama'
"provider": "gemini",
diff --git a/nodejs/controller/commands/default.js b/nodejs/controller/commands/default.js
index 83f285a..19912f0 100644
--- a/nodejs/controller/commands/default.js
+++ b/nodejs/controller/commands/default.js
@@ -144,4 +144,46 @@ module.exports = {
}
}
},
+ 'summon': {
+ desc: `Summon a bot online indefinitely`,
+ allowed: ['wmantly', 'useless666', 'tux4242'],
+ ignoreLock: true,
+ async function(from, botName){
+ if(botName in this.constructor.bots){
+ let bot = this.constructor.bots[botName];
+
+ if (!bot.isReady){
+ try{
+ await bot.connect();
+ this.whisper(from, `${botName} is now online`);
+ }catch(error){
+ this.whisper(from, `Failed to summon ${botName}. Try again later.`);
+ }
+ } else {
+ this.whisper(from, `${botName} is already online`);
+ }
+ } else {
+ this.whisper(from, `Unknown bot: ${botName}`);
+ }
+ }
+ },
+ 'dismiss': {
+ desc: `Send a bot offline`,
+ allowed: ['wmantly', 'useless666', 'tux4242'],
+ ignoreLock: true,
+ async function(from, botName){
+ if(botName in this.constructor.bots){
+ let bot = this.constructor.bots[botName];
+
+ if(bot.isReady){
+ bot.quit();
+ this.whisper(from, `${botName} is now offline`);
+ } else {
+ this.whisper(from, `${botName} is already offline`);
+ }
+ } else {
+ this.whisper(from, `Unknown bot: ${botName}`);
+ }
+ }
+ },
};
diff --git a/nodejs/controller/commands/index.js b/nodejs/controller/commands/index.js
index 9ef89b4..fa69460 100644
--- a/nodejs/controller/commands/index.js
+++ b/nodejs/controller/commands/index.js
@@ -1,8 +1,11 @@
'use strict';
+const conf = require('.');
+
module.exports = {
default: require('./default'),
fun: require('./fun'),
invite: require('./invite'),
trade: require('./trade'),
-};
+ storage: require('./storage'),
+};
\ No newline at end of file
diff --git a/nodejs/controller/commands/storage.js b/nodejs/controller/commands/storage.js
new file mode 100644
index 0000000..ae33997
--- /dev/null
+++ b/nodejs/controller/commands/storage.js
@@ -0,0 +1,106 @@
+'use strict';
+
+// Owner players who can run admin commands
+const owners = ['wmantly', 'useless666', 'tux4242'];
+// Team players who can use basic storage features
+const team = [...owners, 'pi_chef', 'Ethan', 'Vince_NL'];
+
+module.exports = {
+ 'scan': {
+ desc: 'Force chest area scan',
+ allowed: owners,
+ ignoreLock: true,
+ async function(from) {
+ console.log(`Storage command 'scan' from ${from}`);
+ const storage = this.plunginsLoaded['Storage'];
+ if (!storage) return this.whisper(from, 'Storage plugin not loaded');
+ await storage.handleCommand(from, 'scan');
+ }
+ },
+ 'status': {
+ desc: 'Show storage stats',
+ allowed: team,
+ async function(from) {
+ console.log(`Storage command 'status' from ${from}`);
+ const storage = this.plunginsLoaded['Storage'];
+ if (!storage) return this.whisper(from, 'Storage plugin not loaded');
+ await storage.handleCommand(from, 'status');
+ }
+ },
+ 'withdraw': {
+ desc: 'Withdraw items from storage',
+ allowed: team,
+ async function(from, itemName, countStr) {
+ console.log(`Storage command 'withdraw' from ${from}: ${itemName} x${countStr}`);
+ const storage = this.plunginsLoaded['Storage'];
+ if (!storage) return this.whisper(from, 'Storage plugin not loaded');
+ const count = parseInt(countStr) || 1;
+ await storage.handleCommand(from, 'withdraw', itemName, count);
+ }
+ },
+ 'find': {
+ desc: 'Search for an item',
+ allowed: team,
+ async function(from, itemName) {
+ console.log(`Storage command 'find' from ${from}: ${itemName}`);
+ const storage = this.plunginsLoaded['Storage'];
+ if (!storage) return this.whisper(from, 'Storage plugin not loaded');
+ await storage.handleCommand(from, 'find', itemName);
+ }
+ },
+ 'chests': {
+ desc: 'List tracked chests',
+ allowed: owners,
+ ignoreLock: true,
+ async function(from) {
+ console.log(`Storage command 'chests' from ${from}`);
+ const storage = this.plunginsLoaded['Storage'];
+ if (!storage) return this.whisper(from, 'Storage plugin not loaded');
+ await storage.handleCommand(from, 'chests');
+ }
+ },
+ 'organize': {
+ desc: 'Force full re-sort',
+ allowed: owners,
+ ignoreLock: true,
+ async function(from) {
+ console.log(`Storage command 'organize' from ${from}`);
+ const storage = this.plunginsLoaded['Storage'];
+ if (!storage) return this.whisper(from, 'Storage plugin not loaded');
+ await storage.handleCommand(from, 'organize');
+ }
+ },
+ 'addplayer': {
+ desc: 'Add player to storage',
+ allowed: owners,
+ ignoreLock: true,
+ async function(from, name, role = 'team') {
+ console.log(`Storage command 'addplayer' from ${from}: ${name} as ${role}`);
+ const storage = this.plunginsLoaded['Storage'];
+ if (!storage) return this.whisper(from, 'Storage plugin not loaded');
+ await storage.handleCommand(from, 'addplayer', name, role);
+ }
+ },
+ 'removeplayer': {
+ desc: 'Remove player from storage',
+ allowed: owners,
+ ignoreLock: true,
+ async function(from, name) {
+ console.log(`Storage command 'removeplayer' from ${from}: ${name}`);
+ const storage = this.plunginsLoaded['Storage'];
+ if (!storage) return this.whisper(from, 'Storage plugin not loaded');
+ await storage.handleCommand(from, 'removeplayer', name);
+ }
+ },
+ 'players': {
+ desc: 'List authorized players',
+ allowed: owners,
+ ignoreLock: true,
+ async function(from) {
+ console.log(`Storage command 'players' from ${from}`);
+ const storage = this.plunginsLoaded['Storage'];
+ if (!storage) return this.whisper(from, 'Storage plugin not loaded');
+ await storage.handleCommand(from, 'players');
+ }
+ },
+};
diff --git a/nodejs/controller/commands/trade.js b/nodejs/controller/commands/trade.js
index 76b032f..b7028ce 100644
--- a/nodejs/controller/commands/trade.js
+++ b/nodejs/controller/commands/trade.js
@@ -30,6 +30,45 @@ module.exports = {
'.trade': {
desc: 'Bot will take trade requests',
async function(from){
+ // Check if bot has StoragePlugin
+ if (this.plunginsLoaded['Storage']) {
+ // Storage bot flow
+ await this.say('/trade accept');
+ let window = await this.once('windowOpen');
+
+ // Collect items received from player
+ const itemsReceived = [];
+ const customerSlots = [5, 6, 7, 8, 14, 15, 16, 17, 23, 24, 25, 26];
+
+ for (const slotNum of customerSlots) {
+ const item = window.slots[slotNum];
+ if (item) {
+ itemsReceived.push({
+ name: item.name,
+ id: item.type,
+ count: item.count,
+ nbt: item.nbt
+ });
+ }
+ }
+
+ // Confirm and log trade
+ this.bot.moveSlotItem(37, 37);
+
+ // Wait for trade to complete
+ await this.once('windowClose');
+
+ // Handle the trade items
+ if (itemsReceived.length > 0) {
+ await this.plunginsLoaded['Storage'].handleTrade(from, itemsReceived);
+ this.whisper(from, `Received ${itemsReceived.length} item type(s). Sorting into storage.`);
+ } else {
+ this.whisper(from, `No items received.`);
+ }
+ return;
+ }
+
+ // Original sign-based flow for non-storage bots
/*
todo
diff --git a/nodejs/controller/mc-bot.js b/nodejs/controller/mc-bot.js
index 536e4fb..ac1d381 100644
--- a/nodejs/controller/mc-bot.js
+++ b/nodejs/controller/mc-bot.js
@@ -15,6 +15,7 @@ CJbot.pluginAdd(require('./ai'));
CJbot.pluginAdd(require('./guardianFarm'));
CJbot.pluginAdd(require('./goldFarm'));
CJbot.pluginAdd(require('./craft_chests'));
+CJbot.pluginAdd(require('./storage'));
for(let name in conf.mc.bots){
if(CJbot.bots[name]) continue;
diff --git a/nodejs/controller/storage.js b/nodejs/controller/storage.js
new file mode 100644
index 0000000..58cacee
--- /dev/null
+++ b/nodejs/controller/storage.js
@@ -0,0 +1,4 @@
+'use strict';
+
+// Re-export the Storage plugin from the storage directory
+module.exports = require('./storage/index');
diff --git a/nodejs/controller/storage/database.js b/nodejs/controller/storage/database.js
new file mode 100644
index 0000000..04fe014
--- /dev/null
+++ b/nodejs/controller/storage/database.js
@@ -0,0 +1,477 @@
+'use strict';
+
+const sqlite3 = require('sqlite3').verbose();
+const { open } = require('sqlite');
+const path = require('path');
+const fs = require('fs');
+
+class Database {
+ constructor() {
+ this.db = null;
+ }
+
+ async initialize(dbPath) {
+ // Ensure directory exists
+ const dir = path.dirname(dbPath);
+ if (!fs.existsSync(dir)) {
+ fs.mkdirSync(dir, { recursive: true });
+ }
+
+ this.db = await open({
+ filename: dbPath,
+ driver: sqlite3.Database
+ });
+
+ await this.createTables();
+ await this.insertDefaultPermissions();
+
+ console.log('Database initialized:', dbPath);
+ return this.db;
+ }
+
+ async createTables() {
+ // Permissions table
+ await this.db.exec(`
+ CREATE TABLE IF NOT EXISTS permissions (
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
+ player_name TEXT UNIQUE NOT NULL,
+ role TEXT DEFAULT 'team' NOT NULL CHECK(role IN ('owner', 'team', 'readonly')),
+ joined_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
+ )
+ `);
+
+ // Chests table
+ await this.db.exec(`
+ CREATE TABLE IF NOT EXISTS chests (
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
+ pos_x INTEGER NOT NULL,
+ pos_y INTEGER NOT NULL,
+ pos_z INTEGER NOT NULL,
+ chest_type TEXT NOT NULL CHECK(chest_type IN ('single', 'double')),
+ row INTEGER NOT NULL,
+ column INTEGER NOT NULL,
+ category TEXT,
+ last_scan TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
+ UNIQUE(pos_x, pos_y, pos_z)
+ )
+ `);
+
+ // Shulkers table
+ await this.db.exec(`
+ CREATE TABLE IF NOT EXISTS shulkers (
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
+ chest_id INTEGER NOT NULL,
+ slot INTEGER NOT NULL,
+ shulker_type TEXT DEFAULT 'shulker_box',
+ category TEXT,
+ item_focus TEXT,
+ slot_count INTEGER DEFAULT 27,
+ total_items INTEGER DEFAULT 0,
+ last_scan TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
+ FOREIGN KEY (chest_id) REFERENCES chests(id) ON DELETE CASCADE
+ )
+ `);
+
+ // Shulker items table
+ await this.db.exec(`
+ CREATE TABLE IF NOT EXISTS shulker_items (
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
+ shulker_id INTEGER NOT NULL,
+ item_name TEXT NOT NULL,
+ item_id INTEGER NOT NULL,
+ slot INTEGER NOT NULL,
+ count INTEGER NOT NULL,
+ nbt_data TEXT,
+ FOREIGN KEY (shulker_id) REFERENCES shulkers(id) ON DELETE CASCADE,
+ UNIQUE(shulker_id, item_id),
+ CHECK(slot >= 0 AND slot <= 26),
+ CHECK(count > 0 AND count <= 64)
+ )
+ `);
+
+ // Trades table
+ await this.db.exec(`
+ CREATE TABLE IF NOT EXISTS trades (
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
+ player_name TEXT NOT NULL,
+ action TEXT NOT NULL CHECK(action IN ('deposit', 'withdraw')),
+ items TEXT NOT NULL,
+ timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP
+ )
+ `);
+
+ // Pending withdrawals table
+ await this.db.exec(`
+ CREATE TABLE IF NOT EXISTS pending_withdrawals (
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
+ player_name TEXT NOT NULL,
+ item_id INTEGER NOT NULL,
+ item_name TEXT NOT NULL,
+ requested_count INTEGER NOT NULL,
+ status TEXT DEFAULT 'pending' CHECK(status IN ('pending', 'ready', 'completed', 'cancelled')),
+ timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP
+ )
+ `);
+
+ // Item index for fast searches
+ await this.db.exec(`
+ CREATE TABLE IF NOT EXISTS item_index (
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
+ item_id INTEGER UNIQUE NOT NULL,
+ item_name TEXT NOT NULL,
+ total_count INTEGER DEFAULT 0,
+ shulker_ids TEXT,
+ last_updated TIMESTAMP DEFAULT CURRENT_TIMESTAMP
+ )
+ `);
+ }
+
+ async insertDefaultPermissions() {
+ const conf = require('../../conf');
+ const defaultPlayers = conf.storage?.defaultPlayers || [];
+
+ for (const player of defaultPlayers) {
+ try {
+ await this.db.run(
+ 'INSERT OR IGNORE INTO permissions (player_name, role) VALUES (?, ?)',
+ [player.name, player.role]
+ );
+ } catch (error) {
+ console.error('Error inserting default player:', player.name, error);
+ }
+ }
+ }
+
+ // ========================================
+ // Permissions
+ // ========================================
+
+ async addPlayer(name, Role = 'team') {
+ return await this.db.run(
+ 'INSERT INTO permissions (player_name, role) VALUES (?, ?)',
+ [name, Role]
+ );
+ }
+
+ async removePlayer(name) {
+ return await this.db.run('DELETE FROM permissions WHERE player_name = ?', [name]);
+ }
+
+ async getPlayerRole(name) {
+ const row = await this.db.get('SELECT role FROM permissions WHERE player_name = ?', [name]);
+ return row ? row.role : null;
+ }
+
+ async getAllPlayers() {
+ return await this.db.all('SELECT * FROM permissions ORDER BY role DESC, player_name ASC');
+ }
+
+ async checkPermission(name, requiredRole) {
+ const role = await this.getPlayerRole(name);
+ if (!role) return false;
+
+ const roles = ['readonly', 'team', 'owner'];
+ return roles.indexOf(role) >= roles.indexOf(requiredRole);
+ }
+
+ // ========================================
+ // Chests
+ // ========================================
+
+ async upsertChest(x, y, z, chestType, row, column, category = null) {
+ return await this.db.run(`
+ INSERT INTO chests (pos_x, pos_y, pos_z, chest_type, row, column, category)
+ VALUES (?, ?, ?, ?, ?, ?, ?)
+ ON CONFLICT(pos_x, pos_y, pos_z) DO UPDATE SET
+ chest_type = excluded.chest_type,
+ row = excluded.row,
+ column = excluded.column,
+ category = excluded.category,
+ last_scan = CURRENT_TIMESTAMP
+ `, [x, y, z, chestType, row, column, category]);
+ }
+
+ async getChests() {
+ return await this.db.all('SELECT * FROM chests ORDER BY row, column');
+ }
+
+ async getChestById(id) {
+ return await this.db.get('SELECT * FROM chests WHERE id = ?', [id]);
+ }
+
+ async getChestByPosition(x, y, z) {
+ return await this.db.get(
+ 'SELECT * FROM chests WHERE pos_x = ? AND pos_y = ? AND pos_z = ?',
+ [x, y, z]
+ );
+ }
+
+ async deleteOrphanChests(knownChestPositions) {
+ // knownChestPositions is array of {x, y, z}
+ if (knownChestPositions.length === 0) return;
+
+ const placeholders = knownChestPositions.map(() => '(?, ?, ?)').join(', ');
+ const values = knownChestPositions.flatMap(p => [p.x, p.y, p.z]);
+
+ return await this.db.run(`
+ DELETE FROM chests
+ WHERE (pos_x, pos_y, pos_z) NOT IN (${placeholders})
+ `, values);
+ }
+
+ // ========================================
+ // Shulkers
+ // ========================================
+
+ async upsertShulker(chestId, slot, shulkerType, category = null, itemFocus = null) {
+ const result = await this.db.run(`
+ INSERT INTO shulkers (chest_id, slot, shulker_type, category, item_focus)
+ VALUES (?, ?, ?, ?, ?)
+ ON CONFLICT(id) DO UPDATE SET
+ slot_count = excluded.slot_count,
+ total_items = excluded.total_items,
+ last_scan = CURRENT_TIMESTAMP
+ `, [chestId, slot, shulkerType, category, itemFocus]);
+
+ return result.lastID;
+ }
+
+ async getShulkersByChest(chestId) {
+ return await this.db.all('SELECT * FROM shulkers WHERE chest_id = ? ORDER BY slot', [chestId]);
+ }
+
+ async getAllShulkers() {
+ return await this.db.all('SELECT * FROM shulkers ORDER BY id');
+ }
+
+ async getShulkerById(id) {
+ return await this.db.get('SELECT * FROM shulkers WHERE id = ?', [id]);
+ }
+
+ async findShulkerForItem(itemId, categoryName) {
+ // Find shulker with matching item and space
+ return await this.db.get(`
+ SELECT s.*, si.count as slot_item_count
+ FROM shulkers s
+ INNER JOIN shulker_items si ON s.id = si.shulker_id
+ WHERE s.item_focus = (SELECT item_name FROM shulker_items WHERE item_id = ? LIMIT 1)
+ AND s.category = ?
+ AND s.slot_count < 27
+ LIMIT 1
+ `, [itemId, categoryName]);
+ }
+
+ async createEmptyShulker(chestId, slot, categoryName, shulkerType = 'shulker_box') {
+ return await this.db.run(`
+ INSERT INTO shulkers (chest_id, slot, shulker_type, category, item_focus, slot_count, total_items)
+ VALUES (?, ?, ?, ?, NULL, 0, 0)
+ `, [chestId, slot, shulkerType, categoryName]);
+ }
+
+ async updateShulkerCounts(shulkerId, slotCount, totalItems) {
+ return await this.db.run(`
+ UPDATE shulkers
+ SET slot_count = ?, total_items = ?, last_scan = CURRENT_TIMESTAMP
+ WHERE id = ?
+ `, [slotCount, totalItems, shulkerId]);
+ }
+
+ async deleteShulker(id) {
+ return await this.db.run('DELETE FROM shulkers WHERE id = ?', [id]);
+ }
+
+ // ========================================
+ // Shulker Items
+ // ========================================
+
+ async upsertShulkerItem(shulkerId, itemId, itemName, slot, count, nbt = null) {
+ return await this.db.run(`
+ INSERT INTO shulker_items (shulker_id, item_id, item_name, slot, count, nbt_data)
+ VALUES (?, ?, ?, ?, ?, ?)
+ ON CONFLICT(shulker_id, item_id) DO UPDATE SET
+ slot = excluded.slot,
+ count = excluded.count,
+ nbt_data = excluded.nbt_data
+ `, [shulkerId, itemId, itemName, slot, count, nbt ? JSON.stringify(nbt) : null]);
+ }
+
+ async getShulkerItems(shulkerId) {
+ return await this.db.all('SELECT * FROM shulker_items WHERE shulker_id = ? ORDER BY slot', [shulkerId]);
+ }
+
+ async deleteShulkerItem(shulkerId, itemId) {
+ return await this.db.run('DELETE FROM shulker_items WHERE shulker_id = ? AND item_id = ?', [shulkerId, itemId]);
+ }
+
+ async clearShulkerItems(shulkerId) {
+ return await this.db.run('DELETE FROM shulker_items WHERE shulker_id = ?', [shulkerId]);
+ }
+
+ // ========================================
+ // Trades
+ // ========================================
+
+ async logTrade(playerName, action, items) {
+ return await this.db.run(
+ 'INSERT INTO trades (player_name, action, items) VALUES (?, ?, ?)',
+ [playerName, action, JSON.stringify(items)]
+ );
+ }
+
+ async getRecentTrades(limit = 50) {
+ return await this.db.all(
+ 'SELECT * FROM trades ORDER BY timestamp DESC LIMIT ?',
+ [limit]
+ );
+ }
+
+ async getTradesByPlayer(playerName, limit = 50) {
+ return await this.db.all(
+ 'SELECT * FROM trades WHERE player_name = ? ORDER BY timestamp DESC LIMIT ?',
+ [playerName, limit]
+ );
+ }
+
+ // ========================================
+ // Pending Withdrawals
+ // ========================================
+
+ async queueWithdrawal(playerName, itemId, itemName, count) {
+ return await this.db.run(`
+ INSERT INTO pending_withdrawals (player_name, item_id, item_name, requested_count)
+ VALUES (?, ?, ?, ?)
+ `, [playerName, itemId, itemName, count]);
+ }
+
+ async getPendingWithdrawals(playerName) {
+ return await this.db.all(`
+ SELECT * FROM pending_withdrawals
+ WHERE player_name = ? AND status IN ('pending', 'ready')
+ ORDER BY timestamp ASC
+ `, [playerName]);
+ }
+
+ async getWithdrawalById(id) {
+ return await this.db.get('SELECT * FROM pending_withdrawals WHERE id = ?', [id]);
+ }
+
+ async updateWithdrawStatus(id, status) {
+ return await this.db.run(
+ 'UPDATE pending_withdrawals SET status = ? WHERE id = ?',
+ [status, id]
+ );
+ }
+
+ async markCompletedWithdrawals(playerName) {
+ return await this.db.run(`
+ UPDATE pending_withdrawals
+ SET status = 'completed'
+ WHERE player_name = ? AND status = 'ready'
+ `, [playerName]);
+ }
+
+ // ========================================
+ // Item Index
+ // ========================================
+
+ async updateItemIndex(itemId, itemName, shulkerId, count) {
+ // This is a simplified version - in production, you'd want to handle
+ // the shulker_ids JSON aggregation more carefully
+ return await this.db.run(`
+ INSERT INTO item_index (item_id, item_name, total_count)
+ VALUES (?, ?, ?)
+ ON CONFLICT(item_id) DO UPDATE SET
+ total_count = total_count + ?,
+ last_updated = CURRENT_TIMESTAMP
+ `, [itemId, itemName, count, count]);
+ }
+
+ async rebuildItemIndex() {
+ // Rebuild entire index from shulker_items
+ return await this.db.exec(`
+ INSERT OR REPLACE INTO item_index (item_id, item_name, total_count, shulker_ids, last_updated)
+ SELECT
+ si.item_id,
+ si.item_name,
+ SUM(si.count) as total_count,
+ GROUP_CONCAT('{"id":' || si.shulker_id || ',"count":' || si.count || '}') as shulker_ids,
+ CURRENT_TIMESTAMP
+ FROM shulker_items si
+ GROUP BY si.item_id, si.item_name
+ `);
+ }
+
+ async searchItems(query) {
+ if (!query) {
+ return await this.db.all('SELECT * FROM item_index ORDER BY item_name ASC');
+ }
+ return await this.db.all(
+ "SELECT * FROM item_index WHERE item_name LIKE ? ORDER BY item_name ASC",
+ [`%${query}%`]
+ );
+ }
+
+ async getItemDetails(itemId) {
+ const item = await this.db.get('SELECT * FROM item_index WHERE item_id = ?', [itemId]);
+ if (!item) return null;
+
+ // Parse shulker_ids and get chest details
+ const shulkerIds = JSON.parse(`[${item.shulker_ids}]`);
+
+ const locations = await this.db.all(`
+ SELECT
+ s.id as shulker_id,
+ s.chest_id,
+ c.pos_x, c.pos_y, c.pos_z,
+ js.value as count
+ FROM json_each(?) as js
+ INNER JOIN shulkers s ON s.id = JSON_EXTRACT(js.value, '$.id')
+ INNER JOIN chests c ON c.id = s.chest_id
+ `, [item.shulker_ids]);
+
+ return { ...item, locations };
+ }
+
+ // ========================================
+ // Stats
+ // ========================================
+
+ async getStats() {
+ const totalItems = await this.db.get('SELECT SUM(total_items) as total FROM shulkers');
+ const totalShulkers = await this.db.get('SELECT COUNT(*) as total FROM shulkers');
+ const totalChests = await this.db.get('SELECT COUNT(*) as total FROM chests');
+ const emptyShulkers = await this.db.get("SELECT COUNT(*) as total FROM shulkers WHERE slot_count = 0");
+ const recentTrades = await this.db.get('SELECT COUNT(*) as total FROM trades WHERE timestamp > datetime("now", "-1 day")');
+
+ // Category breakdown
+ const categories = await this.db.all(`
+ SELECT category, COUNT(*) as count
+ FROM shulkers
+ WHERE category IS NOT NULL
+ GROUP BY category
+ `);
+
+ const categoryMap = {};
+ for (const cat of categories) {
+ categoryMap[cat.category] = cat.count;
+ }
+
+ return {
+ totalItems: totalItems?.total || 0,
+ totalShulkers: totalShulkers?.total || 0,
+ totalChests: totalChests?.total || 0,
+ emptyShulkers: emptyShulkers?.total || 0,
+ recentTrades: recentTrades?.total || 0,
+ categories: categoryMap
+ };
+ }
+
+ async close() {
+ if (this.db) {
+ await this.db.close();
+ this.db = null;
+ }
+ }
+}
+
+module.exports = new Database();
\ No newline at end of file
diff --git a/nodejs/controller/storage/index.js b/nodejs/controller/storage/index.js
new file mode 100644
index 0000000..889baeb
--- /dev/null
+++ b/nodejs/controller/storage/index.js
@@ -0,0 +1,217 @@
+'use strict';
+
+const Database = require('./database');
+const Scanner = require('./scanner');
+const Organizer = require('./organizer');
+const WebServer = require('./web');
+
+class Storage {
+ constructor(args) {
+ console.log('Storage: Constructor called');
+ this.bot = args.bot;
+ this.config = args;
+ this.isReady = false;
+ this.webServer = null;
+ }
+
+ init() {
+ console.log('Storage: init() called');
+ return new Promise((resolve, reject) => {
+ this.bot.on('onReady', async () => {
+ try {
+ console.log(`Storage: Bot ${this.bot.name} is ready, initializing storage system...`);
+
+ // Initialize database
+ if (!Database.db) {
+ console.log('Storage: Initializing database...');
+ await Database.initialize(this.config.dbFile || './storage/storage.db');
+ } else {
+ console.log('Storage: Database already initialized');
+ }
+
+ // Initialize scanner and organizer
+ console.log('Storage: Creating Scanner and Organizer...');
+ this.scanner = new Scanner();
+ this.organizer = new Organizer();
+
+ // Start web server
+ console.log('Storage: Starting web server...');
+ this.webServer = new WebServer();
+ await this.webServer.start(this.bot);
+
+ if (this.config.startupTasks) {
+ console.log('Storage: Running startup tasks...');
+ await this.config.startupTasks();
+ }
+
+ this.isReady = true;
+ console.log('Storage: Initialization complete! Ready to use.');
+ resolve();
+
+ } catch (error) {
+ console.error('Storage: Error in init:', error);
+ reject(error);
+ }
+ });
+ });
+ }
+
+ async unload(keepDb = false) {
+ console.log('Storage: Unloading...');
+
+ if (this.webServer) {
+ console.log('Storage: Stopping web server...');
+ await this.webServer.close();
+ this.webServer = null;
+ }
+
+ if (this.scanner) delete this.scanner;
+ if (this.organizer) delete this.organizer;
+
+ // Close database only if not keeping it for web server
+ if (!keepDb && Database.db) {
+ console.log('Storage: Closing database...');
+ Database.close();
+ }
+
+ this.isReady = false;
+ console.log('Storage: Unload complete');
+ }
+
+ async scanArea(force = false) {
+ const { sleep } = require('../../utils');
+
+ console.log(`Storage[${this.bot.name}]: Scanning storage area...`);
+ const chests = await this.scanner.discoverChests(this.bot, this.config.scanRadius || 30, Database);
+ const shulkers = await this.scanner.scanAllChests(this.bot, Database);
+ console.log(`Storage[${this.bot.name}]: Complete - ${chests.length} chests, ${shulkers} shulkers`);
+ }
+
+ async handleTrade(playerName, itemsReceived) {
+ const { sleep } = require('../../utils');
+
+ console.log(`Storage[${this.bot.name}]: Processing trade from ${playerName}, received ${itemsReceived.length} item types`);
+
+ // Log trade
+ await Database.logTrade(playerName, 'deposit', itemsReceived);
+
+ // Store items
+ let totalItems = 0;
+ for (const item of itemsReceived) {
+ totalItems += item.count;
+ }
+
+ console.log(`Storage[${this.bot.name}]: Sorting ${totalItems} items from ${playerName}`);
+ }
+
+ async handleWithdrawRequest(playerName, itemId, count) {
+ console.log(`Storage[${this.bot.name}]: Withdraw request from ${playerName}: ${itemId} x${count}`);
+
+ // Search for item
+ const items = await Database.searchItems(itemId);
+ if (!items || items.length === 0) {
+ return this.bot.whisper(playerName, `Item not found: ${itemId}`);
+ }
+
+ const item = items[0];
+ if (item.total_count < count) {
+ return this.bot.whisper(playerName, `Not enough ${item.item_name}. Available: ${item.total_count}`);
+ }
+
+ // Queue withdrawal
+ await Database.queueWithdrawal(playerName, itemId, item.item_name, count);
+ this.bot.whisper(playerName, `Withdrawal queued. Use /trade when ready.`);
+ }
+
+ async getStatus(playerName) {
+ const stats = await Database.getStats();
+ this.bot.whisper(playerName, `Storage: ${stats.totalItems} items in ${stats.totalShulkers} shulkers (${stats.totalChests} chests)`);
+ }
+
+ async findItem(itemName) {
+ return await Database.searchItems(itemName);
+ }
+
+ async checkPermission(name, requiredRole) {
+ return await Database.checkPermission(name, requiredRole);
+ }
+
+ // Command handler for in-game commands
+ async handleCommand(from, command, ...args) {
+ console.log(`Storage: Command '${command}' from ${from} with args:`, args);
+
+ switch (command) {
+ case 'scan':
+ this.bot.whisper(from, 'Starting storage scan...');
+ try {
+ await this.scanArea(true);
+ const stats = await Database.getStats();
+ this.bot.whisper(from, `Scan complete! ${stats.totalChests} chests, ${stats.totalShulkers} shulkers, ${stats.totalItems} items`);
+ } catch (error) {
+ console.error('Storage: Scan error:', error);
+ this.bot.whisper(from, `Scan failed: ${error.message}`);
+ }
+ break;
+
+ case 'status':
+ await this.getStatus(from);
+ break;
+
+ case 'withdraw':
+ const [itemName, count] = args;
+ await this.handleWithdrawRequest(from, itemName, count);
+ break;
+
+ case 'find':
+ const [searchTerm] = args;
+ const items = await this.findItem(searchTerm);
+ if (items.length === 0) {
+ this.bot.whisper(from, `No items found matching '${searchTerm}'`);
+ } else {
+ const results = items.slice(0, 5).map(i => `${i.item_name}: ${i.total_count}`);
+ this.bot.whisper(from, `Found: ${results.join(', ')}`);
+ }
+ break;
+
+ case 'chests':
+ const chests = await Database.getChests();
+ this.bot.whisper(from, `Tracking ${chests.length} chests`);
+ break;
+
+ case 'organize':
+ this.bot.whisper(from, 'Organize not yet implemented');
+ break;
+
+ case 'addplayer':
+ const [playerName, role] = args;
+ try {
+ await Database.addPlayer(playerName, role || 'team');
+ this.bot.whisper(from, `Added ${playerName} as ${role || 'team'}`);
+ } catch (error) {
+ this.bot.whisper(from, `Failed to add player: ${error.message}`);
+ }
+ break;
+
+ case 'removeplayer':
+ const [removePlayer] = args;
+ try {
+ await Database.removePlayer(removePlayer);
+ this.bot.whisper(from, `Removed ${removePlayer}`);
+ } catch (error) {
+ this.bot.whisper(from, `Failed to remove player: ${error.message}`);
+ }
+ break;
+
+ case 'players':
+ const players = await Database.getAllPlayers();
+ const playerList = players.map(p => `${p.player_name}(${p.role})`).join(', ');
+ this.bot.whisper(from, `Players: ${playerList}`);
+ break;
+
+ default:
+ this.bot.whisper(from, `Unknown command: ${command}`);
+ }
+ }
+}
+
+module.exports = Storage;
\ No newline at end of file
diff --git a/nodejs/controller/storage/organizer.js b/nodejs/controller/storage/organizer.js
new file mode 100644
index 0000000..8a4307c
--- /dev/null
+++ b/nodejs/controller/storage/organizer.js
@@ -0,0 +1,103 @@
+'use strict';
+
+const Vec3 = require('vec3');
+const conf = require('../../conf');
+
+class Organizer {
+ constructor() {
+ this.categories = conf.storage?.categories || {
+ minerals: ['diamond', 'netherite_ingot', 'gold_ingot', 'iron_ingot'],
+ food: ['bread', 'cooked_porkchop', 'steak'],
+ tools: ['diamond_sword', 'diamond_pickaxe', 'netherite_pickaxe'],
+ armor: ['diamond_chestplate', 'netherite_helmet'],
+ blocks: ['stone', 'dirt', 'cobblestone'],
+ redstone: ['redstone', 'repeater', 'piston'],
+ misc: []
+ };
+ }
+
+ categorizeItem(itemName) {
+ // Fast path: check each category
+ for (const [category, items] of Object.entries(this.categories)) {
+ if (items.includes(itemName)) {
+ return category;
+ }
+ }
+ return 'misc';
+ }
+
+ async findShulkerForItem(database, itemId, categoryName) {
+ // Find shulker with matching item that has space
+ const shulker = await database.findShulkerForItem(itemId, categoryName);
+ return shulker;
+ }
+
+ async findEmptyShulkerSlot(database, categoryName) {
+ // Find an empty shulker in the appropriate category and row (prefer row 4 for empty storage)
+ const chests = await database.getChests();
+
+ // Filter chests by category and row 4 (top row for empty/new shulkers)
+ const categoryChests = chests.filter(c =>
+ c.category === categoryName && c.row === 4
+ ).sort((a, b) => a.column - b.column); // Left to right
+
+ for (const chest of categoryChests) {
+ const shulkers = await database.getShulkersByChest(chest.id);
+
+ // Find first shulker that's empty (slotCount = 0) or has space
+ for (const shulker of shulkers) {
+ if (!shulker.item_focus) {
+ // Empty shulker available
+ return {
+ chest_id: chest.id,
+ chestPosition: new Vec3(chest.pos_x, chest.pos_y, chest.pos_z),
+ chestSlot: shulker.slot,
+ shulker_id: shulker.id
+ };
+ }
+ }
+ }
+
+ // If no empty shulker, look for first available slot in row 4
+ // ... this would need to scan actual chest for empty slots
+ return null;
+ }
+
+ async sortItemIntoStorage(bot, database, item, categoryName) {
+ // Find existing shulker with same item and space
+ const existingShulker = await this.findShulkerForItem(database, item.id, categoryName);
+
+ if (existingShulker) {
+ // Space available, add to existing shulker
+ console.log(`Organizer: Found shulker ${existingShulker.id} for ${item.name}`);
+ return existingShulker;
+ } else {
+ // Need new shulker
+ console.log(`Organizer: Creating new shulker for ${item.name} (${categoryName})`);
+
+ const shulkerSlot = await this.findEmptyShulkerSlot(database, categoryName);
+ if (!shulkerSlot) {
+ console.log(`Organizer: No available shulker slot for ${item.name}`);
+ return null;
+ }
+
+ // Create/prepare new shulker
+ await database.upsertShulker(
+ shulkerSlot.chest_id,
+ shulkerSlot.chestSlot,
+ 'shulker_box',
+ categoryName,
+ item.name // item_focus
+ );
+
+ console.log(`Organizer: Created shulker at chest ${shulkerSlot.chest_id}, slot ${shulkerSlot.chestSlot}`);
+ return {
+ chest_id: shulkerSlot.chest_id,
+ slot: shulkerSlot.chestSlot,
+ new: true
+ };
+ }
+ }
+}
+
+module.exports = Organizer;
\ No newline at end of file
diff --git a/nodejs/controller/storage/scanner.js b/nodejs/controller/storage/scanner.js
new file mode 100644
index 0000000..e292d6b
--- /dev/null
+++ b/nodejs/controller/storage/scanner.js
@@ -0,0 +1,362 @@
+'use strict';
+
+const Vec3 = require('vec3');
+
+class Scanner {
+ constructor() {
+ this.chestBlockType = null;
+ }
+
+ async discoverChests(bot, radius, database) {
+ if (!this.chestBlockType) {
+ this.chestBlockType = bot.mcData.blocksByName.chest?.id;
+ if (!this.chestBlockType) {
+ throw new Error('Chest block not found in minecraft-data');
+ }
+ }
+
+ console.log(`Scanner: Discovering chests within ${radius} blocks...`);
+ const chestPositions = bot.bot.findBlocks({
+ matching: this.chestBlockType,
+ maxDistance: radius,
+ count: 1000, // Find up to 1000 chests
+ });
+
+ console.log(`Scanner: Found ${chestPositions.length} chest block(s)`);
+
+ const discoveredChests = [];
+ const processed = new Set();
+
+ for (const pos of chestPositions) {
+ const key = `${pos.x},${pos.y},${pos.z}`;
+ if (processed.has(key)) continue;
+ processed.add(key);
+
+ const chestInfo = this.detectChestType(bot, pos);
+
+ // Skip the second half of double chests
+ if (chestInfo.type === 'skip') {
+ continue;
+ }
+
+ const rowColumn = this.assignRowColumn(pos);
+ const category = this.columnToCategory(rowColumn.column);
+
+ await database.upsertChest(
+ pos.x, pos.y, pos.z,
+ chestInfo.type,
+ rowColumn.row,
+ rowColumn.column,
+ category
+ );
+
+ discoveredChests.push({
+ x: pos.x, y: pos.y, z: pos.z,
+ type: chestInfo.type,
+ ...rowColumn,
+ category
+ });
+ }
+
+ // Don't delete orphans for now - just add new ones
+ // await database.deleteOrphanChests(discoveredChests);
+ console.log(`Scanner: Discovered/updated ${discoveredChests.length} chest(s)`);
+ return discoveredChests;
+ }
+
+ detectChestType(bot, position) {
+ const directions = [
+ new Vec3(1, 0, 0),
+ new Vec3(-1, 0, 0),
+ new Vec3(0, 0, 1),
+ new Vec3(0, 0, -1)
+ ];
+
+ for (const dir of directions) {
+ const adjacentPos = position.offset(dir);
+ const adjacentBlock = bot.bot.blockAt(adjacentPos);
+
+ if (adjacentBlock && adjacentBlock.name.includes('chest')) {
+ if (dir.x === -1 || dir.z === -1) {
+ return { type: 'double' };
+ }
+ return { type: 'skip' };
+ }
+ }
+
+ return { type: 'single' };
+ }
+
+ assignRowColumn(position) {
+ const row = Math.floor(position.y / 4) + 1;
+ const column = position.x;
+ return { row, column };
+ }
+
+ columnToCategory(column) {
+ if (column <= 1) return 'minerals';
+ if (column === 2) return 'food';
+ if (column === 3) return 'tools';
+ if (column === 4) return 'armor';
+ if (column === 5) return 'blocks';
+ if (column === 6) return 'redstone';
+ return 'misc';
+ }
+
+ async scanChest(bot, database, chestPosition) {
+ console.log(`Scanner: Scanning chest at ${chestPosition.x},${chestPosition.y},${chestPosition.z}`);
+
+ try {
+ const chestBlock = bot.bot.blockAt(chestPosition);
+ if (!chestBlock || !chestBlock.name.includes('chest')) {
+ console.log(`Scanner: Not a chest at ${chestPosition.x},${chestPosition.y},${chestPosition.z}`);
+ return [];
+ }
+
+ // Get chest from database
+ const chest = await database.getChestByPosition(chestPosition.x, chestPosition.y, chestPosition.z);
+ if (!chest) {
+ console.log(`Scanner: Chest not in database`);
+ return [];
+ }
+
+ const window = await bot.bot.openChest(chestBlock);
+ const slots = window.slots;
+ let shulkerCount = 0;
+
+ // Only scan chest inventory slots (not player inventory)
+ const chestSlotCount = window.inventoryStart || 27;
+ console.log(`Scanner: Chest has ${chestSlotCount} slots`);
+
+ for (let i = 0; i < chestSlotCount; i++) {
+ const slot = slots[i];
+ if (!slot) continue;
+
+ if (slot.name.includes('shulker_box')) {
+ console.log(`Scanner: Found shulker at slot ${i}: ${slot.name}`);
+ await this.scanShulkerFromNBT(database, chest.id, i, slot);
+ shulkerCount++;
+ }
+ }
+
+ await bot.bot.closeWindow(window);
+ console.log(`Scanner: Found ${shulkerCount} shulkers in chest`);
+ return shulkerCount;
+
+ } catch (error) {
+ console.error(`Scanner: Error scanning chest at ${chestPosition.x},${chestPosition.y},${chestPosition.z}:`, error);
+ return 0;
+ }
+ }
+
+ async scanAllChests(bot, database) {
+ const chests = await database.getChests();
+ console.log(`Scanner: Scanning all ${chests.length} tracked chests`);
+
+ let totalShulkers = 0;
+ let scannedCount = 0;
+ let skippedCount = 0;
+
+ for (const chest of chests) {
+ const position = new Vec3(chest.pos_x, chest.pos_y, chest.pos_z);
+
+ // Check distance to chest
+ const botPos = bot.bot.entity.position;
+ const distance = botPos.distanceTo(position);
+
+ if (distance > 4.5) {
+ // Try to walk to the chest
+ console.log(`Scanner: Walking to chest at ${position} (distance: ${distance.toFixed(1)})`);
+ try {
+ await bot.goTo({
+ where: position,
+ range: 3,
+ });
+ } catch (error) {
+ console.log(`Scanner: Could not reach chest at ${position}: ${error.message}`);
+ skippedCount++;
+ continue;
+ }
+ }
+
+ const shulkerCount = await this.scanChest(bot, database, position);
+ totalShulkers += shulkerCount;
+ scannedCount++;
+
+ // Progress update every 10 chests
+ if (scannedCount % 10 === 0) {
+ console.log(`Scanner: Progress - ${scannedCount}/${chests.length} chests scanned, ${totalShulkers} shulkers found`);
+ }
+
+ // Small delay between chests to avoid overwhelming the server
+ await new Promise(resolve => setTimeout(resolve, 250));
+ }
+
+ await database.rebuildItemIndex();
+ console.log(`Scanner: Scanned ${scannedCount} chests, skipped ${skippedCount}, found ${totalShulkers} shulkers`);
+ return totalShulkers;
+ }
+
+ // Read shulker contents from NBT data (no physical interaction needed)
+ async scanShulkerFromNBT(database, chestId, chestSlot, shulkerItem) {
+ console.log(`Scanner: Reading shulker NBT at slot ${chestSlot}`);
+
+ try {
+ // Create/update shulker record
+ const shulkerId = await database.upsertShulker(
+ chestId,
+ chestSlot,
+ shulkerItem.name,
+ null // category will be set based on contents
+ );
+
+ await database.clearShulkerItems(shulkerId);
+
+ // Extract items from shulker NBT
+ const items = this.extractShulkerContents(shulkerItem);
+
+ let totalItems = 0;
+ const itemTypes = new Set();
+
+ for (const item of items) {
+ await database.upsertShulkerItem(
+ shulkerId,
+ item.id,
+ item.name,
+ item.slot,
+ item.count,
+ item.nbt
+ );
+
+ totalItems += item.count;
+ itemTypes.add(item.name);
+ }
+
+ // Update shulker stats
+ const itemFocus = itemTypes.size === 1 ? Array.from(itemTypes)[0] : null;
+ const usedSlots = items.length;
+ await database.updateShulkerCounts(shulkerId, usedSlots, totalItems);
+
+ if (itemFocus && database.db) {
+ await database.db.run(
+ 'UPDATE shulkers SET item_focus = ? WHERE id = ?',
+ [itemFocus, shulkerId]
+ );
+ }
+
+ console.log(`Scanner: Shulker has ${items.length} slot(s) used, ${totalItems} total items`);
+ return items;
+
+ } catch (error) {
+ console.error(`Scanner: Error reading shulker NBT:`, error);
+ return [];
+ }
+ }
+
+ // Extract items from shulker box NBT data
+ extractShulkerContents(shulkerItem) {
+ const items = [];
+
+ if (!shulkerItem.nbt) {
+ console.log('Scanner: Shulker has no NBT data (empty)');
+ return items;
+ }
+
+ try {
+ // Navigate the NBT structure to find Items array
+ // Structure is: nbt.value.BlockEntityTag.value.Items.value.value (array)
+ let nbtItems = null;
+ const nbt = shulkerItem.nbt;
+
+ // Try multiple paths to find the items array
+ const paths = [
+ () => nbt.value?.BlockEntityTag?.value?.Items?.value?.value, // Full nested path
+ () => nbt.value?.BlockEntityTag?.value?.Items?.value, // One less nesting
+ () => nbt.BlockEntityTag?.Items?.value?.value, // Without top value
+ () => nbt.BlockEntityTag?.Items?.value, // Simpler
+ () => nbt.BlockEntityTag?.Items, // Direct
+ () => nbt.value?.Items?.value?.value, // No BlockEntityTag
+ () => nbt.Items?.value?.value, // Even simpler
+ () => nbt.Items, // Direct Items
+ ];
+
+ for (const pathFn of paths) {
+ const result = pathFn();
+ if (Array.isArray(result)) {
+ nbtItems = result;
+ break;
+ }
+ }
+
+ if (!nbtItems || !Array.isArray(nbtItems)) {
+ console.log('Scanner: No items array found in shulker (may be empty)');
+ return items;
+ }
+
+ console.log(`Scanner: Found ${nbtItems.length} items in shulker NBT`);
+
+ for (const nbtItem of nbtItems) {
+ // Extract slot, id, count from NBT item
+ const slot = nbtItem.Slot?.value ?? nbtItem.Slot ?? 0;
+ const id = nbtItem.id?.value ?? nbtItem.id ?? 'unknown';
+ const count = nbtItem.Count?.value ?? nbtItem.Count ?? 1;
+
+ // Clean up the id (remove minecraft: prefix)
+ const cleanId = String(id).replace('minecraft:', '');
+
+ items.push({
+ slot: slot,
+ name: cleanId,
+ id: typeof nbtItem.id === 'object' ? 0 : nbtItem.id,
+ count: count,
+ nbt: nbtItem.tag ? this.parseNBT(nbtItem.tag) : null
+ });
+ }
+ } catch (error) {
+ console.error('Scanner: Error parsing shulker NBT:', error);
+ console.log('Scanner: Raw NBT:', JSON.stringify(shulkerItem.nbt).substring(0, 500));
+ }
+
+ return items;
+ }
+
+ parseNBT(nbt) {
+ if (!nbt) return null;
+ if (typeof nbt === 'string') {
+ try {
+ nbt = JSON.parse(nbt);
+ } catch (e) {
+ return null;
+ }
+ }
+
+ const result = {};
+
+ if (nbt.Enchantments) {
+ result.enchantments = nbt.Enchantments.map(e => ({
+ id: e.id,
+ level: e.lvl
+ }));
+ }
+
+ if (nbt.Damage) {
+ result.damage = nbt.Damage;
+ }
+
+ if (nbt.display?.Name) {
+ result.displayName = nbt.display.Name;
+ }
+
+ if (nbt.CustomModelData) {
+ result.customModelData = nbt.CustomModelData;
+ }
+
+ if (nbt.RepairCost) {
+ result.repairCost = nbt.RepairCost;
+ }
+
+ return Object.keys(result).length > 0 ? result : null;
+ }
+}
+
+module.exports = Scanner;
\ No newline at end of file
diff --git a/nodejs/controller/storage/web.js b/nodejs/controller/storage/web.js
new file mode 100644
index 0000000..280933d
--- /dev/null
+++ b/nodejs/controller/storage/web.js
@@ -0,0 +1,405 @@
+'use strict';
+
+const express = require('express');
+const cors = require('cors');
+const database = require('./database');
+
+class WebServer {
+ constructor() {
+ console.log('WebServer: Constructor called');
+ this.app = null;
+ this.port = null;
+ this.host = null;
+ this.server = null;
+ }
+
+ async start(bot) {
+ console.log('WebServer: start() called');
+ const conf = require('../../conf');
+
+ this.port = conf.storage?.webPort || 3000;
+ this.host = conf.storage?.webHost || '0.0.0.0';
+
+ console.log(`WebServer: Configuring server on ${this.host}:${this.port}`);
+
+ this.app = express();
+
+ // Middleware
+ this.app.use(express.json());
+ this.app.use(cors());
+
+ // Request logging
+ this.app.use((req, res, next) => {
+ console.log(`WebServer: ${req.method} ${req.path}`);
+ next();
+ });
+
+ // Routes
+ this.setupRoutes();
+
+ // Start server
+ return new Promise((resolve, reject) => {
+ this.server = this.app.listen(this.port, this.host, () => {
+ console.log(`WebServer: Running at http://${this.host}:${this.port}`);
+ console.log(`WebServer: Try http://localhost:${this.port}/health`);
+ resolve();
+ });
+ this.server.on('error', (err) => {
+ console.error('WebServer: Failed to start:', err);
+ reject(err);
+ });
+ });
+ }
+
+ setupRoutes() {
+ console.log('WebServer: Setting up routes...');
+
+ // Index page - Full web UI
+ this.app.get('/', async (req, res) => {
+ res.send(this.getIndexHTML());
+ });
+
+ // Health check
+ this.app.get('/health', (req, res) => {
+ res.json({ status: 'ok', server: `${this.host}:${this.port}` });
+ });
+
+ // Inventory - Get all items aggregated
+ this.app.get('/api/inventory', async (req, res) => {
+ try {
+ const items = await database.searchItems(req.query.q);
+ res.json({ items });
+ } catch (error) {
+ console.error('API Error /api/inventory:', error);
+ res.status(500).json({ error: error.message });
+ }
+ });
+
+ // Get specific item details
+ this.app.get('/api/inventory/:itemId', async (req, res) => {
+ try {
+ const itemId = parseInt(req.params.itemId);
+ const item = await database.getItemDetails(itemId);
+ if (!item) {
+ return res.status(404).json({ error: 'Item not found' });
+ }
+ res.json({ item });
+ } catch (error) {
+ console.error('API Error /api/inventory/:itemId:', error);
+ res.status(500).json({ error: error.message });
+ }
+ });
+
+ // Get all chests
+ this.app.get('/api/chests', async (req, res) => {
+ try {
+ const chests = await database.getChests();
+ res.json({ chests });
+ } catch (error) {
+ console.error('API Error /api/chests:', error);
+ res.status(500).json({ error: error.message });
+ }
+ });
+
+ // Get specific chest with shulker contents
+ this.app.get('/api/chests/:id', async (req, res) => {
+ try {
+ // This would return chest + shulker details
+ // Implementation would scan the specified chest and shulkers
+
+ const chestId = parseInt(req.params.id);
+ const chest = await database.getChestById(chestId);
+
+ if (!chest) {
+ return res.status(404).json({ error: 'Chest not found' });
+ }
+
+ const shulkers = await database.getShulkersByChest(chestId);
+
+ // Return chest + shulkers
+ res.json({ chest, shulkers });
+ } catch (error) {
+ console.error('API Error /api/chests/:id:', error);
+ res.status(500).json({ error: error.message });
+ }
+ });
+
+ // Stats
+ this.app.get('/api/stats', async (req, res) => {
+ try {
+ const stats = await database.getStats();
+ res.json(stats);
+ } catch (error) {
+ console.error('API Error /api/stats:', error);
+ res.status(500).json({ error: error.message });
+ }
+ });
+
+ // Trade history
+ this.app.get('/api/trades', async (req, res) => {
+ try {
+ const limit = parseInt(req.query.limit) || 50;
+ const trades = await database.getRecentTrades(limit);
+ res.json({ trades });
+ } catch (error) {
+ console.error('API Error /api/trades:', error);
+ res.status(500).json({ error: error.message });
+ }
+ });
+
+ // Pending withdrawals (by player)
+ this.app.get('/api/pending/:playerName', async (req, res) => {
+ try {
+ const playerName = req.params.playerName;
+ const pending = await database.getPendingWithdrawals(playerName);
+ res.json({ pending });
+ } catch (error) {
+ console.error('API Error /api/pending/:playerName:', error);
+ res.status(500).json({ error: error.message });
+ }
+ });
+ }
+
+ async close() {
+ console.log('WebServer: Closing...');
+ if (this.server) {
+ this.server.close();
+ console.log('WebServer: Closed');
+ }
+ }
+
+ getIndexHTML() {
+ return `
+
+
+
+
+ Storage System
+
+
+
+
+
📦 Storage System
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+`;
+ }
+}
+
+module.exports = WebServer;
\ No newline at end of file
diff --git a/nodejs/package-lock.json b/nodejs/package-lock.json
index 9591642..473a6d3 100644
--- a/nodejs/package-lock.json
+++ b/nodejs/package-lock.json
@@ -11,14 +11,18 @@
"dependencies": {
"@google/generative-ai": "^0.17.1",
"axios": "^1.7.7",
+ "cors": "^2.8.6",
"dotenv": "^16.0.1",
+ "express": "^5.2.1",
"extend": "^3.0.2",
"minecraft-data": "^3.101.0",
"mineflayer": "^4.33.0",
"mineflayer-pathfinder": "^2.4.5",
"mineflayer-web-inventory": "^1.3.0",
"moment": "^2.29.3",
- "prismarine-windows": "^2.9.0"
+ "prismarine-windows": "^2.9.0",
+ "sqlite": "^5.1.1",
+ "sqlite3": "^5.1.7"
},
"devDependencies": {
"nodemon": "^3.1.7"
@@ -47,6 +51,13 @@
"node": ">=16"
}
},
+ "node_modules/@gar/promisify": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz",
+ "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==",
+ "license": "MIT",
+ "optional": true
+ },
"node_modules/@google/generative-ai": {
"version": "0.17.2",
"resolved": "https://registry.npmjs.org/@google/generative-ai/-/generative-ai-0.17.2.tgz",
@@ -56,6 +67,42 @@
"node": ">=18.0.0"
}
},
+ "node_modules/@npmcli/fs": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz",
+ "integrity": "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==",
+ "license": "ISC",
+ "optional": true,
+ "dependencies": {
+ "@gar/promisify": "^1.0.1",
+ "semver": "^7.3.5"
+ }
+ },
+ "node_modules/@npmcli/move-file": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz",
+ "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==",
+ "deprecated": "This functionality has been moved to @npmcli/fs",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "mkdirp": "^1.0.4",
+ "rimraf": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@tootallnate/once": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz",
+ "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==",
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">= 6"
+ }
+ },
"node_modules/@types/component-emitter": {
"version": "1.2.14",
"resolved": "https://registry.npmjs.org/@types/component-emitter/-/component-emitter-1.2.14.tgz",
@@ -129,6 +176,13 @@
"follow-redirects": "^1.14.0"
}
},
+ "node_modules/abbrev": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
+ "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
+ "license": "ISC",
+ "optional": true
+ },
"node_modules/abort-controller": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz",
@@ -160,6 +214,46 @@
"integrity": "sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ==",
"license": "MIT"
},
+ "node_modules/agent-base": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
+ "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 6.0.0"
+ }
+ },
+ "node_modules/agentkeepalive": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.6.0.tgz",
+ "integrity": "sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "humanize-ms": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 8.0.0"
+ }
+ },
+ "node_modules/aggregate-error": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz",
+ "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "clean-stack": "^2.0.0",
+ "indent-string": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/ajv": {
"version": "6.12.6",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
@@ -176,6 +270,16 @@
"url": "https://github.com/sponsors/epoberezkin"
}
},
+ "node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/anymatch": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
@@ -190,6 +294,43 @@
"node": ">= 8"
}
},
+ "node_modules/aproba": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.1.0.tgz",
+ "integrity": "sha512-tLIEcj5GuR2RSTnxNKdkK0dJ/GrC7P38sUkiDmDuHfsHmbagTFAxDVIBltoklXEVIQ/f14IL8IMJ5pn9Hez1Ew==",
+ "license": "ISC",
+ "optional": true
+ },
+ "node_modules/are-we-there-yet": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz",
+ "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==",
+ "deprecated": "This package is no longer supported.",
+ "license": "ISC",
+ "optional": true,
+ "dependencies": {
+ "delegates": "^1.0.0",
+ "readable-stream": "^3.6.0"
+ },
+ "engines": {
+ "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
+ }
+ },
+ "node_modules/are-we-there-yet/node_modules/readable-stream": {
+ "version": "3.6.2",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
+ "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
"node_modules/array-flatten": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
@@ -223,7 +364,7 @@
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
"integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
- "dev": true,
+ "devOptional": true,
"license": "MIT"
},
"node_modules/base64-arraybuffer": {
@@ -276,50 +417,93 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/body-parser": {
- "version": "1.20.3",
- "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz",
- "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==",
+ "node_modules/bindings": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz",
+ "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==",
"license": "MIT",
"dependencies": {
- "bytes": "3.1.2",
- "content-type": "~1.0.5",
- "debug": "2.6.9",
- "depd": "2.0.0",
- "destroy": "1.2.0",
- "http-errors": "2.0.0",
- "iconv-lite": "0.4.24",
- "on-finished": "2.4.1",
- "qs": "6.13.0",
- "raw-body": "2.5.2",
- "type-is": "~1.6.18",
- "unpipe": "1.0.0"
+ "file-uri-to-path": "1.0.0"
+ }
+ },
+ "node_modules/bl": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz",
+ "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==",
+ "license": "MIT",
+ "dependencies": {
+ "buffer": "^5.5.0",
+ "inherits": "^2.0.4",
+ "readable-stream": "^3.4.0"
+ }
+ },
+ "node_modules/bl/node_modules/buffer": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
+ "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "base64-js": "^1.3.1",
+ "ieee754": "^1.1.13"
+ }
+ },
+ "node_modules/bl/node_modules/readable-stream": {
+ "version": "3.6.2",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
+ "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
+ "license": "MIT",
+ "dependencies": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
},
"engines": {
- "node": ">= 0.8",
- "npm": "1.2.8000 || >= 1.4.16"
+ "node": ">= 6"
}
},
- "node_modules/body-parser/node_modules/debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "node_modules/body-parser": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.2.tgz",
+ "integrity": "sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==",
"license": "MIT",
"dependencies": {
- "ms": "2.0.0"
+ "bytes": "^3.1.2",
+ "content-type": "^1.0.5",
+ "debug": "^4.4.3",
+ "http-errors": "^2.0.0",
+ "iconv-lite": "^0.7.0",
+ "on-finished": "^2.4.1",
+ "qs": "^6.14.1",
+ "raw-body": "^3.0.1",
+ "type-is": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
}
},
- "node_modules/body-parser/node_modules/ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
- "license": "MIT"
- },
"node_modules/brace-expansion": {
"version": "1.1.12",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
"integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==",
- "dev": true,
+ "devOptional": true,
"license": "MIT",
"dependencies": {
"balanced-match": "^1.0.0",
@@ -390,6 +574,36 @@
"node": ">= 0.8"
}
},
+ "node_modules/cacache": {
+ "version": "15.3.0",
+ "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz",
+ "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==",
+ "license": "ISC",
+ "optional": true,
+ "dependencies": {
+ "@npmcli/fs": "^1.0.0",
+ "@npmcli/move-file": "^1.0.1",
+ "chownr": "^2.0.0",
+ "fs-minipass": "^2.0.0",
+ "glob": "^7.1.4",
+ "infer-owner": "^1.0.4",
+ "lru-cache": "^6.0.0",
+ "minipass": "^3.1.1",
+ "minipass-collect": "^1.0.2",
+ "minipass-flush": "^1.0.5",
+ "minipass-pipeline": "^1.2.2",
+ "mkdirp": "^1.0.3",
+ "p-map": "^4.0.0",
+ "promise-inflight": "^1.0.1",
+ "rimraf": "^3.0.2",
+ "ssri": "^8.0.1",
+ "tar": "^6.0.2",
+ "unique-filename": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 10"
+ }
+ },
"node_modules/call-bind-apply-helpers": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
@@ -444,6 +658,35 @@
"fsevents": "~2.3.2"
}
},
+ "node_modules/chownr": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
+ "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/clean-stack": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
+ "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==",
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/color-support": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz",
+ "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==",
+ "license": "ISC",
+ "optional": true,
+ "bin": {
+ "color-support": "bin.js"
+ }
+ },
"node_modules/combined-stream": {
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
@@ -475,19 +718,27 @@
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
"integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
- "dev": true,
+ "devOptional": true,
"license": "MIT"
},
+ "node_modules/console-control-strings": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
+ "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==",
+ "license": "ISC",
+ "optional": true
+ },
"node_modules/content-disposition": {
- "version": "0.5.4",
- "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
- "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.1.tgz",
+ "integrity": "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==",
"license": "MIT",
- "dependencies": {
- "safe-buffer": "5.2.1"
- },
"engines": {
- "node": ">= 0.6"
+ "node": ">=18"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
}
},
"node_modules/content-type": {
@@ -509,15 +760,18 @@
}
},
"node_modules/cookie-signature": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
- "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==",
- "license": "MIT"
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz",
+ "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.6.0"
+ }
},
"node_modules/cors": {
- "version": "2.8.5",
- "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
- "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
+ "version": "2.8.6",
+ "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.6.tgz",
+ "integrity": "sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==",
"license": "MIT",
"dependencies": {
"object-assign": "^4",
@@ -525,6 +779,10 @@
},
"engines": {
"node": ">= 0.10"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
}
},
"node_modules/debug": {
@@ -544,6 +802,30 @@
}
}
},
+ "node_modules/decompress-response": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz",
+ "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==",
+ "license": "MIT",
+ "dependencies": {
+ "mimic-response": "^3.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/deep-extend": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
+ "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
"node_modules/delayed-stream": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
@@ -553,6 +835,13 @@
"node": ">=0.4.0"
}
},
+ "node_modules/delegates": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
+ "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==",
+ "license": "MIT",
+ "optional": true
+ },
"node_modules/depd": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
@@ -572,6 +861,15 @@
"npm": "1.2.8000 || >= 1.4.16"
}
},
+ "node_modules/detect-libc": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz",
+ "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/discontinuous-range": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/discontinuous-range/-/discontinuous-range-1.0.0.tgz",
@@ -619,6 +917,13 @@
"integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
"license": "MIT"
},
+ "node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "license": "MIT",
+ "optional": true
+ },
"node_modules/encodeurl": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
@@ -628,6 +933,38 @@
"node": ">= 0.8"
}
},
+ "node_modules/encoding": {
+ "version": "0.1.13",
+ "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz",
+ "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "iconv-lite": "^0.6.2"
+ }
+ },
+ "node_modules/encoding/node_modules/iconv-lite": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
+ "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/end-of-stream": {
+ "version": "1.4.5",
+ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz",
+ "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==",
+ "license": "MIT",
+ "dependencies": {
+ "once": "^1.4.0"
+ }
+ },
"node_modules/endian-toggle": {
"version": "0.0.0",
"resolved": "https://registry.npmjs.org/endian-toggle/-/endian-toggle-0.0.0.tgz",
@@ -690,6 +1027,23 @@
}
}
},
+ "node_modules/env-paths": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz",
+ "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==",
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/err-code": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz",
+ "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==",
+ "license": "MIT",
+ "optional": true
+ },
"node_modules/es-define-property": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
@@ -768,66 +1122,104 @@
"node": ">=0.8.x"
}
},
+ "node_modules/expand-template": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz",
+ "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==",
+ "license": "(MIT OR WTFPL)",
+ "engines": {
+ "node": ">=6"
+ }
+ },
"node_modules/express": {
- "version": "4.21.2",
- "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz",
- "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==",
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz",
+ "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==",
"license": "MIT",
"dependencies": {
- "accepts": "~1.3.8",
- "array-flatten": "1.1.1",
- "body-parser": "1.20.3",
- "content-disposition": "0.5.4",
- "content-type": "~1.0.4",
- "cookie": "0.7.1",
- "cookie-signature": "1.0.6",
- "debug": "2.6.9",
- "depd": "2.0.0",
- "encodeurl": "~2.0.0",
- "escape-html": "~1.0.3",
- "etag": "~1.8.1",
- "finalhandler": "1.3.1",
- "fresh": "0.5.2",
- "http-errors": "2.0.0",
- "merge-descriptors": "1.0.3",
- "methods": "~1.1.2",
- "on-finished": "2.4.1",
- "parseurl": "~1.3.3",
- "path-to-regexp": "0.1.12",
- "proxy-addr": "~2.0.7",
- "qs": "6.13.0",
- "range-parser": "~1.2.1",
- "safe-buffer": "5.2.1",
- "send": "0.19.0",
- "serve-static": "1.16.2",
- "setprototypeof": "1.2.0",
- "statuses": "2.0.1",
- "type-is": "~1.6.18",
- "utils-merge": "1.0.1",
- "vary": "~1.1.2"
+ "accepts": "^2.0.0",
+ "body-parser": "^2.2.1",
+ "content-disposition": "^1.0.0",
+ "content-type": "^1.0.5",
+ "cookie": "^0.7.1",
+ "cookie-signature": "^1.2.1",
+ "debug": "^4.4.0",
+ "depd": "^2.0.0",
+ "encodeurl": "^2.0.0",
+ "escape-html": "^1.0.3",
+ "etag": "^1.8.1",
+ "finalhandler": "^2.1.0",
+ "fresh": "^2.0.0",
+ "http-errors": "^2.0.0",
+ "merge-descriptors": "^2.0.0",
+ "mime-types": "^3.0.0",
+ "on-finished": "^2.4.1",
+ "once": "^1.4.0",
+ "parseurl": "^1.3.3",
+ "proxy-addr": "^2.0.7",
+ "qs": "^6.14.0",
+ "range-parser": "^1.2.1",
+ "router": "^2.2.0",
+ "send": "^1.1.0",
+ "serve-static": "^2.2.0",
+ "statuses": "^2.0.1",
+ "type-is": "^2.0.1",
+ "vary": "^1.1.2"
},
"engines": {
- "node": ">= 0.10.0"
+ "node": ">= 18"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/express"
}
},
- "node_modules/express/node_modules/debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "node_modules/express/node_modules/accepts": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz",
+ "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==",
"license": "MIT",
"dependencies": {
- "ms": "2.0.0"
+ "mime-types": "^3.0.0",
+ "negotiator": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
}
},
- "node_modules/express/node_modules/ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
- "license": "MIT"
+ "node_modules/express/node_modules/mime-db": {
+ "version": "1.54.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz",
+ "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/express/node_modules/mime-types": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz",
+ "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==",
+ "license": "MIT",
+ "dependencies": {
+ "mime-db": "^1.54.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
+ "node_modules/express/node_modules/negotiator": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz",
+ "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
},
"node_modules/extend": {
"version": "3.0.2",
@@ -847,6 +1239,12 @@
"integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
"license": "MIT"
},
+ "node_modules/file-uri-to-path": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz",
+ "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==",
+ "license": "MIT"
+ },
"node_modules/fill-range": {
"version": "7.1.1",
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
@@ -861,38 +1259,26 @@
}
},
"node_modules/finalhandler": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz",
- "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==",
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz",
+ "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==",
"license": "MIT",
"dependencies": {
- "debug": "2.6.9",
- "encodeurl": "~2.0.0",
- "escape-html": "~1.0.3",
- "on-finished": "2.4.1",
- "parseurl": "~1.3.3",
- "statuses": "2.0.1",
- "unpipe": "~1.0.0"
+ "debug": "^4.4.0",
+ "encodeurl": "^2.0.0",
+ "escape-html": "^1.0.3",
+ "on-finished": "^2.4.1",
+ "parseurl": "^1.3.3",
+ "statuses": "^2.0.1"
},
"engines": {
- "node": ">= 0.8"
+ "node": ">= 18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
}
},
- "node_modules/finalhandler/node_modules/debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "license": "MIT",
- "dependencies": {
- "ms": "2.0.0"
- }
- },
- "node_modules/finalhandler/node_modules/ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
- "license": "MIT"
- },
"node_modules/follow-redirects": {
"version": "1.15.11",
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz",
@@ -939,14 +1325,39 @@
}
},
"node_modules/fresh": {
- "version": "0.5.2",
- "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
- "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz",
+ "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==",
"license": "MIT",
"engines": {
- "node": ">= 0.6"
+ "node": ">= 0.8"
}
},
+ "node_modules/fs-constants": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz",
+ "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==",
+ "license": "MIT"
+ },
+ "node_modules/fs-minipass": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz",
+ "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==",
+ "license": "ISC",
+ "dependencies": {
+ "minipass": "^3.0.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
+ "license": "ISC",
+ "optional": true
+ },
"node_modules/fsevents": {
"version": "2.3.3",
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
@@ -971,6 +1382,27 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/gauge": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz",
+ "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==",
+ "deprecated": "This package is no longer supported.",
+ "license": "ISC",
+ "optional": true,
+ "dependencies": {
+ "aproba": "^1.0.3 || ^2.0.0",
+ "color-support": "^1.1.3",
+ "console-control-strings": "^1.1.0",
+ "has-unicode": "^2.0.1",
+ "signal-exit": "^3.0.7",
+ "string-width": "^4.2.3",
+ "strip-ansi": "^6.0.1",
+ "wide-align": "^1.1.5"
+ },
+ "engines": {
+ "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
+ }
+ },
"node_modules/get-intrinsic": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
@@ -1008,6 +1440,34 @@
"node": ">= 0.4"
}
},
+ "node_modules/github-from-package": {
+ "version": "0.0.0",
+ "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz",
+ "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==",
+ "license": "MIT"
+ },
+ "node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "deprecated": "Glob versions prior to v9 are no longer supported",
+ "license": "ISC",
+ "optional": true,
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
"node_modules/glob-parent": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
@@ -1033,6 +1493,13 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/graceful-fs": {
+ "version": "4.2.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
+ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
+ "license": "ISC",
+ "optional": true
+ },
"node_modules/has-flag": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
@@ -1070,6 +1537,13 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/has-unicode": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
+ "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==",
+ "license": "ISC",
+ "optional": true
+ },
"node_modules/hasown": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
@@ -1082,32 +1556,86 @@
"node": ">= 0.4"
}
},
+ "node_modules/http-cache-semantics": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz",
+ "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==",
+ "license": "BSD-2-Clause",
+ "optional": true
+ },
"node_modules/http-errors": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
- "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz",
+ "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==",
"license": "MIT",
"dependencies": {
- "depd": "2.0.0",
- "inherits": "2.0.4",
- "setprototypeof": "1.2.0",
- "statuses": "2.0.1",
- "toidentifier": "1.0.1"
+ "depd": "~2.0.0",
+ "inherits": "~2.0.4",
+ "setprototypeof": "~1.2.0",
+ "statuses": "~2.0.2",
+ "toidentifier": "~1.0.1"
},
"engines": {
"node": ">= 0.8"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
+ "node_modules/http-proxy-agent": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz",
+ "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@tootallnate/once": "1",
+ "agent-base": "6",
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/https-proxy-agent": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
+ "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "agent-base": "6",
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/humanize-ms": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz",
+ "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "ms": "^2.0.0"
}
},
"node_modules/iconv-lite": {
- "version": "0.4.24",
- "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
- "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+ "version": "0.7.2",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz",
+ "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==",
"license": "MIT",
"dependencies": {
- "safer-buffer": ">= 2.1.2 < 3"
+ "safer-buffer": ">= 2.1.2 < 3.0.0"
},
"engines": {
"node": ">=0.10.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
}
},
"node_modules/ieee754": {
@@ -1137,12 +1665,67 @@
"dev": true,
"license": "ISC"
},
+ "node_modules/imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=0.8.19"
+ }
+ },
+ "node_modules/indent-string": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
+ "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/infer-owner": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz",
+ "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==",
+ "license": "ISC",
+ "optional": true
+ },
+ "node_modules/inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+ "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.",
+ "license": "ISC",
+ "optional": true,
+ "dependencies": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
"node_modules/inherits": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
"license": "ISC"
},
+ "node_modules/ini": {
+ "version": "1.3.8",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
+ "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
+ "license": "ISC"
+ },
+ "node_modules/ip-address": {
+ "version": "10.1.0",
+ "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.1.0.tgz",
+ "integrity": "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==",
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">= 12"
+ }
+ },
"node_modules/ipaddr.js": {
"version": "1.9.1",
"resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
@@ -1175,6 +1758,16 @@
"node": ">=0.10.0"
}
},
+ "node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/is-glob": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
@@ -1188,6 +1781,13 @@
"node": ">=0.10.0"
}
},
+ "node_modules/is-lambda": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz",
+ "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==",
+ "license": "MIT",
+ "optional": true
+ },
"node_modules/is-number": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
@@ -1198,6 +1798,19 @@
"node": ">=0.12.0"
}
},
+ "node_modules/is-promise": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz",
+ "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==",
+ "license": "MIT"
+ },
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "license": "ISC",
+ "optional": true
+ },
"node_modules/json-schema-traverse": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
@@ -1307,12 +1920,53 @@
"integrity": "sha512-6raRe2vxCYBhpBu+B+TtNGUzah+hQjVdu3E17wfusjyrXBka2nBS8OH/gjVZ5PvHOhWmIZTYri09Z6n/QfnNMw==",
"license": "MIT"
},
+ "node_modules/lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "license": "ISC",
+ "optional": true,
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/macaddress": {
"version": "0.5.3",
"resolved": "https://registry.npmjs.org/macaddress/-/macaddress-0.5.3.tgz",
"integrity": "sha512-vGBKTA+jwM4KgjGZ+S/8/Mkj9rWzePyGY6jManXPGhiWu63RYwW8dKPyk5koP+8qNVhPhHgFa1y/MJ4wrjsNrg==",
"license": "MIT"
},
+ "node_modules/make-fetch-happen": {
+ "version": "9.1.0",
+ "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz",
+ "integrity": "sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==",
+ "license": "ISC",
+ "optional": true,
+ "dependencies": {
+ "agentkeepalive": "^4.1.3",
+ "cacache": "^15.2.0",
+ "http-cache-semantics": "^4.1.0",
+ "http-proxy-agent": "^4.0.1",
+ "https-proxy-agent": "^5.0.0",
+ "is-lambda": "^1.0.1",
+ "lru-cache": "^6.0.0",
+ "minipass": "^3.1.3",
+ "minipass-collect": "^1.0.2",
+ "minipass-fetch": "^1.3.2",
+ "minipass-flush": "^1.0.5",
+ "minipass-pipeline": "^1.2.4",
+ "negotiator": "^0.6.2",
+ "promise-retry": "^2.0.1",
+ "socks-proxy-agent": "^6.0.0",
+ "ssri": "^8.0.0"
+ },
+ "engines": {
+ "node": ">= 10"
+ }
+ },
"node_modules/math-intrinsics": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
@@ -1323,19 +1977,22 @@
}
},
"node_modules/media-typer": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
- "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz",
+ "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==",
"license": "MIT",
"engines": {
- "node": ">= 0.6"
+ "node": ">= 0.8"
}
},
"node_modules/merge-descriptors": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz",
- "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==",
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz",
+ "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==",
"license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
@@ -1382,6 +2039,18 @@
"node": ">= 0.6"
}
},
+ "node_modules/mimic-response": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz",
+ "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/minecraft-assets": {
"version": "1.17.0",
"resolved": "https://registry.npmjs.org/minecraft-assets/-/minecraft-assets-1.17.0.tgz",
@@ -1489,11 +2158,244 @@
"vec3": "^0.1.7"
}
},
+ "node_modules/mineflayer-web-inventory/node_modules/body-parser": {
+ "version": "1.20.4",
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.4.tgz",
+ "integrity": "sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==",
+ "license": "MIT",
+ "dependencies": {
+ "bytes": "~3.1.2",
+ "content-type": "~1.0.5",
+ "debug": "2.6.9",
+ "depd": "2.0.0",
+ "destroy": "~1.2.0",
+ "http-errors": "~2.0.1",
+ "iconv-lite": "~0.4.24",
+ "on-finished": "~2.4.1",
+ "qs": "~6.14.0",
+ "raw-body": "~2.5.3",
+ "type-is": "~1.6.18",
+ "unpipe": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8",
+ "npm": "1.2.8000 || >= 1.4.16"
+ }
+ },
+ "node_modules/mineflayer-web-inventory/node_modules/content-disposition": {
+ "version": "0.5.4",
+ "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
+ "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
+ "license": "MIT",
+ "dependencies": {
+ "safe-buffer": "5.2.1"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mineflayer-web-inventory/node_modules/cookie-signature": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz",
+ "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==",
+ "license": "MIT"
+ },
+ "node_modules/mineflayer-web-inventory/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/mineflayer-web-inventory/node_modules/debug/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "license": "MIT"
+ },
+ "node_modules/mineflayer-web-inventory/node_modules/express": {
+ "version": "4.22.1",
+ "resolved": "https://registry.npmjs.org/express/-/express-4.22.1.tgz",
+ "integrity": "sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==",
+ "license": "MIT",
+ "dependencies": {
+ "accepts": "~1.3.8",
+ "array-flatten": "1.1.1",
+ "body-parser": "~1.20.3",
+ "content-disposition": "~0.5.4",
+ "content-type": "~1.0.4",
+ "cookie": "~0.7.1",
+ "cookie-signature": "~1.0.6",
+ "debug": "2.6.9",
+ "depd": "2.0.0",
+ "encodeurl": "~2.0.0",
+ "escape-html": "~1.0.3",
+ "etag": "~1.8.1",
+ "finalhandler": "~1.3.1",
+ "fresh": "~0.5.2",
+ "http-errors": "~2.0.0",
+ "merge-descriptors": "1.0.3",
+ "methods": "~1.1.2",
+ "on-finished": "~2.4.1",
+ "parseurl": "~1.3.3",
+ "path-to-regexp": "~0.1.12",
+ "proxy-addr": "~2.0.7",
+ "qs": "~6.14.0",
+ "range-parser": "~1.2.1",
+ "safe-buffer": "5.2.1",
+ "send": "~0.19.0",
+ "serve-static": "~1.16.2",
+ "setprototypeof": "1.2.0",
+ "statuses": "~2.0.1",
+ "type-is": "~1.6.18",
+ "utils-merge": "1.0.1",
+ "vary": "~1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.10.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
+ "node_modules/mineflayer-web-inventory/node_modules/finalhandler": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.2.tgz",
+ "integrity": "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==",
+ "license": "MIT",
+ "dependencies": {
+ "debug": "2.6.9",
+ "encodeurl": "~2.0.0",
+ "escape-html": "~1.0.3",
+ "on-finished": "~2.4.1",
+ "parseurl": "~1.3.3",
+ "statuses": "~2.0.2",
+ "unpipe": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/mineflayer-web-inventory/node_modules/fresh": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
+ "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mineflayer-web-inventory/node_modules/iconv-lite": {
+ "version": "0.4.24",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+ "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+ "license": "MIT",
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/mineflayer-web-inventory/node_modules/media-typer": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
+ "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mineflayer-web-inventory/node_modules/merge-descriptors": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz",
+ "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/mineflayer-web-inventory/node_modules/path-to-regexp": {
+ "version": "0.1.12",
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz",
+ "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==",
+ "license": "MIT"
+ },
+ "node_modules/mineflayer-web-inventory/node_modules/raw-body": {
+ "version": "2.5.3",
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz",
+ "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==",
+ "license": "MIT",
+ "dependencies": {
+ "bytes": "~3.1.2",
+ "http-errors": "~2.0.1",
+ "iconv-lite": "~0.4.24",
+ "unpipe": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/mineflayer-web-inventory/node_modules/send": {
+ "version": "0.19.2",
+ "resolved": "https://registry.npmjs.org/send/-/send-0.19.2.tgz",
+ "integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==",
+ "license": "MIT",
+ "dependencies": {
+ "debug": "2.6.9",
+ "depd": "2.0.0",
+ "destroy": "1.2.0",
+ "encodeurl": "~2.0.0",
+ "escape-html": "~1.0.3",
+ "etag": "~1.8.1",
+ "fresh": "~0.5.2",
+ "http-errors": "~2.0.1",
+ "mime": "1.6.0",
+ "ms": "2.1.3",
+ "on-finished": "~2.4.1",
+ "range-parser": "~1.2.1",
+ "statuses": "~2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/mineflayer-web-inventory/node_modules/serve-static": {
+ "version": "1.16.3",
+ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.3.tgz",
+ "integrity": "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==",
+ "license": "MIT",
+ "dependencies": {
+ "encodeurl": "~2.0.0",
+ "escape-html": "~1.0.3",
+ "parseurl": "~1.3.3",
+ "send": "~0.19.1"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/mineflayer-web-inventory/node_modules/type-is": {
+ "version": "1.6.18",
+ "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
+ "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
+ "license": "MIT",
+ "dependencies": {
+ "media-typer": "0.3.0",
+ "mime-types": "~2.1.24"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
"node_modules/minimatch": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
"integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
- "dev": true,
+ "devOptional": true,
"license": "ISC",
"dependencies": {
"brace-expansion": "^1.1.7"
@@ -1502,6 +2404,128 @@
"node": "*"
}
},
+ "node_modules/minimist": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
+ "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/minipass": {
+ "version": "3.3.6",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+ "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+ "license": "ISC",
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/minipass-collect": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz",
+ "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==",
+ "license": "ISC",
+ "optional": true,
+ "dependencies": {
+ "minipass": "^3.0.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/minipass-fetch": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.4.1.tgz",
+ "integrity": "sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "minipass": "^3.1.0",
+ "minipass-sized": "^1.0.3",
+ "minizlib": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "optionalDependencies": {
+ "encoding": "^0.1.12"
+ }
+ },
+ "node_modules/minipass-flush": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz",
+ "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==",
+ "license": "ISC",
+ "optional": true,
+ "dependencies": {
+ "minipass": "^3.0.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/minipass-pipeline": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz",
+ "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==",
+ "license": "ISC",
+ "optional": true,
+ "dependencies": {
+ "minipass": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/minipass-sized": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz",
+ "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==",
+ "license": "ISC",
+ "optional": true,
+ "dependencies": {
+ "minipass": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/minizlib": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz",
+ "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==",
+ "license": "MIT",
+ "dependencies": {
+ "minipass": "^3.0.0",
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/mkdirp": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
+ "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
+ "license": "MIT",
+ "bin": {
+ "mkdirp": "bin/cmd.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/mkdirp-classic": {
+ "version": "0.5.3",
+ "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz",
+ "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==",
+ "license": "MIT"
+ },
"node_modules/mojangson": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/mojangson/-/mojangson-2.0.4.tgz",
@@ -1532,6 +2556,12 @@
"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
"license": "MIT"
},
+ "node_modules/napi-build-utils": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-2.0.0.tgz",
+ "integrity": "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==",
+ "license": "MIT"
+ },
"node_modules/nearley": {
"version": "2.20.1",
"resolved": "https://registry.npmjs.org/nearley/-/nearley-2.20.1.tgz",
@@ -1563,6 +2593,24 @@
"node": ">= 0.6"
}
},
+ "node_modules/node-abi": {
+ "version": "3.87.0",
+ "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.87.0.tgz",
+ "integrity": "sha512-+CGM1L1CgmtheLcBuleyYOn7NWPVu0s0EJH2C4puxgEZb9h8QpR9G2dBfZJOAUhi7VQxuBPMd0hiISWcTyiYyQ==",
+ "license": "MIT",
+ "dependencies": {
+ "semver": "^7.3.5"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/node-addon-api": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz",
+ "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==",
+ "license": "MIT"
+ },
"node_modules/node-fetch": {
"version": "2.7.0",
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz",
@@ -1583,6 +2631,31 @@
}
}
},
+ "node_modules/node-gyp": {
+ "version": "8.4.1",
+ "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-8.4.1.tgz",
+ "integrity": "sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "env-paths": "^2.2.0",
+ "glob": "^7.1.4",
+ "graceful-fs": "^4.2.6",
+ "make-fetch-happen": "^9.1.0",
+ "nopt": "^5.0.0",
+ "npmlog": "^6.0.0",
+ "rimraf": "^3.0.2",
+ "semver": "^7.3.5",
+ "tar": "^6.1.2",
+ "which": "^2.0.2"
+ },
+ "bin": {
+ "node-gyp": "bin/node-gyp.js"
+ },
+ "engines": {
+ "node": ">= 10.12.0"
+ }
+ },
"node_modules/node-rsa": {
"version": "0.4.2",
"resolved": "https://registry.npmjs.org/node-rsa/-/node-rsa-0.4.2.tgz",
@@ -1621,6 +2694,22 @@
"url": "https://opencollective.com/nodemon"
}
},
+ "node_modules/nopt": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz",
+ "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==",
+ "license": "ISC",
+ "optional": true,
+ "dependencies": {
+ "abbrev": "1"
+ },
+ "bin": {
+ "nopt": "bin/nopt.js"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
"node_modules/normalize-path": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
@@ -1631,6 +2720,23 @@
"node": ">=0.10.0"
}
},
+ "node_modules/npmlog": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz",
+ "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==",
+ "deprecated": "This package is no longer supported.",
+ "license": "ISC",
+ "optional": true,
+ "dependencies": {
+ "are-we-there-yet": "^3.0.0",
+ "console-control-strings": "^1.1.0",
+ "gauge": "^4.0.3",
+ "set-blocking": "^2.0.0"
+ },
+ "engines": {
+ "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
+ }
+ },
"node_modules/object-assign": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
@@ -1664,6 +2770,31 @@
"node": ">= 0.8"
}
},
+ "node_modules/once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+ "license": "ISC",
+ "dependencies": {
+ "wrappy": "1"
+ }
+ },
+ "node_modules/p-map": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz",
+ "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "aggregate-error": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/parseurl": {
"version": "1.3.3",
"resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
@@ -1673,11 +2804,25 @@
"node": ">= 0.8"
}
},
+ "node_modules/path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/path-to-regexp": {
- "version": "0.1.12",
- "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz",
- "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==",
- "license": "MIT"
+ "version": "8.3.0",
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz",
+ "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==",
+ "license": "MIT",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
},
"node_modules/picomatch": {
"version": "2.3.1",
@@ -1692,6 +2837,32 @@
"url": "https://github.com/sponsors/jonschlinkert"
}
},
+ "node_modules/prebuild-install": {
+ "version": "7.1.3",
+ "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz",
+ "integrity": "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==",
+ "license": "MIT",
+ "dependencies": {
+ "detect-libc": "^2.0.0",
+ "expand-template": "^2.0.3",
+ "github-from-package": "0.0.0",
+ "minimist": "^1.2.3",
+ "mkdirp-classic": "^0.5.3",
+ "napi-build-utils": "^2.0.0",
+ "node-abi": "^3.3.0",
+ "pump": "^3.0.0",
+ "rc": "^1.2.7",
+ "simple-get": "^4.0.0",
+ "tar-fs": "^2.0.0",
+ "tunnel-agent": "^0.6.0"
+ },
+ "bin": {
+ "prebuild-install": "bin.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/prismarine-auth": {
"version": "2.7.0",
"resolved": "https://registry.npmjs.org/prismarine-auth/-/prismarine-auth-2.7.0.tgz",
@@ -1872,6 +3043,27 @@
"node": ">= 0.6.0"
}
},
+ "node_modules/promise-inflight": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz",
+ "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==",
+ "license": "ISC",
+ "optional": true
+ },
+ "node_modules/promise-retry": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz",
+ "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "err-code": "^2.0.2",
+ "retry": "^0.12.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/protodef": {
"version": "1.19.0",
"resolved": "https://registry.npmjs.org/protodef/-/protodef-1.19.0.tgz",
@@ -1924,6 +3116,16 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/pump": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz",
+ "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==",
+ "license": "MIT",
+ "dependencies": {
+ "end-of-stream": "^1.1.0",
+ "once": "^1.3.1"
+ }
+ },
"node_modules/punycode": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
@@ -1934,12 +3136,12 @@
}
},
"node_modules/qs": {
- "version": "6.13.0",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz",
- "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==",
+ "version": "6.14.1",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.1.tgz",
+ "integrity": "sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==",
"license": "BSD-3-Clause",
"dependencies": {
- "side-channel": "^1.0.6"
+ "side-channel": "^1.1.0"
},
"engines": {
"node": ">=0.6"
@@ -1977,18 +3179,33 @@
}
},
"node_modules/raw-body": {
- "version": "2.5.2",
- "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz",
- "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==",
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz",
+ "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==",
"license": "MIT",
"dependencies": {
- "bytes": "3.1.2",
- "http-errors": "2.0.0",
- "iconv-lite": "0.4.24",
- "unpipe": "1.0.0"
+ "bytes": "~3.1.2",
+ "http-errors": "~2.0.1",
+ "iconv-lite": "~0.7.0",
+ "unpipe": "~1.0.0"
},
"engines": {
- "node": ">= 0.8"
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/rc": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
+ "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
+ "license": "(BSD-2-Clause OR MIT OR Apache-2.0)",
+ "dependencies": {
+ "deep-extend": "^0.6.0",
+ "ini": "~1.3.0",
+ "minimist": "^1.2.0",
+ "strip-json-comments": "~2.0.1"
+ },
+ "bin": {
+ "rc": "cli.js"
}
},
"node_modules/readable-stream": {
@@ -2029,6 +3246,49 @@
"node": ">=0.12"
}
},
+ "node_modules/retry": {
+ "version": "0.12.0",
+ "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz",
+ "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==",
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/rimraf": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "deprecated": "Rimraf versions prior to v4 are no longer supported",
+ "license": "ISC",
+ "optional": true,
+ "dependencies": {
+ "glob": "^7.1.3"
+ },
+ "bin": {
+ "rimraf": "bin.js"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/router": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz",
+ "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==",
+ "license": "MIT",
+ "dependencies": {
+ "debug": "^4.4.0",
+ "depd": "^2.0.0",
+ "is-promise": "^4.0.0",
+ "parseurl": "^1.3.3",
+ "path-to-regexp": "^8.0.0"
+ },
+ "engines": {
+ "node": ">= 18"
+ }
+ },
"node_modules/rxjs": {
"version": "7.8.2",
"resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz",
@@ -2078,68 +3338,82 @@
}
},
"node_modules/send": {
- "version": "0.19.0",
- "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz",
- "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==",
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/send/-/send-1.2.1.tgz",
+ "integrity": "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==",
"license": "MIT",
"dependencies": {
- "debug": "2.6.9",
- "depd": "2.0.0",
- "destroy": "1.2.0",
- "encodeurl": "~1.0.2",
- "escape-html": "~1.0.3",
- "etag": "~1.8.1",
- "fresh": "0.5.2",
- "http-errors": "2.0.0",
- "mime": "1.6.0",
- "ms": "2.1.3",
- "on-finished": "2.4.1",
- "range-parser": "~1.2.1",
- "statuses": "2.0.1"
+ "debug": "^4.4.3",
+ "encodeurl": "^2.0.0",
+ "escape-html": "^1.0.3",
+ "etag": "^1.8.1",
+ "fresh": "^2.0.0",
+ "http-errors": "^2.0.1",
+ "mime-types": "^3.0.2",
+ "ms": "^2.1.3",
+ "on-finished": "^2.4.1",
+ "range-parser": "^1.2.1",
+ "statuses": "^2.0.2"
},
"engines": {
- "node": ">= 0.8.0"
+ "node": ">= 18"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
}
},
- "node_modules/send/node_modules/debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "license": "MIT",
- "dependencies": {
- "ms": "2.0.0"
- }
- },
- "node_modules/send/node_modules/debug/node_modules/ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
- "license": "MIT"
- },
- "node_modules/send/node_modules/encodeurl": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
- "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
+ "node_modules/send/node_modules/mime-db": {
+ "version": "1.54.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz",
+ "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==",
"license": "MIT",
"engines": {
- "node": ">= 0.8"
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/send/node_modules/mime-types": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz",
+ "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==",
+ "license": "MIT",
+ "dependencies": {
+ "mime-db": "^1.54.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
}
},
"node_modules/serve-static": {
- "version": "1.16.2",
- "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz",
- "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==",
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.1.tgz",
+ "integrity": "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==",
"license": "MIT",
"dependencies": {
- "encodeurl": "~2.0.0",
- "escape-html": "~1.0.3",
- "parseurl": "~1.3.3",
- "send": "0.19.0"
+ "encodeurl": "^2.0.0",
+ "escape-html": "^1.0.3",
+ "parseurl": "^1.3.3",
+ "send": "^1.2.0"
},
"engines": {
- "node": ">= 0.8.0"
+ "node": ">= 18"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
}
},
+ "node_modules/set-blocking": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
+ "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==",
+ "license": "ISC",
+ "optional": true
+ },
"node_modules/setprototypeof": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
@@ -2218,6 +3492,58 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/signal-exit": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
+ "license": "ISC",
+ "optional": true
+ },
+ "node_modules/simple-concat": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz",
+ "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/simple-get": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz",
+ "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "decompress-response": "^6.0.0",
+ "once": "^1.3.1",
+ "simple-concat": "^1.0.0"
+ }
+ },
"node_modules/simple-update-notifier": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz",
@@ -2315,10 +3641,83 @@
}
}
},
+ "node_modules/socks": {
+ "version": "2.8.7",
+ "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.7.tgz",
+ "integrity": "sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "ip-address": "^10.0.1",
+ "smart-buffer": "^4.2.0"
+ },
+ "engines": {
+ "node": ">= 10.0.0",
+ "npm": ">= 3.0.0"
+ }
+ },
+ "node_modules/socks-proxy-agent": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.2.1.tgz",
+ "integrity": "sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "agent-base": "^6.0.2",
+ "debug": "^4.3.3",
+ "socks": "^2.6.2"
+ },
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/sqlite": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/sqlite/-/sqlite-5.1.1.tgz",
+ "integrity": "sha512-oBkezXa2hnkfuJwUo44Hl9hS3er+YFtueifoajrgidvqsJRQFpc5fKoAkAor1O5ZnLoa28GBScfHXs8j0K358Q==",
+ "license": "MIT"
+ },
+ "node_modules/sqlite3": {
+ "version": "5.1.7",
+ "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-5.1.7.tgz",
+ "integrity": "sha512-GGIyOiFaG+TUra3JIfkI/zGP8yZYLPQ0pl1bH+ODjiX57sPhrLU5sQJn1y9bDKZUFYkX1crlrPfSYt0BKKdkog==",
+ "hasInstallScript": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "bindings": "^1.5.0",
+ "node-addon-api": "^7.0.0",
+ "prebuild-install": "^7.1.1",
+ "tar": "^6.1.11"
+ },
+ "optionalDependencies": {
+ "node-gyp": "8.x"
+ },
+ "peerDependencies": {
+ "node-gyp": "8.x"
+ },
+ "peerDependenciesMeta": {
+ "node-gyp": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/ssri": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz",
+ "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==",
+ "license": "ISC",
+ "optional": true,
+ "dependencies": {
+ "minipass": "^3.1.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
"node_modules/statuses": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
- "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz",
+ "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==",
"license": "MIT",
"engines": {
"node": ">= 0.8"
@@ -2333,6 +3732,43 @@
"safe-buffer": "~5.2.0"
}
},
+ "node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-json-comments": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
+ "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/supports-color": {
"version": "5.5.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
@@ -2346,6 +3782,81 @@
"node": ">=4"
}
},
+ "node_modules/tar": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz",
+ "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==",
+ "deprecated": "Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exhorbitant rates) by contacting i@izs.me",
+ "license": "ISC",
+ "dependencies": {
+ "chownr": "^2.0.0",
+ "fs-minipass": "^2.0.0",
+ "minipass": "^5.0.0",
+ "minizlib": "^2.1.1",
+ "mkdirp": "^1.0.3",
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/tar-fs": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.4.tgz",
+ "integrity": "sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==",
+ "license": "MIT",
+ "dependencies": {
+ "chownr": "^1.1.1",
+ "mkdirp-classic": "^0.5.2",
+ "pump": "^3.0.0",
+ "tar-stream": "^2.1.4"
+ }
+ },
+ "node_modules/tar-fs/node_modules/chownr": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
+ "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==",
+ "license": "ISC"
+ },
+ "node_modules/tar-stream": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz",
+ "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==",
+ "license": "MIT",
+ "dependencies": {
+ "bl": "^4.0.3",
+ "end-of-stream": "^1.4.1",
+ "fs-constants": "^1.0.0",
+ "inherits": "^2.0.3",
+ "readable-stream": "^3.1.1"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/tar-stream/node_modules/readable-stream": {
+ "version": "3.6.2",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
+ "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
+ "license": "MIT",
+ "dependencies": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/tar/node_modules/minipass": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz",
+ "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/to-regex-range": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
@@ -2391,19 +3902,57 @@
"license": "0BSD",
"optional": true
},
+ "node_modules/tunnel-agent": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
+ "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "safe-buffer": "^5.0.1"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
"node_modules/type-is": {
- "version": "1.6.18",
- "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
- "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz",
+ "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==",
"license": "MIT",
"dependencies": {
- "media-typer": "0.3.0",
- "mime-types": "~2.1.24"
+ "content-type": "^1.0.5",
+ "media-typer": "^1.1.0",
+ "mime-types": "^3.0.0"
},
"engines": {
"node": ">= 0.6"
}
},
+ "node_modules/type-is/node_modules/mime-db": {
+ "version": "1.54.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz",
+ "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/type-is/node_modules/mime-types": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz",
+ "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==",
+ "license": "MIT",
+ "dependencies": {
+ "mime-db": "^1.54.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
"node_modules/typed-emitter": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/typed-emitter/-/typed-emitter-1.4.0.tgz",
@@ -2429,6 +3978,26 @@
"integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==",
"license": "MIT"
},
+ "node_modules/unique-filename": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz",
+ "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==",
+ "license": "ISC",
+ "optional": true,
+ "dependencies": {
+ "unique-slug": "^2.0.0"
+ }
+ },
+ "node_modules/unique-slug": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz",
+ "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==",
+ "license": "ISC",
+ "optional": true,
+ "dependencies": {
+ "imurmurhash": "^0.1.4"
+ }
+ },
"node_modules/unpipe": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
@@ -2447,6 +4016,12 @@
"punycode": "^2.1.0"
}
},
+ "node_modules/util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
+ "license": "MIT"
+ },
"node_modules/utils-merge": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
@@ -2505,6 +4080,38 @@
"webidl-conversions": "^3.0.0"
}
},
+ "node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "license": "ISC",
+ "optional": true,
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/wide-align": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz",
+ "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==",
+ "license": "ISC",
+ "optional": true,
+ "dependencies": {
+ "string-width": "^1.0.2 || 2 || 3 || 4"
+ }
+ },
+ "node_modules/wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
+ "license": "ISC"
+ },
"node_modules/ws": {
"version": "7.4.6",
"resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz",
@@ -2532,6 +4139,12 @@
"integrity": "sha512-/eyHVRJQCirEkSZ1agRSCwriMhwlyUcFkXD5TPVSLP+IPzjsqMVzZwdoczLp1SoQU0R3dxz1RpIK+4YNQbCVOA==",
"license": "MIT"
},
+ "node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "license": "ISC"
+ },
"node_modules/yggdrasil": {
"version": "1.7.0",
"resolved": "https://registry.npmjs.org/yggdrasil/-/yggdrasil-1.7.0.tgz",
diff --git a/nodejs/package.json b/nodejs/package.json
index 0e76533..c6e5a21 100644
--- a/nodejs/package.json
+++ b/nodejs/package.json
@@ -19,14 +19,18 @@
"dependencies": {
"@google/generative-ai": "^0.17.1",
"axios": "^1.7.7",
+ "cors": "^2.8.6",
"dotenv": "^16.0.1",
+ "express": "^5.2.1",
"extend": "^3.0.2",
"minecraft-data": "^3.101.0",
"mineflayer": "^4.33.0",
"mineflayer-pathfinder": "^2.4.5",
"mineflayer-web-inventory": "^1.3.0",
"moment": "^2.29.3",
- "prismarine-windows": "^2.9.0"
+ "prismarine-windows": "^2.9.0",
+ "sqlite": "^5.1.1",
+ "sqlite3": "^5.1.7"
},
"devDependencies": {
"nodemon": "^3.1.7"
diff --git a/nodejs/storage/storage.db b/nodejs/storage/storage.db
new file mode 100644
index 0000000..abb7f99
Binary files /dev/null and b/nodejs/storage/storage.db differ