feat(chat): remember JSON output view mode (#3072)

* feat(chat): remember JSON output view mode

* perf(chat): skip JSON preference reads for text output

* fix(chat): persist JSON view in UI settings

* fix(chat): round-trip JSON view preference

---------

Co-authored-by: Bohdan Triapitsyn <artmore@protonmail.com>
This commit is contained in:
Andrea V
2026-09-05 18:27:38 +03:00
committed by GitHub
co-authored by Bohdan Triapitsyn
parent 3a96c7ce64
commit a005215458
10 changed files with 168 additions and 85 deletions
+18 -1
View File
@@ -401,6 +401,7 @@ describe('updateDesktopSettings', () => {
showReasoningTraces: false,
terminalShell: 'fish',
favoriteModels: [{ providerID: 'anthropic', modelID: 'claude-sonnet-4' }],
toolJsonViewMode: 'raw',
followUpBehavior: 'steer',
draftStarters: [{ type: 'command', name: 'runtime-a' }],
draftStartersVisible: false,
@@ -413,6 +414,7 @@ describe('updateDesktopSettings', () => {
expect(useUIStore.getState().showReasoningTraces).toBe(false);
expect(useUIStore.getState().terminalShell).toBe('fish');
expect(useUIStore.getState().favoriteModels).toHaveLength(1);
expect(useUIStore.getState().toolJsonViewMode).toBe('raw');
expect(useUIStore.getState().globalDraftStarters).toEqual([{ type: 'command', name: 'runtime-a' }]);
expect(useUIStore.getState().draftStartersVisible).toBe(false);
expect(useMessageQueueStore.getState().followUpBehavior).toBe('steer');
@@ -427,6 +429,7 @@ describe('updateDesktopSettings', () => {
expect(useUIStore.getState().showReasoningTraces).toBe(true);
expect(useUIStore.getState().terminalShell).toBe('auto');
expect(useUIStore.getState().favoriteModels).toEqual([]);
expect(useUIStore.getState().toolJsonViewMode).toBe('summary');
expect(useUIStore.getState().globalDraftStarters).toBeNull();
expect(useUIStore.getState().draftStartersVisible).toBe(true);
expect(useMessageQueueStore.getState().followUpBehavior).toBe('queue');
@@ -445,6 +448,18 @@ describe('updateDesktopSettings', () => {
expect(localStorage.getItem('selectedThemeId')).toBe('existing-theme');
});
test('ignores an invalid JSON view mode in a settings save response', async () => {
getWindow();
useUIStore.getState().setToolJsonViewMode('formatted');
const invalidSettings: SettingsPayload = {};
Object.defineProperty(invalidSettings, 'toolJsonViewMode', { value: 'invalid', enumerable: true });
registerSettingsSave(async () => invalidSettings);
await updateDesktopSettings({ showReasoningTraces: false });
expect(useUIStore.getState().toolJsonViewMode).toBe('formatted');
});
test('applies authoritative shared sidebar preferences without replacing local-only sidebar state', async () => {
getWindow();
useSessionDisplayStore.setState({
@@ -756,7 +771,7 @@ describe('updateDesktopSettings', () => {
}
});
test('autosaves terminal shell changes to shared settings', async () => {
test('autosaves appearance preferences to shared settings', async () => {
getWindow();
useUIStore.getState().setTerminalShell('auto');
useUIStore.getState().setTerminalLoginShells([]);
@@ -769,10 +784,12 @@ describe('updateDesktopSettings', () => {
useUIStore.getState().setTerminalShell('zsh');
useUIStore.getState().setTerminalLoginShells(['zsh']);
useUIStore.getState().setToolJsonViewMode('formatted');
await delay(500);
expect(saveCalls.some((changes) => changes.terminalShell === 'zsh')).toBe(true);
expect(saveCalls.some((changes) => changes.terminalLoginShells?.includes('zsh'))).toBe(true);
expect(saveCalls.some((changes) => changes.toolJsonViewMode === 'formatted')).toBe(true);
});
test('applies persisted autoSaveEnabled from server settings', async () => {