Run each workflow stage as its own task, with fan-out and fan-in
This commit is contained in:
+23
-31
@@ -16,65 +16,57 @@ import (
|
||||
"g.fc.run/misc/byre/internal/todo"
|
||||
)
|
||||
|
||||
func (m *Manager) CreateTask(ctx context.Context, project api.Project, title, createdBy, base, actor, workflowName, brief string) (api.Task, error) {
|
||||
frozen, err := m.freeze(ctx, workflowName, brief)
|
||||
if err != nil {
|
||||
return api.Task{}, err
|
||||
}
|
||||
return m.createTask(ctx, project, api.Task{Title: title, CreatedBy: createdBy}, frozen, base, actor)
|
||||
func (m *Manager) CreateTask(ctx context.Context, project api.Project, title, createdBy, base, actor string) (api.Task, error) {
|
||||
return m.createTask(ctx, project, api.Task{Title: title, CreatedBy: createdBy}, nil, base, actor)
|
||||
}
|
||||
|
||||
func (m *Manager) StartTodo(ctx context.Context, project api.Project, creator api.User, title, model, actor, workflowName string) (api.Task, error) {
|
||||
func (m *Manager) StartTodo(ctx context.Context, project api.Project, creator api.User, title, model, actor, workflowName string) ([]api.Task, error) {
|
||||
if creator.GitName == "" || creator.GitEmail == "" {
|
||||
return api.Task{}, ErrNoGitIdentity
|
||||
return nil, ErrNoGitIdentity
|
||||
}
|
||||
src, found, err := git.ReadFile(project.RepoPath, project.DefaultBranch, todo.File)
|
||||
if err != nil {
|
||||
return api.Task{}, err
|
||||
return nil, err
|
||||
}
|
||||
if !found {
|
||||
return api.Task{}, fmt.Errorf("%w: %s has no %s", store.ErrNotFound, project.DefaultBranch, todo.File)
|
||||
return nil, fmt.Errorf("%w: %s has no %s", store.ErrNotFound, project.DefaultBranch, todo.File)
|
||||
}
|
||||
item, found := todo.Find(todo.Parse(src), title)
|
||||
if !found {
|
||||
return api.Task{}, fmt.Errorf("%w: %s on %s has no item %q", store.ErrNotFound, todo.File, project.DefaultBranch, title)
|
||||
return nil, fmt.Errorf("%w: %s on %s has no item %q", store.ErrNotFound, todo.File, project.DefaultBranch, title)
|
||||
}
|
||||
|
||||
tasks, err := m.store.ListTasks(ctx, project.Id)
|
||||
if err != nil {
|
||||
return api.Task{}, err
|
||||
return nil, err
|
||||
}
|
||||
for _, t := range tasks {
|
||||
if t.Status == api.TaskStatusActive && t.TodoItem != nil && *t.TodoItem == title {
|
||||
return api.Task{}, fmt.Errorf("%w: task %s is already working on %q", ErrConflict, t.Id, title)
|
||||
return nil, fmt.Errorf("%w: task %s is already working on %q", ErrConflict, t.Id, title)
|
||||
}
|
||||
}
|
||||
|
||||
frozen, err := m.freeze(ctx, workflowName, todoPrompt(item))
|
||||
if err != nil {
|
||||
return api.Task{}, err
|
||||
}
|
||||
|
||||
task, err := m.createTask(ctx, project, api.Task{Title: item.Title, CreatedBy: creator.Login, TodoItem: &item.Title}, frozen, project.DefaultBranch, actor)
|
||||
if err != nil {
|
||||
return api.Task{}, err
|
||||
}
|
||||
|
||||
if frozen != nil {
|
||||
err = m.startWorkflow(ctx, task, creator, actor)
|
||||
started := []api.Task{}
|
||||
if workflowName != "" {
|
||||
started, err = m.StartWorkflow(ctx, project, creator, item.Title, project.DefaultBranch, actor, workflowName, todoPrompt(item), &item.Title)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
} else {
|
||||
task, err := m.createTask(ctx, project, api.Task{Title: item.Title, CreatedBy: creator.Login, TodoItem: &item.Title}, nil, project.DefaultBranch, actor)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
_, err = m.create(ctx, task, creator, todoPrompt(item), model, actor, nil)
|
||||
if err != nil {
|
||||
err = fmt.Errorf("task %s created, but its agent did not start: %w", task.Id, err)
|
||||
return nil, fmt.Errorf("task %s created, but its agent did not start: %w", task.Id, err)
|
||||
}
|
||||
}
|
||||
if err != nil {
|
||||
return api.Task{}, err
|
||||
started = append(started, task)
|
||||
}
|
||||
if actor == creator.Login {
|
||||
m.setStartedTodo(creator.Login, true)
|
||||
}
|
||||
return task, nil
|
||||
return started, nil
|
||||
}
|
||||
|
||||
func todoPrompt(item api.TodoItem) string {
|
||||
@@ -179,7 +171,7 @@ func (m *Manager) createTaskFromAgent(ctx context.Context, l *live, raw json.Raw
|
||||
model = sess.Model
|
||||
}
|
||||
|
||||
task, err := m.CreateTask(ctx, project, args.Title, creator.Login, base, creator.Login, "", "")
|
||||
task, err := m.CreateTask(ctx, project, args.Title, creator.Login, base, creator.Login)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user