diff --git a/src/app/(dashboard)/dashboard/cli-tools/components/AntigravityToolCard.tsx b/src/app/(dashboard)/dashboard/cli-tools/components/AntigravityToolCard.tsx index 153613e4ff..17b9259b01 100644 --- a/src/app/(dashboard)/dashboard/cli-tools/components/AntigravityToolCard.tsx +++ b/src/app/(dashboard)/dashboard/cli-tools/components/AntigravityToolCard.tsx @@ -116,7 +116,11 @@ export default function AntigravityToolCard({ setSudoPassword(""); fetchStatus(); } else { - setMessage({ type: "error", text: data.error || t("failedStart") }); + setMessage({ + type: "error", + text: + (typeof data.error === "string" ? data.error : data.error?.message) || t("failedStart"), + }); } } catch (error) { setMessage({ type: "error", text: error.message }); @@ -142,7 +146,11 @@ export default function AntigravityToolCard({ setSudoPassword(""); fetchStatus(); } else { - setMessage({ type: "error", text: data.error || t("failedStop") }); + setMessage({ + type: "error", + text: + (typeof data.error === "string" ? data.error : data.error?.message) || t("failedStop"), + }); } } catch (error) { setMessage({ type: "error", text: error.message }); @@ -197,7 +205,10 @@ export default function AntigravityToolCard({ if (!res.ok) { const data = await res.json(); - throw new Error(data.error || t("failedSaveMappings")); + throw new Error( + (typeof data.error === "string" ? data.error : data.error?.message) || + t("failedSaveMappings") + ); } setMessage({ type: "success", text: t("mappingsSaved") }); diff --git a/src/app/(dashboard)/dashboard/cli-tools/components/ClaudeToolCard.tsx b/src/app/(dashboard)/dashboard/cli-tools/components/ClaudeToolCard.tsx index 80feaca530..20ae5ad1e3 100644 --- a/src/app/(dashboard)/dashboard/cli-tools/components/ClaudeToolCard.tsx +++ b/src/app/(dashboard)/dashboard/cli-tools/components/ClaudeToolCard.tsx @@ -169,7 +169,12 @@ export default function ClaudeToolCard({ settings: { ...prev?.settings, env }, })); } else { - setMessage({ type: "error", text: data.error || t("failedApplySettings") }); + setMessage({ + type: "error", + text: + (typeof data.error === "string" ? data.error : data.error?.message) || + t("failedApplySettings"), + }); } } catch (error) { setMessage({ type: "error", text: error.message }); @@ -191,7 +196,12 @@ export default function ClaudeToolCard({ ); setSelectedApiKey(""); } else { - setMessage({ type: "error", text: data.error || t("failedResetSettings") }); + setMessage({ + type: "error", + text: + (typeof data.error === "string" ? data.error : data.error?.message) || + t("failedResetSettings"), + }); } } catch (error) { setMessage({ type: "error", text: error.message }); @@ -257,7 +267,12 @@ export default function ClaudeToolCard({ checkClaudeStatus(); fetchBackups(); } else { - setMessage({ type: "error", text: data.error || t("failedRestore") }); + setMessage({ + type: "error", + text: + (typeof data.error === "string" ? data.error : data.error?.message) || + t("failedRestore"), + }); } } catch (error) { setMessage({ type: "error", text: error.message }); diff --git a/src/app/(dashboard)/dashboard/cli-tools/components/ClineToolCard.tsx b/src/app/(dashboard)/dashboard/cli-tools/components/ClineToolCard.tsx index faf654fab1..8e61118c7c 100644 --- a/src/app/(dashboard)/dashboard/cli-tools/components/ClineToolCard.tsx +++ b/src/app/(dashboard)/dashboard/cli-tools/components/ClineToolCard.tsx @@ -118,7 +118,12 @@ export default function ClineToolCard({ await fetchBackups(); } else { const data = await res.json(); - setMessage({ type: "error", text: data.error || t("failedRestoreBackup") }); + setMessage({ + type: "error", + text: + (typeof data.error === "string" ? data.error : data.error?.message) || + t("failedRestoreBackup"), + }); } } catch (e) { setMessage({ type: "error", text: e.message }); @@ -173,7 +178,10 @@ export default function ClineToolCard({ await checkClineStatus(); await fetchBackups(); } else { - setMessage({ type: "error", text: data.error || t("failed") }); + setMessage({ + type: "error", + text: (typeof data.error === "string" ? data.error : data.error?.message) || t("failed"), + }); } } catch (error) { setMessage({ type: "error", text: error.message }); @@ -195,7 +203,10 @@ export default function ClineToolCard({ await checkClineStatus(); await fetchBackups(); } else { - setMessage({ type: "error", text: data.error || t("failed") }); + setMessage({ + type: "error", + text: (typeof data.error === "string" ? data.error : data.error?.message) || t("failed"), + }); } } catch (error) { setMessage({ type: "error", text: error.message }); diff --git a/src/app/(dashboard)/dashboard/cli-tools/components/CliproxyapiToolCard.tsx b/src/app/(dashboard)/dashboard/cli-tools/components/CliproxyapiToolCard.tsx index 62f0e49d14..5a154adcdd 100644 --- a/src/app/(dashboard)/dashboard/cli-tools/components/CliproxyapiToolCard.tsx +++ b/src/app/(dashboard)/dashboard/cli-tools/components/CliproxyapiToolCard.tsx @@ -75,7 +75,12 @@ export default function CliproxyapiToolCard({ isExpanded, onToggle }) { await fetchStatus(); if (action === "install" || action === "restart") await fetchUpdateInfo(); } else { - setMessage({ type: "error", text: data.error || `${action} failed` }); + setMessage({ + type: "error", + text: + (typeof data.error === "string" ? data.error : data.error?.message) || + `${action} failed`, + }); } } catch (err) { setMessage({ type: "error", text: err instanceof Error ? err.message : "Request failed" }); diff --git a/src/app/(dashboard)/dashboard/cli-tools/components/CodexToolCard.tsx b/src/app/(dashboard)/dashboard/cli-tools/components/CodexToolCard.tsx index 689d18ee8b..2313a7a9a1 100644 --- a/src/app/(dashboard)/dashboard/cli-tools/components/CodexToolCard.tsx +++ b/src/app/(dashboard)/dashboard/cli-tools/components/CodexToolCard.tsx @@ -178,7 +178,12 @@ export default function CodexToolCard({ setMessage({ type: "success", text: t("settingsApplied") }); checkCodexStatus(); } else { - setMessage({ type: "error", text: data.error || t("failedApplySettings") }); + setMessage({ + type: "error", + text: + (typeof data.error === "string" ? data.error : data.error?.message) || + t("failedApplySettings"), + }); } } catch (error) { setMessage({ type: "error", text: error.message }); @@ -198,7 +203,12 @@ export default function CodexToolCard({ setSelectedModel(""); checkCodexStatus(); } else { - setMessage({ type: "error", text: data.error || t("failedResetSettings") }); + setMessage({ + type: "error", + text: + (typeof data.error === "string" ? data.error : data.error?.message) || + t("failedResetSettings"), + }); } } catch (error) { setMessage({ type: "error", text: error.message }); @@ -246,7 +256,12 @@ export default function CodexToolCard({ setNewProfileName(""); fetchProfiles(); } else { - setMessage({ type: "error", text: data.error || t("failedSaveProfile") }); + setMessage({ + type: "error", + text: + (typeof data.error === "string" ? data.error : data.error?.message) || + t("failedSaveProfile"), + }); } } catch (error) { setMessage({ type: "error", text: error.message }); @@ -270,7 +285,12 @@ export default function CodexToolCard({ checkCodexStatus(); fetchBackups(); } else { - setMessage({ type: "error", text: data.error || t("failedActivateProfile") }); + setMessage({ + type: "error", + text: + (typeof data.error === "string" ? data.error : data.error?.message) || + t("failedActivateProfile"), + }); } } catch (error) { setMessage({ type: "error", text: error.message }); @@ -318,7 +338,12 @@ export default function CodexToolCard({ checkCodexStatus(); fetchBackups(); } else { - setMessage({ type: "error", text: data.error || t("failedRestore") }); + setMessage({ + type: "error", + text: + (typeof data.error === "string" ? data.error : data.error?.message) || + t("failedRestore"), + }); } } catch (error) { setMessage({ type: "error", text: error.message }); diff --git a/src/app/(dashboard)/dashboard/cli-tools/components/DefaultToolCard.tsx b/src/app/(dashboard)/dashboard/cli-tools/components/DefaultToolCard.tsx index 0918862dab..2fa8f408cc 100644 --- a/src/app/(dashboard)/dashboard/cli-tools/components/DefaultToolCard.tsx +++ b/src/app/(dashboard)/dashboard/cli-tools/components/DefaultToolCard.tsx @@ -249,7 +249,12 @@ export default function DefaultToolCard({ if (res.ok) { setMessage({ type: "success", text: data.message || t("configurationSaved") }); } else { - setMessage({ type: "error", text: data.error || t("failedToSave") }); + setMessage({ + type: "error", + text: + (typeof data.error === "string" ? data.error : data.error?.message) || + t("failedToSave"), + }); } } catch (error) { setMessage({ type: "error", text: error.message }); diff --git a/src/app/(dashboard)/dashboard/cli-tools/components/DroidToolCard.tsx b/src/app/(dashboard)/dashboard/cli-tools/components/DroidToolCard.tsx index e8e560d57c..cbdef26635 100644 --- a/src/app/(dashboard)/dashboard/cli-tools/components/DroidToolCard.tsx +++ b/src/app/(dashboard)/dashboard/cli-tools/components/DroidToolCard.tsx @@ -150,7 +150,12 @@ export default function DroidToolCard({ setMessage({ type: "success", text: t("settingsApplied") }); checkDroidStatus(); } else { - setMessage({ type: "error", text: data.error || t("failedApplySettings") }); + setMessage({ + type: "error", + text: + (typeof data.error === "string" ? data.error : data.error?.message) || + t("failedApplySettings"), + }); } } catch (error) { setMessage({ type: "error", text: error.message }); @@ -171,7 +176,12 @@ export default function DroidToolCard({ setSelectedApiKeyId(""); checkDroidStatus(); } else { - setMessage({ type: "error", text: data.error || t("failedResetSettings") }); + setMessage({ + type: "error", + text: + (typeof data.error === "string" ? data.error : data.error?.message) || + t("failedResetSettings"), + }); } } catch (error) { setMessage({ type: "error", text: error.message }); @@ -211,7 +221,12 @@ export default function DroidToolCard({ checkDroidStatus(); fetchBackups(); } else { - setMessage({ type: "error", text: data.error || t("failedRestore") }); + setMessage({ + type: "error", + text: + (typeof data.error === "string" ? data.error : data.error?.message) || + t("failedRestore"), + }); } } catch (error) { setMessage({ type: "error", text: error.message }); diff --git a/src/app/(dashboard)/dashboard/cli-tools/components/KiloToolCard.tsx b/src/app/(dashboard)/dashboard/cli-tools/components/KiloToolCard.tsx index 5572e44da3..52cfd85391 100644 --- a/src/app/(dashboard)/dashboard/cli-tools/components/KiloToolCard.tsx +++ b/src/app/(dashboard)/dashboard/cli-tools/components/KiloToolCard.tsx @@ -104,7 +104,12 @@ export default function KiloToolCard({ await fetchBackups(); } else { const data = await res.json(); - setMessage({ type: "error", text: data.error || t("failedRestoreBackup") }); + setMessage({ + type: "error", + text: + (typeof data.error === "string" ? data.error : data.error?.message) || + t("failedRestoreBackup"), + }); } } catch (e) { setMessage({ type: "error", text: e.message }); @@ -159,7 +164,10 @@ export default function KiloToolCard({ await checkKiloStatus(); await fetchBackups(); } else { - setMessage({ type: "error", text: data.error || t("failed") }); + setMessage({ + type: "error", + text: (typeof data.error === "string" ? data.error : data.error?.message) || t("failed"), + }); } } catch (error) { setMessage({ type: "error", text: error.message }); @@ -181,7 +189,10 @@ export default function KiloToolCard({ await checkKiloStatus(); await fetchBackups(); } else { - setMessage({ type: "error", text: data.error || t("failed") }); + setMessage({ + type: "error", + text: (typeof data.error === "string" ? data.error : data.error?.message) || t("failed"), + }); } } catch (error) { setMessage({ type: "error", text: error.message }); diff --git a/src/app/(dashboard)/dashboard/cli-tools/components/OpenClawToolCard.tsx b/src/app/(dashboard)/dashboard/cli-tools/components/OpenClawToolCard.tsx index 84bdd357e7..fd365e9e89 100644 --- a/src/app/(dashboard)/dashboard/cli-tools/components/OpenClawToolCard.tsx +++ b/src/app/(dashboard)/dashboard/cli-tools/components/OpenClawToolCard.tsx @@ -152,7 +152,12 @@ export default function OpenClawToolCard({ setMessage({ type: "success", text: t("settingsApplied") }); checkOpenclawStatus(); } else { - setMessage({ type: "error", text: data.error || t("failedApplySettings") }); + setMessage({ + type: "error", + text: + (typeof data.error === "string" ? data.error : data.error?.message) || + t("failedApplySettings"), + }); } } catch (error) { setMessage({ type: "error", text: error.message }); @@ -173,7 +178,12 @@ export default function OpenClawToolCard({ setSelectedApiKeyId(""); checkOpenclawStatus(); } else { - setMessage({ type: "error", text: data.error || t("failedResetSettings") }); + setMessage({ + type: "error", + text: + (typeof data.error === "string" ? data.error : data.error?.message) || + t("failedResetSettings"), + }); } } catch (error) { setMessage({ type: "error", text: error.message }); @@ -213,7 +223,12 @@ export default function OpenClawToolCard({ checkOpenclawStatus(); fetchBackups(); } else { - setMessage({ type: "error", text: data.error || t("failedRestore") }); + setMessage({ + type: "error", + text: + (typeof data.error === "string" ? data.error : data.error?.message) || + t("failedRestore"), + }); } } catch (error) { setMessage({ type: "error", text: error.message }); diff --git a/src/shared/validation/schemas.ts b/src/shared/validation/schemas.ts index 9a8921f471..972b7d8abc 100644 --- a/src/shared/validation/schemas.ts +++ b/src/shared/validation/schemas.ts @@ -1708,7 +1708,7 @@ export const cliSettingsEnvSchema = z.object({ export const cliModelConfigSchema = z.object({ baseUrl: z.string().trim().min(1, "baseUrl and model are required"), - apiKey: z.string().optional(), + apiKey: z.string().nullable().optional(), model: z.string().trim().min(1, "baseUrl and model are required"), reasoningEffort: z.enum(["none", "low", "medium", "high", "xhigh"]).optional(), wireApi: z.enum(["chat", "responses"]).optional(),