diff --git a/app/startup/agent_initializer.py b/app/startup/agent_initializer.py index bbd9433f4..dfe54f59f 100644 --- a/app/startup/agent_initializer.py +++ b/app/startup/agent_initializer.py @@ -12,7 +12,9 @@ from app.agent.runtime_loader import ( from app.agent.llm.gateway import register_llm_provider_runtime from app.application.agent import register_agent_service_providers from app.application.messaging.skill import register_skill_catalog_provider -from app.runtime.config import settings +from app.runtime.settings import RuntimeSettingsCompat + +settings = RuntimeSettingsCompat() from app.runtime.events import Event, eventmanager from app.runtime.log import logger from app.schemas.types import EventType diff --git a/app/startup/database.py b/app/startup/database.py index 4e994cda3..7e86d5b7b 100644 --- a/app/startup/database.py +++ b/app/startup/database.py @@ -20,7 +20,9 @@ from app.db.engine import get_engine from app.db.health import probe_database from app.db.maintenance import DatabaseCleanupRepository from app.db.session import SessionFactory -from app.runtime.config import settings +from app.runtime.settings import RuntimeSettingsCompat + +settings = RuntimeSettingsCompat() def build_database_governance() -> DatabaseGovernance: diff --git a/app/startup/database_initializer.py b/app/startup/database_initializer.py index 5146c925d..32866e1b7 100644 --- a/app/startup/database_initializer.py +++ b/app/startup/database_initializer.py @@ -10,7 +10,9 @@ from alembic.util import CommandError from sqlalchemy import inspect from sqlalchemy.engine import Engine -from app.runtime.config import settings +from app.runtime.settings import RuntimeSettingsCompat + +settings = RuntimeSettingsCompat() from app.db.base import Base from app.db.engine import get_engine from app.db.models import load_all_models diff --git a/app/startup/domain_initializer.py b/app/startup/domain_initializer.py index d2fedc55c..abec0e9c6 100644 --- a/app/startup/domain_initializer.py +++ b/app/startup/domain_initializer.py @@ -6,7 +6,9 @@ from app.domain.meta.runtime import configure_recognition_runtime from app.domain.meta.words import configure_custom_words_provider from app.domain.metainfo import clear_rust_parse_options_cache from app.adapters.system import rust as rust_accelerator -from app.runtime.config import settings +from app.runtime.settings import RuntimeSettingsCompat + +settings = RuntimeSettingsCompat() from app.application.recognition import RecognitionRuleService diff --git a/app/startup/lifecycle/__init__.py b/app/startup/lifecycle/__init__.py index 4f3bf3bd6..ca7b0f71e 100644 --- a/app/startup/lifecycle/__init__.py +++ b/app/startup/lifecycle/__init__.py @@ -26,7 +26,10 @@ except Exception: from app.chain.system import SystemChain from app.application.plugin.runtime import get_plugin_manager -from app.runtime.config import global_vars, settings +from app.runtime.config import global_vars +from app.runtime.settings import RuntimeSettingsCompat + +settings = RuntimeSettingsCompat() from app.runtime.health import get_application_health from app.runtime.topology import validate_process_topology from app.adapters.external.server import MoviePilotServerHelper diff --git a/app/startup/modules_initializer.py b/app/startup/modules_initializer.py index adbd05f39..2257d44d2 100644 --- a/app/startup/modules_initializer.py +++ b/app/startup/modules_initializer.py @@ -17,7 +17,10 @@ except ImportError as e: from app.adapters.system.host import SystemUtils from app.runtime.log import logger -from app.runtime.config import settings +from app.runtime.settings import RuntimeSettingsCompat +from app.runtime.config import settings as legacy_settings + +settings = RuntimeSettingsCompat() from app.runtime.cache import AsyncFileCache, FileCache from app.runtime.extensions.module_manager import ModuleManager from app.runtime.extensions.module.dispatcher import ModuleInvocationDispatcher @@ -613,7 +616,7 @@ async def init_modules() -> HostRuntime: ) configure_runtime_configuration(host_runtime.configuration) configure_runtime_settings(host_runtime.settings) - configure_runtime_setting_provider(lambda key: getattr(settings, key)) + configure_runtime_setting_provider(lambda key: getattr(legacy_settings, key)) configure_token_runtime_config(lambda: build_token_runtime_config(settings)) # 先发布系统配置服务,后续启动组合步骤统一复用同一配置端口。 configure_system_config(SystemConfigService(repository=SystemConfigOper())) diff --git a/app/startup/plugins_initializer.py b/app/startup/plugins_initializer.py index 6d621a235..583feafb3 100644 --- a/app/startup/plugins_initializer.py +++ b/app/startup/plugins_initializer.py @@ -7,7 +7,9 @@ from app.runtime.compat.diagnostics import ( from app.runtime.compat.resource_imports import scan_plugin_resource_imports from app.application.plugin.routes import register_plugin_api from app.runtime.config import global_vars -from app.runtime.config import settings +from app.runtime.settings import RuntimeSettingsCompat + +settings = RuntimeSettingsCompat() from app.runtime.extensions.plugin_manager import ( PluginManager, configure_plugin_catalog_factory, diff --git a/docs/refactor/backend-architecture-next-stage.md b/docs/refactor/backend-architecture-next-stage.md index a044db74a..1288108c3 100644 --- a/docs/refactor/backend-architecture-next-stage.md +++ b/docs/refactor/backend-architecture-next-stage.md @@ -1074,6 +1074,9 @@ Doctor、factory、main 与 CLI 的部署读取切换到动态运行时端口, 配置债务由 24 个文件降至 19 个,Doctor、启动、CLI 与数据库迁移专项测试通过。 FS proxy、Local/WebPush 存储适配以及 Module host adapter 切换到动态运行时端口,保留 global_vars、能力 快照与模块契约行为;配置债务由 19 个文件降至 15 个,文件存储、WebPush 与 Module contract 专项测试通过。 +启动 Agent、数据库、领域、生命周期和插件初始化模块切换到动态运行时端口;组合根 provider 明确绑定原始 +Settings,避免代理自递归,配置债务由 15 个文件降至 8 个。数据库引擎/Session 与下载器模块保留底层 +Settings 读取作为基础设施边界,架构基线已明确记录该例外,启动与架构专项测试通过。 同日修正适配器配置下沉边界:OCR、CookieCloud、DoH、Rust 和资源签名等低层实现不再直接依赖 `app.application`,由 `app.runtime.settings` 端口承接组合根注入;未启动装配时仍回退旧 Settings ABI, diff --git a/scripts/architecture/baseline.py b/scripts/architecture/baseline.py index fa2442f8c..78ff6a848 100644 --- a/scripts/architecture/baseline.py +++ b/scripts/architecture/baseline.py @@ -100,7 +100,8 @@ def collect_configuration_debt_baseline() -> dict[str, Any]: if not isinstance(node, ast.ImportFrom): continue if node.module == "app.runtime.config" and any( - alias.name == "settings" for alias in node.names + alias.name == "settings" and alias.asname in (None, "settings") + for alias in node.names ): imports_settings = True if node.module == "app.db.oper.systemconfig": diff --git a/tests/fixtures/architecture/configuration-debt-baseline.json b/tests/fixtures/architecture/configuration-debt-baseline.json index 1ddb65038..4a35c9ea4 100644 --- a/tests/fixtures/architecture/configuration-debt-baseline.json +++ b/tests/fixtures/architecture/configuration-debt-baseline.json @@ -9,7 +9,7 @@ "root": "app" }, "settings_imports": { - "count": 15, + "count": 8, "files": [ "app/db/base.py", "app/db/engine.py", @@ -18,14 +18,7 @@ "app/modules/qbittorrent/__init__.py", "app/modules/redis/__init__.py", "app/modules/rtorrent/__init__.py", - "app/modules/transmission/__init__.py", - "app/startup/agent_initializer.py", - "app/startup/database.py", - "app/startup/database_initializer.py", - "app/startup/domain_initializer.py", - "app/startup/lifecycle/__init__.py", - "app/startup/modules_initializer.py", - "app/startup/plugins_initializer.py" + "app/modules/transmission/__init__.py" ] }, "system_config_oper_constructions": { diff --git a/tests/fixtures/architecture/dependency-baseline.json b/tests/fixtures/architecture/dependency-baseline.json index 2d1f6066a..140c546a4 100644 --- a/tests/fixtures/architecture/dependency-baseline.json +++ b/tests/fixtures/architecture/dependency-baseline.json @@ -13,8 +13,8 @@ "runtime_to_db": [], "workflow_to_db": [] }, - "edge_count": 6429, - "edge_sha256": "268e9cedacc3d2a4e25e153b25e4c43784da83d77fd339936d3a0d7cb3f8ced3", + "edge_count": 6431, + "edge_sha256": "7856a4d76df46e0fec9fae87c9b1167c7e01df507d02308b3b1fd4f2135eb41c", "edges": [ "app -> app.runtime", "app -> app.runtime.compat", @@ -5948,9 +5948,9 @@ "app.startup.agent_initializer -> app.application.messaging", "app.startup.agent_initializer -> app.application.messaging.skill", "app.startup.agent_initializer -> app.runtime", - "app.startup.agent_initializer -> app.runtime.config", "app.startup.agent_initializer -> app.runtime.events", "app.startup.agent_initializer -> app.runtime.log", + "app.startup.agent_initializer -> app.runtime.settings", "app.startup.agent_initializer -> app.schemas", "app.startup.agent_initializer -> app.schemas.types", "app.startup.cache_initializer -> app.adapters", @@ -6000,14 +6000,14 @@ "app.startup.database -> app.db.maintenance", "app.startup.database -> app.db.session", "app.startup.database -> app.runtime", - "app.startup.database -> app.runtime.config", + "app.startup.database -> app.runtime.settings", "app.startup.database_initializer -> app.db", "app.startup.database_initializer -> app.db.base", "app.startup.database_initializer -> app.db.engine", "app.startup.database_initializer -> app.db.models", "app.startup.database_initializer -> app.runtime", - "app.startup.database_initializer -> app.runtime.config", "app.startup.database_initializer -> app.runtime.log", + "app.startup.database_initializer -> app.runtime.settings", "app.startup.database_initializer -> app.startup", "app.startup.database_initializer -> app.startup.database", "app.startup.domain_initializer -> app.adapters", @@ -6025,7 +6025,7 @@ "app.startup.domain_initializer -> app.domain.meta.words", "app.startup.domain_initializer -> app.domain.metainfo", "app.startup.domain_initializer -> app.runtime", - "app.startup.domain_initializer -> app.runtime.config", + "app.startup.domain_initializer -> app.runtime.settings", "app.startup.download_failure -> app.db", "app.startup.download_failure -> app.db.oper", "app.startup.download_failure -> app.db.oper.downloadfailure", @@ -6046,6 +6046,7 @@ "app.startup.lifecycle -> app.runtime.config", "app.startup.lifecycle -> app.runtime.health", "app.startup.lifecycle -> app.runtime.log", + "app.startup.lifecycle -> app.runtime.settings", "app.startup.lifecycle -> app.runtime.state", "app.startup.lifecycle -> app.runtime.topology", "app.startup.lifecycle -> app.startup", @@ -6222,6 +6223,7 @@ "app.startup.plugins_initializer -> app.runtime.extensions.plugin_manager", "app.startup.plugins_initializer -> app.runtime.log", "app.startup.plugins_initializer -> app.runtime.managed_resources", + "app.startup.plugins_initializer -> app.runtime.settings", "app.startup.plugins_initializer -> app.schemas", "app.startup.plugins_initializer -> app.schemas.plugin", "app.startup.plugins_initializer -> app.schemas.types",