style: resolve swift lint warnings
This commit is contained in:
@@ -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:
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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)) {
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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: [
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
Reference in New Issue
Block a user