spb/poche Public
Agent personnel 100 % on-device — SwiftUI + Apple Foundation Models + EventKit + SwiftData. Aucune API, aucun serveur.
Swift 100%
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