llm mail integration

This commit is contained in:
Christoph K.
2026-03-19 21:46:12 +01:00
parent fdc7a8588d
commit 0e7aa3e7f2
19 changed files with 1707 additions and 306 deletions

View File

@@ -0,0 +1,133 @@
// 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 ""
}