SPB Git

spb/poche Public

Agent personnel 100 % on-device — SwiftUI + Apple Foundation Models + EventKit + SwiftData. Aucune API, aucun serveur.

Swift 100%
1.8 KB · 52 lines swift
Raw Blame History
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