SPB Git

spb/poche Public

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

Swift 100%
1.7 KB · 50 lines swift
Raw Blame History
1//2//  ActionExecutor.swift3//  Poche4//5//  Author:  Simon-Pierre Boucher6//  Contact: contact@spboucher.ai7//89import Foundation1011/// Performs confirmed side effects against the bridges. Constraint: only12/// ConfirmCenter may call this type — tools and views never touch bridges13/// or the store's write API directly (CLAUDE.md §3, §10).14@MainActor15struct ActionExecutor {16    let bridge: EventKitBridge17    let store: PocheStore1819    /// Returns a short, truthful past-tense summary — safe to show because20    /// by the time it exists, the write has actually happened.21    func execute(_ payload: PendingAction.Payload) async throws -> String {22        switch payload {23        case .reminder(let draft):24            try await bridge.createReminder(draft)25            return "Rappel « \(draft.title) » créé pour \(DateResolver.display(draft.due))"2627        case .event(let draft):28            try await bridge.createEvent(draft)29            return "Événement « \(draft.title) » créé le \(DateResolver.display(draft.start))"3031        case .note(let draft):32            store.addNote(title: draft.title, content: draft.content)33            return "Note « \(draft.title) » enregistrée"3435        case .newTask(let draft):36            store.addTask(title: draft.title, details: draft.details, due: draft.due)37            return "Tâche « \(draft.title) » créée"3839        case .taskUpdate(let draft):40            try store.updateTask(41                uuid: draft.taskID,42                newTitle: draft.newTitle,43                newDue: draft.newDue,44                markDone: draft.markDone45            )46            return "Tâche « \(draft.newTitle ?? draft.currentTitle) » mise à jour"47        }48    }49}50