Match pending sends by a send id the server echoes

This commit is contained in:
Ian Gulliver
2026-10-20 15:22:50 -07:00
parent b8c5331a0c
commit 8fec4b9040
29 changed files with 437 additions and 327 deletions
+10 -6
View File
@@ -39,7 +39,7 @@ func (m *Manager) lockDelivery(sessionID string) func() {
}
}
func (m *Manager) Message(ctx context.Context, sessionID, actor, text, model string, images ...string) (api.AgentSession, bool, error) {
func (m *Manager) Message(ctx context.Context, sessionID, actor, text, model, sendID string, images ...string) (api.AgentSession, bool, error) {
unlock := m.lockDelivery(sessionID)
defer unlock()
@@ -55,7 +55,7 @@ func (m *Manager) Message(ctx context.Context, sessionID, actor, text, model str
}
held := sess.State == api.AgentSessionStateIdle && sess.Role == api.Implementer && (automatedActor(actor) && m.interrupted(sess.Id) || m.heldForLanding(sess.TaskId, sess.Id))
if !held && (sess.State != api.AgentSessionStateRunning || sess.Role != api.Implementer) {
sess, err = m.Send(ctx, sessionID, actor, text, model, images...)
sess, err = m.Send(ctx, sessionID, actor, text, model, sendID, images...)
return sess, false, err
}
@@ -75,7 +75,7 @@ func (m *Manager) Message(ctx context.Context, sessionID, actor, text, model str
if err != nil {
return api.AgentSession{}, false, err
}
err = m.store.AddTaskInput(ctx, store.TaskInput{TaskID: sess.TaskId, Member: sess.Member, Actor: actor, Text: text, Images: images}, task.ProjectId, sess.Id)
err = m.store.AddTaskInput(ctx, store.TaskInput{TaskID: sess.TaskId, Member: sess.Member, Actor: actor, Text: text, Images: images, SendID: sendID}, task.ProjectId, sess.Id)
if err != nil {
return api.AgentSession{}, false, err
}
@@ -139,7 +139,7 @@ func (m *Manager) deliverQueued(ctx context.Context, sess api.AgentSession) (boo
}
in := inputs[0]
_, err = m.Send(ctx, sess.Id, in.Actor, in.Text, "", in.Images...)
_, err = m.Send(ctx, sess.Id, in.Actor, in.Text, "", in.SendID, in.Images...)
if errors.Is(err, ErrConflict) {
slog.Info("queued message held: session changed state", "session", sess.Id, "task", task.Id, "err", err)
return true, nil
@@ -171,8 +171,9 @@ func (m *Manager) deliverAllQueued(ctx context.Context) {
}
type queued struct {
actor string
text string
actor string
text string
sendID string
}
func (m *Manager) takeQueuedMidTurn(ctx context.Context, l *live) []store.TaskInput {
@@ -260,6 +261,9 @@ func (m *Manager) recordQueued(ctx context.Context, l *live, msgs []queued) stri
if isFindingsMessage(q.actor, q.text) {
payload["findings"] = true
}
if q.sendID != "" {
payload["send_id"] = q.sendID
}
err := m.emit(ctx, l, q.actor, "user.message", payload)
if err != nil {
slog.Error("record mid-turn message", "session", l.id, "err", err)