Add team tasks: several agents in one worktree sharing a board

This commit is contained in:
Ian Gulliver
2026-10-18 08:48:57 -07:00
parent 7f62df19d2
commit 6bcde13b2f
31 changed files with 1392 additions and 439 deletions
+23 -18
View File
@@ -4,12 +4,14 @@ import (
"context"
"database/sql"
"encoding/json"
"errors"
"time"
)
type TaskInput struct {
ID int64
TaskID string
Member string
Actor string
Text string
Images []string
@@ -26,8 +28,8 @@ func (s *Store) AddTaskInput(ctx context.Context, in TaskInput, projectID, sessi
payload["images"] = in.Images
}
return s.write(ctx, func(tx *sql.Tx, emit emitFunc) error {
res, err := tx.ExecContext(ctx, `INSERT INTO task_inputs (task_id, actor, text, images, created_at) VALUES (?, ?, ?, ?, ?)`,
in.TaskID, in.Actor, in.Text, string(images), now())
res, err := tx.ExecContext(ctx, `INSERT INTO task_inputs (task_id, member, actor, text, images, created_at) VALUES (?, ?, ?, ?, ?, ?)`,
in.TaskID, in.Member, in.Actor, in.Text, string(images), now())
if err != nil {
return err
}
@@ -39,25 +41,28 @@ func (s *Store) AddTaskInput(ctx context.Context, in TaskInput, projectID, sessi
})
}
func (s *Store) WithdrawTaskInput(ctx context.Context, taskID string, id int64, projectID, sessionID, actor string) error {
return s.write(ctx, func(tx *sql.Tx, emit emitFunc) error {
res, err := tx.ExecContext(ctx, `DELETE FROM task_inputs WHERE id = ? AND task_id = ?`, id, taskID)
if err != nil {
return err
}
n, err := res.RowsAffected()
if err != nil {
return err
}
if n == 0 {
func (s *Store) WithdrawTaskInput(ctx context.Context, taskID string, id int64, projectID, actor string) (string, error) {
sessionID := ""
err := s.write(ctx, func(tx *sql.Tx, emit emitFunc) error {
member := ""
err := tx.QueryRowContext(ctx, `DELETE FROM task_inputs WHERE id = ? AND task_id = ? RETURNING member`, id, taskID).Scan(&member)
if errors.Is(err, sql.ErrNoRows) {
return ErrNotFound
}
if err != nil {
return err
}
err = tx.QueryRowContext(ctx, `SELECT id FROM agent_sessions WHERE task_id = ? AND member = ? AND role = 'implementer' ORDER BY created_at DESC LIMIT 1`, taskID, member).Scan(&sessionID)
if err != nil {
return err
}
return emit(sessionEvent("user.unqueued", projectID, taskID, "", sessionID, actor, map[string]any{"id": id}))
})
return sessionID, err
}
func (s *Store) TaskInputs(ctx context.Context, taskID string) ([]TaskInput, error) {
rows, err := s.db.QueryContext(ctx, `SELECT id, task_id, actor, text, images, created_at FROM task_inputs WHERE task_id = ? ORDER BY id`, taskID)
func (s *Store) TaskInputs(ctx context.Context, taskID, member string) ([]TaskInput, error) {
rows, err := s.db.QueryContext(ctx, `SELECT id, task_id, member, actor, text, images, created_at FROM task_inputs WHERE task_id = ? AND member = ? ORDER BY id`, taskID, member)
if err != nil {
return nil, err
}
@@ -68,7 +73,7 @@ func (s *Store) TaskInputs(ctx context.Context, taskID string) ([]TaskInput, err
in := TaskInput{}
images := ""
createdAt := ""
err = rows.Scan(&in.ID, &in.TaskID, &in.Actor, &in.Text, &images, &createdAt)
err = rows.Scan(&in.ID, &in.TaskID, &in.Member, &in.Actor, &in.Text, &images, &createdAt)
if err != nil {
return nil, err
}
@@ -92,8 +97,8 @@ func (s *Store) RestoreTaskInputs(ctx context.Context, inputs []TaskInput) error
if err != nil {
return err
}
_, err = tx.ExecContext(ctx, `INSERT INTO task_inputs (id, task_id, actor, text, images, created_at) VALUES (?, ?, ?, ?, ?, ?)`,
in.ID, in.TaskID, in.Actor, in.Text, string(images), formatTime(in.CreatedAt))
_, err = tx.ExecContext(ctx, `INSERT INTO task_inputs (id, task_id, member, actor, text, images, created_at) VALUES (?, ?, ?, ?, ?, ?, ?)`,
in.ID, in.TaskID, in.Member, in.Actor, in.Text, string(images), formatTime(in.CreatedAt))
if err != nil {
return err
}