feat(keyboard): ship AI mode surface with streaming search answers

Add the AI keyboard tab, Agent settings, and user-owned LLM key path for 1.7.0, including streaming answers and web-search transports without the built-in DeepSeek fallback.
This commit is contained in:
Rocky
2026-08-11 01:06:27 +08:00
parent f6212dcd2c
commit 3de665d254
81 changed files with 4467 additions and 398 deletions
@@ -77,12 +77,14 @@ public struct AppGroupStore: @unchecked Sendable {
public var cursorDragNavigationEnabled: Bool { configuration.cursorDragNavigationEnabled }
public var keyboardHapticIntensity: KeyboardHapticIntensity { configuration.keyboardHapticIntensity }
public var polishIntensity: PolishIntensity { configuration.polishIntensity }
public var aiResponseLength: AIResponseLength { configuration.aiResponseLength }
public var polishStyleCatalog: PolishStyleCatalog { configuration.polishStyleCatalog }
public var activePolishStyleId: String { configuration.activePolishStyleId }
public var activePolishStyle: PolishStylePack {
PolishStylePackCatalog.resolve(id: activePolishStyleId, userCatalog: polishStyleCatalog)
}
public var llmThinkingEnabled: Bool { configuration.llmThinkingEnabled }
public var isPolishKeyMissing: Bool { configuration.isPolishKeyMissing }
public var isTranslationEffective: Bool { configuration.isTranslationEffective }
public var isLocalEngine: Bool { configuration.isLocalEngine }
public var polishModeForPipeline: PolishingService.PolishMode { configuration.polishModeForPipeline }
@@ -143,6 +145,11 @@ public struct AppGroupStore: @unchecked Sendable {
AppGroupConfigDarwin.postConfigChanged()
}
public func setAIResponseLength(_ length: AIResponseLength) {
mutateConfiguration { $0.aiResponseLength = length }
AppGroupConfigDarwin.postConfigChanged()
}
// MARK: - Polish styles
public func setPolishStyleCatalog(_ catalog: PolishStyleCatalog) {