# DSH 侧边栏余额徽章 余额徽章图标 一个常驻 [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness)(DSH)Web 界面 **左侧边栏**的账号余额插件,并带一个「充值」按钮:在软件内直接打开 DeepSeek 官方充值页。 [English](README.md) ## 功能 - **左侧常驻显示**:在侧边栏底部、Settings 上方(内置 Cordis 插件行之下)显示一整行余额, 首页、设置页、会话页都能看到,不必再进入「设置 → 账号」查看。 - **充值与赠送钱包**:按 Platform 的货币格式显示账号服务返回的每个钱包(CNY `¥`、USD `$`; 两位小数并带千分位;不足一分显示为 `<¥0.01`),有赠送余额时以小字追加 `赠送 ¥x.xx`。 - **在软件内充值**:金额旁的「充值」按钮会在桌面版里以原生 Platform 页面打开 DeepSeek 官方充值页 (顶部只有一条「返回 DeepSeek Harness」栏,不离开软件即可完成支付),返回后自动重新读取余额; 纯浏览器打开的 Web 界面则在新标签页打开同一充值页。未登录时按钮禁用并给出提示。 - **合理刷新**:打开时读取一次;页面可见时每 60 秒刷新;窗口重新聚焦、点击该行、从充值页返回 也会刷新;同时只会有一个读取请求在途。 - **中英双语、跟随主题**:文案跟随界面语言切换;颜色只使用宿主主题 token,明暗主题与收起的 36px 轨道都能正常显示。 - **凭据不进入浏览器**:余额通过 Host 账号服务经 Client Remote `account.getBalance` 读取; 充值页由桌面端自带的原生视图承载、复用桌面端自己的 Platform 登录态,页面不会接触账号原始 token。 ## 环境要求 - DSH `>=0.2.1-rc.2 <0.3.0-0`(已在 DSH 0.2.1-rc.2 验证)。 - 由 profile 管理的 DSH 安装(桌面版,或带 profile 启动的 `dsh web`),且 Web 应用随附的 sidebar、locale、账号控制器插件处于启用状态(标准 Web 应用默认满足)。 - 需要登录 DeepSeek 账号才能显示金额;未登录时会显示「未登录」状态而不是金额,充值按钮保持禁用。 - **软件内充值**需要桌面版:它通过 preload 暴露的 `dshPlatform` 桥把官方充值页放进应用窗口内的 原生视图。纯浏览器版本会在新标签页打开部署方的充值地址。 ## 安装 插件从 GitHub 分发—— [仓库](https://github.com/NebulaXIX/dsh-account-balance-badge) · [最新 Release](https://github.com/NebulaXIX/dsh-account-balance-badge/releases/latest)。 目前尚未发布到 npm,请用 Git 地址或 Release 中的 tarball 安装。 macOS 的分步安装说明见 [docs/INSTALL-macOS.md](docs/INSTALL-macOS.md)(中文)与 [docs/INSTALL-macOS.en.md](docs/INSTALL-macOS.en.md)(English)。 ### 在 DSH Web 界面安装(推荐) 1. 在 DSH 中点击左侧边栏的 **插件**。 2. 点击 **添加插件**(或点击箭头选择 **安装第三方插件**)。 3. 输入以下任一形式: - Git 地址:`github:NebulaXIX/dsh-account-balance-badge`(跟随 `main`),或 `github:NebulaXIX/dsh-account-balance-badge#v0.2.0`(锁定 Release 版本) - Release 中的 tarball:`dsh-account-balance-badge-0.2.0.tgz` 的绝对路径 - 本地 checkout 的绝对路径 4. 点击 **安装**。 5. 安装完成后选择 **立即启用**。启用了 HMR 的 profile 会立即生效,否则重启 DeepSeek Harness。 余额行会出现在左侧边栏底部。 桌面版应用自行管理 `desktop` profile,因此在桌面端只能通过插件界面安装。 ### 使用 `dsh` CLI 需要 `dsh` CLI 且 `pnpm` 在 `PATH` 中;先启动一次 DSH 让目标 profile 存在。`--profile` 为必填项, `desktop` 由桌面应用管理、不能用于 CLI: ```bash # Git,跟随 main dsh plugin --profile web add github:NebulaXIX/dsh-account-balance-badge # Git,锁定 v0.2.0 Release dsh plugin --profile web add "github:NebulaXIX/dsh-account-balance-badge#v0.2.0" # GitHub Release 中附带的 tarball dsh plugin --profile web add ./dsh-account-balance-badge-0.2.0.tgz # 本地目录(界面中要求绝对路径;CLI 的相对路径按执行目录解析) dsh plugin --profile web add ./path/to/dsh-account-balance-badge ``` 本包是纯 JavaScript、无依赖、无构建脚本,Git 安装不需要批准 pnpm 构建。 `dsh plugin ... add` 会把该 bundle 追加进 profile 的 bundles 列表,无需手动改 patch。 > **目前未发布到 npm。** 用包名安装(`dsh plugin ... add dsh-account-balance-badge`)要等 npm 发布 > 之后才可用;在此之前请使用上面的 Git 地址或 Release tarball。 ### 升级 / 卸载 第三方插件通过「卸载旧版 + 安装新版」升级——在 Web 界面中进入组合包页面(**卸载** 后重新安装), 或使用命令行: ```bash dsh plugin --profile web remove dsh-account-balance-badge dsh plugin --profile web add "github:NebulaXIX/dsh-account-balance-badge#v" ``` ## 使用说明 - 该行显示钱包图标、本地化标签与当前余额。 - 点击整行可立即刷新;窗口重新聚焦、页面可见时每 60 秒自动刷新。 - 点击金额旁的 **充值** 按钮即可充值:桌面版在应用窗口内打开官方充值页(顶部是「返回 DeepSeek Harness」栏),返回后立即重新读取余额;纯浏览器版本则在新标签页打开官方充值页。 - 加载中、未登录、读取失败(可点击重试)都有对应状态,失败时不会伪装成 0 余额。充值页加载失败 时返回栏仍然可用,并显示本地化的错误说明与「重试」;按 Esc 也可返回。 - 侧边栏展开时为 42px 整行,收起为 36px 图标(无障碍名称与悬停提示中含金额)。Windows 桌面版 在侧边栏收起时,宿主会隐藏整个侧边栏底部区域,此时该行与 Settings、Cordis 行一样不可见。 ## 实现方式 | 半边 | 文件 | 作用 | |---|---|---| | Host | `index.js` | 空的 bundle 半边:只承载 Loader 行,不新增 Host 能力、工具或提示词。 | | Client | `client.js` | 在 `sidebar.footer.action` 注册余额行、在 `shell.overlay` 注册唯一的充值页宿主;通过 `ctx.remote.account.getBalance` 读取余额;通过桌面端 preload 桥(`globalThis.dshPlatform`)承载官方充值页,并渲染整行、返回栏与组件内样式。 | | Loader patch | `cordis.patch.yml` | 插入以本包名命名的 `account-balance-badge` 行。 | | 展示元数据 | `locale/en.json`、`locale/zh.json`、`icon.svg` | 插件管理页的标题、描述与图标。 | 余额读取由 Host 的账号服务完成;浏览器只收到钱包金额(币种与十进制字符串)。充值页本身不由本插件 渲染:原生 `WebContentsView` 及其 Platform 凭据由桌面端持有,插件只提供 48px 返回栏,并把实测的 视口矩形通过 preload 桥的 `open` / `setBounds` / `close` 交给桌面端。 ## 开发 插件是纯 JavaScript,**无构建步骤、无依赖**: - `index.js` 是导出 `apply()` 的 ES module。 - `client.js` 是 `window.__ModuleLoader__.load({ id, factory })` 形式的惰性浏览器模块,由宿主 原样下发给页面,因此必须保持为合法纯 JavaScript(不要使用 JSX/TypeScript/`import`)。它的 factory 只从页面的冻结模块表里取 `react` 与 `react-dom`(没有 npm 依赖);`react-dom` 仅用于 把充值覆盖层 portal 出 `shell.overlay` 层,与随附的账号页面做法一致。 ```bash git clone https://github.com/NebulaXIX/dsh-account-balance-badge.git cd dsh-account-balance-badge npm test # 零依赖的清单/结构检查 ``` 在插件对话框中使用本地路径安装你的 checkout(或 `dsh plugin --profile web add /absolute/path/to/checkout`)。 bundle 以链接方式安装时,Web UI 会通过 HMR 加载 client 改动;如果 HMR 不可用,刷新一次页面即可。 ### 刷新间隔 后台刷新周期是 `client.js` 顶部的常量 `REFRESH_INTERVAL_MS`(默认 `60000` 毫秒)。在本地 checkout 中可自行调整;点击该行与窗口聚焦仍会立即刷新。 ## 发布本插件(维护者) 公开仓库:。Release 以 `vX.Y.Z` 打 tag, 并附带 `npm pack` 生成的 tarball,用户安装的就是它。 1. 提升 `package.json` 的 `version`,并在 `CHANGELOG.md` 中补一条记录。 2. 运行 `npm test`(`scripts/check.mjs`,零依赖)与 `npm pack --dry-run`;tarball 中必须包含 `index.js`、`client.js`、`cordis.patch.yml`、`icon.svg`、`locale/en.json`、`locale/zh.json` (README/LICENSE/CHANGELOG 由 npm 自动包含;`scripts/`、`docs/`、`.github/` 按设计不随包发布)。 3. 在 `dev/<任务>` 分支提交、再次运行 `npm test`,然后合并回 `main`。 4. 打 tag 并推送:`git tag v && git push origin main --tags`。 5. 打包并发布 Release(附上 tarball): `npm pack --pack-destination dist`,然后 `gh release create v dist/dsh-account-balance-badge-.tgz --title "v" --notes-file <说明>`。 6. 可选:发布到 npm 后「用包名安装」才可用,命令为 `npm publish --access public`——包名 `dsh-account-balance-badge` 目前在 registry 上仍空闲,但发布需要已登录的 npm 账号。 7. 如果将来改名,需要同时修改三处且保持一致:`package.json` 的 `name`、 `cordis.patch.yml` 行的 `name`、`client.js` 中 `window.__ModuleLoader__.load(...)` 的 `id`。 ## 许可证 [MIT](LICENSE)