spb/poche Public
Agent personnel 100 % on-device — SwiftUI + Apple Foundation Models + EventKit + SwiftData. Aucune API, aucun serveur.
Swift 100%
1//2// CreateReminderTool.swift3// Poche4//5// Author: Simon-Pierre Boucher6// Contact: contact@spboucher.ai7//89import Foundation10import FoundationModels1112/// The pattern tool (CLAUDE.md §11): validate, never write, hand a pending13/// proposal to the Confirm layer, return a short budgeted string.14struct CreateReminderTool: Tool {15 let name = "createReminder"16 let description = "Propose la création d'un rappel avec un titre et une échéance. L'utilisateur devra confirmer."1718 @Generable19 struct Arguments {20 @Guide(description: "Titre du rappel, court et concret")21 let title: String22 @Guide(description: "Échéance au format ISO 8601, par exemple 2026-08-12T09:00:00")23 let dueDate: String24 @Guide(description: "Nom de la liste de rappels, seulement si l'utilisateur l'a précisé")25 let list: String?26 }2728 private let confirm: ConfirmCenter2930 init(confirm: ConfirmCenter) {31 self.confirm = confirm32 }3334 func call(arguments: Arguments) async throws -> String {35 guard let title = ToolInput.title(arguments.title) else {36 return "Erreur : le titre est vide. Demande un titre à l'utilisateur."37 }3839 let due: Date40 do {41 due = try DateResolver.resolve(iso: arguments.dueDate)42 } catch {43 return "Erreur : \(error.localizedDescription)"44 }4546 let draft = ReminderDraft(title: title, due: due, list: ToolInput.optionalText(arguments.list))47 await confirm.propose(PendingAction(payload: .reminder(draft)))4849 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éé."50 }51}52