fix(openclaw): address code review findings across P0-P3 issues

- Add 25 missing i18n keys for OpenClawFormFields in all 3 locales (P0)
- Replace key={index} with stable crypto.randomUUID() keys in EnvPanel,
  ToolsPanel, and OpenClawFormFields to prevent list state bugs (P1)
- Exclude openclaw from ProxyToggle/FailoverToggle in App.tsx (P1)
- Add merge_additive_config() for openclaw/opencode deep link imports (P1)
- Normalize serde(flatten) field naming to `extra` + HashMap (P2)
- Add directory existence check in remove_openclaw_provider_from_live (P2)
- Remove dead code in import_default_config and openclaw API methods (P2)
- Add duplicate key validation in EnvPanel before save (P2)
- Add openclawConfigDir to Settings type (P2)
- Add staleTime to OpenClaw query hooks (P3)
- Fix type-unsafe delete via destructuring in mutations.ts (P3)
This commit is contained in:
Jason
2026-02-08 17:35:29 +08:00
parent 00b424628f
commit 5081206176
15 changed files with 241 additions and 102 deletions
+17 -16
View File
@@ -95,9 +95,9 @@ pub struct OpenClawProviderConfig {
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub models: Vec<OpenClawModelEntry>,
/// 其他自定义字段(保留原始配置)
/// Other custom fields (preserve unknown fields)
#[serde(flatten)]
pub extra: Map<String, Value>,
pub extra: HashMap<String, Value>,
}
/// OpenClaw 模型条目
@@ -123,9 +123,9 @@ pub struct OpenClawModelEntry {
#[serde(skip_serializing_if = "Option::is_none")]
pub context_window: Option<u32>,
/// 其他自定义字段(保留未知字段)
/// Other custom fields (preserve unknown fields)
#[serde(flatten)]
pub extra: Map<String, Value>,
pub extra: HashMap<String, Value>,
}
/// OpenClaw 模型成本配置
@@ -137,9 +137,9 @@ pub struct OpenClawModelCost {
/// 输出价格(每百万 token)
pub output: f64,
/// 其他自定义字段(保留未知字段)
/// Other custom fields (preserve unknown fields)
#[serde(flatten)]
pub other: HashMap<String, Value>,
pub extra: HashMap<String, Value>,
}
/// OpenClaw 默认模型配置(agents.defaults.model
@@ -152,9 +152,9 @@ pub struct OpenClawDefaultModel {
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub fallbacks: Vec<String>,
/// 其他自定义字段(保留未知字段)
/// Other custom fields (preserve unknown fields)
#[serde(flatten)]
pub other: HashMap<String, Value>,
pub extra: HashMap<String, Value>,
}
/// OpenClaw 模型目录条目(agents.defaults.models 中的值)
@@ -164,9 +164,9 @@ pub struct OpenClawModelCatalogEntry {
#[serde(skip_serializing_if = "Option::is_none")]
pub alias: Option<String>,
/// 其他自定义字段(保留未知字段)
/// Other custom fields (preserve unknown fields)
#[serde(flatten)]
pub other: HashMap<String, Value>,
pub extra: HashMap<String, Value>,
}
/// OpenClaw agents.defaults 配置
@@ -180,21 +180,22 @@ pub struct OpenClawAgentsDefaults {
#[serde(skip_serializing_if = "Option::is_none")]
pub models: Option<HashMap<String, OpenClawModelCatalogEntry>>,
/// 其他自定义字段(保留未知字段)
/// Other custom fields (preserve unknown fields)
#[serde(flatten)]
pub other: HashMap<String, Value>,
pub extra: HashMap<String, Value>,
}
/// OpenClaw agents 顶层配置
#[derive(Debug, Clone, Serialize, Deserialize)]
#[allow(dead_code)]
pub struct OpenClawAgents {
/// 默认配置
#[serde(skip_serializing_if = "Option::is_none")]
pub defaults: Option<OpenClawAgentsDefaults>,
/// 其他自定义字段(保留未知字段)
/// Other custom fields (preserve unknown fields)
#[serde(flatten)]
pub other: HashMap<String, Value>,
pub extra: HashMap<String, Value>,
}
// ============================================================================
@@ -513,7 +514,7 @@ pub struct OpenClawToolsConfig {
/// Other custom fields (preserve unknown fields)
#[serde(flatten)]
pub other: HashMap<String, Value>,
pub extra: HashMap<String, Value>,
}
/// Read the tools config section
@@ -525,7 +526,7 @@ pub fn get_tools_config() -> Result<OpenClawToolsConfig, AppError> {
profile: None,
allow: Vec::new(),
deny: Vec::new(),
other: HashMap::new(),
extra: HashMap::new(),
});
};