blob: bd7c0d2c8272d70324ae190cec801d9c7687ecbb [file] [log] [blame]
package loop
import (
"fmt"
"time"
)
type Agent interface {
Run(todo *ToDo) error
}
type UserAgent struct {
pr PromptReader
}
func (a *UserAgent) Run(todo *ToDo) error {
for {
unlocked := false
todo.Lock()
items := findActionableItems(todo, "user")
if len(items) == 0 {
fmt.Println("## USER NO ITEMS")
todo.Unlock()
time.Sleep(30 * time.Second)
continue
}
fmt.Println(todo.String())
fmt.Printf("-- YOU START WORKING %d\n", len(items))
for _, i := range items {
fmt.Printf("YOU %s %s: ", i.ID, i.Title)
comment, err := a.pr.Read()
if err != nil {
return err
}
if comment == "DONE" {
i.Done = true
continue
}
if comment == "BREAK" {
unlocked = true
todo.Unlock()
time.Sleep(30 * time.Second)
break
}
if comment == "ASSIGN" {
i.AssignedTo = "assistant"
continue
}
i.Discussion = append(i.Discussion, Comment{
Author: "user",
Comment: comment,
})
i.AssignedTo = "assistant"
}
fmt.Println("-- YOU END WORKING")
if !unlocked {
todo.Unlock()
}
}
}
func findActionableItems(todo *ToDo, assignedTo string) []*ToDo {
if todo.Done {
return nil
}
var ret []*ToDo
for _, i := range todo.Items {
ret = append(ret, findActionableItems(i, assignedTo)...)
if len(ret) > 0 && !todo.Parallel {
return ret
}
}
if len(ret) == 0 && todo.AssignedTo == assignedTo && !todo.Done {
for _, i := range todo.Items {
if !i.Done {
return nil
}
}
return []*ToDo{todo}
}
return ret
}