diff --git a/internal/session/attempts.go b/internal/session/attempts.go new file mode 100644 index 0000000..7a79cf5 --- /dev/null +++ b/internal/session/attempts.go @@ -0,0 +1,26 @@ +// internal/session/attempts.go +package session + +import iexec "github.com/mathiasbq/supervisor/internal/exec" + +// AttemptsFrom converts exec.AttemptRecord slice to session.Attempt slice +// for writing into a session JSONL entry. +func AttemptsFrom(records []iexec.AttemptRecord) []Attempt { + if len(records) == 0 { + return nil + } + out := make([]Attempt, len(records)) + for i, r := range records { + out[i] = Attempt{ + Attempt: i + 1, + Model: r.Model, + Tier: r.Tier, + DurationMs: r.DurationMs, + WarmStart: r.WarmStart, + Verdict: r.Verdict, + Feedback: r.Feedback, + Verified: r.Verdict == "accept", + } + } + return out +} diff --git a/internal/session/attempts_test.go b/internal/session/attempts_test.go new file mode 100644 index 0000000..851a45e --- /dev/null +++ b/internal/session/attempts_test.go @@ -0,0 +1,37 @@ +package session_test + +import ( + "testing" + + "github.com/mathiasbq/supervisor/internal/exec" + "github.com/mathiasbq/supervisor/internal/session" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestAttemptsFromEmpty(t *testing.T) { + result := session.AttemptsFrom(nil) + assert.Empty(t, result) +} + +func TestAttemptsFromSetsIndex(t *testing.T) { + records := []exec.AttemptRecord{ + {Model: "ollama/phi4", Tier: "local", DurationMs: 1200, WarmStart: true, Verdict: "escalate", Feedback: "too vague"}, + {Model: "claude-sonnet-4-6", Tier: "subagent", DurationMs: 3400, WarmStart: false, Verdict: "accept"}, + } + result := session.AttemptsFrom(records) + require.Len(t, result, 2) + + assert.Equal(t, 1, result[0].Attempt) + assert.Equal(t, "ollama/phi4", result[0].Model) + assert.Equal(t, "local", result[0].Tier) + assert.Equal(t, int64(1200), result[0].DurationMs) + assert.True(t, result[0].WarmStart) + assert.Equal(t, "escalate", result[0].Verdict) + assert.Equal(t, "too vague", result[0].Feedback) + assert.False(t, result[0].Verified) + + assert.Equal(t, 2, result[1].Attempt) + assert.Equal(t, "claude-sonnet-4-6", result[1].Model) + assert.True(t, result[1].Verified) +}