Let a queued message be taken back into the composer

This commit is contained in:
Ian Gulliver
2026-10-17 15:45:27 -07:00
parent e67576ac53
commit 658f78934c
12 changed files with 218 additions and 37 deletions
+38
View File
@@ -75,7 +75,42 @@ func (m *Manager) Message(ctx context.Context, sessionID, actor, text, model str
return sess, nil
}
func (m *Manager) Withdraw(ctx context.Context, taskID string, inputID int64, actor string) error {
task, err := m.store.GetTask(ctx, taskID)
if err != nil {
return err
}
sessions, err := m.store.ListSessions(ctx, taskID)
if err != nil {
return err
}
if len(sessions) == 0 {
return fmt.Errorf("%w: message %d is not queued", ErrConflict, inputID)
}
sess := sessions[len(sessions)-1]
unlock := m.lockDelivery(queueLockKey(taskID))
defer unlock()
err = m.store.WithdrawTaskInput(ctx, taskID, inputID, task.ProjectId, sess.Id, actor)
if errors.Is(err, store.ErrNotFound) {
return fmt.Errorf("%w: message %d is not queued", ErrConflict, inputID)
}
if err != nil {
return err
}
slog.Info("queued message withdrawn", "session", sess.Id, "task", taskID, "input", inputID, "actor", actor)
return nil
}
func queueLockKey(taskID string) string {
return "task:" + taskID
}
func (m *Manager) deliverQueued(ctx context.Context, sess api.AgentSession) (bool, error) {
unlock := m.lockDelivery(queueLockKey(sess.TaskId))
defer unlock()
inputs, err := m.store.TaskInputs(ctx, sess.TaskId)
if err != nil || len(inputs) == 0 {
return false, err
@@ -131,6 +166,9 @@ func (m *Manager) takeQueuedMidTurn(ctx context.Context, l *live) []store.TaskIn
return nil
}
unlock := m.lockDelivery(queueLockKey(l.taskID))
defer unlock()
inputs, err := m.store.TaskInputs(ctx, l.taskID)
if err != nil {
slog.Error("list queued messages", "session", l.id, "err", err)