diff --git a/gui.py b/gui.py index 8efe794d3..a00cc2c32 100644 --- a/gui.py +++ b/gui.py @@ -122,9 +122,21 @@ def func(ev: Optional[Event]): except Exception as e: logger.error(f"Uvicorn服务崩溃: {str(e)}") raise +def _stop_process(process, timeout=5): + """ + Safely stop a multiprocessing.Process with escalating termination. + """ + if not process or not process.is_alive(): + return + logger.info(f"正在停止服务进程 (PID: {process.pid})...") + process.terminate() + process.join(timeout=timeout) - + if process.is_alive(): + logger.warning(f"服务进程 (PID: {process.pid}) 超时未退出,强制终止...") + process.kill() + process.join(timeout=3) if __name__ == "__main__": @@ -161,33 +173,18 @@ if __name__ == "__main__": if restart_triggered: logger.info("重启事件触发,终止当前服务...") - process.join(timeout=5) - if process.is_alive(): - logger.warning("无法终止服务进程,强制退出") + _stop_process(process) break elif not process.is_alive(): logger.error("Alas Web服务意外退出") should_exit = True # 确保子进程完全退出 - if process.is_alive(): - process.terminate() - process.join(timeout=3) - if process.is_alive(): - process.terminate() - process.join(timeout=3) + _stop_process(process) - # 最终清理 - if process.is_alive(): - process.kill() - process.join() - if process.is_alive(): - process.kill() - process.join() + # 最终清理(预防性) + _stop_process(process) logger.info("Alas Web服务已成功退出") else: # 非重载模式:直接运行 - try: - func(None) - finally: - pass + func(None) diff --git a/mcp_server_sse.py b/mcp_server_sse.py index 610192483..f958da849 100644 --- a/mcp_server_sse.py +++ b/mcp_server_sse.py @@ -93,7 +93,17 @@ async def list_tools() -> List[Tool]: "task": {"type": "string"}, "group": {"type": "string"}, "arg": {"type": "string"}, - "value": {"type": "any"} + "value": { + "oneOf": [ + {"type": "string"}, + {"type": "number"}, + {"type": "boolean"}, + {"type": "object"}, + {"type": "array"}, + {"type": "null"} + ], + "description": "新的配置值" + } }, "required": ["instance", "task", "group", "arg", "value"] } diff --git a/module/config/mcp_helper.py b/module/config/mcp_helper.py index e4ad085fe..fcb04cda2 100644 --- a/module/config/mcp_helper.py +++ b/module/config/mcp_helper.py @@ -38,17 +38,11 @@ class McpConfigHelper: if group_name == "Storage": # Skip storage continue - group_info = spec_i18n.get("_info", {}) - if not group_info and group_name in spec_i18n: - # Some groups might have their own top-level entry or be sub-keys - pass - - # Group localized info - group_display = group_name - group_help = "" - if group_name in spec_i18n: - group_display = spec_i18n[group_name].get("_info", {}).get("name", group_name) - group_help = spec_i18n[group_name].get("_info", {}).get("help", "") + # Resolve group i18n metadata once + group_meta = spec_i18n.get(group_name, {}) + info = group_meta.get("_info", {}) + group_display = info.get("name", group_name) + group_help = info.get("help", "") group_result = { "display_name": group_display,