diff --git a/UI-DESIGN.md b/UI-DESIGN.md
index 885edaf7..21a0618f 100644
--- a/UI-DESIGN.md
+++ b/UI-DESIGN.md
@@ -373,7 +373,7 @@
遮罩或隔离其内容。分栏计算排除最左侧主导航,主工作区与工作栏采用相同的 `300px`
最小宽度;拖动保存两者在可用分栏宽度中的比例,任一侧到达最小值后都不得继续侵占。
所有可容纳两侧最小值的尺寸均支持指针和键盘调整,并须保留全部栏目入口。
-- 工作栏开关固定在窗口关闭按钮正下方,同一个按钮负责展开与收起并持续暴露状态;图标中的
+- 工作栏开关固定在顶栏 `.topbar__actions` 内、紧邻浅色/深色主题按钮之前,同一个按钮负责展开与收起并持续暴露状态;图标中的
箭头方向必须随当前动作切换,收起状态提示展开,展开状态提示收起。按钮保持普通图标按钮
视觉,不通过持续高亮表达展开状态。工作栏内部不再重复关闭按钮;当前会话没有 Task 时,
不得为了放置该开关而保留一条空上下文栏。
@@ -415,7 +415,7 @@
不再重复显示状态文字;完整状态详情继续通过可访问说明和工具提示提供。
- 浅色与深色切换属于持续可用的窗口级操作,直接显示太阳或月亮图标,并通过可访问名称说明将切换到的主题。选择必须持久化,切换不得改变布局。
- 顶栏只直接显示当前任务所需的高频操作。已有侧栏账户设置入口时,不再重复显示 Runtime/设置入口;使用帮助优先放在相关操作附近,而不是为单个帮助项创建“更多”菜单。
-- 助手工作栏开关固定在上下文栏最右侧并与窗口关闭按钮纵向对齐;展开后该开关保持原位并
+- 助手工作栏开关固定在顶栏 `.topbar__actions` 内、紧邻浅色/深色主题按钮之前;展开后该开关保持原位并
负责收起,不在工作栏标题区域增加第二个关闭入口。
- 只有存在至少两个无法由稳定入口承载的低频全局操作时才增加全局菜单,不为了容纳一个冗余入口而显示省略号按钮。
- 窄窗口下优先压缩状态标签并保留图标按钮,不隐藏窗口控制、当前范围或进行中的风险状态。
diff --git a/docs/features/assistant-workbar/prd.md b/docs/features/assistant-workbar/prd.md
index 45cf228b..bf68364d 100644
--- a/docs/features/assistant-workbar/prd.md
+++ b/docs/features/assistant-workbar/prd.md
@@ -245,7 +245,7 @@ Runtime
项目切换器和导航整体向下推移。
- 对话内容与输入区始终保留对称的左右安全边距,工作栏边界不得覆盖或裁切输入框、发送
按钮及主工作区右侧边距。
-- 唯一展开与收起开关固定在窗口关闭按钮正下方。工作栏内部不重复关闭入口。开关图标中的
+- 唯一展开与收起开关固定在顶栏操作区、紧邻浅色/深色主题按钮之前。工作栏内部不重复关闭入口。开关图标中的
箭头方向随当前动作切换,按钮不以持续高亮表达展开状态;当前会话没有 Task 时不渲染空
Task 上下文栏。
- “新建任务”入口位于工作栏“任务索引”标题后方,不在会话 Task 上下文栏重复出现;索引
@@ -1091,7 +1091,7 @@ Electron、ChildProcess、PTY、SSH Client、Socket 或文件句柄。
- [ ] 宽、中、窄窗口均可访问完整能力目录和用户打开的面板实例。
- [ ] 工作栏在宽、中、窄窗口展开时都推动主工作区回流,不覆盖、遮罩或隔离主内容;唯一
- 开关始终固定在窗口关闭按钮正下方。
+ 开关始终固定在顶栏操作区、紧邻浅色/深色主题按钮之前。
- [ ] 仅使用键盘可以选择能力、面板实例、目标、执行空间和控制动作。
- [ ] 状态不只依赖颜色,徽标具有文字或可访问名称。
- [ ] 终端、HTML、监督证据和高频日志具有可访问替代或降噪行为。
diff --git a/docs/roadmap/long-term-assistant-roadmap.md b/docs/roadmap/long-term-assistant-roadmap.md
index 307cc27c..a4a41c30 100644
--- a/docs/roadmap/long-term-assistant-roadmap.md
+++ b/docs/roadmap/long-term-assistant-roadmap.md
@@ -48,7 +48,7 @@ GoodBuddy 应能够:
- 排除最左侧主导航后,主工作区与右侧栏使用相同的 `300px` 最小宽度,并按用户拖动后的
比例分配可用宽度;任一侧到达最小值后停止拖动。
- 主工作区中的消息流和输入区保留对称的左右安全边距,右侧栏不得覆盖或裁切其右边缘。
-- 唯一展开与收起开关固定在窗口关闭按钮正下方,右侧栏内部不重复关闭入口;当前会话没有
+- 唯一展开与收起开关固定在顶栏操作区、紧邻浅色/深色主题按钮之前,右侧栏内部不重复关闭入口;当前会话没有
Task 时不保留空的 Task 上下文栏。
- 右侧栏在对话、知识库和活动视图之间保持状态。
- 知识图谱实体详情复用同一右栏容器,不再维护独立布局。
diff --git a/src/renderer/src/App.test.tsx b/src/renderer/src/App.test.tsx
index ec6abef8..f1a694f4 100644
--- a/src/renderer/src/App.test.tsx
+++ b/src/renderer/src/App.test.tsx
@@ -10989,7 +10989,10 @@ describe("App", () => {
expect(sidebar).not.toHaveClass("assistant-sidebar--open");
const assistantTrigger = screen.getByLabelText("切换助手工作栏");
expect(assistantTrigger.parentElement).toBe(
- container.querySelector(".app-content"),
+ container.querySelector(".topbar__actions"),
+ );
+ expect(assistantTrigger.nextElementSibling).toBe(
+ container.querySelector(".theme-toggle-button"),
);
expect(container.querySelector(".sidebar")?.parentElement).toBe(
container.querySelector(".app-shell"),
@@ -11019,7 +11022,7 @@ describe("App", () => {
expect(container.querySelector(".topbar")).toContainElement(
container.querySelector(".conversation-title"),
);
- expect(container.querySelector(".topbar")).not.toContainElement(
+ expect(container.querySelector(".topbar")).toContainElement(
assistantTrigger,
);
expect(screen.queryByLabelText("关闭助手工作栏")).not.toBeInTheDocument();
diff --git a/src/renderer/src/App.tsx b/src/renderer/src/App.tsx
index c971d62a..5fe9d66c 100644
--- a/src/renderer/src/App.tsx
+++ b/src/renderer/src/App.tsx
@@ -9146,6 +9146,22 @@ function App(): React.JSX.Element {
{runtimeDetail}
+