style: resolve swift lint warnings

This commit is contained in:
Peter Steinberger
2026-01-19 13:37:28 +00:00
parent 48bfaa2371
commit 79c93b2cf8
8 changed files with 68 additions and 32 deletions

View File

@@ -95,16 +95,24 @@ struct IOSGatewayChatTransport: ClawdbotChatTransport, Sendable {
continuation.yield(.seqGap) continuation.yield(.seqGap)
case "health": case "health":
guard let payload = evt.payload else { break } guard let payload = evt.payload else { break }
let ok = (try? GatewayPayloadDecoding.decode(payload, as: ClawdbotGatewayHealthOK.self))?.ok ?? true let ok = (try? GatewayPayloadDecoding.decode(
payload,
as: ClawdbotGatewayHealthOK.self))?.ok ?? true
continuation.yield(.health(ok: ok)) continuation.yield(.health(ok: ok))
case "chat": case "chat":
guard let payload = evt.payload else { break } guard let payload = evt.payload else { break }
if let chatPayload = try? GatewayPayloadDecoding.decode(payload, as: ClawdbotChatEventPayload.self) { if let chatPayload = try? GatewayPayloadDecoding.decode(
payload,
as: ClawdbotChatEventPayload.self)
{
continuation.yield(.chat(chatPayload)) continuation.yield(.chat(chatPayload))
} }
case "agent": case "agent":
guard let payload = evt.payload else { break } guard let payload = evt.payload else { break }
if let agentPayload = try? GatewayPayloadDecoding.decode(payload, as: ClawdbotAgentEventPayload.self) { if let agentPayload = try? GatewayPayloadDecoding.decode(
payload,
as: ClawdbotAgentEventPayload.self)
{
continuation.yield(.agent(agentPayload)) continuation.yield(.agent(agentPayload))
} }
default: default:

View File

@@ -55,7 +55,11 @@ final class GatewayConnectionController {
guard let host = self.resolveGatewayHost(gateway) else { return } guard let host = self.resolveGatewayHost(gateway) else { return }
let port = gateway.gatewayPort ?? 18789 let port = gateway.gatewayPort ?? 18789
let tlsParams = self.resolveDiscoveredTLSParams(gateway: gateway) let tlsParams = self.resolveDiscoveredTLSParams(gateway: gateway)
guard let url = self.buildGatewayURL(host: host, port: port, useTLS: tlsParams?.required == true) else { return } guard let url = self.buildGatewayURL(
host: host,
port: port,
useTLS: tlsParams?.required == true)
else { return }
self.didAutoConnect = true self.didAutoConnect = true
self.startAutoConnect( self.startAutoConnect(
url: url, url: url,
@@ -72,7 +76,11 @@ final class GatewayConnectionController {
let password = GatewaySettingsStore.loadGatewayPassword(instanceId: instanceId) let password = GatewaySettingsStore.loadGatewayPassword(instanceId: instanceId)
let stableID = self.manualStableID(host: host, port: port) let stableID = self.manualStableID(host: host, port: port)
let tlsParams = self.resolveManualTLSParams(stableID: stableID, tlsEnabled: useTLS) let tlsParams = self.resolveManualTLSParams(stableID: stableID, tlsEnabled: useTLS)
guard let url = self.buildGatewayURL(host: host, port: port, useTLS: tlsParams?.required == true) else { return } guard let url = self.buildGatewayURL(
host: host,
port: port,
useTLS: tlsParams?.required == true)
else { return }
self.didAutoConnect = true self.didAutoConnect = true
self.startAutoConnect( self.startAutoConnect(
url: url, url: url,

View File

@@ -89,7 +89,9 @@ enum GatewaySettingsStore {
} }
static func loadGatewayPassword(instanceId: String) -> String? { static func loadGatewayPassword(instanceId: String) -> String? {
KeychainStore.loadString(service: self.gatewayService, account: self.gatewayPasswordAccount(instanceId: instanceId))? KeychainStore.loadString(
service: self.gatewayService,
account: self.gatewayPasswordAccount(instanceId: instanceId))?
.trimmingCharacters(in: .whitespacesAndNewlines) .trimmingCharacters(in: .whitespacesAndNewlines)
} }
@@ -193,7 +195,9 @@ enum GatewaySettingsStore {
if defaults.object(forKey: self.manualEnabledDefaultsKey) == nil, if defaults.object(forKey: self.manualEnabledDefaultsKey) == nil,
defaults.object(forKey: self.legacyManualEnabledDefaultsKey) != nil defaults.object(forKey: self.legacyManualEnabledDefaultsKey) != nil
{ {
defaults.set(defaults.bool(forKey: self.legacyManualEnabledDefaultsKey), forKey: self.manualEnabledDefaultsKey) defaults.set(
defaults.bool(forKey: self.legacyManualEnabledDefaultsKey),
forKey: self.manualEnabledDefaultsKey)
} }
if defaults.string(forKey: self.manualHostDefaultsKey)?.isEmpty != false, if defaults.string(forKey: self.manualHostDefaultsKey)?.isEmpty != false,
@@ -206,7 +210,9 @@ enum GatewaySettingsStore {
if defaults.integer(forKey: self.manualPortDefaultsKey) == 0, if defaults.integer(forKey: self.manualPortDefaultsKey) == 0,
defaults.integer(forKey: self.legacyManualPortDefaultsKey) > 0 defaults.integer(forKey: self.legacyManualPortDefaultsKey) > 0
{ {
defaults.set(defaults.integer(forKey: self.legacyManualPortDefaultsKey), forKey: self.manualPortDefaultsKey) defaults.set(
defaults.integer(forKey: self.legacyManualPortDefaultsKey),
forKey: self.manualPortDefaultsKey)
} }
if defaults.object(forKey: self.discoveryDebugLogsDefaultsKey) == nil, if defaults.object(forKey: self.discoveryDebugLogsDefaultsKey) == nil,

View File

@@ -857,17 +857,20 @@ final class NodeAppModel {
return BridgeInvokeResponse(id: req.id, ok: true, payloadJSON: payload) return BridgeInvokeResponse(id: req.id, ok: true, payloadJSON: payload)
} }
private func locationMode() -> ClawdbotLocationMode { }
private extension NodeAppModel {
func locationMode() -> ClawdbotLocationMode {
let raw = UserDefaults.standard.string(forKey: "location.enabledMode") ?? "off" let raw = UserDefaults.standard.string(forKey: "location.enabledMode") ?? "off"
return ClawdbotLocationMode(rawValue: raw) ?? .off return ClawdbotLocationMode(rawValue: raw) ?? .off
} }
private func isLocationPreciseEnabled() -> Bool { func isLocationPreciseEnabled() -> Bool {
if UserDefaults.standard.object(forKey: "location.preciseEnabled") == nil { return true } if UserDefaults.standard.object(forKey: "location.preciseEnabled") == nil { return true }
return UserDefaults.standard.bool(forKey: "location.preciseEnabled") return UserDefaults.standard.bool(forKey: "location.preciseEnabled")
} }
private static func decodeParams<T: Decodable>(_ type: T.Type, from json: String?) throws -> T { static func decodeParams<T: Decodable>(_ type: T.Type, from json: String?) throws -> T {
guard let json, let data = json.data(using: .utf8) else { guard let json, let data = json.data(using: .utf8) else {
throw NSError(domain: "Gateway", code: 20, userInfo: [ throw NSError(domain: "Gateway", code: 20, userInfo: [
NSLocalizedDescriptionKey: "INVALID_REQUEST: paramsJSON required", NSLocalizedDescriptionKey: "INVALID_REQUEST: paramsJSON required",
@@ -876,7 +879,7 @@ final class NodeAppModel {
return try JSONDecoder().decode(type, from: data) return try JSONDecoder().decode(type, from: data)
} }
private static func encodePayload(_ obj: some Encodable) throws -> String { static func encodePayload(_ obj: some Encodable) throws -> String {
let data = try JSONEncoder().encode(obj) let data = try JSONEncoder().encode(obj)
guard let json = String(bytes: data, encoding: .utf8) else { guard let json = String(bytes: data, encoding: .utf8) else {
throw NSError(domain: "NodeAppModel", code: 21, userInfo: [ throw NSError(domain: "NodeAppModel", code: 21, userInfo: [
@@ -886,17 +889,17 @@ final class NodeAppModel {
return json return json
} }
private func isCameraEnabled() -> Bool { func isCameraEnabled() -> Bool {
// Default-on: if the key doesn't exist yet, treat it as enabled. // Default-on: if the key doesn't exist yet, treat it as enabled.
if UserDefaults.standard.object(forKey: "camera.enabled") == nil { return true } if UserDefaults.standard.object(forKey: "camera.enabled") == nil { return true }
return UserDefaults.standard.bool(forKey: "camera.enabled") return UserDefaults.standard.bool(forKey: "camera.enabled")
} }
private func triggerCameraFlash() { func triggerCameraFlash() {
self.cameraFlashNonce &+= 1 self.cameraFlashNonce &+= 1
} }
private func showCameraHUD(text: String, kind: CameraHUDKind, autoHideSeconds: Double? = nil) { func showCameraHUD(text: String, kind: CameraHUDKind, autoHideSeconds: Double? = nil) {
self.cameraHUDDismissTask?.cancel() self.cameraHUDDismissTask?.cancel()
withAnimation(.spring(response: 0.25, dampingFraction: 0.85)) { withAnimation(.spring(response: 0.25, dampingFraction: 0.85)) {

View File

@@ -86,9 +86,9 @@ enum ExecApprovalDecision: String, Codable, Sendable {
struct ExecAllowlistEntry: Codable, Hashable { struct ExecAllowlistEntry: Codable, Hashable {
var pattern: String var pattern: String
var lastUsedAt: Double? = nil var lastUsedAt: Double?
var lastUsedCommand: String? = nil var lastUsedCommand: String?
var lastResolvedPath: String? = nil var lastResolvedPath: String?
} }
struct ExecApprovalsDefaults: Codable { struct ExecApprovalsDefaults: Codable {

View File

@@ -87,16 +87,19 @@ enum ExecApprovalsSocketClient {
let trimmedToken = token.trimmingCharacters(in: .whitespacesAndNewlines) let trimmedToken = token.trimmingCharacters(in: .whitespacesAndNewlines)
guard !trimmedPath.isEmpty, !trimmedToken.isEmpty else { return nil } guard !trimmedPath.isEmpty, !trimmedToken.isEmpty else { return nil }
do { do {
return try await AsyncTimeout.withTimeoutMs(timeoutMs: timeoutMs, onTimeout: { return try await AsyncTimeout.withTimeoutMs(
TimeoutError(message: "exec approvals socket timeout") timeoutMs: timeoutMs,
}, operation: { onTimeout: {
try await Task.detached { TimeoutError(message: "exec approvals socket timeout")
try self.requestDecisionSync( },
socketPath: trimmedPath, operation: {
token: trimmedToken, try await Task.detached {
request: request) try self.requestDecisionSync(
}.value socketPath: trimmedPath,
}) token: trimmedToken,
request: request)
}.value
})
} catch { } catch {
return nil return nil
} }

View File

@@ -733,7 +733,9 @@ actor MacNodeRuntime {
return BridgeInvokeResponse(id: req.id, ok: true) return BridgeInvokeResponse(id: req.id, ok: true)
} }
} }
}
extension MacNodeRuntime {
private static func decodeParams<T: Decodable>(_ type: T.Type, from json: String?) throws -> T { private static func decodeParams<T: Decodable>(_ type: T.Type, from json: String?) throws -> T {
guard let json, let data = json.data(using: .utf8) else { guard let json, let data = json.data(using: .utf8) else {
throw NSError(domain: "Gateway", code: 20, userInfo: [ throw NSError(domain: "Gateway", code: 20, userInfo: [

View File

@@ -80,10 +80,7 @@ struct SystemRunSettingsView: View {
.labelsHidden() .labelsHidden()
.pickerStyle(.menu) .pickerStyle(.menu)
Text(self.model.isDefaultsScope Text(self.scopeMessage)
? "Defaults apply when an agent has no overrides. Ask controls prompt behavior; fallback is used when no companion UI is reachable."
:
"Security controls whether system.run can execute on this Mac when paired as a node. Ask controls prompt behavior; fallback is used when no companion UI is reachable.")
.font(.footnote) .font(.footnote)
.foregroundStyle(.tertiary) .foregroundStyle(.tertiary)
.fixedSize(horizontal: false, vertical: true) .fixedSize(horizontal: false, vertical: true)
@@ -138,6 +135,15 @@ struct SystemRunSettingsView: View {
} }
} }
} }
private var scopeMessage: String {
if self.model.isDefaultsScope {
return "Defaults apply when an agent has no overrides. " +
"Ask controls prompt behavior; fallback is used when no companion UI is reachable."
}
return "Security controls whether system.run can execute on this Mac when paired as a node. " +
"Ask controls prompt behavior; fallback is used when no companion UI is reachable."
}
} }
private enum ExecApprovalsSettingsTab: String, CaseIterable, Identifiable { private enum ExecApprovalsSettingsTab: String, CaseIterable, Identifiable {