前端
ui/ 是 SolidJS + TypeScript + Tailwind v4 的单页界面,由 Vite 构建。不在 Tauri 中运行时(start.bat ui),lib/ipc.ts 改用 lib/mock.ts 的模拟数据,方便在浏览器里调样式;模拟数据不会进入 Tauri 构建的运行路径。
目录
| 路径 | 内容 |
|---|---|
src/lib/error-report.ts、src/lib/ipc.ts |
为未捕获异常和 IPC 失败提取固定错误类别、数值错误码及同源应用脚本的行列位置,IPC 仅附命令名,不附参数。前端限频后由宿主再次校验;异常原文、原始堆栈、外部地址和查询参数不进入诊断日志 |
src/main.tsx |
入口:先取得 app_info 中的界面语言再渲染,避免先以错误的语言显示;未捕获的页面错误由 error-report.ts 提取类别、错误码与应用脚本行列位置后写入日志(开发服务器热更新过的页面只留在控制台) |
src/App.tsx |
外壳:页面切换与过渡、全局键盘快捷键、文件拖放 |
src/components/ |
页面:ProcessTable、Performance、ServicesPage、StartupPage、ConnectionsPage、HistoryPage、Settings。外壳与通用组件:Toolbar(兼作标题栏:左侧是 Argus 的图标与名称和页面的视图与筛选控件,中间是页面的搜索框,右侧是对所选项目的操作、刷新与暂停等,空白处可拖动窗口)、Nav(页面导航:左侧导航栏,可收起为仅显示图标;或工具栏下方的一行标签)、Caption(最小化、最大化、关闭按钮)、Select(下拉框,取代原生 <select>)、Vitals(概况带)、StatusBar、DetailsPanel(详细信息面板:默认常驻,显示所选的行;未选中时为 SystemOverview,列出本机的处理器、内存、存储、网络、显卡与电池,单击转到性能页的对应设备,并提示面板的用法;左缘的手柄调整宽度)、Splitter(窗格边缘调整宽度的手柄,性能页的设备列表与详细信息面板共用)、DataTable(虚拟化表格,置顶的行排在最前并以分隔线隔开)、Trace(实时曲线)、Overlays(右键菜单及一级子菜单、确认框、提示;提示可带操作按钮,指针停留或键盘焦点在其中时不消失,带着焦点关闭时焦点回到进入前的元素)、ProgressBar(进度条:已知进度时以合成器上的 WAAPI 线性动画滑到每次报告的进度,未知时显示来回扫过的色段)、FileLockDialog、Onboarding(首次启动引导)、UpdateDialog(更新对话框:待安装的版本与当前版本、大小与签名、此后各版本的更新内容;或当前版本的更新内容,取自构建时打包的 CHANGELOG.md 与 CHANGELOG.en.md;并在窗口可见、引导结束后为每个版本提示一次;在其他对话框之上时独占 Esc) |
src/lib/updates.ts |
更新状态(宿主 update-status 事件)、标题栏更新按钮显示的版本与“此版本不再提醒”、更新对话框的打开状态、安装前记下原版本供更新后显示变化;新版本首次启动时按设置显示更新内容或提示已更新,比较原生设置中已处理过的版本(release-notes.ts 的 firstStart),每个版本一次,等窗口可见、引导结束后再显示,由任务管理器替换启动时留到下次;托盘菜单项与就绪提示打开的更新对话框同样等引导结束 |
src/lib/background.ts |
最小化与后台常驻时的刷新间隔:可选的几档、短于 5 秒时的确认,以及窗口回到前台(argus-restored)时提示期间的刷新间隔,两种提示的“不再提醒”分开保存;回到前台时正显示引导、更新对话框或确认框,或新版本首次启动的更新内容尚未显示完毕时,这一次不提示;页面画出第一份数据后告诉宿主(page_painted),从托盘启动的窗口此后才让 WebView 休眠 |
src/lib/toast-clock.ts |
提示条何时消失:到时、指针停留或键盘焦点在其中时保持、两者都离开后稍等片刻;不依赖界面,由 ui/tests 中的测试直接运行 |
src/lib/escape.ts |
哪些 Esc 可关闭界面:单独按下、不是长按的自动重复、没有修饰键、未被其他处理占用;首次启动引导用它判断,按住 Ctrl+Shift+Esc 打开 Argus 时的 Esc 因此不会关闭引导并记为已完成;不依赖界面,由 ui/tests 中的测试直接运行 |
src/lib/release-notes.ts |
更新内容:拆分 CHANGELOG.md 条目、按语义化版本筛选两版本之间的条目、把条目解析为段落与分类列表(去掉提交范围和提交链接)、统计每个版本的更改条数(不计已知限制;生成的条目把带 ! 的 feat、fix 提交在破坏性变更和所属类别下各计一次);把 CHANGELOG.en.md 中同一版本的条目并作英文译文(withTranslation),按界面语言选用译文,没有译文时用中文(readable);不依赖界面,由 ui/tests 中的测试直接运行。发布脚本 scripts/release.mjs 也用它拆分条目、找出不是条目标题的二级标题,发布内容与应用读到的条目因此一致 |
src/components/ReleaseNotes.tsx |
设置页内嵌卡片与更新弹窗共用的版本对比、日期和更新内容:分类标签、加粗、代码及可折叠版本列表使用同一排版(卡片只展开最新版本、高度有限;弹窗展开全部版本,内容区占满弹窗随窗口高度伸展后余下的空间);按界面语言显示,有版本缺少译文时在列表下方说明;下载进度变化时保留展开状态和阅读位置 |
src/lib/core-grid.ts、src/lib/grid-reflow.ts |
逻辑处理器网格按可用宽高、标题栏和最小图表尺寸选列,接近临界尺寸时保持当前排列。grid-reflow.ts 为小图网格的一次性变化播放合成器动画:留下的卡片从原位置移动、缩放到新位置,新卡片放大淡入,移除的卡片由网格暂留在原位置(绝对定位,压在其他卡片之下)淡出;仅对可见范围内的卡片播放,完成、关闭动画或离开页面时释放 |
src/lib/store.ts |
应用状态:实时快照、滚动历史(每个进程一份,按应用分组另存合计)、视图偏好;仅在进程页计算分组、筛选与排序,返回该页时使用最新快照 |
src/lib/process-search.ts |
进程页搜索框的入口:Ctrl+F 与 /、在列表中直接键入(追加在原有内容之后)、Esc 回到原来的焦点。进程列表挂有 EditContext,输入法在列表获得焦点时即可组字:组字过程作为预编辑文字显示在搜索框中而不参与筛选,候选窗口按搜索框的位置打开,选定后移入搜索框;列表通过 caret-color: transparent 隐藏浏览器默认绘制的文本插入光标,搜索框保留正常光标;不支持 EditContext 的内核不受影响 |
src/lib/list-focus.ts |
进程页的键盘焦点停在哪里:进入页面时将导航控件上的焦点交给列表;页面内焦点将落空(窗口回到前台、单击空白处、菜单或提示条关闭)或单击后留在按钮上时交还列表,输入框、弹窗、菜单、按住的指针与选中的文字除外,页面内用 Tab 移到按钮上的焦点保持不变。焦点在不可编辑的元素上时,Chromium 只给输入法只读的空文档,微软拼音等会吞掉第一个键;判断部分不依赖 DOM,由 ui/tests 中的测试直接运行 |
src/lib/refresh-pause.ts、src/lib/shortcuts.ts |
手动暂停与 Ctrl 临时暂停的状态、按顺序发送暂停命令,以及本地快捷键的修饰键、重复与输入法判断,包括哪些按键可在进程页直接开始搜索(startsSearch);不依赖界面,由前端单元测试覆盖 |
src/components/ShortcutHelp.tsx |
设置页的快捷键说明弹窗,显示当前全局快捷键及页面、进程列表和历史曲线的按键;保持弹窗内键盘焦点,关闭后回到打开按钮 |
src/lib/chart-scale.ts |
自动缩放图表的上限:在标签所用的单位(KB/s–GB/s、Kbps–Gbps)下把峰值向上取整,不超过 10 取整数、超过 10 取整十数,满一千进到下一个单位,并生成上限标签;不依赖界面,由 ui/tests 中的测试直接运行 |
src/lib/chart-history.ts |
实时曲线的时间跨度、显示延迟与历史保留:按时间窗口保留采样,所有序列与时间戳一同裁剪;额外刷新、较快的后台采样或刷新间隔变化不会提前删除仍在窗口内的数据;不依赖界面,由 ui/tests 中的测试直接运行 |
src/lib/ipc.ts |
与宿主通信 |
src/components/NewTaskDialog.tsx、src/lib/task-command.ts |
各页面共用的新任务弹窗与输入校验:浏览文件、启动参数、管理员选项,失败与取消授权后保留输入,弹窗内保持键盘焦点 |
src/lib/explorer.ts、src/components/menus.tsx |
打开资源管理器右键菜单时按需核对桌面实例,提供重启确认、进度及恢复入口,不增加采样工作 |
src/lib/i18n.ts |
文案查找(t、rich)、当前语言信号、按语言缓存的 Intl 对象;文案在仓库根目录的 locales/,见多语言 |
src/lib/language.ts、src/lib/keys.ts |
切换语言(保存到原生设置后应用宿主解析的结果);快捷键的显示名称与错误说明 |
src/lib/hotkey.ts、src/lib/hotkey-table.json |
全局快捷键的规则与录制:键表和不允许的组合(与原生侧共用)、解析与判定(允许、需确认、拒绝)、按键事件到组合的纯函数 record;不依赖界面,由 ui/tests 中的测试直接运行,见全局快捷键 |
src/lib/rows.ts |
把进程快照整理成三种视图要渲染的行 |
src/lib/process-identity.ts、src/lib/process-label.ts |
统一进程分组身份与显示名称:普通程序按映像路径、WebView2 按浏览器实例分组,未知路径与通用宿主保留独立实例;资源历史、选择、详细信息和组操作使用同一分组键 |
src/lib/process-sections.ts |
将按名称排序的行分为应用、后台进程和 Windows 进程;展开成员跟随所属组,标题只统计顶层条目,并汇总顶层条目的资源合计;折叠的分组只保留标题(状态随界面偏好保存),搜索时一律展开;虚拟列表区分标题与数据行高度,行顺序暂缓更新时仍维持分类边界 |
src/lib/visible-poll.ts |
服务、启动与连接页的可见性轮询:窗口隐藏或最小化时停止,恢复显示时立即刷新,离开页面时清理 |
src/lib/order-hold.ts |
进程列表何时暂停重新排序(指针在列表上、右键菜单或确认框打开),以及状态栏何时提示:仅在指针单独造成暂停时提示,菜单或确认框打开时不提示;不依赖界面,由 ui/tests 中的测试直接运行 |
src/lib/process-io.ts |
进程磁盘读写的合计与排序:合计只累加有读数的进程,全部缺失时为空;缺失值在升序和降序中都排在最后;暂无读数的原因(有进程已有读数时只是新进程尚待刷新,否则按管理员权限与特权服务的状态区分);不依赖界面,由 ui/tests 中的测试直接运行 |
src/lib/engine-grid.ts |
GPU 引擎图的布局:所有图排在等大的单元上,铺满、不留空位。网格在引擎数能分成行 × 列时每张图占一个单元(按区域选最易读的行列),不能整除时排成一行(读得清时),或由第一个图占去多出的单元;焦点按引擎数预设版式(第一个图占一块近似正方形的单元,其余各占一个,排在旁边或围成 L 形),高而窄的区域转为竖排,单元低于最小尺寸时换用同一数量较紧凑的预设;列表每个引擎一行。不依赖界面,由 ui/tests 中的测试直接运行 |
src/lib/gpu-engines.ts |
性能页 GPU 视图显示哪些引擎:默认智能显示(曲线时间范围内占用达到 1% 的引擎,按排列顺序;都空闲时保留第一个),或用户选的数量与各图的引擎(同一引擎换位时互换,未显示的引擎替入时被替下的排到其后;在智能显示下改选时从屏幕上的图开始),驱动改名或去掉的引擎跳过;按显卡型号保存,适配器 LUID 每次开机都会变;不依赖界面,由 ui/tests 中的测试直接运行 |
src/lib/row-marks.ts、src/lib/marks.ts、src/components/RowMarks.tsx |
服务、启动与连接页的备注与置顶:备注整理为一行并限制长度,每页一份随界面偏好保存;服务按服务名称、启动项按标识记忆,连接按程序与端口记忆(监听端口、UDP 端口及其接受的连接按本地端口,主动发起的连接按远程地址和端口),PID 变化后仍然有效;名称后的备注标签、名称列末端的图钉、右键菜单项与备注弹窗。row-marks.ts 不依赖界面,由 ui/tests 中的测试直接运行 |
src/lib/history-gaps.ts |
历史曲线的断档与悬停读数:哪些相邻点连成线(兼顾较长的后台刷新间隔)、某一时刻显示哪个点;不依赖界面,由 ui/tests 中的测试直接运行 |
src/lib/privilege.ts |
状态栏权限标记的状态:管理员、特权服务已连接或标准权限;窗口显示时每 30 秒检查一次服务;进程表和详细信息面板中磁盘读数缺失时的提示按这里记录的服务状态选择 |
src/lib/kernel-setup.ts |
设置页与首次启动引导共用的内核传感器操作:防止重复请求,跨页面保留准备状态和错误,操作完成后刷新设置;仅在显式开启时调用宿主准备驱动 |
src/components/CpuTelemetry.tsx、src/lib/cpu-sensors.ts |
CPU 扩展读数按类别分卡片显示,并提供卡片标题行的摘要(性能页 CPU 的“详情”页);元数据定义单位与精度;每核表格以物理核心编号保持行节点稳定,只显示有读数的列,窄窗口在表格内部横向滚动 |
src/lib/motion.ts |
动画偏好(界面动画、曲线动画四档)、屏幕刷新率测量、Fluent 缓动曲线与进出场辅助 |
src/lib/actions.ts |
面向用户的进程操作:确认、执行、反馈;特权服务版本不兼容导致权限不足时(结束进程树时也包括其中的子进程),失败提示附“更新服务”按钮,转到设置中特权服务的卡片;这样的提示同一时刻只保留最新的一条 |
src/lib/action-errors.ts |
操作失败(ActionError)对应的提示文案,以及是否提示更新特权服务;不依赖界面,由 ui/tests 中的测试直接运行 |
src/lib/prefs.ts |
界面偏好的响应式缓存:渲染前从宿主恢复并迁移旧版 localStorage,各次更改保存到配置目录;浏览器预览仍使用 localStorage,开发版与正式版按应用标识隔离 |
src/lib/appearance.ts |
界面缩放与基础字号;宿主通过 WebView 缩放保持画布和鼠标坐标一致,文字使用相对字号,最大化按钮位置按实际缩放比例报告 |
src/lib/types.ts |
与 argus-core 的 serde 类型一一对应,需要保持同步 |
src/styles.css、pages.css、tables.css |
样式与设计令牌 |
tests/ |
单元测试:pnpm test:ui 用 node 直接运行其中的 *.test.ts,只能导入不依赖 Solid 与 i18n.ts 的模块 |
表格更新
DataTable 的列通过访问器读取当前行,数据刷新只更新绑定的文字与属性,保留单元格节点;选择与操作目标取当前行。进程表的滚动区域独立合成,减少快速滚动时的图层整理开销。快照采集与历史记录按原有节拍运行,页面轮询仅在窗口可见时运行。
各页面、侧栏与弹窗的纵向滚动区域预留滚动条位置,内容展开或筛选时宽度保持不变。性能页的设备列表按外层容器确定内容宽度,避免空滚动条区域随主线程动画重复重绘。进程表与每核数据表也预留横向滚动条高度,避免列宽变化挤动其他内容;快捷键说明弹窗保持固定的可用高度,分组展开时只在正文内滚动。
历史曲线
components/HistoryPage.tsx 的曲线是静态的:按查询(切换范围、窗口宽度停止变化后、跟随最新数据时每 10 秒到 5 分钟)各画一次,悬停只移动光标元素。每次查询按图表宽度约每两个像素一个点分桶,点与点之间远超分桶间隔的地方是 Argus 没有运行的时段,留出断档。最小化或后台常驻时的刷新间隔可长达 30 秒,帧也随之变稀,所以是否断开还看两侧的帧距:相邻两点的距离超过分桶间隔与两侧较宽帧距(不超过 35 秒)中较大者的 2.5 倍才算断档;悬停读数在连成线的两点之间取较近的一点,在断档处没有读数(lib/history-gaps.ts,ui/tests 有测试)。
实时曲线
components/Trace.tsx 在 canvas 上绘制曲线:每次采样只画一次,之后由合成器沿时间轴连续移动画布,主线程不参与;上限变化时只重画画布,按曲线动画的模式缓动到新上限。实现要点见曲线动画。