feat: MetonaAI Desktop 初始项目
- Electron + React + TypeScript 架构 - 三栏布局: Sidebar | ChatPanel | DetailPanel - 9 个内置工具 (文件系统/网络/记忆/命令) - SQLite 持久化 (better-sqlite3) - MUI 暗色/亮色主题系统 - Agent Loop ReAct 状态机引擎 - DeepSeek / Agnes AI / Ollama Provider 适配器 - MCP 协议集成 - 系统托盘 + 全局快捷键 - Tailwind CSS v4 + Tailwind Merge - 修复: Sidebar 缺失 TextField 导入导致黑屏
This commit is contained in:
+72
@@ -0,0 +1,72 @@
|
||||
/**
|
||||
* MetonaAI Desktop — 根组件
|
||||
*
|
||||
* 三栏布局:Header + [Sidebar | Chat | DetailPanel] + StatusBar
|
||||
* + ToastContainer + SettingsModal + OnboardingWizard
|
||||
*
|
||||
* 连接所有 Store,注册快捷键,初始化主题。
|
||||
*/
|
||||
|
||||
import { ThemeProvider, CssBaseline } from '@mui/material';
|
||||
import { useEffect } from 'react';
|
||||
import { Header } from '@renderer/components/layout/Header';
|
||||
import { Sidebar } from '@renderer/components/layout/Sidebar';
|
||||
import { DetailPanel } from '@renderer/components/layout/DetailPanel';
|
||||
import { StatusBar } from '@renderer/components/layout/StatusBar';
|
||||
import { ChatPanel } from '@renderer/components/chat/ChatPanel';
|
||||
import { SettingsModal } from '@renderer/components/settings/SettingsModal';
|
||||
import { OnboardingWizard } from '@renderer/components/onboarding/OnboardingWizard';
|
||||
import { CommandPalette } from '@renderer/components/CommandPalette';
|
||||
import { ToastContainer } from '@renderer/components/ToastContainer';
|
||||
import { useTheme } from '@renderer/hooks/useTheme';
|
||||
import { useKeyboardShortcuts } from '@renderer/hooks/useKeyboardShortcuts';
|
||||
import { useAgentStream } from '@renderer/hooks/useAgentStream';
|
||||
import { useUIStore } from '@renderer/stores/ui-store';
|
||||
import { useAgentStore } from '@renderer/stores/agent-store';
|
||||
import { metonaDarkTheme, metonaLightTheme } from '@renderer/lib/theme';
|
||||
|
||||
export default function App(): React.JSX.Element {
|
||||
useTheme();
|
||||
useKeyboardShortcuts();
|
||||
useAgentStream();
|
||||
|
||||
const resolvedTheme = useUIStore((s) => s.resolvedTheme);
|
||||
const muiTheme = resolvedTheme === 'dark' ? metonaDarkTheme : metonaLightTheme;
|
||||
|
||||
// 启动时从数据库恢复状态
|
||||
useEffect(() => {
|
||||
if (window.metona?.config?.get) {
|
||||
window.metona.config.get('onboarding.completed').then((v) => {
|
||||
if (v === true) useUIStore.getState().setOnboardingCompleted(true);
|
||||
}).catch(() => {});
|
||||
Promise.all([
|
||||
window.metona.config.get('llm.provider'),
|
||||
window.metona.config.get('llm.model'),
|
||||
]).then(([provider, model]) => {
|
||||
if (provider || model) useAgentStore.getState().setProvider(provider ?? '', model ?? '');
|
||||
}).catch(() => {});
|
||||
}
|
||||
}, []);
|
||||
|
||||
return (
|
||||
<ThemeProvider theme={muiTheme}>
|
||||
<CssBaseline />
|
||||
<div
|
||||
className="h-screen w-screen flex flex-col overflow-hidden select-none"
|
||||
style={{ background: muiTheme.palette.background.default, color: muiTheme.palette.text.primary }}
|
||||
>
|
||||
<Header />
|
||||
<div className="flex-1 flex overflow-hidden min-h-0">
|
||||
<Sidebar />
|
||||
<ChatPanel />
|
||||
<DetailPanel />
|
||||
</div>
|
||||
<StatusBar />
|
||||
<SettingsModal />
|
||||
<OnboardingWizard />
|
||||
<CommandPalette />
|
||||
<ToastContainer />
|
||||
</div>
|
||||
</ThemeProvider>
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user