Move questions and reviews into the transcript; agents answer findings

This commit is contained in:
Ian Gulliver
2026-10-19 09:14:21 -07:00
parent eb7e0a13c4
commit 27ff0f457b
21 changed files with 903 additions and 801 deletions
+35 -2
View File
@@ -10,7 +10,7 @@ import (
"g.fc.run/ai/byre/internal/api"
)
const reviewColumns = `id, task_id, snapshot_n, coalesce(agent_session_id, ''), vendor, model, state, result, error, created_at, finished_at, finding_states`
const reviewColumns = `id, task_id, snapshot_n, coalesce(agent_session_id, ''), vendor, model, state, result, error, created_at, finished_at, finding_states, finding_responses`
func (s *Store) CreateReview(ctx context.Context, r api.Review) error {
finishedAt := ""
@@ -110,6 +110,33 @@ func (s *Store) SetFindingState(ctx context.Context, id string, index int, state
})
}
func (s *Store) SetFindingResponse(ctx context.Context, id string, index int, resp api.FindingResponse, actor string) error {
b, err := json.Marshal(resp)
if err != nil {
return err
}
return s.write(ctx, func(tx *sql.Tx, emit emitFunc) error {
res, err := tx.ExecContext(ctx, `
UPDATE reviews SET
finding_responses = json_set(finding_responses, '$."' || ?1 || '"', json(?2)),
finding_states = CASE WHEN json_extract(finding_states, '$."' || ?1 || '"') = ?3
THEN json_remove(finding_states, '$."' || ?1 || '"') ELSE finding_states END
WHERE id = ?4 AND state = ?5 AND ?1 < json_array_length(nullif(result, ''), '$.findings')
`, index, string(b), string(api.FindingFixed), id, string(api.ReviewStateDone))
if err != nil {
return err
}
n, err := res.RowsAffected()
if err != nil {
return err
}
if n == 0 {
return ErrNotFound
}
return emitReview(ctx, tx, emit, "review.finding", id, actor)
})
}
func (s *Store) ReviewerSessionIDs(ctx context.Context, taskID string) (map[string]bool, error) {
rows, err := s.db.QueryContext(ctx, `SELECT id FROM agent_sessions WHERE task_id = ? AND role = ?`, taskID, string(api.Reviewer))
if err != nil {
@@ -177,7 +204,8 @@ func scanReview(row scanner) (api.Review, error) {
createdAt := ""
finishedAt := ""
findingStates := ""
err := row.Scan(&r.Id, &r.TaskId, &r.SnapshotN, &r.AgentSessionId, &r.Vendor, &r.Model, &state, &result, &r.Error, &createdAt, &finishedAt, &findingStates)
findingResponses := ""
err := row.Scan(&r.Id, &r.TaskId, &r.SnapshotN, &r.AgentSessionId, &r.Vendor, &r.Model, &state, &result, &r.Error, &createdAt, &finishedAt, &findingStates, &findingResponses)
if err != nil {
return r, err
}
@@ -187,6 +215,11 @@ func scanReview(row scanner) (api.Review, error) {
if err != nil {
return r, err
}
r.FindingResponses = map[string]api.FindingResponse{}
err = json.Unmarshal([]byte(findingResponses), &r.FindingResponses)
if err != nil {
return r, err
}
if result != "" {
res := map[string]any{}
err = json.Unmarshal([]byte(result), &res)