From 26f50cd74643fc06ce39c250ffd507b3cdcaceea Mon Sep 17 00:00:00 2001 From: iven Date: Thu, 9 Apr 2026 12:15:34 +0800 Subject: [PATCH] =?UTF-8?q?fix(butler):=20runtime=20fixes=20=E2=80=94=20SQ?= =?UTF-8?q?Lite=20mode=3Drwc=20+=20React=20hooks=20ordering?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add ?mode=rwc to pain.db SQLite URL so it creates the file on first run - Move useUIModeStore hook before conditional returns in App.tsx to fix React "Rendered more hooks than during the previous render" error --- desktop/src-tauri/src/lib.rs | 2 +- desktop/src/App.tsx | 30 ++++++++++++++++++++++-------- 2 files changed, 23 insertions(+), 9 deletions(-) diff --git a/desktop/src-tauri/src/lib.rs b/desktop/src-tauri/src/lib.rs index 0ec9173..b2ac78a 100644 --- a/desktop/src-tauri/src/lib.rs +++ b/desktop/src-tauri/src/lib.rs @@ -165,7 +165,7 @@ pub fn run() { std::fs::create_dir_all(&pain_db_dir).expect("Failed to create intelligence dir"); let db_path = pain_db_dir.join("pain.db"); - let db_url = format!("sqlite:{}", db_path.display()); + let db_url = format!("sqlite:{}?mode=rwc", db_path.display()); let pool = rt.block_on(sqlx::SqlitePool::connect(&db_url)) .expect("Failed to connect pain storage SQLite pool"); diff --git a/desktop/src/App.tsx b/desktop/src/App.tsx index 55d251d..f13ef1b 100644 --- a/desktop/src/App.tsx +++ b/desktop/src/App.tsx @@ -28,7 +28,7 @@ import type { Clone } from './store/agentStore'; import { createLogger } from './lib/logger'; import { startOfflineMonitor } from './store/offlineStore'; import { useUIModeStore } from './store/uiModeStore'; -import { SimpleTopBar } from './components/SimpleTopBar'; +import { SimpleSidebar } from './components/SimpleSidebar'; const log = createLogger('App'); @@ -65,6 +65,7 @@ function App() { const loadHands = useHandStore((s) => s.loadHands); const { setCurrentAgent } = useChatStore(); const { isNeeded: onboardingNeeded, isLoading: onboardingLoading, markCompleted } = useOnboarding(); + const uiMode = useUIModeStore((s) => s.mode); // Proposal notifications const { toast } = useToast(); @@ -445,17 +446,30 @@ function App() { ); } - const uiMode = useUIModeStore((s) => s.mode); - - // Simple mode: single-column layout with top bar only + // Simple mode: sidebar + chat + detail drawer (Trae Solo style) if (uiMode === 'simple') { return ( -
- useUIModeStore.getState().setMode('professional')} /> -
- +
+ {/* 简洁侧边栏: 对话 + 行业资讯 */} + setView('settings')} + onToggleMode={() => useUIModeStore.getState().setMode('professional')} + /> + + {/* 主聊天区域 */} +
+ setShowDetailDrawer(true)} />
+ {/* 详情抽屉 - 简洁模式仅 状态/Agent/管家 */} + setShowDetailDrawer(false)} + title="详情" + > + + + {/* Hand Approval Modal (global) */}