import Foundation /// ScriptHelper is a helper for invoking AppleScript. enum ScriptHelper { /// Execute an AppleScript via osascript with the provided arguments. /// Returns the output or throws an error. @discardableResult static func runAppleScript(_ script: String, arguments: [String]) async throws -> String { try await Task.detached(priority: .userInitiated) { let task = Process() task.launchPath = "/usr/bin/osascript" var args = ["-e", script] args.append(contentsOf: arguments) task.arguments = args let stdoutPipe = Pipe() let stderrPipe = Pipe() task.standardOutput = stdoutPipe task.standardError = stderrPipe try task.run() task.waitUntilExit() let stdout = self.readAsString(stdoutPipe) let stderr = self.readAsString(stderrPipe) print("AppleScript output: status=\(task.terminationStatus), stdout=\(stdout), stderr=\(stderr)") if task.terminationStatus != 0 { let errorMessage = stderr.isEmpty ? "Unknown AppleScript execution error." : "AppleScript execution error: \(stderr)" throw NSError( domain: "ScriptHelperDomain", code: Int(task.terminationStatus), userInfo: [NSLocalizedDescriptionKey: errorMessage] ) } return stdout }.value } private static func readAsString(_ p: Pipe) -> String { let data = p.fileHandleForReading.readDataToEndOfFile() guard let output = String(data: data, encoding: .utf8) else { return "" } return output.trimmingCharacters(in: .whitespacesAndNewlines) } }