mirror of
https://github.com/openclaw/openclaw.git
synced 2026-07-09 21:33:54 +00:00
* fix(ios): defer QR pairing after scanner dismissal * fix(ios): process QR pairing after scanner dismissal * fix(ios): harden QR scanner handoff * fix(ios): give QR scanner dismissal more time * fix(ios): keep onboarding open for QR trust prompt * fix(ios): keep QR trust prompt owned by onboarding * fix(ios): recover operator pairing after QR bootstrap * fix(ios): cancel stale QR scanner handoffs Co-authored-by: PollyBot13 <pollybot13@gmail.com> * fix(ios): defer QR setup until onboarding closes * fix(ios): keep QR setup links with visible settings * fix(ios): consume setup links during onboarding * fix(ios): handle setup links during onboarding launch * fix(ios): route setup links through active onboarding * fix(ios): harden QR gateway handoff * fix(ios): cancel superseded gateway attempts * fix(ios): serialize scanner result delivery * fix(ios): prevent stale gateway reconnects * fix(ios): serialize gateway target handoff * fix(ios): disable stale gateway relaunch route * fix(ios): await staged bootstrap reset * test(ios): bound gateway reset handoff * fix(ios): preserve explicit gateway handoff * fix(ios): harden gateway lifecycle ownership * chore(ios): sync native i18n inventory * test(ios): align gateway ownership assertions * refactor(ios): remove superseded gateway helpers * fix(ios): keep gateway auth route scoped * fix(ios): restore gateway target review state * fix(protocol): refresh Swift plugin approval model * test(ios): isolate state directory overrides * fix(ios): preserve watch alerts across gateway switches * fix(ios): bind deferred work to gateway ownership * docs(changelog): credit iOS gateway handoff fix * chore(i18n): sync native app inventory * test(ios): remove unused Watch approval hooks --------- Co-authored-by: Peter Steinberger <steipete@gmail.com>
164 lines
6.0 KiB
Swift
164 lines
6.0 KiB
Swift
import CoreLocation
|
|
import Foundation
|
|
import OpenClawKit
|
|
import UIKit
|
|
|
|
typealias OpenClawCameraSnapResult = (format: String, base64: String, width: Int, height: Int)
|
|
typealias OpenClawCameraClipResult = (format: String, base64: String, durationMs: Int, hasAudio: Bool)
|
|
|
|
protocol CameraServicing: Sendable {
|
|
func listDevices() async -> [CameraController.CameraDeviceInfo]
|
|
func snap(params: OpenClawCameraSnapParams) async throws -> OpenClawCameraSnapResult
|
|
func clip(params: OpenClawCameraClipParams) async throws -> OpenClawCameraClipResult
|
|
}
|
|
|
|
protocol ScreenRecordingServicing: Sendable {
|
|
func record(
|
|
screenIndex: Int?,
|
|
durationMs: Int?,
|
|
fps: Double?,
|
|
includeAudio: Bool?,
|
|
outPath: String?) async throws -> String
|
|
}
|
|
|
|
@MainActor
|
|
protocol LocationServicing: Sendable {
|
|
func authorizationStatus() -> CLAuthorizationStatus
|
|
func accuracyAuthorization() -> CLAccuracyAuthorization
|
|
func ensureAuthorization(mode: OpenClawLocationMode) async -> CLAuthorizationStatus
|
|
func currentLocation(
|
|
params: OpenClawLocationGetParams,
|
|
desiredAccuracy: OpenClawLocationAccuracy,
|
|
maxAgeMs: Int?,
|
|
timeoutMs: Int?) async throws -> CLLocation
|
|
func setBackgroundLocationUpdatesEnabled(_ enabled: Bool)
|
|
func setAuthorizationChangeHandler(
|
|
_ handler: @escaping @MainActor @Sendable (CLAuthorizationStatus) -> Void)
|
|
func startMonitoringSignificantLocationChanges(onUpdate: @escaping @Sendable (CLLocation) -> Void)
|
|
func stopMonitoringSignificantLocationChanges()
|
|
}
|
|
|
|
@MainActor
|
|
protocol DeviceStatusServicing: Sendable {
|
|
func status() async throws -> OpenClawDeviceStatusPayload
|
|
func info() -> OpenClawDeviceInfoPayload
|
|
}
|
|
|
|
protocol PhotosServicing: Sendable {
|
|
func latest(params: OpenClawPhotosLatestParams) async throws -> OpenClawPhotosLatestPayload
|
|
}
|
|
|
|
protocol ContactsServicing: Sendable {
|
|
func search(params: OpenClawContactsSearchParams) async throws -> OpenClawContactsSearchPayload
|
|
func add(params: OpenClawContactsAddParams) async throws -> OpenClawContactsAddPayload
|
|
}
|
|
|
|
protocol CalendarServicing: Sendable {
|
|
func events(params: OpenClawCalendarEventsParams) async throws -> OpenClawCalendarEventsPayload
|
|
func add(params: OpenClawCalendarAddParams) async throws -> OpenClawCalendarAddPayload
|
|
}
|
|
|
|
protocol RemindersServicing: Sendable {
|
|
func list(params: OpenClawRemindersListParams) async throws -> OpenClawRemindersListPayload
|
|
func add(params: OpenClawRemindersAddParams) async throws -> OpenClawRemindersAddPayload
|
|
}
|
|
|
|
protocol MotionServicing: Sendable {
|
|
func activities(params: OpenClawMotionActivityParams) async throws -> OpenClawMotionActivityPayload
|
|
func pedometer(params: OpenClawPedometerParams) async throws -> OpenClawPedometerPayload
|
|
}
|
|
|
|
struct WatchMessagingStatus: Equatable {
|
|
var supported: Bool
|
|
var paired: Bool
|
|
var appInstalled: Bool
|
|
var reachable: Bool
|
|
var activationState: String
|
|
}
|
|
|
|
struct WatchQuickReplyEvent: Codable, Equatable {
|
|
var replyId: String
|
|
var promptId: String
|
|
var actionId: String
|
|
var actionLabel: String?
|
|
var sessionKey: String?
|
|
var gatewayStableID: String?
|
|
var note: String?
|
|
var sentAtMs: Int?
|
|
var transport: String
|
|
}
|
|
|
|
enum WatchMessageKind: String, Codable, Equatable {
|
|
case chat
|
|
case quickReply
|
|
}
|
|
|
|
struct WatchExecApprovalResolveEvent: Codable, Equatable {
|
|
var replyId: String
|
|
var approvalId: String
|
|
var gatewayStableID: String?
|
|
var decision: OpenClawWatchExecApprovalDecision
|
|
var sentAtMs: Int?
|
|
var transport: String
|
|
}
|
|
|
|
struct WatchExecApprovalSnapshotRequestEvent: Equatable {
|
|
var requestId: String
|
|
var sentAtMs: Int?
|
|
var transport: String
|
|
}
|
|
|
|
struct WatchAppSnapshotRequestEvent: Equatable {
|
|
var requestId: String
|
|
var sentAtMs: Int?
|
|
var transport: String
|
|
}
|
|
|
|
struct WatchAppCommandEvent: Codable, Equatable {
|
|
var commandId: String
|
|
var command: OpenClawWatchAppCommand
|
|
var sessionKey: String?
|
|
var gatewayStableID: String?
|
|
var text: String?
|
|
var sentAtMs: Int?
|
|
var transport: String
|
|
var messageKind: WatchMessageKind? = nil
|
|
}
|
|
|
|
struct WatchNotificationSendResult: Equatable {
|
|
var deliveredImmediately: Bool
|
|
var queuedForDelivery: Bool
|
|
var transport: String
|
|
}
|
|
|
|
protocol WatchMessagingServicing: AnyObject, Sendable {
|
|
func status() async -> WatchMessagingStatus
|
|
func setStatusHandler(_ handler: (@Sendable (WatchMessagingStatus) -> Void)?)
|
|
func setReplyHandler(_ handler: (@Sendable (WatchQuickReplyEvent) -> Void)?)
|
|
func setExecApprovalResolveHandler(_ handler: (@Sendable (WatchExecApprovalResolveEvent) -> Void)?)
|
|
func setExecApprovalSnapshotRequestHandler(
|
|
_ handler: (@Sendable (WatchExecApprovalSnapshotRequestEvent) -> Void)?)
|
|
func setAppSnapshotRequestHandler(_ handler: (@Sendable (WatchAppSnapshotRequestEvent) -> Void)?)
|
|
func setAppCommandHandler(_ handler: (@Sendable (WatchAppCommandEvent) -> Void)?)
|
|
func sendNotification(
|
|
id: String,
|
|
params: OpenClawWatchNotifyParams,
|
|
gatewayStableID: String?) async throws -> WatchNotificationSendResult
|
|
func sendExecApprovalPrompt(
|
|
_ message: OpenClawWatchExecApprovalPromptMessage) async throws -> WatchNotificationSendResult
|
|
func sendExecApprovalResolved(
|
|
_ message: OpenClawWatchExecApprovalResolvedMessage) async throws -> WatchNotificationSendResult
|
|
func sendExecApprovalExpired(
|
|
_ message: OpenClawWatchExecApprovalExpiredMessage) async throws -> WatchNotificationSendResult
|
|
func syncExecApprovalSnapshot(
|
|
_ message: OpenClawWatchExecApprovalSnapshotMessage) async throws -> WatchNotificationSendResult
|
|
func syncAppSnapshot(
|
|
_ message: OpenClawWatchAppSnapshotMessage) async throws -> WatchNotificationSendResult
|
|
func sendChatCompletion(
|
|
_ message: OpenClawWatchChatCompletionMessage) async throws -> WatchNotificationSendResult
|
|
}
|
|
|
|
extension CameraController: CameraServicing {}
|
|
extension ScreenRecordService: ScreenRecordingServicing {}
|
|
extension LocationService: LocationServicing {}
|