Expand onboarding and adaptive keyboard intelligence

Add resilient usage analytics, OOBE gateway flows, clipboard semantic ranking, purchase recovery, style learning, and managed current-information search.
This commit is contained in:
Rocky
2026-08-22 16:33:18 +08:00
parent ac374631ae
commit e5a83843db
162 changed files with 23574 additions and 1013 deletions
@@ -51,10 +51,12 @@ public struct ManagedLLMClient: LLMClient {
public let capability: Capability
public let taskKind: ManagedGatewayTaskKind
public let requestPurpose: ManagedGatewayRequestPurpose?
public let oobeFeature: ManagedGatewayOOBEFeature?
public let requestTimeout: TimeInterval
private let baseURL: URL
private let grants: GatewayGrantCoordinator
private let oobeGrants: OOBEGatewayGrantCoordinator
private let session: URLSession
private let requestId: @Sendable () -> String
@@ -62,7 +64,9 @@ public struct ManagedLLMClient: LLMClient {
capability: Capability,
taskKind: ManagedGatewayTaskKind? = nil,
requestPurpose: ManagedGatewayRequestPurpose? = nil,
oobeFeature: ManagedGatewayOOBEFeature? = nil,
grants: GatewayGrantCoordinator,
oobeGrants: OOBEGatewayGrantCoordinator? = nil,
baseURL: URL = GatewayGrantCoordinator.defaultBaseURL,
session: URLSession = .shared,
requestTimeout: TimeInterval = 15,
@@ -71,7 +75,12 @@ public struct ManagedLLMClient: LLMClient {
self.capability = capability
self.taskKind = taskKind ?? capability.defaultTaskKind
self.requestPurpose = requestPurpose
self.oobeFeature = oobeFeature
self.grants = grants
self.oobeGrants = oobeGrants ?? OOBEGatewayGrantCoordinator(
baseURL: baseURL,
session: session
)
self.baseURL = baseURL
self.session = session
self.requestTimeout = requestTimeout
@@ -189,7 +198,7 @@ public struct ManagedLLMClient: LLMClient {
do {
return try await bufferedAttempt(attempt.forcingRefresh())
} catch ManagedGatewayError.invalidGrant {
try? await grants.clearGrant()
try? await clearSelectedGrant()
throw ManagedGatewayError.invalidGrant
}
}
@@ -280,10 +289,34 @@ public struct ManagedLLMClient: LLMClient {
)
}
let token = try await grants.accessToken(
for: capability.grantScope,
forceRefresh: attempt.forceRefresh
)
let token: String
switch requestPurpose {
case .oobe:
guard let oobeFeature else {
throw ManagedGatewayError.server(
code: "missing_oobe_feature",
status: 400,
requestId: attempt.requestId
)
}
token = try await oobeGrants.accessToken(
for: capability.grantScope,
feature: oobeFeature,
forceRefresh: attempt.forceRefresh
)
case nil:
guard oobeFeature == nil else {
throw ManagedGatewayError.server(
code: "unexpected_oobe_feature",
status: 400,
requestId: attempt.requestId
)
}
token = try await grants.accessToken(
for: capability.grantScope,
forceRefresh: attempt.forceRefresh
)
}
let body = ManagedGatewayTextRequest(
input: trimmedInput,
context: boundedContext,
@@ -291,7 +324,8 @@ public struct ManagedLLMClient: LLMClient {
temperature: min(max(attempt.options.temperature ?? 0.2, 0), 1),
stream: stream,
taskKind: taskKind,
requestPurpose: requestPurpose
requestPurpose: requestPurpose,
oobeFeature: oobeFeature
)
var request = URLRequest(
@@ -307,6 +341,14 @@ public struct ManagedLLMClient: LLMClient {
return request
}
private func clearSelectedGrant() async throws {
if requestPurpose == .oobe {
try await oobeGrants.clearGrant()
} else {
try await grants.clearGrant()
}
}
static func payload(
from messages: [LLMRequest.Message]
) -> (input: String, context: String?) {
@@ -413,6 +455,9 @@ public struct ManagedLLMClient: LLMClient {
if ["insufficient_credits", "insufficient_balance"].contains(code) {
return .insufficientCredits
}
if code == "oobe_feature_already_used" {
return .oobeFeatureAlreadyUsed
}
if ["unauthorized", "gateway_grant_denied", "invalid_grant"].contains(code) {
return .invalidGrant
}
@@ -424,6 +469,7 @@ public enum ManagedGatewayLLMClientFactory {
public static func polish(
taskKind: ManagedGatewayTaskKind = .dictationPolish,
requestPurpose: ManagedGatewayRequestPurpose? = nil,
oobeFeature: ManagedGatewayOOBEFeature? = nil,
grants: GatewayGrantCoordinator,
baseURL: URL = GatewayGrantCoordinator.defaultBaseURL,
session: URLSession = .shared
@@ -432,6 +478,7 @@ public enum ManagedGatewayLLMClientFactory {
capability: .polish,
taskKind: taskKind,
requestPurpose: requestPurpose,
oobeFeature: oobeFeature,
grants: grants,
baseURL: baseURL,
session: session
@@ -440,6 +487,8 @@ public enum ManagedGatewayLLMClientFactory {
public static func ai(
taskKind: ManagedGatewayTaskKind = .aiQuestion,
requestPurpose: ManagedGatewayRequestPurpose? = nil,
oobeFeature: ManagedGatewayOOBEFeature? = nil,
grants: GatewayGrantCoordinator,
baseURL: URL = GatewayGrantCoordinator.defaultBaseURL,
session: URLSession = .shared
@@ -447,6 +496,8 @@ public enum ManagedGatewayLLMClientFactory {
ManagedLLMClient(
capability: .assistant,
taskKind: taskKind,
requestPurpose: requestPurpose,
oobeFeature: oobeFeature,
grants: grants,
baseURL: baseURL,
session: session