sandbase-harness
sandbaseai
Local-first, self-hosted AI agent runtime and MCP bridge with sandboxed sessions, memory, credentials, audit/replay, and a local Console.
PROJECT TOPICS
INSTALL REFERENCE
dsh plugin --profile web add github:brittanistrehlowll-oss/dsh-quota-panel
该命令指向仓库当前默认分支;尚无绑定当前 commit 的完整验证结果。
PROJECT README

DeepSeek Harness(DSH)的提供方额度 / 余额角标。 页面左下角一行胶囊,扫一眼就知道还有多少钱、还剩多少额度;点开是一张完整卡片,再点一下收回一行。
零依赖宿主端插件:为每个配置的提供方注册一条服务端代理路由 /api/quota/<id> —— API Key 通过凭据系统在宿主侧解析,绝不进入浏览器 —— 然后在页面注入这个原生组件。Web(dsh web)和官方 Electron 桌面版共用同一份实现,不依赖任何其他插件。
收起态:每个账户一对「状态点 + 数值」(如 ● ¥58 · ● 86% · ● 23%),没有文字标签;只有出问题的那个账户自己的点会变色。金额取整数用于速览,精确值见展开与悬停。
| 浅色 | 深色 |
|---|---|
![]() |
![]() |
展开态:纵向排列各账户的余额与用量,五小时 / 周 / 月各自带进度条和重置时间;CommandCode 另显示本期费用与剩余额度。右上角是刷新按钮与独立的锁按钮。
| 浅色 | 深色 |
|---|---|
![]() |
![]() |
页面中的默认位置(左下角,自动在侧栏「设置」行上方留出净空,不进入正文、不遮挡宿主控件):
| 浅色 | 深色 |
|---|---|
![]() |
![]() |
可交互离线示例:浅色 / 深色(npm run demo 生成的单文件页面,用浏览器直接打开即可;数据为离线模拟,不连接真实账户)。仓库里的示例图由 npm run showcase 从这条真实注入脚本里重新截取,docs/verification/ 是回归测试产物。
--dsh-quota-width)、高度随内容自适应(当前三账户约 382px),圆角两端、无阴影,从底边向上展开。0%:「没读到数字」不能显示成「额度还很足」。--dsw-alias-*、--dsw-static-*、--dsw-font-*)驱动,token 缺失时有合理 fallback,不携带自己的配色。connection 的精确 Fetch 路由表上,Web 服务器与桌面 host 派发进同一张表。/api/quota/<id>,凭据始终留在宿主侧。createElement/textContent 构建。| 情况 | 状态点 | 数值 | 悬停提示 |
|---|---|---|---|
| 正常 | 实心 绿/琥珀/红 | 按接口返回 | 读数明细 |
| 刷新失败,但有历史读数 | 空心圈 | 保留上一次数值,灰字 | 数据更新于 15:32 + 失败原因 |
| 本次打开后从未取到 | 中性灰 | — |
失败原因 |
所以一次瞬时网络抖动不会再把你健康的 ¥58.36 涂成红色的 —。默认每 5 秒自动刷新一次,页面隐藏时暂停;展开态的手动刷新不会改变展开状态,重复请求会合并。
dsh web)dsh plugin --profile web add "github:brittanistrehlowll-oss/dsh-quota-panel"
# 重启 `dsh web`(bundle 层在启动时生效)
包声明了 dsh.bundle.patch,因此 dsh plugin add 会把它自动激活为 profile 层。
DeepSeek Harness.exe)桌面版不能用上面的包方式装:dsh-desktop-host 自带的 config/desktop.cordis.patch.yml 把 web-startup / webserver / web-runtime 三行全部禁用(前端走 dsh-app:// + IPC 管道,不监听端口),所以插件如果 inject: [webServer] 就会永远停在「等待服务」状态、根本不加载。
插件 v0.8.0 起宿主端是载体中立的,桌面版按「profile 内相对路径行」安装:
# 1) 把源码接到桌面 profile 里(junction 直连仓库,改码后重启即生效)
New-Item -ItemType Junction `
-Path "$env:USERPROFILE\.dsh\profiles\desktop\plugins\quota-panel" `
-Target "D:\deepseek\dsh-quota-panel"
# 2) 在 $DSH_HOME\profiles\desktop\cordis.patch.yml 写入插入行
# (name 用相对 profile 的路径,inject 只留 credentials)
# - insert:
# - id: quota-panel
# name: './plugins/quota-panel/lib/index.js'
# inject: [credentials]
# config: { refreshMs: 60000, providers: [ … ] }
然后完全退出并重开桌面应用(不是重载窗口):桌面 host 在启动时一次性读取 profile 层,没有 CLI 的 live patch 监视器。npm run verify:desktop <profileDir> 会在不启动 Electron 的前提下,用真正的 runDesktopHost 起同一套组合并断言注入与三条路由的真实读数(最近一次在 DSH 0.1.5-rc.2 上通过,见 docs/verification/desktop-carrier-20260914.log)。
桌面版为什么能工作:/api/* 由 connection 的精确 Fetch 路由表承载 —— Web 端由 connection 自己挂到 HTTP 服务器的 /api 前缀,桌面端由 host 把管道里的 /api/* 直接派发给同一张表;页面脚本则通过 webserver/index-inject 结构化注入行进入 index.html(两端都会 emit 同一事件)。所以一份注册同时服务两个载体,凭据依旧只在宿主侧解析。
每个提供方是 providers 下的一项,内置三种渲染器:
| format | 接口返回形态 | 行显示 |
|---|---|---|
deepseek-balance |
{ "balance_infos": [{ "currency", "total_balance" }] } |
余额 ¥58.36 |
opencode-usage |
{ "usage": { "rolling"\|"weekly"\|"monthly": { "percent", "resetsAt" } } } |
最高窗口用量 86% |
command-cost |
endpoint 为 API 根;宿主合并三个接口读数 |
本期费用 $16.24 |
在 profile 的 cordis.patch.yml 中覆盖默认配置:
- id: quota-panel
config:
refreshMs: 30000
providers:
- id: deepseek
label: DeepSeek
credential: DEEPSEEK_API_KEY
endpoint: https://api.deepseek.com/user/balance
format: deepseek-balance
balanceTiers: { critical: 10, warn: 20, healthy: 50 }
- id: opencode-go
label: OpenCode Go
credential: OPENCODE_GO_API_KEY
endpoint: https://opencode.ai/zen/go/v1/usage
format: opencode-usage
windowLabels: { rolling: 五, weekly: 周, monthly: 月 }
warnPercent: 70
errorPercent: 90
- id: command
label: Command Code
credential: COMMAND_API_KEY
endpoint: https://api.commandcode.ai
format: command-cost
windowLabels: { fiveHour: 五, weekly: 周 }
warnPercent: 70
errorPercent: 90
currency: USD
字段说明:
| 字段 | 含义 | 默认值 |
|---|---|---|
id |
路由 id(/api/quota/<id>),^[a-z0-9-]+$ |
必填 |
label |
卡片上的提供方名称 | 必填 |
credential |
凭据引用($DSH_HOME/.credentials.yaml 或环境变量) |
必填 |
endpoint |
额度 JSON 接口(command-cost 填 API 根),GET + Authorization: Bearer <key> |
必填 |
format |
行渲染器 | deepseek-balance |
balanceTiers |
(deepseek-balance){critical, warn, healthy} 分级阈值 |
{10, 20, 50} |
lowBalance |
旧版别名,等价于 balanceTiers.warn |
— |
windowLabels |
(opencode-usage){rolling, weekly, monthly};(command-cost){fiveHour, weekly} |
按界面语言 |
warnPercent / errorPercent |
(opencode-usage、command-cost)阈值 | 70 / 90 |
currency |
(command-cost)金额货币,三位 ISO 码 | USD |
refreshMs |
自动刷新间隔,5000 <= refreshMs <= 86400000 |
5000 |
配置校验是严格的:写了但不是合法数字(NaN、Infinity、字符串)会直接报错,而不是悄悄退回默认值;warnPercent < errorPercent 且都落在 0..100;balanceTiers 必须有序;endpoint 必须是 https —— 代理会把你的 API Key 作为 Bearer 头带上去,因此明文 http 只对本机回环地址开放(localhost / 127.0.0.1 / ::1)。
默认 balanceTiers {critical: 10, warn: 20, healthy: 50}:
| 余额 | 状态 | 次级信息 |
|---|---|---|
<= 10 |
error(红点;展开名称告警) | 建议充值 |
10 < x <= 20 |
warn(琥珀色) | 余额紧张 |
20 < x <= 50 |
ok | 余额正常 |
> 50 |
ok | 余额充足 |
high = max(滚动, 每周, 每月):
| 用量 | 状态 |
|---|---|
< warnPercent |
ok(绿点) |
>= warnPercent |
warn(琥珀点) |
>= errorPercent |
error(红点) |
某个窗口的 percent 缺失或不是有限数值时,整行判定为数据异常,绝不折叠成 0%。
high = max(本周期消费占比, 五小时窗口, 周窗口):
| 读数 | 状态 |
|---|---|
< warnPercent |
ok(绿) |
>= warnPercent |
warn(琥珀) |
>= errorPercent |
error(红) |
月比例使用官方 /alpha/usage/summary 的 totalMonthlyCredits 与 /alpha/billing/credits 的 credits.monthlyCredits,在 periodBasis=billing-period 时按 月度已消耗 / (月度已消耗 + 月度剩余) 计算。充值和赠送额度不混入月比例;字段缺失显示 —。五小时、周比例来自 windowLimits.used/cap。本周期额度接口并不直接返回,由 消费 + 剩余额度 反推 —— GOAT 套餐实测为 $16.24 + $53.77 = $70.01。月重置日期接口未返回时不编造。
收起和展开都可拖动,默认解锁:
[data-slot="settings.trigger"],该元素在部分宿主构建上量得 0×0,此时改为按可见的「设置」/Settings 标签向上回溯到第一个有实际盒子的祖先再计算。字体与胶囊真实高度在首帧之后才落定,因此默认位置会在随后两帧各重锚一次;已保存过位置的胶囊永不被移动。localStorage,键 dsh.quota.pos),下次打开自动恢复;窗口尺寸变化时会重新钳位回可视区。dsh.quota.locked 持久化。mountCompact 挂载完整组件,保持所有样式;已有手动位置优先。无手动位置时可嵌入宿主,解锁拖动会把整个组件带出宿主。ctx.credentials 解析,只用于服务端到提供方的请求;浏览器只访问 /api/quota/<id>。{ ok: true, data } 或 { ok: false, error: { code, status, message } },code 取 credentials / upstream / timeout / network / invalid-body。上游返回 HTML 错误页会在宿主侧被转成 invalid-body,页面脚本永远不会去解析非 JSON 正文。endpoint 必须是 https(回环地址例外),因为代理会以 Bearer 形式附上 Key。createElement/textContent 构建 DOM,API 返回值绝不经过 innerHTML;刷新失败只体现在 title 悬停提示与空心状态点上,不进卡片正文。#dsh-quota-panel 的 data-version 曾把 '0.7.0' 写死,0.8.0 发布时漏改,于是页面自称 0.7.0、而 package.json 说 0.8.0;现改为从 package.json 读取,任何按此标记判特性的宿主/验收脚本/客服截图都不会再被骗。(2)初始位置回到设计位置:作者的"在设置行上方留净空"规则,其选择器在 DSH 0.1.7-rc.1 上指向零尺寸包装元素(实测 0×0),footerRect.width > 0 永不成立、规则从未生效,胶囊只能退到 innerHeight - 92 兜底角落;现改为从可见的「设置」标签向上找到第一个有实际盒子的祖先,用面板常量而非尚未布局的 capsuleEl.offsetHeight 计算净空,并在首帧后补两次重锚。实测(1483×707):y 615 → 619,与设置行净空 22px(偶然)→ 18px(按设计),前后均不遮挡宿主控件。(3)解耦清理:删除 [aria-label="鲸息入口"] 探针、重写模块头与集成缝隙的中性表述、去掉 package.json description 里的外部产品名、openDetail 里恒真的 if (setExpanded) 守卫改为直接调用。随包发布的内容(lib/index.js 等,即 files 白名单)扫描 鲸息|Whale|watchdog|dsh-lifecycle|restart-button|dsh-controller 零命中,该断言已固化进 verification/verify-packed-tarball.mjs;README 与 docs/verification/ 的历史验收记录不在扫描范围内(前者需要引用被修掉的缺陷名,后者是当时的回归快照,均保持原样)。刻意保留 DSH_PLUGIN_INTEGRATION_V1 缝隙本身 —— 它是宿主页面嵌入紧凑胶囊的唯一稳定接口,运行时不存在时完全静默。connection 的精确 Fetch 路由表(Web 服务器与桌面 host 共用同一张 /api 表),页面脚本改为 webserver/index-inject 结构化注入行,不再依赖 webServer;只有 connection 缺失的老宿主才回退 webServer.register + tapIndex。插件现在能在官方 Electron 桌面版(无 HTTP 服务、dsh-app:// + IPC)里工作。新增 npm run verify:desktop。command-cost)行:本周期消费、请求/Token 计数、剩余额度,以及五小时 + 周窗口。收起与展开统一横向尺寸、统一 16px 圆角(左右边界不再跳)。刷新失败改为保留最后一次有效读数(stale、空心点、灰字),不再误报红色。服务端统一 { ok, data | error } 响应包被;金额按接口返回的货币用 Intl.NumberFormat 渲染;Esc 收起;补 aria-controls 与 focus 环;配置校验补强;脚本共用 Chromium 探测;加 CI。修复 i18n 占位符从未被替换的 bug(界面曾显示 当前最高占用 {h}%)。npm test # 数据模型、配置、脚本语法和安全回归
npm run demo # 重新生成 docs/demo.html + docs/demo-dark.html
npm run verify # 无头浏览器:DOM/几何尺寸/stale 断言
npm run verify:dark # 深色主题同上
npm run verify:drag # 合成真实拖动,校验持久化/钳位/复位
npm run verify:route # 离线路由契约,不读取真实凭据
npm run verify:desktop -- <profileDir> # 桌面 host 组合探针(真 runDesktopHost,无 Electron)
npm run verify:package # 打包后**从 tarball 里**加载插件再校验
npm run screenshot # 两态验收及 docs/verification/*.png 截图
npm run showcase # 重新生成 assets/ 与 docs/images/ 里的项目页配图
npm run pack # 产出 dist/dsh-quota-panel-<version>.tgz
npm run check # test + demo + verify
verify:package 是发布门禁:先打包、解包,再从解包出来的副本里 import 插件,断言 files 白名单带齐了运行时真正要读的文件 —— 尤其是 lib/plugin-integration-v1.js(插件在 import 时从磁盘读它),只跑工作区副本的测试永远发现不了它漏发。
verify:route 默认仅离线 stub,绝不读取真实凭据;仅显式传入 --live 才尝试读取 Key 并调用线上接口。当前浏览器验收同时检查浅深色、鼠标拖动/锁定/解锁、刷新恢复、键盘、宿主挂载及文字不重叠,结果存于 docs/verification/。
showcase 是配图生成器而非门禁:它从 docs/demo.html 里真实注入的脚本上截图,所以 README 的图不会和实现脱节;hero 图用本机字体渲染,因此只在有桌面字体栈的机器上跑。
浏览器脚本会自动探测 Chrome / Chromium / Edge;可用 CHROME_PATH 或 CHROME_BIN 覆盖。
MIT
CLASSIFICATION EVIDENCE
系统优先读取 GitHub Topics,再与站内分类词典和词根规则比对。当前命中: cost、quota。