fix(ai): improve API retry handling

This commit is contained in:
Abeautifulsnow authored and GitHub committed 2026-07-29 16:16:39 +08:00
1 parent a4352d6560
commit 52d5c99a92
29 files changed
+3962 -1097

No files matched your search

+77 -15
View File
@@ -393,7 +393,14 @@ export interface CustomTheme {
ddlColors: CustomThemeDdlColors;
}
export const DEFAULT_CUSTOM_THEMES: CustomTheme[] = [{ id: "default", name: "Custom", colors: { ...DEFAULT_CUSTOM_THEME_COLORS }, ddlColors: { ...DEFAULT_CUSTOM_THEME_DDL_COLORS } }];
export const DEFAULT_CUSTOM_THEMES: CustomTheme[] = [
{
id: "default",
name: "Custom",
colors: { ...DEFAULT_CUSTOM_THEME_COLORS },
ddlColors: { ...DEFAULT_CUSTOM_THEME_DDL_COLORS },
},
];
export type SidebarObjectInfoMode = "comment-inline" | "comment-aligned" | "comment-right" | "size" | "hidden";
@@ -538,7 +545,11 @@ export function enforceRightSidebarPanelExclusivity(current: RightSidebarPanelSt
return transitionRightSidebarPanels(current, panelToKeep, true, true);
}
export const EDITOR_THEMES: { value: EditorTheme; label: string; dark: boolean }[] = [
export const EDITOR_THEMES: {
value: EditorTheme;
label: string;
dark: boolean;
}[] = [
{ value: "app", label: "Follow app theme", dark: false },
{ value: "one-dark", label: "One Dark", dark: true },
{ value: "vscode-dark", label: "VS Dark+", dark: true },
@@ -790,7 +801,13 @@ function normalizeSqlSnippets(value: unknown, existing?: SqlSnippet[]): SqlSnipp
if (seenPrefixes.has(item.prefix)) continue;
seenPrefixes.add(item.prefix);
// Older settings do not have this field; only an explicit false disables a snippet.
valid.push({ id: item.id, label: item.label, prefix: item.prefix, body: item.body, enabled: item.enabled !== false });
valid.push({
id: item.id,
label: item.label,
prefix: item.prefix,
body: item.body,
enabled: item.enabled !== false,
});
}
if (valid.length === 0) return existing ?? DEFAULT_SQL_SNIPPETS;
return valid;
@@ -845,7 +862,10 @@ export function normalizeEditorSettings(settings: Partial<EditorSettings>, exist
return {
...renamed,
colors: { ...DEFAULT_CUSTOM_THEME_COLORS, ...renamed.colors },
ddlColors: { ...DEFAULT_CUSTOM_THEME_DDL_COLORS, ...(renamed as any).ddlColors },
ddlColors: {
...DEFAULT_CUSTOM_THEME_DDL_COLORS,
...(renamed as any).ddlColors,
},
};
});
}
@@ -854,7 +874,10 @@ export function normalizeEditorSettings(settings: Partial<EditorSettings>, exist
{
id: "migrated",
name: "Migrated",
colors: { ...DEFAULT_CUSTOM_THEME_COLORS, ...settings.customThemeColors },
colors: {
...DEFAULT_CUSTOM_THEME_COLORS,
...settings.customThemeColors,
},
ddlColors: { ...DEFAULT_CUSTOM_THEME_DDL_COLORS },
},
]
@@ -915,17 +938,43 @@ export function normalizeEditorSettings(settings: Partial<EditorSettings>, exist
sidebarObjectDisplay: settings.sidebarObjectDisplay === "simple" || settings.sidebarObjectDisplay === "grouped" ? settings.sidebarObjectDisplay : DEFAULT_EDITOR_SETTINGS.sidebarObjectDisplay,
sidebarTableSearchEnabled: typeof settings.sidebarTableSearchEnabled === "boolean" ? settings.sidebarTableSearchEnabled : DEFAULT_EDITOR_SETTINGS.sidebarTableSearchEnabled,
autoSelectActiveSidebarNode: settings.autoSelectActiveSidebarNode ?? DEFAULT_EDITOR_SETTINGS.autoSelectActiveSidebarNode,
openTabsRestoreMode: normalizeOpenTabsRestoreMode((settings as Partial<EditorSettings>).openTabsRestoreMode, (settings as Partial<EditorSettings> & { restoreOpenTabsOnLaunch?: boolean }).restoreOpenTabsOnLaunch),
disconnectTabHandlingMode: normalizeDisconnectTabHandlingMode((settings as Partial<EditorSettings>).disconnectTabHandlingMode, (settings as Partial<EditorSettings> & { closeQueryTabsOnDisconnect?: boolean }).closeQueryTabsOnDisconnect),
openTabsRestoreMode: normalizeOpenTabsRestoreMode(
(settings as Partial<EditorSettings>).openTabsRestoreMode,
(
settings as Partial<EditorSettings> & {
restoreOpenTabsOnLaunch?: boolean;
}
).restoreOpenTabsOnLaunch,
),
disconnectTabHandlingMode: normalizeDisconnectTabHandlingMode(
(settings as Partial<EditorSettings>).disconnectTabHandlingMode,
(
settings as Partial<EditorSettings> & {
closeQueryTabsOnDisconnect?: boolean;
}
).closeQueryTabsOnDisconnect,
),
reuseDataTab: settings.reuseDataTab ?? DEFAULT_EDITOR_SETTINGS.reuseDataTab,
prefillNewQueryWithSelect: typeof settings.prefillNewQueryWithSelect === "boolean" ? settings.prefillNewQueryWithSelect : DEFAULT_EDITOR_SETTINGS.prefillNewQueryWithSelect,
updateNotificationsEnabled: settings.updateNotificationsEnabled ?? DEFAULT_EDITOR_SETTINGS.updateNotificationsEnabled,
sidebarHiddenTablePrefixes: normalizeSidebarHiddenTablePrefixes(settings.sidebarHiddenTablePrefixes),
sidebarObjectInfoMode: normalizeSidebarObjectInfoMode(
settings.sidebarObjectInfoMode,
(settings as Partial<EditorSettings> & { sidebarTableCommentLayout?: string }).sidebarTableCommentLayout,
(settings as Partial<EditorSettings> & { sidebarHideTableComments?: boolean }).sidebarHideTableComments,
(settings as Partial<EditorSettings> & { sidebarShowDatabaseSizes?: boolean }).sidebarShowDatabaseSizes,
(
settings as Partial<EditorSettings> & {
sidebarTableCommentLayout?: string;
}
).sidebarTableCommentLayout,
(
settings as Partial<EditorSettings> & {
sidebarHideTableComments?: boolean;
}
).sidebarHideTableComments,
(
settings as Partial<EditorSettings> & {
sidebarShowDatabaseSizes?: boolean;
}
).sidebarShowDatabaseSizes,
),
sidebarAllowHorizontalScroll: settings.sidebarAllowHorizontalScroll ?? DEFAULT_EDITOR_SETTINGS.sidebarAllowHorizontalScroll,
columnFormatters: normalizeColumnFormatters(settings.columnFormatters),
@@ -996,7 +1045,9 @@ export const useSettingsStore = defineStore("settings", () => {
const isAiConfigLoaded = ref(false);
const aiConfigs = ref<AiConfigItem[]>([]);
const desktopSettings = ref<DesktopSettings>({ ...DEFAULT_DESKTOP_SETTINGS });
const mcpGlobalPolicy = ref<McpGlobalPolicy>({ ...DEFAULT_MCP_GLOBAL_POLICY });
const mcpGlobalPolicy = ref<McpGlobalPolicy>({
...DEFAULT_MCP_GLOBAL_POLICY,
});
const isDesktopSettingsLoaded = ref(false);
const isMcpGlobalPolicyLoaded = ref(false);
const isEditorSettingsLoaded = ref(false);
@@ -1119,7 +1170,10 @@ export const useSettingsStore = defineStore("settings", () => {
const savedActive = savedSelection?.active;
const savedConfig = savedActive ? aiConfigs.value.find((config) => config.id === savedActive.configId) : undefined;
if (savedConfig && savedActive?.modelId.trim()) {
activeModel.value = { configId: savedConfig.id, modelId: savedActive.modelId.trim() };
activeModel.value = {
configId: savedConfig.id,
modelId: savedActive.modelId.trim(),
};
} else {
const fallback = aiConfigs.value.find((config) => config.isDefault) || aiConfigs.value[0];
activeModel.value = fallback?.model.trim() ? { configId: fallback.id, modelId: fallback.model.trim() } : null;
@@ -1175,7 +1229,10 @@ export const useSettingsStore = defineStore("settings", () => {
await api.saveAiConfigItem(normalized);
aiConfigs.value.push(normalized);
if (aiConfigs.value.length === 1 && normalized.model.trim()) {
activeModel.value = { configId: normalized.id, modelId: normalized.model };
activeModel.value = {
configId: normalized.id,
modelId: normalized.model,
};
persistAiChatSelection();
}
}
@@ -1214,7 +1271,10 @@ export const useSettingsStore = defineStore("settings", () => {
}
function updateActiveModel(model: { configId: string; modelId: string }) {
activeModel.value = { configId: model.configId, modelId: model.modelId.trim() };
activeModel.value = {
configId: model.configId,
modelId: model.modelId.trim(),
};
persistAiChatSelection();
}
@@ -1412,7 +1472,9 @@ export const useSettingsStore = defineStore("settings", () => {
}
function deleteCustomColumnFormatter(id: string) {
const customColumnFormatters = { ...editorSettings.value.customColumnFormatters };
const customColumnFormatters = {
...editorSettings.value.customColumnFormatters,
};
delete customColumnFormatters[id];
const columnFormatters = Object.fromEntries(
Object.entries(editorSettings.value.columnFormatters).filter(([, formatter]) => {