import Cocoa import ApplicationServices func inspectApp(named targetName: String) { guard let app = NSWorkspace.shared.runningApplications.first(where: { $0.localizedName == targetName }) else { print("App \(targetName) not running") return } print("\n--- Inspecting \(targetName) (PID: \(app.processIdentifier)) ---") let appElem = AXUIElementCreateApplication(app.processIdentifier) AXUIElementSetAttributeValue(appElem, "AXEnhancedUserInterface" as CFString, kCFBooleanTrue) AXUIElementSetAttributeValue(appElem, "AXManualAccessibility" as CFString, kCFBooleanTrue) var focusedElemObj: CFTypeRef? let err = AXUIElementCopyAttributeValue(appElem, kAXFocusedUIElementAttribute as CFString, &focusedElemObj) print("kAXFocusedUIElementAttribute error:", err.rawValue) if err == .success, let elem = focusedElemObj { let axElem = elem as! AXUIElement var roleObj: CFTypeRef? AXUIElementCopyAttributeValue(axElem, kAXRoleAttribute as CFString, &roleObj) print("Role:", roleObj ?? "none") var valObj: CFTypeRef? let valErr = AXUIElementCopyAttributeValue(axElem, kAXValueAttribute as CFString, &valObj) print("Value err:", valErr.rawValue, "Value:", valObj ?? "none") var rangeObj: CFTypeRef? let rangeErr = AXUIElementCopyAttributeValue(axElem, kAXSelectedTextRangeAttribute as CFString, &rangeObj) if rangeErr == .success, let axRange = rangeObj { var range = CFRange() if AXValueGetValue(axRange as! AXValue, .cfRange, &range) { print("Cursor: loc=\(range.location), len=\(range.length)") } } } } inspectApp(named: "Telegram") inspectApp(named: "Obsidian") inspectApp(named: "firefox")