Move lead delivery and the Merge & continue hold onto the coordinator

This commit is contained in:
Ian Gulliver
2026-10-21 13:59:37 -07:00
parent 1734057293
commit 5c50fa857f
16 changed files with 270 additions and 190 deletions
+46 -41
View File
@@ -163,14 +163,30 @@ func (m *Manager) MessageLead(ctx context.Context, user api.User, text, model, s
if err != nil {
return api.AgentSession{}, err
}
err = m.store.AddLeadInput(ctx, store.LeadInput{Owner: user.Login, Kind: store.LeadMessage, Actor: user.Login, Text: text, Images: images, SendID: sendID, Client: client})
err = m.addLeadInput(ctx, store.LeadInput{Owner: user.Login, Kind: store.LeadMessage, Actor: user.Login, Text: text, Images: images, SendID: sendID, Client: client})
if err != nil {
return api.AgentSession{}, err
}
return sess, nil
}
func (m *Manager) DeliverLead(ctx context.Context, owner string) error {
func (m *Manager) addLeadInput(ctx context.Context, in store.LeadInput) error {
err := m.store.AddLeadInput(ctx, in)
if err != nil {
return err
}
m.poke()
return nil
}
func (m *Manager) deliverLead(owner string) {
err := m.tryDeliverLead(context.Background(), owner)
if err != nil {
slog.Error("deliver to lead", "owner", owner, "err", err)
}
}
func (m *Manager) tryDeliverLead(ctx context.Context, owner string) error {
m.leadMu.Lock()
defer m.leadMu.Unlock()
@@ -257,24 +273,6 @@ func (m *Manager) leadStateText(ctx context.Context, owner string) (string, erro
return fmt.Sprintf("Tasks now:\n%s\n%s", tasks, pane), nil
}
func (m *Manager) deliverLead(owner string) {
err := m.DeliverLead(context.Background(), owner)
if err != nil {
slog.Error("deliver to lead", "owner", owner, "err", err)
}
}
func (m *Manager) deliverAllLeads() {
owners, err := m.store.LeadOwners(context.Background())
if err != nil {
slog.Error("list lead owners", "err", err)
return
}
for _, owner := range owners {
m.deliverLead(owner)
}
}
func (m *Manager) parkLeads(ctx context.Context) error {
running, err := m.store.SessionsInState(ctx, api.AgentSessionStateRunning)
if err != nil {
@@ -288,7 +286,7 @@ func (m *Manager) parkLeads(ctx context.Context) error {
if err != nil {
return err
}
err = m.store.AddLeadInput(ctx, store.LeadInput{Owner: sess.Owner, Kind: store.LeadSignal, Actor: "byre", Text: leadRestartNotice})
err = m.addLeadInput(ctx, store.LeadInput{Owner: sess.Owner, Kind: store.LeadSignal, Actor: "byre", Text: leadRestartNotice})
if err != nil {
return err
}
@@ -322,6 +320,15 @@ func (m *Manager) leadTurnEnded(ctx context.Context, l *live, res endResult) err
}
}
if handoff {
go m.continueFromHandoff(l.id, res.result)
return nil
}
if wantCompact && finished && !compacting {
go m.compactLead(l.id)
return nil
}
var state map[string]any
if res.isError && !interrupted {
state = map[string]any{"error": fmt.Sprintf("the turn ended with an error (%s): %s", res.subtype, res.result)}
@@ -331,24 +338,23 @@ func (m *Manager) leadTurnEnded(ctx context.Context, l *live, res endResult) err
return err
}
switch {
case handoff:
go m.continueFromHandoff(l.id, res.result)
case wantCompact && finished && !compacting:
go func() {
_, err := m.Compact(context.Background(), l.id, "")
if err != nil {
slog.Error("compact lead", "session", l.id, "err", err)
}
}()
default:
err = m.warnLeadContext(ctx, l)
if err != nil {
return err
}
go m.deliverLead(l.owner)
return m.warnLeadContext(ctx, l)
}
func (m *Manager) compactLead(sessionID string) {
ctx := context.Background()
sess, err := m.store.GetSession(ctx, sessionID)
if err == nil {
_, err = m.launchCompaction(ctx, sess, api.Task{}, "")
}
if err == nil {
return
}
slog.Error("compact lead", "session", sessionID, "err", err)
err = m.store.TransitionSession(ctx, sessionID, api.AgentSessionStateRunning, api.AgentSessionStateIdle, "byre")
if err != nil && !errors.Is(err, store.ErrStateChanged) {
slog.Error("end failed lead compaction", "session", sessionID, "err", err)
}
return nil
}
func (m *Manager) warnLeadContext(ctx context.Context, l *live) error {
@@ -357,7 +363,7 @@ func (m *Manager) warnLeadContext(ctx context.Context, l *live) error {
}
l.contextWarned = true
text := fmt.Sprintf("Your context is at %d%% of its window (%d of %d tokens). Call compact_self at the next logical point, this turn if nothing is in progress.", l.contextUsed*100/l.contextWindow, l.contextUsed, l.contextWindow)
return m.store.AddLeadInput(ctx, store.LeadInput{Owner: l.owner, Kind: store.LeadSignal, Actor: "byre", Text: text})
return m.addLeadInput(ctx, store.LeadInput{Owner: l.owner, Kind: store.LeadSignal, Actor: "byre", Text: text})
}
func (m *Manager) Observe(events []api.Event) {
@@ -472,11 +478,10 @@ func (m *Manager) signal(ctx context.Context, batch []api.Event) error {
continue
}
text := strings.Join(append(states, lines...), "\n")
err = m.store.AddLeadInput(ctx, store.LeadInput{Owner: owner, Kind: store.LeadSignal, Actor: "byre", Text: text})
err = m.addLeadInput(ctx, store.LeadInput{Owner: owner, Kind: store.LeadSignal, Actor: "byre", Text: text})
if err != nil {
return err
}
m.deliverLead(owner)
}
return nil
}