diff --git a/VibeTunnel.xcodeproj/project.xcworkspace/xcuserdata/steipete.xcuserdatad/UserInterfaceState.xcuserstate b/VibeTunnel.xcodeproj/project.xcworkspace/xcuserdata/steipete.xcuserdatad/UserInterfaceState.xcuserstate index 2635b5b6..0c91a1ee 100644 Binary files a/VibeTunnel.xcodeproj/project.xcworkspace/xcuserdata/steipete.xcuserdatad/UserInterfaceState.xcuserstate and b/VibeTunnel.xcodeproj/project.xcworkspace/xcuserdata/steipete.xcuserdatad/UserInterfaceState.xcuserstate differ diff --git a/VibeTunnel/Core/Services/TunnelServer.swift b/VibeTunnel/Core/Services/TunnelServer.swift index face9d55..41bd71c0 100644 --- a/VibeTunnel/Core/Services/TunnelServer.swift +++ b/VibeTunnel/Core/Services/TunnelServer.swift @@ -950,7 +950,6 @@ public final class TunnelServer { } } } - } private func getSessionSnapshot(sessionId: String) async -> Response { let streamOutPath = URL(fileURLWithPath: ttyFwdControlDir).appendingPathComponent(sessionId) diff --git a/VibeTunnel/SettingsView.swift b/VibeTunnel/SettingsView.swift index 7c5b2a77..2941e12e 100644 --- a/VibeTunnel/SettingsView.swift +++ b/VibeTunnel/SettingsView.swift @@ -1,4 +1,5 @@ import SwiftUI +import AppKit /// Represents the available tabs in the Settings window enum SettingsTab: String, CaseIterable { @@ -460,6 +461,16 @@ struct AdvancedSettingsView: View { print("No auth token found") ngrokError = "Please enter your ngrok auth token first" ngrokEnabled = false + + // Show alert dialog + Task { @MainActor in + let alert = NSAlert() + alert.messageText = "ngrok Auth Token Required" + alert.informativeText = "Please enter your ngrok auth token before enabling the tunnel. You can get a free auth token at ngrok.com" + alert.alertStyle = .warning + alert.addButton(withTitle: "OK") + alert.runModal() + } return } diff --git a/VibeTunnel/Utilities/ApplicationMover.swift b/VibeTunnel/Utilities/ApplicationMover.swift index e6d81db7..3adf2c95 100644 --- a/VibeTunnel/Utilities/ApplicationMover.swift +++ b/VibeTunnel/Utilities/ApplicationMover.swift @@ -159,23 +159,22 @@ final class ApplicationMover { task.standardError = Pipe() // Suppress stderr do { - logger.info("ApplicationMover: Running hdiutil info -plist") + logger.debug("ApplicationMover: Running hdiutil info -plist") try task.run() task.waitUntilExit() guard task.terminationStatus == 0 else { - logger.warning("ApplicationMover: hdiutil command failed with status: \(task.terminationStatus)") + logger.debug("ApplicationMover: hdiutil command failed with status: \(task.terminationStatus)") return nil } let data = pipe.fileHandleForReading.readDataToEndOfFile() - logger.info("ApplicationMover: hdiutil returned \(data.count) bytes") + logger.debug("ApplicationMover: hdiutil returned \(data.count) bytes") guard let plist = try PropertyListSerialization .propertyList(from: data, options: [], format: nil) as? [String: Any], let images = plist["images"] as? [[String: Any]] else { - logger.info("ApplicationMover: Failed to parse hdiutil plist or no images found") - logger.warning("Failed to parse hdiutil output") + logger.debug("ApplicationMover: No disk images found in hdiutil output") return nil } @@ -196,7 +195,7 @@ final class ApplicationMover { return nil } catch { - logger.error("Error running hdiutil: \(error)") + logger.debug("ApplicationMover: Unable to run hdiutil (expected in some environments): \(error)") return nil } } diff --git a/VibeTunnel/Views/MenuBarView.swift b/VibeTunnel/Views/MenuBarView.swift index 7cf8a153..bee6681e 100644 --- a/VibeTunnel/Views/MenuBarView.swift +++ b/VibeTunnel/Views/MenuBarView.swift @@ -13,9 +13,6 @@ struct MenuBarView: View { .padding(.horizontal, 12) .padding(.vertical, 8) - Divider() - .padding(.horizontal, 12) - // Open Dashboard button Button(action: { let dashboardURL = URL(string: "http://127.0.0.1:\(serverMonitor.port)")!