diff --git a/apps/macos/Sources/Clawdis/AppMain.swift b/apps/macos/Sources/Clawdis/AppMain.swift index a8a1b4a8c..6fd9ddc60 100644 --- a/apps/macos/Sources/Clawdis/AppMain.swift +++ b/apps/macos/Sources/Clawdis/AppMain.swift @@ -894,13 +894,22 @@ private struct SessionDefaults { let contextTokens: Int } -private struct ModelChoice: Identifiable, Hashable { +struct ModelChoice: Identifiable, Hashable { let id: String let name: String let provider: String let contextWindow: Int? } +extension Optional where Wrapped == String { + var isNilOrEmpty: Bool { + switch self { + case .none: true + case let .some(value): value.isEmpty + } + } +} + extension [String] { fileprivate func dedupedPreserveOrder() -> [String] { var seen = Set() @@ -1511,7 +1520,11 @@ struct ConfigSettings: View { private func chooseCatalogFile() { let panel = NSOpenPanel() panel.title = "Select models.generated.ts" - panel.allowedFileTypes = ["ts"] + if let tsType = UTType(filenameExtension: "ts") { + panel.allowedContentTypes = [tsType] + } else { + panel.allowedFileTypes = ["ts"] // fallback + } panel.allowsMultipleSelection = false panel.directoryURL = URL(fileURLWithPath: self.modelCatalogPath).deletingLastPathComponent() if panel.runModal() == .OK, let url = panel.url { diff --git a/apps/macos/Sources/Clawdis/WebChatWindow.swift b/apps/macos/Sources/Clawdis/WebChatWindow.swift index 10360c73d..b9dbadad9 100644 --- a/apps/macos/Sources/Clawdis/WebChatWindow.swift +++ b/apps/macos/Sources/Clawdis/WebChatWindow.swift @@ -13,6 +13,7 @@ final class WebChatWindowController: NSWindowController, WKScriptMessageHandler let contentController = WKUserContentController() config.userContentController = contentController config.preferences.isElementFullscreenEnabled = true + config.preferences.setValue(true, forKey: "developerExtrasEnabled") // Inject callback receiver stub let callbackScript = """ @@ -34,6 +35,11 @@ final class WebChatWindowController: NSWindowController, WKScriptMessageHandler window.webkit?.messageHandlers?.clawdis?.postMessage({ id, ...payload }); }); }; + window.__clawdisLog = function(msg) { + try { + window.webkit?.messageHandlers?.clawdis?.postMessage({ id: 'log', log: String(msg) }); + } catch (_) {} + }; """ let userScript = WKUserScript(source: callbackScript, injectionTime: .atDocumentStart, forMainFrameOnly: true) contentController.addUserScript(userScript) @@ -108,64 +114,73 @@ final class WebChatWindowController: NSWindowController, WKScriptMessageHandler