Skip to content

fix(buddy): stabilize desktop notification navigation - #229

Closed
QAyong wants to merge 53 commits into
useLexora:masterfrom
QAyong:codex/space-folder-default-name
Closed

QAyong wants to merge 53 commits into
useLexora:masterfrom
QAyong:codex/space-folder-default-name

Conversation

@QAyong

@QAyong QAyong commented Sep 29, 2026

Copy link
Copy Markdown
Contributor

变更内容

修复桌面通知点击时窗口未弹出或无法返回原会话的问题。通知对象在应用运行期间由主进程持有;导航目标会跨窗口与页面初始化暂存并确认,消息定位在实际滚动完成后结束。补充 Windows 开发版通知注册,并新增中文 bug 记录。

验证

  • Windows 开发版真实操作已通过:会话 A 生成内容时切换到 B 并最小化;A 完成后点击系统通知,桌面窗口恢复并跳回 A。该场景由用户在真实桌面环境实际测试通过。
  • Electron 构建及类型检查通过。
  • 相关 ESLint 检查通过。
  • 通知服务与窗口目标相关测试共 7 条通过。

范围

通知中心中过期通知点击、应用完全退出后点击旧通知等场景未包含在本次实际验证中。

# Conflicts:
#	apps/buddy/package.json
#	pnpm-lock.yaml
上游新增 7 个提交:pi 升级至 0.87.1 (useLexora#202)、Fast 模式改用模型元数据 (useLexora#203)、内置模型目录动态刷新、桌面运行配置图标 (useLexora#205)、发布 v0.9.2、按需加载技能并缓存元数据 (useLexora#206)、代理握手断线重连修复。

冲突解决(10 个文件,均取上游版本):技能懒加载部分本地 c5fdc63 与上游 useLexora#206 属同一改动,上游版更完整(metadataOnly 轻量目录、generation 失效、SKILL_CHANGED 校验、LRU 缓存);composer 不再传 packageRevision,因 metadataOnly 目录下 skill.revision 已由包哈希变为内容哈希,继续传会导致 SKILL_CHANGED;pi 0.87.1 补丁与 pnpm-workspace/lockfile 与 useLexora#202 重复;modelSelection.ts 本地新增的 gpt-6 硬编码已由 useLexora#203 改为按模型元数据判断。
均为行为等价的格式修正,且属合并前既有问题(上游合并未触碰这些文件):DesktopShell.vue 的 import 分组顺序、useWorkbenchPanelResize.ts 两个单语句 if 补花括号、useTaskIndex.spec.ts 单行 273 字符的 fixture 调用拆行、BuddyChatAgentTurn.vue 的 v-bind 字符串字面量改为静态属性。

修复后 lint 与 type-check 通过,受影响的 4 个 spec 共 34 用例通过;pnpm check:buddy 得以从第一步 lint 推进至 Windows 打包步骤。
描述移除独立主导航侧栏、将设置/插件/自动化/通知收进空间侧栏底部入口的设计,仅设计未实现。
- 目标改为「合并侧栏」:删除独立主导航侧栏,其底部入口并入空间侧栏
- 明确空间侧栏自身的置顶/空间/任务结构与交互保持现状,不新增分组
- 新增非任务页面(自动化、插件、设置)左下角「返回」入口
- 术语按代码现状更正为「空间」「任务」
- 未决事项:加载更多本次不实现;头像归属通用页;返回入口形态
按 Spec-006 把桌面端两根左侧竖栏合并为一根:

- 删除独立主导航侧栏 DesktopAppSidebar,其底部功能入口移入空间侧栏底部
- 空间侧栏新增固定底部入口:设置、插件、自动化、通知;通知保留未读徽标与原有面板
- 空间侧栏标题常显,成为桌面端唯一左侧竖栏
- 顶部隐藏按钮改为只控制该侧栏,折叠状态沿用任务侧栏偏好,替代 desktop.sidebarCollapsed
- 自动化、插件、插件详情页左下角新增「返回」入口;设置页返回入口位于设置侧栏底部
- 头像与个人资料入口从侧栏移入设置「通用」页,账户组件按分层约定迁入 settings 模块
- 更新 extensionContributions e2e 的导航方式(底部入口 + 返回)
- 新增 DesktopSidebarFooter、DesktopBackToTasksButton 单元测试
- DesktopSidebarFooter 新增 appVersion 属性,在通知入口右侧显示 vX.Y.Z
- 版本号右对齐并贴住侧栏右边框,侧栏拖宽/拖窄时跟随右边缘;过窄时省略号截断
- 版本信息缺失时不渲染
- 补充单元测试:版本号渲染位置与缺失场景
- 移除上一版新增的版本号显示及其属性传递
- 通知入口从第四个位置移到行尾,用 margin-left:auto 贴住侧栏右边框,随侧栏拉伸跟随右边缘
- 单元测试改为断言通知入口位于页脚末尾
- 删除 WorkbenchLayout 侧栏边缘悬停出现的折叠箭头(workbench-sidebar-toggle)及其折叠动画状态机
- 同步移除只服务于该按钮的 collapsed-boundary 热区与相关样式
- 侧栏折叠现在只由标题栏按钮控制;宽度拖拽保持不变
移除会话栏边缘折叠箭头时误删了 `.is-resizing .desktop-workbench-layout__sidebar { transition: none }`,
导致拖拽调整宽度时每次指针移动都被 240ms 缓动再动画一次,边缘明显滞后。
现恢复该规则,并与其它 is-resizing 规则相邻放置,避免再次被连带删除。
设置、插件、自动化三个入口的悬浮提示从浏览器原生 title 改为 naive-ui NTooltip,
与会话栏头部图标按钮保持同一套提示样式;移除 title 属性避免原生与自绘提示叠加,
aria-label 保留。
- 任务分组标题行新增加号,点击新建不属于任何空间的对话,与空间分组加号交互一致
- 移除侧栏头部的全局新增按钮(功能由任务分组加号承担)
- 搜索入口移到头部最右,跟随侧栏右边缘
- 置顶项的可见性校验与行数据解析改为基于全部会话,空间内的会话不再被丢弃
- 已被置顶的空间会话从所属空间列表、以及已置顶空间展开列表中移除,避免重复出现
- 空间分组与已置顶空间展开中的会话行补上置顶入口
- 新增 taskPinnedItems 投影测试:空间会话可置顶、去重、失效清理
- 会话行行内统一为「更多 + 删除」,置顶/取消置顶收进更多菜单,删除仍在菜单外但保留二次确认
- 空间行行内由「更多 + 置顶」改为「更多 + 新任务(加号)」,置顶/取消置顶收进更多菜单
- 新建任务按钮复用空间菜单里 new-task 的同一条路径
侧栏会话较多时列表会把「置顶 / 空间 / 任务」挤变形,需要在默认状态下收敛长度。

- 每个分组(任务分组、每个空间)默认只渲染 5 条会话;超出时在列表末尾追加一条「展开其余 N 个」行,点击后该分组全部展开
- 不提供收起按钮,改由三个时机自动收回:展开另一个分组(手风琴,同时只允许一个分组展开)、折叠该分组本身、离开任务页或重启应用
- 展开状态只存在内存中,不写入配置(不持久化)
- 投影层新增 expand 行类型与 conversationLimit / expandedConversationGroups 入参;globalTasks(原始任务数组)改为 taskRows(含合成展开行的行数组)
- 新增 DesktopTaskSidebarExpandRow 组件,与任务行同高同内边距,空间内的会话缩进对齐
- 新增 i18n:desktop.tasks.expandRemaining(中/英)
- 投影测试新增 4 例:任务分组截断与计数、展开后全显示、空间独立截断、不足 5 条时不出现展开行
标题栏里三个纯图标、语义需要推断的功能按钮此前没有任何提示。

- 侧栏显示/隐藏、资源面板显示/隐藏、面板位置切换改用 naive-ui Tooltip(placement=bottom,避免提示跑到窗口外)
- 文案复用现有 i18n 键并随状态变化(收起/展开侧栏、收起/展开资源面板或聊天区)
- 最小化/最大化/关闭与三个文字菜单保持无提示,与系统窗口控制习惯一致
- 状态改为「已实现」,界面结构图按现状重画(头部标记与搜索、分组加号、展开其余行、通知贴右)
- 新增行为小节:侧栏头部、分组标题行、空间行、会话行、会话列表条数、标题栏提示
- 改写底部功能入口、非任务页面、头像与个人资料、顶部隐藏按钮
- 验收标准 13 条全部标记完成
- 未决事项仅保留「置顶分组是否截断」
空间行行内已有「+新任务」按钮,菜单里的同名项属于重复入口。

- 移除空间「更多」菜单中的「新任务」项;行内加号仍走同一条 new-task 路径
- 顺带把「置顶」移到分隔线之前:原首项被删后,若空间未设主目录,「打开工作目录」会隐藏,菜单会以一条分隔线开头
聊天窗口里 AI 回复上方的头像与名称此前是固定值(品牌头像 + Lexora Buddy)。

- 新增 desktop.agentProfile 配置(name / avatar / syncWithUserProfile),落盘为 [desktop.agent_profile]
- 设置 → 外观 下新增「AI 身份」区块:可上传头像(≤2MB)、填写名称(≤30 字)、恢复默认
- 新增行内开关「同步用户头像与名称」:开启后照搬个人资料的解析结果(自定义头像或首字母圆 + 昵称),关闭后回到自定义/默认
- 聊天窗口与设置预览共用同一套解析(resolveUserProfile),两处渲染一致
- BuddyChatAgentIdentity 支持首字母头像分支,避免无头像时错误回退到品牌图标
- 新增单测:品牌兜底 / 自定义头像 / 首字母圆;既有 transcript 测试的 DesktopUi mock 同步补字段
- 新增 i18n:desktop.agent.*(中/英)
- 记录配置结构、设置位置与形态、默认/自定义/同步三种行为
- 说明同步分支为何要复用个人资料的解析结果(含首字母圆)
- 验收标准 7 条全部勾选,附相关实现文件清单
分支:codex/feature-006-fixed-primary-navigation
基线:master(73496281)
规模:18 个提交、56 个文件(+1916 / −822)

## 背景

桌面端左侧原本是两根并排竖栏:全局常驻的「任务 / 自动化 / 插件 / 设置」主导航侧栏,加上只在任务页出现的空间侧栏。两者并排占宽度,底部又各有一套入口(主导航侧栏底部是头像 + 通知);侧栏里的会话一多,「置顶 / 空间 / 任务」三段就会被撑变形。

本 PR 按 docs/specs/feature-006-fixed-primary-navigation.md 把两根竖栏合并成一根,并收敛侧栏内部的操作入口。

## 主要改动

### 1. 合并侧栏
- 删除独立主导航侧栏 DesktopAppSidebar(导航项 + 头像 + 通知气泡)
- 空间侧栏(DesktopTaskIndex)成为唯一左侧竖栏,保留「置顶 / 空间 / 任务」三段、空间展开收起、置顶拖拽排序
- 底部新增固定入口行:设置、插件、自动化靠左,通知贴住右边缘,随侧栏宽度跟随
- 顶部隐藏按钮改为只控制这根侧栏,并随状态切换图标(收起 / 展开),与右侧资源面板按钮同一套约定
- 侧栏边缘原先悬停出现的折叠箭头移除,折叠只由顶部按钮控制;宽度拖拽保持不变

### 2. 侧栏内部交互
- 头部:模块标题 + 管理标记 + 搜索(搜索靠最右),移除全局「新增」按钮
- 分组标题行悬停出现加号:「空间」分组新建空间,「任务」分组新建会话
- 空间行行内 = 更多 + 新任务(加号);更多菜单 = 打开工作目录 / 置顶·取消置顶 / 管理 Skills / 编辑 / 删除
- 会话行行内 = 更多 + 删除;更多菜单 = 标记 / 置顶·取消置顶 / 重命名;空间内与任务内的会话操作一致
- 空间内的会话现在也能置顶,置顶后从所属空间列表移出,不会出现两份
- 会话列表默认显示 5 条,超出时显示「展开其余 N 个」;无收起按钮,改由三个时机自动收回(展开别的分组 / 折叠该分组 / 离开任务页或重启),展开状态不持久化
- 「置顶」分组不截断

### 3. 其它
- 非任务页面(自动化 / 插件 / 插件详情)左下角新增「返回」;设置页的返回位于设置侧栏底部
- 头像与个人资料入口从侧栏移到设置 → 通用页;账户组件按分层约定从 app/shell 迁到 modules/settings/widgets/account
- 标题栏三个纯图标功能按钮补充自绘提示;最小化 / 最大化 / 关闭与三个文字菜单保持无提示

## 验证

- type-check 通过;eslint(全部改动文件)通过
- 单元测试:unit 项目完整跑过 138 文件 / 1029 例全绿;相关子集多次全绿
- 新增测试:DesktopSidebarFooter(6 例)、DesktopBackToTasksButton(2 例)、taskPinnedItems 投影(7 例)
- 开发预览中逐项核对(含用 CDP 真实鼠标事件验证标题栏三个自绘提示)
- 未执行:extensionContributions.e2e.mjs 已按新导航改写但需完整 electron 构建,本次未跑;pnpm check:buddy 完整预检也未跑

## 需要注意的行为变化

1. 插件自带页面不再出现在左侧导航:改由「插件」页 → 已安装卡片「打开」进入
2. desktop.sidebarCollapsed 配置项在渲染层不再使用:折叠状态改由 taskIndex.sidebar 承载,旧项保留未迁移
3. 侧栏折叠入口收敛为一个(只保留顶部按钮)
4. 原生 title 提示改为自绘提示(侧栏底部入口与标题栏功能按钮)

## 如何手工验证

1. pnpm --filter @uselexora/lexora-buddy dev
2. 任务页:左侧只有一根侧栏、底部四个入口、通知在行尾贴右
3. 悬停「任务」/「空间」标题行看加号;悬停空间行与会话行看行内按钮与「更多」菜单
4. 造 6 个以上会话:默认 5 条 + 「展开其余 N 个」;展开另一个分组时前者自动收回
5. 标题栏:点侧栏按钮看图标切换;悬停三个功能按钮看自绘提示
6. 设置页:「返回」在设置侧栏底部、个人资料在「通用」页顶部

## 相关文档

- docs/specs/feature-006-fixed-primary-navigation.md(已同步到实现现状,验收 13 条全勾)
---

## 追加:AI 身份(Spec-007)

设置 → 外观 新增「AI 身份」区块:可自定义聊天窗口里 AI 回复上方的头像与名称,并提供行内开关「同步用户头像与名称」。

- 配置:`desktop.agentProfile { name, avatar, syncWithUserProfile }`,落盘 `[desktop.agent_profile]`
- 位置:设置 → 外观;开关为行内小控件,不单独占行、无额外说明文案
- 同步行为:开启后照搬「通用 → 个人资料」的解析结果——自定义头像用同一张图;用户没有头像时使用**同一个首字母圆**(而不是品牌图标);名称用个人资料昵称
- 聊天窗口与设置预览共用同一套解析,两处渲染一致
- 验证:type-check / eslint 通过;新增 `BuddyChatAgentIdentity` 单测 3 例(品牌兜底 / 自定义头像 / 首字母圆),transcript 目录 6 文件 40 例全绿;开发预览中用真实鼠标点击开关,确认同步开启后 AI 区块显示与个人资料一致的首字母圆(AQ),关闭后回到品牌图标
- 文档:`docs/specs/feature-007-chat-agent-identity.md`
# Conflicts:
#	apps/buddy/native/host/__tests__/private_security_windows.rs
#	apps/buddy/native/host/src/private_directories/windows/security.rs
#	apps/buddy/src/app/bootstrap/DesktopAppProvider.vue
#	apps/buddy/src/app/workbench/useDesktopWorkbench.ts
#	apps/buddy/src/modules/extensions/layouts/DesktopExtensionWorkbench.vue
#	apps/buddy/src/modules/settings/pages/DesktopAppearanceSettingsView.vue
#	apps/buddy/src/modules/settings/pages/DesktopGeneralSettingsView.vue
#	apps/buddy/src/modules/settings/widgets/app/DesktopGeneralSettings.vue
#	apps/buddy/src/modules/tasks/widgets/task-index/DesktopTaskRow.vue
#	apps/buddy/src/modules/tasks/widgets/transcript/BuddyChatAgentTurn.vue
#	apps/buddy/src/modules/tasks/widgets/transcript/BuddyChatAgentTurnFlow.vue
#	apps/buddy/src/modules/tasks/widgets/transcript/__tests__/BuddyChatActivities.spec.ts
#	apps/buddy/src/modules/tasks/widgets/transcript/__tests__/BuddyChatMessageContent.spec.ts
#	apps/buddy/src/modules/tasks/widgets/transcript/__tests__/DesktopChatTranscript.spec.ts
#	docs/specs/feature-003-session-reference.md
# Conflicts:
#	apps/buddy/src/app/shell/DesktopAppSidebar.vue
#	apps/buddy/src/modules/tasks/widgets/transcript/__tests__/BuddyChatActivities.spec.ts
Retain native notifications until explicit dismissal so a completion toast can still open its original conversation after the user switches tasks. Queue and acknowledge navigation targets across window and renderer readiness, and preserve message reveals until scrolling completes.

Register a Windows shortcut for development toast delivery and document the confirmed cross-conversation workflow.
@QAyong

QAyong commented Sep 29, 2026

Copy link
Copy Markdown
Contributor Author

关闭此 PR:源分支包含与本次通知修复无关的历史提交。已在基于最新 master 的干净分支重新创建仅包含本次修复的 PR #230。

@QAyong QAyong closed this Sep 29, 2026
@QAyong
QAyong deleted the codex/space-folder-default-name branch September 29, 2026 15:20
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant