Let a queued message be taken back into the composer
This commit is contained in:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user