import Foundation import Observation import SwiftData /// Composition root for the iOS app. Owns the SwiftData cache container and the /// iCloud sync engine, and drives the one-shot launch sequence. Injected into the /// view tree via `.environment(...)`. @Observable @MainActor final class AppServices { let container: ModelContainer let syncEngine: SyncEngine let watchBridge: PhoneConnectivityBridge private var bootstrapTask: Task? init() { let container = WorkoutsModelContainer.make() self.container = container self.syncEngine = SyncEngine(container: container) self.watchBridge = PhoneConnectivityBridge(container: container, syncEngine: syncEngine) } /// Launch step: resolve iCloud and reconcile the cache. Idempotent — repeated /// callers await the same one-shot task. func bootstrap() async { if let bootstrapTask { await bootstrapTask.value; return } let task = Task { @MainActor [weak self] in guard let self else { return } await self.syncEngine.connect() self.watchBridge.activate() } bootstrapTask = task await task.value } }