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
+15 -12
View File
@@ -185,11 +185,11 @@ func (m *Manager) taskFor(ctx context.Context, sess api.AgentSession) (api.Task,
return m.store.GetTask(ctx, sess.TaskId)
}
func (m *Manager) Create(ctx context.Context, task api.Task, creator api.User, prompt, model string, images ...string) (api.AgentSession, error) {
return m.create(ctx, task, creator, "", prompt, model, creator.Login, images)
func (m *Manager) Create(ctx context.Context, task api.Task, creator api.User, prompt, model, sendID string, images ...string) (api.AgentSession, error) {
return m.create(ctx, task, creator, "", prompt, model, creator.Login, sendID, images)
}
func (m *Manager) create(ctx context.Context, task api.Task, creator api.User, member, prompt, model, actor string, images []string) (api.AgentSession, error) {
func (m *Manager) create(ctx context.Context, task api.Task, creator api.User, member, prompt, model, actor, sendID string, images []string) (api.AgentSession, error) {
if creator.GitName == "" || creator.GitEmail == "" {
return api.AgentSession{}, ErrNoGitIdentity
}
@@ -202,7 +202,7 @@ func (m *Manager) create(ctx context.Context, task api.Task, creator api.User, m
if err != nil {
return api.AgentSession{}, err
}
return m.turn(ctx, sess, task, actor, prompt, images)
return m.turn(ctx, sess, task, actor, prompt, sendID, images)
}
func (m *Manager) newSession(ctx context.Context, task api.Task, creator api.User, member, model string) (api.AgentSession, error) {
@@ -235,7 +235,7 @@ func (m *Manager) newSession(ctx context.Context, task api.Task, creator api.Use
return sess, err
}
func (m *Manager) Send(ctx context.Context, sessionID, actor, text, model string, images ...string) (api.AgentSession, error) {
func (m *Manager) Send(ctx context.Context, sessionID, actor, text, model, sendID string, images ...string) (api.AgentSession, error) {
sess, err := m.store.GetSession(ctx, sessionID)
if err != nil {
return api.AgentSession{}, err
@@ -262,7 +262,7 @@ func (m *Manager) Send(ctx context.Context, sessionID, actor, text, model string
return api.AgentSession{}, err
}
return m.turn(ctx, sess, task, actor, text, images)
return m.turn(ctx, sess, task, actor, text, sendID, images)
}
func (m *Manager) Interrupt(ctx context.Context, sessionID string) (api.AgentSession, error) {
@@ -564,12 +564,12 @@ func (m *Manager) Usage(ctx context.Context) (Usage, error) {
return u, nil
}
func (m *Manager) turn(ctx context.Context, sess api.AgentSession, task api.Task, actor, text string, images []string) (api.AgentSession, error) {
func (m *Manager) turn(ctx context.Context, sess api.AgentSession, task api.Task, actor, text, sendID string, images []string) (api.AgentSession, error) {
err := m.startRunning(ctx, sess, task.Id, actor)
if err != nil {
return api.AgentSession{}, err
}
return m.launch(ctx, sess, task, actor, text, images)
return m.launch(ctx, sess, task, actor, text, sendID, images)
}
func (m *Manager) startRunning(ctx context.Context, sess api.AgentSession, taskID, actor string) error {
@@ -591,8 +591,8 @@ func (m *Manager) startRunning(ctx context.Context, sess api.AgentSession, taskI
return nil
}
func (m *Manager) launch(ctx context.Context, sess api.AgentSession, task api.Task, actor, text string, images []string) (api.AgentSession, error) {
imgs, compacting, err := m.recordMessage(ctx, sess, task, actor, text, images)
func (m *Manager) launch(ctx context.Context, sess api.AgentSession, task api.Task, actor, text, sendID string, images []string) (api.AgentSession, error) {
imgs, compacting, err := m.recordMessage(ctx, sess, task, actor, text, sendID, images)
if err != nil {
m.failStart(ctx, sess.Id, actor, err)
return api.AgentSession{}, err
@@ -691,7 +691,7 @@ func transition(ctx context.Context, st *store.Store, id string, from, to api.Ag
}
func (m *Manager) message(ctx context.Context, sess api.AgentSession, task api.Task, l *live, actor, text string, images []string) error {
imgs, compacting, err := m.recordMessage(ctx, sess, task, actor, text, images)
imgs, compacting, err := m.recordMessage(ctx, sess, task, actor, text, "", images)
if err != nil {
return err
}
@@ -707,7 +707,7 @@ func (m *Manager) send(ctx context.Context, l *live, text string, imgs []image)
return m.store.MarkSessionDelivered(ctx, l.id)
}
func (m *Manager) recordMessage(ctx context.Context, sess api.AgentSession, task api.Task, actor, text string, images []string) ([]image, bool, error) {
func (m *Manager) recordMessage(ctx context.Context, sess api.AgentSession, task api.Task, actor, text, sendID string, images []string) ([]image, bool, error) {
implementer := sess.Role == api.Implementer
if implementer && isMergeInPrompt(actor, text) {
m.ownMerge(sess.Id, task.Id, task.WorktreePath)
@@ -738,6 +738,9 @@ func (m *Manager) recordMessage(ctx context.Context, sess api.AgentSession, task
if isFindingsMessage(actor, text) {
payload["findings"] = true
}
if sendID != "" {
payload["send_id"] = sendID
}
err = m.store.RecordTurnMessage(ctx, sess.Id, newEvent(sess.Id, sess.Owner, task.ProjectId, task.Id, actor, "user.message", payload))
if err != nil {
return nil, false, err