Rust 画界面、Node 跑插件,Martty 的资源账怎么算
写 Martty 的评测很容易滑向跑分,但 README 里没有任何内存或启动耗时数字,任何「占用多少 MB、冷启动多少毫秒」都是编的。能算的只有结构账:它由几个进程组成、各自负责什么、哪些部件是可选的、哪些等待有上限。Martty 0.3.3,MIT,80 星,周下载 340,要求node >=22.19.0、engines.dsh >=0.1.7-rc.2。
双进程:常驻的是两份运行时
dsh --profile martty启动两个进程。DSH Host 进程跑 Base Cordis tree、ACP Plugin 与 Agent;独立的 Martty Client 进程跑 UI、Theme、Slot、Overlay 与 Session Service。两边通过 ACP 通信,不共享 Plugin Fiber 或 Service 对象。
这句话有三层含义。第一,走 dsh profile 这条路时,Node 侧至少有两份运行时在驻留,进程数、句柄数、内存都要按两份预期,而不是「一个进程里塞了两套代码」。第二,两边对象树不共享,插件状态跨进程只能走 ACP 消息,「Host 改了 Service、Client 立刻看到」不成立。第三,Client 是独立进程,界面的绘制权归它。
通道:painter 独占 TTY,ACP 走管道
Rust/ratatui 写的 painter 由 Client 驱动,并独占用户 TTY;ACP 使用 Client 进程的 stdin/stdout;用户 TTY 走 fd 3/4,两条通道互不混用。
这是 Martty 既能画完整界面、又能说 ACP 的原因:协议流量与终端绘制被拆到不同文件描述符上,不会互相污染。反过来,把它塞进只转发 stdin/stdout 的封装时,要意识到 TTY 是另一条通道,界面能不能出来取决于它有没有拿到可用终端。插件的中文条目与版本可以对照 完整插件清单与汉化避坑指南。
原生二进制是可选依赖
CI 构建 macOS arm64/x64、Linux arm64/x64 与 Windows x64,分别发布为@openma/martty-<platform>-<arch>;安装martty时,npm 只装当前平台的那一个可选依赖。
这决定了磁盘账的形状:本机是「Node 侧代码 + 一个平台的二进制」,不是五套;反过来,若 CI 缓存或私有镜像把所有平台的包都拉下来,体积会放大,但那属于缓存开销。也正因为它是 optional dependency,任何省略可选依赖的安装方式都会直接打断 painter。
坑一 · --omit=optional 省掉的是 painter
现象。包装上了、命令也在,启动却画不出界面,painter 缺位。
原因。原生二进制按平台作为可选依赖分发,--omit=optional会把当前平台的@openma/martty-<platform>-<arch>一并省掉:Node 侧代码还在,Rust 侧的执行体没了。
解决。重新安装并启用可选依赖,装 Martty 时不要带--omit=optional;CI 里如果全局设了这个 flag,为这一步单独覆盖。
坑二 · dsh 低于下限:界面起了,Agent 没挂上
现象。dsh --profile martty能进界面,会话里只说明已装的 dsh 版本、要求的版本下限或缺失的能力。
原因。engines.dsh是下限>=0.1.7-rc.2,不是固定版本表。低于下限、或 host 缺少必需能力时,ACP 插件不会挂载;但 TUI 仍会启动并把原因写进会话,不会静默挂起。
解决。把 dsh 升到下限以上,或改用npx martty的内置模式(本版本内置@openma/deepseek-harness-acp0.4.39 及其 bundled runtime)。高于下限的版本一律尝试,新于已测试最高版本 0.2.1-rc.2 时只打印警告;本站已在 dsh 0.2.0-rc.2 下真实安装成功。
坑三 · 临时 Plugin 只活一个进程
现象。在 Cordis 模式里调好的界面 Plugin,重启 Martty 就没了。
原因。临时 Plugin 默认只属于当前进程,/liang缺省关闭;不显式打开就没有常驻路径。临时运行与保存是两件事。
解决。要跨重启就/liang on;Client-only 走cordis_define → cordis_run → tui_plugin_save → $MARTTY_HOME/plugins短路径,下次启动重新发现。含code.host的 Package 不能写进.oma,要整理成普通 Cordis npm Package 后dsh plugin --profile martty add <package-or-path>。
坑四 · Registry binary 下载没有总时长上限
现象。下载很久也不报超时;按 Esc 以为取消了,其实还在跑;退出 Martty 后任务直接没了。
原因。Registry 的binary分发只限制连接等待与无进展时间,不限制总时长。下载中 Enter 不关闭面板,Esc 只是隐藏、后台继续,但必须保持 Martty 运行;退出会停掉未完成任务。
解决。让它跑完,别关进程;真要中止用 Ctrl-C,它会取消并清理临时目录,不写入半完成配置。产物落在$MARTTY_HOME/bin/<id>/<version>/<platform>,校验 SHA-256 后才配置,且不写系统 PATH。
四项开销,四种可控手段
常驻运行时来自双进程,按实例数线性预期;界面绘制来自 Rust painter 独占 TTY,换更轻的 UI 组合是唯一旋钮;磁盘来自单平台二进制加 Node 侧代码,别省 optional;等待来自 ACP 建连与 binary 下载,后者只看无进展时间。
总结
Martty 的资源账不是「一个 TUI 有多重」,而是「两份运行时 + 一份平台二进制 + 两条通道」;想对照同类插件的中文清单见 DeepSeek Harness Hub 插件清单。
适合与不适合
适合:要看清楚 Agent 每一步在终端里做什么的人;能接受双进程、也要插件可热改的开发者;在 dsh profile 里统一运行时的团队;愿意读版本下限与安装选项的人。
不适合:只关心单进程占用的极简主义者;把插件当纯静态配置、不需要运行中改 UI 的人;要求人工风险结论的团队——该插件含敏感能力、尚无人工评估、站点未做风险分级。
标签:Martty、DeepSeek Harness、资源开销
本文由 DeepSeek Harness Hub 自动整理,数据来源于插件详情页。