Tauri 2 + React 桌面端开发:从 CLI 到 GUI 的进化
摘要终端界面虽然高效但不是所有开发者都喜欢黑屏白字。cc-haha 的桌面端基于 Tauri 2 和 React 构建将 AI 编程助手的能力封装到一个现代化的图形界面中。本文深入解析三层架构设计、WebSocket 实时通信、12 个 Zustand Store 的状态管理以及从开发到打包的完整流程。一、为什么需要桌面端CLI 终端界面TUI虽然轻量高效但存在明显的用户体验瓶颈历史会话浏览困难终端里翻找昨天的对话很麻烦代码 Diff 展示受限终端里的 diff 不如图形界面直观权限确认打断心流弹出的终端对话框容易让人手忙脚乱多项目切换不友好每次切换都要重新 cd 到项目目录cc-haha 的桌面端把会话管理、代码 Diff、权限确认、提供商配置、定时任务和 IM 适配器集中到一个图形化工作台里。CLI TUI 模式适合: 终端爱好者适合: 快速任务适合: 低资源环境Desktop GUI 模式适合: 日常开发适合: 多项目管理适合: 可视化需求适合: 非技术用户二、三层架构设计桌面端不是简单的套壳网页而是一个完整的三层架构应用渲染错误:Mermaid 渲染失败: Parse error on line 26: ... --|ws://127.0.0.1:{port}| S2 S1 -- -----------------------^ Expecting SQE, DOUBLECIRCLEEND, PE, -), STADIUMEND, SUBROUTINEEND, PIPE, CYLINDEREND, DIAMOND_STOP, TAGEND, TRAPEND, INVTRAPEND, UNICODE_TEXT, TEXT, TAGSTART, got DIAMOND_START2.1 第一层Tauri 主进程Rust职责窗口管理、Sidecar 进程编排、原生 API 桥接。核心文件desktop/src-tauri/src/lib.rs只暴露两个 CommandCommand说明get_server_url前端获取 Server Sidecar 的 HTTP 地址restart_adapters_sidecar热重启 Adapter Sidecar启动流程Adapter SidecarWebViewServer SidecarTauri 主进程Adapter SidecarWebViewServer SidecarTauri 主进程绑定 127.0.0.1:0获取 OS 随机端口TCP 探活轮询150ms 间隔 10s 超时注入 ADAPTER_SERVER_URLreserve_local_port()start_server_sidecar(port)wait_for_server()加载 React 应用GET /health200 OKstart_adapters_sidecar()2.2 第二层Server SidecarBun职责HTTP REST API WebSocket 网关 会话管理 协议代理。src/server/ ├── index.ts # 入口 ├── server.ts # HTTP 服务器 (Bun.serve) ├── router.ts # 路由注册 ├── sessionManager.ts # 会话管理器 ├── api/ # REST 路由层 (14 个模块) ├── services/ # 业务服务层 (14 个模块) ├── ws/ # WebSocket 处理 ├── proxy/ # API 协议代理转换 ├── middleware/ # auth、cors、errorHandler └── config/ # Provider 预设2.3 第三层CLI 子进程职责AI 对话核心、工具执行、Agent 编排。Server 为每个 Session spawn 一个 CLI 子进程通过stdin/stdout JSON 通信。三、状态管理12 个 Zustand Store桌面端使用 Zustand 按领域拆分为 12 个 Store18%14%10%10%10%8%8%8%5%5%2%2%Zustand Store 分布chatStoresessionStoresettingsStoreproviderStoreuiStoretabStoretaskStoreteamStoreagentStoreskillStoreadapterStorecliTaskStore3.1 核心 Store 详解Store核心状态持久化chatStoreper-session 消息、流式状态、权限请求Server JSONLsessionStore会话列表、activeSessionId、项目筛选Server JSONLtabStore标签页顺序localStoragesettingsStore权限模式、当前模型、effort、语言Server APIproviderStoreProvider 列表、activeIdServer APItaskStore定时任务、运行记录Server API3.2 chatStore 的多会话隔离设计// 关键设计RecordsessionId, StateinterfaceChatState{sessions:Recordstring,SessionChatactiveSessionId:string|null}interfaceSessionChat{messages:Message[]isStreaming:booleanpendingPermissions:PermissionRequest[]tokenStats:TokenStats}这种设计确保切换标签页时各会话的状态完全隔离不会出现消息串台。3.3 数据流用户操作 → Component → Store → API/WebSocket → Server → Store → Component 重渲染四、WebSocket 实时通信4.1 协议设计客户端 → 服务端user_messagepermission_responseset_permission_modestop_generationping服务端 → 客户端connectedcontent_start/deltathinkingtool_use_completepermission_requestmessage_completeerror4.2 连接管理// WebSocket 管理器核心逻辑classWebSocketManager{privatews:WebSocket|nullnullprivatereconnectCount0privatemessageQueue:Message[][]connect(sessionId:string){this.wsnewWebSocket(ws://127.0.0.1:${port}/ws/${sessionId})this.ws.onopen(){this.reconnectCount0this.flushQueue()this.startHeartbeat()}this.ws.onclose(){constdelayMath.min(1000*2**this.reconnectCount,30000)setTimeout(()this.connect(sessionId),delay)this.reconnectCount}}send(message:Message){if(this.ws?.readyStateWebSocket.OPEN){this.ws.send(JSON.stringify(message))}else{this.messageQueue.push(message)// 离线缓冲}}}五、HTTP API 一览5.1 会话管理方法端点说明GET/api/sessions列表支持 project/limit/offset 筛选POST/api/sessions创建GET/api/sessions/:id/messages历史消息DELETE/api/sessions/:id删除5.2 模型与提供商方法端点说明GET/PUT/api/models/current当前模型GET/api/models可用模型列表CRUD/api/providers提供商管理POST/api/providers/:id/test测试连接5.3 其他方法端点说明CRUD/api/scheduled-tasks定时任务GET/api/teamsAgent 团队GET/PUT/api/adaptersIM 适配器配置GET/health健康检查六、协议代理层Server 内置代理层统一不同 AI 提供商的 API 格式格式典型提供商anthropicAnthropic、OpenRouter、MiniMaxopenai_chatOpenAI、DeepSeek、Ollama、通义千问openai_responsesOpenAI Responses API每个 Provider 配置 4 个模型槽位main、haiku、sonnet、opus前端按槽位名调用代理层自动映射为实际模型名。七、开发到打包的完整流程7.1 开发环境启动# 终端 1启动 Server SidecarSERVER_PORT3456bun run src/server/index.ts# 终端 2启动桌面前端cddesktopbun run dev--host127.0.0.1--port2024# 浏览器打开openhttp://127.0.0.1:20247.2 构建 Sidecarcddesktop bun run build:sidecars# 输出到 desktop/src-tauri/binaries/# 包含claude-sidecar-server# claude-sidecar-cli# claude-sidecar-adapters7.3 Tauri 打包cddesktop/src-tauricargotauri build# 输出# - macOS: desktop/src-tauri/target/release/bundle/# - Windows: desktop/src-tauri/target/release/bundle/7.4 平台差异处理// desktop/src-tauri/src/lib.rs 中的平台差异#[cfg(target_os macos)]fnsetup_window(app:mutApp){// macOS: overlay titlebar 自定义菜单set_overlay_titlebar(true);setup_macos_menu();}#[cfg(target_os windows)]fnsetup_window(app:mutApp){// Windows: 隐藏原生标题栏前端自定义渲染window.set_decorations(false);// 前端渲染 TitleBar WindowControls}八、前端技术栈技术版本职责React18UI 框架Zustand5状态管理Vite6构建工具Tailwind CSS4样式Shiki4代码高亮Mermaid11图表渲染marked DOMPurify-Markdown 渲染react-diff-viewer4Diff 展示总结cc-haha 的桌面端是一个现代化的跨平台桌面应用三层架构Tauri 主进程 → Server Sidecar → CLI 子进程层层隔离12 个 Zustand Store按领域拆分chatStore 采用RecordsessionId, State实现多会话隔离WebSocket 实时通信支持自动重连、心跳保活、消息队列缓冲协议代理层统一 anthropic/openai_chat/openai_responses 三种格式Sidecar 模式Server 和 Adapter 作为独立进程确保稳定性开发建议修改前端代码后不需要重启 ServerVite HMR 自动刷新测试 IM 适配器时建议新建 session 并选择真实存在的工作目录如果 3456 端口被占用先lsof -iTCP:3456找到旧进程并 kill参考资料cc-haha 桌面端快速上手cc-haha 桌面端架构设计Tauri 2 官方文档Zustand 状态管理Bun.serve HTTP/WebSocket从终端到图形界面cc-haha 的桌面端不是对 CLI 的替代而是对使用场景的补充。喜欢终端的继续用 TUI需要可视化管理的打开桌面端——选择权在用户手中。

相关新闻

AIO Sandbox 实战集成指南:终端、浏览器自动化与 AI Agent 全场景示例

AIO Sandbox 实战集成指南:终端、浏览器自动化与 AI Agent 全场景示例

AI Agent后端MCP 服务浏览器控制Agent 评测 【免费下载链接】sandbox All-in-One Sandbox for AI Agents that combines Browser, Shell, File, MCP and VSCode Server in a single Docker container. 项目地址: https://gitcode.com/gh_mirrors/sandbox103/sandbox…

2026/10/10 8:44:18 阅读更多 →
OWASP Top 10 2017 开发者下一步行动指南:建立可复用的安全流程与标准安全控制

OWASP Top 10 2017 开发者下一步行动指南:建立可复用的安全流程与标准安全控制

应用安全 【免费下载链接】Top10 Official OWASP Top 10 Document Repository 项目地址: https://gitcode.com/gh_mirrors/top/Top10 点击查看 免费下载 本指南以 OWASP Top 10 官方文档仓库中的《开发者的下一步》(2017/ja/0xb0-next-devs.md 及英文版…

2026/10/10 8:44:18 阅读更多 →
StackExchange.Redis 脚本编程实战指南:Lua EVAL/EVALSHA 与低分配 RespResult 结果读取

StackExchange.Redis 脚本编程实战指南:Lua EVAL/EVALSHA 与低分配 RespResult 结果读取

后端缓存数据库客户端消息队列 【免费下载链接】StackExchange.Redis The Redis client for .NET 项目地址: https://gitcode.com/gh_mirrors/st/StackExchange.Redis 点击查看 免费下载 导读 在 Redis 生态中,Lua 脚本(EVAL/EVALSHA&#…

2026/10/10 8:43:15 阅读更多 →

最新新闻

N8N企业级落地为何频频翻车?从部署到治理的实战避坑指南

N8N企业级落地为何频频翻车?从部署到治理的实战避坑指南

1. 为什么N8N越火,企业落地越容易翻车过去两年,我在不同公司和企业客户那边见过太多次N8N的“高开低走”:技术负责人看到N8N的开源界面、可视化编排和几百个现成节点,觉得终于找到了一个能替代传统接口开发的“万能胶水”&#xf…

2026/10/11 10:58:28 阅读更多 →
Java炸弹人游戏源码解析:从地图生成到碰撞检测的实战指南

Java炸弹人游戏源码解析:从地图生成到碰撞检测的实战指南

简介:Java炸弹人游戏资源包是一份面向Java初学者和游戏开发爱好者的完整项目源码,以经典炸弹人玩法为载体,展示从游戏窗口搭建、地图初始化到玩家交互、胜负判断的完整实现过程。压缩包共37个文件,含9个java源文件、12个class编译…

2026/10/11 10:58:28 阅读更多 →
把“人味“变成分数:Human-Likeness 盲测第一的含金量到底几成

把“人味“变成分数:Human-Likeness 盲测第一的含金量到底几成

把"人味"变成分数:Human-Likeness 盲测第一的含金量到底几成 【免费下载链接】Hemmingway-1 项目地址: https://ai.gitcode.com/hf_mirrors/Altworld/Hemmingway-1 让大模型写一封给房东的短信、一条给同事的告别留言,是当下 AI 写作最…

2026/10/11 10:58:28 阅读更多 →
C#零配置网络:链路本地地址与mDNS服务发现实战

C#零配置网络:链路本地地址与mDNS服务发现实战

简介:ZeroConfiOS是一个面向C#开发者、聚焦网络服务自动化部署的开源工具库,专为解决动态网络环境下服务发布与IP地址自适应配置难题而设计,适用于物联网设备、跨平台微服务及多网卡场景下的快速集成。资源包共43个文件,含32个核心…

2026/10/11 10:58:28 阅读更多 →
三国人物关系知识图谱可视化与问答系统:构建与工程实现

三国人物关系知识图谱可视化与问答系统:构建与工程实现

简介:基于知识图谱的三国人物关系可视化与问答系统,是一份面向计算机相关专业学生、教师及初学者的完整Python工程项目。项目将三国演义文本数据抽取为实体与关系,构建知识图谱,并配套网页端可视化界面与自然语言问答模块&#xf…

2026/10/11 10:58:28 阅读更多 →
识别虚假技术资源:Bishop深度学习2024真伪验证指南

识别虚假技术资源:Bishop深度学习2024真伪验证指南

简介:这是一本由机器学习权威Christopher M. Bishop与Hugh Bishop合著的深度学习前沿教材,面向高校研究生、AI研究人员及具备数学与编程基础的进阶学习者,系统构建从神经网络基础到Transformer、图神经网络等现代架构的理论框架。资源为单文件…

2026/10/11 10:57:28 阅读更多 →

日新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 10:38:42 阅读更多 →