fix(orchestrator): acknowledge queued messages delivered to passthrough sessions (#3912)

Signed-off-by: Nicolas <nl@blackfuel.ai>
This commit is contained in:
Nicolas Lenepveu
2026-09-24 22:19:24 +02:00
committed by GitHub
parent 6676d46175
commit cb591c303c
5 changed files with 180 additions and 2 deletions
@@ -1122,8 +1122,9 @@ func (s *Service) handleAgentReady(ctx context.Context, data watcher.AgentEventD
releaseReservation()
return
}
return
}
// A delivered (or empty) reservation is acknowledged; a reservation
// left in place is re-reserved and re-delivered at every turn end.
if err := s.messageQueue.AcknowledgeQueuedForSession(
context.WithoutCancel(ctx), identity, queuedMsg,
); err != nil &&
@@ -126,6 +126,33 @@ func TestHandleAgentReady_PassthroughQueuedMessageSynchronousRunningEvent(t *tes
require.Equal(t, models.TaskSessionStateRunning, updatedSession.State)
}
func TestHandleAgentReady_PassthroughQueuedMessageDeliveredOnce(t *testing.T) {
ctx := context.Background()
repo := setupTestRepo(t)
seedSession(t, repo, "t1", "s1", "step1")
agentManager := &mockAgentManager{isPassthrough: true}
svc := createTestServiceWithAgent(repo, newMockStepGetter(), newMockTaskRepo(), agentManager)
svc.messageQueue.SetAutoMergeEnabled(false)
first, err := svc.messageQueue.QueueMessage(ctx, "s1", "t1", "peer report", "", "test", false, nil)
require.NoError(t, err)
second, err := svc.messageQueue.QueueMessage(ctx, "s1", "t1", "next report", "", "test", false, nil)
require.NoError(t, err)
for range 3 {
svc.handleAgentReady(ctx, watcher.AgentEventData{TaskID: "t1", SessionID: "s1"})
}
require.Len(t, agentManager.passthroughStdinCalls, 2, "each queued message must be delivered exactly once")
require.Equal(t, "peer report\r", agentManager.passthroughStdinCalls[0].Data)
require.Equal(t, "next report\r", agentManager.passthroughStdinCalls[1].Data)
for _, id := range []string{first.ID, second.ID} {
_, err = svc.messageQueue.FindEntryByID(ctx, id)
require.ErrorIs(t, err, messagequeue.ErrEntryNotFound)
}
}
func TestHandleAgentReady_PassthroughQueuedMessagePublishesAfterWriteFailure(t *testing.T) {
ctx := context.Background()
repo := setupTestRepo(t)