chore: finalize v1.3.0 follow-up fixes

This commit is contained in:
coso
2026-04-05 14:10:33 +08:00
parent e9ba195ff6
commit e4b93c38d8
24 changed files with 584 additions and 721 deletions
-5
View File
@@ -15,7 +15,6 @@ use crate::commands::orchestrator_cmd::OrchestratorState;
use crate::commands::plugin_cmd::PluginManagerState;
use crate::commands::plugin_install_cmd::PluginInstallerState;
use crate::commands::provider_pool_cmd::{CredentialSyncServiceState, ProviderPoolServiceState};
use crate::commands::resilience_cmd::ResilienceConfigState;
use crate::commands::session_files_cmd::SessionFilesState;
use crate::commands::skill_cmd::SkillServiceState;
use crate::commands::terminal_cmd::TerminalManagerState;
@@ -56,7 +55,6 @@ pub struct AppStates {
pub credential_sync_service: CredentialSyncServiceState,
pub token_cache_service: TokenCacheServiceState,
pub machine_id_service: MachineIdState,
pub resilience_config: ResilienceConfigState,
pub plugin_manager: PluginManagerState,
pub plugin_installer: PluginInstallerState,
pub plugin_rpc_manager: crate::commands::plugin_rpc_cmd::PluginRpcManagerState,
@@ -177,8 +175,6 @@ pub fn init_states(config: &Config) -> Result<AppStates, String> {
.map_err(|e| format!("MachineIdService 初始化失败: {e}"))?;
let machine_id_service_state: MachineIdState = Arc::new(RwLock::new(machine_id_service));
let resilience_config_state = ResilienceConfigState::default();
// 插件管理器
let plugin_manager = plugin::PluginManager::with_defaults();
let plugin_manager_state = PluginManagerState(Arc::new(RwLock::new(plugin_manager)));
@@ -281,7 +277,6 @@ pub fn init_states(config: &Config) -> Result<AppStates, String> {
credential_sync_service: credential_sync_service_state,
token_cache_service: token_cache_service_state,
machine_id_service: machine_id_service_state,
resilience_config: resilience_config_state,
plugin_manager: plugin_manager_state,
plugin_installer: plugin_installer_state,
plugin_rpc_manager: plugin_rpc_manager_state,
+1 -17
View File
@@ -107,7 +107,6 @@ pub fn run() {
credential_sync_service: credential_sync_service_state,
token_cache_service: token_cache_service_state,
machine_id_service: machine_id_service_state,
resilience_config: resilience_config_state,
plugin_manager: plugin_manager_state,
plugin_installer: plugin_installer_state,
plugin_rpc_manager: plugin_rpc_manager_state,
@@ -214,7 +213,6 @@ pub fn run() {
.manage(credential_sync_service_state)
.manage(token_cache_service_state)
.manage(machine_id_service_state)
.manage(resilience_config_state)
.manage(telemetry_state)
.manage(plugin_manager_state)
.manage(plugin_installer_state)
@@ -1344,13 +1342,6 @@ pub fn run() {
// API Key Provider connection test command
commands::api_key_provider_cmd::test_api_key_provider_connection,
commands::api_key_provider_cmd::test_api_key_provider_chat,
// Resilience config commands
commands::resilience_cmd::get_retry_config,
commands::resilience_cmd::update_retry_config,
commands::resilience_cmd::get_failover_config,
commands::resilience_cmd::update_failover_config,
commands::resilience_cmd::get_switch_log,
commands::resilience_cmd::clear_switch_log,
// Telemetry commands
commands::telemetry_cmd::get_request_logs,
commands::telemetry_cmd::get_request_log_detail,
@@ -1369,15 +1360,8 @@ pub fn run() {
commands::injection_cmd::add_injection_rule,
commands::injection_cmd::remove_injection_rule,
commands::injection_cmd::update_injection_rule,
// Security & Performance commands
commands::security_perf_cmd::get_rate_limit_config,
commands::security_perf_cmd::update_rate_limit_config,
commands::security_perf_cmd::get_conversation_config,
commands::security_perf_cmd::update_conversation_config,
// Hint route commands
commands::security_perf_cmd::get_hint_routes,
commands::security_perf_cmd::update_hint_routes,
commands::security_perf_cmd::get_pairing_config,
commands::security_perf_cmd::update_pairing_config,
// Usage commands
commands::usage_cmd::get_kiro_usage,
// Tray commands
-6
View File
@@ -12,7 +12,6 @@ use crate::commands::orchestrator_cmd::OrchestratorState;
use crate::commands::plugin_cmd::PluginManagerState;
use crate::commands::plugin_install_cmd::PluginInstallerState;
use crate::commands::provider_pool_cmd::{CredentialSyncServiceState, ProviderPoolServiceState};
use crate::commands::resilience_cmd::ResilienceConfigState;
use crate::commands::skill_cmd::SkillServiceState;
use crate::config::{GlobalConfigManager, GlobalConfigManagerState};
use crate::database;
@@ -53,7 +52,6 @@ pub struct ServiceStates {
pub credential_sync_service: CredentialSyncServiceState,
pub token_cache_service: TokenCacheServiceState,
pub machine_id_service: MachineIdState,
pub resilience_config: ResilienceConfigState,
pub plugin_manager: PluginManagerState,
pub plugin_installer: PluginInstallerState,
pub orchestrator: OrchestratorState,
@@ -87,9 +85,6 @@ pub fn init_service_states() -> ServiceStates {
.expect("Failed to initialize MachineIdService");
let machine_id_service_state: MachineIdState = Arc::new(RwLock::new(machine_id_service));
// Initialize ResilienceConfigState
let resilience_config_state = ResilienceConfigState::default();
// Initialize PluginManager
let plugin_manager = plugin::PluginManager::with_defaults();
let plugin_manager_state = PluginManagerState(Arc::new(RwLock::new(plugin_manager)));
@@ -114,7 +109,6 @@ pub fn init_service_states() -> ServiceStates {
credential_sync_service: credential_sync_service_state,
token_cache_service: token_cache_service_state,
machine_id_service: machine_id_service_state,
resilience_config: resilience_config_state,
plugin_manager: plugin_manager_state,
plugin_installer: plugin_installer_state,
orchestrator: orchestrator_state,
-1
View File
@@ -48,7 +48,6 @@ pub mod plugin_install_cmd;
pub mod plugin_rpc_cmd;
pub mod prompt_cmd;
pub mod provider_pool_cmd;
pub mod resilience_cmd;
pub mod screenshot_cmd;
pub mod security_perf_cmd;
pub mod session_files_cmd;
-182
View File
@@ -1,182 +0,0 @@
//! 容错配置相关 Tauri 命令
use crate::resilience::{FailoverConfig, RetryConfig};
use serde::{Deserialize, Serialize};
use std::sync::Arc;
use tokio::sync::RwLock;
/// 容错配置状态
pub struct ResilienceConfigState {
pub retry_config: Arc<RwLock<RetryConfig>>,
pub failover_config: Arc<RwLock<FailoverConfig>>,
pub switch_log: Arc<RwLock<Vec<SwitchLogEntry>>>,
}
impl Default for ResilienceConfigState {
fn default() -> Self {
Self {
retry_config: Arc::new(RwLock::new(RetryConfig::default())),
failover_config: Arc::new(RwLock::new(FailoverConfig::default())),
switch_log: Arc::new(RwLock::new(Vec::new())),
}
}
}
/// 切换日志条目(用于前端显示)
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SwitchLogEntry {
pub from_provider: String,
pub to_provider: String,
pub failure_type: String,
pub timestamp: String,
}
/// 重试配置 DTO(用于前端)
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RetryConfigDto {
pub max_retries: u32,
pub base_delay_ms: u64,
pub max_delay_ms: u64,
pub retryable_codes: Vec<u16>,
}
impl From<RetryConfig> for RetryConfigDto {
fn from(config: RetryConfig) -> Self {
Self {
max_retries: config.max_retries,
base_delay_ms: config.base_delay_ms,
max_delay_ms: config.max_delay_ms,
retryable_codes: config.retryable_codes,
}
}
}
impl From<RetryConfigDto> for RetryConfig {
fn from(dto: RetryConfigDto) -> Self {
Self {
max_retries: dto.max_retries,
base_delay_ms: dto.base_delay_ms,
max_delay_ms: dto.max_delay_ms,
retryable_codes: dto.retryable_codes,
}
}
}
/// 故障转移配置 DTO(用于前端)
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FailoverConfigDto {
pub auto_switch: bool,
pub switch_on_quota: bool,
}
impl From<FailoverConfig> for FailoverConfigDto {
fn from(config: FailoverConfig) -> Self {
Self {
auto_switch: config.auto_switch,
switch_on_quota: config.switch_on_quota,
}
}
}
impl From<FailoverConfigDto> for FailoverConfig {
fn from(dto: FailoverConfigDto) -> Self {
Self {
auto_switch: dto.auto_switch,
switch_on_quota: dto.switch_on_quota,
}
}
}
/// 获取重试配置
#[tauri::command]
pub async fn get_retry_config(
state: tauri::State<'_, ResilienceConfigState>,
) -> Result<RetryConfigDto, String> {
let config = state.retry_config.read().await;
Ok(RetryConfigDto::from(config.clone()))
}
/// 更新重试配置
#[tauri::command]
pub async fn update_retry_config(
state: tauri::State<'_, ResilienceConfigState>,
config: RetryConfigDto,
) -> Result<(), String> {
// 验证配置
if config.max_retries > 10 {
return Err("最大重试次数不能超过 10".to_string());
}
if config.base_delay_ms < 100 {
return Err("基础延迟不能小于 100ms".to_string());
}
if config.max_delay_ms < config.base_delay_ms {
return Err("最大延迟不能小于基础延迟".to_string());
}
if config.max_delay_ms > 120000 {
return Err("最大延迟不能超过 120 秒".to_string());
}
let mut retry_config = state.retry_config.write().await;
*retry_config = RetryConfig::from(config);
Ok(())
}
/// 获取故障转移配置
#[tauri::command]
pub async fn get_failover_config(
state: tauri::State<'_, ResilienceConfigState>,
) -> Result<FailoverConfigDto, String> {
let config = state.failover_config.read().await;
Ok(FailoverConfigDto::from(config.clone()))
}
/// 更新故障转移配置
#[tauri::command]
pub async fn update_failover_config(
state: tauri::State<'_, ResilienceConfigState>,
config: FailoverConfigDto,
) -> Result<(), String> {
let mut failover_config = state.failover_config.write().await;
*failover_config = FailoverConfig::from(config);
Ok(())
}
/// 获取切换日志
#[tauri::command]
pub async fn get_switch_log(
state: tauri::State<'_, ResilienceConfigState>,
) -> Result<Vec<SwitchLogEntry>, String> {
let log = state.switch_log.read().await;
Ok(log.clone())
}
/// 清除切换日志
#[tauri::command]
pub async fn clear_switch_log(
state: tauri::State<'_, ResilienceConfigState>,
) -> Result<(), String> {
let mut log = state.switch_log.write().await;
log.clear();
Ok(())
}
/// 添加切换日志条目(内部使用)
#[allow(dead_code)]
pub async fn add_switch_log_entry(
state: &ResilienceConfigState,
from_provider: &str,
to_provider: &str,
failure_type: &str,
) {
let mut log = state.switch_log.write().await;
log.push(SwitchLogEntry {
from_provider: from_provider.to_string(),
to_provider: to_provider.to_string(),
failure_type: failure_type.to_string(),
timestamp: chrono::Utc::now().format("%Y-%m-%d %H:%M:%S").to_string(),
});
// 保留最近 100 条记录
if log.len() > 100 {
log.remove(0);
}
}
+1 -117
View File
@@ -1,79 +1,8 @@
//! 安全与性能配置命令
//! 提示路由命令
use crate::config::save_config;
use crate::AppState;
use serde::{Deserialize, Serialize};
// ========== 速率限制 ==========
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RateLimitConfigResponse {
pub enabled: bool,
pub requests_per_minute: u32,
pub window_secs: u64,
}
#[tauri::command]
pub async fn get_rate_limit_config(
state: tauri::State<'_, AppState>,
) -> Result<RateLimitConfigResponse, String> {
let s = state.read().await;
let c = &s.config.rate_limit;
Ok(RateLimitConfigResponse {
enabled: c.enabled,
requests_per_minute: c.requests_per_minute,
window_secs: c.window_secs,
})
}
#[tauri::command]
pub async fn update_rate_limit_config(
state: tauri::State<'_, AppState>,
config: RateLimitConfigResponse,
) -> Result<(), String> {
let mut s = state.write().await;
s.config.rate_limit.enabled = config.enabled;
s.config.rate_limit.requests_per_minute = config.requests_per_minute;
s.config.rate_limit.window_secs = config.window_secs;
save_config(&s.config).map_err(|e| e.to_string())
}
// ========== 对话管理 ==========
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ConversationConfigResponse {
pub trim_enabled: bool,
pub max_messages: usize,
pub summary_enabled: bool,
}
#[tauri::command]
pub async fn get_conversation_config(
state: tauri::State<'_, AppState>,
) -> Result<ConversationConfigResponse, String> {
let s = state.read().await;
let c = &s.config.conversation;
Ok(ConversationConfigResponse {
trim_enabled: c.trim_enabled,
max_messages: c.max_messages,
summary_enabled: c.summary_enabled,
})
}
#[tauri::command]
pub async fn update_conversation_config(
state: tauri::State<'_, AppState>,
config: ConversationConfigResponse,
) -> Result<(), String> {
let mut s = state.write().await;
s.config.conversation.trim_enabled = config.trim_enabled;
s.config.conversation.max_messages = config.max_messages;
s.config.conversation.summary_enabled = config.summary_enabled;
save_config(&s.config).map_err(|e| e.to_string())
}
// ========== 提示路由 ==========
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct HintRouteEntryResponse {
pub hint: String,
@@ -97,48 +26,3 @@ pub async fn get_hint_routes(
})
.collect())
}
#[tauri::command]
pub async fn update_hint_routes(
state: tauri::State<'_, AppState>,
routes: Vec<HintRouteEntryResponse>,
) -> Result<(), String> {
let mut s = state.write().await;
s.config.hint_router.routes = routes
.into_iter()
.map(|r| lime_core::config::HintRouteSettingsEntry {
hint: r.hint,
provider: r.provider,
model: r.model,
})
.collect();
s.config.hint_router.enabled = !s.config.hint_router.routes.is_empty();
save_config(&s.config).map_err(|e| e.to_string())
}
// ========== 配对认证 ==========
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PairingConfigResponse {
pub enabled: bool,
}
#[tauri::command]
pub async fn get_pairing_config(
state: tauri::State<'_, AppState>,
) -> Result<PairingConfigResponse, String> {
let s = state.read().await;
Ok(PairingConfigResponse {
enabled: s.config.pairing.enabled,
})
}
#[tauri::command]
pub async fn update_pairing_config(
state: tauri::State<'_, AppState>,
config: PairingConfigResponse,
) -> Result<(), String> {
let mut s = state.write().await;
s.config.pairing.enabled = config.enabled;
save_config(&s.config).map_err(|e| e.to_string())
}