import Foundation struct AppConfig: Codable, Equatable { var appToken: String = "" var tableId: String = "" var assigneeName: String = "" var fieldMappings: FieldMappings = FieldMappings() var pollIntervalSeconds: Int = 300 var showFloatingWidget: Bool = false var launchAtLogin: Bool = true var feishuBaseDomain: String = "xorbitlab.feishu.cn" struct FieldMappings: Codable, Equatable { var titleField: String = "Title" var priorityField: String = "Priority" var statusField: String = "Status" var assigneeField: String = "Assignee" var reporterField: String = "Reporter" var createdAtField: String = "Created At" var updatedAtField: String = "Updated At" /// Map Feishu display values to standard BugStatus cases. /// Keys are the Feishu select-option text; values are the standard status. /// Unknown values default to .unknown (shown as active). var statusMappings: [String: BugStatus] = [ "Bug Triage": .open, "Open": .open, "New": .open, "待处理": .open, "开发进行中": .inProgress, "In Progress": .inProgress, "验收中": .inReview, "In Review": .inReview, "验收完毕": .resolved, "Resolved": .resolved, "Fixed": .resolved, "取消": .closed, "Closed": .closed, "Won't fix": .closed, "转需求": .closed, "验收不通过": .closed, ] } var isConfigured: Bool { !appToken.isEmpty && !tableId.isEmpty } }