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
@@ -94,6 +94,7 @@ public enum FlowSessionKeys {
/// per-request timeout clamps to this value, so it participates in the
/// keyboard-watchdog budget below.
public static let maxPolishTimeout: TimeInterval = 35
public static let aiQuestionRequestTimeout: TimeInterval = 60
/// Extra slack for result serialization, cross-process propagation, and
/// the host's own polling cadence.
@@ -115,6 +116,14 @@ public enum FlowSessionKeys {
return asrWait + batchASRFallbackTimeout + maxPolishTimeout + resultDeliveryMargin
}
public static func keyboardAIResultTimeout(engineMode: String) -> TimeInterval {
let asrWait = engineMode == "local" ? localASRWaitTimeout : cloudASRWaitTimeout
return asrWait
+ batchASRFallbackTimeout
+ aiQuestionRequestTimeout
+ resultDeliveryMargin
}
public enum RecordingState: String, Sendable, Equatable {
case idle
case recording