From e69fd7f22b9ed744769447199e1a3db13260f39b Mon Sep 17 00:00:00 2001 From: defi-failure <159208748+defi-failure@users.noreply.github.com> Date: Sat, 25 Oct 2025 21:10:37 +0800 Subject: [PATCH] fix: create assistant causing blank screen (#10853) * fix: create or update assistant causing blank screen * fix: remove redundant type annotation * fix: improve logging * fix: remove redundant check * fix(migration): move presets initialization to migration 166 The initialization of assistants.presets was incorrectly placed in migration 164. Move it to a new migration 166 to ensure proper state initialization after versions 1.6.5 and 1.7.0-beta.2. --------- Co-authored-by: icarus --- src/renderer/src/hooks/useAssistantPresets.ts | 32 ++++++++++++++++--- .../settings/AssistantSettings/index.tsx | 2 +- src/renderer/src/store/index.ts | 2 +- src/renderer/src/store/migrate.ts | 12 +++++++ 4 files changed, 42 insertions(+), 6 deletions(-) diff --git a/src/renderer/src/hooks/useAssistantPresets.ts b/src/renderer/src/hooks/useAssistantPresets.ts index 724b0d1f87..b6db1dffac 100644 --- a/src/renderer/src/hooks/useAssistantPresets.ts +++ b/src/renderer/src/hooks/useAssistantPresets.ts @@ -1,3 +1,4 @@ +import { loggerService } from '@logger' import { useAppDispatch, useAppSelector } from '@renderer/store' import { addAssistantPreset, @@ -8,8 +9,22 @@ import { } from '@renderer/store/assistants' import { AssistantPreset, AssistantSettings } from '@renderer/types' +const logger = loggerService.withContext('useAssistantPresets') + +function ensurePresetsArray(storedPresets: unknown): AssistantPreset[] { + if (Array.isArray(storedPresets)) { + return storedPresets + } + logger.warn('Unexpected data type from state.assistants.presets, falling back to empty list.', { + type: typeof storedPresets, + value: storedPresets + }) + return [] +} + export function useAssistantPresets() { - const presets = useAppSelector((state) => state.assistants.presets) + const storedPresets = useAppSelector((state) => state.assistants.presets) + const presets = ensurePresetsArray(storedPresets) const dispatch = useAppDispatch() return { @@ -21,14 +36,23 @@ export function useAssistantPresets() { } export function useAssistantPreset(id: string) { - // FIXME: undefined is not handled - const preset = useAppSelector((state) => state.assistants.presets.find((a) => a.id === id) as AssistantPreset) + const storedPresets = useAppSelector((state) => state.assistants.presets) + const presets = ensurePresetsArray(storedPresets) + const preset = presets.find((a) => a.id === id) const dispatch = useAppDispatch() + if (!preset) { + logger.warn(`Assistant preset with id ${id} not found in state.`) + } + return { - preset, + preset: preset, updateAssistantPreset: (preset: AssistantPreset) => dispatch(updateAssistantPreset(preset)), updateAssistantPresetSettings: (settings: Partial) => { + if (!preset) { + logger.warn(`Failed to update assistant preset settings because preset with id ${id} is missing.`) + return + } dispatch(updateAssistantPresetSettings({ assistantId: preset.id, settings })) } } diff --git a/src/renderer/src/pages/settings/AssistantSettings/index.tsx b/src/renderer/src/pages/settings/AssistantSettings/index.tsx index 042076f837..e26e8da64b 100644 --- a/src/renderer/src/pages/settings/AssistantSettings/index.tsx +++ b/src/renderer/src/pages/settings/AssistantSettings/index.tsx @@ -43,7 +43,7 @@ const AssistantSettingPopupContainer: React.FC = ({ resolve, tab, ...prop const _useAgent = useAssistantPreset(props.assistant.id) const isAgent = props.assistant.type === 'agent' - const assistant = isAgent ? _useAgent.preset : _useAssistant.assistant + const assistant = isAgent ? (_useAgent.preset ?? props.assistant) : _useAssistant.assistant const updateAssistant = isAgent ? _useAgent.updateAssistantPreset : _useAssistant.updateAssistant const updateAssistantSettings = isAgent ? _useAgent.updateAssistantPresetSettings diff --git a/src/renderer/src/store/index.ts b/src/renderer/src/store/index.ts index b6f8a166f4..c9ec0d5e81 100644 --- a/src/renderer/src/store/index.ts +++ b/src/renderer/src/store/index.ts @@ -65,7 +65,7 @@ const persistedReducer = persistReducer( { key: 'cherry-studio', storage, - version: 165, + version: 166, blacklist: ['runtime', 'messages', 'messageBlocks', 'tabs'], migrate }, diff --git a/src/renderer/src/store/migrate.ts b/src/renderer/src/store/migrate.ts index 24664358a2..0b41970cbf 100644 --- a/src/renderer/src/store/migrate.ts +++ b/src/renderer/src/store/migrate.ts @@ -2701,6 +2701,18 @@ const migrateConfig = { logger.error('migrate 165 error', error as Error) return state } + }, + '166': (state: RootState) => { + // added after 1.6.5 and 1.7.0-beta.2 + try { + if (state.assistants.presets === undefined) { + state.assistants.presets = [] + } + return state + } catch (error) { + logger.error('migrate 166 error', error as Error) + return state + } } }