From b15b20fe08c846810f86f3aecc323f9e30cb320d Mon Sep 17 00:00:00 2001 From: Gautam0507 Date: Sat, 15 Aug 2026 00:39:36 +0530 Subject: [PATCH] fix(settings): persist sessionRetentionAction through the settings sanitizer --- .../server/lib/opencode/settings-helpers.js | 3 ++ .../lib/opencode/settings-helpers.test.js | 35 +++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/packages/web/server/lib/opencode/settings-helpers.js b/packages/web/server/lib/opencode/settings-helpers.js index 873d3437..7bbfb163 100644 --- a/packages/web/server/lib/opencode/settings-helpers.js +++ b/packages/web/server/lib/opencode/settings-helpers.js @@ -375,6 +375,9 @@ export const createSettingsHelpers = (dependencies) => { const normalizedDays = Math.max(1, Math.min(365, Math.round(candidate.autoDeleteAfterDays))); result.autoDeleteAfterDays = normalizedDays; } + if (candidate.sessionRetentionAction === 'archive' || candidate.sessionRetentionAction === 'delete') { + result.sessionRetentionAction = candidate.sessionRetentionAction; + } if (candidate.tunnelBootstrapTtlMs === null) { result.tunnelBootstrapTtlMs = null; } else if (typeof candidate.tunnelBootstrapTtlMs === 'number' && Number.isFinite(candidate.tunnelBootstrapTtlMs)) { diff --git a/packages/web/server/lib/opencode/settings-helpers.test.js b/packages/web/server/lib/opencode/settings-helpers.test.js index 3b80d029..543c5531 100644 --- a/packages/web/server/lib/opencode/settings-helpers.test.js +++ b/packages/web/server/lib/opencode/settings-helpers.test.js @@ -466,4 +466,39 @@ describe('settings helpers', () => { expect(sanitized.recentModels).toEqual(payload.recentModels); }); }); + + describe('session retention settings persistence', () => { + it('round-trips sessionRetentionAction archive and delete through the sanitizer', () => { + const helpers = createTestHelpersWithRealSanitizers(); + + expect(helpers.sanitizeSettingsUpdate({ sessionRetentionAction: 'archive' })).toEqual({ + sessionRetentionAction: 'archive', + }); + expect(helpers.sanitizeSettingsUpdate({ sessionRetentionAction: 'delete' })).toEqual({ + sessionRetentionAction: 'delete', + }); + }); + + it('rejects invalid sessionRetentionAction values', () => { + const helpers = createTestHelpersWithRealSanitizers(); + + expect(helpers.sanitizeSettingsUpdate({ sessionRetentionAction: 'remove' })).toEqual({}); + expect(helpers.sanitizeSettingsUpdate({ sessionRetentionAction: true })).toEqual({}); + }); + + it('survives a full settings payload containing sessionRetentionAction (regression)', () => { + const helpers = createTestHelpersWithRealSanitizers(); + const payload = { + autoDeleteEnabled: true, + autoDeleteAfterDays: 60, + sessionRetentionAction: 'delete', + }; + + const sanitized = helpers.sanitizeSettingsUpdate(payload); + + expect(sanitized.autoDeleteEnabled).toBe(true); + expect(sanitized.autoDeleteAfterDays).toBe(60); + expect(sanitized.sessionRetentionAction).toBe('delete'); + }); + }); });