feat(chat): collapse completed live activity with tool summaries

Keep live history compact without changing sorted rendering. Reuse Activity Default, preserve final answers, and summarize tool-result diffs under an animated disclosure.

Validated with the UI test suite, focused disclosure tests, UI type-check and lint, web production build, dead-code scan, and browser and animation fixtures.
This commit is contained in:
Bohdan Triapitsyn
2026-09-08 19:16:55 +03:00
parent 9ef235a6b4
commit ea392a26cc
27 changed files with 1032 additions and 21 deletions
@@ -691,7 +691,7 @@ export const OpenChamberVisualSettings: React.FC<OpenChamberVisualSettingsProps>
|| shouldShow('userMessageRendering')
|| shouldShow('chatRenderMode')
|| shouldShow('messageTransport')
|| (shouldShow('activityRenderMode') && chatRenderMode === 'sorted')
|| shouldShow('activityRenderMode')
|| shouldShow('collapsibleUserMessages')
|| shouldShow('stickyUserHeader')
|| (shouldShow('promptNavigatorEnabled') && !isVSCode)
@@ -713,7 +713,7 @@ export const OpenChamberVisualSettings: React.FC<OpenChamberVisualSettingsProps>
|| (!isMobile && shouldShow('inputSpellcheck'))
|| shouldShow('enterToSend');
const showBehaviorDisplaySettings = shouldShow('chatRenderMode')
|| (shouldShow('activityRenderMode') && chatRenderMode === 'sorted');
|| shouldShow('activityRenderMode');
const showTransportSection = shouldShow('messageTransport');
const showBehaviorMessageOptions = shouldShow('userMessageRendering')
|| shouldShow('mermaidRendering')
@@ -1685,8 +1685,8 @@ export const OpenChamberVisualSettings: React.FC<OpenChamberVisualSettingsProps>
</SettingsControlGroup>
)}
{shouldShow('activityRenderMode') && chatRenderMode === 'sorted' && (
<SettingsControlGroup title={t('settings.openchamber.visual.section.activityDefault')}>
{shouldShow('activityRenderMode') && (
<SettingsControlGroup title={t('settings.openchamber.visual.section.activityDefault')} settingsItem="chat.activity-default">
<SettingsRadioGroup aria-label={t('settings.openchamber.visual.section.activityDefaultAria')}>
{ACTIVITY_RENDER_MODE_OPTIONS.map((option) => (
<SettingsRadioOption