// // CreateReminderTool.swift // Poche // // Author: Simon-Pierre Boucher // Contact: contact@spboucher.ai // import Foundation import FoundationModels /// The pattern tool (CLAUDE.md §11): validate, never write, hand a pending /// proposal to the Confirm layer, return a short budgeted string. struct CreateReminderTool: Tool { let name = "createReminder" let description = "Propose la création d'un rappel avec un titre et une échéance. L'utilisateur devra confirmer." @Generable struct Arguments { @Guide(description: "Titre du rappel, court et concret") let title: String @Guide(description: "Échéance au format ISO 8601, par exemple 2026-08-12T09:00:00") let dueDate: String @Guide(description: "Nom de la liste de rappels, seulement si l'utilisateur l'a précisé") let list: 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 due: Date do { due = try DateResolver.resolve(iso: arguments.dueDate) } catch { return "Erreur : \(error.localizedDescription)" } let draft = ReminderDraft(title: title, due: due, list: ToolInput.optionalText(arguments.list)) await confirm.propose(PendingAction(payload: .reminder(draft))) return "Proposition affichée : rappel « \(title) » pour \(DateResolver.display(due)). Rien n'est encore créé — l'utilisateur doit confirmer dans l'app. Ne dis pas que le rappel est créé." } }