Carry the source transcript into forks and cross-link fork points

This commit is contained in:
Ian Gulliver
2026-10-20 09:14:44 -07:00
parent 29c993cde0
commit 09d6c6e023
10 changed files with 208 additions and 123 deletions
+40 -1
View File
@@ -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, `