在屏幕边缘实时查看 AI 订阅额度与用量
30.7/100
综合分
1
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/9/27 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
自动兼容检查未通过:仓库根目录及浅层子目录均无 dsh 插件清单,无法用 dsh 插件安装命令安装。以下命令仍可尝试,但可能失败。
无法用 dsh 插件命令安装(仓库内无 dsh 插件清单)
git clone https://github.com/PanDeng816/PulseWin.git按该仓库 README 的原生方式安装;若作者另行发布了 DSH 插件包,请以其文档为准
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:需留意
是什么
dsh 原生插件 · model
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 35 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
⚠︎ 实装验证未通过(unknown · 2026/10/3) ——可能是验证环境差异,装前建议到 GitHub 仓库确认最近更新与 issue。
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查需源码安装仓库根目录及浅层子目录均无 dsh 插件清单,无法用 dsh 插件安装命令安装
展开查看检查明细 ↓
以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。
✗npm 包PulseWin(未发布到 npm,仅可源码安装)
✓Node 引擎未声明 engines.node
✓dsh CLI 依赖未声明 dsh 版本约束
✗入口文件缺少入口声明
源码安装时若 pnpm 拦截 prepare 脚本,按其提示在 pnpm-workspace.yaml 的 allowBuilds 中放行后重跑。
验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/11 22:21:30
安全扫描自动 · 静态分析源码v2.7.0⚪ 扫描:无法判定尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0已尝试扫描但取不到可分析的源码:仓库或包不存在、已删除,或为非 JS/TS 实现、未随包发布源码。无法判定,不代表安全。
- · 包内无可扫 JS
- · TS 源码(可能为非 JS 实现或未发布源码),无法判定
扫描于 2026/10/31(1 天前) · 范围 全包扫描(包内未声明入口) · 来源 GitHub 仓库
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
功能亮点
- 屏幕边缘实时显示额度
- 查看AI订阅用量
- 适配多种用量统计
README
由 DeepSeek 最新模型翻译生成Pulse for Windows
一个 Windows 11 屏幕边缘的 AI 额度浮窗:黑色玻璃 rail 上,每个订阅一个复合同心环(内细圈 = 5 小时用量,外粗圈 = 月总额度),用量 ≤80% 绿色、 80% 红色报警;hover 弹出三池明细卡。数据源:Command Code GOAT、OpenCode Go 与 DeepSeek(余额),自动 60 秒同步,不依赖任何第三方服务。
✅ 已适配 DSH(DeepSeek Harness)桌面版
DSH 的用量与“正在跑”状态,在这里都能看到:
- 用量统计直接读 DSH 的会话记录(~\.dsh\sessions\ 的 zstd 事件流),按每一步的 token 明细入账,和 ZCode、OpenCode 并列成“来源”三行;套餐页里 DSH 消耗自动归到它实际走的那个套餐(如 Command Code GOAT),与 ZCode 同页合账——本机账单里不再有 “看不见的那一块”。
- 子代理会话归根:DSH 每派一个子代理就起一个独立会话,PulseWin 会把它归回派它的那个主任务,“最近会话”不再被拆成一堆看起来互不相干的任务。
- 环心呼吸:DSH 正在跑一轮时,GOAT 环的图标会轻轻呼吸(与 ZCode 的判定并列)。
展开完整文档(README 剩余 1 节)
Pulse for Windows
一个 Windows 11 屏幕边缘的 AI 额度浮窗:黑色玻璃 rail 上,每个订阅一个复合同心环(内细圈 = 5 小时用量,外粗圈 = 月总额度),用量 ≤80% 绿色、 80% 红色报警;hover 弹出三池明细卡。数据源:Command Code GOAT、OpenCode Go 与 DeepSeek(余额),自动 60 秒同步,不依赖任何第三方服务。
✅ 已适配 DSH(DeepSeek Harness)桌面版
DSH 的用量与“正在跑”状态,在这里都能看到:
- 用量统计直接读 DSH 的会话记录(~\.dsh\sessions\ 的 zstd 事件流),按每一步的 token 明细入账,和 ZCode、OpenCode 并列成“来源”三行;套餐页里 DSH 消耗自动归到它实际走的那个套餐(如 Command Code GOAT),与 ZCode 同页合账——本机账单里不再有 “看不见的那一块”。
- 子代理会话归根:DSH 每派一个子代理就起一个独立会话,PulseWin 会把它归回派它的那个主任务,“最近会话”不再被拆成一堆看起来互不相干的任务。
- 环心呼吸:DSH 正在跑一轮时,GOAT 环的图标会轻轻呼吸(与 ZCode 的判定并列)。
不装 DSH 也不受任何影响:没有 ~\.dsh 目录时这一路来源自动缺席,不报错、不占资源。
展示层还原自 qunqin24/Pulse(macOS),数据层移植自 ahuud251/goat-go-usage-monitor。
见 THIRD-PARTY-NOTICES.md。
预览
贴边 rail 上的复合同心环:内细圈 = 5 小时用量,外粗圈 = 月总额度;阈值内绿色,超过报警线转红(下例中 GOAT 56% 绿、OpenCode Go 99% 红)。
鼠标悬停弹出该订阅的明细卡——三个时间池各自的百分比条、已用量与重置倒计时:
| Command Code GOAT 明细卡 | OpenCode Go 明细卡 |
| GOAT 明细卡:5小时/本周/总额度三池与右侧复合环 | OpenCode Go 明细卡:5小时/本周/本月三池,99% 转红报警 |
托盘右键菜单:显示/隐藏浮窗、立即刷新、设置、开机自动启动、退出:
下载
免安装:到 Releases 页面下载 PulseWin.exe,双击即用(自包含单文件,无需安装 .NET)。
数据保存在 exe 同目录的 Data\ 下,卸载 = 删除整个文件夹。
功能
- 支持的客户端:DSH(DeepSeek Harness)、ZCode、OpenCode 的本地用量都能统计(见下文“用量窗口”);额度环读的是各订阅/账号的官方接口
- 屏幕右/左/上边缘停靠或自由浮动;鼠标探到边缘滑出,移开 0.9s 自动隐藏
- 空闲时几乎不耗电:主循环按需在 60fps(有动画/指针在 rail 上)与 10fps(静止)之间切换,静止藏屏外时一帧都不重绘——实测 idle CPU ≈ 0%、私有内存约 175MB
- 工具窗按需读取、用完即还:套餐用量页与用量统计窗共用同一份账本(引用计数,谁都不用了立刻释放),不再各读一遍本机两个库;关掉窗口后内存随即回落
- 每订阅一个复合环:内圈 = 5小时用量,外圈 = 月总额度(周额度在 hover 卡内)
- 只在有用量时显示 5 小时圈(默认开):5 小时窗口没用过的源只画总额度外环——大多数源的 5 小时窗口长期是 0%,那一圈空轨道只增加噪音;省掉之后,“内圈出现” 本身就是“这个源正在被用”的信号,rail 一眼看过去干净很多。可在设置里关掉退回“总是两圈”
- DeepSeek 是余额型数据源,只占一圈:要么按所选基准画百分比,要么直接显示余额金额(详见下文)
- 环尺寸固定、显示哪些源可选:设置里勾选要显示哪几个;关掉的既不显示、不占高度,也不再对它发请求(不是“照旧每 60 秒打一次接口、只是不画环”)。多一个源 rail 就长一截,环本身不缩
- 读数可隐藏:关掉后 rail 是一条纯环列,环间距与整体高度同步收窄
- 报警线(默认 80%,可调):阈值内绿、超过转红、封顶深红
- hover 卡片:三池各自的百分比条、已用量、重置时间;数据超过 3 分钟没更新时会标出“⚠ 数据 X 分钟前 · 未能刷新”
- 点击环 = 立即刷新(真的会打一次接口,弧变暗 + 亮段游走直到数据回来;亮段至少显示 650ms,免得一闪而过让人以为没刷)
- rail 上点右键 = 菜单(显示/隐藏、立即刷新、用量统计、设置、退出):命中范围与拖动完全一致,所以能拖动的地方就能右键;菜单每次点击现构建,刚查到的新版本立刻就在里面
- 环心呼吸 = ZCode 或 DSH 正在跑:有客户端在跑一轮的时候,GOAT 环的图标会轻轻呼吸(缩放 92%~100%,约 1.2 秒一轮)。ZCode 的判定读它自己应用日志里 turn.started 与 turn.completed / turn.failed 的配对——不是“最近若干秒有写入”:跑长命令时它误灭、回合结束后又会因为客户端继续写记账信息而永远亮着。等待超时按“这一轮在等什么”分档(等工具 5 分钟、等模型 90 秒)。DSH 的判定读它的会话投影(~\.dsh\storages\session_projcache\ 里的 openTurnStartSeq 有没有闭合),同样带 5 分钟门限——异常退出会留下一个永不闭合的回合,没有门限它就会一直亮着(两个客户端都走 Command Code 网关,所以呼吸的始终是 GOAT 这一圈)
- 至少保留一个数据源:取消最后一个勾选时会自动弹回并说明原因——三个全关之后浮窗上就什么都没有了
- 每个源可自定义圆环颜色(#RRGGBB):不填就还是“按用量着色”;用满时一律深红
- 自动检查更新:每两小时查一次 GitHub Release,只提示、不自动安装
- 用量窗口(托盘右键 → 用量):见下文
- 托盘:常驻品牌图标(v1.12.2 起不再画额度小环——任务栏里认不出是什么程序),
悬停显示各源摘要;双击显示/隐藏、右键菜单(立即刷新、用量、设置、开机自动启动、退出);
额度越线时弹告警气泡
- 只允许运行一个实例:重复启动会唤醒已有窗口,不会起第二个浮窗
额度口径(GOAT)
Command Code 的服务端只发剩余额度、不发上限,而且 GOAT 的额度单位是
credits(用量价值单位)而不是美元,池子是固定的 70 credits:
月上限 = 70 credits(5小时 cap 14、周 cap 35 正是它的 20%/50%,同一刻度) 已用 = 70 − 服务端 remaining 百分比 = 已用 / 70 # 只依赖固定池子,与所选模型无关
界面上一律显示 credits 原值 + 百分比,不做美元折算。“1 credit 值多少美元”要先知道所选模型的 monthly allowance,而那是官方随时会调的数(V4.1 Flash 常态 $40, 2026-09-11~09-20 曾限时提到 $60,之后又回落),换个模型也会变。把显示建立在这个数上,官方一调、或换一个 allowance 不同的模型,同一份服务端数据就会被折成另一个金额,切换日还能看到“已用”凭空跳变——那就不是服务端给的原始事实了。参见 Services/CommandCodeApiClient.cs 里的 CreditUnit。
高峰/低谷已自动计入:服务端按请求发生时刻的实际单价扣 credit(高峰价是错峰的 2 倍),所以高峰时段额度掉得更快——百分比本身就是“实际花费”的口径,工具无需额外换算。
余额口径(DeepSeek)
DeepSeek 和另外两个源的根本差别:它卖的是预付余额,不是套餐。接口只有一条,而且是官方文档里的:
GET https://api.deepseek.com/user/balance
→ {"is_available": true, "balance_infos": [{"currency":"CNY","total_balance":"110.00",
"granted_balance":"10.00","topped_up_balance":"100.00"}]}
回包里没有额度、没有窗口、没有重置时间,API 里也没有消费历史。所以“环”要画百分比就缺一个分母,本程序给三个来源,在设置里选:
| 基准 | 分母 | 环上显示 |
| 自上次充值(默认) | 本程序观察到的历史最高余额 | (峰值 − 余额) / 峰值 → 百分比 |
| 只看余额 | 没有 | 不画百分比,直接显示 ¥42.3 |
| 我的预算 | 你填的“满箱”金额 | (预算 − 余额) / 预算 → 百分比 |
默认用“自上次充值”,因为它的分母是观察出来的而不是猜的:余额上涨只可能是充值,所以一涨就把峰值重置回满。代价是首次运行没有历史峰值,环从 0% 开始,直到真的花了钱——那是关于“本程序看到了什么”的真实陈述。峰值按币种各存一份 (Data\deepseek-baseline.json),因为一个账户可以同时持有 CNY 和 USD,两者不能相加也不能跨币种比大小。
另外两条口径:环上的金额用截断而非四舍五入的短写法(显示得比实际多是错错了
方向),精确值在 hover 卡里;只有 DeepSeek 自己的 is_available 能表示“账户花光了”,自设预算走到 100% 不算——那是你画的线,不是 DeepSeek 的判定。
卡片里的“今日消耗”柱状图
DeepSeek 的 API 不提供任何用量或消费历史,所以拿不到真实的 token 数。卡片上
那张柱状图是本程序自己观察出来的:每次同步成功记下余额(每小时留一个点),相邻
两个小时的差额就是那一小时的消耗。
也就是说它衡量的是“余额下降”,不是账单。程序没运行的那些小时没有采样,柱子上是空的——宁可缺一根柱子,也不能把“没看见”画成“没花钱”。数据按币种分开存 (Data\deepseek-ledger.json,保留最近 7 天),余额上涨(充值)的那一小时记 0。
卡片脚注同时给出 topped_up_balance / granted_balance 的拆分(这是 DeepSeek 回包直接提供的),所以能一眼看出余额里有多少是自己充的。
用量窗口(v1.12 起合并了原“套餐用量”页)
托盘/悬浮环右键 → 用量,设置 → 数据源 → 打开用量窗口,或给 exe 加 --spend-window 参数。一个窗口三层:顶部订阅额度条回答“还剩多少、什么时候重置”
(管理),总览页回答“这段时间的活干到哪儿去了”(分析),套餐页看单个套餐的
完整画像(下钻)。它自成一体的窗口,不在 rail 上:这是坐下来看的东西,不是瞥一眼的东西。
数据从本机来,不发任何请求:
| 来源 | 读什么 | 粒度 |
| ZCode | ~\.zcode\cli\db\db.sqlite 的 model_usage 表(连 session 取项目/标题) | 每次请求 |
| OpenCode | ~\.local\share\opencode\opencode.db 的 message 表(助手消息里的 tokens) | 每条消息 |
| DSH | ~\.dsh\sessions\\\session.v4.jsonl.zstd 的 assistant/message 事件(带 zstd 解压 + 文件级缓存) | 每一步模型调用 |
DSH 的子代理会话会归根到主会话。DSH 每派一个子代理就起一个独立会话(自己的会话文件、自己的标题,如“任务: 把 D:\…\05CADTools…”),父子关系记在父会话的 subagent/catalog 事件里(childId)。PulseWin 沿这条线索把子会话的用量、项目、标题都换成它所属的主会话的——否则“最近会话”会被拆成一堆看起来互不相干的任务,而用户认的是 "My task". If the parent cannot be found (the parent session file has been deleted), keep it as-is; do not guess. The deduplication key uses the source's own session number (not the grouping number after root merging), so no matter how the root-merging rules change, historical details will not be double-counted—when changing this logic, be sure to preserve this distinction.
Strictly adhere to several rules in the calculation basis (consistent with upstream Pulse); it is better to show less than to show wrong numbers:
- Four token categories: input (fresh portion), cache write, cache read, output. The sum of the categories must reconcile with the total reported by the source—any discrepancy goes into "uncategorized", is included in the total but is never stuffed into input, and never participates in pricing. (In ZCode's schema, input_tokens includes cache and output_tokens includes reasoning, so on the input side the cache overlap must be subtracted and reasoning must not be added a second time; OpenCode's reasoning must be merged into output; DSH's inputTokens is inherently "input that missed the cache" (called uncachedInputTokens in its session projection), and cacheWriteTokens is always 0, so the four categories are taken directly without subtraction—these two vendors' calculation bases are exactly opposite, so be sure to distinguish them when changing the readers.)
- Amounts always come from list prices, not the cost field recorded by the source itself (that is its understanding at the time; when a plan has no price list, it is 0). List prices come from models.dev; first-party vendor prices always take priority, and only if not found do we fall back to plan prices (such as deepseek-v4.1-flash, which is only listed on opencode-go).
- Models with no found price only count tokens and do not display an amount, and are clearly marked—a guessed price that looks like a correct number is worse than none. In the list, an amount shown as — means "cannot be calculated" (not "no money spent"), and one with is a subtotal covering only the priced portion; a genuinely free model with a real 0 cost still shows $0.00.
- The price table updates itself: the built-in one is a snapshot at packaging time; after it expires (more than 7 days), opening the statistics window will pull a fresh full models.dev dataset in the background, trim it by the vendor whitelist, and write it to Data\model-prices.json, taking effect on the next read; on failure, continue using the old one and retry after five minutes. Only original model vendors and vendors of plans currently on sale are included; none of the two hundred-plus resellers are included (otherwise resellers would decide prices ahead of original vendors in alphabetical order).
- Project identity and display name are two different things: a project's identity is the full working directory—D:\work\a\api and D:\work\b\api are two projects, and their usage will not be merged into one row; by default, display only gives the last directory segment, and only when the last segment collides does it add one more segment upward (such as 06Learning\03_工作资料). Daily aggregation is stored in the local repository (Data\usage-history.sqlite), so history remains after the source database cleans up old records.
- Sources that cannot be read must be reported (database locked, structure changed), rather than treated as 0.
- Amounts are estimates converted at public API prices, not bills; in-plan calls look "very cheap" because the plan has already prepaid the marginal cost.
The interval can be Today / Last 7 days / Last 30 days / Custom (start and end dates) / All (default Last 7 days); changing the interval only recalculates addition, without rereading the database. The overview page also has:
- Subscription quota bars: one row per subscription (5-hour / this week / total quota progress + amount used + reset countdown), reading the official API numbers synced by the floating ring; BigModel has no usage API, so it shows "estimated amount this month + end-of-month forecast", and only when a monthly budget (BigModelMonthlyBudgetCny) is filled in the settings is there a progress bar.
- Period-over-period comparison: a line on the large card saying "vs. previous period tokens +x% · amount +x%", automatically taking the previous period of equal length.
- Click to drill down: the bars of the daily bar chart and the cells of the activity heatmap are both clickable—click a day and the whole window switches to that day's data (breadcrumb "← Back" to exit); when there are more than 62 days, the bar chart automatically aggregates by week, and when more than 730 days, by month.
- Export: the "Export" button in the upper right exports the current interval as CSV (opens directly in Excel, with BOM) or JSON, including four tables—daily / model / project / session—and an explanation of the calculation basis.
- Quota alerts: when the usage of a quota pool crosses from below to above the threshold (the level where the rail turns red, default 80%), the tray pops up a balloon once (it will only report again after a reset or after dropping below and crossing again).
Plan page (within the usage window)
The top tab of the usage window selects plans (it used to be in settings; moved here in v1.12). Each plan has one page, all complete profiles:
- Plan switching: Command Code GOAT / OpenCode Go / BigModel monthly / DeepSeek … each has a button, and the button carries that plan's total. Multiple provider spellings of the same plan are merged into one (OpenCode Go's opencode-go / -glm / -responses, BigModel's builtin: and account:).
- Plans that were subscribed to but unused during this period also remain: any plan present in the client configuration will be listed; those with zero usage in the current interval are marked "no usage in this interval" and show the last used date (未启用 means it is turned off in the client configuration, while historical usage is still counted as-is)—they will not disappear from the list just because "there has been no recent renewal".
- Six KPI cells: total cost (including average price/request), total requests, total TOKEN (including input/output), cache hit rate (including hit volume), cache read / write, session count.
- Six token composition cells: input / output / cache read / cache write / uncategorized / total.
- Subscription quota: the quota pool corresponding to this plan (only for channels with a quota API): 5-hour / this week / total quota progress and reset countdown.
- Today by hour: a usage bar chart for hours 0–23 (input and output stacked in different colors, peak-hour bars in orange), marking the busiest period.
- Time-period distribution (for "peak surcharge" plans like GOAT): how many tokens and how much amount the peak periods (local 09:00–12:00, 14:00–18:00) account for over the entire interval—to reduce credits consumption, moving large tasks out of peak periods is most effective; amounts are estimated at public list prices and do not include time-period coefficients.
- Daily usage: a daily bar chart within the interval (days with no records are drawn as a faint line, not 0).
- Performance and behavior (from the per-call telemetry recorded by the client): reasoning as a share of output, average duration, average time to first token, tool calls (including count/request), retries (including share), average tokens per request.
- Usage of each model in this plan: model + share bar + total / count / cache hit rate + estimated amount; the upper right can switch sorting "by token / by amount" (unit prices differ by dozens of times, so sorting by token is misleading).
- Account metering comparison (for channels with official APIs such as GOAT): official billing-period used token/request/cost vs. local records (same billing period) vs. difference—official numbers cover all devices, all keys (server-side metering), while local only has records from this computer; the difference is usage from other devices/command line directly (v1.12.1 measured: 官方 37.4 亿 vs 本机 34.2 亿,差 3.2 亿来自其他设备)。账期起点 = 月池重置时间往回 30 天
- 官方逐模型明细(账号级):调 /internal/usage/charts(浏览器登录态),跨设备按模型看 token 构成——需要 设置 → 数据源 打开「浏览器会话明细」并登录 commandcode.ai; 浏览器开着时 cookie 库常被锁,读不到时自动隐藏、不影响对照行
- 逐日明细:每行一个模型、每列一天(最近 6 天)的 token 矩阵,悬浮看当天次数与金额
- 归属信息:实际用到的 provider id、来源客户端、与统计窗口一致的口径说明
区间与总览共用一套(今天 / 7 天 / 30 天 / 自定义 / 全部)。数据来源同源(本机
ZCode / OpenCode 记录库,不发请求),口径也完全一致:四类 token 之和对不上来源总量时
差额记“未分类”(计入总数、不计价),金额按 models.dev 公开牌价估算。
设置 → 数据源里现在只留“用量数据”入口按钮和“浏览器会话明细”开关;用量展示本身全部在用量窗口里。
套餐是怎么认出来的
本机用量记录里只有 provider_id(ZCode 是 UUID 或 builtin:xxx 这类字符串, OpenCode 是 opencode-go),直接拿来当分组键会显示成没人看得懂的一串。
ChannelRegistry 把 id 翻成套餐名:优先读 ZCode 自己的 provider 配置 (~\.zcode\v2\provider_config.json 里有 providerId→providerName 的权威映射),
读不到再退回内置规则(opencode-go- 前缀、bigmodel-* 前缀等)。
两者都认不出的 id 会原样显示成短标签,宁可不认识也不丢数据。
DSH 走的是内置规则:它记下来的 provider 是路由名(在 ~\.dsh\profiles\\cordis.patch.yml 里自定义,如 commandcode-goat), 不是配置里能查到的 id。所以 commandcode / goat / deepseek 这几个前缀都显式归了档——不归的话会多出一行“渠道 commandco”,而 DSH 花的钱其实正是 GOAT 那份额度, 两行会让人以为金额对不上。
可选:浏览器会话明细(默认关;账号级跨设备明细)
这一页有一个浏览器会话明细开关,开了之后会读本机浏览器(Edge/Chrome)的登录 cookie,
去抓 Command Code 只有登录态才开放的逐模型缓存明细,与本机库的记录做交叉核对。
它不会让统计数字更准:本机库(~/.zcode 的 model_usage、OpenCode 的会话消息)
本来就覆盖了同样的用量,逐模型、逐小时都在。这条通道只是多一层旁证——所以默认关,而“关着”不影响任何数字。
默认关的两个实际理由:
1. 读 cookie 可能被杀毒软件误判。同类工具 CodexBar-Win 就因为“解密浏览器 cookie 读配额”被 AV 全家误判成 infostealer,最后撤掉了全部二进制。这是真实前车之鉴。
2. 浏览器运行时读不到。Chromium 系的 cookie 数据库是排他锁定的——本机实测
连只读共享打开都失败(WinError 32),所以基本要等浏览器完全退出才有机会读到。
不开这个开关,套餐页也完整可用(本地库本来就有逐模型的 token 与缓存读/写)。
运行
需要 Windows 10/11。两种方式:
开发运行(需 .NET 8 SDK)
dotnet run
单文件成品(自包含,免安装)
dotnet publish -c Release -r win-x64 --self-contained true
-p:PublishSingleFile=true -p:IncludeNativeLibrariesForSelfExtract=true
-p:EnableCompressionInSingleFile=true -o publish
.\PulseWin.exe
EnableCompressionInSingleFile 把自包含产物从 ~154MB 压到 ~70MB,代价是首次启动多花一点解压时间。日常使用的 PulseWin.exe 放在仓库根目录,便携数据
Data\(凭据/用量历史)必须与它同目录,挪 exe 时记得一起挪。
根目录那份是“框架依赖单文件”(约 3 MB,机器上要有 .NET 8 桌面运行时):
dotnet publish -c Release -r win-x64 --self-contained false
-p:PublishSingleFile=true -p:IncludeNativeLibrariesForSelfExtract=true -o
体积小、启动快,适合自用;上面那个自包含版是给没装运行时的机器与 Release 用的。
注意 EnableCompressionInSingleFile 只在自包含时才支持(框架依赖下会报 NETSDK1176)。
--self-contained false 也必须带 IncludeNativeLibrariesForSelfExtract——用量统计要读 SQLite,它的原生 e_sqlite3.dll 打包进单文件后要靠自解压才找得到。
几个只输出结果、不开界面的诊断参数(走的是与界面完全相同的那套口径代码):
| 参数 | 作用 | 输出 |
| --spend | 把用量统计的原始数字打出来(核对口径用,别靠截图) | Data\spend-dump.txt |
| --models | 把逐模型聚合、套餐/渠道聚合与浏览器会话通道的状态打出来 | Data\models-dump.txt |
| --dsh | DSH 读取器的解析结果、冷/热耗时、缓存命中,以及与 DSH 自己的会话投影逐会话对账 | Data\dsh-dump.txt |
| --update-prices | 强制更新一次模型牌价表并等它做完 | Data\price-update.txt |
| --activity [目录] | 读 ZCode 活动日志(可指定目录)与 DSH 会话投影,输出“现在算不算在跑”的判定 | Data\activity.txt |
| --card-shot | 用合成数据把 hover 明细卡离屏渲染成 PNG(排版必须在像素上核对) | Data\card-shot\.png |
| --ui-shot | 把设置窗各页、环色选择器与用量统计窗离屏渲染成 PNG(不 Show、不抢焦点) | Data\ui-shot\.png |
| --check-migration | 核对旧设置能正确迁到新格式(用合成用例 + 本机真实 settings.json) | Data\migration-check.txt |
| --rail-shot | 用合成数据把 rail 主界面离屏渲染成 PNG(验证"空闲只画外圈"这类绘制改动) | Data\rail-shot\.png |
设置与数据
托盘 → 设置…:
- 显示各数据源的连接状态与凭据来源
- 可手动输入 API Key(先联网验证,通过后 DPAPI 加密保存并立即同步)
- 调整显示与刷新偏好,即时生效并写入 Data\settings.json:
- 报警阈值(50%~99%,默认 80%)
- 背景不透明度(30%~100%,默认 80%)
- 同步间隔(15~300 秒,默认 60 秒)
- 显示哪些圆环(至少留一个)、环下是否显示读数
- 只在有用量时显示 5 小时圈(默认开;关掉退回"总是两圈")
- 圆环顺序:在「行为」页用可重排列表调整(拖动行首手柄或点上下箭头)
- 每个源的圆环颜色(留空 = 按用量着色)
- 自动隐藏的两个开关(见下)
- 网络代理(跟随系统/直连/手动 HTTP;重启后生效)
加一个新的数据源
数据源是一张注册表(Services/SourceCatalog.cs)驱动的,加一个源只需加一条记录
(键、显示名、rail 标题、月池叫法、是否余额型、快照/凭据文件名、凭据提示),不再需要改六处:
new(
Id: MonitorSource.YourSource, Key: "yoursource",
DisplayName: "Your Source", RailName: "YS", MonthlyLabel: "本月", IsBalance: false, CredentialHelp: "…",
SnapshotFile: p => p.YourSnapshotFile,
CredentialFile: p => p.YourCredentialFile),
设置存取(可见源与顺序)、快照加载、引擎同步、设置页的凭据卡与环色项都从这个表生成。
UI 只保留三处与实例绑定的映射(状态对象、凭据解析器、API 客户端),那是注册表不该持有的有状态对象。旧设置里的 ShowGoat/SourceOrder/GoatTint 等字段仍能被读入并迁移 (见 --check-migration),存量用户升级不丢配置。
注意上面这张表管的是"额度源"(rail 上画环的那些)。用量统计的来源是另一套
(Services/Spend/ 下的 IUsageStore),两者互不相干:DSH 就不是额度源(它的额度属于 GOAT 池),但它是一等公民的用量来源。用量来源有两种形状:
- 别人的运行数据库(ZCode / OpenCode 的 SQLite):只读打开、查一遍、取 session 表补项目与标题即可;
- 追加写的文件流(DSH 的 zstd 压缩 jsonl):要自己处理三件事——①容错解压 (活动会话随时可能只写到半个 zstd 帧,读到哪算哪,下一轮长度变了再重读补齐)
②文件级缓存(历史会话内容永远不变,按"长度 + 修改时间"命中就复用,否则每次
打开用量窗都要把全部会话重新解压一遍)③整份解析完再回填元数据(会话标题、
工作目录都可能在消息之后才出现,边读边填会让前面的记录没有标题)。
关于"液态玻璃"(v1.7.3 已移除)
v1.7.0 曾加过一个"液态玻璃"开关(用 SetWindowCompositionAttribute 开系统 acrylic 模糊), v1.7.3 已整体删除。原因是它带来两个无法调和的代价,而视觉收益几乎为零:
- 模糊区域只能是整个窗口矩形,跟不了 rail/卡片的圆弧轮廓 —— 一开就把所有圆角变成直角 (v1.7.0 与 v1.7.1 因此被连否两次)。
- 在分层窗口上调用它会不可逆地打坏 per-pixel alpha,圆角与半透明一起失效 —— v1.7.2 修的"圆弧和透明度都没了"就是它(ACCENT_DISABLED 也会打坏)。
- 实际观感只是 80% 黑 tint 平铺一块,在浅色桌面上看不出"玻璃"。
面板本来就是自绘的黑色玻璃(背景不透明度可调),不需要系统模糊。
关于"自动隐藏"的两个开关
- 隐藏时收成贴边小条:关闭(默认)时,不用就把整条 rail 完全滑出屏幕外; 打开则只折叠成贴在屏幕边缘的 6pt 细条(有源越过报警阈值时细条会染色), 指针靠近热区即展开。
- 全屏时隐藏:前台是全屏应用(视频/游戏/演示)时自动收起,且收起期间指针到屏边
也不会弹出(否则全屏看视频时鼠标一晃到边缘就被拉出来,这个开关等于没开);
退出全屏后指针到屏边即可唤回。
v1.7.3 修的正是这两个:"收成贴边小条"以前无论开关与否都只在屏边留 6pt (既不是细条也没真正隐藏),细条还画在屏外看不见;"全屏时隐藏"收起后热区立刻又能把它拉回来。两个开关现在都真的起作用了。
凭据自动发现顺序(与 GOAT-Go-Usage-Monitor 一致):
- Command Code GOAT:环境变量 COMMAND_CODE_API_KEY → ~\.commandcode\auth.json → DPAPI 手动存储
- OpenCode Go:环境变量 OPENCODE_GO_API_KEY → ~\.local\share\opencode\auth.json 中 opencode-go 登录态 → DPAPI 手动存储
- DeepSeek:环境变量 DEEPSEEK_API_KEY → DPAPI 手动存储。它没有可借用的 CLI 登录态 (Key 只存在于 DeepSeek 控制台),所以没配 Key 时这个环不显示,也不会拖慢另外两个源的刷新节奏
隐私
- 无硬编码密钥、无遥测、无第三方服务器:请求只发给 Command Code / OpenCode 官方接口
- 所有数据(用量快照、加密凭据、设置)存在 exe 同目录 Data\(不可写时回退 %LOCALAPPDATA%\PulseWin),首次启动会自动迁移旧 GOAT-Go-Usage-Monitor 目录的数据
- API Key 用 Windows DPAPI 按当前用户加密(credential.bin),只有本机本用户可解密
- 接口异常会记到 Data\diagnostics.json(最近 100 条),不含密钥
- 上传/分发源码时请勿包含 bin/、obj/、publish/、Data/(见 .gitignore)
免责声明
非官方社区工具,与 Command Code、OpenCode 及其运营方无隶属或背书关系。预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
PanDeng816/PulseWin
在屏幕边缘实时查看 AI 订阅额度与用量
相关插件 · 模型接入
API 中继安全审计toby-bridges/api-relay-audit
面向 AI API 中转与 LLM 代理的本地安全审计。
★ 897已汉化DSH
69.4
免费搜索插件DDDMUC/dsh-free-search
DeepSeek Harness 免费搜索插件 —— 无需 API key,零成本,多引擎可切换。 一个给…
★ 761已汉化DSH
68.7
免费联网搜索liustack/modsearch
在官方 App 里模型能联网,切到 API 就不能了。ModSearch 把联网补回来:网页搜索、X…
★ 863已汉化DSH
68.5
OpenCode 免费模型FishBottle7/opencode2dsh
在 DSHDeepSeek Harness里原生使用 OpenCode Zen 的免费匿名模型。
★ 379已汉化DSH
67.8
AI 模型网关tingly-dev/tingly-box
Tingly Box Web UI 演示
★ 373已汉化DSH
67.4
WorkBuddy 账号池XDTrees/dsh-xdpool
把你能白嫖的模型额度接进 DSH 同一个池:WorkBuddy 多账号自动容错、十三家扫码登录、76…
★ 359已汉化DSH
67.1