diff --git a/Sources/Surfaces/CloudAgentNameContext.swift b/Packages/macOS/CmuxCloud/Sources/CmuxCloud/Surfaces/CloudAgentNameContext.swift similarity index 86% rename from Sources/Surfaces/CloudAgentNameContext.swift rename to Packages/macOS/CmuxCloud/Sources/CmuxCloud/Surfaces/CloudAgentNameContext.swift index fe2fb576393d..6baf68f59239 100644 --- a/Sources/Surfaces/CloudAgentNameContext.swift +++ b/Packages/macOS/CmuxCloud/Sources/CmuxCloud/Surfaces/CloudAgentNameContext.swift @@ -4,12 +4,12 @@ import Foundation /// A callback's read precondition, captured before an agent computes its title. /// Names never identify a resource: the full projection and daemon generation do. -struct CloudAgentNameContext: Hashable, Codable, Sendable { - let projection: SurfaceProjection - let generation: String +public struct CloudAgentNameContext: Hashable, Codable, Sendable { + public let projection: SurfaceProjection + public let generation: String let nameRevision: UInt64 - init?(projection: SurfaceProjection, state: CloudVMState) { + public init?(projection: SurfaceProjection, state: CloudVMState) { guard let tabID = projection.remoteTabID, let tab = state.lookupIndex.tab(id: tabID), tab.contentKind == "terminal", tab.contentID == projection.resource.key, @@ -24,19 +24,19 @@ struct CloudAgentNameContext: Hashable, Codable, Sendable { nameRevision = authority.revision } - init?(wire: Any?) { + public init?(wire: Any?) { guard let wire, JSONSerialization.isValidJSONObject(wire), let bytes = try? JSONSerialization.data(withJSONObject: wire), let value = try? JSONDecoder().decode(Self.self, from: bytes) else { return nil } self = value } - var wire: [String: Any]? { + public var wire: [String: Any]? { guard let data = try? JSONEncoder().encode(self) else { return nil } return (try? JSONSerialization.jsonObject(with: data)) as? [String: Any] } - func renameRequest(name: String) -> CloudTuiRequest { + public func renameRequest(name: String) -> CloudTuiRequest { CloudTuiRequest("tab.rename", ["tab": projection.remoteTabID ?? "", "workspace": projection.remoteWorkspaceID ?? "", "name": name, "source": "auto", "expected_generation": generation, "expected_name_revision": String(nameRevision)], mutation: true) diff --git a/Sources/Surfaces/CloudAttachmentReconcileDecision.swift b/Packages/macOS/CmuxCloud/Sources/CmuxCloud/Surfaces/CloudAttachmentReconcileDecision.swift similarity index 93% rename from Sources/Surfaces/CloudAttachmentReconcileDecision.swift rename to Packages/macOS/CmuxCloud/Sources/CmuxCloud/Surfaces/CloudAttachmentReconcileDecision.swift index 30b66eb4e016..1e0872d9e3a5 100644 --- a/Sources/Surfaces/CloudAttachmentReconcileDecision.swift +++ b/Packages/macOS/CmuxCloud/Sources/CmuxCloud/Surfaces/CloudAttachmentReconcileDecision.swift @@ -12,7 +12,7 @@ import Foundation /// reports itself (`.transportClosed`, a liveness timeout); the pass only needs /// to act on sessions that are not attached, on a changed numeric id, or on a /// terminal that exited. -enum CloudAttachmentReconcileDecision: Equatable, Sendable { +public enum CloudAttachmentReconcileDecision: Equatable, Sendable { /// Rebind to the resolved numeric surface (a no-op when unchanged). case rebind(surfaceID: UInt64) /// The terminal ended on the machine: stop the session and close its pane. @@ -22,7 +22,7 @@ enum CloudAttachmentReconcileDecision: Equatable, Sendable { /// Leave the working stream alone; nothing about it is in doubt. case keep - static func decide( + public static func decide( phase: CloudTuiManualMirrorPhase, resolution: CloudTuiSurfaceIDResolution ) -> CloudAttachmentReconcileDecision { @@ -41,7 +41,7 @@ enum CloudAttachmentReconcileDecision: Equatable, Sendable { } /// Whether the pass must arm its bounded retry because of this decision. - var needsRetry: Bool { + public var needsRetry: Bool { if case .fence = self { return true } return false } diff --git a/Sources/Surfaces/CloudEnvDelivery.swift b/Packages/macOS/CmuxCloud/Sources/CmuxCloud/Surfaces/CloudEnvDelivery.swift similarity index 82% rename from Sources/Surfaces/CloudEnvDelivery.swift rename to Packages/macOS/CmuxCloud/Sources/CmuxCloud/Surfaces/CloudEnvDelivery.swift index 1d3965c1f640..19d8acb6e090 100644 --- a/Sources/Surfaces/CloudEnvDelivery.swift +++ b/Packages/macOS/CmuxCloud/Sources/CmuxCloud/Surfaces/CloudEnvDelivery.swift @@ -24,35 +24,44 @@ import Foundation /// /// What is left exposed is only what the machine itself must hold: a root-only file on /// its persistent volume, which forks and snapshots of that machine inherit. -enum CloudEnvDelivery { +/// lint:allow namespace-type: moved unchanged from the app target, where it was an internal static namespace; reshaping it is a separate change from this package move. +public enum CloudEnvDelivery { /// Absolute: the daemon's own PATH is not a login shell's. - static let receiverCommand = ["/usr/local/bin/cmux", "env", "receive"] - static let receiverTitle = "cmux env" - static let readyMarker = "CMUX-ENV-READY" - static let endMarker = "CMUX-ENV-END" - static let resultPattern = "CMUX-ENV-(OK|ERR)" + public static let receiverCommand = ["/usr/local/bin/cmux", "env", "receive"] + public static let receiverTitle = "cmux env" + public static let readyMarker = "CMUX-ENV-READY" + public static let endMarker = "CMUX-ENV-END" + public static let resultPattern = "CMUX-ENV-(OK|ERR)" /// The receiver is a shell script that starts in well under a second; a machine that /// is waking or whose shim predates the verb shows neither marker in this time. - static let readyTimeoutMs = 15_000 - static let resultTimeoutMs = 30_000 + public static let readyTimeoutMs = 15_000 + public static let resultTimeoutMs = 30_000 /// One `terminal write` per chunk: small enough that the receiver's line reads keep /// pace with the PTY's input buffer, large enough that an ordinary `.env` is 1–2 writes. - static let chunkBytes = 1_024 - static let maxPayloadBytes = 256 * 1_024 - static let base64LineWidth = 76 + public static let chunkBytes = 1_024 + public static let maxPayloadBytes = 256 * 1_024 + public static let base64LineWidth = 76 - struct Entry: Equatable, Sendable { - let key: String - let value: String + public struct Entry: Equatable, Sendable { + public init( + key: String, + value: String + ) { + self.key = key + self.value = value + } + + public let key: String + public let value: String } - enum Outcome: Equatable, Sendable { + public enum Outcome: Equatable, Sendable { case ok(keys: Int, path: String?) case failed(String) } @MainActor - static func withReceiverWorkspace( + public static func withReceiverWorkspace( createWorkspace: @MainActor () async throws -> String, closeWorkspace: @escaping @MainActor (String) async throws -> Void, operation: @MainActor (String) async throws -> Outcome @@ -74,7 +83,7 @@ enum CloudEnvDelivery { } @MainActor - static func removeReceiverResources( + public static func removeReceiverResources( terminalIDs: [String], discoverTerminalIDs: @MainActor () async throws -> [String] = { [] }, closeTerminal: @MainActor (String) async throws -> Void, @@ -97,11 +106,19 @@ enum CloudEnvDelivery { } } - struct OperationAndCleanupError: Error, LocalizedError { - let operationError: any Error - let cleanupError: DeliveryError + public struct OperationAndCleanupError: Error, LocalizedError { + public init( + operationError: any Error, + cleanupError: DeliveryError + ) { + self.operationError = operationError + self.cleanupError = cleanupError + } + + public let operationError: any Error + public let cleanupError: DeliveryError - var errorDescription: String? { + public var errorDescription: String? { let primaryDescription: String if let deliveryError = operationError as? DeliveryError { primaryDescription = deliveryError.localizedDescription @@ -114,7 +131,7 @@ enum CloudEnvDelivery { } } - enum DeliveryError: Error, LocalizedError, Equatable { + public enum DeliveryError: Error, LocalizedError, Equatable { case invalidKey(String) case multilineValue(String) case emptyPayload @@ -125,7 +142,7 @@ enum CloudEnvDelivery { case noResult(String) case workspaceCleanupFailed(String) - var errorDescription: String? { + public var errorDescription: String? { switch self { case .invalidKey(let key): return "invalid variable name '\(key)' (keys match [A-Za-z_][A-Za-z0-9_]*)" @@ -154,7 +171,7 @@ enum CloudEnvDelivery { } } - static func requireReady(_ response: [String: Any], machineID: String) throws { + public static func requireReady(_ response: [String: Any], machineID: String) throws { let value = (response["value"] as? [String: Any]) ?? response guard (value["matched"] as? Bool) == true else { let screen = (value["text"] as? String) ?? "" @@ -165,7 +182,7 @@ enum CloudEnvDelivery { } } - static func requireOutcome(_ response: [String: Any]) throws -> Outcome { + public static func requireOutcome(_ response: [String: Any]) throws -> Outcome { let value = (response["value"] as? [String: Any]) ?? response let screen = (value["text"] as? String) ?? "" guard let outcome = outcome(fromScreen: screen) else { @@ -177,12 +194,12 @@ enum CloudEnvDelivery { return outcome } - static func isValidKey(_ key: String) -> Bool { + public static func isValidKey(_ key: String) -> Bool { key.range(of: "^[A-Za-z_][A-Za-z0-9_]*$", options: .regularExpression) != nil } /// The receiver's payload: one `KEY=VALUE` line per entry, values byte-literal. - static func payload(_ entries: [Entry]) throws -> Data { + public static func payload(_ entries: [Entry]) throws -> Data { guard !entries.isEmpty else { throw DeliveryError.emptyPayload } var text = "" for entry in entries { @@ -200,7 +217,7 @@ enum CloudEnvDelivery { /// What gets typed into the receiver's PTY: base64 of the payload, wrapped to /// 76 columns (a canonical-mode line is capped at 4095 bytes; keep far below it), /// then the end marker on its own line. - static func wire(_ payload: Data) -> Data { + public static func wire(_ payload: Data) -> Data { let encoded = payload.base64EncodedString() var lines: [String] = [] var index = encoded.startIndex @@ -215,7 +232,7 @@ enum CloudEnvDelivery { /// `wire` split for one `terminal write` per piece. Cut points fall anywhere: the /// receiver reassembles lines from the byte stream, not from write boundaries. - static func chunks(_ wire: Data, size: Int = chunkBytes) -> [Data] { + public static func chunks(_ wire: Data, size: Int = chunkBytes) -> [Data] { guard size > 0, !wire.isEmpty else { return wire.isEmpty ? [] : [wire] } var pieces: [Data] = [] var offset = 0 @@ -229,7 +246,7 @@ enum CloudEnvDelivery { /// The receiver's verdict, from the screen text after `CMUX-ENV-(OK|ERR)` matched. /// The LAST such line wins: a retried receiver's earlier lines may still be visible. - static func outcome(fromScreen text: String) -> Outcome? { + public static func outcome(fromScreen text: String) -> Outcome? { var result: Outcome? for rawLine in text.split(whereSeparator: { $0 == "\n" || $0 == "\r" }) { let line = rawLine.trimmingCharacters(in: .whitespaces) @@ -252,7 +269,7 @@ enum CloudEnvDelivery { /// A shim without the verb falls through to cmux-tui, which answers with an unknown /// resource scope; the shim's own dispatcher says "unknown env command". - static func looksLikeOutdatedShim(_ screen: String) -> Bool { + public static func looksLikeOutdatedShim(_ screen: String) -> Bool { screen.contains("unknown resource scope") || screen.contains("unknown env command") } } diff --git a/Sources/Surfaces/CloudFileDelivery.swift b/Packages/macOS/CmuxCloud/Sources/CmuxCloud/Surfaces/CloudFileDelivery.swift similarity index 83% rename from Sources/Surfaces/CloudFileDelivery.swift rename to Packages/macOS/CmuxCloud/Sources/CmuxCloud/Surfaces/CloudFileDelivery.swift index 6d934bce9ad4..e526346c5a58 100644 --- a/Sources/Surfaces/CloudFileDelivery.swift +++ b/Packages/macOS/CmuxCloud/Sources/CmuxCloud/Surfaces/CloudFileDelivery.swift @@ -25,32 +25,43 @@ import Foundation /// /// Same limits as env delivery: 256 KiB, because the PTY is a control channel, /// not a bulk one. Larger non-secret payloads belong to `cmux vm push`. -enum CloudFileDelivery { +/// lint:allow namespace-type: moved unchanged from the app target, where it was an internal static namespace; reshaping it is a separate change from this package move. +public enum CloudFileDelivery { /// Absolute: the daemon's own PATH is not a login shell's. static let receiverProgram = "/usr/local/bin/cmux" - static let receiverTitle = "cmux file" - static let readyMarker = "CMUX-FILE-READY" - static let endMarker = "CMUX-FILE-END" - static let resultPattern = "CMUX-FILE-(OK|ERR)" - static let readyTimeoutMs = CloudEnvDelivery.readyTimeoutMs + public static let receiverTitle = "cmux file" + public static let readyMarker = "CMUX-FILE-READY" + public static let endMarker = "CMUX-FILE-END" + public static let resultPattern = "CMUX-FILE-(OK|ERR)" + public static let readyTimeoutMs = CloudEnvDelivery.readyTimeoutMs /// Decoding 256 KiB through a shell pipeline is quick; the margin covers a /// machine that is paging the shim back in. - static let resultTimeoutMs = 60_000 - static let maxPayloadBytes = 256 * 1_024 - static let defaultMode = "600" - - struct Request: Equatable, Sendable { - let path: String - let mode: String - let data: Data + public static let resultTimeoutMs = 60_000 + public static let maxPayloadBytes = 256 * 1_024 + public static let defaultMode = "600" + + public struct Request: Equatable, Sendable { + public init( + path: String, + mode: String, + data: Data + ) { + self.path = path + self.mode = mode + self.data = data + } + + public let path: String + public let mode: String + public let data: Data } - enum Outcome: Equatable, Sendable { + public enum Outcome: Equatable, Sendable { case ok(bytes: Int, path: String?, mode: String?) case failed(String) } - enum DeliveryError: Error, LocalizedError, Equatable { + public enum DeliveryError: Error, LocalizedError, Equatable { case emptyPath case invalidMode(String) case emptyPayload @@ -62,7 +73,7 @@ enum CloudFileDelivery { case byteCountMismatch(sent: Int, reported: Int) case workspaceCleanupFailed(String) - var errorDescription: String? { + public var errorDescription: String? { switch self { case .emptyPath: return "a destination path on the machine is required" @@ -95,11 +106,19 @@ enum CloudFileDelivery { /// A delivery that failed AND left its temporary workspace behind: both facts /// matter to the caller, so neither is dropped. - struct OperationAndCleanupError: Error, LocalizedError { - let operationError: any Error - let cleanupError: DeliveryError + public struct OperationAndCleanupError: Error, LocalizedError { + public init( + operationError: any Error, + cleanupError: DeliveryError + ) { + self.operationError = operationError + self.cleanupError = cleanupError + } + + public let operationError: any Error + public let cleanupError: DeliveryError - var errorDescription: String? { + public var errorDescription: String? { let primary: String if let deliveryError = operationError as? DeliveryError { primary = deliveryError.localizedDescription @@ -117,7 +136,7 @@ enum CloudFileDelivery { /// its own task so a cancelled caller still cleans up). A cleanup failure after a /// failed operation is reported alongside the original error. @MainActor - static func withReceiverWorkspace( + public static func withReceiverWorkspace( createWorkspace: @MainActor () async throws -> String, closeWorkspace: @escaping @MainActor (String) async throws -> Void, operation: @MainActor (String) async throws -> T @@ -151,18 +170,18 @@ enum CloudFileDelivery { } /// Three or four octal digits: what `chmod` accepts and what the receiver echoes back. - static func isValidMode(_ mode: String) -> Bool { + public static func isValidMode(_ mode: String) -> Bool { mode.range(of: "^[0-7]{3,4}$", options: .regularExpression) != nil } /// What the daemon runs: the shim's receiver with its destination and mode as argv. /// The path is public information (it shows in the tree as the terminal's command); /// the bytes never are. - static func receiverCommand(path: String, mode: String) -> [String] { + public static func receiverCommand(path: String, mode: String) -> [String] { [receiverProgram, "file", "receive", path, "--mode", mode] } - static func validate(_ request: Request) throws { + public static func validate(_ request: Request) throws { guard !request.path.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty else { throw DeliveryError.emptyPath } @@ -175,7 +194,7 @@ enum CloudFileDelivery { /// env protocol's 76 columns (a canonical-mode line is capped at 4095 bytes), then /// the end marker on its own line. Split into `terminal write` pieces with /// `CloudEnvDelivery.chunks`; the receiver reassembles lines from the byte stream. - static func wire(_ data: Data) -> Data { + public static func wire(_ data: Data) -> Data { let encoded = data.base64EncodedString() var lines: [String] = [] var index = encoded.startIndex @@ -188,7 +207,7 @@ enum CloudFileDelivery { return Data((lines.joined(separator: "\n") + "\n").utf8) } - static func requireReady(_ response: [String: Any], machineID: String) throws { + public static func requireReady(_ response: [String: Any], machineID: String) throws { let value = (response["value"] as? [String: Any]) ?? response guard (value["matched"] as? Bool) == true else { let screen = (value["text"] as? String) ?? "" @@ -199,7 +218,7 @@ enum CloudFileDelivery { } } - static func requireOutcome(_ response: [String: Any], expectedBytes: Int) throws -> Outcome { + public static func requireOutcome(_ response: [String: Any], expectedBytes: Int) throws -> Outcome { let value = (response["value"] as? [String: Any]) ?? response let screen = (value["text"] as? String) ?? "" guard let outcome = outcome(fromScreen: screen) else { @@ -220,7 +239,7 @@ enum CloudFileDelivery { /// The receiver's verdict, from the screen text after `CMUX-FILE-(OK|ERR)` matched. /// The LAST such line wins: a retried receiver's earlier lines may still be visible. - static func outcome(fromScreen text: String) -> Outcome? { + public static func outcome(fromScreen text: String) -> Outcome? { var result: Outcome? for rawLine in text.split(whereSeparator: { $0 == "\n" || $0 == "\r" }) { let line = rawLine.trimmingCharacters(in: .whitespaces) diff --git a/Sources/Surfaces/CloudPaneCreationFailure.swift b/Packages/macOS/CmuxCloud/Sources/CmuxCloud/Surfaces/CloudPaneCreationFailure.swift similarity index 71% rename from Sources/Surfaces/CloudPaneCreationFailure.swift rename to Packages/macOS/CmuxCloud/Sources/CmuxCloud/Surfaces/CloudPaneCreationFailure.swift index 2cca22378bda..115d5ec236df 100644 --- a/Sources/Surfaces/CloudPaneCreationFailure.swift +++ b/Packages/macOS/CmuxCloud/Sources/CmuxCloud/Surfaces/CloudPaneCreationFailure.swift @@ -3,18 +3,18 @@ import CmuxSurfaceCatalogModel import Foundation /// The latest cloud terminal creation failure shown by its owning workspace. -struct CloudPaneCreationFailure: Identifiable, Equatable { - let id: UUID - let machine: SurfaceMachineID - let sourcePanelID: UUID? - let title: String - let displayTitle: String - let errorText: String - let recoveryText: String - let diagnosticReference: String? +public struct CloudPaneCreationFailure: Identifiable, Equatable { + public let id: UUID + public let machine: SurfaceMachineID + public let sourcePanelID: UUID? + public let title: String + public let displayTitle: String + public let errorText: String + public let recoveryText: String + public let diagnosticReference: String? /// Builds a privacy-safe, localized snapshot from a provider error. - init(machine: SurfaceMachineID, error: Error, title: String? = nil, recoveryText: String? = nil, context: CloudOperationContext? = nil, sourcePanelID: UUID? = nil) { + public init(machine: SurfaceMachineID, error: Error, title: String? = nil, recoveryText: String? = nil, context: CloudOperationContext? = nil, sourcePanelID: UUID? = nil) { id = UUID() self.machine = machine self.sourcePanelID = sourcePanelID @@ -31,7 +31,7 @@ struct CloudPaneCreationFailure: Identifiable, Equatable { } /// The localized text copied from the card's context menu for troubleshooting. - var copyableText: String { + public var copyableText: String { [displayTitle, errorText, recoveryText, diagnosticReference].compactMap { $0 }.joined(separator: "\n") } diff --git a/Sources/Surfaces/CloudPaneCreationPhase.swift b/Packages/macOS/CmuxCloud/Sources/CmuxCloud/Surfaces/CloudPaneCreationPhase.swift similarity index 84% rename from Sources/Surfaces/CloudPaneCreationPhase.swift rename to Packages/macOS/CmuxCloud/Sources/CmuxCloud/Surfaces/CloudPaneCreationPhase.swift index 7491222c1a26..d9df21a6437a 100644 --- a/Sources/Surfaces/CloudPaneCreationPhase.swift +++ b/Packages/macOS/CmuxCloud/Sources/CmuxCloud/Surfaces/CloudPaneCreationPhase.swift @@ -1,6 +1,6 @@ /// The newest terminal request's workspace-level presentation. In-flight /// requests show nothing here: the reserved pane itself carries progress. -enum CloudPaneCreationPhase { +public enum CloudPaneCreationPhase { case idle case failed(CloudPaneCreationFailure) } diff --git a/Sources/Surfaces/CloudProviderRefreshCoordinator.swift b/Packages/macOS/CmuxCloud/Sources/CmuxCloud/Surfaces/CloudProviderRefreshCoordinator.swift similarity index 87% rename from Sources/Surfaces/CloudProviderRefreshCoordinator.swift rename to Packages/macOS/CmuxCloud/Sources/CmuxCloud/Surfaces/CloudProviderRefreshCoordinator.swift index 36140fe7eb41..92d8c3462f03 100644 --- a/Sources/Surfaces/CloudProviderRefreshCoordinator.swift +++ b/Packages/macOS/CmuxCloud/Sources/CmuxCloud/Surfaces/CloudProviderRefreshCoordinator.swift @@ -3,7 +3,9 @@ import Foundation /// Serializes graph publication for one provider. A forced reader waits for a /// pass started after its request; ordinary readers share the active pass. @MainActor -final class CloudProviderRefreshCoordinator { +public final class CloudProviderRefreshCoordinator { + public nonisolated init() {} + private struct Entry { let request: UInt64 let forced: Bool @@ -15,7 +17,7 @@ final class CloudProviderRefreshCoordinator { private var invalidation: UInt64 = 0 private var lifetime: UInt64 = 0 - func refresh(force: Bool, operation: @escaping @MainActor (Bool) async -> Bool) async -> Bool { + public func refresh(force: Bool, operation: @escaping @MainActor (Bool) async -> Bool) async -> Bool { latestRequest &+= 1 let request = latestRequest let epoch = lifetime @@ -45,9 +47,9 @@ final class CloudProviderRefreshCoordinator { return false } - func invalidate() { invalidation &+= 1 } + public func invalidate() { invalidation &+= 1 } - func cancel() { + public func cancel() { lifetime &+= 1 inFlight?.task.cancel() inFlight = nil diff --git a/Sources/Cloud/CloudTerminalAttachmentLog.swift b/Packages/macOS/CmuxCloud/Sources/CmuxCloud/Surfaces/CloudTerminalAttachmentLog.swift similarity index 87% rename from Sources/Cloud/CloudTerminalAttachmentLog.swift rename to Packages/macOS/CmuxCloud/Sources/CmuxCloud/Surfaces/CloudTerminalAttachmentLog.swift index 528dc54ec7da..84396d57316f 100644 --- a/Sources/Cloud/CloudTerminalAttachmentLog.swift +++ b/Packages/macOS/CmuxCloud/Sources/CmuxCloud/Surfaces/CloudTerminalAttachmentLog.swift @@ -10,18 +10,18 @@ import os /// report can say which terminal, which phase, and what the daemon answered. /// Machine and terminal ids are public; daemon text that could /// carry a path or a command line stays private. -struct CloudTerminalAttachmentLog: Sendable { +public struct CloudTerminalAttachmentLog: Sendable { private static let logger = Logger(subsystem: "com.cmuxterm.app", category: "CloudTerminalAttachment") /// Correlates resolver, attachment, and presentation observations for one /// attachment transaction without carrying terminal contents or payloads. - let correlationID: String + public let correlationID: String - init(correlationID: String = UUID().uuidString.lowercased()) { + public init(correlationID: String = UUID().uuidString.lowercased()) { self.correlationID = correlationID } - func resolution(machineID: String, terminalID: String, attempt: Int, outcome: CloudTuiSurfaceIDResolution) { + public func resolution(machineID: String, terminalID: String, attempt: Int, outcome: CloudTuiSurfaceIDResolution) { switch outcome { case let .resolved(surfaceID): Self.logger.info("correlation=\(correlationID, privacy: .public) resolve machine=\(machineID, privacy: .public) terminal=\(terminalID, privacy: .public) attempt=\(attempt) outcome=resolved surface=\(surfaceID)") @@ -45,11 +45,11 @@ struct CloudTerminalAttachmentLog: Sendable { } } - func projection(machineID: String, terminalID: String, placement: SurfaceRemotePlacement) { + public func projection(machineID: String, terminalID: String, placement: SurfaceRemotePlacement) { Self.logger.info("correlation=\(correlationID, privacy: .public) project machine=\(machineID, privacy: .public) terminal=\(terminalID, privacy: .public) outcome=projected workspace=\(placement.workspaceID, privacy: .public) tab=\(placement.tabID, privacy: .public)") } - func phase(machineID: String, terminalID: String, surfaceID: UInt64, phase: CloudTuiManualMirrorPhase, reason: CloudTerminalAttachmentInterruption?) { + public func phase(machineID: String, terminalID: String, surfaceID: UInt64, phase: CloudTuiManualMirrorPhase, reason: CloudTerminalAttachmentInterruption?) { let outcome: String switch phase { case .idle: outcome = "idle" @@ -61,11 +61,11 @@ struct CloudTerminalAttachmentLog: Sendable { Self.logger.info("correlation=\(correlationID, privacy: .public) phase machine=\(machineID, privacy: .public) terminal=\(terminalID, privacy: .public) surface=\(surfaceID) phase=\(String(describing: phase), privacy: .public) outcome=\(outcome, privacy: .public) reason=\(reason?.logDescription ?? "-", privacy: .public) detail=\(reason?.detail ?? "-", privacy: .private)") } - func retry(machineID: String, failures: Int, delay: Duration) { + public func retry(machineID: String, failures: Int, delay: Duration) { Self.logger.notice("correlation=\(correlationID, privacy: .public) retry machine=\(machineID, privacy: .public) failures=\(failures) outcome=scheduled delay=\(String(describing: delay), privacy: .public)") } - func giveUp(machineID: String, terminalID: String, attempts: Int, reason: String) { + public func giveUp(machineID: String, terminalID: String, attempts: Int, reason: String) { Self.logger.error("correlation=\(correlationID, privacy: .public) give-up machine=\(machineID, privacy: .public) terminal=\(terminalID, privacy: .public) attempts=\(attempts) outcome=give-up reason=\(reason, privacy: .private)") } @@ -73,7 +73,7 @@ struct CloudTerminalAttachmentLog: Sendable { /// /// Only stable identities and state labels are emitted. The rendered /// terminal contents and any command or error payload remain absent. - func presentation( + public func presentation( machineID: String, terminalID: String, destination: String, diff --git a/Sources/Surfaces/CloudTerminalAttachmentResolver.swift b/Packages/macOS/CmuxCloud/Sources/CmuxCloud/Surfaces/CloudTerminalAttachmentResolver.swift similarity index 95% rename from Sources/Surfaces/CloudTerminalAttachmentResolver.swift rename to Packages/macOS/CmuxCloud/Sources/CmuxCloud/Surfaces/CloudTerminalAttachmentResolver.swift index 39b4170032e0..3d182c7e79e7 100644 --- a/Sources/Surfaces/CloudTerminalAttachmentResolver.swift +++ b/Packages/macOS/CmuxCloud/Sources/CmuxCloud/Surfaces/CloudTerminalAttachmentResolver.swift @@ -23,16 +23,16 @@ import Foundation /// exited, no tab → a projection is needed, a tab → the compatibility tree /// joins that tab to its numeric surface. /// 3. Anything that never produced an answer is retryable. -struct CloudTerminalAttachmentResolver: Sendable { - let machineID: String - let commandRunner: any CloudTuiCommandRunning - let socketPath: String +public struct CloudTerminalAttachmentResolver: Sendable { + public let machineID: String + public let commandRunner: any CloudTuiCommandRunning + public let socketPath: String /// Deadline for each daemon round trip. The bundled client's raw bridge /// gives up after 10 s; this bound only covers a client that never starts. - var commandDeadline: Duration + public var commandDeadline: Duration private let log: CloudTerminalAttachmentLog - init( + public init( machineID: String = "", commandRunner: any CloudTuiCommandRunning, socketPath: String, @@ -48,7 +48,7 @@ struct CloudTerminalAttachmentResolver: Sendable { /// The privacy-safe identifier shared by resolver diagnostics for one /// attachment transaction. - var attachmentCorrelationID: String { log.correlationID } + public var attachmentCorrelationID: String { log.correlationID } /// The private resolver's verdict, before any snapshot fallback. enum ModernOutcome: Equatable, Sendable { @@ -62,7 +62,7 @@ struct CloudTerminalAttachmentResolver: Sendable { #else @Sendable #endif - nonisolated func resolve(terminalID: String) async -> CloudTuiSurfaceIDResolution { + public nonisolated func resolve(terminalID: String) async -> CloudTuiSurfaceIDResolution { await resolve(terminalIDs: [terminalID])[terminalID] ?? .retryable("resolver produced no outcome") } @@ -73,7 +73,7 @@ struct CloudTerminalAttachmentResolver: Sendable { #else @Sendable #endif - nonisolated func resolve(terminalIDs: Set) async -> [String: CloudTuiSurfaceIDResolution] { + public nonisolated func resolve(terminalIDs: Set) async -> [String: CloudTuiSurfaceIDResolution] { guard !terminalIDs.isEmpty else { return [:] } var results: [String: CloudTuiSurfaceIDResolution] = [:] var unserved: Set = [] diff --git a/Sources/Surfaces/CloudTerminalAttachmentRetryPolicy.swift b/Packages/macOS/CmuxCloud/Sources/CmuxCloud/Surfaces/CloudTerminalAttachmentRetryPolicy.swift similarity index 73% rename from Sources/Surfaces/CloudTerminalAttachmentRetryPolicy.swift rename to Packages/macOS/CmuxCloud/Sources/CmuxCloud/Surfaces/CloudTerminalAttachmentRetryPolicy.swift index f1d822c00984..7282bd17a88a 100644 --- a/Sources/Surfaces/CloudTerminalAttachmentRetryPolicy.swift +++ b/Packages/macOS/CmuxCloud/Sources/CmuxCloud/Surfaces/CloudTerminalAttachmentRetryPolicy.swift @@ -3,10 +3,10 @@ import Foundation /// Bounded backoff for attachment resolution. The Mac never concludes that a /// terminal is missing from a slow or busy daemon; it retries on this schedule /// and either succeeds or reports the last reason honestly. -struct CloudTerminalAttachmentRetryPolicy: Equatable, Sendable { - let delays: [Duration] +public struct CloudTerminalAttachmentRetryPolicy: Equatable, Sendable { + public let delays: [Duration] - init(delays: [Duration]) { + public init(delays: [Duration]) { precondition(!delays.isEmpty) precondition(delays.allSatisfy { $0 > .zero }) self.delays = delays @@ -14,23 +14,23 @@ struct CloudTerminalAttachmentRetryPolicy: Equatable, Sendable { /// One user-initiated open: a couple of quick retries, then a distinct /// "did not answer in time" error rather than "not created". - static let materialize = Self(delays: [.seconds(1), .seconds(2)]) + public static let materialize = Self(delays: [.seconds(1), .seconds(2)]) /// An already-open pane: keep trying at a bounded interval for as long as /// the pane exists, so recovery never depends on an external edge. - static let background = Self(delays: [ + public static let background = Self(delays: [ .seconds(1), .seconds(2), .seconds(4), .seconds(8), .seconds(15), .seconds(30), ]) /// The wait before the next attempt after `failures` consecutive failures, /// or nil once the schedule is exhausted. - func boundedDelay(afterFailures failures: Int) -> Duration? { + public func boundedDelay(afterFailures failures: Int) -> Duration? { guard failures > 0, failures <= delays.count else { return nil } return delays[failures - 1] } /// The wait before the next attempt, holding the last delay forever. - func cappedDelay(afterFailures failures: Int) -> Duration { + public func cappedDelay(afterFailures failures: Int) -> Duration { delays[min(max(failures, 1), delays.count) - 1] } } diff --git a/Sources/Surfaces/CloudTerminalAttachmentRetryScheduler.swift b/Packages/macOS/CmuxCloud/Sources/CmuxCloud/Surfaces/CloudTerminalAttachmentRetryScheduler.swift similarity index 84% rename from Sources/Surfaces/CloudTerminalAttachmentRetryScheduler.swift rename to Packages/macOS/CmuxCloud/Sources/CmuxCloud/Surfaces/CloudTerminalAttachmentRetryScheduler.swift index a68b5772cd35..4c2f51030cf7 100644 --- a/Sources/Surfaces/CloudTerminalAttachmentRetryScheduler.swift +++ b/Packages/macOS/CmuxCloud/Sources/CmuxCloud/Surfaces/CloudTerminalAttachmentRetryScheduler.swift @@ -8,13 +8,13 @@ import Foundation /// arms one retry; a successful pass resets the count. The delay is a genuine /// wait, driven by an injected clock so tests advance virtual time. @MainActor -final class CloudTerminalAttachmentRetryScheduler { +public final class CloudTerminalAttachmentRetryScheduler { private let policy: CloudTerminalAttachmentRetryPolicy private let clock: any Clock private var task: Task? - private(set) var failures = 0 + public private(set) var failures = 0 - init( + public init( policy: CloudTerminalAttachmentRetryPolicy = .background, clock: any Clock = ContinuousClock() ) { @@ -23,12 +23,12 @@ final class CloudTerminalAttachmentRetryScheduler { } /// Whether a retry is armed and has not fired yet. - var isPending: Bool { task != nil } + public var isPending: Bool { task != nil } /// Records a failed pass and arms `retry` after the policy's delay. An /// armed retry is replaced, never duplicated. Returns the delay chosen. @discardableResult - func scheduleRetry(_ retry: @escaping @MainActor () -> Void) -> Duration { + public func scheduleRetry(_ retry: @escaping @MainActor () -> Void) -> Duration { failures += 1 let delay = policy.cappedDelay(afterFailures: failures) task?.cancel() @@ -46,13 +46,13 @@ final class CloudTerminalAttachmentRetryScheduler { } /// A successful pass: nothing to retry, and the backoff starts over. - func reset() { + public func reset() { task?.cancel() task = nil failures = 0 } - func cancel() { + public func cancel() { task?.cancel() task = nil } diff --git a/Sources/Surfaces/CloudTerminalCreationReceipt.swift b/Packages/macOS/CmuxCloud/Sources/CmuxCloud/Surfaces/CloudTerminalCreationReceipt.swift similarity index 84% rename from Sources/Surfaces/CloudTerminalCreationReceipt.swift rename to Packages/macOS/CmuxCloud/Sources/CmuxCloud/Surfaces/CloudTerminalCreationReceipt.swift index 6e9d414d9f57..a43d484a0d0a 100644 --- a/Sources/Surfaces/CloudTerminalCreationReceipt.swift +++ b/Packages/macOS/CmuxCloud/Sources/CmuxCloud/Surfaces/CloudTerminalCreationReceipt.swift @@ -5,15 +5,17 @@ import Foundation /// Waiting for this receipt preserves parent geometry without serializing unrelated /// terminals. A failed parent settles its children; explicit retry opens a new attempt. @MainActor -final class CloudTerminalCreationReceipt { +public final class CloudTerminalCreationReceipt { + public nonisolated init() {} + private var result: Result? private var waiters: [UUID: CheckedContinuation] = [:] - func beginAttempt() { + public func beginAttempt() { if case .failure = result { result = nil } } - func finish(_ result: Result) { + public func finish(_ result: Result) { guard self.result == nil else { return } self.result = result let pending = Array(waiters.values) @@ -21,7 +23,7 @@ final class CloudTerminalCreationReceipt { for waiter in pending { waiter.resume(with: result) } } - func value() async throws -> SurfaceResource { + public func value() async throws -> SurfaceResource { try Task.checkCancellation() if let result { return try result.get() } let id = UUID() diff --git a/Sources/Cloud/CloudTerminalCreationRequest.swift b/Packages/macOS/CmuxCloud/Sources/CmuxCloud/Surfaces/CloudTerminalCreationRequest.swift similarity index 86% rename from Sources/Cloud/CloudTerminalCreationRequest.swift rename to Packages/macOS/CmuxCloud/Sources/CmuxCloud/Surfaces/CloudTerminalCreationRequest.swift index bc68f3b6360f..bb4e9a3e8ae2 100644 --- a/Sources/Cloud/CloudTerminalCreationRequest.swift +++ b/Packages/macOS/CmuxCloud/Sources/CmuxCloud/Surfaces/CloudTerminalCreationRequest.swift @@ -9,16 +9,16 @@ import Foundation /// retry reads the durable receipt, once; no polling or automatic recreation /// runs behind a pending pane. @MainActor -final class CloudTerminalCreationRequest { - let id: UUID - let commandOverride: [String]? - private(set) var remoteWorkspaceID: String? - let correlationKey: String - private(set) var attemptKey: String +public final class CloudTerminalCreationRequest { + public let id: UUID + public let commandOverride: [String]? + public private(set) var remoteWorkspaceID: String? + public let correlationKey: String + public private(set) var attemptKey: String private var submitted = false private var adoptsDurableAttempt = false - init(id: UUID = UUID(), remoteWorkspaceID: String? = nil, commandOverride: [String]? = nil, restoring: Bool = false) { + public init(id: UUID = UUID(), remoteWorkspaceID: String? = nil, commandOverride: [String]? = nil, restoring: Bool = false) { self.id = id self.commandOverride = commandOverride self.remoteWorkspaceID = remoteWorkspaceID @@ -30,17 +30,17 @@ final class CloudTerminalCreationRequest { } /// Binds the immutable Cloud workspace before the first daemon mutation. - func bind(remoteWorkspaceID: String) { + public func bind(remoteWorkspaceID: String) { guard !submitted else { return } self.remoteWorkspaceID = remoteWorkspaceID } /// First attempts omit the additive correlation flag for older daemons. /// A new-key retry uses it only after the daemon explicitly authorizes one. - var correlationArgument: String? { attemptKey == correlationKey ? nil : correlationKey } + public var correlationArgument: String? { attemptKey == correlationKey ? nil : correlationKey } /// Returns an existing terminal, or authorizes exactly one mutation attempt. - func prepare( + public func prepare( using runner: any CloudTuiCommandRunning, socketPath: String ) async throws -> CmuxTuiSnapshotParser.CreatedTerminalPath? { diff --git a/Packages/macOS/CmuxCloud/Sources/CmuxCloud/Surfaces/CloudTerminalLayoutCreationResult.swift b/Packages/macOS/CmuxCloud/Sources/CmuxCloud/Surfaces/CloudTerminalLayoutCreationResult.swift new file mode 100644 index 000000000000..253f3e8d6062 --- /dev/null +++ b/Packages/macOS/CmuxCloud/Sources/CmuxCloud/Surfaces/CloudTerminalLayoutCreationResult.swift @@ -0,0 +1,15 @@ +import CmuxSurfaceCatalogModel + +/// The daemon's creation receipt and the source snapshot's workspace identity. +public struct CloudTerminalLayoutCreationResult: Sendable { + public init( + created: CmuxTuiSnapshotParser.CreatedTerminalPath, + workspaceID: String + ) { + self.created = created + self.workspaceID = workspaceID + } + + public let created: CmuxTuiSnapshotParser.CreatedTerminalPath + public let workspaceID: String +} diff --git a/Sources/Surfaces/CloudTerminalMutationCommandRunner.swift b/Packages/macOS/CmuxCloud/Sources/CmuxCloud/Surfaces/CloudTerminalMutationCommandRunner.swift similarity index 71% rename from Sources/Surfaces/CloudTerminalMutationCommandRunner.swift rename to Packages/macOS/CmuxCloud/Sources/CmuxCloud/Surfaces/CloudTerminalMutationCommandRunner.swift index 3a708de70674..c23c87db0d2d 100644 --- a/Sources/Surfaces/CloudTerminalMutationCommandRunner.swift +++ b/Packages/macOS/CmuxCloud/Sources/CmuxCloud/Surfaces/CloudTerminalMutationCommandRunner.swift @@ -4,11 +4,19 @@ import Foundation /// Fences each terminal mutation transport call to its admitted provider lifecycle. @MainActor -struct CloudTerminalMutationCommandRunner: CloudTuiCommandRunning { - let base: any CloudTuiCommandRunning - let validate: @MainActor @Sendable () throws -> Void +public struct CloudTerminalMutationCommandRunner: CloudTuiCommandRunning { + public init( + base: any CloudTuiCommandRunning, + validate: @escaping @MainActor @Sendable () throws -> Void + ) { + self.base = base + self.validate = validate + } + + public let base: any CloudTuiCommandRunning + public let validate: @MainActor @Sendable () throws -> Void - func runTuiCommand(arguments: CloudTuiRequest, deadline: Duration) async throws -> Data { + public func runTuiCommand(arguments: CloudTuiRequest, deadline: Duration) async throws -> Data { try validate() do { let data: Data diff --git a/Sources/Surfaces/CloudTerminalMutationQueue.swift b/Packages/macOS/CmuxCloud/Sources/CmuxCloud/Surfaces/CloudTerminalMutationQueue.swift similarity index 90% rename from Sources/Surfaces/CloudTerminalMutationQueue.swift rename to Packages/macOS/CmuxCloud/Sources/CmuxCloud/Surfaces/CloudTerminalMutationQueue.swift index 2abc44a2fbea..7ccbae9f2284 100644 --- a/Sources/Surfaces/CloudTerminalMutationQueue.swift +++ b/Packages/macOS/CmuxCloud/Sources/CmuxCloud/Surfaces/CloudTerminalMutationQueue.swift @@ -5,14 +5,16 @@ import Foundation /// The daemon revision covers the whole machine, including other workspaces. /// Every create keeps its turn through snapshot, mutation, and receipt handling. @MainActor -final class CloudTerminalMutationQueue { +public final class CloudTerminalMutationQueue { + public nonisolated init() {} + private var tail: Task? private var tailID: UUID? private var cancellations: [UUID: @Sendable () -> Void] = [:] /// Reserves an ordered turn synchronously, before the operation can suspend. /// A cancelled turn still waits for its predecessor before releasing successors. - func enqueue( + public func enqueue( _ operation: @escaping @MainActor @Sendable () async throws -> Value ) -> Task { let previous = tail @@ -38,18 +40,18 @@ final class CloudTerminalMutationQueue { } /// Invalidates every admitted turn but retains their ordering until active work drains. - func cancelAll() { + public func cancelAll() { for cancel in cancellations.values { cancel() } } /// Joins local admitted work through its bounded response lifetime. /// Timeout or transport loss leaves the remote outcome unknown; this does not promise rollback. - func waitForIdle() async { + public func waitForIdle() async { await tail?.value } /// Propagates caller cancellation without cancelling another intent's turn. - func run( + public func run( _ operation: @escaping @MainActor @Sendable () async throws -> Value ) async throws -> Value { try Task.checkCancellation() diff --git a/Sources/Surfaces/CloudTerminalPaneClosure.swift b/Packages/macOS/CmuxCloud/Sources/CmuxCloud/Surfaces/CloudTerminalPaneClosure.swift similarity index 83% rename from Sources/Surfaces/CloudTerminalPaneClosure.swift rename to Packages/macOS/CmuxCloud/Sources/CmuxCloud/Surfaces/CloudTerminalPaneClosure.swift index 0fe023a41e01..b8ea008f5131 100644 --- a/Sources/Surfaces/CloudTerminalPaneClosure.swift +++ b/Packages/macOS/CmuxCloud/Sources/CmuxCloud/Surfaces/CloudTerminalPaneClosure.swift @@ -7,7 +7,8 @@ import Foundation /// the daemon drops the terminal from its graph, and the pane is the only /// thing left holding it open. Closing is driven by the accepted graph, so the /// rule lives here instead of inside the provider's refresh. -enum CloudTerminalPaneClosure { +/// lint:allow namespace-type: moved unchanged from the app target, where it was an internal static namespace; reshaping it is a separate change from this package move. +public enum CloudTerminalPaneClosure { /// Panels whose bound terminal is gone from an authoritative graph. /// /// - Parameters: @@ -16,7 +17,7 @@ enum CloudTerminalPaneClosure { /// - freshness: whether that graph is current. A stale graph means the /// machine is unreachable, not that a terminal ended, so nothing closes. /// - Returns: panel ids in a stable order. - static func panelsToClose( + public static func panelsToClose( boundTerminals: [UUID: String], liveTerminalKeys: Set, freshness: CloudVMStateFreshness diff --git a/Sources/Surfaces/CloudTerminalSourcePlacement.swift b/Packages/macOS/CmuxCloud/Sources/CmuxCloud/Surfaces/CloudTerminalSourcePlacement.swift similarity index 83% rename from Sources/Surfaces/CloudTerminalSourcePlacement.swift rename to Packages/macOS/CmuxCloud/Sources/CmuxCloud/Surfaces/CloudTerminalSourcePlacement.swift index 8ccc6db4f69a..801dec958a81 100644 --- a/Sources/Surfaces/CloudTerminalSourcePlacement.swift +++ b/Packages/macOS/CmuxCloud/Sources/CmuxCloud/Surfaces/CloudTerminalSourcePlacement.swift @@ -7,14 +7,14 @@ import Foundation /// A pending pane is a real terminal surface before its catalog projection exists. /// Keeping its machine and remote workspace here lets the next split/new-terminal /// action inherit the same placement even when focus has moved to that pane. -struct CloudTerminalSourcePlacement: Sendable { - let machine: SurfaceMachineID - let resource: SurfaceResource? - let remoteWorkspaceID: String? - let remoteTabID: String? - let pendingCreation: CloudTerminalCreationReceipt? +public struct CloudTerminalSourcePlacement: Sendable { + public let machine: SurfaceMachineID + public let resource: SurfaceResource? + public let remoteWorkspaceID: String? + public let remoteTabID: String? + public let pendingCreation: CloudTerminalCreationReceipt? - init( + public init( machine: SurfaceMachineID, resource: SurfaceResource? = nil, remoteWorkspaceID: String? = nil, @@ -30,7 +30,7 @@ struct CloudTerminalSourcePlacement: Sendable { /// Resolve the pending source's own tab, never its ancestor's layout anchor. @MainActor - func resolved() async throws -> CloudTerminalSourcePlacement { + public func resolved() async throws -> CloudTerminalSourcePlacement { guard let pendingCreation else { return self } let created = try await pendingCreation.value() let view = try remoteView(of: created) @@ -48,7 +48,7 @@ struct CloudTerminalSourcePlacement: Sendable { } /// A receipt is accepted only for this machine and captured remote workspace. - func validate(created: SurfaceResource) throws { + public func validate(created: SurfaceResource) throws { guard created.machine == machine, created.kind == .terminal else { throw CloudDiagnosticFailure.placement } @@ -65,7 +65,7 @@ struct CloudTerminalSourcePlacement: Sendable { } } - func remoteView(of created: SurfaceResource) throws -> SurfaceRemoteView? { + public func remoteView(of created: SurfaceResource) throws -> SurfaceRemoteView? { try validate(created: created) let views = (created.remoteViews ?? []).filter { remoteWorkspaceID == nil || $0.workspace.id == remoteWorkspaceID diff --git a/Sources/Cloud/CloudTuiDaemonAnswer.swift b/Packages/macOS/CmuxCloud/Sources/CmuxCloud/Surfaces/CloudTuiDaemonAnswer.swift similarity index 95% rename from Sources/Cloud/CloudTuiDaemonAnswer.swift rename to Packages/macOS/CmuxCloud/Sources/CmuxCloud/Surfaces/CloudTuiDaemonAnswer.swift index c9e14b9e573d..5c91168254ab 100644 --- a/Sources/Cloud/CloudTuiDaemonAnswer.swift +++ b/Packages/macOS/CmuxCloud/Sources/CmuxCloud/Surfaces/CloudTuiDaemonAnswer.swift @@ -7,7 +7,7 @@ import Foundation /// rejects a request, and plain transport text when the daemon never answered. /// A resolver must keep the two apart: a rejection is an authoritative answer /// about the request, a transport failure says nothing about the terminal. -enum CloudTuiDaemonAnswer: Equatable, Sendable { +public enum CloudTuiDaemonAnswer: Equatable, Sendable { /// The daemon answered and refused the request with this code. case rejected(String) /// No answer arrived: a connect or read timeout, a closed transport, the @@ -16,7 +16,7 @@ enum CloudTuiDaemonAnswer: Equatable, Sendable { /// Failure text the app does not recognize. case unrecognized(String) - init(error: any Error) { + public init(error: any Error) { if error is CancellationError { self = .transportFailure("cancelled") return @@ -41,13 +41,13 @@ enum CloudTuiDaemonAnswer: Equatable, Sendable { /// is in the wrong space (`invalid_terminal_id`), unknown as a host id /// (`terminal_not_found`), or the daemon predates the resolver. The caller /// then reads the authoritative public snapshot instead of failing closed. - var cannotServeTerminalID: Bool { + public var cannotServeTerminalID: Bool { guard case let .rejected(code) = self else { return false } return Self.unservableCodes.contains(code) || code.lowercased().contains("unknown command") } /// Whether retrying later can change the answer. - var isRetryable: Bool { + public var isRetryable: Bool { switch self { case .transportFailure, .unrecognized: return true @@ -57,7 +57,7 @@ enum CloudTuiDaemonAnswer: Equatable, Sendable { } /// One short reason for private diagnostic logs. - var reason: String { + public var reason: String { switch self { case let .rejected(code): return code diff --git a/Sources/Surfaces/CloudTuiSurfaceIDResolution.swift b/Packages/macOS/CmuxCloud/Sources/CmuxCloud/Surfaces/CloudTuiSurfaceIDResolution.swift similarity index 91% rename from Sources/Surfaces/CloudTuiSurfaceIDResolution.swift rename to Packages/macOS/CmuxCloud/Sources/CmuxCloud/Surfaces/CloudTuiSurfaceIDResolution.swift index 3f628b539567..cbf9ac77b5b5 100644 --- a/Sources/Surfaces/CloudTuiSurfaceIDResolution.swift +++ b/Packages/macOS/CmuxCloud/Sources/CmuxCloud/Surfaces/CloudTuiSurfaceIDResolution.swift @@ -5,7 +5,7 @@ import Foundation /// Every outcome is an authoritative statement or an explicit "try again": /// a transport deadline or an unusable answer is `retryable`, never "missing", /// because the terminal may well be alive on the machine. -enum CloudTuiSurfaceIDResolution: Equatable, Sendable { +public enum CloudTuiSurfaceIDResolution: Equatable, Sendable { case resolved(UInt64) /// The terminal is alive but no daemon view shows it. Project one, then /// resolve again. @@ -18,13 +18,13 @@ enum CloudTuiSurfaceIDResolution: Equatable, Sendable { case retryable(String, failure: Failure = .notReady) /// Safe display categories; free-form daemon diagnostics stay in private logs. - enum Failure: Equatable, Sendable { + public enum Failure: Equatable, Sendable { case transportUnavailable case invalidResponse case rejected case notReady - var localizedDescription: String { + public var localizedDescription: String { switch self { case .transportUnavailable: return String(localized: "cloudTree.attachmentFailure.transportUnavailable", defaultValue: "the connection is unavailable") diff --git a/Sources/Surfaces/CloudWorkspaceProjectionPlan.swift b/Packages/macOS/CmuxCloud/Sources/CmuxCloud/Surfaces/CloudWorkspaceProjectionPlan.swift similarity index 86% rename from Sources/Surfaces/CloudWorkspaceProjectionPlan.swift rename to Packages/macOS/CmuxCloud/Sources/CmuxCloud/Surfaces/CloudWorkspaceProjectionPlan.swift index b3004dd648e1..77938c0d29cf 100644 --- a/Sources/Surfaces/CloudWorkspaceProjectionPlan.swift +++ b/Packages/macOS/CmuxCloud/Sources/CmuxCloud/Surfaces/CloudWorkspaceProjectionPlan.swift @@ -3,11 +3,11 @@ import Foundation /// Exact daemon tab identities determine membership; a shared terminal process /// can have several independent views, and closing one never closes the others. -struct CloudWorkspaceProjectionPlan { - let missing: [SurfaceResourcePlacement] - let obsolete: [SurfaceProjection] +public struct CloudWorkspaceProjectionPlan { + public let missing: [SurfaceResourcePlacement] + public let obsolete: [SurfaceProjection] - init(desired: [SurfaceResourcePlacement], existing: [SurfaceProjection]) { + public init(desired: [SurfaceResourcePlacement], existing: [SurfaceProjection]) { let wanted = Set(desired) var seen = Set() var obsolete: [SurfaceProjection] = [] diff --git a/Packages/macOS/CmuxCloud/Sources/CmuxCloud/Surfaces/CloudWorkspaceProjectionTask.swift b/Packages/macOS/CmuxCloud/Sources/CmuxCloud/Surfaces/CloudWorkspaceProjectionTask.swift new file mode 100644 index 000000000000..fcbe87943073 --- /dev/null +++ b/Packages/macOS/CmuxCloud/Sources/CmuxCloud/Surfaces/CloudWorkspaceProjectionTask.swift @@ -0,0 +1,16 @@ +import Foundation + +/// Identity fences a cancelled worker's cleanup from a replacement worker. +@MainActor +public struct CloudWorkspaceProjectionTask { + public init( + id: UUID, + task: Task + ) { + self.id = id + self.task = task + } + + public let id: UUID + public let task: Task +} diff --git a/Sources/Surfaces/CmuxTuiSnapshotParser+Displays.swift b/Packages/macOS/CmuxCloud/Sources/CmuxCloud/Surfaces/CmuxTuiSnapshotParser+Displays.swift similarity index 88% rename from Sources/Surfaces/CmuxTuiSnapshotParser+Displays.swift rename to Packages/macOS/CmuxCloud/Sources/CmuxCloud/Surfaces/CmuxTuiSnapshotParser+Displays.swift index e1b5b7a81d13..caa4164a9cf6 100644 --- a/Sources/Surfaces/CmuxTuiSnapshotParser+Displays.swift +++ b/Packages/macOS/CmuxCloud/Sources/CmuxCloud/Surfaces/CmuxTuiSnapshotParser+Displays.swift @@ -5,7 +5,7 @@ extension CmuxTuiSnapshotParser { /// The machine's display list after a snapshot: a display the daemon's workspaces point /// at (carrying its views) replaces the bare pool entry of the same id; every other /// resource passes through. Pure, so the provider's refresh stays a straight line. - static func mergingDisplays(pool: [SurfaceResource], parsed: [SurfaceResource]) -> [SurfaceResource] { + public static func mergingDisplays(pool: [SurfaceResource], parsed: [SurfaceResource]) -> [SurfaceResource] { let pointed = Set(parsed.filter { $0.kind == .display }.map(\.id)) let targets = Dictionary(pool.filter { $0.kind == .display }.map { ($0.id, $0) }, uniquingKeysWith: { first, _ in first }) return pool.filter { !($0.kind == .display && pointed.contains($0.id)) } + parsed.map { resource in diff --git a/Sources/Surfaces/CmuxTuiSnapshotParser+Placement.swift b/Packages/macOS/CmuxCloud/Sources/CmuxCloud/Surfaces/CmuxTuiSnapshotParser+Placement.swift similarity index 92% rename from Sources/Surfaces/CmuxTuiSnapshotParser+Placement.swift rename to Packages/macOS/CmuxCloud/Sources/CmuxCloud/Surfaces/CmuxTuiSnapshotParser+Placement.swift index e9fd378bfda6..7f049dbf2da5 100644 --- a/Sources/Surfaces/CmuxTuiSnapshotParser+Placement.swift +++ b/Packages/macOS/CmuxCloud/Sources/CmuxCloud/Surfaces/CmuxTuiSnapshotParser+Placement.swift @@ -9,7 +9,7 @@ extension CmuxTuiSnapshotParser { #else @Sendable #endif - nonisolated static func terminalPlacement(from data: Data, terminalID: String) async -> (placement: SurfaceRemotePlacement?, revision: String?)? { + public nonisolated static func terminalPlacement(from data: Data, terminalID: String) async -> (placement: SurfaceRemotePlacement?, revision: String?)? { guard let snapshot = try? JSONSerialization.jsonObject(with: data) as? [String: Any], authoritativeGraphIsValid(snapshot), let terminals = snapshot["terminals"] as? [[String: Any]], @@ -34,7 +34,7 @@ extension CmuxTuiSnapshotParser { #else @Sendable #endif - nonisolated static func placedTab( + public nonisolated static func placedTab( from data: Data, at target: CloudTuiTerminalProjectionTarget, tabID: String? = nil, @@ -57,7 +57,7 @@ extension CmuxTuiSnapshotParser { #else @Sendable #endif - nonisolated static func tabPlacement(from data: Data, tabID: String) async -> (workspaceID: String?, revision: String)? { + public nonisolated static func tabPlacement(from data: Data, tabID: String) async -> (workspaceID: String?, revision: String)? { guard let snapshot = try? JSONSerialization.jsonObject(with: data) as? [String: Any], authoritativeGraphIsValid(snapshot), let revision = resourceRevision(from: snapshot), @@ -75,7 +75,7 @@ extension CmuxTuiSnapshotParser { /// `terminalProjectionTarget(from:)` held to one workspace: its focused screen and pane /// (explicit indexes first, daemon order otherwise), appended after that pane's tabs. /// nil when the workspace is not in the snapshot or has no live pane. - static func projectionTarget(from snapshot: [String: Any], inWorkspace workspaceID: String) -> CloudTuiTerminalProjectionTarget? { + public static func projectionTarget(from snapshot: [String: Any], inWorkspace workspaceID: String) -> CloudTuiTerminalProjectionTarget? { guard authoritativeGraphIsValid(snapshot), let workspaces = snapshot["workspaces"] as? [[String: Any]], workspaces.contains(where: { ($0["id"] as? String) == workspaceID }) else { return nil } @@ -118,7 +118,7 @@ extension CmuxTuiSnapshotParser { #else @Sendable #endif - nonisolated static func terminalProjectionTarget( + public nonisolated static func terminalProjectionTarget( from data: Data, preferringWorkspace workspaceID: String? ) async -> (target: CloudTuiTerminalProjectionTarget, revision: String?)? { diff --git a/Packages/macOS/CmuxCloud/Sources/CmuxCloud/Surfaces/CurrentWorkInput.swift b/Packages/macOS/CmuxCloud/Sources/CmuxCloud/Surfaces/CurrentWorkInput.swift new file mode 100644 index 000000000000..d8e2185d3691 --- /dev/null +++ b/Packages/macOS/CmuxCloud/Sources/CmuxCloud/Surfaces/CurrentWorkInput.swift @@ -0,0 +1,47 @@ +import CmuxSurfaceCatalogModel +import Foundation + +/// Immutable capture for the pure current-work reduction; never persisted as a graph. +public struct CurrentWorkInput: Sendable { + public init( + export: SurfaceCatalogExport, + observedAt: Date, + workspaces: [UUID: WorkspaceFacts], + agentsByPanelID: [UUID: [CurrentWorkSnapshot.Agent]], + unreadPanelIDs: Set, + agentOwnerAvailable: Bool + ) { + self.export = export + self.observedAt = observedAt + self.workspaces = workspaces + self.agentsByPanelID = agentsByPanelID + self.unreadPanelIDs = unreadPanelIDs + self.agentOwnerAvailable = agentOwnerAvailable + } + + public var export: SurfaceCatalogExport + public var observedAt: Date + public var workspaces: [UUID: WorkspaceFacts] + public var agentsByPanelID: [UUID: [CurrentWorkSnapshot.Agent]] + public var unreadPanelIDs: Set + public var agentOwnerAvailable: Bool + + public struct WorkspaceFacts: Sendable { + public init( + projectRoot: String?, + unreadCount: Int, + notificationID: UUID?, + pullRequests: [CurrentWorkSnapshot.PullRequest] + ) { + self.projectRoot = projectRoot + self.unreadCount = unreadCount + self.notificationID = notificationID + self.pullRequests = pullRequests + } + + public var projectRoot: String? + public var unreadCount: Int + public var notificationID: UUID? + public var pullRequests: [CurrentWorkSnapshot.PullRequest] + } +} diff --git a/Packages/macOS/CmuxCloud/Sources/CmuxCloud/Surfaces/CurrentWorkSnapshot.swift b/Packages/macOS/CmuxCloud/Sources/CmuxCloud/Surfaces/CurrentWorkSnapshot.swift new file mode 100644 index 000000000000..b71a7766536c --- /dev/null +++ b/Packages/macOS/CmuxCloud/Sources/CmuxCloud/Surfaces/CurrentWorkSnapshot.swift @@ -0,0 +1,284 @@ +import CmuxSurfaceCatalogModel +import Foundation + +/// A bounded, read-only projection of existing work owners for CLI and Find Work. +public struct CurrentWorkSnapshot: Codable, Sendable { + public init( + observedAt: String, + totalObserved: Int, + truncated: Bool, + ownerAvailability: [String: String], + items: [Item] + ) { + self.observedAt = observedAt + self.totalObserved = totalObserved + self.truncated = truncated + self.ownerAvailability = ownerAvailability + self.items = items + } + + public var schemaVersion = 1 + public var authority = "read_only_projection" + public var observedAt: String + public var totalObserved: Int + public var truncated: Bool + public var ownerAvailability: [String: String] + var unsupportedFacts = ["durable_work_identity", "review_threads", "check_runs", "review_dispositions"] + public var items: [Item] + + public struct Evidence: Codable, Sendable { + public init( + owner: String, + reference: String, + observedAt: String + ) { + self.owner = owner + self.reference = reference + self.observedAt = observedAt + } + + public var owner: String + public var reference: String + public var observedAt: String + } + + public struct Freshness: Codable, Sendable { + public init( + state: String, + reason: String?, + observedAt: String + ) { + self.state = state + self.reason = reason + self.observedAt = observedAt + } + + public var state: String + public var reason: String? + /// Time this owner state was read, not the time a remote graph was produced. + public var observedAt: String + } + + public struct Placement: Codable, Sendable { + public init( + kind: String, + machine: String + ) { + self.kind = kind + self.machine = machine + } + + public var kind: String + public var machine: String + } + + public struct Projection: Codable, Sendable { + public init( + resourceRef: String, + workspaceID: UUID, + panelID: UUID, + stableSurfaceID: UUID?, + stableWorkspaceID: UUID?, + remoteWorkspaceID: String?, + remoteTabID: String? + ) { + self.resourceRef = resourceRef + self.workspaceID = workspaceID + self.panelID = panelID + self.stableSurfaceID = stableSurfaceID + self.stableWorkspaceID = stableWorkspaceID + self.remoteWorkspaceID = remoteWorkspaceID + self.remoteTabID = remoteTabID + } + + public var resourceRef: String + public var workspaceID: UUID + public var panelID: UUID + public var stableSurfaceID: UUID? + public var stableWorkspaceID: UUID? + public var remoteWorkspaceID: String? + public var remoteTabID: String? + } + + public struct Agent: Codable, Sendable { + public init( + sessionID: String?, + kind: String?, + state: String, + hasHookLifecycleState: Bool, + version: Int?, + lastActivityAt: String?, + evidence: Evidence + ) { + self.sessionID = sessionID + self.kind = kind + self.state = state + self.hasHookLifecycleState = hasHookLifecycleState + self.version = version + self.lastActivityAt = lastActivityAt + self.evidence = evidence + } + + public var sessionID: String? + public var kind: String? + public var state: String + public var hasHookLifecycleState: Bool + public var version: Int? + public var lastActivityAt: String? + public var evidence: Evidence + } + + public struct Attention: Codable, Sendable { + public init( + kind: String, + scope: String, + evidence: Evidence + ) { + self.kind = kind + self.scope = scope + self.evidence = evidence + } + + public var kind: String + public var scope: String + public var evidence: Evidence + } + + public struct PullRequest: Codable, Sendable { + public init( + number: Int, + url: String, + label: String, + status: String, + workspaceID: UUID, + freshness: Freshness, + evidence: Evidence + ) { + self.number = number + self.url = url + self.label = label + self.status = status + self.workspaceID = workspaceID + self.freshness = freshness + self.evidence = evidence + } + + public var number: Int + public var url: String + public var label: String + public var status: String + public var associationScope = "workspace" + public var workspaceID: UUID + public var freshness: Freshness + public var evidence: Evidence + } + + public struct Obligation: Codable, Sendable { + public init( + kind: String, + freshness: Freshness, + evidence: Evidence + ) { + self.kind = kind + self.freshness = freshness + self.evidence = evidence + } + + public var kind: String + var possibleHumanObligation = true + public var freshness: Freshness + public var evidence: Evidence + } + + public struct Receipt: Codable, Sendable { + public init( + kind: String, + cursor: CloudVMCursor?, + evidence: Evidence + ) { + self.kind = kind + self.cursor = cursor + self.evidence = evidence + } + + public var kind: String + public var cursor: CloudVMCursor? + public var evidence: Evidence + } + + public struct Item: Codable, Sendable { + public init( + resourceRef: String, + durableSurfaceID: UUID?, + label: String, + kind: String, + lifecycle: String, + placement: Placement, + projections: [Projection], + cwd: String?, + projectHints: [String], + repositoryHints: [String], + agents: [Agent], + attention: [Attention], + pullRequests: [PullRequest], + freshness: Freshness, + cursor: CloudVMCursor?, + receiptRefs: [Receipt], + possibleHumanObligations: [Obligation], + evidence: [Evidence], + omitted: [String: Int] + ) { + self.resourceRef = resourceRef + self.durableSurfaceID = durableSurfaceID + self.label = label + self.kind = kind + self.lifecycle = lifecycle + self.placement = placement + self.projections = projections + self.cwd = cwd + self.projectHints = projectHints + self.repositoryHints = repositoryHints + self.agents = agents + self.attention = attention + self.pullRequests = pullRequests + self.freshness = freshness + self.cursor = cursor + self.receiptRefs = receiptRefs + self.possibleHumanObligations = possibleHumanObligations + self.evidence = evidence + self.omitted = omitted + } + + public var resourceRef: String + /// Only a local resource can inherit its single durable surface identity. + public var durableSurfaceID: UUID? + public var label: String + public var kind: String + public var lifecycle: String + public var placement: Placement + public var projections: [Projection] + public var cwd: String? + public var projectHints: [String] + public var repositoryHints: [String] + public var agents: [Agent] + public var attention: [Attention] + public var pullRequests: [PullRequest] + public var freshness: Freshness + public var cursor: CloudVMCursor? + public var receiptRefs: [Receipt] + public var possibleHumanObligations: [Obligation] + public var evidence: [Evidence] + public var omitted: [String: Int] + } + + /// The socket and human consumers receive this same schema, without runtime owners. + public func jsonObject() throws -> [String: Any] { + let encoder = JSONEncoder() + encoder.keyEncodingStrategy = .convertToSnakeCase + let data = try encoder.encode(self) + guard data.count <= 2_000_000 else { + throw SurfaceCatalogError.unsupported("Current-work response exceeds 2 MB; request a smaller limit") + } + return try JSONSerialization.jsonObject(with: data) as? [String: Any] ?? [:] + } +} diff --git a/Sources/Surfaces/SurfaceCatalogSnapshot+DeviceVisibility.swift b/Packages/macOS/CmuxCloud/Sources/CmuxCloud/Surfaces/SurfaceCatalogSnapshot+DeviceVisibility.swift similarity index 95% rename from Sources/Surfaces/SurfaceCatalogSnapshot+DeviceVisibility.swift rename to Packages/macOS/CmuxCloud/Sources/CmuxCloud/Surfaces/SurfaceCatalogSnapshot+DeviceVisibility.swift index 351e49879bad..9770354ca0e3 100644 --- a/Sources/Surfaces/SurfaceCatalogSnapshot+DeviceVisibility.swift +++ b/Packages/macOS/CmuxCloud/Sources/CmuxCloud/Surfaces/SurfaceCatalogSnapshot+DeviceVisibility.swift @@ -3,7 +3,7 @@ import Foundation extension SurfaceCatalogSnapshot { /// Hides sidebar rows without destroying providers or already-open remote panes. - func applyingDeviceVisibility( + public func applyingDeviceVisibility( includesCloud: Bool, includesDevices: Bool, hiddenMacIDs: Set diff --git a/Sources/Surfaces/SurfaceOwnershipPolicy.swift b/Packages/macOS/CmuxCloud/Sources/CmuxCloud/Surfaces/SurfaceOwnershipPolicy.swift similarity index 50% rename from Sources/Surfaces/SurfaceOwnershipPolicy.swift rename to Packages/macOS/CmuxCloud/Sources/CmuxCloud/Surfaces/SurfaceOwnershipPolicy.swift index 2db76483b24f..810c4260d174 100644 --- a/Sources/Surfaces/SurfaceOwnershipPolicy.swift +++ b/Packages/macOS/CmuxCloud/Sources/CmuxCloud/Surfaces/SurfaceOwnershipPolicy.swift @@ -2,19 +2,25 @@ import CmuxSurfaceCatalogModel import Foundation /// A destination's ownership rule, independent of UI, drag payloads, and I/O. -struct SurfaceOwnershipPolicy: Equatable, Sendable { - let cloudMachine: SurfaceMachineID? +public struct SurfaceOwnershipPolicy: Equatable, Sendable { + public init( + cloudMachine: SurfaceMachineID? + ) { + self.cloudMachine = cloudMachine + } + + public let cloudMachine: SurfaceMachineID? - func rejection(for source: SurfaceMachineID?) -> SurfaceTransferRejection? { + public func rejection(for source: SurfaceMachineID?) -> SurfaceTransferRejection? { guard let cloudMachine else { return nil } return source == cloudMachine ? nil : .cloudMachineMismatch } - func rejection(for resources: [SurfaceResourceID]) -> SurfaceTransferRejection? { + public func rejection(for resources: [SurfaceResourceID]) -> SurfaceTransferRejection? { rejection(for: resources.map(\.machine)) } - func rejection(for machines: [SurfaceMachineID]) -> SurfaceTransferRejection? { + public func rejection(for machines: [SurfaceMachineID]) -> SurfaceTransferRejection? { guard cloudMachine != nil else { return nil } return machines.isEmpty || machines.contains(where: { rejection(for: $0) != nil }) ? .cloudMachineMismatch : nil diff --git a/Sources/Surfaces/SurfacePlacementSyncing.swift b/Packages/macOS/CmuxCloud/Sources/CmuxCloud/Surfaces/SurfacePlacementSyncing.swift similarity index 94% rename from Sources/Surfaces/SurfacePlacementSyncing.swift rename to Packages/macOS/CmuxCloud/Sources/CmuxCloud/Surfaces/SurfacePlacementSyncing.swift index f9e317bbae5a..9ca6a21e30f7 100644 --- a/Sources/Surfaces/SurfacePlacementSyncing.swift +++ b/Packages/macOS/CmuxCloud/Sources/CmuxCloud/Surfaces/SurfacePlacementSyncing.swift @@ -4,7 +4,7 @@ import Foundation /// The machine-layout mutations the sync service asks a provider for. Only providers /// with a daemon layout conform; the local machine has none. @MainActor -protocol SurfacePlacementSyncing: AnyObject { +public protocol SurfacePlacementSyncing: AnyObject { /// Moves one existing tab placement into `remoteWorkspaceID`: its focused pane, after /// that pane's tabs. The content behind the tab is untouched. func moveRemoteTab(id: String, intoRemoteWorkspace remoteWorkspaceID: String) async throws -> SurfaceRemotePlacement diff --git a/Sources/Surfaces/SurfacePortEndpointCache.swift b/Packages/macOS/CmuxCloud/Sources/CmuxCloud/Surfaces/SurfacePortEndpointCache.swift similarity index 74% rename from Sources/Surfaces/SurfacePortEndpointCache.swift rename to Packages/macOS/CmuxCloud/Sources/CmuxCloud/Surfaces/SurfacePortEndpointCache.swift index fb431e6c34d7..a72d41c10f66 100644 --- a/Sources/Surfaces/SurfacePortEndpointCache.swift +++ b/Packages/macOS/CmuxCloud/Sources/CmuxCloud/Surfaces/SurfacePortEndpointCache.swift @@ -5,11 +5,11 @@ import Foundation struct SurfacePortEndpointCache { private var values: [Int: String] = [:] - func openURL(port: Int) -> String? { + public func openURL(port: Int) -> String? { values[port] } - mutating func store(openURL: String, port: Int) { + public mutating func store(openURL: String, port: Int) { values[port] = openURL } } diff --git a/Sources/Surfaces/SurfaceProjection+WorkspaceMembership.swift b/Packages/macOS/CmuxCloud/Sources/CmuxCloud/Surfaces/SurfaceProjection+WorkspaceMembership.swift similarity index 84% rename from Sources/Surfaces/SurfaceProjection+WorkspaceMembership.swift rename to Packages/macOS/CmuxCloud/Sources/CmuxCloud/Surfaces/SurfaceProjection+WorkspaceMembership.swift index 31aea6b83011..9ab0e1e29ed3 100644 --- a/Sources/Surfaces/SurfaceProjection+WorkspaceMembership.swift +++ b/Packages/macOS/CmuxCloud/Sources/CmuxCloud/Surfaces/SurfaceProjection+WorkspaceMembership.swift @@ -2,14 +2,14 @@ import CmuxSurfaceCatalogModel extension SurfaceProjection { /// Desktop and port previews created on this Mac have no daemon tab. - var isLocalWorkspaceView: Bool { + public var isLocalWorkspaceView: Bool { remoteTabID == nil && (resource.kind == .display || resource.isForwardedPort) } /// Explicit previews have no daemon tab. Their live catalog projections name /// their bound workspace; availability in the machine resource pool never does. /// A daemon placement of the same resource already supplies that workspace row. - static func localWorkspaceMembers(resources: [SurfaceResource], projections: [SurfaceProjection]) -> [(resource: SurfaceResource, workspaceID: String)] { + public static func localWorkspaceMembers(resources: [SurfaceResource], projections: [SurfaceProjection]) -> [(resource: SurfaceResource, workspaceID: String)] { let previews = Dictionary(uniqueKeysWithValues: resources.filter { $0.kind == .display || $0.id.isForwardedPort }.map { ($0.id, $0) }) var seen: [SurfaceResourceID: Set] = [:] return projections.compactMap { projection in diff --git a/Sources/Surfaces/SurfaceProjectionEndReason.swift b/Packages/macOS/CmuxCloud/Sources/CmuxCloud/Surfaces/SurfaceProjectionEndReason.swift similarity index 92% rename from Sources/Surfaces/SurfaceProjectionEndReason.swift rename to Packages/macOS/CmuxCloud/Sources/CmuxCloud/Surfaces/SurfaceProjectionEndReason.swift index ee2c1d08e8b1..d9ce58ee31ee 100644 --- a/Sources/Surfaces/SurfaceProjectionEndReason.swift +++ b/Packages/macOS/CmuxCloud/Sources/CmuxCloud/Surfaces/SurfaceProjectionEndReason.swift @@ -1,6 +1,6 @@ /// Why a pane's projection ended. Only a pane closed on purpose edits the machine's /// layout; a workspace going away and a pane the app replaced itself never do. -enum SurfaceProjectionEndReason: Sendable { +public enum SurfaceProjectionEndReason: Sendable { /// The pane was closed: its tab strip ×, a pane close, socket `surface.close`. case paneClosed /// The local workspace is going away (⌘⇧W, window close, quit, machine removal). diff --git a/Sources/Surfaces/SurfaceProjectionMutationObserving.swift b/Packages/macOS/CmuxCloud/Sources/CmuxCloud/Surfaces/SurfaceProjectionMutationObserving.swift similarity index 77% rename from Sources/Surfaces/SurfaceProjectionMutationObserving.swift rename to Packages/macOS/CmuxCloud/Sources/CmuxCloud/Surfaces/SurfaceProjectionMutationObserving.swift index 8e27aafd36fd..d2864f41c0cd 100644 --- a/Sources/Surfaces/SurfaceProjectionMutationObserving.swift +++ b/Packages/macOS/CmuxCloud/Sources/CmuxCloud/Surfaces/SurfaceProjectionMutationObserving.swift @@ -2,7 +2,7 @@ import Foundation /// Defers remote layout reconciliation while one local projection intent is materializing. @MainActor -protocol SurfaceProjectionMutationObserving: AnyObject { +public protocol SurfaceProjectionMutationObserving: AnyObject { func beginProjectionMutation(_ token: UUID) func endProjectionMutation(_ token: UUID) } diff --git a/Packages/macOS/CmuxCloud/Sources/CmuxCloud/Surfaces/SurfaceRemotePlacement.swift b/Packages/macOS/CmuxCloud/Sources/CmuxCloud/Surfaces/SurfaceRemotePlacement.swift new file mode 100644 index 000000000000..7e39fab975a9 --- /dev/null +++ b/Packages/macOS/CmuxCloud/Sources/CmuxCloud/Surfaces/SurfaceRemotePlacement.swift @@ -0,0 +1,18 @@ +import CmuxSurfaceCatalogModel + +/// The confirmed daemon tab behind a local pane. It is independent of local geometry. +public struct SurfaceRemotePlacement: Equatable, Sendable { + public init( + workspaceID: String, + tabID: String, + cursor: CloudVMCursor? = nil + ) { + self.workspaceID = workspaceID + self.tabID = tabID + self.cursor = cursor + } + + public let workspaceID: String + public let tabID: String + public var cursor: CloudVMCursor? = nil +} diff --git a/Sources/Surfaces/SurfaceResource+CloudTitle.swift b/Packages/macOS/CmuxCloud/Sources/CmuxCloud/Surfaces/SurfaceResource+CloudTitle.swift similarity index 83% rename from Sources/Surfaces/SurfaceResource+CloudTitle.swift rename to Packages/macOS/CmuxCloud/Sources/CmuxCloud/Surfaces/SurfaceResource+CloudTitle.swift index d8150f406c9c..3089f5676943 100644 --- a/Sources/Surfaces/SurfaceResource+CloudTitle.swift +++ b/Packages/macOS/CmuxCloud/Sources/CmuxCloud/Surfaces/SurfaceResource+CloudTitle.swift @@ -3,12 +3,12 @@ import CmuxSurfaceCatalogModel import Foundation extension SurfaceResource { - var cloudProcessDisplayTitle: String { + public var cloudProcessDisplayTitle: String { let value = RemoteTerminalTitle(processTitle: title).processTitle return value.isEmpty ? String(localized: "cloudTree.terminal.untitled", defaultValue: "terminal") : value } - var cloudPoolDisplayTitle: String { + public var cloudPoolDisplayTitle: String { let value = RemoteTerminalTitle(processTitle: title, viewNames: remoteViews?.map(\.name) ?? []).poolTitle return value.isEmpty ? cloudProcessDisplayTitle : value } diff --git a/Sources/Surfaces/SurfaceTransferOrigin.swift b/Packages/macOS/CmuxCloud/Sources/CmuxCloud/Surfaces/SurfaceTransferOrigin.swift similarity index 72% rename from Sources/Surfaces/SurfaceTransferOrigin.swift rename to Packages/macOS/CmuxCloud/Sources/CmuxCloud/Surfaces/SurfaceTransferOrigin.swift index 5c06363e0963..b607b6f6b325 100644 --- a/Sources/Surfaces/SurfaceTransferOrigin.swift +++ b/Packages/macOS/CmuxCloud/Sources/CmuxCloud/Surfaces/SurfaceTransferOrigin.swift @@ -1,7 +1,7 @@ import Foundation /// A workspace and its Dock share a workspace ID but are different panel owners. -enum SurfaceTransferOrigin: Equatable, Sendable { +public enum SurfaceTransferOrigin: Equatable, Sendable { case workspace(UUID) case dock(UUID) } diff --git a/Sources/Surfaces/SurfaceTransferRejection.swift b/Packages/macOS/CmuxCloud/Sources/CmuxCloud/Surfaces/SurfaceTransferRejection.swift similarity index 69% rename from Sources/Surfaces/SurfaceTransferRejection.swift rename to Packages/macOS/CmuxCloud/Sources/CmuxCloud/Surfaces/SurfaceTransferRejection.swift index 5e8b7b1ff332..454dac03bd67 100644 --- a/Sources/Surfaces/SurfaceTransferRejection.swift +++ b/Packages/macOS/CmuxCloud/Sources/CmuxCloud/Surfaces/SurfaceTransferRejection.swift @@ -1,12 +1,12 @@ import Foundation /// Shared copy for drag feedback and rejected catalog/socket mutations. -enum SurfaceTransferRejection: Error, LocalizedError, Equatable, Sendable { +public enum SurfaceTransferRejection: Error, LocalizedError, Equatable, Sendable { case cloudMachineMismatch - var errorDescription: String? { message } + public var errorDescription: String? { message } - var message: String { + public var message: String { String( localized: "surfaceDrop.cloudMachineMismatch", defaultValue: "Cloud workspaces can only hold terminals, browsers, and displays from their own Cloud machine. Open a local workspace and move the splits there." diff --git a/Packages/macOS/CmuxCloud/Sources/CmuxCloud/Surfaces/SurfaceWorkspaceCreationReceipt.swift b/Packages/macOS/CmuxCloud/Sources/CmuxCloud/Surfaces/SurfaceWorkspaceCreationReceipt.swift new file mode 100644 index 000000000000..7ca5773b8f51 --- /dev/null +++ b/Packages/macOS/CmuxCloud/Sources/CmuxCloud/Surfaces/SurfaceWorkspaceCreationReceipt.swift @@ -0,0 +1,19 @@ +import CmuxSurfaceCatalogModel +import Foundation + +/// A committed workspace and its optional starter, available before a graph refresh. +public struct SurfaceWorkspaceCreationReceipt: Sendable { + public init( + workspace: SurfaceRemoteWorkspace, + terminal: SurfaceResource?, + cursor: CloudVMCursor? + ) { + self.workspace = workspace + self.terminal = terminal + self.cursor = cursor + } + + public let workspace: SurfaceRemoteWorkspace + public let terminal: SurfaceResource? + public let cursor: CloudVMCursor? +} diff --git a/Sources/AppDelegate+CloudTeamPicker.swift b/Sources/AppDelegate+CloudTeamPicker.swift index 6870e640cb88..38985139f703 100644 --- a/Sources/AppDelegate+CloudTeamPicker.swift +++ b/Sources/AppDelegate+CloudTeamPicker.swift @@ -1,3 +1,4 @@ +import CmuxCloud import AppKit import CmuxCloud diff --git a/Sources/Cloud/CloudTreeRemoteWorkspaces.swift b/Sources/Cloud/CloudTreeRemoteWorkspaces.swift index c72a8b00f207..71a760416792 100644 --- a/Sources/Cloud/CloudTreeRemoteWorkspaces.swift +++ b/Sources/Cloud/CloudTreeRemoteWorkspaces.swift @@ -1,3 +1,4 @@ +import CmuxCloud import CmuxSurfaceCatalogModel import Foundation diff --git a/Sources/CommandPalette/CurrentWorkPalettePresentation.swift b/Sources/CommandPalette/CurrentWorkPalettePresentation.swift index 15830c8ae433..b127b3ba6592 100644 --- a/Sources/CommandPalette/CurrentWorkPalettePresentation.swift +++ b/Sources/CommandPalette/CurrentWorkPalettePresentation.swift @@ -1,3 +1,4 @@ +import CmuxCloud import CmuxSurfaceCatalogModel import Foundation diff --git a/Sources/ContentView+CurrentWorkCommandPalette.swift b/Sources/ContentView+CurrentWorkCommandPalette.swift index c7e9ecf12745..ad9d8325f219 100644 --- a/Sources/ContentView+CurrentWorkCommandPalette.swift +++ b/Sources/ContentView+CurrentWorkCommandPalette.swift @@ -1,3 +1,4 @@ +import CmuxCloud import AppKit import CmuxCommandPalette diff --git a/Sources/ContentView.swift b/Sources/ContentView.swift index 395a34d7ddff..6eb18de6e697 100644 --- a/Sources/ContentView.swift +++ b/Sources/ContentView.swift @@ -1,3 +1,4 @@ +import CmuxCloud import AppKit import CmuxAppKitSupportUI import CmuxCommandPalette diff --git a/Sources/Devices/DeviceSurfaceProvider+Layout.swift b/Sources/Devices/DeviceSurfaceProvider+Layout.swift index 44ccc66f06d4..480c8c71d549 100644 --- a/Sources/Devices/DeviceSurfaceProvider+Layout.swift +++ b/Sources/Devices/DeviceSurfaceProvider+Layout.swift @@ -1,3 +1,4 @@ +import CmuxCloud import CmuxCore import Foundation diff --git a/Sources/Devices/DeviceSurfaceProvider+TerminalLayout.swift b/Sources/Devices/DeviceSurfaceProvider+TerminalLayout.swift index 6a39075b474b..bbda51e8af21 100644 --- a/Sources/Devices/DeviceSurfaceProvider+TerminalLayout.swift +++ b/Sources/Devices/DeviceSurfaceProvider+TerminalLayout.swift @@ -1,3 +1,4 @@ +import CmuxCloud import CmuxCore import CmuxSurfaceCatalogModel import Foundation diff --git a/Sources/Devices/DeviceSurfaceProvider.swift b/Sources/Devices/DeviceSurfaceProvider.swift index 981f5eb55543..07be67986175 100644 --- a/Sources/Devices/DeviceSurfaceProvider.swift +++ b/Sources/Devices/DeviceSurfaceProvider.swift @@ -1,4 +1,5 @@ import CMUXMobileCore +import CmuxCloud import CmuxCore import CmuxSurfaceCatalogModel import CmuxTerminal diff --git a/Sources/Devices/DeviceWorkspaceLayoutCoordinator.swift b/Sources/Devices/DeviceWorkspaceLayoutCoordinator.swift index a7f01fdc1934..1959de914207 100644 --- a/Sources/Devices/DeviceWorkspaceLayoutCoordinator.swift +++ b/Sources/Devices/DeviceWorkspaceLayoutCoordinator.swift @@ -1,3 +1,4 @@ +import CmuxCloud import CmuxCore import CmuxSurfaceCatalogModel import Foundation diff --git a/Sources/PaneDropContainer.swift b/Sources/PaneDropContainer.swift index ee7c73e53cb2..2489dceb91a7 100644 --- a/Sources/PaneDropContainer.swift +++ b/Sources/PaneDropContainer.swift @@ -1,3 +1,4 @@ +import CmuxCloud import AppKit import Bonsplit import Foundation diff --git a/Sources/PaneTransferDropRouter.swift b/Sources/PaneTransferDropRouter.swift index 6fb06dca8b2b..0eed91db7420 100644 --- a/Sources/PaneTransferDropRouter.swift +++ b/Sources/PaneTransferDropRouter.swift @@ -1,3 +1,4 @@ +import CmuxCloud import AppKit import Bonsplit diff --git a/Sources/Sidebar/SidebarBonsplitTabWorkspaceDropView+Ownership.swift b/Sources/Sidebar/SidebarBonsplitTabWorkspaceDropView+Ownership.swift index 5e9f04c5c979..123723bea90b 100644 --- a/Sources/Sidebar/SidebarBonsplitTabWorkspaceDropView+Ownership.swift +++ b/Sources/Sidebar/SidebarBonsplitTabWorkspaceDropView+Ownership.swift @@ -1,3 +1,4 @@ +import CmuxCloud import AppKit import CmuxFoundation diff --git a/Sources/Surfaces/CloudManualMirrorMaterialization.swift b/Sources/Surfaces/CloudManualMirrorMaterialization.swift index 516c9c0ec364..958b50d14aad 100644 --- a/Sources/Surfaces/CloudManualMirrorMaterialization.swift +++ b/Sources/Surfaces/CloudManualMirrorMaterialization.swift @@ -1,3 +1,4 @@ +import CmuxCloud import CmuxTerminal import Foundation diff --git a/Sources/Surfaces/CloudSurfaceDropGateView.swift b/Sources/Surfaces/CloudSurfaceDropGateView.swift index 0636ee99edff..5f10de2b8614 100644 --- a/Sources/Surfaces/CloudSurfaceDropGateView.swift +++ b/Sources/Surfaces/CloudSurfaceDropGateView.swift @@ -1,3 +1,4 @@ +import CmuxCloud import AppKit /// Intercepts only forbidden live surface drags, leaving ordinary hit testing alone. diff --git a/Sources/Surfaces/CloudTerminalLayoutCreationResult.swift b/Sources/Surfaces/CloudTerminalLayoutCreationResult.swift deleted file mode 100644 index 3a8d83740042..000000000000 --- a/Sources/Surfaces/CloudTerminalLayoutCreationResult.swift +++ /dev/null @@ -1,7 +0,0 @@ -import CmuxSurfaceCatalogModel - -/// The daemon's creation receipt and the source snapshot's workspace identity. -struct CloudTerminalLayoutCreationResult: Sendable { - let created: CmuxTuiSnapshotParser.CreatedTerminalPath - let workspaceID: String -} diff --git a/Sources/Surfaces/CloudWorkspaceCreationCoordinator.swift b/Sources/Surfaces/CloudWorkspaceCreationCoordinator.swift index d212672b61c7..97c9baf774a3 100644 --- a/Sources/Surfaces/CloudWorkspaceCreationCoordinator.swift +++ b/Sources/Surfaces/CloudWorkspaceCreationCoordinator.swift @@ -1,3 +1,4 @@ +import CmuxCloud import CmuxSurfaceCatalogModel import Foundation diff --git a/Sources/Surfaces/CloudWorkspaceCreationHost.swift b/Sources/Surfaces/CloudWorkspaceCreationHost.swift index 3659e6495b88..ef20568f34e3 100644 --- a/Sources/Surfaces/CloudWorkspaceCreationHost.swift +++ b/Sources/Surfaces/CloudWorkspaceCreationHost.swift @@ -1,3 +1,4 @@ +import CmuxCloud import AppKit import Bonsplit import CmuxSurfaceCatalogModel diff --git a/Sources/Surfaces/CloudWorkspaceCreationOperation.swift b/Sources/Surfaces/CloudWorkspaceCreationOperation.swift index 0d9e2b075a9c..9bdb0bff4cf9 100644 --- a/Sources/Surfaces/CloudWorkspaceCreationOperation.swift +++ b/Sources/Surfaces/CloudWorkspaceCreationOperation.swift @@ -1,3 +1,4 @@ +import CmuxCloud import CmuxSurfaceCatalogModel import Foundation diff --git a/Sources/Surfaces/CloudWorkspaceProjectionTask.swift b/Sources/Surfaces/CloudWorkspaceProjectionTask.swift deleted file mode 100644 index b35c10185484..000000000000 --- a/Sources/Surfaces/CloudWorkspaceProjectionTask.swift +++ /dev/null @@ -1,8 +0,0 @@ -import Foundation - -/// Identity fences a cancelled worker's cleanup from a replacement worker. -@MainActor -struct CloudWorkspaceProjectionTask { - let id: UUID - let task: Task -} diff --git a/Sources/Surfaces/CmuxTuiSurfaceProvider+AgentNaming.swift b/Sources/Surfaces/CmuxTuiSurfaceProvider+AgentNaming.swift index e570607e366e..70aaccec223a 100644 --- a/Sources/Surfaces/CmuxTuiSurfaceProvider+AgentNaming.swift +++ b/Sources/Surfaces/CmuxTuiSurfaceProvider+AgentNaming.swift @@ -1,3 +1,4 @@ +import CmuxCloud import CmuxSurfaceCatalogModel import Foundation diff --git a/Sources/Surfaces/CmuxTuiSurfaceProvider+Environment.swift b/Sources/Surfaces/CmuxTuiSurfaceProvider+Environment.swift index db5434c34f88..3ea2f12f3958 100644 --- a/Sources/Surfaces/CmuxTuiSurfaceProvider+Environment.swift +++ b/Sources/Surfaces/CmuxTuiSurfaceProvider+Environment.swift @@ -1,3 +1,4 @@ +import CmuxCloud import CmuxCloudTui import CmuxSurfaceCatalogModel import Foundation diff --git a/Sources/Surfaces/CmuxTuiSurfaceProvider+Error.swift b/Sources/Surfaces/CmuxTuiSurfaceProvider+Error.swift index d9c878eb1ead..84bde8c33e17 100644 --- a/Sources/Surfaces/CmuxTuiSurfaceProvider+Error.swift +++ b/Sources/Surfaces/CmuxTuiSurfaceProvider+Error.swift @@ -1,3 +1,4 @@ +import CmuxCloud import Foundation /// Errors surfaced by a Cloud machine provider. Preview credentials never enter error text. diff --git a/Sources/Surfaces/CmuxTuiSurfaceProvider+FileDelivery.swift b/Sources/Surfaces/CmuxTuiSurfaceProvider+FileDelivery.swift index 26a20518d174..0f4fb3cd96e7 100644 --- a/Sources/Surfaces/CmuxTuiSurfaceProvider+FileDelivery.swift +++ b/Sources/Surfaces/CmuxTuiSurfaceProvider+FileDelivery.swift @@ -1,3 +1,4 @@ +import CmuxCloud import CmuxCloudTui import CmuxSurfaceCatalogModel import Foundation diff --git a/Sources/Surfaces/CmuxTuiSurfaceProvider+LayoutCreation.swift b/Sources/Surfaces/CmuxTuiSurfaceProvider+LayoutCreation.swift index 423c05a44196..414710646c5a 100644 --- a/Sources/Surfaces/CmuxTuiSurfaceProvider+LayoutCreation.swift +++ b/Sources/Surfaces/CmuxTuiSurfaceProvider+LayoutCreation.swift @@ -1,3 +1,4 @@ +import CmuxCloud import CmuxSurfaceCatalogModel import Foundation diff --git a/Sources/Surfaces/CmuxTuiSurfaceProvider+PlacementSync.swift b/Sources/Surfaces/CmuxTuiSurfaceProvider+PlacementSync.swift index a6fd3c6f8ca9..5ae502a17171 100644 --- a/Sources/Surfaces/CmuxTuiSurfaceProvider+PlacementSync.swift +++ b/Sources/Surfaces/CmuxTuiSurfaceProvider+PlacementSync.swift @@ -1,3 +1,4 @@ +import CmuxCloud import CmuxCloudTui import CmuxSurfaceCatalogModel import Foundation diff --git a/Sources/Surfaces/CmuxTuiSurfaceProvider+TerminalCreation.swift b/Sources/Surfaces/CmuxTuiSurfaceProvider+TerminalCreation.swift index 7ec17985b143..b9600e0652bf 100644 --- a/Sources/Surfaces/CmuxTuiSurfaceProvider+TerminalCreation.swift +++ b/Sources/Surfaces/CmuxTuiSurfaceProvider+TerminalCreation.swift @@ -1,3 +1,4 @@ +import CmuxCloud import CmuxCloudTui import CmuxSurfaceCatalogModel import Foundation diff --git a/Sources/Surfaces/CurrentWorkInput.swift b/Sources/Surfaces/CurrentWorkInput.swift deleted file mode 100644 index b36123cbe548..000000000000 --- a/Sources/Surfaces/CurrentWorkInput.swift +++ /dev/null @@ -1,19 +0,0 @@ -import CmuxSurfaceCatalogModel -import Foundation - -/// Immutable capture for the pure current-work reduction; never persisted as a graph. -struct CurrentWorkInput: Sendable { - var export: SurfaceCatalogExport - var observedAt: Date - var workspaces: [UUID: WorkspaceFacts] - var agentsByPanelID: [UUID: [CurrentWorkSnapshot.Agent]] - var unreadPanelIDs: Set - var agentOwnerAvailable: Bool - - struct WorkspaceFacts: Sendable { - var projectRoot: String? - var unreadCount: Int - var notificationID: UUID? - var pullRequests: [CurrentWorkSnapshot.PullRequest] - } -} diff --git a/Sources/Surfaces/CurrentWorkQueryService.swift b/Sources/Surfaces/CurrentWorkQueryService.swift index 2ea2fe209e7c..09c4e60f7b6c 100644 --- a/Sources/Surfaces/CurrentWorkQueryService.swift +++ b/Sources/Surfaces/CurrentWorkQueryService.swift @@ -1,3 +1,4 @@ +import CmuxCloud import CmuxAgentChat import CmuxMobileHost import CmuxNotifications diff --git a/Sources/Surfaces/CurrentWorkReducer.swift b/Sources/Surfaces/CurrentWorkReducer.swift index 5acb26c8d92b..2d1750c6d24f 100644 --- a/Sources/Surfaces/CurrentWorkReducer.swift +++ b/Sources/Surfaces/CurrentWorkReducer.swift @@ -1,3 +1,4 @@ +import CmuxCloud import Foundation /// Reduces an immutable owner capture. It performs no I/O and owns no mutable graph. diff --git a/Sources/Surfaces/CurrentWorkSnapshot.swift b/Sources/Surfaces/CurrentWorkSnapshot.swift deleted file mode 100644 index a2c77618a463..000000000000 --- a/Sources/Surfaces/CurrentWorkSnapshot.swift +++ /dev/null @@ -1,116 +0,0 @@ -import CmuxSurfaceCatalogModel -import Foundation - -/// A bounded, read-only projection of existing work owners for CLI and Find Work. -struct CurrentWorkSnapshot: Codable, Sendable { - var schemaVersion = 1 - var authority = "read_only_projection" - var observedAt: String - var totalObserved: Int - var truncated: Bool - var ownerAvailability: [String: String] - var unsupportedFacts = ["durable_work_identity", "review_threads", "check_runs", "review_dispositions"] - var items: [Item] - - struct Evidence: Codable, Sendable { - var owner: String - var reference: String - var observedAt: String - } - - struct Freshness: Codable, Sendable { - var state: String - var reason: String? - /// Time this owner state was read, not the time a remote graph was produced. - var observedAt: String - } - - struct Placement: Codable, Sendable { - var kind: String - var machine: String - } - - struct Projection: Codable, Sendable { - var resourceRef: String - var workspaceID: UUID - var panelID: UUID - var stableSurfaceID: UUID? - var stableWorkspaceID: UUID? - var remoteWorkspaceID: String? - var remoteTabID: String? - } - - struct Agent: Codable, Sendable { - var sessionID: String? - var kind: String? - var state: String - var hasHookLifecycleState: Bool - var version: Int? - var lastActivityAt: String? - var evidence: Evidence - } - - struct Attention: Codable, Sendable { - var kind: String - var scope: String - var evidence: Evidence - } - - struct PullRequest: Codable, Sendable { - var number: Int - var url: String - var label: String - var status: String - var associationScope = "workspace" - var workspaceID: UUID - var freshness: Freshness - var evidence: Evidence - } - - struct Obligation: Codable, Sendable { - var kind: String - var possibleHumanObligation = true - var freshness: Freshness - var evidence: Evidence - } - - struct Receipt: Codable, Sendable { - var kind: String - var cursor: CloudVMCursor? - var evidence: Evidence - } - - struct Item: Codable, Sendable { - var resourceRef: String - /// Only a local resource can inherit its single durable surface identity. - var durableSurfaceID: UUID? - var label: String - var kind: String - var lifecycle: String - var placement: Placement - var projections: [Projection] - var cwd: String? - var projectHints: [String] - var repositoryHints: [String] - var agents: [Agent] - var attention: [Attention] - var pullRequests: [PullRequest] - var freshness: Freshness - var cursor: CloudVMCursor? - var receiptRefs: [Receipt] - var possibleHumanObligations: [Obligation] - var evidence: [Evidence] - var omitted: [String: Int] - } - - /// The socket and human consumers receive this same schema, without runtime owners. - func jsonObject() throws -> [String: Any] { - let encoder = JSONEncoder() - encoder.keyEncodingStrategy = .convertToSnakeCase - let data = try encoder.encode(self) - guard data.count <= 2_000_000 else { - throw SurfaceCatalogError.unsupported("Current-work response exceeds 2 MB; request a smaller limit") - } - return try JSONSerialization.jsonObject(with: data) as? [String: Any] ?? [:] - } -} diff --git a/Sources/Surfaces/DockSplitStore+SurfaceOwnership.swift b/Sources/Surfaces/DockSplitStore+SurfaceOwnership.swift index 08eac763b633..15307147450d 100644 --- a/Sources/Surfaces/DockSplitStore+SurfaceOwnership.swift +++ b/Sources/Surfaces/DockSplitStore+SurfaceOwnership.swift @@ -1,3 +1,4 @@ +import CmuxCloud import CmuxSurfaceCatalogModel import Foundation diff --git a/Sources/Surfaces/SurfaceAgentNaming.swift b/Sources/Surfaces/SurfaceAgentNaming.swift index f42adc3b3a18..ec46fa9a8e7b 100644 --- a/Sources/Surfaces/SurfaceAgentNaming.swift +++ b/Sources/Surfaces/SurfaceAgentNaming.swift @@ -1,3 +1,4 @@ +import CmuxCloud import Foundation /// A provider that persists automatic names with a daemon-side user/epoch check. diff --git a/Sources/Surfaces/SurfaceCatalog+CloudWorkspaceProjection.swift b/Sources/Surfaces/SurfaceCatalog+CloudWorkspaceProjection.swift index 5fc52fe9684c..3fc6b86491e9 100644 --- a/Sources/Surfaces/SurfaceCatalog+CloudWorkspaceProjection.swift +++ b/Sources/Surfaces/SurfaceCatalog+CloudWorkspaceProjection.swift @@ -1,3 +1,4 @@ +import CmuxCloud import CmuxSurfaceCatalogModel import Foundation diff --git a/Sources/Surfaces/SurfaceCatalog+Groups.swift b/Sources/Surfaces/SurfaceCatalog+Groups.swift index 81d460981c11..827563e62835 100644 --- a/Sources/Surfaces/SurfaceCatalog+Groups.swift +++ b/Sources/Surfaces/SurfaceCatalog+Groups.swift @@ -1,3 +1,4 @@ +import CmuxCloud import CmuxCore import CmuxSurfaceCatalogModel import Foundation diff --git a/Sources/Surfaces/SurfaceCatalog+Ownership.swift b/Sources/Surfaces/SurfaceCatalog+Ownership.swift index cbba19614607..39ee3ba79140 100644 --- a/Sources/Surfaces/SurfaceCatalog+Ownership.swift +++ b/Sources/Surfaces/SurfaceCatalog+Ownership.swift @@ -1,3 +1,4 @@ +import CmuxCloud import CmuxSurfaceCatalogModel import Foundation diff --git a/Sources/Surfaces/SurfaceCatalog+WorkspaceMembership.swift b/Sources/Surfaces/SurfaceCatalog+WorkspaceMembership.swift index f7d3cc8c499e..479b421952fc 100644 --- a/Sources/Surfaces/SurfaceCatalog+WorkspaceMembership.swift +++ b/Sources/Surfaces/SurfaceCatalog+WorkspaceMembership.swift @@ -1,3 +1,4 @@ +import CmuxCloud import CmuxCore import CmuxSurfaceCatalogModel import Foundation diff --git a/Sources/Surfaces/SurfaceDropFeedback.swift b/Sources/Surfaces/SurfaceDropFeedback.swift index 1a4bbf5e651c..f403fdbbd190 100644 --- a/Sources/Surfaces/SurfaceDropFeedback.swift +++ b/Sources/Surfaces/SurfaceDropFeedback.swift @@ -1,3 +1,4 @@ +import CmuxCloud import AppKit /// Owns a transient warning above AppKit portals without taking keyboard focus. diff --git a/Sources/Surfaces/SurfaceLayoutTerminalCreating.swift b/Sources/Surfaces/SurfaceLayoutTerminalCreating.swift index 283bb33164a6..909aa4ee21d4 100644 --- a/Sources/Surfaces/SurfaceLayoutTerminalCreating.swift +++ b/Sources/Surfaces/SurfaceLayoutTerminalCreating.swift @@ -1,3 +1,4 @@ +import CmuxCloud import CmuxSurfaceCatalogModel import Foundation diff --git a/Sources/Surfaces/SurfaceProvider.swift b/Sources/Surfaces/SurfaceProvider.swift index ade24ea1b756..bae8f53bf007 100644 --- a/Sources/Surfaces/SurfaceProvider.swift +++ b/Sources/Surfaces/SurfaceProvider.swift @@ -1,3 +1,4 @@ +import CmuxCloud import CmuxSurfaceCatalogModel import Foundation diff --git a/Sources/Surfaces/SurfaceRemotePlacement.swift b/Sources/Surfaces/SurfaceRemotePlacement.swift deleted file mode 100644 index 935639c8a5fa..000000000000 --- a/Sources/Surfaces/SurfaceRemotePlacement.swift +++ /dev/null @@ -1,8 +0,0 @@ -import CmuxSurfaceCatalogModel - -/// The confirmed daemon tab behind a local pane. It is independent of local geometry. -struct SurfaceRemotePlacement: Equatable, Sendable { - let workspaceID: String - let tabID: String - var cursor: CloudVMCursor? = nil -} diff --git a/Sources/Surfaces/SurfaceWorkspaceCreationReceipt.swift b/Sources/Surfaces/SurfaceWorkspaceCreationReceipt.swift deleted file mode 100644 index ea369d1aa882..000000000000 --- a/Sources/Surfaces/SurfaceWorkspaceCreationReceipt.swift +++ /dev/null @@ -1,9 +0,0 @@ -import CmuxSurfaceCatalogModel -import Foundation - -/// A committed workspace and its optional starter, available before a graph refresh. -struct SurfaceWorkspaceCreationReceipt: Sendable { - let workspace: SurfaceRemoteWorkspace - let terminal: SurfaceResource? - let cursor: CloudVMCursor? -} diff --git a/Sources/Surfaces/TerminalController+CloudTerminalCreation.swift b/Sources/Surfaces/TerminalController+CloudTerminalCreation.swift index 0d2d2e228796..f10c6e1cda87 100644 --- a/Sources/Surfaces/TerminalController+CloudTerminalCreation.swift +++ b/Sources/Surfaces/TerminalController+CloudTerminalCreation.swift @@ -1,3 +1,4 @@ +import CmuxCloud import CmuxSurfaceCatalogModel import Foundation diff --git a/Sources/Surfaces/TerminalController+CurrentWork.swift b/Sources/Surfaces/TerminalController+CurrentWork.swift index 8bc63d1dd19e..4380051ef385 100644 --- a/Sources/Surfaces/TerminalController+CurrentWork.swift +++ b/Sources/Surfaces/TerminalController+CurrentWork.swift @@ -1,3 +1,4 @@ +import CmuxCloud import CmuxSurfaceCatalogModel import Foundation diff --git a/Sources/Surfaces/Workspace+CloudDisplayOwnership.swift b/Sources/Surfaces/Workspace+CloudDisplayOwnership.swift index 83253c3b0782..c3a15a6c3c13 100644 --- a/Sources/Surfaces/Workspace+CloudDisplayOwnership.swift +++ b/Sources/Surfaces/Workspace+CloudDisplayOwnership.swift @@ -1,3 +1,4 @@ +import CmuxCloud import CmuxSurfaceCatalogModel import Foundation diff --git a/Sources/Surfaces/Workspace+SurfaceOwnership.swift b/Sources/Surfaces/Workspace+SurfaceOwnership.swift index bfc2d915f998..09ff0f083541 100644 --- a/Sources/Surfaces/Workspace+SurfaceOwnership.swift +++ b/Sources/Surfaces/Workspace+SurfaceOwnership.swift @@ -1,3 +1,4 @@ +import CmuxCloud import AppKit import Bonsplit import CmuxSurfaceCatalogModel diff --git a/Sources/TerminalController+AgentTitle.swift b/Sources/TerminalController+AgentTitle.swift index 4d62502fca47..d94312d01e9b 100644 --- a/Sources/TerminalController+AgentTitle.swift +++ b/Sources/TerminalController+AgentTitle.swift @@ -1,3 +1,4 @@ +import CmuxCloud import Bonsplit import CmuxSettings import Foundation diff --git a/Sources/TerminalController+SurfaceMove.swift b/Sources/TerminalController+SurfaceMove.swift index 4a9624c8c988..9c6c18e9350a 100644 --- a/Sources/TerminalController+SurfaceMove.swift +++ b/Sources/TerminalController+SurfaceMove.swift @@ -1,3 +1,4 @@ +import CmuxCloud import AppKit import Bonsplit import Foundation diff --git a/Sources/Workspace+DetachedSurfaceTransfer.swift b/Sources/Workspace+DetachedSurfaceTransfer.swift index f9a7c2d87cfd..1a491d965619 100644 --- a/Sources/Workspace+DetachedSurfaceTransfer.swift +++ b/Sources/Workspace+DetachedSurfaceTransfer.swift @@ -1,3 +1,4 @@ +import CmuxCloud import CmuxFoundation import CmuxSurfaceCatalogModel import Foundation diff --git a/Sources/Workspace+TitleOwnership.swift b/Sources/Workspace+TitleOwnership.swift index 95a51d66b360..7b9a21ef33e6 100644 --- a/Sources/Workspace+TitleOwnership.swift +++ b/Sources/Workspace+TitleOwnership.swift @@ -1,3 +1,4 @@ +import CmuxCloud import Foundation import CmuxTerminalCore diff --git a/cmux.xcodeproj/project.pbxproj b/cmux.xcodeproj/project.pbxproj index ffcaa02c9c3f..cbb5609bb326 100644 --- a/cmux.xcodeproj/project.pbxproj +++ b/cmux.xcodeproj/project.pbxproj @@ -699,12 +699,10 @@ B900001BA1B2C3D4E5F60719 /* CloseWorkspacesConfirmDialogUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = B900001CA1B2C3D4E5F60719 /* CloseWorkspacesConfirmDialogUITests.swift */; }; EF840DF6D022042F7E57B482 /* cloud-agent-skill.md in Resources */ = {isa = PBXBuildFile; fileRef = 9313CB72497F3EA572B409A8 /* cloud-agent-skill.md */; }; D15E75C8E60487168BA7E9DF /* CloudActivationPolicyTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC9BF8F0C0B9F423BF52AFE4 /* CloudActivationPolicyTests.swift */; }; - 5963AB82F2484C859AF079E1 /* CloudAgentNameContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 70C2D3786C88493F9C30B299 /* CloudAgentNameContext.swift */; }; C62A16251EC09E72A897A2A3 /* CloudAgentSkillLauncher+CodingAgent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4D50DCB9771484FE2B966B07 /* CloudAgentSkillLauncher+CodingAgent.swift */; }; EAEF1B227CA5A458005D2EAD /* CloudAgentSkillLauncher+LauncherError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0110525EA7A8A51561759317 /* CloudAgentSkillLauncher+LauncherError.swift */; }; 68B60071A7049D7CD9C2CFD7 /* CloudAgentSkillLauncher.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7BA0E69E17F61ECF69C9025 /* CloudAgentSkillLauncher.swift */; }; C6D4C5A38097BB05AB98E460 /* CloudAgentSkillLauncherTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 763D217526D3832668F47568 /* CloudAgentSkillLauncherTests.swift */; }; - C12537000000000000000315 /* CloudAttachmentReconcileDecision.swift in Sources */ = {isa = PBXBuildFile; fileRef = C12537000000000000000316 /* CloudAttachmentReconcileDecision.swift */; }; C12537000000000000000317 /* CloudAttachmentReconcileDecisionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C12537000000000000000318 /* CloudAttachmentReconcileDecisionTests.swift */; }; 69AA6941BCDDF67E7B44CA26 /* CloudBrowserAccessState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 857300CAB44EEA5406233466 /* CloudBrowserAccessState.swift */; }; 57C7774B1620767AED6F13B7 /* CloudBrowserAccessView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5E3C21B3A59A40EF4132513 /* CloudBrowserAccessView.swift */; }; @@ -729,11 +727,9 @@ F3FAB983EE90414CAA90F970 /* CloudDirectoryTestFixture.swift in Sources */ = {isa = PBXBuildFile; fileRef = FFC7BA3C7C834D20B3173D36 /* CloudDirectoryTestFixture.swift */; }; 33E9D640ED2646A38673776D /* CloudDisplayCatalogTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6B7DF8AE123341DEBA066731 /* CloudDisplayCatalogTests.swift */; }; C10D0A200000000000000001 /* CloudDomainsCLIIntegrationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C10D0A200000000000000002 /* CloudDomainsCLIIntegrationTests.swift */; }; - 9D231969015CF81D75332F5E /* CloudEnvDelivery.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD9E59E46A6A91958EE22451 /* CloudEnvDelivery.swift */; }; 674394DB769239AFBC7BCC09 /* CloudEnvDeliveryTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52233C6D60C4E409CDF7E321 /* CloudEnvDeliveryTests.swift */; }; 5EDE6BFD28BE4BD58EF84889 /* CloudFeatureAvailabilityObserver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 668F7B9BC77445B793C0298A /* CloudFeatureAvailabilityObserver.swift */; }; C3CD2FF9F6F1489C8EDD0C7B /* CloudFeatureFlagTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EBF28FA7AB264C1AA7821248 /* CloudFeatureFlagTests.swift */; }; - 00034889FEF18E9AE0AFDEEC /* CloudFileDelivery.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA32812C9009969F4AEA2380 /* CloudFileDelivery.swift */; }; 57BC801370636A4E2C1B31B7 /* CloudFileDeliveryTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8FED5F6485C390988555CDA /* CloudFileDeliveryTests.swift */; }; CFSF00000000000000000011 /* CloudFileExplorerBehaviorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = CFSR00000000000000000011 /* CloudFileExplorerBehaviorTests.swift */; }; CFSF00000000000000000001 /* CloudFileExplorerCommandRunning.swift in Sources */ = {isa = PBXBuildFile; fileRef = CFSR00000000000000000001 /* CloudFileExplorerCommandRunning.swift */; }; @@ -785,10 +781,8 @@ B71758C265B0439845140478 /* CloudNotificationSyncTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64CB7AF7545F56E95A91B154 /* CloudNotificationSyncTests.swift */; }; 7C98953CC5230654F2A4D628 /* CloudOperationDetailsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01095305A629F0014A3872CE /* CloudOperationDetailsView.swift */; }; 287771C476C483CE2E40E0F6 /* CloudOperationRecorderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B7B816D0E6DDD18F2D66C77 /* CloudOperationRecorderTests.swift */; }; - A12480000000000000000001 /* CloudPaneCreationFailure.swift in Sources */ = {isa = PBXBuildFile; fileRef = A12480000000000000000002 /* CloudPaneCreationFailure.swift */; }; A12480000000000000000005 /* CloudPaneCreationFailureStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = A12480000000000000000006 /* CloudPaneCreationFailureStore.swift */; }; A12480000000000000000003 /* CloudPaneCreationFailureView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A12480000000000000000004 /* CloudPaneCreationFailureView.swift */; }; - C12537000000000000000221 /* CloudPaneCreationPhase.swift in Sources */ = {isa = PBXBuildFile; fileRef = C12537000000000000000222 /* CloudPaneCreationPhase.swift */; }; C12537000000000000000215 /* CloudPaneCreationRetryTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C12537000000000000000216 /* CloudPaneCreationRetryTests.swift */; }; 118E574AA58D92C0A3FB893E /* CloudPlacementCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = A22E92B91E0FFF066AE10237 /* CloudPlacementCoordinator.swift */; }; CB32AB7B7AB792F21B5C5B36 /* CloudPlacementCoordinatorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F0FD4E01EAF1B2F306A96F6F /* CloudPlacementCoordinatorTests.swift */; }; @@ -802,7 +796,6 @@ 7A0CE100000000000000072C /* CloudPortRoutePlanTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A0CE100000000000000072B /* CloudPortRoutePlanTests.swift */; }; DBF72463931EE07F5759C449 /* CloudPortsVPNAffordanceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 530E939E21CAEE902D2375CE /* CloudPortsVPNAffordanceTests.swift */; }; 0C45DC8D9BE54DDEA2397892 /* CloudPrivateRouteSelectionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E6077A4B6CC441EB3668651 /* CloudPrivateRouteSelectionTests.swift */; }; - D1AC3F6282A94EAEB79D160B /* CloudProviderRefreshCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = A09B853868B54438A5B14F26 /* CloudProviderRefreshCoordinator.swift */; }; AC38407F09E94DA38B94F168 /* CloudProviderRefreshCoordinatorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C2A7143303749BE82E51F69 /* CloudProviderRefreshCoordinatorTests.swift */; }; C13151C00000000000000031 /* CloudReadIdentityAuthClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = C13151C00000000000000030 /* CloudReadIdentityAuthClient.swift */; }; C12625B00000000000000006 /* CloudReadManualClock.swift in Sources */ = {isa = PBXBuildFile; fileRef = C12625B00000000000000005 /* CloudReadManualClock.swift */; }; @@ -848,25 +841,16 @@ 13019A000000000000000006 /* CloudTeamPickerRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13019A000000000000000005 /* CloudTeamPickerRow.swift */; }; 2F646430024CB401EEC6AC0D /* CloudTeamPickerTeamRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA268D4CE6EFBDFFB69F9B7E /* CloudTeamPickerTeamRow.swift */; }; 13019C000000000000000002 /* CloudTeamScopeObserver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13019C000000000000000001 /* CloudTeamScopeObserver.swift */; }; - 566CF02BA2F7CCC0BD1E387E /* CloudTerminalAttachmentLog.swift in Sources */ = {isa = PBXBuildFile; fileRef = 79064B52A25D34860A759BF8 /* CloudTerminalAttachmentLog.swift */; }; 83EFE46711801D1A82B94FD1 /* CloudTerminalAttachmentRecoveryTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBC170FBE7AEBB71A5BE2922 /* CloudTerminalAttachmentRecoveryTests.swift */; }; - 9D73C47C49EF5E117D921D05 /* CloudTerminalAttachmentResolver.swift in Sources */ = {isa = PBXBuildFile; fileRef = A29A5C49E1A5590D63BCF886 /* CloudTerminalAttachmentResolver.swift */; }; - 4658DA26DAB751A74790718B /* CloudTerminalAttachmentRetryPolicy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 947764E7C455B796ECC69524 /* CloudTerminalAttachmentRetryPolicy.swift */; }; - 43B3097AF67CF8FC236544B3 /* CloudTerminalAttachmentRetryScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E84EAB5FE90BA20FBC54BCA /* CloudTerminalAttachmentRetryScheduler.swift */; }; C12537000000000000000313 /* CloudTerminalCardFlashRegressionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C12537000000000000000314 /* CloudTerminalCardFlashRegressionTests.swift */; }; C12537000000000000000309 /* CloudTerminalConnectionPresentationPolicyTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C12537000000000000000310 /* CloudTerminalConnectionPresentationPolicyTests.swift */; }; 3EAC8AAF4F2E473CA9DA0194 /* CloudTerminalCreationCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9720CD7F02C94F41A07E193D /* CloudTerminalCreationCoordinator.swift */; }; 8D00A9B0971047B181BBEDCE /* CloudTerminalCreationCoordinatorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 80491D6123C848EB921CB912 /* CloudTerminalCreationCoordinatorTests.swift */; }; - 7875A5053CD44963B5DEDE89 /* CloudTerminalCreationReceipt.swift in Sources */ = {isa = PBXBuildFile; fileRef = D82BE8329ACF4AA8A273EAD3 /* CloudTerminalCreationReceipt.swift */; }; - C12537000000000000000231 /* CloudTerminalCreationRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = C12537000000000000000232 /* CloudTerminalCreationRequest.swift */; }; C12537000000000000000235 /* CloudTerminalCreationRequestTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C12537000000000000000236 /* CloudTerminalCreationRequestTests.swift */; }; C13304000000000000000001 /* CloudTerminalDragSplitRoutingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C13304000000000000000002 /* CloudTerminalDragSplitRoutingTests.swift */; }; C12537000000000000000201 /* CloudTerminalLayoutCreation.swift in Sources */ = {isa = PBXBuildFile; fileRef = C12537000000000000000202 /* CloudTerminalLayoutCreation.swift */; }; - C12537000000000000000223 /* CloudTerminalLayoutCreationResult.swift in Sources */ = {isa = PBXBuildFile; fileRef = C12537000000000000000224 /* CloudTerminalLayoutCreationResult.swift */; }; C12537000000000000000203 /* CloudTerminalLayoutCreationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C12537000000000000000204 /* CloudTerminalLayoutCreationTests.swift */; }; - 192D8036059F463091D7324B /* CloudTerminalMutationCommandRunner.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4AF4519950554AD4ADB6A816 /* CloudTerminalMutationCommandRunner.swift */; }; 2378B0EA778B49CCB92DB16C /* CloudTerminalMutationLifecycleTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D870ED5A4564CACB9076D0A /* CloudTerminalMutationLifecycleTests.swift */; }; - C456E44419C541B694BF9421 /* CloudTerminalMutationQueue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 492C126DDA2B4A9984EE0793 /* CloudTerminalMutationQueue.swift */; }; 4ADF113FC24142ED998C6C16 /* CloudTerminalMutationRetirementTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7F9090F374394C919C7167F3 /* CloudTerminalMutationRetirementTests.swift */; }; 1414948CB9244AF09AEC702C /* CloudTerminalMutationSocketRunner.swift in Sources */ = {isa = PBXBuildFile; fileRef = BA4ECAEE65C944D489A1F10D /* CloudTerminalMutationSocketRunner.swift */; }; A12D2BC4AB714CE0B40293DC /* CloudTerminalMutationSocketTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 71EFC80DF0A14843B8F87A25 /* CloudTerminalMutationSocketTests.swift */; }; @@ -876,14 +860,12 @@ 98B7E20CB5B2471FB588E62A /* CloudTerminalNavigationFixture.swift in Sources */ = {isa = PBXBuildFile; fileRef = E8B84121942246E093607E66 /* CloudTerminalNavigationFixture.swift */; }; F82B489D3D384DB6B503AE25 /* CloudTerminalNavigationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D853971C8DC24A10B8A923D6 /* CloudTerminalNavigationTests.swift */; }; BD5C6A44F9B646C29565CF59 /* CloudTerminalOverlayCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = DF976CA511F242519ADA8204 /* CloudTerminalOverlayCoordinator.swift */; }; - FA0000000000000000000005 /* CloudTerminalPaneClosure.swift in Sources */ = {isa = PBXBuildFile; fileRef = FA0000000000000000000006 /* CloudTerminalPaneClosure.swift */; }; FA0000000000000000000003 /* CloudTerminalPaneClosureTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = FA0000000000000000000004 /* CloudTerminalPaneClosureTests.swift */; }; C12537000000000000000305 /* CloudTerminalPaneReservation.swift in Sources */ = {isa = PBXBuildFile; fileRef = C12537000000000000000306 /* CloudTerminalPaneReservation.swift */; }; C12537000000000000000311 /* CloudTerminalPaneReservationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C12537000000000000000312 /* CloudTerminalPaneReservationTests.swift */; }; 2D412FC9EE3C4099815B1DD2 /* CloudTerminalPlacementTestProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E08576BC44C4D0A828F3406 /* CloudTerminalPlacementTestProvider.swift */; }; AC989E9DC99A4818AFBED880 /* CloudTerminalPlacementTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B6A72337CC749C28C28A783 /* CloudTerminalPlacementTests.swift */; }; 4AF621B6A97C434F9DC5A035 /* CloudTerminalReconnectOverlayView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 030176C8103741F8BDD27F26 /* CloudTerminalReconnectOverlayView.swift */; }; - F84FA01959714AB8A4D545DB /* CloudTerminalSourcePlacement.swift in Sources */ = {isa = PBXBuildFile; fileRef = F576381EB378486AA3B61B0C /* CloudTerminalSourcePlacement.swift */; }; C12537000000000000000111 /* CloudTerminalStartupLatencyTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C12537000000000000000112 /* CloudTerminalStartupLatencyTests.swift */; }; 8E2A2A4AACE0400798CBFE81 /* CloudToolPaneTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F31EDA1AEA6A437B8E75A489 /* CloudToolPaneTests.swift */; }; C986A0080000000000000001 /* CloudTreeActiveDrag.swift in Sources */ = {isa = PBXBuildFile; fileRef = C986A0070000000000000001 /* CloudTreeActiveDrag.swift */; }; @@ -940,11 +922,9 @@ A12357000000000000000002 /* CloudTreeTerminalNavigationCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = A12357000000000000000001 /* CloudTreeTerminalNavigationCoordinator.swift */; }; 12D5531F8CC84B0197E44AD6 /* CloudTreeTerminalRow+Directory.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36E2BECA43F1444C82AF95D3 /* CloudTreeTerminalRow+Directory.swift */; }; A12367000000000000000002 /* CloudTreeWorkspaceTitleLayoutTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A12367000000000000000001 /* CloudTreeWorkspaceTitleLayoutTests.swift */; }; - 609019DB3EE8FFF70636C933 /* CloudTuiDaemonAnswer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3DDDCABD07F6F7DE10F55146 /* CloudTuiDaemonAnswer.swift */; }; A838AA211BDA47268C683501 /* CloudTuiManualIOConnectionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A838AA211BDA47268C683502 /* CloudTuiManualIOConnectionTests.swift */; }; 124760000000000000000006 /* CloudTuiManualMirrorSession+Capabilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = 124770000000000000000006 /* CloudTuiManualMirrorSession+Capabilities.swift */; }; C11322F10000000000000001 /* CloudTuiManualMirrorSession.swift in Sources */ = {isa = PBXBuildFile; fileRef = C11322F20000000000000001 /* CloudTuiManualMirrorSession.swift */; }; - C11324910000000000000001 /* CloudTuiSurfaceIDResolution.swift in Sources */ = {isa = PBXBuildFile; fileRef = C11324920000000000000001 /* CloudTuiSurfaceIDResolution.swift */; }; 0F2A151D749994FC57D403CA /* CloudTunnelActivationObserver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8E9D51274EC32D701633288E /* CloudTunnelActivationObserver.swift */; }; 7A0CE1000000000000000106 /* CloudTunnelBackendSelectorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A0CE1000000000000000105 /* CloudTunnelBackendSelectorTests.swift */; }; 7A0CE1000000000000000730 /* CloudTunnelBannerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A0CE100000000000000072F /* CloudTunnelBannerTests.swift */; }; @@ -989,9 +969,7 @@ A13296000000000000000402 /* CloudWorkspacePresenceHeadsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A13296000000000000000401 /* CloudWorkspacePresenceHeadsTests.swift */; }; DF2AFF34D42A4505BC7EF20A /* CloudWorkspaceProjectionCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5A9286A232F4C3FAD571015 /* CloudWorkspaceProjectionCoordinator.swift */; }; D59CC3EA15344B47915B3779 /* CloudWorkspaceProjectionEnvironment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0DFE35D27805468DBA885560 /* CloudWorkspaceProjectionEnvironment.swift */; }; - CD3F805069CA4CE1B3987C05 /* CloudWorkspaceProjectionPlan.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1660E446B91349C08725BFFF /* CloudWorkspaceProjectionPlan.swift */; }; F815E08D06BE7D56541EDBB3 /* CloudWorkspaceProjectionPlanTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 774F7021C17CBDCB35670245 /* CloudWorkspaceProjectionPlanTests.swift */; }; - 2E5A89D8BBDB410B8BC59557 /* CloudWorkspaceProjectionTask.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1A5D0FC63C854C90B2974F39 /* CloudWorkspaceProjectionTask.swift */; }; 687E95C177DB42F2AC52887C /* CloudWorkspaceRenameService+Admission.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCFF3D22A9E647C0BA2B77F5 /* CloudWorkspaceRenameService+Admission.swift */; }; F3C1A7B40000000000000005 /* CloudWorkspaceRenameService+Directory.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3C1A7B40000000000000006 /* CloudWorkspaceRenameService+Directory.swift */; }; ED654029AEB34F08A9420402 /* CloudWorkspaceRenameService+Reconciliation.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFEB2668D80B41349D7CA539 /* CloudWorkspaceRenameService+Reconciliation.swift */; }; @@ -1408,8 +1386,6 @@ C7A509000000000000000002 /* CmuxTopSnapshotScopeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C7A509000000000000000001 /* CmuxTopSnapshotScopeTests.swift */; }; D9F800000000000000000001 /* CmuxTuiRemoteRouting.swift in Sources */ = {isa = PBXBuildFile; fileRef = D9F800000000000000000002 /* CmuxTuiRemoteRouting.swift */; }; D9F800000000000000000003 /* CmuxTuiRemoteRouting.swift in Sources */ = {isa = PBXBuildFile; fileRef = D9F800000000000000000002 /* CmuxTuiRemoteRouting.swift */; }; - 3CBCDC9381A949A7A6A239D0 /* CmuxTuiSnapshotParser+Displays.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1B54F1BEB0C84A15BAA2A261 /* CmuxTuiSnapshotParser+Displays.swift */; }; - 622E567166E1DC2C614E4E7F /* CmuxTuiSnapshotParser+Placement.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3349CDE9CB71FA353EA004D3 /* CmuxTuiSnapshotParser+Placement.swift */; }; 3312CA2585324CF9B4CA9D9A /* CmuxTuiSurfaceProvider+AgentNaming.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3528E32A29B49E99C636F0B /* CmuxTuiSurfaceProvider+AgentNaming.swift */; }; 81A1621623F83B61D4C5FFA9 /* CmuxTuiSurfaceProvider+AttachmentRecovery.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4D8BE7D3234A1F44E2A1C52B /* CmuxTuiSurfaceProvider+AttachmentRecovery.swift */; }; 5633045E23E44075B22C08CA /* CmuxTuiSurfaceProvider+CloseTerminal.swift in Sources */ = {isa = PBXBuildFile; fileRef = E655249E82FC412B9EC2CD21 /* CmuxTuiSurfaceProvider+CloseTerminal.swift */; }; @@ -1605,13 +1581,11 @@ C11538000000000000000001 /* CopyOnlyTextSelectionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C11538000000000000000002 /* CopyOnlyTextSelectionTests.swift */; }; C65930010000000000000002 /* CrashDiagnosticSessionPolicyTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C65930010000000000000001 /* CrashDiagnosticSessionPolicyTests.swift */; }; 46FF4C2573735348394EB428 /* CurrentWorkCommandPaletteTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8D2A0A1060BF9D77B71CE803 /* CurrentWorkCommandPaletteTests.swift */; }; - 5B9168A5518C325BFE3ECCBE /* CurrentWorkInput.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE420DDD4707A91C76AD3698 /* CurrentWorkInput.swift */; }; 4968BF255B858F36FB675B22 /* CurrentWorkPalettePresentation.swift in Sources */ = {isa = PBXBuildFile; fileRef = AFBCA7B529B723C1525D40DB /* CurrentWorkPalettePresentation.swift */; }; A83CEB14BF353C5152590A0E /* CurrentWorkQueryService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E83BB2716EBCA8C2F0A93DA /* CurrentWorkQueryService.swift */; }; 7657BE6E69D9F4E6DAE62072 /* CurrentWorkQueryServiceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = BAE3881629F4AAF8553CF302 /* CurrentWorkQueryServiceTests.swift */; }; 513FF6AFB6D63DEBD363D289 /* CurrentWorkReducer.swift in Sources */ = {isa = PBXBuildFile; fileRef = C860B4F547303C9178D9AE11 /* CurrentWorkReducer.swift */; }; A229999BB6C8A757F54AB35F /* CurrentWorkReducerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE4672716DA1806FE100CC7D /* CurrentWorkReducerTests.swift */; }; - 055FBCF06DDFAD681F134A7E /* CurrentWorkSnapshot.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8AB9B0A4AB2A6D44312708CD /* CurrentWorkSnapshot.swift */; }; C57B00080000000000000001 /* CustomSidebarPaneDataContextCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = C57B00080000000000000002 /* CustomSidebarPaneDataContextCache.swift */; }; C57B00010000000000000001 /* CustomSidebarPanel.swift in Sources */ = {isa = PBXBuildFile; fileRef = C57B00010000000000000002 /* CustomSidebarPanel.swift */; }; C57B00090000000000000001 /* CustomSidebarPanelView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C57B00090000000000000002 /* CustomSidebarPanelView.swift */; }; @@ -3226,32 +3200,23 @@ F7F3BED81BD5FE96D52055C0 /* SurfaceCatalog.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA63D377742D3A6A0BAB499B /* SurfaceCatalog.swift */; }; D01100800000000000000002 /* SurfaceCatalogQueryService.swift in Sources */ = {isa = PBXBuildFile; fileRef = D01100800000000000000001 /* SurfaceCatalogQueryService.swift */; }; D01100800000000000000004 /* SurfaceCatalogQueryServiceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D01100800000000000000003 /* SurfaceCatalogQueryServiceTests.swift */; }; - D22034B96FFC2D5F31B4311B /* SurfaceCatalogSnapshot+DeviceVisibility.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E14A2CEDB3FA23862A733F6 /* SurfaceCatalogSnapshot+DeviceVisibility.swift */; }; 5873A6BE37C34CC1082864E2 /* SurfaceCatalogTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 877BC9A2B697FEF2957397FA /* SurfaceCatalogTests.swift */; }; 32A5901C769249B692FA1104 /* SurfaceDropFeedback.swift in Sources */ = {isa = PBXBuildFile; fileRef = E192919EFE65466C84C0DD68 /* SurfaceDropFeedback.swift */; }; F26476EEB1E440498FD2A4F5 /* SurfaceLayoutTerminalCreating.swift in Sources */ = {isa = PBXBuildFile; fileRef = 672C19994B1744318706972D /* SurfaceLayoutTerminalCreating.swift */; }; DEC1CE00000000000000003E /* SurfaceMachineIDDeviceEncodingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DEC1CE00000000000000003D /* SurfaceMachineIDDeviceEncodingTests.swift */; }; - 917D12A30EB4417BBE5E9E6A /* SurfaceOwnershipPolicy.swift in Sources */ = {isa = PBXBuildFile; fileRef = B7A47B5093E24AAD8DE28313 /* SurfaceOwnershipPolicy.swift */; }; C11323110000000000000001 /* SurfacePaneFactory+CloudManualMirror.swift in Sources */ = {isa = PBXBuildFile; fileRef = C11323120000000000000001 /* SurfacePaneFactory+CloudManualMirror.swift */; }; D3D6AC9CC41C0052D47883CD /* SurfacePaneFactory+ProjectionLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = A79DE8A46550805CDAB18D09 /* SurfacePaneFactory+ProjectionLayout.swift */; }; 2DA7E01B03004BDCEE13A289 /* SurfacePaneFactory.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FE7223A65E72C46927A4F02 /* SurfacePaneFactory.swift */; }; 560A57B0605EC30E23A20456 /* SurfacePaneFactoryFocusTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C58FB3F39EB94D3072C0B51 /* SurfacePaneFactoryFocusTests.swift */; }; 875200000000000000000014 /* SurfacePaneMovement.swift in Sources */ = {isa = PBXBuildFile; fileRef = 875200000000000000000004 /* SurfacePaneMovement.swift */; }; - A857C2803433CBC0C4A73119 /* SurfacePlacementSyncing.swift in Sources */ = {isa = PBXBuildFile; fileRef = A1E6488D5D32D552A9888D65 /* SurfacePlacementSyncing.swift */; }; - 6FEEA8C6D7092073E0DE9DEC /* SurfacePortEndpointCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3B78E9F9B9C233418960CB37 /* SurfacePortEndpointCache.swift */; }; - 027446BA1E1B4E69B2DCDF8A /* SurfaceProjection+WorkspaceMembership.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7DF4946E3C7A4AEEBD2E8933 /* SurfaceProjection+WorkspaceMembership.swift */; }; - 0F4B1E526E23283B5CA1FAAA /* SurfaceProjectionEndReason.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECA8DF56A13E861D787CA4AE /* SurfaceProjectionEndReason.swift */; }; D01324400000000000000006 /* SurfaceProjectionIdentity+Workspace.swift in Sources */ = {isa = PBXBuildFile; fileRef = D01324400000000000000005 /* SurfaceProjectionIdentity+Workspace.swift */; }; D01324400000000000000004 /* SurfaceProjectionIdentityTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D01324400000000000000003 /* SurfaceProjectionIdentityTests.swift */; }; A9C10D000000000000000003 /* SurfaceProjectionMaterialization+Key.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9C10D000000000000000004 /* SurfaceProjectionMaterialization+Key.swift */; }; A9C10D000000000000000002 /* SurfaceProjectionMaterialization.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9C10D000000000000000001 /* SurfaceProjectionMaterialization.swift */; }; - 932123D0170AF0015A0D5B11 /* SurfaceProjectionMutationObserving.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A569CFE4F332963728511AD /* SurfaceProjectionMutationObserving.swift */; }; 7867A0010000000000000001 /* SurfaceProjectionRestoreStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7867A0020000000000000001 /* SurfaceProjectionRestoreStore.swift */; }; D84DEF61FE7641A280419E24 /* SurfaceProvider+MaterializationValidation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3B84F249415045AF98A4730A /* SurfaceProvider+MaterializationValidation.swift */; }; EE1DE3F7E67DF1366F214AC7 /* SurfaceProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = AAED489C1C23533995AF55EA /* SurfaceProvider.swift */; }; - 58FE3B39F41CF68A632CA083 /* SurfaceRemotePlacement.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA467FE5247EDFC122C88129 /* SurfaceRemotePlacement.swift */; }; 07AFFFB52EA184A2DE379926 /* SurfaceResource+AgentIcon.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0314DFABAF2F627A93F4AF9B /* SurfaceResource+AgentIcon.swift */; }; - 91007F48E782474596D8FB7D /* SurfaceResource+CloudTitle.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7E2A1163D9B452EA3D55B5D /* SurfaceResource+CloudTitle.swift */; }; F96CAE8A14774122A5F8613B /* SurfaceResourceDragPayload.swift in Sources */ = {isa = PBXBuildFile; fileRef = 48A1307BCCDB493F49179E0B /* SurfaceResourceDragPayload.swift */; }; 3E66E7A1B2B320EC850BB174 /* SurfaceResourceDragRegistry.swift in Sources */ = {isa = PBXBuildFile; fileRef = 627B5FB396A1BF22407E8B45 /* SurfaceResourceDragRegistry.swift */; }; 12D94A2FDF834F9495F22AEE /* SurfaceResourceGroup+CloudNavigation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54EBE986DDD446A694D6EA07 /* SurfaceResourceGroup+CloudNavigation.swift */; }; @@ -3286,9 +3251,6 @@ 6F8CE4B13D081CF9C5C370B3 /* SurfaceSocketCommands.swift in Sources */ = {isa = PBXBuildFile; fileRef = 278BEFB3583AED9627966DFF /* SurfaceSocketCommands.swift */; }; 97003C82A6CDC90F8D20503F /* SurfaceSocketCommandTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = E107EF903AAF714086F52BC4 /* SurfaceSocketCommandTests.swift */; }; C51A73B40000000000000002 /* SurfaceTabBarButtonConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = C51A73B40000000000000001 /* SurfaceTabBarButtonConfiguration.swift */; }; - 9F002187F6364A9486A11818 /* SurfaceTransferOrigin.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0CD79814B2F48938BC881A7 /* SurfaceTransferOrigin.swift */; }; - BA741B057707470F9D617D61 /* SurfaceTransferRejection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45B5556BE218466AB7FBA814 /* SurfaceTransferRejection.swift */; }; - 00AB96C0C4E1432D8861951B /* SurfaceWorkspaceCreationReceipt.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0854284756934FD6BDEB5FDF /* SurfaceWorkspaceCreationReceipt.swift */; }; 9666A2019666A2019666A201 /* SwiftTestingAssertions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9666A2029666A2029666A202 /* SwiftTestingAssertions.swift */; }; 372153DEDA910ADC47F88E87 /* SyntheticProcessSnapshotReader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6E4BCCFBEFDD1E77E23E7D94 /* SyntheticProcessSnapshotReader.swift */; }; A7206A010000000000000001 /* SystemAppearanceObserver.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7206A020000000000000001 /* SystemAppearanceObserver.swift */; }; @@ -4852,12 +4814,10 @@ B9000019A1B2C3D4E5F60719 /* CloseWorkspaceConfirmDialogUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CloseWorkspaceConfirmDialogUITests.swift; sourceTree = ""; }; B900001CA1B2C3D4E5F60719 /* CloseWorkspacesConfirmDialogUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CloseWorkspacesConfirmDialogUITests.swift; sourceTree = ""; }; DC9BF8F0C0B9F423BF52AFE4 /* CloudActivationPolicyTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CloudActivationPolicyTests.swift; sourceTree = ""; }; - 70C2D3786C88493F9C30B299 /* CloudAgentNameContext.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "CloudAgentNameContext.swift"; sourceTree = ""; }; 4D50DCB9771484FE2B966B07 /* CloudAgentSkillLauncher+CodingAgent.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "CloudAgentSkillLauncher+CodingAgent.swift"; sourceTree = ""; }; 0110525EA7A8A51561759317 /* CloudAgentSkillLauncher+LauncherError.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "CloudAgentSkillLauncher+LauncherError.swift"; sourceTree = ""; }; A7BA0E69E17F61ECF69C9025 /* CloudAgentSkillLauncher.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = CloudAgentSkillLauncher.swift; sourceTree = ""; }; 763D217526D3832668F47568 /* CloudAgentSkillLauncherTests.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = CloudAgentSkillLauncherTests.swift; sourceTree = ""; }; - C12537000000000000000316 /* CloudAttachmentReconcileDecision.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CloudAttachmentReconcileDecision.swift; sourceTree = ""; }; C12537000000000000000318 /* CloudAttachmentReconcileDecisionTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CloudAttachmentReconcileDecisionTests.swift; sourceTree = ""; }; 857300CAB44EEA5406233466 /* CloudBrowserAccessState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "CloudBrowserAccessState.swift"; sourceTree = ""; }; A5E3C21B3A59A40EF4132513 /* CloudBrowserAccessView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "CloudBrowserAccessView.swift"; sourceTree = ""; }; @@ -4882,11 +4842,9 @@ FFC7BA3C7C834D20B3173D36 /* CloudDirectoryTestFixture.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = CloudDirectoryTestFixture.swift; sourceTree = ""; }; 6B7DF8AE123341DEBA066731 /* CloudDisplayCatalogTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "CloudDisplayCatalogTests.swift"; sourceTree = ""; }; C10D0A200000000000000002 /* CloudDomainsCLIIntegrationTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CloudDomainsCLIIntegrationTests.swift; sourceTree = ""; }; - DD9E59E46A6A91958EE22451 /* CloudEnvDelivery.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = CloudEnvDelivery.swift; sourceTree = ""; }; 52233C6D60C4E409CDF7E321 /* CloudEnvDeliveryTests.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = CloudEnvDeliveryTests.swift; sourceTree = ""; }; 668F7B9BC77445B793C0298A /* CloudFeatureAvailabilityObserver.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "CloudFeatureAvailabilityObserver.swift"; sourceTree = ""; }; EBF28FA7AB264C1AA7821248 /* CloudFeatureFlagTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CloudFeatureFlagTests.swift; sourceTree = ""; }; - DA32812C9009969F4AEA2380 /* CloudFileDelivery.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = CloudFileDelivery.swift; sourceTree = ""; }; F8FED5F6485C390988555CDA /* CloudFileDeliveryTests.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = CloudFileDeliveryTests.swift; sourceTree = ""; }; CFSR00000000000000000011 /* CloudFileExplorerBehaviorTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CloudFileExplorerBehaviorTests.swift; sourceTree = ""; }; CFSR00000000000000000001 /* CloudFileExplorerCommandRunning.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CloudFileExplorerCommandRunning.swift; sourceTree = ""; }; @@ -4938,10 +4896,8 @@ 64CB7AF7545F56E95A91B154 /* CloudNotificationSyncTests.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = CloudNotificationSyncTests.swift; sourceTree = ""; }; 01095305A629F0014A3872CE /* CloudOperationDetailsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "CloudOperationDetailsView.swift"; sourceTree = ""; }; 7B7B816D0E6DDD18F2D66C77 /* CloudOperationRecorderTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "CloudOperationRecorderTests.swift"; sourceTree = ""; }; - A12480000000000000000002 /* CloudPaneCreationFailure.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "CloudPaneCreationFailure.swift"; sourceTree = ""; }; A12480000000000000000006 /* CloudPaneCreationFailureStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "CloudPaneCreationFailureStore.swift"; sourceTree = ""; }; A12480000000000000000004 /* CloudPaneCreationFailureView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Panels/CloudPaneCreationFailureView.swift; sourceTree = ""; }; - C12537000000000000000222 /* CloudPaneCreationPhase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CloudPaneCreationPhase.swift; sourceTree = ""; }; C12537000000000000000216 /* CloudPaneCreationRetryTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CloudPaneCreationRetryTests.swift; sourceTree = ""; }; A22E92B91E0FFF066AE10237 /* CloudPlacementCoordinator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = CloudPlacementCoordinator.swift; sourceTree = ""; }; F0FD4E01EAF1B2F306A96F6F /* CloudPlacementCoordinatorTests.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = CloudPlacementCoordinatorTests.swift; sourceTree = ""; }; @@ -4955,7 +4911,6 @@ 7A0CE100000000000000072B /* CloudPortRoutePlanTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CloudPortRoutePlanTests.swift; sourceTree = ""; }; 530E939E21CAEE902D2375CE /* CloudPortsVPNAffordanceTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "CloudPortsVPNAffordanceTests.swift"; sourceTree = ""; }; 1E6077A4B6CC441EB3668651 /* CloudPrivateRouteSelectionTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CloudPrivateRouteSelectionTests.swift; sourceTree = ""; }; - A09B853868B54438A5B14F26 /* CloudProviderRefreshCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "CloudProviderRefreshCoordinator.swift"; sourceTree = ""; }; 5C2A7143303749BE82E51F69 /* CloudProviderRefreshCoordinatorTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CloudProviderRefreshCoordinatorTests.swift; sourceTree = ""; }; C13151C00000000000000030 /* CloudReadIdentityAuthClient.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "CloudReadIdentityAuthClient.swift"; sourceTree = ""; }; C12625B00000000000000005 /* CloudReadManualClock.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CloudReadManualClock.swift; sourceTree = ""; }; @@ -5001,25 +4956,16 @@ 13019A000000000000000005 /* CloudTeamPickerRow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CloudTeamPickerRow.swift; sourceTree = ""; }; CA268D4CE6EFBDFFB69F9B7E /* CloudTeamPickerTeamRow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "CloudTeamPickerTeamRow.swift"; sourceTree = ""; }; 13019C000000000000000001 /* CloudTeamScopeObserver.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "CloudTeamScopeObserver.swift"; sourceTree = ""; }; - 79064B52A25D34860A759BF8 /* CloudTerminalAttachmentLog.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CloudTerminalAttachmentLog.swift; sourceTree = ""; }; BBC170FBE7AEBB71A5BE2922 /* CloudTerminalAttachmentRecoveryTests.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = CloudTerminalAttachmentRecoveryTests.swift; sourceTree = ""; }; - A29A5C49E1A5590D63BCF886 /* CloudTerminalAttachmentResolver.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CloudTerminalAttachmentResolver.swift; sourceTree = ""; }; - 947764E7C455B796ECC69524 /* CloudTerminalAttachmentRetryPolicy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CloudTerminalAttachmentRetryPolicy.swift; sourceTree = ""; }; - 1E84EAB5FE90BA20FBC54BCA /* CloudTerminalAttachmentRetryScheduler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CloudTerminalAttachmentRetryScheduler.swift; sourceTree = ""; }; C12537000000000000000314 /* CloudTerminalCardFlashRegressionTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CloudTerminalCardFlashRegressionTests.swift; sourceTree = ""; }; C12537000000000000000310 /* CloudTerminalConnectionPresentationPolicyTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CloudTerminalConnectionPresentationPolicyTests.swift; sourceTree = ""; }; 9720CD7F02C94F41A07E193D /* CloudTerminalCreationCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CloudTerminalCreationCoordinator.swift; sourceTree = ""; }; 80491D6123C848EB921CB912 /* CloudTerminalCreationCoordinatorTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CloudTerminalCreationCoordinatorTests.swift; sourceTree = ""; }; - D82BE8329ACF4AA8A273EAD3 /* CloudTerminalCreationReceipt.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CloudTerminalCreationReceipt.swift; sourceTree = ""; }; - C12537000000000000000232 /* CloudTerminalCreationRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CloudTerminalCreationRequest.swift; sourceTree = ""; }; C12537000000000000000236 /* CloudTerminalCreationRequestTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CloudTerminalCreationRequestTests.swift; sourceTree = ""; }; C13304000000000000000002 /* CloudTerminalDragSplitRoutingTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CloudTerminalDragSplitRoutingTests.swift; sourceTree = ""; }; C12537000000000000000202 /* CloudTerminalLayoutCreation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CloudTerminalLayoutCreation.swift; sourceTree = ""; }; - C12537000000000000000224 /* CloudTerminalLayoutCreationResult.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CloudTerminalLayoutCreationResult.swift; sourceTree = ""; }; C12537000000000000000204 /* CloudTerminalLayoutCreationTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CloudTerminalLayoutCreationTests.swift; sourceTree = ""; }; - 4AF4519950554AD4ADB6A816 /* CloudTerminalMutationCommandRunner.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CloudTerminalMutationCommandRunner.swift; sourceTree = ""; }; 1D870ED5A4564CACB9076D0A /* CloudTerminalMutationLifecycleTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CloudTerminalMutationLifecycleTests.swift; sourceTree = ""; }; - 492C126DDA2B4A9984EE0793 /* CloudTerminalMutationQueue.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CloudTerminalMutationQueue.swift; sourceTree = ""; }; 7F9090F374394C919C7167F3 /* CloudTerminalMutationRetirementTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CloudTerminalMutationRetirementTests.swift; sourceTree = ""; }; BA4ECAEE65C944D489A1F10D /* CloudTerminalMutationSocketRunner.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CloudTerminalMutationSocketRunner.swift; sourceTree = ""; }; 71EFC80DF0A14843B8F87A25 /* CloudTerminalMutationSocketTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CloudTerminalMutationSocketTests.swift; sourceTree = ""; }; @@ -5029,14 +4975,12 @@ E8B84121942246E093607E66 /* CloudTerminalNavigationFixture.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CloudTerminalNavigationFixture.swift; sourceTree = ""; }; D853971C8DC24A10B8A923D6 /* CloudTerminalNavigationTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CloudTerminalNavigationTests.swift; sourceTree = ""; }; DF976CA511F242519ADA8204 /* CloudTerminalOverlayCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CloudTerminalOverlayCoordinator.swift; sourceTree = ""; }; - FA0000000000000000000006 /* CloudTerminalPaneClosure.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CloudTerminalPaneClosure.swift; sourceTree = ""; }; FA0000000000000000000004 /* CloudTerminalPaneClosureTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CloudTerminalPaneClosureTests.swift; sourceTree = ""; }; C12537000000000000000306 /* CloudTerminalPaneReservation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CloudTerminalPaneReservation.swift; sourceTree = ""; }; C12537000000000000000312 /* CloudTerminalPaneReservationTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CloudTerminalPaneReservationTests.swift; sourceTree = ""; }; 4E08576BC44C4D0A828F3406 /* CloudTerminalPlacementTestProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CloudTerminalPlacementTestProvider.swift; sourceTree = ""; }; 1B6A72337CC749C28C28A783 /* CloudTerminalPlacementTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CloudTerminalPlacementTests.swift; sourceTree = ""; }; 030176C8103741F8BDD27F26 /* CloudTerminalReconnectOverlayView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CloudTerminalReconnectOverlayView.swift; sourceTree = ""; }; - F576381EB378486AA3B61B0C /* CloudTerminalSourcePlacement.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CloudTerminalSourcePlacement.swift; sourceTree = ""; }; C12537000000000000000112 /* CloudTerminalStartupLatencyTests.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = CloudTerminalStartupLatencyTests.swift; sourceTree = ""; }; F31EDA1AEA6A437B8E75A489 /* CloudToolPaneTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CloudToolPaneTests.swift; sourceTree = ""; }; C986A0070000000000000001 /* CloudTreeActiveDrag.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CloudTreeActiveDrag.swift; sourceTree = ""; }; @@ -5093,11 +5037,9 @@ A12357000000000000000001 /* CloudTreeTerminalNavigationCoordinator.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = CloudTreeTerminalNavigationCoordinator.swift; sourceTree = ""; }; 36E2BECA43F1444C82AF95D3 /* CloudTreeTerminalRow+Directory.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "CloudTreeTerminalRow+Directory.swift"; sourceTree = ""; }; A12367000000000000000001 /* CloudTreeWorkspaceTitleLayoutTests.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = CloudTreeWorkspaceTitleLayoutTests.swift; sourceTree = ""; }; - 3DDDCABD07F6F7DE10F55146 /* CloudTuiDaemonAnswer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CloudTuiDaemonAnswer.swift; sourceTree = ""; }; A838AA211BDA47268C683502 /* CloudTuiManualIOConnectionTests.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = CloudTuiManualIOConnectionTests.swift; sourceTree = ""; }; 124770000000000000000006 /* CloudTuiManualMirrorSession+Capabilities.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Sources/Cloud/CloudTuiManualMirrorSession+Capabilities.swift"; sourceTree = SOURCE_ROOT; }; C11322F20000000000000001 /* CloudTuiManualMirrorSession.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CloudTuiManualMirrorSession.swift; sourceTree = ""; }; - C11324920000000000000001 /* CloudTuiSurfaceIDResolution.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CloudTuiSurfaceIDResolution.swift; sourceTree = ""; }; 8E9D51274EC32D701633288E /* CloudTunnelActivationObserver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = CloudTunnelActivationObserver.swift; sourceTree = ""; }; 7A0CE1000000000000000105 /* CloudTunnelBackendSelectorTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CloudTunnelBackendSelectorTests.swift; sourceTree = ""; }; 7A0CE100000000000000072F /* CloudTunnelBannerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CloudTunnelBannerTests.swift; sourceTree = ""; }; @@ -5142,9 +5084,7 @@ A13296000000000000000401 /* CloudWorkspacePresenceHeadsTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CloudWorkspacePresenceHeadsTests.swift; sourceTree = ""; }; A5A9286A232F4C3FAD571015 /* CloudWorkspaceProjectionCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "CloudWorkspaceProjectionCoordinator.swift"; sourceTree = ""; }; 0DFE35D27805468DBA885560 /* CloudWorkspaceProjectionEnvironment.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "CloudWorkspaceProjectionEnvironment.swift"; sourceTree = ""; }; - 1660E446B91349C08725BFFF /* CloudWorkspaceProjectionPlan.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "CloudWorkspaceProjectionPlan.swift"; sourceTree = ""; }; 774F7021C17CBDCB35670245 /* CloudWorkspaceProjectionPlanTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "CloudWorkspaceProjectionPlanTests.swift"; sourceTree = ""; }; - 1A5D0FC63C854C90B2974F39 /* CloudWorkspaceProjectionTask.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "CloudWorkspaceProjectionTask.swift"; sourceTree = ""; }; DCFF3D22A9E647C0BA2B77F5 /* CloudWorkspaceRenameService+Admission.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "CloudWorkspaceRenameService+Admission.swift"; sourceTree = ""; }; F3C1A7B40000000000000006 /* CloudWorkspaceRenameService+Directory.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "CloudWorkspaceRenameService+Directory.swift"; sourceTree = ""; }; BFEB2668D80B41349D7CA539 /* CloudWorkspaceRenameService+Reconciliation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "CloudWorkspaceRenameService+Reconciliation.swift"; sourceTree = ""; }; @@ -5449,8 +5389,6 @@ C7A5090000000000000005A1 /* CmuxTopSnapshotScopeCacheTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CmuxTopSnapshotScopeCacheTests.swift; sourceTree = ""; }; C7A509000000000000000001 /* CmuxTopSnapshotScopeTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CmuxTopSnapshotScopeTests.swift; sourceTree = ""; }; D9F800000000000000000002 /* CmuxTuiRemoteRouting.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = CmuxTuiRemoteRouting.swift; sourceTree = ""; }; - 1B54F1BEB0C84A15BAA2A261 /* CmuxTuiSnapshotParser+Displays.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "CmuxTuiSnapshotParser+Displays.swift"; sourceTree = ""; }; - 3349CDE9CB71FA353EA004D3 /* CmuxTuiSnapshotParser+Placement.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "CmuxTuiSnapshotParser+Placement.swift"; sourceTree = ""; }; E3528E32A29B49E99C636F0B /* CmuxTuiSurfaceProvider+AgentNaming.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "CmuxTuiSurfaceProvider+AgentNaming.swift"; sourceTree = ""; }; 4D8BE7D3234A1F44E2A1C52B /* CmuxTuiSurfaceProvider+AttachmentRecovery.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "CmuxTuiSurfaceProvider+AttachmentRecovery.swift"; sourceTree = ""; }; E655249E82FC412B9EC2CD21 /* CmuxTuiSurfaceProvider+CloseTerminal.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "CmuxTuiSurfaceProvider+CloseTerminal.swift"; sourceTree = ""; }; @@ -5635,13 +5573,11 @@ C11538000000000000000002 /* CopyOnlyTextSelectionTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CopyOnlyTextSelectionTests.swift; sourceTree = ""; }; C65930010000000000000001 /* CrashDiagnosticSessionPolicyTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CrashDiagnosticSessionPolicyTests.swift; sourceTree = ""; }; 8D2A0A1060BF9D77B71CE803 /* CurrentWorkCommandPaletteTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "CurrentWorkCommandPaletteTests.swift"; sourceTree = ""; }; - AE420DDD4707A91C76AD3698 /* CurrentWorkInput.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "CurrentWorkInput.swift"; sourceTree = ""; }; AFBCA7B529B723C1525D40DB /* CurrentWorkPalettePresentation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "CommandPalette/CurrentWorkPalettePresentation.swift"; sourceTree = ""; }; 9E83BB2716EBCA8C2F0A93DA /* CurrentWorkQueryService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "CurrentWorkQueryService.swift"; sourceTree = ""; }; BAE3881629F4AAF8553CF302 /* CurrentWorkQueryServiceTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "CurrentWorkQueryServiceTests.swift"; sourceTree = ""; }; C860B4F547303C9178D9AE11 /* CurrentWorkReducer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "CurrentWorkReducer.swift"; sourceTree = ""; }; DE4672716DA1806FE100CC7D /* CurrentWorkReducerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "CurrentWorkReducerTests.swift"; sourceTree = ""; }; - 8AB9B0A4AB2A6D44312708CD /* CurrentWorkSnapshot.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "CurrentWorkSnapshot.swift"; sourceTree = ""; }; C57B00080000000000000002 /* CustomSidebarPaneDataContextCache.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Panels/CustomSidebarPaneDataContextCache.swift; sourceTree = ""; }; C57B00010000000000000002 /* CustomSidebarPanel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Panels/CustomSidebarPanel.swift; sourceTree = ""; }; C57B00090000000000000002 /* CustomSidebarPanelView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Panels/CustomSidebarPanelView.swift; sourceTree = ""; }; @@ -7232,32 +7168,23 @@ EA63D377742D3A6A0BAB499B /* SurfaceCatalog.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = SurfaceCatalog.swift; sourceTree = ""; }; D01100800000000000000001 /* SurfaceCatalogQueryService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SurfaceCatalogQueryService.swift; sourceTree = ""; }; D01100800000000000000003 /* SurfaceCatalogQueryServiceTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SurfaceCatalogQueryServiceTests.swift; sourceTree = ""; }; - 3E14A2CEDB3FA23862A733F6 /* SurfaceCatalogSnapshot+DeviceVisibility.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "SurfaceCatalogSnapshot+DeviceVisibility.swift"; sourceTree = ""; }; 877BC9A2B697FEF2957397FA /* SurfaceCatalogTests.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = SurfaceCatalogTests.swift; sourceTree = ""; }; E192919EFE65466C84C0DD68 /* SurfaceDropFeedback.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SurfaceDropFeedback.swift; sourceTree = ""; }; 672C19994B1744318706972D /* SurfaceLayoutTerminalCreating.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "SurfaceLayoutTerminalCreating.swift"; sourceTree = ""; }; DEC1CE00000000000000003D /* SurfaceMachineIDDeviceEncodingTests.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = SurfaceMachineIDDeviceEncodingTests.swift; sourceTree = ""; }; - B7A47B5093E24AAD8DE28313 /* SurfaceOwnershipPolicy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SurfaceOwnershipPolicy.swift; sourceTree = ""; }; C11323120000000000000001 /* SurfacePaneFactory+CloudManualMirror.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "SurfacePaneFactory+CloudManualMirror.swift"; sourceTree = ""; }; A79DE8A46550805CDAB18D09 /* SurfacePaneFactory+ProjectionLayout.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "SurfacePaneFactory+ProjectionLayout.swift"; sourceTree = ""; }; 1FE7223A65E72C46927A4F02 /* SurfacePaneFactory.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = SurfacePaneFactory.swift; sourceTree = ""; }; 1C58FB3F39EB94D3072C0B51 /* SurfacePaneFactoryFocusTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SurfacePaneFactoryFocusTests.swift; sourceTree = ""; }; 875200000000000000000004 /* SurfacePaneMovement.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SurfacePaneMovement.swift; sourceTree = ""; }; - A1E6488D5D32D552A9888D65 /* SurfacePlacementSyncing.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "SurfacePlacementSyncing.swift"; sourceTree = ""; }; - 3B78E9F9B9C233418960CB37 /* SurfacePortEndpointCache.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SurfacePortEndpointCache.swift; sourceTree = ""; }; - 7DF4946E3C7A4AEEBD2E8933 /* SurfaceProjection+WorkspaceMembership.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "SurfaceProjection+WorkspaceMembership.swift"; sourceTree = ""; }; - ECA8DF56A13E861D787CA4AE /* SurfaceProjectionEndReason.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "SurfaceProjectionEndReason.swift"; sourceTree = ""; }; D01324400000000000000005 /* SurfaceProjectionIdentity+Workspace.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "SurfaceProjectionIdentity+Workspace.swift"; sourceTree = ""; }; D01324400000000000000003 /* SurfaceProjectionIdentityTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SurfaceProjectionIdentityTests.swift; sourceTree = ""; }; A9C10D000000000000000004 /* SurfaceProjectionMaterialization+Key.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "SurfaceProjectionMaterialization+Key.swift"; sourceTree = ""; }; A9C10D000000000000000001 /* SurfaceProjectionMaterialization.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = SurfaceProjectionMaterialization.swift; sourceTree = ""; }; - 3A569CFE4F332963728511AD /* SurfaceProjectionMutationObserving.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "Surfaces/SurfaceProjectionMutationObserving.swift"; sourceTree = ""; }; 7867A0020000000000000001 /* SurfaceProjectionRestoreStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SurfaceProjectionRestoreStore.swift; sourceTree = ""; }; 3B84F249415045AF98A4730A /* SurfaceProvider+MaterializationValidation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "SurfaceProvider+MaterializationValidation.swift"; sourceTree = ""; }; AAED489C1C23533995AF55EA /* SurfaceProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = SurfaceProvider.swift; sourceTree = ""; }; - CA467FE5247EDFC122C88129 /* SurfaceRemotePlacement.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "SurfaceRemotePlacement.swift"; sourceTree = ""; }; 0314DFABAF2F627A93F4AF9B /* SurfaceResource+AgentIcon.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "SurfaceResource+AgentIcon.swift"; sourceTree = ""; }; - A7E2A1163D9B452EA3D55B5D /* SurfaceResource+CloudTitle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "SurfaceResource+CloudTitle.swift"; sourceTree = ""; }; 48A1307BCCDB493F49179E0B /* SurfaceResourceDragPayload.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = SurfaceResourceDragPayload.swift; sourceTree = ""; }; 627B5FB396A1BF22407E8B45 /* SurfaceResourceDragRegistry.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = SurfaceResourceDragRegistry.swift; sourceTree = ""; }; 54EBE986DDD446A694D6EA07 /* SurfaceResourceGroup+CloudNavigation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "SurfaceResourceGroup+CloudNavigation.swift"; sourceTree = ""; }; @@ -7292,9 +7219,6 @@ 278BEFB3583AED9627966DFF /* SurfaceSocketCommands.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = SurfaceSocketCommands.swift; sourceTree = ""; }; E107EF903AAF714086F52BC4 /* SurfaceSocketCommandTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SurfaceSocketCommandTests.swift; sourceTree = ""; }; C51A73B40000000000000001 /* SurfaceTabBarButtonConfiguration.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SurfaceTabBarButtonConfiguration.swift; sourceTree = ""; }; - C0CD79814B2F48938BC881A7 /* SurfaceTransferOrigin.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SurfaceTransferOrigin.swift; sourceTree = ""; }; - 45B5556BE218466AB7FBA814 /* SurfaceTransferRejection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SurfaceTransferRejection.swift; sourceTree = ""; }; - 0854284756934FD6BDEB5FDF /* SurfaceWorkspaceCreationReceipt.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SurfaceWorkspaceCreationReceipt.swift; sourceTree = ""; }; 9666A2029666A2029666A202 /* SwiftTestingAssertions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SwiftTestingAssertions.swift; sourceTree = ""; }; 6E4BCCFBEFDD1E77E23E7D94 /* SyntheticProcessSnapshotReader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "SyntheticProcessSnapshotReader.swift"; sourceTree = ""; }; A7206A020000000000000001 /* SystemAppearanceObserver.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SystemAppearanceObserver.swift; sourceTree = ""; }; @@ -8546,14 +8470,8 @@ 90813BBC44D79A5D2D0A2F09 /* Surfaces */ = { isa = PBXGroup; children = ( - 3E14A2CEDB3FA23862A733F6 /* SurfaceCatalogSnapshot+DeviceVisibility.swift */, C11324820000000000000001 /* CloudManualMirrorMaterialization.swift */, - C11324920000000000000001 /* CloudTuiSurfaceIDResolution.swift */, 4D8BE7D3234A1F44E2A1C52B /* CmuxTuiSurfaceProvider+AttachmentRecovery.swift */, - 1E84EAB5FE90BA20FBC54BCA /* CloudTerminalAttachmentRetryScheduler.swift */, - 947764E7C455B796ECC69524 /* CloudTerminalAttachmentRetryPolicy.swift */, - A29A5C49E1A5590D63BCF886 /* CloudTerminalAttachmentResolver.swift */, - FA0000000000000000000006 /* CloudTerminalPaneClosure.swift */, C11323020000000000000001 /* Workspace+CloudManualMirror.swift */, 95D98692372B4596B873883C /* CloudMachineLoadingReservation.swift */, 7FCC29018E3742939CBCAE90 /* Workspace+CloudMachineLoading.swift */, @@ -8561,23 +8479,18 @@ C11323220000000000000001 /* CmuxTuiSurfaceProvider+ManualMirror.swift */, 660286CE22B478E887361407 /* SurfaceCatalog+Groups.swift */, D13184000000000000000005 /* SurfaceCatalog+WindowWorkspaceHost.swift */, - 7DF4946E3C7A4AEEBD2E8933 /* SurfaceProjection+WorkspaceMembership.swift */, 0B8876F3CE1A40FB83FF5463 /* SurfaceCatalog+WorkspaceMembership.swift */, 3FB8309C25B29D6CEE17BD64 /* SurfaceSocketCommands+VMFileDelivery.swift */, F9E053B7E9AE536377476E4B /* CmuxTuiSurfaceProvider+FileDelivery.swift */, E655249E82FC412B9EC2CD21 /* CmuxTuiSurfaceProvider+CloseTerminal.swift */, C12469AA0000000000000031 /* CmuxTuiSurfaceProvider+PendingCreationRecovery.swift */, - DA32812C9009969F4AEA2380 /* CloudFileDelivery.swift */, 4ECA6203F1AB489BDF3F7A05 /* CmuxTuiSurfaceProvider+TerminalIO.swift */, 122E7DF3DF3044E68322B11C /* CmuxTuiSurfaceProvider+TerminalPrimitives.swift */, 4BE30231700141C6F370FA63 /* CmuxTuiSurfaceProvider+Environment.swift */, - DD9E59E46A6A91958EE22451 /* CloudEnvDelivery.swift */, A79DE8A46550805CDAB18D09 /* SurfacePaneFactory+ProjectionLayout.swift */, F0508401C3A0232FEDD7F97D /* CmuxTuiSurfaceProvider+ProjectionLayout.swift */, 0314DFABAF2F627A93F4AF9B /* SurfaceResource+AgentIcon.swift */, - A7E2A1163D9B452EA3D55B5D /* SurfaceResource+CloudTitle.swift */, - 1A5D0FC63C854C90B2974F39 /* CloudWorkspaceProjectionTask.swift */, 085BB53F552B4C6A8728941E /* Workspace+CloudLayoutProjection.swift */, 2C422AAD63384578846BC05E /* TerminalController+CloudTerminalCreation.swift */, 672C19994B1744318706972D /* SurfaceLayoutTerminalCreating.swift */, @@ -8586,18 +8499,13 @@ C12537000000000000000202 /* CloudTerminalLayoutCreation.swift */, 69821B8A79404A3CA4D07699 /* CmuxTuiSurfaceProviderRegistry+Teardown.swift */, 71433FB540BA482FBBB90C12 /* CmuxTuiSurfaceProvider+Lifecycle.swift */, - 4AF4519950554AD4ADB6A816 /* CloudTerminalMutationCommandRunner.swift */, 6A3F55EC44084383A6EAFB91 /* PendingRemoteCreation.swift */, - 492C126DDA2B4A9984EE0793 /* CloudTerminalMutationQueue.swift */, - C12537000000000000000224 /* CloudTerminalLayoutCreationResult.swift */, BFEB2668D80B41349D7CA539 /* CloudWorkspaceRenameService+Reconciliation.swift */, 798894FD4FBD473BAA1D9DF6 /* SurfaceCatalog+NameAuthority.swift */, B6775F6F996E44AB577BF9A5 /* SurfaceCatalog+ProjectionQueries.swift */, 019F9382B99C46AAAEB9C91C /* SurfaceAgentNaming.swift */, E3528E32A29B49E99C636F0B /* CmuxTuiSurfaceProvider+AgentNaming.swift */, - 70C2D3786C88493F9C30B299 /* CloudAgentNameContext.swift */, D12439060000000000000002 /* CloudWorkspaceBindingReconciliation.swift */, - 1660E446B91349C08725BFFF /* CloudWorkspaceProjectionPlan.swift */, 0DFE35D27805468DBA885560 /* CloudWorkspaceProjectionEnvironment.swift */, A5A9286A232F4C3FAD571015 /* CloudWorkspaceProjectionCoordinator.swift */, 4A4A80857B8A4530BD5BC498 /* SurfaceCatalog+CloudRenameSubmission.swift */, @@ -8605,7 +8513,6 @@ AB74882A29884E378E36D645 /* SurfaceCatalog+CloudWorkspaceProjection.swift */, C12575000000000000000031 /* CloudWorkspaceDeletionLedger.swift */, C12575000000000000000035 /* SurfaceCatalog+Snapshot.swift */, - 0854284756934FD6BDEB5FDF /* SurfaceWorkspaceCreationReceipt.swift */, 7593239CC9FF488990A01C2F /* CloudWorkspaceCreationHost.swift */, CB2C09EE9F9F459C903EF706 /* CloudWorkspaceCreationOperation.swift */, E7F13E1457FF48D4B5199F8E /* CloudWorkspaceCreationCoordinator.swift */, @@ -8616,30 +8523,18 @@ D12439050000000000000002 /* CmuxTuiSurfaceProvider+WorkspaceLifecycle.swift */, A22E92B91E0FFF066AE10237 /* CloudPlacementCoordinator.swift */, 2B46AEF9309B83E909710517 /* Workspace+CloudPlacementFailure.swift */, - A12480000000000000000002 /* CloudPaneCreationFailure.swift */, A12480000000000000000006 /* CloudPaneCreationFailureStore.swift */, - C12537000000000000000316 /* CloudAttachmentReconcileDecision.swift */, C12537000000000000000308 /* Workspace+CloudTerminalReservation.swift */, C12537000000000000000306 /* CloudTerminalPaneReservation.swift */, - D82BE8329ACF4AA8A273EAD3 /* CloudTerminalCreationReceipt.swift */, 3B84F249415045AF98A4730A /* SurfaceProvider+MaterializationValidation.swift */, - F576381EB378486AA3B61B0C /* CloudTerminalSourcePlacement.swift */, - C12537000000000000000222 /* CloudPaneCreationPhase.swift */, - CA467FE5247EDFC122C88129 /* SurfaceRemotePlacement.swift */, - ECA8DF56A13E861D787CA4AE /* SurfaceProjectionEndReason.swift */, - A1E6488D5D32D552A9888D65 /* SurfacePlacementSyncing.swift */, - 3349CDE9CB71FA353EA004D3 /* CmuxTuiSnapshotParser+Placement.swift */, AAED489C1C23533995AF55EA /* SurfaceProvider.swift */, F11347000000000000000002 /* SurfaceCatalog+CloudPorts.swift */, - A09B853868B54438A5B14F26 /* CloudProviderRefreshCoordinator.swift */, 7289F02703E9435CBA1C598B /* CmuxTuiSurfaceProvider+Refresh.swift */, D01100800000000000000001 /* SurfaceCatalogQueryService.swift */, FD26BDF22AEF02E4171683F8 /* TerminalController+CurrentWork.swift */, D6E67CB4D64F9BB44F1E5794 /* AppDelegate+CurrentWork.swift */, 9E83BB2716EBCA8C2F0A93DA /* CurrentWorkQueryService.swift */, C860B4F547303C9178D9AE11 /* CurrentWorkReducer.swift */, - AE420DDD4707A91C76AD3698 /* CurrentWorkInput.swift */, - 8AB9B0A4AB2A6D44312708CD /* CurrentWorkSnapshot.swift */, D01324400000000000000005 /* SurfaceProjectionIdentity+Workspace.swift */, 278BEFB3583AED9627966DFF /* SurfaceSocketCommands.swift */, 47BBA1A8703756FDDFD53CF3 /* Workspace+SurfaceCatalog.swift */, @@ -8670,12 +8565,8 @@ 9FAF7EE2FAF54ADDB5F47C37 /* SurfaceCatalog+Displays.swift */, ED5ABA995260445394F81C79 /* CmuxTuiSurfaceProvider+Displays.swift */, C10DC1000000000000000016 /* CmuxTuiSurfaceProvider+CloudDiagnosticFailure.swift */, - 1B54F1BEB0C84A15BAA2A261 /* CmuxTuiSnapshotParser+Displays.swift */, 05CFF7107D1F48BC805549F3 /* Workspace+BrowserDuplication.swift */, 14F78AF3938A4C58A82EA25C /* Workspace+CloudDisplayOwnership.swift */, - 45B5556BE218466AB7FBA814 /* SurfaceTransferRejection.swift */, - B7A47B5093E24AAD8DE28313 /* SurfaceOwnershipPolicy.swift */, - C0CD79814B2F48938BC881A7 /* SurfaceTransferOrigin.swift */, E192919EFE65466C84C0DD68 /* SurfaceDropFeedback.swift */, B3F302DCC7D244E48146BA1F /* SurfaceCatalog+Ownership.swift */, 4A8A18F1C9A2400897AD6699 /* DockSplitStore+SurfaceOwnership.swift */, @@ -8684,7 +8575,6 @@ 113DE273128A45B791B46B00 /* AppDelegate+SurfaceOwnership.swift */, A9C10D000000000000000001 /* SurfaceProjectionMaterialization.swift */, A9C10D000000000000000004 /* SurfaceProjectionMaterialization+Key.swift */, - 3B78E9F9B9C233418960CB37 /* SurfacePortEndpointCache.swift */, A12093000000000000000001 /* CmuxTuiSurfaceProvider+Error.swift */, 7A0CE1000000000000000727 /* CmuxTuiSurfaceProvider+PortForward.swift */, C12469AA0000000000000028 /* Workspace+CloudTerminalLoading.swift */, @@ -8701,9 +8591,6 @@ isa = PBXGroup; children = ( C11322F20000000000000001 /* CloudTuiManualMirrorSession.swift */, - 79064B52A25D34860A759BF8 /* CloudTerminalAttachmentLog.swift */, - 3DDDCABD07F6F7DE10F55146 /* CloudTuiDaemonAnswer.swift */, - C12537000000000000000232 /* CloudTerminalCreationRequest.swift */, 7EC4096C4A05D3A58980308A /* NewMachineSheetPresenter.swift */, 097212CF5CB04F3B8D671C46 /* CloudWorkspaceGroupDestination.swift */, 7C2B9391A62B4D0E8AC7575F /* CloudWorkspaceOperationController.swift */, @@ -10906,7 +10793,6 @@ 283165BD31DF96F756C7E0ED /* DeviceWorkspaceCreationCoordinator.swift */, 657986DE696F4EFA73B3FAF6 /* AppDelegate+NewDeviceWorkspace.swift */, A9E3043806F1E99B63080A81 /* DeviceSurfaceProvider+TerminalLayout.swift */, - 3A569CFE4F332963728511AD /* SurfaceProjectionMutationObserving.swift */, AC22F46F54864FEDADD1EEE5 /* SurfaceCatalog+DeviceNames.swift */, DDFEB48E4700451CBC750DAE /* DeviceTerminalAttachmentStatus.swift */, DEC1CE00000000000000001D /* DeviceTerminalInputRouter.swift */, @@ -13439,17 +13325,13 @@ C10D51700000000000000002 /* ClosedItemHistory.swift in Sources */, 8772A0010000000000000001 /* ClosedItemHistoryCapacityPolicy.swift in Sources */, 89E62B0A0EB932019C29A32D /* ClosedWorkspaceHistory.swift in Sources */, - 5963AB82F2484C859AF079E1 /* CloudAgentNameContext.swift in Sources */, C62A16251EC09E72A897A2A3 /* CloudAgentSkillLauncher+CodingAgent.swift in Sources */, EAEF1B227CA5A458005D2EAD /* CloudAgentSkillLauncher+LauncherError.swift in Sources */, 68B60071A7049D7CD9C2CFD7 /* CloudAgentSkillLauncher.swift in Sources */, - C12537000000000000000315 /* CloudAttachmentReconcileDecision.swift in Sources */, 69AA6941BCDDF67E7B44CA26 /* CloudBrowserAccessState.swift in Sources */, 57C7774B1620767AED6F13B7 /* CloudBrowserAccessView.swift in Sources */, 32E508E45F3E7B0832FB99EA /* CloudDiagnosticsView.swift in Sources */, - 9D231969015CF81D75332F5E /* CloudEnvDelivery.swift in Sources */, 5EDE6BFD28BE4BD58EF84889 /* CloudFeatureAvailabilityObserver.swift in Sources */, - 00034889FEF18E9AE0AFDEEC /* CloudFileDelivery.swift in Sources */, CFSF00000000000000000001 /* CloudFileExplorerCommandRunning.swift in Sources */, F434C13ADFB45B7DD70B2191 /* CloudFileExplorerSearchQueue.swift in Sources */, CF87F1FC8930F903B0EA4831 /* CloudFileExplorerSearchRequest.swift in Sources */, @@ -13468,15 +13350,12 @@ 06A7D527A380A87E00C122EE /* CloudNotificationLocalDelivery.swift in Sources */, 0E06E7885C78B752A9AB83E2 /* CloudNotificationSyncHub.swift in Sources */, 7C98953CC5230654F2A4D628 /* CloudOperationDetailsView.swift in Sources */, - A12480000000000000000001 /* CloudPaneCreationFailure.swift in Sources */, A12480000000000000000005 /* CloudPaneCreationFailureStore.swift in Sources */, A12480000000000000000003 /* CloudPaneCreationFailureView.swift in Sources */, - C12537000000000000000221 /* CloudPaneCreationPhase.swift in Sources */, 118E574AA58D92C0A3FB893E /* CloudPlacementCoordinator.swift in Sources */, 462AE599482B727CBF10308F /* CloudPortAccessModel.swift in Sources */, 1EA5411EB2583A92811329BD /* CloudPortAccessStore.swift in Sources */, 7A0CE100000000000000071C /* CloudPortRoutePlan.swift in Sources */, - D1AC3F6282A94EAEB79D160B /* CloudProviderRefreshCoordinator.swift in Sources */, B12357000000000000000004 /* CloudSidebarDebugLabWindow.swift in Sources */, C70E8DD0BC4B4A2C9C58E093 /* CloudSidebarOrganizationDrop.swift in Sources */, 3E825519877E4FD58D1E91AC /* CloudSidebarOrganizationStore.swift in Sources */, @@ -13491,23 +13370,12 @@ 13019A000000000000000006 /* CloudTeamPickerRow.swift in Sources */, 2F646430024CB401EEC6AC0D /* CloudTeamPickerTeamRow.swift in Sources */, 13019C000000000000000002 /* CloudTeamScopeObserver.swift in Sources */, - 566CF02BA2F7CCC0BD1E387E /* CloudTerminalAttachmentLog.swift in Sources */, - 9D73C47C49EF5E117D921D05 /* CloudTerminalAttachmentResolver.swift in Sources */, - 4658DA26DAB751A74790718B /* CloudTerminalAttachmentRetryPolicy.swift in Sources */, - 43B3097AF67CF8FC236544B3 /* CloudTerminalAttachmentRetryScheduler.swift in Sources */, 3EAC8AAF4F2E473CA9DA0194 /* CloudTerminalCreationCoordinator.swift in Sources */, - 7875A5053CD44963B5DEDE89 /* CloudTerminalCreationReceipt.swift in Sources */, - C12537000000000000000231 /* CloudTerminalCreationRequest.swift in Sources */, C12537000000000000000201 /* CloudTerminalLayoutCreation.swift in Sources */, - C12537000000000000000223 /* CloudTerminalLayoutCreationResult.swift in Sources */, - 192D8036059F463091D7324B /* CloudTerminalMutationCommandRunner.swift in Sources */, - C456E44419C541B694BF9421 /* CloudTerminalMutationQueue.swift in Sources */, 4CA9D21B229D4120869D15F0 /* CloudTerminalNavigationCatalog.swift in Sources */, BD5C6A44F9B646C29565CF59 /* CloudTerminalOverlayCoordinator.swift in Sources */, - FA0000000000000000000005 /* CloudTerminalPaneClosure.swift in Sources */, C12537000000000000000305 /* CloudTerminalPaneReservation.swift in Sources */, 4AF621B6A97C434F9DC5A035 /* CloudTerminalReconnectOverlayView.swift in Sources */, - F84FA01959714AB8A4D545DB /* CloudTerminalSourcePlacement.swift in Sources */, C986A0080000000000000001 /* CloudTreeActiveDrag.swift in Sources */, 3BCFA4F10BC6F6673CFA3BFC /* CloudTreeCellView.swift in Sources */, A13086000000000000000006 /* CloudTreeContainerView.swift in Sources */, @@ -13554,10 +13422,8 @@ C986A0010000000000000001 /* CloudTreeSurfaceDragPasteboardWriter.swift in Sources */, A12357000000000000000002 /* CloudTreeTerminalNavigationCoordinator.swift in Sources */, 12D5531F8CC84B0197E44AD6 /* CloudTreeTerminalRow+Directory.swift in Sources */, - 609019DB3EE8FFF70636C933 /* CloudTuiDaemonAnswer.swift in Sources */, 124760000000000000000006 /* CloudTuiManualMirrorSession+Capabilities.swift in Sources */, C11322F10000000000000001 /* CloudTuiManualMirrorSession.swift in Sources */, - C11324910000000000000001 /* CloudTuiSurfaceIDResolution.swift in Sources */, 0F2A151D749994FC57D403CA /* CloudTunnelActivationObserver.swift in Sources */, C10D00010000000000000001 /* CloudVMActionLauncher.swift in Sources */, CFSF00000000000000000003 /* CloudVMFileExplorerProvider.swift in Sources */, @@ -13574,8 +13440,6 @@ 15E5F36E592C4D2894AF93CF /* CloudWorkspaceOperationController.swift in Sources */, DF2AFF34D42A4505BC7EF20A /* CloudWorkspaceProjectionCoordinator.swift in Sources */, D59CC3EA15344B47915B3779 /* CloudWorkspaceProjectionEnvironment.swift in Sources */, - CD3F805069CA4CE1B3987C05 /* CloudWorkspaceProjectionPlan.swift in Sources */, - 2E5A89D8BBDB410B8BC59557 /* CloudWorkspaceProjectionTask.swift in Sources */, 687E95C177DB42F2AC52887C /* CloudWorkspaceRenameService+Admission.swift in Sources */, F3C1A7B40000000000000005 /* CloudWorkspaceRenameService+Directory.swift in Sources */, ED654029AEB34F08A9420402 /* CloudWorkspaceRenameService+Reconciliation.swift in Sources */, @@ -13666,8 +13530,6 @@ C7A501000000000000000002 /* CmuxTopSnapshot.swift in Sources */, C7A508000000000000000002 /* CmuxTopSnapshotScopeCache.swift in Sources */, D9F800000000000000000001 /* CmuxTuiRemoteRouting.swift in Sources */, - 3CBCDC9381A949A7A6A239D0 /* CmuxTuiSnapshotParser+Displays.swift in Sources */, - 622E567166E1DC2C614E4E7F /* CmuxTuiSnapshotParser+Placement.swift in Sources */, 3312CA2585324CF9B4CA9D9A /* CmuxTuiSurfaceProvider+AgentNaming.swift in Sources */, 81A1621623F83B61D4C5FFA9 /* CmuxTuiSurfaceProvider+AttachmentRecovery.swift in Sources */, 5633045E23E44075B22C08CA /* CmuxTuiSurfaceProvider+CloseTerminal.swift in Sources */, @@ -13774,11 +13636,9 @@ D8684000000000000000000F /* ControlSurfaceResumeTarget.swift in Sources */, 93300005A1B2C3D4E5F60718 /* ControlTerminalSocketBindingState.swift in Sources */, C11538000000000000000003 /* CopyOnlyTextSelection.swift in Sources */, - 5B9168A5518C325BFE3ECCBE /* CurrentWorkInput.swift in Sources */, 4968BF255B858F36FB675B22 /* CurrentWorkPalettePresentation.swift in Sources */, A83CEB14BF353C5152590A0E /* CurrentWorkQueryService.swift in Sources */, 513FF6AFB6D63DEBD363D289 /* CurrentWorkReducer.swift in Sources */, - 055FBCF06DDFAD681F134A7E /* CurrentWorkSnapshot.swift in Sources */, C57B00080000000000000001 /* CustomSidebarPaneDataContextCache.swift in Sources */, C57B00010000000000000001 /* CustomSidebarPanel.swift in Sources */, C57B00090000000000000001 /* CustomSidebarPanelView.swift in Sources */, @@ -14846,28 +14706,19 @@ 00B9FC4EDB2E47F6819B01C4 /* SurfaceCatalog+WorkspaceMembership.swift in Sources */, F7F3BED81BD5FE96D52055C0 /* SurfaceCatalog.swift in Sources */, D01100800000000000000002 /* SurfaceCatalogQueryService.swift in Sources */, - D22034B96FFC2D5F31B4311B /* SurfaceCatalogSnapshot+DeviceVisibility.swift in Sources */, 32A5901C769249B692FA1104 /* SurfaceDropFeedback.swift in Sources */, F26476EEB1E440498FD2A4F5 /* SurfaceLayoutTerminalCreating.swift in Sources */, - 917D12A30EB4417BBE5E9E6A /* SurfaceOwnershipPolicy.swift in Sources */, C11323110000000000000001 /* SurfacePaneFactory+CloudManualMirror.swift in Sources */, D3D6AC9CC41C0052D47883CD /* SurfacePaneFactory+ProjectionLayout.swift in Sources */, 2DA7E01B03004BDCEE13A289 /* SurfacePaneFactory.swift in Sources */, 875200000000000000000014 /* SurfacePaneMovement.swift in Sources */, - A857C2803433CBC0C4A73119 /* SurfacePlacementSyncing.swift in Sources */, - 6FEEA8C6D7092073E0DE9DEC /* SurfacePortEndpointCache.swift in Sources */, - 027446BA1E1B4E69B2DCDF8A /* SurfaceProjection+WorkspaceMembership.swift in Sources */, - 0F4B1E526E23283B5CA1FAAA /* SurfaceProjectionEndReason.swift in Sources */, D01324400000000000000006 /* SurfaceProjectionIdentity+Workspace.swift in Sources */, A9C10D000000000000000003 /* SurfaceProjectionMaterialization+Key.swift in Sources */, A9C10D000000000000000002 /* SurfaceProjectionMaterialization.swift in Sources */, - 932123D0170AF0015A0D5B11 /* SurfaceProjectionMutationObserving.swift in Sources */, 7867A0010000000000000001 /* SurfaceProjectionRestoreStore.swift in Sources */, D84DEF61FE7641A280419E24 /* SurfaceProvider+MaterializationValidation.swift in Sources */, EE1DE3F7E67DF1366F214AC7 /* SurfaceProvider.swift in Sources */, - 58FE3B39F41CF68A632CA083 /* SurfaceRemotePlacement.swift in Sources */, 07AFFFB52EA184A2DE379926 /* SurfaceResource+AgentIcon.swift in Sources */, - 91007F48E782474596D8FB7D /* SurfaceResource+CloudTitle.swift in Sources */, F96CAE8A14774122A5F8613B /* SurfaceResourceDragPayload.swift in Sources */, 3E66E7A1B2B320EC850BB174 /* SurfaceResourceDragRegistry.swift in Sources */, 12D94A2FDF834F9495F22AEE /* SurfaceResourceGroup+CloudNavigation.swift in Sources */, @@ -14893,9 +14744,6 @@ DE0A507C430CF37E256D7E29 /* SurfaceSocketCommands+VMFileDelivery.swift in Sources */, 6F8CE4B13D081CF9C5C370B3 /* SurfaceSocketCommands.swift in Sources */, C51A73B40000000000000002 /* SurfaceTabBarButtonConfiguration.swift in Sources */, - 9F002187F6364A9486A11818 /* SurfaceTransferOrigin.swift in Sources */, - BA741B057707470F9D617D61 /* SurfaceTransferRejection.swift in Sources */, - 00AB96C0C4E1432D8861951B /* SurfaceWorkspaceCreationReceipt.swift in Sources */, A7206A010000000000000001 /* SystemAppearanceObserver.swift in Sources */, A7206F010000000000000001 /* SystemAppearanceObserverEnvironment.swift in Sources */, C7B0FACE000000000000000C /* SystemCommandRunner.swift in Sources */, diff --git a/cmuxTests/CloudAttachmentReconcileDecisionTests.swift b/cmuxTests/CloudAttachmentReconcileDecisionTests.swift index 907df696f120..44bf4d8ce365 100644 --- a/cmuxTests/CloudAttachmentReconcileDecisionTests.swift +++ b/cmuxTests/CloudAttachmentReconcileDecisionTests.swift @@ -1,3 +1,4 @@ +import CmuxCloud import CmuxCloudTui import Foundation import Testing diff --git a/cmuxTests/CloudDesktopGraphOpenTests.swift b/cmuxTests/CloudDesktopGraphOpenTests.swift index ca96d5d9979d..6b0b1c32998e 100644 --- a/cmuxTests/CloudDesktopGraphOpenTests.swift +++ b/cmuxTests/CloudDesktopGraphOpenTests.swift @@ -1,3 +1,4 @@ +import CmuxCloud import Foundation import CmuxSurfaceCatalogModel import Testing diff --git a/cmuxTests/CloudDesktopNavigationLifecycleTests.swift b/cmuxTests/CloudDesktopNavigationLifecycleTests.swift index 31eae1fe31af..cdda36ca9052 100644 --- a/cmuxTests/CloudDesktopNavigationLifecycleTests.swift +++ b/cmuxTests/CloudDesktopNavigationLifecycleTests.swift @@ -1,3 +1,4 @@ +import CmuxCloud import Foundation import Testing import WebKit diff --git a/cmuxTests/CloudEnvDeliveryTests.swift b/cmuxTests/CloudEnvDeliveryTests.swift index b9c3c579ff8f..434b28d5aed4 100644 --- a/cmuxTests/CloudEnvDeliveryTests.swift +++ b/cmuxTests/CloudEnvDeliveryTests.swift @@ -1,3 +1,4 @@ +import CmuxCloud import CmuxCloudTui import Foundation import Testing diff --git a/cmuxTests/CloudFileDeliveryTests.swift b/cmuxTests/CloudFileDeliveryTests.swift index 5f74a81cdbdf..53989594dc32 100644 --- a/cmuxTests/CloudFileDeliveryTests.swift +++ b/cmuxTests/CloudFileDeliveryTests.swift @@ -1,3 +1,4 @@ +import CmuxCloud import Foundation import Testing #if canImport(cmux_DEV) diff --git a/cmuxTests/CloudNameAuthorityFixture.swift b/cmuxTests/CloudNameAuthorityFixture.swift index 01956f9df47c..e5c8b085be7d 100644 --- a/cmuxTests/CloudNameAuthorityFixture.swift +++ b/cmuxTests/CloudNameAuthorityFixture.swift @@ -1,3 +1,4 @@ +import CmuxCloud import CmuxSurfaceCatalogModel import Foundation import Testing diff --git a/cmuxTests/CloudNativeLayoutProjectionTests.swift b/cmuxTests/CloudNativeLayoutProjectionTests.swift index 03195e463711..5bf8a83a3154 100644 --- a/cmuxTests/CloudNativeLayoutProjectionTests.swift +++ b/cmuxTests/CloudNativeLayoutProjectionTests.swift @@ -1,6 +1,7 @@ import CMUXMobileCore import CMUXAuthCore import CmuxAuthRuntime +import CmuxCloud import CmuxCore import CmuxIrohTransport import CmuxSurfaceCatalogModel diff --git a/cmuxTests/CloudPlacementCoordinatorTests.swift b/cmuxTests/CloudPlacementCoordinatorTests.swift index 3bfcaab07d30..09555c12c46c 100644 --- a/cmuxTests/CloudPlacementCoordinatorTests.swift +++ b/cmuxTests/CloudPlacementCoordinatorTests.swift @@ -1,3 +1,4 @@ +import CmuxCloud import CmuxCloudTui import CmuxSurfaceCatalogModel import Foundation diff --git a/cmuxTests/CloudPlacementTestProvider.swift b/cmuxTests/CloudPlacementTestProvider.swift index 5e0157ceee4d..b725d10bb4d1 100644 --- a/cmuxTests/CloudPlacementTestProvider.swift +++ b/cmuxTests/CloudPlacementTestProvider.swift @@ -1,3 +1,4 @@ +import CmuxCloud import CmuxSurfaceCatalogModel import Foundation import Testing diff --git a/cmuxTests/CloudSidebarConsistencyTests.swift b/cmuxTests/CloudSidebarConsistencyTests.swift index 80eb4038149b..22dd052b6ca2 100644 --- a/cmuxTests/CloudSidebarConsistencyTests.swift +++ b/cmuxTests/CloudSidebarConsistencyTests.swift @@ -1,3 +1,4 @@ +import CmuxCloud import CmuxSurfaceCatalogModel import Foundation import Testing diff --git a/cmuxTests/CloudSurfaceDragFeedbackTests.swift b/cmuxTests/CloudSurfaceDragFeedbackTests.swift index dc64c9a22f46..142cb7dd6855 100644 --- a/cmuxTests/CloudSurfaceDragFeedbackTests.swift +++ b/cmuxTests/CloudSurfaceDragFeedbackTests.swift @@ -1,3 +1,4 @@ +import CmuxCloud import AppKit import Bonsplit import CmuxSurfaceCatalogModel diff --git a/cmuxTests/CloudSurfaceMoveOwnershipTests.swift b/cmuxTests/CloudSurfaceMoveOwnershipTests.swift index 0954467f24e8..1ab338b96556 100644 --- a/cmuxTests/CloudSurfaceMoveOwnershipTests.swift +++ b/cmuxTests/CloudSurfaceMoveOwnershipTests.swift @@ -1,3 +1,4 @@ +import CmuxCloud import AppKit import Bonsplit import CmuxCore diff --git a/cmuxTests/CloudTerminalDragSplitRoutingTests.swift b/cmuxTests/CloudTerminalDragSplitRoutingTests.swift index 8f7d655a7a42..612b85960c5d 100644 --- a/cmuxTests/CloudTerminalDragSplitRoutingTests.swift +++ b/cmuxTests/CloudTerminalDragSplitRoutingTests.swift @@ -1,3 +1,4 @@ +import CmuxCloud import Bonsplit import CmuxCore import CmuxSurfaceCatalogModel diff --git a/cmuxTests/CloudTerminalPaneClosureTests.swift b/cmuxTests/CloudTerminalPaneClosureTests.swift index feba49cabd3c..0f13606c8526 100644 --- a/cmuxTests/CloudTerminalPaneClosureTests.swift +++ b/cmuxTests/CloudTerminalPaneClosureTests.swift @@ -1,3 +1,4 @@ +import CmuxCloud import Foundation import Testing #if canImport(cmux_DEV) diff --git a/cmuxTests/CloudWorkspaceCreationSidebarProvider.swift b/cmuxTests/CloudWorkspaceCreationSidebarProvider.swift index d0e9c4221e49..e143dd794700 100644 --- a/cmuxTests/CloudWorkspaceCreationSidebarProvider.swift +++ b/cmuxTests/CloudWorkspaceCreationSidebarProvider.swift @@ -1,3 +1,4 @@ +import CmuxCloud import CmuxSurfaceCatalogModel import Foundation import Testing diff --git a/cmuxTests/CloudWorkspaceLiveProjectionTests.swift b/cmuxTests/CloudWorkspaceLiveProjectionTests.swift index 9d8de796fcd6..d186677fa040 100644 --- a/cmuxTests/CloudWorkspaceLiveProjectionTests.swift +++ b/cmuxTests/CloudWorkspaceLiveProjectionTests.swift @@ -1,3 +1,4 @@ +import CmuxCloud import CmuxSurfaceCatalogModel import Foundation import Testing diff --git a/cmuxTests/CloudWorkspaceMembershipTests.swift b/cmuxTests/CloudWorkspaceMembershipTests.swift index b7e9a9af2ec5..c46d1886db90 100644 --- a/cmuxTests/CloudWorkspaceMembershipTests.swift +++ b/cmuxTests/CloudWorkspaceMembershipTests.swift @@ -1,3 +1,4 @@ +import CmuxCloud import CmuxSurfaceCatalogModel import Foundation import Testing diff --git a/cmuxTests/CloudWorkspaceProjectionPlanTests.swift b/cmuxTests/CloudWorkspaceProjectionPlanTests.swift index d323b002b7f2..f84335489c88 100644 --- a/cmuxTests/CloudWorkspaceProjectionPlanTests.swift +++ b/cmuxTests/CloudWorkspaceProjectionPlanTests.swift @@ -1,3 +1,4 @@ +import CmuxCloud import Foundation import CmuxSurfaceCatalogModel import Testing diff --git a/cmuxTests/CurrentWorkCommandPaletteTests.swift b/cmuxTests/CurrentWorkCommandPaletteTests.swift index d08d3c7e297d..d0ab091622d1 100644 --- a/cmuxTests/CurrentWorkCommandPaletteTests.swift +++ b/cmuxTests/CurrentWorkCommandPaletteTests.swift @@ -1,3 +1,4 @@ +import CmuxCloud import CmuxCommandPalette import CmuxSurfaceCatalogModel import Foundation diff --git a/cmuxTests/CurrentWorkReducerTests.swift b/cmuxTests/CurrentWorkReducerTests.swift index 1973db235c7c..e22fc7f0a636 100644 --- a/cmuxTests/CurrentWorkReducerTests.swift +++ b/cmuxTests/CurrentWorkReducerTests.swift @@ -1,3 +1,4 @@ +import CmuxCloud import CmuxSurfaceCatalogModel import Foundation import Testing diff --git a/cmuxTests/SetAutoTitleSocketTests.swift b/cmuxTests/SetAutoTitleSocketTests.swift index d70e081dbe09..6a2156e3406b 100644 --- a/cmuxTests/SetAutoTitleSocketTests.swift +++ b/cmuxTests/SetAutoTitleSocketTests.swift @@ -1,3 +1,4 @@ +import CmuxCloud import AppKit import Foundation import CmuxSettings