diff --git a/src/cerbero_mcp/settings.py b/src/cerbero_mcp/settings.py index 3274bf3..d3ea7e7 100644 --- a/src/cerbero_mcp/settings.py +++ b/src/cerbero_mcp/settings.py @@ -1,10 +1,22 @@ """Pydantic Settings: legge .env e variabili d'ambiente.""" from __future__ import annotations +from typing import TypedDict + from pydantic import Field, SecretStr from pydantic_settings import BaseSettings, SettingsConfigDict +class IBKRCredentials(TypedDict): + consumer_key: str + access_token: str + access_token_secret: str + signature_key_path: str + encryption_key_path: str + account_id: str + dh_prime: str + + class _Sub(BaseSettings): """Base per sub-settings, condivide model_config con env_file.""" model_config = SettingsConfigDict( @@ -111,6 +123,7 @@ class IBKRSettings(_Sub): access_token_secret_testnet: SecretStr | None = None signature_key_path_testnet: str | None = None encryption_key_path_testnet: str | None = None + # account_id has no base variant: paper and live accounts are always distinct account_id_testnet: str | None = None consumer_key_live: str | None = None @@ -128,7 +141,12 @@ class IBKRSettings(_Sub): ws_max_subscriptions: int = 80 ws_idle_timeout_s: int = 300 - def credentials(self, env: str) -> dict: + def credentials(self, env: str) -> IBKRCredentials: + """Return credential dict for given env. + Prefers env-specific (_TESTNET / _LIVE) values; falls back to base + (IBKR_CONSUMER_KEY etc.) for legacy single-pair setups. + ValueError if any required field missing. + """ if env == "testnet": ck = self.consumer_key_testnet or self.consumer_key at = self.access_token_testnet or self.access_token