Move lead delivery and the Merge & continue hold onto the coordinator
This commit is contained in:
+46
-41
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user