diff --git a/UI-DESIGN.md b/UI-DESIGN.md index 5fe55d22..6bfe95be 100644 --- a/UI-DESIGN.md +++ b/UI-DESIGN.md @@ -309,7 +309,9 @@ 接受用户本机选择的 PNG、JPEG 或 WebP 内联数据,宽高不超过 `4096 × 4096`、总像素不 超过 1600 万且大小不超过 `512 KB`;不得读取远程 Logo URL。名称或副标题溢出品牌区时 单行截断,不能撑宽或挤压侧栏。 -- 账户与设置入口固定在侧栏底部。已有稳定设置入口时,不在顶栏重复提供同一入口。 +- 侧栏底部固定显示文件、终端、浏览器和资源监控四个系统工具图标,设置按钮独立靠右。工具 + 图标只负责打开或聚焦助手工作栏面板,不在侧栏复制工具内容。已有稳定设置入口时,不在顶栏 + 重复提供同一入口。 ### 6.9 助手工作栏 @@ -321,6 +323,8 @@ - 升级后默认打开任务中心、工作区、浏览器和成果四个单实例应用,不根据当前页面或 Runtime 能力自动增删稳定应用目录入口。 +- 资源监控作为本机单实例应用保留在能力目录,但不加入升级后的默认打开实例。面板只在可见 + 活动时采样,首期不持久化历史或提供后台负载告警。 - Tab 行只显示已打开实例,行末始终提供“+”普通按钮;点击后在内容区打开应用选择页。 “+”不使用 `tab` 语义,也不能因为终端或其他应用已经打开而消失。 - 应用注册表声明单实例或多实例。在工作栏“+”目录中,单实例重复选择时聚焦已有 Tab;终端 diff --git a/docs/features/application-tool-navigation/README.md b/docs/features/application-tool-navigation/README.md index db959732..d5777bbb 100644 --- a/docs/features/application-tool-navigation/README.md +++ b/docs/features/application-tool-navigation/README.md @@ -20,7 +20,7 @@ | --- | --- | | 系统入口 | GoodBuddy 工作流程或审计所必需的固定入口,用户不能卸载、隐藏或改变类型 | | 应用 | 在主内容区打开完整一级页面的功能,可显示在“当前对话”所在的主导航区 | -| 系统工具 | GoodBuddy 自带且不可卸载的辅助能力,从侧栏底部打开助手工作栏中的对应面板 | +| 系统工具 | GoodBuddy 自带且不可卸载的辅助能力,包括文件、终端、浏览器和资源监控,从侧栏底部打开助手工作栏中的对应面板 | | 插件应用 | 未来由插件提供的一级页面入口 | | 插件工具 | 未来由插件提供的辅助面板或命令入口 | | 快捷入口 | 只负责打开或聚焦能力,不复制该能力的界面和业务状态 | diff --git a/docs/features/application-tool-navigation/logic-design.md b/docs/features/application-tool-navigation/logic-design.md index c16a596c..8341b929 100644 --- a/docs/features/application-tool-navigation/logic-design.md +++ b/docs/features/application-tool-navigation/logic-design.md @@ -5,7 +5,7 @@ | 项目 | 内容 | | --- | --- | | 状态 | 设计中 | -| 版本 | 0.1 | +| 版本 | 0.2 | | 日期 | 2026-09-08 | | 关联 PRD | [应用导航与系统工具入口 PRD](./prd.md) | | 关联 User Stories | [User Stories](./user-stories.md) | @@ -14,7 +14,7 @@ 1. “当前对话”“运行记录”和“设置”始终是系统入口。 2. 运行记录不进入工具注册表、应用显隐设置或插件市场。 -3. 文件浏览器、终端和浏览器始终是系统工具,不能卸载或被插件替换。 +3. 文件浏览器、终端、浏览器和资源监控始终是系统工具,不能卸载或被插件替换。 4. 左下角只提供快捷入口,工具内容仍由助手工作栏承载。 5. 隐藏应用不等于停用功能,也不删除、迁移或清理业务数据。 6. 快捷入口不能扩大执行空间、文件、PTY、网络或浏览器权限。 @@ -36,8 +36,8 @@ type NavigationContribution = } | { type: 'system-tool' - id: 'workspace' | 'terminal' | 'browser' - workbarAppId: 'workspace' | 'terminal' | 'browser' + id: 'workspace' | 'terminal' | 'browser' | 'resources' + workbarAppId: 'workspace' | 'terminal' | 'browser' | 'resources' } ``` @@ -90,6 +90,7 @@ type NavigationContribution = | 文件 | 激活单实例并保留其跟随或固定状态 | 创建跟随当前上下文的 `workspace` 单实例 | 打开面板并显示目录修复入口 | | 终端 | 激活当前执行空间最近的 `starting` 或 `running` 实例 | 创建一个绑定当前执行空间的实例 | 没有项目时使用本机 Home | | 浏览器 | 激活单实例并保留其目标状态 | 创建跟随当前会话的 `browser` 单实例 | 打开面板并提示选择或创建对话 | +| 资源监控 | 激活 `resources` 单实例 | 创建本机 `resources` 单实例 | 部分指标不可用时显示原因并保留其余指标 | 文件和浏览器按以下优先级处理目标:已有有效固定目标、跟随模式的当前上下文、新实例的默认 上下文。固定目标失效时显示该目标的修复状态,不回退到当前项目、默认工作区或当前会话。 @@ -106,6 +107,30 @@ type NavigationContribution = 徽标优先级为:等待用户处理 > 错误 > 运行中 > 无徽标。同一按钮只显示一个视觉徽标, 可访问名称包含完整状态。 +资源监控首期不在后台采样,因此不显示负载告警徽标。只有资源面板是工作栏当前活动实例且 +工作栏已展开时,资源按钮才显示选中状态。 + +### 4.4 资源采样状态 + +```text +inactive -> warming -> loading -> live + -> partial + -> error +live/partial/error -> loading +warming/loading/live/partial/error -> inactive +``` + +- `inactive`:资源面板未处于可见活动状态,没有采样定时器。 +- `warming`:首次进入或停止后恢复,建立 CPU 和磁盘 IO 区间基线;内存仍可立即显示。 +- `loading`:正在请求后续样本;请求未结束时跳过后续时钟触发。 +- `live`:所有首期指标可用,按 2 秒间隔追加样本。 +- `partial`:至少一个指标可用;不可用项携带稳定错误码,其他指标继续更新。 +- `error`:本次没有任何可用指标,保留已有历史;自动时钟或手动操作可以重试。 + +资源面板为活动实例、工作栏展开且 `document.visibilityState` 为 `visible` 时才离开 `inactive`。 +任一条件失效即停止定时器并重置区间基线。历史队列只保留最后 150 个样本;时间间隔较长或 +采样失败时保留真实时间缺口,不补零或伪造中间数据。 + ## 5. 设置保存规则 应用导航偏好与应用业务启停分开保存。Switch 每次切换立即提交完整目标集合;请求完成前禁用 @@ -122,14 +147,16 @@ type NavigationContribution = | 逻辑 | PRD | User Stories | | --- | --- | --- | | 固定入口不变量 | FR-1、FR-2 | US-A1、US-A2 | -| 应用显隐和失败恢复 | FR-3、FR-4、FR-10、FR-11 | US-B1、US-B2、US-B4、US-B5 | -| 工具打开决策表 | FR-5 至 FR-9 | US-C1 至 US-C6 | -| 无障碍与窄窗口 | FR-12 | US-D1、US-D2 | +| 应用显隐和失败恢复 | FR-3、FR-4、FR-11、FR-12 | US-B1、US-B2、US-B4、US-B5 | +| 工具打开决策表 | FR-5 至 FR-10 | US-C1 至 US-C7 | +| 资源采样状态 | FR-9 | US-C6 | +| 无障碍与窄窗口 | FR-13 | US-D1、US-D2 | ## 7. 逻辑完整性评估 首期规则已覆盖固定入口、应用显隐、保存失败、系统工具单实例与多实例差异、本机 Home、 -托管 SSH、无活动会话、目录失效、权限边界、键盘和窄窗口。工具面板内部的取消、超时、 +托管 SSH、无活动会话、目录失效、资源部分可用、采样停止、权限边界、键盘和窄窗口。其他 +工具面板内部的取消、超时、 连接恢复和固定目标失效继续由助手工作栏负责,本功能不复制这些状态机。 ## 8. 后续产品决策 @@ -137,4 +164,4 @@ type NavigationContribution = - 插件工具上线后,快捷栏允许固定的最大数量及溢出规则。 - 插件应用是否允许用户排序,以及固定系统入口之间允许的排序范围。 -这些决策不影响首期三个系统工具的固定入口和内置应用显隐实现。 +这些决策不影响首期四个系统工具的固定入口和内置应用显隐实现。 diff --git a/docs/features/application-tool-navigation/prd.md b/docs/features/application-tool-navigation/prd.md index e63efb39..a9c1d39a 100644 --- a/docs/features/application-tool-navigation/prd.md +++ b/docs/features/application-tool-navigation/prd.md @@ -5,7 +5,7 @@ | 项目 | 内容 | | --- | --- | | 状态 | 设计中 | -| 版本 | 0.1 | +| 版本 | 0.2 | | 日期 | 2026-09-08 | | 适用产品 | GoodBuddy 桌面端 | | 关联设计 | [统一界面设计系统](../../../UI-DESIGN.md)、[助手工作栏 PRD](../assistant-workbar/prd.md) | @@ -28,10 +28,10 @@ | --- | --- | --- | --- | | 系统入口 | 当前对话、运行记录、设置 | 主导航固定位置或侧栏底部 | 不可隐藏、卸载或改变类型 | | 应用 | 魔法笔记、知识库、智能心跳 | 主导航应用区 | 可控制是否显示;隐藏不删除数据 | -| 系统工具 | 文件浏览器、终端、浏览器 | 侧栏底部快捷工具栏 | 首期固定提供,不可卸载 | +| 系统工具 | 文件浏览器、终端、浏览器、资源监控 | 侧栏底部快捷工具栏 | 首期固定提供,不可卸载 | -运行记录是系统审计页面,不属于工具。文件浏览器、终端和浏览器是系统工具;它们的快捷入口 -位于左下角,实际界面继续由右侧助手工作栏承载。 +运行记录是系统审计页面,不属于工具。文件浏览器、终端、浏览器和资源监控是系统工具;它们 +的快捷入口位于左下角,实际界面继续由右侧助手工作栏承载。 ### 2.2 后续插件类型 @@ -40,7 +40,7 @@ ## 3. 目标 -- 用户从侧栏底部一次点击即可打开文件、终端或浏览器。 +- 用户从侧栏底部一次点击即可打开文件、终端、浏览器或资源监控。 - 主导航只承载完整页面,辅助工具不占用一级页面位置。 - 运行记录始终可发现,不受应用显示设置和插件状态影响。 - 内置应用可以从一个设置位置控制主导航可见性,隐藏后仍可恢复。 @@ -55,6 +55,7 @@ - 不因隐藏应用而删除魔法笔记、知识库或智能心跳数据。 - 不把“显示在侧边栏”解释为停止智能心跳计划或后台任务。 - 不提供任意本机程序启动器。 +- 首期资源监控不采集远程主机、GPU、显存或网络吞吐,不提供后台告警和历史持久化。 ## 5. 功能要求 @@ -80,8 +81,8 @@ Switch 更新成功后主导航立即生效;更新失败时恢复原状态并 ### FR-5 系统工具快捷栏 -侧栏底部提供文件浏览器、终端和浏览器三个图标按钮,并保留独立设置按钮。每个按钮具有可见 -工具提示和可访问名称。首期系统工具顺序固定为文件、终端、浏览器。 +侧栏底部提供文件浏览器、终端、浏览器和资源监控四个图标按钮,并保留独立设置按钮。每个 +按钮具有可见工具提示和可访问名称。首期系统工具顺序固定为文件、终端、浏览器、资源监控。 ### FR-6 文件浏览器入口 @@ -102,32 +103,44 @@ Switch 更新成功后主导航立即生效;更新失败时恢复原状态并 状态;新实例默认跟随当前会话。新建或跟随模式下没有活动会话时,面板显示需要选择或创建 会话的空状态;已有有效固定目标继续显示。入口不打开系统默认浏览器,也不创建旁路 WebView。 -### FR-9 快捷入口状态 +### FR-9 资源监控入口 + +点击资源监控按钮时展开助手工作栏,并打开或聚焦单实例的本机“资源监控”面板。面板显示 +整机 CPU 使用率、内存使用量与总量、磁盘读写速率,以及 GoodBuddy 桌面进程的 CPU、内存 +和进程数摘要。指标不可用时显示具体项目和原因,不能显示为 `0`。 + +资源面板处于可见活动状态、工作栏已展开且应用窗口未隐藏或最小化时,每 2 秒采样一次,在 +Renderer 内存中最多保留最近 5 分钟。任一条件不满足时停止采样;首期不在后台持续监控, +也不据此产生侧栏告警。首次采样及停止后恢复的首次采样只建立 CPU 和磁盘 IO 速率基线, +不显示伪造的 `0` 值。 + +### FR-10 快捷入口状态 工具面板已激活时,对应按钮显示选中状态;面板存在但未激活时保持普通状态。运行中、错误或 等待用户处理可以显示徽标,但必须有可访问文字,且不得自动抢占当前面板。 -### FR-10 应用导航设置 +### FR-11 应用导航设置 设置页提供“应用与工具”管理入口。首期“应用”区域列出三个内置应用并提供“显示在侧边栏” -Switch,切换后立即持久化。系统工具区域只说明其为内置固定能力,不提供虚假的卸载或停用 -按钮。 +Switch,切换后立即持久化。系统工具区域列出四项内置固定能力,不提供虚假的卸载或停用按钮。 -### FR-11 偏好持久化 +### FR-12 偏好持久化 应用可见性按设备持久化。升级时保留当前行为:已有可用内置应用继续显示;魔法笔记原有功能 启停设置保持原意,不由新的导航可见性覆盖。 -### FR-12 窄窗口行为 +### FR-13 窄窗口行为 窄窗口下主侧栏仍按现有抽屉方式显示。系统工具按钮保持单行且不与设置按钮重叠;空间不足时 -收起文字和非必要分隔,不隐藏三个系统工具或设置。 +收起文字和非必要分隔,不隐藏四个系统工具或设置。 ## 6. 权限与安全 - 快捷入口不授予新的文件、命令、网络或浏览器权限。 - 系统工具继续使用 Main、Preload、执行空间 Grant、Ask/Execute 和现有审批边界。 - Renderer 不因新增入口获得任意文件系统、PTY、进程或 Electron API。 +- 资源指标由 Main 采集并以有界结构返回;Renderer 不接收进程命令行、环境变量或任意 PID。 +- 资源样本只保存在当前 Renderer 内存中,不写入运行记录、SQLite 或遥测服务。 - 插件贡献类型只是界面与导航声明,不能代替权限清单、用户授权和运行隔离。 - 运行记录继续记录由系统工具触发的受审计操作。 @@ -136,8 +149,11 @@ Switch,切换后立即持久化。系统工具区域只说明其为内置固 - 主导航能明确区分固定系统入口和可配置内置应用。 - 运行记录在所有应用显隐组合下保持可见并可打开。 - 左下角不再用“本地工作区”与系统架构占据主要空间。 -- 文件、终端和浏览器均可从左下角打开正确的工作栏面板,且不产生第二套内容界面。 +- 文件、终端、浏览器和资源监控均可从左下角打开正确的工作栏面板,且不产生第二套内容界面。 - 连续点击系统工具不会无意创建重复的文件或浏览器实例;终端遵守多实例规则。 +- 资源监控以 2 秒间隔更新,保留不超过 150 个样本;面板不活动、工作栏收起或窗口隐藏、 + 最小化后停止请求新样本。 +- CPU、内存、磁盘 IO 或 GoodBuddy 指标不可用时,页面区分部分可用与整体失败。 - 隐藏内置应用不删除数据、不停止后台计划,并能从设置恢复;保存失败时入口保持原状。 - 键盘、屏幕阅读器、浅色主题、深色主题和窄窗口均可完成相同操作。 @@ -145,8 +161,9 @@ Switch,切换后立即持久化。系统工具区域只说明其为内置固 ### 首期 -- 重构侧栏底部,增加三个系统工具按钮和独立设置按钮。 +- 重构侧栏底部,增加四个系统工具按钮和独立设置按钮。 - 建立从 App 到助手工作栏的“打开或聚焦工具”意图接口。 +- 增加本机资源快照采集与资源监控单实例面板。 - 增加内置应用的主导航显示设置。 - 保持运行记录为固定系统入口。 diff --git a/docs/features/application-tool-navigation/technical-design.md b/docs/features/application-tool-navigation/technical-design.md index 6263683e..a3204cbf 100644 --- a/docs/features/application-tool-navigation/technical-design.md +++ b/docs/features/application-tool-navigation/technical-design.md @@ -5,7 +5,7 @@ | 项目 | 内容 | | --- | --- | | 状态 | 设计中 | -| 版本 | 0.1 | +| 版本 | 0.2 | | 日期 | 2026-09-08 | | 关联 PRD | [应用导航与系统工具入口 PRD](./prd.md) | | 功能逻辑 | [功能逻辑设计](./logic-design.md) | @@ -26,25 +26,30 @@ type WorkspaceView = ``` 文件、浏览器和终端已经由 `RightAssistantSidebar`、`WorkbarShell` 与 `workbar-contracts.ts` -承载。工作区与浏览器是单实例应用,终端是多实例应用。现有侧栏底部 `user-card` 整行打开 -设置,并显示“本地工作区”和平台架构。 +承载。工作区与浏览器是单实例应用,终端是多实例应用。代码中尚无资源指标采集和资源监控 +面板。现有侧栏底部 `user-card` 整行打开设置,并显示“本地工作区”和平台架构。 -本次改动只增加入口编排和一个从主侧栏到工作栏的命令通道,不改变各工具后端。 +本次改动增加入口编排、从主侧栏到工作栏的命令通道,以及本机资源监控的 Main/Preload/ +Renderer 最小实现。文件、终端和浏览器后端保持不变。 ## 2. 模块边界 | 模块 | 责任 | | --- | --- | | `App.tsx` | 组合主导航、系统工具栏、设置入口和页面离开检查 | -| `SidebarSystemTools`(新增) | 渲染三个系统工具按钮并发送打开意图 | +| `SidebarSystemTools`(新增) | 渲染四个系统工具按钮并发送打开意图 | | `RightAssistantSidebar.tsx` | 接收打开意图,调用工作栏实例创建或激活逻辑 | | `WorkbarShell.tsx` | 继续负责实例策略、Tab、目录和焦点行为 | | `workbar-contracts.ts` | 继续作为工作栏应用 ID 和实例布局的权威契约 | +| `resource-monitor-contracts.ts`(新增) | 定义本机资源快照、可用性和错误码 | +| `resource-monitor-service.ts`(新增) | 在 Main 中采集并规范化本机与 GoodBuddy 指标 | +| `ResourceMonitorPanel.tsx`(新增) | 按需轮询、保留有界历史并渲染资源面板 | | `application-settings-contracts.ts` | 增加应用导航偏好 schema 和默认值 | | `application-settings-store.ts` | 迁移并原子保存应用导航偏好 | | `PlatformFeaturesSettingsSection` 或独立设置 Section | 编辑“显示在侧边栏”偏好 | -不要在 `SidebarSystemTools` 中读取文件、创建 PTY 或操作浏览器;该组件只发送有界的工具 ID。 +不要在 `SidebarSystemTools` 中读取文件、创建 PTY、操作浏览器或采集系统指标;该组件只发送 +有界的工具 ID。 ## 3. Renderer 契约 @@ -54,7 +59,8 @@ type WorkspaceView = export const sidebarSystemToolIds = [ 'workspace', 'terminal', - 'browser' + 'browser', + 'resources' ] as const export type SidebarSystemToolId = (typeof sidebarSystemToolIds)[number] @@ -70,7 +76,7 @@ export type SidebarSystemToolId = (typeof sidebarSystemToolIds)[number] ```ts type WorkbarOpenIntent = { requestId: number - appId: 'workspace' | 'terminal' | 'browser' + appId: 'workspace' | 'terminal' | 'browser' | 'resources' reason: 'sidebar-system-tool' } ``` @@ -101,6 +107,21 @@ type WorkbarController = { `closing`、`exited`、`interrupted` 和 `failed` 实例保留为历史 Tab,不阻止快捷按钮创建新终端。 工作栏“+”继续按原规则创建额外终端,不受快捷按钮去重影响。 +### 3.4 资源监控工作栏应用 + +在 `workbar-contracts.ts` 中增加 `resources`: + +```ts +{ + id: 'resources', + instancePolicy: 'single', + defaultContext: 'application' +} +``` + +该应用不加入升级后的默认打开实例。侧栏资源按钮与工作栏“+”目录都通过既有单实例规则创建 +或聚焦它。 + ## 4. 应用导航偏好 ### 4.1 设置结构 @@ -202,26 +223,137 @@ type SidebarSystemToolState = { 插件市场设计需要单独确定 Host、权限、签名、生命周期和稳定 identity;不得直接复用 DeepSeek Harness 的 npm 插件市场。 -## 9. 测试 +## 9. 本机资源监控 -### 9.1 Renderer 测试 +### 9.1 采集范围 + +首期在 Main 中使用经过依赖审查的 `systeminformation` 获取整机 CPU、内存和磁盘 IO,使用 +Electron `app.getAppMetrics()` 汇总 GoodBuddy 桌面进程 CPU、内存和进程数。采集函数不接收 +Renderer 提供的路径、PID、设备名或命令。 + +首期指标定义: + +- CPU:整机忙碌时间占比,规范化为 `0` 至 `100`。 +- 内存:总字节数、可用字节数和 `总量 - 可用量` 得到的使用量。 +- 磁盘 IO:所有可用本机磁盘的每秒读取与写入字节数。 +- GoodBuddy:`app.getAppMetrics()` 返回的桌面进程聚合 CPU、工作集内存和进程数量。各进程 + CPU 先相加,再按逻辑处理器数量归一化为整机容量占比 `0` 至 `100`;不能通过截断总和处理 + 多核数值。 + +受管 Runtime、MCP 和终端子进程的逐进程指标不在首期范围。磁盘 IO 在平台或权限不足时返回 +不可用错误码,不能回退为 `0`。新增依赖在合入前需要完成许可证、维护状态、打包体积和供应链 +检查;检查未通过时应选择提供同等跨平台语义的 Main 侧实现,不能改用 Renderer Shell 命令。 + +### 9.2 快照契约 + +```ts +type ResourceMetric = + | { status: 'available'; value: T } + | { status: 'warming-up' } + | { status: 'unavailable'; reason: ResourceMetricUnavailableReason } + +type LocalResourceSnapshot = { + sampledAt: string + host: { + cpuPercent: ResourceMetric + memory: ResourceMetric<{ + usedBytes: number + totalBytes: number + }> + diskIo: ResourceMetric<{ + readBytesPerSecond: number + writeBytesPerSecond: number + }> + } + goodbuddy: { + cpuPercent: ResourceMetric + memoryBytes: ResourceMetric + processCount: ResourceMetric + } +} +``` + +所有数字必须有限且非负;百分比限制为 `0` 至 `100`,字节数设置跨 IPC 上限。`sampledAt` 由 +Main 生成。不可用原因使用稳定枚举,例如 `unsupported-platform`、`permission-denied`、 +`collector-timeout` 和 `collector-failed`,不向 Renderer 返回原始命令输出。`warming-up` 只用于 +依赖两个采样点的 CPU 与磁盘 IO,不能用于掩盖采集失败。 + +### 9.3 Preload 与 IPC + +Preload 只暴露: + +```ts +resourceMonitor.getLocalSnapshot(input: { + resetIntervalBaseline: boolean +}): Promise +``` + +对应 IPC 为 `resource-monitor:local-snapshot:get`。Main 验证可信 sender;单次采集设置超时, +并合并同一时刻的并发请求,防止多个 Renderer 重复启动系统采集。采集超时后向调用方返回 +有界错误,但底层 Promise 仍占用唯一单飞槽位,直到实际结束;在此之前不启动第二个采集 +任务。输入只接受布尔值,接口不提供任意进程、磁盘或远程主机查询。 + +合并规则区分普通请求与基线重置请求: + +- 普通请求在途时,新的普通请求复用它。 +- 普通请求在途时收到重置请求,Main 最多登记一个待执行重置;当前采集结束后再执行,不能 + 用普通请求结果满足重置请求。 +- 多个重置请求复用同一个在途或待执行重置。 +- 重置请求在途时,普通请求复用其 `warming-up` 结果,下一次时钟再取得区间值。 + +因此服务最多持有一个在途采集和一个待执行重置。调用方超时不取消这个顺序,也不增加队列 +长度。 + +面板每次从非活动状态恢复后的首次请求传入 `resetIntervalBaseline: true`。Main 消费本次 +`systeminformation` 与 Electron CPU 读数并重置区间基线,CPU 和磁盘 IO 返回 `warming-up`; +内存等瞬时指标正常返回。后续请求传入 `false` 并计算当前区间值,避免把面板停用期间计入 +速率。 + +### 9.4 轮询与历史 + +`ResourceMonitorPanel` 仅在工作栏展开、`resources` 为活动实例且 +`document.visibilityState === 'visible'` 时启动轮询: + +1. 进入活动状态后立即请求一次,并设置 `resetIntervalBaseline: true`。 +2. 此后每 2 秒请求一次;前一请求未结束时跳过本次时钟。 +3. Tab 失活、工作栏收起、页面变为隐藏或组件卸载时清理定时器,并忽略较晚返回的旧请求。 +4. Renderer 环形队列最多保留 150 个带真实时间戳的样本。 +5. 采集失败不追加伪造样本,也不持久化历史。 + +资源数据不写入应用设置、工作栏布局、运行记录或 SQLite。工作栏布局只保存 `resources` 实例 +及其活动状态。 + +## 10. 测试 + +### 10.1 Renderer 测试 - 固定入口顺序不受三个应用显隐组合影响。 - 运行记录和设置没有显隐控件。 -- 三个系统工具按钮具有名称、工具提示、键盘行为和选中状态。 +- 四个系统工具按钮具有名称、工具提示、键盘行为和选中状态。 - 文件和浏览器复用单实例;终端优先聚焦当前执行空间实例。 - 工具按钮展开工作栏但不改变当前主页面。 - 显隐更新成功后主导航立即变化,失败时 Switch 和主导航恢复原状态。 - 窄窗口下工具按钮不重叠,焦点恢复正确。 +- 资源面板只在可见活动时轮询,跳过重叠请求并把历史限制为 150 项。 +- 窗口隐藏、最小化和恢复时停止轮询并重新建立区间基线。 +- 资源部分可用、全部失败和重新进入活动状态均显示正确结果。 -### 9.2 Main 与契约测试 +### 10.2 Main 与契约测试 - 新设置字段默认值、合法 ID、重复 ID、数量上限和未知 ID 校验。 - 旧版本设置迁移后默认显示所有既有应用。 - 更新导航偏好不修改魔法笔记启停等无关字段。 - 原子写入失败时保留最后一次有效设置。 +- 资源快照拒绝 NaN、Infinity、负数字节数、越界百分比和未知错误码。 +- 采集超时、权限不足和磁盘 IO 不支持时返回有界部分结果。 +- 超时采集尚未实际结束时保持单飞,不累积新的后台采集任务。 +- 普通采集在途时收到基线重置请求,最多排队一个重置且不复用普通结果。 +- `resetIntervalBaseline: true` 时把 CPU 与磁盘 IO 标记为 `warming-up`。 +- GoodBuddy CPU 预热时,其内存和进程数仍可独立返回。 +- GoodBuddy 多进程 CPU 按逻辑处理器数量归一化,结果保持在 `0` 至 `100`。 +- GoodBuddy 摘要不包含 PID、命令行、环境变量或其他进程信息。 -### 9.3 回归范围 +### 10.3 回归范围 - 工作栏布局恢复和已关闭实例重建。 - 本地与托管 SSH 终端目标。 @@ -229,14 +361,17 @@ Harness 的 npm 插件市场。 - 设置页未保存离开确认。 - 魔法笔记待办数和智能心跳建议数徽标。 - 浅色、深色、`220px` 与 `420px` 侧栏宽度。 +- Windows、macOS 和 Linux 的真实 CPU、内存与磁盘 IO 采集;不支持项显示准确原因。 -## 10. 实施顺序 +## 11. 实施顺序 1. 增加应用导航设置 schema、迁移和设置界面。 2. 按即时保存结果组合主导航,并补充失败恢复。 -3. 拆分侧栏底部设置按钮,加入三个系统工具按钮。 -4. 为工作栏增加 `openOrActivate` 意图接口和终端匹配规则。 -5. 接入选中状态、焦点恢复、无障碍文案和响应式样式。 -6. 完成 Renderer、契约、迁移和回归测试。 +3. 增加资源快照契约、Main 采集服务和 Preload API。 +4. 为工作栏增加 `resources` 单实例和 `ResourceMonitorPanel`。 +5. 拆分侧栏底部设置按钮,加入四个系统工具按钮。 +6. 为工作栏增加 `openOrActivate` 意图接口和终端匹配规则。 +7. 接入选中状态、焦点恢复、无障碍文案和响应式样式。 +8. 完成 Renderer、契约、迁移和跨平台回归测试。 插件注册与插件市场不与首期改动一并实施。 diff --git a/docs/features/application-tool-navigation/ui-design.md b/docs/features/application-tool-navigation/ui-design.md index 016864bc..fec4bf98 100644 --- a/docs/features/application-tool-navigation/ui-design.md +++ b/docs/features/application-tool-navigation/ui-design.md @@ -5,13 +5,14 @@ | 项目 | 内容 | | --- | --- | | 状态 | 设计中 | -| 版本 | 0.1 | +| 版本 | 0.2 | | 日期 | 2026-09-08 | | 关联 PRD | [应用导航与系统工具入口 PRD](./prd.md) | | 功能逻辑 | [功能逻辑设计](./logic-design.md) | | 全局规范 | [GoodBuddy 统一界面设计系统](../../../UI-DESIGN.md) | -本文只定义入口和设置界面。文件、终端、浏览器的内容布局继续遵守助手工作栏文档。 +本文定义入口、设置和轻量资源监控界面。文件、终端和浏览器的内容布局继续遵守助手工作栏 +文档。 ## 1. 侧栏信息架构 @@ -31,7 +32,7 @@ ... ──────────────────────── -[文件] [终端] [浏览器] [设置] +[文件] [终端] [浏览器] [资源] [设置] ``` “当前对话”和“运行记录”属于固定系统入口。三个内置应用位于二者之间。侧栏底部不再显示 @@ -46,6 +47,7 @@ | 1 | `FolderOpen` | 文件 | 打开或聚焦工作区面板 | | 2 | `SquareTerminal` | 终端 | 打开或聚焦当前执行空间终端 | | 3 | `Globe` | 浏览器 | 打开或聚焦受控浏览器面板 | +| 4 | `Activity` | 资源监控 | 打开或聚焦本机资源监控面板 | | 末位 | `Settings` | 设置 | 打开设置页面 | 图标使用项目现有 Lucide 库。每个按钮采用统一的 `34px × 34px` 点击区域,内部图标建议 @@ -96,6 +98,7 @@ 文件 打开当前工作区 内置 终端 进入当前执行空间 内置 浏览器 打开 GoodBuddy 受控浏览器 内置 +资源监控 查看本机 CPU、内存和磁盘 IO 内置 系统入口 当前对话、运行记录和设置位置固定,不参与上述配置。 @@ -119,10 +122,43 @@ - 文件:激活“工作区”Tab,焦点进入目录区域或错误修复入口。 - 终端:激活匹配终端,焦点进入终端输入区;新建期间保留按钮宽度和进度状态。 - 浏览器:激活“浏览器”Tab,焦点进入工具栏;没有会话时进入空状态主操作。 +- 资源监控:激活“资源监控”Tab,焦点进入指标摘要;首个样本加载后开始绘制历史。 后台事件可以更新徽标,不能自动展开工作栏或切换当前 Tab。由用户点击快捷按钮触发的打开 属于显式操作,可以展开工作栏并切换 Tab。 +### 5.1 资源监控面板 + +资源监控使用紧凑单列,不使用指标卡片墙: + +```text +资源监控 本机 + +CPU 18% +[最近 5 分钟折线图] + +内存 9.6 / 32 GB +[使用量进度条] + +磁盘 IO 读 12 MB/s · 写 3 MB/s + +GoodBuddy +CPU 4% · 内存 620 MB · 桌面进程 7 + +更新于 14:32:08 +``` + +- CPU 折线纵轴固定为 `0%` 至 `100%`,不能根据当前低负载动态放大波动。 +- 内存同时显示使用量、总量和百分比;进度条不代替文字数值。 +- 磁盘 IO 使用每秒读写字节并按统一单位格式化,不显示累计设备字节数。 +- GoodBuddy 摘要只显示聚合值,不列 PID、命令行或环境变量。 +- 首次加载或停止后恢复时,CPU 和磁盘 IO 显示“正在建立采样基线”,不先渲染 `0%`;内存 + 等瞬时指标可以立即显示。 +- 部分可用时只在对应指标行显示“不可用”和简短原因;全部失败时显示重试入口。 +- 图表不使用动效平移;`prefers-reduced-motion` 下行为不变。 +- 面板失去活动状态、工作栏收起或窗口隐藏、最小化时停止更新;返回后重新建立区间指标基线, + 不填补离开期间的历史。 + ## 6. 文案 固定使用以下名称: @@ -134,6 +170,9 @@ | 终端系统工具 | 终端 | | 浏览器系统工具 | 浏览器 | | 浏览器说明 | GoodBuddy 受控浏览器 | +| 资源系统工具 | 资源监控 | +| 资源范围 | 本机 | +| 指标缺失 | 不可用 | | 应用显隐开关 | 显示在侧边栏 | | 内置来源 | 内置 | @@ -143,7 +182,7 @@ ## 7. 键盘和无障碍 - 底部按钮均为独立 `button`,不能嵌套在整行设置按钮中。 -- Tab 顺序为文件、终端、浏览器、设置。 +- Tab 顺序为文件、终端、浏览器、资源监控、设置。 - 图标按钮通过 `aria-label` 提供名称,工具提示不能作为唯一可访问名称。 - 工作栏打开后按现有焦点策略聚焦目标面板;用户通过固定工作栏开关关闭时,焦点返回该开关。 - 选中按钮使用 `aria-pressed` 或等价的可访问状态,不能只依靠背景色。 @@ -154,11 +193,11 @@ - 侧栏宽度 `220px` 至 `420px` 时,底部按钮尺寸不随宽度缩放。 - 窄窗口继续使用现有侧栏抽屉;工具栏不转为多行。 -- 空间不足时缩小设置按钮前的弹性空白,不隐藏三个系统工具和设置。 +- 空间不足时缩小设置按钮前的弹性空白,不隐藏四个系统工具和设置。 - 工具提示不得超出窗口;靠近底边时显示在按钮上方。 - 粗指针设备不依赖悬停,按钮的可访问名称和选中反馈保持有效。 ## 9. 未来插件入口 -插件市场交付后另行定义插件区域、固定数量、溢出和权限界面。系统入口与三个系统工具的位置 +插件市场交付后另行定义插件区域、固定数量、溢出和权限界面。系统入口与四个系统工具的位置 保持保留,不向插件开放。 diff --git a/docs/features/application-tool-navigation/user-stories.md b/docs/features/application-tool-navigation/user-stories.md index 0e354c1f..48f03308 100644 --- a/docs/features/application-tool-navigation/user-stories.md +++ b/docs/features/application-tool-navigation/user-stories.md @@ -5,7 +5,7 @@ | 项目 | 内容 | | --- | --- | | 状态 | 设计中 | -| 版本 | 0.1 | +| 版本 | 0.2 | | 日期 | 2026-09-08 | | 关联 PRD | [应用导航与系统工具入口 PRD](./prd.md) | | 关联逻辑 | [功能逻辑设计](./logic-design.md) | @@ -18,7 +18,8 @@ ### 1.2 本地工作用户 -经常查看项目文件、打开终端或使用受控浏览器,希望从任意一级页面快速进入这些工具。 +经常查看项目文件、打开终端、使用受控浏览器或检查电脑负载,希望从任意一级页面快速进入 +这些工具。 ## 2. Epic A:固定系统入口 @@ -169,14 +170,34 @@ - When 用户点击浏览器按钮 - Then 面板说明需要选择或创建对话 -### US-C6 从任意应用打开工具 +### US-C6 查看本机资源 + +作为本地工作用户,我希望快速查看 CPU、内存和磁盘 IO,以便判断任务变慢是否与本机负载 +有关。 + +验收: + +- Given 资源监控面板尚未打开 +- When 用户点击左下角资源监控按钮 +- Then 助手工作栏创建并激活单实例资源监控面板 +- And 页面显示整机 CPU、内存、磁盘读写及 GoodBuddy 桌面进程摘要 +- And 页面每 2 秒更新一次,并用图表保留最近 5 分钟 +- When 用户切换到其他工作栏 Tab、收起工作栏、隐藏窗口或最小化窗口 +- Then 资源监控停止请求新样本 +- When 用户再次显示窗口并返回资源监控 +- Then 首次采样建立区间指标基线,下一次采样开始显示 CPU 和磁盘 IO 速率 +- Given 某项指标在当前平台不可用 +- When 页面收到部分结果 +- Then 该指标显示“不可用”及原因,其他指标继续更新 + +### US-C7 从任意应用打开工具 作为用户,我希望在魔法笔记、知识库、智能心跳和运行记录页面也能打开系统工具。 验收: - Given 用户位于任意一级页面 -- When 用户点击文件、终端或浏览器 +- When 用户点击文件、终端、浏览器或资源监控 - Then 主页面保持不变 - And 右侧工作栏打开对应面板 - And 工具不会覆盖主内容或伪装成一级页面 @@ -202,6 +223,6 @@ 验收: - 工具按钮保持单行且不重叠 -- 不因宽度不足隐藏文件、终端、浏览器或设置 +- 不因宽度不足隐藏文件、终端、浏览器、资源监控或设置 - 触控点击区域符合统一界面规范 - 关闭侧栏抽屉后焦点返回原触发按钮 diff --git a/docs/features/assistant-workbar/prd.md b/docs/features/assistant-workbar/prd.md index da3994ca..92d1f301 100644 --- a/docs/features/assistant-workbar/prd.md +++ b/docs/features/assistant-workbar/prd.md @@ -36,8 +36,8 @@ Runtime 统一抽象为“执行空间”。 ### 2.1 助手工作栏 助手工作栏是 GoodBuddy 中始终可访问的应用级工具容器。它提供稳定能力目录,用户从中 -查看任务中心,并按需打开一个或多个监督、Runtime、终端、进程、工作区、浏览器和成果 -面板实例。稳定的是能力的可发现性,不是八个同时占据界面的固定面板。 +查看任务中心,并按需打开一个或多个监督、Runtime、终端、进程、工作区、浏览器、资源监控 +和成果面板实例。稳定的是能力的可发现性,不是九个同时占据界面的固定面板。 工作栏不是: @@ -83,6 +83,7 @@ Runtime 进程 工作区 浏览器 +资源监控 成果 ``` @@ -202,7 +203,7 @@ Runtime ### 6.2 能力目录与面板实例 -能力目录不等于同时打开八个面板。当前产品采用“已打开实例 Tab + 持久新增按钮”的工作栏 +能力目录不等于同时打开九个面板。当前产品采用“已打开实例 Tab + 持久新增按钮”的工作栏 模型:Tab 行只显示已打开实例,行末“+”始终可见;点击后在工作栏内容区打开稳定能力目录, 用户再创建或激活应用实例。详细交互以 [助手工作栏多终端页签 PRD](./terminal-tabs-prd.md) 为准。 @@ -435,7 +436,16 @@ type BrowserToolbarState = { 浏览器面板只管理 GoodBuddy 受控浏览器,不表示可以控制用户已安装的浏览器。 -### 7.8 成果 +### 7.8 资源监控 + +资源监控是本机单实例面板,显示整机 CPU、内存、磁盘 IO 和 GoodBuddy 桌面进程摘要。面板 +只在自身可见并处于活动状态时采样,数据保留在 Renderer 有界内存中,不进入运行记录或长期 +存储。首期不提供远程主机、GPU、显存、网络吞吐、后台告警或任意进程查看。 + +指标缺失时保留面板入口并显示不可用原因。资源监控入口、采样频率、数据契约与验收由 +[应用导航与系统工具入口](../application-tool-navigation/README.md)定义。 + +### 7.9 成果 成果面板统一显示全局、项目、Conversation、Task 执行和监督显式产生的独立成果: @@ -463,7 +473,7 @@ Task 呈现来源,不把 Run 作为导航对象。 - 不使用 `dangerouslySetInnerHTML`,不启用 Electron `webviewTag`。 - 外部打开是明确的用户操作,并说明外部浏览器可能执行脚本或联网。 -### 7.9 Composer 与任务上下文 +### 7.10 Composer 与任务上下文 工作栏不提供独立“上下文”能力。用户准备下一次模型请求时: @@ -487,6 +497,7 @@ type WorkbarCapabilityId = | 'processes' | 'workspace' | 'browser' + | 'resources' | 'results' type WorkbarTargetRef = @@ -768,6 +779,7 @@ remote_operations 其中: - 工作栏偏好只保存能力目录顺序、面板实例、停靠布局、尺寸和目标引用。 +- 资源监控只保存面板实例,不保存采样结果或历史曲线。 - 主机表只保存非敏感元数据和加密凭据引用。 - 应用重启后先通过远程 Daemon 的 journal、lease、boot identity 和 event cursor 核对活动 终端、进程与 Runtime;无法确认时标记 `interrupted` 或 `outcome_unknown`。 @@ -787,7 +799,7 @@ Renderer 只通过显式方法访问: - 终端创建、输入、调整大小、关闭和有界输出订阅。 - 受管进程列表、日志和允许的控制动作。 - Runtime Inspector 快照、事件和允许的控制动作。 -- 工作区、成果、浏览器和监督的既有或扩展服务。 +- 工作区、成果、浏览器和监督的既有或扩展服务,以及有界的本机资源快照。 每个 Main Handler 都必须验证可信发送者、Zod 输入、对象归属和当前状态。不得暴露 raw Electron、ChildProcess、PTY、SSH Client、Socket 或文件句柄。 @@ -867,6 +879,7 @@ Electron、ChildProcess、PTY、SSH Client、Socket 或文件句柄。 ### 阶段 1:成果与 Runtime 可观测性 +- 本机 CPU、内存、磁盘 IO 和 GoodBuddy 桌面进程摘要的按需资源监控。 - 通用 Artifact Event。 - HTML 工作区和成果的静态即时预览。 - Runtime Inspector Snapshot 与事件。 @@ -928,7 +941,7 @@ Electron、ChildProcess、PTY、SSH Client、Socket 或文件句柄。 ### 17.1 稳定能力目录与用户控制 -- [ ] 八个标准能力在所有主要页面的目录中始终可发现,但不会默认同时打开。 +- [ ] 九个标准能力在所有主要页面的目录中始终可发现,但不会默认同时打开。 - [ ] Task Center 继续作为 Task 的单例索引,不删除入口、不复制会话,也不混入 Job、Run 或心跳事项。 - [ ] 项目、会话、Runtime 或主机变化不会无提示地增删能力目录项。 - [ ] 用户可以按需打开、关闭、排序和停靠面板实例。 @@ -1004,6 +1017,6 @@ Electron、ChildProcess、PTY、SSH Client、Socket 或文件句柄。 定义 Host 级组件获取、首次准备、更新、回退和项目只验证边界。 - [统一界面设计系统](../../../UI-DESIGN.md) 定义视觉、语义、响应式和无障碍规则。 -若其他文档把工作栏描述为八个同时固定显示的栏目、根据项目或 Runtime 自动裁剪的动态入口, +若其他文档把工作栏描述为九个同时固定显示的栏目、根据项目或 Runtime 自动裁剪的动态入口, 或仅属于当前聊天的附属区域,以本文“能力目录稳定、面板实例由用户打开、当前上下文只提供 默认值”的产品决策为准。 diff --git a/docs/roadmap/long-term-assistant-roadmap.md b/docs/roadmap/long-term-assistant-roadmap.md index dafaa7b5..307cc27c 100644 --- a/docs/roadmap/long-term-assistant-roadmap.md +++ b/docs/roadmap/long-term-assistant-roadmap.md @@ -52,7 +52,7 @@ GoodBuddy 应能够: Task 时不保留空的 Task 上下文栏。 - 右侧栏在对话、知识库和活动视图之间保持状态。 - 知识图谱实体详情复用同一右栏容器,不再维护独立布局。 -- 八个标准能力固定可达;能力、连接和数据状态可以变化,但应用不按当前上下文自动隐藏入口。 +- 九个标准能力固定可达;能力、连接和数据状态可以变化,但应用不按当前上下文自动隐藏入口。 - Task Center 是 Task 的单例索引;其他可绑定目标的能力支持跟随当前上下文或固定到用户选择的目标。 ### 3.2 右侧工作栏 @@ -327,9 +327,9 @@ GoodBuddy 应能够: ### 8.1 右侧栏 - 三种窗口宽度下布局可用。 -- 八个标准能力在主要视图中固定可达,应用不按能力自动隐藏。 +- 九个标准能力在主要视图中固定可达,应用不按能力自动隐藏。 - 跨主视图切换保持栏目、折叠、跟随和固定目标状态。 -- 任务中心、监督、Runtime、终端、进程、工作区、浏览器和成果更新不要求离开当前主任务。 +- 任务中心、监督、Runtime、终端、进程、工作区、浏览器、资源监控和成果更新不要求离开当前主任务。 - 键盘可操作,并具备正确 ARIA 标签。 ### 8.2 Projects