from __future__ import annotations import logging from dataclasses import dataclass from pathlib import Path from adam.config import ConfigManager from adam.executor import ToolExecutor from adam.job_manager import JobManager from adam.logging_setup import configure_logging from adam.monitoring import SystemMonitor from adam.planner import Planner from adam.registry import ToolRegistry from adam.tool_folders import ToolFolderManager from adam.ui.main_window import MainWindow @dataclass(slots=True) class ApplicationServices: jobs: JobManager monitor: SystemMonitor logger: logging.Logger def shutdown(self) -> None: self.jobs.shutdown() self.monitor.close() for handler in list(self.logger.handlers): self.logger.removeHandler(handler) handler.close() def build_application(root: Path) -> tuple[MainWindow, ApplicationServices]: root = root.resolve() logger = configure_logging(root) config = ConfigManager(root) registry = ToolRegistry(root) tool_folders = ToolFolderManager(config) monitor = SystemMonitor(root) executor = ToolExecutor( root, registry, logger, step_delay=float(config.get("demo_step_delay", 0.24)), ) jobs = JobManager(root, executor, logger, config) planner = Planner(root, registry, config) window = MainWindow( root, planner, registry, jobs, config, monitor, tool_folders, ) services = ApplicationServices(jobs=jobs, monitor=monitor, logger=logger) return window, services