don't restart after interrupt

This commit is contained in:
Ian Gulliver
2026-10-19 14:08:56 -07:00
parent 598ee788f8
commit b634d42dcf
6 changed files with 25 additions and 6 deletions
+3
View File
@@ -149,6 +149,9 @@ func (m *Manager) DeliverLead(ctx context.Context, owner string) error {
}
batch, actor, text, images := nextLeadTurn(inputs)
if batch[0].Kind == store.LeadSignal && m.interrupted(sess.Id) {
return nil
}
if batch[0].Kind == store.LeadSignal {
state, err := m.leadStateText(ctx, owner)
if err != nil {
+5 -1
View File
@@ -1245,11 +1245,15 @@ func (m *Manager) afterTurn(ctx context.Context, l *live) {
m.startDiscard(l.taskID)
return
}
m.deliverTeam(ctx, l)
if m.interrupted(l.id) {
m.logUndelivered(ctx, l.id, "turn was interrupted")
return
}
err = m.Deliver(ctx, l.id)
if err != nil {
slog.Error("deliver inbox responses", "session", l.id, "err", err)
}
m.deliverTeam(ctx, l)
}
func commitMessage(res endResult) string {
+14 -2
View File
@@ -47,7 +47,8 @@ func (m *Manager) Message(ctx context.Context, sessionID, actor, text, model str
if err != nil {
return api.AgentSession{}, false, err
}
if sess.State != api.AgentSessionStateRunning || sess.Role != api.Implementer {
held := sess.State == api.AgentSessionStateIdle && sess.Role == api.Implementer && automatedActor(actor) && m.interrupted(sess.Id)
if !held && (sess.State != api.AgentSessionStateRunning || sess.Role != api.Implementer) {
sess, err = m.Send(ctx, sessionID, actor, text, model, images...)
return sess, false, err
}
@@ -72,10 +73,21 @@ func (m *Manager) Message(ctx context.Context, sessionID, actor, text, model str
if err != nil {
return api.AgentSession{}, false, err
}
slog.Info("message queued", "session", sess.Id, "task", sess.TaskId, "actor", actor)
slog.Info("message queued", "session", sess.Id, "task", sess.TaskId, "actor", actor, "interrupted", held)
return sess, true, nil
}
func automatedActor(actor string) bool {
return actor == "byre" || actor == agentActor || actor == boardActor
}
func (m *Manager) interrupted(sessionID string) bool {
m.mu.Lock()
defer m.mu.Unlock()
l := m.live[sessionID]
return l != nil && l.interrupted
}
func (m *Manager) Withdraw(ctx context.Context, taskID string, inputID int64, actor string) error {
task, err := m.store.GetTask(ctx, taskID)
if err != nil {
+1 -1
View File
@@ -81,7 +81,7 @@ func (m *Manager) tryPromptReady(ctx context.Context, taskID string, fromReview
return nil
}
sess, err = m.store.GetSession(ctx, sess.Id)
if err != nil || sess.State == api.AgentSessionStateRunning {
if err != nil || sess.State == api.AgentSessionStateRunning || m.interrupted(sess.Id) {
return err
}
latest, err := m.store.LastSnapshotNot(ctx, taskID, api.SnapshotTriggerAnswer)
+1 -1
View File
@@ -213,7 +213,7 @@ func (m *Manager) deliverTeam(ctx context.Context, l *live) {
return
}
for _, s := range teamSessions(sessions) {
if s.Id == l.id || s.State != api.AgentSessionStateIdle {
if s.Id == l.id || s.State != api.AgentSessionStateIdle || m.interrupted(s.Id) {
continue
}
err = m.Deliver(ctx, s.Id)