Agents + bash
diff --git a/loop/anthropic.go b/loop/anthropic.go
index 8ff5d6b..e711d47 100644
--- a/loop/anthropic.go
+++ b/loop/anthropic.go
@@ -13,6 +13,7 @@
 )
 
 type AnthropicAgent struct {
+	pr     PromptReader
 	reg    tools.Registry
 	client anthropic.Client
 }
@@ -35,13 +36,12 @@
 	for i, toolParam := range toolParams {
 		tools[i] = anthropic.ToolUnionParam{OfTool: &toolParam}
 	}
-	k, err := json.MarshalIndent(todo, "", "\t")
-	if err != nil {
-		return err
-	}
 	for {
+		todo.Lock()
 		items := findActionableItems(todo, "assistant")
 		if len(items) == 0 {
+			fmt.Println("## AGENT NO ITEMS")
+			todo.Unlock()
 			time.Sleep(30 * time.Second)
 			continue
 		}
@@ -50,7 +50,14 @@
 		for _, i := range items {
 			itemIds = append(itemIds, i.ID)
 		}
-		messages = append(messages, anthropic.NewUserMessage(anthropic.NewTextBlock(string(k))))
+		fmt.Println(todo.String())
+		fmt.Printf("-- AGENT START WORKING %s\n", strings.Join(itemIds, ", "))
+		b, err := json.MarshalIndent(todo, "", "\t")
+		if err != nil {
+			todo.Unlock()
+			break
+		}
+		messages = append(messages, anthropic.NewUserMessage(anthropic.NewTextBlock(string(b))))
 		messages = append(messages, anthropic.NewUserMessage(anthropic.NewTextBlock(
 			fmt.Sprintf("Work on TODO item: %s", strings.Join(itemIds, ", ")))))
 		for {
@@ -64,6 +71,7 @@
 				Tools:    tools,
 			})
 			if err != nil {
+				todo.Unlock()
 				return err
 			}
 			fmt.Printf("--- STOP_REASON: %s\n", resp.StopReason)
@@ -75,12 +83,25 @@
 				case anthropic.TextBlock:
 					fmt.Printf("AI: %s\n", v.Text)
 				case anthropic.ToolUseBlock:
+					args := v.JSON.Input.Raw()
+					if v.Name == "bash_command" {
+						fmt.Printf("!!!!! %s: ", args)
+						p, err := a.pr.Read()
+						if err != nil {
+							todo.Unlock()
+							return err
+						}
+						if p != "OK" {
+							toolResults = append(toolResults, anthropic.NewToolResultBlock(v.ID, p, true))
+							continue
+						}
+					}
 					t := a.reg.Get(v.Name)
 					if t == nil {
 						toolResults = append(toolResults, anthropic.NewToolResultBlock(v.ID, fmt.Sprintf("unknown tool %q", v.Name), true))
 						continue
 					}
-					args := v.JSON.Input.Raw()
+
 					fmt.Printf("CALLING TOOL: %s %s\n", v.Name, args)
 					out, err := t.Call(string(args))
 					if err != nil {
@@ -99,5 +120,7 @@
 		for _, i := range items {
 			i.AssignedTo = "user"
 		}
+		todo.Unlock()
 	}
+	return nil
 }