// // CreateCalendarEventTool.swift // Poche // // Author: Simon-Pierre Boucher // Contact: contact@spboucher.ai // import Foundation import FoundationModels struct CreateCalendarEventTool: Tool { let name = "createCalendarEvent" let description = "Propose la création d'un événement de calendrier. L'utilisateur devra confirmer." @Generable struct Arguments { @Guide(description: "Titre de l'événement, court et concret") let title: String @Guide(description: "Début au format ISO 8601, par exemple 2026-08-12T14:00:00") let startDate: String @Guide(description: "Fin au format ISO 8601, seulement si précisée (sinon une heure après le début)") let endDate: String? @Guide(description: "Lieu, seulement si l'utilisateur l'a précisé") let location: String? } private let confirm: ConfirmCenter init(confirm: ConfirmCenter) { self.confirm = confirm } func call(arguments: Arguments) async throws -> String { guard let title = ToolInput.title(arguments.title) else { return "Erreur : le titre est vide. Demande un titre à l'utilisateur." } let start: Date do { start = try DateResolver.resolve(iso: arguments.startDate) } catch { return "Erreur sur la date de début : \(error.localizedDescription)" } var end = start.addingTimeInterval(3600) if let rawEnd = arguments.endDate, !rawEnd.trimmingCharacters(in: .whitespaces).isEmpty { do { end = try DateResolver.resolve(iso: rawEnd) } catch { return "Erreur sur la date de fin : \(error.localizedDescription)" } guard end > start else { return "Erreur : la fin est avant le début. Vérifie les horaires avec l'utilisateur." } } let draft = EventDraft(title: title, start: start, end: end, location: ToolInput.optionalText(arguments.location)) await confirm.propose(PendingAction(payload: .event(draft))) return "Proposition affichée : événement « \(title) » le \(DateResolver.display(start)). Rien n'est encore créé — l'utilisateur doit confirmer. Ne dis pas que l'événement est créé." } }