import Cocoa import SystemExtensions import OSLog @MainActor @main class AppDelegate: NSObject, NSApplicationDelegate { let logger = Logger(subsystem: "com.momentry.markbase.installer", category: "AppDelegate") var window: NSWindow! var statusLabel: NSTextField! var installButton: NSButton! var extensionDelegate: ExtensionDelegate? func applicationDidFinishLaunching(_ aNotification: Notification) { logger.info("MarkBase Installer started") createWindow() setupUI() window.makeKeyAndOrderFront(nil) } func createWindow() { window = NSWindow( contentRect: NSRect(x: 0, y: 0, width: 500, height: 400), styleMask: [.titled, .closable, .miniaturizable], backing: .buffered, defer: false ) window.title = "MarkBase Installer" window.center() window.isReleasedWhenClosed = false } func setupUI() { let contentView = window.contentView! let titleLabel = NSTextField(labelWithString: "MarkBase System Extension Installer") titleLabel.font = NSFont.systemFont(ofSize: 18, weight: .bold) titleLabel.alignment = .center contentView.addSubview(titleLabel) statusLabel = NSTextField(wrappingLabelWithString: "Ready to install MarkBaseFS System Extension") statusLabel.font = NSFont.systemFont(ofSize: 14) statusLabel.alignment = .center contentView.addSubview(statusLabel) installButton = NSButton(title: "Install System Extension", target: self, action: #selector(installExtension)) installButton.bezelStyle = .rounded installButton.font = NSFont.systemFont(ofSize: 13, weight: .medium) contentView.addSubview(installButton) titleLabel.translatesAutoresizingMaskIntoConstraints = false statusLabel.translatesAutoresizingMaskIntoConstraints = false installButton.translatesAutoresizingMaskIntoConstraints = false NSLayoutConstraint.activate([ titleLabel.centerXAnchor.constraint(equalTo: contentView.centerXAnchor), titleLabel.topAnchor.constraint(equalTo: contentView.topAnchor, constant: 50), statusLabel.centerXAnchor.constraint(equalTo: contentView.centerXAnchor), statusLabel.topAnchor.constraint(equalTo: titleLabel.bottomAnchor, constant: 40), statusLabel.widthAnchor.constraint(equalTo: contentView.widthAnchor, multiplier: 0.8), installButton.centerXAnchor.constraint(equalTo: contentView.centerXAnchor), installButton.topAnchor.constraint(equalTo: statusLabel.bottomAnchor, constant: 40), installButton.widthAnchor.constraint(equalToConstant: 200), installButton.heightAnchor.constraint(equalToConstant: 30), ]) } @objc func installExtension() { logger.info("Install button clicked") let extensionID = "com.momentry.markbase.fskit" logger.info("Requesting activation for extension: \(extensionID)") updateStatus("Requesting installation...") installButton.isEnabled = false let request = OSSystemExtensionRequest.activationRequest( forExtensionWithIdentifier: extensionID, queue: .main ) extensionDelegate = ExtensionDelegate( onSuccess: { self.logger.info("Extension activated successfully") self.updateStatus("✅ Installation successful!") self.installButton.isEnabled = true self.extensionDelegate = nil }, onError: { error in self.logger.error("Extension activation failed: \(error.localizedDescription)") self.updateStatus("❌ Installation failed: \(error.localizedDescription)") self.installButton.isEnabled = true self.extensionDelegate = nil }, onNeedsApproval: { self.logger.info("Extension needs user approval") self.updateStatus("⏳ Waiting for approval in System Settings") } ) request.delegate = extensionDelegate OSSystemExtensionManager.shared.submitRequest(request) } func updateStatus(_ message: String) { statusLabel.stringValue = message } } class ExtensionDelegate: NSObject, OSSystemExtensionRequestDelegate { let onSuccess: () -> Void let onError: (Error) -> Void let onNeedsApproval: () -> Void init(onSuccess: @escaping () -> Void, onError: @escaping (Error) -> Void, onNeedsApproval: @escaping () -> Void) { self.onSuccess = onSuccess self.onError = onError self.onNeedsApproval = onNeedsApproval super.init() } func request(_ request: OSSystemExtensionRequest, didFinishWithResult result: OSSystemExtensionRequest.Result) { Logger(subsystem: "com.momentry.markbase.installer", category: "ExtensionDelegate") .info("Request finished with result") onSuccess() } func request(_ request: OSSystemExtensionRequest, didFailWithError error: Error) { Logger(subsystem: "com.momentry.markbase.installer", category: "ExtensionDelegate") .error("Request failed with error: \(error.localizedDescription)") onError(error) } func requestNeedsUserApproval(_ request: OSSystemExtensionRequest) { Logger(subsystem: "com.momentry.markbase.installer", category: "ExtensionDelegate") .info("Request needs user approval") onNeedsApproval() } func request(_ request: OSSystemExtensionRequest, actionForReplacingExtension existing: OSSystemExtensionProperties, withExtension ext: OSSystemExtensionProperties) -> OSSystemExtensionRequest.ReplacementAction { Logger(subsystem: "com.momentry.markbase.installer", category: "ExtensionDelegate") .info("Replacing extension") return .replace } }