74 lines
2.5 KiB
Go
74 lines
2.5 KiB
Go
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)
|
|
}
|