import Foundation /// `speakers.json` — the final stored output (docs §6): per-chunk `label-merge` /// results concatenated, timestamps offset back to global seconds, names unified. /// This is the hand-off to the downstream summarizer; the app stops here. struct SpeakersFile: Codable { let sessionId: String let app: String let durationSec: Double let speakers: [Speaker] let segments: [Segment] let models: [String: String] struct Speaker: Codable, Equatable { let name: String let source: String let overlapConfidence: Double? let matchSimilarity: Double? enum CodingKeys: String, CodingKey { case name, source case overlapConfidence = "overlap_confidence" case matchSimilarity = "match_similarity" } } struct Segment: Codable, Equatable { let start: Double let end: Double let speaker: String let text: String? } enum CodingKeys: String, CodingKey { case sessionId = "session_id" case app case durationSec = "duration_sec" case speakers, segments, models } func write(to url: URL) throws { let encoder = JSONEncoder() encoder.outputFormatting = [.prettyPrinted, .sortedKeys] try encoder.encode(self).write(to: url) } }