// task/agent.go – Task-Agent: add/list/done/delete package task import ( "fmt" "strings" "my-brain-importer/internal/agents" ) // Agent verwaltet Aufgaben über tasks.json. type Agent struct { store *Store } // New erstellt einen neuen Task-Agenten. func New() *Agent { return &Agent{store: NewStore()} } // Handle unterstützt: add, list, done, delete func (a *Agent) Handle(req agents.Request) agents.Response { switch req.Action { case agents.ActionAdd: return a.add(req) case agents.ActionList: return a.list() case agents.ActionDone: return a.done(req) case agents.ActionDelete: return a.del(req) default: return agents.Response{Text: "❌ Unbekannte Task-Aktion. Verfügbar: add, list, done, delete"} } } func (a *Agent) add(req agents.Request) agents.Response { if len(req.Args) == 0 { return agents.Response{Text: "❌ Kein Task-Text angegeben."} } text := strings.Join(req.Args, " ") t, err := a.store.Add(text) if err != nil { return agents.Response{Error: err, Text: fmt.Sprintf("❌ Fehler: %v", err)} } shortID := t.ID if len(shortID) > 6 { shortID = shortID[len(shortID)-6:] } return agents.Response{Text: fmt.Sprintf("✅ Task hinzugefügt: `%s` (ID: `%s`)", t.Text, shortID)} } func (a *Agent) list() agents.Response { tasks, err := a.store.Load() if err != nil { return agents.Response{Error: err, Text: fmt.Sprintf("❌ Fehler: %v", err)} } if len(tasks) == 0 { return agents.Response{Text: "📋 Keine Tasks vorhanden."} } var sb strings.Builder sb.WriteString("📋 **Task-Liste:**\n\n") openCount := 0 for _, t := range tasks { status := "⬜" if t.Done { status = "✅" } else { openCount++ } shortID := t.ID if len(shortID) > 6 { shortID = shortID[len(shortID)-6:] } fmt.Fprintf(&sb, "%s `%s` – %s\n", status, shortID, t.Text) } fmt.Fprintf(&sb, "\n*%d offen, %d gesamt*", openCount, len(tasks)) return agents.Response{Text: sb.String()} } func (a *Agent) done(req agents.Request) agents.Response { if len(req.Args) == 0 { return agents.Response{Text: "❌ Keine Task-ID angegeben."} } id := req.Args[0] tasks, err := a.store.Load() if err != nil { return agents.Response{Error: err, Text: fmt.Sprintf("❌ Fehler: %v", err)} } fullID := resolveID(tasks, id) if fullID == "" { return agents.Response{Text: fmt.Sprintf("❌ Task `%s` nicht gefunden.", id)} } if err := a.store.MarkDone(fullID); err != nil { return agents.Response{Error: err, Text: fmt.Sprintf("❌ Fehler: %v", err)} } return agents.Response{Text: fmt.Sprintf("✅ Task `%s` als erledigt markiert.", id)} } func (a *Agent) del(req agents.Request) agents.Response { if len(req.Args) == 0 { return agents.Response{Text: "❌ Keine Task-ID angegeben."} } id := req.Args[0] tasks, err := a.store.Load() if err != nil { return agents.Response{Error: err, Text: fmt.Sprintf("❌ Fehler: %v", err)} } fullID := resolveID(tasks, id) if fullID == "" { return agents.Response{Text: fmt.Sprintf("❌ Task `%s` nicht gefunden.", id)} } if err := a.store.Delete(fullID); err != nil { return agents.Response{Error: err, Text: fmt.Sprintf("❌ Fehler: %v", err)} } return agents.Response{Text: fmt.Sprintf("🗑️ Task `%s` gelöscht.", id)} } // resolveID findet eine vollständige ID aus einer vollständigen oder kurzen (letzte 6 Zeichen). func resolveID(tasks []Task, id string) string { for _, t := range tasks { if t.ID == id { return t.ID } } for _, t := range tasks { if len(t.ID) >= 6 && t.ID[len(t.ID)-6:] == id { return t.ID } } return "" }