init
diff --git a/loop/agent.go b/loop/agent.go
new file mode 100644
index 0000000..8e903a2
--- /dev/null
+++ b/loop/agent.go
@@ -0,0 +1,49 @@
+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 {
+ items := findActionableItems(todo, "user")
+ if len(items) == 0 {
+ time.Sleep(30 * time.Second)
+ continue
+ }
+ for _, i := range items {
+ fmt.Printf("YOU %s %s: ", i.ID, i.Title)
+ comment, err := a.pr.Read()
+ if err != nil {
+ return err
+ }
+ i.Discussion = append(i.Discussion, Comment{
+ Author: "user",
+ Comment: comment,
+ })
+ i.AssignedTo = "assistant"
+ }
+ }
+}
+
+func findActionableItems(todo *ToDo, assignedTo string) []*ToDo {
+ for _, i := range todo.Items {
+ ret := findActionableItems(i, assignedTo)
+ if len(ret) > 0 {
+ return ret
+ }
+ }
+ if todo.AssignedTo == assignedTo && !todo.Done {
+ return []*ToDo{todo}
+ }
+ return nil
+}