"""Shared test fixtures and utilities.""" from steward.config import ( AnalysisConfig, MemoryConfig, OpenAIConfig, Settings, TelegramConfig, ToolsConfig, ) def make_settings(**kwargs) -> Settings: """Create a Settings instance from old-style kwargs. Maps legacy parameter names to the new nested structure: - telegram_bot_token -> telegram.bot_token - telegram_allowed_user_ids -> telegram.allowed_user_ids - telegram_group_ids -> telegram.group_ids - openai_api_key -> openai.api_key - openai_base_url -> openai.base_url - openai_model -> openai.model - openai_system_prompt -> openai.system_prompt - analysis_target_url -> analysis.target_url - analysis_target_api_key -> analysis.target_api_key - analysis_cron_hour -> analysis.cron_hour - analysis_cron_minute -> analysis.cron_minute - thread_memory_path -> memory.thread_memory_path - mcp_server_url -> tools.mcp_server_url - mcp_server_api_key -> tools.mcp_server_api_key Args: **kwargs: Legacy-style configuration parameters Returns: Settings: A fully constructed Settings instance """ # Extract telegram config telegram_config = TelegramConfig( bot_token=kwargs.pop("telegram_bot_token", ""), allowed_user_ids=kwargs.pop("telegram_allowed_user_ids", []), group_ids=kwargs.pop("telegram_group_ids", []), ) # Extract OpenAI config openai_config = OpenAIConfig( api_key=kwargs.pop("openai_api_key", ""), base_url=kwargs.pop("openai_base_url", "https://api.openai.com/v1"), model=kwargs.pop("openai_model", "gpt-4o"), system_prompt=kwargs.pop( "openai_system_prompt", ( "You are Steward, a persistent, trustworthy AI-assisted personal operations platform. " "You reduce cognitive load by observing, remembering, planning, and proposing actions. " "You are conservative, transparent, and policy-aware. " "Always explain your reasoning." ), ), ) # Extract analysis config analysis_config = AnalysisConfig( target_url=kwargs.pop("analysis_target_url", ""), target_api_key=kwargs.pop("analysis_target_api_key", ""), cron_hour=kwargs.pop("analysis_cron_hour", 8), cron_minute=kwargs.pop("analysis_cron_minute", 0), ) # Extract memory config memory_config = MemoryConfig( thread_memory_path=kwargs.pop("thread_memory_path", "thread_memory.json"), ) # Extract tools config tools_config = ToolsConfig( mcp_server_url=kwargs.pop("mcp_server_url", ""), mcp_server_api_key=kwargs.pop("mcp_server_api_key", ""), ) # Any remaining kwargs should be rejected if kwargs: raise TypeError(f"Unexpected keyword arguments: {', '.join(kwargs.keys())}") # Create and return Settings instance return Settings( telegram=telegram_config, openai=openai_config, analysis=analysis_config, memory=memory_config, tools=tools_config, )