SPB Git

spb/poche Public

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

Swift 100%
2.3 KB · 64 lines swift
Raw Blame History
1//2//  CreateCalendarEventTool.swift3//  Poche4//5//  Author:  Simon-Pierre Boucher6//  Contact: contact@spboucher.ai7//89import Foundation10import FoundationModels1112struct CreateCalendarEventTool: Tool {13    let name = "createCalendarEvent"14    let description = "Propose la création d'un événement de calendrier. L'utilisateur devra confirmer."1516    @Generable17    struct Arguments {18        @Guide(description: "Titre de l'événement, court et concret")19        let title: String20        @Guide(description: "Début au format ISO 8601, par exemple 2026-08-12T14:00:00")21        let startDate: String22        @Guide(description: "Fin au format ISO 8601, seulement si précisée (sinon une heure après le début)")23        let endDate: String?24        @Guide(description: "Lieu, seulement si l'utilisateur l'a précisé")25        let location: 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 start: Date40        do {41            start = try DateResolver.resolve(iso: arguments.startDate)42        } catch {43            return "Erreur sur la date de début : \(error.localizedDescription)"44        }4546        var end = start.addingTimeInterval(3600)47        if let rawEnd = arguments.endDate, !rawEnd.trimmingCharacters(in: .whitespaces).isEmpty {48            do {49                end = try DateResolver.resolve(iso: rawEnd)50            } catch {51                return "Erreur sur la date de fin : \(error.localizedDescription)"52            }53            guard end > start else {54                return "Erreur : la fin est avant le début. Vérifie les horaires avec l'utilisateur."55            }56        }5758        let draft = EventDraft(title: title, start: start, end: end, location: ToolInput.optionalText(arguments.location))59        await confirm.propose(PendingAction(payload: .event(draft)))6061        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éé."62    }63}64