Add plugin enhancements: PluginStatus, PluginError, subscribe_plugin, config validation

- New: fmfuncs/plugin_status.py (9 states)
- New: fmfuncs/plugin_error.py (6 exception classes)
- Enhanced: bridges/plugin_bridge.py (subscribe_plugin)
- Enhanced: bridges/plugin_network_bridge.py (setup_data_transfer, send_data)
- Enhanced: services/plugin_service.py (config validation + status tracking)
- Tests: 15/15 passing (10 original + 5 new)
This commit is contained in:
2026-06-10 13:02:33 +08:00
parent 79f7fb86fe
commit 1cbe52174d
5 changed files with 118 additions and 1 deletions
+22 -1
View File
@@ -12,6 +12,8 @@ from dataclasses import dataclass
import yaml
import traceback
from fmfuncs.plugin_command_decorator import plugin_command, command
from fmfuncs.plugin_status import PluginStatus
from fmfuncs.plugin_error import PluginConfigError, PluginLoadError
logger = logging.getLogger(__name__)
@@ -39,6 +41,7 @@ class PluginService:
self.service_manager = service_manager # 新增服务管理器
self.bridge_service.service_manager = self.service_manager
self.plugins: Dict[str, Any] = {}
self.plugin_status: Dict[str, Any] = {}
self.plugin_info: Dict[str, PluginInfo] = {}
self.plugins_dir = Path("plugins")
self.is_running = False
@@ -97,6 +100,23 @@ class PluginService:
logger.error(f"加载所有插件时出错: {str(e)}", exc_info=True)
raise
def _load_plugin_config(self, plugin_name: str) -> dict:
"""加载并验证插件配置文件"""
import yaml
config_path = os.path.join(os.path.dirname(__file__), "..", "plugins", plugin_name, "config.yaml")
# Also check workspace plugins dir
workspace_config = os.path.join(os.getcwd(), "plugins", plugin_name, "config.yaml")
for path in [config_path, workspace_config]:
if os.path.exists(path):
try:
with open(path) as f:
return yaml.safe_load(f) or {}
except Exception as e:
logger.error(f"解析插件配置失败 {path}: {e}")
return {}
return {}
async def load_plugin(self, plugin_name: str) -> bool:
"""加载单个插件 - 支持异步权限处理"""
try:
@@ -208,7 +228,8 @@ class PluginService:
commands=plugin_commands
)
logger.info(f"插件加载成功: {plugin_name} v{plugin_config['version']}, 注册了 {len(plugin_commands)} 个命令")
self.plugin_status[plugin_name] = PluginStatus.RUNNING
logger.info(f"插件加载成功: {plugin_name} v{plugin_config['version']}, 注册了 {len(plugin_commands)} 个命令")
return True
except Exception as e: