// // GetUpcomingTool.swift // Poche // // Author: Simon-Pierre Boucher // Contact: contact@spboucher.ai // import Foundation import FoundationModels /// Read-only view of upcoming events and reminders, strictly capped: /// a tool that returns 30 calendar events blows the context and kills the /// session (CLAUDE.md §4). struct GetUpcomingTool: Tool { let name = "getUpcoming" let description = "Liste les prochains événements du calendrier et rappels à venir." @Generable struct Arguments { @Guide(description: "Nombre de jours à couvrir, entre 1 et 14 (défaut 7)") let days: Int? } private let bridge: EventKitBridge init(bridge: EventKitBridge) { self.bridge = bridge } func call(arguments: Arguments) async throws -> String { let days = min(max(arguments.days ?? 7, 1), 14) var lines: [String] = [] do { let events = try await bridge.upcomingEvents(days: days, limit: 5) if !events.isEmpty { lines.append("Événements :") lines.append(contentsOf: events) } } catch { lines.append("Calendrier inaccessible (accès non autorisé).") } do { let reminders = try await bridge.upcomingReminders(limit: 5) if !reminders.isEmpty { lines.append("Rappels :") lines.append(contentsOf: reminders) } } catch { lines.append("Rappels inaccessibles (accès non autorisé).") } if lines.isEmpty { return "Rien de prévu dans les \(days) prochains jours." } return lines.joined(separator: "\n") } }