# [DEF:Dependencies:Module] # @SEMANTICS: dependency, injection, singleton, factory # @PURPOSE: Manages the creation and provision of shared application dependencies, such as the PluginLoader and TaskManager, to avoid circular imports. # @LAYER: Core # @RELATION: Used by the main app and API routers to get access to shared instances. from pathlib import Path from .core.plugin_loader import PluginLoader from .core.task_manager import TaskManager from .core.config_manager import ConfigManager from .core.scheduler import SchedulerService from .core.database import init_db from .core.logger import logger, belief_scope # Initialize singletons # Use absolute path relative to this file to ensure plugins are found regardless of CWD project_root = Path(__file__).parent.parent.parent config_path = project_root / "config.json" config_manager = ConfigManager(config_path=str(config_path)) # Initialize database before any other services that might use it init_db() # [DEF:get_config_manager:Function] # @PURPOSE: Dependency injector for the ConfigManager. # @PRE: Global config_manager must be initialized. # @POST: Returns shared ConfigManager instance. # @RETURN: ConfigManager - The shared config manager instance. def get_config_manager() -> ConfigManager: """Dependency injector for the ConfigManager.""" with belief_scope("get_config_manager"): return config_manager # [/DEF:get_config_manager:Function] plugin_dir = Path(__file__).parent / "plugins" plugin_loader = PluginLoader(plugin_dir=str(plugin_dir)) logger.info(f"PluginLoader initialized with directory: {plugin_dir}") logger.info(f"Available plugins: {[config.name for config in plugin_loader.get_all_plugin_configs()]}") task_manager = TaskManager(plugin_loader) logger.info("TaskManager initialized") scheduler_service = SchedulerService(task_manager, config_manager) logger.info("SchedulerService initialized") # [DEF:get_plugin_loader:Function] # @PURPOSE: Dependency injector for the PluginLoader. # @PRE: Global plugin_loader must be initialized. # @POST: Returns shared PluginLoader instance. # @RETURN: PluginLoader - The shared plugin loader instance. def get_plugin_loader() -> PluginLoader: """Dependency injector for the PluginLoader.""" with belief_scope("get_plugin_loader"): return plugin_loader # [/DEF:get_plugin_loader:Function] # [DEF:get_task_manager:Function] # @PURPOSE: Dependency injector for the TaskManager. # @PRE: Global task_manager must be initialized. # @POST: Returns shared TaskManager instance. # @RETURN: TaskManager - The shared task manager instance. def get_task_manager() -> TaskManager: """Dependency injector for the TaskManager.""" with belief_scope("get_task_manager"): return task_manager # [/DEF:get_task_manager:Function] # [DEF:get_scheduler_service:Function] # @PURPOSE: Dependency injector for the SchedulerService. # @PRE: Global scheduler_service must be initialized. # @POST: Returns shared SchedulerService instance. # @RETURN: SchedulerService - The shared scheduler service instance. def get_scheduler_service() -> SchedulerService: """Dependency injector for the SchedulerService.""" with belief_scope("get_scheduler_service"): return scheduler_service # [/DEF:get_scheduler_service:Function] # [/DEF:Dependencies:Module]