From 903a499096f1a4226a8e284142f05ff13dbd121b Mon Sep 17 00:00:00 2001 From: Soulter <905617992@qq.com> Date: Fri, 26 Dec 2025 19:58:23 +0800 Subject: [PATCH 1/3] refactor: move builtin stars to astrbot package fixes: #4202 --- .github/copilot-instructions.md | 3 +-- .gitignore | 4 +-- .../astrbot/long_term_memory.py | 0 .../builtin_stars}/astrbot/main.py | 0 .../builtin_stars}/astrbot/metadata.yaml | 0 .../astrbot/process_llm_request.py | 0 .../builtin_commands/commands/__init__.py | 0 .../builtin_commands/commands/admin.py | 0 .../builtin_commands/commands/alter_cmd.py | 0 .../builtin_commands/commands/conversation.py | 0 .../builtin_commands/commands/help.py | 0 .../builtin_commands/commands/llm.py | 0 .../builtin_commands/commands/persona.py | 0 .../builtin_commands/commands/plugin.py | 0 .../builtin_commands/commands/provider.py | 0 .../builtin_commands/commands/setunset.py | 0 .../builtin_commands/commands/sid.py | 0 .../builtin_commands/commands/t2i.py | 0 .../builtin_commands/commands/tool.py | 0 .../builtin_commands/commands/tts.py | 0 .../commands/utils/rst_scene.py | 0 .../builtin_stars}/builtin_commands/main.py | 0 .../builtin_commands/metadata.yaml | 0 .../builtin_stars}/python_interpreter/main.py | 0 .../python_interpreter/metadata.yaml | 0 .../python_interpreter/requirements.txt | 0 .../python_interpreter/shared/api.py | 0 .../builtin_stars}/reminder/main.py | 0 .../builtin_stars}/reminder/metadata.yaml | 0 .../builtin_stars}/session_controller/main.py | 0 .../session_controller/metadata.yaml | 0 .../web_searcher/engines/__init__.py | 0 .../web_searcher/engines/bing.py | 0 .../web_searcher/engines/sogo.py | 0 .../builtin_stars}/web_searcher/main.py | 0 .../builtin_stars}/web_searcher/metadata.yaml | 0 astrbot/core/log.py | 2 +- .../method/agent_sub_stages/internal.py | 2 +- astrbot/core/pipeline/waking_check/stage.py | 2 +- astrbot/core/star/context.py | 2 +- astrbot/core/star/star_manager.py | 25 ++++++++----------- pyproject.toml | 2 +- 42 files changed, 19 insertions(+), 23 deletions(-) rename {packages => astrbot/builtin_stars}/astrbot/long_term_memory.py (100%) rename {packages => astrbot/builtin_stars}/astrbot/main.py (100%) rename {packages => astrbot/builtin_stars}/astrbot/metadata.yaml (100%) rename {packages => astrbot/builtin_stars}/astrbot/process_llm_request.py (100%) rename {packages => astrbot/builtin_stars}/builtin_commands/commands/__init__.py (100%) rename {packages => astrbot/builtin_stars}/builtin_commands/commands/admin.py (100%) rename {packages => astrbot/builtin_stars}/builtin_commands/commands/alter_cmd.py (100%) rename {packages => astrbot/builtin_stars}/builtin_commands/commands/conversation.py (100%) rename {packages => astrbot/builtin_stars}/builtin_commands/commands/help.py (100%) rename {packages => astrbot/builtin_stars}/builtin_commands/commands/llm.py (100%) rename {packages => astrbot/builtin_stars}/builtin_commands/commands/persona.py (100%) rename {packages => astrbot/builtin_stars}/builtin_commands/commands/plugin.py (100%) rename {packages => astrbot/builtin_stars}/builtin_commands/commands/provider.py (100%) rename {packages => astrbot/builtin_stars}/builtin_commands/commands/setunset.py (100%) rename {packages => astrbot/builtin_stars}/builtin_commands/commands/sid.py (100%) rename {packages => astrbot/builtin_stars}/builtin_commands/commands/t2i.py (100%) rename {packages => astrbot/builtin_stars}/builtin_commands/commands/tool.py (100%) rename {packages => astrbot/builtin_stars}/builtin_commands/commands/tts.py (100%) rename {packages => astrbot/builtin_stars}/builtin_commands/commands/utils/rst_scene.py (100%) rename {packages => astrbot/builtin_stars}/builtin_commands/main.py (100%) rename {packages => astrbot/builtin_stars}/builtin_commands/metadata.yaml (100%) rename {packages => astrbot/builtin_stars}/python_interpreter/main.py (100%) rename {packages => astrbot/builtin_stars}/python_interpreter/metadata.yaml (100%) rename {packages => astrbot/builtin_stars}/python_interpreter/requirements.txt (100%) rename {packages => astrbot/builtin_stars}/python_interpreter/shared/api.py (100%) rename {packages => astrbot/builtin_stars}/reminder/main.py (100%) rename {packages => astrbot/builtin_stars}/reminder/metadata.yaml (100%) rename {packages => astrbot/builtin_stars}/session_controller/main.py (100%) rename {packages => astrbot/builtin_stars}/session_controller/metadata.yaml (100%) rename {packages => astrbot/builtin_stars}/web_searcher/engines/__init__.py (100%) rename {packages => astrbot/builtin_stars}/web_searcher/engines/bing.py (100%) rename {packages => astrbot/builtin_stars}/web_searcher/engines/sogo.py (100%) rename {packages => astrbot/builtin_stars}/web_searcher/main.py (100%) rename {packages => astrbot/builtin_stars}/web_searcher/metadata.yaml (100%) diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index 05a4559ed..abdeee93b 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -15,7 +15,6 @@ Always reference these instructions first and fallback to search or bash command ### Running the Application - Run main application: `uv run main.py` -- starts in ~3 seconds - Application creates WebUI on http://localhost:6185 (default credentials: `astrbot`/`astrbot`) -- Application loads plugins automatically from `packages/` and `data/plugins/` directories ### Dashboard Build (Vue.js/Node.js) - **Prerequisites**: Node.js 20+ and npm 10+ required @@ -35,7 +34,7 @@ Always reference these instructions first and fallback to search or bash command - **ALWAYS** run `uv run ruff check .` and `uv run ruff format .` before committing changes ### Plugin Development -- Plugins load from `packages/` (built-in) and `data/plugins/` (user-installed) +- Plugins load from `astrbot/builtin_stars/` (built-in) and `data/plugins/` (user-installed) - Plugin system supports function tools and message handlers - Key plugins: python_interpreter, web_searcher, astrbot, reminder, session_controller diff --git a/.gitignore b/.gitignore index 9472296bb..e59ea65b5 100644 --- a/.gitignore +++ b/.gitignore @@ -24,9 +24,9 @@ configs/session configs/config.yaml cmd_config.json -# Plugins and packages +# Plugins addons/plugins -packages/python_interpreter/workplace +astrbot/builtin_stars/python_interpreter/workplace tests/astrbot_plugin_openai # Dashboard diff --git a/packages/astrbot/long_term_memory.py b/astrbot/builtin_stars/astrbot/long_term_memory.py similarity index 100% rename from packages/astrbot/long_term_memory.py rename to astrbot/builtin_stars/astrbot/long_term_memory.py diff --git a/packages/astrbot/main.py b/astrbot/builtin_stars/astrbot/main.py similarity index 100% rename from packages/astrbot/main.py rename to astrbot/builtin_stars/astrbot/main.py diff --git a/packages/astrbot/metadata.yaml b/astrbot/builtin_stars/astrbot/metadata.yaml similarity index 100% rename from packages/astrbot/metadata.yaml rename to astrbot/builtin_stars/astrbot/metadata.yaml diff --git a/packages/astrbot/process_llm_request.py b/astrbot/builtin_stars/astrbot/process_llm_request.py similarity index 100% rename from packages/astrbot/process_llm_request.py rename to astrbot/builtin_stars/astrbot/process_llm_request.py diff --git a/packages/builtin_commands/commands/__init__.py b/astrbot/builtin_stars/builtin_commands/commands/__init__.py similarity index 100% rename from packages/builtin_commands/commands/__init__.py rename to astrbot/builtin_stars/builtin_commands/commands/__init__.py diff --git a/packages/builtin_commands/commands/admin.py b/astrbot/builtin_stars/builtin_commands/commands/admin.py similarity index 100% rename from packages/builtin_commands/commands/admin.py rename to astrbot/builtin_stars/builtin_commands/commands/admin.py diff --git a/packages/builtin_commands/commands/alter_cmd.py b/astrbot/builtin_stars/builtin_commands/commands/alter_cmd.py similarity index 100% rename from packages/builtin_commands/commands/alter_cmd.py rename to astrbot/builtin_stars/builtin_commands/commands/alter_cmd.py diff --git a/packages/builtin_commands/commands/conversation.py b/astrbot/builtin_stars/builtin_commands/commands/conversation.py similarity index 100% rename from packages/builtin_commands/commands/conversation.py rename to astrbot/builtin_stars/builtin_commands/commands/conversation.py diff --git a/packages/builtin_commands/commands/help.py b/astrbot/builtin_stars/builtin_commands/commands/help.py similarity index 100% rename from packages/builtin_commands/commands/help.py rename to astrbot/builtin_stars/builtin_commands/commands/help.py diff --git a/packages/builtin_commands/commands/llm.py b/astrbot/builtin_stars/builtin_commands/commands/llm.py similarity index 100% rename from packages/builtin_commands/commands/llm.py rename to astrbot/builtin_stars/builtin_commands/commands/llm.py diff --git a/packages/builtin_commands/commands/persona.py b/astrbot/builtin_stars/builtin_commands/commands/persona.py similarity index 100% rename from packages/builtin_commands/commands/persona.py rename to astrbot/builtin_stars/builtin_commands/commands/persona.py diff --git a/packages/builtin_commands/commands/plugin.py b/astrbot/builtin_stars/builtin_commands/commands/plugin.py similarity index 100% rename from packages/builtin_commands/commands/plugin.py rename to astrbot/builtin_stars/builtin_commands/commands/plugin.py diff --git a/packages/builtin_commands/commands/provider.py b/astrbot/builtin_stars/builtin_commands/commands/provider.py similarity index 100% rename from packages/builtin_commands/commands/provider.py rename to astrbot/builtin_stars/builtin_commands/commands/provider.py diff --git a/packages/builtin_commands/commands/setunset.py b/astrbot/builtin_stars/builtin_commands/commands/setunset.py similarity index 100% rename from packages/builtin_commands/commands/setunset.py rename to astrbot/builtin_stars/builtin_commands/commands/setunset.py diff --git a/packages/builtin_commands/commands/sid.py b/astrbot/builtin_stars/builtin_commands/commands/sid.py similarity index 100% rename from packages/builtin_commands/commands/sid.py rename to astrbot/builtin_stars/builtin_commands/commands/sid.py diff --git a/packages/builtin_commands/commands/t2i.py b/astrbot/builtin_stars/builtin_commands/commands/t2i.py similarity index 100% rename from packages/builtin_commands/commands/t2i.py rename to astrbot/builtin_stars/builtin_commands/commands/t2i.py diff --git a/packages/builtin_commands/commands/tool.py b/astrbot/builtin_stars/builtin_commands/commands/tool.py similarity index 100% rename from packages/builtin_commands/commands/tool.py rename to astrbot/builtin_stars/builtin_commands/commands/tool.py diff --git a/packages/builtin_commands/commands/tts.py b/astrbot/builtin_stars/builtin_commands/commands/tts.py similarity index 100% rename from packages/builtin_commands/commands/tts.py rename to astrbot/builtin_stars/builtin_commands/commands/tts.py diff --git a/packages/builtin_commands/commands/utils/rst_scene.py b/astrbot/builtin_stars/builtin_commands/commands/utils/rst_scene.py similarity index 100% rename from packages/builtin_commands/commands/utils/rst_scene.py rename to astrbot/builtin_stars/builtin_commands/commands/utils/rst_scene.py diff --git a/packages/builtin_commands/main.py b/astrbot/builtin_stars/builtin_commands/main.py similarity index 100% rename from packages/builtin_commands/main.py rename to astrbot/builtin_stars/builtin_commands/main.py diff --git a/packages/builtin_commands/metadata.yaml b/astrbot/builtin_stars/builtin_commands/metadata.yaml similarity index 100% rename from packages/builtin_commands/metadata.yaml rename to astrbot/builtin_stars/builtin_commands/metadata.yaml diff --git a/packages/python_interpreter/main.py b/astrbot/builtin_stars/python_interpreter/main.py similarity index 100% rename from packages/python_interpreter/main.py rename to astrbot/builtin_stars/python_interpreter/main.py diff --git a/packages/python_interpreter/metadata.yaml b/astrbot/builtin_stars/python_interpreter/metadata.yaml similarity index 100% rename from packages/python_interpreter/metadata.yaml rename to astrbot/builtin_stars/python_interpreter/metadata.yaml diff --git a/packages/python_interpreter/requirements.txt b/astrbot/builtin_stars/python_interpreter/requirements.txt similarity index 100% rename from packages/python_interpreter/requirements.txt rename to astrbot/builtin_stars/python_interpreter/requirements.txt diff --git a/packages/python_interpreter/shared/api.py b/astrbot/builtin_stars/python_interpreter/shared/api.py similarity index 100% rename from packages/python_interpreter/shared/api.py rename to astrbot/builtin_stars/python_interpreter/shared/api.py diff --git a/packages/reminder/main.py b/astrbot/builtin_stars/reminder/main.py similarity index 100% rename from packages/reminder/main.py rename to astrbot/builtin_stars/reminder/main.py diff --git a/packages/reminder/metadata.yaml b/astrbot/builtin_stars/reminder/metadata.yaml similarity index 100% rename from packages/reminder/metadata.yaml rename to astrbot/builtin_stars/reminder/metadata.yaml diff --git a/packages/session_controller/main.py b/astrbot/builtin_stars/session_controller/main.py similarity index 100% rename from packages/session_controller/main.py rename to astrbot/builtin_stars/session_controller/main.py diff --git a/packages/session_controller/metadata.yaml b/astrbot/builtin_stars/session_controller/metadata.yaml similarity index 100% rename from packages/session_controller/metadata.yaml rename to astrbot/builtin_stars/session_controller/metadata.yaml diff --git a/packages/web_searcher/engines/__init__.py b/astrbot/builtin_stars/web_searcher/engines/__init__.py similarity index 100% rename from packages/web_searcher/engines/__init__.py rename to astrbot/builtin_stars/web_searcher/engines/__init__.py diff --git a/packages/web_searcher/engines/bing.py b/astrbot/builtin_stars/web_searcher/engines/bing.py similarity index 100% rename from packages/web_searcher/engines/bing.py rename to astrbot/builtin_stars/web_searcher/engines/bing.py diff --git a/packages/web_searcher/engines/sogo.py b/astrbot/builtin_stars/web_searcher/engines/sogo.py similarity index 100% rename from packages/web_searcher/engines/sogo.py rename to astrbot/builtin_stars/web_searcher/engines/sogo.py diff --git a/packages/web_searcher/main.py b/astrbot/builtin_stars/web_searcher/main.py similarity index 100% rename from packages/web_searcher/main.py rename to astrbot/builtin_stars/web_searcher/main.py diff --git a/packages/web_searcher/metadata.yaml b/astrbot/builtin_stars/web_searcher/metadata.yaml similarity index 100% rename from packages/web_searcher/metadata.yaml rename to astrbot/builtin_stars/web_searcher/metadata.yaml diff --git a/astrbot/core/log.py b/astrbot/core/log.py index 806ebcebb..a70fdbf01 100644 --- a/astrbot/core/log.py +++ b/astrbot/core/log.py @@ -58,7 +58,7 @@ def is_plugin_path(pathname): return False norm_path = os.path.normpath(pathname) - return ("data/plugins" in norm_path) or ("packages/" in norm_path) + return ("data/plugins" in norm_path) or ("astrbot/builtin_stars/" in norm_path) def get_short_level_name(level_name): diff --git a/astrbot/core/pipeline/process_stage/method/agent_sub_stages/internal.py b/astrbot/core/pipeline/process_stage/method/agent_sub_stages/internal.py index d147a811f..6c7c857a7 100644 --- a/astrbot/core/pipeline/process_stage/method/agent_sub_stages/internal.py +++ b/astrbot/core/pipeline/process_stage/method/agent_sub_stages/internal.py @@ -390,7 +390,7 @@ async def process( return req.prompt = event.message_str[len(provider_wake_prefix) :] - # func_tool selection 现在已经转移到 packages/astrbot 插件中进行选择。 + # func_tool selection 现在已经转移到 astrbot/builtin_stars/astrbot 插件中进行选择。 # req.func_tool = self.ctx.plugin_manager.context.get_llm_tool_manager() for comp in event.message_obj.message: if isinstance(comp, Image): diff --git a/astrbot/core/pipeline/waking_check/stage.py b/astrbot/core/pipeline/waking_check/stage.py index 1efda7c84..8049717c3 100644 --- a/astrbot/core/pipeline/waking_check/stage.py +++ b/astrbot/core/pipeline/waking_check/stage.py @@ -136,7 +136,7 @@ async def process( ): if ( self.disable_builtin_commands - and handler.handler_module_path == "packages.builtin_commands.main" + and handler.handler_module_path == "astrbot.builtin_stars.builtin_commands.main" ): logger.debug("skipping builtin command") continue diff --git a/astrbot/core/star/context.py b/astrbot/core/star/context.py index 3b666b002..c8e470632 100644 --- a/astrbot/core/star/context.py +++ b/astrbot/core/star/context.py @@ -377,7 +377,7 @@ def add_llm_tools(self, *tools: FunctionTool) -> None: if not module_path: _parts = [] module_part = tool.__module__.split(".") - flags = ["packages", "plugins"] + flags = ["builtin_stars", "plugins"] for i, part in enumerate(module_part): _parts.append(part) if part in flags and i + 1 < len(module_part): diff --git a/astrbot/core/star/star_manager.py b/astrbot/core/star/star_manager.py index c142c0e9b..27b469597 100644 --- a/astrbot/core/star/star_manager.py +++ b/astrbot/core/star/star_manager.py @@ -18,6 +18,7 @@ from astrbot.core.provider.register import llm_tools from astrbot.core.utils.astrbot_path import ( get_astrbot_config_path, + get_astrbot_path, get_astrbot_plugin_path, ) from astrbot.core.utils.io import remove_dir @@ -49,13 +50,8 @@ def __init__(self, context: Context, config: AstrBotConfig): """存储插件的路径。即 data/plugins""" self.plugin_config_path = get_astrbot_config_path() """存储插件配置的路径。data/config""" - self.reserved_plugin_path = os.path.abspath( - os.path.join( - os.path.dirname(os.path.abspath(__file__)), - "../../../packages", - ), - ) - """保留插件的路径。在 packages 目录下""" + self.reserved_plugin_path = os.path.join(get_astrbot_path(), "astrbot", "builtin_stars") + """保留插件的路径。在 astrbot/builtin_stars 目录下""" self.conf_schema_fname = "_conf_schema.json" self.logo_fname = "logo.png" """插件配置 Schema 文件名""" @@ -165,6 +161,7 @@ def _get_plugin_modules(self) -> list[dict]: for p in _p: p["reserved"] = True plugins.extend(_p) + print(plugins) return plugins async def _check_plugin_dept_update(self, target_plugin: str | None = None): @@ -252,7 +249,7 @@ def _get_plugin_related_modules( list[str]: 与该插件相关的模块名列表 """ - prefix = "packages." if is_reserved else "data.plugins." + prefix = "astrbot.builtin_stars." if is_reserved else "data.plugins." return [ key for key in list(sys.modules.keys()) @@ -270,7 +267,7 @@ def _purge_modules( 可以基于模块名模式或插件目录名移除模块,用于清理插件相关的模块缓存 Args: - module_patterns: 要移除的模块名模式列表(例如 ["data.plugins", "packages"]) + module_patterns: 要移除的模块名模式列表(例如 ["data.plugins", "astrbot.builtin_stars"]) root_dir_name: 插件根目录名,用于移除与该插件相关的所有模块 is_reserved: 插件是否为保留插件(影响模块路径前缀) @@ -382,9 +379,9 @@ async def load(self, specified_module_path=None, specified_dir_name=None): reserved = plugin_module.get( "reserved", False, - ) # 是否是保留插件。目前在 packages/ 目录下的都是保留插件。保留插件不可以卸载。 + ) # 是否是保留插件。目前在 astrbot/builtin_stars 目录下的都是保留插件。保留插件不可以卸载。 - path = "data.plugins." if not reserved else "packages." + path = "data.plugins." if not reserved else "astrbot.builtin_stars." path += root_dir_name + "." + module_str # 检查是否需要载入指定的插件 @@ -829,7 +826,7 @@ async def _unbind_plugin(self, plugin_name: str, plugin_module_path: str): if ( mp and mp.startswith(plugin_module_path) - and not mp.endswith(("packages", "data.plugins")) + and not mp.endswith(("astrbot.builtin_stars", "data.plugins")) ): to_remove.append(func_tool) for func_tool in to_remove: @@ -884,7 +881,7 @@ async def turn_off_plugin(self, plugin_name: str): plugin.module_path and mp and plugin.module_path.startswith(mp) - and not mp.endswith(("packages", "data.plugins")) + and not mp.endswith(("astrbot.builtin_stars", "data.plugins")) ): func_tool.active = False if func_tool.name not in inactivated_llm_tools: @@ -933,7 +930,7 @@ async def turn_on_plugin(self, plugin_name: str): plugin.module_path and mp and plugin.module_path.startswith(mp) - and not mp.endswith(("packages", "data.plugins")) + and not mp.endswith(("astrbot.builtin_stars", "data.plugins")) and func_tool.name in inactivated_llm_tools ): inactivated_llm_tools.remove(func_tool.name) diff --git a/pyproject.toml b/pyproject.toml index 32f28ac32..0fcf870e5 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -103,7 +103,7 @@ typeCheckingMode = "basic" pythonVersion = "3.10" reportMissingTypeStubs = false reportMissingImports = false -include = ["astrbot", "packages"] +include = ["astrbot"] exclude = ["dashboard", "node_modules", "dist", "data", "tests"] [build-system] From 7f219b97c9cc5c7f896067808416b1ddf23c63ce Mon Sep 17 00:00:00 2001 From: Soulter <905617992@qq.com> Date: Fri, 26 Dec 2025 19:59:35 +0800 Subject: [PATCH 2/3] chore: ruff format --- astrbot/core/pipeline/waking_check/stage.py | 3 ++- astrbot/core/star/star_manager.py | 4 +++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/astrbot/core/pipeline/waking_check/stage.py b/astrbot/core/pipeline/waking_check/stage.py index 8049717c3..a47714508 100644 --- a/astrbot/core/pipeline/waking_check/stage.py +++ b/astrbot/core/pipeline/waking_check/stage.py @@ -136,7 +136,8 @@ async def process( ): if ( self.disable_builtin_commands - and handler.handler_module_path == "astrbot.builtin_stars.builtin_commands.main" + and handler.handler_module_path + == "astrbot.builtin_stars.builtin_commands.main" ): logger.debug("skipping builtin command") continue diff --git a/astrbot/core/star/star_manager.py b/astrbot/core/star/star_manager.py index 27b469597..fd5734ba0 100644 --- a/astrbot/core/star/star_manager.py +++ b/astrbot/core/star/star_manager.py @@ -50,7 +50,9 @@ def __init__(self, context: Context, config: AstrBotConfig): """存储插件的路径。即 data/plugins""" self.plugin_config_path = get_astrbot_config_path() """存储插件配置的路径。data/config""" - self.reserved_plugin_path = os.path.join(get_astrbot_path(), "astrbot", "builtin_stars") + self.reserved_plugin_path = os.path.join( + get_astrbot_path(), "astrbot", "builtin_stars" + ) """保留插件的路径。在 astrbot/builtin_stars 目录下""" self.conf_schema_fname = "_conf_schema.json" self.logo_fname = "logo.png" From 1d918f0496e22af3fdd2bfe46cba94a08f72c29a Mon Sep 17 00:00:00 2001 From: Soulter <905617992@qq.com> Date: Fri, 26 Dec 2025 22:27:41 +0800 Subject: [PATCH 3/3] chore: remove print --- astrbot/core/star/star_manager.py | 1 - 1 file changed, 1 deletion(-) diff --git a/astrbot/core/star/star_manager.py b/astrbot/core/star/star_manager.py index fd5734ba0..34ec24015 100644 --- a/astrbot/core/star/star_manager.py +++ b/astrbot/core/star/star_manager.py @@ -163,7 +163,6 @@ def _get_plugin_modules(self) -> list[dict]: for p in _p: p["reserved"] = True plugins.extend(_p) - print(plugins) return plugins async def _check_plugin_dept_update(self, target_plugin: str | None = None):