auto-account-machine/src/index.js
dengqichen 540423f2bf aaaaa
2025-11-16 19:12:44 +08:00

90 lines
2.0 KiB
JavaScript

/**
* Auto Account Machine - 主入口
* 工具注册和管理
*/
const fs = require('fs');
const path = require('path');
const logger = require('./shared/logger');
class ToolRegistry {
constructor() {
this.tools = new Map();
}
/**
* 注册工具
* @param {Object} tool - 工具对象
*/
register(tool) {
if (!tool.name || !tool.execute) {
throw new Error('Tool must have name and execute method');
}
this.tools.set(tool.name, tool);
if (tool.alias) {
this.tools.set(tool.alias, tool);
}
}
/**
* 获取工具
* @param {string} name - 工具名称或别名
* @returns {Object|null}
*/
get(name) {
return this.tools.get(name) || null;
}
/**
* 获取所有工具
* @returns {Array}
*/
getAll() {
const uniqueTools = new Map();
for (const [key, tool] of this.tools) {
if (!uniqueTools.has(tool.name)) {
uniqueTools.set(tool.name, tool);
}
}
return Array.from(uniqueTools.values());
}
/**
* 自动发现并注册所有工具
* @param {string} toolsDir - 工具目录路径
*/
autoDiscover(toolsDir) {
try {
const items = fs.readdirSync(toolsDir);
items.forEach(item => {
const itemPath = path.join(toolsDir, item);
const stat = fs.statSync(itemPath);
if (stat.isDirectory()) {
try {
const tool = require(itemPath);
this.register(tool);
logger.debug('registry', `Registered tool: ${tool.name}`);
} catch (error) {
logger.warn('registry', `Failed to load tool from ${item}: ${error.message}`);
}
}
});
logger.debug('registry', `Total tools registered: ${this.getAll().length}`);
} catch (error) {
logger.error('registry', `Failed to discover tools: ${error.message}`);
}
}
}
// 创建全局注册表实例
const registry = new ToolRegistry();
// 自动发现工具
const toolsDir = path.join(__dirname, 'tools');
registry.autoDiscover(toolsDir);
module.exports = registry;