dsh-dashboards
DSH 看板插件:在会话区注册「看板」tab(conversation.view),widget 网格展示:
- los 第一方:LLM 用量/成本(
/usage/summary)、provider 延迟趋势(/metrics/trends)、任务统计(/metricsPrometheus)、执行节点矩阵(/nodes,含 load/mem 快照与心跳) - macOS 原生探针(零安装):loadavg / 内存(vm_stat,含可回收缓存口径)/ CPU(iostat)/ 磁盘(df)/ 网络速率(netstat 差分)/ 进程数,内存滚动 120 点短趋势
- 服务探活:本机关键服务 HTTP/TCP(目标列表可经
/dashboards/probe-targets编辑) - Uptime Kuma(可选,默认关):配置
kuma.url+kuma.token即启用(REST v1/api/v1/monitors) - Glances(可选,默认关):
brew install glances && glances -w后配置glances.url - feed 采集摘要:读
~/.dsh/scheduler-reports/feed-digest-*.md(scheduler job「多平台 feed 采集摘要」落盘)最新 5 份,卡片内点击展开正文
架构
- host 半包(
index.mjs):ctx.webServer挂/dashboards/*同源聚合 API;每后端独立轮询缓存(single-flight);los 双 token 解析链(Bearer 用量 +x-los-operator-token节点,均不写明文,从环境/credentials/losEnvFile 读取);widget 配置存~/.dsh/storages/dsh-dashboards/widgets.json(PUT 校验 endpoint 白名单防注入)。 - client 半包(
src/client/):注册conversation.viewtab(id=dashboard,order=90,locale NSdashboardzh/en),按 widget 配置渲染 stat/matrix/chart/list 卡片;样式只用--dsw-alias-*白名单令牌。
API
GET /dashboards/status 后端健康 + widget 数(含 sanity 丢弃计数 / egress 关停项 / 各后端 stale)
GET /dashboards/los/usage GET /dashboards/los/trends GET /dashboards/los/metrics
GET /dashboards/los/nodes GET /dashboards/macos GET /dashboards/macos/history
GET /dashboards/probe GET /dashboards/glances GET /dashboards/kuma
GET /dashboards/feed/digests feed 采集摘要报告(scheduler-reports/feed-digest-*.md)
GET /dashboards/egress 出网清单(每项外呼的目标/用途/凭据 + 当前开关)
GET/PUT /dashboards/widgets widget 配置(PUT 带 {widgets:[…], revision?};revision 不匹配回 409)
GET/PUT /dashboards/probe-targets 服务探活目标(PUT 带 {targets:[…], revision?};空数组=重置回默认;revision 不匹配回 409)
诚实性契约(2026-09-19,借鉴 Infomarchy 第一批加固)
报告:dsfolder/INFOMARCHY-ANALYSIS-2026-09-19.md。六项约定,改动此处代码时必须保持:
- 截断必须显式上报:列表/文本被 cap 时随响应给出
available/totalChars与truncated(feed 摘要、surge 事件、history 点数都遵守);不允许静默 slice 后把截断值当总数。 - 差分基线的样本时刻必须与字节数对应(
lib/safety.mjs:publishNetSample):不允许把Date.now()当采样时刻写进基线;dt 过小不出速率,过期发布直接拒绝。 - store 写入一律原子 + revision 守卫(
writeJsonAtomic/saveEnvelopeReplace): tmp→rename(0600),PUT 带revision时做乐观并发(不匹配 409 + 回当前值); 新增任何"读-改-整表写"的 store 都必须走这两个原语。 - 时间戳过合理性边界(
plausibleTimestamp:≥2000-01-01 且 ≤now+60s):脏时间不得进入 窗口切片、聚合桶或排序;丢弃计数走/dashboards/status的sanity。 - 失败不得伪装新鲜:poller 快照
ts/dataTs只在成功时推进,失败只推进attemptedAt并置stale=true;形状变更时递增SNAPSHOT_VERSION使旧缓存失效。 - 出网清单化 + 逐项开关:每一项外呼在
lib/safety.mjs:EGRESS_FEATURES登记,并由Config.egress.<id>=false单独关闭;拦断面放在最靠近 socket 的函数里(调用点判断只是省事)。
# 逐项关闭外呼(缺省全开;关闭只停外呼,不影响读本机文件的采集)
- id: dashboards
config:
egress:
quotaApis: false # zenmux/packy/deepseek/openrouter 余额 API
diskAlert: false # 飞书 webhook 推送
AI 额度渠道(/dashboards/ai-quota,widget type=quota)
统一输出 channels[](保留 legacy zenmux/packy 字段供对账卡消费)。数据源分三类:
- 余额 API(官方直连,需
~/.dsh/.credentials.yaml对应 key)- ZenMux(
ZENMUX_MANAGEMENT_API_KEY):PAYG 余额 + 订阅 5h/7d/月 窗口 - Packy(
PACKY_SYSTEM_TOKEN+PACKY_USER_ID):quota÷500000=USD;Cloudflare 防护,被拦自动节流 - DeepSeek(
DEEPSEEK_API_KEY):GET api.deepseek.com/user/balance - OpenRouter(
OPENROUTER_API_KEY):GET /api/v1/auth/key(免费档无预存余额只显示用量)
- ZenMux(
- 订阅窗口(quota-axi 本地采集内核,schema v5):codex/cursor/claude/kimi/grok/copilot
- 安装:
cd dsh-dashboards && npm install --no-save quota-axi@0.1.29(运行时 spawn 本插件 node_modules 内二进制) - 依赖官方 CLI/App 本机登录态(
~/.codex/auth.json、~/.grok/auth.json、~/.kimi-code/credentials/kimi-code.json、Keychain 等);未登录渠道显示auth+ 恢复命令 - 子集:
Config.aiQuota.quotaAxiProviders(cordis.patch.yml)或默认全六家
- 安装:
- 站内/控制台型(kimi 会员、NVIDIA build 等)无公开 API,不做自动采集
刷新节奏:Config.aiQuota.pollMs(默认 5min;活动门控 + single-flight,看板未开零采集)。终端汇总:~/.dsh/scripts/quota-all.mjs(--json 机器可读)。
Grok 本地登录态自动续期:
Config.aiQuota.autoRefreshGrok(默认开)——采集前发现~/.grok/auth.json的 key 距过期 <1h 时,用同文件refresh_token走auth.x.ai/oauth2/token换新并原子写回(Grok CLI 同款 OIDC 流程,token 不落日志);无需重新登录。Kimi 的 token 由其官方 CLI 自行续期(若长闲置过期,跑一次kimi login即可)。
探针目标解析链:UI 编辑 store(~/.dsh/storages/dsh-dashboards/probe-targets.json,PUT 落盘)→ Config.probe.targets(cordis.patch.yml)→ DEFAULT_TARGETS(index.mjs)。看板 tab 右上角「编辑」可增删探针目标与移除 widget,保存即时生效(client bundle 需刷新页面加载)。
安装
# profile 依赖 + bundles + cordis.patch.yml(参考 dsh-health-panel 接线)
pnpm dsh --profile web --dump-config # 验证 dashboards 行合并
# 重启 dsh web(manifest touch 触发 daemon AUTO-RELOAD)
开发
node --check index.mjs
DSH_SOURCE=/path/to/deepseek-harness node scripts/build.mjs # client bundle(jsx automatic)
验证
- 插件树:
include:dashboardsfiberPhase=active curl http://127.0.0.1:3080/dashboards/status- 会话区切到「看板」tab 查看 widget 网格
No comments yet. Be the first to write one.