From f7d73395a3303297b7bf896106bbfa545ad8ec14 Mon Sep 17 00:00:00 2001 From: Ian Gulliver Date: Wed, 21 Oct 2026 17:06:12 -0700 Subject: [PATCH] Derive turn event payloads from canonical result fields --- internal/agents/antigravity.go | 5 ----- internal/agents/codex.go | 7 +------ internal/agents/lead.go | 2 +- internal/agents/manager.go | 32 ++++++++++++++++++++++++-------- internal/agents/review.go | 2 +- 5 files changed, 27 insertions(+), 21 deletions(-) diff --git a/internal/agents/antigravity.go b/internal/agents/antigravity.go index 348d70c..bd0378f 100644 --- a/internal/agents/antigravity.go +++ b/internal/agents/antigravity.go @@ -166,11 +166,6 @@ func (m *Manager) agyTurnEnded(ctx context.Context, l *live, p antigravityProces if !success { r.result = res.Error } - r.payload = map[string]any{ - "subtype": r.subtype, - "is_error": r.isError, - "result": r.result, - } return m.turnEnded(ctx, l, r) } diff --git a/internal/agents/codex.go b/internal/agents/codex.go index b1dd14c..d278931 100644 --- a/internal/agents/codex.go +++ b/internal/agents/codex.go @@ -270,11 +270,6 @@ func (m *Manager) codexTurnCompleted(ctx context.Context, l *live, s *codex.Sess m.mu.Unlock() } } - res.payload = map[string]any{ - "subtype": res.subtype, - "is_error": res.isError, - "result": res.result, - "vendor_uuid": turn.ID, - } + res.metadata = map[string]any{"vendor_uuid": turn.ID} return m.turnEnded(ctx, l, res) } diff --git a/internal/agents/lead.go b/internal/agents/lead.go index 2e4469f..57ee6c9 100644 --- a/internal/agents/lead.go +++ b/internal/agents/lead.go @@ -304,7 +304,7 @@ func (m *Manager) leadTurnEnded(ctx context.Context, l *live, res endResult) err finished := !res.isError && !interrupted && strings.TrimSpace(res.result) != "" handoff := compacting && finished - payload := res.payload + payload := res.payload() if handoff { payload["handoff"] = true } diff --git a/internal/agents/manager.go b/internal/agents/manager.go index ae2a62e..61706c5 100644 --- a/internal/agents/manager.go +++ b/internal/agents/manager.go @@ -1086,8 +1086,13 @@ func (m *Manager) handle(ctx context.Context, l *live, ev claude.Event) error { subtype: res.Subtype, isError: res.IsError, result: res.Result, - payload: store.ToPayload(res), - window: res.ModelUsage[l.contextModel].ContextWindow, + metadata: map[string]any{ + "duration_ms": res.DurationMS, + "num_turns": res.NumTurns, + "total_cost_usd": res.TotalCostUSD, + "modelUsage": store.ToPayload(res.ModelUsage), + }, + window: res.ModelUsage[l.contextModel].ContextWindow, }) case "stream_event": @@ -1153,11 +1158,22 @@ func (m *Manager) trackSubagents(ctx context.Context, l *live, raw map[string]an } type endResult struct { - subtype string - isError bool - result string - payload map[string]any - window int + subtype string + isError bool + result string + metadata map[string]any + window int +} + +func (r endResult) payload() map[string]any { + payload := map[string]any{} + for key, value := range r.metadata { + payload[key] = value + } + payload["subtype"] = r.subtype + payload["is_error"] = r.isError + payload["result"] = r.result + return payload } func (m *Manager) turnEnded(ctx context.Context, l *live, res endResult) error { @@ -1178,7 +1194,7 @@ func (m *Manager) turnEnded(ctx context.Context, l *live, res endResult) error { finished := !res.isError && !interrupted && strings.TrimSpace(res.result) != "" - payload := res.payload + payload := res.payload() if l.member != "" { payload["member"] = l.member } diff --git a/internal/agents/review.go b/internal/agents/review.go index d316705..ef94390 100644 --- a/internal/agents/review.go +++ b/internal/agents/review.go @@ -547,7 +547,7 @@ func (m *Manager) reviewTurnEnded(ctx context.Context, l *live, res endResult) e interrupted := l.interrupted m.mu.Unlock() - err := m.emit(ctx, l, agentActor, "turn.ended", res.payload) + err := m.emit(ctx, l, agentActor, "turn.ended", res.payload()) if err != nil { return err }