Cursor: Apply local changes for cloud agent

This commit is contained in:
Rocky
2026-08-27 18:01:46 +08:00
parent 39002336c0
commit 42e6252f01
148 changed files with 120105 additions and 8122 deletions
@@ -68,6 +68,7 @@ final class SettingsCloudSyncTests: XCTestCase {
keyboardHapticIntensity: SyncedField(value: .light, updatedAt: stampA, deviceID: deviceA),
polishIntensity: SyncedField(value: .light, updatedAt: stampA, deviceID: deviceA),
aiResponseLength: SyncedField(value: .medium, updatedAt: stampA, deviceID: deviceA),
multipleReplyVariantsEnabled: SyncedField(value: true, updatedAt: stampA, deviceID: deviceA),
activePolishStyleId: SyncedField(value: "builtin.light", updatedAt: stampA, deviceID: deviceA),
llmThinkingEnabled: SyncedField(value: false, updatedAt: stampA, deviceID: deviceA),
flowSkipAppSwitch: SyncedField(value: true, updatedAt: stampA, deviceID: deviceA),
@@ -91,6 +92,7 @@ final class SettingsCloudSyncTests: XCTestCase {
keyboardHapticIntensity: SyncedField(value: .strong, updatedAt: stampB, deviceID: deviceB),
polishIntensity: SyncedField(value: .heavy, updatedAt: stampB, deviceID: deviceB),
aiResponseLength: SyncedField(value: .detailed, updatedAt: stampB, deviceID: deviceB),
multipleReplyVariantsEnabled: SyncedField(value: false, updatedAt: stampB, deviceID: deviceB),
activePolishStyleId: SyncedField(value: "builtin.formal", updatedAt: stampB, deviceID: deviceB),
llmThinkingEnabled: SyncedField(value: true, updatedAt: stampB, deviceID: deviceB),
flowSkipAppSwitch: SyncedField(value: false, updatedAt: stampB, deviceID: deviceB),
@@ -105,6 +107,7 @@ final class SettingsCloudSyncTests: XCTestCase {
XCTAssertEqual(merged.engineMode.value, "local")
XCTAssertEqual(merged.polishIntensity.value, .heavy)
XCTAssertEqual(merged.aiResponseLength.value, .detailed)
XCTAssertFalse(merged.multipleReplyVariantsEnabled.value)
}
func testLegacyKeepAliveFieldDecodesButIsNotReencoded() throws {
@@ -207,6 +210,15 @@ final class SettingsCloudSyncTests: XCTestCase {
XCTAssertTrue(extensionSideReader.clipboardCandidateBarEnabled)
}
func testMultipleReplyVariantsDefaultsOnAndSharesThroughAppGroup() {
XCTAssertTrue(store.multipleReplyVariantsEnabled)
store.setMultipleReplyVariantsEnabled(false)
let extensionSideReader = AppGroupStore(defaults: defaults)
XCTAssertFalse(extensionSideReader.multipleReplyVariantsEnabled)
}
func testLegacyV1PullDoesNotClearKeychain() async throws {
try Keychain.setAPIKey("sk-local-openai", for: "openai", useICloudSync: false)
store.setSettingsICloudSyncEnabled(true)
@@ -335,4 +347,22 @@ final class SettingsCloudSyncTests: XCTestCase {
let config = AppGroupConfiguration.load(fromAvailable: defaults)
XCTAssertTrue(config.settingsICloudSyncEnabled)
}
func testOlderV2PayloadDefaultsMultipleReplyVariantsToOn() throws {
let payload = SyncedAppSettingsV2.seeded(
from: AppGroupConfiguration.load(fromAvailable: defaults),
deviceID: deviceA,
updatedAt: Date(timeIntervalSince1970: 100)
)
let encoder = JSONEncoder()
var object = try XCTUnwrap(
JSONSerialization.jsonObject(with: encoder.encode(payload)) as? [String: Any]
)
object.removeValue(forKey: "multipleReplyVariantsEnabled")
let data = try JSONSerialization.data(withJSONObject: object)
let decoded = try JSONDecoder().decode(SyncedAppSettingsV2.self, from: data)
XCTAssertTrue(decoded.multipleReplyVariantsEnabled.value)
}
}