From 161895ed1a4fea3e0757e569a4181fcc0514f7c6 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Sat, 13 Dec 2025 17:23:41 +0000 Subject: [PATCH] fix(mac): show clawd browser path in config --- .../Sources/Clawdis/ConfigSettings.swift | 69 +++++++++++++++++++ 1 file changed, 69 insertions(+) diff --git a/apps/macos/Sources/Clawdis/ConfigSettings.swift b/apps/macos/Sources/Clawdis/ConfigSettings.swift index 2e0fcd214..7a6f70ef6 100644 --- a/apps/macos/Sources/Clawdis/ConfigSettings.swift +++ b/apps/macos/Sources/Clawdis/ConfigSettings.swift @@ -162,6 +162,23 @@ struct ConfigSettings: View { .disabled(!self.browserEnabled) .onChange(of: self.browserControlUrl) { _, _ in self.autosaveConfig() } } + GridRow { + self.gridLabel("Browser path") + VStack(alignment: .leading, spacing: 2) { + if let label = self.browserPathLabel { + Text(label) + .font(.caption.monospaced()) + .foregroundStyle(.secondary) + .textSelection(.enabled) + .lineLimit(1) + .truncationMode(.middle) + } else { + Text("—") + .foregroundStyle(.secondary) + } + } + .frame(maxWidth: .infinity, alignment: .leading) + } GridRow { self.gridLabel("Accent") HStack(spacing: 8) { @@ -319,6 +336,58 @@ struct ConfigSettings: View { return Color(red: r, green: g, blue: b) } + private var browserPathLabel: String? { + guard self.browserEnabled else { return nil } + + let host = (URL(string: self.browserControlUrl)?.host ?? "").lowercased() + if !host.isEmpty, !Self.isLoopbackHost(host) { + return "remote (\(host))" + } + + guard let candidate = Self.detectedBrowserCandidate() else { return nil } + return candidate.executablePath ?? candidate.appPath + } + + private struct BrowserCandidate { + let name: String + let appPath: String + let executablePath: String? + } + + private static func detectedBrowserCandidate() -> BrowserCandidate? { + let candidates: [(name: String, appName: String)] = [ + ("Google Chrome Canary", "Google Chrome Canary.app"), + ("Chromium", "Chromium.app"), + ("Google Chrome", "Google Chrome.app"), + ] + + let roots = [ + "/Applications", + "\(NSHomeDirectory())/Applications", + ] + + let fm = FileManager.default + for (name, appName) in candidates { + for root in roots { + let appPath = "\(root)/\(appName)" + if fm.fileExists(atPath: appPath) { + let bundle = Bundle(url: URL(fileURLWithPath: appPath)) + let exec = bundle?.executableURL?.path + return BrowserCandidate(name: name, appPath: appPath, executablePath: exec) + } + } + } + + return nil + } + + private static func isLoopbackHost(_ host: String) -> Bool { + if host == "localhost" { return true } + if host == "127.0.0.1" { return true } + if host == "::1" { return true } + return false + } + private func loadModels() async { guard !self.modelsLoading else { return } self.modelsLoading = true