commit bf6eff1ebb4c854983a651b333d00d622714199b
parent 8898507a58491950da93ec73ebd78888717618a6
Author: triesap <tyson@radroots.org>
Date: Sun, 20 Sep 2026 07:54:43 +0000
files: add bounded coordinated maintenance reservations
- Separate shared file use from explicit exclusive maintenance
- Bind bounded scan entries to unchanged inode and metadata identity
- Retain uncertain objects and invalidate failed directory scans
- Verify ownership and interruption across macOS and hosted iOS
Diffstat:
5 files changed, 693 insertions(+), 0 deletions(-)
diff --git a/Sources/RadrootsKit/RadrootsAppleFileMaintenance.swift b/Sources/RadrootsKit/RadrootsAppleFileMaintenance.swift
@@ -0,0 +1,123 @@
+import Darwin
+import Foundation
+
+/// Coordinates cooperating users of one governed root. Every operation that can
+/// create a reference, read, replace or write a collected file must hold a use
+/// reservation until its underlying work has drained, including after cancellation.
+/// This mechanism does not establish application reference absence or retention policy.
+public struct RadrootsAppleFileMaintenance: Sendable {
+ private let root: URL
+
+ public init(root: URL) {
+ self.root = root
+ }
+
+ /// Contention returns nil. No waiting, background work or automatic retry.
+ public func reserveUse() throws -> RadrootsFileUseReservation? {
+ try RadrootsFileMaintenanceGate.open(root: root, exclusive: false).map(RadrootsFileUseReservation.init)
+ }
+
+ /// Acquire before inspecting references; retain through the last conditional unlink.
+ public func reserveMaintenance() throws -> RadrootsFileMaintenanceReservation? {
+ try RadrootsFileMaintenanceGate.open(root: root, exclusive: true).map(RadrootsFileMaintenanceReservation.init)
+ }
+}
+
+/// Release by dropping the last owner only after every underlying user has drained.
+public final class RadrootsFileUseReservation: Sendable {
+ private let gate: RadrootsFileMaintenanceGate
+ fileprivate init(_ gate: RadrootsFileMaintenanceGate) {
+ self.gate = gate
+ }
+
+ public func validate() throws {
+ try gate.validate()
+ }
+}
+
+/// Child scans retain this exclusive reservation. There is no early unlock API.
+public final class RadrootsFileMaintenanceReservation: Sendable {
+ let gate: RadrootsFileMaintenanceGate
+ fileprivate init(_ gate: RadrootsFileMaintenanceGate) {
+ self.gate = gate
+ }
+
+ /// Empty path selects the governed root. Other paths must be canonical relative
+ /// directories without symlinks. Streams are live and never persisted as cookies.
+ public func openDirectory(relativePath: String = "") throws -> RadrootsFileMaintenanceScan {
+ try RadrootsFileMaintenanceScan(reservation: self, relativePath: relativePath)
+ }
+
+ public func validate() throws {
+ try gate.validate()
+ }
+}
+
+/// Immutable descriptor ownership; descriptors close only at final deinitialization.
+/// Methods neither mutate descriptor state nor release the advisory reservation.
+final class RadrootsFileMaintenanceGate: @unchecked Sendable {
+ static let name = ".radroots_file_maintenance.lock"
+ let directory: RadrootsAtomicFile.Directory
+ private let descriptor: Int32
+
+ private init(directory: RadrootsAtomicFile.Directory, descriptor: Int32) {
+ self.directory = directory
+ self.descriptor = descriptor
+ }
+
+ deinit {
+ Darwin.close(descriptor)
+ Darwin.close(directory.descriptor)
+ }
+
+ static func open(root: URL, exclusive: Bool) throws -> RadrootsFileMaintenanceGate? {
+ guard root.isFileURL, root.path.hasPrefix("/"), !root.path.utf8.contains(0) else {
+ throw RadrootsAppleFileError.invalidRequest
+ }
+ let parts = root.path.split(separator: "/").map(String.init)
+ guard !parts.isEmpty, parts.allSatisfy({ $0 != "." && $0 != ".." }) else {
+ throw RadrootsAppleFileError.invalidRequest
+ }
+ let directory = try RadrootsAtomicFile.Directory.open(parts, create: true)
+ var owned = false
+ defer {
+ if !owned {
+ Darwin.close(directory.descriptor)
+ }
+ }
+ for attempt in 0 ..< 4 {
+ try directory.validate()
+ let descriptor = Darwin.openat(directory.descriptor, name,
+ O_RDWR | O_CREAT | O_NOFOLLOW | O_CLOEXEC | O_NONBLOCK | (exclusive ? O_EXLOCK : O_SHLOCK), 0o600)
+ if descriptor >= 0 {
+ let gate = RadrootsFileMaintenanceGate(directory: directory, descriptor: descriptor)
+ owned = true
+ try gate.validate()
+ return gate
+ }
+ let error = errno
+ if error == EWOULDBLOCK {
+ return nil
+ }
+ guard error == ENOENT else { throw RadrootsAppleFileError.permanentFailure }
+ if attempt == 3 {
+ throw RadrootsAppleFileError.transientFailure
+ }
+ }
+ throw RadrootsAppleFileError.transientFailure
+ }
+
+ func validate() throws {
+ try directory.validate()
+ var held = stat()
+ var current = stat()
+ guard Darwin.fstat(descriptor, &held) == 0,
+ Darwin.fstatat(directory.descriptor, Self.name, ¤t, AT_SYMLINK_NOFOLLOW) == 0,
+ held.st_mode & S_IFMT == S_IFREG, current.st_mode & S_IFMT == S_IFREG,
+ held.st_nlink == 1, held.st_size == 0, held.st_uid == geteuid(),
+ held.st_dev == current.st_dev, held.st_ino == current.st_ino
+ else {
+ throw RadrootsAppleFileError.permanentFailure
+ }
+ }
+}
diff --git a/Sources/RadrootsKit/RadrootsFileMaintenanceEntry.swift b/Sources/RadrootsKit/RadrootsFileMaintenanceEntry.swift
@@ -0,0 +1,63 @@
+import Darwin
+import Foundation
+
+/// Opaque captured identity. A candidate is valid only for its originating scan;
+/// neither its name nor its age is independent authority to remove a file.
+public struct RadrootsFileMaintenanceEntry: Sendable {
+ public enum Kind: Sendable { case regularFile, directory, other }
+
+ public let name: String
+ public let kind: Kind
+ public let sizeBytes: Int64
+ public let modifiedAt: Date
+ let scanID: UUID
+ let identity: RadrootsFileMaintenanceIdentity
+
+ init(name: String, value: stat, scanID: UUID) {
+ self.name = name
+ kind = switch value.st_mode & S_IFMT {
+ case S_IFREG: .regularFile
+ case S_IFDIR: .directory
+ default: .other
+ }
+ sizeBytes = value.st_size
+ modifiedAt = Date(timeIntervalSince1970:
+ Double(value.st_mtimespec.tv_sec) + Double(value.st_mtimespec.tv_nsec) / 1_000_000_000)
+ self.scanID = scanID
+ identity = RadrootsFileMaintenanceIdentity(value)
+ }
+}
+
+public struct RadrootsFileMaintenancePage: Sendable {
+ public let entries: [RadrootsFileMaintenanceEntry]
+ /// Includes ignored dot entries, disappeared entries and the coordination file.
+ public let scannedEntries: Int
+ /// End of this live stream, not a snapshot or a global absence assertion.
+ public let reachedEnd: Bool
+}
+
+struct RadrootsFileMaintenanceIdentity: Sendable, Equatable {
+ let device: dev_t
+ let inode: ino_t
+ let mode: mode_t
+ let links: nlink_t
+ let owner: uid_t
+ let size: off_t
+ let modifiedSeconds: Int
+ let modifiedNanos: Int
+ let changedSeconds: Int
+ let changedNanos: Int
+
+ init(_ value: stat) {
+ device = value.st_dev
+ inode = value.st_ino
+ mode = value.st_mode
+ links = value.st_nlink
+ owner = value.st_uid
+ size = value.st_size
+ modifiedSeconds = value.st_mtimespec.tv_sec
+ modifiedNanos = value.st_mtimespec.tv_nsec
+ changedSeconds = value.st_ctimespec.tv_sec
+ changedNanos = value.st_ctimespec.tv_nsec
+ }
+}
diff --git a/Sources/RadrootsKit/RadrootsFileMaintenanceScan.swift b/Sources/RadrootsKit/RadrootsFileMaintenanceScan.swift
@@ -0,0 +1,135 @@
+import Darwin
+import Foundation
+
+/// The mutex serializes the retained directory stream and synchronous unlink.
+/// No callbacks or async work run under it. Final deinitialization closes both
+/// scan descriptors, then releases its retained exclusive maintenance reservation.
+public final class RadrootsFileMaintenanceScan: @unchecked Sendable {
+ private let reservation: RadrootsFileMaintenanceReservation
+ private let directory: RadrootsAtomicFile.Directory
+ private let stream: UnsafeMutablePointer<DIR>
+ private let lock = NSLock()
+ private let scanID = UUID()
+ private var invalidated = false
+
+ init(reservation: RadrootsFileMaintenanceReservation, relativePath: String) throws {
+ let parts = relativePath.isEmpty ? [] : relativePath.split(separator: "/", omittingEmptySubsequences: false).map(String.init)
+ guard parts.allSatisfy({ !$0.isEmpty && $0 != "." && $0 != ".." && !$0.utf8.contains(0) }) else {
+ throw RadrootsAppleFileError.invalidRequest
+ }
+ try reservation.validate()
+ let directory = try RadrootsAtomicFile.Directory.open(reservation.gate.directory.parts + parts, create: false)
+ var owned = false
+ defer {
+ if !owned {
+ Darwin.close(directory.descriptor)
+ }
+ }
+ let copy = Darwin.fcntl(directory.descriptor, F_DUPFD_CLOEXEC, 0)
+ guard copy >= 0 else { throw RadrootsAppleFileError.permanentFailure }
+ guard let stream = Darwin.fdopendir(copy) else {
+ Darwin.close(copy)
+ throw RadrootsAppleFileError.permanentFailure
+ }
+ do {
+ try reservation.validate()
+ try directory.validate()
+ } catch {
+ Darwin.closedir(stream)
+ throw error
+ }
+ self.reservation = reservation
+ self.directory = directory
+ self.stream = stream
+ owned = true
+ }
+
+ deinit {
+ Darwin.closedir(stream)
+ Darwin.close(directory.descriptor)
+ }
+
+ /// At most 64 directory entries per call, including entries not returned.
+ /// The caller owns total work budgets and must not infer absence from a prefix.
+ /// An I/O or identity error invalidates this scan; begin a fresh inventory.
+ public func next(limit: Int = 64) throws -> RadrootsFileMaintenancePage {
+ guard (1 ... 64).contains(limit) else { throw RadrootsAppleFileError.invalidRequest }
+ return try perform {
+ try validate()
+ var entries: [RadrootsFileMaintenanceEntry] = []
+ var scanned = 0
+ var reachedEnd = false
+ for _ in 0 ..< limit {
+ errno = 0
+ guard let entry = Darwin.readdir(stream) else {
+ guard errno == 0 else { throw RadrootsAppleFileError.permanentFailure }
+ reachedEnd = true
+ break
+ }
+ scanned += 1
+ let count = Int(entry.pointee.d_namlen)
+ let name = withUnsafeBytes(of: entry.pointee.d_name) { bytes -> String? in
+ guard count <= bytes.count else { return nil }
+ return String(bytes: bytes.prefix(count), encoding: .utf8)
+ }
+ // Unrepresentable names are an incomplete inventory, not absence.
+ guard let name else { throw RadrootsAppleFileError.permanentFailure }
+ if name == "." || name == ".." || name == RadrootsFileMaintenanceGate.name {
+ continue
+ }
+ var value = stat()
+ let found = name.withCString { Darwin.fstatat(directory.descriptor, $0, &value, AT_SYMLINK_NOFOLLOW) }
+ if found != 0, errno == ENOENT {
+ continue
+ }
+ guard found == 0 else { throw RadrootsAppleFileError.permanentFailure }
+ entries.append(RadrootsFileMaintenanceEntry(name: name, value: value, scanID: scanID))
+ }
+ try validate()
+ return RadrootsFileMaintenancePage(entries: entries, scannedEntries: scanned, reachedEnd: reachedEnd)
+ }
+ }
+
+ /// Only an unchanged, singly linked regular file from this scan is eligible.
+ /// The host must prove reference absence and grace under this reservation.
+ /// False means retained/absent. Errors after unlink are ambiguous: inspect
+ /// again; never assume an error means the file remains or reuse an old proof.
+ public func remove(_ entry: RadrootsFileMaintenanceEntry) throws -> Bool {
+ guard entry.scanID == scanID else { throw RadrootsAppleFileError.invalidRequest }
+ return try perform {
+ try validate()
+ guard entry.kind == .regularFile, entry.identity.links == 1,
+ entry.name != RadrootsFileMaintenanceGate.name else { return false }
+ var current = stat()
+ let found = entry.name.withCString { Darwin.fstatat(directory.descriptor, $0, ¤t, AT_SYMLINK_NOFOLLOW) }
+ if found != 0, errno == ENOENT {
+ return false
+ }
+ guard found == 0 else { throw RadrootsAppleFileError.permanentFailure }
+ guard RadrootsFileMaintenanceIdentity(current) == entry.identity else { return false }
+ guard entry.name.withCString({ Darwin.unlinkat(directory.descriptor, $0, 0) }) == 0 else {
+ throw RadrootsAppleFileError.permanentFailure
+ }
+ guard Darwin.fsync(directory.descriptor) == 0 else { throw RadrootsAppleFileError.permanentFailure }
+ try validate()
+ return true
+ }
+ }
+
+ private func validate() throws {
+ try reservation.validate()
+ try directory.validate()
+ }
+
+ private func perform<T>(_ operation: () throws -> T) throws -> T {
+ try lock.withLock {
+ guard !invalidated else { throw RadrootsAppleFileError.permanentFailure }
+ do {
+ return try operation()
+ } catch {
+ invalidated = true
+ throw error
+ }
+ }
+ }
+}
diff --git a/Tests/RadrootsKitTests/RadrootsFileMaintenanceTests.swift b/Tests/RadrootsKitTests/RadrootsFileMaintenanceTests.swift
@@ -0,0 +1,312 @@
+import Darwin
+import Foundation
+@testable import RadrootsKit
+import Testing
+
+@Test func fileMaintenanceSharedUseExcludesMaintenanceUntilLastRelease() throws {
+ let f = try FileMaintenanceFixture()
+ defer { f.remove() }
+ var first = try #require(try f.coordinator.reserveUse())
+ var second = try f.coordinator.reserveUse()
+ #expect(second != nil)
+ try first.validate()
+ #expect(try f.coordinator.reserveMaintenance() == nil)
+ second = nil
+ #expect(second == nil)
+ #expect(try f.coordinator.reserveMaintenance() == nil)
+ // Retain first explicitly through the final contention observation.
+ withExtendedLifetime(first) {}
+ // A distinct root remains independent.
+ first = try #require(try RadrootsAppleFileMaintenance(root: f.base.appendingPathComponent("other")).reserveUse())
+ let maintenance = try #require(try f.coordinator.reserveMaintenance())
+ #expect(try f.coordinator.reserveUse() == nil)
+ #expect(try f.coordinator.reserveMaintenance() == nil)
+ try maintenance.validate()
+ withExtendedLifetime((first, maintenance)) {}
+}
+
+@Test func fileMaintenanceScanRetainsExclusiveOwnerAndRejectsCrossScanEntry() throws {
+ let f = try FileMaintenanceFixture()
+ defer { f.remove() }
+ try f.write("blob")
+ var reservation = try f.coordinator.reserveMaintenance()
+ var scan: RadrootsFileMaintenanceScan? = try #require(reservation).openDirectory()
+ reservation = nil
+ #expect(try f.coordinator.reserveUse() == nil)
+ let entry = try #require(scan).next().entries.first
+ let captured = try #require(entry)
+ scan = nil
+ let next = try #require(try f.coordinator.reserveMaintenance())
+ let newScan = try next.openDirectory()
+ #expect(throws: RadrootsAppleFileError.invalidRequest) { _ = try newScan.remove(captured) }
+ #expect(FileManager.default.fileExists(atPath: f.path("blob").path))
+}
+
+@Test func fileMaintenanceBoundedTraversalAndInterruptedCollectionResume() throws {
+ let f = try FileMaintenanceFixture()
+ defer { f.remove() }
+ for index in 0 ..< 150 {
+ try f.write("blob-\(index)")
+ }
+ do {
+ let reservation = try #require(try f.coordinator.reserveMaintenance())
+ let scan = try reservation.openDirectory()
+ #expect(throws: RadrootsAppleFileError.invalidRequest) { _ = try scan.next(limit: 0) }
+ #expect(throws: RadrootsAppleFileError.invalidRequest) { _ = try scan.next(limit: 65) }
+ let page = try scan.next(limit: 7)
+ #expect(page.scannedEntries == 7 && !page.reachedEnd)
+ #expect(page.entries.count <= 7)
+ for entry in page.entries {
+ #expect(try scan.remove(entry))
+ }
+ }
+ let reservation = try #require(try f.coordinator.reserveMaintenance())
+ let scan = try reservation.openDirectory()
+ var names: Set<String> = []
+ var ended = false
+ for _ in 0 ..< 30 {
+ let page = try scan.next(limit: 7)
+ #expect(page.scannedEntries <= 7 && page.entries.count <= 7)
+ for entry in page.entries {
+ #expect(names.insert(entry.name).inserted)
+ #expect(entry.kind == .regularFile && entry.sizeBytes == 3)
+ }
+ if page.reachedEnd {
+ ended = true; break
+ }
+ }
+ #expect(ended && names.count >= 143 && names.count < 150)
+ #expect(try scan.next().reachedEnd)
+ #expect(!names.contains(RadrootsFileMaintenanceGate.name))
+}
+
+@Test func fileMaintenanceRetainsReplacedChangedHardlinkedAndNonregularFiles() throws {
+ let f = try FileMaintenanceFixture()
+ defer { f.remove() }
+ for name in ["changed", "replaced", "hardlink", "removed", "eligible"] {
+ try f.write(name)
+ }
+ try FileManager.default.linkItem(at: f.path("hardlink"), to: f.path("alias"))
+ try FileManager.default.createDirectory(at: f.path("directory"), withIntermediateDirectories: false)
+ try FileManager.default.createSymbolicLink(at: f.path("symlink"), withDestinationURL: f.path("eligible"))
+ let reservation = try #require(try f.coordinator.reserveMaintenance())
+ let scan = try reservation.openDirectory()
+ let entries = try Dictionary(uniqueKeysWithValues: scan.next().entries.map { ($0.name, $0) })
+ try Data("different bytes".utf8).write(to: f.path("changed"))
+ try Data("new".utf8).write(to: f.path("replaced"), options: .atomic)
+ try FileManager.default.removeItem(at: f.path("removed"))
+ for name in ["changed", "replaced", "hardlink", "alias", "directory", "symlink", "removed"] {
+ #expect(try !scan.remove(#require(entries[name])))
+ }
+ #expect(try scan.remove(#require(entries["eligible"])))
+ #expect(try !scan.remove(#require(entries["eligible"])))
+ #expect(try Data(contentsOf: f.path("replaced")) == Data("new".utf8))
+ #expect(try Data(contentsOf: f.path("changed")) == Data("different bytes".utf8))
+}
+
+@Test func fileMaintenanceRejectsChangedParentsCoordinationAndUnsafePaths() throws {
+ let f = try FileMaintenanceFixture()
+ defer { f.remove() }
+ try f.write("blob")
+ let reservation = try #require(try f.coordinator.reserveMaintenance())
+ for path in ["..", "../root", "/root", "root//child", "root/", "\0"] {
+ #expect(throws: RadrootsAppleFileError.invalidRequest) { _ = try reservation.openDirectory(relativePath: path) }
+ }
+ try FileManager.default.createSymbolicLink(at: f.path("link"), withDestinationURL: f.base)
+ #expect(throws: RadrootsAppleFileError.permanentFailure) { _ = try reservation.openDirectory(relativePath: "link") }
+ let scan = try reservation.openDirectory()
+ let blob = try #require(try scan.next().entries.first { $0.name == "blob" })
+ try Data().write(to: f.path(RadrootsFileMaintenanceGate.name), options: .atomic)
+ #expect(throws: RadrootsAppleFileError.permanentFailure) { try reservation.validate() }
+ #expect(throws: RadrootsAppleFileError.permanentFailure) { _ = try scan.remove(blob) }
+ #expect(FileManager.default.fileExists(atPath: f.path("blob").path))
+ try FileManager.default.moveItem(at: f.root, to: f.base.appendingPathComponent("moved"))
+ try FileManager.default.createDirectory(at: f.root, withIntermediateDirectories: false)
+ #expect(throws: RadrootsAppleFileError.permanentFailure) { _ = try scan.next() }
+}
+
+@Test func fileMaintenanceSupportsBoundedSubdirectoryInspection() throws {
+ let f = try FileMaintenanceFixture()
+ defer { f.remove() }
+ try FileManager.default.createDirectory(at: f.path("staging"), withIntermediateDirectories: false)
+ try f.write("staging/blob")
+ let reservation = try #require(try f.coordinator.reserveMaintenance())
+ let scan = try reservation.openDirectory(relativePath: "staging")
+ let blob = try #require(try scan.next().entries.first)
+ #expect(blob.name == "blob")
+ #expect(try scan.remove(blob))
+ #expect(FileManager.default.fileExists(atPath: f.path(RadrootsFileMaintenanceGate.name).path))
+}
+
+@Test func fileMaintenanceCancellationDoesNotReleaseUndrainedUse() async throws {
+ let f = try FileMaintenanceFixture()
+ defer { f.remove() }
+ let latch = FileMaintenanceLatch()
+ let task = try holdMaintenanceUse(#require(try f.coordinator.reserveUse()), latch: latch)
+ task.cancel()
+ #expect(try f.coordinator.reserveMaintenance() == nil)
+ await latch.open()
+ try await task.value
+ #expect(try f.coordinator.reserveMaintenance() != nil)
+}
+
+private func holdMaintenanceUse(_ lease: RadrootsFileUseReservation, latch: FileMaintenanceLatch) throws -> Task<Void, Error> {
+ try lease.validate()
+ return Task {
+ defer { withExtendedLifetime(lease) {} }
+ await latch.wait()
+ try lease.validate()
+ }
+}
+
+@Test func fileMaintenanceConcurrentReadersAndCollectorsNeverOverlap() async throws {
+ let f = try FileMaintenanceFixture()
+ defer { f.remove() }
+ let probe = FileMaintenanceProbe()
+ try await withThrowingTaskGroup(of: Void.self) { group in
+ for owner in 0 ..< 8 {
+ group.addTask {
+ for _ in 0 ..< 30 {
+ if owner < 6 {
+ if let lease = try f.coordinator.reserveUse() {
+ await probe.enter(exclusive: false)
+ await Task.yield()
+ await probe.leave(exclusive: false)
+ withExtendedLifetime(lease) {}
+ }
+ } else if let maintenance = try f.coordinator.reserveMaintenance() {
+ await probe.enter(exclusive: true)
+ await Task.yield()
+ await probe.leave(exclusive: true)
+ withExtendedLifetime(maintenance) {}
+ }
+ await Task.yield()
+ }
+ }
+ }
+ try await group.waitForAll()
+ }
+ #expect(await probe.violations == 0)
+ #expect(await probe.completed > 0)
+ #expect(try f.coordinator.reserveMaintenance() != nil)
+}
+
+@Test func fileMaintenanceRejectsInvalidCoordinationAndReplacedParent() throws {
+ for variant in ["nonempty", "symlink", "hardlink", "parent"] {
+ let f = try FileMaintenanceFixture()
+ defer { f.remove() }
+ try f.write("blob")
+ let gate = f.path(RadrootsFileMaintenanceGate.name)
+ switch variant {
+ case "nonempty": try Data("unknown".utf8).write(to: gate)
+ case "symlink": try FileManager.default.createSymbolicLink(at: gate, withDestinationURL: f.path("blob"))
+ case "hardlink":
+ try Data().write(to: gate)
+ try FileManager.default.linkItem(at: gate, to: f.path("alias"))
+ default:
+ let reservation = try #require(try f.coordinator.reserveMaintenance())
+ let scan = try reservation.openDirectory()
+ let entry = try #require(try scan.next().entries.first)
+ try FileManager.default.moveItem(at: f.root, to: f.base.appendingPathComponent("moved"))
+ try FileManager.default.createDirectory(at: f.root, withIntermediateDirectories: false)
+ #expect(throws: RadrootsAppleFileError.permanentFailure) { _ = try scan.remove(entry) }
+ #expect(FileManager.default.fileExists(atPath: f.base.appendingPathComponent("moved/blob").path))
+ continue
+ }
+ #expect(throws: RadrootsAppleFileError.permanentFailure) { _ = try f.coordinator.reserveUse() }
+ #expect(throws: RadrootsAppleFileError.permanentFailure) { _ = try f.coordinator.reserveMaintenance() }
+ }
+}
+
+private actor FileMaintenanceProbe {
+ private var readers = 0
+ private var writers = 0
+ private(set) var violations = 0
+ private(set) var completed = 0
+ func enter(exclusive: Bool) {
+ if writers != 0 || exclusive && readers != 0 {
+ violations += 1
+ }
+ if exclusive {
+ writers += 1
+ } else {
+ readers += 1
+ }
+ }
+
+ func leave(exclusive: Bool) {
+ if exclusive {
+ writers -= 1
+ } else {
+ readers -= 1
+ }
+ completed += 1
+ }
+}
+
+@Test func fileMaintenanceFailedScanCannotResumeAfterParentRestoration() throws {
+ let f = try FileMaintenanceFixture()
+ defer { f.remove() }
+ try f.write("blob")
+ let reservation = try #require(try f.coordinator.reserveMaintenance())
+ let scan = try reservation.openDirectory()
+ _ = try scan.next(limit: 1)
+ let moved = f.base.appendingPathComponent("moved")
+ try FileManager.default.moveItem(at: f.root, to: moved)
+ try FileManager.default.createDirectory(at: f.root, withIntermediateDirectories: false)
+ #expect(throws: RadrootsAppleFileError.permanentFailure) { _ = try scan.next() }
+ try FileManager.default.removeItem(at: f.root)
+ try FileManager.default.moveItem(at: moved, to: f.root)
+ try reservation.validate()
+ #expect(throws: RadrootsAppleFileError.permanentFailure) { _ = try scan.next() }
+ let fresh = try reservation.openDirectory()
+ #expect(try fresh.next().entries.map(\.name) == ["blob"])
+}
+
+private actor FileMaintenanceLatch {
+ private var continuation: CheckedContinuation<Void, Never>?
+ private var opened = false
+ func wait() async {
+ if opened {
+ return
+ }
+ await withCheckedContinuation { continuation = $0 }
+ }
+
+ func open() {
+ opened = true
+ continuation?.resume()
+ continuation = nil
+ }
+}
+
+private struct FileMaintenanceFixture: Sendable {
+ let base: URL
+ let root: URL
+ var coordinator: RadrootsAppleFileMaintenance {
+ RadrootsAppleFileMaintenance(root: root)
+ }
+
+ init() throws {
+ let raw = FileManager.default.temporaryDirectory
+ .appendingPathComponent("file-maintenance-\(UUID().uuidString)", isDirectory: true)
+ try FileManager.default.createDirectory(at: raw, withIntermediateDirectories: true)
+ let pointer = try #require(raw.path.withCString { Darwin.realpath($0, nil) })
+ defer { Darwin.free(pointer) }
+ base = URL(fileURLWithPath: String(cString: pointer), isDirectory: true)
+ root = base.appendingPathComponent("root", isDirectory: true)
+ try FileManager.default.createDirectory(at: root, withIntermediateDirectories: true)
+ }
+
+ func path(_ name: String) -> URL {
+ root.appendingPathComponent(name)
+ }
+
+ func write(_ name: String) throws {
+ try Data("old".utf8).write(to: path(name))
+ }
+
+ func remove() {
+ try? FileManager.default.removeItem(at: base)
+ }
+}
diff --git a/contracts/api_baselines/apple_kit.txt b/contracts/api_baselines/apple_kit.txt
@@ -222,6 +222,8 @@ radroots.apple-kit.public-api.v1
12:relationship 11:RadrootsKit 10:conformsTo 38:s:11RadrootsKit0A18CaptureIntakeErrorO 31:s:10Foundation14LocalizedErrorP 25:Foundation.LocalizedError
12:relationship 11:RadrootsKit 10:conformsTo 38:s:11RadrootsKit0A18CaptureIntakeErrorO 4:s:SH 14:Swift.Hashable
12:relationship 11:RadrootsKit 10:conformsTo 38:s:11RadrootsKit0A18CaptureIntakeErrorO 4:s:SQ 15:Swift.Equatable
+12:relationship 11:RadrootsKit 10:conformsTo 38:s:11RadrootsKit0A18FileUseReservationC 13:s:s8SendableP 14:Swift.Sendable
+12:relationship 11:RadrootsKit 10:conformsTo 38:s:11RadrootsKit0A18FileUseReservationC 22:s:s16SendableMetatypeP 22:Swift.SendableMetatype
12:relationship 11:RadrootsKit 10:conformsTo 38:s:11RadrootsKit0A18IdentityPassphraseV 13:s:s8SendableP 14:Swift.Sendable
12:relationship 11:RadrootsKit 10:conformsTo 38:s:11RadrootsKit0A18IdentityPassphraseV 22:s:s16SendableMetatypeP 22:Swift.SendableMetatype
12:relationship 11:RadrootsKit 10:conformsTo 38:s:11RadrootsKit0A18IdentityPassphraseV 34:s:s28CustomDebugStringConvertibleP 34:Swift.CustomDebugStringConvertible
@@ -303,6 +305,10 @@ radroots.apple-kit.public-api.v1
12:relationship 11:RadrootsKit 10:conformsTo 39:s:11RadrootsKit0A19ExternalActionErrorO 31:s:10Foundation14LocalizedErrorP 25:Foundation.LocalizedError
12:relationship 11:RadrootsKit 10:conformsTo 39:s:11RadrootsKit0A19ExternalActionErrorO 4:s:SH 14:Swift.Hashable
12:relationship 11:RadrootsKit 10:conformsTo 39:s:11RadrootsKit0A19ExternalActionErrorO 4:s:SQ 15:Swift.Equatable
+12:relationship 11:RadrootsKit 10:conformsTo 39:s:11RadrootsKit0A19FileMaintenancePageV 13:s:s8SendableP 14:Swift.Sendable
+12:relationship 11:RadrootsKit 10:conformsTo 39:s:11RadrootsKit0A19FileMaintenancePageV 22:s:s16SendableMetatypeP 22:Swift.SendableMetatype
+12:relationship 11:RadrootsKit 10:conformsTo 39:s:11RadrootsKit0A19FileMaintenanceScanC 13:s:s8SendableP 14:Swift.Sendable
+12:relationship 11:RadrootsKit 10:conformsTo 39:s:11RadrootsKit0A19FileMaintenanceScanC 22:s:s16SendableMetatypeP 22:Swift.SendableMetatype
12:relationship 11:RadrootsKit 10:conformsTo 39:s:11RadrootsKit0A19MediaCaptureRequestV 13:s:s8SendableP 14:Swift.Sendable
12:relationship 11:RadrootsKit 10:conformsTo 39:s:11RadrootsKit0A19MediaCaptureRequestV 22:s:s16SendableMetatypeP 22:Swift.SendableMetatype
12:relationship 11:RadrootsKit 10:conformsTo 39:s:11RadrootsKit0A19MediaCaptureRequestV 4:s:SH 14:Swift.Hashable
@@ -336,6 +342,8 @@ radroots.apple-kit.public-api.v1
12:relationship 11:RadrootsKit 10:conformsTo 40:s:11RadrootsKit0A20AppleExternalActionsC 13:s:s8SendableP 14:Swift.Sendable
12:relationship 11:RadrootsKit 10:conformsTo 40:s:11RadrootsKit0A20AppleExternalActionsC 22:s:s16SendableMetatypeP 22:Swift.SendableMetatype
12:relationship 11:RadrootsKit 10:conformsTo 40:s:11RadrootsKit0A20AppleExternalActionsC 35:s:11RadrootsKit0A15ExternalActionsP 0:
+12:relationship 11:RadrootsKit 10:conformsTo 40:s:11RadrootsKit0A20AppleFileMaintenanceV 13:s:s8SendableP 14:Swift.Sendable
+12:relationship 11:RadrootsKit 10:conformsTo 40:s:11RadrootsKit0A20AppleFileMaintenanceV 22:s:s16SendableMetatypeP 22:Swift.SendableMetatype
12:relationship 11:RadrootsKit 10:conformsTo 40:s:11RadrootsKit0A20AppleLoggerTelemetryC 13:s:s8SendableP 14:Swift.Sendable
12:relationship 11:RadrootsKit 10:conformsTo 40:s:11RadrootsKit0A20AppleLoggerTelemetryC 22:s:s16SendableMetatypeP 22:Swift.SendableMetatype
12:relationship 11:RadrootsKit 10:conformsTo 40:s:11RadrootsKit0A20AppleLoggerTelemetryC 28:s:11RadrootsKit0A9TelemetryP 0:
@@ -351,6 +359,8 @@ radroots.apple-kit.public-api.v1
12:relationship 11:RadrootsKit 10:conformsTo 40:s:11RadrootsKit0A20ExportDocumentSourceO 22:s:s16SendableMetatypeP 22:Swift.SendableMetatype
12:relationship 11:RadrootsKit 10:conformsTo 40:s:11RadrootsKit0A20ExportDocumentSourceO 4:s:SH 14:Swift.Hashable
12:relationship 11:RadrootsKit 10:conformsTo 40:s:11RadrootsKit0A20ExportDocumentSourceO 4:s:SQ 15:Swift.Equatable
+12:relationship 11:RadrootsKit 10:conformsTo 40:s:11RadrootsKit0A20FileMaintenanceEntryV 13:s:s8SendableP 14:Swift.Sendable
+12:relationship 11:RadrootsKit 10:conformsTo 40:s:11RadrootsKit0A20FileMaintenanceEntryV 22:s:s16SendableMetatypeP 22:Swift.SendableMetatype
12:relationship 11:RadrootsKit 10:conformsTo 40:s:11RadrootsKit0A20IdentityCustodyErrorO 10:s:s5ErrorP 11:Swift.Error
12:relationship 11:RadrootsKit 10:conformsTo 40:s:11RadrootsKit0A20IdentityCustodyErrorO 13:s:s8CopyableP 14:Swift.Copyable
12:relationship 11:RadrootsKit 10:conformsTo 40:s:11RadrootsKit0A20IdentityCustodyErrorO 13:s:s8SendableP 14:Swift.Sendable
@@ -560,6 +570,10 @@ radroots.apple-kit.public-api.v1
12:relationship 11:RadrootsKit 10:conformsTo 46:s:11RadrootsKit0A17ShareTransferItemV7PayloadO 22:s:s16SendableMetatypeP 22:Swift.SendableMetatype
12:relationship 11:RadrootsKit 10:conformsTo 46:s:11RadrootsKit0A17ShareTransferItemV7PayloadO 4:s:SH 14:Swift.Hashable
12:relationship 11:RadrootsKit 10:conformsTo 46:s:11RadrootsKit0A17ShareTransferItemV7PayloadO 4:s:SQ 15:Swift.Equatable
+12:relationship 11:RadrootsKit 10:conformsTo 46:s:11RadrootsKit0A20FileMaintenanceEntryV4KindO 13:s:s8SendableP 14:Swift.Sendable
+12:relationship 11:RadrootsKit 10:conformsTo 46:s:11RadrootsKit0A20FileMaintenanceEntryV4KindO 22:s:s16SendableMetatypeP 22:Swift.SendableMetatype
+12:relationship 11:RadrootsKit 10:conformsTo 46:s:11RadrootsKit0A20FileMaintenanceEntryV4KindO 4:s:SH 14:Swift.Hashable
+12:relationship 11:RadrootsKit 10:conformsTo 46:s:11RadrootsKit0A20FileMaintenanceEntryV4KindO 4:s:SQ 15:Swift.Equatable
12:relationship 11:RadrootsKit 10:conformsTo 46:s:11RadrootsKit0A26AppleIdentityMetadataStoreC 13:s:s8SendableP 14:Swift.Sendable
12:relationship 11:RadrootsKit 10:conformsTo 46:s:11RadrootsKit0A26AppleIdentityMetadataStoreC 22:s:s16SendableMetatypeP 22:Swift.SendableMetatype
12:relationship 11:RadrootsKit 10:conformsTo 46:s:11RadrootsKit0A26AppleIdentityMetadataStoreC 41:s:11RadrootsKit0A21IdentityMetadataStoreP 0:
@@ -591,6 +605,8 @@ radroots.apple-kit.public-api.v1
12:relationship 11:RadrootsKit 10:conformsTo 46:s:11RadrootsKit0A26BackgroundTransferSnapshotV 4:s:SH 14:Swift.Hashable
12:relationship 11:RadrootsKit 10:conformsTo 46:s:11RadrootsKit0A26BackgroundTransferSnapshotV 4:s:SQ 15:Swift.Equatable
12:relationship 11:RadrootsKit 10:conformsTo 46:s:11RadrootsKit0A26BackgroundTransferSnapshotV 4:s:Se 15:Swift.Decodable
+12:relationship 11:RadrootsKit 10:conformsTo 46:s:11RadrootsKit0A26FileMaintenanceReservationC 13:s:s8SendableP 14:Swift.Sendable
+12:relationship 11:RadrootsKit 10:conformsTo 46:s:11RadrootsKit0A26FileMaintenanceReservationC 22:s:s16SendableMetatypeP 22:Swift.SendableMetatype
12:relationship 11:RadrootsKit 10:conformsTo 46:s:11RadrootsKit0A26PreparedExportFileDocumentV 13:s:s8SendableP 14:Swift.Sendable
12:relationship 11:RadrootsKit 10:conformsTo 46:s:11RadrootsKit0A26PreparedExportFileDocumentV 22:s:s16SendableMetatypeP 22:Swift.SendableMetatype
12:relationship 11:RadrootsKit 10:conformsTo 46:s:11RadrootsKit0A26PreparedExportFileDocumentV 25:s:7SwiftUI12FileDocumentP 20:SwiftUI.FileDocument
@@ -928,6 +944,7 @@ radroots.apple-kit.public-api.v1
12:relationship 11:RadrootsKit 8:memberOf 46:s:11RadrootsKit0A15IdentityCustodyC04lockC0yyF 35:s:11RadrootsKit0A15IdentityCustodyC 0:
12:relationship 11:RadrootsKit 8:memberOf 46:s:11RadrootsKit0A15StagedBlobLeaseV6sha256SSvp 35:s:11RadrootsKit0A15StagedBlobLeaseV 0:
12:relationship 11:RadrootsKit 8:memberOf 46:s:11RadrootsKit0A17ShareTransferItemV7PayloadO 37:s:11RadrootsKit0A17ShareTransferItemV 0:
+12:relationship 11:RadrootsKit 8:memberOf 46:s:11RadrootsKit0A20FileMaintenanceEntryV4KindO 40:s:11RadrootsKit0A20FileMaintenanceEntryV 0:
12:relationship 11:RadrootsKit 8:memberOf 47:s:11RadrootsKit0A13IdentityStateO7corruptyA2CmF 33:s:11RadrootsKit0A13IdentityStateO 0:
12:relationship 11:RadrootsKit 8:memberOf 47:s:11RadrootsKit0A14PermissionKindO6camerayA2CmF 34:s:11RadrootsKit0A14PermissionKindO 0:
12:relationship 11:RadrootsKit 8:memberOf 47:s:11RadrootsKit0A14PermissionKindO6photosyA2CmF 34:s:11RadrootsKit0A14PermissionKindO 0:
@@ -950,6 +967,7 @@ radroots.apple-kit.public-api.v1
12:relationship 11:RadrootsKit 8:memberOf 49:s:11RadrootsKit0A16PermissionStatusO6deniedyA2CmF 36:s:11RadrootsKit0A16PermissionStatusO 0:
12:relationship 11:RadrootsKit 8:memberOf 49:s:11RadrootsKit0A18ApplePreparedImageV6sha256SSvp 38:s:11RadrootsKit0A18ApplePreparedImageV 0:
12:relationship 11:RadrootsKit 8:memberOf 49:s:11RadrootsKit0A19DocumentContentKindO3urlyA2CmF 39:s:11RadrootsKit0A19DocumentContentKindO 0:
+12:relationship 11:RadrootsKit 8:memberOf 49:s:11RadrootsKit0A20FileMaintenanceEntryV4nameSSvp 40:s:11RadrootsKit0A20FileMaintenanceEntryV 0:
12:relationship 11:RadrootsKit 8:memberOf 49:s:11RadrootsKit0A20IdentityCustodyErrorO4codeSSvp 40:s:11RadrootsKit0A20IdentityCustodyErrorO 0:
12:relationship 11:RadrootsKit 8:memberOf 50:s:11RadrootsKit0A11ShareResultV9completedACSb_tcfc 31:s:11RadrootsKit0A11ShareResultV 0:
12:relationship 11:RadrootsKit 8:memberOf 50:s:11RadrootsKit0A12FileReadModeO10stagedBlobyA2CmF 32:s:11RadrootsKit0A12FileReadModeO 0:
@@ -969,6 +987,7 @@ radroots.apple-kit.public-api.v1
12:relationship 11:RadrootsKit 8:memberOf 51:s:11RadrootsKit0A15StagedBlobLeaseV10identifierSSvp 35:s:11RadrootsKit0A15StagedBlobLeaseV 0:
12:relationship 11:RadrootsKit 8:memberOf 51:s:11RadrootsKit0A17ShareTransferItemV7subjectSSSgvp 37:s:11RadrootsKit0A17ShareTransferItemV 0:
12:relationship 11:RadrootsKit 8:memberOf 51:s:11RadrootsKit0A17UserPresenceErrorO7timeoutyA2CmF 37:s:11RadrootsKit0A17UserPresenceErrorO 0:
+12:relationship 11:RadrootsKit 8:memberOf 51:s:11RadrootsKit0A18FileUseReservationC8validateyyKF 38:s:11RadrootsKit0A18FileUseReservationC 0:
12:relationship 11:RadrootsKit 8:memberOf 51:s:11RadrootsKit0A18LocationCoordinateV8latitudeSdvp 38:s:11RadrootsKit0A18LocationCoordinateV 0:
12:relationship 11:RadrootsKit 8:memberOf 51:s:11RadrootsKit0A18ProtectedDataStateO6lockedyA2CmF 38:s:11RadrootsKit0A18ProtectedDataStateO 0:
12:relationship 11:RadrootsKit 8:memberOf 51:s:11RadrootsKit0A18UserPresenceResultV8verifiedSbvp 38:s:11RadrootsKit0A18UserPresenceResultV 0:
@@ -1020,8 +1039,10 @@ radroots.apple-kit.public-api.v1
12:relationship 11:RadrootsKit 8:memberOf 55:s:11RadrootsKit0A17ShareTransferItemV12transferTextSSvp 37:s:11RadrootsKit0A17ShareTransferItemV 0:
12:relationship 11:RadrootsKit 8:memberOf 55:s:11RadrootsKit0A18ApplePreparedImageV5widths6UInt32Vvp 38:s:11RadrootsKit0A18ApplePreparedImageV 0:
12:relationship 11:RadrootsKit 8:memberOf 55:s:11RadrootsKit0A19DocumentContentKindO9plainTextyA2CmF 39:s:11RadrootsKit0A19DocumentContentKindO 0:
+12:relationship 11:RadrootsKit 8:memberOf 55:s:11RadrootsKit0A19FileMaintenancePageV10reachedEndSbvp 39:s:11RadrootsKit0A19FileMaintenancePageV 0:
12:relationship 11:RadrootsKit 8:memberOf 55:s:11RadrootsKit0A19StagedBlobReferenceV9mediaTypeSSSgvp 39:s:11RadrootsKit0A19StagedBlobReferenceV 0:
12:relationship 11:RadrootsKit 8:memberOf 55:s:11RadrootsKit0A19TelemetryFieldValueO08renderedE0SSvp 39:s:11RadrootsKit0A19TelemetryFieldValueO 0:
+12:relationship 11:RadrootsKit 8:memberOf 55:s:11RadrootsKit0A20FileMaintenanceEntryV4kindAC4KindOvp 40:s:11RadrootsKit0A20FileMaintenanceEntryV 0:
12:relationship 11:RadrootsKit 8:memberOf 55:s:11RadrootsKit0A20IdentityCustodyErrorO8timedOutyA2CmF 40:s:11RadrootsKit0A20IdentityCustodyErrorO 0:
12:relationship 11:RadrootsKit 8:memberOf 55:s:11RadrootsKit0A21LocationServicesErrorO7timeoutyA2CmF 41:s:11RadrootsKit0A21LocationServicesErrorO 0:
12:relationship 11:RadrootsKit 8:memberOf 55:s:11RadrootsKit0A24BackgroundTransferMethodO4postyA2CmF 44:s:11RadrootsKit0A24BackgroundTransferMethodO 0:
@@ -1099,6 +1120,7 @@ radroots.apple-kit.public-api.v1
12:relationship 11:RadrootsKit 8:memberOf 58:s:11RadrootsKit0A18UserPresencePolicyO8rawValueACSgSS_tcfc 38:s:11RadrootsKit0A18UserPresencePolicyO 0:
12:relationship 11:RadrootsKit 8:memberOf 58:s:11RadrootsKit0A19BackgroundTaskErrorO11unavailableyA2CmF 39:s:11RadrootsKit0A19BackgroundTaskErrorO 0:
12:relationship 11:RadrootsKit 8:memberOf 58:s:11RadrootsKit0A19ExternalActionErrorO11unavailableyA2CmF 39:s:11RadrootsKit0A19ExternalActionErrorO 0:
+12:relationship 11:RadrootsKit 8:memberOf 58:s:11RadrootsKit0A20FileMaintenanceEntryV4KindO5otheryA2EmF 46:s:11RadrootsKit0A20FileMaintenanceEntryV4KindO 0:
12:relationship 11:RadrootsKit 8:memberOf 58:s:11RadrootsKit0A20IdentityPublicRecordV12publicKeyHexSSvp 40:s:11RadrootsKit0A20IdentityPublicRecordV 0:
12:relationship 11:RadrootsKit 8:memberOf 58:s:11RadrootsKit0A22AdmissionCleanupResultV10reachedEndSbvp 42:s:11RadrootsKit0A22AdmissionCleanupResultV 0:
12:relationship 11:RadrootsKit 8:memberOf 58:s:11RadrootsKit0A22PreparedExportDocumentV10preparedIDSSvp 42:s:11RadrootsKit0A22PreparedExportDocumentV 0:
@@ -1116,6 +1138,7 @@ radroots.apple-kit.public-api.v1
12:relationship 11:RadrootsKit 8:memberOf 59:s:11RadrootsKit0A18SecretAccessPolicyV011secureLocalC0ACvpZ 38:s:11RadrootsKit0A18SecretAccessPolicyV 0:
12:relationship 11:RadrootsKit 8:memberOf 59:s:11RadrootsKit0A18SecretAccessPolicyV15deviceLocalOnlySbvp 38:s:11RadrootsKit0A18SecretAccessPolicyV 0:
12:relationship 11:RadrootsKit 8:memberOf 59:s:11RadrootsKit0A19DocumentContentKindO8rawValueACSgSS_tcfc 39:s:11RadrootsKit0A19DocumentContentKindO 0:
+12:relationship 11:RadrootsKit 8:memberOf 59:s:11RadrootsKit0A19FileMaintenancePageV14scannedEntriesSivp 39:s:11RadrootsKit0A19FileMaintenancePageV 0:
12:relationship 11:RadrootsKit 8:memberOf 59:s:11RadrootsKit0A19MediaCaptureRequestV9mediaKindAA0acG0Ovp 39:s:11RadrootsKit0A19MediaCaptureRequestV 0:
12:relationship 11:RadrootsKit 8:memberOf 59:s:11RadrootsKit0A19SecretAccessibilityO12whenUnlockedyA2CmF 39:s:11RadrootsKit0A19SecretAccessibilityO 0:
12:relationship 11:RadrootsKit 8:memberOf 59:s:11RadrootsKit0A19StagedBlobReferenceV12filenameHintSSSgvp 39:s:11RadrootsKit0A19StagedBlobReferenceV 0:
@@ -1128,6 +1151,7 @@ radroots.apple-kit.public-api.v1
12:relationship 11:RadrootsKit 8:memberOf 59:s:11RadrootsKit0A24DocumentInterchangeErrorO8notFoundyA2CmF 44:s:11RadrootsKit0A24DocumentInterchangeErrorO 0:
12:relationship 11:RadrootsKit 8:memberOf 59:s:11RadrootsKit0A25BackgroundTransferFailureO7expiredyA2CmF 45:s:11RadrootsKit0A25BackgroundTransferFailureO 0:
12:relationship 11:RadrootsKit 8:memberOf 59:s:11RadrootsKit0A25ExternalActionDestinationV5nostryACSSKFZ 45:s:11RadrootsKit0A25ExternalActionDestinationV 0:
+12:relationship 11:RadrootsKit 8:memberOf 59:s:11RadrootsKit0A26FileMaintenanceReservationC8validateyyKF 46:s:11RadrootsKit0A26FileMaintenanceReservationC 0:
12:relationship 11:RadrootsKit 8:memberOf 59:s:11RadrootsKit0A28BackgroundDownloadedArtifactV6sha256SSvp 48:s:11RadrootsKit0A28BackgroundDownloadedArtifactV 0:
12:relationship 11:RadrootsKit 8:memberOf 59:s:11RadrootsKit0A29AppleLocationServicesAdaptersV4liveACvpZ 49:s:11RadrootsKit0A29AppleLocationServicesAdaptersV 0:
12:relationship 11:RadrootsKit 8:memberOf 59:s:11RadrootsKit0A29ApplePermissionStatusAdaptersV4liveACvpZ 49:s:11RadrootsKit0A29ApplePermissionStatusAdaptersV 0:
@@ -1139,6 +1163,7 @@ radroots.apple-kit.public-api.v1
12:relationship 11:RadrootsKit 8:memberOf 60:s:11RadrootsKit0A18CaptureIntakeErrorO14invalidRequestyA2CmF 38:s:11RadrootsKit0A18CaptureIntakeErrorO 0:
12:relationship 11:RadrootsKit 8:memberOf 60:s:11RadrootsKit0A18IdentityPassphraseV16debugDescriptionSSvp 38:s:11RadrootsKit0A18IdentityPassphraseV 0:
12:relationship 11:RadrootsKit 8:memberOf 60:s:11RadrootsKit0A18PermissionSnapshotV6statusAA0aC6StatusOvp 38:s:11RadrootsKit0A18PermissionSnapshotV 0:
+12:relationship 11:RadrootsKit 8:memberOf 60:s:11RadrootsKit0A20FileMaintenanceEntryV9sizeBytess5Int64Vvp 40:s:11RadrootsKit0A20FileMaintenanceEntryV 0:
12:relationship 11:RadrootsKit 8:memberOf 60:s:11RadrootsKit0A20IdentityCustodyErrorO8rawValueACSgSS_tcfc 40:s:11RadrootsKit0A20IdentityCustodyErrorO 0:
12:relationship 11:RadrootsKit 8:memberOf 60:s:11RadrootsKit0A20IdentityMetadataSlotO8rawValueACSgSS_tcfc 40:s:11RadrootsKit0A20IdentityMetadataSlotO 0:
12:relationship 11:RadrootsKit 8:memberOf 60:s:11RadrootsKit0A20IdentityPublicRecordV14identityHandleSSvp 40:s:11RadrootsKit0A20IdentityPublicRecordV 0:
@@ -1191,6 +1216,7 @@ radroots.apple-kit.public-api.v1
12:relationship 11:RadrootsKit 8:memberOf 62:s:11RadrootsKit0A19ExternalActionErrorO15blockedByPolicyyA2CmF 39:s:11RadrootsKit0A19ExternalActionErrorO 0:
12:relationship 11:RadrootsKit 8:memberOf 62:s:11RadrootsKit0A19UserPresenceRequestV6policyAA0acD6PolicyOvp 39:s:11RadrootsKit0A19UserPresenceRequestV 0:
12:relationship 11:RadrootsKit 8:memberOf 62:s:11RadrootsKit0A20ExportDocumentResultV16exportedFilenameSSvp 40:s:11RadrootsKit0A20ExportDocumentResultV 0:
+12:relationship 11:RadrootsKit 8:memberOf 62:s:11RadrootsKit0A20FileMaintenanceEntryV4KindO9directoryyA2EmF 46:s:11RadrootsKit0A20FileMaintenanceEntryV4KindO 0:
12:relationship 11:RadrootsKit 8:memberOf 62:s:11RadrootsKit0A20IdentityCustodyErrorO14identityLockedyA2CmF 40:s:11RadrootsKit0A20IdentityCustodyErrorO 0:
12:relationship 11:RadrootsKit 8:memberOf 62:s:11RadrootsKit0A20IdentityMetadataSlotO011quarantinedD0yA2CmF 40:s:11RadrootsKit0A20IdentityMetadataSlotO 0:
12:relationship 11:RadrootsKit 8:memberOf 62:s:11RadrootsKit0A20VerifiedArtifactFileV16debugDescriptionSSvp 40:s:11RadrootsKit0A20VerifiedArtifactFileV 0:
@@ -1222,6 +1248,7 @@ radroots.apple-kit.public-api.v1
12:relationship 11:RadrootsKit 8:memberOf 63:s:11RadrootsKit0A19TelemetryFieldValueO7integeryACs5Int64VcACmF 39:s:11RadrootsKit0A19TelemetryFieldValueO 0:
12:relationship 11:RadrootsKit 8:memberOf 63:s:11RadrootsKit0A19UserPresenceSupportO16deviceCredentialyA2CmF 39:s:11RadrootsKit0A19UserPresenceSupportO 0:
12:relationship 11:RadrootsKit 8:memberOf 63:s:11RadrootsKit0A20ExportDocumentResultV9sizeBytess6UInt64VSgvp 40:s:11RadrootsKit0A20ExportDocumentResultV 0:
+12:relationship 11:RadrootsKit 8:memberOf 63:s:11RadrootsKit0A20FileMaintenanceEntryV4KindO07regularC0yA2EmF 46:s:11RadrootsKit0A20FileMaintenanceEntryV4KindO 0:
12:relationship 11:RadrootsKit 8:memberOf 63:s:11RadrootsKit0A20IdentityCustodyErrorO15corruptMetadatayA2CmF 40:s:11RadrootsKit0A20IdentityCustodyErrorO 0:
12:relationship 11:RadrootsKit 8:memberOf 63:s:11RadrootsKit0A20IdentityCustodyErrorO15invalidMetadatayA2CmF 40:s:11RadrootsKit0A20IdentityCustodyErrorO 0:
12:relationship 11:RadrootsKit 8:memberOf 63:s:11RadrootsKit0A21LocationServicesErrorO14invalidRequestyA2CmF 41:s:11RadrootsKit0A21LocationServicesErrorO 0:
@@ -1243,6 +1270,7 @@ radroots.apple-kit.public-api.v1
12:relationship 11:RadrootsKit 8:memberOf 64:s:11RadrootsKit0A17OpaqueSignRequestV6digest10Foundation4DataVvp 37:s:11RadrootsKit0A17OpaqueSignRequestV 0:
12:relationship 11:RadrootsKit 8:memberOf 64:s:11RadrootsKit0A17ShareTransferItemV4text7subjectACSS_SSSgtKcfc 37:s:11RadrootsKit0A17ShareTransferItemV 0:
12:relationship 11:RadrootsKit 8:memberOf 64:s:11RadrootsKit0A18SecretAccessPolicyV20userPresenceRequiredSbvp 38:s:11RadrootsKit0A18SecretAccessPolicyV 0:
+12:relationship 11:RadrootsKit 8:memberOf 64:s:11RadrootsKit0A19FileMaintenanceScanC6removeySbAA0acD5EntryVKF 39:s:11RadrootsKit0A19FileMaintenanceScanC 0:
12:relationship 11:RadrootsKit 8:memberOf 64:s:11RadrootsKit0A20AppleLoggerTelemetryC6recordyyAA0aE5EventVYaF 40:s:11RadrootsKit0A20AppleLoggerTelemetryC 0:
12:relationship 11:RadrootsKit 8:memberOf 64:s:11RadrootsKit0A20IdentityCustodyErrorO16errorDescriptionSSSgvp 40:s:11RadrootsKit0A20IdentityCustodyErrorO 0:
12:relationship 11:RadrootsKit 8:memberOf 64:s:11RadrootsKit0A20IdentityCustodyErrorO16identityNotFoundyA2CmF 40:s:11RadrootsKit0A20IdentityCustodyErrorO 0:
@@ -1304,6 +1332,7 @@ radroots.apple-kit.public-api.v1
12:relationship 11:RadrootsKit 8:memberOf 66:s:11RadrootsKit0A17ShareTransferItemV22transferRepresentationQrvpZ 37:s:11RadrootsKit0A17ShareTransferItemV 0:
12:relationship 11:RadrootsKit 8:memberOf 66:s:11RadrootsKit0A18AppLocalStateResetO5resetyyAA0acdeF7RequestVKFZ 38:s:11RadrootsKit0A18AppLocalStateResetO 0:
12:relationship 11:RadrootsKit 8:memberOf 66:s:11RadrootsKit0A18MediaPickerSupportV22cameraCaptureAvailableSbvp 38:s:11RadrootsKit0A18MediaPickerSupportV 0:
+12:relationship 11:RadrootsKit 8:memberOf 66:s:11RadrootsKit0A19FileMaintenancePageV7entriesSayAA0acD5EntryVGvp 39:s:11RadrootsKit0A19FileMaintenancePageV 0:
12:relationship 11:RadrootsKit 8:memberOf 66:s:11RadrootsKit0A20AppleLoggerTelemetryC18normalizedCategoryyS2SFZ 40:s:11RadrootsKit0A20AppleLoggerTelemetryC 0:
12:relationship 11:RadrootsKit 8:memberOf 66:s:11RadrootsKit0A20IdentityCustodyErrorO18cryptographyFailedyA2CmF 40:s:11RadrootsKit0A20IdentityCustodyErrorO 0:
12:relationship 11:RadrootsKit 8:memberOf 66:s:11RadrootsKit0A20IdentityCustodyErrorO18duplicateOperationyA2CmF 40:s:11RadrootsKit0A20IdentityCustodyErrorO 0:
@@ -1340,6 +1369,7 @@ radroots.apple-kit.public-api.v1
12:relationship 11:RadrootsKit 8:memberOf 67:s:11RadrootsKit0A25BackgroundTransferRequestV16debugDescriptionSSvp 45:s:11RadrootsKit0A25BackgroundTransferRequestV 0:
12:relationship 11:RadrootsKit 8:memberOf 67:s:11RadrootsKit0A26BackgroundTransferSnapshotV5stateAA0acD5StateOvp 46:s:11RadrootsKit0A26BackgroundTransferSnapshotV 0:
12:relationship 11:RadrootsKit 8:memberOf 68:s:11RadrootsKit0A14AppleFileRootsV13temporaryRoot10Foundation3URLVvp 34:s:11RadrootsKit0A14AppleFileRootsV 0:
+12:relationship 11:RadrootsKit 8:memberOf 68:s:11RadrootsKit0A19FileMaintenanceScanC4next5limitAA0acD4PageVSi_tKF 39:s:11RadrootsKit0A19FileMaintenanceScanC 0:
12:relationship 11:RadrootsKit 8:memberOf 68:s:11RadrootsKit0A19TelemetryValidationO17normalizedMessageySSSgAEKFZ 39:s:11RadrootsKit0A19TelemetryValidationO 0:
12:relationship 11:RadrootsKit 8:memberOf 68:s:11RadrootsKit0A20IdentityCustodyErrorO20invalidConfigurationyA2CmF 40:s:11RadrootsKit0A20IdentityCustodyErrorO 0:
12:relationship 11:RadrootsKit 8:memberOf 68:s:11RadrootsKit0A20IdentityCustodyErrorO20userPresenceRequiredyA2CmF 40:s:11RadrootsKit0A20IdentityCustodyErrorO 0:
@@ -1365,6 +1395,7 @@ radroots.apple-kit.public-api.v1
12:relationship 11:RadrootsKit 8:memberOf 69:s:11RadrootsKit0A16ImportedDocumentV11originalURL10Foundation0F0VSgvp 36:s:11RadrootsKit0A16ImportedDocumentV 0:
12:relationship 11:RadrootsKit 8:memberOf 69:s:11RadrootsKit0A17AppleUserPresenceC8adaptersAcA0acdE8AdaptersV_tcfc 37:s:11RadrootsKit0A17AppleUserPresenceC 0:
12:relationship 11:RadrootsKit 8:memberOf 69:s:11RadrootsKit0A18LocationCoordinateV8latitude9longitudeACSd_SdtKcfc 38:s:11RadrootsKit0A18LocationCoordinateV 0:
+12:relationship 11:RadrootsKit 8:memberOf 69:s:11RadrootsKit0A20AppleFileMaintenanceV4rootAC10Foundation3URLV_tcfc 40:s:11RadrootsKit0A20AppleFileMaintenanceV 0:
12:relationship 11:RadrootsKit 8:memberOf 69:s:11RadrootsKit0A20IdentityCustodyErrorO21identityAlreadyExistsyA2CmF 40:s:11RadrootsKit0A20IdentityCustodyErrorO 0:
12:relationship 11:RadrootsKit 8:memberOf 69:s:11RadrootsKit0A22BackgroundTaskSnapshotV21requiresExternalPowerSbvp 42:s:11RadrootsKit0A22BackgroundTaskSnapshotV 0:
12:relationship 11:RadrootsKit 8:memberOf 69:s:11RadrootsKit0A23BackgroundTransferErrorO18persistenceFailureyA2CmF 43:s:11RadrootsKit0A23BackgroundTransferErrorO 0:
@@ -1435,6 +1466,7 @@ radroots.apple-kit.public-api.v1
12:relationship 11:RadrootsKit 8:memberOf 72:s:11RadrootsKit0A20AppleExternalActionsC8adaptersAcA0acdE8AdaptersV_tcfc 40:s:11RadrootsKit0A20AppleExternalActionsC 0:
12:relationship 11:RadrootsKit 8:memberOf 72:s:11RadrootsKit0A20DocumentImportResultV9documentsSayAA0a8ImportedC0VGvp 40:s:11RadrootsKit0A20DocumentImportResultV 0:
12:relationship 11:RadrootsKit 8:memberOf 72:s:11RadrootsKit0A20ExportDocumentSourceO4fileyAcA0A13FileReferenceVcACmF 40:s:11RadrootsKit0A20ExportDocumentSourceO 0:
+12:relationship 11:RadrootsKit 8:memberOf 72:s:11RadrootsKit0A20FileMaintenanceEntryV10modifiedAt10Foundation4DateVvp 40:s:11RadrootsKit0A20FileMaintenanceEntryV 0:
12:relationship 11:RadrootsKit 8:memberOf 72:s:11RadrootsKit0A20IdentityCustodyErrorO24protectedDataUnavailableyA2CmF 40:s:11RadrootsKit0A20IdentityCustodyErrorO 0:
12:relationship 11:RadrootsKit 8:memberOf 72:s:11RadrootsKit0A22DocumentScannerSupportV24interactiveScanAvailableSbvp 42:s:11RadrootsKit0A22DocumentScannerSupportV 0:
12:relationship 11:RadrootsKit 8:memberOf 72:s:11RadrootsKit0A25BackgroundTransferRequestV07maximumD5Bytess6UInt64Vvp 45:s:11RadrootsKit0A25BackgroundTransferRequestV 0:
@@ -1507,6 +1539,7 @@ radroots.apple-kit.public-api.v1
12:relationship 11:RadrootsKit 8:memberOf 76:s:11RadrootsKit0A18UserPresenceResultV6policy8verifiedAcA0acD6PolicyO_Sbtcfc 38:s:11RadrootsKit0A18UserPresenceResultV 0:
12:relationship 11:RadrootsKit 8:memberOf 76:s:11RadrootsKit0A19DocumentScanRequestV10outputKindAA0ac13ScannerOutputG0Ovp 39:s:11RadrootsKit0A19DocumentScanRequestV 0:
12:relationship 11:RadrootsKit 8:memberOf 76:s:11RadrootsKit0A19UserPresenceRequestV6policy6reasonAcA0acD6PolicyO_SStKcfc 39:s:11RadrootsKit0A19UserPresenceRequestV 0:
+12:relationship 11:RadrootsKit 8:memberOf 76:s:11RadrootsKit0A20AppleFileMaintenanceV07reserveE0AA0adE11ReservationCSgyKF 40:s:11RadrootsKit0A20AppleFileMaintenanceV 0:
12:relationship 11:RadrootsKit 8:memberOf 76:s:11RadrootsKit0A20ExportDocumentSourceO10inlineDatayAC10Foundation0G0VcACmF 40:s:11RadrootsKit0A20ExportDocumentSourceO 0:
12:relationship 11:RadrootsKit 8:memberOf 76:s:11RadrootsKit0A21ExternalActionRequestV11destinationAA0acD11DestinationVvp 41:s:11RadrootsKit0A21ExternalActionRequestV 0:
12:relationship 11:RadrootsKit 8:memberOf 76:s:11RadrootsKit0A23CaptureIntakeValidationO24normalizedSelectionLimityS2iKFZ 43:s:11RadrootsKit0A23CaptureIntakeValidationO 0:
@@ -1519,6 +1552,7 @@ radroots.apple-kit.public-api.v1
12:relationship 11:RadrootsKit 8:memberOf 76:s:11RadrootsKit0A9ShareItemO10stagedBlobyAcA0a6StagedF9ReferenceV_SSSgtcACmF 28:s:11RadrootsKit0A9ShareItemO 0:
12:relationship 11:RadrootsKit 8:memberOf 77:s:11RadrootsKit0A11SecureStorePAAE3put_3fory10Foundation4DataV_AA0acD3KeyVtKF 31:s:11RadrootsKit0A11SecureStoreP 0:
12:relationship 11:RadrootsKit 8:memberOf 77:s:11RadrootsKit0A18MediaPickerSupportV20supportedImportKindsSayAA0aC4KindOGvp 38:s:11RadrootsKit0A18MediaPickerSupportV 0:
+12:relationship 11:RadrootsKit 8:memberOf 77:s:11RadrootsKit0A20AppleFileMaintenanceV10reserveUseAA0adG11ReservationCSgyKF 40:s:11RadrootsKit0A20AppleFileMaintenanceV 0:
12:relationship 11:RadrootsKit 8:memberOf 77:s:11RadrootsKit0A24BackgroundTransferHandleV10identifierAA0acD10IdentifierVvp 44:s:11RadrootsKit0A24BackgroundTransferHandleV 0:
12:relationship 11:RadrootsKit 8:memberOf 77:s:11RadrootsKit0A28AppleBackgroundTransferStoreC12saveSnapshotyyAA0adeH0VYaKF 48:s:11RadrootsKit0A28AppleBackgroundTransferStoreC 0:
12:relationship 11:RadrootsKit 8:memberOf 77:s:11RadrootsKit0A28AppleLoggerTelemetryAdaptersV4emityyAA0acE9LogRecordVYbcvp 48:s:11RadrootsKit0A28AppleLoggerTelemetryAdaptersV 0:
@@ -1649,6 +1683,7 @@ radroots.apple-kit.public-api.v1
12:relationship 11:RadrootsKit 8:memberOf 93:s:11RadrootsKit0A21AppleLocationServicesC07currentD0yAA0a7CurrentD6ResultVAA0agD7RequestVYaKF 41:s:11RadrootsKit0A21AppleLocationServicesC 0:
12:relationship 11:RadrootsKit 8:memberOf 93:s:11RadrootsKit0A23AppleBackgroundTransferC5roots17sessionIdentifierAcA0aC9FileRootsV_SStKcfc 43:s:11RadrootsKit0A23AppleBackgroundTransferC 0:
12:relationship 11:RadrootsKit 8:memberOf 93:s:11RadrootsKit0A24ExternalActionCapabilityV11destination7canOpenAcA0acD11DestinationV_Sbtcfc 44:s:11RadrootsKit0A24ExternalActionCapabilityV 0:
+12:relationship 11:RadrootsKit 8:memberOf 93:s:11RadrootsKit0A26FileMaintenanceReservationC13openDirectory12relativePathAA0acD4ScanCSS_tKF 46:s:11RadrootsKit0A26FileMaintenanceReservationC 0:
12:relationship 11:RadrootsKit 8:memberOf 93:s:11RadrootsKit0A27IdentityPortabilityEnvelopeV24serializedRepresentation10Foundation4DataVvp 47:s:11RadrootsKit0A27IdentityPortabilityEnvelopeV 0:
12:relationship 11:RadrootsKit 8:memberOf 93:s:11RadrootsKit0A34UnavailableBackgroundTaskSchedulerV12pendingTasksSayAA0adE8SnapshotVGyYaKF 54:s:11RadrootsKit0A34UnavailableBackgroundTaskSchedulerV 0:
12:relationship 11:RadrootsKit 8:memberOf 94:s:11RadrootsKit0A19MediaCaptureRequestV9mediaKind16destinationScopeAcA0acG0O_AA0a4FileI0OtKcfc 39:s:11RadrootsKit0A19MediaCaptureRequestV 0:
@@ -1903,6 +1938,7 @@ radroots.apple-kit.public-api.v1
6:symbol 11:RadrootsKit 10:swift.enum 45:s:11RadrootsKit0A25BackgroundTransferFailureO 33:RadrootsBackgroundTransferFailure 38:enum RadrootsBackgroundTransferFailure
6:symbol 11:RadrootsKit 10:swift.enum 45:s:11RadrootsKit0A25DocumentScannerOutputKindO 33:RadrootsDocumentScannerOutputKind 38:enum RadrootsDocumentScannerOutputKind
6:symbol 11:RadrootsKit 10:swift.enum 46:s:11RadrootsKit0A17ShareTransferItemV7PayloadO 33:RadrootsShareTransferItem.Payload 12:enum Payload
+6:symbol 11:RadrootsKit 10:swift.enum 46:s:11RadrootsKit0A20FileMaintenanceEntryV4KindO 33:RadrootsFileMaintenanceEntry.Kind 9:enum Kind
6:symbol 11:RadrootsKit 10:swift.enum 46:s:11RadrootsKit0A26AppleMediaPreparationErrorO 34:RadrootsAppleMediaPreparationError 39:enum RadrootsAppleMediaPreparationError
6:symbol 11:RadrootsKit 10:swift.enum 47:s:11RadrootsKit0A27BackgroundTransferLocalFileO 35:RadrootsBackgroundTransferLocalFile 40:enum RadrootsBackgroundTransferLocalFile
6:symbol 11:RadrootsKit 10:swift.enum 47:s:11RadrootsKit0A27BackgroundTransferOperationO 35:RadrootsBackgroundTransferOperation 40:enum RadrootsBackgroundTransferOperation
@@ -2014,6 +2050,7 @@ radroots.apple-kit.public-api.v1
6:symbol 11:RadrootsKit 10:swift.init 68:s:11RadrootsKit0A24BackgroundTransferHandleV4fromACs7Decoder_p_tKcfc 11:init(from:) 38:init(from decoder: any Decoder) throws
6:symbol 11:RadrootsKit 10:swift.init 69:s:11RadrootsKit0A17AppleUserPresenceC8adaptersAcA0acdE8AdaptersV_tcfc 15:init(adapters:) 92:init(adapters: RadrootsAppleUserPresenceAdapters = RadrootsAppleUserPresenceAdapters.live())
6:symbol 11:RadrootsKit 10:swift.init 69:s:11RadrootsKit0A18LocationCoordinateV8latitude9longitudeACSd_SdtKcfc 25:init(latitude:longitude:) 48:init(latitude: Double, longitude: Double) throws
+6:symbol 11:RadrootsKit 10:swift.init 69:s:11RadrootsKit0A20AppleFileMaintenanceV4rootAC10Foundation3URLV_tcfc 11:init(root:) 15:init(root: URL)
6:symbol 11:RadrootsKit 10:swift.init 69:s:11RadrootsKit0A25BackgroundTransferRequestV4fromACs7Decoder_p_tKcfc 11:init(from:) 38:init(from decoder: any Decoder) throws
6:symbol 11:RadrootsKit 10:swift.init 69:s:11RadrootsKit0A29ExternalActionDestinationKindO8rawValueACSgSS_tcfc 15:init(rawValue:) 23:init?(rawValue: String)
6:symbol 11:RadrootsKit 10:swift.init 70:s:11RadrootsKit0A21ProtectedDataProviderV9readStateAcA0acdG0OyYbc_tcfc 16:init(readState:) 69:init(readState: @escaping @Sendable () -> RadrootsProtectedDataState)
@@ -2061,7 +2098,9 @@ radroots.apple-kit.public-api.v1
6:symbol 11:RadrootsKit 11:swift.class 36:s:11RadrootsKit0A16AppleMediaPickerC 24:RadrootsAppleMediaPicker 36:final class RadrootsAppleMediaPicker
6:symbol 11:RadrootsKit 11:swift.class 37:s:11RadrootsKit0A17AppleUserPresenceC 25:RadrootsAppleUserPresence 37:final class RadrootsAppleUserPresence
6:symbol 11:RadrootsKit 11:swift.class 38:s:11RadrootsKit0A18AppleMediaPreparerC 26:RadrootsAppleMediaPreparer 32:actor RadrootsAppleMediaPreparer
+6:symbol 11:RadrootsKit 11:swift.class 38:s:11RadrootsKit0A18FileUseReservationC 26:RadrootsFileUseReservation 38:final class RadrootsFileUseReservation
6:symbol 11:RadrootsKit 11:swift.class 38:s:11RadrootsKit0A18OpaqueSignerBridgeC 26:RadrootsOpaqueSignerBridge 38:final class RadrootsOpaqueSignerBridge
+6:symbol 11:RadrootsKit 11:swift.class 39:s:11RadrootsKit0A19FileMaintenanceScanC 27:RadrootsFileMaintenanceScan 39:final class RadrootsFileMaintenanceScan
6:symbol 11:RadrootsKit 11:swift.class 40:s:11RadrootsKit0A20AppleDocumentScannerC 28:RadrootsAppleDocumentScanner 40:final class RadrootsAppleDocumentScanner
6:symbol 11:RadrootsKit 11:swift.class 40:s:11RadrootsKit0A20AppleExternalActionsC 28:RadrootsAppleExternalActions 40:final class RadrootsAppleExternalActions
6:symbol 11:RadrootsKit 11:swift.class 40:s:11RadrootsKit0A20AppleLoggerTelemetryC 28:RadrootsAppleLoggerTelemetry 40:final class RadrootsAppleLoggerTelemetry
@@ -2070,6 +2109,7 @@ radroots.apple-kit.public-api.v1
6:symbol 11:RadrootsKit 11:swift.class 44:s:11RadrootsKit0A24AppleKeychainSecureStoreC 32:RadrootsAppleKeychainSecureStore 44:final class RadrootsAppleKeychainSecureStore
6:symbol 11:RadrootsKit 11:swift.class 44:s:11RadrootsKit0A24OpaqueSignerCancellationC 32:RadrootsOpaqueSignerCancellation 44:final class RadrootsOpaqueSignerCancellation
6:symbol 11:RadrootsKit 11:swift.class 46:s:11RadrootsKit0A26AppleIdentityMetadataStoreC 34:RadrootsAppleIdentityMetadataStore 46:final class RadrootsAppleIdentityMetadataStore
+6:symbol 11:RadrootsKit 11:swift.class 46:s:11RadrootsKit0A26FileMaintenanceReservationC 34:RadrootsFileMaintenanceReservation 46:final class RadrootsFileMaintenanceReservation
6:symbol 11:RadrootsKit 11:swift.class 48:s:11RadrootsKit0A28AppleBackgroundTaskSchedulerC 36:RadrootsAppleBackgroundTaskScheduler 48:final class RadrootsAppleBackgroundTaskScheduler
6:symbol 11:RadrootsKit 11:swift.class 48:s:11RadrootsKit0A28AppleBackgroundTransferStoreC 36:RadrootsAppleBackgroundTransferStore 42:actor RadrootsAppleBackgroundTransferStore
6:symbol 11:RadrootsKit 11:swift.class 49:s:11RadrootsKit0A29ApplePermissionStatusProviderC 37:RadrootsApplePermissionStatusProvider 49:final class RadrootsApplePermissionStatusProvider
@@ -2122,6 +2162,7 @@ radroots.apple-kit.public-api.v1
6:symbol 11:RadrootsKit 12:swift.method 229:s:11RadrootsKit0A18AppleMediaPreparerC20blossomUploadRequest13preparedImage9remoteURL13authorization13networkPolicy10identifierAA0a18BackgroundTransferH0VAA0ac8PreparedJ0V_10Foundation0L0VSSAA0aqr7NetworkO0OAA0aqR10IdentifierVtKF 85:blossomUploadRequest(preparedImage:remoteURL:authorization:networkPolicy:identifier:) 287:func blossomUploadRequest(preparedImage: RadrootsApplePreparedImage, remoteURL: URL, authorization: String, networkPolicy: RadrootsBackgroundTransferNetworkPolicy = .publicHTTPS, identifier: RadrootsBackgroundTransferIdentifier = .generated()) throws -> RadrootsBackgroundTransferRequest
6:symbol 11:RadrootsKit 12:swift.method 46:s:11RadrootsKit0A15IdentityCustodyC04lockC0yyF 14:lockIdentity() 19:func lockIdentity()
6:symbol 11:RadrootsKit 12:swift.method 51:s:11RadrootsKit0A14SecureStoreKeyV10normalizedACyKF 12:normalized() 50:func normalized() throws -> RadrootsSecureStoreKey
+6:symbol 11:RadrootsKit 12:swift.method 51:s:11RadrootsKit0A18FileUseReservationC8validateyyKF 10:validate() 22:func validate() throws
6:symbol 11:RadrootsKit 12:swift.method 52:s:11RadrootsKit0A10FileAccessP16resetStagedBlobsyyKF 18:resetStagedBlobs() 30:func resetStagedBlobs() throws
6:symbol 11:RadrootsKit 12:swift.method 52:s:11RadrootsKit0A9TelemetryP6recordyyAA0aC5EventVYaF 10:record(_:) 50:func record(_ event: RadrootsTelemetryEvent) async
6:symbol 11:RadrootsKit 12:swift.method 53:s:11RadrootsKit0A11SecureStoreP6deleteyyAA0acD3KeyVKF 10:delete(_:) 49:func delete(_ key: RadrootsSecureStoreKey) throws
@@ -2134,6 +2175,7 @@ radroots.apple-kit.public-api.v1
6:symbol 11:RadrootsKit 12:swift.method 57:s:11RadrootsKit0A15AppleFileAccessC16resetStagedBlobsyyKF 18:resetStagedBlobs() 30:func resetStagedBlobs() throws
6:symbol 11:RadrootsKit 12:swift.method 59:s:11RadrootsKit0A10FileAccessP5reset5scopeyAA0aC5ScopeO_tKF 13:reset(scope:) 43:func reset(scope: RadrootsFileScope) throws
6:symbol 11:RadrootsKit 12:swift.method 59:s:11RadrootsKit0A23BackgroundTaskSchedulerP9cancelAllyyYaKF 11:cancelAll() 29:func cancelAll() async throws
+6:symbol 11:RadrootsKit 12:swift.method 59:s:11RadrootsKit0A26FileMaintenanceReservationC8validateyyKF 10:validate() 22:func validate() throws
6:symbol 11:RadrootsKit 12:swift.method 61:s:11RadrootsKit0A11MediaPickerP14currentSupportAA0acdF0VyYaKF 16:currentSupport() 64:func currentSupport() async throws -> RadrootsMediaPickerSupport
6:symbol 11:RadrootsKit 12:swift.method 61:s:11RadrootsKit0A12UserPresenceP13currentStatusAA0acdF0VyYaKF 15:currentStatus() 63:func currentStatus() async throws -> RadrootsUserPresenceStatus
6:symbol 11:RadrootsKit 12:swift.method 61:s:11RadrootsKit0A15IdentityCustodyC7recoverAA0aC8SnapshotVyKF 9:recover() 68:@discardableResult func recover() throws -> RadrootsIdentitySnapshot
@@ -2143,6 +2185,7 @@ radroots.apple-kit.public-api.v1
6:symbol 11:RadrootsKit 12:swift.method 62:s:11RadrootsKit0A18RedactingTelemetryV6recordyyAA0aD5EventVYaF 10:record(_:) 50:func record(_ event: RadrootsTelemetryEvent) async
6:symbol 11:RadrootsKit 12:swift.method 63:s:11RadrootsKit0A14SecureStoreKeyV11serviceName0F6PrefixS2S_tKF 27:serviceName(servicePrefix:) 56:func serviceName(servicePrefix: String) throws -> String
6:symbol 11:RadrootsKit 12:swift.method 64:s:11RadrootsKit0A15AppleFileAccessC5reset5scopeyAA0aD5ScopeO_tKF 13:reset(scope:) 43:func reset(scope: RadrootsFileScope) throws
+6:symbol 11:RadrootsKit 12:swift.method 64:s:11RadrootsKit0A19FileMaintenanceScanC6removeySbAA0acD5EntryVKF 10:remove(_:) 65:func remove(_ entry: RadrootsFileMaintenanceEntry) throws -> Bool
6:symbol 11:RadrootsKit 12:swift.method 64:s:11RadrootsKit0A20AppleLoggerTelemetryC6recordyyAA0aE5EventVYaF 10:record(_:) 50:func record(_ event: RadrootsTelemetryEvent) async
6:symbol 11:RadrootsKit 12:swift.method 64:s:11RadrootsKit0A21IdentityMetadataStoreP6deleteyyAA0acD4SlotOKF 10:delete(_:) 56:func delete(_ slot: RadrootsIdentityMetadataSlot) throws
6:symbol 11:RadrootsKit 12:swift.method 64:s:11RadrootsKit0A28AppleBackgroundTaskSchedulerC9cancelAllyyYaKF 11:cancelAll() 29:func cancelAll() async throws
@@ -2156,6 +2199,7 @@ radroots.apple-kit.public-api.v1
6:symbol 11:RadrootsKit 12:swift.method 67:s:11RadrootsKit0A15ExternalActionsP4openyyAA0aC13ActionRequestVYaKF 8:open(_:) 64:func open(_ request: RadrootsExternalActionRequest) async throws
6:symbol 11:RadrootsKit 12:swift.method 67:s:11RadrootsKit0A24AppleKeychainSecureStoreC15deleteNamespaceyySSKF 19:deleteNamespace(_:) 48:func deleteNamespace(_ namespace: String) throws
6:symbol 11:RadrootsKit 12:swift.method 67:s:11RadrootsKit0A24TelemetryRedactionPolicyV15shouldRedactKeyySbSSF 19:shouldRedactKey(_:) 43:func shouldRedactKey(_ key: String) -> Bool
+6:symbol 11:RadrootsKit 12:swift.method 68:s:11RadrootsKit0A19FileMaintenanceScanC4next5limitAA0acD4PageVSi_tKF 12:next(limit:) 64:func next(limit: Int = 64) throws -> RadrootsFileMaintenancePage
6:symbol 11:RadrootsKit 12:swift.method 69:s:11RadrootsKit0A11SecureStoreP3gety10Foundation4DataVSgAA0acD3KeyVKF 7:get(_:) 55:func get(_ key: RadrootsSecureStoreKey) throws -> Data?
6:symbol 11:RadrootsKit 12:swift.method 69:s:11RadrootsKit0A23BackgroundTransferStoreP18removeAllSnapshotsyyYaKF 20:removeAllSnapshots() 38:func removeAllSnapshots() async throws
6:symbol 11:RadrootsKit 12:swift.method 69:s:11RadrootsKit0A24AppleKeychainSecureStoreC8containsySbAA0aeF3KeyVKF 12:contains(_:) 59:func contains(_ key: RadrootsSecureStoreKey) throws -> Bool
@@ -2194,8 +2238,10 @@ radroots.apple-kit.public-api.v1
6:symbol 11:RadrootsKit 12:swift.method 75:s:11RadrootsKit0A23BackgroundTaskSchedulerP6cancelyyAA0acD10IdentifierVYaKF 10:cancel(_:) 72:func cancel(_ identifier: RadrootsBackgroundTaskIdentifier) async throws
6:symbol 11:RadrootsKit 12:swift.method 75:s:11RadrootsKit0A24TelemetryRedactionPolicyV14redactedString_3keyS2S_SSSgtF 22:redactedString(_:key:) 66:func redactedString(_ value: String, key: String? = nil) -> String
6:symbol 11:RadrootsKit 12:swift.method 76:s:11RadrootsKit0A15IdentityCustodyC06createC05labelAA0aC8SnapshotVSSSg_tYaKF 22:createIdentity(label:) 101:@discardableResult func createIdentity(label: String? = nil) async throws -> RadrootsIdentitySnapshot
+6:symbol 11:RadrootsKit 12:swift.method 76:s:11RadrootsKit0A20AppleFileMaintenanceV07reserveE0AA0adE11ReservationCSgyKF 20:reserveMaintenance() 71:func reserveMaintenance() throws -> RadrootsFileMaintenanceReservation?
6:symbol 11:RadrootsKit 12:swift.method 76:s:11RadrootsKit0A27AppleVerifiedArtifactAccessV10revalidateySbAA0adE4FileVKF 14:revalidate(_:) 72:func revalidate(_ artifact: RadrootsVerifiedArtifactFile) throws -> Bool
6:symbol 11:RadrootsKit 12:swift.method 77:s:11RadrootsKit0A11SecureStorePAAE3put_3fory10Foundation4DataV_AA0acD3KeyVtKF 11:put(_:for:) 63:func put(_ value: Data, for key: RadrootsSecureStoreKey) throws
+6:symbol 11:RadrootsKit 12:swift.method 77:s:11RadrootsKit0A20AppleFileMaintenanceV10reserveUseAA0adG11ReservationCSgyKF 12:reserveUse() 55:func reserveUse() throws -> RadrootsFileUseReservation?
6:symbol 11:RadrootsKit 12:swift.method 77:s:11RadrootsKit0A28AppleBackgroundTransferStoreC12saveSnapshotyyAA0adeH0VYaKF 16:saveSnapshot(_:) 78:func saveSnapshot(_ snapshot: RadrootsBackgroundTransferSnapshot) async throws
6:symbol 11:RadrootsKit 12:swift.method 78:s:11RadrootsKit0A15AppleFileAccessC21releasePreparedExportyyAA0agH8DocumentVKF 25:releasePreparedExport(_:) 83:func releasePreparedExport(_ preparedExport: RadrootsPreparedExportDocument) throws
6:symbol 11:RadrootsKit 12:swift.method 78:s:11RadrootsKit0A17AppleUserPresenceC6verifyyAA0adE6ResultVAA0adE7RequestVYaKF 10:verify(_:) 94:func verify(_ request: RadrootsUserPresenceRequest) async throws -> RadrootsUserPresenceResult
@@ -2250,6 +2296,7 @@ radroots.apple-kit.public-api.v1
6:symbol 11:RadrootsKit 12:swift.method 92:s:11RadrootsKit0A15AppleFileAccessC13prepareExportyAA0a8PreparedG8DocumentVAA0agI7RequestVKF 17:prepareExport(_:) 120:@discardableResult func prepareExport(_ request: RadrootsExportDocumentRequest) throws -> RadrootsPreparedExportDocument
6:symbol 11:RadrootsKit 12:swift.method 93:s:11RadrootsKit0A21AppleLocationServicesC07currentD0yAA0a7CurrentD6ResultVAA0agD7RequestVYaKF 19:currentLocation(_:) 109:func currentLocation(_ request: RadrootsCurrentLocationRequest) async throws -> RadrootsCurrentLocationResult
6:symbol 11:RadrootsKit 12:swift.method 93:s:11RadrootsKit0A23BackgroundTransferStoreP17admissionIsActive3forSbAA0acD10IdentifierV_tYaKF 23:admissionIsActive(for:) 97:func admissionIsActive(for identifier: RadrootsBackgroundTransferIdentifier) async throws -> Bool
+6:symbol 11:RadrootsKit 12:swift.method 93:s:11RadrootsKit0A26FileMaintenanceReservationC13openDirectory12relativePathAA0acD4ScanCSS_tKF 28:openDirectory(relativePath:) 83:func openDirectory(relativePath: String = "") throws -> RadrootsFileMaintenanceScan
6:symbol 11:RadrootsKit 12:swift.method 93:s:11RadrootsKit0A30BackgroundTransferFileResolverP7resolvey10Foundation3URLVAA0acd5LocalE0OKF 11:resolve(_:) 71:func resolve(_ file: RadrootsBackgroundTransferLocalFile) throws -> URL
6:symbol 11:RadrootsKit 12:swift.method 93:s:11RadrootsKit0A34UnavailableBackgroundTaskSchedulerV12pendingTasksSayAA0adE8SnapshotVGyYaKF 14:pendingTasks() 68:func pendingTasks() async throws -> [RadrootsBackgroundTaskSnapshot]
6:symbol 11:RadrootsKit 12:swift.method 94:s:11RadrootsKit0A18BackgroundTransferP8snapshot3forAA0acD8SnapshotVSgAA0acD10IdentifierV_tYaKF 14:snapshot(for:) 119:func snapshot(for identifier: RadrootsBackgroundTransferIdentifier) async throws -> RadrootsBackgroundTransferSnapshot?
@@ -2295,11 +2342,14 @@ radroots.apple-kit.public-api.v1
6:symbol 11:RadrootsKit 12:swift.struct 38:s:11RadrootsKit0A18UserPresenceResultV 26:RadrootsUserPresenceResult 33:struct RadrootsUserPresenceResult
6:symbol 11:RadrootsKit 12:swift.struct 38:s:11RadrootsKit0A18UserPresenceStatusV 26:RadrootsUserPresenceStatus 33:struct RadrootsUserPresenceStatus
6:symbol 11:RadrootsKit 12:swift.struct 39:s:11RadrootsKit0A19DocumentScanRequestV 27:RadrootsDocumentScanRequest 34:struct RadrootsDocumentScanRequest
+6:symbol 11:RadrootsKit 12:swift.struct 39:s:11RadrootsKit0A19FileMaintenancePageV 27:RadrootsFileMaintenancePage 34:struct RadrootsFileMaintenancePage
6:symbol 11:RadrootsKit 12:swift.struct 39:s:11RadrootsKit0A19MediaCaptureRequestV 27:RadrootsMediaCaptureRequest 34:struct RadrootsMediaCaptureRequest
6:symbol 11:RadrootsKit 12:swift.struct 39:s:11RadrootsKit0A19StagedBlobReferenceV 27:RadrootsStagedBlobReference 34:struct RadrootsStagedBlobReference
6:symbol 11:RadrootsKit 12:swift.struct 39:s:11RadrootsKit0A19UserPresenceRequestV 27:RadrootsUserPresenceRequest 34:struct RadrootsUserPresenceRequest
+6:symbol 11:RadrootsKit 12:swift.struct 40:s:11RadrootsKit0A20AppleFileMaintenanceV 28:RadrootsAppleFileMaintenance 35:struct RadrootsAppleFileMaintenance
6:symbol 11:RadrootsKit 12:swift.struct 40:s:11RadrootsKit0A20DocumentImportResultV 28:RadrootsDocumentImportResult 35:struct RadrootsDocumentImportResult
6:symbol 11:RadrootsKit 12:swift.struct 40:s:11RadrootsKit0A20ExportDocumentResultV 28:RadrootsExportDocumentResult 35:struct RadrootsExportDocumentResult
+6:symbol 11:RadrootsKit 12:swift.struct 40:s:11RadrootsKit0A20FileMaintenanceEntryV 28:RadrootsFileMaintenanceEntry 35:struct RadrootsFileMaintenanceEntry
6:symbol 11:RadrootsKit 12:swift.struct 40:s:11RadrootsKit0A20IdentityPublicRecordV 28:RadrootsIdentityPublicRecord 35:struct RadrootsIdentityPublicRecord
6:symbol 11:RadrootsKit 12:swift.struct 40:s:11RadrootsKit0A20VerifiedArtifactFileV 28:RadrootsVerifiedArtifactFile 35:struct RadrootsVerifiedArtifactFile
6:symbol 11:RadrootsKit 12:swift.struct 41:s:11RadrootsKit0A21BackgroundTaskRequestV 29:RadrootsBackgroundTaskRequest 36:struct RadrootsBackgroundTaskRequest
@@ -2375,6 +2425,7 @@ radroots.apple-kit.public-api.v1
6:symbol 11:RadrootsKit 14:swift.property 48:s:11RadrootsKit0A17ShareTransferItemV4textSSSgvp 4:text 25:var text: String? { get }
6:symbol 11:RadrootsKit 14:swift.property 49:s:11RadrootsKit0A15ScannedDocumentV9mediaTypeSSvp 9:mediaType 21:let mediaType: String
6:symbol 11:RadrootsKit 14:swift.property 49:s:11RadrootsKit0A18ApplePreparedImageV6sha256SSvp 6:sha256 18:let sha256: String
+6:symbol 11:RadrootsKit 14:swift.property 49:s:11RadrootsKit0A20FileMaintenanceEntryV4nameSSvp 4:name 16:let name: String
6:symbol 11:RadrootsKit 14:swift.property 49:s:11RadrootsKit0A20IdentityCustodyErrorO4codeSSvp 4:code 24:var code: String { get }
6:symbol 11:RadrootsKit 14:swift.property 50:s:11RadrootsKit0A19StagedBlobReferenceV6blobIDSSvp 6:blobID 18:let blobID: String
6:symbol 11:RadrootsKit 14:swift.property 50:s:11RadrootsKit0A19UserPresenceRequestV6reasonSSvp 6:reason 18:let reason: String
@@ -2405,8 +2456,10 @@ radroots.apple-kit.public-api.v1
6:symbol 11:RadrootsKit 14:swift.property 55:s:11RadrootsKit0A17OpaqueSignRequestV12signerHandleSSvp 12:signerHandle 24:let signerHandle: String
6:symbol 11:RadrootsKit 14:swift.property 55:s:11RadrootsKit0A17ShareTransferItemV12transferTextSSvp 12:transferText 32:var transferText: String { get }
6:symbol 11:RadrootsKit 14:swift.property 55:s:11RadrootsKit0A18ApplePreparedImageV5widths6UInt32Vvp 5:width 17:let width: UInt32
+6:symbol 11:RadrootsKit 14:swift.property 55:s:11RadrootsKit0A19FileMaintenancePageV10reachedEndSbvp 10:reachedEnd 20:let reachedEnd: Bool
6:symbol 11:RadrootsKit 14:swift.property 55:s:11RadrootsKit0A19StagedBlobReferenceV9mediaTypeSSSgvp 9:mediaType 22:let mediaType: String?
6:symbol 11:RadrootsKit 14:swift.property 55:s:11RadrootsKit0A19TelemetryFieldValueO08renderedE0SSvp 13:renderedValue 33:var renderedValue: String { get }
+6:symbol 11:RadrootsKit 14:swift.property 55:s:11RadrootsKit0A20FileMaintenanceEntryV4kindAC4KindOvp 4:kind 43:let kind: RadrootsFileMaintenanceEntry.Kind
6:symbol 11:RadrootsKit 14:swift.property 56:s:11RadrootsKit0A10MediaAssetV11pixelHeights6UInt32VSgvp 11:pixelHeight 24:let pixelHeight: UInt32?
6:symbol 11:RadrootsKit 14:swift.property 56:s:11RadrootsKit0A15AppleFileAccessC5rootsAA0acD5RootsVvp 5:roots 33:let roots: RadrootsAppleFileRoots
6:symbol 11:RadrootsKit 14:swift.property 56:s:11RadrootsKit0A15LocationReadingV13courseDegreesSdSgvp 13:courseDegrees 26:let courseDegrees: Double?
@@ -2444,12 +2497,14 @@ radroots.apple-kit.public-api.v1
6:symbol 11:RadrootsKit 14:swift.property 59:s:11RadrootsKit0A17OpaqueSignRequestV16debugDescriptionSSvp 16:debugDescription 36:var debugDescription: String { get }
6:symbol 11:RadrootsKit 14:swift.property 59:s:11RadrootsKit0A18MediaPickerSupportV15importAvailableSbvp 15:importAvailable 25:let importAvailable: Bool
6:symbol 11:RadrootsKit 14:swift.property 59:s:11RadrootsKit0A18SecretAccessPolicyV15deviceLocalOnlySbvp 15:deviceLocalOnly 25:let deviceLocalOnly: Bool
+6:symbol 11:RadrootsKit 14:swift.property 59:s:11RadrootsKit0A19FileMaintenancePageV14scannedEntriesSivp 14:scannedEntries 23:let scannedEntries: Int
6:symbol 11:RadrootsKit 14:swift.property 59:s:11RadrootsKit0A19MediaCaptureRequestV9mediaKindAA0acG0Ovp 9:mediaKind 32:let mediaKind: RadrootsMediaKind
6:symbol 11:RadrootsKit 14:swift.property 59:s:11RadrootsKit0A19StagedBlobReferenceV12filenameHintSSSgvp 12:filenameHint 25:let filenameHint: String?
6:symbol 11:RadrootsKit 14:swift.property 59:s:11RadrootsKit0A28BackgroundDownloadedArtifactV6sha256SSvp 6:sha256 18:let sha256: String
6:symbol 11:RadrootsKit 14:swift.property 60:s:11RadrootsKit0A18ApplePreparedImageV16debugDescriptionSSvp 16:debugDescription 36:var debugDescription: String { get }
6:symbol 11:RadrootsKit 14:swift.property 60:s:11RadrootsKit0A18IdentityPassphraseV16debugDescriptionSSvp 16:debugDescription 36:var debugDescription: String { get }
6:symbol 11:RadrootsKit 14:swift.property 60:s:11RadrootsKit0A18PermissionSnapshotV6statusAA0aC6StatusOvp 6:status 36:let status: RadrootsPermissionStatus
+6:symbol 11:RadrootsKit 14:swift.property 60:s:11RadrootsKit0A20FileMaintenanceEntryV9sizeBytess5Int64Vvp 9:sizeBytes 20:let sizeBytes: Int64
6:symbol 11:RadrootsKit 14:swift.property 60:s:11RadrootsKit0A20IdentityPublicRecordV14identityHandleSSvp 14:identityHandle 26:let identityHandle: String
6:symbol 11:RadrootsKit 14:swift.property 60:s:11RadrootsKit0A21BackgroundTaskRequestV4kindAA0acD4KindOvp 4:kind 36:let kind: RadrootsBackgroundTaskKind
6:symbol 11:RadrootsKit 14:swift.property 60:s:11RadrootsKit0A22AdmissionCleanupResultV12removedFilesSivp 12:removedFiles 21:let removedFiles: Int
@@ -2518,6 +2573,7 @@ radroots.apple-kit.public-api.v1
6:symbol 11:RadrootsKit 14:swift.property 65:s:11RadrootsKit0A26VerifiedArtifactDescriptorV13fileExtensionSSvp 13:fileExtension 25:let fileExtension: String
6:symbol 11:RadrootsKit 14:swift.property 66:s:11RadrootsKit0A14TelemetryEventV10occurredAt10Foundation4DateVvp 10:occurredAt 20:let occurredAt: Date
6:symbol 11:RadrootsKit 14:swift.property 66:s:11RadrootsKit0A18MediaPickerSupportV22cameraCaptureAvailableSbvp 22:cameraCaptureAvailable 32:let cameraCaptureAvailable: Bool
+6:symbol 11:RadrootsKit 14:swift.property 66:s:11RadrootsKit0A19FileMaintenancePageV7entriesSayAA0acD5EntryVGvp 7:entries 43:let entries: [RadrootsFileMaintenanceEntry]
6:symbol 11:RadrootsKit 14:swift.property 66:s:11RadrootsKit0A22DocumentScannerSupportV18multiPageSupportedSbvp 18:multiPageSupported 28:let multiPageSupported: Bool
6:symbol 11:RadrootsKit 14:swift.property 66:s:11RadrootsKit0A24BackgroundTransferHandleV16debugDescriptionSSvp 16:debugDescription 36:var debugDescription: String { get }
6:symbol 11:RadrootsKit 14:swift.property 66:s:11RadrootsKit0A26VerifiedArtifactDescriptorV8byteSizes6UInt64Vvp 8:byteSize 20:let byteSize: UInt64
@@ -2569,6 +2625,7 @@ radroots.apple-kit.public-api.v1
6:symbol 11:RadrootsKit 14:swift.property 71:s:11RadrootsKit0A28LocationServicesAvailabilityV08locationD7EnabledSbvp 23:locationServicesEnabled 33:let locationServicesEnabled: Bool
6:symbol 11:RadrootsKit 14:swift.property 72:s:11RadrootsKit0A15ScannedDocumentV10outputKindAA0ad13ScannerOutputF0Ovp 10:outputKind 49:let outputKind: RadrootsDocumentScannerOutputKind
6:symbol 11:RadrootsKit 14:swift.property 72:s:11RadrootsKit0A20DocumentImportResultV9documentsSayAA0a8ImportedC0VGvp 9:documents 41:let documents: [RadrootsImportedDocument]
+6:symbol 11:RadrootsKit 14:swift.property 72:s:11RadrootsKit0A20FileMaintenanceEntryV10modifiedAt10Foundation4DateVvp 10:modifiedAt 20:let modifiedAt: Date
6:symbol 11:RadrootsKit 14:swift.property 72:s:11RadrootsKit0A22DocumentScannerSupportV24interactiveScanAvailableSbvp 24:interactiveScanAvailable 34:let interactiveScanAvailable: Bool
6:symbol 11:RadrootsKit 14:swift.property 72:s:11RadrootsKit0A25BackgroundTransferRequestV07maximumD5Bytess6UInt64Vvp 20:maximumTransferBytes 32:let maximumTransferBytes: UInt64
6:symbol 11:RadrootsKit 14:swift.property 72:s:11RadrootsKit0A26BackgroundTransferSnapshotV20possibleRemoteOrphanSbvp 20:possibleRemoteOrphan 30:let possibleRemoteOrphan: Bool
@@ -2754,6 +2811,7 @@ radroots.apple-kit.public-api.v1
6:symbol 11:RadrootsKit 15:swift.enum.case 58:s:11RadrootsKit0A17UserPresenceErrorO13userCancelledyA2CmF 39:RadrootsUserPresenceError.userCancelled 18:case userCancelled
6:symbol 11:RadrootsKit 15:swift.enum.case 58:s:11RadrootsKit0A19BackgroundTaskErrorO11unavailableyA2CmF 39:RadrootsBackgroundTaskError.unavailable 16:case unavailable
6:symbol 11:RadrootsKit 15:swift.enum.case 58:s:11RadrootsKit0A19ExternalActionErrorO11unavailableyA2CmF 39:RadrootsExternalActionError.unavailable 16:case unavailable
+6:symbol 11:RadrootsKit 15:swift.enum.case 58:s:11RadrootsKit0A20FileMaintenanceEntryV4KindO5otheryA2EmF 39:RadrootsFileMaintenanceEntry.Kind.other 10:case other
6:symbol 11:RadrootsKit 15:swift.enum.case 59:s:11RadrootsKit0A17UserPresenceErrorO14invalidRequestyA2CmF 40:RadrootsUserPresenceError.invalidRequest 19:case invalidRequest
6:symbol 11:RadrootsKit 15:swift.enum.case 59:s:11RadrootsKit0A18AppleSecurityErrorO13userCancelledyA2CmF 40:RadrootsAppleSecurityError.userCancelled 18:case userCancelled
6:symbol 11:RadrootsKit 15:swift.enum.case 59:s:11RadrootsKit0A18CaptureIntakeErrorO13userCancelledyA2CmF 40:RadrootsCaptureIntakeError.userCancelled 18:case userCancelled
@@ -2786,6 +2844,7 @@ radroots.apple-kit.public-api.v1
6:symbol 11:RadrootsKit 15:swift.enum.case 62:s:11RadrootsKit0A18CaptureIntakeErrorO16permissionDeniedyA2CmF 43:RadrootsCaptureIntakeError.permissionDenied 21:case permissionDenied
6:symbol 11:RadrootsKit 15:swift.enum.case 62:s:11RadrootsKit0A18CaptureIntakeErrorO16transientFailureyA2CmF 43:RadrootsCaptureIntakeError.transientFailure 21:case transientFailure
6:symbol 11:RadrootsKit 15:swift.enum.case 62:s:11RadrootsKit0A19ExternalActionErrorO15blockedByPolicyyA2CmF 43:RadrootsExternalActionError.blockedByPolicy 20:case blockedByPolicy
+6:symbol 11:RadrootsKit 15:swift.enum.case 62:s:11RadrootsKit0A20FileMaintenanceEntryV4KindO9directoryyA2EmF 43:RadrootsFileMaintenanceEntry.Kind.directory 14:case directory
6:symbol 11:RadrootsKit 15:swift.enum.case 62:s:11RadrootsKit0A20IdentityCustodyErrorO14identityLockedyA2CmF 43:RadrootsIdentityCustodyError.identityLocked 19:case identityLocked
6:symbol 11:RadrootsKit 15:swift.enum.case 62:s:11RadrootsKit0A20IdentityMetadataSlotO011quarantinedD0yA2CmF 48:RadrootsIdentityMetadataSlot.quarantinedMetadata 24:case quarantinedMetadata
6:symbol 11:RadrootsKit 15:swift.enum.case 62:s:11RadrootsKit0A21LocationAuthorizationO13notDeterminedyA2CmF 43:RadrootsLocationAuthorization.notDetermined 18:case notDetermined
@@ -2797,6 +2856,7 @@ radroots.apple-kit.public-api.v1
6:symbol 11:RadrootsKit 15:swift.enum.case 63:s:11RadrootsKit0A19SecretAccessibilityO16afterFirstUnlockyA2CmF 44:RadrootsSecretAccessibility.afterFirstUnlock 21:case afterFirstUnlock
6:symbol 11:RadrootsKit 15:swift.enum.case 63:s:11RadrootsKit0A19TelemetryFieldValueO7integeryACs5Int64VcACmF 39:RadrootsTelemetryFieldValue.integer(_:) 19:case integer(Int64)
6:symbol 11:RadrootsKit 15:swift.enum.case 63:s:11RadrootsKit0A19UserPresenceSupportO16deviceCredentialyA2CmF 44:RadrootsUserPresenceSupport.deviceCredential 21:case deviceCredential
+6:symbol 11:RadrootsKit 15:swift.enum.case 63:s:11RadrootsKit0A20FileMaintenanceEntryV4KindO07regularC0yA2EmF 45:RadrootsFileMaintenanceEntry.Kind.regularFile 16:case regularFile
6:symbol 11:RadrootsKit 15:swift.enum.case 63:s:11RadrootsKit0A20IdentityCustodyErrorO15corruptMetadatayA2CmF 44:RadrootsIdentityCustodyError.corruptMetadata 20:case corruptMetadata
6:symbol 11:RadrootsKit 15:swift.enum.case 63:s:11RadrootsKit0A20IdentityCustodyErrorO15invalidMetadatayA2CmF 44:RadrootsIdentityCustodyError.invalidMetadata 20:case invalidMetadata
6:symbol 11:RadrootsKit 15:swift.enum.case 63:s:11RadrootsKit0A21LocationServicesErrorO14invalidRequestyA2CmF 44:RadrootsLocationServicesError.invalidRequest 19:case invalidRequest