SPB Git

spb/zyquo-agent Public MIT

The autonomous agent that actually operates your Mac — plans, runs real commands, verifies its own work.

Swift 94.7% Shell 4.1% Python 0.7% Makefile 0.5%
1.6 KB · 57 lines swift
Raw Blame History
1//2//  TemplateStore.swift3//  Zyquo Agent4//5//  Author: Simon-Pierre Boucher6//  Mail: contact@spboucher.ai7//8//  Task templates: the built-in library (TaskTemplateLibrary) plus the user's9//  own templates, persisted to templates.json. Built-ins are read-only.10//1112import Combine13import Foundation1415@MainActor16final class TemplateStore: ObservableObject {17    static let fileName = "templates.json"1819    /// User-created templates (CRUD, persisted).20    @Published private(set) var userTemplates: [TaskTemplate] {21        didSet { persistence.save(userTemplates, to: Self.fileName) }22    }2324    private let persistence: PersistenceService2526    init(persistence: PersistenceService = .shared) {27        self.persistence = persistence28        self.userTemplates = persistence.load([TaskTemplate].self, from: Self.fileName) ?? []29    }3031    /// Built-ins first (library order), then user templates.32    var all: [TaskTemplate] {33        TaskTemplateLibrary.builtIn + userTemplates34    }3536    func templates(in category: TemplateCategory) -> [TaskTemplate] {37        all.filter { $0.category == category }38    }3940    // MARK: - CRUD (user templates only)4142    func add(_ template: TaskTemplate) {43        var template = template44        template.isBuiltIn = false45        userTemplates.append(template)46    }4748    func update(_ template: TaskTemplate) {49        guard let index = userTemplates.firstIndex(where: { $0.id == template.id }) else { return }50        userTemplates[index] = template51    }5253    func delete(_ id: TaskTemplate.ID) {54        userTemplates.removeAll { $0.id == id }55    }56}57