package agents_test import ( "strings" "testing" "time" "g.fc.run/misc/byre/internal/api" "g.fc.run/misc/byre/internal/store" ) func leadIdle(ev api.Event) bool { return ev.Kind == "session.state" && ev.Owner != nil && ev.Payload["state"] == string(api.AgentSessionStateIdle) } func TestLeadSignalsAndShow(t *testing.T) { t.Parallel() e := newEnv(t) m := e.manager() lead, err := m.MessageLead(e.ctx, e.user, "Reply with the single word ready.", testModel, nil) if err != nil { t.Fatalf("message lead: %v", err) } if lead.Owner != login || lead.TaskId != "" || lead.Role != api.Lead { t.Fatalf("lead session %+v", lead) } e.waitFor("lead idle", leadIdle) worker := api.AgentSession{ Id: store.NewID(), TaskId: e.task.Id, Vendor: api.Claude, VendorSessionId: store.NewID(), State: api.AgentSessionStateIdle, Role: api.Implementer, CreatedBy: login, CreatedAt: time.Now().UTC(), } err = e.store.CreateSession(e.ctx, worker, e.project.Id) if err != nil { t.Fatalf("create worker session: %v", err) } err = e.store.CreateInboxItem(e.ctx, api.InboxItem{ Id: store.NewID(), ProjectId: e.project.Id, TaskId: e.task.Id, AgentSessionId: worker.Id, ThreadId: "t1", Kind: api.Report, Priority: api.Fyi, Payload: map[string]any{"text": "Finished the parser. The tests pass."}, State: api.Open, CreatedAt: time.Now().UTC(), Responses: []api.InboxResponse{}, }) if err != nil { t.Fatalf("file report: %v", err) } created := e.waitFor("inbox.created", func(ev api.Event) bool { return ev.Kind == "inbox.created" }) m.Observe(created[len(created)-1]) signalled := e.waitFor("signal delivered", func(ev api.Event) bool { return ev.Kind == "user.message" && ev.Owner != nil && ev.Actor == "byre" }) text := signalled[len(signalled)-1].Payload["text"].(string) if !strings.Contains(text, "Finished the parser") || !strings.Contains(text, e.task.Id) { t.Fatalf("signal text %q", text) } e.waitFor("lead idle after signal", leadIdle) _, err = m.MessageLead(e.ctx, e.user, "Call the show tool with task_id "+e.task.Id+", tabs [\"inbox\"] and tab \"inbox\". Then say done.", "", nil) if err != nil { t.Fatalf("message lead: %v", err) } e.waitFor("focus.updated by the lead", func(ev api.Event) bool { return ev.Kind == "focus.updated" && ev.Actor == login+" (lead)" }) f, err := e.store.GetFocus(e.ctx, login) if err != nil { t.Fatalf("get focus: %v", err) } if f.TaskId == nil || *f.TaskId != e.task.Id || f.Tab != api.TabInbox { t.Fatalf("focus %+v", f) } e.waitFor("lead idle after show", leadIdle) }