Skip to content

feat(process): processMemory.summarize 按进程归属汇总 Lithe 实例的内存 - #43

Merged
xiaoyumuxi merged 1 commit into
mainfrom
feat/process-memory-summary
Nov 14, 2026
Merged

xiaoyumuxi merged 1 commit into
mainfrom
feat/process-memory-summary

Conversation

@xiaoyumuxi

@xiaoyumuxi xiaoyumuxi commented Nov 14, 2026 •

Copy link
Copy Markdown
Contributor

关联

状态栏的内存详情显示 Lithe 实例占用多少内存:主进程、语言服务器、插件服务、它们启动的子进程,以及 macOS 上替 Lithe 渲染网页的 WebKit 辅助进程。原来桌面端用 ps 读进程树、在 Go 里按父进程求和,口径是 RSS,和活动监视器不一致,也算不到系统辅助进程。这个 PR 让 Core 负责判定归属和汇总,宿主只提供原生进程表。桌面端改动在配套 PR 1lck/Lithe-IDEA#1926(固定在本 PR 的 commit 5e2a580,本 PR 合入后改为 main 上的 commit)。

改动

  • 新增命令 processMemory.summarize:请求给出主进程号 hostProcessId、进程表 processes(processId、parentProcessId、name、bytes,可选的 responsibleProcessId 与 startTime)、宿主登记的角色 roles(processId、kind、name)和可选的 entryLimit;返回 totalBytes、按类别的 categories(kind、bytes、processCount)、占用最多的 entries(kind、name、processId、bytes、processCount)和其余项的合计 omitted(count、bytes)。
  • 归属规则(写在契约里):
    • 主进程是 host。
    • 父链在到达主进程之前遇到带角色的进程,就归该角色的那一部分;插件服务启动的语言服务器算语言服务器。
    • 父链先到达主进程的进程是 childProcess,按主进程的直接子进程分组。
    • 不在主进程进程树里、但 responsibleProcessId 是主进程的进程是 systemHelper(macOS 的 WebKit 辅助进程),按最上层的这类进程分组。
    • 其余进程不计入。父链成环的进程视为没有父进程;父进程比子进程启动得晚说明进程号被复用,不再沿父链往上找。
    • entryLimit 默认 20、最多 200;名称截到 80 个字符;占用相同时按类别、名称、进程号排序,结果稳定。
    • 进程表里没有主进程或有重复进程号时返回 invalid_request。
  • 实现在新文件 rust/crates/process/src/memory.rs,由 lithe-process 导出;Cargo.toml 的描述同步更新。
  • 命令登记:protocol/command.rs(枚举和命令名)、runtime/dispatcher.rs(分发,坏请求返回 invalid_request)、runtime/request_trace.rs(状态栏每隔几秒调用一次,列为高频命令,不逐次追踪,测试同步)。
  • 契约 rust/contracts/rust-core-api.md:命令表新增一行,新增 “processMemory.summarize” 一节,写明请求、归属规则、返回值和错误。
  • 共享样例 rust/fixtures/process-lifecycle/memory-summary-v1.json:7 个用例(实例的每一部分、从终端启动的主进程不负责辅助进程、父进程比子进程晚启动即进程号复用、父链成环、角色指向主进程/重复/已退出的进程、超出上限的项合计且同值按类别名称进程号排序、上限为 0 只返回合计)和 5 个无效请求(缺少主进程、重复进程号、未知角色、缺少 bytes、负的 bytes)。桌面端测试读同一份样例。

验证

  • cargo test -p lithe-process -p lithe-core:全部通过,含 memory.rs 的单元测试和 tests/process_memory.rs 对共享样例的回放。
  • cargo fmt --all -- --check、cargo clippy -p lithe-process -p lithe-core --all-targets -- -D warnings、scripts/rust-core/verify-rust-core-comments.sh:通过。
  • 桌面端以 LITHE_CORE_RUST_DIR 指向本分支跑 scripts/desktop/desktop-go.sh test ./...:55 个包全部通过。

不涉及插件契约、能力版本或插件函数协议,所以不需要更新协议记录。

宿主传入原生进程表(进程号、父进程号、负责进程号、启动时间、内存、角色),
Core 判定每个进程属于主进程、语言服务器、插件服务、子进程还是系统辅助进程,
按类别汇总并给出占用最多的进程。进程号复用、父链成环、重复进程号和缺少主进程
都有明确处理,共享 fixture memory-summary-v1.json 覆盖这些情况。
@xiaoyumuxi
xiaoyumuxi marked this pull request as ready for review November 14, 2026 12:59
@xiaoyumuxi
xiaoyumuxi merged commit 959497b into main Nov 14, 2026
5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant