feat: overhaul OpenClaw config panels with JSON5 round-trip write engine

- Add json-five crate for JSON5 serialization preserving comments and formatting
- Rewrite openclaw_config.rs with comment-preserving JSON5 read/write engine
- Add Tauri commands: get_openclaw_live_provider, write_openclaw_config_section
- Redesign EnvPanel as full JSON editor with structured error handling
- Add tools.profile selection (minimal/coding/messaging/full) to ToolsPanel
- Add legacy timeout migration support to AgentsDefaultsPanel
- Add OpenClawHealthBanner component for config validation warnings
- Add supporting hooks, mutations, utility functions, and unit tests
This commit is contained in:
Jason
2026-03-06 18:35:23 +08:00
parent b4fdd5fc0d
commit 7e6f803035
18 changed files with 1242 additions and 385 deletions
+20
View File
@@ -65,6 +65,12 @@ export const useAddProviderMutation = (appId: AppId) => {
});
}
if (appId === "openclaw") {
await queryClient.invalidateQueries({
queryKey: openclawKeys.health,
});
}
try {
await providersApi.updateTrayMenu();
} catch (trayError) {
@@ -106,6 +112,11 @@ export const useUpdateProviderMutation = (appId: AppId) => {
},
onSuccess: async () => {
await queryClient.invalidateQueries({ queryKey: ["providers", appId] });
if (appId === "openclaw") {
await queryClient.invalidateQueries({
queryKey: openclawKeys.health,
});
}
toast.success(
t("notifications.updateSuccess", {
defaultValue: "供应商更新成功",
@@ -153,6 +164,12 @@ export const useDeleteProviderMutation = (appId: AppId) => {
});
}
if (appId === "openclaw") {
await queryClient.invalidateQueries({
queryKey: openclawKeys.health,
});
}
try {
await providersApi.updateTrayMenu();
} catch (trayError) {
@@ -213,6 +230,9 @@ export const useSwitchProviderMutation = (appId: AppId) => {
await queryClient.invalidateQueries({
queryKey: openclawKeys.defaultModel,
});
await queryClient.invalidateQueries({
queryKey: openclawKeys.health,
});
}
try {