From a290e91b1215af40efe309f238ff2e32817ad659 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Mon, 20 Apr 2026 14:17:16 +0100 Subject: [PATCH] style: fix macos app lint warnings --- apps/macos/Sources/OpenClaw/AppState.swift | 118 ++++++++---------- .../OpenClaw/ExecApprovalsSocket.swift | 6 +- .../Sources/OpenClaw/GeneralSettings.swift | 4 +- .../OpenClaw/NodeMode/MacNodeRuntime.swift | 6 +- .../OpenClaw/OnboardingView+Pages.swift | 4 +- .../Sources/OpenClaw/RemoteGatewayProbe.swift | 29 +++-- .../AppStateRemoteConfigTests.swift | 105 ++++++++-------- 7 files changed, 138 insertions(+), 134 deletions(-) diff --git a/apps/macos/Sources/OpenClaw/AppState.swift b/apps/macos/Sources/OpenClaw/AppState.swift index f262aca5119..626acb69a2f 100644 --- a/apps/macos/Sources/OpenClaw/AppState.swift +++ b/apps/macos/Sources/OpenClaw/AppState.swift @@ -30,6 +30,26 @@ final class AppState { case direct } + struct RemoteGatewayConfigDraft { + var transport: RemoteTransport + var remoteUrl: String + var remoteHost: String? + var remoteTarget: String + var remoteIdentity: String + var remoteToken: String + var remoteTokenDirty: Bool + } + + struct GatewayConfigSyncDraft { + var connectionMode: ConnectionMode + var remoteTransport: RemoteTransport + var remoteTarget: String + var remoteIdentity: String + var remoteUrl: String + var remoteToken: String + var remoteTokenDirty: Bool + } + var isPaused: Bool { didSet { self.ifNotPreview { UserDefaults.standard.set(self.isPaused, forKey: pauseDefaultsKey) } } } @@ -420,25 +440,19 @@ final class AppState { private static func updatedRemoteGatewayConfig( current: [String: Any], - transport: RemoteTransport, - remoteUrl: String, - remoteHost: String?, - remoteTarget: String, - remoteIdentity: String, - remoteToken: String, - remoteTokenDirty: Bool) -> (remote: [String: Any], changed: Bool) + draft: RemoteGatewayConfigDraft) -> (remote: [String: Any], changed: Bool) { var remote = current var changed = false - switch transport { + switch draft.transport { case .direct: changed = Self.updateGatewayString( &remote, key: "transport", value: RemoteTransport.direct.rawValue) || changed - let trimmedUrl = remoteUrl.trimmingCharacters(in: .whitespacesAndNewlines) + let trimmedUrl = draft.remoteUrl.trimmingCharacters(in: .whitespacesAndNewlines) if trimmedUrl.isEmpty { changed = Self.updateGatewayString(&remote, key: "url", value: nil) || changed } else if let normalizedUrl = GatewayRemoteConfig.normalizeGatewayUrlString(trimmedUrl) { @@ -448,7 +462,7 @@ final class AppState { case .ssh: changed = Self.updateGatewayString(&remote, key: "transport", value: nil) || changed - if let host = remoteHost { + if let host = draft.remoteHost { let existingUrl = (remote["url"] as? String)? .trimmingCharacters(in: .whitespacesAndNewlines) ?? "" let parsedExisting = existingUrl.isEmpty ? nil : URL(string: existingUrl) @@ -458,13 +472,13 @@ final class AppState { changed = Self.updateGatewayString(&remote, key: "url", value: desiredUrl) || changed } - let sanitizedTarget = Self.sanitizeSSHTarget(remoteTarget) + let sanitizedTarget = Self.sanitizeSSHTarget(draft.remoteTarget) changed = Self.updateGatewayString(&remote, key: "sshTarget", value: sanitizedTarget) || changed - changed = Self.updateGatewayString(&remote, key: "sshIdentity", value: remoteIdentity) || changed + changed = Self.updateGatewayString(&remote, key: "sshIdentity", value: draft.remoteIdentity) || changed } - if remoteTokenDirty { - changed = Self.updateGatewayString(&remote, key: "token", value: remoteToken) || changed + if draft.remoteTokenDirty { + changed = Self.updateGatewayString(&remote, key: "token", value: draft.remoteToken) || changed } return (remote, changed) @@ -550,19 +564,13 @@ final class AppState { private static func syncedGatewayRoot( currentRoot: [String: Any], - connectionMode: ConnectionMode, - remoteTransport: RemoteTransport, - remoteTarget: String, - remoteIdentity: String, - remoteUrl: String, - remoteToken: String, - remoteTokenDirty: Bool) -> (root: [String: Any], changed: Bool) + draft: GatewayConfigSyncDraft) -> (root: [String: Any], changed: Bool) { var root = currentRoot var gateway = root["gateway"] as? [String: Any] ?? [:] var changed = false - let desiredMode: String? = switch connectionMode { + let desiredMode: String? = switch draft.connectionMode { case .local: "local" case .remote: @@ -582,18 +590,19 @@ final class AppState { changed = true } - if connectionMode == .remote { - let remoteHost = CommandResolver.parseSSHTarget(remoteTarget)?.host + if draft.connectionMode == .remote { + let remoteHost = CommandResolver.parseSSHTarget(draft.remoteTarget)?.host let currentRemote = gateway["remote"] as? [String: Any] ?? [:] let updated = Self.updatedRemoteGatewayConfig( current: currentRemote, - transport: remoteTransport, - remoteUrl: remoteUrl, - remoteHost: remoteHost, - remoteTarget: remoteTarget, - remoteIdentity: remoteIdentity, - remoteToken: remoteToken, - remoteTokenDirty: remoteTokenDirty) + draft: .init( + transport: draft.remoteTransport, + remoteUrl: draft.remoteUrl, + remoteHost: remoteHost, + remoteTarget: draft.remoteTarget, + remoteIdentity: draft.remoteIdentity, + remoteToken: draft.remoteToken, + remoteTokenDirty: draft.remoteTokenDirty)) if updated.changed { gateway["remote"] = updated.remote changed = true @@ -625,13 +634,14 @@ final class AppState { // Keep app-only connection settings local to avoid overwriting remote gateway config. let synced = Self.syncedGatewayRoot( currentRoot: OpenClawConfigFile.loadDict(), - connectionMode: self.connectionMode, - remoteTransport: self.remoteTransport, - remoteTarget: self.remoteTarget, - remoteIdentity: self.remoteIdentity, - remoteUrl: self.remoteUrl, - remoteToken: self.remoteToken, - remoteTokenDirty: self.remoteTokenDirty) + draft: .init( + connectionMode: self.connectionMode, + remoteTransport: self.remoteTransport, + remoteTarget: self.remoteTarget, + remoteIdentity: self.remoteIdentity, + remoteUrl: self.remoteUrl, + remoteToken: self.remoteToken, + remoteTokenDirty: self.remoteTokenDirty)) guard synced.changed else { return } OpenClawConfigFile.saveDict(synced.root) } @@ -788,44 +798,20 @@ extension AppState { extension AppState { static func _testUpdatedRemoteGatewayConfig( current: [String: Any], - transport: RemoteTransport, - remoteUrl: String, - remoteHost: String?, - remoteTarget: String, - remoteIdentity: String, - remoteToken: String, - remoteTokenDirty: Bool) -> [String: Any] + draft: RemoteGatewayConfigDraft) -> [String: Any] { self.updatedRemoteGatewayConfig( current: current, - transport: transport, - remoteUrl: remoteUrl, - remoteHost: remoteHost, - remoteTarget: remoteTarget, - remoteIdentity: remoteIdentity, - remoteToken: remoteToken, - remoteTokenDirty: remoteTokenDirty).remote + draft: draft).remote } static func _testSyncedGatewayRoot( currentRoot: [String: Any], - connectionMode: ConnectionMode, - remoteTransport: RemoteTransport, - remoteTarget: String, - remoteIdentity: String, - remoteUrl: String, - remoteToken: String, - remoteTokenDirty: Bool) -> [String: Any] + draft: GatewayConfigSyncDraft) -> [String: Any] { self.syncedGatewayRoot( currentRoot: currentRoot, - connectionMode: connectionMode, - remoteTransport: remoteTransport, - remoteTarget: remoteTarget, - remoteIdentity: remoteIdentity, - remoteUrl: remoteUrl, - remoteToken: remoteToken, - remoteTokenDirty: remoteTokenDirty).root + draft: draft).root } } #endif diff --git a/apps/macos/Sources/OpenClaw/ExecApprovalsSocket.swift b/apps/macos/Sources/OpenClaw/ExecApprovalsSocket.swift index fe27b23c9a9..291d7961965 100644 --- a/apps/macos/Sources/OpenClaw/ExecApprovalsSocket.swift +++ b/apps/macos/Sources/OpenClaw/ExecApprovalsSocket.swift @@ -476,10 +476,8 @@ private enum ExecHostExecutor { { guard decision == .allowAlways, context.security == .allowlist else { return } var seenPatterns = Set() - for pattern in context.allowAlwaysPatterns { - if seenPatterns.insert(pattern).inserted { - ExecApprovalsStore.addAllowlistEntry(agentId: context.agentId, pattern: pattern) - } + for pattern in context.allowAlwaysPatterns where seenPatterns.insert(pattern).inserted { + ExecApprovalsStore.addAllowlistEntry(agentId: context.agentId, pattern: pattern) } } diff --git a/apps/macos/Sources/OpenClaw/GeneralSettings.swift b/apps/macos/Sources/OpenClaw/GeneralSettings.swift index 633879367ea..90f2ffff4b4 100644 --- a/apps/macos/Sources/OpenClaw/GeneralSettings.swift +++ b/apps/macos/Sources/OpenClaw/GeneralSettings.swift @@ -308,7 +308,9 @@ struct GeneralSettings: View { .padding(.leading, self.remoteLabelWidth + 10) if self.state.remoteTokenUnsupported { Text( - "The current gateway.remote.token value is not plain text. OpenClaw for macOS cannot use it directly; enter a plaintext token here to replace it.") + "The current gateway.remote.token value is not plain text. " + + "OpenClaw for macOS cannot use it directly; " + + "enter a plaintext token here to replace it.") .font(.caption) .foregroundStyle(.orange) .padding(.leading, self.remoteLabelWidth + 10) diff --git a/apps/macos/Sources/OpenClaw/NodeMode/MacNodeRuntime.swift b/apps/macos/Sources/OpenClaw/NodeMode/MacNodeRuntime.swift index 350a6897f8f..fa156895f1d 100644 --- a/apps/macos/Sources/OpenClaw/NodeMode/MacNodeRuntime.swift +++ b/apps/macos/Sources/OpenClaw/NodeMode/MacNodeRuntime.swift @@ -845,10 +845,8 @@ extension MacNodeRuntime { { guard persistAllowlist, security == .allowlist else { return } var seenPatterns = Set() - for pattern in allowAlwaysPatterns { - if seenPatterns.insert(pattern).inserted { - ExecApprovalsStore.addAllowlistEntry(agentId: agentId, pattern: pattern) - } + for pattern in allowAlwaysPatterns where seenPatterns.insert(pattern).inserted { + ExecApprovalsStore.addAllowlistEntry(agentId: agentId, pattern: pattern) } } diff --git a/apps/macos/Sources/OpenClaw/OnboardingView+Pages.swift b/apps/macos/Sources/OpenClaw/OnboardingView+Pages.swift index d1831d104fc..45f9b45bdef 100644 --- a/apps/macos/Sources/OpenClaw/OnboardingView+Pages.swift +++ b/apps/macos/Sources/OpenClaw/OnboardingView+Pages.swift @@ -398,7 +398,9 @@ extension OnboardingView { .foregroundStyle(.secondary) if self.state.remoteTokenUnsupported { Text( - "The current gateway.remote.token value is not plain text. OpenClaw for macOS cannot use it directly; enter a plaintext token here to replace it.") + "The current gateway.remote.token value is not plain text. " + + "OpenClaw for macOS cannot use it directly; " + + "enter a plaintext token here to replace it.") .font(.caption) .foregroundStyle(.orange) .fixedSize(horizontal: false, vertical: true) diff --git a/apps/macos/Sources/OpenClaw/RemoteGatewayProbe.swift b/apps/macos/Sources/OpenClaw/RemoteGatewayProbe.swift index 78a865935d2..100521e2a2b 100644 --- a/apps/macos/Sources/OpenClaw/RemoteGatewayProbe.swift +++ b/apps/macos/Sources/OpenClaw/RemoteGatewayProbe.swift @@ -61,28 +61,36 @@ enum RemoteGatewayAuthIssue: Equatable { var body: String { switch self { case .tokenRequired: - "Paste the token configured on the gateway host. On the gateway host, run `openclaw config get gateway.auth.token`. If the gateway uses an environment variable instead, use `OPENCLAW_GATEWAY_TOKEN`." + "Paste the token configured on the gateway host. " + + "On the gateway host, run `openclaw config get gateway.auth.token`. " + + "If the gateway uses an environment variable instead, use `OPENCLAW_GATEWAY_TOKEN`." case .tokenMismatch: "Check `gateway.auth.token` or `OPENCLAW_GATEWAY_TOKEN` on the gateway host and try again." case .gatewayTokenNotConfigured: - "This gateway is set to token auth, but no `gateway.auth.token` is configured on the gateway host. If the gateway uses an environment variable instead, set `OPENCLAW_GATEWAY_TOKEN` before starting the gateway." + "This gateway is set to token auth, but no `gateway.auth.token` is configured on the gateway host. " + + "If the gateway uses an environment variable instead, " + + "set `OPENCLAW_GATEWAY_TOKEN` before starting the gateway." case .setupCodeExpired: "Scan or paste a fresh setup code from an already-paired OpenClaw client, then try again." case .passwordRequired: - "This onboarding flow does not support password auth yet. Reconfigure the gateway to use token auth, then retry." + "This onboarding flow does not support password auth yet. " + + "Reconfigure the gateway to use token auth, then retry." case .pairingRequired: - "Approve this device from an already-paired OpenClaw client. In your OpenClaw chat, run `/pair approve`, then click **Check connection** again." + "Approve this device from an already-paired OpenClaw client. " + + "In your OpenClaw chat, run `/pair approve`, then click **Check connection** again." } } var footnote: String? { switch self { case .tokenRequired, .gatewayTokenNotConfigured: - "No token yet? Generate one on the gateway host with `openclaw doctor --generate-gateway-token`, then set it as `gateway.auth.token`." + "No token yet? Generate one on the gateway host with " + + "`openclaw doctor --generate-gateway-token`, then set it as `gateway.auth.token`." case .setupCodeExpired: nil case .pairingRequired: - "If you do not have another paired OpenClaw client yet, approve the pending request on the gateway host with `openclaw devices approve`." + "If you do not have another paired OpenClaw client yet, " + + "approve the pending request on the gateway host with `openclaw devices approve`." case .tokenMismatch, .passwordRequired: nil } @@ -101,7 +109,8 @@ enum RemoteGatewayAuthIssue: Equatable { case .passwordRequired: "This gateway uses password auth. Remote onboarding on macOS cannot collect gateway passwords yet." case .pairingRequired: - "Pairing required. In an already-paired OpenClaw client, run /pair approve, then check the connection again." + "Pairing required. In an already-paired OpenClaw client, " + + "run /pair approve, then check the connection again." } } } @@ -135,7 +144,8 @@ struct RemoteGatewayProbeSuccess: Equatable { case .some(.deviceToken): "This Mac used a stored device token. New or unpaired devices may still need the gateway token." case .some(.bootstrapToken): - "This Mac is still using the temporary setup code. Approve pairing to finish provisioning device-scoped auth." + "This Mac is still using the temporary setup code. " + + "Approve pairing to finish provisioning device-scoped auth." case .some(.sharedToken), .some(.password), .some(GatewayAuthSource.none), nil: nil } @@ -219,7 +229,8 @@ enum RemoteGatewayProbe { trimmed.localizedCaseInsensitiveContains("host key verification failed") { let host = CommandResolver.parseSSHTarget(target)?.host ?? target - return "SSH check failed: Host key verification failed. Remove the old key with ssh-keygen -R \(host) and try again." + return "SSH check failed: Host key verification failed. " + + "Remove the old key with ssh-keygen -R \(host) and try again." } if let trimmed, !trimmed.isEmpty { if let message = response.message, message.hasPrefix("exit ") { diff --git a/apps/macos/Tests/OpenClawIPCTests/AppStateRemoteConfigTests.swift b/apps/macos/Tests/OpenClawIPCTests/AppStateRemoteConfigTests.swift index 16fb5eed1a0..d7f66e83d05 100644 --- a/apps/macos/Tests/OpenClawIPCTests/AppStateRemoteConfigTests.swift +++ b/apps/macos/Tests/OpenClawIPCTests/AppStateRemoteConfigTests.swift @@ -8,13 +8,14 @@ struct AppStateRemoteConfigTests { func updatedRemoteGatewayConfigSetsTrimmedToken() { let remote = AppState._testUpdatedRemoteGatewayConfig( current: [:], - transport: .ssh, - remoteUrl: "", - remoteHost: "gateway.example", - remoteTarget: "alice@gateway.example", - remoteIdentity: "/tmp/id_ed25519", - remoteToken: " secret-token ", - remoteTokenDirty: true) + draft: .init( + transport: .ssh, + remoteUrl: "", + remoteHost: "gateway.example", + remoteTarget: "alice@gateway.example", + remoteIdentity: "/tmp/id_ed25519", + remoteToken: " secret-token ", + remoteTokenDirty: true)) #expect(remote["token"] as? String == "secret-token") } @@ -23,13 +24,14 @@ struct AppStateRemoteConfigTests { func updatedRemoteGatewayConfigClearsTokenWhenBlank() { let remote = AppState._testUpdatedRemoteGatewayConfig( current: ["token": "old-token"], - transport: .direct, - remoteUrl: "wss://gateway.example", - remoteHost: nil, - remoteTarget: "", - remoteIdentity: "", - remoteToken: " ", - remoteTokenDirty: true) + draft: .init( + transport: .direct, + remoteUrl: "wss://gateway.example", + remoteHost: nil, + remoteTarget: "", + remoteIdentity: "", + remoteToken: " ", + remoteTokenDirty: true)) #expect((remote["token"] as? String) == nil) } @@ -51,25 +53,27 @@ struct AppStateRemoteConfigTests { let sshRoot = AppState._testSyncedGatewayRoot( currentRoot: initialRoot, - connectionMode: .remote, - remoteTransport: .ssh, - remoteTarget: "alice@gateway.example", - remoteIdentity: "", - remoteUrl: "", - remoteToken: "", - remoteTokenDirty: false) + draft: .init( + connectionMode: .remote, + remoteTransport: .ssh, + remoteTarget: "alice@gateway.example", + remoteIdentity: "", + remoteUrl: "", + remoteToken: "", + remoteTokenDirty: false)) let sshRemote = (sshRoot["gateway"] as? [String: Any])?["remote"] as? [String: Any] #expect((sshRemote?["token"] as? [String: String])?["$secretRef"] == "gateway-token") // pragma: allowlist secret let localRoot = AppState._testSyncedGatewayRoot( currentRoot: sshRoot, - connectionMode: .local, - remoteTransport: .ssh, - remoteTarget: "", - remoteIdentity: "", - remoteUrl: "", - remoteToken: "", - remoteTokenDirty: false) + draft: .init( + connectionMode: .local, + remoteTransport: .ssh, + remoteTarget: "", + remoteIdentity: "", + remoteUrl: "", + remoteToken: "", + remoteTokenDirty: false)) let localGateway = localRoot["gateway"] as? [String: Any] let localRemote = localGateway?["remote"] as? [String: Any] #expect(localGateway?["mode"] as? String == "local") @@ -84,13 +88,14 @@ struct AppStateRemoteConfigTests { "$secretRef": "gateway-token", // pragma: allowlist secret ], ], - transport: .direct, - remoteUrl: "wss://gateway.example", - remoteHost: nil, - remoteTarget: "", - remoteIdentity: "", - remoteToken: " fresh-token ", - remoteTokenDirty: true) + draft: .init( + transport: .direct, + remoteUrl: "wss://gateway.example", + remoteHost: nil, + remoteTarget: "", + remoteIdentity: "", + remoteToken: " fresh-token ", + remoteTokenDirty: true)) #expect(remote["token"] as? String == "fresh-token") } @@ -105,24 +110,26 @@ struct AppStateRemoteConfigTests { let preserved = AppState._testUpdatedRemoteGatewayConfig( current: current, - transport: .direct, - remoteUrl: "wss://gateway.example", - remoteHost: nil, - remoteTarget: "", - remoteIdentity: "", - remoteToken: "", - remoteTokenDirty: false) + draft: .init( + transport: .direct, + remoteUrl: "wss://gateway.example", + remoteHost: nil, + remoteTarget: "", + remoteIdentity: "", + remoteToken: "", + remoteTokenDirty: false)) #expect((preserved["token"] as? [String: String])?["$secretRef"] == "gateway-token") // pragma: allowlist secret let cleared = AppState._testUpdatedRemoteGatewayConfig( current: current, - transport: .direct, - remoteUrl: "wss://gateway.example", - remoteHost: nil, - remoteTarget: "", - remoteIdentity: "", - remoteToken: " ", - remoteTokenDirty: true) + draft: .init( + transport: .direct, + remoteUrl: "wss://gateway.example", + remoteHost: nil, + remoteTarget: "", + remoteIdentity: "", + remoteToken: " ", + remoteTokenDirty: true)) #expect((cleared["token"] as? String) == nil) } }