feat(polish): add configurable style packs

Add shared prompt composition, custom style management, iCloud sync, and native iOS/macOS selection interfaces so users can keep a consistent writing voice across devices.
This commit is contained in:
Rocky
2026-07-26 12:34:43 +08:00
parent e6f99d2744
commit 937ce33f05
29 changed files with 2388 additions and 87 deletions
@@ -15,6 +15,7 @@ public final class AppCloudSync {
private let makeStore: () -> AppGroupStore
private let settingsSync: SettingsCloudSync
private let dictionarySync: PersonalDictionaryCloudSync
private let polishStyleSync: PolishStyleCloudSync
private let usageStatisticsSync: UsageStatisticsCloudSync
private let speechHistorySync: SpeechHistoryCloudSync
private var externalChangeObserver: NSObjectProtocol?
@@ -25,6 +26,7 @@ public final class AppCloudSync {
historyDefaults: @escaping () -> UserDefaults = { .standard },
settingsSync: SettingsCloudSync? = nil,
dictionarySync: PersonalDictionaryCloudSync? = nil,
polishStyleSync: PolishStyleCloudSync? = nil,
usageStatisticsSync: UsageStatisticsCloudSync? = nil,
speechHistorySync: SpeechHistoryCloudSync? = nil
) {
@@ -33,6 +35,7 @@ public final class AppCloudSync {
self.settingsSync = settingsSync
?? SettingsCloudSync(kvs: kvs, makeStore: makeStore, historyDefaults: historyDefaults)
self.dictionarySync = dictionarySync ?? PersonalDictionaryCloudSync(kvs: kvs, makeStore: makeStore)
self.polishStyleSync = polishStyleSync ?? PolishStyleCloudSync(kvs: kvs, makeStore: makeStore)
self.usageStatisticsSync = usageStatisticsSync
?? UsageStatisticsCloudSync(kvs: kvs, makeStore: makeStore)
self.speechHistorySync = speechHistorySync
@@ -109,6 +112,7 @@ public final class AppCloudSync {
await usageStatisticsSync.pullAndMergeIfEnabled()
await speechHistorySync.pullAndMergeIfEnabled()
await dictionarySync.pullAndMergeIfEnabled()
await polishStyleSync.pullAndMergeIfEnabled()
}
/// Low-risk manual sync: pull remote changes, merge, then push local state.
@@ -128,6 +132,7 @@ public final class AppCloudSync {
await attempt { try await settingsSync.pushLocalIfEnabled() }
await attempt { try await usageStatisticsSync.pushLocalIfEnabled() }
await attempt { try await speechHistorySync.pushLocalIfEnabled() }
await attempt { try await polishStyleSync.pushLocalIfEnabled(store.polishStyleCatalog) }
}
if store.personalDictionaryICloudSyncEnabled {
await attempt { try await dictionarySync.pushLocalIfEnabled(store.personalDictionary) }
@@ -137,6 +142,7 @@ public final class AppCloudSync {
public var settingsSyncService: SettingsCloudSync { settingsSync }
public var dictionarySyncService: PersonalDictionaryCloudSync { dictionarySync }
public var polishStyleSyncService: PolishStyleCloudSync { polishStyleSync }
public var usageStatisticsSyncService: UsageStatisticsCloudSync { usageStatisticsSync }
public var speechHistorySyncService: SpeechHistoryCloudSync { speechHistorySync }
}