|
from __future__ import annotations
|
|
|
|
import json
|
|
from dataclasses import dataclass
|
|
|
|
from openhands.core.config.app_config import AppConfig
|
|
from openhands.server.settings import Settings
|
|
from openhands.storage import get_file_store
|
|
from openhands.storage.files import FileStore
|
|
from openhands.storage.settings.settings_store import SettingsStore
|
|
from openhands.utils.async_utils import call_sync_from_async
|
|
|
|
|
|
@dataclass
|
|
class FileSettingsStore(SettingsStore):
|
|
file_store: FileStore
|
|
path: str = 'settings.json'
|
|
|
|
async def load(self) -> Settings | None:
|
|
try:
|
|
json_str = await call_sync_from_async(self.file_store.read, self.path)
|
|
kwargs = json.loads(json_str)
|
|
settings = Settings(**kwargs)
|
|
return settings
|
|
except FileNotFoundError:
|
|
return Settings.from_config()
|
|
|
|
async def store(self, settings: Settings):
|
|
json_str = settings.model_dump_json(context={'expose_secrets': True})
|
|
await call_sync_from_async(self.file_store.write, self.path, json_str)
|
|
|
|
@classmethod
|
|
async def get_instance(
|
|
cls, config: AppConfig, user_id: str | None
|
|
) -> FileSettingsStore:
|
|
file_store = get_file_store(config.file_store, config.file_store_path)
|
|
return FileSettingsStore(file_store)
|
|
|