mcp server
proc
Rust TUI interactive process manager with network analysis, USB detection, Docker monitoring, security scoring, and terminal recording
Set up
Runs on your computer. Pick your agent and operating system.
This project does not publish an install method we can turn into a config. Follow the README instead.
README
synced Oct 27, 2026proc
Rust 编写的交互式 TUI 系统进程管理器。把 进程管理 + 网络分析 + USB 占用 + 监控 + Docker + 安全评分 + 降频检测 + 磁盘 I/O + 终端录屏 + 告警 + SMART 磁盘健康 + per-process 网络流量 + DNS 查询日志 + 容器 exec 融合到一个 TUI 中,并通过 MCP server(外部 LLM → proc)+ 内置 AI agent(proc → LLM,v0.20)双向接入 LLM。Windows-only 应用(Windows 10 1809+ / Windows 11 x64,详见 ADR-0022)。
项目概览
TUI 主界面 → AI Agent 面板一次 tool-use(本地 Gemma E2B 推理:query → tool 调用步骤行 → streaming 回答;35s 实录,ShareX 采集)
量化亮点(实测口径见 docs/performance.md;规模数字为 v0.27.0 收尾态实测 2026-09-04,v0.26.0 时点值 65,099 / 27,480 已随 v0.27 代码演进):
| 工程规模 | 质量门禁 | AI / agent |
|---|---|---|
| 65,114 行 src 代码 / 27,518 行测试代码 | 全量回归双档 1744 + 1768 passed / 0 failed(默认 + --features anthropic,本地与远端 CI 同口径) | 内置 AI agent(本地 LLM 默认,数据零外发)+ 46 个 MCP tools |
| 80 个 test binaries / 27 个 release tag | 远端 CI 三 job 全绿(check / msrv / audit,ADR-0037)+ fmt + clippy 双档 -D warnings / cargo-audit / gate.sh 快档 29s | 70 query eval 基准 + 六列实验矩阵 + 方差带判读纪律(见下方「AI Agent 与 eval 纪律」) |
| 37 份 ADR / 63 条 TD ledger | proptest 属性测试(FilterExpr roundtrip)/ 198 处 unsafe 逐处审计口径(miri 防线移除决策见 ADR-0037 D5) | RAG 经验召回(默认 off)+ session JSONL 观测 |
架构分层
graph TB
subgraph UI["UI 层"]
TUI["TUI(ratatui)<br/>10 主面板 · Ctrl+P 命令面板<br/>FilterExpr 表达式过滤"]
CLI["CLI(clap)<br/>23 顶层子命令 · JSON 导出"]
MCPCLIENT["外部 LLM client 接入<br/>Claude Desktop / Cursor 等"]
end
subgraph PANELS["领域面板"]
PP["进程列表 / 树 / 应用分组"]
NP["端口/网络 · DNS 日志"]
OP["USB · 监控 · Docker"]
AP["AI Agent 面板"]
RP["录屏 / 回放"]
end
subgraph CTRL["App controllers(从 App 上帝对象拆出,ADR-0012)"]
PC["PanelController ×5<br/>+ InspectorController(详情页 6 Tab)<br/>+ ReplayController"]
AS["AgentSession<br/>sync TUI 主循环 × async runtime 桥接"]
end
subgraph WORKERS["worker 层(独立线程 + channel,主线程 50ms tick 不阻塞)"]
SW["SnapshotWorker<T> 泛型采集抽象<br/>Light 1s / Heavy 2s / Smart 30s<br/>DNS 500ms / NetFlow 1s"]
WM["WorkerManager<br/>panic 指数退避重启 5s/30s/5min<br/>crash report + TUI banner(ADR-0019)"]
end
subgraph COLLECT["采集层(Windows)"]
SYS["sysinfo<br/>进程 / CPU / 内存"]
ETW["ETW ×3(手写 windows-rs)<br/>DNS 查询 / Schannel SNI / 磁盘 IO"]
NT["NT API<br/>句柄枚举 / TCP estats / 进程控制"]
MISC["smartctl 磁盘健康<br/>bollard Docker API"]
end
subgraph CROSS["横切能力"]
SEC["security<br/>18 项安全评分 · self-mitigation<br/>restricted spawn · env 脱敏"]
REC["record-replay<br/>VT100 + UiFrame 双格式<br/>书签 / 时间轴搜索 / 倒放"]
MCPS["MCP server<br/>46 tools(rmcp)<br/>stdio + SSE transport"]
AGENT["AI agent<br/>LlamaCpp / Anthropic / Mock 三 provider<br/>tool registry 两层架构 + RAG + eval"]
end
UI --> PANELS
PANELS --> CTRL
CTRL --> WORKERS
WORKERS --> COLLECT
SEC -. 约束 .-> COLLECT
MCPS -. 暴露 .-> CTRL
AGENT -. 调用 .-> MCPS
与同类工具对比(数据 as of 2026-08-31,GitHub API 核实)
| btop | bottom | System Informer | glances | proc | |
|---|---|---|---|---|---|
| 语言 | C++ | Rust | C | Python | Rust |
| stars | 34,329 | 13,954 | 15,732 | 33,483 | 1 |
| 最新 release | v1.4.7(2026-05-01) | 0.14.9(2026-08-27) | 4.0.26241(2026-08-29) | v4.5.6(2026-08-01) | v0.25.0 |
| 内置 AI agent | 无 | 无 | 无 | 无 | ✅ 本地 Gemma E2B 默认 + Anthropic 云端 opt-in |
| MCP server | 无 | 无 | 无 | 无 | ✅ 46 tools(stdio + SSE) |
「无」= 四竞品仓库 README 全文关键词扫描(AI agent / MCP / LLM / model context protocol)零命中,2026-08-31 实测。竞品性能数字与功能完整性未核实,不列入(宁缺毋滥)。btop 的 Windows 支持由作者另维护的 btop4win 移植提供(最后更新 2025-10-12)。
v0.26.0(2026-09-02)— 秋招展示冲刺 cycle(评估者视图 + 质量门禁自动化 + 测试深度):轻 cycle(~2200 行级 doc 为主,零挂机),把工程强度从 docs 深处搬到评估者 10 分钟可见处——(1) README 评估者视图(本段上方:mermaid 分层架构图 + 量化亮点条 + 竞品对比表 as-of 2026-08-31 GitHub API 核实 + badge/GIF 占位);(2) AI Agent 与 eval 纪律章(六列实验矩阵 + 方差带 ±3/±6 标尺 + 预登记换默认门槛(净通过差 ≥ +7 且 L2 方向性)+ 负结果三连归档叙事,数字逐个对回 REVIEW 原文);(3) 质量门禁自动化(gate.sh 两档——快档稳态 29s / 全档含回归双档 + R1 llama e2e flaky 根治(自身子进程 PID 断言替代全局 tasklist 扫描)+ pre-push hook opt-in + GitHub required checks 设置说明——R2「变更落在人工验证之后」的结构性关闭,首跑即拦截 fmt 违规);(4) 性能叙事(docs/performance.md:7 项 bench 25 数据点 vs v0.13 同机对照全无回归,refresh_heavy 2.9× 溯源 TD-47
4c7e294,其余提升不写无依据归因);(5) 设计深挖导览(docs/architecture-deep-dive.md:10 条设计决策 × L1/L2/L3 三层深挖 + 证据链接);(6) 测试深度(proptest FilterExpr roundtrip 属性测试 ×2(dev-dep +1 proptest 为预登记批准,runtime deps +0 延续)+ docs/unsafe-audit.md 198 处 unsafe 分布判读 + 4 处 SAFETY invariant 注释)。MCP tool 46 / agent catalog 47 不变锚全程保持;回归双档 1744 + 1768 passed / 0 failed(80 test binaries)。详见 ADR-0036 + REVIEW-v0.26 + CHANGELOG。
v0.20.0(2026-08-17)— 内置 AI agent + Tool registry 两层架构 cycle:proc 历史上第二大 cycle(~3000 行,5 stage),proc 从「MCP server 暴露给外部 LLM」扩展为自身有 LLM 调用能力——CLI
proc agent ask "我电脑为什么这么卡?"自然语言 query → agent 多步 tool-use 循环(Gemma 4 E2B 本地推理调 proc_ls / proc_metrics_system 等 → 结果回填 → Markdown 总结)。(1) multi-provider 抽象(LlmProvidertrait + LlamaCpp 本地默认 / Anthropic 云端 opt-in / Mock fixture 回放三 impl,同一份 agent 代码零改动跑三种 provider);(2) Tool registry 两层架构(entry 4 tool 起步 +proc_help(category)元 tool 动态发现剩余 43 个——单轮 tool-context 从 ~15K 降至 ~1.5K token 峰值,96% 减少,2B 模型可驱动);(3) 小模型可靠循环实测结论(few-shot 对话示例让 E2B 角色扮演编造结果→删;tool_choice=required+proc_finish控制 tool 强制结构化;proc_help 发现的 schema 动态加入 tools 数组);(4) 隐私架构(本地 Gemma E2B 默认数据零外发 + 写操作 8 tool confirm gate 拦截 + PII 12 关键字过滤 + API key 只走 env 不落盘);(5) Mock fixture 基础设施(50 query 真实 E2B 响应 JSONL 录制 + 确定性回放,CI 零 LLM 调用)。E2B 验收 QUICK 18/18 / FULL L0 23/23(含 2 个口径 artifact 放宽)+ L1 21/27(78%,τ²-bench 基线 29.4% 的 2.6 倍);Sonnet 云端对照 deferred(无 API key,TD-55)。MCP tool 总数 46 → 46(不变)。详见 ADR-0030 + CHANGELOG。
v0.17.0(2026-07-10)— 5 主题大 cycle(性能 + 可观测性 + VT100 + record + 写操作):proc 历史上最大 cycle(
5540 行业务代码 + 测试 + ADR/doc),5 主题合并全交付——(1) 主题 A 性能优化(TD-470029 + REVIEW-v0.17 P0 0 / P1 2 / P2 8,不触发拆分)。详见 CHANGELOG。parent_chain: Vec<(u32, Arc<str>)>零 heap alloc + TD-54 MCP handler 持久snapshot字段 1s tick refresh + TD-44 itoa + TD-45 bincode encoding 选项层 + TD-50proc_smartdeprecated);(2) 主题 B 可观测性(rmcp 0.11ResourceRoutetrait 暴露 3 资源 URI + SSE transport 结构化 stub + TD-52 sparklineproc_metrics_historytool 30s 历史采样);(3) 主题 F VT100 replay(Vt100ToUiFrameConverter1:1 映射澄清 ADR-0028 misreading + 透明转码路径 + RAII 临时文件,VT100 录屏现享受 search / 倒放 / 书签全部能力);(4) record 暴露(spawnproc record --no-tui子进程 +record_handle跨 tool call 保活 +confirm: bool必传 gate,ADR-0029 翻盘 ADR-0025b);(5) USB release + docker-rm 写操作(proc_usb_release三步链路 kill + flush + eject +proc_docker_rm/image_rm/volume_rmbollard API)。MCP tool 总数 39 → 46(+7 tool)。cycle 7 stage 全交付(5 主题 + 4 份新 ADR 0026
v0.15.0(2026-07-06)— MCP 全功能暴露 cycle(查询类):把 proc 已落地但 MCP 未暴露的查询类能力全部透出给 LLM agent——(1) MCP 模块骨架重构(
handler.rs单文件 1156 行 →handler/{mod, cli, inspect, metrics}.rs4 子 module,ADR-0024);(2) CLI 命令 9 tool 直接暴露(proc_flows/proc_throttle/proc_export/proc_docker_inspect/proc_docker_images/proc_docker_volumes/proc_docker_events/proc_monitor_add/proc_monitor_remove);(3) 详情页 6 Tab 合并 1 个proc_inspect(pid, tab=...)tool(ADR-0023,schema 自描述,与 v0.7 既有proc_handles互补);(4) 系统级 metrics 5 tool(proc_metrics_system/gpu/disk_io/smart/thermal,让 agent 看到系统全貌)。MCP tool 总数 17 → 32(agent 视角最大价值缺口补完,写操作 + 录屏类留 v0.16)。cycle 4 stage 全交付(1700 行业务代码 + 39 新集成测试 + REVIEW-v0.15 P0 0 / P1 3 / P2 5,TD-5054 归档)。详见 CHANGELOG。
v0.14.0(2026-07-06)— 录屏回放 v2 cycle:4 大能力补完录屏事后分析体验——(1) 文件格式 v3 按需加载(解决长 session OOM:30 min × 1000 进程从 9s 启动 + 10 GB RAM 优化到 < 100ms + ~12 MB,PERF-BASELINE TD-45 闭环)+
RecordingFooter元数据 + v1/v2 老文件.prec.idxsidecar 兼容 + CLI--info不开 TUI 输出元数据;(2) 书签系统(b录制时添加 /B回放时打开面板 /.bookmarks.jsonsidecar 持久化);(3) 时间轴搜索(/进入 FilterExpr 5 维度:cpu > 80/mem > 500mb/name =~ /chrome/i/anomaly.severity = critical/timestamp > ...+ substring 模式 +n/N跳转 + timeline●高亮);(4) 倒放(r切方向 + tick 双向分支 + timeline▶/◀/⏸三态,倒放到首帧自动暂停与正向到末帧暂停对称)。cycle 5 stage 全交付(方案 A 完整 v2,~1750 行业务代码 + 127 新测试);REVIEW-v0.14 P0 0 / P1 1 / P2 1,TD-49 归档(VT100 replay 无倒放/搜索 + 长录屏搜索遍历优化)。详见 CHANGELOG。
v0.13.0(2026-07-05)— 性能 baseline cycle:建立 criterion benchmark suite(6 个 hot path × 多档 fixture = 25 数据点)+ 产出 PERF-BASELINE 报告。用户拍板方案 c:验证 proc 当前架构在 1000 进程规模下无显著性能瓶颈,跳过 stage 3+ 优化。cycle 全程不动业务代码(1115 passed / 0 failed / 3 ignored 基线不变);4 个候选项(parent_chain Arc 重构 / tui format! 风暴 / record deserialize 加速 / command_palette fuzzy)归档 tech-debt TD-44/45/46/47 留 v0.14+ cycle 评估(含 1 个侦察报告误读纠错)。
v0.12.0(2026-07-04) Windows-only 平台定位 + UX polish cycle:ADR-0022 锁定 Windows-only 决策(移除全部 Linux/macOS 代码——src/ebpf/ 整模块 + src/psi.rs + nvtop / nethogs / unsupported.rs 删 + ~25 文件 cfg gate 清理)/ 签名验证完整度(SignatureStatus 9 状态机加 Expired/UntrustedRoot/ChainError + TRUSTED_SIGNERS 扩到 24 vendor + 用户配置
trusted_signers.toml)/ FilterExpr 修复(mem > 50%按总内存换算 silent bug + regex\/escape 让 CIDR / URL pattern 能写)/ 6 个 v0.11 REVIEW-13 P2 修复(diag JSON 加 dns_collector / NetworkIn HashSet O(1) / R17 系统启动白名单 / R18 Downloads 去重 / property_at_index lifetime 修正 / MCP DNS 持久 collector)。全量回归 1115 tests passed / 0 failed。详见 CHANGELOG。
已知限制:Windows-only 平台(v0.12 起 proc 转为 Windows-only,Linux / macOS 用户迁移路径
git checkout v0.11.0);Win10 < 1809 admin 下 Schannel event 1793 不 fire;worker restart 3 次失败后仍永久死亡;DNS ETW 仅 Windows 管理员启用(非 admin 走 PowerShell fallback)。详见 tech-debt。
v0.11.0(2026-07-01) 安全 + 可靠性大版本:Worker Restart 真正实装(TD-4 清零,panic 后指数退避 5s/30s/5min 自动重启,3 次失败永久死亡)/ DNS ETW 替代 PowerShell probe(CPU 3-5% → < 0.5%,延迟 500ms-1s → < 50ms,PowerShell fallback 保留)/ FilterExpr v2 网络字段(
sni/dns_name/remote_addr/remote_port/bytes_out/bytes_in/source)/ 进程签名验证 R16(WinVerifyTrust 6 状态机 + BackgroundScorer 异步)/ 进程父子链 R17(Office → shell / Browser → shell / ScriptInterpreter 三档扣分)/ 可疑启动路径 R18(%TEMP% / %APPDATA% / Downloads + R16 协同扣分)。全量回归 1146 tests passed / 0 failed。详见 CHANGELOG。
已知限制:Win10 < 1809 admin 下 Schannel event 1793 不 fire(延续 v0.10);worker restart 3 次失败后仍永久死亡;DNS ETW 仅 Windows 管理员启用(非 admin 走 PowerShell fallback);Linux ebpf 编译路径未在本机验证(TD-19 延续)。详见 tech-debt。
v0.10.0(2026-06-28) 跨平台 SNI 对齐:Windows Schannel ETW SNI 落地(手写 windows-rs ETW + TDH 动态 schema,event 1793 / TargetName 字段实测修订)/ ProcessFlow.source 字段(
Ebpf/Schannelenum,跨平台在 ProcessFlow 数据结构统一)/ R15 跨平台激活(白名单同时检查 sni + dns_name)/proc flows跨平台 CLI(表格加「来源」列,JSON 自动加 source 字段)/ REVIEW-11 P1 修复(Schannel-only flow 退出感知 + spawn 失败句柄清理)。弥补 v0.7 阶段 8 eBPF 仅 Linux 的缺位。全量回归 959 tests passed / 0 failed。详见 CHANGELOG。已知限制:Win10 < 1809 admin 下 Schannel event 1793 不 fire(worker 启动成功但 UI 显示 0 条);Linux ebpf 编译路径未在本机验证(v0.8.0 cycle stage 1 主动推迟,本 cycle 不依赖)。详见 tech-debt TD-19 / TD-20。
v0.8.0(2026-06-28) 小修一波清 + FilterExpr 扩展:FilterExpr 全 view 支持(Tree / AppGroup 视图按
:也能用cpu > 5 AND name =~ /chrome/过滤)/ 错误信息中文化(不再直出 nom 内部TakeWhile1,改友好提示「缺少字段名/值」)/ Linux CI 加固(全量cargo test --release+ 测试 bin 数 ≥ 30 校验防 cfg-gate 静默 skip)/ Linux stub 测试覆盖(env/dlls/handles/memory 降级路径有早期告警)。全量回归 930 tests passed / 0 failed。详见 CHANGELOG。
v0.7.0(2026-06-28) 新增三大主题:生态卡位(
proc mcp serveLLM agent 接入 / shell 补全 / Ctrl+P 命令面板 / FilterExpr 表达式搜索cpu > 5 AND name =~ /chrome/)/ 平台深度(Linux PSI 监控 / Win11 EcoQoS 切换 / Win ETW per-process 磁盘 IO / Linux eBPF flow graph)/ 架构债清理(App 拆 5 个 panel controller)。全量回归 910 tests passed / 0 failed。详见 CHANGELOG。
功能
proc 把 进程管理 + 网络分析 + 安全评分 + 资源监控 + USB 占用 + 进程守护 + Docker + 终端录屏 + 告警 融合到一个 TUI 中,所有面板共享一份系统快照(SysinfoRegistry 全局单例),后台 worker 体系(SnapshotWorker<T> / LightWorker / HeavyWorker / BackgroundScorer)保证主线程 50ms tick 不阻塞。
6 大主面板
| 面板 | 切换 | 能力 |
|---|---|---|
| 进程列表 | 1 | 按 CPU / 内存 / PID / 名称 / 安全分 / 磁盘读 / 磁盘写 / 网络收 / 网络发 9 字段排序(持久化到 ui.toml),模糊搜索,多选批量终止,v 切应用分组视图(按 .exe 聚合,CPU/内存/进程数三字段)v0.5.0 |
| 进程树 | 2 | 父子层级展开/折叠,孤儿 / 僵尸 / 残存进程检测,o 一键选孤儿、z 一键选僵尸 |
| 端口/网络 | 3 | 按端口 / 按进程 / 按远程三种视图;6 种异常模式自动告警(CLOSE_WAIT 堆积、TIME_WAIT 异常、远程地址爆炸等);网络诊断工具箱 Ping / DNS 反查 / Whois / Traceroute / 端口探测;D 切换 DNS 查询日志子视图v0.5.0;TCP 传输质量摘要(重传率 / RST 率告警)v0.5.0 |
| USB 助手 | 4 | 句柄占用检测(filelocksmith)+ 风险分级(Safe / Warning / Critical)+ 缓存刷新 + 安全弹出引导 + 持续监测模式 |
| 监控 | 5 | 按 PID / 端口 / 命令三种 Target;NotifyOnly 或 AutoRestart 指数退避策略;Critical 告警推 Toast |
| Docker | 6 | 容器列表 + 实时事件流 + 健康检查 + 资源统计;容器内进程(top)/ 日志模式(logs)/ 镜像 / 卷视图v0.5.0;e exec 进容器嵌入式 PTYv0.5.0;支持命名管道 / TCP 双连接;事件流 sync_channel(64) 背压 |
进程深挖(Inspector)v0.5.0
进程列表/树中按 Enter 进入详情页,顶部 6 个 Tab 切换深挖视图:
| Tab | 内容 | 数据源 |
|---|---|---|
| 概要 | 分类 / 父进程 / CPU / 内存 / 磁盘 / 运行时长 / exe / cmd / cwd / 端口摘要 / 网络汇总 / 安全分 / 风险因子 / 优先级 + affinityv0.5.0 | sysinfo + port_map |
| 环境 | 进程环境变量列表(KEY=VALUE),/ 大小写不敏感搜索过滤,↑↓ PgUp PgDn Home End 滚动 | Win: PEB walk (NtQueryInformationProcess + ReadProcessMemory);Linux: /proc/<pid>/environ |
| 网络 | 该 PID 的全部监听与连接 + 最近 5 条 DNS 查询v0.5.0:协议 / 本地 / 远程 / 状态 / 进程名 | 复用 port_map::find_ports_by_pid |
| DLL | 已加载模块(Windows DLL / Linux .so),按路径字母排序,/ 搜索;表格列:路径 / 基址 / 大小 | Win: CreateToolhelp32Snapshot;Linux: 解析 /proc/<pid>/maps 合并 r-xp / r--p / rw-p 多段映射 |
| 句柄v0.5.0 | 进程打开的所有句柄:File / RegistryKey / Event / Semaphore / Mutant / Section / Process / Thread / Token;Ctrl+F 句柄内搜索 | Win: NtQuerySystemInformation + DuplicateHandle + NtQueryObject;Linux: /proc/<pid>/fd |
| 内存映射v0.5.0 | VirtualQueryEx / /proc/<pid>/maps 内存区域:基址 / 大小 / 状态 / 保护 / 映射文件名 | Win: VirtualQueryEx;Linux: /proc/<pid>/maps |
macOS 等非 Win/Linux 平台,环境 / DLL / 句柄 / 内存 Tab 显示「此平台不支持」降级提示。详情页内 F5 强制重新采集(v0.6.0 起替代 r,r 兼容期显示 deprecation)、y 复制进程信息到剪贴板(vim yank,v0.6.0 起替代 c)、v 切换 Env Tab 的 secret 脱敏(录屏强制 mask)、/ 搜索、Tab/Shift+Tab 切 Tab、+ / - 调整优先级、Esc 先退搜索再退页面(双层语义)。
安全评分
每个进程附带 0-100 分(100 = 安全)。基于 18 项独立检查(v0.11.0 起扩到 18 项,新增 R16 签名验证 / R17 父子链 / R18 可疑路径 + 与既有 v0.6 path_check 协同扣分;详见 ADR-0021 + CONTEXT.md R16/R17/R18 段):
- 签名 Authenticode 数字签名
- 父子链 父进程链完整性(如
explorer.exe → chrome.exe是否合理) - 路径 可执行文件路径合法性(如
C:\Windows\System32\vs 临时目录) - 命令行 可疑模式(编码 base64、隐藏窗口、可疑参数等 20+ 模式)
- 网络行为 连接数 / 远程地址 / 监听端口异常
- 名称仿冒
scvhost.exe/chr0me.exe等同形异义攻击 - 资源异常 CPU / 内存峰值
- 子进程爆炸 短时间内派生大量子进程
- 权限提升 是否请求了过高权限
- svchost 完整性 系统服务宿主完整性
- DLL 加载 加载来源合法性
- 令牌权限 令牌权限审计
- 信誉缓存 文件 SHA256 信誉(流式哈希 + 64MB 上限防 OOM)
按 S(大写)按安全分排序,可疑进程排最前;详情页 概要 Tab 展示所有风险因子与扣分。后台评分线程(BackgroundScorer)通过 channel 异步计算,不阻塞 UI;缓存键 {pid}:{start_time}:{exe} 防 PID 复用串数据。
系统资源监控(侧边栏)
- 降频检测 实时识别 CPU 降频原因(热 / 功耗 / 空闲),侧边栏显示
⚠THERMAL/⚠POWER(Win32CallNtPowerInformation) - per-core 频率 + 温度v0.5.0 每核独立显示当前频率 + 温度;颜色分级(< 70°C 绿 / 70-79 黄 / 80-89 橙 / ≥ 90 红);Linux 走
/sys/devices/system/cpu/cpufreq+ hwmon,Windows 走CallNtPowerInformation - 磁盘 I/O 每磁盘独立读写速率 + 每进程 I/O 速率(
(pid, start_time)键防 PID 复用串数据) - GPU 多厂商支持:Windows DXGI + NVML(NVIDIA enrichment:温度 / 显存 / 功率 / 利用率)+ PDH utilization;Linux 走 nvtop 子进程覆盖 AMD / Intel / NVIDIA 全厂商v0.5.0
- SMART 磁盘健康徽章v0.5.0 侧边栏每个挂载点显示
✓(Ok) /⚠(Warning) /✗(Failing) /-(Unknown) - 侧边栏其他 CPU/内存/交换区使用率 + 火花线图(30 秒历史)、网卡 IP、运行时间
AMD / Intel GPU 支持(多厂商)v0.5.0
阶段 6 引入 GpuProvider trait 抽象,多 impl 架构:
| Provider | 平台 | 覆盖 |
|---|---|---|
NvmlProvider | Windows | DXGI(所有 vendor 的 VRAM)+ NVML(NVIDIA enrichment)+ PDH utilization |
NvtopProvider | Linux | nvtop 子进程 JSON 输出,覆盖 AMD / Intel / NVIDIA 全厂商 |
detect_providers() 根据 feature flag + 平台 + 二进制可用性返回活跃列表。Linux 用户安装 nvtop 后自动启用 AMD/Intel 温度 / 显存 / 利用率监控。Windows AMD/Intel 列入 0.6.0+ 路线图。
per-process 网络流量v0.5.0
进程列表新增 网络收 / 网络发 两列(字节/秒),1s 周期采集。NetFlowCollector trait + 多 impl:
| 实现 | 平台 | 路径 |
|---|---|---|
IphelperCollector | Windows | IP Helper(GetTcpTable2 + GetPerTcpConnectionEStats + netstat2 PID join,不走 ETW) |
NethogsCollector | Linux | nethogs 子进程解析 |
CLI proc ls --sort net_recv --limit 10 按流量排序;TUI 内 ←→ 切换排序字段时可选中网络列。
DNS 查询日志v0.5.0
Windows 平台专属。v0.11.0 主路径走 ETW(手写 windows-rs Microsoft-Windows-DNS-Client real-time session,event 3008/3010 + TDH 动态 schema 解析,延迟 < 50ms + 100% 完整性);ETW 启动失败时降级到 PowerShell fallback(spawn 长跑 powershell.exe 子进程订阅 Microsoft-Windows-DNS-Client/Operational channel event 3010)。两者都通过 DnsLogCollector trait 抽象,reader 线程 / ETW callback 解析事件 + sysinfo PID 名 lookup + sync_channel(1000) 推到主线程。500ms 周期 drain,主线程 cap=1000 FIFO。详见 ADR-0020。
- TUI 内:端口面板按
D(大写)激活 DNS 子视图,显示最近 DNS 查询列表 - 详情页 Network Tab:底部展示该 PID 最近 5 条 DNS 查询
- CLI:
proc dns --tail流式输出新事件 - 异常规则 R9:新 PID 首次发起 DNS 查询且不在白名单 → Warning
怎么知道当前用的是哪个 collector? 跑 proc diag,末尾的 dns_collector: <kind> 行反映实际类型(etw / powershell / none)。报「DNS 日志缺数据」类 bug 时附上此行。
隐私承诺:DNS 查询记录永不持久化到磁盘,仅在内存中保留最近 1000 条;record/frame.rs 序列化类型不含 DnsQuery。
v0.6.0 安全加固
阶段 2 引入 4 项独立的安全机制(详见 SECURITY.md 与 ADR-0008):
| 机制 | 作用 |
|---|---|
| self-mitigation | 启动时最早调用 apply_self_mitigations(),通过 SetProcessMitigationPolicy 给自己上 5 项保护:DEP(Permanent)/ ASLR(HighEntropy)/ ProhibitDynamicCode / DisableExtensionPoints / ImageLoad(NoRemote + NoLow + PreferSystem32)。不开 ProcessSignaturePolicy(会让 nvml-wrapper 未签名 native 依赖挂) |
| env 脱敏 | 详情页 Env Tab 默认 mask 显示 {前2字符}***(原长B);secret pattern 匹配 12 关键字(KEY/TOKEN/SECRET/PASSWORD/PASSWD/PWD/CREDENTIAL/PRIVATE/AUTH/API/DSN/CONNECTION_STRING)+ DATABASE_URL 特例 + *_AUTHORIZATION 后缀。按 v 切换 reveal,录屏时强制 mask |
| 录屏防护 | 用户主动按 R 触发录屏时先弹确认(警告会捕获屏幕所有内容含 DNS 域名 / 进程 cmd),按 y 确认 / n 取消 |
| restricted spawn | elevated 时 spawn PowerShell DNS 子进程前调 CreateRestrictedToken + DISABLE_MAX_PRIVILEGE 剥离继承的 SeDebugPrivilege,防子进程被劫持后变 credential theft 跳板。仅接入 DNS spawn(docker exec / nvtop 因自身需 privileged token 不接入) |
v0.6.0 可观测性
阶段 3 引入完整的诊断链路:
- 日志 rotate:
tracing-appender::RollingFileAppender::daily每天一个文件~/.config/proc/proc.logYYYY-MM-DD,自动清理 7 天前的日志(不再启动时 truncate)。 - crash report:panic 时写到
~/.config/proc/crashes/crash-{YYYYMMDD-HHMMSS}.txt(主线程 panic)或crash-worker-{name}-{ts}.txt(worker 线程 panic),含时间戳 + proc 版本 + panic info +Backtrace::force_capture()。不上传任何位置,用户报 bug 时手动附上。 - worker metrics:每个 worker 自身记录
poll_count / poll_total_us / poll_max_us / channel_full_count / last_error(atomic),主线程聚合到proc diag输出。 proc diag子命令:JSON 输出所有 worker 的 avg/max/polls/drops 指标,便于 bug 报告附上。?帮助页 Workers 区段也展示精简版(带✓/⚠健康徽章)。- worker crash banner:worker 线程用
catch_unwind包 body,panic 时通过crash_tx通知主线程,TUI 顶部渲染红色 banner;按D清空。
v0.6.0 性能优化
阶段 4 把 ProcessInfo 的 format! String 分配全部换成 Arc:
| 字段 | 旧类型 | 新类型 | 收益 |
|---|---|---|---|
name | String | Arc<str> | heavy worker 一次分配,clone 走原子计数 |
cmd | Vec<String> | Arc<[String]> | 同上 |
exe / cwd / user_id | Option<String> | Option<Arc<str>> | 同上 |
status | String(format!("{:?}", sysinfo::ProcessStatus)) | ProcessStatus Copy 枚举(13 变体) | 零分配,按 sysinfo 0.34.2 真实命名对齐 |
name_lower | (每次搜索 to_lowercase) | Arc<str> 预计算 | 搜索 hot path 不再每按键重建 |
query_lower | (每次按键 to_lowercase) | SearchState 缓存 | 同上 |
500 进程 × 1.5s 重采下,每秒堆分配减少 90%+;搜索框逐字符输入累积延迟从 ~50ms 降到 μs 级。
TCP 传输质量v0.5.0
TcpStats 扩 4 个传输质量字段:
| 字段 | 数据源 |
|---|---|
retransmitted_segs | Win GetTcpStatisticsEx2 / Linux /proc/net/snmp |
reset_segs | 同上 |
failed_connections | 同上 |
out_segs | 同上 |
CLI proc port --stats 输出 TCP 质量摘要;TUI 内异常规则:
- R7:重传率 > 5% → Warning
- R8:RST 率 > 2% → Warning
SMART 磁盘健康v0.5.0
跨平台 SMART 数据采集:
| 平台 | 主路径 | 降级 |
|---|---|---|
| Linux / macOS | smartctl --json --attributes <device> 子进程 | — |
| Windows | smartctl 子进程 | WMI MSStorageDriver_FailurePredictStatus(聚合状态) |
SmartData 结构:device / model / serial / temperature / health(4 档 Ok / Warning / Failing / Unknown)/ attributes。CLI proc smart [device] 输出;TUI 侧边栏磁盘徽章。
30s poll 周期(SmartWorker 独立 worker,与 LightWorker 解耦),Drop 时 shutdown + join。
Docker 深化v0.5.0
阶段 3 把 Docker 面板从「容器列表 + 事件流」扩到 lazydocker 级别:
- 容器内进程(
t切到 docker top 视图,CLIproc docker top <name>):复用bollard::top_processes - 日志模式(
l进入日志视图,CLIproc docker logs <name> [--follow] [--tail N]):独立LogsWorkertokio runtime +sync_channel(64)背压 + 5000 行环形 buffer + follow 模式 - 镜像视图(
Tab切到 Images,CLIproc docker images):本地镜像列表 +in_use()判定 + 两次d确认删除(CLIproc docker image-rm <id> [--force]) - 卷视图(
Tab切到 Volumes,CLIproc docker volumes):volume 列表 + in_use 反查 + 两次d确认删除(CLIproc docker volume-rm <name> [--force]) - docker-compose 薄封装(CLI
proc docker compose up -d等,转发给 docker-compose) - 事件流(CLI
proc docker events)
容器 exec(嵌入式 PTY)v0.5.0
阶段 9 引入 AppMode::ContainerExec:从 DockerPanel 选中容器后按 e 进入嵌入式 PTY 模式。本地 portable-pty spawn docker exec -it <container> <shell> 子进程;docker CLI 处理所有 daemon 通信(命名管道 / TCP / unix socket)+ 远端 PTY 分配;vt100 crate 解析 ANSI 字节流喂 ratatui 渲染。
| 按键 | 行为 |
|---|---|
e(Docker 面板) | 进入 exec 模式(用 image 推断默认 shell:alpine→/bin/sh,ubuntu/debian→/bin/bash,其它兜底 /bin/sh) |
| 普通 ANSI 键 | 透传(Enter=\r / Tab=\t / Backspace=\x7f / 方向键=\x1b[A/B/C/D / Ctrl+C=\x03 / Ctrl+D=\x04 / Ctrl+\=\x1c) |
Ctrl+D / exit / Ctrl+\ / 子进程退出 | 自动切回 DockerPanel + 提示「容器 xxx 已退出」 |
CLI proc docker exec <container> [cmd...] 直接 spawn docker exec -it 透传 stdio(CLI 用户终端 = 远端 PTY)。
进程守护与告警
监控(面板 5):按 PID / 端口 / 命令监视目标进程;NotifyOnly 仅通知,AutoRestart { max_retries, base_backoff, max_backoff } 指数退避自动重启;watchdog 子进程长跑时可通过 Ctrl+C 干净关停(try_wait() 轮询)。
告警:可配置阈值规则(CPU / 内存 / 磁盘 / 网络 / 连接数 / 温度 / 降频 7 类指标,6 种比较运算符),连续命中触发防抖,状态机 Pending → Firing → Resolved,自动分级 Info / Warning / Critical,Critical 推 Toast。默认规则无需配置即工作;自定义规则放 ~/.config/proc/alerts.toml:
[[rule]]
metric = "CpuUsage"
op = "GT"
threshold = 90.0
consecutive_hits = 3
severity = "Warning"
终端录屏回放
VT100 终端完整录屏(v2 格式,保留 RGB 颜色 —— v1 旧版会褪色,已废弃):
proc record启动录制(TUI 内按R大写开关),状态栏显示 REC 指示- 录制中按
b标记书签(v0.14 起):inline 输入 label,Enter 提交 / Esc 取消 / 空 label 默认「书签 #N」 proc replay <file>.prec回放:播放/暂停、逐帧←→、倍速0.5× / 1× / 2× / 4×、Shift+←→跳 10 帧- 回放中按
B(Shift+B)打开书签面板(v0.14 起):Up/Down 选择 · Enter 跳转到书签帧 ·e编辑 label ·d删除 · 子串搜索 · Esc 关闭 - 回放中按
/进入时间轴搜索(v0.14 起):5 维度 FilterExpr(cpu > 80/mem > 500mb/name =~ /chrome/i/anomaly.severity = critical/timestamp > 1234567890)+ substring 子串模式;命中帧位置●在 timeline 高亮;n/N跳下一 / 上一命中帧;Enter 提交 / Esc 取消输入态后n/N仍可跳转 - 回放中按
r切正/倒放方向(v0.14 起):倒放速度档位同正向(Half / Normal / Double / Quad),timeline icon▶/◀/⏸反映方向 + 播放状态,倒放到首帧自动暂停(与正向到末帧暂停对称) proc replay <file>.prec --info(v0.14 起)不开 TUI 直接显示录屏元数据(时长 / 帧数 / 异常事件 / 最高 CPU/mem)- 书签持久化到
<file>.prec.bookmarks.jsonsidecar(与录屏本体解耦,可单独分享 / 删除) - Ctrl+C 优雅退出,保证录制文件正常 flush(全局
shutdown模块统一信号) - 时间戳格式
MM-DD HH:MM:SS,与操作日志对齐
CLI 子命令
不只是 TUI —— 命令行直接消费同一套采集层:
| 子命令 | 用途 |
|---|---|
proc ls --sort cpu --limit 20 | 进程列表(sort: cpu/mem/name/pid/disk_read/disk_write/net_sent/net_recv) |
proc tree | 进程树 |
proc port 8080 [--kill] [--stats] | 端口占用查询 / 终止 / TCP 质量摘要 |
proc kill <pid> [--force] | 终止单进程 / 强制终止进程树 |
proc pkill <name> [--force --dry-run] | 按名称批量终止(精确匹配,大小写不敏感) |
proc eject <drive> [--find-locks] | USB 占用分析 / 详细句柄列表 |
proc who <path>v0.5.0 | 反查「谁占用这个文件 / 目录」 |
proc handles [--pid N] [--file path]v0.5.0 | 枚举指定 PID 的所有句柄 / 反查占用路径的 PID 列表 |
proc priority <pid> [--set normal]v0.5.0 | 查询 / 设置优先级(idle/belownormal/normal/abovenormal/high/realtime) |
proc affinity <pid> [--set 0xFF]v0.5.0 | 查询 / 设置 CPU affinity mask |
proc throttle <pid> on|offv0.7.0 | Windows 11 EcoQoS / Efficiency Mode 切换(🍃 标记由 HeavyWorker 批量 query 维护) |
proc smart [device]v0.5.0 | SMART 磁盘健康(省略 device 列出所有磁盘) |
proc dns [--tail]v0.5.0 | DNS 查询日志(仅 Windows,内存 only) |
proc flows [--limit N] [--json]v0.7.0 · 跨平台 v0.10.0 | ProcessFlow 列表(Linux 走 eBPF connect+DNS 关联,Windows admin 走 Schannel ETW SNI;表格含「来源」列;ADR-0016 + ADR-0018) |
proc diagv0.6.0 | worker metrics JSON 输出(avg/max/polls/drops),bug 报告附上 |
proc monitor --add --pid N / --remove ID | 监控管理(按 --pid / --port / --command) |
proc record / proc replay <file> | VT100 录屏 |
proc export --format json|csv [-o file] [--sort] [--limit] | 进程数据导出(含 ISO-8601 本地时间戳) |
proc docker ps / inspect / top / logs / images / volumes / image-rm / volume-rm / compose / events / execv0.5.0 | Docker 11 子命令 |
proc agent modelsv0.20.0 | 列出检测到的本地 GGUF 模型(NAME / SIZE / QUANT / ARCH / PATH 表格,扫描 llama.cpp / ollama / huggingface 常见目录 + agent.toml 自定义路径) |
proc agent ask "<query>"v0.20.0 | 内置 AI agent 单轮自然语言 query(--provider llama-cpp|anthropic|mock / --model / --max-steps;默认 Gemma 4 E2B 本地推理,按需 spawn llama-server 用完即释放,详见下方 AI Agent 章节) |
proc mcp servev0.7.0 | 启动 MCP server(stdio transport,默认),把上述 32 个子命令 / 详情页 Tab / 系统指标 / 录屏 v2 / USB 状态暴露为 proc_* MCP tools 供 Claude Desktop / Cursor 等 LLM agent 调用(v0.7 落地 17 tool,v0.15 扩到 32 tool,v0.16 扩到 39 tool,v0.17 扩到 46 tool) |
proc mcp serve --transport sse --port 8080v0.17.0 · full 实装 v0.19.0 | 启动 MCP server(SSE transport,多 client 并发 / 远程 agent 集成 / Web dashboard 场景;current_thread runtime 切到 multi_thread worker_threads(4) runtime + axum + tower StreamableHttpService 路由 MCP JSON-RPC over HTTP/SSE;详见 ADR-0027 §6) |
proc mcp serve --transport sse --port 8080 --bind-addr 0.0.0.0v0.19.0 | SSE transport 全网卡监听(用户显式 opt-in,默认 127.0.0.1 仅本机;含 proc_docker_rm / proc_usb_release / proc_record_start 等写操作的 MCP tool 暴露到 LAN 需用户明确知晓风险) |
内置 AI Agent(proc → LLM)v0.20.0 · 扩 v0.21.0 · 扩 v0.22.0
与 MCP server 互补的另一个方向:MCP 是「外部 LLM → proc」(proc 暴露 46 tool 给 Claude Desktop / Cursor),内置 agent 是「proc → LLM」(proc 自身是 client,用户在终端用自然语言查询)。同一套 47 tool 的 Rust API 两条路径复用(ADR-0030)。两个入口:TUI Agent 面板(v0.21,多轮流式 + y/n 确认,见下)+ CLI proc agent ask(v0.20,单轮批处理)。
TUI Agent 面板v0.21.0(ADR-0031)——第 10 个主面板,交互式对话 agent:streaming 流式逐字输出 + tool 步骤实时显示 + 写操作 y/n 确认 + 多轮追问:
proc # 启动 TUI
# Ctrl+P 命令面板搜「AI Agent」→ 进入 AI Agent 面板
# 输入 query 回车 → streaming 流式回答(tool 调用步骤行实时出现;Esc 中断)
# 「杀掉 chrome」→ 底部高亮确认框(影响摘要 + [y] 执行 [n] 拒绝)
# → y 真实执行 / n 拒绝并让 agent 解释 + 给等价命令行
# 连续追问支持多轮上下文(最近 12 轮滑动窗口);PgUp/PgDn 滚动历史;Ctrl+D 退出面板
# llama-server 进面板首次 query 才 spawn、退出面板即清理(日常使用零影响)
会话架构(同步 TUI 主循环 × async agent 的桥接):AgentSession 专用线程 + 自有 tokio Runtime + std mpsc 事件通道,TUI tick 内批量 drain 渲染(流式增量按 tick 边界聚合,不逐 delta 重绘);退出面板 teardown 有界等待(pending 确认自动拒绝 → 中断 → shutdown → Drop kill llama-server,无孤儿进程)。
CLI 单轮(v0.20):
# 自然语言 query → agent 多步 tool-use 循环 → Markdown 总结
proc agent ask "我电脑为什么这么卡?" # 默认 Gemma 4 E2B 本地推理
proc agent ask "列出 CPU 占用最高的 10 个进程"
proc agent ask "哪些进程在监听 8080 端口?"
proc agent ask --max-steps 5 "chrome 为什么占这么多内存?" # 限制循环步数
# Anthropic 云端对照(opt-in feature + API key 走 env 不落盘)
ANTHROPIC_API_KEY=sk-ant-... proc agent ask --provider anthropic "..." # 需 cargo build --release --features anthropic
Eval harnessv0.22.0(ADR-0032)——proc agent eval 70 query 基准评测(L0 单步 23 / L1 单 tool 链 27 / L2 多步链 20),per-query 结果 JSON + 确定性失败模式分类(7 变体,不上 LLM-as-judge)+ markdown 报告:
proc agent eval # FULL 70 query(E2B 实测 47m19s)
proc agent eval --quick # QUICK 抽样 26 条(迭代冒烟用)
proc agent eval --level 2 # 只跑 L2 多步链
proc agent eval --scenario docker --attempts 3 # 场景过滤 + 重试次数
proc agent eval --output my.json # 指定结果 JSON(md 报告同 stem 产出)
proc agent eval --compare a.json b.json # 跨 run/模型对比报告(不实跑)
E2B 基线(v0.22 首跑,归档报告):L0 17/23(74%)· L1 14/27(52%)· L2 full-chain 1/20 + chain-step 12/43(双口径);失败直方图 output_degraded 21(30%——proc_finish 语法泄漏为主因)/ wrong_tool 10 / chain_incomplete 7。更强模型或 GBNF 开关复测时 --compare 一条命令即出对比列。
v0.23 变量实验(ADR-0033,实验归档)——两条候选修复路径均以数据关闭:GBNF 逃生舱结构性不可用(llama-server 对 grammar × tools 同传显式 400 拒绝,冒烟 12 请求判定性,结论绑定 llama-server b8685);prompt v2 措辞无明确增益(净通过 33/35 vs 基线 32,落 E2B 方差带内 → 保守 revert 回 v1)。E2B 方差带首次量化:同 binary 同配置复跑 6 query 纯翻转——单次 run 的 ±3 通过数 / ±6 失败模式计数在噪声内,--compare 单列差异小于此量级不可单独归因(v0.24 模型底座决策的解读标尺)。E2B 画像维持基线,进一步改善的杠杆是模型升级(v0.24 与 RAG 一并评估)。另:v0.23 起 agent catalog 47 tool 全部真实可用(录屏 tool 在 TUI Agent 面板经 y/n confirm 真实执行;CLI 单轮路径维持拦截——跨调用保活仅 TUI 会话支持)。
v0.24 RAG + prompt v3 实验(ADR-0034,实验归档)——四列矩阵(v1 基线 32 / 方差列 35 / RAG-on 37 / v3 27):RAG 机制成立但通过率带内——机制验证两主指标成立(检索召回 12/15 = 80% / 经验引用 8/15 = 53% / 干扰 0)+ output_degraded 19→9(-12 超带,答案质量增益),但净通过 +2 vs 方差列落 ±3 带内 → [rag] 维持默认 off(「机制成立但 E2B 兑现不了通过率」);prompt v3 负结果(修订 2 单变量,-5/-8 落带外向下 → revert 回 v1,TD-60 关闭)。E2B 零代码杠杆穷尽——进一步改善路径收敛「模型升级 × RAG-on 复测」组合(v0.25+ 候选首位)。
Session 观测v0.22.0——TUI Agent 面板每次会话自动留档 JSONL(~/.config/proc/sessions/,agent.toml [session].log = false 可关;TextDelta 聚合落盘不逐 delta),离线提取 TTFT / 生成时长 / tool 轮数 / confirm 行为指标:
proc # TUI 里用一轮 AI Agent 面板
proc agent session-info ~/.config/proc/sessions/<file>.jsonl
# 打印:TTFT / 生成时长 / delta 段数 / tool 轮数与 error / confirm 决策分布与延迟 + per-query 表
Tool registry 两层架构(让 1.6GB 量化 2B 模型也能驱动 agent):默认只注入 4 个 entry tool(proc_ls / proc_metrics_system / proc_inspect / proc_help,~600 token),剩余 43 个 tool 通过 proc_help(category) 元 tool 动态发现——agent 先问「docker 类有哪些 tool」,runner 把该类别 schema 加入后续轮的 tools 数组(token 预算 6K 封顶)。单轮 tool-context 从全 46 tool 注入的 ~15K token 降至 ~1.5K 峰值(96% 减少)。
小模型可靠循环(stage 3b 实测结论,tool_choice=required + proc_finish 控制 tool):每轮强制必调 tool,要结束循环必须显式调 proc_finish(answer="...") 提交最终答案——防止 2B 模型凭空编造数据(few-shot 对话示例实测让 E2B 在 content 里角色扮演「调工具 + 编造结果」,已删改「类别路由表」式 system prompt)或中途过早停止。
隐私架构(本地优先):默认走本地 llama.cpp(Gemma 4 E2B,数据零外发;按需 spawn llama-server 用完即释放,日常使用零影响);Anthropic 云端是 opt-in feature(--features anthropic + ANTHROPIC_API_KEY env,不写配置文件);写操作 8 个破坏性 tool(kill / usb_release / docker_rm 等)双通道——CLI ask 非交互模式全部拦截(返 blocked JSON 让 agent 转而解释 + 给等价命令行),TUI 面板升级为 y/n 确认框(影响摘要强制展示,y 即用户代传 confirm: true 真实执行,n 保持拦截语义);tool result 送 LLM 前过 PII 过滤(KEY / TOKEN / PASSWORD 等 12 关键字 regex mask)。
配置 ~/.config/proc/agent.toml(缺失时用代码默认值,与 ui.toml 同款契约):
[default]
provider = "llama-cpp" # llama-cpp / anthropic / mock
model = "gemma-4-E2B-it-Q4_K_M"
max_steps = 10
[llama-cpp]
server_path = "D:\\llama.cpp\\bin\\...\\llama-server.exe" # 缺省走 PATH 查找
ctx_size = 8192
[anthropic]
model = "claude-sonnet-4-6" # API key 走 ANTHROPIC_API_KEY env,不写配置文件
max_tokens = 4096
RAG 经验召回v0.24.0(ADR-0034,默认 off)——把历史成功 query→tool 链检索出来注入 user message 前缀([历史经验参考] 模板 + [当前问题] 原文),让 agent「见过一次就会第二次」。语料 = session JSONL 成功段(主语料,随日常使用自动积累;v0.25 起空会话不落盘——ADR-0035 D1 延迟创建,主语料只含真实活动)+ eval run passed trace(bootstrap,eval_corpora 显式列出才生效);keyword BM25-lite 检索零依赖;与当前 query 相似的条目自动排除(防 eval 语料泄漏——排除命中数每 query 报告)。E2B 实测(实验归档):机制成立(召回 12/15 = 80% / 引用 8/15 = 53% / 干扰 0 + degraded -12 超带)但通过率落方差带内 → 维持 off;更强模型底座上是首选复测项:
[rag]
enabled = false # 总开关(off 态不建索引零开销)
# budget_tokens = 800 # 注入段 token 预算硬上限(≈1200 chars 整条截断)
# top_k = 3 # 检索条数上限
# exclude_threshold = 0.6 # 污染排除:词元覆盖率阈值(相似 query 不注入)
# eval_corpora = ["eval-e2b-70q.json"] # bootstrap 语料路径(相对 cwd)
测试基础设施:50 query(9 场景 L0/L1)真实 Gemma E2B 响应录制为 JSONL fixture,--provider mock 确定性回放——CI 跑 agent loop 零 LLM 调用、零 API 成本。E2B 实测:QUICK 18/18,FULL L0 23/23(含 2 个验收口径 artifact 放宽)+ L1 21/27(78%,τ²-bench 基线 29.4% 的 2.6 倍)。
AI Agent 与 eval 纪律v0.26.0
agent 的每次配置变更(模型 / prompt / 检索策略)都过同一把尺子:proc agent eval 70 query 基准(L0 单步 23 / L1 单 tool 链 27 / L2 多步链 20),--compare 跨 run 对比。v0.22~v0.24 三个 cycle 的六列实验矩阵(数字逐列对回 REVIEW-v0.22 / REVIEW-v0.23 / REVIEW-v0.24 与 实验归档):
| 列(cycle · 变量) | run 时长 | 净通过(70q) | L0(23q) | L1(27q) | L2 full-chain(20q) | output_degraded | 判读 |
|---|---|---|---|---|---|---|---|
| E2B 基线(v0.22 · prompt v1 + RAG off) | 47m19s | 32 | 17(74%) | 14(52%) | 1(5%)· chain-step 12/43(28%) | 21 | 基线画像 |
| QUICK 冒烟(v0.22 · 同配置 26q 抽样) | 18m46s | — | 7/9 | 4/9 | 0/8 · chain-step 4/17 | — | 挂 FULL 前的链路冒烟 |
| prompt v2(v0.23 · 列① 措辞修订) | 37m07s | 33 | — | 16 | 0 | 16 | 净通过 +1 落方差带内 → 存疑,复跑定夺 |
| best 方差列(v0.23 · 列② 同 binary 复跑) | 38m43s | 35 | 19 | — | — | 19 | 6 query 纯翻转(4 升 2 降)→ 方差带量化 |
| RAG-on(v0.24 · prompt v1 + RAG on) | 25m20s | 37 | 20(87%) | 17(63%) | 0(三列平) | 9 | 机制成立但通过率 +2 带内 → 维持 off |
| prompt v3(v0.24 · 修订 2 单变量) | 54m53s | 27 | 13(57%) | — | — | 24 | -5/-8 落带外向下 → revert,TD-60 关闭 |
「—」= 对应 REVIEW / 归档未单列该维度(分母口径见各归档)。
判读纪律(数据先行于结论):
- 方差带标尺(v0.23 首次量化):单次 run 的 ±3 通过数 / ±6 失败模式计数在噪声内——
--compare单列差异小于此量级不可单独归因,必须复跑定夺。上表 v2 列(+1)与 RAG 列(+2)的「带内」判读均由此标尺机械得出,不受结果偏好影响。 - 预登记换默认门槛(v0.24 D5 拍板标准,跑实验前锁定):净通过差 ≥ +7 且 L2 方向性改善——三分支:涨超带换默认 / 带内维持现状归档 / 带外向下 revert。
- 负结果三连归档(错误路径的证据价值):
- GBNF 结构性互斥(v0.23)——llama-server 对 grammar × tools 同传显式 400 拒绝(
Cannot use custom grammar constraints with tools.),12 请求冒烟全部拒绝零生成,判定性关闭。冒烟先行:分钟级成本省一次 ~47m 挂机。 - prompt v3 带外向下 revert(v0.24)——净通过 27(-5 vs 基线 / -8 vs 方差列),L0 掉 4-6 + degraded 24 双向一致恶化,非噪声主导 → revert 回 v1,TD-60 关闭。
- RAG「机制成立但 E2B 兑现不了」两分(v0.24)——机制侧全绿(检索召回 12/15 = 80% / 经验引用 8/15 = 53% / 干扰 0/15 + degraded 21→9 超 -12 带),通过率侧 +2 带内。「机制不成立」与「机制成立但底座兑现不了」是两种不同结论——后者给模型升级后的复测留了直接输入。
- GBNF 结构性互斥(v0.23)——llama-server 对 grammar × tools 同传显式 400 拒绝(
- L2 能力边界:full-chain 1/20(5%)+ chain-step 12/43(28%)双口径——E2B(1.6GB 量化 2B)的多步规划能力边界,不是 harness 缺陷。引用但未通过的 3 例(均 L2)是微观证据:链已向经验迁移,答案质量 / 多步规划仍受底座制约。
- 杠杆穷尽结论(v0.24):GBNF(结构性)+ prompt v2(带内)+ prompt v3(带外向下)+ RAG 通过率(带内)四路关闭后,E2B 底座上零代码 / 低成本杠杆全部穷尽——进一步改善收敛「模型升级 × RAG-on 复测」组合(v0.25 起留档候选首位)。
MCP server(LLM agent 接入)v0.7.0 · 扩 v0.15.0 · 扩 v0.16.0 · 扩 v0.17.0 · 扩 v0.18.0 · 扩 v0.19.0
proc mcp serve 把 proc 的进程 / 网络 / DNS / Docker / 详情页 Tab / 系统指标 / 录屏 v2 / USB 状态 / record 暴露 / USB release / docker-rm 写操作能力暴露为 MCP tools,让 Claude Code / Cursor / Windsurf 等客户端直接调用。详见 docs/adr/0009-mcp-server.md(v0.7 设计)+ docs/adr/0023-mcp-inspect-tool-merge.md(v0.15 详情页 6 Tab 合并)+ docs/adr/0024-mcp-handler-module-split.md(v0.15 子 module 拆分)+ docs/adr/0025a-mcp-replay-search-agent-schema.md(v0.16 replay_search schema)+ docs/adr/0025b-mcp-record-not-exposed.md(v0.16 record 不暴露决策,v0.17 ADR-0029 翻盘)+ docs/adr/0026-mcp-handler-persistent-fields.md(v0.17 MCP handler 持久字段)+ docs/adr/0027-rmcp-resource-subscribe-sse-transport.md(v0.17 Resource subscribe + SSE transport,v0.18 扩 §5 subscribe-push lifecycle)+ docs/adr/0028-vt100-to-uiframe-converter.md(v0.17 VT100 转码)+ docs/adr/0029-record-exposure-and-confirm-mechanism.md(v0.17 record 暴露 + confirm 机制,v0.18 扩 §6 record auto-stop)。
Claude Desktop 配置(macOS:~/Library/Application Support/Claude/claude_desktop_config.json;Windows:%APPDATA%\Claude\claude_desktop_config.json):
{
"mcpServers": {
"proc": {
"command": "proc",
"args": ["mcp", "serve"]
}
}
}
Cursor / Windsurf 配置(项目 .cursor/mcp.json 或全局):同上 schema,把 command 改成 proc 的绝对路径(如 C:\Users\YOU\.cargo\bin\proc.exe)。
手动调试:npx mcp-inspector proc mcp serve 在浏览器里看 schema、试调用。
可用 tool(46 个,v0.7 落地 17 + v0.15 新增 15 + v0.16 新增 7 + v0.17 新增 7):
类别 0 — v0.7 既有 17 tool(列表视角)
| Tool | 对应 CLI | 返回 JSON |
|---|---|---|
proc_ls | proc ls | { ok, sort, count, processes[] } |
proc_tree | proc tree | { ok, roots[] }(递归) |
proc_port | proc port | { ok, count, ports[] } |
proc_kill | proc kill | { ok, pid, result } |
proc_pkill | proc pkill | { ok, total, killed, failed, results[] } |
proc_eject | proc eject | `{ ok, devices[] |
proc_who | proc who | { ok, count, lockers[] } |
proc_handles | proc handles --pid | { ok, count, handles[] } |
proc_priority | proc priority | { ok, pid, action, priority } |
proc_affinity | proc affinity | { ok, pid, action, affinity_mask } |
proc_smart | proc smart | `{ ok, disks[] |
proc_dns | proc dns | { ok, count, queries[] }(drain 一次,非 tail) |
proc_diag | proc diag --json | { ok, workers[] } |
proc_monitor_list | 监控配置快照 | { ok, count, monitors[] } |
proc_docker_ps | proc docker ps | { ok, count, containers[] } |
proc_docker_top | proc docker top | { ok, count, processes[] } |
proc_docker_logs | proc docker logs | { ok, count, lines[] }(非 follow) |
类别 1 — v0.15 新增 9 tool(CLI 命令直接暴露)
| Tool | 对应 CLI | 返回 JSON |
|---|---|---|
proc_flows | proc flows | { ok, count, flows[], worker }(Schannel ETW worker 不可用 → worker: "unavailable") |
proc_throttle | proc throttle | { ok, pid, ecoqos_state }(Windows 11 EcoQoS) |
proc_export | proc export | { ok, format, payload }(json / csv) |
proc_docker_inspect | proc docker inspect | { ok, container, health_detail, stats } |
proc_docker_images | proc docker images | { ok, count, images[] }(含 in_use 反查) |
proc_docker_volumes | proc docker volumes | { ok, count, volumes[] }(含 in_use 反查) |
proc_docker_events | proc docker events | { ok, count, events[], note }(500ms 短超时 drain,非 follow) |
proc_monitor_add | proc monitor --add | { ok, id, target_kind, target, restart_policy }(dry_run=false 默认,与 proc_kill 一致;dry_run=true opt-in 返 preview) |
proc_monitor_remove | proc monitor --remove | { ok, id, removed } |
类别 2 — v0.15 新增 1 tool(详情页 6 Tab 合并)
| Tool | 入参 | 返回 JSON(按 tab 分支) |
|---|---|---|
proc_inspect | pid, tab=summary|env|network|dlls|memory_map|handles, reveal=false | summary:完整 ProcessInfo + parent_chain + signature_status + risk_factors(详情页视角返完整 cmd/exe/cwd 真值)/ env:env_vars[](secret 12 关键字默认 mask,reveal=true opt-in 显示真值)/ network:listening[] + established[] + dns_recent[] / dlls:dlls[](path/base_addr/size)/ memory_map:regions[](base_addr/size/state/protection/name)/ handles:与 proc_handles 同 schema |
类别 4 — v0.15 新增 5 tool(系统级 metrics)
| Tool | 返回 JSON |
|---|---|
proc_metrics_system | { ok, cpu_usage_pct, memory, swap, system_disk, uptime_secs, processes_count, network_interfaces[], tcp_stats, cpu_temp_c, gpu_temp_c }(30s sparkline 历史见类别 6a proc_metrics_history——v0.17 TD-52 落地) |
proc_metrics_gpu | { ok, gpus[], providers[] }(providers 标 nvml/dxgi/pdh 数据源;无 GPU → gpus: [], note) |
proc_metrics_disk_io | { ok, total, per_disk[], disks[], per_process }(device=Some 仅过滤 per_disk;per_process = { source: "sysinfo-delta", count, processes[] {pid, name, read_bps, write_bps} }——read+write 降序 top-N 默认 10,top=N 覆盖;v0.25 TD-53 sysinfo delta 口径,IO counters 含非磁盘 IO,worker warm-up / fallback 期速度全 0) |
proc_metrics_smart | device=None → aggregated(disks[] 摘要,与 sidebar 同款)/ device=Some → 详细 attributes(与 proc_smart 同 schema) |
proc_metrics_thermal | { ok, per_core_freq_mhz[], per_core_temp_c[], throttle, reason }(throttle null + reason="Unavailable" 兜底非 Windows) |
类别 5 — v0.16 新增 7 tool(录屏 v2 + 操作类)
类别 5a — Replay(2 tool,录屏元数据 / 内容查询):
| Tool | 入参 | 返回 JSON |
|---|---|---|
proc_replay_info | file_path: String(.prec 扩展名,v3 UiFrame / VT100 自动分发) | format: "uiframe" 路径:{ ok, format, version, hostname, start_time, end_time, duration_secs, frame_count, anomaly_count, event_count, max_cpu, max_mem, has_bookmarks_sidecar, path, size_bytes } / format: "vt100" 路径:{ ok, format, version, start_time, frame_count, start_ms, end_ms, duration_secs, width, height, has_bookmarks_sidecar, path, size_bytes } |
proc_replay_search | file_path: String, query: String, limit: Option<usize>(query 前缀 : 走 FilterExpr 5 维度 timestamp/cpu/mem/name/anomaly.severity / 否则 substring 匹配进程名;limit 默认 100,truncated=true 时 agent 可二次调提高 limit) | { ok, query, match_count, returned, truncated, limit, matches: [{ frame_idx, timestamp, cpu_usage, memory_used, matched_processes[], anomaly_severity }] }(VT100 录屏不支持 search 返 ok:false) |
类别 5b — Bookmarks CRUD(4 tool,操作 .prec.bookmarks.json sidecar):
| Tool | 入参 | 返回 JSON |
|---|---|---|
proc_bookmarks_list | file_path: String | { ok, count, sidecar_present, source_healthy, bookmarks[] }(双字段三态区分:无 sidecar / fresh sidecar / stale sidecar) |
proc_bookmarks_add | file_path: String, frame_idx: usize, label: Option<String>, dry_run: Option<bool> | { ok, dry_run, action: "add", id, frame_idx, label, timestamp_secs, sidecar_written }(label=None/空 → 默认「书签 #N」;frame_idx 越界 → ok:false;dry_run=false 默认,与 proc_kill 一致) |
proc_bookmarks_edit | file_path: String, id: u64, label: String, dry_run: Option<bool> | { ok, dry_run, action: "edit", id, old_label, new_label, sidecar_written }(id 不存在 → ok:false;保留 old_label 让 agent 看 diff) |
proc_bookmarks_delete | file_path: String, id: u64, dry_run: Option<bool> | { ok, dry_run, action: "delete", id, frame_idx, label, sidecar_written }(id 不存在 → ok:false;保留 frame_idx + label 让 agent 知道删了什么) |
类别 5c — USB status(1 tool,用户痛点「kill 进程后不知道是否成功」):
| Tool | 入参 | 返回 JSON |
|---|---|---|
proc_eject_status | drive: String("E" / "E:" / "E:\" 都接受,与 proc_eject 同款 normalize) | { ok, drive, device, ejectable, lock_count, locks[], suggestion }(suggestion 4 档:eject_now lock_count=0 可直接弹 / kill_locks lock_count>0 需先 kill / unknown_drive drive 字符无效 / unavailable 非 Windows 或 scan 失败;agent 走 proc_eject_status → proc_kill → proc_eject_status 三步反馈循环) |
类别 6 — v0.17 新增 6 tool(可观测性 + record 暴露 + USB release + docker-rm 写操作)
类别 6a — 可观测性 sparkline(1 tool,TD-52 30s 历史采样):
| Tool | 入参 | 返回 JSON |
|---|---|---|
proc_metrics_history | metric: "cpu"|"memory"|"swap", seconds: Option<u8>(默认 30s,上限 30 因 system_history 字段 30s cap) | { ok, metric, seconds, count, samples: [{ ts, value }] } ordered oldest → newest(空 history 返 count=0 + samples=[] worker warm-up 期间 / Default 路径 / no-default-features build) |
类别 6b — record 暴露(2 tool,spawn 子进程 + confirm gate,ADR-0029):
| Tool | 入参 | 返回 JSON |
|---|---|---|
proc_record_start | confirm: bool(必传 true 以确认录屏风险——捕获屏幕所有内容含 DNS 域名 / 进程 cmd)/ file_path: String / duration_secs: Option<u64>(可选,v0.18 起真正 auto-stop——Some(N) 时 spawn 子进程传 --duration N flag,子进程内 timer thread sleep N secs 后调 shutdown::request() 触发干净退出) | { ok, action: "start", file_path, started_at, expected_duration_secs, pid, log_path }(confirm=false → ok=false + error;record_handle 已有 child → ok=false + error "录屏已在进行") |
proc_record_stop | file_path: String(须匹配 proc_record_start 的 file_path) | { ok, action: "stop", file_path, size_bytes, frame_count, duration_secs, killed, exit_code?, metadata_warning? }(无录屏进行中 → ok=false + error;kill child + wait 10s 超时强 wait + 读 .prec metadata;metadata_warning 字段在 .prec 损坏时透出) |
类别 6c — USB release 三步链路(1 tool,kill + flush + eject,ADR-0029):
| Tool | 入参 | 返回 JSON |
|---|---|---|
proc_usb_release | confirm: bool(必传)/ drive: String("E" / "E:" / "E:\" 都接受,与 proc_eject_status 同款 normalize)/ kill_pids: Vec<u32>(agent 通常从 proc_eject_status locks[].pid 拿)/ dry_run: Option<bool>(默认 false,true 跳过执行返预演) | { ok, dry_run, action: "release", drive, killed_pids: [{ pid, result: "Killed"|"AlreadyGone"|"AccessDenied"|"Failed"|"Error", error? }], flushed: bool, ejected: bool, warnings: [...] }(flush 失败仍尝试 eject,warnings 数组累积三步诊断) |
类别 6d — docker-rm 写操作(3 tool,bollard API,ADR-0029):
| Tool | 入参 | 返回 JSON |
|---|---|---|
proc_docker_rm | confirm: bool(必传)/ container_id: String / force: Option<bool>(默认 false)/ volumes: Option<bool>(默认 false,同时删关联匿名 volume) | { ok, container_id, removed: bool, force, volumes }(Docker 未运行 → ok=false + error) |
proc_docker_image_rm | confirm: bool(必传)/ image_id: String / force: Option<bool> / prune_children: Option<bool>(当前未区分,bollard API 限制,warning 字段透出) | { ok, image_id, removed: bool, force, warning? } |
proc_docker_volume_rm | confirm: bool(必传,数据永久丢失不可逆)/ volume_name: String / force: Option<bool> | { ok, volume_name, removed: bool, force } |
Resource subscribe + SSE transport(v0.17.0 · 扩 v0.18.0)
Resource subscribe(rmcp 0.11 ResourceRoute trait,ADR-0027):ProcMcpHandler 暴露 3 个资源 URI,client 通过 resources/read polling 拿 snapshot(v0.17 落地)+ resources/subscribe 后 server 主动 push 增量(v0.18 stage 2 补全):
| URI | 返回 JSON |
|---|---|
proc://metrics/system | 与 proc_metrics_system tool 同款 schema(drain 持久 snapshot 字段,fallback 现场 new) |
proc://processes/list | 与 proc_ls --sort cpu --limit 50 同款 schema(top 50 by cpu_usage) |
proc://docker/events | 与 proc_docker_events tool 同款 schema(recent 50 events,500ms 短超时 drain) |
subscribe-push worker lifecycle(v0.18.0 落地,ADR-0027 §关键设计点 5):SubscribePushWorker 持 subscribers: Arc<Mutex<HashMap<String, Peer<RoleServer>>>> 注册表,client 调 resources/subscribe { uri } 后 lazy spawn push task(1s tick 遍历调 peer.notify_resource_updated,peer 断开自动从注册表移除)。stdio transport 单 client 假设(同 URI 单 client 订阅);SSE transport 多 client 待 v0.19+ cycle 升级为 HashMap<String, Vec<Peer>>。stage 1 Spike 调研结论(context7 rmcp 0.11 docs 验证):rmcp 0.11 ServerHandler trait 不暴露 subscribe_resource 方法(client resources/subscribe 请求 SDK 自动 ACK),server 主动 push 走 Peer::notify_resource_updated(ResourceUpdatedNotificationParam) notification 路径——proc 需自建 worker lifecycle。
SSE transport(proc mcp serve --transport sse --port 8080,ADR-0027 §6):v0.19.0 full 实装。3 件套:
- runtime 分支切换(ADR-0027 §6.1):
TransportKind::Stdio→Builder::new_current_thread().enable_all()(与 v0.7~v0.18 既有路径零回归)/TransportKind::Sse(_)→Builder::new_multi_thread().worker_threads(4).enable_all()(多 client 并发 + axum + tower StreamableHttpService 需要) - axum + tower StreamableHttpService 路由(ADR-0027 §6.2):
StreamableHttpService::new(service_factory, LocalSessionManager, StreamableHttpServerConfig)+ axumRouter::new().route_service("/mcp", http_service)+TcpListener::bind((bind_addr, port))+axum::serve(listener, app) - multi-client 注册表升级(ADR-0027 §6.3):
HashMap<String, Peer>→HashMap<String, Vec<Arc<Peer>>>(同 URI 多 client 各占 vec 一位)+ push task 改tokio::task::JoinSet并发 spawn +Arc::ptr_eq精确 cleanup fail peer
bind-addr 安全默认(ADR-0027 §6.4):CLI flag --bind-addr 默认 127.0.0.1(仅本机,与 ADR-0008 self-mitigation policy 对齐)/ 0.0.0.0(全网卡,用户显式 opt-in)。SSE 暴露 proc MCP tool(含 proc_docker_rm / proc_docker_image_rm / proc_docker_volume_rm / proc_usb_release / proc_record_start 等写操作),全网卡监听需用户显式 opt-in 避免意外暴露到 LAN。
RUSTSEC-2026-0189 注记(v0.27,ADR-0037 D4):rmcp <1.4 的 Streamable HTTP transport 不校验 Host header(DNS rebinding 攻击面)。proc 默认 proc mcp serve = stdio transport,不受影响(advisory 原文明示非 HTTP transport 不受影响);受影响面仅 opt-in SSE 路径,攻击链需「显式开 SSE + 服务运行中 + 受害者浏览恶意页」三条件同时成立,且 --bind-addr 默认 127.0.0.1 + 写操作 confirm 契约在位缓解。处置:CI audit 挂 ignore + TD-63 追踪 0.11→≥1.4 major 升级(46 tool 底座 breaking,独立 cycle)。
已知限制(v0.19 stage 2 兜底策略,留 v0.20+ cycle 补全):
- subscribe 跨调用不做 dedup:rmcp 0.11
Peer<R>struct 字段全 private(tx/request_id_provider/progress_token_provider/progress_timeout_watchers/info),无 public identity method。同 client 多次 subscribe 同 URI 会在 vec push 多个Arc<Peer>项;依赖 push task 失败 cleanup 兜底(client 断开后下一次 push 失败对应 Arc 被精确移除) - unsubscribe 清空整个 vec:MCP 协议
UnsubscribeRequestParam只有 uri 不携带 client identity。stdio 单 client 场景正确(vec 长度 ≤ 1);SSE multi-client 场景下 A client unsubscribe 会清掉 B client 同 URI 订阅(B 想继续订阅需 client-side 重 subscribe) - v0.20+ cycle 改进方向:从
RequestContext::extensions拿mcp-session-idHTTP header(SSE 路径)作 client identity,让 subscribe dedup + unsubscribe precise removal 走 mcp-session-id 字符串作 secondary index
SSE 后续能力推迟 v0.20+ cycle(brainstorm §决策 6):graceful shutdown(Ctrl+C 时 axum 主动关连接)/ Auth Bearer token(生产部署)/ CORS(Web dashboard 集成)/ TLS(远程 agent 公网传输)。
字段裁剪:proc_ls 不返回 exe / cwd / user_id,避免 LLM 上下文泄漏敏感路径(列表视角,详见 ADR-0009);proc_inspect(summary) 是详情页视角,返完整 cmd/exe/cwd 真值(agent 主动查单个进程 = 已同意看真值,与列表视角互补不冲突,详见 ADR-0023);proc_inspect(env) 默认 mask secret 12 关键字(与 v0.6 env_reveal 同款契约,reveal=true opt-in 显示真值);写操作(proc_kill / proc_pkill / proc_monitor_add / proc_monitor_remove / proc_bookmarks_add / proc_bookmarks_edit / proc_bookmarks_delete)dry_run=false 默认(与 v0.7 契约一致,dry_run=true opt-in 预演);不可逆破坏性操作(proc_record_start / proc_usb_release / proc_docker_rm / proc_docker_image_rm / proc_docker_volume_rm)confirm: bool 必传(ADR-0029 决策 5,与 dry_run 互补——dry_run 是「不真正执行」/ confirm 是「确认风险后再执行」);sidecar 写失败兜底(sidecar_written: false + warning,brainstorm §决策 7)。
主题与持久化
10 个内置主题:Dark / Catppuccin / Dracula / Gruvbox / One Dark / Rose Pine / Nord / Solarized / Tokyo Night / Light。t 循环切换,选择持久化到 ~/.config/proc/theme.txt。
用户偏好持久化:进程列表排序字段、首次启动引导 flag 都写入 ~/.config/proc/ui.toml。
首次启动:ui.toml 缺失时显示一次性引导提示「按 ? 查看快捷键」,按 ? 后写盘 first_run=false,下次启动不再提示。
安装
# 方式 1:cargo binstall(5 秒装预编译版,推荐)
cargo install cargo-binstall
cargo binstall proc
# 方式 2:从源码编译(5 分钟)
git clone https://github.com/Alfroul/proc.git
cd proc
cargo build --release
./target/release/proc
# 方式 3:GitHub Releases 直接下载 zip(预编译二进制 + 补全文件)
# https://github.com/Alfroul/proc/releases
Shell 补全(v0.7.0+)
# 在线生成补全脚本到 stdout,重定向到对应 shell 的补全目录。
proc completions --shell bash > ~/.bash_completion.d/proc
proc completions --shell zsh > ~/.zsh/completions/_proc
proc completions --shell fish > ~/.config/fish/completions/proc.fish
proc completions --shell powershell > $PROFILE
Release artifact 也附带预生成的 4 个补全文件(completions/ 目录;v0.27 勘误:原「scoop / winget 安装」表述失实——两渠道均无 proc manifest,分发渠道为 GitHub Releases + cargo-binstall)。
也可 cargo install --path . 装到 ~/.cargo/bin/。
快捷键
按 ? 在 TUI 内查看完整列表(带分组、可滚动)。
| 键 | 功能 |
|---|---|
1-6 | 切换面板 |
Ctrl+Pv0.7.0 | 命令面板(fuzzy 搜命令:kill / port panel / theme / sort by cpu / ...,~40 项直达,替代记忆键位) |
v | 切换进程视图(列表 ↔ 应用分组) |
t | 切换主题(持久化) |
? | 帮助页 |
↑↓ / PgUp PgDn | 移动 / 翻页 |
Enter | 详情 / 展开 / 折叠 |
Space | 多选 |
/ | 搜索 |
←→ | 切换排序字段(持久化) |
S | 直达安全分排序 |
k / K | 终止 / 强制终止进程树 |
A | 告警弹窗 |
R(大写) | VT100 录制开关 |
Shift+←→ | 回放:跳 10 帧 |
Tab / Shift+Tab | 详情页内切换 Inspector Tab(概要 / 环境 / 网络 / DLL / 句柄 / 内存)v0.5.0 |
+ / -v0.5.0 | 详情页 Summary Tab:调整进程优先级(Idle ↔ Realtime 6 档) |
F5v0.6.0 | 详情页:强制刷新 Inspector 数据(替代 'r',对齐 Mission Center / htop;旧 'r' 兼容期显示 deprecation warning) |
yv0.6.0 | 详情页:复制进程信息到剪贴板(vim yank,替代 'c';旧 'c' 显示 deprecation) |
vv0.6.0 | 详情页:切换 Env Tab 的 secret 脱敏(录屏中强制 mask) |
Ctrl+Fv0.5.0 | 详情页句柄 / 内存 Tab:搜索过滤 |
D(大写)v0.5.0 | 端口面板:切换 DNS 查询日志子视图 |
ev0.5.0 | Docker 面板:exec 进容器(嵌入式 PTY) |
lv0.5.0 | Docker 面板:进入容器日志视图 |
tv0.5.0 | Docker 面板:查看容器内进程(docker top) |
Tab(Docker 面板)v0.5.0 | 切换 Containers / Images / Volumes 三视图 |
r(详情页) | 重新采集 Inspector 数据(环境/网络/模块/句柄/内存) |
q / Esc | 退出 / 清搜索(详情页内第一次 Esc 只退搜索,第二次才返回列表) |
v0.6.0 键位变更:详情页
r→F5(刷新,对齐 Mission Center / htop)、c→y(vim yank 复制)、新增v切换 Env Tab secret 脱敏;Docker 面板r→Shift+R(restart / 刷新镜像或卷)。旧r/c在 v0.6.0 兼容期会显示 deprecation warning 指引新键位,v0.7.0 移除。
详情页内的 k / w 保持原语义(终止 / 加监控)。各面板有额外快捷键,底部状态栏有提示。
命令行
proc # 启动 TUI
proc ls --sort cpu --limit 20 # 列出进程
proc ls --sort net_recv --limit 10 # 按下载速率排序
proc tree # 进程树
proc port 8080 # 查看占用 8080 的进程
proc port 8080 --kill # 终止占用 8080 的进程
proc port --stats # TCP 传输质量摘要
proc kill 1234 # 终止进程
proc kill 1234 --force # 强制终止进程树
proc pkill chrome.exe # 按名称终止
proc pkill chrome.exe --force --dry-run # 强制 + 预览不实际终止
proc eject E: # 检测 E 盘占用
proc eject E: --find-locks # 详细句柄列表
proc who Cargo.toml # 反查谁占用此文件
proc handles --pid 1234 # 枚举 PID 1234 的所有句柄
proc handles --file Cargo.toml # 反查占用此路径的所有 PID
proc priority 1234 # 查询 PID 1234 优先级
proc priority 1234 --set high # 设为 High
proc affinity 1234 # 查询 affinity mask
proc affinity 1234 --set 0xFF # 设为 0xFF(前 8 核)
proc smart # 列出所有磁盘 + 健康
proc smart /dev/sda # 查看 /dev/sda SMART 详情
proc smart '\\.\PhysicalDrive0' # Windows 物理磁盘 0
proc dns --tail # 流式输出新 DNS 事件(仅 Windows)
proc diag # 输出 worker metrics JSON(bug 报告附上)
proc monitor --add --pid 1234 # 监控 PID
proc monitor --add --port 8080 # 监控端口
proc monitor --add --command "cargo run" # 监控并自动重启
proc monitor --remove 1 # 删除监控(按 ID)
proc record # 启动 TUI 并录制
proc replay recording.prec # 回放
proc export --format json --limit 20 # 导出 JSON 到 stdout
proc export --format csv -o procs.csv --sort mem # 按内存导出 CSV 到文件
# Docker 11 子命令
proc docker ps # 容器列表(默认)
proc docker inspect <name> # 容器详情
proc docker top <name> # 容器内进程
proc docker logs <name> # 一次性输出日志
proc docker logs <name> --follow --tail 100 # 跟随模式 + 末尾 100 行
proc docker images # 本地镜像
proc docker volumes # 卷列表
proc docker image-rm <id> # 删除镜像(两次确认)
proc docker image-rm <id> --force # 强制删除(即便 in_use)
proc docker volume-rm <name> # 删除卷
proc docker compose up -d # 转发给 docker-compose
proc docker events # 监听事件流(Ctrl+C 停)
proc docker exec <container> # exec 进容器(推断 shell)
proc docker exec <container> bash -lc "env" # exec 指定命令
平台支持
v0.12.0 起 Windows-only(详见 ADR-0022)。Windows 10 1809+ / Windows 11 x64。Linux / macOS 用户迁移路径:git checkout v0.11.0(最后含 Linux 代码的 release)。
release CI 仅覆盖 1 个 target(v0.12.0+):x86_64-pc-windows-msvc。cargo binstall proc 或 GitHub Releases 下载 zip 安装(v0.27 勘误:winget / scoop 渠道从未实际存在——两处包管理器仓库均无 proc manifest,原指引失实,详见 ADR-0037 D5;Linux / macOS 包不再发布,详见 ADR-0022)。
| 功能 | Windows 10 1809+ / Windows 11 x64 |
|---|---|
| 进程列表 / 树 | ✅ |
| 进程分类(用户/系统/服务) | ✅ Win32 |
| 安全评分(签名) | ✅ WinVerifyTrust R16v0.11.0 + 9 状态机v0.12.0 + trusted_signers.tomlv0.12.0 |
| USB 助手 | ✅ |
| 降频检测 | ✅ |
| per-core 频率v0.5.0 | ✅ CallNtPowerInformation |
| per-core 温度v0.5.0 | ✅ ACPI |
| 每磁盘 I/O 速率 | ✅ |
| 每进程磁盘 I/O | ✅ sysinfo(IO 性能计数器) |
| 每进程磁盘 I/O(ETW 高精度)v0.7.0 | ✅ NT Kernel Logger + DiskIo TypeGroup1(管理员;非管理员降级到 sysinfo) |
| GPU(多厂商)v0.5.0 | ✅ NVIDIA via NVML + DXGI / PDH utilization |
| SMART 磁盘健康v0.5.0 | ✅ smartctl + WMI 降级 |
| per-process 网络流量v0.5.0 | ✅ IP Helper |
| DNS 查询日志v0.5.0 · v0.11.0 ETW | ✅ ETW(默认)/ PowerShell(fallback,管理员判定 proc diag 看 dns_collector) |
| TCP 传输质量v0.5.0 | ✅ GetTcpStatisticsEx2 |
| 进程句柄 Tabv0.5.0 | ✅ NtQuerySystemInformation |
| 内存映射 Tabv0.5.0 | ✅ VirtualQueryEx |
| 进程优先级 / affinityv0.5.0 | ✅ SetPriorityClass / SetProcessAffinityMask |
| Windows 11 EcoQoS 切换v0.7.0 | ✅ SetProcessInformation(ProcessPowerThrottling) + 进程列表 🍃 标记 |
| Schannel ETW TLS SNIv0.10.0 | ✅ Microsoft-Windows-Schannel-Events ETW event 1793(Win10 1809+ 管理员 + TDH 动态 schema) |
| 文件占用反查(who)v0.5.0 | ✅ filelocksmith |
| v0.6.0 安全加固(self-mitigation / env mask / restricted spawn) | ✅ |
| v0.6.0 可观测性(log rotate / crash report / worker metrics) | ✅ |
| Docker(ps/inspect/top/logs/images/volumes/exec) | ✅ |
| 进程级带宽(EStats) | ✅ |
| Toast 通知 | ✅ |
| 网络诊断 | ✅ |
| 录屏 / 告警 / 监控 | ✅ |
FAQ
需要管理员权限吗? 基本功能不需要。管理员权限可启用进程级带宽监控(EStats)、终止某些系统进程、完整句柄枚举。非管理员自动降级。
为什么 v0.12 移除 Linux / macOS 支持?v0.12.0 详见 ADR-0022。简短理由:(1) 维护成本——Linux eBPF flow graph(ADR-0016)+ Linux PSI 监控(ADR-0013)+ Linux nvtop GPU + Linux nethogs 网络流量这些「Linux 杀手锏」需要 Linux 真机环境持续验证,开发者主要在 Windows 开发,Linux 路径长期挂着 未在本机验证 标签(TD-19)成为债务黑洞;(2) 聚焦——proc 的核心价值在 Windows 平台深度(WinVerifyTrust / ETW / Schannel / EcoQoS / NT Kernel Logger / Win32 API),把精力集中在 Windows 让 Windows 体验做到最佳;(3) 简化——Cargo.toml 删 libc / aya / aya-log 等 Linux 依赖,CI / release 只跑 1 个 target(之前 5 个),工具链简化让迭代更快。Linux / macOS 用户如需 v0.12+ 新功能(如 trusted_signers / mem% 修复 / 9 状态机)欢迎 fork。
Linux / macOS 用户怎么办?v0.12.0 三个选项:(1) 停留在 v0.11.0——git checkout v0.11.0 或在 releases 下载 v0.11.0 二进制;v0.11.0 是最后含 Linux 代码的 release,含完整 eBPF / PSI / nvtop / nethogs 路径。(2) fork 继续 Linux 维护——proc 是 MIT 协议,欢迎社区 fork 维护 Linux 分支。(3) 替代方案——Linux 推荐 btop(TUI)/ htop(TUI)/ sysdig(eBPF);macOS 推荐 Activity Monitor(内置)/ iStat Menus。详见 ADR-0022 migration path 段。
GPU 信息不显示?
- Windows:仅显示 NVIDIA(via NVML),其他显卡走 DXGI 显示 VRAM(utilization/temp/power 仅 NVIDIA)
- Linux:安装
nvtop后自动启用 AMD / Intel / NVIDIA 全厂商监控 - macOS:暂不支持
DNS 日志记录写到哪? 永不持久化。仅在内存中保留最近 1000 条,退出 proc 即丢失。这是隐私设计。如需长期记录请用 Windows 事件查看器导出 Microsoft-Windows-DNS-Client/Operational channel。
容器 exec 跟直接 docker exec 有什么区别? TUI 内按 e 进入的是嵌入式 PTY 视图(portable-pty + vt100 crate),ANSI 渲染在 ratatui 内部;CLI proc docker exec 直接透传 stdio,等价 docker exec -it。两者底层都 spawn docker exec -it <container> <shell> 子进程,docker CLI 处理所有 daemon 通信。
smartctl 未安装? Windows 装 smartctl 后 proc 自动用,未装时退化到 WMI MSStorageDriver_FailurePredictStatus(仅预测失败聚合状态,无详细属性)。
录屏会泄漏什么?v0.6.0 录屏(VT100 recording)会捕获屏幕所有内容含 DNS 域名 / 进程 cmd / env 真值(如果 reveal 打开)。v0.6.0 起按 R 触发录屏时先弹确认对话框(按 y 确认 / n 取消),并在录屏期间强制 Env Tab 走 mask 模式(即便 env_reveal=true 也强制 mask)。录屏文件存 ~/.config/proc/recordings/*.prec,永不自动上传。
self-mitigation 开了哪些策略?v0.6.0 5 项:DEP(Permanent)/ ASLR(HighEntropy)/ ProhibitDynamicCode / DisableExtensionPoints / ImageLoad(NoRemote + NoLow + PreferSystem32)。不开 ProcessSignaturePolicy(会让 nvml-wrapper 未签名 native 依赖挂)。详见 ADR-0008。可在 Process Explorer → Properties → Image File → Mitigation flags 验证。
crash report 在哪?v0.6.0 ~/.config/proc/crashes/ 下:主线程 panic → crash-{YYYYMMDD-HHMMSS}.txt;worker 线程 panic → crash-worker-{name}-{ts}.txt。文件含时间戳 + proc 版本 + panic info + Backtrace::force_capture()。报 bug 时把对应文件附上。
日志为什么不覆盖了?v0.6.0 v0.5.0 以前启动时 File::create truncate 覆盖旧日志,崩溃前最后一段全丢。v0.6.0 起改为 tracing-appender::RollingFileAppender::daily,每天一个文件 proc.logYYYY-MM-DD,自动清理 7 天前的日志。
如何启用 eBPF flow graph?v0.7.0 · v0.12 移除 仅 Linux 平台,需自行编译。v0.12 起 Windows-only,eBPF flow graph 路径已删(ADR-0022)——src/ebpf/ 整模块删除,Cargo.toml ebpf feature flag 删除。Linux 用户迁移路径:git checkout v0.11.0 仍可用旧 eBPF 路径(详见 ADR-0016,Status 改 Superseded by ADR-0022)。Windows 用户走 ADR-0018 Schannel ETW TLS SNI 路径替代——端口面板按 F 进入 Flow 子视图,CLI 用 proc flows。
eBPF 需要什么权限?v0.7.0 · v0.12 移除 root 或 。v0.12 起 Windows-only,eBPF 路径已删(见上一条「如何启用 eBPF flow graph」与 ADR-0022)。CAP_BPF + CAP_PERFMON capability,内核 ≥ 5.10
R15 安全评分(外联行为)怎么触发?v0.7.0 默认不启用。需要显式创建 ~/.config/proc/sni_whitelist.txt(一行一个允许的域名,# 开头注释),R15 才激活。两条命中条件(任一扣 30 分):dns_name 不在白名单 / 10s 内 ≥ 50 个不同 IP(端口扫描特征)。空文件 = "所有 dns_name 都不在白名单"(用户自负)。详见 ADR-0016。
进程名旁边的 🔒 / ⚠️ / ❓ 是什么?v0.11.0 签名状态标记(ADR-0021):🔒 Trusted(签名链追溯到微软 / 已知 CA)/ ⚠️ Unsigned 或 Revoked(无签名 / 签名被吊销)/ ❓ Unknown(验证失败 / 非管理员运行)。Pending(启动后头 1-2 个 heavy refresh 内的默认值)和 Signed(已签名但非受信 CA)不显示 emoji 避免列宽波动。Inspector Summary Tab 显示完整状态(如「签名: 受信签名 (微软/已知 CA)」)。CLI 走 proc ls --filter 'security_score < 80' 可过滤出扣分进程。详见 ADR-0021。
proc 显示我的应用是 ⚠️(无签名),但我明明有签名?v0.11.0 · v0.12.1 改进 三步排查:(1) proc 是否以管理员身份运行?非 elevated 时 verify_signature 直接返回 Unknown(不调 WinVerifyTrust),v0.12.1 起进程列表不显示任何 emoji(Unknown 与 Pending / Signed 同款空串),进 Inspector Summary Tab 才能看到「未知(需管理员权限)」状态——以管理员身份重启 proc 即可激活 WinVerifyTrust 真实验证;(2) 签名链是否完整?中间证书缺失会让 WinVerifyTrust 返 TRUST_E_SUBJECT_NOT_SIGNED 或链断裂错误(落入 Unknown / ChainError);(3) 是不是 .cat 文件签名?驱动 + 系统组件走 .cat 关联签名,WinVerifyTrust 直接验 .exe 会返 Unsigned——这是已知限制,留 TD。跑 proc ls --json | jq '.[] | select(.signature_status=="Unsigned")' 拿到完整列表后用 sigcheck /a your.exe(Sysinternals)交叉验证。
Windows Flow graph 怎么用?v0.10.0 Windows admin 自动启用 Schannel ETW worker(不需要 feature flag):启动 proc → 端口面板按 F 切到 Flow 子视图 → curl / 浏览器触发 TLS handshake → 看到 SNI 列表。CLI 走 proc flows 同款显示,proc flows --json 输出含 "source": "schannel" 字段。非管理员 / Win10 < 1809 / x86 进程 → worker 启动失败 / 不 fire,UI 显示降级提示。详见 ADR-0018。
Windows 用户在 Flow 子视图看到 0 条怎么办?v0.10.0 三步排查:(1) winver 查 Windows 版本,需 Win10 1809+(build 17763+)/ Win11;(2) 以管理员身份启动 proc(非管理员 worker 启动失败);(3) 触发 TLS handshake 后等 1-2s(Schannel event 1793 在 DeleteSecurityContext 时 fire,连接关闭瞬间才有)。仍 0 条?跑 proc diag 看 schannel_etw worker 行的 poll_count 是否增长——若增长但 SNI 空,说明 callback 收到 event 但 TDH 解析失败,请附 ~/.config/proc/logs/proc.log 报 issue。
proc 显示 R17 可疑父子链命中,但我的 Word/Excel 启动 cmd 是合法脚本?v0.11.0 R17 是「典型 macro attack 链」启发式检测——扣分不代表恶意,只是符合攻击模式。三步排查:(1) Inspector Summary Tab 顶部红色警告下方有完整 chain(WINWORD.EXE → cmd.exe),核对是不是你预期的脚本;(2) 进入详情页看 命令行: 字段(proc inspect <pid> 同款),确认 cmd 参数是预期脚本路径而非 base64 / encoded payload;(3) 如果确实合法想消除警告,目前 R17 内置 pattern 不支持白名单(v0.11.0 后续会加),但可以在 ~/.config/proc/lineage_rules.toml 配自定义规则替代默认检测——例如把 weight 调低到 5:
# 注:内置 OfficeToShell/BrowserToShell/ScriptInterpreter 仍会扣 35/25/15,
# 此处仅用于追加自定义规则(无法 override 内置 weight)。
[[rule]]
name = "my_editor_to_shell"
parent_pattern = "(?i)my_editor"
child_pattern = "(?i)(cmd|powershell)"
weight = 5
详见 tech-debt(R17 内置 pattern 白名单待加)。
proc 显示 R18 命中(suspicious_path_* / [⚠ 可疑位置]),但我的便携应用就放在 AppData?v0.11.0 R18 是「malware 常见启动位置」启发式检测——%TEMP% / %APPDATA% / %LOCALAPPDATA% / %USERPROFILE%\Downloads 都是用户可写目录,合法便携应用确实会放在这些位置。三步排查:(1) 看进程是否同时命中 R16(未签名)——Inspector Summary Tab 顶部若有「未签名 + 可疑路径协同命中(双重特征强信号)」警告,强烈建议扫描病毒;签名应用(🔒 / 空 emoji)通常合法。(2) 便携应用确实需要放 AppData 时,可在 ~/.config/proc/path_rules.toml 配置中接受该路径(虽然不能直接白名单内置 kind,但可以确认权重符合预期):
# 自定义可疑目录(不会影响内置 Temp/AppData/LocalAppData/Downloads 判定)
[[suspicious_dir]]
name = "my_portable_app"
path = "%USERPROFILE%\\my_portable" # 支持 %VAR% / ${VAR} / $VAR 占位符
weight = 5 # 缺省 25
reason = "便携应用残留路径"
(3) R18 与 v0.6 path_check(temp_dir / downloads_dir)叠加扣分——Temp 路径会同时扣 25(temp_dir)+ 20(suspicious_path_temp)+ 协同 10 = 55 分(未签名情况下)。这是 surgical 原则下的设计:保留 v0.6 path_check 不动,R18 作为独立入口叠加扣分(同 R17 + v0.7 office_spawning_shell 的处理模式)。如果只能接受单次扣分,参考 CONTEXT.md R18 段了解评分逻辑。
worker 崩溃了怎么办?v0.6.0 · v0.11.0 自动重启 TUI 顶部会渲染红色 banner([worker name] panicked: <message>),按 D 清空。同时 crash report 写到 crashes/crash-worker-*.txt。v0.11.0 起自动热恢复:worker panic 后按指数退避(5s / 30s / 5min)自动 respawn;3 次失败永久死亡需重启 proc(WorkerManager::restart 实装,TD-4 清零)。banner 三态显示(restarting / restarted / permanent failure)。详见 ADR-0019。
为什么我的 DNS 日志延迟还是高 / 漏抓?v0.11.0 v0.11 起默认走 ETW(CPU < 0.5%、延迟 < 50ms),但管理员权限是硬要求——非管理员自动降级到 PowerShell probe(v0.5.0 路径保留)。跑 proc diag,末尾的 dns_collector: <kind> 行反映实际类型(etw / powershell / none)。如果是 powershell 想用 ETW:以管理员身份启动 proc 即可。Linux / macOS 没有 DNS-Client ETW provider,DNS 日志功能不可用。
FilterExpr cpu > 5 在 Flow 子视图(F 进入)为什么过滤掉所有 flow?v0.11.0 v0.11 阶段 8 REVIEW-13 P1-2 修复——Flow 视图走 apply_network 求值上下文,process 字段(cpu/mem/name/...)在该 ctx 下永远 false(无 ProcessInfo),用户写后会过滤掉所有 flow。CLI proc flows --filter 'cpu > 5' 会打印 warn 提示「Flow 字段:sni/dns_name/remote_addr/remote_port/bytes_out/bytes_in/source,详见 ADR-0011」+ 退出 1;TUI 同款 UX 缺口留 TD 归档(需更深状态机协调)。Flow 视图正确语法:sni =~ /google\.com$/ / remote_port = 443 / source = schannel / dns_name in ("a.com", "b.com")。
R16 / R17 / R18 触发条件分别是什么?v0.11.0 三档评分规则:
- R16 签名(第 1 步接入,ADR-0021):每个进程
.exe走WinVerifyTrust6 状态机——Unsigned 扣 20 / Revoked 扣 35 / Signed(已签名但非受信 CA)扣 10 / Unknown(验证失败 / 非管理员)扣 5(仅 Windows)/ Trusted / Pending 不扣分。 - R17 可疑父子链(第 17 步):
OfficeToShell(Word/Excel/PowerPoint → cmd/powershell/wscript)扣 35;BrowserToShell(Chrome/Edge/Firefox → cmd/powershell)扣 25;ScriptInterpreter(wscript/cscript/mshta 直接运行)扣 15。可在~/.config/proc/lineage_rules.toml加自定义规则。 - R18 可疑启动路径(第 18 步):
%TEMP%扣 20 /%APPDATA%/%LOCALAPPDATA%/%USERPROFILE%\Downloads各扣 15;与 R16 协同(Unsigned/Revoked + 可疑路径同时命中)额外扣 10。系统目录(Program Files / Windows / System32)白名单不扣分。可在~/.config/proc/path_rules.toml加自定义目录。 - 跨规则叠加扣分(surgical 原则——保留 v0.6 path_check / v0.7 office_spawning_shell 不动,R17/R18 作为独立入口叠加):典型 macro attack 模式
未签名 + 临时目录 + Word → cmd可累加扣到 100+ 分。
R16 状态机 9 个变体分别扣多少分?v0.12.0 v0.12 阶段 3 TD-26 扩 WinVerifyTrust HRESULT 状态机,从 v0.11 6 变体扩到 9 变体:
Trusted/Pending:不扣分(受信 CA 或尚未触发验证)Signed:扣 10(已签名但非受信 CA)ChainError:扣 10(证书链断裂 / 名称不匹配 / 签名无效——验证不完整)Expired/UntrustedRoot:各扣 15(证书过期 / 不受信根,曾经受信但有问题)Unsigned:扣 20(无签名)Revoked:扣 35(签名被吊销,曾经受信但被 CA 撤销)Unknown:扣 5(Windows 非管理员降级 / 验证 API 错误)
badge 显示:🔒 Trusted / ⚠️ Unsigned / Revoked / Expired / UntrustedRoot / ❓ ChainError / 空 Pending / Signed / Unknown(v0.12.1:Unknown 从 ❓ 改空串避免非 admin 全屏噪音)。详见 ADR-0021。
proc 显示 Adobe / Docker / Cisco 等进程是 ⚠️ 或扣分(Signed),但我配了 trusted_signers.toml 还是不升级到 🔒?v0.12.0 v0.12 阶段 3 TD-27 落地,三步排查:(1) CompanyName 字段值:trusted_signers.toml 匹配的是 FileVersion Information 的 CompanyName(不是 X.509 certificate subject CN)。用 sigcheck /a your.exe(Sysinternals)或 PowerShell (Get-Item your.exe).VersionInfo.CompanyName 看真实值。(2) regex 大小写:用户 vendor_pattern 默认大小写敏感——需要不敏感请加 (?i) 前缀(如 (?i)^adobe)。内置 24 vendor 列表(v0.12 扩)已含 Adobe / Cisco / Oracle / VMWare / Docker / Red Hat / Apache / Python / GitHub / Electron / AMD 等,零配置即生效。(3) 配置文件位置 + 格式:~/.config/proc/trusted_signers.toml(Windows = C:\Users\{user}\.config\proc\trusted_signers.toml),格式 [[signer]] name / vendor_pattern / reason(可选),TOML 解析失败 / regex 编译失败会静默降级为空——查 ~/.config/proc/proc.log 看 trusted_signers rule「xxx」vendor_pattern 正则编译失败 警告。示例:
[[signer]]
name = "my_company"
vendor_pattern = "(?i)^MyCompany" # (?i) 让匹配大小写不敏感
reason = "内部应用"
终端异常? 退出后执行 reset 恢复。
FilterExpr 怎么写 CIDR / URL / 含 / 的正则?v0.12.0 v0.12 阶段 4 TD-28 起支持 \/ 转义。例子:remote_addr =~ /192\.168\.1\.0\/24/(CIDR)/ sni =~ /https:\/\/example\.com/(URL)/ cmd =~ /C:\/Users\/admin/(Windows 路径)。parser 把 \/ 转成单 /(regex crate 不接受 \/ 作为有效转义),其他 \X(如 \. \d \w)原样保留让 regex 解释。旧表达式(无 \/)行为不变。
FilterExpr mem > 5% 命中几乎全部进程?v0.12.0 v0.12 阶段 4 TD-30 修复 silent bug——v0.11 前 mem > 5% 字面量被解释为「mem_bytes > 5.0」(字节值与百分号数字直接比较),几乎全部进程命中。修复后 mem + % 按 mem / total_memory * 100 与百分号字面量比较(mem > 50% 在 16GB 系统上等价 mem > 8GB)。cpu > 5% 与 cpu > 5 仍等价(cpu 自身就是 0-100 标度);disk_read > 5% / net_sent > 5% 等没有自然除数的字节字段保留 legacy 行为(surgical:不在 EvalCtx 加 disk_total / net_total 等字段)。total_memory 在测试场景(panel_with_procs 传 0)退回 legacy 行为避免 div by zero。
配置文件在哪? ~/.config/proc/ 下:theme.txt(主题索引)、ui.toml(排序偏好)、alerts.toml(告警规则)、proc.logYYYY-MM-DD(运行日志,daily rotate 保留 7 天)、crashes/(panic crash report)、recordings/(默认录制路径)。
如何查看详细日志? 日志默认写到 ~/.config/proc/proc.logYYYY-MM-DD(每天 rotate,保留 7 天)。用 RUST_LOG 调级别:
RUST_LOG=proc=debug proc # debug 级别
RUST_LOG=proc::security=trace proc # 仅安全模块 trace
RUST_LOG=proc::port_map=debug proc ls # CLI 子命令也生效
未设置 RUST_LOG 时默认级别为 info。
如何报 worker 性能问题?v0.6.0 跑 proc diag 输出所有 worker 的 metrics JSON(avg_us/max_us/polls/drops/last_error),附在 bug 报告里。TUI 内按 ? 进入帮助页也可看精简版(带 ✓ / ⚠ 健康徽章)。
Benchmark
v0.13.0 起仓库含 criterion benchmark suite(6 个 hot path:搜索 / 排序 / heavy refresh / TUI 渲染 / 录屏序列化 / FilterExpr apply)。本地跑:
cargo bench # 跑全部 6 个 benchmark
cargo bench --bench bench_refresh_heavy # 单独跑一个
输出在 target/criterion/<name>/<fixture>/new/estimates.json(含 mean / median / stddev)。不在 CI 跑——criterion 在 GitHub Actions 共享 runner 抖动大,仅本地手跑。
性能摘要(完整 25 数据点 + v0.13 基线逐项对照见 docs/performance.md,2026-08-31 同机实测):
- 25 数据点全无回归;1000 进程规模下全部核心 hot path < 6 ms(v0.13 基线报告「无显著性能瓶颈」结论延续)
- refresh_heavy 2.9×(16.47 → 5.69 ms @ 1000 进程)——TD-47
parent_chainArc<str>重构消除 ~10,000 次/轮 String heap alloc(commit4c7e294,v0.17) - v0.13 基线报告(PERF-BASELINE,2026-07-04):
docs/reviews/PERF-BASELINE-v0.13.md。报「卡」时附cargo bench数字可大幅降低定位成本。
License
MIT(仓库根目录 LICENSE 文件)