Files
ai-agent/internal/agents/task/agent.go
2026-03-19 21:46:12 +01:00

134 lines
3.5 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// 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 ""
}