SPB Git

spb/poche Public

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

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