packages/dsh-task-board
zhu1090093659/dsh-web侧边栏多列任务看板:卡片交给真实 DSH 智能体会话执行,支持 cron 定时(Host 侧到点执行,关浏览器也生效)。
右下角常驻的小鲸鱼挂件:余额、今日已用与每轮对话消耗(含峰谷价),余额预警与今日预算的泡泡内容都可编辑;泡泡点击序列模块化自定义,支持并列加权 A/B、随机台词与随机图片;内置 30+ 厂商模板(OpenAI / OpenRouter / Kimi / 硅基流动 / 方舟 / 智谱 / MiniMax 等),按模型查余额与订阅额度;另有任务结束音效、导入音频、自定义角色与资源管理。数据全在本机,无遥测。
DeepSeek Harness(DSH)Web 界面右下角的常驻挂件:小鲸鱼气泡图 + DeepSeek API 余额 + 今日已用 + 每轮对话消耗,并且泡泡内容可以完全自定义(点击序列、模块化排版、并列加权出泡、随机语句/随机图片)。标准 DSH bundle 插件,dsh plugin 一键安装,无需任何会话令牌。
⚠️ Codex 版小鲸鱼已迁至独立仓库 → (已安装用户无需重装;详见下方「两条分支怎么选」)
本仓库现在只维护一条产品线(main,同一个包同时支持 DSH Web 与官方桌面客户端)。按你要挂在哪里选:
你要挂在哪 · 用哪条分支 · 安装方式 DSH Web 界面右下角(就是这个 README 描述的插件) · main(默认分支) · dsh plugin --profile web add dsh-whale-widget(推荐,装 npm 已发布版);也可以从本仓库装 dsh plugin --profile web add github:MeteorNOX/DeepSeek-Balance-Whale-Widget,但那样装的是 main 当前状态、不跟随已发布版本 官方桌面客户端(Electron)右下角 · main(同一个包) · ⚠️ 不能用 --profile web(桌面端读的是 desktop profile,CLI 也拒绝 --profile desktop)—— 在桌面端会话里让 DSH 自己装,见下方「官方桌面端(Electron 客户端)请先看这一节」 Codex 桌面应用(跟随 Codex 窗口、无独立网页) · ⚠️ 已迁出本仓库 · 新仓库 · 最新版下载 · 已安装用户无需重装Codex 版迁移公告:本次迁移保留了开发历史、历代版本与作者贡献,并清理了旧图片中的非必要元数据(贡献者致谢见文末「致谢」)。后续更新、问题反馈与版本发布都在新仓库;反馈问题时请注明版本、系统和复现步骤,勿上传密钥、完整配置或未脱敏日志。
⚠️ 两条线互不兼容:Codex 版不能用 dsh plugin … add 装进 DSH 网页,本仓库的插件也不能在 Codex 桌面里运行。
⚠️ 安装方式二选一、别混用(npm 名 / github:)—— 它们是同一个包名,先后安装会并存冲突;已经是 github: 装的,要换 npm 名请先 dsh plugin --profile web remove dsh-whale-widget。
DEEPSEEK_API_KEY;② DSH 账号登录态 —— 通过「设置 → 账号与余额」登录了 DeepSeek 账号、又没配 API key 时自动使用(不需要去 platform 建 key).dshw-usage-archive.json);金额按 8 位小数记账、显示保留两位{cost} 引用),入口:菜单 → 「音效与提示」→ 「全局设置」→ 展开「每轮消耗提示」→「编辑提示内容」deepseek-flash → DeepSeek-V4.1-Flash,旧名标注"同 V4.1 Flash")默认音效组 · 100%、自动关 180s · 叮~),点一行才展开该区的设置项(可同时展开多个)。每个音效都有独立音量,每行带「试听」;音效行左侧的 [✓] 决定该音效响不响(不响 = 仍可冒泡)。底栏 取消 / 恢复默认 / 保存 —— 面板内的改动只落内存,点「保存」才生效,点「取消」完整还原(「恢复默认」之后点取消同样能撤销)...,0 = 不截断){balance_ds},老配置里的模块照旧显示,无需重配);赠金({bonus_ds})与充值余额({recharge_ds})是单独拆出来的两个模块,取不到数时显示 —(真的为 0 才显示 0.00)v0.3.19-beta){cost});开关、自动关闭秒数、提示音量、任务结束音效与内容编辑入口都在「音效与提示 → 全局设置」面板的「每轮消耗提示」区(主菜单不再单列这一行){session} 会替换成当前对话名(读不到就显示「当前对话」,超长自动截断为 12 字符 + ...)。同一个未回答的提问只响一次(刷新页面也不会重复响)assets/minecraft-exp-orb.wav)与 A(assets/task-end-a.wav),也可选任意片段或音效组[✓] 决定「响不响」(不响 = 仍会冒泡提示)跟随按压音量 N%);一旦你拖过那个滑块,就按你设的值播(摘要只显示百分比)。这样既能"一个总音量管全局",也能单独压低某类提示音。角色 1 · 泡泡图 2、音效组 3 · 片段 4),点一行才展开明细;「导入片段」在音频那一区里;收起/展开时会顺带停掉正在试听的那一段petpet、money1 两张图,也可上传 png/gif,供图片/随机图片模块使用除内置的 DeepSeek 余额外,可在「小鲸鱼记账 → 模型」里添加任意厂商;每个模型独立配置余额预警 / 今日预算 / 额度:
probeUrl 探活验证 key,余额显示「—」,今日已用按会话事件估算):硅基流动(CN / EN)、火山方舟 Ark、OpenAI、Anthropic Claude、Google Gemini、xAI Grok、Groq、Mistral AI、Together AI、Fireworks AI、DeepInfra、Cerebras、阿里云百炼(通义千问)、百度千帆(文心)、腾讯混元、讯飞星火、魔搭 ModelScope、本地模型(Ollama / LM Studio)OPENROUTER_API_KEY);删除模型会连带清理该模型的额度模块与设置a.b[0].c 与 scale 乘数);点「测试连通性」可先验证 keyinput + cacheRead + output,推理 token 已含在 output 内,跨天保留),也可切换手动填写;支持「不重置 / 每日 / 每月」quota.json.windows 描述各窗口的字段路径{balance}、{today}、{quota}、{quota_used}、{quota_left}、{quota_total}、{quota_reset}说明:并非所有厂商都提供「用 API key 查余额」的接口。硅基流动的余额接口已被官方下线(2026-08-11 更新公告:/user/info 自 2026-08-14 起停止服务,「后续将适时提供替代 API」,截至发版仍未见替代接口),火山方舟的余额 / 用量与阿里云百炼 / 百度千帆 / 腾讯混元一样属于各家云平台 AK/SK 签名的 OpenAPI,OpenAI / Anthropic / Gemini / xAI / Groq / Mistral / Together / Fireworks / DeepInfra / Cerebras 则根本没有公开的余额查询接口 —— 这些模板统一是「无余额接口 + 探活验证 key」,今日已用按会话事件估算。厂商的订阅额度接口(智谱 / Kimi Coding / MiniMax Coding / OpenCode Go)只对订阅套餐账号有效:Token 资源包账号调用智谱接口会返回「当前用户不存在coding plan」,这种情况请用上面的「额度(订阅 / 资源包)」自动统计。模板只提供默认值:选完模板后可以随意改写接口地址与字段路径;留空的字段会继续沿用模板默认值(不会因为留空而失效)。
ℹ️ 先分清楚:这一节说的是本插件读取本机 Codex 会话日志的能力(属于 main,就是把 Codex 当数据源),与「Codex 版小鲸鱼」挂件(跟随 Codex 窗口的那个端口)是两回事 —— 后者已迁出本仓库,见「两条分支怎么选」里的「Codex 版迁移公告」。
⚠️ 限制:Codex 支持目前只是部分接口适配,本挂件不能安装到 Codex 里(它是 DSH Web 插件,Codex 仅作为数据来源被读取);订阅窗口没有真实订阅样本可验证,遇异常欢迎反馈。
挂件可以直接读本机 Codex 的会话日志统计 token 用量 —— 因此不限于 DSH 内部,你在 Codex CLI / 桌面版里跑的消耗也能看到。
$CODEX_HOME/sessions/YYYY/MM/DD/rollout-*.jsonl(含 archived_sessions/),明文 JSONL;只读本机文件、不联网、不需要密钥,也不会写入 ~/.codextotal_token_usage)的差值累加,天然避免同一轮多条记录被重复计数;模型归属由 turn_context.payload.model 判定;按天 + 模型聚合,带增量缓存($DSH_HOME/.dshw-codex.json,只存聚合与文件偏移)Codex 今日 x · 近7天 y tokens;模型子菜单显示今日 / 本月 / 累计 / 近7天与会话文件数;「测试」按钮直接返回本地统计rate_limits 带窗口快照,有 ChatGPT 订阅时子菜单自动追加 5h 已用 x% · 2小时30分后重置 | 周 已用 y% · 3天后重置(字段名已做容错;API-key 计费或无订阅时该行不显示)dsh-whale-widget/
├── package.json # DSH bundle 插件元数据(dsh.bundle.patch 指向 cordis.patch.yml;顶层 icon 指向 icon.png)
├── icon.png # 插件列表图标(256×256 PNG,含透明;宿主读成 data URL 塞进 meta.icon,必须是正方形)
├── README.md # 本文件
├── cordis.patch.yml # 插件挂载声明
├── lib/
│ ├── index.js # 宿主侧插件本体(路由 + 记账 + 音效/图片/角色服务)
│ └── accounting.mjs # 记账内核(定点金额运算 + 余额观测/校正账本)
├── assets/
│ ├── whale-widget.js # 前端挂件本体(由宿主按 mtime 热读取)
│ ├── DSH2.png # README 顶部展示图
│ ├── DSniang1.png # 小鲸鱼本体(cut-out,气泡由代码绘制)
│ ├── DSniang02.png # 备用整图(兼容旧版手动安装路径)
│ ├── rua.gif # 随机台词/撒娇动图(可选)
│ ├── Ya1.mp3 / Ya2.mp3 # 预置音效「小黄鸭」按压 / 松开
│ ├── D1.mp3 / D2.mp3 # 预置音效「音效1」按压 / 松开
│ ├── minecraft-exp-orb.wav # 任务结束音内置默认音效(Minecraft·经验球)
│ ├── task-end-a.wav # 任务结束音内置预设(A)
│ ├── bubble-petpet.gif # 内置泡泡图:petpet
│ └── bubble-money1.gif # 内置泡泡图:money1(余额预警默认内容的配图)
└── whale-widget-prompt.md # 完整规格/维护提示词(面向二次开发)运行时数据(都放在 $DSH_HOME,默认 ~/.dsh;用环境变量 DSH_HOME 可以改到别处):
文件 / 目录 · 用途 .dshw-size.json · 挂件外观与开关(缩放、音量、音效组、峰值样式、吸附相关等) .dshw-usage.json · 记账账本 + 按日余额观测/校正摘要 + 用量设置(任务结束音、余额预警、今日预算、每轮消耗提示内容,以及 `events`:按压 / 每轮消耗 / 提问 / 授权四个事件的音效选择、独立音量、冒泡配置;每轮消耗的自动关闭秒数存在 `.dshw-size.json` 的 `turnCostCloseMs`) .dshw-usage.json.before-recharge-fix.bak · 旧格式账本备份(0.3.1 首次写入旧账本前自动创建;已存在则不覆盖) .dshw-turn.json · 每轮消耗的 seq(避免热重载后前端把新轮次当旧轮次) .dshw-bubble.json · 自定义泡泡配置(点击序列 + 模块库 + 点按角色推进队列开关) .dshw-api.json · 自定义 API 模型注册表(厂商 / 凭据名 / 接口字段 / 自定义单价 / 额度与用量累计;不含密钥) .dshw-usage-archive.json · 账本归档(超过保留期的逐轮明细与逐日汇总;明细 90 天/2 万条、逐日 365 天) .dshw-codex.json · Codex 本地会话统计缓存(按天/模型聚合 + 文件偏移;不含任何凭据) whale-roles/ · 自定义角色图 + roles.json 索引 whale-audio/ · 音频片段 .wav + audio.json 索引(音效组/片段) whale-bubble-imgs/ · 泡泡图库图片 + bubble-imgs.json 索引
桌面端读的不是 `web` profile。 官方桌面客户端用的是 `desktop` profile(%USERPROFILE%.dsh\profiles\desktop),而 dsh plugin 命令行按设计拒绝碰它:
error: profile "desktop" is managed exclusively by the Electron application所以下面「方式 A~D」里的 --profile web 命令对桌面端不适用 —— 按它装完,插件落在 web profile 里,而桌面窗口读的是 desktop profile,一个字也读不到。表现就是「右下角什么都没有(连 ☰ 也没有)、控制台也不报错」。
桌面端的正确装法:明确使用当前宿主内置的 `plugin_manager`。
在桌面客户端的会话里可直接说:
请使用当前桌面端内置的plugin_manager安装dsh-whale-widget。先核对当前 profile 和是否已有同名插件;已有安装时先报告来源与版本。按该工具支持的操作完成后,告诉我安装结果及是否需要重启。
plugin_manager 的作用域是当前 profile(桌面端为 desktop),由宿主使用其自带的包管理器完成安装与挂载登记。需要固定版本时,将安装规格改成 dsh-whale-widget@。这条说明用于减少安装前后的无关探索(#194);不需要自行构造认证 cookie、调用底层 RPC 或改写宿主管理的 profile 文件。工具不可用或操作不受支持时,先说明缺少哪项宿主能力,不绕过桌面端限制改用 --profile web。
首次安装与升级的生效方式(#162):
"application":"applied",但这不保证当前窗口已显示挂件。若装完没有出现,完全退出客户端(含系统托盘)后重新打开,再按下方两条自检排查。"restart-required" 时完全退出并重开,随后重新核对实际版本。0.1.7-rc.2,页面没有升级入口,重新“添加”带版本的同名包也可能只返回“已安装”。先检查该宿主内置工具是否支持同来源更新;若工具也不支持,保留当前安装,按宿主支持的升级方案处理。只有明确需要卸载再安装或迁移来源时,才先保留原来源、精确版本和用户数据的恢复办法;不要把卸载、删除依赖目录/锁文件当作通用更新步骤。命令行侧的 dsh web 使用自己的 web profile:更新后重启宿主,再在浏览器按 Ctrl+F5。
装完怎么自检(两条分别对应宿主半区与客户端半区):
%USERPROFILE%.dsh.dshw-turn.json 存在,且 seq 随对话递增;%APPDATA%\@deepseek-ai\dsh-desktop\Local Storage\leveldb 里出现 dshw-pos / dshw-last-seq —— 这两个键只有挂件前端会写。桌面端界面里看不到插件版本号时,可以看 %USERPROFILE%.dsh\profiles\desktop\package.json 的 dsh.profile.bundles 和同目录的 pnpm-lock.yaml。
下面方式 A~D 都是 Web(`dsh web`) 的安装方式。
适用于别人直接发给你一个 zip,或你手上已有一份解压好的插件目录(目录里应有 package.json、cordis.patch.yml、lib/、assets/、README.md)。
# 1) 若是 zip:先解压到一个固定、以后不会移动或删除的目录(不要放临时目录/下载目录)
# 例:D:\Plugins\dsh-whale-widget
# 要安装的是「包含 package.json 的那一层」,不要多套一层同名目录
# 2) 确认关键文件都在(缺 assets/ 会导致没图、没声)
Test-Path "D:\Plugins\dsh-whale-widget\package.json",
"D:\Plugins\dsh-whale-widget\lib\index.js",
"D:\Plugins\dsh-whale-widget\assets\whale-widget.js"
# 3) 如果之前从 GitHub / npm 装过同名插件,先卸载避免版本冲突
dsh plugin --profile web remove dsh-whale-widget
# 4) 用绝对路径安装(路径含空格要加引号)
dsh plugin --profile web add link:D:\Plugins\dsh-whale-widget说明:
link: 是软链安装:源目录里的文件改了立即生效;但安装后不能移动/重命名该目录,移动了要重新 add 一次dsh plugin --profile web add file:D:\Plugins\dsh-whale-widget(此后源目录再改不会同步,需重新 add)assets/minecraft-exp-orb.wav、assets/task-end-a.wav 等内置资源;删掉 assets 里的文件会让对应功能静默降级(无图/无声)dsh web,再 F5 刷新浏览器无需本地克隆,一条命令安装:
dsh plugin --profile web add github:MeteorNOX/DeepSeek-Balance-Whale-Widget说明:
$env:http_proxy="http://<ip>:<port>"; $env:https_proxy="http://<ip>:<port>"; $env:all_proxy="socks5://<ip>:<port>"; dsh plugin --profile web add github:MeteorNOX/DeepSeek-Balance-Whale-Widgetdsh web,再 F5 刷新浏览器在仓库根目录(package.json 所在目录)执行:
dsh plugin --profile web add link:.说明:
dsh plugin 会把参数转发给 pnpm,并在成功后自动把 dsh-whale-widget 加入 dsh.profile.bundlesdsh plugin --profile web add link:D:\你的路径\DeepSeek-Balance-Whale-Widgetlink:.\dsh-whale-widget——仓库里没有 dsh-whale-widget/ 子目录,这样会安装成普通依赖而非插件dsh web,再 F5 刷新浏览器add link:;若提示冲突,先 dsh plugin --profile web remove dsh-whale-widget 再 adddsh plugin --profile web add dsh-whale-widgetplugin_manager 提示)请帮我安装插件 dsh-whale-widget。可能的来源有两种:GitHub 仓库
MeteorNOX/DeepSeek-Balance-Whale-Widget,或者我本地已经有这个插件的「完整资源包」。
先确认运行形态:如果当前是官方桌面客户端,请使用宿主内置 plugin_manager,
不要执行下面的 Web 命令,也不要自行构造认证/RPC或修改 desktop profile。
以下步骤仅用于 dsh web:
1. 确认 DSH 安装器使用的 pnpm 可用;若提示找不到 pnpm,先报告安装器所用路径和版本,
按该 DSH 版本的安装说明处理,不直接假定需要全局安装或重装插件。
2. 在 Web profile 安装(按我实际拿到的来源任选一种):
【来源一:从 GitHub 安装】
dsh plugin --profile web add github:MeteorNOX/DeepSeek-Balance-Whale-Widget
或从本地 git 仓库链接安装:
dsh plugin --profile web add link:<仓库绝对路径>
(注意:仓库根目录就是插件包,不要写成 link:.\dsh-whale-widget 这种带子目录的路径)
【来源二:我本地已有完整资源包(zip 或已解压目录)】
先确认「完整资源包」长什么样:一个目录,里面应当有
package.json、cordis.patch.yml、lib/index.js、
assets/(含 whale-widget.js、DSniang1.png、Ya1.mp3、minecraft-exp-orb.wav、task-end-a.wav 等)、README.md
然后按下面做:
a) 如果给我的是 zip:先解压到一个**固定、以后不会移动或删除**的目录,例如
D:\Plugins\dsh-whale-widget
不要解压到临时目录/下载目录/会被清理的位置;也不要多套一层——
要安装的是**包含 package.json 的那一层**,不是外面那个同名压缩包目录
b) 检查文件完整性(任意一条 False 就先告诉我,不要继续装):
Test-Path "<资源包目录>\package.json"
Test-Path "<资源包目录>\lib\index.js"
Test-Path "<资源包目录>\assets\whale-widget.js"
并确认 package.json 里 name 是 dsh-whale-widget、带 dsh.bundle.patch 字段
c) 如果之前从 GitHub / npm 装过同名插件,先卸载避免版本冲突:
dsh plugin --profile web remove dsh-whale-widget
d) 用**绝对路径**安装(路径含空格要加引号):
dsh plugin --profile web add link:<资源包目录>
link: 是软链安装:源目录改了立即生效,但安装后不能移动/重命名该目录;
移动后必须重新执行一次 add。若想按拷贝安装可用:
dsh plugin --profile web add file:<资源包目录>
(file: 以后源目录改动不会同步,需要重新 add)
3. 如果报 pnpm 阻止构建脚本(allowBuilds 相关),先确认被阻止的是哪个包。
本插件没有安装/编译脚本;不要因此放行所有依赖的构建脚本,按具体报错处理。
4. 重启 dsh web,然后 F5 刷新浏览器
安装后验证:
- dsh --profile web --dump-config 应该能看到 dsh-whale-widget 在 bundles 里
- curl http://127.0.0.1:3080/dsh-whale/balance.json 应返回 200 JSON(含 totalBalance)
- curl http://127.0.0.1:3080/dsh-whale/widget.js 应返回 200 JS
- curl "http://127.0.0.1:3080/dsh-whale/audio-fragment.wav?id=exp_orb" 应返回 200 audio/wav
- curl "http://127.0.0.1:3080/dsh-whale/audio-fragment.wav?id=end_a" 也应返回 200 audio/wav
(用来确认资源包里的内置音效已随包就位;若是 404 说明 assets/ 不完整)
另外请检查 DSH 凭据里是否配置了 DEEPSEEK_API_KEY(没有就提示用户配置;如果用户是用 DSH 账号登录的,较新 DSH 上不配 key 也能取余额,**别把"没 key"当成故障**)。余额有两种取数方式(API key 优先,两者互不干扰):
GET https://api.deepseek.com/user/balance)。在 DSH 凭据服务里配置(凭据管理界面 / .dsh/.credentials.yaml)。0.1.7-rc.2)才有这个服务;老版本、未登录、或账号没有余额钱包时,会回到下面的「未配置」提示。不需要 DEEPSEEK_PLATFORM_TOKEN。早期版本的"实时·令牌"模式已下线,今日已用统一由小鲸鱼记账(余额差 + 会话事件)计算,零令牌开箱即用。插件会把凭据交给谁、以及谁能改这件事的规则: