2026-10-15 11:08:53 -07:00
package agents
import (
"context"
"path/filepath"
"testing"
"time"
"g.fc.run/misc/byre/internal/api"
"g.fc.run/misc/byre/internal/claude"
"g.fc.run/misc/byre/internal/store"
)
func TestSubagentEvents ( t * testing . T ) {
ctx := context . Background ()
2026-10-15 12:39:46 -07:00
st , err := store . Open ( filepath . Join ( t . TempDir (), "byre.db" ), store . DefaultPortFirst , func ( api . Event ) {})
2026-10-15 11:08:53 -07:00
if err != nil {
t . Fatalf ( "open store: %v" , err )
}
t . Cleanup ( func () { st . Close () })
now := time . Now (). UTC ()
_ , err = st . EnsureUser ( ctx , "alice" , "Alice" )
if err != nil {
t . Fatalf ( "ensure user: %v" , err )
}
err = st . CreateProject ( ctx , api . Project { Id : "p1" , Name : "demo" , RepoPath : "/nonexistent" , DefaultBranch : "main" , Remote : "none" , CreatedBy : "alice" , CreatedAt : now })
if err != nil {
t . Fatalf ( "create project: %v" , err )
}
err = st . CreateTask ( ctx , api . Task { Id : "t1" , ProjectId : "p1" , Title : "t" , Branch : "b" , WorktreePath : "/nonexistent" , BaseRef : "x" , Status : api . TaskStatusActive , CreatedBy : "alice" , CreatedAt : now }, "alice" )
if err != nil {
t . Fatalf ( "create task: %v" , err )
}
m := New ( st , DefaultLimits , t . TempDir (), t . TempDir ())
l := & live { id : "s1" , dir : t . TempDir (), vendor : api . Claude , taskID : "t1" , projectID : "p1" }
feed := func ( typ , raw string ) {
t . Helper ()
err := m . handle ( ctx , l , claude . Event { Type : typ , Raw : [] byte ( raw )})
if err != nil {
t . Fatalf ( "handle %s: %v" , raw , err )
}
}
feed ( "assistant" , `{"type":"assistant","message":{"model":"m","content":[{"type":"tool_use","id":"toolu_agent","name":"Agent","input":{"subagent_type":"general-purpose","description":"d","prompt":"p"}}],"usage":{"input_tokens":2,"cache_read_input_tokens":100,"output_tokens":17}},"parent_tool_use_id":null}` )
feed ( "assistant" , `{"type":"assistant","message":{"model":"m","content":[{"type":"tool_use","id":"toolu_bash","name":"Bash","input":{"command":"ls"}}],"usage":{"input_tokens":2,"cache_creation_input_tokens":33494,"output_tokens":20}},"parent_tool_use_id":"toolu_agent","agent_id":"a1"}` )
feed ( "user" , `{"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_bash","type":"tool_result","content":"adsb-tools","is_error":false}]},"parent_tool_use_id":"toolu_agent","agent_id":"a1"}` )
feed ( "assistant" , `{"type":"assistant","message":{"model":"m","content":[{"type":"text","text":"The first entry is adsb-tools."}],"usage":{"input_tokens":2,"output_tokens":3}},"parent_tool_use_id":"toolu_agent","agent_id":"a1"}` )
events , err := st . TaskEvents ( ctx , "t1" , 0 , 100 )
if err != nil {
t . Fatalf ( "task events: %v" , err )
}
got := [] string {}
for _ , ev := range events {
if ev . AgentSessionId == nil {
continue
}
parent , _ := ev . Payload [ "parent_tool_use_id" ].( string )
got = append ( got , ev . Kind + " " + parent )
}
want := [] string {
"agent.tool_call " ,
"session.context " ,
"agent.tool_call toolu_agent" ,
"agent.tool_result toolu_agent" ,
"agent.message toolu_agent" ,
}
if len ( got ) != len ( want ) {
t . Fatalf ( "want %q, got %q" , want , got )
}
for i := range want {
if got [ i ] != want [ i ] {
t . Fatalf ( "want %q, got %q" , want , got )
}
}
if l . contextUsed != 119 {
t . Fatalf ( "subagent usage changed the session's context: %d" , l . contextUsed )
}
}