attribute sidechain prose/thinking to the agent, not claude (T-265); close T-267

A sub-agent's prose rendered as "claude" and its thinking as "thinking",
identical to the main assistant, because the label logic ignored
isSidechain — presenting sub-agent output as if the main Claude said it.
Now a sidechain AssistantTextMessage is labelled "agent" with a muted
stripe (never the coral claudeAccent brand), and sidechain thinking is
"agent thinking". Main-thread items are unchanged.

Tests: sidechain prose/thinking relabel, main-thread unchanged; golden
contrasting the muted agent stripe with the coral claude stripe.

This completes epic T-267 (conversation rendering streamlining): fold
success result (T-262), fold agent prompt (T-263), nest the agent run
(T-264), the shared holder primitive (T-266), and this attribution fix.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-06-08 12:09:47 +02:00
co-authored by Claude Opus 4.8
parent db6ecbd5df
commit 069879620f
7 changed files with 109 additions and 3 deletions
@@ -1,5 +1,6 @@
import 'package:alchemist/alchemist.dart';
import 'package:clide/builtin/claude/src/conversation_card.dart';
import 'package:clide/builtin/claude/src/conversation_view.dart' show claudeAccent;
import 'package:flutter/widgets.dart';
import 'package:flutter_test/flutter_test.dart';
@@ -12,6 +13,38 @@ void main() {
setUp(() async => f = await KernelFixture.create());
tearDown(() async => f.dispose());
goldenTest(
'ConversationCard attribution (T-265): agent prose is muted, claude prose is coral',
fileName: 'conversation_card_attribution',
builder: () => GoldenTestGroup(
columns: 1,
children: [
GoldenTestScenario(
name: 'claude (main thread) — coral brand stripe',
child: _wrap(
f,
const ConversationCard(
accent: claudeAccent,
label: 'claude',
body: Text('Here is the main-thread answer.', textDirection: TextDirection.ltr),
),
),
),
GoldenTestScenario(
name: 'agent (sidechain) — muted stripe, not coral',
child: _wrap(
f,
ConversationCard(
accent: const Color(0xFF8B8B8B),
label: 'agent',
body: const Text('Here is the sub-agent answer.', textDirection: TextDirection.ltr),
),
),
),
],
),
);
goldenTest(
'ConversationCard merged tool card (T-262): status mark + folded result segment',
fileName: 'conversation_card_merged',
Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB