Types.swift
1 import Foundation 2 3 struct Request: Decodable { 4 let id: Int64 5 let method: String 6 let params: Params? 7 } 8 9 struct Params: Decodable { 10 let pid: Int? 11 let maxDepth: Int? 12 let semanticBudget: Int? 13 let filter: String? 14 let path: String? 15 let expectedRole: String? 16 let value: String? 17 let appName: String? 18 let query: String? 19 let role: String? 20 let identifier: String? 21 let type: String? 22 let x: Double? 23 let y: Double? 24 let button: String? 25 let clicks: Int? 26 let key: String? 27 let modifiers: [String]? 28 let dx: Int? 29 let dy: Int? 30 let windowTitle: String? 31 let verify: Bool? 32 let condition: String? 33 let timeout: Double? 34 let interval: Double? 35 let roles: [String]? 36 let maxLabels: Int? 37 38 enum CodingKeys: String, CodingKey { 39 case pid, filter, path, value, query, role, identifier, type 40 case x, y, button, clicks, key, modifiers, dx, dy 41 case condition, timeout, interval, verify, roles 42 case maxDepth = "max_depth" 43 case semanticBudget = "semantic_budget" 44 case expectedRole = "expected_role" 45 case appName = "app_name" 46 case windowTitle = "window_title" 47 case maxLabels = "max_labels" 48 } 49 } 50 51 struct Response: Encodable { 52 let id: Int64 53 var result: AnyCodable? 54 var error: ErrorInfo? 55 } 56 57 struct ErrorInfo: Encodable { 58 let code: Int 59 let message: String 60 } 61 62 struct Element: Encodable { 63 let ref: String 64 let role: String 65 var subrole: String? 66 var title: String? 67 var desc: String? 68 var value: String? 69 var enabled: Bool? 70 var selected: Bool? 71 var children: [Element]? 72 } 73 74 struct ReadTreeResult: Encodable { 75 let app: String 76 let pid: Int 77 let window: String 78 let elements: [Element] 79 let refPaths: [String: RefEntry] 80 81 enum CodingKeys: String, CodingKey { 82 case app, pid, window, elements 83 case refPaths = "ref_paths" 84 } 85 } 86 87 struct RefEntry: Encodable { 88 let path: String 89 let role: String 90 } 91 92 struct AnnotationEntry: Encodable { 93 let label: Int 94 let ref: String 95 let role: String 96 var title: String? 97 let x: Double 98 let y: Double 99 let width: Double 100 let height: Double 101 } 102 103 struct AnnotateResult: Encodable { 104 let app: String 105 let pid: Int 106 let window: String 107 let annotations: [AnnotationEntry] 108 let refPaths: [String: RefEntry] 109 110 enum CodingKeys: String, CodingKey { 111 case app, pid, window, annotations 112 case refPaths = "ref_paths" 113 } 114 } 115 116 struct FindResult: Encodable { 117 let path: String 118 let role: String 119 let title: String 120 var desc: String? 121 var value: String? 122 } 123 124 struct AppContext: Encodable { 125 let app: String 126 let window: String 127 var url: String? 128 var focusedElement: String? 129 130 enum CodingKeys: String, CodingKey { 131 case app, window, url 132 case focusedElement = "focused_element" 133 } 134 } 135 136 struct ActionResult: Encodable { 137 let result: String 138 var role: String? 139 var context: AppContext? 140 } 141 142 /// Type-erased Encodable wrapper for JSON responses. 143 struct AnyCodable: Encodable { 144 private let _encode: (Encoder) throws -> Void 145 146 init<T: Encodable>(_ value: T) { 147 _encode = { encoder in 148 try value.encode(to: encoder) 149 } 150 } 151 152 func encode(to encoder: Encoder) throws { 153 try _encode(encoder) 154 } 155 }