# dsh-better-footer **Repository Path**: brian_sys/dsh-better-footer ## Basic Information - **Project Name**: dsh-better-footer - **Description**: deepseek harness web插件,在底边栏显示更多信息 - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-09-10 - **Last Updated**: 2026-09-10 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # dsh-better-footer [English](README_EN.md) | **中文** 把 DSH 输入框下方那条统计栏,替换成**一行合并的状态条**,并配一个从它展开的悬浮详情面板。 ``` ▸详情 │ 2轮29步 · 274tok/s │ 2.1Mtok · 命中96% │ 上下文13% │ 消耗¥0.00 │ 余额¥60.79 │ CPU4.4% │ 内存57.5% │ 网络↓2.5KB/s ``` 点 `▸详情` 弹出悬浮面板:会话与模型、Token 用量明细、上下文构成、花费口径、账户余额、主机资源、 主题选择,以及底栏显示项开关。面板浮在输入框之上,不会撑动对话布局;点面板外空白处收起。 ## 显示内容与数据来源 | 字段 | 来源 | 准确性 | | --- | --- | --- | | 轮/步 · tok/s | 会话投影 `sessionStats` | 精确(全量日志折叠) | | token 总量 · 缓存命中率 | 会话投影 `tokenUsage` | 精确(provider 上报) | | 上下文占用 / 构成 | 投影 `contextPressure`、`contextBreakdown` | provider 锚定的估算 | | 主题 | 客户端 `theme` 服务 | 精确,且可点击切换 | | 模型 / 推理强度 | 宿主 `agentDefaultModel.currentSelection()` | 精确 | | 消耗 | 官方余额接口,与首次观测余额的差值 | **官方金额**,实测 | | 余额 / 赠金 / 充值 | 官方余额接口 | 官方 | | CPU / 内存 | 宿主 `node:os` 的 `cpus()`、`totalmem()`、`freemem()` | 两次采样差值 | | 开机时长 | 宿主 `node:os` 的 `uptime()` | 精确 | | 系统负载 1/5/15 | 宿主 `node:os` 的 `loadavg()`(Windows 无此概念) | 精确 | | 网络 ↓↑ | 宿主 `/proc/net/dev`(**仅 Linux**,排除回环网口) | 两次采样差值 | CPU 与网络是差值量,所以插件刚加载的第一次采样显示 `—`,约 3 秒后才出数。 ### 平台支持 | 指标 | Linux | macOS | Windows | | --- | --- | --- | --- | | CPU 使用率 / 核数 | ✅ | ✅ | ✅ | | 内存 已用 / 总量 | ✅ | ✅ | ✅ | | 开机时长 | ✅ | ✅ | ✅ | | 系统负载 | ✅ | ✅ | ❌ `不可用:unsupported-on-win32` | | 网络 ↓↑ | ✅ | ❌ `不可用:platform-unsupported` | ❌ 同左 | | 主题 / 模型 / token / 上下文 / 余额 / 消耗 | ✅ | ✅ | ✅ | 除网络外,全部指标由 `node:os` 提供,三个平台共用同一条代码路径。网络是唯一必须分平台的部分: Node 核心没有跨平台的网口字节计数 API —— Linux 有 `/proc/net/dev`,macOS 要 `netstat -ib`, Windows 要 `Get-NetAdapterStatistics`,后两者都得起子进程,而 PowerShell 冷启动一次约 0.3–0.8 秒。 本插件选择不为每个采样点付这个代价,所以非 Linux 平台**明确报告不可用**,而不是显示一个假数字。 > Windows / macOS 的路径是按 Node 标准 API 的文档契约推定的,我**只在 Linux 上实测过**。 > 系统负载在 Windows 上按 Node 文档恒为 `[0, 0, 0]`,插件因此直接判为不支持,不显示这三个零。 ## 为什么「花费」是余额差值 DSH 自身不带任何价格表 —— `LlmModelInfo` 只有 `provider` / `id` / `name` / `description` / `modalities`。而 DeepSeek 只开放了一个与计费相关的端点,其余全部 404: | 端点 | 实测结果 | | --- | --- | | `/user/balance` | `200` | | `/user/usage`、`/v1/user/usage` | `404` | | `/user/billing`、`/billing/usage` | `404` | 也就是说**不存在官方口径的「单次对话费用」**。本插件因此只报**实测金额**:第一次读到余额时记下基准, 之后显示 `基准余额 − 当前余额`。面板里对此有明确说明,并提供一个「重置花费基准」按钮。 插件里**没有任何手填单价**。猜出来的价格比诚实的部分数字更糟 —— 这个数字不覆盖本栏加载之前的消耗, 但它不会骗人。 ## 底栏是怎么合并成一行的 composer 底栏容器是 `flex-direction: column; align-items: center`,所以**两个独立注册项永远只能分成两行**, 无论怎么调 `order` 都无效。合并的唯一办法是接管原来那一格: - 底栏行注册进 `conversation.composer.dock`,复用官方 `stats` 格的 `id`,并显式声明 `priority: -1`。 - `priority` 不是装饰,是必需的:`SlotCore.register` 在同 id **且** 同 priority 时直接抛冲突错; 而列表格位**按 priority 升序排序取第一个存活条目**为胜出者,所以 `-1` 既避开了冲突,又确定性地拿到这一格。 - 系统原有的两枚药丸(轮/步与耗时、token 与缓存命中)在同一个组件里用相同的投影重新实现,因此合并后信息不丢。 - 如果本插件这一格渲染崩溃,槽位错误边界会把它作废(abdicate),**系统原版药丸会自动回到该格** —— 不会白屏。 ## 详情面板 注册进 `shell.overlay`,也就是整个窗口之上、各列滚动容器之外的那层可穿透浮层。 面板本身 `position: absolute` 居中浮在输入框上方,配一层透明遮罩用于点击外部收起。 它不参与任何列的布局,因此不会像内联展开那样把对话区顶上去。 ## 宿主半边 普通 Node ESM 模块,不受动态沙箱限制:资源采样走 `node:os` 与 `node:fs`, 余额用内置 `fetch` 调接口,API Key 用 `ctx.credentials` 每次请求重新解析。 Key 不写日志、不进缓存、也绝不跨到浏览器。 | 路由 | 返回 | | --- | --- | | `GET /better-footer/sys` | `{ok, platform, uptimeSec, cpuPercent, cpuCores, mem, net, netReason, load, loadReason, model}` | | `GET /better-footer/balance` | `{ok, isAvailable, currency, totalBalance, grantedBalance, toppedUpBalance, at}` | 失败一律描述性返回、不抛异常,界面显示 `—` 加原因,而不是一个错误的数字: - 余额接口:`unconfigured`、`credential-error`、`network-error`、`http-<状态码>`、`bad-response` - 采样分区:`netReason` 为 `platform-unsupported`(非 Linux)或 `proc-unavailable`(Linux 上读不到 `/proc/net/dev`);`loadReason` 为 `unsupported-on-win32` - 整体失败才会出现 `ok: false` + `reason: 'sampler-error'` ## 安装 ```sh git clone https://gitee.com/brian_sys/dsh-better-footer.git dsh plugin --profile web add /绝对路径/dsh-better-footer ``` 然后重启 profile: ```sh # Ctrl-C 掉正在运行的 dsh web,再启动 dsh web ``` 客户端 bundle 在 profile 启动时编入 boot 图,所以**新增插件必须重启**才会加载。 ## 开发循环 profile 从自己的 `node_modules` 加载这个包,所以改完源码需要重新同步再重启: ```sh PLUGIN=~/.dsh/plugins/dsh-better-footer PROFILE=~/.dsh/profiles/web rsync -a --delete --exclude .git "$PLUGIN/" "$PROFILE/node_modules/dsh-better-footer/" # 然后重启 dsh web,并刷新浏览器 ``` profile 的其他文件都不用动 —— 插件行来自本包自带的 `cordis.patch.yml`, 只要包名出现在 `dsh.profile.bundles` 里,profile 就会合并这个 patch。 ## 卸载 ```sh dsh plugin --profile web remove dsh-better-footer ``` 移除该行后系统原版统计栏原样恢复 —— 原注册项从未被删除,只是在那一格被遮蔽。 ## 许可 MIT