The Swift Package Index logo.Swift Package Index

Build Information

Successful build of StreamDeck, reference main (0e88fe), with Swift 6.1 for macOS (SPM) on 26 Apr 2026 05:16:22 UTC.

Swift 6 data race errors: 358

Build Command

env DEVELOPER_DIR=/Applications/Xcode-16.3.0.app xcrun swift build --arch arm64 -Xswiftc -Xfrontend -Xswiftc -stats-output-dir -Xswiftc -Xfrontend -Xswiftc .stats -Xswiftc -strict-concurrency=complete -Xswiftc -enable-upcoming-feature -Xswiftc StrictConcurrency -Xswiftc -enable-upcoming-feature -Xswiftc DisableOutwardActorInference -Xswiftc -enable-upcoming-feature -Xswiftc GlobalActorIsolatedTypesUsability -Xswiftc -enable-upcoming-feature -Xswiftc InferSendableFromCaptures

Build Log

 57 | 	func setGlobalSettings(_ settings: [String: Any]) {
 58 | 		Task {
    |        `- warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
 59 | 			await PluginCommunication.shared.sendEvent(.setGlobalSettings,
 60 | 													   context: PluginCommunication.shared.uuid,
 61 | 													   payload: settings)
    |                          `- note: closure captures 'settings' which is accessible to code in the current task
 62 | 		}
 63 | 	}
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/StreamDeckPlugin/SDPlugin+Sent.swift:59:37: warning: sending 'settings.some' risks causing data races; this is an error in the Swift 6 language mode
 57 | 	func setGlobalSettings(_ settings: [String: Any]) {
 58 | 		Task {
 59 | 			await PluginCommunication.shared.sendEvent(.setGlobalSettings,
    |                                     |- warning: sending 'settings.some' risks causing data races; this is an error in the Swift 6 language mode
    |                                     `- note: sending task-isolated 'settings.some' to actor-isolated callee risks causing data races between actor-isolated and task-isolated uses
 60 | 													   context: PluginCommunication.shared.uuid,
 61 | 													   payload: settings)
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/StreamDeckPlugin/SDPlugin+Sent.swift:112:8: warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
110 | 	///   - state: A 0-based integer value representing the state of an action with multiple states. This is an optional parameter. If not specified, the title is set to all states.
111 | 	func setTitle(in context: String, to title: String?, target: Target? = nil, state: Int? = nil) {
112 | 		Task {
    |        `- warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
113 | 			var payload: [String: Any] = [:]
114 |
115 | 			payload["title"] = title
116 | 			payload["target"] = target?.rawValue
    |                        `- note: closure captures 'target' which is accessible to code in the current task
117 | 			payload["state"] = state
118 |
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/StreamDeckPlugin/SDPlugin+Sent.swift:139:8: warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
137 | 		let encodedImage = image?.base64String
138 |
139 | 		Task {
    |        `- warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
140 | 			var payload: [String: Any] = [:]
141 |
142 | 			payload["image"] = encodedImage
143 | 			payload["target"] = target?.rawValue
    |                        `- note: closure captures 'target' which is accessible to code in the current task
144 | 			payload["state"] = state
145 |
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/StreamDeckPlugin/SDPlugin+Sent.swift:188:8: warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
186 | 	///   - state: A 0-based integer value representing the state of an action with multiple states. This is an optional parameter. If not specified, the title is set to all states.
187 | 	func setImage(in context: String, toSVG svg: String?, target: Target? = nil, state: Int? = nil) {
188 | 		Task {
    |        `- warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
189 | 			var payload: [String: Any] = [:]
190 |
    :
193 | 			}
194 |
195 | 			payload["target"] = target?.rawValue
    |                        `- note: closure captures 'target' which is accessible to code in the current task
196 | 			payload["state"] = state
197 |
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/StreamDeckPlugin/SDPlugin+Sent.swift:259:8: warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
257 | 	///   - payload: A json object that will be received by the Property Inspector.
258 | 	func sendToPropertyInspector(in context: String, action: String, payload: [String: Any]) {
259 | 		Task {
    |        `- warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
260 | 			await PluginCommunication.shared.sendEvent(.sendToPropertyInspector,
261 | 													   action: action,
262 | 													   context: context,
263 | 													   payload: payload)
    |                          `- note: closure captures 'payload' which is accessible to code in the current task
264 | 		}
265 | 	}
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/StreamDeckPlugin/SDPlugin+Sent.swift:260:37: warning: sending 'payload.some' risks causing data races; this is an error in the Swift 6 language mode
258 | 	func sendToPropertyInspector(in context: String, action: String, payload: [String: Any]) {
259 | 		Task {
260 | 			await PluginCommunication.shared.sendEvent(.sendToPropertyInspector,
    |                                     |- warning: sending 'payload.some' risks causing data races; this is an error in the Swift 6 language mode
    |                                     `- note: sending task-isolated 'payload.some' to actor-isolated callee risks causing data races between actor-isolated and task-isolated uses
261 | 													   action: action,
262 | 													   context: context,
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/Action/LongPress.swift:17:13: warning: static property 'shared' is not concurrency-safe because non-'Sendable' type 'TimerKeeper' may have shared mutable state; this is an error in the Swift 6 language mode
12 |
13 | /// A class that stores long press timers for actions.
14 | class TimerKeeper {
   |       `- note: class 'TimerKeeper' does not conform to the 'Sendable' protocol
15 |
16 | 	/// The shared `TimerKeeper` instance.
17 | 	static let shared = TimerKeeper()
   |             |- warning: static property 'shared' is not concurrency-safe because non-'Sendable' type 'TimerKeeper' may have shared mutable state; this is an error in the Swift 6 language mode
   |             |- note: add '@MainActor' to make static property 'shared' part of global actor 'MainActor'
   |             `- note: disable concurrency-safety checks if accesses are protected by an external synchronization mechanism
18 |
19 | 	/// Times that have been set for a specific action instance.
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/Action/LongPress.swift:52:50: warning: capture of 'action' with non-sendable type 'A' in a '@Sendable' closure
44 | 	///   - action: The `Action`.
45 | 	///   - event: The `KeyEvent` which is passed to handler.
46 | 	func beginTimer<A: Action>(for action: A, event: ActionEvent<KeyEvent<A.Settings>>) {
   |                  `- note: consider making generic parameter 'A' conform to the 'Sendable' protocol
47 |
48 | 		log.log("Beginning long press timer for \(action.context, privacy: .public)")
   :
50 | 		// Begin the long-press timer
51 | 		let timer = Timer(timeInterval: action.longPressDuration, repeats: false) { _ in
52 | 			log.log("Long key press timer has fired for \(action.context, privacy: .public)")
   |                                                  `- warning: capture of 'action' with non-sendable type 'A' in a '@Sendable' closure
53 | 			self.lastState[action.context] = true
54 | 			action.longKeyPress(device: event.device, payload: event.payload)
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/Action/LongPress.swift:53:4: warning: capture of 'self' with non-sendable type 'TimerKeeper' in a '@Sendable' closure
12 |
13 | /// A class that stores long press timers for actions.
14 | class TimerKeeper {
   |       `- note: class 'TimerKeeper' does not conform to the 'Sendable' protocol
15 |
16 | 	/// The shared `TimerKeeper` instance.
   :
51 | 		let timer = Timer(timeInterval: action.longPressDuration, repeats: false) { _ in
52 | 			log.log("Long key press timer has fired for \(action.context, privacy: .public)")
53 | 			self.lastState[action.context] = true
   |    `- warning: capture of 'self' with non-sendable type 'TimerKeeper' in a '@Sendable' closure
54 | 			action.longKeyPress(device: event.device, payload: event.payload)
55 | 		}
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/Action/LongPress.swift:54:32: warning: capture of 'event' with non-sendable type 'ActionEvent<KeyEvent<A.Settings>>' in a '@Sendable' closure
52 | 			log.log("Long key press timer has fired for \(action.context, privacy: .public)")
53 | 			self.lastState[action.context] = true
54 | 			action.longKeyPress(device: event.device, payload: event.payload)
   |                                `- warning: capture of 'event' with non-sendable type 'ActionEvent<KeyEvent<A.Settings>>' in a '@Sendable' closure
55 | 		}
56 |
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/Events/Events.swift:87:15: note: consider making generic struct 'ActionEvent' conform to the 'Sendable' protocol
 85 |
 86 | /// Events sent by the server in response to actions.
 87 | public struct ActionEvent<Payload: Decodable>: Decodable {
    |               `- note: consider making generic struct 'ActionEvent' conform to the 'Sendable' protocol
 88 |
 89 | 	/// The action's unique identifier. If your plugin supports multiple actions, you should use this value to see which action was triggered.
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/Action/LongPress.swift:52:50: warning: implicit capture of 'action' requires that 'A' conforms to 'Sendable'; this is an error in the Swift 6 language mode
44 | 	///   - action: The `Action`.
45 | 	///   - event: The `KeyEvent` which is passed to handler.
46 | 	func beginTimer<A: Action>(for action: A, event: ActionEvent<KeyEvent<A.Settings>>) {
   |                  `- note: consider making generic parameter 'A' conform to the 'Sendable' protocol
47 |
48 | 		log.log("Beginning long press timer for \(action.context, privacy: .public)")
   :
50 | 		// Begin the long-press timer
51 | 		let timer = Timer(timeInterval: action.longPressDuration, repeats: false) { _ in
52 | 			log.log("Long key press timer has fired for \(action.context, privacy: .public)")
   |                                                  `- warning: implicit capture of 'action' requires that 'A' conforms to 'Sendable'; this is an error in the Swift 6 language mode
53 | 			self.lastState[action.context] = true
54 | 			action.longKeyPress(device: event.device, payload: event.payload)
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/Action/LongPress.swift:70:51: warning: capture of 'action' with non-sendable type 'A' in a '@Sendable' closure
62 | 	///   - action: The `Action`.
63 | 	///   - event: The `KeyEvent` which is passed to handler.
64 | 	func beginTimer<A: Action>(for action: A, event: ActionEvent<EncoderPressEvent<A.Settings>>) {
   |                  `- note: consider making generic parameter 'A' conform to the 'Sendable' protocol
65 |
66 | 		log.log("Beginning long press timer for \(action.context, privacy: .public)")
   :
68 | 		// Begin the long-press timer
69 | 		let timer = Timer(timeInterval: action.longPressDuration, repeats: false) { _ in
70 | 			log.log("Long dial press timer has fired for \(action.context, privacy: .public)")
   |                                                   `- warning: capture of 'action' with non-sendable type 'A' in a '@Sendable' closure
71 | 			self.lastState[action.context] = true
72 | 			action.longDialPress(device: event.device, payload: event.payload)
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/Action/LongPress.swift:71:4: warning: capture of 'self' with non-sendable type 'TimerKeeper' in a '@Sendable' closure
12 |
13 | /// A class that stores long press timers for actions.
14 | class TimerKeeper {
   |       `- note: class 'TimerKeeper' does not conform to the 'Sendable' protocol
15 |
16 | 	/// The shared `TimerKeeper` instance.
   :
69 | 		let timer = Timer(timeInterval: action.longPressDuration, repeats: false) { _ in
70 | 			log.log("Long dial press timer has fired for \(action.context, privacy: .public)")
71 | 			self.lastState[action.context] = true
   |    `- warning: capture of 'self' with non-sendable type 'TimerKeeper' in a '@Sendable' closure
72 | 			action.longDialPress(device: event.device, payload: event.payload)
73 | 		}
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/Action/LongPress.swift:72:33: warning: capture of 'event' with non-sendable type 'ActionEvent<EncoderPressEvent<A.Settings>>' in a '@Sendable' closure
70 | 			log.log("Long dial press timer has fired for \(action.context, privacy: .public)")
71 | 			self.lastState[action.context] = true
72 | 			action.longDialPress(device: event.device, payload: event.payload)
   |                                 `- warning: capture of 'event' with non-sendable type 'ActionEvent<EncoderPressEvent<A.Settings>>' in a '@Sendable' closure
73 | 		}
74 |
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/Events/Events.swift:87:15: note: consider making generic struct 'ActionEvent' conform to the 'Sendable' protocol
 85 |
 86 | /// Events sent by the server in response to actions.
 87 | public struct ActionEvent<Payload: Decodable>: Decodable {
    |               `- note: consider making generic struct 'ActionEvent' conform to the 'Sendable' protocol
 88 |
 89 | 	/// The action's unique identifier. If your plugin supports multiple actions, you should use this value to see which action was triggered.
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/Action/LongPress.swift:70:51: warning: implicit capture of 'action' requires that 'A' conforms to 'Sendable'; this is an error in the Swift 6 language mode
62 | 	///   - action: The `Action`.
63 | 	///   - event: The `KeyEvent` which is passed to handler.
64 | 	func beginTimer<A: Action>(for action: A, event: ActionEvent<EncoderPressEvent<A.Settings>>) {
   |                  `- note: consider making generic parameter 'A' conform to the 'Sendable' protocol
65 |
66 | 		log.log("Beginning long press timer for \(action.context, privacy: .public)")
   :
68 | 		// Begin the long-press timer
69 | 		let timer = Timer(timeInterval: action.longPressDuration, repeats: false) { _ in
70 | 			log.log("Long dial press timer has fired for \(action.context, privacy: .public)")
   |                                                   `- warning: implicit capture of 'action' requires that 'A' conforms to 'Sendable'; this is an error in the Swift 6 language mode
71 | 			self.lastState[action.context] = true
72 | 			action.longDialPress(device: event.device, payload: event.payload)
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/StreamDeckError.swift:14:7: warning: associated value 'invalidJSON' of 'Sendable'-conforming enum 'StreamDeckError' has non-sendable type 'Any'; this is an error in the Swift 6 language mode
12 |
13 | 	/// The JSON for an event is invalid.
14 | 	case invalidJSON(String, [String: Any])
   |       `- warning: associated value 'invalidJSON' of 'Sendable'-conforming enum 'StreamDeckError' has non-sendable type 'Any'; this is an error in the Swift 6 language mode
15 |
16 | 	/// The UUID has been used more than once.
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/StreamDeckPlugin/SDPlugin+Sent.swift:25:8: warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
 23 | 	@available(*, deprecated, message: "Use the Settings API.")
 24 | 	func setSettings(in context: String, to settings: [String: Any]) {
 25 | 		Task {
    |        `- warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
 26 | 			await PluginCommunication.shared.sendEvent(.setSettings,
 27 | 													   context: context,
 28 | 													   payload: settings)
    |                          `- note: closure captures 'settings' which is accessible to code in the current task
 29 | 		}
 30 | 	}
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/StreamDeckPlugin/SDPlugin+Sent.swift:26:37: warning: sending 'settings.some' risks causing data races; this is an error in the Swift 6 language mode
 24 | 	func setSettings(in context: String, to settings: [String: Any]) {
 25 | 		Task {
 26 | 			await PluginCommunication.shared.sendEvent(.setSettings,
    |                                     |- warning: sending 'settings.some' risks causing data races; this is an error in the Swift 6 language mode
    |                                     `- note: sending task-isolated 'settings.some' to actor-isolated callee risks causing data races between actor-isolated and task-isolated uses
 27 | 													   context: context,
 28 | 													   payload: settings)
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/StreamDeckPlugin/SDPlugin+Sent.swift:37:8: warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
 35 | 	///   - settings: A json object which is persistently saved for the action's instance.
 36 | 	func setSettings<P: Encodable>(in context: String, to settings: P) {
 37 | 		Task {
    |        `- warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
 38 | 			await PluginCommunication.shared.sendEvent(.setSettings,
 39 | 													   context: context,
 40 | 													   payload: settings)
    |                          `- note: closure captures 'settings' which is accessible to code in the current task
 41 | 		}
 42 | 	}
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/StreamDeckPlugin/SDPlugin+Sent.swift:38:37: warning: sending value of non-Sendable type 'P' risks causing data races; this is an error in the Swift 6 language mode
 36 | 	func setSettings<P: Encodable>(in context: String, to settings: P) {
 37 | 		Task {
 38 | 			await PluginCommunication.shared.sendEvent(.setSettings,
    |                                     |- warning: sending value of non-Sendable type 'P' risks causing data races; this is an error in the Swift 6 language mode
    |                                     `- note: sending task-isolated value of non-Sendable type 'P' to actor-isolated callee risks causing races in between task-isolated and actor-isolated uses
 39 | 													   context: context,
 40 | 													   payload: settings)
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/StreamDeckPlugin/SDPlugin+Sent.swift:58:8: warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
 56 | 	///   - settings: A json object which is persistently saved globally.
 57 | 	func setGlobalSettings(_ settings: [String: Any]) {
 58 | 		Task {
    |        `- warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
 59 | 			await PluginCommunication.shared.sendEvent(.setGlobalSettings,
 60 | 													   context: PluginCommunication.shared.uuid,
 61 | 													   payload: settings)
    |                          `- note: closure captures 'settings' which is accessible to code in the current task
 62 | 		}
 63 | 	}
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/StreamDeckPlugin/SDPlugin+Sent.swift:59:37: warning: sending 'settings.some' risks causing data races; this is an error in the Swift 6 language mode
 57 | 	func setGlobalSettings(_ settings: [String: Any]) {
 58 | 		Task {
 59 | 			await PluginCommunication.shared.sendEvent(.setGlobalSettings,
    |                                     |- warning: sending 'settings.some' risks causing data races; this is an error in the Swift 6 language mode
    |                                     `- note: sending task-isolated 'settings.some' to actor-isolated callee risks causing data races between actor-isolated and task-isolated uses
 60 | 													   context: PluginCommunication.shared.uuid,
 61 | 													   payload: settings)
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/StreamDeckPlugin/SDPlugin+Sent.swift:112:8: warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
110 | 	///   - state: A 0-based integer value representing the state of an action with multiple states. This is an optional parameter. If not specified, the title is set to all states.
111 | 	func setTitle(in context: String, to title: String?, target: Target? = nil, state: Int? = nil) {
112 | 		Task {
    |        `- warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
113 | 			var payload: [String: Any] = [:]
114 |
115 | 			payload["title"] = title
116 | 			payload["target"] = target?.rawValue
    |                        `- note: closure captures 'target' which is accessible to code in the current task
117 | 			payload["state"] = state
118 |
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/StreamDeckPlugin/SDPlugin+Sent.swift:139:8: warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
137 | 		let encodedImage = image?.base64String
138 |
139 | 		Task {
    |        `- warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
140 | 			var payload: [String: Any] = [:]
141 |
142 | 			payload["image"] = encodedImage
143 | 			payload["target"] = target?.rawValue
    |                        `- note: closure captures 'target' which is accessible to code in the current task
144 | 			payload["state"] = state
145 |
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/StreamDeckPlugin/SDPlugin+Sent.swift:188:8: warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
186 | 	///   - state: A 0-based integer value representing the state of an action with multiple states. This is an optional parameter. If not specified, the title is set to all states.
187 | 	func setImage(in context: String, toSVG svg: String?, target: Target? = nil, state: Int? = nil) {
188 | 		Task {
    |        `- warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
189 | 			var payload: [String: Any] = [:]
190 |
    :
193 | 			}
194 |
195 | 			payload["target"] = target?.rawValue
    |                        `- note: closure captures 'target' which is accessible to code in the current task
196 | 			payload["state"] = state
197 |
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/StreamDeckPlugin/SDPlugin+Sent.swift:259:8: warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
257 | 	///   - payload: A json object that will be received by the Property Inspector.
258 | 	func sendToPropertyInspector(in context: String, action: String, payload: [String: Any]) {
259 | 		Task {
    |        `- warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
260 | 			await PluginCommunication.shared.sendEvent(.sendToPropertyInspector,
261 | 													   action: action,
262 | 													   context: context,
263 | 													   payload: payload)
    |                          `- note: closure captures 'payload' which is accessible to code in the current task
264 | 		}
265 | 	}
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/StreamDeckPlugin/SDPlugin+Sent.swift:260:37: warning: sending 'payload.some' risks causing data races; this is an error in the Swift 6 language mode
258 | 	func sendToPropertyInspector(in context: String, action: String, payload: [String: Any]) {
259 | 		Task {
260 | 			await PluginCommunication.shared.sendEvent(.sendToPropertyInspector,
    |                                     |- warning: sending 'payload.some' risks causing data races; this is an error in the Swift 6 language mode
    |                                     `- note: sending task-isolated 'payload.some' to actor-isolated callee risks causing data races between actor-isolated and task-isolated uses
261 | 													   action: action,
262 | 													   context: context,
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/Action/LongPress.swift:17:13: warning: static property 'shared' is not concurrency-safe because non-'Sendable' type 'TimerKeeper' may have shared mutable state; this is an error in the Swift 6 language mode
12 |
13 | /// A class that stores long press timers for actions.
14 | class TimerKeeper {
   |       `- note: class 'TimerKeeper' does not conform to the 'Sendable' protocol
15 |
16 | 	/// The shared `TimerKeeper` instance.
17 | 	static let shared = TimerKeeper()
   |             |- warning: static property 'shared' is not concurrency-safe because non-'Sendable' type 'TimerKeeper' may have shared mutable state; this is an error in the Swift 6 language mode
   |             |- note: add '@MainActor' to make static property 'shared' part of global actor 'MainActor'
   |             `- note: disable concurrency-safety checks if accesses are protected by an external synchronization mechanism
18 |
19 | 	/// Times that have been set for a specific action instance.
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/Action/LongPress.swift:52:50: warning: capture of 'action' with non-sendable type 'A' in a '@Sendable' closure
44 | 	///   - action: The `Action`.
45 | 	///   - event: The `KeyEvent` which is passed to handler.
46 | 	func beginTimer<A: Action>(for action: A, event: ActionEvent<KeyEvent<A.Settings>>) {
   |                  `- note: consider making generic parameter 'A' conform to the 'Sendable' protocol
47 |
48 | 		log.log("Beginning long press timer for \(action.context, privacy: .public)")
   :
50 | 		// Begin the long-press timer
51 | 		let timer = Timer(timeInterval: action.longPressDuration, repeats: false) { _ in
52 | 			log.log("Long key press timer has fired for \(action.context, privacy: .public)")
   |                                                  `- warning: capture of 'action' with non-sendable type 'A' in a '@Sendable' closure
53 | 			self.lastState[action.context] = true
54 | 			action.longKeyPress(device: event.device, payload: event.payload)
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/Action/LongPress.swift:53:4: warning: capture of 'self' with non-sendable type 'TimerKeeper' in a '@Sendable' closure
12 |
13 | /// A class that stores long press timers for actions.
14 | class TimerKeeper {
   |       `- note: class 'TimerKeeper' does not conform to the 'Sendable' protocol
15 |
16 | 	/// The shared `TimerKeeper` instance.
   :
51 | 		let timer = Timer(timeInterval: action.longPressDuration, repeats: false) { _ in
52 | 			log.log("Long key press timer has fired for \(action.context, privacy: .public)")
53 | 			self.lastState[action.context] = true
   |    `- warning: capture of 'self' with non-sendable type 'TimerKeeper' in a '@Sendable' closure
54 | 			action.longKeyPress(device: event.device, payload: event.payload)
55 | 		}
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/Action/LongPress.swift:54:32: warning: capture of 'event' with non-sendable type 'ActionEvent<KeyEvent<A.Settings>>' in a '@Sendable' closure
52 | 			log.log("Long key press timer has fired for \(action.context, privacy: .public)")
53 | 			self.lastState[action.context] = true
54 | 			action.longKeyPress(device: event.device, payload: event.payload)
   |                                `- warning: capture of 'event' with non-sendable type 'ActionEvent<KeyEvent<A.Settings>>' in a '@Sendable' closure
55 | 		}
56 |
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/Events/Events.swift:87:15: note: consider making generic struct 'ActionEvent' conform to the 'Sendable' protocol
 85 |
 86 | /// Events sent by the server in response to actions.
 87 | public struct ActionEvent<Payload: Decodable>: Decodable {
    |               `- note: consider making generic struct 'ActionEvent' conform to the 'Sendable' protocol
 88 |
 89 | 	/// The action's unique identifier. If your plugin supports multiple actions, you should use this value to see which action was triggered.
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/Action/LongPress.swift:52:50: warning: implicit capture of 'action' requires that 'A' conforms to 'Sendable'; this is an error in the Swift 6 language mode
44 | 	///   - action: The `Action`.
45 | 	///   - event: The `KeyEvent` which is passed to handler.
46 | 	func beginTimer<A: Action>(for action: A, event: ActionEvent<KeyEvent<A.Settings>>) {
   |                  `- note: consider making generic parameter 'A' conform to the 'Sendable' protocol
47 |
48 | 		log.log("Beginning long press timer for \(action.context, privacy: .public)")
   :
50 | 		// Begin the long-press timer
51 | 		let timer = Timer(timeInterval: action.longPressDuration, repeats: false) { _ in
52 | 			log.log("Long key press timer has fired for \(action.context, privacy: .public)")
   |                                                  `- warning: implicit capture of 'action' requires that 'A' conforms to 'Sendable'; this is an error in the Swift 6 language mode
53 | 			self.lastState[action.context] = true
54 | 			action.longKeyPress(device: event.device, payload: event.payload)
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/Action/LongPress.swift:70:51: warning: capture of 'action' with non-sendable type 'A' in a '@Sendable' closure
62 | 	///   - action: The `Action`.
63 | 	///   - event: The `KeyEvent` which is passed to handler.
64 | 	func beginTimer<A: Action>(for action: A, event: ActionEvent<EncoderPressEvent<A.Settings>>) {
   |                  `- note: consider making generic parameter 'A' conform to the 'Sendable' protocol
65 |
66 | 		log.log("Beginning long press timer for \(action.context, privacy: .public)")
   :
68 | 		// Begin the long-press timer
69 | 		let timer = Timer(timeInterval: action.longPressDuration, repeats: false) { _ in
70 | 			log.log("Long dial press timer has fired for \(action.context, privacy: .public)")
   |                                                   `- warning: capture of 'action' with non-sendable type 'A' in a '@Sendable' closure
71 | 			self.lastState[action.context] = true
72 | 			action.longDialPress(device: event.device, payload: event.payload)
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/Action/LongPress.swift:71:4: warning: capture of 'self' with non-sendable type 'TimerKeeper' in a '@Sendable' closure
12 |
13 | /// A class that stores long press timers for actions.
14 | class TimerKeeper {
   |       `- note: class 'TimerKeeper' does not conform to the 'Sendable' protocol
15 |
16 | 	/// The shared `TimerKeeper` instance.
   :
69 | 		let timer = Timer(timeInterval: action.longPressDuration, repeats: false) { _ in
70 | 			log.log("Long dial press timer has fired for \(action.context, privacy: .public)")
71 | 			self.lastState[action.context] = true
   |    `- warning: capture of 'self' with non-sendable type 'TimerKeeper' in a '@Sendable' closure
72 | 			action.longDialPress(device: event.device, payload: event.payload)
73 | 		}
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/Action/LongPress.swift:72:33: warning: capture of 'event' with non-sendable type 'ActionEvent<EncoderPressEvent<A.Settings>>' in a '@Sendable' closure
70 | 			log.log("Long dial press timer has fired for \(action.context, privacy: .public)")
71 | 			self.lastState[action.context] = true
72 | 			action.longDialPress(device: event.device, payload: event.payload)
   |                                 `- warning: capture of 'event' with non-sendable type 'ActionEvent<EncoderPressEvent<A.Settings>>' in a '@Sendable' closure
73 | 		}
74 |
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/Events/Events.swift:87:15: note: consider making generic struct 'ActionEvent' conform to the 'Sendable' protocol
 85 |
 86 | /// Events sent by the server in response to actions.
 87 | public struct ActionEvent<Payload: Decodable>: Decodable {
    |               `- note: consider making generic struct 'ActionEvent' conform to the 'Sendable' protocol
 88 |
 89 | 	/// The action's unique identifier. If your plugin supports multiple actions, you should use this value to see which action was triggered.
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/Action/LongPress.swift:70:51: warning: implicit capture of 'action' requires that 'A' conforms to 'Sendable'; this is an error in the Swift 6 language mode
62 | 	///   - action: The `Action`.
63 | 	///   - event: The `KeyEvent` which is passed to handler.
64 | 	func beginTimer<A: Action>(for action: A, event: ActionEvent<EncoderPressEvent<A.Settings>>) {
   |                  `- note: consider making generic parameter 'A' conform to the 'Sendable' protocol
65 |
66 | 		log.log("Beginning long press timer for \(action.context, privacy: .public)")
   :
68 | 		// Begin the long-press timer
69 | 		let timer = Timer(timeInterval: action.longPressDuration, repeats: false) { _ in
70 | 			log.log("Long dial press timer has fired for \(action.context, privacy: .public)")
   |                                                   `- warning: implicit capture of 'action' requires that 'A' conforms to 'Sendable'; this is an error in the Swift 6 language mode
71 | 			self.lastState[action.context] = true
72 | 			action.longDialPress(device: event.device, payload: event.payload)
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/StreamDeckError.swift:14:7: warning: associated value 'invalidJSON' of 'Sendable'-conforming enum 'StreamDeckError' has non-sendable type 'Any'; this is an error in the Swift 6 language mode
12 |
13 | 	/// The JSON for an event is invalid.
14 | 	case invalidJSON(String, [String: Any])
   |       `- warning: associated value 'invalidJSON' of 'Sendable'-conforming enum 'StreamDeckError' has non-sendable type 'Any'; this is an error in the Swift 6 language mode
15 |
16 | 	/// The UUID has been used more than once.
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/StreamDeckPlugin/SDPlugin+Sent.swift:25:8: warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
 23 | 	@available(*, deprecated, message: "Use the Settings API.")
 24 | 	func setSettings(in context: String, to settings: [String: Any]) {
 25 | 		Task {
    |        `- warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
 26 | 			await PluginCommunication.shared.sendEvent(.setSettings,
 27 | 													   context: context,
 28 | 													   payload: settings)
    |                          `- note: closure captures 'settings' which is accessible to code in the current task
 29 | 		}
 30 | 	}
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/StreamDeckPlugin/SDPlugin+Sent.swift:26:37: warning: sending 'settings.some' risks causing data races; this is an error in the Swift 6 language mode
 24 | 	func setSettings(in context: String, to settings: [String: Any]) {
 25 | 		Task {
 26 | 			await PluginCommunication.shared.sendEvent(.setSettings,
    |                                     |- warning: sending 'settings.some' risks causing data races; this is an error in the Swift 6 language mode
    |                                     `- note: sending task-isolated 'settings.some' to actor-isolated callee risks causing data races between actor-isolated and task-isolated uses
 27 | 													   context: context,
 28 | 													   payload: settings)
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/StreamDeckPlugin/SDPlugin+Sent.swift:37:8: warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
 35 | 	///   - settings: A json object which is persistently saved for the action's instance.
 36 | 	func setSettings<P: Encodable>(in context: String, to settings: P) {
 37 | 		Task {
    |        `- warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
 38 | 			await PluginCommunication.shared.sendEvent(.setSettings,
 39 | 													   context: context,
 40 | 													   payload: settings)
    |                          `- note: closure captures 'settings' which is accessible to code in the current task
 41 | 		}
 42 | 	}
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/StreamDeckPlugin/SDPlugin+Sent.swift:38:37: warning: sending value of non-Sendable type 'P' risks causing data races; this is an error in the Swift 6 language mode
 36 | 	func setSettings<P: Encodable>(in context: String, to settings: P) {
 37 | 		Task {
 38 | 			await PluginCommunication.shared.sendEvent(.setSettings,
    |                                     |- warning: sending value of non-Sendable type 'P' risks causing data races; this is an error in the Swift 6 language mode
    |                                     `- note: sending task-isolated value of non-Sendable type 'P' to actor-isolated callee risks causing races in between task-isolated and actor-isolated uses
 39 | 													   context: context,
 40 | 													   payload: settings)
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/StreamDeckPlugin/SDPlugin+Sent.swift:58:8: warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
 56 | 	///   - settings: A json object which is persistently saved globally.
 57 | 	func setGlobalSettings(_ settings: [String: Any]) {
 58 | 		Task {
    |        `- warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
 59 | 			await PluginCommunication.shared.sendEvent(.setGlobalSettings,
 60 | 													   context: PluginCommunication.shared.uuid,
 61 | 													   payload: settings)
    |                          `- note: closure captures 'settings' which is accessible to code in the current task
 62 | 		}
 63 | 	}
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/StreamDeckPlugin/SDPlugin+Sent.swift:59:37: warning: sending 'settings.some' risks causing data races; this is an error in the Swift 6 language mode
 57 | 	func setGlobalSettings(_ settings: [String: Any]) {
 58 | 		Task {
 59 | 			await PluginCommunication.shared.sendEvent(.setGlobalSettings,
    |                                     |- warning: sending 'settings.some' risks causing data races; this is an error in the Swift 6 language mode
    |                                     `- note: sending task-isolated 'settings.some' to actor-isolated callee risks causing data races between actor-isolated and task-isolated uses
 60 | 													   context: PluginCommunication.shared.uuid,
 61 | 													   payload: settings)
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/StreamDeckPlugin/SDPlugin+Sent.swift:112:8: warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
110 | 	///   - state: A 0-based integer value representing the state of an action with multiple states. This is an optional parameter. If not specified, the title is set to all states.
111 | 	func setTitle(in context: String, to title: String?, target: Target? = nil, state: Int? = nil) {
112 | 		Task {
    |        `- warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
113 | 			var payload: [String: Any] = [:]
114 |
115 | 			payload["title"] = title
116 | 			payload["target"] = target?.rawValue
    |                        `- note: closure captures 'target' which is accessible to code in the current task
117 | 			payload["state"] = state
118 |
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/StreamDeckPlugin/SDPlugin+Sent.swift:139:8: warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
137 | 		let encodedImage = image?.base64String
138 |
139 | 		Task {
    |        `- warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
140 | 			var payload: [String: Any] = [:]
141 |
142 | 			payload["image"] = encodedImage
143 | 			payload["target"] = target?.rawValue
    |                        `- note: closure captures 'target' which is accessible to code in the current task
144 | 			payload["state"] = state
145 |
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/StreamDeckPlugin/SDPlugin+Sent.swift:188:8: warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
186 | 	///   - state: A 0-based integer value representing the state of an action with multiple states. This is an optional parameter. If not specified, the title is set to all states.
187 | 	func setImage(in context: String, toSVG svg: String?, target: Target? = nil, state: Int? = nil) {
188 | 		Task {
    |        `- warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
189 | 			var payload: [String: Any] = [:]
190 |
    :
193 | 			}
194 |
195 | 			payload["target"] = target?.rawValue
    |                        `- note: closure captures 'target' which is accessible to code in the current task
196 | 			payload["state"] = state
197 |
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/StreamDeckPlugin/SDPlugin+Sent.swift:259:8: warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
257 | 	///   - payload: A json object that will be received by the Property Inspector.
258 | 	func sendToPropertyInspector(in context: String, action: String, payload: [String: Any]) {
259 | 		Task {
    |        `- warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
260 | 			await PluginCommunication.shared.sendEvent(.sendToPropertyInspector,
261 | 													   action: action,
262 | 													   context: context,
263 | 													   payload: payload)
    |                          `- note: closure captures 'payload' which is accessible to code in the current task
264 | 		}
265 | 	}
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/StreamDeckPlugin/SDPlugin+Sent.swift:260:37: warning: sending 'payload.some' risks causing data races; this is an error in the Swift 6 language mode
258 | 	func sendToPropertyInspector(in context: String, action: String, payload: [String: Any]) {
259 | 		Task {
260 | 			await PluginCommunication.shared.sendEvent(.sendToPropertyInspector,
    |                                     |- warning: sending 'payload.some' risks causing data races; this is an error in the Swift 6 language mode
    |                                     `- note: sending task-isolated 'payload.some' to actor-isolated callee risks causing data races between actor-isolated and task-isolated uses
261 | 													   action: action,
262 | 													   context: context,
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/Action/LongPress.swift:17:13: warning: static property 'shared' is not concurrency-safe because non-'Sendable' type 'TimerKeeper' may have shared mutable state; this is an error in the Swift 6 language mode
12 |
13 | /// A class that stores long press timers for actions.
14 | class TimerKeeper {
   |       `- note: class 'TimerKeeper' does not conform to the 'Sendable' protocol
15 |
16 | 	/// The shared `TimerKeeper` instance.
17 | 	static let shared = TimerKeeper()
   |             |- warning: static property 'shared' is not concurrency-safe because non-'Sendable' type 'TimerKeeper' may have shared mutable state; this is an error in the Swift 6 language mode
   |             |- note: add '@MainActor' to make static property 'shared' part of global actor 'MainActor'
   |             `- note: disable concurrency-safety checks if accesses are protected by an external synchronization mechanism
18 |
19 | 	/// Times that have been set for a specific action instance.
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/Action/LongPress.swift:52:50: warning: capture of 'action' with non-sendable type 'A' in a '@Sendable' closure
44 | 	///   - action: The `Action`.
45 | 	///   - event: The `KeyEvent` which is passed to handler.
46 | 	func beginTimer<A: Action>(for action: A, event: ActionEvent<KeyEvent<A.Settings>>) {
   |                  `- note: consider making generic parameter 'A' conform to the 'Sendable' protocol
47 |
48 | 		log.log("Beginning long press timer for \(action.context, privacy: .public)")
   :
50 | 		// Begin the long-press timer
51 | 		let timer = Timer(timeInterval: action.longPressDuration, repeats: false) { _ in
52 | 			log.log("Long key press timer has fired for \(action.context, privacy: .public)")
   |                                                  `- warning: capture of 'action' with non-sendable type 'A' in a '@Sendable' closure
53 | 			self.lastState[action.context] = true
54 | 			action.longKeyPress(device: event.device, payload: event.payload)
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/Action/LongPress.swift:53:4: warning: capture of 'self' with non-sendable type 'TimerKeeper' in a '@Sendable' closure
12 |
13 | /// A class that stores long press timers for actions.
14 | class TimerKeeper {
   |       `- note: class 'TimerKeeper' does not conform to the 'Sendable' protocol
15 |
16 | 	/// The shared `TimerKeeper` instance.
   :
51 | 		let timer = Timer(timeInterval: action.longPressDuration, repeats: false) { _ in
52 | 			log.log("Long key press timer has fired for \(action.context, privacy: .public)")
53 | 			self.lastState[action.context] = true
   |    `- warning: capture of 'self' with non-sendable type 'TimerKeeper' in a '@Sendable' closure
54 | 			action.longKeyPress(device: event.device, payload: event.payload)
55 | 		}
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/Action/LongPress.swift:54:32: warning: capture of 'event' with non-sendable type 'ActionEvent<KeyEvent<A.Settings>>' in a '@Sendable' closure
52 | 			log.log("Long key press timer has fired for \(action.context, privacy: .public)")
53 | 			self.lastState[action.context] = true
54 | 			action.longKeyPress(device: event.device, payload: event.payload)
   |                                `- warning: capture of 'event' with non-sendable type 'ActionEvent<KeyEvent<A.Settings>>' in a '@Sendable' closure
55 | 		}
56 |
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/Events/Events.swift:87:15: note: consider making generic struct 'ActionEvent' conform to the 'Sendable' protocol
 85 |
 86 | /// Events sent by the server in response to actions.
 87 | public struct ActionEvent<Payload: Decodable>: Decodable {
    |               `- note: consider making generic struct 'ActionEvent' conform to the 'Sendable' protocol
 88 |
 89 | 	/// The action's unique identifier. If your plugin supports multiple actions, you should use this value to see which action was triggered.
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/Action/LongPress.swift:52:50: warning: implicit capture of 'action' requires that 'A' conforms to 'Sendable'; this is an error in the Swift 6 language mode
44 | 	///   - action: The `Action`.
45 | 	///   - event: The `KeyEvent` which is passed to handler.
46 | 	func beginTimer<A: Action>(for action: A, event: ActionEvent<KeyEvent<A.Settings>>) {
   |                  `- note: consider making generic parameter 'A' conform to the 'Sendable' protocol
47 |
48 | 		log.log("Beginning long press timer for \(action.context, privacy: .public)")
   :
50 | 		// Begin the long-press timer
51 | 		let timer = Timer(timeInterval: action.longPressDuration, repeats: false) { _ in
52 | 			log.log("Long key press timer has fired for \(action.context, privacy: .public)")
   |                                                  `- warning: implicit capture of 'action' requires that 'A' conforms to 'Sendable'; this is an error in the Swift 6 language mode
53 | 			self.lastState[action.context] = true
54 | 			action.longKeyPress(device: event.device, payload: event.payload)
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/Action/LongPress.swift:70:51: warning: capture of 'action' with non-sendable type 'A' in a '@Sendable' closure
62 | 	///   - action: The `Action`.
63 | 	///   - event: The `KeyEvent` which is passed to handler.
64 | 	func beginTimer<A: Action>(for action: A, event: ActionEvent<EncoderPressEvent<A.Settings>>) {
   |                  `- note: consider making generic parameter 'A' conform to the 'Sendable' protocol
65 |
66 | 		log.log("Beginning long press timer for \(action.context, privacy: .public)")
   :
68 | 		// Begin the long-press timer
69 | 		let timer = Timer(timeInterval: action.longPressDuration, repeats: false) { _ in
70 | 			log.log("Long dial press timer has fired for \(action.context, privacy: .public)")
   |                                                   `- warning: capture of 'action' with non-sendable type 'A' in a '@Sendable' closure
71 | 			self.lastState[action.context] = true
72 | 			action.longDialPress(device: event.device, payload: event.payload)
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/Action/LongPress.swift:71:4: warning: capture of 'self' with non-sendable type 'TimerKeeper' in a '@Sendable' closure
12 |
13 | /// A class that stores long press timers for actions.
14 | class TimerKeeper {
   |       `- note: class 'TimerKeeper' does not conform to the 'Sendable' protocol
15 |
16 | 	/// The shared `TimerKeeper` instance.
   :
69 | 		let timer = Timer(timeInterval: action.longPressDuration, repeats: false) { _ in
70 | 			log.log("Long dial press timer has fired for \(action.context, privacy: .public)")
71 | 			self.lastState[action.context] = true
   |    `- warning: capture of 'self' with non-sendable type 'TimerKeeper' in a '@Sendable' closure
72 | 			action.longDialPress(device: event.device, payload: event.payload)
73 | 		}
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/Action/LongPress.swift:72:33: warning: capture of 'event' with non-sendable type 'ActionEvent<EncoderPressEvent<A.Settings>>' in a '@Sendable' closure
70 | 			log.log("Long dial press timer has fired for \(action.context, privacy: .public)")
71 | 			self.lastState[action.context] = true
72 | 			action.longDialPress(device: event.device, payload: event.payload)
   |                                 `- warning: capture of 'event' with non-sendable type 'ActionEvent<EncoderPressEvent<A.Settings>>' in a '@Sendable' closure
73 | 		}
74 |
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/Events/Events.swift:87:15: note: consider making generic struct 'ActionEvent' conform to the 'Sendable' protocol
 85 |
 86 | /// Events sent by the server in response to actions.
 87 | public struct ActionEvent<Payload: Decodable>: Decodable {
    |               `- note: consider making generic struct 'ActionEvent' conform to the 'Sendable' protocol
 88 |
 89 | 	/// The action's unique identifier. If your plugin supports multiple actions, you should use this value to see which action was triggered.
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/Action/LongPress.swift:70:51: warning: implicit capture of 'action' requires that 'A' conforms to 'Sendable'; this is an error in the Swift 6 language mode
62 | 	///   - action: The `Action`.
63 | 	///   - event: The `KeyEvent` which is passed to handler.
64 | 	func beginTimer<A: Action>(for action: A, event: ActionEvent<EncoderPressEvent<A.Settings>>) {
   |                  `- note: consider making generic parameter 'A' conform to the 'Sendable' protocol
65 |
66 | 		log.log("Beginning long press timer for \(action.context, privacy: .public)")
   :
68 | 		// Begin the long-press timer
69 | 		let timer = Timer(timeInterval: action.longPressDuration, repeats: false) { _ in
70 | 			log.log("Long dial press timer has fired for \(action.context, privacy: .public)")
   |                                                   `- warning: implicit capture of 'action' requires that 'A' conforms to 'Sendable'; this is an error in the Swift 6 language mode
71 | 			self.lastState[action.context] = true
72 | 			action.longDialPress(device: event.device, payload: event.payload)
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/StreamDeckError.swift:14:7: warning: associated value 'invalidJSON' of 'Sendable'-conforming enum 'StreamDeckError' has non-sendable type 'Any'; this is an error in the Swift 6 language mode
12 |
13 | 	/// The JSON for an event is invalid.
14 | 	case invalidJSON(String, [String: Any])
   |       `- warning: associated value 'invalidJSON' of 'Sendable'-conforming enum 'StreamDeckError' has non-sendable type 'Any'; this is an error in the Swift 6 language mode
15 |
16 | 	/// The UUID has been used more than once.
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/StreamDeckPlugin/SDPlugin+Sent.swift:25:8: warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
 23 | 	@available(*, deprecated, message: "Use the Settings API.")
 24 | 	func setSettings(in context: String, to settings: [String: Any]) {
 25 | 		Task {
    |        `- warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
 26 | 			await PluginCommunication.shared.sendEvent(.setSettings,
 27 | 													   context: context,
 28 | 													   payload: settings)
    |                          `- note: closure captures 'settings' which is accessible to code in the current task
 29 | 		}
 30 | 	}
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/StreamDeckPlugin/SDPlugin+Sent.swift:26:37: warning: sending 'settings.some' risks causing data races; this is an error in the Swift 6 language mode
 24 | 	func setSettings(in context: String, to settings: [String: Any]) {
 25 | 		Task {
 26 | 			await PluginCommunication.shared.sendEvent(.setSettings,
    |                                     |- warning: sending 'settings.some' risks causing data races; this is an error in the Swift 6 language mode
    |                                     `- note: sending task-isolated 'settings.some' to actor-isolated callee risks causing data races between actor-isolated and task-isolated uses
 27 | 													   context: context,
 28 | 													   payload: settings)
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/StreamDeckPlugin/SDPlugin+Sent.swift:37:8: warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
 35 | 	///   - settings: A json object which is persistently saved for the action's instance.
 36 | 	func setSettings<P: Encodable>(in context: String, to settings: P) {
 37 | 		Task {
    |        `- warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
 38 | 			await PluginCommunication.shared.sendEvent(.setSettings,
 39 | 													   context: context,
 40 | 													   payload: settings)
    |                          `- note: closure captures 'settings' which is accessible to code in the current task
 41 | 		}
 42 | 	}
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/StreamDeckPlugin/SDPlugin+Sent.swift:38:37: warning: sending value of non-Sendable type 'P' risks causing data races; this is an error in the Swift 6 language mode
 36 | 	func setSettings<P: Encodable>(in context: String, to settings: P) {
 37 | 		Task {
 38 | 			await PluginCommunication.shared.sendEvent(.setSettings,
    |                                     |- warning: sending value of non-Sendable type 'P' risks causing data races; this is an error in the Swift 6 language mode
    |                                     `- note: sending task-isolated value of non-Sendable type 'P' to actor-isolated callee risks causing races in between task-isolated and actor-isolated uses
 39 | 													   context: context,
 40 | 													   payload: settings)
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/StreamDeckPlugin/SDPlugin+Sent.swift:58:8: warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
 56 | 	///   - settings: A json object which is persistently saved globally.
 57 | 	func setGlobalSettings(_ settings: [String: Any]) {
 58 | 		Task {
    |        `- warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
 59 | 			await PluginCommunication.shared.sendEvent(.setGlobalSettings,
 60 | 													   context: PluginCommunication.shared.uuid,
 61 | 													   payload: settings)
    |                          `- note: closure captures 'settings' which is accessible to code in the current task
 62 | 		}
 63 | 	}
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/StreamDeckPlugin/SDPlugin+Sent.swift:59:37: warning: sending 'settings.some' risks causing data races; this is an error in the Swift 6 language mode
 57 | 	func setGlobalSettings(_ settings: [String: Any]) {
 58 | 		Task {
 59 | 			await PluginCommunication.shared.sendEvent(.setGlobalSettings,
    |                                     |- warning: sending 'settings.some' risks causing data races; this is an error in the Swift 6 language mode
    |                                     `- note: sending task-isolated 'settings.some' to actor-isolated callee risks causing data races between actor-isolated and task-isolated uses
 60 | 													   context: PluginCommunication.shared.uuid,
 61 | 													   payload: settings)
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/StreamDeckPlugin/SDPlugin+Sent.swift:112:8: warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
110 | 	///   - state: A 0-based integer value representing the state of an action with multiple states. This is an optional parameter. If not specified, the title is set to all states.
111 | 	func setTitle(in context: String, to title: String?, target: Target? = nil, state: Int? = nil) {
112 | 		Task {
    |        `- warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
113 | 			var payload: [String: Any] = [:]
114 |
115 | 			payload["title"] = title
116 | 			payload["target"] = target?.rawValue
    |                        `- note: closure captures 'target' which is accessible to code in the current task
117 | 			payload["state"] = state
118 |
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/StreamDeckPlugin/SDPlugin+Sent.swift:139:8: warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
137 | 		let encodedImage = image?.base64String
138 |
139 | 		Task {
    |        `- warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
140 | 			var payload: [String: Any] = [:]
141 |
142 | 			payload["image"] = encodedImage
143 | 			payload["target"] = target?.rawValue
    |                        `- note: closure captures 'target' which is accessible to code in the current task
144 | 			payload["state"] = state
145 |
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/StreamDeckPlugin/SDPlugin+Sent.swift:188:8: warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
186 | 	///   - state: A 0-based integer value representing the state of an action with multiple states. This is an optional parameter. If not specified, the title is set to all states.
187 | 	func setImage(in context: String, toSVG svg: String?, target: Target? = nil, state: Int? = nil) {
188 | 		Task {
    |        `- warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
189 | 			var payload: [String: Any] = [:]
190 |
    :
193 | 			}
194 |
195 | 			payload["target"] = target?.rawValue
    |                        `- note: closure captures 'target' which is accessible to code in the current task
196 | 			payload["state"] = state
197 |
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/StreamDeckPlugin/SDPlugin+Sent.swift:259:8: warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
257 | 	///   - payload: A json object that will be received by the Property Inspector.
258 | 	func sendToPropertyInspector(in context: String, action: String, payload: [String: Any]) {
259 | 		Task {
    |        `- warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
260 | 			await PluginCommunication.shared.sendEvent(.sendToPropertyInspector,
261 | 													   action: action,
262 | 													   context: context,
263 | 													   payload: payload)
    |                          `- note: closure captures 'payload' which is accessible to code in the current task
264 | 		}
265 | 	}
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/StreamDeckPlugin/SDPlugin+Sent.swift:260:37: warning: sending 'payload.some' risks causing data races; this is an error in the Swift 6 language mode
258 | 	func sendToPropertyInspector(in context: String, action: String, payload: [String: Any]) {
259 | 		Task {
260 | 			await PluginCommunication.shared.sendEvent(.sendToPropertyInspector,
    |                                     |- warning: sending 'payload.some' risks causing data races; this is an error in the Swift 6 language mode
    |                                     `- note: sending task-isolated 'payload.some' to actor-isolated callee risks causing data races between actor-isolated and task-isolated uses
261 | 													   action: action,
262 | 													   context: context,
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/Action/LongPress.swift:17:13: warning: static property 'shared' is not concurrency-safe because non-'Sendable' type 'TimerKeeper' may have shared mutable state; this is an error in the Swift 6 language mode
12 |
13 | /// A class that stores long press timers for actions.
14 | class TimerKeeper {
   |       `- note: class 'TimerKeeper' does not conform to the 'Sendable' protocol
15 |
16 | 	/// The shared `TimerKeeper` instance.
17 | 	static let shared = TimerKeeper()
   |             |- warning: static property 'shared' is not concurrency-safe because non-'Sendable' type 'TimerKeeper' may have shared mutable state; this is an error in the Swift 6 language mode
   |             |- note: add '@MainActor' to make static property 'shared' part of global actor 'MainActor'
   |             `- note: disable concurrency-safety checks if accesses are protected by an external synchronization mechanism
18 |
19 | 	/// Times that have been set for a specific action instance.
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/Action/LongPress.swift:52:50: warning: capture of 'action' with non-sendable type 'A' in a '@Sendable' closure
44 | 	///   - action: The `Action`.
45 | 	///   - event: The `KeyEvent` which is passed to handler.
46 | 	func beginTimer<A: Action>(for action: A, event: ActionEvent<KeyEvent<A.Settings>>) {
   |                  `- note: consider making generic parameter 'A' conform to the 'Sendable' protocol
47 |
48 | 		log.log("Beginning long press timer for \(action.context, privacy: .public)")
   :
50 | 		// Begin the long-press timer
51 | 		let timer = Timer(timeInterval: action.longPressDuration, repeats: false) { _ in
52 | 			log.log("Long key press timer has fired for \(action.context, privacy: .public)")
   |                                                  `- warning: capture of 'action' with non-sendable type 'A' in a '@Sendable' closure
53 | 			self.lastState[action.context] = true
54 | 			action.longKeyPress(device: event.device, payload: event.payload)
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/Action/LongPress.swift:53:4: warning: capture of 'self' with non-sendable type 'TimerKeeper' in a '@Sendable' closure
12 |
13 | /// A class that stores long press timers for actions.
14 | class TimerKeeper {
   |       `- note: class 'TimerKeeper' does not conform to the 'Sendable' protocol
15 |
16 | 	/// The shared `TimerKeeper` instance.
   :
51 | 		let timer = Timer(timeInterval: action.longPressDuration, repeats: false) { _ in
52 | 			log.log("Long key press timer has fired for \(action.context, privacy: .public)")
53 | 			self.lastState[action.context] = true
   |    `- warning: capture of 'self' with non-sendable type 'TimerKeeper' in a '@Sendable' closure
54 | 			action.longKeyPress(device: event.device, payload: event.payload)
55 | 		}
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/Action/LongPress.swift:54:32: warning: capture of 'event' with non-sendable type 'ActionEvent<KeyEvent<A.Settings>>' in a '@Sendable' closure
52 | 			log.log("Long key press timer has fired for \(action.context, privacy: .public)")
53 | 			self.lastState[action.context] = true
54 | 			action.longKeyPress(device: event.device, payload: event.payload)
   |                                `- warning: capture of 'event' with non-sendable type 'ActionEvent<KeyEvent<A.Settings>>' in a '@Sendable' closure
55 | 		}
56 |
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/Events/Events.swift:87:15: note: consider making generic struct 'ActionEvent' conform to the 'Sendable' protocol
 85 |
 86 | /// Events sent by the server in response to actions.
 87 | public struct ActionEvent<Payload: Decodable>: Decodable {
    |               `- note: consider making generic struct 'ActionEvent' conform to the 'Sendable' protocol
 88 |
 89 | 	/// The action's unique identifier. If your plugin supports multiple actions, you should use this value to see which action was triggered.
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/Action/LongPress.swift:52:50: warning: implicit capture of 'action' requires that 'A' conforms to 'Sendable'; this is an error in the Swift 6 language mode
44 | 	///   - action: The `Action`.
45 | 	///   - event: The `KeyEvent` which is passed to handler.
46 | 	func beginTimer<A: Action>(for action: A, event: ActionEvent<KeyEvent<A.Settings>>) {
   |                  `- note: consider making generic parameter 'A' conform to the 'Sendable' protocol
47 |
48 | 		log.log("Beginning long press timer for \(action.context, privacy: .public)")
   :
50 | 		// Begin the long-press timer
51 | 		let timer = Timer(timeInterval: action.longPressDuration, repeats: false) { _ in
52 | 			log.log("Long key press timer has fired for \(action.context, privacy: .public)")
   |                                                  `- warning: implicit capture of 'action' requires that 'A' conforms to 'Sendable'; this is an error in the Swift 6 language mode
53 | 			self.lastState[action.context] = true
54 | 			action.longKeyPress(device: event.device, payload: event.payload)
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/Action/LongPress.swift:70:51: warning: capture of 'action' with non-sendable type 'A' in a '@Sendable' closure
62 | 	///   - action: The `Action`.
63 | 	///   - event: The `KeyEvent` which is passed to handler.
64 | 	func beginTimer<A: Action>(for action: A, event: ActionEvent<EncoderPressEvent<A.Settings>>) {
   |                  `- note: consider making generic parameter 'A' conform to the 'Sendable' protocol
65 |
66 | 		log.log("Beginning long press timer for \(action.context, privacy: .public)")
   :
68 | 		// Begin the long-press timer
69 | 		let timer = Timer(timeInterval: action.longPressDuration, repeats: false) { _ in
70 | 			log.log("Long dial press timer has fired for \(action.context, privacy: .public)")
   |                                                   `- warning: capture of 'action' with non-sendable type 'A' in a '@Sendable' closure
71 | 			self.lastState[action.context] = true
72 | 			action.longDialPress(device: event.device, payload: event.payload)
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/Action/LongPress.swift:71:4: warning: capture of 'self' with non-sendable type 'TimerKeeper' in a '@Sendable' closure
12 |
13 | /// A class that stores long press timers for actions.
14 | class TimerKeeper {
   |       `- note: class 'TimerKeeper' does not conform to the 'Sendable' protocol
15 |
16 | 	/// The shared `TimerKeeper` instance.
   :
69 | 		let timer = Timer(timeInterval: action.longPressDuration, repeats: false) { _ in
70 | 			log.log("Long dial press timer has fired for \(action.context, privacy: .public)")
71 | 			self.lastState[action.context] = true
   |    `- warning: capture of 'self' with non-sendable type 'TimerKeeper' in a '@Sendable' closure
72 | 			action.longDialPress(device: event.device, payload: event.payload)
73 | 		}
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/Action/LongPress.swift:72:33: warning: capture of 'event' with non-sendable type 'ActionEvent<EncoderPressEvent<A.Settings>>' in a '@Sendable' closure
70 | 			log.log("Long dial press timer has fired for \(action.context, privacy: .public)")
71 | 			self.lastState[action.context] = true
72 | 			action.longDialPress(device: event.device, payload: event.payload)
   |                                 `- warning: capture of 'event' with non-sendable type 'ActionEvent<EncoderPressEvent<A.Settings>>' in a '@Sendable' closure
73 | 		}
74 |
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/Events/Events.swift:87:15: note: consider making generic struct 'ActionEvent' conform to the 'Sendable' protocol
 85 |
 86 | /// Events sent by the server in response to actions.
 87 | public struct ActionEvent<Payload: Decodable>: Decodable {
    |               `- note: consider making generic struct 'ActionEvent' conform to the 'Sendable' protocol
 88 |
 89 | 	/// The action's unique identifier. If your plugin supports multiple actions, you should use this value to see which action was triggered.
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/Action/LongPress.swift:70:51: warning: implicit capture of 'action' requires that 'A' conforms to 'Sendable'; this is an error in the Swift 6 language mode
62 | 	///   - action: The `Action`.
63 | 	///   - event: The `KeyEvent` which is passed to handler.
64 | 	func beginTimer<A: Action>(for action: A, event: ActionEvent<EncoderPressEvent<A.Settings>>) {
   |                  `- note: consider making generic parameter 'A' conform to the 'Sendable' protocol
65 |
66 | 		log.log("Beginning long press timer for \(action.context, privacy: .public)")
   :
68 | 		// Begin the long-press timer
69 | 		let timer = Timer(timeInterval: action.longPressDuration, repeats: false) { _ in
70 | 			log.log("Long dial press timer has fired for \(action.context, privacy: .public)")
   |                                                   `- warning: implicit capture of 'action' requires that 'A' conforms to 'Sendable'; this is an error in the Swift 6 language mode
71 | 			self.lastState[action.context] = true
72 | 			action.longDialPress(device: event.device, payload: event.payload)
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/StreamDeckError.swift:14:7: warning: associated value 'invalidJSON' of 'Sendable'-conforming enum 'StreamDeckError' has non-sendable type 'Any'; this is an error in the Swift 6 language mode
12 |
13 | 	/// The JSON for an event is invalid.
14 | 	case invalidJSON(String, [String: Any])
   |       `- warning: associated value 'invalidJSON' of 'Sendable'-conforming enum 'StreamDeckError' has non-sendable type 'Any'; this is an error in the Swift 6 language mode
15 |
16 | 	/// The UUID has been used more than once.
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/StreamDeckPlugin/SDPlugin+Sent.swift:25:8: warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
 23 | 	@available(*, deprecated, message: "Use the Settings API.")
 24 | 	func setSettings(in context: String, to settings: [String: Any]) {
 25 | 		Task {
    |        `- warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
 26 | 			await PluginCommunication.shared.sendEvent(.setSettings,
 27 | 													   context: context,
 28 | 													   payload: settings)
    |                          `- note: closure captures 'settings' which is accessible to code in the current task
 29 | 		}
 30 | 	}
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/StreamDeckPlugin/SDPlugin+Sent.swift:26:37: warning: sending 'settings.some' risks causing data races; this is an error in the Swift 6 language mode
 24 | 	func setSettings(in context: String, to settings: [String: Any]) {
 25 | 		Task {
 26 | 			await PluginCommunication.shared.sendEvent(.setSettings,
    |                                     |- warning: sending 'settings.some' risks causing data races; this is an error in the Swift 6 language mode
    |                                     `- note: sending task-isolated 'settings.some' to actor-isolated callee risks causing data races between actor-isolated and task-isolated uses
 27 | 													   context: context,
 28 | 													   payload: settings)
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/StreamDeckPlugin/SDPlugin+Sent.swift:37:8: warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
 35 | 	///   - settings: A json object which is persistently saved for the action's instance.
 36 | 	func setSettings<P: Encodable>(in context: String, to settings: P) {
 37 | 		Task {
    |        `- warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
 38 | 			await PluginCommunication.shared.sendEvent(.setSettings,
 39 | 													   context: context,
 40 | 													   payload: settings)
    |                          `- note: closure captures 'settings' which is accessible to code in the current task
 41 | 		}
 42 | 	}
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/StreamDeckPlugin/SDPlugin+Sent.swift:38:37: warning: sending value of non-Sendable type 'P' risks causing data races; this is an error in the Swift 6 language mode
 36 | 	func setSettings<P: Encodable>(in context: String, to settings: P) {
 37 | 		Task {
 38 | 			await PluginCommunication.shared.sendEvent(.setSettings,
    |                                     |- warning: sending value of non-Sendable type 'P' risks causing data races; this is an error in the Swift 6 language mode
    |                                     `- note: sending task-isolated value of non-Sendable type 'P' to actor-isolated callee risks causing races in between task-isolated and actor-isolated uses
 39 | 													   context: context,
 40 | 													   payload: settings)
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/StreamDeckPlugin/SDPlugin+Sent.swift:58:8: warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
 56 | 	///   - settings: A json object which is persistently saved globally.
 57 | 	func setGlobalSettings(_ settings: [String: Any]) {
 58 | 		Task {
    |        `- warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
 59 | 			await PluginCommunication.shared.sendEvent(.setGlobalSettings,
 60 | 													   context: PluginCommunication.shared.uuid,
 61 | 													   payload: settings)
    |                          `- note: closure captures 'settings' which is accessible to code in the current task
 62 | 		}
 63 | 	}
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/StreamDeckPlugin/SDPlugin+Sent.swift:59:37: warning: sending 'settings.some' risks causing data races; this is an error in the Swift 6 language mode
 57 | 	func setGlobalSettings(_ settings: [String: Any]) {
 58 | 		Task {
 59 | 			await PluginCommunication.shared.sendEvent(.setGlobalSettings,
    |                                     |- warning: sending 'settings.some' risks causing data races; this is an error in the Swift 6 language mode
    |                                     `- note: sending task-isolated 'settings.some' to actor-isolated callee risks causing data races between actor-isolated and task-isolated uses
 60 | 													   context: PluginCommunication.shared.uuid,
 61 | 													   payload: settings)
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/StreamDeckPlugin/SDPlugin+Sent.swift:112:8: warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
110 | 	///   - state: A 0-based integer value representing the state of an action with multiple states. This is an optional parameter. If not specified, the title is set to all states.
111 | 	func setTitle(in context: String, to title: String?, target: Target? = nil, state: Int? = nil) {
112 | 		Task {
    |        `- warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
113 | 			var payload: [String: Any] = [:]
114 |
115 | 			payload["title"] = title
116 | 			payload["target"] = target?.rawValue
    |                        `- note: closure captures 'target' which is accessible to code in the current task
117 | 			payload["state"] = state
118 |
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/StreamDeckPlugin/SDPlugin+Sent.swift:139:8: warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
137 | 		let encodedImage = image?.base64String
138 |
139 | 		Task {
    |        `- warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
140 | 			var payload: [String: Any] = [:]
141 |
142 | 			payload["image"] = encodedImage
143 | 			payload["target"] = target?.rawValue
    |                        `- note: closure captures 'target' which is accessible to code in the current task
144 | 			payload["state"] = state
145 |
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/StreamDeckPlugin/SDPlugin+Sent.swift:188:8: warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
186 | 	///   - state: A 0-based integer value representing the state of an action with multiple states. This is an optional parameter. If not specified, the title is set to all states.
187 | 	func setImage(in context: String, toSVG svg: String?, target: Target? = nil, state: Int? = nil) {
188 | 		Task {
    |        `- warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
189 | 			var payload: [String: Any] = [:]
190 |
    :
193 | 			}
194 |
195 | 			payload["target"] = target?.rawValue
    |                        `- note: closure captures 'target' which is accessible to code in the current task
196 | 			payload["state"] = state
197 |
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/StreamDeckPlugin/SDPlugin+Sent.swift:259:8: warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
257 | 	///   - payload: A json object that will be received by the Property Inspector.
258 | 	func sendToPropertyInspector(in context: String, action: String, payload: [String: Any]) {
259 | 		Task {
    |        `- warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
260 | 			await PluginCommunication.shared.sendEvent(.sendToPropertyInspector,
261 | 													   action: action,
262 | 													   context: context,
263 | 													   payload: payload)
    |                          `- note: closure captures 'payload' which is accessible to code in the current task
264 | 		}
265 | 	}
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/StreamDeckPlugin/SDPlugin+Sent.swift:260:37: warning: sending 'payload.some' risks causing data races; this is an error in the Swift 6 language mode
258 | 	func sendToPropertyInspector(in context: String, action: String, payload: [String: Any]) {
259 | 		Task {
260 | 			await PluginCommunication.shared.sendEvent(.sendToPropertyInspector,
    |                                     |- warning: sending 'payload.some' risks causing data races; this is an error in the Swift 6 language mode
    |                                     `- note: sending task-isolated 'payload.some' to actor-isolated callee risks causing data races between actor-isolated and task-isolated uses
261 | 													   action: action,
262 | 													   context: context,
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/Action/LongPress.swift:17:13: warning: static property 'shared' is not concurrency-safe because non-'Sendable' type 'TimerKeeper' may have shared mutable state; this is an error in the Swift 6 language mode
12 |
13 | /// A class that stores long press timers for actions.
14 | class TimerKeeper {
   |       `- note: class 'TimerKeeper' does not conform to the 'Sendable' protocol
15 |
16 | 	/// The shared `TimerKeeper` instance.
17 | 	static let shared = TimerKeeper()
   |             |- warning: static property 'shared' is not concurrency-safe because non-'Sendable' type 'TimerKeeper' may have shared mutable state; this is an error in the Swift 6 language mode
   |             |- note: add '@MainActor' to make static property 'shared' part of global actor 'MainActor'
   |             `- note: disable concurrency-safety checks if accesses are protected by an external synchronization mechanism
18 |
19 | 	/// Times that have been set for a specific action instance.
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/Action/LongPress.swift:52:50: warning: capture of 'action' with non-sendable type 'A' in a '@Sendable' closure
44 | 	///   - action: The `Action`.
45 | 	///   - event: The `KeyEvent` which is passed to handler.
46 | 	func beginTimer<A: Action>(for action: A, event: ActionEvent<KeyEvent<A.Settings>>) {
   |                  `- note: consider making generic parameter 'A' conform to the 'Sendable' protocol
47 |
48 | 		log.log("Beginning long press timer for \(action.context, privacy: .public)")
   :
50 | 		// Begin the long-press timer
51 | 		let timer = Timer(timeInterval: action.longPressDuration, repeats: false) { _ in
52 | 			log.log("Long key press timer has fired for \(action.context, privacy: .public)")
   |                                                  `- warning: capture of 'action' with non-sendable type 'A' in a '@Sendable' closure
53 | 			self.lastState[action.context] = true
54 | 			action.longKeyPress(device: event.device, payload: event.payload)
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/Action/LongPress.swift:53:4: warning: capture of 'self' with non-sendable type 'TimerKeeper' in a '@Sendable' closure
12 |
13 | /// A class that stores long press timers for actions.
14 | class TimerKeeper {
   |       `- note: class 'TimerKeeper' does not conform to the 'Sendable' protocol
15 |
16 | 	/// The shared `TimerKeeper` instance.
   :
51 | 		let timer = Timer(timeInterval: action.longPressDuration, repeats: false) { _ in
52 | 			log.log("Long key press timer has fired for \(action.context, privacy: .public)")
53 | 			self.lastState[action.context] = true
   |    `- warning: capture of 'self' with non-sendable type 'TimerKeeper' in a '@Sendable' closure
54 | 			action.longKeyPress(device: event.device, payload: event.payload)
55 | 		}
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/Action/LongPress.swift:54:32: warning: capture of 'event' with non-sendable type 'ActionEvent<KeyEvent<A.Settings>>' in a '@Sendable' closure
52 | 			log.log("Long key press timer has fired for \(action.context, privacy: .public)")
53 | 			self.lastState[action.context] = true
54 | 			action.longKeyPress(device: event.device, payload: event.payload)
   |                                `- warning: capture of 'event' with non-sendable type 'ActionEvent<KeyEvent<A.Settings>>' in a '@Sendable' closure
55 | 		}
56 |
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/Events/Events.swift:87:15: note: consider making generic struct 'ActionEvent' conform to the 'Sendable' protocol
 85 |
 86 | /// Events sent by the server in response to actions.
 87 | public struct ActionEvent<Payload: Decodable>: Decodable {
    |               `- note: consider making generic struct 'ActionEvent' conform to the 'Sendable' protocol
 88 |
 89 | 	/// The action's unique identifier. If your plugin supports multiple actions, you should use this value to see which action was triggered.
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/Action/LongPress.swift:52:50: warning: implicit capture of 'action' requires that 'A' conforms to 'Sendable'; this is an error in the Swift 6 language mode
44 | 	///   - action: The `Action`.
45 | 	///   - event: The `KeyEvent` which is passed to handler.
46 | 	func beginTimer<A: Action>(for action: A, event: ActionEvent<KeyEvent<A.Settings>>) {
   |                  `- note: consider making generic parameter 'A' conform to the 'Sendable' protocol
47 |
48 | 		log.log("Beginning long press timer for \(action.context, privacy: .public)")
   :
50 | 		// Begin the long-press timer
51 | 		let timer = Timer(timeInterval: action.longPressDuration, repeats: false) { _ in
52 | 			log.log("Long key press timer has fired for \(action.context, privacy: .public)")
   |                                                  `- warning: implicit capture of 'action' requires that 'A' conforms to 'Sendable'; this is an error in the Swift 6 language mode
53 | 			self.lastState[action.context] = true
54 | 			action.longKeyPress(device: event.device, payload: event.payload)
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/Action/LongPress.swift:70:51: warning: capture of 'action' with non-sendable type 'A' in a '@Sendable' closure
62 | 	///   - action: The `Action`.
63 | 	///   - event: The `KeyEvent` which is passed to handler.
64 | 	func beginTimer<A: Action>(for action: A, event: ActionEvent<EncoderPressEvent<A.Settings>>) {
   |                  `- note: consider making generic parameter 'A' conform to the 'Sendable' protocol
65 |
66 | 		log.log("Beginning long press timer for \(action.context, privacy: .public)")
   :
68 | 		// Begin the long-press timer
69 | 		let timer = Timer(timeInterval: action.longPressDuration, repeats: false) { _ in
70 | 			log.log("Long dial press timer has fired for \(action.context, privacy: .public)")
   |                                                   `- warning: capture of 'action' with non-sendable type 'A' in a '@Sendable' closure
71 | 			self.lastState[action.context] = true
72 | 			action.longDialPress(device: event.device, payload: event.payload)
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/Action/LongPress.swift:71:4: warning: capture of 'self' with non-sendable type 'TimerKeeper' in a '@Sendable' closure
12 |
13 | /// A class that stores long press timers for actions.
14 | class TimerKeeper {
   |       `- note: class 'TimerKeeper' does not conform to the 'Sendable' protocol
15 |
16 | 	/// The shared `TimerKeeper` instance.
   :
69 | 		let timer = Timer(timeInterval: action.longPressDuration, repeats: false) { _ in
70 | 			log.log("Long dial press timer has fired for \(action.context, privacy: .public)")
71 | 			self.lastState[action.context] = true
   |    `- warning: capture of 'self' with non-sendable type 'TimerKeeper' in a '@Sendable' closure
72 | 			action.longDialPress(device: event.device, payload: event.payload)
73 | 		}
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/Action/LongPress.swift:72:33: warning: capture of 'event' with non-sendable type 'ActionEvent<EncoderPressEvent<A.Settings>>' in a '@Sendable' closure
70 | 			log.log("Long dial press timer has fired for \(action.context, privacy: .public)")
71 | 			self.lastState[action.context] = true
72 | 			action.longDialPress(device: event.device, payload: event.payload)
   |                                 `- warning: capture of 'event' with non-sendable type 'ActionEvent<EncoderPressEvent<A.Settings>>' in a '@Sendable' closure
73 | 		}
74 |
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/Events/Events.swift:87:15: note: consider making generic struct 'ActionEvent' conform to the 'Sendable' protocol
 85 |
 86 | /// Events sent by the server in response to actions.
 87 | public struct ActionEvent<Payload: Decodable>: Decodable {
    |               `- note: consider making generic struct 'ActionEvent' conform to the 'Sendable' protocol
 88 |
 89 | 	/// The action's unique identifier. If your plugin supports multiple actions, you should use this value to see which action was triggered.
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/Action/LongPress.swift:70:51: warning: implicit capture of 'action' requires that 'A' conforms to 'Sendable'; this is an error in the Swift 6 language mode
62 | 	///   - action: The `Action`.
63 | 	///   - event: The `KeyEvent` which is passed to handler.
64 | 	func beginTimer<A: Action>(for action: A, event: ActionEvent<EncoderPressEvent<A.Settings>>) {
   |                  `- note: consider making generic parameter 'A' conform to the 'Sendable' protocol
65 |
66 | 		log.log("Beginning long press timer for \(action.context, privacy: .public)")
   :
68 | 		// Begin the long-press timer
69 | 		let timer = Timer(timeInterval: action.longPressDuration, repeats: false) { _ in
70 | 			log.log("Long dial press timer has fired for \(action.context, privacy: .public)")
   |                                                   `- warning: implicit capture of 'action' requires that 'A' conforms to 'Sendable'; this is an error in the Swift 6 language mode
71 | 			self.lastState[action.context] = true
72 | 			action.longDialPress(device: event.device, payload: event.payload)
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/StreamDeckError.swift:14:7: warning: associated value 'invalidJSON' of 'Sendable'-conforming enum 'StreamDeckError' has non-sendable type 'Any'; this is an error in the Swift 6 language mode
12 |
13 | 	/// The JSON for an event is invalid.
14 | 	case invalidJSON(String, [String: Any])
   |       `- warning: associated value 'invalidJSON' of 'Sendable'-conforming enum 'StreamDeckError' has non-sendable type 'Any'; this is an error in the Swift 6 language mode
15 |
16 | 	/// The UUID has been used more than once.
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/StreamDeckPlugin/SDPlugin+Sent.swift:25:8: warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
 23 | 	@available(*, deprecated, message: "Use the Settings API.")
 24 | 	func setSettings(in context: String, to settings: [String: Any]) {
 25 | 		Task {
    |        `- warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
 26 | 			await PluginCommunication.shared.sendEvent(.setSettings,
 27 | 													   context: context,
 28 | 													   payload: settings)
    |                          `- note: closure captures 'settings' which is accessible to code in the current task
 29 | 		}
 30 | 	}
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/StreamDeckPlugin/SDPlugin+Sent.swift:26:37: warning: sending 'settings.some' risks causing data races; this is an error in the Swift 6 language mode
 24 | 	func setSettings(in context: String, to settings: [String: Any]) {
 25 | 		Task {
 26 | 			await PluginCommunication.shared.sendEvent(.setSettings,
    |                                     |- warning: sending 'settings.some' risks causing data races; this is an error in the Swift 6 language mode
    |                                     `- note: sending task-isolated 'settings.some' to actor-isolated callee risks causing data races between actor-isolated and task-isolated uses
 27 | 													   context: context,
 28 | 													   payload: settings)
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/StreamDeckPlugin/SDPlugin+Sent.swift:37:8: warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
 35 | 	///   - settings: A json object which is persistently saved for the action's instance.
 36 | 	func setSettings<P: Encodable>(in context: String, to settings: P) {
 37 | 		Task {
    |        `- warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
 38 | 			await PluginCommunication.shared.sendEvent(.setSettings,
 39 | 													   context: context,
 40 | 													   payload: settings)
    |                          `- note: closure captures 'settings' which is accessible to code in the current task
 41 | 		}
 42 | 	}
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/StreamDeckPlugin/SDPlugin+Sent.swift:38:37: warning: sending value of non-Sendable type 'P' risks causing data races; this is an error in the Swift 6 language mode
 36 | 	func setSettings<P: Encodable>(in context: String, to settings: P) {
 37 | 		Task {
 38 | 			await PluginCommunication.shared.sendEvent(.setSettings,
    |                                     |- warning: sending value of non-Sendable type 'P' risks causing data races; this is an error in the Swift 6 language mode
    |                                     `- note: sending task-isolated value of non-Sendable type 'P' to actor-isolated callee risks causing races in between task-isolated and actor-isolated uses
 39 | 													   context: context,
 40 | 													   payload: settings)
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/StreamDeckPlugin/SDPlugin+Sent.swift:58:8: warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
 56 | 	///   - settings: A json object which is persistently saved globally.
 57 | 	func setGlobalSettings(_ settings: [String: Any]) {
 58 | 		Task {
    |        `- warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
 59 | 			await PluginCommunication.shared.sendEvent(.setGlobalSettings,
 60 | 													   context: PluginCommunication.shared.uuid,
 61 | 													   payload: settings)
    |                          `- note: closure captures 'settings' which is accessible to code in the current task
 62 | 		}
 63 | 	}
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/StreamDeckPlugin/SDPlugin+Sent.swift:59:37: warning: sending 'settings.some' risks causing data races; this is an error in the Swift 6 language mode
 57 | 	func setGlobalSettings(_ settings: [String: Any]) {
 58 | 		Task {
 59 | 			await PluginCommunication.shared.sendEvent(.setGlobalSettings,
    |                                     |- warning: sending 'settings.some' risks causing data races; this is an error in the Swift 6 language mode
    |                                     `- note: sending task-isolated 'settings.some' to actor-isolated callee risks causing data races between actor-isolated and task-isolated uses
 60 | 													   context: PluginCommunication.shared.uuid,
 61 | 													   payload: settings)
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/StreamDeckPlugin/SDPlugin+Sent.swift:112:8: warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
110 | 	///   - state: A 0-based integer value representing the state of an action with multiple states. This is an optional parameter. If not specified, the title is set to all states.
111 | 	func setTitle(in context: String, to title: String?, target: Target? = nil, state: Int? = nil) {
112 | 		Task {
    |        `- warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
113 | 			var payload: [String: Any] = [:]
114 |
115 | 			payload["title"] = title
116 | 			payload["target"] = target?.rawValue
    |                        `- note: closure captures 'target' which is accessible to code in the current task
117 | 			payload["state"] = state
118 |
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/StreamDeckPlugin/SDPlugin+Sent.swift:139:8: warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
137 | 		let encodedImage = image?.base64String
138 |
139 | 		Task {
    |        `- warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
140 | 			var payload: [String: Any] = [:]
141 |
142 | 			payload["image"] = encodedImage
143 | 			payload["target"] = target?.rawValue
    |                        `- note: closure captures 'target' which is accessible to code in the current task
144 | 			payload["state"] = state
145 |
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/StreamDeckPlugin/SDPlugin+Sent.swift:188:8: warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
186 | 	///   - state: A 0-based integer value representing the state of an action with multiple states. This is an optional parameter. If not specified, the title is set to all states.
187 | 	func setImage(in context: String, toSVG svg: String?, target: Target? = nil, state: Int? = nil) {
188 | 		Task {
    |        `- warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
189 | 			var payload: [String: Any] = [:]
190 |
    :
193 | 			}
194 |
195 | 			payload["target"] = target?.rawValue
    |                        `- note: closure captures 'target' which is accessible to code in the current task
196 | 			payload["state"] = state
197 |
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/StreamDeckPlugin/SDPlugin+Sent.swift:259:8: warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
257 | 	///   - payload: A json object that will be received by the Property Inspector.
258 | 	func sendToPropertyInspector(in context: String, action: String, payload: [String: Any]) {
259 | 		Task {
    |        `- warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
260 | 			await PluginCommunication.shared.sendEvent(.sendToPropertyInspector,
261 | 													   action: action,
262 | 													   context: context,
263 | 													   payload: payload)
    |                          `- note: closure captures 'payload' which is accessible to code in the current task
264 | 		}
265 | 	}
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/StreamDeckPlugin/SDPlugin+Sent.swift:260:37: warning: sending 'payload.some' risks causing data races; this is an error in the Swift 6 language mode
258 | 	func sendToPropertyInspector(in context: String, action: String, payload: [String: Any]) {
259 | 		Task {
260 | 			await PluginCommunication.shared.sendEvent(.sendToPropertyInspector,
    |                                     |- warning: sending 'payload.some' risks causing data races; this is an error in the Swift 6 language mode
    |                                     `- note: sending task-isolated 'payload.some' to actor-isolated callee risks causing data races between actor-isolated and task-isolated uses
261 | 													   action: action,
262 | 													   context: context,
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/Action/LongPress.swift:17:13: warning: static property 'shared' is not concurrency-safe because non-'Sendable' type 'TimerKeeper' may have shared mutable state; this is an error in the Swift 6 language mode
12 |
13 | /// A class that stores long press timers for actions.
14 | class TimerKeeper {
   |       `- note: class 'TimerKeeper' does not conform to the 'Sendable' protocol
15 |
16 | 	/// The shared `TimerKeeper` instance.
17 | 	static let shared = TimerKeeper()
   |             |- warning: static property 'shared' is not concurrency-safe because non-'Sendable' type 'TimerKeeper' may have shared mutable state; this is an error in the Swift 6 language mode
   |             |- note: add '@MainActor' to make static property 'shared' part of global actor 'MainActor'
   |             `- note: disable concurrency-safety checks if accesses are protected by an external synchronization mechanism
18 |
19 | 	/// Times that have been set for a specific action instance.
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/Action/LongPress.swift:52:50: warning: capture of 'action' with non-sendable type 'A' in a '@Sendable' closure
44 | 	///   - action: The `Action`.
45 | 	///   - event: The `KeyEvent` which is passed to handler.
46 | 	func beginTimer<A: Action>(for action: A, event: ActionEvent<KeyEvent<A.Settings>>) {
   |                  `- note: consider making generic parameter 'A' conform to the 'Sendable' protocol
47 |
48 | 		log.log("Beginning long press timer for \(action.context, privacy: .public)")
   :
50 | 		// Begin the long-press timer
51 | 		let timer = Timer(timeInterval: action.longPressDuration, repeats: false) { _ in
52 | 			log.log("Long key press timer has fired for \(action.context, privacy: .public)")
   |                                                  `- warning: capture of 'action' with non-sendable type 'A' in a '@Sendable' closure
53 | 			self.lastState[action.context] = true
54 | 			action.longKeyPress(device: event.device, payload: event.payload)
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/Action/LongPress.swift:53:4: warning: capture of 'self' with non-sendable type 'TimerKeeper' in a '@Sendable' closure
12 |
13 | /// A class that stores long press timers for actions.
14 | class TimerKeeper {
   |       `- note: class 'TimerKeeper' does not conform to the 'Sendable' protocol
15 |
16 | 	/// The shared `TimerKeeper` instance.
   :
51 | 		let timer = Timer(timeInterval: action.longPressDuration, repeats: false) { _ in
52 | 			log.log("Long key press timer has fired for \(action.context, privacy: .public)")
53 | 			self.lastState[action.context] = true
   |    `- warning: capture of 'self' with non-sendable type 'TimerKeeper' in a '@Sendable' closure
54 | 			action.longKeyPress(device: event.device, payload: event.payload)
55 | 		}
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/Action/LongPress.swift:54:32: warning: capture of 'event' with non-sendable type 'ActionEvent<KeyEvent<A.Settings>>' in a '@Sendable' closure
52 | 			log.log("Long key press timer has fired for \(action.context, privacy: .public)")
53 | 			self.lastState[action.context] = true
54 | 			action.longKeyPress(device: event.device, payload: event.payload)
   |                                `- warning: capture of 'event' with non-sendable type 'ActionEvent<KeyEvent<A.Settings>>' in a '@Sendable' closure
55 | 		}
56 |
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/Events/Events.swift:87:15: note: consider making generic struct 'ActionEvent' conform to the 'Sendable' protocol
 85 |
 86 | /// Events sent by the server in response to actions.
 87 | public struct ActionEvent<Payload: Decodable>: Decodable {
    |               `- note: consider making generic struct 'ActionEvent' conform to the 'Sendable' protocol
 88 |
 89 | 	/// The action's unique identifier. If your plugin supports multiple actions, you should use this value to see which action was triggered.
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/Action/LongPress.swift:52:50: warning: implicit capture of 'action' requires that 'A' conforms to 'Sendable'; this is an error in the Swift 6 language mode
44 | 	///   - action: The `Action`.
45 | 	///   - event: The `KeyEvent` which is passed to handler.
46 | 	func beginTimer<A: Action>(for action: A, event: ActionEvent<KeyEvent<A.Settings>>) {
   |                  `- note: consider making generic parameter 'A' conform to the 'Sendable' protocol
47 |
48 | 		log.log("Beginning long press timer for \(action.context, privacy: .public)")
   :
50 | 		// Begin the long-press timer
51 | 		let timer = Timer(timeInterval: action.longPressDuration, repeats: false) { _ in
52 | 			log.log("Long key press timer has fired for \(action.context, privacy: .public)")
   |                                                  `- warning: implicit capture of 'action' requires that 'A' conforms to 'Sendable'; this is an error in the Swift 6 language mode
53 | 			self.lastState[action.context] = true
54 | 			action.longKeyPress(device: event.device, payload: event.payload)
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/Action/LongPress.swift:70:51: warning: capture of 'action' with non-sendable type 'A' in a '@Sendable' closure
62 | 	///   - action: The `Action`.
63 | 	///   - event: The `KeyEvent` which is passed to handler.
64 | 	func beginTimer<A: Action>(for action: A, event: ActionEvent<EncoderPressEvent<A.Settings>>) {
   |                  `- note: consider making generic parameter 'A' conform to the 'Sendable' protocol
65 |
66 | 		log.log("Beginning long press timer for \(action.context, privacy: .public)")
   :
68 | 		// Begin the long-press timer
69 | 		let timer = Timer(timeInterval: action.longPressDuration, repeats: false) { _ in
70 | 			log.log("Long dial press timer has fired for \(action.context, privacy: .public)")
   |                                                   `- warning: capture of 'action' with non-sendable type 'A' in a '@Sendable' closure
71 | 			self.lastState[action.context] = true
72 | 			action.longDialPress(device: event.device, payload: event.payload)
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/Action/LongPress.swift:71:4: warning: capture of 'self' with non-sendable type 'TimerKeeper' in a '@Sendable' closure
12 |
13 | /// A class that stores long press timers for actions.
14 | class TimerKeeper {
   |       `- note: class 'TimerKeeper' does not conform to the 'Sendable' protocol
15 |
16 | 	/// The shared `TimerKeeper` instance.
   :
69 | 		let timer = Timer(timeInterval: action.longPressDuration, repeats: false) { _ in
70 | 			log.log("Long dial press timer has fired for \(action.context, privacy: .public)")
71 | 			self.lastState[action.context] = true
   |    `- warning: capture of 'self' with non-sendable type 'TimerKeeper' in a '@Sendable' closure
72 | 			action.longDialPress(device: event.device, payload: event.payload)
73 | 		}
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/Action/LongPress.swift:72:33: warning: capture of 'event' with non-sendable type 'ActionEvent<EncoderPressEvent<A.Settings>>' in a '@Sendable' closure
70 | 			log.log("Long dial press timer has fired for \(action.context, privacy: .public)")
71 | 			self.lastState[action.context] = true
72 | 			action.longDialPress(device: event.device, payload: event.payload)
   |                                 `- warning: capture of 'event' with non-sendable type 'ActionEvent<EncoderPressEvent<A.Settings>>' in a '@Sendable' closure
73 | 		}
74 |
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/Events/Events.swift:87:15: note: consider making generic struct 'ActionEvent' conform to the 'Sendable' protocol
 85 |
 86 | /// Events sent by the server in response to actions.
 87 | public struct ActionEvent<Payload: Decodable>: Decodable {
    |               `- note: consider making generic struct 'ActionEvent' conform to the 'Sendable' protocol
 88 |
 89 | 	/// The action's unique identifier. If your plugin supports multiple actions, you should use this value to see which action was triggered.
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/Action/LongPress.swift:70:51: warning: implicit capture of 'action' requires that 'A' conforms to 'Sendable'; this is an error in the Swift 6 language mode
62 | 	///   - action: The `Action`.
63 | 	///   - event: The `KeyEvent` which is passed to handler.
64 | 	func beginTimer<A: Action>(for action: A, event: ActionEvent<EncoderPressEvent<A.Settings>>) {
   |                  `- note: consider making generic parameter 'A' conform to the 'Sendable' protocol
65 |
66 | 		log.log("Beginning long press timer for \(action.context, privacy: .public)")
   :
68 | 		// Begin the long-press timer
69 | 		let timer = Timer(timeInterval: action.longPressDuration, repeats: false) { _ in
70 | 			log.log("Long dial press timer has fired for \(action.context, privacy: .public)")
   |                                                   `- warning: implicit capture of 'action' requires that 'A' conforms to 'Sendable'; this is an error in the Swift 6 language mode
71 | 			self.lastState[action.context] = true
72 | 			action.longDialPress(device: event.device, payload: event.payload)
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/StreamDeckError.swift:14:7: warning: associated value 'invalidJSON' of 'Sendable'-conforming enum 'StreamDeckError' has non-sendable type 'Any'; this is an error in the Swift 6 language mode
12 |
13 | 	/// The JSON for an event is invalid.
14 | 	case invalidJSON(String, [String: Any])
   |       `- warning: associated value 'invalidJSON' of 'Sendable'-conforming enum 'StreamDeckError' has non-sendable type 'Any'; this is an error in the Swift 6 language mode
15 |
16 | 	/// The UUID has been used more than once.
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/StreamDeckPlugin/SDPlugin+Sent.swift:25:8: warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
 23 | 	@available(*, deprecated, message: "Use the Settings API.")
 24 | 	func setSettings(in context: String, to settings: [String: Any]) {
 25 | 		Task {
    |        `- warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
 26 | 			await PluginCommunication.shared.sendEvent(.setSettings,
 27 | 													   context: context,
 28 | 													   payload: settings)
    |                          `- note: closure captures 'settings' which is accessible to code in the current task
 29 | 		}
 30 | 	}
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/StreamDeckPlugin/SDPlugin+Sent.swift:26:37: warning: sending 'settings.some' risks causing data races; this is an error in the Swift 6 language mode
 24 | 	func setSettings(in context: String, to settings: [String: Any]) {
 25 | 		Task {
 26 | 			await PluginCommunication.shared.sendEvent(.setSettings,
    |                                     |- warning: sending 'settings.some' risks causing data races; this is an error in the Swift 6 language mode
    |                                     `- note: sending task-isolated 'settings.some' to actor-isolated callee risks causing data races between actor-isolated and task-isolated uses
 27 | 													   context: context,
 28 | 													   payload: settings)
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/StreamDeckPlugin/SDPlugin+Sent.swift:37:8: warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
 35 | 	///   - settings: A json object which is persistently saved for the action's instance.
 36 | 	func setSettings<P: Encodable>(in context: String, to settings: P) {
 37 | 		Task {
    |        `- warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
 38 | 			await PluginCommunication.shared.sendEvent(.setSettings,
 39 | 													   context: context,
 40 | 													   payload: settings)
    |                          `- note: closure captures 'settings' which is accessible to code in the current task
 41 | 		}
 42 | 	}
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/StreamDeckPlugin/SDPlugin+Sent.swift:38:37: warning: sending value of non-Sendable type 'P' risks causing data races; this is an error in the Swift 6 language mode
 36 | 	func setSettings<P: Encodable>(in context: String, to settings: P) {
 37 | 		Task {
 38 | 			await PluginCommunication.shared.sendEvent(.setSettings,
    |                                     |- warning: sending value of non-Sendable type 'P' risks causing data races; this is an error in the Swift 6 language mode
    |                                     `- note: sending task-isolated value of non-Sendable type 'P' to actor-isolated callee risks causing races in between task-isolated and actor-isolated uses
 39 | 													   context: context,
 40 | 													   payload: settings)
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/StreamDeckPlugin/SDPlugin+Sent.swift:58:8: warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
 56 | 	///   - settings: A json object which is persistently saved globally.
 57 | 	func setGlobalSettings(_ settings: [String: Any]) {
 58 | 		Task {
    |        `- warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
 59 | 			await PluginCommunication.shared.sendEvent(.setGlobalSettings,
 60 | 													   context: PluginCommunication.shared.uuid,
 61 | 													   payload: settings)
    |                          `- note: closure captures 'settings' which is accessible to code in the current task
 62 | 		}
 63 | 	}
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/StreamDeckPlugin/SDPlugin+Sent.swift:59:37: warning: sending 'settings.some' risks causing data races; this is an error in the Swift 6 language mode
 57 | 	func setGlobalSettings(_ settings: [String: Any]) {
 58 | 		Task {
 59 | 			await PluginCommunication.shared.sendEvent(.setGlobalSettings,
    |                                     |- warning: sending 'settings.some' risks causing data races; this is an error in the Swift 6 language mode
    |                                     `- note: sending task-isolated 'settings.some' to actor-isolated callee risks causing data races between actor-isolated and task-isolated uses
 60 | 													   context: PluginCommunication.shared.uuid,
 61 | 													   payload: settings)
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/StreamDeckPlugin/SDPlugin+Sent.swift:112:8: warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
110 | 	///   - state: A 0-based integer value representing the state of an action with multiple states. This is an optional parameter. If not specified, the title is set to all states.
111 | 	func setTitle(in context: String, to title: String?, target: Target? = nil, state: Int? = nil) {
112 | 		Task {
    |        `- warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
113 | 			var payload: [String: Any] = [:]
114 |
115 | 			payload["title"] = title
116 | 			payload["target"] = target?.rawValue
    |                        `- note: closure captures 'target' which is accessible to code in the current task
117 | 			payload["state"] = state
118 |
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/StreamDeckPlugin/SDPlugin+Sent.swift:139:8: warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
137 | 		let encodedImage = image?.base64String
138 |
139 | 		Task {
    |        `- warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
140 | 			var payload: [String: Any] = [:]
141 |
142 | 			payload["image"] = encodedImage
143 | 			payload["target"] = target?.rawValue
    |                        `- note: closure captures 'target' which is accessible to code in the current task
144 | 			payload["state"] = state
145 |
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/StreamDeckPlugin/SDPlugin+Sent.swift:188:8: warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
186 | 	///   - state: A 0-based integer value representing the state of an action with multiple states. This is an optional parameter. If not specified, the title is set to all states.
187 | 	func setImage(in context: String, toSVG svg: String?, target: Target? = nil, state: Int? = nil) {
188 | 		Task {
    |        `- warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
189 | 			var payload: [String: Any] = [:]
190 |
    :
193 | 			}
194 |
195 | 			payload["target"] = target?.rawValue
    |                        `- note: closure captures 'target' which is accessible to code in the current task
196 | 			payload["state"] = state
197 |
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/StreamDeckPlugin/SDPlugin+Sent.swift:259:8: warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
257 | 	///   - payload: A json object that will be received by the Property Inspector.
258 | 	func sendToPropertyInspector(in context: String, action: String, payload: [String: Any]) {
259 | 		Task {
    |        `- warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
260 | 			await PluginCommunication.shared.sendEvent(.sendToPropertyInspector,
261 | 													   action: action,
262 | 													   context: context,
263 | 													   payload: payload)
    |                          `- note: closure captures 'payload' which is accessible to code in the current task
264 | 		}
265 | 	}
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/StreamDeckPlugin/SDPlugin+Sent.swift:260:37: warning: sending 'payload.some' risks causing data races; this is an error in the Swift 6 language mode
258 | 	func sendToPropertyInspector(in context: String, action: String, payload: [String: Any]) {
259 | 		Task {
260 | 			await PluginCommunication.shared.sendEvent(.sendToPropertyInspector,
    |                                     |- warning: sending 'payload.some' risks causing data races; this is an error in the Swift 6 language mode
    |                                     `- note: sending task-isolated 'payload.some' to actor-isolated callee risks causing data races between actor-isolated and task-isolated uses
261 | 													   action: action,
262 | 													   context: context,
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/Action/LongPress.swift:17:13: warning: static property 'shared' is not concurrency-safe because non-'Sendable' type 'TimerKeeper' may have shared mutable state; this is an error in the Swift 6 language mode
12 |
13 | /// A class that stores long press timers for actions.
14 | class TimerKeeper {
   |       `- note: class 'TimerKeeper' does not conform to the 'Sendable' protocol
15 |
16 | 	/// The shared `TimerKeeper` instance.
17 | 	static let shared = TimerKeeper()
   |             |- warning: static property 'shared' is not concurrency-safe because non-'Sendable' type 'TimerKeeper' may have shared mutable state; this is an error in the Swift 6 language mode
   |             |- note: add '@MainActor' to make static property 'shared' part of global actor 'MainActor'
   |             `- note: disable concurrency-safety checks if accesses are protected by an external synchronization mechanism
18 |
19 | 	/// Times that have been set for a specific action instance.
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/Action/LongPress.swift:52:50: warning: capture of 'action' with non-sendable type 'A' in a '@Sendable' closure
44 | 	///   - action: The `Action`.
45 | 	///   - event: The `KeyEvent` which is passed to handler.
46 | 	func beginTimer<A: Action>(for action: A, event: ActionEvent<KeyEvent<A.Settings>>) {
   |                  `- note: consider making generic parameter 'A' conform to the 'Sendable' protocol
47 |
48 | 		log.log("Beginning long press timer for \(action.context, privacy: .public)")
   :
50 | 		// Begin the long-press timer
51 | 		let timer = Timer(timeInterval: action.longPressDuration, repeats: false) { _ in
52 | 			log.log("Long key press timer has fired for \(action.context, privacy: .public)")
   |                                                  `- warning: capture of 'action' with non-sendable type 'A' in a '@Sendable' closure
53 | 			self.lastState[action.context] = true
54 | 			action.longKeyPress(device: event.device, payload: event.payload)
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/Action/LongPress.swift:53:4: warning: capture of 'self' with non-sendable type 'TimerKeeper' in a '@Sendable' closure
12 |
13 | /// A class that stores long press timers for actions.
14 | class TimerKeeper {
   |       `- note: class 'TimerKeeper' does not conform to the 'Sendable' protocol
15 |
16 | 	/// The shared `TimerKeeper` instance.
   :
51 | 		let timer = Timer(timeInterval: action.longPressDuration, repeats: false) { _ in
52 | 			log.log("Long key press timer has fired for \(action.context, privacy: .public)")
53 | 			self.lastState[action.context] = true
   |    `- warning: capture of 'self' with non-sendable type 'TimerKeeper' in a '@Sendable' closure
54 | 			action.longKeyPress(device: event.device, payload: event.payload)
55 | 		}
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/Action/LongPress.swift:54:32: warning: capture of 'event' with non-sendable type 'ActionEvent<KeyEvent<A.Settings>>' in a '@Sendable' closure
52 | 			log.log("Long key press timer has fired for \(action.context, privacy: .public)")
53 | 			self.lastState[action.context] = true
54 | 			action.longKeyPress(device: event.device, payload: event.payload)
   |                                `- warning: capture of 'event' with non-sendable type 'ActionEvent<KeyEvent<A.Settings>>' in a '@Sendable' closure
55 | 		}
56 |
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/Events/Events.swift:87:15: note: consider making generic struct 'ActionEvent' conform to the 'Sendable' protocol
 85 |
 86 | /// Events sent by the server in response to actions.
 87 | public struct ActionEvent<Payload: Decodable>: Decodable {
    |               `- note: consider making generic struct 'ActionEvent' conform to the 'Sendable' protocol
 88 |
 89 | 	/// The action's unique identifier. If your plugin supports multiple actions, you should use this value to see which action was triggered.
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/Action/LongPress.swift:52:50: warning: implicit capture of 'action' requires that 'A' conforms to 'Sendable'; this is an error in the Swift 6 language mode
44 | 	///   - action: The `Action`.
45 | 	///   - event: The `KeyEvent` which is passed to handler.
46 | 	func beginTimer<A: Action>(for action: A, event: ActionEvent<KeyEvent<A.Settings>>) {
   |                  `- note: consider making generic parameter 'A' conform to the 'Sendable' protocol
47 |
48 | 		log.log("Beginning long press timer for \(action.context, privacy: .public)")
   :
50 | 		// Begin the long-press timer
51 | 		let timer = Timer(timeInterval: action.longPressDuration, repeats: false) { _ in
52 | 			log.log("Long key press timer has fired for \(action.context, privacy: .public)")
   |                                                  `- warning: implicit capture of 'action' requires that 'A' conforms to 'Sendable'; this is an error in the Swift 6 language mode
53 | 			self.lastState[action.context] = true
54 | 			action.longKeyPress(device: event.device, payload: event.payload)
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/Action/LongPress.swift:70:51: warning: capture of 'action' with non-sendable type 'A' in a '@Sendable' closure
62 | 	///   - action: The `Action`.
63 | 	///   - event: The `KeyEvent` which is passed to handler.
64 | 	func beginTimer<A: Action>(for action: A, event: ActionEvent<EncoderPressEvent<A.Settings>>) {
   |                  `- note: consider making generic parameter 'A' conform to the 'Sendable' protocol
65 |
66 | 		log.log("Beginning long press timer for \(action.context, privacy: .public)")
   :
68 | 		// Begin the long-press timer
69 | 		let timer = Timer(timeInterval: action.longPressDuration, repeats: false) { _ in
70 | 			log.log("Long dial press timer has fired for \(action.context, privacy: .public)")
   |                                                   `- warning: capture of 'action' with non-sendable type 'A' in a '@Sendable' closure
71 | 			self.lastState[action.context] = true
72 | 			action.longDialPress(device: event.device, payload: event.payload)
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/Action/LongPress.swift:71:4: warning: capture of 'self' with non-sendable type 'TimerKeeper' in a '@Sendable' closure
12 |
13 | /// A class that stores long press timers for actions.
14 | class TimerKeeper {
   |       `- note: class 'TimerKeeper' does not conform to the 'Sendable' protocol
15 |
16 | 	/// The shared `TimerKeeper` instance.
   :
69 | 		let timer = Timer(timeInterval: action.longPressDuration, repeats: false) { _ in
70 | 			log.log("Long dial press timer has fired for \(action.context, privacy: .public)")
71 | 			self.lastState[action.context] = true
   |    `- warning: capture of 'self' with non-sendable type 'TimerKeeper' in a '@Sendable' closure
72 | 			action.longDialPress(device: event.device, payload: event.payload)
73 | 		}
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/Action/LongPress.swift:72:33: warning: capture of 'event' with non-sendable type 'ActionEvent<EncoderPressEvent<A.Settings>>' in a '@Sendable' closure
70 | 			log.log("Long dial press timer has fired for \(action.context, privacy: .public)")
71 | 			self.lastState[action.context] = true
72 | 			action.longDialPress(device: event.device, payload: event.payload)
   |                                 `- warning: capture of 'event' with non-sendable type 'ActionEvent<EncoderPressEvent<A.Settings>>' in a '@Sendable' closure
73 | 		}
74 |
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/Events/Events.swift:87:15: note: consider making generic struct 'ActionEvent' conform to the 'Sendable' protocol
 85 |
 86 | /// Events sent by the server in response to actions.
 87 | public struct ActionEvent<Payload: Decodable>: Decodable {
    |               `- note: consider making generic struct 'ActionEvent' conform to the 'Sendable' protocol
 88 |
 89 | 	/// The action's unique identifier. If your plugin supports multiple actions, you should use this value to see which action was triggered.
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/Action/LongPress.swift:70:51: warning: implicit capture of 'action' requires that 'A' conforms to 'Sendable'; this is an error in the Swift 6 language mode
62 | 	///   - action: The `Action`.
63 | 	///   - event: The `KeyEvent` which is passed to handler.
64 | 	func beginTimer<A: Action>(for action: A, event: ActionEvent<EncoderPressEvent<A.Settings>>) {
   |                  `- note: consider making generic parameter 'A' conform to the 'Sendable' protocol
65 |
66 | 		log.log("Beginning long press timer for \(action.context, privacy: .public)")
   :
68 | 		// Begin the long-press timer
69 | 		let timer = Timer(timeInterval: action.longPressDuration, repeats: false) { _ in
70 | 			log.log("Long dial press timer has fired for \(action.context, privacy: .public)")
   |                                                   `- warning: implicit capture of 'action' requires that 'A' conforms to 'Sendable'; this is an error in the Swift 6 language mode
71 | 			self.lastState[action.context] = true
72 | 			action.longDialPress(device: event.device, payload: event.payload)
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/StreamDeckError.swift:14:7: warning: associated value 'invalidJSON' of 'Sendable'-conforming enum 'StreamDeckError' has non-sendable type 'Any'; this is an error in the Swift 6 language mode
12 |
13 | 	/// The JSON for an event is invalid.
14 | 	case invalidJSON(String, [String: Any])
   |       `- warning: associated value 'invalidJSON' of 'Sendable'-conforming enum 'StreamDeckError' has non-sendable type 'Any'; this is an error in the Swift 6 language mode
15 |
16 | 	/// The UUID has been used more than once.
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/StreamDeckPlugin/SDPlugin+Sent.swift:25:8: warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
 23 | 	@available(*, deprecated, message: "Use the Settings API.")
 24 | 	func setSettings(in context: String, to settings: [String: Any]) {
 25 | 		Task {
    |        `- warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
 26 | 			await PluginCommunication.shared.sendEvent(.setSettings,
 27 | 													   context: context,
 28 | 													   payload: settings)
    |                          `- note: closure captures 'settings' which is accessible to code in the current task
 29 | 		}
 30 | 	}
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/StreamDeckPlugin/SDPlugin+Sent.swift:26:37: warning: sending 'settings.some' risks causing data races; this is an error in the Swift 6 language mode
 24 | 	func setSettings(in context: String, to settings: [String: Any]) {
 25 | 		Task {
 26 | 			await PluginCommunication.shared.sendEvent(.setSettings,
    |                                     |- warning: sending 'settings.some' risks causing data races; this is an error in the Swift 6 language mode
    |                                     `- note: sending task-isolated 'settings.some' to actor-isolated callee risks causing data races between actor-isolated and task-isolated uses
 27 | 													   context: context,
 28 | 													   payload: settings)
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/StreamDeckPlugin/SDPlugin+Sent.swift:37:8: warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
 35 | 	///   - settings: A json object which is persistently saved for the action's instance.
 36 | 	func setSettings<P: Encodable>(in context: String, to settings: P) {
 37 | 		Task {
    |        `- warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
 38 | 			await PluginCommunication.shared.sendEvent(.setSettings,
 39 | 													   context: context,
 40 | 													   payload: settings)
    |                          `- note: closure captures 'settings' which is accessible to code in the current task
 41 | 		}
 42 | 	}
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/StreamDeckPlugin/SDPlugin+Sent.swift:38:37: warning: sending value of non-Sendable type 'P' risks causing data races; this is an error in the Swift 6 language mode
 36 | 	func setSettings<P: Encodable>(in context: String, to settings: P) {
 37 | 		Task {
 38 | 			await PluginCommunication.shared.sendEvent(.setSettings,
    |                                     |- warning: sending value of non-Sendable type 'P' risks causing data races; this is an error in the Swift 6 language mode
    |                                     `- note: sending task-isolated value of non-Sendable type 'P' to actor-isolated callee risks causing races in between task-isolated and actor-isolated uses
 39 | 													   context: context,
 40 | 													   payload: settings)
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/StreamDeckPlugin/SDPlugin+Sent.swift:58:8: warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
 56 | 	///   - settings: A json object which is persistently saved globally.
 57 | 	func setGlobalSettings(_ settings: [String: Any]) {
 58 | 		Task {
    |        `- warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
 59 | 			await PluginCommunication.shared.sendEvent(.setGlobalSettings,
 60 | 													   context: PluginCommunication.shared.uuid,
 61 | 													   payload: settings)
    |                          `- note: closure captures 'settings' which is accessible to code in the current task
 62 | 		}
 63 | 	}
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/StreamDeckPlugin/SDPlugin+Sent.swift:59:37: warning: sending 'settings.some' risks causing data races; this is an error in the Swift 6 language mode
 57 | 	func setGlobalSettings(_ settings: [String: Any]) {
 58 | 		Task {
 59 | 			await PluginCommunication.shared.sendEvent(.setGlobalSettings,
    |                                     |- warning: sending 'settings.some' risks causing data races; this is an error in the Swift 6 language mode
    |                                     `- note: sending task-isolated 'settings.some' to actor-isolated callee risks causing data races between actor-isolated and task-isolated uses
 60 | 													   context: PluginCommunication.shared.uuid,
 61 | 													   payload: settings)
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/StreamDeckPlugin/SDPlugin+Sent.swift:112:8: warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
110 | 	///   - state: A 0-based integer value representing the state of an action with multiple states. This is an optional parameter. If not specified, the title is set to all states.
111 | 	func setTitle(in context: String, to title: String?, target: Target? = nil, state: Int? = nil) {
112 | 		Task {
    |        `- warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
113 | 			var payload: [String: Any] = [:]
114 |
115 | 			payload["title"] = title
116 | 			payload["target"] = target?.rawValue
    |                        `- note: closure captures 'target' which is accessible to code in the current task
117 | 			payload["state"] = state
118 |
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/StreamDeckPlugin/SDPlugin+Sent.swift:139:8: warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
137 | 		let encodedImage = image?.base64String
138 |
139 | 		Task {
    |        `- warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
140 | 			var payload: [String: Any] = [:]
141 |
142 | 			payload["image"] = encodedImage
143 | 			payload["target"] = target?.rawValue
    |                        `- note: closure captures 'target' which is accessible to code in the current task
144 | 			payload["state"] = state
145 |
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/StreamDeckPlugin/SDPlugin+Sent.swift:188:8: warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
186 | 	///   - state: A 0-based integer value representing the state of an action with multiple states. This is an optional parameter. If not specified, the title is set to all states.
187 | 	func setImage(in context: String, toSVG svg: String?, target: Target? = nil, state: Int? = nil) {
188 | 		Task {
    |        `- warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
189 | 			var payload: [String: Any] = [:]
190 |
    :
193 | 			}
194 |
195 | 			payload["target"] = target?.rawValue
    |                        `- note: closure captures 'target' which is accessible to code in the current task
196 | 			payload["state"] = state
197 |
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/StreamDeckPlugin/SDPlugin+Sent.swift:259:8: warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
257 | 	///   - payload: A json object that will be received by the Property Inspector.
258 | 	func sendToPropertyInspector(in context: String, action: String, payload: [String: Any]) {
259 | 		Task {
    |        `- warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
260 | 			await PluginCommunication.shared.sendEvent(.sendToPropertyInspector,
261 | 													   action: action,
262 | 													   context: context,
263 | 													   payload: payload)
    |                          `- note: closure captures 'payload' which is accessible to code in the current task
264 | 		}
265 | 	}
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/StreamDeckPlugin/SDPlugin+Sent.swift:260:37: warning: sending 'payload.some' risks causing data races; this is an error in the Swift 6 language mode
258 | 	func sendToPropertyInspector(in context: String, action: String, payload: [String: Any]) {
259 | 		Task {
260 | 			await PluginCommunication.shared.sendEvent(.sendToPropertyInspector,
    |                                     |- warning: sending 'payload.some' risks causing data races; this is an error in the Swift 6 language mode
    |                                     `- note: sending task-isolated 'payload.some' to actor-isolated callee risks causing data races between actor-isolated and task-isolated uses
261 | 													   action: action,
262 | 													   context: context,
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/Action/LongPress.swift:17:13: warning: static property 'shared' is not concurrency-safe because non-'Sendable' type 'TimerKeeper' may have shared mutable state; this is an error in the Swift 6 language mode
12 |
13 | /// A class that stores long press timers for actions.
14 | class TimerKeeper {
   |       `- note: class 'TimerKeeper' does not conform to the 'Sendable' protocol
15 |
16 | 	/// The shared `TimerKeeper` instance.
17 | 	static let shared = TimerKeeper()
   |             |- warning: static property 'shared' is not concurrency-safe because non-'Sendable' type 'TimerKeeper' may have shared mutable state; this is an error in the Swift 6 language mode
   |             |- note: add '@MainActor' to make static property 'shared' part of global actor 'MainActor'
   |             `- note: disable concurrency-safety checks if accesses are protected by an external synchronization mechanism
18 |
19 | 	/// Times that have been set for a specific action instance.
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/Action/LongPress.swift:52:50: warning: capture of 'action' with non-sendable type 'A' in a '@Sendable' closure
44 | 	///   - action: The `Action`.
45 | 	///   - event: The `KeyEvent` which is passed to handler.
46 | 	func beginTimer<A: Action>(for action: A, event: ActionEvent<KeyEvent<A.Settings>>) {
   |                  `- note: consider making generic parameter 'A' conform to the 'Sendable' protocol
47 |
48 | 		log.log("Beginning long press timer for \(action.context, privacy: .public)")
   :
50 | 		// Begin the long-press timer
51 | 		let timer = Timer(timeInterval: action.longPressDuration, repeats: false) { _ in
52 | 			log.log("Long key press timer has fired for \(action.context, privacy: .public)")
   |                                                  `- warning: capture of 'action' with non-sendable type 'A' in a '@Sendable' closure
53 | 			self.lastState[action.context] = true
54 | 			action.longKeyPress(device: event.device, payload: event.payload)
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/Action/LongPress.swift:53:4: warning: capture of 'self' with non-sendable type 'TimerKeeper' in a '@Sendable' closure
12 |
13 | /// A class that stores long press timers for actions.
14 | class TimerKeeper {
   |       `- note: class 'TimerKeeper' does not conform to the 'Sendable' protocol
15 |
16 | 	/// The shared `TimerKeeper` instance.
   :
51 | 		let timer = Timer(timeInterval: action.longPressDuration, repeats: false) { _ in
52 | 			log.log("Long key press timer has fired for \(action.context, privacy: .public)")
53 | 			self.lastState[action.context] = true
   |    `- warning: capture of 'self' with non-sendable type 'TimerKeeper' in a '@Sendable' closure
54 | 			action.longKeyPress(device: event.device, payload: event.payload)
55 | 		}
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/Action/LongPress.swift:54:32: warning: capture of 'event' with non-sendable type 'ActionEvent<KeyEvent<A.Settings>>' in a '@Sendable' closure
52 | 			log.log("Long key press timer has fired for \(action.context, privacy: .public)")
53 | 			self.lastState[action.context] = true
54 | 			action.longKeyPress(device: event.device, payload: event.payload)
   |                                `- warning: capture of 'event' with non-sendable type 'ActionEvent<KeyEvent<A.Settings>>' in a '@Sendable' closure
55 | 		}
56 |
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/Events/Events.swift:87:15: note: consider making generic struct 'ActionEvent' conform to the 'Sendable' protocol
 85 |
 86 | /// Events sent by the server in response to actions.
 87 | public struct ActionEvent<Payload: Decodable>: Decodable {
    |               `- note: consider making generic struct 'ActionEvent' conform to the 'Sendable' protocol
 88 |
 89 | 	/// The action's unique identifier. If your plugin supports multiple actions, you should use this value to see which action was triggered.
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/Action/LongPress.swift:52:50: warning: implicit capture of 'action' requires that 'A' conforms to 'Sendable'; this is an error in the Swift 6 language mode
44 | 	///   - action: The `Action`.
45 | 	///   - event: The `KeyEvent` which is passed to handler.
46 | 	func beginTimer<A: Action>(for action: A, event: ActionEvent<KeyEvent<A.Settings>>) {
   |                  `- note: consider making generic parameter 'A' conform to the 'Sendable' protocol
47 |
48 | 		log.log("Beginning long press timer for \(action.context, privacy: .public)")
   :
50 | 		// Begin the long-press timer
51 | 		let timer = Timer(timeInterval: action.longPressDuration, repeats: false) { _ in
52 | 			log.log("Long key press timer has fired for \(action.context, privacy: .public)")
   |                                                  `- warning: implicit capture of 'action' requires that 'A' conforms to 'Sendable'; this is an error in the Swift 6 language mode
53 | 			self.lastState[action.context] = true
54 | 			action.longKeyPress(device: event.device, payload: event.payload)
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/Action/LongPress.swift:70:51: warning: capture of 'action' with non-sendable type 'A' in a '@Sendable' closure
62 | 	///   - action: The `Action`.
63 | 	///   - event: The `KeyEvent` which is passed to handler.
64 | 	func beginTimer<A: Action>(for action: A, event: ActionEvent<EncoderPressEvent<A.Settings>>) {
   |                  `- note: consider making generic parameter 'A' conform to the 'Sendable' protocol
65 |
66 | 		log.log("Beginning long press timer for \(action.context, privacy: .public)")
   :
68 | 		// Begin the long-press timer
69 | 		let timer = Timer(timeInterval: action.longPressDuration, repeats: false) { _ in
70 | 			log.log("Long dial press timer has fired for \(action.context, privacy: .public)")
   |                                                   `- warning: capture of 'action' with non-sendable type 'A' in a '@Sendable' closure
71 | 			self.lastState[action.context] = true
72 | 			action.longDialPress(device: event.device, payload: event.payload)
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/Action/LongPress.swift:71:4: warning: capture of 'self' with non-sendable type 'TimerKeeper' in a '@Sendable' closure
12 |
13 | /// A class that stores long press timers for actions.
14 | class TimerKeeper {
   |       `- note: class 'TimerKeeper' does not conform to the 'Sendable' protocol
15 |
16 | 	/// The shared `TimerKeeper` instance.
   :
69 | 		let timer = Timer(timeInterval: action.longPressDuration, repeats: false) { _ in
70 | 			log.log("Long dial press timer has fired for \(action.context, privacy: .public)")
71 | 			self.lastState[action.context] = true
   |    `- warning: capture of 'self' with non-sendable type 'TimerKeeper' in a '@Sendable' closure
72 | 			action.longDialPress(device: event.device, payload: event.payload)
73 | 		}
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/Action/LongPress.swift:72:33: warning: capture of 'event' with non-sendable type 'ActionEvent<EncoderPressEvent<A.Settings>>' in a '@Sendable' closure
70 | 			log.log("Long dial press timer has fired for \(action.context, privacy: .public)")
71 | 			self.lastState[action.context] = true
72 | 			action.longDialPress(device: event.device, payload: event.payload)
   |                                 `- warning: capture of 'event' with non-sendable type 'ActionEvent<EncoderPressEvent<A.Settings>>' in a '@Sendable' closure
73 | 		}
74 |
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/Events/Events.swift:87:15: note: consider making generic struct 'ActionEvent' conform to the 'Sendable' protocol
 85 |
 86 | /// Events sent by the server in response to actions.
 87 | public struct ActionEvent<Payload: Decodable>: Decodable {
    |               `- note: consider making generic struct 'ActionEvent' conform to the 'Sendable' protocol
 88 |
 89 | 	/// The action's unique identifier. If your plugin supports multiple actions, you should use this value to see which action was triggered.
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/Action/LongPress.swift:70:51: warning: implicit capture of 'action' requires that 'A' conforms to 'Sendable'; this is an error in the Swift 6 language mode
62 | 	///   - action: The `Action`.
63 | 	///   - event: The `KeyEvent` which is passed to handler.
64 | 	func beginTimer<A: Action>(for action: A, event: ActionEvent<EncoderPressEvent<A.Settings>>) {
   |                  `- note: consider making generic parameter 'A' conform to the 'Sendable' protocol
65 |
66 | 		log.log("Beginning long press timer for \(action.context, privacy: .public)")
   :
68 | 		// Begin the long-press timer
69 | 		let timer = Timer(timeInterval: action.longPressDuration, repeats: false) { _ in
70 | 			log.log("Long dial press timer has fired for \(action.context, privacy: .public)")
   |                                                   `- warning: implicit capture of 'action' requires that 'A' conforms to 'Sendable'; this is an error in the Swift 6 language mode
71 | 			self.lastState[action.context] = true
72 | 			action.longDialPress(device: event.device, payload: event.payload)
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/StreamDeckError.swift:14:7: warning: associated value 'invalidJSON' of 'Sendable'-conforming enum 'StreamDeckError' has non-sendable type 'Any'; this is an error in the Swift 6 language mode
12 |
13 | 	/// The JSON for an event is invalid.
14 | 	case invalidJSON(String, [String: Any])
   |       `- warning: associated value 'invalidJSON' of 'Sendable'-conforming enum 'StreamDeckError' has non-sendable type 'Any'; this is an error in the Swift 6 language mode
15 |
16 | 	/// The UUID has been used more than once.
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/StreamDeckPlugin/SDPlugin+Sent.swift:25:8: warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
 23 | 	@available(*, deprecated, message: "Use the Settings API.")
 24 | 	func setSettings(in context: String, to settings: [String: Any]) {
 25 | 		Task {
    |        `- warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
 26 | 			await PluginCommunication.shared.sendEvent(.setSettings,
 27 | 													   context: context,
 28 | 													   payload: settings)
    |                          `- note: closure captures 'settings' which is accessible to code in the current task
 29 | 		}
 30 | 	}
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/StreamDeckPlugin/SDPlugin+Sent.swift:26:37: warning: sending 'settings.some' risks causing data races; this is an error in the Swift 6 language mode
 24 | 	func setSettings(in context: String, to settings: [String: Any]) {
 25 | 		Task {
 26 | 			await PluginCommunication.shared.sendEvent(.setSettings,
    |                                     |- warning: sending 'settings.some' risks causing data races; this is an error in the Swift 6 language mode
    |                                     `- note: sending task-isolated 'settings.some' to actor-isolated callee risks causing data races between actor-isolated and task-isolated uses
 27 | 													   context: context,
 28 | 													   payload: settings)
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/StreamDeckPlugin/SDPlugin+Sent.swift:37:8: warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
 35 | 	///   - settings: A json object which is persistently saved for the action's instance.
 36 | 	func setSettings<P: Encodable>(in context: String, to settings: P) {
 37 | 		Task {
    |        `- warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
 38 | 			await PluginCommunication.shared.sendEvent(.setSettings,
 39 | 													   context: context,
 40 | 													   payload: settings)
    |                          `- note: closure captures 'settings' which is accessible to code in the current task
 41 | 		}
 42 | 	}
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/StreamDeckPlugin/SDPlugin+Sent.swift:38:37: warning: sending value of non-Sendable type 'P' risks causing data races; this is an error in the Swift 6 language mode
 36 | 	func setSettings<P: Encodable>(in context: String, to settings: P) {
 37 | 		Task {
 38 | 			await PluginCommunication.shared.sendEvent(.setSettings,
    |                                     |- warning: sending value of non-Sendable type 'P' risks causing data races; this is an error in the Swift 6 language mode
    |                                     `- note: sending task-isolated value of non-Sendable type 'P' to actor-isolated callee risks causing races in between task-isolated and actor-isolated uses
 39 | 													   context: context,
 40 | 													   payload: settings)
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/StreamDeckPlugin/SDPlugin+Sent.swift:58:8: warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
 56 | 	///   - settings: A json object which is persistently saved globally.
 57 | 	func setGlobalSettings(_ settings: [String: Any]) {
 58 | 		Task {
    |        `- warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
 59 | 			await PluginCommunication.shared.sendEvent(.setGlobalSettings,
 60 | 													   context: PluginCommunication.shared.uuid,
 61 | 													   payload: settings)
    |                          `- note: closure captures 'settings' which is accessible to code in the current task
 62 | 		}
 63 | 	}
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/StreamDeckPlugin/SDPlugin+Sent.swift:59:37: warning: sending 'settings.some' risks causing data races; this is an error in the Swift 6 language mode
 57 | 	func setGlobalSettings(_ settings: [String: Any]) {
 58 | 		Task {
 59 | 			await PluginCommunication.shared.sendEvent(.setGlobalSettings,
    |                                     |- warning: sending 'settings.some' risks causing data races; this is an error in the Swift 6 language mode
    |                                     `- note: sending task-isolated 'settings.some' to actor-isolated callee risks causing data races between actor-isolated and task-isolated uses
 60 | 													   context: PluginCommunication.shared.uuid,
 61 | 													   payload: settings)
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/StreamDeckPlugin/SDPlugin+Sent.swift:112:8: warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
110 | 	///   - state: A 0-based integer value representing the state of an action with multiple states. This is an optional parameter. If not specified, the title is set to all states.
111 | 	func setTitle(in context: String, to title: String?, target: Target? = nil, state: Int? = nil) {
112 | 		Task {
    |        `- warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
113 | 			var payload: [String: Any] = [:]
114 |
115 | 			payload["title"] = title
116 | 			payload["target"] = target?.rawValue
    |                        `- note: closure captures 'target' which is accessible to code in the current task
117 | 			payload["state"] = state
118 |
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/StreamDeckPlugin/SDPlugin+Sent.swift:139:8: warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
137 | 		let encodedImage = image?.base64String
138 |
139 | 		Task {
    |        `- warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
140 | 			var payload: [String: Any] = [:]
141 |
142 | 			payload["image"] = encodedImage
143 | 			payload["target"] = target?.rawValue
    |                        `- note: closure captures 'target' which is accessible to code in the current task
144 | 			payload["state"] = state
145 |
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/StreamDeckPlugin/SDPlugin+Sent.swift:188:8: warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
186 | 	///   - state: A 0-based integer value representing the state of an action with multiple states. This is an optional parameter. If not specified, the title is set to all states.
187 | 	func setImage(in context: String, toSVG svg: String?, target: Target? = nil, state: Int? = nil) {
188 | 		Task {
    |        `- warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
189 | 			var payload: [String: Any] = [:]
190 |
    :
193 | 			}
194 |
195 | 			payload["target"] = target?.rawValue
    |                        `- note: closure captures 'target' which is accessible to code in the current task
196 | 			payload["state"] = state
197 |
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/StreamDeckPlugin/SDPlugin+Sent.swift:259:8: warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
257 | 	///   - payload: A json object that will be received by the Property Inspector.
258 | 	func sendToPropertyInspector(in context: String, action: String, payload: [String: Any]) {
259 | 		Task {
    |        `- warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
260 | 			await PluginCommunication.shared.sendEvent(.sendToPropertyInspector,
261 | 													   action: action,
262 | 													   context: context,
263 | 													   payload: payload)
    |                          `- note: closure captures 'payload' which is accessible to code in the current task
264 | 		}
265 | 	}
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/StreamDeckPlugin/SDPlugin+Sent.swift:260:37: warning: sending 'payload.some' risks causing data races; this is an error in the Swift 6 language mode
258 | 	func sendToPropertyInspector(in context: String, action: String, payload: [String: Any]) {
259 | 		Task {
260 | 			await PluginCommunication.shared.sendEvent(.sendToPropertyInspector,
    |                                     |- warning: sending 'payload.some' risks causing data races; this is an error in the Swift 6 language mode
    |                                     `- note: sending task-isolated 'payload.some' to actor-isolated callee risks causing data races between actor-isolated and task-isolated uses
261 | 													   action: action,
262 | 													   context: context,
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/Action/LongPress.swift:17:13: warning: static property 'shared' is not concurrency-safe because non-'Sendable' type 'TimerKeeper' may have shared mutable state; this is an error in the Swift 6 language mode
12 |
13 | /// A class that stores long press timers for actions.
14 | class TimerKeeper {
   |       `- note: class 'TimerKeeper' does not conform to the 'Sendable' protocol
15 |
16 | 	/// The shared `TimerKeeper` instance.
17 | 	static let shared = TimerKeeper()
   |             |- warning: static property 'shared' is not concurrency-safe because non-'Sendable' type 'TimerKeeper' may have shared mutable state; this is an error in the Swift 6 language mode
   |             |- note: add '@MainActor' to make static property 'shared' part of global actor 'MainActor'
   |             `- note: disable concurrency-safety checks if accesses are protected by an external synchronization mechanism
18 |
19 | 	/// Times that have been set for a specific action instance.
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/Action/LongPress.swift:52:50: warning: capture of 'action' with non-sendable type 'A' in a '@Sendable' closure
44 | 	///   - action: The `Action`.
45 | 	///   - event: The `KeyEvent` which is passed to handler.
46 | 	func beginTimer<A: Action>(for action: A, event: ActionEvent<KeyEvent<A.Settings>>) {
   |                  `- note: consider making generic parameter 'A' conform to the 'Sendable' protocol
47 |
48 | 		log.log("Beginning long press timer for \(action.context, privacy: .public)")
   :
50 | 		// Begin the long-press timer
51 | 		let timer = Timer(timeInterval: action.longPressDuration, repeats: false) { _ in
52 | 			log.log("Long key press timer has fired for \(action.context, privacy: .public)")
   |                                                  `- warning: capture of 'action' with non-sendable type 'A' in a '@Sendable' closure
53 | 			self.lastState[action.context] = true
54 | 			action.longKeyPress(device: event.device, payload: event.payload)
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/Action/LongPress.swift:53:4: warning: capture of 'self' with non-sendable type 'TimerKeeper' in a '@Sendable' closure
12 |
13 | /// A class that stores long press timers for actions.
14 | class TimerKeeper {
   |       `- note: class 'TimerKeeper' does not conform to the 'Sendable' protocol
15 |
16 | 	/// The shared `TimerKeeper` instance.
   :
51 | 		let timer = Timer(timeInterval: action.longPressDuration, repeats: false) { _ in
52 | 			log.log("Long key press timer has fired for \(action.context, privacy: .public)")
53 | 			self.lastState[action.context] = true
   |    `- warning: capture of 'self' with non-sendable type 'TimerKeeper' in a '@Sendable' closure
54 | 			action.longKeyPress(device: event.device, payload: event.payload)
55 | 		}
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/Action/LongPress.swift:54:32: warning: capture of 'event' with non-sendable type 'ActionEvent<KeyEvent<A.Settings>>' in a '@Sendable' closure
52 | 			log.log("Long key press timer has fired for \(action.context, privacy: .public)")
53 | 			self.lastState[action.context] = true
54 | 			action.longKeyPress(device: event.device, payload: event.payload)
   |                                `- warning: capture of 'event' with non-sendable type 'ActionEvent<KeyEvent<A.Settings>>' in a '@Sendable' closure
55 | 		}
56 |
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/Events/Events.swift:87:15: note: consider making generic struct 'ActionEvent' conform to the 'Sendable' protocol
 85 |
 86 | /// Events sent by the server in response to actions.
 87 | public struct ActionEvent<Payload: Decodable>: Decodable {
    |               `- note: consider making generic struct 'ActionEvent' conform to the 'Sendable' protocol
 88 |
 89 | 	/// The action's unique identifier. If your plugin supports multiple actions, you should use this value to see which action was triggered.
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/Action/LongPress.swift:52:50: warning: implicit capture of 'action' requires that 'A' conforms to 'Sendable'; this is an error in the Swift 6 language mode
44 | 	///   - action: The `Action`.
45 | 	///   - event: The `KeyEvent` which is passed to handler.
46 | 	func beginTimer<A: Action>(for action: A, event: ActionEvent<KeyEvent<A.Settings>>) {
   |                  `- note: consider making generic parameter 'A' conform to the 'Sendable' protocol
47 |
48 | 		log.log("Beginning long press timer for \(action.context, privacy: .public)")
   :
50 | 		// Begin the long-press timer
51 | 		let timer = Timer(timeInterval: action.longPressDuration, repeats: false) { _ in
52 | 			log.log("Long key press timer has fired for \(action.context, privacy: .public)")
   |                                                  `- warning: implicit capture of 'action' requires that 'A' conforms to 'Sendable'; this is an error in the Swift 6 language mode
53 | 			self.lastState[action.context] = true
54 | 			action.longKeyPress(device: event.device, payload: event.payload)
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/Action/LongPress.swift:70:51: warning: capture of 'action' with non-sendable type 'A' in a '@Sendable' closure
62 | 	///   - action: The `Action`.
63 | 	///   - event: The `KeyEvent` which is passed to handler.
64 | 	func beginTimer<A: Action>(for action: A, event: ActionEvent<EncoderPressEvent<A.Settings>>) {
   |                  `- note: consider making generic parameter 'A' conform to the 'Sendable' protocol
65 |
66 | 		log.log("Beginning long press timer for \(action.context, privacy: .public)")
   :
68 | 		// Begin the long-press timer
69 | 		let timer = Timer(timeInterval: action.longPressDuration, repeats: false) { _ in
70 | 			log.log("Long dial press timer has fired for \(action.context, privacy: .public)")
   |                                                   `- warning: capture of 'action' with non-sendable type 'A' in a '@Sendable' closure
71 | 			self.lastState[action.context] = true
72 | 			action.longDialPress(device: event.device, payload: event.payload)
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/Action/LongPress.swift:71:4: warning: capture of 'self' with non-sendable type 'TimerKeeper' in a '@Sendable' closure
12 |
13 | /// A class that stores long press timers for actions.
14 | class TimerKeeper {
   |       `- note: class 'TimerKeeper' does not conform to the 'Sendable' protocol
15 |
16 | 	/// The shared `TimerKeeper` instance.
   :
69 | 		let timer = Timer(timeInterval: action.longPressDuration, repeats: false) { _ in
70 | 			log.log("Long dial press timer has fired for \(action.context, privacy: .public)")
71 | 			self.lastState[action.context] = true
   |    `- warning: capture of 'self' with non-sendable type 'TimerKeeper' in a '@Sendable' closure
72 | 			action.longDialPress(device: event.device, payload: event.payload)
73 | 		}
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/Action/LongPress.swift:72:33: warning: capture of 'event' with non-sendable type 'ActionEvent<EncoderPressEvent<A.Settings>>' in a '@Sendable' closure
70 | 			log.log("Long dial press timer has fired for \(action.context, privacy: .public)")
71 | 			self.lastState[action.context] = true
72 | 			action.longDialPress(device: event.device, payload: event.payload)
   |                                 `- warning: capture of 'event' with non-sendable type 'ActionEvent<EncoderPressEvent<A.Settings>>' in a '@Sendable' closure
73 | 		}
74 |
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/Events/Events.swift:87:15: note: consider making generic struct 'ActionEvent' conform to the 'Sendable' protocol
 85 |
 86 | /// Events sent by the server in response to actions.
 87 | public struct ActionEvent<Payload: Decodable>: Decodable {
    |               `- note: consider making generic struct 'ActionEvent' conform to the 'Sendable' protocol
 88 |
 89 | 	/// The action's unique identifier. If your plugin supports multiple actions, you should use this value to see which action was triggered.
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/Action/LongPress.swift:70:51: warning: implicit capture of 'action' requires that 'A' conforms to 'Sendable'; this is an error in the Swift 6 language mode
62 | 	///   - action: The `Action`.
63 | 	///   - event: The `KeyEvent` which is passed to handler.
64 | 	func beginTimer<A: Action>(for action: A, event: ActionEvent<EncoderPressEvent<A.Settings>>) {
   |                  `- note: consider making generic parameter 'A' conform to the 'Sendable' protocol
65 |
66 | 		log.log("Beginning long press timer for \(action.context, privacy: .public)")
   :
68 | 		// Begin the long-press timer
69 | 		let timer = Timer(timeInterval: action.longPressDuration, repeats: false) { _ in
70 | 			log.log("Long dial press timer has fired for \(action.context, privacy: .public)")
   |                                                   `- warning: implicit capture of 'action' requires that 'A' conforms to 'Sendable'; this is an error in the Swift 6 language mode
71 | 			self.lastState[action.context] = true
72 | 			action.longDialPress(device: event.device, payload: event.payload)
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/StreamDeckError.swift:14:7: warning: associated value 'invalidJSON' of 'Sendable'-conforming enum 'StreamDeckError' has non-sendable type 'Any'; this is an error in the Swift 6 language mode
12 |
13 | 	/// The JSON for an event is invalid.
14 | 	case invalidJSON(String, [String: Any])
   |       `- warning: associated value 'invalidJSON' of 'Sendable'-conforming enum 'StreamDeckError' has non-sendable type 'Any'; this is an error in the Swift 6 language mode
15 |
16 | 	/// The UUID has been used more than once.
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/StreamDeckPlugin/SDPlugin+Sent.swift:25:8: warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
 23 | 	@available(*, deprecated, message: "Use the Settings API.")
 24 | 	func setSettings(in context: String, to settings: [String: Any]) {
 25 | 		Task {
    |        `- warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
 26 | 			await PluginCommunication.shared.sendEvent(.setSettings,
 27 | 													   context: context,
 28 | 													   payload: settings)
    |                          `- note: closure captures 'settings' which is accessible to code in the current task
 29 | 		}
 30 | 	}
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/StreamDeckPlugin/SDPlugin+Sent.swift:26:37: warning: sending 'settings.some' risks causing data races; this is an error in the Swift 6 language mode
 24 | 	func setSettings(in context: String, to settings: [String: Any]) {
 25 | 		Task {
 26 | 			await PluginCommunication.shared.sendEvent(.setSettings,
    |                                     |- warning: sending 'settings.some' risks causing data races; this is an error in the Swift 6 language mode
    |                                     `- note: sending task-isolated 'settings.some' to actor-isolated callee risks causing data races between actor-isolated and task-isolated uses
 27 | 													   context: context,
 28 | 													   payload: settings)
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/StreamDeckPlugin/SDPlugin+Sent.swift:37:8: warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
 35 | 	///   - settings: A json object which is persistently saved for the action's instance.
 36 | 	func setSettings<P: Encodable>(in context: String, to settings: P) {
 37 | 		Task {
    |        `- warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
 38 | 			await PluginCommunication.shared.sendEvent(.setSettings,
 39 | 													   context: context,
 40 | 													   payload: settings)
    |                          `- note: closure captures 'settings' which is accessible to code in the current task
 41 | 		}
 42 | 	}
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/StreamDeckPlugin/SDPlugin+Sent.swift:38:37: warning: sending value of non-Sendable type 'P' risks causing data races; this is an error in the Swift 6 language mode
 36 | 	func setSettings<P: Encodable>(in context: String, to settings: P) {
 37 | 		Task {
 38 | 			await PluginCommunication.shared.sendEvent(.setSettings,
    |                                     |- warning: sending value of non-Sendable type 'P' risks causing data races; this is an error in the Swift 6 language mode
    |                                     `- note: sending task-isolated value of non-Sendable type 'P' to actor-isolated callee risks causing races in between task-isolated and actor-isolated uses
 39 | 													   context: context,
 40 | 													   payload: settings)
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/StreamDeckPlugin/SDPlugin+Sent.swift:58:8: warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
 56 | 	///   - settings: A json object which is persistently saved globally.
 57 | 	func setGlobalSettings(_ settings: [String: Any]) {
 58 | 		Task {
    |        `- warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
 59 | 			await PluginCommunication.shared.sendEvent(.setGlobalSettings,
 60 | 													   context: PluginCommunication.shared.uuid,
 61 | 													   payload: settings)
    |                          `- note: closure captures 'settings' which is accessible to code in the current task
 62 | 		}
 63 | 	}
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/StreamDeckPlugin/SDPlugin+Sent.swift:59:37: warning: sending 'settings.some' risks causing data races; this is an error in the Swift 6 language mode
 57 | 	func setGlobalSettings(_ settings: [String: Any]) {
 58 | 		Task {
 59 | 			await PluginCommunication.shared.sendEvent(.setGlobalSettings,
    |                                     |- warning: sending 'settings.some' risks causing data races; this is an error in the Swift 6 language mode
    |                                     `- note: sending task-isolated 'settings.some' to actor-isolated callee risks causing data races between actor-isolated and task-isolated uses
 60 | 													   context: PluginCommunication.shared.uuid,
 61 | 													   payload: settings)
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/StreamDeckPlugin/SDPlugin+Sent.swift:112:8: warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
110 | 	///   - state: A 0-based integer value representing the state of an action with multiple states. This is an optional parameter. If not specified, the title is set to all states.
111 | 	func setTitle(in context: String, to title: String?, target: Target? = nil, state: Int? = nil) {
112 | 		Task {
    |        `- warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
113 | 			var payload: [String: Any] = [:]
114 |
115 | 			payload["title"] = title
116 | 			payload["target"] = target?.rawValue
    |                        `- note: closure captures 'target' which is accessible to code in the current task
117 | 			payload["state"] = state
118 |
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/StreamDeckPlugin/SDPlugin+Sent.swift:139:8: warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
137 | 		let encodedImage = image?.base64String
138 |
139 | 		Task {
    |        `- warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
140 | 			var payload: [String: Any] = [:]
141 |
142 | 			payload["image"] = encodedImage
143 | 			payload["target"] = target?.rawValue
    |                        `- note: closure captures 'target' which is accessible to code in the current task
144 | 			payload["state"] = state
145 |
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/StreamDeckPlugin/SDPlugin+Sent.swift:188:8: warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
186 | 	///   - state: A 0-based integer value representing the state of an action with multiple states. This is an optional parameter. If not specified, the title is set to all states.
187 | 	func setImage(in context: String, toSVG svg: String?, target: Target? = nil, state: Int? = nil) {
188 | 		Task {
    |        `- warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
189 | 			var payload: [String: Any] = [:]
190 |
    :
193 | 			}
194 |
195 | 			payload["target"] = target?.rawValue
    |                        `- note: closure captures 'target' which is accessible to code in the current task
196 | 			payload["state"] = state
197 |
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/StreamDeckPlugin/SDPlugin+Sent.swift:259:8: warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
257 | 	///   - payload: A json object that will be received by the Property Inspector.
258 | 	func sendToPropertyInspector(in context: String, action: String, payload: [String: Any]) {
259 | 		Task {
    |        `- warning: passing closure as a 'sending' parameter risks causing data races between code in the current task and concurrent execution of the closure; this is an error in the Swift 6 language mode
260 | 			await PluginCommunication.shared.sendEvent(.sendToPropertyInspector,
261 | 													   action: action,
262 | 													   context: context,
263 | 													   payload: payload)
    |                          `- note: closure captures 'payload' which is accessible to code in the current task
264 | 		}
265 | 	}
/Users/admin/builder/spi-builder-workspace/Sources/StreamDeck/StreamDeck Plugin/StreamDeckPlugin/SDPlugin+Sent.swift:260:37: warning: sending 'payload.some' risks causing data races; this is an error in the Swift 6 language mode
258 | 	func sendToPropertyInspector(in context: String, action: String, payload: [String: Any]) {
259 | 		Task {
260 | 			await PluginCommunication.shared.sendEvent(.sendToPropertyInspector,
    |                                     |- warning: sending 'payload.some' risks causing data races; this is an error in the Swift 6 language mode
    |                                     `- note: sending task-isolated 'payload.some' to actor-isolated callee risks causing data races between actor-isolated and task-isolated uses
261 | 													   action: action,
262 | 													   context: context,
Build complete! (50.92s)
Fetching https://github.com/swiftlang/swift-docc-plugin from cache
Fetching https://github.com/swiftlang/swift-syntax.git from cache
Fetching https://github.com/apple/swift-argument-parser.git from cache
Fetched https://github.com/swiftlang/swift-docc-plugin from cache (0.67s)
Fetched https://github.com/apple/swift-argument-parser.git from cache (1.67s)
Fetched https://github.com/swiftlang/swift-syntax.git from cache (1.73s)
Computing version for https://github.com/apple/swift-argument-parser.git
Computed https://github.com/apple/swift-argument-parser.git at 1.7.1 (2.31s)
Computing version for https://github.com/swiftlang/swift-docc-plugin
Computed https://github.com/swiftlang/swift-docc-plugin at 1.4.6 (3.15s)
Fetching https://github.com/swiftlang/swift-docc-symbolkit from cache
Fetched https://github.com/swiftlang/swift-docc-symbolkit from cache (0.77s)
Computing version for https://github.com/swiftlang/swift-docc-symbolkit
Computed https://github.com/swiftlang/swift-docc-symbolkit at 1.0.0 (1.46s)
Computing version for https://github.com/swiftlang/swift-syntax.git
Computed https://github.com/swiftlang/swift-syntax.git at 601.0.1 (0.66s)
Creating working copy for https://github.com/apple/swift-argument-parser.git
Working copy of https://github.com/apple/swift-argument-parser.git resolved at 1.7.1
Creating working copy for https://github.com/swiftlang/swift-syntax.git
Working copy of https://github.com/swiftlang/swift-syntax.git resolved at 601.0.1
Creating working copy for https://github.com/swiftlang/swift-docc-plugin
Working copy of https://github.com/swiftlang/swift-docc-plugin resolved at 1.4.6
Creating working copy for https://github.com/swiftlang/swift-docc-symbolkit
Working copy of https://github.com/swiftlang/swift-docc-symbolkit resolved at 1.0.0
Build complete.
{
  "dependencies" : [
    {
      "identity" : "swift-argument-parser",
      "requirement" : {
        "range" : [
          {
            "lower_bound" : "1.5.0",
            "upper_bound" : "2.0.0"
          }
        ]
      },
      "type" : "sourceControl",
      "url" : "https://github.com/apple/swift-argument-parser.git"
    },
    {
      "identity" : "swift-syntax",
      "requirement" : {
        "range" : [
          {
            "lower_bound" : "509.0.0",
            "upper_bound" : "602.0.0"
          }
        ]
      },
      "type" : "sourceControl",
      "url" : "https://github.com/swiftlang/swift-syntax.git"
    },
    {
      "identity" : "swift-docc-plugin",
      "requirement" : {
        "range" : [
          {
            "lower_bound" : "1.1.0",
            "upper_bound" : "2.0.0"
          }
        ]
      },
      "type" : "sourceControl",
      "url" : "https://github.com/swiftlang/swift-docc-plugin"
    }
  ],
  "manifest_display_name" : "StreamDeck",
  "name" : "StreamDeck",
  "path" : "/Users/admin/builder/spi-builder-workspace",
  "platforms" : [
    {
      "name" : "macos",
      "version" : "12.0"
    }
  ],
  "products" : [
    {
      "name" : "StreamDeck",
      "targets" : [
        "StreamDeck"
      ],
      "type" : {
        "library" : [
          "automatic"
        ]
      }
    },
    {
      "name" : "StreamDeckMacros",
      "targets" : [
        "StreamDeckMacros"
      ],
      "type" : {
        "macro" : null
      }
    }
  ],
  "targets" : [
    {
      "c99name" : "StreamDeckPluginTests",
      "module_type" : "SwiftTarget",
      "name" : "StreamDeckPluginTests",
      "path" : "Tests/StreamDeckPluginTests",
      "resources" : [
        {
          "path" : "/Users/admin/builder/spi-builder-workspace/Tests/StreamDeckPluginTests/Support/Test Events",
          "rule" : {
            "copy" : {
            }
          }
        }
      ],
      "sources" : [
        "PluginEventTests.swift",
        "PluginManifestTests.swift",
        "PluginRegistrationTests.swift",
        "StreamDeckPluginTests.swift",
        "Support/TestEvents.swift",
        "Support/TestPlugin.swift"
      ],
      "target_dependencies" : [
        "StreamDeck"
      ],
      "type" : "test"
    },
    {
      "c99name" : "StreamDeckMacrosTests",
      "module_type" : "SwiftTarget",
      "name" : "StreamDeckMacrosTests",
      "path" : "Tests/StreamDeckMacrosTests",
      "product_dependencies" : [
        "SwiftSyntaxMacrosTestSupport"
      ],
      "sources" : [
        "SettingsMacroTests.swift"
      ],
      "target_dependencies" : [
        "StreamDeckMacros"
      ],
      "type" : "test"
    },
    {
      "c99name" : "StreamDeckMacros",
      "module_type" : "SwiftTarget",
      "name" : "StreamDeckMacros",
      "path" : "Sources/StreamDeckMacros",
      "product_dependencies" : [
        "SwiftSyntaxMacros",
        "SwiftCompilerPlugin"
      ],
      "product_memberships" : [
        "StreamDeck",
        "StreamDeckMacros"
      ],
      "sources" : [
        "EntryMacro.swift",
        "KeyMacros.swift",
        "Plugin.swift",
        "SharedKeyMacro.swift"
      ],
      "type" : "macro"
    },
    {
      "c99name" : "StreamDeck",
      "module_type" : "SwiftTarget",
      "name" : "StreamDeck",
      "path" : "Sources/StreamDeck",
      "product_dependencies" : [
        "ArgumentParser"
      ],
      "product_memberships" : [
        "StreamDeck"
      ],
      "sources" : [
        "Builders/ActionBuilder.swift",
        "Command Line/ExportCommand.swift",
        "Command Line/PluginCommand.swift",
        "Command Line/StreamDeckCommand.swift",
        "Command Line/StreamDeckKey.swift",
        "Events/EventProtocols.swift",
        "Events/Events.swift",
        "Extensions/CharSet+DNS.swift",
        "Extensions/NSImage+Base64.swift",
        "Extensions/URL+Argument.swift",
        "Macros/SettingsMacros.swift",
        "StreamDeck Plugin/Action/Action+Received.swift",
        "StreamDeck Plugin/Action/Action+Sent.swift",
        "StreamDeck Plugin/Action/Action+Support.swift",
        "StreamDeck Plugin/Action/Action.swift",
        "StreamDeck Plugin/Action/LongPress.swift",
        "StreamDeck Plugin/PluginCommunication.swift",
        "StreamDeck Plugin/StreamDeckError.swift",
        "StreamDeck Plugin/StreamDeckPlugin/SDPlugin+Received.swift",
        "StreamDeck Plugin/StreamDeckPlugin/SDPlugin+Sent.swift",
        "StreamDeck Plugin/StreamDeckPlugin/SDPlugin+Support.swift",
        "StreamDeck Plugin/StreamDeckPlugin/StreamDeckPlugin.swift",
        "Support Models/ActionControllerRegistry.swift",
        "Support Models/Environment/EnvironmentKey.swift",
        "Support Models/Environment/EnvironmentValues.swift",
        "Support Models/Environment/EnvironmentWrapper.swift",
        "Support Models/PluginManifest/ApplicationsToMonitor.swift",
        "Support Models/PluginManifest/Coordinates.swift",
        "Support Models/PluginManifest/Fonts.swift",
        "Support Models/PluginManifest/Hardware.swift",
        "Support Models/PluginManifest/PluginAction.swift",
        "Support Models/PluginManifest/PluginActionState.swift",
        "Support Models/PluginManifest/PluginInfo.swift",
        "Support Models/PluginManifest/PluginManifest.swift",
        "Support Models/PluginManifest/PluginOS.swift",
        "Support Models/PluginManifest/PluginProfile.swift",
        "Support Models/PluginManifest/PluginSoftware.swift",
        "Support Models/RotaryEncoder/RotaryEncoder.swift",
        "Support Models/RotaryEncoder/TriggerDescription.swift",
        "Support Models/SPDI.swift",
        "Support Models/Settings/GlobalSettings.swift",
        "Support Models/Settings/GlobalSettingsKey.swift",
        "Support Models/Settings/SettingsWrapper.swift",
        "Support Models/State.swift"
      ],
      "target_dependencies" : [
        "StreamDeckMacros",
        "SDPlusLayout"
      ],
      "type" : "library"
    },
    {
      "c99name" : "SDPlusLayoutTests",
      "module_type" : "SwiftTarget",
      "name" : "SDPlusLayoutTests",
      "path" : "Tests/SDPlusLayoutTests",
      "sources" : [
        "LayoutTests.swift"
      ],
      "target_dependencies" : [
        "SDPlusLayout"
      ],
      "type" : "test"
    },
    {
      "c99name" : "SDPlusLayout",
      "module_type" : "SwiftTarget",
      "name" : "SDPlusLayout",
      "path" : "Sources/SDPlusLayout",
      "product_memberships" : [
        "StreamDeck"
      ],
      "sources" : [
        "BarLayoutItem.swift",
        "Color/Color+ExpressibleByStringLiteral.swift",
        "Color/Color+FormatStyle.swift",
        "Color/Color.swift",
        "Color/ColorStyle.swift",
        "Color/Gradient.swift",
        "Elements/Bar.swift",
        "Elements/Image.swift",
        "Elements/Slider.swift",
        "Elements/Text.swift",
        "Extensions/Clamped.swift",
        "Layout.swift",
        "LayoutItem.swift",
        "LayoutItemKey.swift",
        "LayoutName.swift",
        "LayoutSettings.swift",
        "ModifiedItem.swift",
        "Properties.swift"
      ],
      "type" : "library"
    }
  ],
  "tools_version" : "5.9"
}
Done.