import Foundation public actor TranscriptsStore { public static let shared = TranscriptsStore() private var entries: [String] = [] private let limit = 100 private let fileURL: URL public init() { let dir = FileManager.default.homeDirectoryForCurrentUser .appendingPathComponent("Library/Application Support/swabble", isDirectory: true) try? FileManager.default.createDirectory(at: dir, withIntermediateDirectories: true) fileURL = dir.appendingPathComponent("transcripts.log") if let data = try? Data(contentsOf: fileURL), let text = String(data: data, encoding: .utf8) { entries = text.split(separator: "\n").map(String.init).suffix(limit) } } public func append(text: String) { entries.append(text) if entries.count > limit { entries.removeFirst(entries.count - limit) } let body = entries.joined(separator: "\n") try? body.write(to: fileURL, atomically: false, encoding: .utf8) } public func latest() -> [String] { entries } } extension String { private func appendLine(to url: URL) throws { let data = (self + "\n").data(using: .utf8) ?? Data() if FileManager.default.fileExists(atPath: url.path) { let handle = try FileHandle(forWritingTo: url) try handle.seekToEnd() try handle.write(contentsOf: data) try handle.close() } else { try data.write(to: url) } } }