From 02c01482ed6f3de7b1542acea970e5440ce6b44b Mon Sep 17 00:00:00 2001 From: Marve10s Date: Thu, 9 Apr 2026 21:48:00 +0300 Subject: [PATCH 1/7] configurable sidebar preview count --- apps/web/src/components/Sidebar.tsx | 126 +++++++++++++++++- .../components/settings/SettingsPanels.tsx | 4 + apps/web/src/hooks/useSettings.test.ts | 18 +++ apps/web/src/hooks/useSettings.ts | 5 + apps/web/vite.config.ts | 7 + packages/contracts/src/settings.ts | 14 ++ 6 files changed, 167 insertions(+), 7 deletions(-) diff --git a/apps/web/src/components/Sidebar.tsx b/apps/web/src/components/Sidebar.tsx index 6dbd5605c3..2ca32dd99e 100644 --- a/apps/web/src/components/Sidebar.tsx +++ b/apps/web/src/components/Sidebar.tsx @@ -5,6 +5,7 @@ import { CloudIcon, FolderIcon, GitPullRequestIcon, + MinusIcon, PlusIcon, SettingsIcon, SquarePenIcon, @@ -49,7 +50,10 @@ import { } from "@t3tools/client-runtime"; import { Link, useLocation, useNavigate, useParams, useRouter } from "@tanstack/react-router"; import { + MAX_SIDEBAR_THREAD_PREVIEW_COUNT, + MIN_SIDEBAR_THREAD_PREVIEW_COUNT, type SidebarProjectSortOrder, + type SidebarThreadPreviewCount, type SidebarThreadSortOrder, } from "@t3tools/contracts/settings"; import { usePrimaryEnvironmentId } from "../environments/primary"; @@ -101,6 +105,7 @@ import { } from "./desktopUpdate.logic"; import { Alert, AlertAction, AlertDescription, AlertTitle } from "./ui/alert"; import { Button } from "./ui/button"; +import { Input } from "./ui/input"; import { Menu, MenuGroup, MenuPopup, MenuRadioGroup, MenuRadioItem, MenuTrigger } from "./ui/menu"; import { Tooltip, TooltipPopup, TooltipTrigger } from "./ui/tooltip"; import { @@ -145,7 +150,6 @@ import { useSavedEnvironmentRuntimeStore, } from "../environments/runtime"; import type { Project, SidebarThreadSummary } from "../types"; -const THREAD_PREVIEW_LIMIT = 6; const SIDEBAR_SORT_LABELS: Record = { updated_at: "Last user message", created_at: "Created at", @@ -161,6 +165,13 @@ const SIDEBAR_LIST_ANIMATION_OPTIONS = { } as const; const EMPTY_THREAD_JUMP_LABELS = new Map(); +function clampSidebarThreadPreviewCount(value: number): SidebarThreadPreviewCount { + return Math.min( + MAX_SIDEBAR_THREAD_PREVIEW_COUNT, + Math.max(MIN_SIDEBAR_THREAD_PREVIEW_COUNT, value), + ) as SidebarThreadPreviewCount; +} + function threadJumpLabelMapsEqual( left: ReadonlyMap, right: ReadonlyMap, @@ -977,6 +988,9 @@ const SidebarProjectItem = memo(function SidebarProjectItem(props: SidebarProjec const defaultThreadEnvMode = useSettings( (settings) => settings.defaultThreadEnvMode, ); + const sidebarThreadPreviewCount = useSettings( + (settings) => settings.sidebarThreadPreviewCount, + ); const router = useRouter(); const markThreadUnread = useUiStateStore((state) => state.markThreadUnread); const toggleProject = useUiStateStore((state) => state.toggleProject); @@ -1192,11 +1206,11 @@ const SidebarProjectItem = memo(function SidebarProjectItem(props: SidebarProjec }, }); }; - const hasOverflowingThreads = visibleProjectThreads.length > THREAD_PREVIEW_LIMIT; + const hasOverflowingThreads = visibleProjectThreads.length > sidebarThreadPreviewCount; const previewThreads = isThreadListExpanded || !hasOverflowingThreads ? visibleProjectThreads - : visibleProjectThreads.slice(0, THREAD_PREVIEW_LIMIT); + : visibleProjectThreads.slice(0, sidebarThreadPreviewCount); const visibleThreadKeys = new Set( [...previewThreads, ...(pinnedCollapsedThread ? [pinnedCollapsedThread] : [])].map((thread) => scopedThreadKey(scopeThreadRef(thread.environmentId, thread.id)), @@ -1225,6 +1239,7 @@ const SidebarProjectItem = memo(function SidebarProjectItem(props: SidebarProjec pinnedCollapsedThread, projectExpanded, projectThreads, + sidebarThreadPreviewCount, threadLastVisitedAts, visibleProjectThreads, ]); @@ -1836,14 +1851,41 @@ type SortableProjectHandleProps = Pick< function ProjectSortMenu({ projectSortOrder, threadSortOrder, + threadPreviewCount, onProjectSortOrderChange, onThreadSortOrderChange, + onThreadPreviewCountChange, }: { projectSortOrder: SidebarProjectSortOrder; threadSortOrder: SidebarThreadSortOrder; + threadPreviewCount: SidebarThreadPreviewCount; onProjectSortOrderChange: (sortOrder: SidebarProjectSortOrder) => void; onThreadSortOrderChange: (sortOrder: SidebarThreadSortOrder) => void; + onThreadPreviewCountChange: (count: SidebarThreadPreviewCount) => void; }) { + const [threadPreviewInput, setThreadPreviewInput] = useState(() => String(threadPreviewCount)); + + useEffect(() => { + setThreadPreviewInput(String(threadPreviewCount)); + }, [threadPreviewCount]); + + const commitThreadPreviewCount = useCallback( + (nextValue: string) => { + const parsedValue = Number.parseInt(nextValue, 10); + if (!Number.isInteger(parsedValue)) { + setThreadPreviewInput(String(threadPreviewCount)); + return; + } + + const clampedValue = clampSidebarThreadPreviewCount(parsedValue); + setThreadPreviewInput(String(clampedValue)); + if (clampedValue !== threadPreviewCount) { + onThreadPreviewCountChange(clampedValue); + } + }, + [onThreadPreviewCountChange, threadPreviewCount], + ); + return ( @@ -1854,9 +1896,9 @@ function ProjectSortMenu({ > - Sort projects + Sidebar options - +
Sort projects @@ -1895,6 +1937,63 @@ function ProjectSortMenu({ ))} + +
+ Visible threads +
+
+ + { + event.stopPropagation(); + }} + onChange={(event) => { + setThreadPreviewInput(event.currentTarget.value.replace(/[^0-9]/g, "")); + }} + onBlur={(event) => { + commitThreadPreviewCount(event.currentTarget.value); + }} + onKeyDown={(event) => { + if (event.key === "Enter") { + commitThreadPreviewCount(event.currentTarget.value); + } + }} + /> + +
+
); @@ -2012,6 +2111,7 @@ interface SidebarProjectsContentProps { handleDesktopUpdateButtonClick: () => void; projectSortOrder: SidebarProjectSortOrder; threadSortOrder: SidebarThreadSortOrder; + threadPreviewCount: SidebarThreadPreviewCount; updateSettings: ReturnType["updateSettings"]; shouldShowProjectPathEntry: boolean; handleStartAddProject: () => void; @@ -2063,6 +2163,7 @@ const SidebarProjectsContent = memo(function SidebarProjectsContent( handleDesktopUpdateButtonClick, projectSortOrder, threadSortOrder, + threadPreviewCount, updateSettings, shouldShowProjectPathEntry, handleStartAddProject, @@ -2115,6 +2216,12 @@ const SidebarProjectsContent = memo(function SidebarProjectsContent( }, [updateSettings], ); + const handleThreadPreviewCountChange = useCallback( + (count: SidebarThreadPreviewCount) => { + updateSettings({ sidebarThreadPreviewCount: count }); + }, + [updateSettings], + ); const handleAddProjectInputChange = useCallback( (event: React.ChangeEvent) => { setNewCwd(event.target.value); @@ -2170,8 +2277,10 @@ const SidebarProjectsContent = memo(function SidebarProjectsContent( s.sidebarThreadSortOrder); const sidebarProjectSortOrder = useSettings((s) => s.sidebarProjectSortOrder); + const sidebarThreadPreviewCount = useSettings((s) => s.sidebarThreadPreviewCount); const defaultThreadEnvMode = useSettings((s) => s.defaultThreadEnvMode); const { updateSettings } = useUpdateSettings(); const { handleNewThread } = useHandleNewThread(); @@ -2790,11 +2900,11 @@ export default function Sidebar() { return []; } const isThreadListExpanded = expandedThreadListsByProject.has(project.projectKey); - const hasOverflowingThreads = projectThreads.length > THREAD_PREVIEW_LIMIT; + const hasOverflowingThreads = projectThreads.length > sidebarThreadPreviewCount; const previewThreads = isThreadListExpanded || !hasOverflowingThreads ? projectThreads - : projectThreads.slice(0, THREAD_PREVIEW_LIMIT); + : projectThreads.slice(0, sidebarThreadPreviewCount); const renderedThreads = pinnedCollapsedThread ? [pinnedCollapsedThread] : previewThreads; return renderedThreads.map((thread) => scopedThreadKey(scopeThreadRef(thread.environmentId, thread.id)), @@ -2802,6 +2912,7 @@ export default function Sidebar() { }), [ sidebarThreadSortOrder, + sidebarThreadPreviewCount, expandedThreadListsByProject, projectExpandedById, routeThreadKey, @@ -3104,6 +3215,7 @@ export default function Sidebar() { handleDesktopUpdateButtonClick={handleDesktopUpdateButtonClick} projectSortOrder={sidebarProjectSortOrder} threadSortOrder={sidebarThreadSortOrder} + threadPreviewCount={sidebarThreadPreviewCount} updateSettings={updateSettings} shouldShowProjectPathEntry={shouldShowProjectPathEntry} handleStartAddProject={handleStartAddProject} diff --git a/apps/web/src/components/settings/SettingsPanels.tsx b/apps/web/src/components/settings/SettingsPanels.tsx index c8766f2643..b7eccbcc22 100644 --- a/apps/web/src/components/settings/SettingsPanels.tsx +++ b/apps/web/src/components/settings/SettingsPanels.tsx @@ -368,6 +368,9 @@ export function useSettingsRestore(onRestored?: () => void) { ...(settings.timestampFormat !== DEFAULT_UNIFIED_SETTINGS.timestampFormat ? ["Time format"] : []), + ...(settings.sidebarThreadPreviewCount !== DEFAULT_UNIFIED_SETTINGS.sidebarThreadPreviewCount + ? ["Visible threads"] + : []), ...(settings.diffWordWrap !== DEFAULT_UNIFIED_SETTINGS.diffWordWrap ? ["Diff line wrapping"] : []), @@ -394,6 +397,7 @@ export function useSettingsRestore(onRestored?: () => void) { settings.defaultThreadEnvMode, settings.diffWordWrap, settings.enableAssistantStreaming, + settings.sidebarThreadPreviewCount, settings.timestampFormat, theme, ], diff --git a/apps/web/src/hooks/useSettings.test.ts b/apps/web/src/hooks/useSettings.test.ts index 832ee17f7f..b3da9009a0 100644 --- a/apps/web/src/hooks/useSettings.test.ts +++ b/apps/web/src/hooks/useSettings.test.ts @@ -13,4 +13,22 @@ describe("buildLegacyClientSettingsMigrationPatch", () => { confirmThreadDelete: false, }); }); + + it("migrates the sidebar thread preview count when it is within the supported range", () => { + expect( + buildLegacyClientSettingsMigrationPatch({ + sidebarThreadPreviewCount: 4, + }), + ).toEqual({ + sidebarThreadPreviewCount: 4, + }); + }); + + it("ignores invalid sidebar thread preview counts from legacy local settings", () => { + expect( + buildLegacyClientSettingsMigrationPatch({ + sidebarThreadPreviewCount: 12, + }), + ).toEqual({}); + }); }); diff --git a/apps/web/src/hooks/useSettings.ts b/apps/web/src/hooks/useSettings.ts index a953bc4656..d4a9a64594 100644 --- a/apps/web/src/hooks/useSettings.ts +++ b/apps/web/src/hooks/useSettings.ts @@ -20,6 +20,7 @@ import { type ClientSettings, ClientSettingsSchema, DEFAULT_CLIENT_SETTINGS, + SidebarThreadPreviewCount, DEFAULT_UNIFIED_SETTINGS, SidebarProjectSortOrder, SidebarThreadSortOrder, @@ -212,6 +213,10 @@ export function buildLegacyClientSettingsMigrationPatch( patch.sidebarThreadSortOrder = legacySettings.sidebarThreadSortOrder; } + if (Schema.is(SidebarThreadPreviewCount)(legacySettings.sidebarThreadPreviewCount)) { + patch.sidebarThreadPreviewCount = legacySettings.sidebarThreadPreviewCount; + } + if (Schema.is(TimestampFormat)(legacySettings.timestampFormat)) { patch.timestampFormat = legacySettings.timestampFormat; } diff --git a/apps/web/vite.config.ts b/apps/web/vite.config.ts index a9d47df60e..57ac1f6896 100644 --- a/apps/web/vite.config.ts +++ b/apps/web/vite.config.ts @@ -7,6 +7,7 @@ import pkg from "./package.json" with { type: "json" }; const port = Number(process.env.PORT ?? 5733); const host = process.env.HOST?.trim() || "localhost"; +const configuredHttpUrl = process.env.VITE_HTTP_URL?.trim(); const configuredWsUrl = process.env.VITE_WS_URL?.trim(); const sourcemapEnv = process.env.T3CODE_WEB_SOURCEMAP?.trim().toLowerCase(); @@ -39,6 +40,7 @@ function resolveDevProxyTarget(wsUrl: string | undefined): string | undefined { } const devProxyTarget = resolveDevProxyTarget(configuredWsUrl); +const resolvedHttpUrl = configuredHttpUrl ?? `http://${host}:${port}`; export default defineConfig({ plugins: [ @@ -58,6 +60,7 @@ export default defineConfig({ include: ["@pierre/diffs", "@pierre/diffs/react", "@pierre/diffs/worker/worker.js"], }, define: { + "import.meta.env.VITE_HTTP_URL": JSON.stringify(resolvedHttpUrl ?? ""), // In dev mode, tell the web app where the WebSocket server lives "import.meta.env.VITE_WS_URL": JSON.stringify(configuredWsUrl ?? ""), "import.meta.env.APP_VERSION": JSON.stringify(pkg.version), @@ -76,6 +79,10 @@ export default defineConfig({ target: devProxyTarget, changeOrigin: true, }, + "/.well-known": { + target: devProxyTarget, + changeOrigin: true, + }, "/attachments": { target: devProxyTarget, changeOrigin: true, diff --git a/packages/contracts/src/settings.ts b/packages/contracts/src/settings.ts index 6633ce42a6..0566f3ef89 100644 --- a/packages/contracts/src/settings.ts +++ b/packages/contracts/src/settings.ts @@ -23,6 +23,17 @@ export const SidebarThreadSortOrder = Schema.Literals(["updated_at", "created_at export type SidebarThreadSortOrder = typeof SidebarThreadSortOrder.Type; export const DEFAULT_SIDEBAR_THREAD_SORT_ORDER: SidebarThreadSortOrder = "updated_at"; +export const MIN_SIDEBAR_THREAD_PREVIEW_COUNT = 2; +export const MAX_SIDEBAR_THREAD_PREVIEW_COUNT = 10; +export const SidebarThreadPreviewCount = Schema.Int.check( + Schema.isBetween({ + minimum: MIN_SIDEBAR_THREAD_PREVIEW_COUNT, + maximum: MAX_SIDEBAR_THREAD_PREVIEW_COUNT, + }), +); +export type SidebarThreadPreviewCount = typeof SidebarThreadPreviewCount.Type; +export const DEFAULT_SIDEBAR_THREAD_PREVIEW_COUNT: SidebarThreadPreviewCount = 6; + export const ClientSettingsSchema = Schema.Struct({ confirmThreadArchive: Schema.Boolean.pipe(Schema.withDecodingDefault(() => false)), confirmThreadDelete: Schema.Boolean.pipe(Schema.withDecodingDefault(() => true)), @@ -33,6 +44,9 @@ export const ClientSettingsSchema = Schema.Struct({ sidebarThreadSortOrder: SidebarThreadSortOrder.pipe( Schema.withDecodingDefault(() => DEFAULT_SIDEBAR_THREAD_SORT_ORDER), ), + sidebarThreadPreviewCount: SidebarThreadPreviewCount.pipe( + Schema.withDecodingDefault(() => DEFAULT_SIDEBAR_THREAD_PREVIEW_COUNT), + ), timestampFormat: TimestampFormat.pipe(Schema.withDecodingDefault(() => DEFAULT_TIMESTAMP_FORMAT)), }); export type ClientSettings = typeof ClientSettingsSchema.Type; From afe3877524155d1c0ca4114a2d76ee43f180c393 Mon Sep 17 00:00:00 2001 From: Marve10s Date: Thu, 9 Apr 2026 21:54:50 +0300 Subject: [PATCH 2/7] fix vite proxy duplicate well-known route --- apps/web/vite.config.ts | 4 ---- 1 file changed, 4 deletions(-) diff --git a/apps/web/vite.config.ts b/apps/web/vite.config.ts index 919c831304..ae4753d21b 100644 --- a/apps/web/vite.config.ts +++ b/apps/web/vite.config.ts @@ -83,10 +83,6 @@ export default defineConfig({ target: devProxyTarget, changeOrigin: true, }, - "/.well-known": { - target: devProxyTarget, - changeOrigin: true, - }, "/attachments": { target: devProxyTarget, changeOrigin: true, From d81caf8730c21b0999e6d2e1735a7ea9fe35723e Mon Sep 17 00:00:00 2001 From: Marve10s Date: Thu, 9 Apr 2026 22:14:33 +0300 Subject: [PATCH 3/7] fix(web): stop forcing default primary http url --- apps/web/vite.config.ts | 4 ---- 1 file changed, 4 deletions(-) diff --git a/apps/web/vite.config.ts b/apps/web/vite.config.ts index ae4753d21b..b162397a55 100644 --- a/apps/web/vite.config.ts +++ b/apps/web/vite.config.ts @@ -7,7 +7,6 @@ import pkg from "./package.json" with { type: "json" }; const port = Number(process.env.PORT ?? 5733); const host = process.env.HOST?.trim() || "localhost"; -const configuredHttpUrl = process.env.VITE_HTTP_URL?.trim(); const configuredWsUrl = process.env.VITE_WS_URL?.trim(); const sourcemapEnv = process.env.T3CODE_WEB_SOURCEMAP?.trim().toLowerCase(); @@ -40,8 +39,6 @@ function resolveDevProxyTarget(wsUrl: string | undefined): string | undefined { } const devProxyTarget = resolveDevProxyTarget(configuredWsUrl); -const resolvedHttpUrl = configuredHttpUrl ?? `http://${host}:${port}`; - export default defineConfig({ plugins: [ tanstackRouter(), @@ -60,7 +57,6 @@ export default defineConfig({ include: ["@pierre/diffs", "@pierre/diffs/react", "@pierre/diffs/worker/worker.js"], }, define: { - "import.meta.env.VITE_HTTP_URL": JSON.stringify(resolvedHttpUrl ?? ""), // In dev mode, tell the web app where the WebSocket server lives "import.meta.env.VITE_WS_URL": JSON.stringify(configuredWsUrl ?? ""), "import.meta.env.APP_VERSION": JSON.stringify(pkg.version), From f120de938a8d95a9af083940d30c5706918cc055 Mon Sep 17 00:00:00 2001 From: Marve10s Date: Thu, 9 Apr 2026 22:35:34 +0300 Subject: [PATCH 4/7] revert unrelated vite.config.ts change MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Drop the blank-line removal that was left over from the dev bootstrap fix commits — not in scope for this PR. --- apps/web/vite.config.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/web/vite.config.ts b/apps/web/vite.config.ts index b162397a55..7c123b4fed 100644 --- a/apps/web/vite.config.ts +++ b/apps/web/vite.config.ts @@ -39,6 +39,7 @@ function resolveDevProxyTarget(wsUrl: string | undefined): string | undefined { } const devProxyTarget = resolveDevProxyTarget(configuredWsUrl); + export default defineConfig({ plugins: [ tanstackRouter(), From 74b2ddce575643d53eff2937dcdc1a00ae675e84 Mon Sep 17 00:00:00 2001 From: Marve10s Date: Fri, 10 Apr 2026 19:10:28 +0300 Subject: [PATCH 5/7] fix(desktop): add sidebarThreadPreviewCount to test fixture The clientPersistence test was missing the new field after merge. --- apps/desktop/src/clientPersistence.test.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/desktop/src/clientPersistence.test.ts b/apps/desktop/src/clientPersistence.test.ts index df2178c0b0..88913ec0b5 100644 --- a/apps/desktop/src/clientPersistence.test.ts +++ b/apps/desktop/src/clientPersistence.test.ts @@ -53,6 +53,7 @@ const clientSettings: ClientSettings = { confirmThreadDelete: false, diffWordWrap: true, sidebarProjectSortOrder: "manual", + sidebarThreadPreviewCount: 6, sidebarThreadSortOrder: "created_at", timestampFormat: "24-hour", }; From 158d5448db05c1c9726b809fa849570d2a56ec21 Mon Sep 17 00:00:00 2001 From: Marve10s Date: Fri, 10 Apr 2026 19:19:02 +0300 Subject: [PATCH 6/7] Fix client settings type coverage for thread preview count --- apps/desktop/src/clientPersistence.test.ts | 1 + apps/web/src/localApi.test.ts | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/apps/desktop/src/clientPersistence.test.ts b/apps/desktop/src/clientPersistence.test.ts index 88913ec0b5..43102b188d 100644 --- a/apps/desktop/src/clientPersistence.test.ts +++ b/apps/desktop/src/clientPersistence.test.ts @@ -55,6 +55,7 @@ const clientSettings: ClientSettings = { sidebarProjectSortOrder: "manual", sidebarThreadPreviewCount: 6, sidebarThreadSortOrder: "created_at", + sidebarThreadPreviewCount: 6, timestampFormat: "24-hour", }; diff --git a/apps/web/src/localApi.test.ts b/apps/web/src/localApi.test.ts index 68047f4495..f4260920cb 100644 --- a/apps/web/src/localApi.test.ts +++ b/apps/web/src/localApi.test.ts @@ -503,6 +503,7 @@ describe("wsApi", () => { diffWordWrap: true, sidebarProjectSortOrder: "manual", sidebarThreadSortOrder: "created_at", + sidebarThreadPreviewCount: 6, timestampFormat: "24-hour", }); const setClientSettings = vi.fn().mockResolvedValue(undefined); @@ -531,6 +532,7 @@ describe("wsApi", () => { diffWordWrap: true, sidebarProjectSortOrder: "manual", sidebarThreadSortOrder: "created_at", + sidebarThreadPreviewCount: 6, timestampFormat: "24-hour", }); await api.persistence.getSavedEnvironmentRegistry(); @@ -549,6 +551,7 @@ describe("wsApi", () => { diffWordWrap: true, sidebarProjectSortOrder: "manual", sidebarThreadSortOrder: "created_at", + sidebarThreadPreviewCount: 6, timestampFormat: "24-hour", }); expect(getSavedEnvironmentRegistry).toHaveBeenCalledWith(); @@ -568,6 +571,7 @@ describe("wsApi", () => { diffWordWrap: true, sidebarProjectSortOrder: "manual", sidebarThreadSortOrder: "created_at", + sidebarThreadPreviewCount: 6, timestampFormat: "24-hour", }); await api.persistence.setSavedEnvironmentRegistry([ @@ -591,6 +595,7 @@ describe("wsApi", () => { diffWordWrap: true, sidebarProjectSortOrder: "manual", sidebarThreadSortOrder: "created_at", + sidebarThreadPreviewCount: 6, timestampFormat: "24-hour", }); await expect(api.persistence.getSavedEnvironmentRegistry()).resolves.toEqual([ From 2e8255d7268ff737d351936ecca70749732a4ed6 Mon Sep 17 00:00:00 2001 From: Marve10s Date: Fri, 10 Apr 2026 19:22:15 +0300 Subject: [PATCH 7/7] Fix duplicate sidebar thread preview count in desktop test --- apps/desktop/src/clientPersistence.test.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/apps/desktop/src/clientPersistence.test.ts b/apps/desktop/src/clientPersistence.test.ts index 43102b188d..88913ec0b5 100644 --- a/apps/desktop/src/clientPersistence.test.ts +++ b/apps/desktop/src/clientPersistence.test.ts @@ -55,7 +55,6 @@ const clientSettings: ClientSettings = { sidebarProjectSortOrder: "manual", sidebarThreadPreviewCount: 6, sidebarThreadSortOrder: "created_at", - sidebarThreadPreviewCount: 6, timestampFormat: "24-hour", };