桌面版 UI 重构设计文档
对话优先 + 插件化平台(面向个人办公 + 企业定制)
文档信息
| 项 | 内容 |
|---|---|
| 文档类型 | 设计文档(Design Document) |
| 模块 | desktop-app-vue(Electron + Vue 3) |
| 适用版本 | v5.0.2.x → v6.0 |
| 状态 | P0–P9c + Phase 3.3c / 3.4(Hard-Flip Complete) + MainLayout / DIDManagement 拆分 + 启动流程 Critical/Deferred + Shell 真 LLM 接入 + top-10 V5 routes 全部 V6 widget probe(10/10 parity) |
| 最近更新 | 2026-04-26 |
| 关联文档 | docs/design/系统设计_主文档.md、docs/guides/桌面版UI重构_用户指南.md |
修订历史
| 版本 | 日期 | 作者 | 变更摘要 |
|---|---|---|---|
| v0.1 | 2026-04-20 | ChainlessChain 团队 | 初稿:三区对话壳 + 插件化平台 + 企业 Profile |
| v0.2 | 2026-04-20 | ChainlessChain 团队 | P0–P5 实现完成:7 UI + 2 Brand + 5 能力扩展点全部落地,Profile/MDM 端到端联调通过 |
| v0.3 | 2026-04-20 | ChainlessChain 团队 | P6:Slash 命令分发器 + 状态栏 Widget 注册表 + 内置 AdminShortcut;插件声明的 handler/component 现在会真正生效 |
| v0.4 | 2026-04-20 | ChainlessChain 团队 | P7–P9b:/v6-preview 预览壳 + 4 主题 + 4 颗去中心化入口 + 会话 localStorage 持久化 + llm-preview-bridge 桥接 window.electronAPI.llm.chat |
| v0.5 | 2026-04-20 | ChainlessChain 团队 | 发布前测试回归闭环:92 单测 + 5 集成测 + vue-tsc --noEmit + vite build 全绿;E2E 跟随既有 describe.skip 约定;本轮回归无 bug 溢出 |
| v0.6 | 2026-04-21 | ChainlessChain 团队 | Phase 3.3c 补齐 5 个 thin store 单测(rag / wallet / git-hooks / workflow-designer / analytics-dashboard,83 例)+ Phase 3.4 路由守卫 9 例 + 600 store 回归 + 13 plugin 扩展点集成全绿;修复两个 drift(logger.ts IPC .catch() 防御、electron.d.ts 补齐 ConfigAPI 类型) |
| v0.7 | 2026-04-21(下午) | ChainlessChain 团队 | SystemSettings.vue 六级 Pane 拆分(P2P / Speech / LLM / Database / Project / Performance)+ ChatPanel.vue 两级外提(chatPanelUtils.js 7 个纯工具 + useMemoryLeakGuard composable)。SystemSettings 3444 → 1070 行(−69%),ChatPanel 4057 → 3788 行;defineModel('config') + v-model:config 模式保持子组件可直接操作嵌套 config;600/600 store 单测 + vite build 全绿 |
| v0.8 | 2026-04-22 | ChainlessChain 团队 | MainLayout.vue 六级拆分(FavoriteManagerModal / HeaderBreadcrumbs / SyncStatusButton / VoiceCommandHandler / SidebarContextMenu / AppHeader),3203 → 1943 行(−39%);DIDManagement.vue 三级拆分(AutoRepublishSettingsPane / MnemonicModals / IdentityDetailsModal),1390 → 543 行(−61%);Shell 接入真实 LLM(ShellComposer handleSend 流式优先 / 非流式回退 + ConversationStream typing indicator);主进程启动 Critical/Deferred 两段化(bootstrapCritical 阶段 0-5 阻塞 splash / bootstrapDeferred 阶段 6+ + registerCriticalIPC / registerDeferredIPC,回退开关 CHAINLESSCHAIN_LEGACY_BOOT=1);重型渲染器组件(Monaco / Milkdown / Fabric)改 defineAsyncComponent 懒加载,monaco 独立 chunk 3.7MB / gzip 938KB;后端服务 4 路并行轮询,startServices 不阻塞;2000+ 定向单元 + 98/104 集成 + smoke build + lint 全绿 |
| v0.9 | 2026-04-26 | ChainlessChain 团队 | V6 hard-flip 完成 (v5.0.3.1):补齐最后 6 颗 V5→V6 widget probe(did-management 35f4e278b / projects a097596f5 / p2p-messaging 3883a72ec / community 5b5e6fe1d / ai-chat 396d6e7b1 / settings ccbc312fd),凑齐 top-10 V5 routes 全部 V6 widget(settings/knowledge/projects/chat/did/p2p/community/ai/workflow/enterprise)。随即 hard-flip(commit caaddf530):router/v6-shell-default.ts 初始 useV6ShellByDefault false → true;main.ts setV6ShellDefault(raw === true) → setV6ShellDefault(raw !== false) — 配置未设值默认 V6,仅显式 false 才回 V5;SystemSettings.vue 表单 initializer + 描述文字同步翻;opt-out 通道与纯函数 resolveHomeRedirect() 都没动,符合 migration template "no other code needs to move" 承诺。附带 fix 72b826bdf:SystemSettings "立即试用" link 从 /v2 统一到 /v6-preview(与 router redirect 目标一致)。productVersion v5.0.2.55 → v5.0.3.1(V6 hard-flip = minor bump,v5.0.3.0 因 aliyun maven 镜像 502 致 build-android 失败回滚,hotfix android-app/buildSrc/build.gradle.kts 把 google/mavenCentral 提到 aliyun 之前并 bump 到 v5.0.3.1)。19/19 plugin-extension-points integration + 8/8 slash-dispatch + 9/9 v6-shell-default 全绿;同日 web-panel Phase A 三件 (/did + /knowledge + /project-settings) 同步上线(commits f37aa44d0 / d1f22ce2d / c0e96c9e0),621/621 web-panel unit 全绿。预约 remote agent trig_013pjiuMPAUkNyoE4QxVdee8 在 2026-05-10 09:00 Asia/Shanghai 自动巡检部署后 14 天的 git/issue/test/notes 状态 |
1. 概述
1.1 背景
desktop-app-vue/ 当前已累积 97 个 Vue 页面、51 个 Pinia Store、9 个路由分组,功能覆盖 AI 对话、知识库、多智能体协作、DID 身份、P2P 消息、钱包交易、企业管理等。随着模块膨胀,出现以下问题:
- 信息架构碎片化:去中心化身份、P2P、ZKP、钱包等"王牌能力"散落在独立侧栏页面,无法贯穿日常动线。
- 与 CLI / Web 面板定位重叠:Web 面板已有 26 个轻量模块作为 CLI Runtime 的浏览器驾驶舱,桌面版 97 页多为其重型镜像。
- 企业定制能力薄弱:无插件化的品牌、主题、认证、存储、合规扩展点;企业无法在不改核心代码的前提下交付定制版本。
- 差异化特性被埋没:硬件级安全(U-Key)、DID、去中心化协作/交易/社交理应作为贯穿体验的基石,当前却作为独立页面被动展示。
1.2 目标
- 将桌面版定位明确为**"个人办公主力客户端"**,以对话为主干、去中心化能力为动词、硬件安全为环境。
- 将整个 UI 壳设计为插件化平台(类 VSCode / Backstage / Obsidian 模型),首批内置模块全部以 first-party 插件形式存在。
- 为企业定制提供Profile 分发机制(品牌包 + 插件清单 + 策略 + 预置 Space),支持私有 Registry 和 MDM 下发。
- 复用而非重写现有插件基建:既有 CLI file-drop 插件系统与 Desktop DB-backed 插件系统将作为基础,通过增量扩展点方式升级。
1.3 范围
纳入范围:
desktop-app-vue/的渲染进程 UI 壳、路由、状态栏、输入框、Artifact 面板desktop-app-vue/src/main/plugins/的扩展点注册表与 IPC 契约- 企业 Profile 打包格式、私有 Registry 客户端、品牌覆盖层
- 97 个既有页面的分类归并或降级为插件的策略
排除范围:
- CLI (
packages/cli/) 与 Web 面板 (packages/web-panel/) 的独立重构(仅共享插件契约,各自 UI 不在本文档内) - 后端服务 (
backend/) 的改动 - 移动端 (
mobile-app/) - 具体插件内部实现细节(另行立项)
1.4 术语
| 术语 | 含义 |
|---|---|
| Space | 个人空间,一组独立 RAG 知识库 + 提示词 + 联系人圈 + 权限策略(类比 Claude Projects) |
| Artifact | 对话中产生的可签名、可路由、可加密的去中心化对象(文档、签名、交易、P2P 线程、ZKP 凭证等) |
| Slash | 输入框 / 触发的动作面板(skills + CLI 命令的子集) |
| Mention | 输入框 @ 触发的对象引用面板(联系人、笔记、交易、合约) |
| Profile | 企业可分发的定制包:品牌 + 插件清单 + 策略 + 预置 Space |
| Ambient Security | "环境级安全"——U-Key/DID/加密状态常驻界面,不作为独立页面 |
| First-party Plugin | 由 ChainlessChain 官方内置、与第三方插件同契约的核心模块 |
2. 现状分析
2.1 三端 UI 现状对照
| 维度 | CLI (cc) | Web 面板 | 桌面版(当前) |
|---|---|---|---|
| 入口规模 | 109 命令 | 26 视图 | 97 页 / 51 Store |
| 定位 | 脚本 / 自动化 | 轻量远程驾驶舱 | 功能最全,但臃肿 |
| 交互模型 | REPL + slash | 后台模块堆叠 | 侧栏驱动的多页应用 |
| 差异化能力 | headless | 即开即用 | 硬件调用、离线 RAG、系统集成 |
2.2 已有插件基建
| 层 | 文件 | 能力 |
|---|---|---|
| CLI 插件 | packages/cli/src/lib/plugin-autodiscovery.js、plugin-ecosystem.js、commands/plugin.js | 从 ~/.chainlesschain/plugins/ 自动扫描加载;契约:{ name, tools, hooks, commands } |
| 桌面插件 | desktop-app-vue/src/main/plugins/plugin-manager.js(1100+ LOC)、plugin-api.js(650+ LOC)、plugin-loader.js(430+ LOC)、plugin-registry.js、plugin-ipc.js、plugin-sandbox.js | DB 表 plugins 存储;8 个扩展点(已落地 ui.page/ui.menu/ui.component/ai.function-tool;4 个 stub) |
| Skill 加载器 | src/main/ai-engine/cowork/skills/skill-loader.js | 四层优先级:bundled < marketplace < managed < workspace |
| Marketplace UI | PluginMarketplace.vue、PluginMarketplacePage.vue、PluginDetailPage.vue、InstalledPluginsPage.vue | 分类、搜索、分页、安装管理 |
| DB Migration | src/main/database/migrations/001_plugin_system.sql | 7 表:plugins / permissions / dependencies / extensions / settings / event_logs / api_stats |
2.3 企业定制缺口
| 维度 | 缺失内容 |
|---|---|
| 品牌 | 无 logo / favicon / 应用名 / 登录页 / Design Token 覆盖机制 |
| 导航 | 插件页被关到 /plugin/{id}/*,无一级导航权 |
| Artifact | 硬编码渲染,不可扩展 |
| Slash / @ | 无统一入口,无扩展接口 |
| 认证 | 无插件化 auth.provider(LDAP / Azure AD / 企业 SSO) |
| 存储 / 加密 | 无 data.storage / data.crypto 扩展点以接企业 KMS / 对象存储 |
| 合规 | 无 compliance.audit-sink(SIEM)、compliance.policy(DLP / 分级 / 保留) |
| 多租户 | 无 tenant.scope 数据分区 |
| 分发 | 仅本地安装;无私有 Registry、无签名校验、无 Profile 打包 |
3. 总体设计
3.1 设计原则
- 个人办公优先:以"今日 / 空间 / 联系人 / Artifact"为主干,把 AI 当作驱动对象的手段,不是目的。
- 对话即入口(Chat-first):参考 Claude Desktop,单列对话 + 右侧 Artifact 分屏,取消多层侧栏。
- 环境级安全(Ambient Security):U-Key / DID / 加密常驻状态栏与输入框,不作为独立页面。
- 去中心化做成动词:发消息默认 P2P、存文件默认加密 + 可选 IPFS、签名默认硬件;用户不需跳模块。
- 万物皆插件:UI 壳只做平台,Chat / Notes / Wallet 等内置模块与第三方插件同契约。
- 企业通过 Profile 定制:不改核心代码,通过可分发包覆盖品牌、插件、策略、预置内容。
3.2 架构总览
┌───────────────────────────────────────────────────────────────────┐
│ Desktop Shell (极简壳) │
│ ┌─────────────┬─────────────────────────┬───────────────────┐ │
│ │ 左导航 │ 中对话流(主角) │ 右 Artifact │ │
│ │ (Spaces / │ (Chat + Composer) │ (动态渲染) │ │
│ │ 联系人 / │ │ │ │
│ │ 今日) │ │ │ │
│ └─────────────┴─────────────────────────┴───────────────────┘ │
│ Status Bar: [U-Key] [DID] [P2P] [LLM] [Cost] [Tenant] │
├───────────────────────────────────────────────────────────────────┤
│ 扩展点注册表 (Extension Registry) │
│ ui.space │ ui.artifact │ ui.slash │ ui.mention │ ui.status-bar ... │
│ ai.tool │ ai.skill-pack │ data.storage │ data.crypto │ auth.* │
│ brand.* │ compliance.* │ tenant.scope │
├───────────────────────────────────────────────────────────────────┤
│ Plugin Manager + Sandbox + IPC │
├───────────────────────────────────────────────────────────────────┤
│ First-party Plugins │ Third-party / Enterprise │
│ chat-core · spaces · notes · ... │ org-sso · brand-xx · kms-xx │
└───────────────────────────────────────────────────────────────────┘3.3 信息架构
Shell
├─ 左栏
│ ├─ 新会话
│ ├─ 今日 (ui.home-widget 聚合:待办、未读 P2P、钱包动态、AI 晨会)
│ ├─ Spaces (ui.space 模板:工作 / 财务 / 社交 / 学习 / 自定义)
│ └─ 联系人 (DID 圈子)
├─ 中栏:单列对话流 + 输入框 (Slash + Mention + Composer Slot)
├─ 右栏:Artifact 面板(按需展开,生成时自动展开)
└─ 状态栏:ui.status-bar 小组件聚合3.4 核心概念
Spaces:每个 Space 是一个带独立 RAG / 提示词 / 联系人圈 / 权限 / 默认钱包的"身份上下文"。切 Space 即切身份。
Artifacts:对话中产生的对象。与 Claude Desktop 的代码 / 文档 Artifact 不同,ChainlessChain 的 Artifact 是可签名、可路由、可加密的去中心化对象:
| Artifact 类型 | 触发 | 可执行动作 |
|---|---|---|
| Note / Doc | AI 生成文档 | 存本地 / 发 IPFS / 共享给 DID |
| Signed Message | 起草声明 | U-Key 签名 / 发布到社区 |
| Transaction | "给 Alice 转 100" | 预览 → U-Key 签 → 广播 |
| P2P Thread | "联系 Bob" | 展开聊天线程 |
| Credential (VC / ZKP) | "证明我 >18 岁" | 生成 ZKP → 发给验证方 |
| Knowledge Graph | "梳理这些笔记" | 可视化 / 回填 Space RAG |
Slash / Mention:统一交互入口,取消深菜单查找。
/= 动作(138 skills + 109 CLI 命令子集)@= 对象引用(联系人、笔记、交易、合约)
4. 详细设计
4.1 Shell 组件结构
| 组件 | 职责 | 扩展点 |
|---|---|---|
AppShell.vue | 三区布局、快捷键、Command Palette 触发 | — |
Sidebar.vue | 会话列表、Spaces、联系人、今日入口 | ui.home-widget、ui.space |
ConversationStream.vue | 消息列表、DID Chip、流式渲染 | ui.component(消息内嵌) |
Composer.vue | 输入框、附件、Slash、Mention、Composer Slot | ui.slash、ui.mention、ui.composer-slot |
ArtifactPanel.vue | 右栏 Artifact 渲染 + 动作栏 | ui.artifact |
StatusBar.vue | 底部状态栏(U-Key / DID / P2P / LLM / Cost) | ui.status-bar |
CommandPalette.vue | Ctrl+K 全局面板 | 汇总 ui.slash + 系统命令 |
4.2 扩展点清单
在既有 8 个扩展点的基础上新增 / 升级如下:
4.2.1 UI 层
| 扩展点 | 状态 | 说明 |
|---|---|---|
ui.page | ✅ 已有(升级) | 允许进入一级导航,新增 nav: "primary" | "plugin" 字段 |
ui.menu | ✅ 已有 | 保持不变 |
ui.component | ✅ 已有 | Slot 注入,保持不变 |
ui.space | ★ 新增 | 注册 Space 模板(RAG 预设 + 提示词 + 联系人圈 + 权限) |
ui.artifact | ★ 新增 | Artifact 类型 + 渲染器 + 动作按钮 |
ui.slash | ★ 新增 | / 命令注册 |
ui.mention | ★ 新增 | @ 自动补全源注册 |
ui.status-bar | ★ 新增 | 状态栏小组件(U-Key 指示灯本身使用该扩展) |
ui.home-widget | ★ 新增 | 今日页卡片 |
ui.composer-slot | ★ 新增 | 输入框行内槽(签名 UI、成本估算) |
4.2.2 能力层
| 扩展点 | 状态 | 说明 |
|---|---|---|
ai.function-tool | ✅ 已有 | 保持不变 |
ai.llm-provider | ⚠ stub → 落地 | 接入第三方 LLM |
ai.skill-pack | ★ 新增 | 打包一组 Skill 作为插件(桥接 SkillLoader) |
data.importer | ⚠ stub → 落地 | 数据导入 |
data.exporter | ⚠ stub → 落地 | 数据导出 |
data.storage | ★ 新增 | 本地 / IPFS / S3 / 企业对象存储 |
data.crypto | ★ 新增 | 软件 / U-Key / 企业 KMS / HSM |
auth.provider | ★ 新增 | LDAP / Azure AD / 企业 SSO |
net.transport | ★ 新增 | P2P / 企业内网 / 代理 |
lifecycle.hook | ⚠ stub → 落地 | 启动 / 关闭钩子 |
4.2.3 企业 / 品牌层
| 扩展点 | 状态 | 说明 |
|---|---|---|
brand.theme | ★ 新增 | Design Token + 配色 + 字体覆盖 |
brand.identity | ★ 新增 | logo / favicon / 应用名 / 登录页 |
compliance.audit-sink | ★ 新增 | 审计事件外发(SIEM / Splunk) |
compliance.policy | ★ 新增 | DLP / 分级 / 保留策略 |
tenant.scope | ★ 新增 | 组织 / 团队 / 部门维度数据分区 |
4.3 插件契约
{
"id": "string, unique",
"name": "string",
"version": "semver",
"vendor": "string",
"requires": {
"cc": ">=5.0.2",
"ukey": "optional | required | none"
},
"permissions": ["llm:query", "storage:write", "network:p2p", "crypto:sign"],
"contributes": {
"spaces": [{ "id": "string", "template": "object" }],
"artifacts": [{ "type": "string", "renderer": "ref", "actions": "array" }],
"slash": [{ "trigger": "string", "handler": "ref" }],
"mentions": [{ "prefix": "string", "source": "ref" }],
"pages": [{ "route": "string", "nav": "primary|plugin" }],
"tools": ["..."],
"skills": ["..."],
"theme": { "tokens": "object", "logo": "path", "loginPage": "ref" },
"auth": { "providerId": "string", "strategy": "ref" },
"storage": { "id": "string", "adapter": "ref" },
"crypto": { "id": "string", "adapter": "ref" },
"statusBar": ["..."],
"homeWidget": ["..."],
"composerSlot":["..."]
}
}既有 DB 表基本可复用,extensions 表需扩展 type 枚举以容纳新扩展点。
4.4 First-party 插件拆分
当前 97 页按职责归并为以下内置插件(每个插件独立 semver、可独立启用 / 禁用):
| 插件 ID | 覆盖的旧页 |
|---|---|
chat-core | AIChatPage / SessionManagerPage |
spaces-personal | HomePage / ProjectsPage(合并) |
notes | KnowledgeListPage / KnowledgeDetailPage |
rag-local | KnowledgeGraphPage(数据层) |
memory-instinct | MemoryDashboardPage / PermanentMemoryPage |
cowork-runner | CoworkDashboard / CoworkAnalytics |
did-identity | DIDManagement / IdentityLinkingPage |
p2p-messaging | P2PMessaging / FriendsPage / ChannelPage |
wallet | Wallet / TradingHub / HardwareWalletPage |
ukey-crypto | — (状态栏 + Composer Slot) |
ipfs-storage | (作为 data.storage 插件实现) |
audit-local | EnterpriseAuditPage |
skills-manager | SkillManager |
mcp-manager | MCPSettings / MCPServerMarketplace |
plugin-manager | PluginMarketplace 等 |
剩余低频页在 P4 阶段评估下线或归并。
5. 企业定制方案
5.1 Enterprise Profile
Profile 是可分发的定制单元,打包为 .ccprofile(zip):
my-enterprise.ccprofile
├─ profile.json # 元数据:id、版本、目标渠道、强制度
├─ plugins/ # 启用 / 禁用 / 替换清单 + 插件包
├─ brand/ # logo、loading、字体、theme-tokens.json、登录页
├─ policies/ # DLP 规则、保留策略、审计目标
├─ spaces/ # 预置 Space 模板(如"法务"、"财务审批")
├─ skills/ # 企业专属 Skill 包
└─ signature.asc # 签名(企业分发强制)5.2 分发路径
| 场景 | 方式 |
|---|---|
| 个人用户 | 公有 Marketplace,纯插件,不用 Profile |
| 小企业试用 | 从 URL 导入 Profile,签名校验通过后启用 |
| 大企业 | 私有 Registry(管理员配置),MDM 下发 .ccprofile,启动强制加载 |
| 开发联调 | cc plugin link ./my-plugin 或 --profile ./dev.ccprofile 热重载 |
5.3 Profile 强制度
| 模式 | 行为 |
|---|---|
overlay(默认) | 覆盖默认值,用户可另行启用公有插件 |
exclusive | 仅允许 Profile 内的插件;禁用公有 Marketplace |
locked | 用户无权切 Space、禁用插件、修改主题 |
5.4 管理员控制台
作为系统插件 admin-console 交付:
- 租户 / 组织 / 团队管理
- 插件白 / 黑名单
- 策略编辑器(DLP / 分级 / 保留)
- 审计事件查看 / 导出
- 强制 Profile 切换
6. 安全设计
| 风险 | 措施 |
|---|---|
| 恶意插件访问 U-Key | 默认禁用 crypto:sign;首次调用需硬件确认(非对话框) |
| 数据外泄 | data.storage / net.transport 插件需显式声明出境域名;compliance.policy 可拦截 |
| 供应链攻击 | 企业 Profile 强制签名;公有 Marketplace 沿用既有 plugin-ecosystem v2 启发式审查,未来接入 LLM 审查 |
| 权限滥用 | 细粒度 RBAC + 首次调用确认 + 审计日志;组织级可禁用特定权限 |
| 插件升级破坏 | 每插件独立 semver;Profile pin 版本;灰度回滚 |
| 沙箱逃逸 | 复用 PluginSandbox;UI 插件强制 iframe / Shadow DOM 隔离(新增) |
7. 与其他端的关系
| 维度 | CLI | Web 面板 | 桌面版 |
|---|---|---|---|
| 插件内核 | 已有 file-drop | 继承桌面插件子集(无 UI.composer-slot 等) | 完整新内核 |
| 共享扩展点 | ai.*、data.*、net.*、auth.*、compliance.* | 同左 | 同左 |
| 专属扩展点 | REPL 命令 | 轻量 UI 槽 | 全量 UI 槽 + 硬件 |
一次编写能力类插件,三端可用;UI 类插件仅在支持的端生效。
8. 迁移方案
| 阶段 | 交付内容 | 风险 | 依赖 |
|---|---|---|---|
| P0 | AppShell(三区) + 新扩展点注册表(ui.status-bar / ui.home-widget / ui.artifact / ui.slash / ui.mention / ui.space / ui.composer-slot) + Command Palette;旧页面挂成懒路由保留 | 低 | — |
| P1 | Chat / Notes / Spaces / Cowork-Runner 改写为 first-party 插件,验证契约 | 中 | P0 |
| P2 | Artifact 框架 + 5 种核心 Artifact(Note / Sign / TX / P2P / VC),签名内联化 | 中 | P1 |
| P3 | brand.theme / brand.identity + Profile 打包器 + 私有 Registry 客户端 | 中 | P2 |
| P4 | auth.provider / data.storage / data.crypto / compliance.* 插件化;落地 ai.llm-provider stub | 高 | P3,需硬件 / KMS 回归 |
| P5 | admin-console 插件 + 企业 MDM 集成 + 下线重复旧页 + Design Token 统一 | 中 | P4 |
| P6 | Slash 命令分发器 + 状态栏 Widget 组件注册表 + builtin:AdminShortcut;插件声明的 handler / component 字符串现在能被真正执行 | 低 | P5 |
| P7 | Claude Desktop 风格外观重塑:左栏改为 Space 分组的"会话历史列表"+ 固化 4 颗"去中心化"入口(P2P / Trade / Social / U-Key),中区留白气泡对话,右区改为 Artifact 抽屉式(从右滑入),移植 Web Panel 4 主题(dark/light/blue/green)。新路由 /v6-preview 与 /v2 并存,不替换任何现网入口 | 低 | P6 |
P0 完成后可得到"类 Claude Desktop"观感;P3 完成后具备企业定制交付能力;P6 完成后插件贡献的动作点击/快捷键即可真正触发行为;P7 完成后桌面版与 Claude Desktop 的外观对齐,并在左栏底部永远固化去中心化四大差异化能力入口。每阶段独立可发版,不阻塞 CLI / Web 面板迭代。
8.1 实现落点一览(P0–P6)
| 阶段 | 关键文件 / 目录 | 备注 |
|---|---|---|
| P0 | src/renderer/shell/ (AppShell / Sidebar / Composer / StatusBar / ArtifactPanel / ConversationStream) + src/main/plugins/plugin-manager.js(7 个 v6 扩展点) | 路由 /v2 预览 |
| P1 | src/main/plugins-builtin/{chat-core,notes,spaces-personal,cowork-runner}/plugin.json | 通过 loadFirstPartyPlugins() 加载 |
| P2 | src/renderer/types/artifact.ts + src/renderer/stores/artifacts.ts + src/renderer/shell/artifacts/*.vue | 7 种渲染器 + U-Key 签名占位 |
| P3 | src/main/enterprise/profile-packager.js + src/main/enterprise/registry-client.js + src/renderer/shell/theme-applier.ts | ed25519 + sha256 + 私有 Registry |
| P4 | src/main/plugins-builtin/{ai-ollama-default,auth-local,data-sqlite-default,crypto-ukey-default,compliance-default}/plugin.json | 5 个能力默认 stub |
| P5 | src/main/plugins-builtin/admin-console/ + src/renderer/shell/AdminConsole.vue + src/main/enterprise/mdm-manager.js + src/renderer/shell/design-tokens.css | Ctrl+Shift+A 打开 |
| P6 | src/renderer/shell/slash-dispatch.ts + src/renderer/shell/widget-registry.ts + src/renderer/shell/widgets/{AdminShortcut.vue,index.ts} | 13 first-party 插件共用同一分发与注册机制 |
| P7 ✅ | src/renderer/shell-preview/{AppShellPreview,ConversationList,DecentralEntries,ArtifactDrawer}.vue + themes.css + src/renderer/stores/theme-preview.ts + 路由 /v6-preview | 已落地,详见 docs/design/modules/97_桌面版UI_ClaudeDesktop重构计划.md;单测:stores/__tests__/theme-preview.test.ts(11 例)+ shell/__tests__/slash-dispatch.test.ts(8 例) |
8.2 验证
- 单元测试:
tests/unit/renderer/shell/{slash-dispatch,widget-registry,AdminShortcut,AppShell.interaction}.test.ts— 17 例覆盖注册 / 触发 / 键盘快捷键 / 覆盖语义。 - 集成测试:
tests/integration/plugin-extension-points.integration.test.js— 把一个 priority=100 的acme-override插件放到mdmExtractDir,验证getActiveBrandTheme()/getActiveLLMProvider()返回的正是该高优先级贡献。 - E2E 占位:
tests/e2e/v6-shell/admin-console.e2e.test.ts遵循项目describe.skip约定,等 E2E helper 提供带 admin 权限的登录后启用。 - 端到端烟雾(P5 阶段):合成 Acme 品牌插件 →
.ccprofilepack → 假 MDM server 指派 →MDMManager.applyPinnedProfile()解包 →PluginManager加载 →getActiveBrandTheme()返回acme-corporate@100,日志显示registered themes (desc priority): acme-corporate@100 > chainlesschain-default@10。
9. 风险与对策
| 风险 | 影响 | 对策 |
|---|---|---|
| 97 页同时重构成本高 | 阻塞日常迭代 | P0 不动旧页,以挂载方式渐进替换 |
| 插件契约迭代不兼容 | 社区 / 企业插件失效 | 契约 semver 化;plugin-manager v2 与 v1 并存一个大版本 |
| 企业 Profile 签名信任链未建立 | 供应链风险 | 与现有 plugin-ecosystem v2 的 ecogov-v2 治理集成 |
| U-Key 硬件回归测试成本 | P4 进度风险 | 尽早与 ukey-crypto 插件联调,准备模拟器 |
| 多租户数据库改造 | DB 迁移复杂 | P4 之前租户字段默认 default;不强制多租户 |
10. 待决事项
| # | 待决问题 | 需输入方 |
|---|---|---|
| 1 | 品牌覆盖深度:仅换 logo / 配色,还是允许换整套布局? | 产品 |
| 2 | Profile 强制度默认值:overlay / exclusive / locked? | 产品 + 企业客户 |
| 3 | 多租户:单机多租户 vs 每设备单一租户? | 架构 |
| 4 | 公有 Marketplace 默认开启策略?企业版是否强制私有 Registry? | 安全 |
| 5 | plugin-manager 升级:增量扩展(兼容旧)vs 立 v2 契约(干净但需迁移)? | 工程 |
附录 A:目录约定(提议)
desktop-app-vue/
├─ src/
│ ├─ main/
│ │ └─ plugins/
│ │ ├─ plugin-manager.js # 既有,增量升级
│ │ ├─ extension-registry.js # 新增:统一扩展点注册
│ │ └─ profile-loader.js # 新增:Profile 加载与校验
│ └─ renderer/
│ ├─ shell/ # 新增:AppShell / Sidebar / Composer ...
│ ├─ plugins-builtin/ # 新增:first-party 插件源
│ └─ views/ # 既有 97 页(渐进迁移)
└─ profiles/
└─ default.ccprofile # 默认 Profile附录 B:相关文档
- 用户指南:
docs/guides/桌面版UI重构_用户指南.md - 系统设计主文档:
docs/design/系统设计_主文档.md - 安全机制:
docs/design/安全机制设计.md
附录 C:v0.8 拆分与启动优化(2026-04-22)
本附录记录 v0.8 实施细节,补充「修订历史」表格里的摘要。
C.1 MainLayout.vue 拆分(3203 → 1943 行,−39%)
从主布局抽出 6 个独立 SFC,归入 src/renderer/components/layout/:
| 子组件 | 行数 | 职责 | 通信方式 |
|---|---|---|---|
FavoriteManagerModal.vue | 151 | 「管理快捷访问」弹窗(Favorites / Recents Tab) | defineModel('open') + @quick-access-click(item) + 父传 iconResolver prop |
HeaderBreadcrumbs.vue | 170 | 7 路由前缀面包屑 + handleBreadcrumbClick | 内部 useRoute()/useRouter(),父传 iconResolver |
SyncStatusButton.vue | 97 | 全局同步状态按钮 | 完全自包含(自管 3 refs + 3 监听器) |
VoiceCommandHandler.vue | 584 | VoiceFeedbackWidget + 75 条语音命令 + 7 handler | 内部 useRouter/useAppStore/useSocialStore;@show-command-palette 回传父 |
SidebarContextMenu.vue | 97 | 侧栏右键菜单(a-dropdown + 14 调用点) | defineExpose({show(event,item)}) 命令式;父留 showContextMenu(event,key) 薄包装做 menuConfig lookup |
AppHeader.vue | 210 | <a-layout-header> 整块(sidebar 切换 / 面包屑 / Ctrl+K / Sync / AI / 语言 / 通知 / 用户菜单) | 自行 useRoute/useAppStore;@show-command-palette 上传;iconResolver 透传 HeaderBreadcrumbs |
模式约束:
- 自包含优先(SyncStatusButton / VoiceCommandHandler / SidebarContextMenu),减少父
ref数量。 - 跨层级状态(面包屑的路由对象、iconResolver 40-entry map)只传一层 prop,不 provide/inject。
- 命令式 API 只用于「父主动触发子弹窗」场景(SidebarContextMenu.show / IdentityDetailsModal.open),普通可见性仍用
defineModel('open')。
C.2 DIDManagement.vue 拆分(1390 → 543 行,−61%)
三个子组件归入 src/renderer/components/did/:
AutoRepublishSettingsPane.vue(148 行) — 自动重发布模态 + 状态轮询 + 保存 / 立即发布 handler;defineModel('open')+@status-change(status)+@after-republish。MnemonicModals.vue(308 行) — 助记词两弹窗合一(创建后显示 + 详情导出)。defineExpose({showDisplay(mnemonic), triggerExport(identity)});导出时内嵌Modal.confirm安全提醒。IdentityDetailsModal.vue(约 421 行) — 身份详情 / DID Document / QR 三弹窗合一 + DHT publish/unpublish。defineExpose({open(identity), openQR(did)});@identities-refreshed+@export-mnemonic(identity)(父桥接到 MnemonicModals.triggerExport)。
C.3 V6 Shell 真 LLM 接入 + Phase 3.4 重定向目标切换
- Phase 3.4 软开关重定向目标变更:
router/v6-shell-default.ts::resolveHomeRedirect的 opt-in 重定向目标由/v2改为/v6-preview;勾上ui.useV6ShellByDefault后根路径直接进入 Claude-Desktop 风格预览壳(此前是 V2 壳)。动机:V6 shell 已接入真 LLM,可直接作为默认壳体验,/v2仍保留为次级入口。9/9 路由单测已同步,JSDoc 注释已对齐。 - ShellComposer.vue
handleSend():- 读
conversationStore.active?.messages→toBridgeMessages(history, text)组 payload(末尾挂新 user 消息)。 - 先
conversationStore.appendMessage("user", text)清输入;setGenerating(true)。 isLlmAvailable()false → push 友好提示 → return。isStreamAvailable()→beginStreamingAssistant()拿到streamId→sendLlmChatStream(text, liveText => updateAssistantContent(streamId, liveText));成功finalizeStreamingAssistant(streamId, reply);失败removeMessage(streamId)fallthrough 到非流式。- 非流式:
sendLlmChat(payload);成功appendAssistantMessage(reply);失败appendAssistantMessage("LLM 调用失败:" + reason)。
- 读
- ConversationStream.vue:
- 消息源改由
useConversationPreviewStore()提供;onMounted调restore()。 - 新增 typing indicator(3 点波浪
@keyframes shell-typing),当isGenerating且最后一条不是已有内容的 assistant 时显示。 - 删除
did-chip视觉元素(简化message-meta)。
- 消息源改由
C.4 主进程启动 Critical / Deferred 两段化
核心动机:缩短 splash 显示时间 + 避免 IPC 二次注册与 ipc-guard.resetAll() 竞态(症状:llm:chat 二次注册后"无法发送消息")。
| 阶段 | Bootstrap 函数 | IPC 注册 | Splash 进度 |
|---|---|---|---|
| Critical(0-5) | bootstrapCritical():Hooks / 核心 / 文件 / LLM / 会话 / RAG+Git | registerCriticalIPC():volcengine / secureStorage / session / taskTracker / manus | 5% → 55% |
| Deferred(6+) | bootstrapDeferred():技能 / 工具 / 高级 | registerDeferredIPC():skillTool / multiAgent / workflow / recording | 55% → 90% |
| 主窗口 | — | createWindow() 里的 setupIPC() 只调一次 | 95% |
关键实现点:
bootstrapApplication()保留为兼容 wrapper(依次跑 Critical + Deferred),避免外部调用方一次性改动。CHAINLESSCHAIN_LEGACY_BOOT=1走runLegacyBoot()单阶段旧流程作回退开关。createInitialSetupIPC()独立提成:无论数据库是否就绪都要注册,避免 App.vue 首屏报「检查设置状态失败」。initializeExternalFileManager()因依赖 p2pManager+ragManager 归入延迟阶段。
C.5 重型渲染器组件懒加载
5 处 import 改 defineAsyncComponent(() => import(...)):
| 页面 / 组件 | 懒加载目标 | 估算体积 |
|---|---|---|
FileEditor.vue | MonacoEditor.vue | ~5MB |
KnowledgeDetailPage.vue | MarkdownEditor.vue(Milkdown) | ~1.5MB |
DesignEditorPage.vue | DesignCanvas.vue(Fabric.js) | ~1MB |
ProjectDetailPage.vue | CodeEditor.vue / MarkdownEditor.vue / WebDevEditor.vue(均基于 Monaco) | 共 ~5MB |
实测 vite build 产出:monaco-D050Xe0j.js 独立 chunk 3.7MB / gzip 938KB,首屏无需强拉。
C.6 后端服务并行轮询
BackendServiceManager.waitForServices():
- 4 个服务(Skill Engine 9101 / Data Engine 9102 / Collaboration Engine 9103 / Project Service 9090)原串行 4×30s → 改并行
Promise.all,单服务maxRetries=10×retryDelay=1000ms。 startServices()不再await waitForServices();将 Promise 赋给this.servicesReady,调用方可按需await。- 开发环境(非 packaged)直接
Promise.resolve()(假设 Docker)。
C.7 回归覆盖
| 维度 | 结果 |
|---|---|
| Store 单元(23 文件) | 600/600 |
| Shell + router + bootstrap(5 文件) | 76/76 |
| Skill-handlers + ipc-guard + bootstrap(3 文件) | 285/285 |
| Vue 组件单元 | 124/125(1 skip) |
| AI + core + multi-agent 单元 | 411/413(2 skip) |
| Database + enterprise + did + knowledge 单元 | 1456/1464(8 skip · 3 stderr 错误为预存问题) |
| shell-preview 组件/服务/widgets | 51/51 |
| 集成测试(9 文件) | 98/104(6 skip) |
| Smoke | vite build + build:main 成功;eslint 0 error / 237 style warn |
| E2E | Playwright 枚举 1017 / 163 文件;环境健康 80% |
- 既有插件实现:
desktop-app-vue/src/main/plugins/
