import Foundation enum IngestedSourceKind: String, Codable, Sendable, CaseIterable { case text case pdf case file var label: String { switch self { case .text: "Text" case .pdf: "PDF" case .file: "File" } } } struct IngestedSource: Identifiable, Codable, Sendable, Hashable { let id: UUID var kind: IngestedSourceKind var title: String var bodyText: String var originalFilename: String? var localFilename: String? var tags: [String] var createdAt: Date var modifiedAt: Date init( id: UUID = UUID(), kind: IngestedSourceKind, title: String, bodyText: String, originalFilename: String? = nil, localFilename: String? = nil, tags: [String] = [], createdAt: Date = Date(), modifiedAt: Date = Date() ) { self.id = id self.kind = kind self.title = title self.bodyText = bodyText self.originalFilename = originalFilename self.localFilename = localFilename self.tags = tags self.createdAt = createdAt self.modifiedAt = modifiedAt } var displayTitle: String { let trimmed = title.trimmingCharacters(in: .whitespacesAndNewlines) if !trimmed.isEmpty { return trimmed } return originalFilename ?? kind.label } var excerpt: String { bodyText .trimmingCharacters(in: .whitespacesAndNewlines) .replacingOccurrences(of: "\n", with: " ") } var podcastURL: String { "marks-source://\(id.uuidString)" } var podcastText: String { String(bodyText.trimmingCharacters(in: .whitespacesAndNewlines).prefix(100_000)) } }