Carry the source transcript into forks and cross-link fork points
This commit is contained in:
+40
-1
@@ -360,7 +360,11 @@ func (s *Store) CreateTask(ctx context.Context, t api.Task, frozen *FrozenWorkfl
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return emit(api.Event{Kind: "task.created", ProjectId: &t.ProjectId, TaskId: &t.Id, Actor: actor, Payload: ToPayload(t)})
|
||||
err = emit(api.Event{Kind: "task.created", ProjectId: &t.ProjectId, TaskId: &t.Id, Actor: actor, Payload: ToPayload(t)})
|
||||
if err != nil || forkedFrom == "" {
|
||||
return err
|
||||
}
|
||||
return emit(api.Event{Kind: "task.forked", ProjectId: &t.ProjectId, TaskId: &forkedFrom, Actor: actor, Payload: map[string]any{"fork": t.Id, "forked_at": forkedAt}})
|
||||
})
|
||||
}
|
||||
|
||||
@@ -958,6 +962,41 @@ func (s *Store) TaskEvents(ctx context.Context, taskID string, after int64, limi
|
||||
return scanEvents(rows)
|
||||
}
|
||||
|
||||
func (s *Store) TranscriptEvents(ctx context.Context, taskID string, after int64, limit int) ([]api.Event, error) {
|
||||
where := "task_id = ?"
|
||||
args := []any{taskID}
|
||||
for id := taskID; ; {
|
||||
from := ""
|
||||
at := 0
|
||||
err := s.db.QueryRowContext(ctx, `SELECT forked_from, forked_at FROM tasks WHERE id = ?`, id).Scan(&from, &at)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if from == "" {
|
||||
break
|
||||
}
|
||||
cut := int64(0)
|
||||
err = s.db.QueryRowContext(ctx, `
|
||||
SELECT coalesce(max(seq), 0) FROM events
|
||||
WHERE task_id = ? AND kind = 'snapshot.created' AND json_extract(payload, '$.n') = ?
|
||||
`, from, at).Scan(&cut)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
where += " OR (task_id = ? AND seq <= ?)"
|
||||
args = append(args, from, cut)
|
||||
id = from
|
||||
}
|
||||
rows, err := s.db.QueryContext(ctx, `
|
||||
SELECT `+eventColumns+`
|
||||
FROM events WHERE (`+where+`) AND seq > ? ORDER BY seq LIMIT ?
|
||||
`, append(args, after, limit)...)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return scanEvents(rows)
|
||||
}
|
||||
|
||||
func (s *Store) FirstPrompt(ctx context.Context, taskID string) (string, error) {
|
||||
text := ""
|
||||
err := s.db.QueryRowContext(ctx, `
|
||||
|
||||
Reference in New Issue
Block a user