import 'dart:convert'; import 'dart:io'; export 'file_store_support.dart'; export 'secret_store.dart'; export 'settings_store.dart'; import 'file_store_support.dart'; import 'runtime_models.dart'; import 'secret_store.dart'; import 'settings_store.dart'; class SecureConfigStore { SecureConfigStore({ Future Function()? fallbackDirectoryPathResolver, Future Function()? databasePathResolver, Future Function()? defaultSupportDirectoryPathResolver, SecureConfigDatabaseOpener? databaseOpener, SecureStorageClient? secureStorage, bool enableSecureStorage = true, }) { final layoutResolver = StoreLayoutResolver( localRootPathResolver: databasePathResolver, secretRootPathResolver: fallbackDirectoryPathResolver, supportRootPathResolver: defaultSupportDirectoryPathResolver, ); _layoutResolver = layoutResolver; _secretStore = SecretStore( fallbackDirectoryPathResolver: fallbackDirectoryPathResolver, databasePathResolver: databasePathResolver, defaultSupportDirectoryPathResolver: defaultSupportDirectoryPathResolver, secureStorage: secureStorage, enableSecureStorage: enableSecureStorage, layoutResolver: layoutResolver, ); _settingsStore = SettingsStore( fallbackDirectoryPathResolver: fallbackDirectoryPathResolver, databasePathResolver: databasePathResolver, defaultSupportDirectoryPathResolver: defaultSupportDirectoryPathResolver, databaseOpener: databaseOpener, layoutResolver: layoutResolver, ); } late final SecretStore _secretStore; late final SettingsStore _settingsStore; late final StoreLayoutResolver _layoutResolver; Future initialize() async { await _secretStore.initialize(); await _settingsStore.initialize(); } Future loadSettingsSnapshot() { return _settingsStore.loadSettingsSnapshot(); } Future reloadSettingsSnapshot() { return _settingsStore.reloadSettingsSnapshot(); } Future reloadSettingsSnapshotResult() { return _settingsStore.reloadSettingsSnapshotResult(); } Future saveSettingsSnapshot(SettingsSnapshot snapshot) { return _settingsStore.saveSettingsSnapshot(snapshot); } Future> resolvedSettingsFiles() { return _settingsStore.resolvedSettingsFiles(); } Future> resolvedSettingsWatchDirectories() { return _settingsStore.resolvedSettingsWatchDirectories(); } Future> loadAssistantThreadRecords() { return _settingsStore.loadAssistantThreadRecords(); } Future saveAssistantThreadRecords(List records) { return _settingsStore.saveAssistantThreadRecords(records); } Future clearAssistantLocalState() { return _settingsStore.clearAssistantLocalState(); } Future> loadAuditTrail() { return _settingsStore.loadAuditTrail(); } Future appendAudit(SecretAuditEntry entry) { return _settingsStore.appendAudit(entry); } Future?> loadSupportJson(String relativePath) async { final file = await supportFile(relativePath); if (file == null || !await file.exists()) { return null; } final raw = await file.readAsString(); final decoded = jsonDecode(raw); return decoded is Map ? decoded : null; } Future saveSupportJson( String relativePath, Map payload, ) async { final file = await supportFile(relativePath); if (file == null) { return; } await atomicWriteString(file, jsonEncode(payload), ownerOnly: true); } Future supportFile(String relativePath) async { final normalized = relativePath.trim(); if (normalized.isEmpty) { return null; } final layout = await _layoutResolver.resolve(); return File('${layout.rootDirectory.path}/$normalized'); } Future> loadSecureRefs() { return _secretStore.loadSecureRefs(); } Future loadGatewayToken({int? profileIndex}) => _secretStore.loadGatewayToken(profileIndex: profileIndex); Future saveGatewayToken(String value, {int? profileIndex}) => _secretStore.saveGatewayToken(value, profileIndex: profileIndex); Future clearGatewayToken({int? profileIndex}) => _secretStore.clearGatewayToken(profileIndex: profileIndex); Future loadGatewayPassword({int? profileIndex}) => _secretStore.loadGatewayPassword(profileIndex: profileIndex); Future saveGatewayPassword(String value, {int? profileIndex}) => _secretStore.saveGatewayPassword(value, profileIndex: profileIndex); Future clearGatewayPassword({int? profileIndex}) => _secretStore.clearGatewayPassword(profileIndex: profileIndex); Future loadOllamaCloudApiKey() => _secretStore.loadOllamaCloudApiKey(); Future saveOllamaCloudApiKey(String value) => _secretStore.saveOllamaCloudApiKey(value); Future loadVaultToken() => _secretStore.loadVaultToken(); Future saveVaultToken(String value) => _secretStore.saveVaultToken(value); Future loadAiGatewayApiKey() => _secretStore.loadAiGatewayApiKey(); Future saveAiGatewayApiKey(String value) => _secretStore.saveAiGatewayApiKey(value); Future clearAiGatewayApiKey() => _secretStore.clearAiGatewayApiKey(); Future loadDeviceIdentity() { return _secretStore.loadDeviceIdentity(); } Future saveDeviceIdentity(LocalDeviceIdentity identity) { return _secretStore.saveDeviceIdentity(identity); } Future loadDeviceToken({ required String deviceId, required String role, }) { return _secretStore.loadDeviceToken(deviceId: deviceId, role: role); } Future saveDeviceToken({ required String deviceId, required String role, required String token, }) { return _secretStore.saveDeviceToken( deviceId: deviceId, role: role, token: token, ); } Future clearDeviceToken({ required String deviceId, required String role, }) { return _secretStore.clearDeviceToken(deviceId: deviceId, role: role); } PersistentWriteFailures get persistentWriteFailures => PersistentWriteFailures( settings: _settingsStore.settingsWriteFailure, tasks: _settingsStore.tasksWriteFailure, secrets: _secretStore.secretsWriteFailure, audit: _settingsStore.auditWriteFailure, ); void dispose() { _settingsStore.dispose(); _secretStore.dispose(); } static String maskValue(String value) { return SecretStore.maskValue(value); } }