// // TemplateStore.swift // Zyquo Agent // // Author: Simon-Pierre Boucher // Mail: contact@spboucher.ai // // Task templates: the built-in library (TaskTemplateLibrary) plus the user's // own templates, persisted to templates.json. Built-ins are read-only. // import Combine import Foundation @MainActor final class TemplateStore: ObservableObject { static let fileName = "templates.json" /// User-created templates (CRUD, persisted). @Published private(set) var userTemplates: [TaskTemplate] { didSet { persistence.save(userTemplates, to: Self.fileName) } } private let persistence: PersistenceService init(persistence: PersistenceService = .shared) { self.persistence = persistence self.userTemplates = persistence.load([TaskTemplate].self, from: Self.fileName) ?? [] } /// Built-ins first (library order), then user templates. var all: [TaskTemplate] { TaskTemplateLibrary.builtIn + userTemplates } func templates(in category: TemplateCategory) -> [TaskTemplate] { all.filter { $0.category == category } } // MARK: - CRUD (user templates only) func add(_ template: TaskTemplate) { var template = template template.isBuiltIn = false userTemplates.append(template) } func update(_ template: TaskTemplate) { guard let index = userTemplates.firstIndex(where: { $0.id == template.id }) else { return } userTemplates[index] = template } func delete(_ id: TaskTemplate.ID) { userTemplates.removeAll { $0.id == id } } }