The Swift Package Index logo.Swift Package Index

Build Information

Failed to build OpenImmersive, reference 1.6.3 (670e0b), with Swift 6.4 for iOS using Xcode 27.0 on 9 Oct 2026 06:35:28 UTC.

Build Command

env DEVELOPER_DIR=/Applications/Xcode-27.0.0-Release.Candidate.app xcrun xcodebuild -IDEClonedSourcePackagesDirPathOverride=$PWD/.dependencies -skipMacroValidation -skipPackagePluginValidation -derivedDataPath $PWD/.derivedData build -scheme OpenImmersive -destination generic/platform=iOS

Build Log

    |              `- note: add '@available' attribute to enclosing actor
 12 |     /// Errors specific to Playlist Writer
 13 |     public enum PlaylistWriterError: Error {
    :
135 |     /// - Parameters:
136 |     ///   - lines: the lines of the playlist file.
137 |     private func makeURLsAbsolute(_ lines: inout [String]) throws {
    |                  `- note: add '@available' attribute to enclosing instance method
138 |         //TODO: throw an error if?
139 |
140 |         let uriSearch = /URI="(?<url>[^"]+)"/
    |                         |- error: 'Regex' is only available in iOS 16.0 or newer
    |                         `- note: add 'if #available' version check
141 |
142 |         for (index, line) in lines.enumerated() {
/Users/admin/builder/spi-builder-workspace/Sources/Utils/PlaylistWriter.swift:151:41: error: 'firstMatch(in:)' is only available in iOS 16.0 or newer
  9 |
 10 | /// Maintains a local m3u8 playlist and outputs a filtered version of it to enable user selection of audio and video variants.
 11 | public actor PlaylistWriter {
    |              `- note: add '@available' attribute to enclosing actor
 12 |     /// Errors specific to Playlist Writer
 13 |     public enum PlaylistWriterError: Error {
    :
135 |     /// - Parameters:
136 |     ///   - lines: the lines of the playlist file.
137 |     private func makeURLsAbsolute(_ lines: inout [String]) throws {
    |                  `- note: add '@available' attribute to enclosing instance method
138 |         //TODO: throw an error if?
139 |
    :
149 |
150 |             // Make URLs absolute for others (audio, subtitles, etc.)
151 |             if let uri = try? uriSearch.firstMatch(in: line) {
    |                                         |- error: 'firstMatch(in:)' is only available in iOS 16.0 or newer
    |                                         `- note: add 'if #available' version check
152 |                 let string = String(uri.url)
153 |                 lines[index] = line.replacingOccurrences(of: string, with: absoluteURL(from: string).absoluteString)
/Users/admin/builder/spi-builder-workspace/Sources/Utils/PlaylistWriter.swift:152:37: error: 'subscript(dynamicMember:)' is only available in iOS 16.0 or newer
  9 |
 10 | /// Maintains a local m3u8 playlist and outputs a filtered version of it to enable user selection of audio and video variants.
 11 | public actor PlaylistWriter {
    |              `- note: add '@available' attribute to enclosing actor
 12 |     /// Errors specific to Playlist Writer
 13 |     public enum PlaylistWriterError: Error {
    :
135 |     /// - Parameters:
136 |     ///   - lines: the lines of the playlist file.
137 |     private func makeURLsAbsolute(_ lines: inout [String]) throws {
    |                  `- note: add '@available' attribute to enclosing instance method
138 |         //TODO: throw an error if?
139 |
    :
150 |             // Make URLs absolute for others (audio, subtitles, etc.)
151 |             if let uri = try? uriSearch.firstMatch(in: line) {
152 |                 let string = String(uri.url)
    |                                     |- error: 'subscript(dynamicMember:)' is only available in iOS 16.0 or newer
    |                                     `- note: add 'if #available' version check
153 |                 lines[index] = line.replacingOccurrences(of: string, with: absoluteURL(from: string).absoluteString)
154 |             }
/Users/admin/builder/spi-builder-workspace/Sources/Utils/PlaylistWriter.swift:164:47: error: 'host(percentEncoded:)' is only available in iOS 16.0 or newer
  9 |
 10 | /// Maintains a local m3u8 playlist and outputs a filtered version of it to enable user selection of audio and video variants.
 11 | public actor PlaylistWriter {
    |              `- note: add '@available' attribute to enclosing actor
 12 |     /// Errors specific to Playlist Writer
 13 |     public enum PlaylistWriterError: Error {
    :
160 |     ///   - string: the input string, which is assumed to be an absolute URL or a relative path.
161 |     /// - Returns: a URL object to an absolute URL that's either the input string (if already absolute) or the path appended to the base URL otherwise.
162 |     private func absoluteURL(from string: String) -> URL {
    |                  `- note: add '@available' attribute to enclosing instance method
163 |         // testing for host() ensures that the URL is absolute
164 |         if let url = URL(string: string), url.host() != nil {
    |                                               |- error: 'host(percentEncoded:)' is only available in iOS 16.0 or newer
    |                                               `- note: add 'if #available' version check
165 |             url
166 |         } else {
SwiftEmitModule normal arm64 Emitting\ module\ for\ OpenImmersive (in target 'OpenImmersive' from project 'OpenImmersive')
/Users/admin/builder/spi-builder-workspace/Sources/Controllers/HeadTracker.swift:36:27: error: cannot find 'ARKitSession' in scope
34 |     }
35 |
36 |     private let session = ARKitSession()
   |                           `- error: cannot find 'ARKitSession' in scope
37 |     private let worldTracking = WorldTrackingProvider()
38 |     private var subscription: EventSubscription?
/Users/admin/builder/spi-builder-workspace/Sources/Controllers/HeadTracker.swift:37:33: error: cannot find 'WorldTrackingProvider' in scope
35 |
36 |     private let session = ARKitSession()
37 |     private let worldTracking = WorldTrackingProvider()
   |                                 `- error: cannot find 'WorldTrackingProvider' in scope
38 |     private var subscription: EventSubscription?
39 |
/Users/admin/builder/spi-builder-workspace/Sources/Controllers/HeadTracker.swift:38:31: error: 'EventSubscription' is only available in iOS 18.0 or newer
11 |
12 | /// Provides a convenience interface to obtain head pose transforms and subscribing a closure to handle pose update events.
13 | public class HeadTracker {
   |              `- note: add '@available' attribute to enclosing class
14 |     public enum State {
15 |         /// Head tracking is stopped.
   :
36 |     private let session = ARKitSession()
37 |     private let worldTracking = WorldTrackingProvider()
38 |     private var subscription: EventSubscription?
   |                               `- error: 'EventSubscription' is only available in iOS 18.0 or newer
39 |
40 |     /// Starts head tracking by starting the underlying `ARKitSession` and subscribes to pose update events.
/Users/admin/builder/spi-builder-workspace/Sources/Controllers/HeadTracker.swift:44:32: error: cannot find type 'RealityViewContent' in scope
42 |     ///   - content: The `RealityViewContent` provided by the `RealityView`'s `body` closure.
43 |     ///   - handler: A closure that runs when the head pose update occurs.
44 |     public func start(content: RealityViewContent, _ handler: @escaping (SceneEvents.Update) -> Void) {
   |                                `- error: cannot find type 'RealityViewContent' in scope
45 |         guard state == .stopped else { return }
46 |         state = .starting
/Users/admin/builder/spi-builder-workspace/Sources/Controllers/VideoPlayer.swift:13:2: error: 'Observable()' is only available in iOS 17.0 or newer
 11 |
 12 | /// Video Player Controller interfacing the underlying `AVPlayer`, exposing states and controls to the UI.
 13 | @Observable
    |  `- error: 'Observable()' is only available in iOS 17.0 or newer
 14 | public class VideoPlayer: Sendable {
 15 |     //MARK: Video Player and Video Renderer
macro expansion @Observable:1:2: error: 'ObservationTracked()' is only available in iOS 17.0 or newer
`- /Users/admin/builder/spi-builder-workspace/Sources/Controllers/VideoPlayer.swift:19:5: note: expanded code originates here
 11 |
 12 | /// Video Player Controller interfacing the underlying `AVPlayer`, exposing states and controls to the UI.
 13 | @Observable
    | `- note: in expansion of macro 'Observable' on property 'injector' here
 14 | public class VideoPlayer: Sendable {
    |              `- note: add '@available' attribute to enclosing class
 15 |     //MARK: Video Player and Video Renderer
 16 |     /// The video player.
 17 |     public let player = AVPlayer()
 18 |     /// The APMP tag injector used in video streams that are frame-packed side by side or over under.
 19 |     private var injector: APMPInjector?
    +--- macro expansion @Observable -----------------------------------
    |1 | @ObservationTracked
    |  |  `- error: 'ObservationTracked()' is only available in iOS 17.0 or newer
    +-------------------------------------------------------------------
 20 |     /// The video renderer to use for media that are frame-packed side by side or over under.
 21 |     public var renderer: AVSampleBufferVideoRenderer? {
macro expansion @Observable:1:2: error: 'ObservationTracked()' is only available in iOS 17.0 or newer
`- /Users/admin/builder/spi-builder-workspace/Sources/Controllers/VideoPlayer.swift:27:5: note: expanded code originates here
 11 |
 12 | /// Video Player Controller interfacing the underlying `AVPlayer`, exposing states and controls to the UI.
 13 | @Observable
    | `- note: in expansion of macro 'Observable' on property 'title' here
 14 | public class VideoPlayer: Sendable {
    |              `- note: add '@available' attribute to enclosing class
 15 |     //MARK: Video Player and Video Renderer
 16 |     /// The video player.
    :
 25 |     //MARK: Variables accessible to the UI
 26 |     /// The title of the current video (empty string if none).
 27 |     private(set) public var title: String = ""
    +--- macro expansion @Observable -----------------------------------
    |1 | @ObservationTracked
    |  |  `- error: 'ObservationTracked()' is only available in iOS 17.0 or newer
    +-------------------------------------------------------------------
 28 |     /// A short description of the current video, displayed under the title (empty string if none).
 29 |     private(set) public var description: String = ""
macro expansion @Observable:1:2: error: 'ObservationTracked()' is only available in iOS 17.0 or newer
`- /Users/admin/builder/spi-builder-workspace/Sources/Controllers/VideoPlayer.swift:29:5: note: expanded code originates here
 11 |
 12 | /// Video Player Controller interfacing the underlying `AVPlayer`, exposing states and controls to the UI.
 13 | @Observable
    | `- note: in expansion of macro 'Observable' on property 'description' here
 14 | public class VideoPlayer: Sendable {
    |              `- note: add '@available' attribute to enclosing class
 15 |     //MARK: Video Player and Video Renderer
 16 |     /// The video player.
    :
 27 |     private(set) public var title: String = ""
 28 |     /// A short description of the current video, displayed under the title (empty string if none).
 29 |     private(set) public var description: String = ""
    +--- macro expansion @Observable -----------------------------------
    |1 | @ObservationTracked
    |  |  `- error: 'ObservationTracked()' is only available in iOS 17.0 or newer
    +-------------------------------------------------------------------
 30 |     /// The url of the current video.
 31 |     private(set) public var url: URL?
macro expansion @Observable:1:2: error: 'ObservationTracked()' is only available in iOS 17.0 or newer
`- /Users/admin/builder/spi-builder-workspace/Sources/Controllers/VideoPlayer.swift:31:5: note: expanded code originates here
 11 |
 12 | /// Video Player Controller interfacing the underlying `AVPlayer`, exposing states and controls to the UI.
 13 | @Observable
    | `- note: in expansion of macro 'Observable' on property 'url' here
 14 | public class VideoPlayer: Sendable {
    |              `- note: add '@available' attribute to enclosing class
 15 |     //MARK: Video Player and Video Renderer
 16 |     /// The video player.
    :
 29 |     private(set) public var description: String = ""
 30 |     /// The url of the current video.
 31 |     private(set) public var url: URL?
    +--- macro expansion @Observable -----------------------------------
    |1 | @ObservationTracked
    |  |  `- error: 'ObservationTracked()' is only available in iOS 17.0 or newer
    +-------------------------------------------------------------------
 32 |     /// The AVFoundation metadata of the current video.
 33 |     private(set) public var metadata: [AVMetadataIdentifier: String] = [:]
macro expansion @Observable:1:2: error: 'ObservationTracked()' is only available in iOS 17.0 or newer
`- /Users/admin/builder/spi-builder-workspace/Sources/Controllers/VideoPlayer.swift:33:5: note: expanded code originates here
 11 |
 12 | /// Video Player Controller interfacing the underlying `AVPlayer`, exposing states and controls to the UI.
 13 | @Observable
    | `- note: in expansion of macro 'Observable' on property 'metadata' here
 14 | public class VideoPlayer: Sendable {
    |              `- note: add '@available' attribute to enclosing class
 15 |     //MARK: Video Player and Video Renderer
 16 |     /// The video player.
    :
 31 |     private(set) public var url: URL?
 32 |     /// The AVFoundation metadata of the current video.
 33 |     private(set) public var metadata: [AVMetadataIdentifier: String] = [:]
    +--- macro expansion @Observable -----------------------------------
    |1 | @ObservationTracked
    |  |  `- error: 'ObservationTracked()' is only available in iOS 17.0 or newer
    +-------------------------------------------------------------------
 34 |     /// The frame packing type of the video media, if any.
 35 |     private(set) public var framePacking: VideoItem.FramePacking = .none
macro expansion @Observable:1:2: error: 'ObservationTracked()' is only available in iOS 17.0 or newer
`- /Users/admin/builder/spi-builder-workspace/Sources/Controllers/VideoPlayer.swift:35:5: note: expanded code originates here
 11 |
 12 | /// Video Player Controller interfacing the underlying `AVPlayer`, exposing states and controls to the UI.
 13 | @Observable
    | `- note: in expansion of macro 'Observable' on property 'framePacking' here
 14 | public class VideoPlayer: Sendable {
    |              `- note: add '@available' attribute to enclosing class
 15 |     //MARK: Video Player and Video Renderer
 16 |     /// The video player.
    :
 33 |     private(set) public var metadata: [AVMetadataIdentifier: String] = [:]
 34 |     /// The frame packing type of the video media, if any.
 35 |     private(set) public var framePacking: VideoItem.FramePacking = .none
    +--- macro expansion @Observable -----------------------------------
    |1 | @ObservationTracked
    |  |  `- error: 'ObservationTracked()' is only available in iOS 17.0 or newer
    +-------------------------------------------------------------------
 36 |     /// The projection type of the video media, defaults to VR180.
 37 |     private(set) public var projection: VideoItem.Projection = .equirectangular(fieldOfView: 180)
macro expansion @Observable:1:2: error: 'ObservationTracked()' is only available in iOS 17.0 or newer
`- /Users/admin/builder/spi-builder-workspace/Sources/Controllers/VideoPlayer.swift:37:5: note: expanded code originates here
 11 |
 12 | /// Video Player Controller interfacing the underlying `AVPlayer`, exposing states and controls to the UI.
 13 | @Observable
    | `- note: in expansion of macro 'Observable' on property 'projection' here
 14 | public class VideoPlayer: Sendable {
    |              `- note: add '@available' attribute to enclosing class
 15 |     //MARK: Video Player and Video Renderer
 16 |     /// The video player.
    :
 35 |     private(set) public var framePacking: VideoItem.FramePacking = .none
 36 |     /// The projection type of the video media, defaults to VR180.
 37 |     private(set) public var projection: VideoItem.Projection = .equirectangular(fieldOfView: 180)
    +--- macro expansion @Observable -----------------------------------
    |1 | @ObservationTracked
    |  |  `- error: 'ObservationTracked()' is only available in iOS 17.0 or newer
    +-------------------------------------------------------------------
 38 |     /// A playback error, if any.
 39 |     private(set) public var error: Error?
macro expansion @Observable:1:2: error: 'ObservationTracked()' is only available in iOS 17.0 or newer
`- /Users/admin/builder/spi-builder-workspace/Sources/Controllers/VideoPlayer.swift:39:5: note: expanded code originates here
 11 |
 12 | /// Video Player Controller interfacing the underlying `AVPlayer`, exposing states and controls to the UI.
 13 | @Observable
    | `- note: in expansion of macro 'Observable' on property 'error' here
 14 | public class VideoPlayer: Sendable {
    |              `- note: add '@available' attribute to enclosing class
 15 |     //MARK: Video Player and Video Renderer
 16 |     /// The video player.
    :
 37 |     private(set) public var projection: VideoItem.Projection = .equirectangular(fieldOfView: 180)
 38 |     /// A playback error, if any.
 39 |     private(set) public var error: Error?
    +--- macro expansion @Observable -----------------------------------
    |1 | @ObservationTracked
    |  |  `- error: 'ObservationTracked()' is only available in iOS 17.0 or newer
    +-------------------------------------------------------------------
 40 |     /// The duration in seconds of the current video (0 if none).
 41 |     private(set) public var duration: Double = 0
macro expansion @Observable:1:2: error: 'ObservationTracked()' is only available in iOS 17.0 or newer
`- /Users/admin/builder/spi-builder-workspace/Sources/Controllers/VideoPlayer.swift:41:5: note: expanded code originates here
 11 |
 12 | /// Video Player Controller interfacing the underlying `AVPlayer`, exposing states and controls to the UI.
 13 | @Observable
    | `- note: in expansion of macro 'Observable' on property 'duration' here
 14 | public class VideoPlayer: Sendable {
    |              `- note: add '@available' attribute to enclosing class
 15 |     //MARK: Video Player and Video Renderer
 16 |     /// The video player.
    :
 39 |     private(set) public var error: Error?
 40 |     /// The duration in seconds of the current video (0 if none).
 41 |     private(set) public var duration: Double = 0
    +--- macro expansion @Observable -----------------------------------
    |1 | @ObservationTracked
    |  |  `- error: 'ObservationTracked()' is only available in iOS 17.0 or newer
    +-------------------------------------------------------------------
 42 |     /// `true` if playback is currently paused, or if playback has completed.
 43 |     private(set) public var paused: Bool = false
macro expansion @Observable:1:2: error: 'ObservationTracked()' is only available in iOS 17.0 or newer
`- /Users/admin/builder/spi-builder-workspace/Sources/Controllers/VideoPlayer.swift:43:5: note: expanded code originates here
 11 |
 12 | /// Video Player Controller interfacing the underlying `AVPlayer`, exposing states and controls to the UI.
 13 | @Observable
    | `- note: in expansion of macro 'Observable' on property 'paused' here
 14 | public class VideoPlayer: Sendable {
    |              `- note: add '@available' attribute to enclosing class
 15 |     //MARK: Video Player and Video Renderer
 16 |     /// The video player.
    :
 41 |     private(set) public var duration: Double = 0
 42 |     /// `true` if playback is currently paused, or if playback has completed.
 43 |     private(set) public var paused: Bool = false
    +--- macro expansion @Observable -----------------------------------
    |1 | @ObservationTracked
    |  |  `- error: 'ObservationTracked()' is only available in iOS 17.0 or newer
    +-------------------------------------------------------------------
 44 |     /// `true` if playback is waiting to load the media.
 45 |     private(set) public var loading: Bool = false
macro expansion @Observable:1:2: error: 'ObservationTracked()' is only available in iOS 17.0 or newer
`- /Users/admin/builder/spi-builder-workspace/Sources/Controllers/VideoPlayer.swift:45:5: note: expanded code originates here
 11 |
 12 | /// Video Player Controller interfacing the underlying `AVPlayer`, exposing states and controls to the UI.
 13 | @Observable
    | `- note: in expansion of macro 'Observable' on property 'loading' here
 14 | public class VideoPlayer: Sendable {
    |              `- note: add '@available' attribute to enclosing class
 15 |     //MARK: Video Player and Video Renderer
 16 |     /// The video player.
    :
 43 |     private(set) public var paused: Bool = false
 44 |     /// `true` if playback is waiting to load the media.
 45 |     private(set) public var loading: Bool = false
    +--- macro expansion @Observable -----------------------------------
    |1 | @ObservationTracked
    |  |  `- error: 'ObservationTracked()' is only available in iOS 17.0 or newer
    +-------------------------------------------------------------------
 46 |     /// `true` if playback is temporarily interrupted due to buffering (HLS only).
 47 |     private(set) public var buffering: Bool = false
macro expansion @Observable:1:2: error: 'ObservationTracked()' is only available in iOS 17.0 or newer
`- /Users/admin/builder/spi-builder-workspace/Sources/Controllers/VideoPlayer.swift:47:5: note: expanded code originates here
 11 |
 12 | /// Video Player Controller interfacing the underlying `AVPlayer`, exposing states and controls to the UI.
 13 | @Observable
    | `- note: in expansion of macro 'Observable' on property 'buffering' here
 14 | public class VideoPlayer: Sendable {
    |              `- note: add '@available' attribute to enclosing class
 15 |     //MARK: Video Player and Video Renderer
 16 |     /// The video player.
    :
 45 |     private(set) public var loading: Bool = false
 46 |     /// `true` if playback is temporarily interrupted due to buffering (HLS only).
 47 |     private(set) public var buffering: Bool = false
    +--- macro expansion @Observable -----------------------------------
    |1 | @ObservationTracked
    |  |  `- error: 'ObservationTracked()' is only available in iOS 17.0 or newer
    +-------------------------------------------------------------------
 48 |     /// `true` if playback reached the end of the video and is no longer playing.
 49 |     private(set) public var hasReachedEnd: Bool = false
macro expansion @Observable:1:2: error: 'ObservationTracked()' is only available in iOS 17.0 or newer
`- /Users/admin/builder/spi-builder-workspace/Sources/Controllers/VideoPlayer.swift:49:5: note: expanded code originates here
 11 |
 12 | /// Video Player Controller interfacing the underlying `AVPlayer`, exposing states and controls to the UI.
 13 | @Observable
    | `- note: in expansion of macro 'Observable' on property 'hasReachedEnd' here
 14 | public class VideoPlayer: Sendable {
    |              `- note: add '@available' attribute to enclosing class
 15 |     //MARK: Video Player and Video Renderer
 16 |     /// The video player.
    :
 47 |     private(set) public var buffering: Bool = false
 48 |     /// `true` if playback reached the end of the video and is no longer playing.
 49 |     private(set) public var hasReachedEnd: Bool = false
    +--- macro expansion @Observable -----------------------------------
    |1 | @ObservationTracked
    |  |  `- error: 'ObservationTracked()' is only available in iOS 17.0 or newer
    +-------------------------------------------------------------------
 50 |     /// The callback to execute when playback reaches the end of the video.
 51 |     public var playbackEndedAction: CustomAction?
macro expansion @Observable:1:2: error: 'ObservationTracked()' is only available in iOS 17.0 or newer
`- /Users/admin/builder/spi-builder-workspace/Sources/Controllers/VideoPlayer.swift:51:5: note: expanded code originates here
 11 |
 12 | /// Video Player Controller interfacing the underlying `AVPlayer`, exposing states and controls to the UI.
 13 | @Observable
    | `- note: in expansion of macro 'Observable' on property 'playbackEndedAction' here
 14 | public class VideoPlayer: Sendable {
    |              `- note: add '@available' attribute to enclosing class
 15 |     //MARK: Video Player and Video Renderer
 16 |     /// The video player.
    :
 49 |     private(set) public var hasReachedEnd: Bool = false
 50 |     /// The callback to execute when playback reaches the end of the video.
 51 |     public var playbackEndedAction: CustomAction?
    +--- macro expansion @Observable -----------------------------------
    |1 | @ObservationTracked
    |  |  `- error: 'ObservationTracked()' is only available in iOS 17.0 or newer
    +-------------------------------------------------------------------
 52 |     /// The aspect ratio of the current media (width / height) (equirectangular projection only).
 53 |     private(set) public var aspectRatio: Float?
macro expansion @Observable:1:2: error: 'ObservationTracked()' is only available in iOS 17.0 or newer
`- /Users/admin/builder/spi-builder-workspace/Sources/Controllers/VideoPlayer.swift:53:5: note: expanded code originates here
 11 |
 12 | /// Video Player Controller interfacing the underlying `AVPlayer`, exposing states and controls to the UI.
 13 | @Observable
    | `- note: in expansion of macro 'Observable' on property 'aspectRatio' here
 14 | public class VideoPlayer: Sendable {
    |              `- note: add '@available' attribute to enclosing class
 15 |     //MARK: Video Player and Video Renderer
 16 |     /// The video player.
    :
 51 |     public var playbackEndedAction: CustomAction?
 52 |     /// The aspect ratio of the current media (width / height) (equirectangular projection only).
 53 |     private(set) public var aspectRatio: Float?
    +--- macro expansion @Observable -----------------------------------
    |1 | @ObservationTracked
    |  |  `- error: 'ObservationTracked()' is only available in iOS 17.0 or newer
    +-------------------------------------------------------------------
 54 |     /// The horizontal field of view for the current media (equirectangular projection only).
 55 |     private(set) public var horizontalFieldOfView: Float = 180.0
macro expansion @Observable:1:2: error: 'ObservationTracked()' is only available in iOS 17.0 or newer
`- /Users/admin/builder/spi-builder-workspace/Sources/Controllers/VideoPlayer.swift:55:5: note: expanded code originates here
 11 |
 12 | /// Video Player Controller interfacing the underlying `AVPlayer`, exposing states and controls to the UI.
 13 | @Observable
    | `- note: in expansion of macro 'Observable' on property 'horizontalFieldOfView' here
 14 | public class VideoPlayer: Sendable {
    |              `- note: add '@available' attribute to enclosing class
 15 |     //MARK: Video Player and Video Renderer
 16 |     /// The video player.
    :
 53 |     private(set) public var aspectRatio: Float?
 54 |     /// The horizontal field of view for the current media (equirectangular projection only).
 55 |     private(set) public var horizontalFieldOfView: Float = 180.0
    +--- macro expansion @Observable -----------------------------------
    |1 | @ObservationTracked
    |  |  `- error: 'ObservationTracked()' is only available in iOS 17.0 or newer
    +-------------------------------------------------------------------
 56 |     /// The vertical field of view for the current media (equirectangular projection only).
 57 |     public var verticalFieldOfView: Float {
macro expansion @Observable:1:2: error: 'ObservationTracked()' is only available in iOS 17.0 or newer
`- /Users/admin/builder/spi-builder-workspace/Sources/Controllers/VideoPlayer.swift:66:5: note: expanded code originates here
 11 |
 12 | /// Video Player Controller interfacing the underlying `AVPlayer`, exposing states and controls to the UI.
 13 | @Observable
    | `- note: in expansion of macro 'Observable' on property 'bitrate' here
 14 | public class VideoPlayer: Sendable {
    |              `- note: add '@available' attribute to enclosing class
 15 |     //MARK: Video Player and Video Renderer
 16 |     /// The video player.
    :
 64 |     }
 65 |     /// The bitrate of the current video stream (0 if none), only available if streaming from a HLS server (m3u8).
 66 |     private(set) public var bitrate: Double = 0
    +--- macro expansion @Observable -----------------------------------
    |1 | @ObservationTracked
    |  |  `- error: 'ObservationTracked()' is only available in iOS 17.0 or newer
    +-------------------------------------------------------------------
 67 |     /// Bitrate/resolution ladder available for the video stream, only available if streaming from a HLS server (m3u8).
 68 |     private(set) public var bitrateLadder: [BitrateRung] = []
macro expansion @Observable:1:2: error: 'ObservationTracked()' is only available in iOS 17.0 or newer
`- /Users/admin/builder/spi-builder-workspace/Sources/Controllers/VideoPlayer.swift:68:5: note: expanded code originates here
 11 |
 12 | /// Video Player Controller interfacing the underlying `AVPlayer`, exposing states and controls to the UI.
 13 | @Observable
    | `- note: in expansion of macro 'Observable' on property 'bitrateLadder' here
 14 | public class VideoPlayer: Sendable {
    |              `- note: add '@available' attribute to enclosing class
 15 |     //MARK: Video Player and Video Renderer
 16 |     /// The video player.
    :
 66 |     private(set) public var bitrate: Double = 0
 67 |     /// Bitrate/resolution ladder available for the video stream, only available if streaming from a HLS server (m3u8).
 68 |     private(set) public var bitrateLadder: [BitrateRung] = []
    +--- macro expansion @Observable -----------------------------------
    |1 | @ObservationTracked
    |  |  `- error: 'ObservationTracked()' is only available in iOS 17.0 or newer
    +-------------------------------------------------------------------
 69 |     /// The currently selected bitrate rung index, if any. Only available if streaming from a HLS server (m3u8).
 70 |     private(set) public var selectedBitrateRungIndex: Int = -1
macro expansion @Observable:1:2: error: 'ObservationTracked()' is only available in iOS 17.0 or newer
`- /Users/admin/builder/spi-builder-workspace/Sources/Controllers/VideoPlayer.swift:70:5: note: expanded code originates here
 11 |
 12 | /// Video Player Controller interfacing the underlying `AVPlayer`, exposing states and controls to the UI.
 13 | @Observable
    | `- note: in expansion of macro 'Observable' on property 'selectedBitrateRungIndex' here
 14 | public class VideoPlayer: Sendable {
    |              `- note: add '@available' attribute to enclosing class
 15 |     //MARK: Video Player and Video Renderer
 16 |     /// The video player.
    :
 68 |     private(set) public var bitrateLadder: [BitrateRung] = []
 69 |     /// The currently selected bitrate rung index, if any. Only available if streaming from a HLS server (m3u8).
 70 |     private(set) public var selectedBitrateRungIndex: Int = -1
    +--- macro expansion @Observable -----------------------------------
    |1 | @ObservationTracked
    |  |  `- error: 'ObservationTracked()' is only available in iOS 17.0 or newer
    +-------------------------------------------------------------------
 71 |     /// Audio options available for the video stream, only available if streaming from a HLS server (m3u8) and with separate audio playlists.
 72 |     private(set) public var audioOptions: [AudioOption] = []
macro expansion @Observable:1:2: error: 'ObservationTracked()' is only available in iOS 17.0 or newer
`- /Users/admin/builder/spi-builder-workspace/Sources/Controllers/VideoPlayer.swift:72:5: note: expanded code originates here
 11 |
 12 | /// Video Player Controller interfacing the underlying `AVPlayer`, exposing states and controls to the UI.
 13 | @Observable
    | `- note: in expansion of macro 'Observable' on property 'audioOptions' here
 14 | public class VideoPlayer: Sendable {
    |              `- note: add '@available' attribute to enclosing class
 15 |     //MARK: Video Player and Video Renderer
 16 |     /// The video player.
    :
 70 |     private(set) public var selectedBitrateRungIndex: Int = -1
 71 |     /// Audio options available for the video stream, only available if streaming from a HLS server (m3u8) and with separate audio playlists.
 72 |     private(set) public var audioOptions: [AudioOption] = []
    +--- macro expansion @Observable -----------------------------------
    |1 | @ObservationTracked
    |  |  `- error: 'ObservationTracked()' is only available in iOS 17.0 or newer
    +-------------------------------------------------------------------
 73 |     /// The currently selected audio index, if any. Only available if streaming from a HLS server (m3u8).
 74 |     private(set) public var selectedAudioIndex: Int = -1
macro expansion @Observable:1:2: error: 'ObservationTracked()' is only available in iOS 17.0 or newer
`- /Users/admin/builder/spi-builder-workspace/Sources/Controllers/VideoPlayer.swift:74:5: note: expanded code originates here
 11 |
 12 | /// Video Player Controller interfacing the underlying `AVPlayer`, exposing states and controls to the UI.
 13 | @Observable
    | `- note: in expansion of macro 'Observable' on property 'selectedAudioIndex' here
 14 | public class VideoPlayer: Sendable {
    |              `- note: add '@available' attribute to enclosing class
 15 |     //MARK: Video Player and Video Renderer
 16 |     /// The video player.
    :
 72 |     private(set) public var audioOptions: [AudioOption] = []
 73 |     /// The currently selected audio index, if any. Only available if streaming from a HLS server (m3u8).
 74 |     private(set) public var selectedAudioIndex: Int = -1
    +--- macro expansion @Observable -----------------------------------
    |1 | @ObservationTracked
    |  |  `- error: 'ObservationTracked()' is only available in iOS 17.0 or newer
    +-------------------------------------------------------------------
 75 |     /// `true` if the control panel should be visible to the user.
 76 |     private(set) public var shouldShowControlPanel: Bool = true
macro expansion @Observable:1:2: error: 'ObservationTracked()' is only available in iOS 17.0 or newer
`- /Users/admin/builder/spi-builder-workspace/Sources/Controllers/VideoPlayer.swift:76:5: note: expanded code originates here
 11 |
 12 | /// Video Player Controller interfacing the underlying `AVPlayer`, exposing states and controls to the UI.
 13 | @Observable
    | `- note: in expansion of macro 'Observable' on property 'shouldShowControlPanel' here
 14 | public class VideoPlayer: Sendable {
    |              `- note: add '@available' attribute to enclosing class
 15 |     //MARK: Video Player and Video Renderer
 16 |     /// The video player.
    :
 74 |     private(set) public var selectedAudioIndex: Int = -1
 75 |     /// `true` if the control panel should be visible to the user.
 76 |     private(set) public var shouldShowControlPanel: Bool = true
    +--- macro expansion @Observable -----------------------------------
    |1 | @ObservationTracked
    |  |  `- error: 'ObservationTracked()' is only available in iOS 17.0 or newer
    +-------------------------------------------------------------------
 77 |     /// `true` if the control panel should present resolution & audio options to the user.
 78 |     private(set) public var shouldShowPlaybackOptions: Bool = false
macro expansion @Observable:1:2: error: 'ObservationTracked()' is only available in iOS 17.0 or newer
`- /Users/admin/builder/spi-builder-workspace/Sources/Controllers/VideoPlayer.swift:78:5: note: expanded code originates here
 11 |
 12 | /// Video Player Controller interfacing the underlying `AVPlayer`, exposing states and controls to the UI.
 13 | @Observable
    | `- note: in expansion of macro 'Observable' on property 'shouldShowPlaybackOptions' here
 14 | public class VideoPlayer: Sendable {
    |              `- note: add '@available' attribute to enclosing class
 15 |     //MARK: Video Player and Video Renderer
 16 |     /// The video player.
    :
 76 |     private(set) public var shouldShowControlPanel: Bool = true
 77 |     /// `true` if the control panel should present resolution & audio options to the user.
 78 |     private(set) public var shouldShowPlaybackOptions: Bool = false
    +--- macro expansion @Observable -----------------------------------
    |1 | @ObservationTracked
    |  |  `- error: 'ObservationTracked()' is only available in iOS 17.0 or newer
    +-------------------------------------------------------------------
 79 |     /// `true` if the HLS stream has a bitrate ladder with at least 2 rungs and the custom configuration doesn't prevent user selection.
 80 |     public var canChooseResolution: Bool {
macro expansion @Observable:1:2: error: 'ObservationTracked()' is only available in iOS 17.0 or newer
`- /Users/admin/builder/spi-builder-workspace/Sources/Controllers/VideoPlayer.swift:99:5: note: expanded code originates here
 11 |
 12 | /// Video Player Controller interfacing the underlying `AVPlayer`, exposing states and controls to the UI.
 13 | @Observable
    | `- note: in expansion of macro 'Observable' on property 'currentTime' here
 14 | public class VideoPlayer: Sendable {
    |              `- note: add '@available' attribute to enclosing class
 15 |     //MARK: Video Player and Video Renderer
 16 |     /// The video player.
    :
 97 |     ///
 98 |     /// This variable is updated by video playback but can be overwritten by a scrubber, in conjunction with `scrubState`.
 99 |     public var currentTime: Double = 0
    +--- macro expansion @Observable -----------------------------------
    |1 | @ObservationTracked
    |  |  `- error: 'ObservationTracked()' is only available in iOS 17.0 or newer
    +-------------------------------------------------------------------
100 |     public enum ScrubState {
101 |         /// The scrubber is not active and reflects the video's current playback time.
macro expansion @Observable:1:2: error: 'ObservationTracked()' is only available in iOS 17.0 or newer
`- /Users/admin/builder/spi-builder-workspace/Sources/Controllers/VideoPlayer.swift:109:5: note: expanded code originates here
 11 |
 12 | /// Video Player Controller interfacing the underlying `AVPlayer`, exposing states and controls to the UI.
 13 | @Observable
    | `- note: in expansion of macro 'Observable' on property 'scrubState' here
 14 | public class VideoPlayer: Sendable {
    |              `- note: add '@available' attribute to enclosing class
 15 |     //MARK: Video Player and Video Renderer
 16 |     /// The video player.
    :
107 |     }
108 |     /// The current state of the scrubber.
109 |     public var scrubState: ScrubState = .notScrubbing {
    +--- macro expansion @Observable -----------------------------------
    |1 | @ObservationTracked
    |  |  `- error: 'ObservationTracked()' is only available in iOS 17.0 or newer
    +-------------------------------------------------------------------
110 |        didSet {
111 |           switch scrubState {
macro expansion @Observable:1:2: error: 'ObservationTracked()' is only available in iOS 17.0 or newer
`- /Users/admin/builder/spi-builder-workspace/Sources/Controllers/VideoPlayer.swift:133:5: note: expanded code originates here
 11 |
 12 | /// Video Player Controller interfacing the underlying `AVPlayer`, exposing states and controls to the UI.
 13 | @Observable
    | `- note: in expansion of macro 'Observable' on property 'displayLink' here
 14 | public class VideoPlayer: Sendable {
    |              `- note: add '@available' attribute to enclosing class
 15 |     //MARK: Video Player and Video Renderer
 16 |     /// The video player.
    :
131 |
132 |     //MARK: Private variables
133 |     private var displayLink: CADisplayLink?
    +--- macro expansion @Observable -----------------------------------
    |1 | @ObservationTracked
    |  |  `- error: 'ObservationTracked()' is only available in iOS 17.0 or newer
    +-------------------------------------------------------------------
134 |     private var videoOutput: AVPlayerItemVideoOutput?
135 |     private var timeObserver: Any?
macro expansion @Observable:1:2: error: 'ObservationTracked()' is only available in iOS 17.0 or newer
`- /Users/admin/builder/spi-builder-workspace/Sources/Controllers/VideoPlayer.swift:134:5: note: expanded code originates here
 11 |
 12 | /// Video Player Controller interfacing the underlying `AVPlayer`, exposing states and controls to the UI.
 13 | @Observable
    | `- note: in expansion of macro 'Observable' on property 'videoOutput' here
 14 | public class VideoPlayer: Sendable {
    |              `- note: add '@available' attribute to enclosing class
 15 |     //MARK: Video Player and Video Renderer
 16 |     /// The video player.
    :
132 |     //MARK: Private variables
133 |     private var displayLink: CADisplayLink?
134 |     private var videoOutput: AVPlayerItemVideoOutput?
    +--- macro expansion @Observable -----------------------------------
    |1 | @ObservationTracked
    |  |  `- error: 'ObservationTracked()' is only available in iOS 17.0 or newer
    +-------------------------------------------------------------------
135 |     private var timeObserver: Any?
136 |     private var durationObserver: NSKeyValueObservation?
macro expansion @Observable:1:2: error: 'ObservationTracked()' is only available in iOS 17.0 or newer
`- /Users/admin/builder/spi-builder-workspace/Sources/Controllers/VideoPlayer.swift:135:5: note: expanded code originates here
 11 |
 12 | /// Video Player Controller interfacing the underlying `AVPlayer`, exposing states and controls to the UI.
 13 | @Observable
    | `- note: in expansion of macro 'Observable' on property 'timeObserver' here
 14 | public class VideoPlayer: Sendable {
    |              `- note: add '@available' attribute to enclosing class
 15 |     //MARK: Video Player and Video Renderer
 16 |     /// The video player.
    :
133 |     private var displayLink: CADisplayLink?
134 |     private var videoOutput: AVPlayerItemVideoOutput?
135 |     private var timeObserver: Any?
    +--- macro expansion @Observable -----------------------------------
    |1 | @ObservationTracked
    |  |  `- error: 'ObservationTracked()' is only available in iOS 17.0 or newer
    +-------------------------------------------------------------------
136 |     private var durationObserver: NSKeyValueObservation?
137 |     private var mediaStatusObserver: NSKeyValueObservation?
macro expansion @Observable:1:2: error: 'ObservationTracked()' is only available in iOS 17.0 or newer
`- /Users/admin/builder/spi-builder-workspace/Sources/Controllers/VideoPlayer.swift:136:5: note: expanded code originates here
 11 |
 12 | /// Video Player Controller interfacing the underlying `AVPlayer`, exposing states and controls to the UI.
 13 | @Observable
    | `- note: in expansion of macro 'Observable' on property 'durationObserver' here
 14 | public class VideoPlayer: Sendable {
    |              `- note: add '@available' attribute to enclosing class
 15 |     //MARK: Video Player and Video Renderer
 16 |     /// The video player.
    :
134 |     private var videoOutput: AVPlayerItemVideoOutput?
135 |     private var timeObserver: Any?
136 |     private var durationObserver: NSKeyValueObservation?
    +--- macro expansion @Observable -----------------------------------
    |1 | @ObservationTracked
    |  |  `- error: 'ObservationTracked()' is only available in iOS 17.0 or newer
    +-------------------------------------------------------------------
137 |     private var mediaStatusObserver: NSKeyValueObservation?
138 |     private var bufferingObserver: NSKeyValueObservation?
macro expansion @Observable:1:2: error: 'ObservationTracked()' is only available in iOS 17.0 or newer
`- /Users/admin/builder/spi-builder-workspace/Sources/Controllers/VideoPlayer.swift:137:5: note: expanded code originates here
 11 |
 12 | /// Video Player Controller interfacing the underlying `AVPlayer`, exposing states and controls to the UI.
 13 | @Observable
    | `- note: in expansion of macro 'Observable' on property 'mediaStatusObserver' here
 14 | public class VideoPlayer: Sendable {
    |              `- note: add '@available' attribute to enclosing class
 15 |     //MARK: Video Player and Video Renderer
 16 |     /// The video player.
    :
135 |     private var timeObserver: Any?
136 |     private var durationObserver: NSKeyValueObservation?
137 |     private var mediaStatusObserver: NSKeyValueObservation?
    +--- macro expansion @Observable -----------------------------------
    |1 | @ObservationTracked
    |  |  `- error: 'ObservationTracked()' is only available in iOS 17.0 or newer
    +-------------------------------------------------------------------
138 |     private var bufferingObserver: NSKeyValueObservation?
139 |     private var dismissControlPanelTask: Task<Void, Never>?
macro expansion @Observable:1:2: error: 'ObservationTracked()' is only available in iOS 17.0 or newer
`- /Users/admin/builder/spi-builder-workspace/Sources/Controllers/VideoPlayer.swift:138:5: note: expanded code originates here
 11 |
 12 | /// Video Player Controller interfacing the underlying `AVPlayer`, exposing states and controls to the UI.
 13 | @Observable
    | `- note: in expansion of macro 'Observable' on property 'bufferingObserver' here
 14 | public class VideoPlayer: Sendable {
    |              `- note: add '@available' attribute to enclosing class
 15 |     //MARK: Video Player and Video Renderer
 16 |     /// The video player.
    :
136 |     private var durationObserver: NSKeyValueObservation?
137 |     private var mediaStatusObserver: NSKeyValueObservation?
138 |     private var bufferingObserver: NSKeyValueObservation?
    +--- macro expansion @Observable -----------------------------------
    |1 | @ObservationTracked
    |  |  `- error: 'ObservationTracked()' is only available in iOS 17.0 or newer
    +-------------------------------------------------------------------
139 |     private var dismissControlPanelTask: Task<Void, Never>?
140 |     private var playlistReader: PlaylistReader?
macro expansion @Observable:1:2: error: 'ObservationTracked()' is only available in iOS 17.0 or newer
`- /Users/admin/builder/spi-builder-workspace/Sources/Controllers/VideoPlayer.swift:139:5: note: expanded code originates here
 11 |
 12 | /// Video Player Controller interfacing the underlying `AVPlayer`, exposing states and controls to the UI.
 13 | @Observable
    | `- note: in expansion of macro 'Observable' on property 'dismissControlPanelTask' here
 14 | public class VideoPlayer: Sendable {
    |              `- note: add '@available' attribute to enclosing class
 15 |     //MARK: Video Player and Video Renderer
 16 |     /// The video player.
    :
137 |     private var mediaStatusObserver: NSKeyValueObservation?
138 |     private var bufferingObserver: NSKeyValueObservation?
139 |     private var dismissControlPanelTask: Task<Void, Never>?
    +--- macro expansion @Observable -----------------------------------
    |1 | @ObservationTracked
    |  |  `- error: 'ObservationTracked()' is only available in iOS 17.0 or newer
    +-------------------------------------------------------------------
140 |     private var playlistReader: PlaylistReader?
141 |     private var delegate: PlaylistLoaderDelegate?
macro expansion @Observable:1:2: error: 'ObservationTracked()' is only available in iOS 17.0 or newer
`- /Users/admin/builder/spi-builder-workspace/Sources/Controllers/VideoPlayer.swift:140:5: note: expanded code originates here
 11 |
 12 | /// Video Player Controller interfacing the underlying `AVPlayer`, exposing states and controls to the UI.
 13 | @Observable
    | `- note: in expansion of macro 'Observable' on property 'playlistReader' here
 14 | public class VideoPlayer: Sendable {
    |              `- note: add '@available' attribute to enclosing class
 15 |     //MARK: Video Player and Video Renderer
 16 |     /// The video player.
    :
138 |     private var bufferingObserver: NSKeyValueObservation?
139 |     private var dismissControlPanelTask: Task<Void, Never>?
140 |     private var playlistReader: PlaylistReader?
    +--- macro expansion @Observable -----------------------------------
    |1 | @ObservationTracked
    |  |  `- error: 'ObservationTracked()' is only available in iOS 17.0 or newer
    +-------------------------------------------------------------------
141 |     private var delegate: PlaylistLoaderDelegate?
142 |
macro expansion @Observable:1:2: error: 'ObservationTracked()' is only available in iOS 17.0 or newer
`- /Users/admin/builder/spi-builder-workspace/Sources/Controllers/VideoPlayer.swift:141:5: note: expanded code originates here
 11 |
 12 | /// Video Player Controller interfacing the underlying `AVPlayer`, exposing states and controls to the UI.
 13 | @Observable
    | `- note: in expansion of macro 'Observable' on property 'delegate' here
 14 | public class VideoPlayer: Sendable {
    |              `- note: add '@available' attribute to enclosing class
 15 |     //MARK: Video Player and Video Renderer
 16 |     /// The video player.
    :
139 |     private var dismissControlPanelTask: Task<Void, Never>?
140 |     private var playlistReader: PlaylistReader?
141 |     private var delegate: PlaylistLoaderDelegate?
    +--- macro expansion @Observable -----------------------------------
    |1 | @ObservationTracked
    |  |  `- error: 'ObservationTracked()' is only available in iOS 17.0 or newer
    +-------------------------------------------------------------------
142 |
143 |     //MARK: Public methods
macro expansion @Observable:1:2: error: 'ObservationIgnored()' is only available in iOS 17.0 or newer
`- /Users/admin/builder/spi-builder-workspace/Sources/Controllers/VideoPlayer.swift:639:1: note: expanded code originates here
 11 |
 12 | /// Video Player Controller interfacing the underlying `AVPlayer`, exposing states and controls to the UI.
 13 | @Observable
    | `- note: in expansion of macro 'Observable' on class 'VideoPlayer' here
 14 | public class VideoPlayer: Sendable {
    |              `- note: add '@available' attribute to enclosing class
 15 |     //MARK: Video Player and Video Renderer
 16 |     /// The video player.
    :
637 |         dismissControlPanelTask = nil
638 |     }
639 | }
    +--- macro expansion @Observable -----------------------------------
    | 1 | @ObservationIgnored private let _$observationRegistrar = Observation.ObservationRegistrar()
    |   |  `- error: 'ObservationIgnored()' is only available in iOS 17.0 or newer
    | 2 |
    | 3 | internal nonisolated func access<$s13OpenImmersive11VideoPlayer10ObservablefMm_6MemberfMu_>(
    +-------------------------------------------------------------------
640 |
macro expansion @ObservationTracked:3:6: error: 'ObservationIgnored()' is only available in iOS 17.0 or newer
`- /Users/admin/builder/spi-builder-workspace/Sources/Controllers/VideoPlayer.swift:19:40: note: expanded code originates here
 12 | /// Video Player Controller interfacing the underlying `AVPlayer`, exposing states and controls to the UI.
 13 | @Observable
 14 | public class VideoPlayer: Sendable {
    |              `- note: add '@available' attribute to enclosing class
 15 |     //MARK: Video Player and Video Renderer
 16 |     /// The video player.
 17 |     public let player = AVPlayer()
 18 |     /// The APMP tag injector used in video streams that are frame-packed side by side or over under.
 19 |     private var injector: APMPInjector?
    +--- macro expansion @ObservationTracked ---------------------------
    |1 | /// The APMP tag injector used in video streams that are frame-packed side by side or over under.
    |2 |
    |3 |     @ObservationIgnored
    |  |      `- error: 'ObservationIgnored()' is only available in iOS 17.0 or newer
    |4 | private  var _injector: APMPInjector?
    +-------------------------------------------------------------------
 20 |     /// The video renderer to use for media that are frame-packed side by side or over under.
 21 |     public var renderer: AVSampleBufferVideoRenderer? {
macro expansion @ObservationTracked:4:6: error: 'ObservationIgnored()' is only available in iOS 17.0 or newer
`- /Users/admin/builder/spi-builder-workspace/Sources/Controllers/VideoPlayer.swift:27:47: note: expanded code originates here
 12 | /// Video Player Controller interfacing the underlying `AVPlayer`, exposing states and controls to the UI.
 13 | @Observable
 14 | public class VideoPlayer: Sendable {
    |              `- note: add '@available' attribute to enclosing class
 15 |     //MARK: Video Player and Video Renderer
 16 |     /// The video player.
    :
 25 |     //MARK: Variables accessible to the UI
 26 |     /// The title of the current video (empty string if none).
 27 |     private(set) public var title: String = ""
    +--- macro expansion @ObservationTracked ---------------------------
    |2 |     /// The title of the current video (empty string if none).
    |3 |
    |4 |     @ObservationIgnored
    |  |      `- error: 'ObservationIgnored()' is only available in iOS 17.0 or newer
    |5 | private  var _title: String = ""
    +-------------------------------------------------------------------
 28 |     /// A short description of the current video, displayed under the title (empty string if none).
 29 |     private(set) public var description: String = ""
macro expansion @ObservationTracked:3:6: error: 'ObservationIgnored()' is only available in iOS 17.0 or newer
`- /Users/admin/builder/spi-builder-workspace/Sources/Controllers/VideoPlayer.swift:29:53: note: expanded code originates here
 12 | /// Video Player Controller interfacing the underlying `AVPlayer`, exposing states and controls to the UI.
 13 | @Observable
 14 | public class VideoPlayer: Sendable {
    |              `- note: add '@available' attribute to enclosing class
 15 |     //MARK: Video Player and Video Renderer
 16 |     /// The video player.
    :
 27 |     private(set) public var title: String = ""
 28 |     /// A short description of the current video, displayed under the title (empty string if none).
 29 |     private(set) public var description: String = ""
    +--- macro expansion @ObservationTracked ---------------------------
    |1 | /// A short description of the current video, displayed under the title (empty string if none).
    |2 |
    |3 |     @ObservationIgnored
    |  |      `- error: 'ObservationIgnored()' is only available in iOS 17.0 or newer
    |4 | private  var _description: String = ""
    +-------------------------------------------------------------------
 30 |     /// The url of the current video.
 31 |     private(set) public var url: URL?
macro expansion @ObservationTracked:3:6: error: 'ObservationIgnored()' is only available in iOS 17.0 or newer
`- /Users/admin/builder/spi-builder-workspace/Sources/Controllers/VideoPlayer.swift:31:38: note: expanded code originates here
 12 | /// Video Player Controller interfacing the underlying `AVPlayer`, exposing states and controls to the UI.
 13 | @Observable
 14 | public class VideoPlayer: Sendable {
    |              `- note: add '@available' attribute to enclosing class
 15 |     //MARK: Video Player and Video Renderer
 16 |     /// The video player.
    :
 29 |     private(set) public var description: String = ""
 30 |     /// The url of the current video.
 31 |     private(set) public var url: URL?
    +--- macro expansion @ObservationTracked ---------------------------
    |1 | /// The url of the current video.
    |2 |
    |3 |     @ObservationIgnored
    |  |      `- error: 'ObservationIgnored()' is only available in iOS 17.0 or newer
    |4 | private  var _url: URL?
    +-------------------------------------------------------------------
 32 |     /// The AVFoundation metadata of the current video.
 33 |     private(set) public var metadata: [AVMetadataIdentifier: String] = [:]
macro expansion @ObservationTracked:3:6: error: 'ObservationIgnored()' is only available in iOS 17.0 or newer
`- /Users/admin/builder/spi-builder-workspace/Sources/Controllers/VideoPlayer.swift:33:75: note: expanded code originates here
 12 | /// Video Player Controller interfacing the underlying `AVPlayer`, exposing states and controls to the UI.
 13 | @Observable
 14 | public class VideoPlayer: Sendable {
    |              `- note: add '@available' attribute to enclosing class
 15 |     //MARK: Video Player and Video Renderer
 16 |     /// The video player.
    :
 31 |     private(set) public var url: URL?
 32 |     /// The AVFoundation metadata of the current video.
 33 |     private(set) public var metadata: [AVMetadataIdentifier: String] = [:]
    +--- macro expansion @ObservationTracked ---------------------------
    |1 | /// The AVFoundation metadata of the current video.
    |2 |
    |3 |     @ObservationIgnored
    |  |      `- error: 'ObservationIgnored()' is only available in iOS 17.0 or newer
    |4 | private  var _metadata: [AVMetadataIdentifier: String] = [:]
    +-------------------------------------------------------------------
 34 |     /// The frame packing type of the video media, if any.
 35 |     private(set) public var framePacking: VideoItem.FramePacking = .none
macro expansion @ObservationTracked:3:6: error: 'ObservationIgnored()' is only available in iOS 17.0 or newer
`- /Users/admin/builder/spi-builder-workspace/Sources/Controllers/VideoPlayer.swift:35:73: note: expanded code originates here
 12 | /// Video Player Controller interfacing the underlying `AVPlayer`, exposing states and controls to the UI.
 13 | @Observable
 14 | public class VideoPlayer: Sendable {
    |              `- note: add '@available' attribute to enclosing class
 15 |     //MARK: Video Player and Video Renderer
 16 |     /// The video player.
    :
 33 |     private(set) public var metadata: [AVMetadataIdentifier: String] = [:]
 34 |     /// The frame packing type of the video media, if any.
 35 |     private(set) public var framePacking: VideoItem.FramePacking = .none
    +--- macro expansion @ObservationTracked ---------------------------
    |1 | /// The frame packing type of the video media, if any.
    |2 |
    |3 |     @ObservationIgnored
    |  |      `- error: 'ObservationIgnored()' is only available in iOS 17.0 or newer
    |4 | private  var _framePacking: VideoItem.FramePacking = .none
    +-------------------------------------------------------------------
 36 |     /// The projection type of the video media, defaults to VR180.
 37 |     private(set) public var projection: VideoItem.Projection = .equirectangular(fieldOfView: 180)
macro expansion @ObservationTracked:3:6: error: 'ObservationIgnored()' is only available in iOS 17.0 or newer
`- /Users/admin/builder/spi-builder-workspace/Sources/Controllers/VideoPlayer.swift:37:98: note: expanded code originates here
 12 | /// Video Player Controller interfacing the underlying `AVPlayer`, exposing states and controls to the UI.
 13 | @Observable
 14 | public class VideoPlayer: Sendable {
    |              `- note: add '@available' attribute to enclosing class
 15 |     //MARK: Video Player and Video Renderer
 16 |     /// The video player.
    :
 35 |     private(set) public var framePacking: VideoItem.FramePacking = .none
 36 |     /// The projection type of the video media, defaults to VR180.
 37 |     private(set) public var projection: VideoItem.Projection = .equirectangular(fieldOfView: 180)
    +--- macro expansion @ObservationTracked ---------------------------
    |1 | /// The projection type of the video media, defaults to VR180.
    |2 |
    |3 |     @ObservationIgnored
    |  |      `- error: 'ObservationIgnored()' is only available in iOS 17.0 or newer
    |4 | private  var _projection: VideoItem.Projection = .equirectangular(fieldOfView: 180)
    +-------------------------------------------------------------------
 38 |     /// A playback error, if any.
 39 |     private(set) public var error: Error?
macro expansion @ObservationTracked:3:6: error: 'ObservationIgnored()' is only available in iOS 17.0 or newer
`- /Users/admin/builder/spi-builder-workspace/Sources/Controllers/VideoPlayer.swift:39:42: note: expanded code originates here
 12 | /// Video Player Controller interfacing the underlying `AVPlayer`, exposing states and controls to the UI.
 13 | @Observable
 14 | public class VideoPlayer: Sendable {
    |              `- note: add '@available' attribute to enclosing class
 15 |     //MARK: Video Player and Video Renderer
 16 |     /// The video player.
    :
 37 |     private(set) public var projection: VideoItem.Projection = .equirectangular(fieldOfView: 180)
 38 |     /// A playback error, if any.
 39 |     private(set) public var error: Error?
    +--- macro expansion @ObservationTracked ---------------------------
    |1 | /// A playback error, if any.
    |2 |
    |3 |     @ObservationIgnored
    |  |      `- error: 'ObservationIgnored()' is only available in iOS 17.0 or newer
    |4 | private  var _error: Error?
    +-------------------------------------------------------------------
 40 |     /// The duration in seconds of the current video (0 if none).
 41 |     private(set) public var duration: Double = 0
macro expansion @ObservationTracked:3:6: error: 'ObservationIgnored()' is only available in iOS 17.0 or newer
`- /Users/admin/builder/spi-builder-workspace/Sources/Controllers/VideoPlayer.swift:41:49: note: expanded code originates here
 12 | /// Video Player Controller interfacing the underlying `AVPlayer`, exposing states and controls to the UI.
 13 | @Observable
 14 | public class VideoPlayer: Sendable {
    |              `- note: add '@available' attribute to enclosing class
 15 |     //MARK: Video Player and Video Renderer
 16 |     /// The video player.
    :
 39 |     private(set) public var error: Error?
 40 |     /// The duration in seconds of the current video (0 if none).
 41 |     private(set) public var duration: Double = 0
    +--- macro expansion @ObservationTracked ---------------------------
    |1 | /// The duration in seconds of the current video (0 if none).
    |2 |
    |3 |     @ObservationIgnored
    |  |      `- error: 'ObservationIgnored()' is only available in iOS 17.0 or newer
    |4 | private  var _duration: Double = 0
    +-------------------------------------------------------------------
 42 |     /// `true` if playback is currently paused, or if playback has completed.
 43 |     private(set) public var paused: Bool = false
macro expansion @ObservationTracked:3:6: error: 'ObservationIgnored()' is only available in iOS 17.0 or newer
`- /Users/admin/builder/spi-builder-workspace/Sources/Controllers/VideoPlayer.swift:43:49: note: expanded code originates here
 12 | /// Video Player Controller interfacing the underlying `AVPlayer`, exposing states and controls to the UI.
 13 | @Observable
 14 | public class VideoPlayer: Sendable {
    |              `- note: add '@available' attribute to enclosing class
 15 |     //MARK: Video Player and Video Renderer
 16 |     /// The video player.
    :
 41 |     private(set) public var duration: Double = 0
 42 |     /// `true` if playback is currently paused, or if playback has completed.
 43 |     private(set) public var paused: Bool = false
    +--- macro expansion @ObservationTracked ---------------------------
    |1 | /// `true` if playback is currently paused, or if playback has completed.
    |2 |
    |3 |     @ObservationIgnored
    |  |      `- error: 'ObservationIgnored()' is only available in iOS 17.0 or newer
    |4 | private  var _paused: Bool = false
    +-------------------------------------------------------------------
 44 |     /// `true` if playback is waiting to load the media.
 45 |     private(set) public var loading: Bool = false
macro expansion @ObservationTracked:3:6: error: 'ObservationIgnored()' is only available in iOS 17.0 or newer
`- /Users/admin/builder/spi-builder-workspace/Sources/Controllers/VideoPlayer.swift:45:50: note: expanded code originates here
 12 | /// Video Player Controller interfacing the underlying `AVPlayer`, exposing states and controls to the UI.
 13 | @Observable
 14 | public class VideoPlayer: Sendable {
    |              `- note: add '@available' attribute to enclosing class
 15 |     //MARK: Video Player and Video Renderer
 16 |     /// The video player.
    :
 43 |     private(set) public var paused: Bool = false
 44 |     /// `true` if playback is waiting to load the media.
 45 |     private(set) public var loading: Bool = false
    +--- macro expansion @ObservationTracked ---------------------------
    |1 | /// `true` if playback is waiting to load the media.
    |2 |
    |3 |     @ObservationIgnored
    |  |      `- error: 'ObservationIgnored()' is only available in iOS 17.0 or newer
    |4 | private  var _loading: Bool = false
    +-------------------------------------------------------------------
 46 |     /// `true` if playback is temporarily interrupted due to buffering (HLS only).
 47 |     private(set) public var buffering: Bool = false
macro expansion @ObservationTracked:3:6: error: 'ObservationIgnored()' is only available in iOS 17.0 or newer
`- /Users/admin/builder/spi-builder-workspace/Sources/Controllers/VideoPlayer.swift:47:52: note: expanded code originates here
 12 | /// Video Player Controller interfacing the underlying `AVPlayer`, exposing states and controls to the UI.
 13 | @Observable
 14 | public class VideoPlayer: Sendable {
    |              `- note: add '@available' attribute to enclosing class
 15 |     //MARK: Video Player and Video Renderer
 16 |     /// The video player.
    :
 45 |     private(set) public var loading: Bool = false
 46 |     /// `true` if playback is temporarily interrupted due to buffering (HLS only).
 47 |     private(set) public var buffering: Bool = false
    +--- macro expansion @ObservationTracked ---------------------------
    |1 | /// `true` if playback is temporarily interrupted due to buffering (HLS only).
    |2 |
    |3 |     @ObservationIgnored
    |  |      `- error: 'ObservationIgnored()' is only available in iOS 17.0 or newer
    |4 | private  var _buffering: Bool = false
    +-------------------------------------------------------------------
 48 |     /// `true` if playback reached the end of the video and is no longer playing.
 49 |     private(set) public var hasReachedEnd: Bool = false
macro expansion @ObservationTracked:3:6: error: 'ObservationIgnored()' is only available in iOS 17.0 or newer
`- /Users/admin/builder/spi-builder-workspace/Sources/Controllers/VideoPlayer.swift:49:56: note: expanded code originates here
 12 | /// Video Player Controller interfacing the underlying `AVPlayer`, exposing states and controls to the UI.
 13 | @Observable
 14 | public class VideoPlayer: Sendable {
    |              `- note: add '@available' attribute to enclosing class
 15 |     //MARK: Video Player and Video Renderer
 16 |     /// The video player.
    :
 47 |     private(set) public var buffering: Bool = false
 48 |     /// `true` if playback reached the end of the video and is no longer playing.
 49 |     private(set) public var hasReachedEnd: Bool = false
    +--- macro expansion @ObservationTracked ---------------------------
    |1 | /// `true` if playback reached the end of the video and is no longer playing.
    |2 |
    |3 |     @ObservationIgnored
    |  |      `- error: 'ObservationIgnored()' is only available in iOS 17.0 or newer
    |4 | private  var _hasReachedEnd: Bool = false
    +-------------------------------------------------------------------
 50 |     /// The callback to execute when playback reaches the end of the video.
 51 |     public var playbackEndedAction: CustomAction?
macro expansion @ObservationTracked:3:6: error: 'ObservationIgnored()' is only available in iOS 17.0 or newer
`- /Users/admin/builder/spi-builder-workspace/Sources/Controllers/VideoPlayer.swift:51:50: note: expanded code originates here
 12 | /// Video Player Controller interfacing the underlying `AVPlayer`, exposing states and controls to the UI.
 13 | @Observable
 14 | public class VideoPlayer: Sendable {
    |              `- note: add '@available' attribute to enclosing class
 15 |     //MARK: Video Player and Video Renderer
 16 |     /// The video player.
    :
 49 |     private(set) public var hasReachedEnd: Bool = false
 50 |     /// The callback to execute when playback reaches the end of the video.
 51 |     public var playbackEndedAction: CustomAction?
    +--- macro expansion @ObservationTracked ---------------------------
    |1 | /// The callback to execute when playback reaches the end of the video.
    |2 |
    |3 |     @ObservationIgnored
    |  |      `- error: 'ObservationIgnored()' is only available in iOS 17.0 or newer
    |4 | private  var _playbackEndedAction: CustomAction?
    +-------------------------------------------------------------------
 52 |     /// The aspect ratio of the current media (width / height) (equirectangular projection only).
 53 |     private(set) public var aspectRatio: Float?
macro expansion @ObservationTracked:3:6: error: 'ObservationIgnored()' is only available in iOS 17.0 or newer
`- /Users/admin/builder/spi-builder-workspace/Sources/Controllers/VideoPlayer.swift:53:48: note: expanded code originates here
 12 | /// Video Player Controller interfacing the underlying `AVPlayer`, exposing states and controls to the UI.
 13 | @Observable
 14 | public class VideoPlayer: Sendable {
    |              `- note: add '@available' attribute to enclosing class
 15 |     //MARK: Video Player and Video Renderer
 16 |     /// The video player.
    :
 51 |     public var playbackEndedAction: CustomAction?
 52 |     /// The aspect ratio of the current media (width / height) (equirectangular projection only).
 53 |     private(set) public var aspectRatio: Float?
    +--- macro expansion @ObservationTracked ---------------------------
    |1 | /// The aspect ratio of the current media (width / height) (equirectangular projection only).
    |2 |
    |3 |     @ObservationIgnored
    |  |      `- error: 'ObservationIgnored()' is only available in iOS 17.0 or newer
    |4 | private  var _aspectRatio: Float?
    +-------------------------------------------------------------------
 54 |     /// The horizontal field of view for the current media (equirectangular projection only).
 55 |     private(set) public var horizontalFieldOfView: Float = 180.0
macro expansion @ObservationTracked:3:6: error: 'ObservationIgnored()' is only available in iOS 17.0 or newer
`- /Users/admin/builder/spi-builder-workspace/Sources/Controllers/VideoPlayer.swift:55:65: note: expanded code originates here
 12 | /// Video Player Controller interfacing the underlying `AVPlayer`, exposing states and controls to the UI.
 13 | @Observable
 14 | public class VideoPlayer: Sendable {
    |              `- note: add '@available' attribute to enclosing class
 15 |     //MARK: Video Player and Video Renderer
 16 |     /// The video player.
    :
 53 |     private(set) public var aspectRatio: Float?
 54 |     /// The horizontal field of view for the current media (equirectangular projection only).
 55 |     private(set) public var horizontalFieldOfView: Float = 180.0
    +--- macro expansion @ObservationTracked ---------------------------
    |1 | /// The horizontal field of view for the current media (equirectangular projection only).
    |2 |
    |3 |     @ObservationIgnored
    |  |      `- error: 'ObservationIgnored()' is only available in iOS 17.0 or newer
    |4 | private  var _horizontalFieldOfView: Float = 180.0
    +-------------------------------------------------------------------
 56 |     /// The vertical field of view for the current media (equirectangular projection only).
 57 |     public var verticalFieldOfView: Float {
macro expansion @ObservationTracked:3:6: error: 'ObservationIgnored()' is only available in iOS 17.0 or newer
`- /Users/admin/builder/spi-builder-workspace/Sources/Controllers/VideoPlayer.swift:66:48: note: expanded code originates here
 12 | /// Video Player Controller interfacing the underlying `AVPlayer`, exposing states and controls to the UI.
 13 | @Observable
 14 | public class VideoPlayer: Sendable {
    |              `- note: add '@available' attribute to enclosing class
 15 |     //MARK: Video Player and Video Renderer
 16 |     /// The video player.
    :
 64 |     }
 65 |     /// The bitrate of the current video stream (0 if none), only available if streaming from a HLS server (m3u8).
 66 |     private(set) public var bitrate: Double = 0
    +--- macro expansion @ObservationTracked ---------------------------
    |1 | /// The bitrate of the current video stream (0 if none), only available if streaming from a HLS server (m3u8).
    |2 |
    |3 |     @ObservationIgnored
    |  |      `- error: 'ObservationIgnored()' is only available in iOS 17.0 or newer
    |4 | private  var _bitrate: Double = 0
    +-------------------------------------------------------------------
 67 |     /// Bitrate/resolution ladder available for the video stream, only available if streaming from a HLS server (m3u8).
 68 |     private(set) public var bitrateLadder: [BitrateRung] = []
macro expansion @ObservationTracked:3:6: error: 'ObservationIgnored()' is only available in iOS 17.0 or newer
`- /Users/admin/builder/spi-builder-workspace/Sources/Controllers/VideoPlayer.swift:68:62: note: expanded code originates here
 12 | /// Video Player Controller interfacing the underlying `AVPlayer`, exposing states and controls to the UI.
 13 | @Observable
 14 | public class VideoPlayer: Sendable {
    |              `- note: add '@available' attribute to enclosing class
 15 |     //MARK: Video Player and Video Renderer
 16 |     /// The video player.
    :
 66 |     private(set) public var bitrate: Double = 0
 67 |     /// Bitrate/resolution ladder available for the video stream, only available if streaming from a HLS server (m3u8).
 68 |     private(set) public var bitrateLadder: [BitrateRung] = []
    +--- macro expansion @ObservationTracked ---------------------------
    |1 | /// Bitrate/resolution ladder available for the video stream, only available if streaming from a HLS server (m3u8).
    |2 |
    |3 |     @ObservationIgnored
    |  |      `- error: 'ObservationIgnored()' is only available in iOS 17.0 or newer
    |4 | private  var _bitrateLadder: [BitrateRung] = []
    +-------------------------------------------------------------------
 69 |     /// The currently selected bitrate rung index, if any. Only available if streaming from a HLS server (m3u8).
 70 |     private(set) public var selectedBitrateRungIndex: Int = -1
macro expansion @ObservationTracked:3:6: error: 'ObservationIgnored()' is only available in iOS 17.0 or newer
`- /Users/admin/builder/spi-builder-workspace/Sources/Controllers/VideoPlayer.swift:70:63: note: expanded code originates here
 12 | /// Video Player Controller interfacing the underlying `AVPlayer`, exposing states and controls to the UI.
 13 | @Observable
 14 | public class VideoPlayer: Sendable {
    |              `- note: add '@available' attribute to enclosing class
 15 |     //MARK: Video Player and Video Renderer
 16 |     /// The video player.
    :
 68 |     private(set) public var bitrateLadder: [BitrateRung] = []
 69 |     /// The currently selected bitrate rung index, if any. Only available if streaming from a HLS server (m3u8).
 70 |     private(set) public var selectedBitrateRungIndex: Int = -1
    +--- macro expansion @ObservationTracked ---------------------------
    |1 | /// The currently selected bitrate rung index, if any. Only available if streaming from a HLS server (m3u8).
    |2 |
    |3 |     @ObservationIgnored
    |  |      `- error: 'ObservationIgnored()' is only available in iOS 17.0 or newer
    |4 | private  var _selectedBitrateRungIndex: Int = -1
    +-------------------------------------------------------------------
 71 |     /// Audio options available for the video stream, only available if streaming from a HLS server (m3u8) and with separate audio playlists.
 72 |     private(set) public var audioOptions: [AudioOption] = []
macro expansion @ObservationTracked:3:6: error: 'ObservationIgnored()' is only available in iOS 17.0 or newer
`- /Users/admin/builder/spi-builder-workspace/Sources/Controllers/VideoPlayer.swift:72:61: note: expanded code originates here
 12 | /// Video Player Controller interfacing the underlying `AVPlayer`, exposing states and controls to the UI.
 13 | @Observable
 14 | public class VideoPlayer: Sendable {
    |              `- note: add '@available' attribute to enclosing class
 15 |     //MARK: Video Player and Video Renderer
 16 |     /// The video player.
    :
 70 |     private(set) public var selectedBitrateRungIndex: Int = -1
 71 |     /// Audio options available for the video stream, only available if streaming from a HLS server (m3u8) and with separate audio playlists.
 72 |     private(set) public var audioOptions: [AudioOption] = []
    +--- macro expansion @ObservationTracked ---------------------------
    |1 | /// Audio options available for the video stream, only available if streaming from a HLS server (m3u8) and with separate audio playlists.
    |2 |
    |3 |     @ObservationIgnored
    |  |      `- error: 'ObservationIgnored()' is only available in iOS 17.0 or newer
    |4 | private  var _audioOptions: [AudioOption] = []
    +-------------------------------------------------------------------
 73 |     /// The currently selected audio index, if any. Only available if streaming from a HLS server (m3u8).
 74 |     private(set) public var selectedAudioIndex: Int = -1
macro expansion @ObservationTracked:3:6: error: 'ObservationIgnored()' is only available in iOS 17.0 or newer
`- /Users/admin/builder/spi-builder-workspace/Sources/Controllers/VideoPlayer.swift:74:57: note: expanded code originates here
 12 | /// Video Player Controller interfacing the underlying `AVPlayer`, exposing states and controls to the UI.
 13 | @Observable
 14 | public class VideoPlayer: Sendable {
    |              `- note: add '@available' attribute to enclosing class
 15 |     //MARK: Video Player and Video Renderer
 16 |     /// The video player.
    :
 72 |     private(set) public var audioOptions: [AudioOption] = []
 73 |     /// The currently selected audio index, if any. Only available if streaming from a HLS server (m3u8).
 74 |     private(set) public var selectedAudioIndex: Int = -1
    +--- macro expansion @ObservationTracked ---------------------------
    |1 | /// The currently selected audio index, if any. Only available if streaming from a HLS server (m3u8).
    |2 |
    |3 |     @ObservationIgnored
    |  |      `- error: 'ObservationIgnored()' is only available in iOS 17.0 or newer
    |4 | private  var _selectedAudioIndex: Int = -1
    +-------------------------------------------------------------------
 75 |     /// `true` if the control panel should be visible to the user.
 76 |     private(set) public var shouldShowControlPanel: Bool = true
macro expansion @ObservationTracked:3:6: error: 'ObservationIgnored()' is only available in iOS 17.0 or newer
`- /Users/admin/builder/spi-builder-workspace/Sources/Controllers/VideoPlayer.swift:76:64: note: expanded code originates here
 12 | /// Video Player Controller interfacing the underlying `AVPlayer`, exposing states and controls to the UI.
 13 | @Observable
 14 | public class VideoPlayer: Sendable {
    |              `- note: add '@available' attribute to enclosing class
 15 |     //MARK: Video Player and Video Renderer
 16 |     /// The video player.
    :
 74 |     private(set) public var selectedAudioIndex: Int = -1
 75 |     /// `true` if the control panel should be visible to the user.
 76 |     private(set) public var shouldShowControlPanel: Bool = true
    +--- macro expansion @ObservationTracked ---------------------------
    |1 | /// `true` if the control panel should be visible to the user.
    |2 |
    |3 |     @ObservationIgnored
    |  |      `- error: 'ObservationIgnored()' is only available in iOS 17.0 or newer
    |4 | private  var _shouldShowControlPanel: Bool = true
    +-------------------------------------------------------------------
 77 |     /// `true` if the control panel should present resolution & audio options to the user.
 78 |     private(set) public var shouldShowPlaybackOptions: Bool = false
macro expansion @ObservationTracked:3:6: error: 'ObservationIgnored()' is only available in iOS 17.0 or newer
`- /Users/admin/builder/spi-builder-workspace/Sources/Controllers/VideoPlayer.swift:78:68: note: expanded code originates here
 12 | /// Video Player Controller interfacing the underlying `AVPlayer`, exposing states and controls to the UI.
 13 | @Observable
 14 | public class VideoPlayer: Sendable {
    |              `- note: add '@available' attribute to enclosing class
 15 |     //MARK: Video Player and Video Renderer
 16 |     /// The video player.
    :
 76 |     private(set) public var shouldShowControlPanel: Bool = true
 77 |     /// `true` if the control panel should present resolution & audio options to the user.
 78 |     private(set) public var shouldShowPlaybackOptions: Bool = false
    +--- macro expansion @ObservationTracked ---------------------------
    |1 | /// `true` if the control panel should present resolution & audio options to the user.
    |2 |
    |3 |     @ObservationIgnored
    |  |      `- error: 'ObservationIgnored()' is only available in iOS 17.0 or newer
    |4 | private  var _shouldShowPlaybackOptions: Bool = false
    +-------------------------------------------------------------------
 79 |     /// `true` if the HLS stream has a bitrate ladder with at least 2 rungs and the custom configuration doesn't prevent user selection.
 80 |     public var canChooseResolution: Bool {
macro expansion @ObservationTracked:5:6: error: 'ObservationIgnored()' is only available in iOS 17.0 or newer
`- /Users/admin/builder/spi-builder-workspace/Sources/Controllers/VideoPlayer.swift:99:39: note: expanded code originates here
 12 | /// Video Player Controller interfacing the underlying `AVPlayer`, exposing states and controls to the UI.
 13 | @Observable
 14 | public class VideoPlayer: Sendable {
    |              `- note: add '@available' attribute to enclosing class
 15 |     //MARK: Video Player and Video Renderer
 16 |     /// The video player.
    :
 97 |     ///
 98 |     /// This variable is updated by video playback but can be overwritten by a scrubber, in conjunction with `scrubState`.
 99 |     public var currentTime: Double = 0
    +--- macro expansion @ObservationTracked ---------------------------
    |3 |     /// This variable is updated by video playback but can be overwritten by a scrubber, in conjunction with `scrubState`.
    |4 |
    |5 |     @ObservationIgnored
    |  |      `- error: 'ObservationIgnored()' is only available in iOS 17.0 or newer
    |6 | private  var _currentTime: Double = 0
    +-------------------------------------------------------------------
100 |     public enum ScrubState {
101 |         /// The scrubber is not active and reflects the video's current playback time.
macro expansion @ObservationTracked:3:6: error: 'ObservationIgnored()' is only available in iOS 17.0 or newer
`- /Users/admin/builder/spi-builder-workspace/Sources/Controllers/VideoPlayer.swift:130:6: note: expanded code originates here
 12 | /// Video Player Controller interfacing the underlying `AVPlayer`, exposing states and controls to the UI.
 13 | @Observable
 14 | public class VideoPlayer: Sendable {
    |              `- note: add '@available' attribute to enclosing class
 15 |     //MARK: Video Player and Video Renderer
 16 |     /// The video player.
    :
128 |           }
129 |        }
130 |     }
    +--- macro expansion @ObservationTracked ---------------------------
    | 1 | /// The current state of the scrubber.
    | 2 |
    | 3 |     @ObservationIgnored
    |   |      `- error: 'ObservationIgnored()' is only available in iOS 17.0 or newer
    | 4 | private  var _scrubState: ScrubState = .notScrubbing {
    | 5 |
    +-------------------------------------------------------------------
131 |
132 |     //MARK: Private variables
macro expansion @ObservationTracked:3:6: error: 'ObservationIgnored()' is only available in iOS 17.0 or newer
`- /Users/admin/builder/spi-builder-workspace/Sources/Controllers/VideoPlayer.swift:133:44: note: expanded code originates here
 12 | /// Video Player Controller interfacing the underlying `AVPlayer`, exposing states and controls to the UI.
 13 | @Observable
 14 | public class VideoPlayer: Sendable {
    |              `- note: add '@available' attribute to enclosing class
 15 |     //MARK: Video Player and Video Renderer
 16 |     /// The video player.
    :
131 |
132 |     //MARK: Private variables
133 |     private var displayLink: CADisplayLink?
    +--- macro expansion @ObservationTracked ---------------------------
    |1 | //MARK: Private variables
    |2 |
    |3 |     @ObservationIgnored
    |  |      `- error: 'ObservationIgnored()' is only available in iOS 17.0 or newer
    |4 | private  var _displayLink: CADisplayLink?
    +-------------------------------------------------------------------
134 |     private var videoOutput: AVPlayerItemVideoOutput?
135 |     private var timeObserver: Any?
macro expansion @ObservationTracked:1:2: error: 'ObservationIgnored()' is only available in iOS 17.0 or newer
`- /Users/admin/builder/spi-builder-workspace/Sources/Controllers/VideoPlayer.swift:134:54: note: expanded code originates here
 12 | /// Video Player Controller interfacing the underlying `AVPlayer`, exposing states and controls to the UI.
 13 | @Observable
 14 | public class VideoPlayer: Sendable {
    |              `- note: add '@available' attribute to enclosing class
 15 |     //MARK: Video Player and Video Renderer
 16 |     /// The video player.
    :
132 |     //MARK: Private variables
133 |     private var displayLink: CADisplayLink?
134 |     private var videoOutput: AVPlayerItemVideoOutput?
    +--- macro expansion @ObservationTracked ---------------------------
    |1 | @ObservationIgnored
    |  |  `- error: 'ObservationIgnored()' is only available in iOS 17.0 or newer
    |2 | private  var _videoOutput: AVPlayerItemVideoOutput?
    +-------------------------------------------------------------------
135 |     private var timeObserver: Any?
136 |     private var durationObserver: NSKeyValueObservation?
macro expansion @ObservationTracked:1:2: error: 'ObservationIgnored()' is only available in iOS 17.0 or newer
`- /Users/admin/builder/spi-builder-workspace/Sources/Controllers/VideoPlayer.swift:135:35: note: expanded code originates here
 12 | /// Video Player Controller interfacing the underlying `AVPlayer`, exposing states and controls to the UI.
 13 | @Observable
 14 | public class VideoPlayer: Sendable {
    |              `- note: add '@available' attribute to enclosing class
 15 |     //MARK: Video Player and Video Renderer
 16 |     /// The video player.
    :
133 |     private var displayLink: CADisplayLink?
134 |     private var videoOutput: AVPlayerItemVideoOutput?
135 |     private var timeObserver: Any?
    +--- macro expansion @ObservationTracked ---------------------------
    |1 | @ObservationIgnored
    |  |  `- error: 'ObservationIgnored()' is only available in iOS 17.0 or newer
    |2 | private  var _timeObserver: Any?
    +-------------------------------------------------------------------
136 |     private var durationObserver: NSKeyValueObservation?
137 |     private var mediaStatusObserver: NSKeyValueObservation?
macro expansion @ObservationTracked:1:2: error: 'ObservationIgnored()' is only available in iOS 17.0 or newer
`- /Users/admin/builder/spi-builder-workspace/Sources/Controllers/VideoPlayer.swift:136:57: note: expanded code originates here
 12 | /// Video Player Controller interfacing the underlying `AVPlayer`, exposing states and controls to the UI.
 13 | @Observable
 14 | public class VideoPlayer: Sendable {
    |              `- note: add '@available' attribute to enclosing class
 15 |     //MARK: Video Player and Video Renderer
 16 |     /// The video player.
    :
134 |     private var videoOutput: AVPlayerItemVideoOutput?
135 |     private var timeObserver: Any?
136 |     private var durationObserver: NSKeyValueObservation?
    +--- macro expansion @ObservationTracked ---------------------------
    |1 | @ObservationIgnored
    |  |  `- error: 'ObservationIgnored()' is only available in iOS 17.0 or newer
    |2 | private  var _durationObserver: NSKeyValueObservation?
    +-------------------------------------------------------------------
137 |     private var mediaStatusObserver: NSKeyValueObservation?
138 |     private var bufferingObserver: NSKeyValueObservation?
macro expansion @ObservationTracked:1:2: error: 'ObservationIgnored()' is only available in iOS 17.0 or newer
`- /Users/admin/builder/spi-builder-workspace/Sources/Controllers/VideoPlayer.swift:137:60: note: expanded code originates here
 12 | /// Video Player Controller interfacing the underlying `AVPlayer`, exposing states and controls to the UI.
 13 | @Observable
 14 | public class VideoPlayer: Sendable {
    |              `- note: add '@available' attribute to enclosing class
 15 |     //MARK: Video Player and Video Renderer
 16 |     /// The video player.
    :
135 |     private var timeObserver: Any?
136 |     private var durationObserver: NSKeyValueObservation?
137 |     private var mediaStatusObserver: NSKeyValueObservation?
    +--- macro expansion @ObservationTracked ---------------------------
    |1 | @ObservationIgnored
    |  |  `- error: 'ObservationIgnored()' is only available in iOS 17.0 or newer
    |2 | private  var _mediaStatusObserver: NSKeyValueObservation?
    +-------------------------------------------------------------------
138 |     private var bufferingObserver: NSKeyValueObservation?
139 |     private var dismissControlPanelTask: Task<Void, Never>?
macro expansion @ObservationTracked:1:2: error: 'ObservationIgnored()' is only available in iOS 17.0 or newer
`- /Users/admin/builder/spi-builder-workspace/Sources/Controllers/VideoPlayer.swift:138:58: note: expanded code originates here
 12 | /// Video Player Controller interfacing the underlying `AVPlayer`, exposing states and controls to the UI.
 13 | @Observable
 14 | public class VideoPlayer: Sendable {
    |              `- note: add '@available' attribute to enclosing class
 15 |     //MARK: Video Player and Video Renderer
 16 |     /// The video player.
    :
136 |     private var durationObserver: NSKeyValueObservation?
137 |     private var mediaStatusObserver: NSKeyValueObservation?
138 |     private var bufferingObserver: NSKeyValueObservation?
    +--- macro expansion @ObservationTracked ---------------------------
    |1 | @ObservationIgnored
    |  |  `- error: 'ObservationIgnored()' is only available in iOS 17.0 or newer
    |2 | private  var _bufferingObserver: NSKeyValueObservation?
    +-------------------------------------------------------------------
139 |     private var dismissControlPanelTask: Task<Void, Never>?
140 |     private var playlistReader: PlaylistReader?
macro expansion @ObservationTracked:1:2: error: 'ObservationIgnored()' is only available in iOS 17.0 or newer
`- /Users/admin/builder/spi-builder-workspace/Sources/Controllers/VideoPlayer.swift:139:60: note: expanded code originates here
 12 | /// Video Player Controller interfacing the underlying `AVPlayer`, exposing states and controls to the UI.
 13 | @Observable
 14 | public class VideoPlayer: Sendable {
    |              `- note: add '@available' attribute to enclosing class
 15 |     //MARK: Video Player and Video Renderer
 16 |     /// The video player.
    :
137 |     private var mediaStatusObserver: NSKeyValueObservation?
138 |     private var bufferingObserver: NSKeyValueObservation?
139 |     private var dismissControlPanelTask: Task<Void, Never>?
    +--- macro expansion @ObservationTracked ---------------------------
    |1 | @ObservationIgnored
    |  |  `- error: 'ObservationIgnored()' is only available in iOS 17.0 or newer
    |2 | private  var _dismissControlPanelTask: Task<Void, Never>?
    +-------------------------------------------------------------------
140 |     private var playlistReader: PlaylistReader?
141 |     private var delegate: PlaylistLoaderDelegate?
macro expansion @ObservationTracked:1:2: error: 'ObservationIgnored()' is only available in iOS 17.0 or newer
`- /Users/admin/builder/spi-builder-workspace/Sources/Controllers/VideoPlayer.swift:140:48: note: expanded code originates here
 12 | /// Video Player Controller interfacing the underlying `AVPlayer`, exposing states and controls to the UI.
 13 | @Observable
 14 | public class VideoPlayer: Sendable {
    |              `- note: add '@available' attribute to enclosing class
 15 |     //MARK: Video Player and Video Renderer
 16 |     /// The video player.
    :
138 |     private var bufferingObserver: NSKeyValueObservation?
139 |     private var dismissControlPanelTask: Task<Void, Never>?
140 |     private var playlistReader: PlaylistReader?
    +--- macro expansion @ObservationTracked ---------------------------
    |1 | @ObservationIgnored
    |  |  `- error: 'ObservationIgnored()' is only available in iOS 17.0 or newer
    |2 | private  var _playlistReader: PlaylistReader?
    +-------------------------------------------------------------------
141 |     private var delegate: PlaylistLoaderDelegate?
142 |
macro expansion @ObservationTracked:1:2: error: 'ObservationIgnored()' is only available in iOS 17.0 or newer
`- /Users/admin/builder/spi-builder-workspace/Sources/Controllers/VideoPlayer.swift:141:50: note: expanded code originates here
 12 | /// Video Player Controller interfacing the underlying `AVPlayer`, exposing states and controls to the UI.
 13 | @Observable
 14 | public class VideoPlayer: Sendable {
    |              `- note: add '@available' attribute to enclosing class
 15 |     //MARK: Video Player and Video Renderer
 16 |     /// The video player.
    :
139 |     private var dismissControlPanelTask: Task<Void, Never>?
140 |     private var playlistReader: PlaylistReader?
141 |     private var delegate: PlaylistLoaderDelegate?
    +--- macro expansion @ObservationTracked ---------------------------
    |1 | @ObservationIgnored
    |  |  `- error: 'ObservationIgnored()' is only available in iOS 17.0 or newer
    |2 | private  var _delegate: PlaylistLoaderDelegate?
    +-------------------------------------------------------------------
142 |
143 |     //MARK: Public methods
/Users/admin/builder/spi-builder-workspace/Sources/Controllers/VideoPlayer.swift:21:26: error: 'AVSampleBufferVideoRenderer' is only available in iOS 17.0 or newer
 12 | /// Video Player Controller interfacing the underlying `AVPlayer`, exposing states and controls to the UI.
 13 | @Observable
 14 | public class VideoPlayer: Sendable {
    |              `- note: add '@available' attribute to enclosing class
 15 |     //MARK: Video Player and Video Renderer
 16 |     /// The video player.
    :
 19 |     private var injector: APMPInjector?
 20 |     /// The video renderer to use for media that are frame-packed side by side or over under.
 21 |     public var renderer: AVSampleBufferVideoRenderer? {
    |                |         `- error: 'AVSampleBufferVideoRenderer' is only available in iOS 17.0 or newer
    |                `- note: add '@available' attribute to enclosing property
 22 |         injector?.renderer
 23 |     }
OpenImmersive/VideoPlayer.swift:123:36: warning: main actor-isolated property 'renderer' can not be referenced from a Sendable closure
`- /Users/admin/builder/spi-builder-workspace/Sources/Controllers/VideoPlayer.swift:130:6: note: expanded code originates here
 19 |     private var injector: APMPInjector?
 20 |     /// The video renderer to use for media that are frame-packed side by side or over under.
 21 |     public var renderer: AVSampleBufferVideoRenderer? {
    |                `- note: property declared here
 22 |         injector?.renderer
 23 |     }
    :
128 |           }
129 |        }
130 |     }
    +--- macro expansion @ObservationTracked ---------------------------
    |18 |                                  return
    |19 |                              }
    |20 |                              self?.renderer?.flush()
    |   |                                    `- warning: main actor-isolated property 'renderer' can not be referenced from a Sendable closure
    |21 |                              self?.scrubState = .notScrubbing
    |22 |                              self?.restartControlPanelTask()
    +-------------------------------------------------------------------
131 |
132 |     //MARK: Private variables
OpenImmersive/VideoPlayer.swift:124:36: warning: main actor-isolated property 'scrubState' can not be mutated from a Sendable closure
`- /Users/admin/builder/spi-builder-workspace/Sources/Controllers/VideoPlayer.swift:130:6: note: expanded code originates here
107 |     }
108 |     /// The current state of the scrubber.
109 |     public var scrubState: ScrubState = .notScrubbing {
    |                `- note: mutation of this property is only permitted within the actor
110 |        didSet {
111 |           switch scrubState {
    :
128 |           }
129 |        }
130 |     }
    +--- macro expansion @ObservationTracked ---------------------------
    |19 |                              }
    |20 |                              self?.renderer?.flush()
    |21 |                              self?.scrubState = .notScrubbing
    |   |                                    `- warning: main actor-isolated property 'scrubState' can not be mutated from a Sendable closure
    |22 |                              self?.restartControlPanelTask()
    |23 |                          }
    +-------------------------------------------------------------------
131 |
132 |     //MARK: Private variables
OpenImmersive/VideoPlayer.swift:125:36: warning: call to main actor-isolated instance method 'restartControlPanelTask()' in a synchronous nonisolated context [#ActorIsolatedCall]
`- /Users/admin/builder/spi-builder-workspace/Sources/Controllers/VideoPlayer.swift:130:6: note: expanded code originates here
128 |           }
129 |        }
130 |     }
    +--- macro expansion @ObservationTracked ---------------------------
    |20 |                              self?.renderer?.flush()
    |21 |                              self?.scrubState = .notScrubbing
    |22 |                              self?.restartControlPanelTask()
    |   |                                    `- warning: call to main actor-isolated instance method 'restartControlPanelTask()' in a synchronous nonisolated context [#ActorIsolatedCall]
    |23 |                          }
    |24 |                          hasReachedEnd = false
    +-------------------------------------------------------------------
131 |
132 |     //MARK: Private variables
    :
621 |
622 |     /// Restart a task with a 10-second timer to auto-hide the control panel.
623 |     public func restartControlPanelTask() {
    |                 `- note: calls to instance method 'restartControlPanelTask()' from outside of its actor context are implicitly asynchronous
624 |         cancelControlPanelTask()
625 |         dismissControlPanelTask = Task {
macro expansion @Observable:1:70: error: 'ObservationRegistrar' is only available in iOS 17.0 or newer
`- /Users/admin/builder/spi-builder-workspace/Sources/Controllers/VideoPlayer.swift:639:1: note: expanded code originates here
 11 |
 12 | /// Video Player Controller interfacing the underlying `AVPlayer`, exposing states and controls to the UI.
 13 | @Observable
    | `- note: in expansion of macro 'Observable' on class 'VideoPlayer' here
 14 | public class VideoPlayer: Sendable {
    |              `- note: add '@available' attribute to enclosing class
 15 |     //MARK: Video Player and Video Renderer
 16 |     /// The video player.
    :
637 |         dismissControlPanelTask = nil
638 |     }
639 | }
    +--- macro expansion @Observable -----------------------------------
    | 1 | @ObservationIgnored private let _$observationRegistrar = Observation.ObservationRegistrar()
    |   |                                                                      `- error: 'ObservationRegistrar' is only available in iOS 17.0 or newer
    | 2 |
    | 3 | internal nonisolated func access<$s13OpenImmersive11VideoPlayer10ObservablefMm_6MemberfMu_>(
    +-------------------------------------------------------------------
640 |
/Users/admin/builder/spi-builder-workspace/Sources/Controllers/VideoPlayer.swift:13:2: error: 'Observable()' is only available in iOS 17.0 or newer
 11 |
 12 | /// Video Player Controller interfacing the underlying `AVPlayer`, exposing states and controls to the UI.
 13 | @Observable
    |  `- error: 'Observable()' is only available in iOS 17.0 or newer
 14 | public class VideoPlayer: Sendable {
    |              `- note: add '@available' attribute to enclosing class
 15 |     //MARK: Video Player and Video Renderer
 16 |     /// The video player.
/Users/admin/builder/spi-builder-workspace/Sources/Extensions/AVMetadataIdentifier+Codable.swift:11:1: warning: extension declares a conformance of imported type 'AVMetadataIdentifier' to imported protocols 'Decodable', 'Encodable'; this will not behave correctly if the owners of 'AVFoundation' introduce this conformance in the future
 9 |
10 | /// Codable extension of AVMetadataIdentifier so it can be used in VideoItem
11 | extension AVMetadataIdentifier: Codable {
   | |- warning: extension declares a conformance of imported type 'AVMetadataIdentifier' to imported protocols 'Decodable', 'Encodable'; this will not behave correctly if the owners of 'AVFoundation' introduce this conformance in the future
   | `- note: add '@retroactive' to silence this warning
12 |     public typealias RawValue = String
13 |
/Users/admin/builder/spi-builder-workspace/Sources/Models/SpatialVideoTransferable.swift:19:52: error: 'TransferRepresentation' is only available in iOS 16.0 or newer
10 |
11 | /// A representation for a spatial or immersive video selected from the Photos API or dragged and dropped onto the app
12 | public struct SpatialVideo: Transferable {
   |               `- note: add '@available' attribute to enclosing struct
13 |     public enum Status: Sendable {
14 |         case failed, ready
   :
17 |     public let url: URL
18 |
19 |     public static var transferRepresentation: some TransferRepresentation {
   |                       |                            `- error: 'TransferRepresentation' is only available in iOS 16.0 or newer
   |                       `- note: add '@available' attribute to enclosing static property
20 |         FileRepresentation(contentType: .audiovisualContent) { file in
21 |             SentTransferredFile(file.url)
/Users/admin/builder/spi-builder-workspace/Sources/Models/VideoScreen.swift:91:20: error: 'VideoPlayerComponent' is only available in iOS 18.0 or newer
 76 | }
 77 |
 78 | public extension VideoPlayer {
    |        `- note: add '@available' attribute to enclosing extension
 79 |     /// A RealityKit video material created from the underlying AVPlayer or AVSampleBufferVideoRenderer,
 80 |     /// depending on whether the media has frame packing or not.
    :
 89 |     /// A RealityKit video player component created from the underlying AVPlayer or AVSampleBufferVideoRenderer,
 90 |     /// depending on whether the media has frame packing or not.
 91 |     var component: VideoPlayerComponent {
    |         |          `- error: 'VideoPlayerComponent' is only available in iOS 18.0 or newer
    |         `- note: add '@available' attribute to enclosing property
 92 |         var component: VideoPlayerComponent
 93 |         if let renderer {
/Users/admin/builder/spi-builder-workspace/Sources/Utils/APMPInjector.swift:22:27: error: 'AVSampleBufferVideoRenderer' is only available in iOS 17.0 or newer
 11 |
 12 | /// Injects APMP metadata into frames to render stereo frame-packed media efficiently.
 13 | public class APMPInjector {
    |              `- note: add '@available' attribute to enclosing class
 14 |     /// Errors specific to APMP Injector.
 15 |     public enum APMPInjectorError: Error {
    :
 20 |     /// The renderer to use for enqueueing. Expose this so callers can
 21 |     /// associate it with a display layer or RealityKit component.
 22 |     public let renderer = AVSampleBufferVideoRenderer()
    |                           `- error: 'AVSampleBufferVideoRenderer' is only available in iOS 17.0 or newer
 23 |     /// The source media's frame packing type, must be .sideBySide or .overUnder.
 24 |     private let packing: VideoItem.FramePacking
/Users/admin/builder/spi-builder-workspace/Sources/Utils/Closures.swift:19:29: error: cannot find type 'simd_quatf' in scope
17 |     public var body: CustomViewBuilder
18 |     public var position: SIMD3<Float>
19 |     public var orientation: simd_quatf
   |                             `- error: cannot find type 'simd_quatf' in scope
20 |     public var relativeToControlPanel: Bool
21 |
/Users/admin/builder/spi-builder-workspace/Sources/Utils/Closures.swift:22:101: error: cannot find type 'simd_quatf' in scope
20 |     public var relativeToControlPanel: Bool
21 |
22 |     public init(id: String, body: @escaping CustomViewBuilder, position: SIMD3<Float>, orientation: simd_quatf, relativeToControlPanel: Bool) {
   |                                                                                                     `- error: cannot find type 'simd_quatf' in scope
23 |         self.id = id
24 |         self.body = body
/Users/admin/builder/spi-builder-workspace/Sources/Views/ControlPanel.swift:498:9: error: cannot find 'Attachment' in scope
496 |         }
497 |     } attachments: {
498 |         Attachment(id: "ControlPanel") {
    |         `- error: cannot find 'Attachment' in scope
499 |             ControlPanel(videoPlayer: .constant(VideoPlayer()))
500 |         }
/Users/admin/builder/spi-builder-workspace/Sources/Views/ControlPanel.swift:497:20: error: extra trailing closure passed in call
495 |             content.add(entity)
496 |         }
497 |     } attachments: {
    |                    `- error: extra trailing closure passed in call
498 |         Attachment(id: "ControlPanel") {
499 |             ControlPanel(videoPlayer: .constant(VideoPlayer()))
/Users/admin/builder/spi-builder-workspace/Sources/Views/ControlPanel.swift:493:19: error: contextual closure type '@MainActor @Sendable (inout RealityViewCameraContent) async -> Void' expects 1 argument, but 2 were used in closure body
491 |
492 | #Preview {
493 |     RealityView { content, attachments in
    |                   `- error: contextual closure type '@MainActor @Sendable (inout RealityViewCameraContent) async -> Void' expects 1 argument, but 2 were used in closure body
494 |         if let entity = attachments.entity(for: "ControlPanel") {
495 |             content.add(entity)
/Users/admin/builder/spi-builder-workspace/Sources/Views/DropTarget.swift:74:9: error: extraneous argument label 'windowStyle:' in macro expansion
72 | }
73 |
74 | #Preview(windowStyle: .automatic) {
   |         `- error: extraneous argument label 'windowStyle:' in macro expansion
75 |     DropTarget() {
76 |         Color.clear
/Users/admin/builder/spi-builder-workspace/Sources/Views/DropTarget.swift:74:24: error: type 'String?' has no member 'automatic'
72 | }
73 |
74 | #Preview(windowStyle: .automatic) {
   |                        `- error: type 'String?' has no member 'automatic'
75 |     DropTarget() {
76 |         Color.clear
/Users/admin/builder/spi-builder-workspace/Sources/Views/GalleryVideoPicker.swift:14:38: error: 'PhotosPickerItem' is only available in iOS 16.0 or newer
10 |
11 | /// A button revealing a `PhotosPicker` configured to only show videos or spatial videos.
12 | public struct GalleryVideoPicker: View {
   |               `- note: add '@available' attribute to enclosing struct
13 |     /// The currently selected item, if any.
14 |     @State private var selectedItem: PhotosPickerItem?
   |                        |             `- error: 'PhotosPickerItem' is only available in iOS 16.0 or newer
   |                        `- note: add '@available' attribute to enclosing property
15 |
16 |     /// Whether the picker should show spatial videos only.
macro expansion @State:2:24: error: 'PhotosPickerItem' is only available in iOS 16.0 or newer
`- /Users/admin/builder/spi-builder-workspace/Sources/Views/GalleryVideoPicker.swift:14:55: note: expanded code originates here
10 |
11 | /// A button revealing a `PhotosPicker` configured to only show videos or spatial videos.
12 | public struct GalleryVideoPicker: View {
   |               `- note: add '@available' attribute to enclosing struct
13 |     /// The currently selected item, if any.
14 |     @State private var selectedItem: PhotosPickerItem?
   |     `- note: in expansion of macro 'State' on property 'selectedItem' here
   +--- macro expansion @State -----------------------------------------
   | 1 | private var __selectedItem = SwiftUICore.State._makeStorage(({
   | 2 |             let value: PhotosPickerItem? = nil
   |   |                        `- error: 'PhotosPickerItem' is only available in iOS 16.0 or newer
   | 3 |             return value
   | 4 |         }))
   +--------------------------------------------------------------------
15 |
16 |     /// Whether the picker should show spatial videos only.
macro expansion @State:8:27: error: 'PhotosPickerItem' is only available in iOS 16.0 or newer
`- /Users/admin/builder/spi-builder-workspace/Sources/Views/GalleryVideoPicker.swift:14:55: note: expanded code originates here
10 |
11 | /// A button revealing a `PhotosPicker` configured to only show videos or spatial videos.
12 | public struct GalleryVideoPicker: View {
   |               `- note: add '@available' attribute to enclosing struct
13 |     /// The currently selected item, if any.
14 |     @State private var selectedItem: PhotosPickerItem?
   |     `- note: in expansion of macro 'State' on property 'selectedItem' here
   +--- macro expansion @State -----------------------------------------
   | 6 | @SwiftUICore._StatePropertyWrapperStorage(initialValue: "JHMxM09wZW5JbW1lcnNpdmUxOEdhbGxlcnlWaWRlb1BpY2tlclYxMnNlbGVjdGVkSXRlbTMzXzVERDM3RDgzNjlBNUQwMzJCOTE4NTk3MDAxRTQxMEJBTEw1U3RhdGVmTXBfMjBfaW5pdGlhbFN0b3JlZFZhbHVlX2ZNdV8=")
   | 7 | private var _selectedItem: SwiftUICore.State<_>! = SwiftUICore._stateNil(of: {
   | 8 |         SwiftUICore.State<PhotosPickerItem?>(initialValue: nil)
   |   |                           `- error: 'PhotosPickerItem' is only available in iOS 16.0 or newer
   | 9 |     })
   |10 |
   +--------------------------------------------------------------------
15 |
16 |     /// Whether the picker should show spatial videos only.
macro expansion @State:12:47: error: 'PhotosPickerItem' is only available in iOS 16.0 or newer
`- /Users/admin/builder/spi-builder-workspace/Sources/Views/GalleryVideoPicker.swift:14:55: note: expanded code originates here
10 |
11 | /// A button revealing a `PhotosPicker` configured to only show videos or spatial videos.
12 | public struct GalleryVideoPicker: View {
   |               `- note: add '@available' attribute to enclosing struct
13 |     /// The currently selected item, if any.
14 |     @State private var selectedItem: PhotosPickerItem?
   |     `- note: in expansion of macro 'State' on property 'selectedItem' here
   +--- macro expansion @State -----------------------------------------
   |10 |
   |11 | @SwiftUICore._StateProjectedValue
   |12 | private var $selectedItem = SwiftUICore.State<PhotosPickerItem?>(initialValue: nil).projectedValue
   |   |                                               `- error: 'PhotosPickerItem' is only available in iOS 16.0 or newer
   |13 |
   |14 | @SwiftUICore._StateInitialStoredValue("U3dpZnRVSUNvcmUuU3RhdGUuX21ha2VTdG9yYWdlKGluaXRpYWxWYWx1ZTogeyBsZXQgeDogUGhvdG9zUGlja2VySXRlbT8gPSBuaWwKcmV0dXJuIHggfSgpKQ==")
   +--------------------------------------------------------------------
15 |
16 |     /// Whether the picker should show spatial videos only.
macro expansion @State:16:20: error: 'PhotosPickerItem' is only available in iOS 16.0 or newer
`- /Users/admin/builder/spi-builder-workspace/Sources/Views/GalleryVideoPicker.swift:14:55: note: expanded code originates here
10 |
11 | /// A button revealing a `PhotosPicker` configured to only show videos or spatial videos.
12 | public struct GalleryVideoPicker: View {
   |               `- note: add '@available' attribute to enclosing struct
13 |     /// The currently selected item, if any.
14 |     @State private var selectedItem: PhotosPickerItem?
   |     `- note: in expansion of macro 'State' on property 'selectedItem' here
   +--- macro expansion @State -----------------------------------------
   |14 | @SwiftUICore._StateInitialStoredValue("U3dpZnRVSUNvcmUuU3RhdGUuX21ha2VTdG9yYWdlKGluaXRpYWxWYWx1ZTogeyBsZXQgeDogUGhvdG9zUGlja2VySXRlbT8gPSBuaWwKcmV0dXJuIHggfSgpKQ==")
   |15 | private static var $s13OpenImmersive18GalleryVideoPickerV12selectedItem33_5DD37D8369A5D032B918597001E410BALL5StatefMp_20_initialStoredValue_fMu_ = (SwiftUICore.State._makeStorage(initialValue: {
   |16 |             let x: PhotosPickerItem? = nil
   |   |                    `- error: 'PhotosPickerItem' is only available in iOS 16.0 or newer
   |17 |             return x
   |18 |         }()))
   +--------------------------------------------------------------------
15 |
16 |     /// Whether the picker should show spatial videos only.
[#ActorIsolatedCall]: <https://docs.swift.org/compiler/documentation/diagnostics/actor-isolated-call>
Failed frontend command:
/Applications/Xcode-27.0.0.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift-frontend -frontend -emit-module -experimental-skip-non-inlinable-function-bodies-without-types /Users/admin/builder/spi-builder-workspace/Sources/Controllers/HeadTracker.swift /Users/admin/builder/spi-builder-workspace/Sources/Controllers/VideoPlayer.swift /Users/admin/builder/spi-builder-workspace/Sources/Extensions/AVMetadataIdentifier+Codable.swift /Users/admin/builder/spi-builder-workspace/Sources/Models/AudioOption.swift /Users/admin/builder/spi-builder-workspace/Sources/Models/BitrateRung.swift /Users/admin/builder/spi-builder-workspace/Sources/Models/SpatialVideoTransferable.swift /Users/admin/builder/spi-builder-workspace/Sources/Models/VideoItem.swift /Users/admin/builder/spi-builder-workspace/Sources/Models/VideoScreen.swift /Users/admin/builder/spi-builder-workspace/Sources/Utils/APMPInjector.swift /Users/admin/builder/spi-builder-workspace/Sources/Utils/Closures.swift /Users/admin/builder/spi-builder-workspace/Sources/Utils/Config.swift /Users/admin/builder/spi-builder-workspace/Sources/Utils/PlaylistLoaderDelegate.swift /Users/admin/builder/spi-builder-workspace/Sources/Utils/PlaylistReader.swift /Users/admin/builder/spi-builder-workspace/Sources/Utils/PlaylistWriter.swift /Users/admin/builder/spi-builder-workspace/Sources/Utils/VideoTools.swift /Users/admin/builder/spi-builder-workspace/Sources/Views/ControlPanel.swift /Users/admin/builder/spi-builder-workspace/Sources/Views/DropTarget.swift /Users/admin/builder/spi-builder-workspace/Sources/Views/FilePicker.swift /Users/admin/builder/spi-builder-workspace/Sources/Views/GalleryVideoPicker.swift /Users/admin/builder/spi-builder-workspace/Sources/Views/ImmersivePlayer.swift /Users/admin/builder/spi-builder-workspace/Sources/Views/StreamUrlInput.swift -target arm64-apple-ios15.0 -disable-cross-import-overlay-search -swift-module-cross-import PhotosUI /Applications/Xcode-27.0.0.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/PhotosUI.framework/Modules/PhotosUI.swiftcrossimport/SwiftUI.swiftoverlay -swift-module-cross-import PhotosUI /Applications/Xcode-27.0.0.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/PhotosUI.framework/Modules/PhotosUI.swiftcrossimport/WidgetKit.swiftoverlay -swift-module-cross-import PhotosUI /Applications/Xcode-27.0.0.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS27.0.sdk/System/Library/Frameworks/PhotosUI.framework/Modules/PhotosUI.swiftcrossimport/SwiftUI.swiftoverlay -swift-module-cross-import PhotosUI /Applications/Xcode-27.0.0.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS27.0.sdk/System/Library/Frameworks/PhotosUI.framework/Modules/PhotosUI.swiftcrossimport/WidgetKit.swiftoverlay -swift-module-cross-import RealityKit /Applications/Xcode-27.0.0.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS27.0.sdk/System/Library/Frameworks/RealityKit.framework/Modules/RealityKit.swiftcrossimport/ComputeGraph.swiftoverlay -swift-module-cross-import RealityKit /Applications/Xcode-27.0.0.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS27.0.sdk/System/Library/Frameworks/RealityKit.framework/Modules/RealityKit.swiftcrossimport/SwiftUI.swiftoverlay -load-resolved-plugin /Applications/Xcode-27.0.0.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/lib/swift/host/plugins/libFoundationMacros.dylib\#/Applications/Xcode-27.0.0.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/swift-plugin-server\#FoundationMacros -load-resolved-plugin /Applications/Xcode-27.0.0.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/lib/swift/host/plugins/libObservationMacros.dylib\#/Applications/Xcode-27.0.0.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/swift-plugin-server\#ObservationMacros -load-resolved-plugin /Applications/Xcode-27.0.0.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/lib/swift/host/plugins/libPreviewsMacros.dylib\#/Applications/Xcode-27.0.0.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/swift-plugin-server\#PreviewsMacros -load-resolved-plugin /Applications/Xcode-27.0.0.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/lib/swift/host/plugins/libSwiftMacros.dylib\#/Applications/Xcode-27.0.0.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/swift-plugin-server\#SwiftMacros -load-resolved-plugin /Applications/Xcode-27.0.0.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/lib/swift/host/plugins/libSwiftUIMacros.dylib\#/Applications/Xcode-27.0.0.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/swift-plugin-server\#SwiftUIMacros -disable-implicit-swift-modules -Xcc -fno-implicit-modules -Xcc -fno-implicit-module-maps -explicit-swift-module-map-file /Users/admin/builder/spi-builder-workspace/.derivedData/Build/Intermediates.noindex/OpenImmersive.build/Debug-iphoneos/OpenImmersive-t.build/Objects-normal/arm64/OpenImmersive-dependencies-1.json -Xllvm -aarch64-use-tbi -enable-objc-interop -stack-check -sdk /Applications/Xcode-27.0.0.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS27.0.sdk -I /Users/admin/builder/spi-builder-workspace/.derivedData/Build/Products/Debug-iphoneos -Isystem /Applications/Xcode-27.0.0.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/lib -F /Users/admin/builder/spi-builder-workspace/.derivedData/Build/Products/Debug-iphoneos -F /Applications/Xcode-27.0.0.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Frameworks -F /Applications/Xcode-27.0.0.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS27.0.sdk/Developer/Library/Frameworks -module-cache-path /Users/admin/builder/spi-builder-workspace/.derivedData/Build/Intermediates.noindex/SwiftExplicitPrecompiledModules -no-color-diagnostics -Xcc -fno-color-diagnostics -enable-testing -g -debug-info-format\=dwarf -dwarf-version\=4 -swift-version 6 -Onone -D SWIFT_PACKAGE -D DEBUG -D SWIFT_MODULE_RESOURCE_BUNDLE_UNAVAILABLE -D Xcode -serialize-debugging-options -enable-experimental-feature DebugDescriptionMacro -default-isolation MainActor -empty-abi-descriptor -validate-clang-modules-once -clang-build-session-file /Users/admin/builder/spi-builder-workspace/.derivedData/ModuleCache.noindex/Session.modulevalidation -Xcc -working-directory -Xcc /Users/admin/builder/spi-builder-workspace/.swiftpm/xcode -enable-anonymous-context-mangled-names -file-compilation-dir /Users/admin/builder/spi-builder-workspace/.swiftpm/xcode -Xcc -D_LIBCPP_HARDENING_MODE\=_LIBCPP_HARDENING_MODE_DEBUG -Xcc -ivfsstatcache -Xcc /Users/admin/builder/spi-builder-workspace/.derivedData/SDKStatCaches.noindex/iphoneos27.0-24A430-e829b21a6f8c9b70876ba0858053c0441fbf9a8c2e33c77c19098db08c7af4fe.sdkstatcache -Xcc -fmodules-prune-interval\=86400 -Xcc -fmodules-prune-after\=345600 -Xcc -I/Users/admin/builder/spi-builder-workspace/.derivedData/Build/Products/Debug-iphoneos/include -Xcc -I/Users/admin/builder/spi-builder-workspace/.derivedData/Build/Intermediates.noindex/OpenImmersive.build/Debug-iphoneos/OpenImmersive-t.build/DerivedSources-normal/arm64 -Xcc -I/Users/admin/builder/spi-builder-workspace/.derivedData/Build/Intermediates.noindex/OpenImmersive.build/Debug-iphoneos/OpenImmersive-t.build/DerivedSources/arm64 -Xcc -I/Users/admin/builder/spi-builder-workspace/.derivedData/Build/Intermediates.noindex/OpenImmersive.build/Debug-iphoneos/OpenImmersive-t.build/DerivedSources -Xcc -DSWIFT_PACKAGE -Xcc -DDEBUG\=1 -no-auto-bridging-header-chaining -module-name OpenImmersive -package-name spi_builder_workspace -const-gather-protocols-file /Users/admin/builder/spi-builder-workspace/.derivedData/Build/Intermediates.noindex/OpenImmersive.build/Debug-iphoneos/OpenImmersive-t.build/Objects-normal/arm64/OpenImmersive_const_extract_protocols.json -disable-clang-spi -clang-target arm64-apple-ios27.0 -target-sdk-version 27.0 -target-sdk-name iphoneos27.0 -in-process-plugin-server-path /Applications/Xcode-27.0.0.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/host/libSwiftInProcPluginServer.dylib -emit-module-doc-path /Users/admin/builder/spi-builder-workspace/.derivedData/Build/Intermediates.noindex/OpenImmersive.build/Debug-iphoneos/OpenImmersive-t.build/Objects-normal/arm64/OpenImmersive.swiftdoc -emit-module-source-info-path /Users/admin/builder/spi-builder-workspace/.derivedData/Build/Intermediates.noindex/OpenImmersive.build/Debug-iphoneos/OpenImmersive-t.build/Objects-normal/arm64/OpenImmersive.swiftsourceinfo -emit-objc-header-path /Users/admin/builder/spi-builder-workspace/.derivedData/Build/Intermediates.noindex/OpenImmersive.build/Debug-iphoneos/OpenImmersive-t.build/Objects-normal/arm64/OpenImmersive-Swift.h -serialize-diagnostics-path /Users/admin/builder/spi-builder-workspace/.derivedData/Build/Intermediates.noindex/OpenImmersive.build/Debug-iphoneos/OpenImmersive-t.build/Objects-normal/arm64/OpenImmersive-primary-emit-module.dia -emit-dependencies-path /Users/admin/builder/spi-builder-workspace/.derivedData/Build/Intermediates.noindex/OpenImmersive.build/Debug-iphoneos/OpenImmersive-t.build/Objects-normal/arm64/OpenImmersive-primary-emit-module.d -parse-as-library -o /Users/admin/builder/spi-builder-workspace/.derivedData/Build/Intermediates.noindex/OpenImmersive.build/Debug-iphoneos/OpenImmersive-t.build/Objects-normal/arm64/OpenImmersive.swiftmodule -emit-abi-descriptor-path /Users/admin/builder/spi-builder-workspace/.derivedData/Build/Intermediates.noindex/OpenImmersive.build/Debug-iphoneos/OpenImmersive-t.build/Objects-normal/arm64/OpenImmersive.abi.json
SwiftCompile normal arm64 (in target 'OpenImmersive' from project 'OpenImmersive')
    cd /Users/admin/builder/spi-builder-workspace/.swiftpm/xcode

SwiftCompile normal arm64 Compiling\ FilePicker.swift,\ GalleryVideoPicker.swift /Users/admin/builder/spi-builder-workspace/Sources/Views/FilePicker.swift /Users/admin/builder/spi-builder-workspace/Sources/Views/GalleryVideoPicker.swift (in target 'OpenImmersive' from project 'OpenImmersive')
/Users/admin/builder/spi-builder-workspace/Sources/Views/ControlPanel.swift:498:9: error: cannot find 'Attachment' in scope
496 |         }
497 |     } attachments: {
498 |         Attachment(id: "ControlPanel") {
    |         `- error: cannot find 'Attachment' in scope
499 |             ControlPanel(videoPlayer: .constant(VideoPlayer()))
500 |         }
/Users/admin/builder/spi-builder-workspace/Sources/Views/ControlPanel.swift:497:20: error: extra trailing closure passed in call
495 |             content.add(entity)
496 |         }
497 |     } attachments: {
    |                    `- error: extra trailing closure passed in call
498 |         Attachment(id: "ControlPanel") {
499 |             ControlPanel(videoPlayer: .constant(VideoPlayer()))
/Users/admin/builder/spi-builder-workspace/Sources/Views/ControlPanel.swift:493:19: error: contextual closure type '@MainActor @Sendable (inout RealityViewCameraContent) async -> Void' expects 1 argument, but 2 were used in closure body
491 |
492 | #Preview {
493 |     RealityView { content, attachments in
    |                   `- error: contextual closure type '@MainActor @Sendable (inout RealityViewCameraContent) async -> Void' expects 1 argument, but 2 were used in closure body
494 |         if let entity = attachments.entity(for: "ControlPanel") {
495 |             content.add(entity)
/Users/admin/builder/spi-builder-workspace/Sources/Views/DropTarget.swift:74:9: error: extraneous argument label 'windowStyle:' in macro expansion
72 | }
73 |
74 | #Preview(windowStyle: .automatic) {
   |         `- error: extraneous argument label 'windowStyle:' in macro expansion
75 |     DropTarget() {
76 |         Color.clear
/Users/admin/builder/spi-builder-workspace/Sources/Views/DropTarget.swift:74:24: error: type 'String?' has no member 'automatic'
72 | }
73 |
74 | #Preview(windowStyle: .automatic) {
   |                        `- error: type 'String?' has no member 'automatic'
75 |     DropTarget() {
76 |         Color.clear
/Users/admin/builder/spi-builder-workspace/Sources/Views/FilePicker.swift:38:21: warning: result of call to 'startAccessingSecurityScopedResource()' is unused [#NoUsage]
36 |                 // Hack: this should be mirrored by url.stopAccessingSecurityScopedResource(),
37 |                 // but it would prevent playing the same file twice.
38 |                 url.startAccessingSecurityScopedResource()
   |                     `- warning: result of call to 'startAccessingSecurityScopedResource()' is unused [#NoUsage]
39 |
40 |                 let isAivuFile = url.lastPathComponent.hasSuffix(".aivu")
/Users/admin/builder/spi-builder-workspace/Sources/Views/GalleryVideoPicker.swift:14:38: error: 'PhotosPickerItem' is only available in iOS 16.0 or newer
10 |
11 | /// A button revealing a `PhotosPicker` configured to only show videos or spatial videos.
12 | public struct GalleryVideoPicker: View {
   |               `- note: add '@available' attribute to enclosing struct
13 |     /// The currently selected item, if any.
14 |     @State private var selectedItem: PhotosPickerItem?
   |                        |             `- error: 'PhotosPickerItem' is only available in iOS 16.0 or newer
   |                        `- note: add '@available' attribute to enclosing property
15 |
16 |     /// Whether the picker should show spatial videos only.
macro expansion @State:2:24: error: 'PhotosPickerItem' is only available in iOS 16.0 or newer
`- /Users/admin/builder/spi-builder-workspace/Sources/Views/GalleryVideoPicker.swift:14:55: note: expanded code originates here
10 |
11 | /// A button revealing a `PhotosPicker` configured to only show videos or spatial videos.
12 | public struct GalleryVideoPicker: View {
   |               `- note: add '@available' attribute to enclosing struct
13 |     /// The currently selected item, if any.
14 |     @State private var selectedItem: PhotosPickerItem?
   |     `- note: in expansion of macro 'State' on property 'selectedItem' here
   +--- macro expansion @State -----------------------------------------
   | 1 | private var __selectedItem = SwiftUICore.State._makeStorage(({
   | 2 |             let value: PhotosPickerItem? = nil
   |   |                        `- error: 'PhotosPickerItem' is only available in iOS 16.0 or newer
   | 3 |             return value
   | 4 |         }))
   +--------------------------------------------------------------------
15 |
16 |     /// Whether the picker should show spatial videos only.
macro expansion @State:8:27: error: 'PhotosPickerItem' is only available in iOS 16.0 or newer
`- /Users/admin/builder/spi-builder-workspace/Sources/Views/GalleryVideoPicker.swift:14:55: note: expanded code originates here
10 |
11 | /// A button revealing a `PhotosPicker` configured to only show videos or spatial videos.
12 | public struct GalleryVideoPicker: View {
   |               `- note: add '@available' attribute to enclosing struct
13 |     /// The currently selected item, if any.
14 |     @State private var selectedItem: PhotosPickerItem?
   |     `- note: in expansion of macro 'State' on property 'selectedItem' here
   +--- macro expansion @State -----------------------------------------
   | 6 | @SwiftUICore._StatePropertyWrapperStorage(initialValue: "JHMxM09wZW5JbW1lcnNpdmUxOEdhbGxlcnlWaWRlb1BpY2tlclYxMnNlbGVjdGVkSXRlbTMzXzVERDM3RDgzNjlBNUQwMzJCOTE4NTk3MDAxRTQxMEJBTEw1U3RhdGVmTXBfMjBfaW5pdGlhbFN0b3JlZFZhbHVlX2ZNdV8=")
   | 7 | private var _selectedItem: SwiftUICore.State<_>! = SwiftUICore._stateNil(of: {
   | 8 |         SwiftUICore.State<PhotosPickerItem?>(initialValue: nil)
   |   |                           `- error: 'PhotosPickerItem' is only available in iOS 16.0 or newer
   | 9 |     })
   |10 |
   +--------------------------------------------------------------------
15 |
16 |     /// Whether the picker should show spatial videos only.
macro expansion @State:12:47: error: 'PhotosPickerItem' is only available in iOS 16.0 or newer
`- /Users/admin/builder/spi-builder-workspace/Sources/Views/GalleryVideoPicker.swift:14:55: note: expanded code originates here
10 |
11 | /// A button revealing a `PhotosPicker` configured to only show videos or spatial videos.
12 | public struct GalleryVideoPicker: View {
   |               `- note: add '@available' attribute to enclosing struct
13 |     /// The currently selected item, if any.
14 |     @State private var selectedItem: PhotosPickerItem?
   |     `- note: in expansion of macro 'State' on property 'selectedItem' here
   +--- macro expansion @State -----------------------------------------
   |10 |
   |11 | @SwiftUICore._StateProjectedValue
   |12 | private var $selectedItem = SwiftUICore.State<PhotosPickerItem?>(initialValue: nil).projectedValue
   |   |                                               `- error: 'PhotosPickerItem' is only available in iOS 16.0 or newer
   |13 |
   |14 | @SwiftUICore._StateInitialStoredValue("U3dpZnRVSUNvcmUuU3RhdGUuX21ha2VTdG9yYWdlKGluaXRpYWxWYWx1ZTogeyBsZXQgeDogUGhvdG9zUGlja2VySXRlbT8gPSBuaWwKcmV0dXJuIHggfSgpKQ==")
   +--------------------------------------------------------------------
15 |
16 |     /// Whether the picker should show spatial videos only.
macro expansion @State:16:20: error: 'PhotosPickerItem' is only available in iOS 16.0 or newer
`- /Users/admin/builder/spi-builder-workspace/Sources/Views/GalleryVideoPicker.swift:14:55: note: expanded code originates here
10 |
11 | /// A button revealing a `PhotosPicker` configured to only show videos or spatial videos.
12 | public struct GalleryVideoPicker: View {
   |               `- note: add '@available' attribute to enclosing struct
13 |     /// The currently selected item, if any.
14 |     @State private var selectedItem: PhotosPickerItem?
   |     `- note: in expansion of macro 'State' on property 'selectedItem' here
   +--- macro expansion @State -----------------------------------------
   |14 | @SwiftUICore._StateInitialStoredValue("U3dpZnRVSUNvcmUuU3RhdGUuX21ha2VTdG9yYWdlKGluaXRpYWxWYWx1ZTogeyBsZXQgeDogUGhvdG9zUGlja2VySXRlbT8gPSBuaWwKcmV0dXJuIHggfSgpKQ==")
   |15 | private static var $s13OpenImmersive18GalleryVideoPickerV12selectedItem33_5DD37D8369A5D032B918597001E410BALL5StatefMp_20_initialStoredValue_fMu_ = (SwiftUICore.State._makeStorage(initialValue: {
   |16 |             let x: PhotosPickerItem? = nil
   |   |                    `- error: 'PhotosPickerItem' is only available in iOS 16.0 or newer
   |17 |             return x
   |18 |         }()))
   +--------------------------------------------------------------------
15 |
16 |     /// Whether the picker should show spatial videos only.
macro expansion @_StateInitialStoredValue:4:24: error: 'PhotosPickerItem' is only available in iOS 16.0 or newer
`- /Users/admin/builder/spi-builder-workspace/Sources/Views/GalleryVideoPicker.swift:14:55: note: expanded code originates here
10 |
11 | /// A button revealing a `PhotosPicker` configured to only show videos or spatial videos.
12 | public struct GalleryVideoPicker: View {
   |               `- note: add '@available' attribute to enclosing struct
13 |     /// The currently selected item, if any.
14 |     @State private var selectedItem: PhotosPickerItem?
   |     |- note: in expansion of macro 'State' on property 'selectedItem' here
   |     |- note: in expansion of macro 'State' on property 'selectedItem' here
   |     `- note: in expansion of macro 'State' on property 'selectedItem' here
   +--- macro expansion @State -----------------------------------------
   |12 | private var $selectedItem = SwiftUICore.State<PhotosPickerItem?>(initialValue: nil).projectedValue
   |13 |
   |14 | @SwiftUICore._StateInitialStoredValue("U3dpZnRVSUNvcmUuU3RhdGUuX21ha2VTdG9yYWdlKGluaXRpYWxWYWx1ZTogeyBsZXQgeDogUGhvdG9zUGlja2VySXRlbT8gPSBuaWwKcmV0dXJuIHggfSgpKQ==")
   |   | |- note: in expansion of macro '_StateInitialStoredValue' on static property '$s13OpenImmersive18GalleryVideoPickerV12selectedItem33_5DD37D8369A5D032B918597001E410BALL5StatefMp_20_initialStoredValue_fMu_' here
   |   | `- note: in expansion of macro '_StateInitialStoredValue' on static property '$s13OpenImmersive18GalleryVideoPickerV12selectedItem33_5DD37D8369A5D032B918597001E410BALL5StatefMp_20_initialStoredValue_fMu_' here
   |15 | private static var $s13OpenImmersive18GalleryVideoPickerV12selectedItem33_5DD37D8369A5D032B918597001E410BALL5StatefMp_20_initialStoredValue_fMu_ = (SwiftUICore.State._makeStorage(initialValue: {
   |   |                    `- note: add '@available' attribute to enclosing static property
   |16 |             let x: PhotosPickerItem? = nil
   |17 |             return x
   |18 |         }()))
   |   +--- macro expansion @_StateInitialStoredValue ------------------
   |   |2 |     get {
   |   |3 |         SwiftUICore.State._makeStorage(initialValue: {
   |   |4 |                 let x: PhotosPickerItem? = nil
   |   |  |                        |- error: 'PhotosPickerItem' is only available in iOS 16.0 or newer
   |   |  |                        `- note: add 'if #available' version check
   |   |5 |                 return x
   |   |6 |             }())
   |   +----------------------------------------------------------------
   +--------------------------------------------------------------------
15 |
16 |     /// Whether the picker should show spatial videos only.
/Users/admin/builder/spi-builder-workspace/Sources/Views/GalleryVideoPicker.swift:24:40: error: 'spatialMedia' is only available in iOS 18.0 or newer
10 |
11 | /// A button revealing a `PhotosPicker` configured to only show videos or spatial videos.
12 | public struct GalleryVideoPicker: View {
   |               `- note: add '@available' attribute to enclosing struct
13 |     /// The currently selected item, if any.
14 |     @State private var selectedItem: PhotosPickerItem?
   :
21 |
22 |     /// The Photos picker filter to use based on `spatialVideosOnly`.
23 |     public var filter: PHPickerFilter {
   |                `- note: add '@available' attribute to enclosing property
24 |         spatialVideosOnly ? .all(of: [.spatialMedia, .not(.images)]) : .videos
   |                                        |- error: 'spatialMedia' is only available in iOS 18.0 or newer
   |                                        `- note: add 'if #available' version check
25 |     }
26 |
/Users/admin/builder/spi-builder-workspace/Sources/Views/GalleryVideoPicker.swift:37:9: error: 'PhotosPicker' is only available in iOS 16.0 or newer
10 |
11 | /// A button revealing a `PhotosPicker` configured to only show videos or spatial videos.
12 | public struct GalleryVideoPicker: View {
   |               `- note: add '@available' attribute to enclosing struct
13 |     /// The currently selected item, if any.
14 |     @State private var selectedItem: PhotosPickerItem?
   :
34 |     }
35 |
36 |     public var body: some View {
   |                `- note: add '@available' attribute to enclosing property
37 |         PhotosPicker(
   |         |- error: 'PhotosPicker' is only available in iOS 16.0 or newer
   |         `- note: add 'if #available' version check
38 |             selection: $selectedItem,
39 |             matching: filter,
/Users/admin/builder/spi-builder-workspace/Sources/Views/GalleryVideoPicker.swift:44:10: error: 'photosPickerDisabledCapabilities' is only available in iOS 17.0 or newer
10 |
11 | /// A button revealing a `PhotosPicker` configured to only show videos or spatial videos.
12 | public struct GalleryVideoPicker: View {
   |               `- note: add '@available' attribute to enclosing struct
13 |     /// The currently selected item, if any.
14 |     @State private var selectedItem: PhotosPickerItem?
   :
34 |     }
35 |
36 |     public var body: some View {
   |                `- note: add '@available' attribute to enclosing property
37 |         PhotosPicker(
38 |             selection: $selectedItem,
   :
42 |             Label("Open from Gallery", systemImage: "photo.on.rectangle.angled.fill")
43 |         }
44 |         .photosPickerDisabledCapabilities([.search, .collectionNavigation])
   |          |- error: 'photosPickerDisabledCapabilities' is only available in iOS 17.0 or newer
   |          `- note: add 'if #available' version check
45 |         .photosPickerStyle(.presentation)
46 |         .onChange(of: selectedItem) { _, _ in
/Users/admin/builder/spi-builder-workspace/Sources/Views/GalleryVideoPicker.swift:45:10: error: 'photosPickerStyle' is only available in iOS 17.0 or newer
10 |
11 | /// A button revealing a `PhotosPicker` configured to only show videos or spatial videos.
12 | public struct GalleryVideoPicker: View {
   |               `- note: add '@available' attribute to enclosing struct
13 |     /// The currently selected item, if any.
14 |     @State private var selectedItem: PhotosPickerItem?
   :
34 |     }
35 |
36 |     public var body: some View {
   |                `- note: add '@available' attribute to enclosing property
37 |         PhotosPicker(
38 |             selection: $selectedItem,
   :
43 |         }
44 |         .photosPickerDisabledCapabilities([.search, .collectionNavigation])
45 |         .photosPickerStyle(.presentation)
   |          |- error: 'photosPickerStyle' is only available in iOS 17.0 or newer
   |          `- note: add 'if #available' version check
46 |         .onChange(of: selectedItem) { _, _ in
47 |             Task {
SwiftCompile normal arm64 /Users/admin/builder/spi-builder-workspace/Sources/Views/FilePicker.swift (in target 'OpenImmersive' from project 'OpenImmersive')
    cd /Users/admin/builder/spi-builder-workspace/.swiftpm/xcode
    builtin-SwiftPerFileCompile FilePicker.swift
SwiftCompile normal arm64 /Users/admin/builder/spi-builder-workspace/Sources/Views/GalleryVideoPicker.swift (in target 'OpenImmersive' from project 'OpenImmersive')
    cd /Users/admin/builder/spi-builder-workspace/.swiftpm/xcode
    builtin-SwiftPerFileCompile GalleryVideoPicker.swift
SwiftCompile normal arm64 Compiling\ ControlPanel.swift,\ DropTarget.swift /Users/admin/builder/spi-builder-workspace/Sources/Views/ControlPanel.swift /Users/admin/builder/spi-builder-workspace/Sources/Views/DropTarget.swift (in target 'OpenImmersive' from project 'OpenImmersive')
/Users/admin/builder/spi-builder-workspace/Sources/Controllers/VideoPlayer.swift:13:2: error: 'Observable()' is only available in iOS 17.0 or newer
 11 |
 12 | /// Video Player Controller interfacing the underlying `AVPlayer`, exposing states and controls to the UI.
 13 | @Observable
    |  `- error: 'Observable()' is only available in iOS 17.0 or newer
 14 | public class VideoPlayer: Sendable {
 15 |     //MARK: Video Player and Video Renderer
/Users/admin/builder/spi-builder-workspace/Sources/Views/ControlPanel.swift:498:9: error: cannot find 'Attachment' in scope
496 |         }
497 |     } attachments: {
498 |         Attachment(id: "ControlPanel") {
    |         `- error: cannot find 'Attachment' in scope
499 |             ControlPanel(videoPlayer: .constant(VideoPlayer()))
500 |         }
/Users/admin/builder/spi-builder-workspace/Sources/Views/ControlPanel.swift:497:20: error: extra trailing closure passed in call
495 |             content.add(entity)
496 |         }
497 |     } attachments: {
    |                    `- error: extra trailing closure passed in call
498 |         Attachment(id: "ControlPanel") {
499 |             ControlPanel(videoPlayer: .constant(VideoPlayer()))
/Users/admin/builder/spi-builder-workspace/Sources/Views/ControlPanel.swift:493:19: error: contextual closure type '@MainActor @Sendable (inout RealityViewCameraContent) async -> Void' expects 1 argument, but 2 were used in closure body
491 |
492 | #Preview {
493 |     RealityView { content, attachments in
    |                   `- error: contextual closure type '@MainActor @Sendable (inout RealityViewCameraContent) async -> Void' expects 1 argument, but 2 were used in closure body
494 |         if let entity = attachments.entity(for: "ControlPanel") {
495 |             content.add(entity)
macro expansion @Observable:1:2: error: 'ObservationTracked()' is only available in iOS 17.0 or newer
`- /Users/admin/builder/spi-builder-workspace/Sources/Controllers/VideoPlayer.swift:76:5: note: expanded code originates here
 11 |
 12 | /// Video Player Controller interfacing the underlying `AVPlayer`, exposing states and controls to the UI.
 13 | @Observable
    | `- note: in expansion of macro 'Observable' on property 'shouldShowControlPanel' here
 14 | public class VideoPlayer: Sendable {
    |              `- note: add '@available' attribute to enclosing class
 15 |     //MARK: Video Player and Video Renderer
 16 |     /// The video player.
    :
 74 |     private(set) public var selectedAudioIndex: Int = -1
 75 |     /// `true` if the control panel should be visible to the user.
 76 |     private(set) public var shouldShowControlPanel: Bool = true
    +--- macro expansion @Observable -----------------------------------
    |1 | @ObservationTracked
    |  |  `- error: 'ObservationTracked()' is only available in iOS 17.0 or newer
    +-------------------------------------------------------------------
 77 |     /// `true` if the control panel should present resolution & audio options to the user.
 78 |     private(set) public var shouldShowPlaybackOptions: Bool = false
macro expansion @Observable:1:2: error: 'ObservationTracked()' is only available in iOS 17.0 or newer
`- /Users/admin/builder/spi-builder-workspace/Sources/Controllers/VideoPlayer.swift:78:5: note: expanded code originates here
 11 |
 12 | /// Video Player Controller interfacing the underlying `AVPlayer`, exposing states and controls to the UI.
 13 | @Observable
    | `- note: in expansion of macro 'Observable' on property 'shouldShowPlaybackOptions' here
 14 | public class VideoPlayer: Sendable {
    |              `- note: add '@available' attribute to enclosing class
 15 |     //MARK: Video Player and Video Renderer
 16 |     /// The video player.
    :
 76 |     private(set) public var shouldShowControlPanel: Bool = true
 77 |     /// `true` if the control panel should present resolution & audio options to the user.
 78 |     private(set) public var shouldShowPlaybackOptions: Bool = false
    +--- macro expansion @Observable -----------------------------------
    |1 | @ObservationTracked
    |  |  `- error: 'ObservationTracked()' is only available in iOS 17.0 or newer
    +-------------------------------------------------------------------
 79 |     /// `true` if the HLS stream has a bitrate ladder with at least 2 rungs and the custom configuration doesn't prevent user selection.
 80 |     public var canChooseResolution: Bool {
/Users/admin/builder/spi-builder-workspace/Sources/Views/ControlPanel.swift:84:18: error: value of type 'some View' has no member 'glassBackgroundEffect'
 82 |                 .padding(.horizontal, 15)
 83 |                 .padding(.vertical, 5)
 84 |                 .glassBackgroundEffect()
    |                  `- error: value of type 'some View' has no member 'glassBackgroundEffect'
 85 |                 .frame(maxWidth: CGFloat(Config.shared.controlPanelWidth))
 86 |             }
macro expansion @Observable:1:2: error: 'ObservationTracked()' is only available in iOS 17.0 or newer
`- /Users/admin/builder/spi-builder-workspace/Sources/Controllers/VideoPlayer.swift:27:5: note: expanded code originates here
 11 |
 12 | /// Video Player Controller interfacing the underlying `AVPlayer`, exposing states and controls to the UI.
 13 | @Observable
    | `- note: in expansion of macro 'Observable' on property 'title' here
 14 | public class VideoPlayer: Sendable {
    |              `- note: add '@available' attribute to enclosing class
 15 |     //MARK: Video Player and Video Renderer
 16 |     /// The video player.
    :
 25 |     //MARK: Variables accessible to the UI
 26 |     /// The title of the current video (empty string if none).
 27 |     private(set) public var title: String = ""
    +--- macro expansion @Observable -----------------------------------
    |1 | @ObservationTracked
    |  |  `- error: 'ObservationTracked()' is only available in iOS 17.0 or newer
    +-------------------------------------------------------------------
 28 |     /// A short description of the current video, displayed under the title (empty string if none).
 29 |     private(set) public var description: String = ""
macro expansion @Observable:1:2: error: 'ObservationTracked()' is only available in iOS 17.0 or newer
`- /Users/admin/builder/spi-builder-workspace/Sources/Controllers/VideoPlayer.swift:29:5: note: expanded code originates here
 11 |
 12 | /// Video Player Controller interfacing the underlying `AVPlayer`, exposing states and controls to the UI.
 13 | @Observable
    | `- note: in expansion of macro 'Observable' on property 'description' here
 14 | public class VideoPlayer: Sendable {
    |              `- note: add '@available' attribute to enclosing class
 15 |     //MARK: Video Player and Video Renderer
 16 |     /// The video player.
    :
 27 |     private(set) public var title: String = ""
 28 |     /// A short description of the current video, displayed under the title (empty string if none).
 29 |     private(set) public var description: String = ""
    +--- macro expansion @Observable -----------------------------------
    |1 | @ObservationTracked
    |  |  `- error: 'ObservationTracked()' is only available in iOS 17.0 or newer
    +-------------------------------------------------------------------
 30 |     /// The url of the current video.
 31 |     private(set) public var url: URL?
macro expansion @Observable:1:2: error: 'ObservationTracked()' is only available in iOS 17.0 or newer
`- /Users/admin/builder/spi-builder-workspace/Sources/Controllers/VideoPlayer.swift:66:5: note: expanded code originates here
 11 |
 12 | /// Video Player Controller interfacing the underlying `AVPlayer`, exposing states and controls to the UI.
 13 | @Observable
    | `- note: in expansion of macro 'Observable' on property 'bitrate' here
 14 | public class VideoPlayer: Sendable {
    |              `- note: add '@available' attribute to enclosing class
 15 |     //MARK: Video Player and Video Renderer
 16 |     /// The video player.
    :
 64 |     }
 65 |     /// The bitrate of the current video stream (0 if none), only available if streaming from a HLS server (m3u8).
 66 |     private(set) public var bitrate: Double = 0
    +--- macro expansion @Observable -----------------------------------
    |1 | @ObservationTracked
    |  |  `- error: 'ObservationTracked()' is only available in iOS 17.0 or newer
    +-------------------------------------------------------------------
 67 |     /// Bitrate/resolution ladder available for the video stream, only available if streaming from a HLS server (m3u8).
 68 |     private(set) public var bitrateLadder: [BitrateRung] = []
/Users/admin/builder/spi-builder-workspace/Sources/Views/ControlPanel.swift:156:33: error: 'circle' is only available in iOS 17.0 or newer
129 |
130 | /// A toggle to control the visibility of the `ResolutionSelector`
131 | public struct ResolutionToggle: View {
    |               `- note: add '@available' attribute to enclosing struct
132 |     /// The singleton video player control interface.
133 |     @Binding var videoPlayer: VideoPlayer
    :
140 |     }
141 |
142 |     public var body: some View {
    |                `- note: add '@available' attribute to enclosing property
143 |         let config = Config.shared
144 |         let showPlaybackOptions = Binding<Bool>(
    :
154 |             .toggleStyle(.button)
155 |             .controlSize(.small)
156 |             .buttonBorderShape(.circle)
    |                                 |- error: 'circle' is only available in iOS 17.0 or newer
    |                                 `- note: add 'if #available' version check
157 |
158 |             if showBitrate {
macro expansion @Observable:1:2: error: 'ObservationTracked()' is only available in iOS 17.0 or newer
`- /Users/admin/builder/spi-builder-workspace/Sources/Controllers/VideoPlayer.swift:68:5: note: expanded code originates here
 11 |
 12 | /// Video Player Controller interfacing the underlying `AVPlayer`, exposing states and controls to the UI.
 13 | @Observable
    | `- note: in expansion of macro 'Observable' on property 'bitrateLadder' here
 14 | public class VideoPlayer: Sendable {
    |              `- note: add '@available' attribute to enclosing class
 15 |     //MARK: Video Player and Video Renderer
 16 |     /// The video player.
    :
 66 |     private(set) public var bitrate: Double = 0
 67 |     /// Bitrate/resolution ladder available for the video stream, only available if streaming from a HLS server (m3u8).
 68 |     private(set) public var bitrateLadder: [BitrateRung] = []
    +--- macro expansion @Observable -----------------------------------
    |1 | @ObservationTracked
    |  |  `- error: 'ObservationTracked()' is only available in iOS 17.0 or newer
    +-------------------------------------------------------------------
 69 |     /// The currently selected bitrate rung index, if any. Only available if streaming from a HLS server (m3u8).
 70 |     private(set) public var selectedBitrateRungIndex: Int = -1
/Users/admin/builder/spi-builder-workspace/Sources/Views/ControlPanel.swift:244:29: error: 'circle' is only available in iOS 17.0 or newer
207 |
208 | /// A Volume control
209 | public struct VolumeControl: View {
    |               `- note: add '@available' attribute to enclosing struct
210 |     /// The singleton video player control interface.
211 |     @Binding var videoPlayer: VideoPlayer
    :
236 |     }
237 |
238 |     public var body: some View {
    |                `- note: add '@available' attribute to enclosing property
239 |         Toggle(isOn: $showingSlider.animation()) {
240 |             Image(systemName: imageName)
    :
242 |         }
243 |         .toggleStyle(.button)
244 |         .buttonBorderShape(.circle)
    |                             |- error: 'circle' is only available in iOS 17.0 or newer
    |                             `- note: add 'if #available' version check
245 |         .controlSize(.regular)
246 |         .tint(.clear)
/Users/admin/builder/spi-builder-workspace/Sources/Views/ControlPanel.swift:267:10: error: 'onChange(of:initial:_:)' is only available in iOS 17.0 or newer
207 |
208 | /// A Volume control
209 | public struct VolumeControl: View {
    |               `- note: add '@available' attribute to enclosing struct
210 |     /// The singleton video player control interface.
211 |     @Binding var videoPlayer: VideoPlayer
    :
236 |     }
237 |
238 |     public var body: some View {
    |                `- note: add '@available' attribute to enclosing property
239 |         Toggle(isOn: $showingSlider.animation()) {
240 |             Image(systemName: imageName)
    :
265 |             sliderValue = videoPlayer.volume
266 |         }
267 |         .onChange(of: showingSlider) { _, _ in
    |          |- error: 'onChange(of:initial:_:)' is only available in iOS 17.0 or newer
    |          `- note: add 'if #available' version check
268 |             videoPlayer.restartControlPanelTask()
269 |         }
/Users/admin/builder/spi-builder-workspace/Sources/Views/ControlPanel.swift:270:10: error: 'onChange(of:initial:_:)' is only available in iOS 17.0 or newer
207 |
208 | /// A Volume control
209 | public struct VolumeControl: View {
    |               `- note: add '@available' attribute to enclosing struct
210 |     /// The singleton video player control interface.
211 |     @Binding var videoPlayer: VideoPlayer
    :
236 |     }
237 |
238 |     public var body: some View {
    |                `- note: add '@available' attribute to enclosing property
239 |         Toggle(isOn: $showingSlider.animation()) {
240 |             Image(systemName: imageName)
    :
268 |             videoPlayer.restartControlPanelTask()
269 |         }
270 |         .onChange(of: sliderValue) { _, volume in
    |          |- error: 'onChange(of:initial:_:)' is only available in iOS 17.0 or newer
    |          `- note: add 'if #available' version check
271 |             videoPlayer.volume = volume
272 |         }
macro expansion @Observable:1:2: error: 'ObservationTracked()' is only available in iOS 17.0 or newer
`- /Users/admin/builder/spi-builder-workspace/Sources/Controllers/VideoPlayer.swift:43:5: note: expanded code originates here
 11 |
 12 | /// Video Player Controller interfacing the underlying `AVPlayer`, exposing states and controls to the UI.
 13 | @Observable
    | `- note: in expansion of macro 'Observable' on property 'paused' here
 14 | public class VideoPlayer: Sendable {
    |              `- note: add '@available' attribute to enclosing class
 15 |     //MARK: Video Player and Video Renderer
 16 |     /// The video player.
    :
 41 |     private(set) public var duration: Double = 0
 42 |     /// `true` if playback is currently paused, or if playback has completed.
 43 |     private(set) public var paused: Bool = false
    +--- macro expansion @Observable -----------------------------------
    |1 | @ObservationTracked
    |  |  `- error: 'ObservationTracked()' is only available in iOS 17.0 or newer
    +-------------------------------------------------------------------
 44 |     /// `true` if playback is waiting to load the media.
 45 |     private(set) public var loading: Bool = false
/Users/admin/builder/spi-builder-workspace/Sources/Views/ControlPanel.swift:296:33: error: 'circle' is only available in iOS 17.0 or newer
275 |
276 | /// A simple horizontal view presenting the user with video playback control buttons.
277 | public struct PlaybackButtons: View {
    |               `- note: add '@available' attribute to enclosing struct
278 |     /// The singleton video player control interface.
279 |     var videoPlayer: VideoPlayer
    :
286 |     }
287 |
288 |     public var body: some View {
    |                `- note: add '@available' attribute to enclosing property
289 |         HStack(alignment: .center) {
290 |             Button {
    :
294 |                     .offset(y: -1)
295 |             }
296 |             .buttonBorderShape(.circle)
    |                                 |- error: 'circle' is only available in iOS 17.0 or newer
    |                                 `- note: add 'if #available' version check
297 |             .controlSize(.large)
298 |             .tint(.clear)
/Users/admin/builder/spi-builder-workspace/Sources/Views/ControlPanel.swift:310:33: error: 'circle' is only available in iOS 17.0 or newer
275 |
276 | /// A simple horizontal view presenting the user with video playback control buttons.
277 | public struct PlaybackButtons: View {
    |               `- note: add '@available' attribute to enclosing struct
278 |     /// The singleton video player control interface.
279 |     var videoPlayer: VideoPlayer
    :
286 |     }
287 |
288 |     public var body: some View {
    |                `- note: add '@available' attribute to enclosing property
289 |         HStack(alignment: .center) {
290 |             Button {
    :
308 |                     .padding(10)
309 |             }
310 |             .buttonBorderShape(.circle)
    |                                 |- error: 'circle' is only available in iOS 17.0 or newer
    |                                 `- note: add 'if #available' version check
311 |             .controlSize(.extraLarge)
312 |             .tint(.clear)
/Users/admin/builder/spi-builder-workspace/Sources/Views/ControlPanel.swift:311:27: error: 'extraLarge' is only available in iOS 17.0 or newer
275 |
276 | /// A simple horizontal view presenting the user with video playback control buttons.
277 | public struct PlaybackButtons: View {
    |               `- note: add '@available' attribute to enclosing struct
278 |     /// The singleton video player control interface.
279 |     var videoPlayer: VideoPlayer
    :
286 |     }
287 |
288 |     public var body: some View {
    |                `- note: add '@available' attribute to enclosing property
289 |         HStack(alignment: .center) {
290 |             Button {
    :
309 |             }
310 |             .buttonBorderShape(.circle)
311 |             .controlSize(.extraLarge)
    |                           |- error: 'extraLarge' is only available in iOS 17.0 or newer
    |                           `- note: add 'if #available' version check
312 |             .tint(.clear)
313 |
/Users/admin/builder/spi-builder-workspace/Sources/Views/ControlPanel.swift:320:33: error: 'circle' is only available in iOS 17.0 or newer
275 |
276 | /// A simple horizontal view presenting the user with video playback control buttons.
277 | public struct PlaybackButtons: View {
    |               `- note: add '@available' attribute to enclosing struct
278 |     /// The singleton video player control interface.
279 |     var videoPlayer: VideoPlayer
    :
286 |     }
287 |
288 |     public var body: some View {
    |                `- note: add '@available' attribute to enclosing property
289 |         HStack(alignment: .center) {
290 |             Button {
    :
318 |                     .offset(y: -1)
319 |             }
320 |             .buttonBorderShape(.circle)
    |                                 |- error: 'circle' is only available in iOS 17.0 or newer
    |                                 `- note: add 'if #available' version check
321 |             .controlSize(.large)
322 |             .tint(.clear)
macro expansion @Observable:1:2: error: 'ObservationTracked()' is only available in iOS 17.0 or newer
`- /Users/admin/builder/spi-builder-workspace/Sources/Controllers/VideoPlayer.swift:99:5: note: expanded code originates here
 11 |
 12 | /// Video Player Controller interfacing the underlying `AVPlayer`, exposing states and controls to the UI.
 13 | @Observable
    | `- note: in expansion of macro 'Observable' on property 'currentTime' here
 14 | public class VideoPlayer: Sendable {
    |              `- note: add '@available' attribute to enclosing class
 15 |     //MARK: Video Player and Video Renderer
 16 |     /// The video player.
    :
 97 |     ///
 98 |     /// This variable is updated by video playback but can be overwritten by a scrubber, in conjunction with `scrubState`.
 99 |     public var currentTime: Double = 0
    +--- macro expansion @Observable -----------------------------------
    |1 | @ObservationTracked
    |  |  `- error: 'ObservationTracked()' is only available in iOS 17.0 or newer
    +-------------------------------------------------------------------
100 |     public enum ScrubState {
101 |         /// The scrubber is not active and reflects the video's current playback time.
macro expansion @Observable:1:2: error: 'ObservationTracked()' is only available in iOS 17.0 or newer
`- /Users/admin/builder/spi-builder-workspace/Sources/Controllers/VideoPlayer.swift:41:5: note: expanded code originates here
 11 |
 12 | /// Video Player Controller interfacing the underlying `AVPlayer`, exposing states and controls to the UI.
 13 | @Observable
    | `- note: in expansion of macro 'Observable' on property 'duration' here
 14 | public class VideoPlayer: Sendable {
    |              `- note: add '@available' attribute to enclosing class
 15 |     //MARK: Video Player and Video Renderer
 16 |     /// The video player.
    :
 39 |     private(set) public var error: Error?
 40 |     /// The duration in seconds of the current video (0 if none).
 41 |     private(set) public var duration: Double = 0
    +--- macro expansion @Observable -----------------------------------
    |1 | @ObservationTracked
    |  |  `- error: 'ObservationTracked()' is only available in iOS 17.0 or newer
    +-------------------------------------------------------------------
 42 |     /// `true` if playback is currently paused, or if playback has completed.
 43 |     private(set) public var paused: Bool = false
macro expansion @Observable:1:2: error: 'ObservationTracked()' is only available in iOS 17.0 or newer
`- /Users/admin/builder/spi-builder-workspace/Sources/Controllers/VideoPlayer.swift:109:5: note: expanded code originates here
 11 |
 12 | /// Video Player Controller interfacing the underlying `AVPlayer`, exposing states and controls to the UI.
 13 | @Observable
    | `- note: in expansion of macro 'Observable' on property 'scrubState' here
 14 | public class VideoPlayer: Sendable {
    |              `- note: add '@available' attribute to enclosing class
 15 |     //MARK: Video Player and Video Renderer
 16 |     /// The video player.
    :
107 |     }
108 |     /// The current state of the scrubber.
109 |     public var scrubState: ScrubState = .notScrubbing {
    +--- macro expansion @Observable -----------------------------------
    |1 | @ObservationTracked
    |  |  `- error: 'ObservationTracked()' is only available in iOS 17.0 or newer
    +-------------------------------------------------------------------
110 |        didSet {
111 |           switch scrubState {
/Users/admin/builder/spi-builder-workspace/Sources/Views/ControlPanel.swift:381:25: error: 'Duration' is only available in iOS 16.0 or newer
355 |
356 | /// A label view printing the current time and total duration of a video.
357 | public struct TimeText: View {
    |               `- note: add '@available' attribute to enclosing struct
358 |     /// The singleton video player control interface.
359 |     var videoPlayer: VideoPlayer
    :
375 |     ///
376 |     /// If the duration is greater than one hour, the string representation shows hours.
377 |     var timeString: String {
    |         `- note: add '@available' attribute to enclosing property
378 |         guard videoPlayer.duration > 0 else {
379 |             return "--:-- / --:--"
380 |         }
381 |         let timeFormat: Duration.TimeFormatStyle = videoPlayer.duration >= 3600 ? .time(pattern: .hourMinuteSecond) : .time(pattern: .minuteSecond)
    |                         |- error: 'Duration' is only available in iOS 16.0 or newer
    |                         `- note: add 'if #available' version check
382 |
383 |         let currentTime = Duration
/Users/admin/builder/spi-builder-workspace/Sources/Views/ControlPanel.swift:381:84: error: 'time(pattern:)' is only available in iOS 16.0 or newer
355 |
356 | /// A label view printing the current time and total duration of a video.
357 | public struct TimeText: View {
    |               `- note: add '@available' attribute to enclosing struct
358 |     /// The singleton video player control interface.
359 |     var videoPlayer: VideoPlayer
    :
375 |     ///
376 |     /// If the duration is greater than one hour, the string representation shows hours.
377 |     var timeString: String {
    |         `- note: add '@available' attribute to enclosing property
378 |         guard videoPlayer.duration > 0 else {
379 |             return "--:-- / --:--"
380 |         }
381 |         let timeFormat: Duration.TimeFormatStyle = videoPlayer.duration >= 3600 ? .time(pattern: .hourMinuteSecond) : .time(pattern: .minuteSecond)
    |                                                                                    |- error: 'time(pattern:)' is only available in iOS 16.0 or newer
    |                                                                                    `- note: add 'if #available' version check
382 |
383 |         let currentTime = Duration
/Users/admin/builder/spi-builder-workspace/Sources/Views/ControlPanel.swift:381:120: error: 'time(pattern:)' is only available in iOS 16.0 or newer
355 |
356 | /// A label view printing the current time and total duration of a video.
357 | public struct TimeText: View {
    |               `- note: add '@available' attribute to enclosing struct
358 |     /// The singleton video player control interface.
359 |     var videoPlayer: VideoPlayer
    :
375 |     ///
376 |     /// If the duration is greater than one hour, the string representation shows hours.
377 |     var timeString: String {
    |         `- note: add '@available' attribute to enclosing property
378 |         guard videoPlayer.duration > 0 else {
379 |             return "--:-- / --:--"
380 |         }
381 |         let timeFormat: Duration.TimeFormatStyle = videoPlayer.duration >= 3600 ? .time(pattern: .hourMinuteSecond) : .time(pattern: .minuteSecond)
    |                                                                                                                        |- error: 'time(pattern:)' is only available in iOS 16.0 or newer
    |                                                                                                                        `- note: add 'if #available' version check
382 |
383 |         let currentTime = Duration
/Users/admin/builder/spi-builder-workspace/Sources/Views/ControlPanel.swift:383:27: error: 'Duration' is only available in iOS 16.0 or newer
355 |
356 | /// A label view printing the current time and total duration of a video.
357 | public struct TimeText: View {
    |               `- note: add '@available' attribute to enclosing struct
358 |     /// The singleton video player control interface.
359 |     var videoPlayer: VideoPlayer
    :
375 |     ///
376 |     /// If the duration is greater than one hour, the string representation shows hours.
377 |     var timeString: String {
    |         `- note: add '@available' attribute to enclosing property
378 |         guard videoPlayer.duration > 0 else {
379 |             return "--:-- / --:--"
    :
381 |         let timeFormat: Duration.TimeFormatStyle = videoPlayer.duration >= 3600 ? .time(pattern: .hourMinuteSecond) : .time(pattern: .minuteSecond)
382 |
383 |         let currentTime = Duration
    |                           |- error: 'Duration' is only available in iOS 16.0 or newer
    |                           `- note: add 'if #available' version check
384 |             .seconds(videoPlayer.currentTime)
385 |             .formatted(timeFormat)
/Users/admin/builder/spi-builder-workspace/Sources/Views/ControlPanel.swift:384:14: error: 'seconds' is only available in iOS 16.0 or newer
355 |
356 | /// A label view printing the current time and total duration of a video.
357 | public struct TimeText: View {
    |               `- note: add '@available' attribute to enclosing struct
358 |     /// The singleton video player control interface.
359 |     var videoPlayer: VideoPlayer
    :
375 |     ///
376 |     /// If the duration is greater than one hour, the string representation shows hours.
377 |     var timeString: String {
    |         `- note: add '@available' attribute to enclosing property
378 |         guard videoPlayer.duration > 0 else {
379 |             return "--:-- / --:--"
    :
382 |
383 |         let currentTime = Duration
384 |             .seconds(videoPlayer.currentTime)
    |              |- error: 'seconds' is only available in iOS 16.0 or newer
    |              `- note: add 'if #available' version check
385 |             .formatted(timeFormat)
386 |         let duration = Duration
/Users/admin/builder/spi-builder-workspace/Sources/Views/ControlPanel.swift:385:14: error: 'formatted' is only available in iOS 16.0 or newer
355 |
356 | /// A label view printing the current time and total duration of a video.
357 | public struct TimeText: View {
    |               `- note: add '@available' attribute to enclosing struct
358 |     /// The singleton video player control interface.
359 |     var videoPlayer: VideoPlayer
    :
375 |     ///
376 |     /// If the duration is greater than one hour, the string representation shows hours.
377 |     var timeString: String {
    |         `- note: add '@available' attribute to enclosing property
378 |         guard videoPlayer.duration > 0 else {
379 |             return "--:-- / --:--"
    :
383 |         let currentTime = Duration
384 |             .seconds(videoPlayer.currentTime)
385 |             .formatted(timeFormat)
    |              |- error: 'formatted' is only available in iOS 16.0 or newer
    |              `- note: add 'if #available' version check
386 |         let duration = Duration
387 |             .seconds(videoPlayer.duration)
/Users/admin/builder/spi-builder-workspace/Sources/Views/ControlPanel.swift:386:24: error: 'Duration' is only available in iOS 16.0 or newer
355 |
356 | /// A label view printing the current time and total duration of a video.
357 | public struct TimeText: View {
    |               `- note: add '@available' attribute to enclosing struct
358 |     /// The singleton video player control interface.
359 |     var videoPlayer: VideoPlayer
    :
375 |     ///
376 |     /// If the duration is greater than one hour, the string representation shows hours.
377 |     var timeString: String {
    |         `- note: add '@available' attribute to enclosing property
378 |         guard videoPlayer.duration > 0 else {
379 |             return "--:-- / --:--"
    :
384 |             .seconds(videoPlayer.currentTime)
385 |             .formatted(timeFormat)
386 |         let duration = Duration
    |                        |- error: 'Duration' is only available in iOS 16.0 or newer
    |                        `- note: add 'if #available' version check
387 |             .seconds(videoPlayer.duration)
388 |             .formatted(timeFormat)
/Users/admin/builder/spi-builder-workspace/Sources/Views/ControlPanel.swift:387:14: error: 'seconds' is only available in iOS 16.0 or newer
355 |
356 | /// A label view printing the current time and total duration of a video.
357 | public struct TimeText: View {
    |               `- note: add '@available' attribute to enclosing struct
358 |     /// The singleton video player control interface.
359 |     var videoPlayer: VideoPlayer
    :
375 |     ///
376 |     /// If the duration is greater than one hour, the string representation shows hours.
377 |     var timeString: String {
    |         `- note: add '@available' attribute to enclosing property
378 |         guard videoPlayer.duration > 0 else {
379 |             return "--:-- / --:--"
    :
385 |             .formatted(timeFormat)
386 |         let duration = Duration
387 |             .seconds(videoPlayer.duration)
    |              |- error: 'seconds' is only available in iOS 16.0 or newer
    |              `- note: add 'if #available' version check
388 |             .formatted(timeFormat)
389 |
/Users/admin/builder/spi-builder-workspace/Sources/Views/ControlPanel.swift:388:14: error: 'formatted' is only available in iOS 16.0 or newer
355 |
356 | /// A label view printing the current time and total duration of a video.
357 | public struct TimeText: View {
    |               `- note: add '@available' attribute to enclosing struct
358 |     /// The singleton video player control interface.
359 |     var videoPlayer: VideoPlayer
    :
375 |     ///
376 |     /// If the duration is greater than one hour, the string representation shows hours.
377 |     var timeString: String {
    |         `- note: add '@available' attribute to enclosing property
378 |         guard videoPlayer.duration > 0 else {
379 |             return "--:-- / --:--"
    :
386 |         let duration = Duration
387 |             .seconds(videoPlayer.duration)
388 |             .formatted(timeFormat)
    |              |- error: 'formatted' is only available in iOS 16.0 or newer
    |              `- note: add 'if #available' version check
389 |
390 |         return "\(currentTime) / \(duration)"
macro expansion @Observable:1:2: error: 'ObservationTracked()' is only available in iOS 17.0 or newer
`- /Users/admin/builder/spi-builder-workspace/Sources/Controllers/VideoPlayer.swift:72:5: note: expanded code originates here
 11 |
 12 | /// Video Player Controller interfacing the underlying `AVPlayer`, exposing states and controls to the UI.
 13 | @Observable
    | `- note: in expansion of macro 'Observable' on property 'audioOptions' here
 14 | public class VideoPlayer: Sendable {
    |              `- note: add '@available' attribute to enclosing class
 15 |     //MARK: Video Player and Video Renderer
 16 |     /// The video player.
    :
 70 |     private(set) public var selectedBitrateRungIndex: Int = -1
 71 |     /// Audio options available for the video stream, only available if streaming from a HLS server (m3u8) and with separate audio playlists.
 72 |     private(set) public var audioOptions: [AudioOption] = []
    +--- macro expansion @Observable -----------------------------------
    |1 | @ObservationTracked
    |  |  `- error: 'ObservationTracked()' is only available in iOS 17.0 or newer
    +-------------------------------------------------------------------
 73 |     /// The currently selected audio index, if any. Only available if streaming from a HLS server (m3u8).
 74 |     private(set) public var selectedAudioIndex: Int = -1
macro expansion @Observable:1:2: error: 'ObservationTracked()' is only available in iOS 17.0 or newer
`- /Users/admin/builder/spi-builder-workspace/Sources/Controllers/VideoPlayer.swift:74:5: note: expanded code originates here
 11 |
 12 | /// Video Player Controller interfacing the underlying `AVPlayer`, exposing states and controls to the UI.
 13 | @Observable
    | `- note: in expansion of macro 'Observable' on property 'selectedAudioIndex' here
 14 | public class VideoPlayer: Sendable {
    |              `- note: add '@available' attribute to enclosing class
 15 |     //MARK: Video Player and Video Renderer
 16 |     /// The video player.
    :
 72 |     private(set) public var audioOptions: [AudioOption] = []
 73 |     /// The currently selected audio index, if any. Only available if streaming from a HLS server (m3u8).
 74 |     private(set) public var selectedAudioIndex: Int = -1
    +--- macro expansion @Observable -----------------------------------
    |1 | @ObservationTracked
    |  |  `- error: 'ObservationTracked()' is only available in iOS 17.0 or newer
    +-------------------------------------------------------------------
 75 |     /// `true` if the control panel should be visible to the user.
 76 |     private(set) public var shouldShowControlPanel: Bool = true
macro expansion @Observable:1:2: error: 'ObservationTracked()' is only available in iOS 17.0 or newer
`- /Users/admin/builder/spi-builder-workspace/Sources/Controllers/VideoPlayer.swift:70:5: note: expanded code originates here
 11 |
 12 | /// Video Player Controller interfacing the underlying `AVPlayer`, exposing states and controls to the UI.
 13 | @Observable
    | `- note: in expansion of macro 'Observable' on property 'selectedBitrateRungIndex' here
 14 | public class VideoPlayer: Sendable {
    |              `- note: add '@available' attribute to enclosing class
 15 |     //MARK: Video Player and Video Renderer
 16 |     /// The video player.
    :
 68 |     private(set) public var bitrateLadder: [BitrateRung] = []
 69 |     /// The currently selected bitrate rung index, if any. Only available if streaming from a HLS server (m3u8).
 70 |     private(set) public var selectedBitrateRungIndex: Int = -1
    +--- macro expansion @Observable -----------------------------------
    |1 | @ObservationTracked
    |  |  `- error: 'ObservationTracked()' is only available in iOS 17.0 or newer
    +-------------------------------------------------------------------
 71 |     /// Audio options available for the video stream, only available if streaming from a HLS server (m3u8) and with separate audio playlists.
 72 |     private(set) public var audioOptions: [AudioOption] = []
/Users/admin/builder/spi-builder-workspace/Sources/Views/DropTarget.swift:74:9: error: extraneous argument label 'windowStyle:' in macro expansion
72 | }
73 |
74 | #Preview(windowStyle: .automatic) {
   |         `- error: extraneous argument label 'windowStyle:' in macro expansion
75 |     DropTarget() {
76 |         Color.clear
/Users/admin/builder/spi-builder-workspace/Sources/Views/DropTarget.swift:74:24: error: type 'String?' has no member 'automatic'
72 | }
73 |
74 | #Preview(windowStyle: .automatic) {
   |                        `- error: type 'String?' has no member 'automatic'
75 |     DropTarget() {
76 |         Color.clear
/Users/admin/builder/spi-builder-workspace/Sources/Views/DropTarget.swift:46:26: error: 'fill(_:style:)' is only available in iOS 17.0 or newer
 9 |
10 | /// A view capable of receiving of showing videos dragged from other apps.
11 | public struct DropTarget<Content: View>: View {
   |               `- note: add '@available' attribute to enclosing generic struct
12 |     /// Whether a dragged video is hovering the view at the moment.
13 |     @State var isTargeted: Bool = false
   :
28 |     }
29 |
30 |     public var body: some View {
   |                `- note: add '@available' attribute to enclosing property
31 |         Group {
32 |             if isTargeted {
   :
44 |                     // Espouse the boundaries of the app window
45 |                     RoundedRectangle(cornerRadius: 50)
46 |                         .fill(.clear)
   |                          |- error: 'fill(_:style:)' is only available in iOS 17.0 or newer
   |                          `- note: add 'if #available' version check
47 |                         .strokeBorder(style: StrokeStyle(lineWidth: 4, dash: [10]))
48 |                 )
/Users/admin/builder/spi-builder-workspace/Sources/Views/DropTarget.swift:47:26: error: 'strokeBorder(_:style:antialiased:)' is only available in iOS 17.0 or newer
 9 |
10 | /// A view capable of receiving of showing videos dragged from other apps.
11 | public struct DropTarget<Content: View>: View {
   |               `- note: add '@available' attribute to enclosing generic struct
12 |     /// Whether a dragged video is hovering the view at the moment.
13 |     @State var isTargeted: Bool = false
   :
28 |     }
29 |
30 |     public var body: some View {
   |                `- note: add '@available' attribute to enclosing property
31 |         Group {
32 |             if isTargeted {
   :
45 |                     RoundedRectangle(cornerRadius: 50)
46 |                         .fill(.clear)
47 |                         .strokeBorder(style: StrokeStyle(lineWidth: 4, dash: [10]))
   |                          |- error: 'strokeBorder(_:style:antialiased:)' is only available in iOS 17.0 or newer
   |                          `- note: add 'if #available' version check
48 |                 )
49 |             } else {
SwiftCompile normal arm64 /Users/admin/builder/spi-builder-workspace/Sources/Views/ControlPanel.swift (in target 'OpenImmersive' from project 'OpenImmersive')
    cd /Users/admin/builder/spi-builder-workspace/.swiftpm/xcode
    builtin-SwiftPerFileCompile ControlPanel.swift
SwiftCompile normal arm64 /Users/admin/builder/spi-builder-workspace/Sources/Views/DropTarget.swift (in target 'OpenImmersive' from project 'OpenImmersive')
    cd /Users/admin/builder/spi-builder-workspace/.swiftpm/xcode
    builtin-SwiftPerFileCompile DropTarget.swift
SwiftCompile normal arm64 Compiling\ ImmersivePlayer.swift,\ StreamUrlInput.swift /Users/admin/builder/spi-builder-workspace/Sources/Views/ImmersivePlayer.swift /Users/admin/builder/spi-builder-workspace/Sources/Views/StreamUrlInput.swift (in target 'OpenImmersive' from project 'OpenImmersive')
/Users/admin/builder/spi-builder-workspace/Sources/Controllers/VideoPlayer.swift:13:2: error: 'Observable()' is only available in iOS 17.0 or newer
 11 |
 12 | /// Video Player Controller interfacing the underlying `AVPlayer`, exposing states and controls to the UI.
 13 | @Observable
    |  `- error: 'Observable()' is only available in iOS 17.0 or newer
 14 | public class VideoPlayer: Sendable {
 15 |     //MARK: Video Player and Video Renderer
/Users/admin/builder/spi-builder-workspace/Sources/Controllers/HeadTracker.swift:36:27: error: cannot find 'ARKitSession' in scope
34 |     }
35 |
36 |     private let session = ARKitSession()
   |                           `- error: cannot find 'ARKitSession' in scope
37 |     private let worldTracking = WorldTrackingProvider()
38 |     private var subscription: EventSubscription?
/Users/admin/builder/spi-builder-workspace/Sources/Controllers/HeadTracker.swift:37:33: error: cannot find 'WorldTrackingProvider' in scope
35 |
36 |     private let session = ARKitSession()
37 |     private let worldTracking = WorldTrackingProvider()
   |                                 `- error: cannot find 'WorldTrackingProvider' in scope
38 |     private var subscription: EventSubscription?
39 |
macro expansion @Observable:1:2: error: 'ObservationTracked()' is only available in iOS 17.0 or newer
`- /Users/admin/builder/spi-builder-workspace/Sources/Controllers/VideoPlayer.swift:51:5: note: expanded code originates here
 11 |
 12 | /// Video Player Controller interfacing the underlying `AVPlayer`, exposing states and controls to the UI.
 13 | @Observable
    | `- note: in expansion of macro 'Observable' on property 'playbackEndedAction' here
 14 | public class VideoPlayer: Sendable {
    |              `- note: add '@available' attribute to enclosing class
 15 |     //MARK: Video Player and Video Renderer
 16 |     /// The video player.
    :
 49 |     private(set) public var hasReachedEnd: Bool = false
 50 |     /// The callback to execute when playback reaches the end of the video.
 51 |     public var playbackEndedAction: CustomAction?
    +--- macro expansion @Observable -----------------------------------
    |1 | @ObservationTracked
    |  |  `- error: 'ObservationTracked()' is only available in iOS 17.0 or newer
    +-------------------------------------------------------------------
 52 |     /// The aspect ratio of the current media (width / height) (equirectangular projection only).
 53 |     private(set) public var aspectRatio: Float?
/Users/admin/builder/spi-builder-workspace/Sources/Views/ImmersivePlayer.swift:120:13: error: cannot find 'Attachment' in scope
118 |             ProgressView()
119 |         } attachments: {
120 |             Attachment(id: "ControlPanel") {
    |             `- error: cannot find 'Attachment' in scope
121 |                 ControlPanel(videoPlayer: $videoPlayer, closeAction: closeAction, customButtons: customButtons)
122 |                     .animation(.easeInOut(duration: 0.3), value: videoPlayer.shouldShowControlPanel)
/Users/admin/builder/spi-builder-workspace/Sources/Views/ImmersivePlayer.swift:125:13: error: cannot find 'Attachment' in scope
123 |             }
124 |
125 |             Attachment(id: "ProgressView") {
    |             `- error: cannot find 'Attachment' in scope
126 |                 ProgressView()
127 |             }
/Users/admin/builder/spi-builder-workspace/Sources/Views/ImmersivePlayer.swift:129:13: error: cannot find 'Attachment' in scope
127 |             }
128 |
129 |             Attachment(id: "ErrorView") {
    |             `- error: cannot find 'Attachment' in scope
130 |                 VStack {
131 |                     Image(systemName: "play.slash")
/Users/admin/builder/spi-builder-workspace/Sources/Views/ImmersivePlayer.swift:145:17: error: cannot find 'Attachment' in scope
143 |
144 |             ForEach(customAttachments) { attachment in
145 |                 Attachment(id: attachment.id) {
    |                 `- error: cannot find 'Attachment' in scope
146 |                     AnyView(attachment.body($videoPlayer))
147 |                         .animation(.easeInOut(duration: 0.3))
/Users/admin/builder/spi-builder-workspace/Sources/Controllers/HeadTracker.swift:44:32: error: cannot find type 'RealityViewContent' in scope
42 |     ///   - content: The `RealityViewContent` provided by the `RealityView`'s `body` closure.
43 |     ///   - handler: A closure that runs when the head pose update occurs.
44 |     public func start(content: RealityViewContent, _ handler: @escaping (SceneEvents.Update) -> Void) {
   |                                `- error: cannot find type 'RealityViewContent' in scope
45 |         guard state == .stopped else { return }
46 |         state = .starting
/Users/admin/builder/spi-builder-workspace/Sources/Views/ImmersivePlayer.swift:119:24: error: extra trailing closure passed in call
117 |         } placeholder: {
118 |             ProgressView()
119 |         } attachments: {
    |                        `- error: extra trailing closure passed in call
120 |             Attachment(id: "ControlPanel") {
121 |                 ControlPanel(videoPlayer: $videoPlayer, closeAction: closeAction, customButtons: customButtons)
/Users/admin/builder/spi-builder-workspace/Sources/Views/ImmersivePlayer.swift:54:23: error: contextual closure type '@MainActor @Sendable (inout RealityViewCameraContent) async -> Void' expects 1 argument, but 2 were used in closure body
 52 |
 53 |     public var body: some View {
 54 |         RealityView { content, attachments in
    |                       `- error: contextual closure type '@MainActor @Sendable (inout RealityViewCameraContent) async -> Void' expects 1 argument, but 2 were used in closure body
 55 |             let config = Config.shared
 56 |
/Users/admin/builder/spi-builder-workspace/Sources/Views/ImmersivePlayer.swift:109:21: error: contextual closure type '@MainActor (inout RealityViewCameraContent) -> Void' expects 1 argument, but 2 were used in closure body
107 |             let tapCatcher = makeTapCatcher()
108 |             root.addChild(tapCatcher)
109 |         } update: { content, attachments in
    |                     `- error: contextual closure type '@MainActor (inout RealityViewCameraContent) -> Void' expects 1 argument, but 2 were used in closure body
110 |             if let progressView = attachments.entity(for: "ProgressView") {
111 |                 progressView.isEnabled = videoPlayer.buffering || videoPlayer.loading
/Users/admin/builder/spi-builder-workspace/Sources/Views/ImmersivePlayer.swift:190:19: error: 'init(shape:)' is only available in iOS 18.0 or newer
 11 |
 12 | /// An immersive video player, complete with UI controls
 13 | public struct ImmersivePlayer: View {
    |               `- note: add '@available' attribute to enclosing struct
 14 |     /// The singleton video player control interface.
 15 |     @State var videoPlayer: VideoPlayer = VideoPlayer()
    :
181 |     /// Taps captured by this invisible shape will toggle the control panel on and off.
182 |     /// - Returns: a new tap catcher entity.
183 |     private func makeTapCatcher() -> some Entity {
    |                  `- note: add '@available' attribute to enclosing instance method
184 |         let collisionShape: ShapeResource =
185 |             .generateBox(width: 100, height: 100, depth: 1)
    :
188 |         let entity = Config.shared.tapCatcherShowDebug ?
189 |         ModelEntity(
190 |             mesh: MeshResource(shape: collisionShape),
    |                   |- error: 'init(shape:)' is only available in iOS 18.0 or newer
    |                   `- note: add 'if #available' version check
191 |             materials: [UnlitMaterial(color: .red)]
192 |         ) : Entity()
/Users/admin/builder/spi-builder-workspace/Sources/Views/ImmersivePlayer.swift:196:31: error: 'InputTargetComponent' is only available in iOS 18.0 or newer
 11 |
 12 | /// An immersive video player, complete with UI controls
 13 | public struct ImmersivePlayer: View {
    |               `- note: add '@available' attribute to enclosing struct
 14 |     /// The singleton video player control interface.
 15 |     @State var videoPlayer: VideoPlayer = VideoPlayer()
    :
181 |     /// Taps captured by this invisible shape will toggle the control panel on and off.
182 |     /// - Returns: a new tap catcher entity.
183 |     private func makeTapCatcher() -> some Entity {
    |                  `- note: add '@available' attribute to enclosing instance method
184 |         let collisionShape: ShapeResource =
185 |             .generateBox(width: 100, height: 100, depth: 1)
    :
194 |         entity.name = "TapCatcher"
195 |         entity.components.set(CollisionComponent(shapes: [collisionShape], mode: .trigger, filter: .default))
196 |         entity.components.set(InputTargetComponent())
    |                               |- error: 'InputTargetComponent' is only available in iOS 18.0 or newer
    |                               `- note: add 'if #available' version check
197 |
198 |         return entity
/Users/admin/builder/spi-builder-workspace/Sources/Views/ControlPanel.swift:498:9: error: cannot find 'Attachment' in scope
496 |         }
497 |     } attachments: {
498 |         Attachment(id: "ControlPanel") {
    |         `- error: cannot find 'Attachment' in scope
499 |             ControlPanel(videoPlayer: .constant(VideoPlayer()))
500 |         }
/Users/admin/builder/spi-builder-workspace/Sources/Views/ControlPanel.swift:497:20: error: extra trailing closure passed in call
495 |             content.add(entity)
496 |         }
497 |     } attachments: {
    |                    `- error: extra trailing closure passed in call
498 |         Attachment(id: "ControlPanel") {
499 |             ControlPanel(videoPlayer: .constant(VideoPlayer()))
/Users/admin/builder/spi-builder-workspace/Sources/Views/ControlPanel.swift:493:19: error: contextual closure type '@MainActor @Sendable (inout RealityViewCameraContent) async -> Void' expects 1 argument, but 2 were used in closure body
491 |
492 | #Preview {
493 |     RealityView { content, attachments in
    |                   `- error: contextual closure type '@MainActor @Sendable (inout RealityViewCameraContent) async -> Void' expects 1 argument, but 2 were used in closure body
494 |         if let entity = attachments.entity(for: "ControlPanel") {
495 |             content.add(entity)
/Users/admin/builder/spi-builder-workspace/Sources/Views/DropTarget.swift:74:9: error: extraneous argument label 'windowStyle:' in macro expansion
72 | }
73 |
74 | #Preview(windowStyle: .automatic) {
   |         `- error: extraneous argument label 'windowStyle:' in macro expansion
75 |     DropTarget() {
76 |         Color.clear
/Users/admin/builder/spi-builder-workspace/Sources/Views/DropTarget.swift:74:24: error: type 'String?' has no member 'automatic'
72 | }
73 |
74 | #Preview(windowStyle: .automatic) {
   |                        `- error: type 'String?' has no member 'automatic'
75 |     DropTarget() {
76 |         Color.clear
/Users/admin/builder/spi-builder-workspace/Sources/Views/StreamUrlInput.swift:51:41: error: 'circle' is only available in iOS 17.0 or newer
  9 |
 10 | /// A button revealing a sheet with a `TextField` and a clipboard paste button for manual input of HLS stream URLs.
 11 | public struct StreamUrlInput: View {
    |               `- note: add '@available' attribute to enclosing struct
 12 |     /// The visibility of the sheet.
 13 |     @State private var isSheetShowing: Bool = false
    :
 36 |     }
 37 |
 38 |     public var body: some View {
    |                `- note: add '@available' attribute to enclosing property
 39 |         Button("Enter Stream URL", systemImage: "link.circle.fill") {
 40 |             isSheetShowing.toggle()
    :
 49 |                         Image(systemName: "xmark")
 50 |                     }
 51 |                     .buttonBorderShape(.circle)
    |                                         |- error: 'circle' is only available in iOS 17.0 or newer
    |                                         `- note: add 'if #available' version check
 52 |
 53 |                     Text("Enter or paste a HLS stream URL (.m3u/.m3u8)")
/Users/admin/builder/spi-builder-workspace/Sources/Views/StreamUrlInput.swift:77:41: error: 'circle' is only available in iOS 17.0 or newer
  9 |
 10 | /// A button revealing a sheet with a `TextField` and a clipboard paste button for manual input of HLS stream URLs.
 11 | public struct StreamUrlInput: View {
    |               `- note: add '@available' attribute to enclosing struct
 12 |     /// The visibility of the sheet.
 13 |     @State private var isSheetShowing: Bool = false
    :
 36 |     }
 37 |
 38 |     public var body: some View {
    |                `- note: add '@available' attribute to enclosing property
 39 |         Button("Enter Stream URL", systemImage: "link.circle.fill") {
 40 |             isSheetShowing.toggle()
    :
 75 |                         Image(systemName: "list.clipboard")
 76 |                     }
 77 |                     .buttonBorderShape(.circle)
    |                                         |- error: 'circle' is only available in iOS 17.0 or newer
    |                                         `- note: add 'if #available' version check
 78 |                 }
 79 |                 .padding()
/Users/admin/builder/spi-builder-workspace/Sources/Views/StreamUrlInput.swift:92:14: error: 'presentationBackground' is only available in iOS 16.4 or newer
  9 |
 10 | /// A button revealing a sheet with a `TextField` and a clipboard paste button for manual input of HLS stream URLs.
 11 | public struct StreamUrlInput: View {
    |               `- note: add '@available' attribute to enclosing struct
 12 |     /// The visibility of the sheet.
 13 |     @State private var isSheetShowing: Bool = false
    :
 36 |     }
 37 |
 38 |     public var body: some View {
    |                `- note: add '@available' attribute to enclosing property
 39 |         Button("Enter Stream URL", systemImage: "link.circle.fill") {
 40 |             isSheetShowing.toggle()
    :
 90 |             .padding()
 91 |             .interactiveDismissDisabled()
 92 |             .presentationBackground(.clear)
    |              |- error: 'presentationBackground' is only available in iOS 16.4 or newer
    |              `- note: add 'if #available' version check
 93 |             .onChange(of: textfieldVal) { _, _ in
 94 |                 isUrlValid = validateUrl() != nil
/Users/admin/builder/spi-builder-workspace/Sources/Views/StreamUrlInput.swift:93:14: error: 'onChange(of:initial:_:)' is only available in iOS 17.0 or newer
  9 |
 10 | /// A button revealing a sheet with a `TextField` and a clipboard paste button for manual input of HLS stream URLs.
 11 | public struct StreamUrlInput: View {
    |               `- note: add '@available' attribute to enclosing struct
 12 |     /// The visibility of the sheet.
 13 |     @State private var isSheetShowing: Bool = false
    :
 36 |     }
 37 |
 38 |     public var body: some View {
    |                `- note: add '@available' attribute to enclosing property
 39 |         Button("Enter Stream URL", systemImage: "link.circle.fill") {
 40 |             isSheetShowing.toggle()
    :
 91 |             .interactiveDismissDisabled()
 92 |             .presentationBackground(.clear)
 93 |             .onChange(of: textfieldVal) { _, _ in
    |              |- error: 'onChange(of:initial:_:)' is only available in iOS 17.0 or newer
    |              `- note: add 'if #available' version check
 94 |                 isUrlValid = validateUrl() != nil
 95 |             }
SwiftCompile normal arm64 /Users/admin/builder/spi-builder-workspace/Sources/Views/ImmersivePlayer.swift (in target 'OpenImmersive' from project 'OpenImmersive')
    cd /Users/admin/builder/spi-builder-workspace/.swiftpm/xcode
    builtin-SwiftPerFileCompile ImmersivePlayer.swift
SwiftCompile normal arm64 /Users/admin/builder/spi-builder-workspace/Sources/Views/StreamUrlInput.swift (in target 'OpenImmersive' from project 'OpenImmersive')
    cd /Users/admin/builder/spi-builder-workspace/.swiftpm/xcode
    builtin-SwiftPerFileCompile StreamUrlInput.swift
SwiftCompile normal arm64 Compiling\ SpatialVideoTransferable.swift,\ VideoItem.swift /Users/admin/builder/spi-builder-workspace/Sources/Models/SpatialVideoTransferable.swift /Users/admin/builder/spi-builder-workspace/Sources/Models/VideoItem.swift (in target 'OpenImmersive' from project 'OpenImmersive')
SwiftCompile normal arm64 /Users/admin/builder/spi-builder-workspace/Sources/Models/SpatialVideoTransferable.swift (in target 'OpenImmersive' from project 'OpenImmersive')
    cd /Users/admin/builder/spi-builder-workspace/.swiftpm/xcode
    builtin-SwiftPerFileCompile SpatialVideoTransferable.swift
SwiftCompile normal arm64 /Users/admin/builder/spi-builder-workspace/Sources/Models/VideoItem.swift (in target 'OpenImmersive' from project 'OpenImmersive')
    cd /Users/admin/builder/spi-builder-workspace/.swiftpm/xcode
    builtin-SwiftPerFileCompile VideoItem.swift
PruneExplicitPrecompiledModules /Users/admin/builder/spi-builder-workspace/.derivedData/SDKExplicitPrecompiledModules
PruneExplicitPrecompiledModules /Users/admin/builder/spi-builder-workspace/.derivedData/Build/Intermediates.noindex/ExplicitPrecompiledModules
PruneExplicitPrecompiledModules /Users/admin/builder/spi-builder-workspace/.derivedData/Build/Intermediates.noindex/SwiftExplicitPrecompiledModules
2026-10-09 02:35:26.872 xcodebuild[784:4558] [MT] IDERunDestination: Supported platforms for the buildables in the current scheme is empty.
** BUILD FAILED **
The following build commands failed:
	SwiftEmitModule normal arm64 Emitting\ module\ for\ OpenImmersive (in target 'OpenImmersive' from project 'OpenImmersive')
	SwiftCompile normal arm64 (in target 'OpenImmersive' from project 'OpenImmersive')
	Building workspace OpenImmersive with scheme OpenImmersive
(3 failures)
BUILD FAILURE 6.4 iOS