diff --git a/apps/macos/Sources/Clawdis/ClawdisConfigFile.swift b/apps/macos/Sources/Clawdis/ClawdisConfigFile.swift new file mode 100644 index 000000000..69b988151 --- /dev/null +++ b/apps/macos/Sources/Clawdis/ClawdisConfigFile.swift @@ -0,0 +1,41 @@ +import Foundation + +enum ClawdisConfigFile { + static func url() -> URL { + FileManager.default.homeDirectoryForCurrentUser + .appendingPathComponent(".clawdis") + .appendingPathComponent("clawdis.json") + } + + static func loadDict() -> [String: Any] { + let url = self.url() + guard let data = try? Data(contentsOf: url) else { return [:] } + return (try? JSONSerialization.jsonObject(with: data) as? [String: Any]) ?? [:] + } + + static func saveDict(_ dict: [String: Any]) { + do { + let data = try JSONSerialization.data(withJSONObject: dict, options: [.prettyPrinted, .sortedKeys]) + let url = self.url() + try FileManager.default.createDirectory( + at: url.deletingLastPathComponent(), + withIntermediateDirectories: true) + try data.write(to: url, options: [.atomic]) + } catch {} + } + + static func browserControlEnabled(defaultValue: Bool = true) -> Bool { + let root = self.loadDict() + let browser = root["browser"] as? [String: Any] + return browser?["enabled"] as? Bool ?? defaultValue + } + + static func setBrowserControlEnabled(_ enabled: Bool) { + var root = self.loadDict() + var browser = root["browser"] as? [String: Any] ?? [:] + browser["enabled"] = enabled + root["browser"] = browser + self.saveDict(root) + } +} + diff --git a/apps/macos/Sources/Clawdis/ConfigSettings.swift b/apps/macos/Sources/Clawdis/ConfigSettings.swift index c6ec3b510..4ce8fd3d7 100644 --- a/apps/macos/Sources/Clawdis/ConfigSettings.swift +++ b/apps/macos/Sources/Clawdis/ConfigSettings.swift @@ -196,12 +196,6 @@ struct ConfigSettings: View { } } - private func configURL() -> URL { - FileManager.default.homeDirectoryForCurrentUser - .appendingPathComponent(".clawdis") - .appendingPathComponent("clawdis.json") - } - private func loadConfig() { let parsed = self.loadConfigDict() let inbound = parsed["inbound"] as? [String: Any] @@ -274,20 +268,11 @@ struct ConfigSettings: View { browser["attachOnly"] = self.browserAttachOnly root["browser"] = browser - do { - let data = try JSONSerialization.data(withJSONObject: root, options: [.prettyPrinted, .sortedKeys]) - let url = self.configURL() - try FileManager.default.createDirectory( - at: url.deletingLastPathComponent(), - withIntermediateDirectories: true) - try data.write(to: url, options: [.atomic]) - } catch {} + ClawdisConfigFile.saveDict(root) } private func loadConfigDict() -> [String: Any] { - let url = self.configURL() - guard let data = try? Data(contentsOf: url) else { return [:] } - return (try? JSONSerialization.jsonObject(with: data) as? [String: Any]) ?? [:] + ClawdisConfigFile.loadDict() } private var browserColor: Color { diff --git a/apps/macos/Sources/Clawdis/MenuContentView.swift b/apps/macos/Sources/Clawdis/MenuContentView.swift index 5cd258a03..99c128569 100644 --- a/apps/macos/Sources/Clawdis/MenuContentView.swift +++ b/apps/macos/Sources/Clawdis/MenuContentView.swift @@ -16,6 +16,7 @@ struct MenuContent: View { @State private var availableMics: [AudioInputDevice] = [] @State private var loadingMics = false @State private var sessionMenu: [SessionRow] = [] + @State private var browserControlEnabled = true var body: some View { VStack(alignment: .leading, spacing: 8) { @@ -43,6 +44,15 @@ struct MenuContent: View { WebChatManager.shared.show(sessionKey: WebChatManager.shared.preferredSessionKey()) } } + Toggle(isOn: Binding( + get: { self.browserControlEnabled }, + set: { enabled in + self.browserControlEnabled = enabled + ClawdisConfigFile.setBrowserControlEnabled(enabled) + }) + ) { + Text("Browser Control") + } Toggle(isOn: Binding(get: { self.state.canvasEnabled }, set: { self.state.canvasEnabled = $0 })) { Text("Allow Canvas") } @@ -195,6 +205,9 @@ struct MenuContent: View { .onChange(of: self.state.voicePushToTalkEnabled) { _, enabled in VoicePushToTalkHotkey.shared.setEnabled(voiceWakeSupported && enabled) } + .onAppear { + self.browserControlEnabled = ClawdisConfigFile.browserControlEnabled() + } } private func open(tab: SettingsTab) {