spb/poche Public
Agent personnel 100 % on-device — SwiftUI + Apple Foundation Models + EventKit + SwiftData. Aucune API, aucun serveur.
Swift 100%
1//2// SearchMyDataTool.swift3// Poche4//5// Author: Simon-Pierre Boucher6// Contact: contact@spboucher.ai7//89import Foundation10import FoundationModels1112/// Read-only. Long-term memory lives in SwiftData and is re-injected on13/// demand through this tool, never kept permanently in the context14/// (CLAUDE.md §5).15struct SearchMyDataTool: Tool {16 let name = "searchMyData"17 let description = "Recherche dans les notes, tâches et souvenirs enregistrés dans Poche."1819 @Generable20 struct Arguments {21 @Guide(description: "Ce que l'utilisateur cherche, en quelques mots")22 let query: String23 }2425 private let store: PocheStore26 private let index: SemanticIndex2728 init(store: PocheStore, index: SemanticIndex) {29 self.store = store30 self.index = index31 }3233 func call(arguments: Arguments) async throws -> String {34 guard let query = ToolInput.title(arguments.query) else {35 return "Erreur : la recherche est vide."36 }3738 let corpus = await store.corpus()39 guard !corpus.isEmpty else {40 return "Aucune donnée enregistrée dans Poche pour l'instant."41 }4243 let results = await index.rank(query: query, in: corpus, limit: 3)44 guard !results.isEmpty else {45 return "Rien trouvé pour « \(query) »."46 }4748 // Budgeted output: 3 results max, each clipped (~200 tokens total).49 return results50 .map { "[\($0.kind)] \($0.title) — \(String($0.body.prefix(160)))" }51 .joined(separator: "\n")52 }53}54