diff --git a/FEATURES.md b/FEATURES.md index 6feb51c6..7e8c56d1 100644 --- a/FEATURES.md +++ b/FEATURES.md @@ -17,7 +17,7 @@ - [x] **文件、截图、窗口、剪贴板上下文**:用户明确选择后才加入模型上下文。 - [x] **富文本回答**:支持 GitHub Flavored Markdown、LaTeX 数学公式和受控 Mermaid 图表;大图可缩放、拖动或查看源码,失败时保留原始图表代码。 - [ ] **项目 Agent Space**(规划中):在 Project 中统一角色、知识、Skills/MCP、模型、审批策略、预算和超时,并支持模板复用。 -- [ ] **通用助手工作栏与执行空间**(规划中):保留 Task Center 作为 Task 的单例索引,并把监督、Runtime、终端、进程、工作区、浏览器、成果和上下文作为始终可访问的应用级能力;除 Task Center 外的可绑定能力由用户选择跟随或固定目标,并逐步支持静态安全 HTML 预览、本机/SSH 执行空间和远程 Agent Runtime。详见 [Feature PRD](./docs/prd/assistant-experience/assistant-workbar-and-execution-spaces-prd.md)。 +- [ ] **通用助手工作栏与执行空间**(规划中):保留 Task Center 作为 Task 的单例索引,并把监督、Runtime、终端、进程、工作区、浏览器和成果作为始终可访问的应用级能力;除 Task Center 外的可绑定能力由用户选择跟随或固定目标,并逐步支持静态安全 HTML 预览、本机/SSH 执行空间和远程 Agent Runtime。附件与知识库继续由会话输入区管理,未来的记忆与历史执行上下文归入关联 Task。详见 [Feature PRD](./docs/prd/assistant-experience/assistant-workbar-and-execution-spaces-prd.md)。 ### Agent Runtime 与模型连接 diff --git a/UI-DESIGN.md b/UI-DESIGN.md index 3887a56d..e26ff9ea 100644 --- a/UI-DESIGN.md +++ b/UI-DESIGN.md @@ -306,7 +306,7 @@ 自动增删入口。产品契约见 [通用助手工作栏与执行空间 PRD](./docs/prd/assistant-experience/assistant-workbar-and-execution-spaces-prd.md)。 -- 默认固定提供任务中心、上下文、工作区、浏览器和成果五个标准栏目,不根据当前页面或 +- 默认固定提供任务中心、工作区、浏览器和成果四个标准栏目,不根据当前页面或 Runtime 能力自动增删入口。 - Task Center 是 Task 的单例应用级索引,不使用“跟随 / 固定目标”多实例模式。每个 Task 只关联一条 Conversation,一条 Conversation 可以关联多个 Task;列表不得复制会话内容, @@ -314,7 +314,9 @@ - 各栏目读取当前会话或项目的对应内容;当前内容不可用时仍保留栏目入口并说明原因。 - 能力、连接和内容可以动态变化,栏目入口不能随之自动隐藏。不可用状态必须说明原因、影响和可执行入口。 - 用户可以主动排序或隐藏栏目,并可恢复默认布局;应用不能用用户偏好机制实现自动能力裁剪。 -- 五个栏目使用稳定标签并保留 `tablist`、`tab`、`tabpanel`、方向键、Home、End 和焦点恢复语义。 +- 四个栏目使用稳定标签并保留 `tablist`、`tab`、`tabpanel`、方向键、Home、End 和焦点恢复语义。 +- 下一次请求使用的附件和知识库由会话输入区展示与管理,不在工作栏重复提供“上下文”栏目; + 记忆功能实现前不展示占位内容,未来的记忆与历史执行上下文归入关联 Task 的任务中心详情。 - 徽标可以提示未解决意见、等待审批、失败或连接状态,但不能成为唯一状态信号,也不能无条件抢占当前栏目。 - 所有窗口宽度下均停靠在主工作区右侧并参与水平布局回流;展开时压缩主工作区,不能覆盖、 遮罩或隔离其内容。分栏计算排除最左侧主导航,主工作区与工作栏采用相同的 `300px` diff --git a/docs/prd/assistant-experience/assistant-workbar-and-execution-spaces-prd.md b/docs/prd/assistant-experience/assistant-workbar-and-execution-spaces-prd.md index 1b83a617..14ed4ed3 100644 --- a/docs/prd/assistant-experience/assistant-workbar-and-execution-spaces-prd.md +++ b/docs/prd/assistant-experience/assistant-workbar-and-execution-spaces-prd.md @@ -5,15 +5,15 @@ | 项目 | 内容 | | --- | --- | | 状态 | 设计中 | -| 版本 | 0.3 | -| 日期 | 2026-08-19 | +| 版本 | 0.4 | +| 日期 | 2026-08-22 | | 适用产品 | GoodBuddy 桌面端 | | 相关设计 | [统一界面设计系统](../../../UI-DESIGN.md) | | 相关能力 | [会话监督](../supervision/conversation-supervision-prd.md)、[自动化平台](../../architecture/automation-platform-architecture.md)、[长期助手路线图](../../roadmap/long-term-assistant-roadmap.md) | ## 1. 背景 -GoodBuddy 已经在聊天右侧提供上下文、工作区、浏览器和成果面板,也已经具备 +GoodBuddy 已经在聊天右侧提供任务中心、工作区、浏览器和成果面板,也已经具备 Runtime 事件、Git 变更、文件预览、成果存储、受控浏览器和专家执行等基础能力。后续还 计划增加: @@ -23,8 +23,8 @@ Runtime 事件、Git 变更、文件预览、成果存储、受控浏览器和 - HTML 等成果的即时安全预览。 - 本机与 SSH 远程主机上的工作区和 Agent Runtime。 -这些能力不能被收束为只面向编程的工作台。监督、Runtime、终端、进程、浏览器、成果和 -上下文都可以服务于普通问答、内容分析、自动化、数据处理、远程运维、知识整理和软件开发。 +这些能力不能被收束为只面向编程的工作台。监督、Runtime、终端、进程、浏览器和成果 +都可以服务于普通问答、内容分析、自动化、数据处理、远程运维、知识整理和软件开发。 同时,能力目录也不能根据当前页面、项目类型或 Runtime 能力无提示地变化,否则用户无法在 需要时主动打开面板并选择目标、主机或运行环境。 @@ -36,8 +36,8 @@ Runtime 统一抽象为“执行空间”。 ### 2.1 助手工作栏 助手工作栏是 GoodBuddy 中始终可访问的应用级工具容器。它提供稳定能力目录,用户从中 -查看任务中心,并按需打开一个或多个监督、Runtime、终端、进程、工作区、浏览器、成果和 -上下文面板实例。稳定的是能力的可发现性,不是九个同时占据界面的固定面板。 +查看任务中心,并按需打开一个或多个监督、Runtime、终端、进程、工作区、浏览器和成果 +面板实例。稳定的是能力的可发现性,不是八个同时占据界面的固定面板。 工作栏不是: @@ -82,7 +82,6 @@ Runtime 工作区 浏览器 成果 -上下文 ``` - 应用不得根据当前项目、会话、Runtime、主机或探测结果无提示地增删能力目录项。 @@ -105,7 +104,9 @@ Runtime - Runtime 默认跟随当前会话或 Task;执行事件可以查看,但 Job/Run 不作为独立选择对象。 - 终端默认使用当前项目执行空间,用户可以新建本机或远程终端。 - 工作区默认显示当前项目目录,用户可以打开其他本机目录或远程目录。 -- 成果和上下文默认使用当前范围,用户可以切换到项目、全局或其他允许范围。 +- 成果默认使用当前范围,用户可以切换到项目、全局或其他允许范围。 +- 下一次请求的附件和知识库由当前 Composer 展示与管理,不作为工作栏能力。历史执行上下文 + 随关联 Task 查看;记忆功能实现后也归入任务中心,而不是新增独立上下文面板。 每个可切换目标的面板实例都提供一致的范围模式: @@ -197,7 +198,7 @@ Runtime ### 6.2 能力目录与面板实例 -能力目录不等于同时打开九个面板。推荐使用工作栏内的纵向能力导航,并在旁边或停靠区域管理 +能力目录不等于同时打开八个面板。推荐使用工作栏内的纵向能力导航,并在旁边或停靠区域管理 用户已经打开的面板实例: - 每项始终显示稳定图标,并提供可见标签或可持续查看的工具提示。 @@ -209,7 +210,7 @@ Runtime - 默认布局只恢复经过产品确认的少量常用面板,不自动打开全部标准能力。 - 每个实例显示稳定实例 ID、能力名称、跟随或固定状态与当前目标;同能力多实例不能只靠位置区分。 -当前聊天右栏过渡实现保留 Task Center、上下文、工作区、浏览器和成果五个横向页签时,必须 +当前聊天右栏过渡实现保留 Task Center、工作区、浏览器和成果四个横向页签时,必须 单行横向滚动,不能自动隐藏或缩写到不可辨认。Task Center 继续作为 Task 的现有入口; 审批定位到所属 Task 或 Runtime。智能心跳不作为工作栏页签,其报告、建议、历史和完整配置统一归属 “智能心跳”菜单入口。当前阶段不新增独立自动化中心。 @@ -398,18 +399,15 @@ Task 呈现来源,不把 Run 作为导航对象。 - 不使用 `dangerouslySetInnerHTML`,不启用 Electron `webviewTag`。 - 外部打开是明确的用户操作,并说明外部浏览器可能执行脚本或联网。 -### 7.9 上下文 +### 7.9 Composer 与任务上下文 -上下文面板显示用户已选择或系统准备送入下一次模型请求的内容: +工作栏不提供独立“上下文”能力。用户准备下一次模型请求时: -- 附件、图片和文档提取结果。 -- 知识库、引用和检索范围。 -- 已确认记忆。 -- 浏览器、工作区文件和授权目录。 -- Runtime、监督或自动化显式绑定的其他上下文。 - -每项显示来源、范围、大小、发送状态和用途。用户可以预览、移除或清空。查看 Task 的历史 -执行上下文时只读展示不可变快照;跟随当前 Composer 时才允许编辑下一次请求的上下文。 +- 附件、图片、文档提取结果以及知识库范围在 Composer 中展示与管理。 +- Composer 提供与发送行为直接关联的预览、移除和清空操作,不在工作栏重复入口或状态。 +- 浏览器、工作区文件、授权目录以及 Runtime 或自动化绑定内容由各自能力展示。 +- Task 的历史执行上下文作为不可变快照随 Task 查看。 +- 记忆功能实现前不展示占位内容;实现后在任务中心按关联 Task 展示和管理。 ## 8. 范围和选择模型 @@ -426,7 +424,6 @@ type WorkbarCapabilityId = | 'workspace' | 'browser' | 'results' - | 'context' type WorkbarTargetRef = | { type: 'conversation'; id: string } @@ -609,7 +606,7 @@ Renderer 只通过显式方法访问: - 终端创建、输入、调整大小、关闭和有界输出订阅。 - 受管进程列表、日志和允许的控制动作。 - Runtime Inspector 快照、事件和允许的控制动作。 -- 工作区、成果、浏览器、监督和上下文的既有或扩展服务。 +- 工作区、成果、浏览器和监督的既有或扩展服务。 每个 Main Handler 都必须验证可信发送者、Zod 输入、对象归属和当前状态。不得暴露 raw Electron、ChildProcess、PTY、SSH Client、Socket 或文件句柄。 @@ -676,7 +673,7 @@ Electron、ChildProcess、PTY、SSH Client、Socket 或文件句柄。 - 将当前聊天专属右栏提升为应用级壳层。 - 建立稳定能力目录和用户打开、关闭、排序、停靠的面板实例模型。 - 建立实例级跟随、固定和失效目标语义。 -- 保留现有任务中心、上下文、工作区、浏览器和成果行为。 +- 保留现有任务中心、工作区、浏览器和成果行为;附件与知识库继续由 Composer 管理。 - 将 Task Center 明确为 Task 的单例索引,并补齐范围、状态、最近进展、需要关注和直接打开 Conversation。 - 审批在所属任务或 Runtime 中持续可见,不新增独立审批面板。 - 智能心跳菜单入口承接完整配置和范围后,再从任务中心移除重复表单;不得移除任务中心本身。 @@ -724,7 +721,7 @@ Electron、ChildProcess、PTY、SSH Client、Socket 或文件句柄。 ### 17.1 稳定能力目录与用户控制 -- [ ] 九个标准能力在所有主要页面的目录中始终可发现,但不会默认同时打开。 +- [ ] 八个标准能力在所有主要页面的目录中始终可发现,但不会默认同时打开。 - [ ] Task Center 继续作为 Task 的单例索引,不删除入口、不复制会话,也不混入 Job、Run 或心跳事项。 - [ ] 项目、会话、Runtime 或主机变化不会无提示地增删能力目录项。 - [ ] 用户可以按需打开、关闭、排序和停靠面板实例。 @@ -781,6 +778,6 @@ Electron、ChildProcess、PTY、SSH Client、Socket 或文件句柄。 - [DeepSeek Harness Runtime 设计](../../architecture/deepseek-harness-runtime-design.md) 定义该 Runtime 的具体适配边界。 - [统一界面设计系统](../../../UI-DESIGN.md) 定义视觉、语义、响应式和无障碍规则。 -若其他文档把工作栏描述为九个同时固定显示的栏目、根据项目或 Runtime 自动裁剪的动态入口, +若其他文档把工作栏描述为八个同时固定显示的栏目、根据项目或 Runtime 自动裁剪的动态入口, 或仅属于当前聊天的附属区域,以本文“能力目录稳定、面板实例由用户打开、当前上下文只提供 默认值”的产品决策为准。 diff --git a/docs/roadmap/long-term-assistant-roadmap.md b/docs/roadmap/long-term-assistant-roadmap.md index 2efee84e..f574690a 100644 --- a/docs/roadmap/long-term-assistant-roadmap.md +++ b/docs/roadmap/long-term-assistant-roadmap.md @@ -6,8 +6,8 @@ | --- | --- | | 文档类型 | 产品路线图 | | 状态 | 规划中 | -| 版本 | 0.3 | -| 日期 | 2026-08-19 | +| 版本 | 0.4 | +| 日期 | 2026-08-22 | | 适用产品 | GoodBuddy 桌面端 | | 相关设计 | [通用助手工作栏与执行空间 PRD](../prd/assistant-experience/assistant-workbar-and-execution-spaces-prd.md)、[Task 与 Job 统一领域模型](../prd/task-and-job/task-and-job-model.md)、[智能心跳 PRD](../prd/smart-heartbeat/smart-heartbeat-prd.md)、[全双工实时语音交互设计](../architecture/full-duplex-voice-design.md) | @@ -24,7 +24,7 @@ GoodBuddy 应能够: 1. 持续组织项目、会话、任务、成果和记忆,而不是只保存聊天记录。 2. 在明确授权下理解文件、知识库、截图、应用窗口和浏览器上下文。 3. 以只读问答、计划审查和受控执行三种模式完成工作。 -4. 在应用级助手工作栏中持续提供任务中心、监督、Runtime、终端、进程、工作区、浏览器、成果和上下文。 +4. 在应用级助手工作栏中持续提供任务中心、监督、Runtime、终端、进程、工作区、浏览器和成果。 5. 支持后台任务、定时任务、失败恢复和桌面通知。 6. 让所有记忆、权限、上下文和远程传输可见、可审查、可撤销。 @@ -40,7 +40,7 @@ GoodBuddy 应能够: │ 会话 │ │ Runtime / 终端 │ │ 智能心跳 │ │ 进程 / 工作区 │ │ 记忆 │ │ 浏览器 / 成果 │ -│ 设置 │ │ 上下文 │ +│ 设置 │ │ │ └──────────────┴──────────────────────────────┴──────────────────────┘ ``` @@ -52,7 +52,7 @@ GoodBuddy 应能够: Task 时不保留空的 Task 上下文栏。 - 右侧栏在对话、知识库和活动视图之间保持状态。 - 知识图谱实体详情复用同一右栏容器,不再维护独立布局。 -- 九个标准能力固定可达;能力、连接和数据状态可以变化,但应用不按当前上下文自动隐藏入口。 +- 八个标准能力固定可达;能力、连接和数据状态可以变化,但应用不按当前上下文自动隐藏入口。 - Task Center 是 Task 的单例索引;其他可绑定目标的能力支持跟随当前上下文或固定到用户选择的目标。 ### 3.2 右侧工作栏 @@ -83,11 +83,11 @@ GoodBuddy 应能够: - 用户可主动创建本机或 SSH 终端,并明确看到执行空间、目录和连接状态。 - 用户终端与 Agent 工具执行分离,Agent 不得未经明确授权向终端注入输入。 -#### 上下文 +#### Composer 与任务上下文 -- 展示本次请求使用的附件、知识库、截图、剪贴板和授权目录。 -- 每项上下文显示来源、大小、发送状态和作用域。 -- 支持预览、移除和清空。 +- 本次请求使用的附件、知识库、截图和剪贴板由 Composer 展示与管理。 +- 授权目录、浏览器和工作区内容由对应工作栏能力展示,不创建重复的上下文栏目。 +- 历史执行上下文随关联 Task 查看;记忆功能实现后归入任务中心。 - 不显示或持久化用户未主动选择的桌面内容。 #### 成果 @@ -286,7 +286,7 @@ GoodBuddy 应能够: - Projects 与会话归属。 - Ask、Execute 工作模式与旧版 Plan 数据兼容。 - 应用级助手工作栏壳层。 -- 固定任务中心、监督、Runtime、终端、进程、工作区、浏览器、成果和上下文九个能力入口。 +- 固定任务中心、监督、Runtime、终端、进程、工作区、浏览器和成果八个能力入口。 - 任务中心保持单例索引,其他可绑定能力支持跟随当前上下文或固定目标。 ### 阶段 2:Task 与 Job @@ -326,9 +326,9 @@ GoodBuddy 应能够: ### 8.1 右侧栏 - 三种窗口宽度下布局可用。 -- 九个标准能力在主要视图中固定可达,应用不按能力自动隐藏。 +- 八个标准能力在主要视图中固定可达,应用不按能力自动隐藏。 - 跨主视图切换保持栏目、折叠、跟随和固定目标状态。 -- 任务中心、监督、Runtime、终端、进程、工作区、浏览器、成果和上下文更新不要求离开当前主任务。 +- 任务中心、监督、Runtime、终端、进程、工作区、浏览器和成果更新不要求离开当前主任务。 - 键盘可操作,并具备正确 ARIA 标签。 ### 8.2 Projects diff --git a/src/renderer/src/App.test.tsx b/src/renderer/src/App.test.tsx index 114fe603..6bd865f0 100644 --- a/src/renderer/src/App.test.tsx +++ b/src/renderer/src/App.test.tsx @@ -8125,10 +8125,9 @@ describe('App', () => { screen.queryByRole('region', { name: '当前会话的任务' }) ).not.toBeInTheDocument() expect(screen.queryByText('最近任务')).not.toBeInTheDocument() - fireEvent.click(screen.getByRole('tab', { name: '上下文' })) expect( - screen.getByText('尚未添加文件、截图或剪贴板内容。') - ).toBeInTheDocument() + screen.queryByRole('tab', { name: '上下文' }) + ).not.toBeInTheDocument() fireEvent.click(screen.getByRole('tab', { name: '工作区' })) expect( screen.getByText(/选择文件后在当前工作区内预览/) diff --git a/src/renderer/src/App.tsx b/src/renderer/src/App.tsx index 40fa9ea0..05d69f5a 100644 --- a/src/renderer/src/App.tsx +++ b/src/renderer/src/App.tsx @@ -3466,13 +3466,6 @@ function App(): React.JSX.Element { })), [activeProjectId, assistantArtifacts] ) - const enabledSidebarLibraries = useMemo( - () => - knowledgeSnapshot.libraries.filter((library) => - enabledKnowledgeLibraryIds.includes(library.id) - ), - [enabledKnowledgeLibraryIds, knowledgeSnapshot.libraries] - ) const pendingHeartbeatSuggestionCount = useMemo(() => { const memoryIds = new Set( heartbeatEntries.flatMap((entry) => entry.proposedMemoryIds) @@ -6752,13 +6745,6 @@ function App(): React.JSX.Element { } } - const removeAttachment = (attachmentId: string): void => { - void window.goodbuddy.context.remove(attachmentId) - updateAttachments((current) => - current.filter((attachment) => attachment.id !== attachmentId) - ) - } - const startWebSpeechInput = async (): Promise => { const SpeechRecognition = getSpeechRecognitionConstructor(window) @@ -9854,11 +9840,8 @@ function App(): React.JSX.Element { openCustomTaskDialog('current')} schedules={assistantSchedules} selectedTaskId={selectedAssistantTaskId} @@ -9922,7 +9905,6 @@ function App(): React.JSX.Element { mergeArtifacts(current, [artifact]) ) }} - onRemoveAttachment={removeAttachment} onOpenTask={openAssistantTask} onRemoveSchedule={removeAssistantSchedule} onRespondApproval={(approval, decision) => { diff --git a/src/renderer/src/RightAssistantSidebar.resize.test.tsx b/src/renderer/src/RightAssistantSidebar.resize.test.tsx index 215cf1eb..ec05dcee 100644 --- a/src/renderer/src/RightAssistantSidebar.resize.test.tsx +++ b/src/renderer/src/RightAssistantSidebar.resize.test.tsx @@ -22,7 +22,7 @@ beforeEach(() => { }) function renderSidebar({ - tab = 'context', + tab = 'tasks', artifacts = [], onLoadArtifact = vi.fn(async () => undefined), restoreFocusRef @@ -38,9 +38,6 @@ function renderSidebar({ undefined)} onInteractBrowser={vi.fn(async () => undefined)} onRefreshChanges={vi.fn(async () => undefined)} - onRemoveAttachment={vi.fn()} onRemoveSchedule={vi.fn(async () => undefined)} onRespondApproval={vi.fn()} onRunSchedule={vi.fn(async () => undefined)} @@ -231,12 +227,12 @@ describe('RightAssistantSidebar resizing', () => { } }) - it('exposes the task center and four reusable work surfaces', () => { + it('exposes the task center and three reusable work surfaces', () => { renderSidebar() expect( screen.getAllByRole('tab').map((tab) => tab.textContent) - ).toEqual(['任务中心', '上下文', '工作区', '浏览器', '成果']) + ).toEqual(['任务中心', '工作区', '浏览器', '成果']) expect( screen.queryByRole('tab', { name: '预览' }) ).not.toBeInTheDocument() diff --git a/src/renderer/src/RightAssistantSidebar.tsx b/src/renderer/src/RightAssistantSidebar.tsx index 0d820dae..0a776496 100644 --- a/src/renderer/src/RightAssistantSidebar.tsx +++ b/src/renderer/src/RightAssistantSidebar.tsx @@ -1,5 +1,4 @@ import { - CheckCircle2, ChevronLeft, ChevronRight, CircleAlert, @@ -11,13 +10,11 @@ import { Plus, RefreshCw, ShieldAlert, - Upload, - X + Upload } from 'lucide-react' import { useEffect, useMemo, useRef, useState } from 'react' import { useTranslation } from 'react-i18next' import type { - AssistantMemory, AssistantSchedule, AssistantTask, WorkspaceChanges, @@ -27,9 +24,7 @@ import type { import { MarkdownRenderer } from './MarkdownRenderer' import type { ApprovalDecision, - BrowserLiveState, - ContextAttachment, - KnowledgeLibrary + BrowserLiveState } from '../../shared/contracts' import { WorkspaceFilesPanel } from './WorkspaceFilesPanel' import { SegmentedControl } from './WorkspacePrimitives' @@ -40,7 +35,6 @@ import { export type AssistantSidebarTab = | 'tasks' - | 'context' | 'workspace' | 'browser' | 'results' @@ -67,9 +61,6 @@ type RightAssistantSidebarProps = { tab: AssistantSidebarTab approvals: PendingSidebarApproval[] artifacts: SidebarArtifact[] - attachments: ContextAttachment[] - enabledLibraries: KnowledgeLibrary[] - memories: AssistantMemory[] schedules: AssistantSchedule[] tasks: AssistantTask[] conversationTitles: ReadonlyMap @@ -84,7 +75,6 @@ type RightAssistantSidebarProps = { onCreateCustomTask: () => void onImportArtifacts: () => Promise onLoadArtifact: (artifactId: string) => Promise - onRemoveAttachment: (attachmentId: string) => void onRefreshChanges: () => Promise onListWorkspaceDirectory: ( path: string @@ -110,7 +100,6 @@ type RightAssistantSidebarProps = { const tabIds: AssistantSidebarTab[] = [ 'tasks', - 'context', 'workspace', 'browser', 'results' @@ -173,9 +162,6 @@ export function RightAssistantSidebar({ tab, approvals, artifacts, - attachments, - enabledLibraries, - memories, schedules, tasks, conversationTitles, @@ -190,7 +176,6 @@ export function RightAssistantSidebar({ onCreateCustomTask, onImportArtifacts, onLoadArtifact, - onRemoveAttachment, onRefreshChanges, onListWorkspaceDirectory, onLoadWorkspaceFile, @@ -264,9 +249,6 @@ export function RightAssistantSidebar({ 'attention' | 'active' | 'paused' | 'finished' >('active') const [actionError, setActionError] = useState('') - const activeMemories = memories.filter( - (memory) => memory.status === 'confirmed' - ) const artifactPreview = artifacts.find((artifact) => artifact.id === selectedArtifactId) const currentWorkspacePreview = @@ -827,91 +809,6 @@ export function RightAssistantSidebar({ )} - {tab === 'context' && ( -
-

- {t('sidebar.context.description')} -

-

- - {t('sidebar.context.attachmentsTitle')} -

- {attachments.length === 0 ? ( -

- {t('sidebar.context.noAttachments')} -

- ) : ( - attachments.map((attachment) => ( -
- - {attachment.name} - - {t('sidebar.context.attachmentDetails', { - kind: attachment.kind, - formattedSize: - attachment.size.toLocaleString(locale) - })} - - - -
- )) - )} -

- - {t('sidebar.context.librariesTitle')} -

- {enabledLibraries.length === 0 ? ( -

- {t('sidebar.context.noLibraries')} -

- ) : ( - enabledLibraries.map((library) => ( -
- {library.name} - - {t('sidebar.context.documentCount', { - formattedCount: - library.documentCount.toLocaleString(locale) - })} - -
- )) - )} -

- - {t('sidebar.context.memoriesTitle')} -

- {activeMemories.length === 0 ? ( -

- {t('sidebar.context.noMemories')} -

- ) : ( - activeMemories.map((memory) => ( -
- {memory.content} -
- )) - )} -
- )} - {tab === 'workspace' && ( currentWorkspacePreview ? (
diff --git a/src/renderer/src/i18n/locales/en-US/workspace.ts b/src/renderer/src/i18n/locales/en-US/workspace.ts index 1eee42ca..5ea74abd 100644 --- a/src/renderer/src/i18n/locales/en-US/workspace.ts +++ b/src/renderer/src/i18n/locales/en-US/workspace.ts @@ -78,11 +78,6 @@ export const workspace = { label: 'Task center', description: 'Review approvals and manage automations' }, - context: { - label: 'Context', - description: - 'View attachments, knowledge libraries, and memories used in this conversation' - }, workspace: { label: 'Files', description: 'Browse project files, Git changes, and file contents' @@ -134,22 +129,6 @@ export const workspace = { 'This stops future automatic runs but keeps the task, conversation, and existing results.' } }, - context: { - description: - 'View the attachments, knowledge libraries, and confirmed memories used in this conversation.', - attachmentsTitle: 'Attachments', - noAttachments: - 'No files, screenshots, or clipboard content have been added.', - attachmentDetails: '{{kind}} · {{formattedSize}} bytes', - removeAttachment: 'Remove {{name}} from context', - librariesTitle: 'Enabled knowledge libraries', - noLibraries: - 'No knowledge libraries are enabled for this conversation.', - documentCount: '{{formattedCount}} documents', - memoriesTitle: 'Confirmed memories', - noMemories: - 'There are no confirmed long-term memories in the current scope.' - }, workspace: { back: 'Back to workspace', title: 'Files', diff --git a/src/renderer/src/i18n/locales/zh-CN/workspace.ts b/src/renderer/src/i18n/locales/zh-CN/workspace.ts index ad1a6bfe..72f32662 100644 --- a/src/renderer/src/i18n/locales/zh-CN/workspace.ts +++ b/src/renderer/src/i18n/locales/zh-CN/workspace.ts @@ -75,10 +75,6 @@ export const workspace = { label: '任务中心', description: '处理待审批操作并管理自动化' }, - context: { - label: '上下文', - description: '查看本次对话使用的附件、知识库与记忆' - }, workspace: { label: '工作区', description: '浏览项目文件、Git 变更与文件内容' @@ -128,18 +124,6 @@ export const workspace = { deleteMessage: '这会停止后续自动运行,但保留任务、会话和既有结果。' } }, - context: { - description: '查看当前对话实际使用的附件、知识库与已确认记忆。', - attachmentsTitle: '本次附件', - noAttachments: '尚未添加文件、截图或剪贴板内容。', - attachmentDetails: '{{kind}} · {{formattedSize}} 字节', - removeAttachment: '移除上下文 {{name}}', - librariesTitle: '已启用知识库', - noLibraries: '当前对话未启用知识库。', - documentCount: '{{formattedCount}} 个文档', - memoriesTitle: '已确认记忆', - noMemories: '当前范围没有已确认的长期记忆。' - }, workspace: { back: '返回工作区', title: '工作区', diff --git a/src/renderer/src/styles.css b/src/renderer/src/styles.css index 0133ad62..01013148 100644 --- a/src/renderer/src/styles.css +++ b/src/renderer/src/styles.css @@ -3433,27 +3433,21 @@ button > svg { background: var(--accent-subtle); } -.assistant-sidebar__row span, -.assistant-sidebar__context span, -.assistant-sidebar__library { +.assistant-sidebar__row span { display: flex; min-width: 0; flex-direction: column; gap: 3px; } -.assistant-sidebar__row strong, -.assistant-sidebar__context strong, -.assistant-sidebar__library strong { +.assistant-sidebar__row strong { overflow: hidden; font-size: 11px; text-overflow: ellipsis; white-space: nowrap; } -.assistant-sidebar__row small, -.assistant-sidebar__context small, -.assistant-sidebar__library small { +.assistant-sidebar__row small { overflow: hidden; color: var(--text-muted); font-size: 9px; @@ -3497,48 +3491,6 @@ button > svg { font-size: 9px; } -.assistant-sidebar__context { - display: flex; - align-items: center; - justify-content: space-between; - padding: 9px 10px; - border: 1px solid var(--border-subtle); - border-radius: 9px; - gap: 8px; -} - -.assistant-sidebar__library { - padding: 9px 10px; - border: 1px solid var(--border-subtle); - border-radius: 9px; - background: var(--surface-subtle); -} - -.assistant-sidebar__memory { - display: flex; - align-items: flex-start; - justify-content: space-between; - padding: 9px 10px; - border: 1px solid var(--accent-selected); - border-radius: 9px; - background: var(--accent-subtle); - color: var(--accent); - font-size: 10px; - gap: 8px; - line-height: 1.45; -} - -.assistant-sidebar__memory > span { - display: flex; - flex-direction: column; - gap: 3px; -} - -.assistant-sidebar__memory > span small { - color: var(--warning); - font-size: 8px; -} - .assistant-sidebar__schedule-form { display: flex; flex-direction: column; @@ -12655,7 +12607,6 @@ details.settings-section > :not(summary) + :not(summary) { .settings-section, .settings-tabs, .assistant-sidebar__row, - .assistant-sidebar__library, .assistant-sidebar__diff, .assistant-sidebar__preview pre, .tool-activity, @@ -12680,7 +12631,6 @@ details.settings-section > :not(summary) + :not(summary) { .topbar, .assistant-sidebar, .assistant-sidebar__tabs, - .assistant-sidebar__context, .assistant-sidebar__preview > header, .divider, .runtime-picker__divider, @@ -13334,13 +13284,9 @@ details.settings-section > :not(summary) + :not(summary) { .assistant-sidebar__diff, .assistant-sidebar__empty, .assistant-sidebar__import, -.assistant-sidebar__memory, -.assistant-sidebar__memory > span small, .assistant-sidebar__preview > header small, .assistant-sidebar__preview pre, .assistant-sidebar__row small, -.assistant-sidebar__context small, -.assistant-sidebar__library small, .assistant-sidebar__schedule button, .assistant-sidebar__schedule small, .assistant-sidebar__schedule strong,