dsh-bottom-info-bar 1.19.0 → 1.19.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -20,7 +20,7 @@ A DeepSeek Harness plugin that replaces the stats row under the composer with on
20
20
  | Spend | this session (including subagents), today, last 30 days, all time |
21
21
  | Extras | main time, world time, custom text |
22
22
 
23
- The bar has two densities — click it to switch. **Compact** shows only the provider, model, and one essential account detail: balance, the shortest useful quota window, or this billing period's spend. **Full** shows every enabled detail, including DSH's native stats row. Both follow DSH's light or dark theme.
23
+ The bar has two densities — click it to switch. **Compact** shows only the provider, model, and one essential account detail: balance, the shortest useful quota window, or this billing period's spend, with the context ring always at its right end. **Full** shows every enabled detail, including DSH's native stats row. Both follow DSH's light or dark theme.
24
24
 
25
25
  ## Compact mode
26
26
 
@@ -98,10 +98,13 @@ Everything lives on the plugin page — **Plugins → bottom-info-bar**. Changes
98
98
 
99
99
  **Information display** — choose **Compact** or **Full** and the choice is saved. Compact does not erase any field choices; switch back to Full whenever you need the extra detail.
100
100
 
101
- **Fields and colors** — one switch and one color per field, in two groups. Turn a field off and the bar drops it. The plugin information group opens first; native stats only appear in Full mode.
101
+ **Fields and colors** — one switch and one color per field, in three groups. Turn a field off and the bar drops it. All three groups start collapsed; click a group to open it (typing in the search box opens all three). The group a field belongs to is what decides whether it can appear in Compact mode.
102
102
 
103
- - **Native information** — the fields DSH's own stats row already showed.
104
- - **Plugin information** — everything this bar adds: provider and model, subscriptions, spend, balance, pricing and quota.
103
+ - **Native information** — the fields DSH's own stats row already showed. They only appear in Full mode.
104
+ - **Plugin information** — everything this bar adds: provider and model, subscriptions, spend, balance, pricing and quota. Shown in both Compact and Full mode, the adopted context ring included.
105
+ - **Notices** — update and failure badges, plus the "could not refresh" style warnings. Shown in both modes; each one has its own switch.
106
+
107
+ The context ring sits at the right end of the main row, which is the row Compact mode keeps — so it stays visible in both modes.
105
108
 
106
109
  ![Native information fields](assets/settings-native.webp)
107
110
  ![Plugin information fields](assets/settings-plugin.webp)
@@ -164,7 +167,16 @@ Every model response is recorded (usage × unit price) and aggregated four ways:
164
167
 
165
168
  ## Updating
166
169
 
167
- The plugin checks npm for a newer version at startup and re-checks at most every 15 minutes. When one exists, a red **Update available** label appears in the bar: click it to copy the update command, run it in a terminal, then restart `dsh web`.
170
+ The plugin checks npm for a newer version at startup and re-checks at most every 15 minutes. Pick how it should act in **Version and updates** on the plugin settings page:
171
+
172
+ - **Automatic** (default): download, verify and replace the plugin's own files, then all you do is restart DSH once.
173
+ - **Manual**: it only checks and tells you; nothing is downloaded until you press **Check for updates**.
174
+
175
+ Every file is verified before it lands, and a failure rolls the whole batch back, so a bad download never breaks the copy you are running. **Roll back to the previous version** is one click away in the same section. Only this plugin's own files are touched — never the dependency tree or the profile manifest.
176
+
177
+ When something needs you, the bar shows two short badges: **Restart to apply** (a new version is on disk) and **Update failed** (the last automatic update did not go through). Each one has its own switch under **Notices** and takes no space otherwise.
178
+
179
+ Updating itself only runs when the plugin is loaded from a profile (npm, GitHub address and the install script all qualify). A source checkout or a `link:` install is treated as read-only and left alone — update those by hand:
168
180
 
169
181
  | Installed via | Command |
170
182
  |---|---|
@@ -172,7 +184,7 @@ The plugin checks npm for a newer version at startup and re-checks at most every
172
184
  | GitHub address | `dsh plugin --profile <profile> add <the same address>` |
173
185
  | local checkout or install script | `git -C <repo> fetch origin && git -C <repo> checkout main && git -C <repo> merge --ff-only origin/main && node <repo>/scripts/build.mjs` |
174
186
 
175
- Nothing updates by itself — the bar only tells you that a newer version exists.
187
+ The first upgrade to v1.19.0 still needs the table above, because the updater itself only arrives with that version. Later releases need nothing from you.
176
188
 
177
189
  ## Privacy and security
178
190
 
package/README.zh-CN.md CHANGED
@@ -20,7 +20,7 @@ DeepSeek Harness 插件:把输入框下方那行统计栏换成一行信息栏
20
20
  | 花费 | 本会话(含子代理)、今天、近 30 天、累计 |
21
21
  | 其它 | 主时间、世界时间、自定义文字 |
22
22
 
23
- 信息栏有两种显示方式,点击即可切换:**简洁**只保留服务商、模型和一项核心账户信息——余额、最短的有效额度窗口,或本计费周期花费;**完整**显示所有已启用细节,并保留 DSH 原生统计行。两种方式都跟随 DSH 的深色/浅色主题。
23
+ 信息栏有两种显示方式,点击即可切换:**简洁**只保留服务商、模型和一项核心账户信息——余额、最短的有效额度窗口,或本计费周期花费,右端始终跟着上下文占用圆环;**完整**显示所有已启用细节,并保留 DSH 原生统计行。两种方式都跟随 DSH 的深色/浅色主题。
24
24
 
25
25
  ## 简洁模式
26
26
 
@@ -98,10 +98,13 @@ cd dsh-bottom-info-bar
98
98
 
99
99
  **信息显示方式** —— 选择**简洁**或**完整**,选择会自动保存。简洁模式不会改掉字段开关,切回完整模式即可查看已启用的全部细节。
100
100
 
101
- **字段与配色** —— 每个字段一个开关、一个颜色,分两组。关掉哪个字段,信息栏就不再显示它。插件信息默认展开;原生统计只在完整模式出现。
101
+ **字段与配色** —— 每个字段一个开关、一个颜色,分三组。关掉哪个字段,信息栏就不再显示它。三组默认都收起,想看哪组点哪组(在搜索框里打字会把三组一起展开)。字段归哪一组,决定它能不能出现在简洁模式里。
102
102
 
103
- - **原生信息** —— DSH 原生统计栏本来就有的字段。
104
- - **插件信息** —— 信息栏新增的全部内容:服务商与模型、订阅、花费、余额、定价与额度。
103
+ - **原生信息** —— DSH 原生统计栏本来就有的字段,只在完整模式出现。
104
+ - **插件信息** —— 信息栏新增的全部内容:服务商与模型、订阅、花费、余额、定价与额度,以及接管过来的上下文圆环。简洁模式与完整模式都显示。
105
+ - **提醒信息** —— 更新与失败短标记,以及「刷新失败」这类一次性提醒。两种模式都显示,每条单独开关。
106
+
107
+ 上下文圆环固定在主行最右端,而主行正是简洁模式保留的那一行,所以两种模式下它都在。
105
108
 
106
109
  ![原生信息字段](assets/settings-native.zh-CN.webp)
107
110
  ![插件信息字段](assets/settings-plugin.zh-CN.webp)
@@ -164,7 +167,16 @@ cd dsh-bottom-info-bar
164
167
 
165
168
  ## 更新
166
169
 
167
- 插件在 DSH 启动时检查一次 npm 上的新版本,之后最多每 15 分钟复查一次。有新版时,信息栏出现红色**新版本提醒**标签:点击即可复制更新命令,到终端执行后重启 `dsh web`。
170
+ 插件会自己检查更新:启动时查一次 npm,之后最多每 15 分钟复查一次。更新方式在插件设置页的**版本与更新**里二选一:
171
+
172
+ - **全自动更新**(默认):发现新版本就自动下载、校验、替换好,你只需要重启一次 DSH 就生效。
173
+ - **手动更新**:只检查、不下载,你点「检查更新」时才执行。
174
+
175
+ 替换前先校验文件完整性,任何一步没过就整批回滚,不会把正在用的版本弄坏;设置页里也随时可以点「回滚到上一版」。整个过程只改插件自己的文件,不碰依赖树,也不改 profile 的清单。
176
+
177
+ 需要你动手时,信息栏会出现两枚短标记:**重启生效**(新版已装好,等重启)和**更新失败**(上次自动更新没成功)。两枚标记各自可以在「提醒信息」里关掉,平时不占位。
178
+
179
+ 自更新只在插件被正常装进 profile 时启用(npm、GitHub 地址、一键脚本三种安装方式都算)。如果你用的是本仓库的源码副本或 `link:` 安装,插件会把它当成只读副本、不去改动,这时按下面的方式手动更新:
168
180
 
169
181
  | 安装方式 | 命令 |
170
182
  |---|---|
@@ -172,7 +184,7 @@ cd dsh-bottom-info-bar
172
184
  | GitHub 地址 | `dsh plugin --profile <profile> add <同一个地址>` |
173
185
  | 本地代码或一键脚本 | `git -C <仓库> fetch origin && git -C <仓库> checkout main && git -C <仓库> merge --ff-only origin/main && node <仓库>/scripts/build.mjs` |
174
186
 
175
- 插件绝不自动更新——它只负责告诉你「有新版本」。
187
+ 首次升级到 v1.19.0(或更早版本升上来)时,自更新这套流程还没装在你机器上,所以那一次仍要按上表手动更新;之后的版本就不用再管了。
176
188
 
177
189
  ## 隐私与安全
178
190
 
package/docs/INSTALL.md CHANGED
@@ -82,7 +82,14 @@ dsh --profile web --dump-config | grep -A2 dsh-bottom-info-bar
82
82
 
83
83
  ## 更新版本
84
84
 
85
- **最省事的方式:点信息栏上的红色「新版本提醒」标签**,更新命令会复制到剪贴板,粘到终端执行即可(见下一节)。命令会按你的安装方式自动给出,不用自己判断。
85
+ 插件会自己检查更新:启动时查一次 npm,之后最多每 15 分钟复查一次。处理方式在插件设置页的**版本与更新**里二选一:
86
+
87
+ - **全自动更新**(默认):自动下载 → 校验 → 替换插件自己的文件,然后你重启一次 DSH 就生效。
88
+ - **手动更新**:只检查、不下载;点「检查更新」按钮才执行。
89
+
90
+ 替换前会校验文件完整性,任何一步失败都整批回滚,不会破坏正在运行的那一份;设置页里另有「回滚到上一版」。整个过程只改插件包内文件,不动 profile 的 `package.json` / `pnpm-lock.yaml`,也不碰依赖树。
91
+
92
+ **前提**:自更新只在插件被当作 profile 插件装载时启用(npm、GitHub 地址、一键脚本三种安装方式都算)。源码副本与 `link:` 安装按只读处理,插件不会去改那份代码,需要按下面的方式手动更新。
86
93
 
87
94
  手动更新时,按当初的安装方式二选一:
88
95
 
@@ -90,14 +97,14 @@ dsh --profile web --dump-config | grep -A2 dsh-bottom-info-bar
90
97
 
91
98
  ```bash
92
99
  dsh plugin --profile web add dsh-bottom-info-bar@latest
93
- # 重启 dsh web
100
+ # 重启 DSH
94
101
  ```
95
102
 
96
103
  如果最初填的是 GitHub 地址(方式二),更新就是再执行一次同样的命令:
97
104
 
98
105
  ```bash
99
106
  dsh plugin --profile web add https://github.com/songoao25/dsh-bottom-info-bar
100
- # 重启 dsh web
107
+ # 重启 DSH
101
108
  ```
102
109
 
103
110
  如果最初使用本地代码 / symlink 安装(方式三、方式四),要**三步一起做**:拉代码 → 切到默认分支 → 重新构建:
@@ -106,7 +113,7 @@ dsh plugin --profile web add https://github.com/songoao25/dsh-bottom-info-bar
106
113
  cd dsh-bottom-info-bar
107
114
  git fetch origin && git checkout main && git merge --ff-only origin/main
108
115
  node scripts/build.mjs
109
- # 重启 dsh web
116
+ # 重启 DSH
110
117
  ```
111
118
 
112
119
  - **别只用 `git pull`**:分支没推到远端时它会直接失败(`no such ref was fetched`)——开发分支就是这种状态;而且 `link:` 安装加载的是构建产物 `lib/`,本地副本可能改过 `src/` 却没重建,只拉代码不重建,重启后跑的还是旧代码。
@@ -115,19 +122,22 @@ node scripts/build.mjs
115
122
 
116
123
  本地 symlink 安装**不会**被 NPM 更新命令替换;想迁移到 NPM,先移除旧安装,再执行 NPM 安装命令。
117
124
 
118
- > 无论哪种方式,**更新后都必须重启 `dsh web`** 才会生效。红色提醒标签消失得更早:悬浮提示里的版本号读的是磁盘上已安装的那一份,刷新页面就会更新。
125
+ > 无论哪种方式,**更新后都必须重启 DSH** 才会生效。
126
+
127
+ 首次升级到 v1.19.0 时自更新还没装在机器上(这套流程本身就在 v1.19.0 里),所以那一次仍需按上表手动更新;之后的版本不必再管。
128
+
129
+ ## 信息栏出现「重启生效」/「更新失败」怎么办
119
130
 
120
- ## 看到红色版本提醒怎么办
131
+ 这两枚短标记只作提示,**不需要点击**(插件没有打开设置页的能力,点它不会有反应):
121
132
 
122
- 信息栏出现红色的「新版本提醒」标签时,**直接点击该标签**即可把更新命令复制到剪贴板;粘到终端执行,然后重启 `dsh web`。
133
+ - **重启生效**:新版已经下载并替换到磁盘,内存里跑的还是旧代码。重启 DSH 即可,标记随之消失。
134
+ - **更新失败**:上次自动更新没成功(网络、校验或写入失败)。插件不会破坏现有安装,失败会自动回滚。到设置页的**版本与更新**里点「检查更新」重试;反复失败时按上一节手动更新一次。
123
135
 
124
- - 标签悬浮提示里同时给出了另一条路径:把更新交给有本机终端权限的 Agent 处理。
125
- - 复制出来的命令与你的安装方式匹配(npm 装 → `dsh plugin … add …@latest`;GitHub 地址装 → 同一条地址重装;`link:` 装 → `git fetch` + 切默认分支 + `--ff-only` 快进 + 重建 `lib`),所以**不存在"用错命令把本地代码顶掉"的风险**。
126
- - **插件不会自动更新自己**:它只负责提示,并准备好命令;机器上的一切改动都由你运行命令后才发生。
136
+ 两枚标记各自在设置页的**提醒信息**分组里有开关,不想要可以单独关掉;它们与「简洁 / 完整」模式无关,两种模式下都一样受开关控制。
127
137
 
128
- 如果想让 Agent 代劳,可以把下面这句话发给它:
138
+ 如果想让 Agent 代劳排查,可以把下面这句话发给它:
129
139
 
130
- > 我的 DSH 底部信息栏提示有新版本,请帮我安全更新到新版。请先判断当前是 NPM 安装还是本地 Git 安装;不要删除 `~/.dsh/dsh-bottom-info-bar/usage-records.json`,不要覆盖未提交代码,更新后提醒我重启 `dsh web`。
140
+ > 我的 DSH 底部信息栏显示「更新失败」,请帮我看看 `~/.dsh/dsh-bottom-info-bar/update-log.jsonl` 里的失败原因,再判断是重试还是手动更新。不要删除 `~/.dsh/dsh-bottom-info-bar/usage-records.json`,不要覆盖未提交代码,更新后提醒我重启 DSH。
131
141
 
132
142
  普通网页聊天如果没有本机终端权限,不能直接完成更新;Agent 仍应在执行删除、覆盖或迁移安装前先征得用户确认。
133
143
 
package/lib/client.js CHANGED
@@ -59,7 +59,7 @@ const BIB_SET_NATIVE_MENU = bibSetNative('Menu');
59
59
  // 与上面同一条铁律:取不到时退回插件内等价实现,绝不把 undefined 交给 React.createElement。
60
60
  const BIB_SET_NATIVE_RISK_CONFIRM = bibSetNative('RiskConfirmation');
61
61
  const LOCALE_NAMESPACE = 'dsh-bottom-info-bar';
62
- const LOCALES = {"zh":{"meta.title":"底部信息栏","meta.description":"在输入框下方显示当前模型、余额和花费。","ui.requestTimedOut":"请求超时","ui.requestCanceled":"请求已取消","ui.couldNotParseResponse":"响应解析失败","ui.rpcFailed":"RPC 失败","ui.refreshFailed":"刷新失败","color.red":"红","color.green":"绿","color.blue":"蓝","color.purple":"紫","color.orange":"橙","color.neutral":"中性","mode.balance":"余额制","mode.subscription":"订阅制","mode.billing":"账单制","mode.native":"原生统计行","mode.common":"通用","ui.nativeStatsField":"原生统计行字段","ui.shownIn":"出现于","ui.pleaseTryAgainLater":"请稍后再试","ui.restoreDefaultColor":"恢复默认颜色","ui.infoBarSettings":"信息栏","ui.settingsAreTemporarilyUnavailable":"暂时无法读取设置","ui.loadingInfoBarSettings":"正在加载设置…","ui.couldNotLoadInfoBar":"无法读取信息栏设置:","ui.changesAppliedButCouldNot":"已应用,但无法保存到本地:","ui.unknownReason":"未知原因","ui.couldNotSave":"{errorPrefix}保存失败:{value}","ui.color":"“{value}”颜色:","ui.hasAnInvalidColorEnter":"“{value}”的颜色格式不正确,请输入 #RRGGBB(例如 #0044CC)。","ui.defaultColorsRestored":"已恢复默认颜色","ui.defaultLabelsRestored":"已恢复默认显示设置","ui.couldNotReset":"重置失败:{value}","ui.identifiesTheProviderAndModel":"显示当前会话使用的服务商和模型。","ui.show":"显示{label}","ui.clickToHide":"点击隐藏","ui.clickToShow":"点击显示","ui.presetColor":"{label}的预设颜色","ui.customColor":"{label}的自定义颜色","ui.customColorOpenColorPicker":"自定义颜色(打开系统取色器)","ui.customColorItem":"自定义…","ui.colorSwatchLabel":"{label}的颜色","ui.hexColor":"{label}的十六进制颜色","ui.expand":"展开","ui.collapse":"收起","ui.saving":"正在保存…","ui.processing":"正在处理…","ui.visibleFields":"要显示的信息","ui.timeDateTitle":"时间与日期","ui.timeDateDesc":"主时间和世界时间的时区与显示格式。","ui.customTextSectionDesc":"显示在信息栏中。","ui.resetConfirmTitle":"重置信息栏设置","ui.resetConfirmDescFields":"将恢复所有显示项;自定义颜色不受影响,改动会直接生效。","ui.resetConfirmDescColors":"将清除全部自定义颜色并恢复默认配色,字段显示开关不受影响。该操作会直接应用到信息栏。","ui.resetConfirmAcknowledge":"我了解这次重置不可撤销","ui.resetConfirmCancel":"取消","ui.resetConfirmConfirm":"确认重置","ui.resetLabels":"恢复显示","ui.resetColors":"恢复颜色","ui.resetRowTitle":"恢复默认","ui.resetRowDesc":"恢复显示项或颜色。","ui.customTextCount":"已输入 {value}/64 个字符","ui.couldNotDisplayInfoBar":"无法显示信息栏设置:{value}","ui.dataAndBilling":"账单数据","ui.dataAndBillingDesc":"导出或清除记录。","ui.exportBillingRecords":"导出账单","ui.exportBillingRecordsDesc":"导出为 CSV 或 JSON。","ui.exportBillingCsv":"导出 CSV","ui.exportBillingJson":"导出 JSON","ui.clearBillingRecords":"清除账单","ui.clearBillingRecordsDesc":"清除后无法恢复。","ui.clearBillingRecordsConfirm":"确定清除本插件保存的全部账单记录吗?建议先导出。清除后无法恢复,但不会影响设置或登录信息。","ui.exportedBillingRecords":"已导出 {count} 条账单记录({format})","ui.noBillingRecordsToExport":"目前没有可导出的账单记录。","ui.exportFailed":"导出失败:{value}","ui.exportIncomplete":"历史账单读取不完整:{value}。本次未导出,请稍后再试。","ui.clearFailed":"清除失败:{value}","ui.clearFailedWithoutDetails":"账单记录未能全部清除","ui.clearedBillingRecords":"已清除 {count} 条账单记录","ui.clearCanceled":"已取消","ui.exportNotSupported":"当前环境不支持下载文件。","ui.infoBar":"信息栏","ui.weekly":"周","ui.monthly":"月","ui.window":"窗口","ui.quotaDisplayUsed":"已用","ui.quotaDisplayRemaining":"剩余","ui.quotaDisplayModeTitle":"订阅窗口百分比方向","ui.quotaDisplayModeDesc":"订阅额度窗口按剩余或已用显示;告警阈值始终按剩余 20% 判定。","ui.windowUsedRemaining":"{label}窗口:已用 {usedPercent}%(剩余 {value}%)","ui.windowUsedRemainingResets":"{label}窗口 已用 {usedPercent}%(剩余 {value}%) · 重置 {value4}","ui.minimax":"MiniMax","ui.supportsImageInput":"支持图像输入。","ui.vision":"视觉","ui.unknown":"未知","ui.unknownModel":"未知模型","ui.modelSelectionPending":"正在读取当前模型","ui.modelCapabilityPending":"正在确认是否支持图像输入","ui.pluginVersion":"\n插件版本:{current}","ui.provider":"服务商:{provLabel} {modelLabel}\n","ui.pricingPeakOffPeakBeijing":"定价:峰谷价(工作日高峰 9-12、14-18 点;周末全天空闲)","ui.pricingFixed":"定价:固定价","ui.pricingNotListedUsingDefaults":"定价:暂未收录,不计算花费","ui.zhipu":"智谱","ui.xiaomiMiMo":"小米 MiMo","ui.commandCode":"Command Code","ui.subscription":"订阅","ui.cloudBilling":"云账单","ui.plan":"\n套餐:{plan}","ui.expiresLocalTime":"\n到期:{value}(本地时区)","ui.subscriptionServiceModel":"订阅服务:{serviceName}\n模型:{rawModelLabel}{planLine}{expiryLine}{versionLine}","ui.balanceLookupIsNotYet":"暂时无法读取该服务商的余额。","ui.notSupported":"未适配","ui.notConfigured":"未配置 ","ui.notConfiguredConfigureItIn":"未配置 {credName}。请在\"设置 → 模型\"中填写。","ui.notConfiguredSettingsModels":"未配置 {credName}。请在设置 → 模型中填写。","ui.estimatedBalance":"估算余额:{symbol}{value}","ui.balance":"余额:{symbol}{value}","ui.balance.pushBalanceGroups":"余额","ui.low":"低","ui.estimated":"(估算)","ui.balanceIsTemporarilyUnavailableShowing":"余额暂不可用;正在显示上次数据并自动重试。","ui.couldNotLoadBalanceCheck":"余额获取失败。请检查网络和 API Key。","ui.balanceUnavailable":"余额获取失败","ui.beijingTime":"北京时间 ","ui.peakPrice":"高峰价","ui.offPeakPrice":"空闲价","ui.input":":输入 ¥","ui.mCachedInput":"/M · 缓存 ¥","ui.mOutput":"/M · 输出 ¥","ui.beijingTimeSwitchesTo":"北京时间 {atLabel} 切换为","ui.until":"距","ui.offPeak":"空闲","ui.peak":"高峰","ui.today":"今天 {symbol}{value}","ui.lastDays":"近一月 {symbol}{value}","ui.allTime":"全部 {symbol}{value}","ui.sessionIncludingSubagents":"本会话 {costTxt}(含子代理){value}","ui.session":"本会话","ui.spendIsTemporarilyUnavailableChat":"花费暂不可用;不会影响对话。","ui.spendUnavailable":"花费获取失败","ui.noSignInCredentialsFound":"未找到 {serviceName} 登录凭证。请重新授权。","ui.credentialsHaveExpiredPleaseReauthorize":"{serviceName} 登录凭证已失效。请重新授权。","ui.deniedAccessReauthorizeOrTry":"{serviceName} 拒绝访问。请重新授权或稍后再试。","ui.rateLimitReachedPleaseTry":"{serviceName} 请求过于频繁。请稍后再试。","ui.timedOutCheckYourConnection":"{serviceName} 响应超时。请检查网络后再试。","ui.returnedAnUnrecognizedResponsePlease":"{serviceName} 返回的数据暂时无法识别。请稍后再试。","ui.isTemporarilyUnavailableCheckYour":"{serviceName} 暂不可用。请检查网络后再试。","ui.subscriptionExpiresLocalTime":"订阅到期:{value}(本地时区)","ui.expires":"到期","ui.subscriptionSource":"订阅源:{value}(","ui.prepaidBalance":"可用余额","ui.availableBalanceLabel":"可用余额","ui.remainingCredits":"剩余额度","ui.availableBalance":"可用余额:{balTxt}","ui.availableCredits":"剩余 credits:{value}","ui.credits":"积分","ui.subscriptionSource.titleLines":"订阅源:{value}","ui.windowRemainingUsed":"{label}窗口:剩余 {value}%(已用 {usedPercent}%)","ui.resetsResetsIn":" · 重置 {value} · 距重置 {value2}","ui.windowRemainingUsedResets":"{label}窗口 剩余 {value}%(已用 {usedPercent}%) · 重置 {value4}","ui.resetsIn":"距重置","ui.configureItInSettingsModels":"。请在\"设置 → 模型\"中填写。","ui.deniedAccessTheTokenMay":"{serviceName} 拒绝访问:Token 可能缺少账单读取权限。","ui.billingIsTemporarilyUnavailableCheck":"{serviceName} 账单暂不可用。请检查网络与权限后再试。","ui.billingSource":"账单源:{value}","ui.thisMonthSSpend":"本月花费:{symbol}{value}","ui.budgetUsed":"预算使用:{value}%","ui.dailyFreeQuotaRemaining":"每日免费额度剩余:{value}","ui.thisMonth":"本月","ui.thisMonthSUsage":"本月用量","ui.budget":"预算","ui.free":"免费","ui.resetsIn.pushBillingGroups":"{value} · 距重置 {value2}","ui.billingServiceModel":"账单服务:{serviceName}\n模型:{modelLabel}{versionLine}","ui.pricing":"定价","ui.spend":"花费","ui.mode":"模式","ui.subscriptionQuota":"订阅额度","ui.billing":"账单","ui.temporarilyUnavailableKeepingTheLast":"暂不可用;正在保留上次数据并自动重试。","ui.spendJournalSavedButThe":"账单流水已保存,但可直接查看的账单文件暂未更新:","ui.thisSpendRecordWasNot":"本次账单未保存,不会计入金额:","ui.ledgerUpdatePending":"账单待整理","ui.spendNotSaved":"账单未保存","ui.askYourAgentToUpdate":"发现插件新版本 {latest}。桌面端更新请在插件管理中完成。","ui.updateAvailable":"新版本提醒","ui.updateCommandCopied":"更新命令已复制","ui.versionAndUpdateTitle":"版本与更新","ui.versionAndUpdateDesc":"插件会自己把新版本替换到本机,重启 DSH 后生效。更新只替换插件自己的文件,账单记录与设置不受影响。","ui.versionRunning":"运行中版本 {version}","ui.versionLatest":"最新版本 {version}","ui.versionUnknown":"未知","ui.autoUpdateTitle":"更新方式","ui.autoUpdateDesc":"选「全自动更新」:启动后自动检查并下载新版本,重启 DSH 后生效。选「手动更新」:只检查,不下载,你点「检查更新」时才执行。","ui.updateModeAuto":"全自动更新","ui.updateModeManual":"手动更新","ui.autoUpdateOn":"已开启","ui.autoUpdateOff":"已关闭","ui.updateCheckNow":"检查更新","ui.updateChecking":"检查中…","ui.updateRetrying":"重试","ui.updateUpToDate":"已是最新版本。","ui.updateDisabled":"当前环境不支持自动更新(仅在插件被装载进 profile 时启用)。","ui.updatePendingRestart":"已更新到 {version},重启 DSH 后生效。","ui.updateInProgress":"发现新版本 {version},正在自动更新…","ui.updateAutoOffPending":"有新版本 {version},当前是手动更新方式。","ui.updateFailed":"上次自动更新失败:{error}","ui.updateRollback":"回滚到上一版","ui.updateRolledBack":"已回滚到上一版 {version}。","ui.updateHeld":"新版 {version} 已被你暂缓,不会自动装回来。","ui.updateAllowHeld":"允许更新到 {version}","ui.updateRestartBadge":"重启生效","ui.updateFailedBadge":"更新失败","ui.tools":"工具调用","ui.avgTTFT":"首 token 平均","ui.cacheHit":"缓存命中","ui.input.BottomInfoBar":"输入","ui.output":"输出","ui.savingView":"正在保存切换…","ui.clickToSwitchFullCompact":"单击切换 完整/简洁","ui.pressEnterOrSpaceFor":"按 Enter 或空格切换为简洁模式。","ui.pressEnterOrSpaceFor.BottomInfoBar":"按 Enter 或空格切换为完整模式。","host.hour":"5 小时","host.unknownProvider":"未知服务商","error.subscription.request-failed":"订阅额度请求未知异常","host.settingsFileCouldNotBe":"设置文件写入未完成","host.everydayQuestions":"日常问答","host.mediumCodingTask":"中等编码任务","host.longDocumentAnalysisCodeReview":"长文档分析/代码审查","host.largeProjectRefactorAcrossMultiple":"大工程重构(多轮)","host.subagentWorkflow":"子代理工作流","error.settings.save-failed":"settings.json 落盘失败:{value}","error.balance.credentials":"凭据读取失败","error.balance.not-configured":"未配置 {credential}","error.request.http":"请求失败(HTTP {status})","error.request.parse":"响应格式异常","error.subscription.not-connected":"未找到 ChatGPT 订阅登录凭证(~/.codex/auth.json),请安装 dsh-chatgpt-subscription 插件绑定","error.subscription.credentials-missing":"ChatGPT 订阅登录凭证缺少 id_token,请安装 dsh-chatgpt-subscription 插件重新绑定","error.subscription.opencode-not-configured":"未配置 OpenCode Go(OPENCODE_GO_API_KEY 或 opencode auth.json)","error.subscription.commandcode-not-configured":"未配置 Command Code(COMMAND_CODE_API_KEY、CMD_API_KEY 或 ~/.commandcode/auth.json)","error.subscription.commandcode-auth-failed":"Command Code 登录凭证已失效。请重新登录或更新 API Key","error.subscription.commandcode-unrecognized":"Command Code 返回了无法识别的额度格式(接口可能已变更),已保留上次数据","host.zhipu":"智谱 {mapped}","host.zhipu.parseZaiQuota":"智谱 {value}{value2}","error.subscription.zhipu-not-configured":"未配置智谱 API Key(ZAI_API_KEY 或 ZAI_CODING_CN_API_KEY)","error.subscription.zhipu-auth-failed":"智谱 API 认证失败(密钥过期或不正确)","error.subscription.zhipu-unrecognized":"智谱返回了无法识别的额度格式(接口可能已变更),已保留上次数据","error.request.failed":"请求失败({value} {msg})","error.subscription.xiaomi-not-configured":"未配置小米 MiMo Token Plan 凭据({credName} 或 XIAOMI_API_KEY)","error.subscription.xiaomi-http":"请求失败(HTTP {value})","error.subscription.minimax-not-configured":"未配置 MiniMax 凭据(MINIMAX_API_KEY 或 MINIMAX_CN_API_KEY)。查询 Token Plan 必须使用 Subscription Key,按量 API Key 会被服务端拒绝","error.subscription.minimax-auth-failed":"MiniMax 拒绝了当前 API Key:查询 Token Plan 必须使用 Subscription Key(在 Token Plan 订阅页生成),按量 API Key 会被服务端拒绝(status_code=1004 / HTTP 401)","error.subscription.minimax-unrecognized":"MiniMax 返回了无法识别的额度格式(接口可能已变更),已保留上次数据","error.billing.together-not-configured":"未配置 TOGETHER_API_KEY","host.actualMonthlyBillFromThe":"本月真实账单(Together 官方 Usage API)","error.billing.fireworks-not-configured":"未配置 FIREWORKS_API_KEY","error.billing.fireworks-account":"账户解析失败(未取得 account_id)","host.actualBillForThisPeriod":"本周期真实账单(Fireworks Billing Summary)","host.actualUsageForThisPeriod":"本周期真实用量(billingUsage 回退端点,无金额)","error.billing.aws-not-configured":"未配置 AWS 凭据(AWS_ACCESS_KEY_ID / AWS_SECRET_ACCESS_KEY)","error.billing.aws-http":"请求失败(HTTP {status}),可能缺少 ce:GetCostAndUsage 权限","host.actualMonthlyBillFromAWS":"AWS Cost Explorer 本月真实账单(账单延迟约 24 小时)","error.billing.cloudflare-not-configured":"未配置 CLOUDFLARE_API_KEY(需账号级 Token 并授予 Billing 读权限)","error.billing.cloudflare-account":"未配置 CLOUDFLARE_ACCOUNT_ID","error.billing.cloudflare-http":"请求失败(HTTP {status}),Token 需 Billing 读权限","host.actualMonthlyUsageFromThe":"Cloudflare Billable Usage API(Alpha),本月真实用量","error.billing.request-failed":"账单请求未知异常","host.spendSummaryFileMissingArchived":"账单汇总文件缺失:折叠期间的历史金额暂未计入显示(明细仍在冷归档 usage-archive/,可人工恢复)","host.spendLedgerCouldNotBe":"账单文件写入未完成","host.usageLedgerBusy":"当前仍有回答正在进行,完成后再清除账单记录","error.ledger.clear-failed":"账单记录清理未完成:{value}","error.ledger.snapshot-stale":"折叠汇总落盘失败:{value}","host.basedOnYourLastSessions":"基于你最近 {count} 次会话","host.estimatedFromSpendingOverThe":"基于过去 {SPEND_DAYS} 天消耗速度的估算","host.yourTypicalSession":"你的典型会话","host.patchMustIncludeFieldsOr":"patch 需包含 fields、colors、timeFormat、timeZones 或 customText 之一","host.timeFormatMustBeAnObject":"timeFormat 必须是对象","host.timeFieldMustBeABoolean":"时间格式字段必须是布尔值: {key}","host.timeZonesMustBeAnObject":"timeZones 必须是对象","host.timeZoneMustBeAValid":"时区必须是有效的 IANA 时区: {key}","host.customTextMustBeAString":"自定义文本必须是字符串","host.customTextTooLong":"自定义文本不能超过64字符","host.quotaDisplayModeInvalid":"订阅窗口百分比方向必须是 used 或 remaining","host.infoDensityMustBeFullOrCompact":"信息显示方式必须是完整或简洁","host.fieldsMustBeAnObject":"fields 必须是对象","host.unknownFieldId":"未知字段 id: {key}","host.fieldVisibilityMustBeA":"字段开关必须是布尔值: {key}","host.colorsMustBeAnObject":"colors 必须是对象","host.colorMustBeAPreset":"颜色只接受预设色名或 #RRGGBB: {key}","field.anchorGroup.label":"服务商与模型","field.anchorGroup.note":"显示当前会话使用的服务商和模型。","field.subServiceGroup.label":"订阅服务与模型","field.subServiceGroup.note":"显示订阅服务和当前模型或套餐。","field.billingServiceGroup.label":"账单服务与模型","field.billingServiceGroup.note":"显示账单服务和当前模型。","field.customText.label":"自定义文字","field.customText.note":"显示一段自定义文字,可用作备注或签名。","field.mainTime.label":"主时间","field.mainTime.note":"显示主时区的时间;时区与格式在「时间与日期」中调整。","field.worldTime.label":"世界时间","field.worldTime.note":"显示另一时区的时间;格式与主时间相同。","field.sessionCost.label":"本次会话花费","field.sessionCost.note":"显示本次会话的实际花费,包含子代理。","field.balance.note":"显示账户余额;余额过低时会标红。","field.period.label":"当前时段","field.period.note":"显示当前是高峰还是空闲时段。","field.countdown.label":"下次价格切换","field.countdown.note":"显示距离下次价格切换还有多久。","field.expiry.label":"订阅到期日","field.expiry.note":"服务商提供到期时间时显示。","field.subWindow5h.label":"5 小时额度","field.subWindow5h.note":"显示滚动 5 小时额度的剩余比例。","field.subWindowWeek.label":"每周额度","field.subWindowWeek.note":"显示每周额度的剩余比例。","field.subWindowMonth.label":"每月额度","field.subWindowMonth.note":"显示每月额度的剩余比例。","field.resetCountdown.label":"距额度重置","field.resetCountdown.note":"显示当前额度何时重置。","field.subBalance.label":"可用余额或剩余额度","field.subBalance.note":"按量账户显示可用余额;没有额度窗口的 credits 订阅显示剩余额度。","field.billingSpend.label":"本月用量","field.billingSpend.note":"显示本计费周期的实际用量或花费。","field.budget.label":"预算使用情况","field.budget.note":"服务商支持时显示已使用的预算比例。","field.freeQuota.label":"免费额度","field.freeQuota.note":"服务商明确提供时显示免费额度和重置时间。","field.turnsSteps.label":"轮次与步数","field.turnsSteps.note":"显示对话的轮次和步数,只在完整模式出现。","field.llmTime.label":"模型耗时","field.llmTime.note":"显示模型推理耗时,只在完整模式出现。","field.toolTime.label":"工具耗时","field.toolTime.note":"显示工具调用耗时,只在完整模式出现。","field.cacheHit.note":"显示提示词缓存命中率,只在完整模式出现。","field.tokensIO.label":"输入/输出 Token","field.tokensIO.note":"显示本次会话的输入和输出用量,只在完整模式出现。","field.contextUsage.label":"上下文用量","field.contextUsage.note":"显示上下文占用情况,只在完整模式出现。","ui.contextAria":"上下文已用 {percent}","ui.contextUsed":"上下文已用","ui.contextSystem":"系统提示词","ui.contextTools":"工具定义","ui.contextMessages":"对话消息","ui.contextFigures":"~{used} / {window}","number.thousand":"{value}K","number.million":"{value}M","field.unmapped.label":"暂不支持提示","field.unmapped.note":"当前服务商暂不支持余额查询时显示。","field.noKeyHint.label":"缺少密钥提示","field.noKeyHint.note":"缺少 API Key 时显示设置提示。","field.balanceError.label":"余额更新失败提示","field.balanceError.note":"余额更新失败时显示。","field.usageError.label":"用量更新失败提示","field.usageError.note":"花费暂时不可用时显示。","field.refreshFailure.label":"更新失败提示","field.refreshFailure.note":"任一数据更新失败时显示提醒。","field.persistWarning.label":"记录未保存提醒","field.persistWarning.note":"账单保存失败时显示提醒,建议保留。","field.updateNotice.label":"更新提醒","field.updateNotice.note":"有新版本可下载、或新版已下载待重启时显示短标记。","field.updateFailure.label":"更新失败提醒","field.updateFailure.note":"自动更新失败时显示短标记。","group.native":"原生信息","group.plugin":"插件信息","group.notice":"提醒信息","group.native.desc":"DeepSeek 原生底栏原有的字段,只在完整模式显示。开关只决定开和关,与模式不冲突。","group.plugin.desc":"本插件新增的字段,简洁模式与完整模式都会显示。","group.notice.desc":"更新、失败等一次性提醒。可整组关掉,不影响上面的信息显示。","ui.listSeparator":"、","ui.sentenceEnd":"。","ui.fieldErrorPrefix":"「{label}」:","ui.turnCount":"{count} 轮","ui.turnCountPlural":"{count} 轮","ui.stepCount":"{count} 步","ui.stepCountPlural":"{count} 步","ui.mainTimeZone":"主时间时区","ui.worldTimeZone":"世界时间时区","ui.timeFormat":"时间格式","ui.year":"年","ui.month":"月","ui.day":"日","ui.hour":"时","ui.minute":"分","ui.second":"秒","ui.customTextTitle":"自定义文本","ui.customTextPlaceholder":"输入文字(最多 64 个字符)","ui.searchPlaceholder":"搜索内容…","ui.searchFieldsLabel":"搜索显示内容","ui.searchResultCount":"找到 {count} 项","ui.enabledFieldsCount":"已启用 {count} 项","ui.noSearchResults":"没有找到匹配内容","ui.timePreview":"预览:","ui.mainTime":"主时间","ui.worldTime":"世界时间","ui.customText":"自定义文本"},"en":{"meta.title":"Bottom Info Bar","meta.description":"Shows the current model, balance and spend under the composer.","ui.requestTimedOut":"Request timed out","ui.requestCanceled":"Request canceled","ui.couldNotParseResponse":"Could not parse response","ui.rpcFailed":"RPC failed","ui.refreshFailed":"Refresh failed","color.red":"Red","color.green":"Green","color.blue":"Blue","color.purple":"Purple","color.orange":"Orange","color.neutral":"Neutral","mode.balance":"Balance","mode.subscription":"Subscription","mode.billing":"Billing","mode.native":"Native stats","mode.common":"General","ui.nativeStatsField":"Native stats field","ui.shownIn":"Shown in: ","ui.pleaseTryAgainLater":"Please try again later","ui.restoreDefaultColor":"Restore default color","ui.infoBarSettings":"Info Bar","ui.settingsAreTemporarilyUnavailable":"Settings are temporarily unavailable","ui.loadingInfoBarSettings":"Loading settings…","ui.couldNotLoadInfoBar":"Could not load Info Bar settings: ","ui.changesAppliedButCouldNot":"Applied, but could not save locally: ","ui.unknownReason":"Unknown reason","ui.couldNotSave":"{errorPrefix}Could not save: {value}","ui.color":"\"{value}\" color: ","ui.hasAnInvalidColorEnter":"\"{value}\" has an invalid color. Enter #RRGGBB (for example, #0044CC).","ui.defaultColorsRestored":"Default colors restored","ui.defaultLabelsRestored":"Default display restored","ui.couldNotReset":"Could not reset: {value}","ui.identifiesTheProviderAndModel":"Shows the provider and model used in this conversation.","ui.show":"Show {label}","ui.clickToHide":"Click to hide","ui.clickToShow":"Click to show","ui.presetColor":"{label} preset color","ui.customColor":"{label} custom color","ui.customColorOpenColorPicker":"Custom color (open color picker)","ui.customColorItem":"Custom…","ui.colorSwatchLabel":"{label} color","ui.hexColor":"{label} hex color","ui.expand":"Expand","ui.collapse":"Collapse","ui.saving":"Saving…","ui.processing":"Working…","ui.visibleFields":"Information to show","ui.timeDateTitle":"Time and date","ui.timeDateDesc":"Time zones and display format for main and world time.","ui.customTextSectionDesc":"Shown in the Info Bar.","ui.resetConfirmTitle":"Reset Info Bar settings","ui.resetConfirmDescFields":"Restore all display choices. Custom colors are not affected and the change applies right away.","ui.resetConfirmDescColors":"All custom colors will be cleared and defaults restored. Field switches are not affected. This applies to the Info Bar right away.","ui.resetConfirmAcknowledge":"I understand this reset cannot be undone","ui.resetConfirmCancel":"Cancel","ui.resetConfirmConfirm":"Reset","ui.resetLabels":"Restore display","ui.resetColors":"Restore colors","ui.resetRowTitle":"Reset to defaults","ui.resetRowDesc":"Restore displayed items or colors.","ui.customTextCount":"{value}/64 characters","ui.couldNotDisplayInfoBar":"Could not display Info Bar settings: {value}","ui.dataAndBilling":"Billing data","ui.dataAndBillingDesc":"Export or clear records.","ui.exportBillingRecords":"Export billing","ui.exportBillingRecordsDesc":"Export as CSV or JSON.","ui.exportBillingCsv":"Export CSV","ui.exportBillingJson":"Export JSON","ui.clearBillingRecords":"Clear billing","ui.clearBillingRecordsDesc":"This cannot be undone.","ui.clearBillingRecordsConfirm":"Clear all billing records saved by this plugin? Export first. This cannot be undone, but settings and sign-in information will stay unchanged.","ui.exportedBillingRecords":"Exported {count} billing records ({format})","ui.noBillingRecordsToExport":"There are no billing records to export.","ui.exportFailed":"Export failed: {value}","ui.exportIncomplete":"Some historical billing records could not be read: {value}. Nothing was exported; try again later.","ui.clearFailed":"Could not clear billing records: {value}","ui.clearFailedWithoutDetails":"Billing records could not be fully cleared","ui.clearedBillingRecords":"Cleared {count} billing records","ui.clearCanceled":"Canceled","ui.exportNotSupported":"File downloads are not supported in this environment.","ui.infoBar":"Info Bar","ui.weekly":"Weekly","ui.monthly":"Monthly","ui.window":"Window","ui.quotaDisplayUsed":"Used","ui.quotaDisplayRemaining":"Remaining","ui.quotaDisplayModeTitle":"Subscription window percentage","ui.quotaDisplayModeDesc":"Show subscription quota windows as remaining or used. The warning threshold always follows the remaining 20% rule.","ui.windowUsedRemaining":"{label} window: used {usedPercent}% (remaining {value}%)","ui.windowUsedRemainingResets":"{label} window: used {usedPercent}% (remaining {value}%) · Resets {value4}","ui.minimax":"MiniMax","ui.supportsImageInput":"Supports image input.","ui.vision":"Vision","ui.unknown":"Unknown","ui.unknownModel":"Unknown model","ui.modelSelectionPending":"Reading current model","ui.modelCapabilityPending":"Checking image-input support","ui.pluginVersion":"\nPlugin version: {current}","ui.provider":"Provider: {provLabel} {modelLabel}\n","ui.pricingPeakOffPeakBeijing":"Pricing: peak/off-peak (Beijing time; weekday peaks 09:00-12:00 and 14:00-18:00; weekends off-peak)","ui.pricingFixed":"Pricing: fixed","ui.pricingNotListedUsingDefaults":"Pricing: not listed; spend is not calculated","ui.zhipu":"Zhipu","ui.xiaomiMiMo":"Xiaomi MiMo","ui.commandCode":"Command Code","ui.subscription":"Subscription","ui.cloudBilling":"Cloud billing","ui.plan":"\nPlan: {plan}","ui.expiresLocalTime":"\nExpires: {value} (local time)","ui.subscriptionServiceModel":"Subscription service: {serviceName}\nModel: {rawModelLabel}{planLine}{expiryLine}{versionLine}","ui.balanceLookupIsNotYet":"This provider's balance is not available yet.","ui.notSupported":"Not supported","ui.notConfigured":"Not configured: ","ui.notConfiguredConfigureItIn":"Not configured: {credName}. Configure it in Settings → Models.","ui.notConfiguredSettingsModels":"{credName} is not configured. Add it in Settings → Models.","ui.estimatedBalance":"Estimated balance: {symbol}{value}","ui.balance":"Balance: {symbol}{value}","ui.balance.pushBalanceGroups":"Balance","ui.low":"Low","ui.estimated":"(estimated)","ui.balanceIsTemporarilyUnavailableShowing":"Balance is temporarily unavailable. Showing the last data and retrying automatically.","ui.couldNotLoadBalanceCheck":"Could not load balance. Check your connection and API key.","ui.balanceUnavailable":"Balance unavailable","ui.beijingTime":"Beijing time: ","ui.peakPrice":"Peak price","ui.offPeakPrice":"Off-peak price","ui.input":": input ¥","ui.mCachedInput":"/M · cached input ¥","ui.mOutput":"/M · output ¥","ui.beijingTimeSwitchesTo":"Beijing time: {atLabel} switches to ","ui.until":"Until ","ui.offPeak":"off-peak","ui.peak":"peak","ui.today":"Today {symbol}{value}","ui.lastDays":"Last 30 days {symbol}{value}","ui.allTime":"All time {symbol}{value}","ui.sessionIncludingSubagents":"Session {costTxt} (including subagents){value}","ui.session":"Session","ui.spendIsTemporarilyUnavailableChat":"Spend is temporarily unavailable. Chat is unaffected.","ui.spendUnavailable":"Spend unavailable","ui.noSignInCredentialsFound":"No sign-in credentials found for {serviceName}. Please reauthorize.","ui.credentialsHaveExpiredPleaseReauthorize":"{serviceName} credentials have expired. Please reauthorize.","ui.deniedAccessReauthorizeOrTry":"{serviceName} denied access. Reauthorize or try again later.","ui.rateLimitReachedPleaseTry":"{serviceName} rate limit reached. Please try again later.","ui.timedOutCheckYourConnection":"{serviceName} timed out. Check your connection and try again.","ui.returnedAnUnrecognizedResponsePlease":"{serviceName} returned an unrecognized response. Please try again later.","ui.isTemporarilyUnavailableCheckYour":"{serviceName} is temporarily unavailable. Check your connection and try again.","ui.subscriptionExpiresLocalTime":"Subscription expires: {value} (local time)","ui.expires":"Expires","ui.subscriptionSource":"Subscription source: {value} (","ui.prepaidBalance":"Available balance","ui.availableBalanceLabel":"Available balance","ui.remainingCredits":"Credits remaining","ui.availableBalance":"Available balance: {balTxt}","ui.availableCredits":"Credits remaining: {value}","ui.credits":"credits","ui.subscriptionSource.titleLines":"Subscription source: {value}","ui.windowRemainingUsed":"{label} window: remaining {value}% (used {usedPercent}%)","ui.resetsResetsIn":" · Resets {value} · Resets in {value2}","ui.windowRemainingUsedResets":"{label} window: remaining {value}% (used {usedPercent}%) · Resets {value4}","ui.resetsIn":"Resets in","ui.configureItInSettingsModels":". Configure it in Settings → Models.","ui.deniedAccessTheTokenMay":"{serviceName} denied access: the token may lack billing read permissions.","ui.billingIsTemporarilyUnavailableCheck":"{serviceName} billing is temporarily unavailable. Check your connection and permissions, then try again.","ui.billingSource":"Billing source: {value}","ui.thisMonthSSpend":"This month’s spend: {symbol}{value}","ui.budgetUsed":"Budget used: {value}%","ui.dailyFreeQuotaRemaining":"Daily free quota remaining: {value}","ui.thisMonth":"This month","ui.thisMonthSUsage":"This month’s usage","ui.budget":"Budget","ui.free":"Free","ui.resetsIn.pushBillingGroups":"{value} · Resets in {value2}","ui.billingServiceModel":"Billing service: {serviceName}\nModel: {modelLabel}{versionLine}","ui.pricing":"Pricing","ui.spend":"Spend","ui.mode":"Mode","ui.subscriptionQuota":"Subscription quota","ui.billing":"Billing","ui.temporarilyUnavailableKeepingTheLast":": temporarily unavailable. Keeping the last data and retrying automatically.","ui.spendJournalSavedButThe":"Spend journal saved, but the readable ledger has not been updated: ","ui.thisSpendRecordWasNot":"This spend record was not saved and will not be added to totals: ","ui.ledgerUpdatePending":"Ledger update pending","ui.spendNotSaved":"Spend not saved","ui.askYourAgentToUpdate":"Plugin version {latest} is available. Update it from plugin management on desktop.","ui.updateAvailable":"Update available","ui.updateCommandCopied":"Update command copied","ui.versionAndUpdateTitle":"Version and updates","ui.versionAndUpdateDesc":"The plugin replaces its own files with a new version; restart DSH to activate. Only the plugin's own files change, so billing records and settings are untouched.","ui.versionRunning":"Running version {version}","ui.versionLatest":"Latest version {version}","ui.versionUnknown":"Unknown","ui.autoUpdateTitle":"Update method","ui.autoUpdateDesc":"Automatic: checks and downloads new versions on startup, then applies after you restart DSH. Manual: only checks, and downloads when you press Check now.","ui.updateModeAuto":"Automatic","ui.updateModeManual":"Manual","ui.autoUpdateOn":"On","ui.autoUpdateOff":"Off","ui.updateCheckNow":"Check now","ui.updateChecking":"Checking…","ui.updateRetrying":"Retry","ui.updateUpToDate":"Up to date.","ui.updateDisabled":"Automatic updates are unavailable here (only enabled when the plugin is loaded as a profile plugin).","ui.updatePendingRestart":"Updated to {version}. Restart DSH to activate.","ui.updateInProgress":"Version {version} found; updating automatically…","ui.updateAutoOffPending":"Version {version} is available. Updates are set to manual.","ui.updateFailed":"Last automatic update failed: {error}","ui.updateRollback":"Roll back to previous version","ui.updateRolledBack":"Rolled back to the previous version {version}.","ui.updateHeld":"Version {version} is held back and will not be installed automatically.","ui.updateAllowHeld":"Allow updating to {version}","ui.updateRestartBadge":"Restart to apply","ui.updateFailedBadge":"Update failed","ui.tools":"Tools","ui.avgTTFT":"Avg. TTFT","ui.cacheHit":"Cache hit","ui.input.BottomInfoBar":"Input","ui.output":"Output","ui.savingView":"Saving view…","ui.clickToSwitchFullCompact":"Click to switch full/compact view","ui.pressEnterOrSpaceFor":"Press Enter or Space for compact view.","ui.pressEnterOrSpaceFor.BottomInfoBar":"Press Enter or Space for full view.","host.hour":"5-hour","host.unknownProvider":"Unknown provider","error.subscription.request-failed":"Unexpected subscription quota request failure","host.settingsFileCouldNotBe":"Settings file could not be saved","host.everydayQuestions":"Everyday questions","host.mediumCodingTask":"Medium coding task","host.longDocumentAnalysisCodeReview":"Long document analysis / code review","host.largeProjectRefactorAcrossMultiple":"Large project refactor across multiple turns","host.subagentWorkflow":"Subagent workflow","error.settings.save-failed":"Could not save settings.json: {value}","error.balance.credentials":"Could not read credentials","error.balance.not-configured":"Not configured: {credential}","error.request.http":"Request failed: HTTP {status}.","error.request.parse":"Unexpected response format","error.subscription.not-connected":"ChatGPT subscription is not connected: credentials not found in ~/.codex/auth.json. Install dsh-chatgpt-subscription and sign in.","error.subscription.credentials-missing":"ChatGPT subscription credentials are missing id_token. Install dsh-chatgpt-subscription and reauthorize.","error.subscription.opencode-not-configured":"OpenCode Go is not configured. Set OPENCODE_GO_API_KEY or use opencode auth.json.","error.subscription.commandcode-not-configured":"Command Code is not configured. Set COMMAND_CODE_API_KEY, CMD_API_KEY, or sign in with the Command Code CLI.","error.subscription.commandcode-auth-failed":"Command Code credentials were rejected. Sign in again or update the API key.","error.subscription.commandcode-unrecognized":"Command Code returned an unrecognized quota format; the previous snapshot was kept.","host.zhipu":"Zhipu {mapped}","host.zhipu.parseZaiQuota":"Zhipu {value}{value2}","error.subscription.zhipu-not-configured":"Zhipu API key is not configured. Set ZAI_API_KEY or ZAI_CODING_CN_API_KEY.","error.subscription.zhipu-auth-failed":"Zhipu API authentication failed: the key is expired or invalid.","error.subscription.zhipu-unrecognized":"Zhipu returned an unrecognized quota format (the API may have changed); the last known data is kept.","error.request.failed":"Request failed: {value} {msg}.","error.subscription.xiaomi-not-configured":"Xiaomi MiMo Token Plan credentials are not configured: {credName} or XIAOMI_API_KEY.","error.subscription.xiaomi-http":"Request failed: HTTP {value}.","error.subscription.minimax-not-configured":"MiniMax is not configured. Set MINIMAX_API_KEY or MINIMAX_CN_API_KEY. Token Plan queries require a Subscription Key; pay-as-you-go API keys are rejected by the server.","error.subscription.minimax-auth-failed":"MiniMax rejected the API key: Token Plan queries require a Subscription Key (generated on the Token Plan subscription page). Pay-as-you-go keys are rejected (status_code=1004 / HTTP 401).","error.subscription.minimax-unrecognized":"MiniMax returned an unrecognized quota format (the API may have changed); the last known data is kept.","error.billing.together-not-configured":"Not configured: TOGETHER_API_KEY","host.actualMonthlyBillFromThe":"Actual monthly bill from the Together Usage API","error.billing.fireworks-not-configured":"Not configured: FIREWORKS_API_KEY","error.billing.fireworks-account":"Could not read account (account_id missing)","host.actualBillForThisPeriod":"Actual bill for this period (Fireworks Billing Summary)","host.actualUsageForThisPeriod":"Actual usage for this period (billingUsage fallback; no spend amount)","error.billing.aws-not-configured":"Not configured: AWS credentials (AWS_ACCESS_KEY_ID / AWS_SECRET_ACCESS_KEY)","error.billing.aws-http":"Request failed: HTTP {status}. The token may lack ce:GetCostAndUsage permission","host.actualMonthlyBillFromAWS":"Actual monthly bill from AWS Cost Explorer (about 24 hours behind)","error.billing.cloudflare-not-configured":"Not configured: CLOUDFLARE_API_KEY (requires an account-level token with Billing read permission)","error.billing.cloudflare-account":"Not configured: CLOUDFLARE_ACCOUNT_ID","error.billing.cloudflare-http":"Request failed: HTTP {status}. The token requires Billing read permission","host.actualMonthlyUsageFromThe":"Actual monthly usage from the Cloudflare Billable Usage API (Alpha)","error.billing.request-failed":"Unexpected billing request failure","host.spendSummaryFileMissingArchived":"Spend summary file missing: archived amounts are not included in displayed totals. Details remain in usage-archive/ for manual recovery.","host.spendLedgerCouldNotBe":"Spend ledger could not be saved","host.usageLedgerBusy":"A response is still in progress. Clear billing records after it finishes.","error.ledger.clear-failed":"Billing records could not be fully cleared: {value}","error.ledger.snapshot-stale":"Could not save archived spend summaries: {value}","host.basedOnYourLastSessions":"Based on your last {count} sessions","host.estimatedFromSpendingOverThe":"Estimated from spending over the last {SPEND_DAYS} days","host.yourTypicalSession":"Your typical session","host.patchMustIncludeFieldsOr":"patch must include fields, colors, timeFormat, timeZones or customText","host.timeFormatMustBeAnObject":"timeFormat must be an object","host.timeFieldMustBeABoolean":"Time format field must be a boolean: {key}","host.timeZonesMustBeAnObject":"timeZones must be an object","host.timeZoneMustBeAValid":"Time zone must be a valid IANA zone: {key}","host.customTextMustBeAString":"Custom text must be a string","host.customTextTooLong":"Custom text must not exceed 64 characters","host.quotaDisplayModeInvalid":"Subscription window percentage mode must be \"used\" or \"remaining\"","host.infoDensityMustBeFullOrCompact":"Information display must be full or compact","host.fieldsMustBeAnObject":"fields must be an object","host.unknownFieldId":"Unknown field id: {key}","host.fieldVisibilityMustBeA":"Field visibility must be a boolean: {key}","host.colorsMustBeAnObject":"colors must be an object","host.colorMustBeAPreset":"Color must be a preset name or #RRGGBB: {key}","field.anchorGroup.label":"Provider and model","field.anchorGroup.note":"Shows the provider and model used in this conversation.","field.subServiceGroup.label":"Subscription service and model","field.subServiceGroup.note":"Shows the subscription service and current model or plan.","field.billingServiceGroup.label":"Billing service and model","field.billingServiceGroup.note":"Shows the billing service and current model.","field.customText.label":"Custom text","field.customText.note":"Shows custom text for a note or signature.","field.mainTime.label":"Main time","field.mainTime.note":"Shows the main time zone; adjust zone and format in Time and date.","field.worldTime.label":"World time","field.worldTime.note":"Shows another time zone; it shares the main time format.","field.sessionCost.label":"Session spend","field.sessionCost.note":"Shows actual spend for this session, including subagents.","field.balance.note":"Shows the account balance; a low balance appears in red.","field.period.label":"Current period","field.period.note":"Shows whether the current period is peak or off-peak.","field.countdown.label":"Next price change","field.countdown.note":"Shows the time until the next price change.","field.expiry.label":"Subscription expiry","field.expiry.note":"Shown when the provider supplies an expiry date.","field.subWindow5h.label":"5-hour quota","field.subWindow5h.note":"Shows the remaining rolling 5-hour quota.","field.subWindowWeek.label":"Weekly quota","field.subWindowWeek.note":"Shows the remaining weekly quota.","field.subWindowMonth.label":"Monthly quota","field.subWindowMonth.note":"Shows the remaining monthly quota.","field.resetCountdown.label":"Quota reset","field.resetCountdown.note":"Shows when the current quota resets.","field.subBalance.label":"Available balance or credits","field.subBalance.note":"Shows available balance for pay-as-you-go accounts, or remaining credits when a subscription has no visible quota window.","field.billingSpend.label":"Monthly usage","field.billingSpend.note":"Shows actual usage or spend for the current billing period.","field.budget.label":"Budget status","field.budget.note":"Shown when the provider reports a budget percentage.","field.freeQuota.label":"Free quota","field.freeQuota.note":"Shown when the provider reports a free allowance and reset time.","field.turnsSteps.label":"Turns and steps","field.turnsSteps.note":"Shows conversation turns and steps. Full mode only.","field.llmTime.label":"Model time","field.llmTime.note":"Shows model inference time. Full mode only.","field.toolTime.label":"Tool time","field.toolTime.note":"Shows tool execution time. Full mode only.","field.cacheHit.note":"Shows the prompt cache hit rate. Full mode only.","field.tokensIO.label":"Input / output tokens","field.tokensIO.note":"Shows this session’s input and output usage. Full mode only.","field.contextUsage.label":"Context usage","field.contextUsage.note":"Shows context usage. Full mode only.","ui.contextAria":"{percent} of context used","ui.contextUsed":"Context used","ui.contextSystem":"System prompt","ui.contextTools":"Tool definitions","ui.contextMessages":"Conversation messages","ui.contextFigures":"~{used} / {window}","number.thousand":"{value}K","number.million":"{value}M","field.unmapped.label":"Unsupported hint","field.unmapped.note":"Shown when balance lookup is not supported.","field.noKeyHint.label":"Missing key hint","field.noKeyHint.note":"Shown when an API key is missing.","field.balanceError.label":"Balance update error","field.balanceError.note":"Shown when balance update fails.","field.usageError.label":"Usage update error","field.usageError.note":"Shown when spend data is temporarily unavailable.","field.refreshFailure.label":"Update error","field.refreshFailure.note":"Shown when any data update fails.","field.persistWarning.label":"Unsaved record alert","field.persistWarning.note":"Shown when billing records cannot be saved; recommended.","field.updateNotice.label":"Update notice","field.updateNotice.note":"Shows a short marker when a new version is available or a downloaded version is waiting for a restart.","field.updateFailure.label":"Update failure notice","field.updateFailure.note":"Shows a short marker when the automatic update failed.","group.native":"Native information","group.plugin":"Plugin information","group.notice":"Notices","group.native.desc":"Fields the DeepSeek bar already had. Full mode only. The switch only turns a field on or off; it never changes the mode.","group.plugin.desc":"Fields this plugin adds. Shown in both compact and full mode.","group.notice.desc":"One-off notices such as updates and failures. Turn the whole list off without touching the information above.","ui.listSeparator":", ","ui.sentenceEnd":".","ui.fieldErrorPrefix":"\"{label}\": ","ui.turnCount":"{count} turn","ui.turnCountPlural":"{count} turns","ui.stepCount":"{count} step","ui.stepCountPlural":"{count} steps","ui.mainTimeZone":"Main time zone","ui.worldTimeZone":"World time zone","ui.timeFormat":"Time format","ui.year":"Year","ui.month":"Month","ui.day":"Day","ui.hour":"Hour","ui.minute":"Minute","ui.second":"Second","ui.customTextTitle":"Custom text","ui.customTextPlaceholder":"Enter text (up to 64 characters)","ui.searchPlaceholder":"Search content…","ui.searchFieldsLabel":"Search visible content","ui.searchResultCount":"{count} found","ui.enabledFieldsCount":"{count} enabled","ui.noSearchResults":"No matching content","ui.timePreview":"Preview: ","ui.mainTime":"Main time","ui.worldTime":"World time","ui.customText":"Custom text"}};
62
+ const LOCALES = {"zh":{"meta.title":"底部信息栏","meta.description":"在输入框下方显示当前模型、余额和花费。","ui.requestTimedOut":"请求超时","ui.requestCanceled":"请求已取消","ui.couldNotParseResponse":"响应解析失败","ui.rpcFailed":"RPC 失败","ui.refreshFailed":"刷新失败","color.red":"红","color.green":"绿","color.blue":"蓝","color.purple":"紫","color.orange":"橙","color.neutral":"中性","mode.balance":"余额制","mode.subscription":"订阅制","mode.billing":"账单制","mode.native":"原生统计行","mode.common":"通用","ui.nativeStatsField":"原生统计行字段","ui.shownIn":"出现于","ui.pleaseTryAgainLater":"请稍后再试","ui.restoreDefaultColor":"恢复默认颜色","ui.infoBarSettings":"信息栏","ui.settingsAreTemporarilyUnavailable":"暂时无法读取设置","ui.loadingInfoBarSettings":"正在加载设置…","ui.couldNotLoadInfoBar":"无法读取信息栏设置:","ui.changesAppliedButCouldNot":"已应用,但无法保存到本地:","ui.unknownReason":"未知原因","ui.couldNotSave":"{errorPrefix}保存失败:{value}","ui.color":"“{value}”颜色:","ui.hasAnInvalidColorEnter":"“{value}”的颜色格式不正确,请输入 #RRGGBB(例如 #0044CC)。","ui.defaultColorsRestored":"已恢复默认颜色","ui.defaultLabelsRestored":"已恢复默认显示设置","ui.couldNotReset":"重置失败:{value}","ui.identifiesTheProviderAndModel":"显示当前会话使用的服务商和模型。","ui.show":"显示{label}","ui.clickToHide":"点击隐藏","ui.clickToShow":"点击显示","ui.presetColor":"{label}的预设颜色","ui.customColor":"{label}的自定义颜色","ui.customColorOpenColorPicker":"自定义颜色(打开系统取色器)","ui.customColorItem":"自定义…","ui.colorSwatchLabel":"{label}的颜色","ui.hexColor":"{label}的十六进制颜色","ui.expand":"展开","ui.collapse":"收起","ui.saving":"正在保存…","ui.processing":"正在处理…","ui.visibleFields":"要显示的信息","ui.timeDateTitle":"时间与日期","ui.timeDateDesc":"主时间和世界时间的时区与显示格式。","ui.customTextSectionDesc":"显示在信息栏中。","ui.resetConfirmTitle":"重置信息栏设置","ui.resetConfirmDescFields":"将恢复所有显示项;自定义颜色不受影响,改动会直接生效。","ui.resetConfirmDescColors":"将清除全部自定义颜色并恢复默认配色,字段显示开关不受影响。该操作会直接应用到信息栏。","ui.resetConfirmAcknowledge":"我了解这次重置不可撤销","ui.resetConfirmCancel":"取消","ui.resetConfirmConfirm":"确认重置","ui.resetLabels":"恢复显示","ui.resetColors":"恢复颜色","ui.resetRowTitle":"恢复默认","ui.resetRowDesc":"恢复显示项或颜色。","ui.customTextCount":"已输入 {value}/64 个字符","ui.couldNotDisplayInfoBar":"无法显示信息栏设置:{value}","ui.dataAndBilling":"账单数据","ui.dataAndBillingDesc":"导出或清除记录。","ui.exportBillingRecords":"导出账单","ui.exportBillingRecordsDesc":"导出为 CSV 或 JSON。","ui.exportBillingCsv":"导出 CSV","ui.exportBillingJson":"导出 JSON","ui.clearBillingRecords":"清除账单","ui.clearBillingRecordsDesc":"清除后无法恢复。","ui.clearBillingRecordsConfirm":"确定清除本插件保存的全部账单记录吗?建议先导出。清除后无法恢复,但不会影响设置或登录信息。","ui.exportedBillingRecords":"已导出 {count} 条账单记录({format})","ui.noBillingRecordsToExport":"目前没有可导出的账单记录。","ui.exportFailed":"导出失败:{value}","ui.exportIncomplete":"历史账单读取不完整:{value}。本次未导出,请稍后再试。","ui.clearFailed":"清除失败:{value}","ui.clearFailedWithoutDetails":"账单记录未能全部清除","ui.clearedBillingRecords":"已清除 {count} 条账单记录","ui.clearCanceled":"已取消","ui.exportNotSupported":"当前环境不支持下载文件。","ui.infoBar":"信息栏","ui.weekly":"周","ui.monthly":"月","ui.window":"窗口","ui.quotaDisplayUsed":"已用","ui.quotaDisplayRemaining":"剩余","ui.quotaDisplayModeTitle":"订阅窗口百分比方向","ui.quotaDisplayModeDesc":"订阅额度窗口按剩余或已用显示;告警阈值始终按剩余 20% 判定。","ui.windowUsedRemaining":"{label}窗口:已用 {usedPercent}%(剩余 {value}%)","ui.windowUsedRemainingResets":"{label}窗口 已用 {usedPercent}%(剩余 {value}%) · 重置 {value4}","ui.minimax":"MiniMax","ui.supportsImageInput":"支持图像输入。","ui.vision":"视觉","ui.unknown":"未知","ui.unknownModel":"未知模型","ui.modelSelectionPending":"正在读取当前模型","ui.modelCapabilityPending":"正在确认是否支持图像输入","ui.pluginVersion":"\n插件版本:{current}","ui.provider":"服务商:{provLabel} {modelLabel}\n","ui.pricingPeakOffPeakBeijing":"定价:峰谷价(工作日高峰 9-12、14-18 点;周末全天空闲)","ui.pricingFixed":"定价:固定价","ui.pricingNotListedUsingDefaults":"定价:暂未收录,不计算花费","ui.zhipu":"智谱","ui.xiaomiMiMo":"小米 MiMo","ui.commandCode":"Command Code","ui.subscription":"订阅","ui.cloudBilling":"云账单","ui.plan":"\n套餐:{plan}","ui.expiresLocalTime":"\n到期:{value}(本地时区)","ui.subscriptionServiceModel":"订阅服务:{serviceName}\n模型:{rawModelLabel}{planLine}{expiryLine}{versionLine}","ui.balanceLookupIsNotYet":"暂时无法读取该服务商的余额。","ui.notSupported":"未适配","ui.notConfigured":"未配置 ","ui.notConfiguredConfigureItIn":"未配置 {credName}。请在\"设置 → 模型\"中填写。","ui.notConfiguredSettingsModels":"未配置 {credName}。请在设置 → 模型中填写。","ui.estimatedBalance":"估算余额:{symbol}{value}","ui.balance":"余额:{symbol}{value}","ui.balance.pushBalanceGroups":"余额","ui.low":"低","ui.estimated":"(估算)","ui.balanceIsTemporarilyUnavailableShowing":"余额暂不可用;正在显示上次数据并自动重试。","ui.couldNotLoadBalanceCheck":"余额获取失败。请检查网络和 API Key。","ui.balanceUnavailable":"余额获取失败","ui.beijingTime":"北京时间 ","ui.peakPrice":"高峰价","ui.offPeakPrice":"空闲价","ui.input":":输入 ¥","ui.mCachedInput":"/M · 缓存 ¥","ui.mOutput":"/M · 输出 ¥","ui.beijingTimeSwitchesTo":"北京时间 {atLabel} 切换为","ui.until":"距","ui.offPeak":"空闲","ui.peak":"高峰","ui.today":"今天 {symbol}{value}","ui.lastDays":"近一月 {symbol}{value}","ui.allTime":"全部 {symbol}{value}","ui.sessionIncludingSubagents":"本会话 {costTxt}(含子代理){value}","ui.session":"本会话","ui.spendIsTemporarilyUnavailableChat":"花费暂不可用;不会影响对话。","ui.spendUnavailable":"花费获取失败","ui.noSignInCredentialsFound":"未找到 {serviceName} 登录凭证。请重新授权。","ui.credentialsHaveExpiredPleaseReauthorize":"{serviceName} 登录凭证已失效。请重新授权。","ui.deniedAccessReauthorizeOrTry":"{serviceName} 拒绝访问。请重新授权或稍后再试。","ui.rateLimitReachedPleaseTry":"{serviceName} 请求过于频繁。请稍后再试。","ui.timedOutCheckYourConnection":"{serviceName} 响应超时。请检查网络后再试。","ui.returnedAnUnrecognizedResponsePlease":"{serviceName} 返回的数据暂时无法识别。请稍后再试。","ui.isTemporarilyUnavailableCheckYour":"{serviceName} 暂不可用。请检查网络后再试。","ui.subscriptionExpiresLocalTime":"订阅到期:{value}(本地时区)","ui.expires":"到期","ui.subscriptionSource":"订阅源:{value}(","ui.prepaidBalance":"可用余额","ui.availableBalanceLabel":"可用余额","ui.remainingCredits":"剩余额度","ui.availableBalance":"可用余额:{balTxt}","ui.availableCredits":"剩余 credits:{value}","ui.credits":"积分","ui.subscriptionSource.titleLines":"订阅源:{value}","ui.windowRemainingUsed":"{label}窗口:剩余 {value}%(已用 {usedPercent}%)","ui.resetsResetsIn":" · 重置 {value} · 距重置 {value2}","ui.windowRemainingUsedResets":"{label}窗口 剩余 {value}%(已用 {usedPercent}%) · 重置 {value4}","ui.resetsIn":"距重置","ui.configureItInSettingsModels":"。请在\"设置 → 模型\"中填写。","ui.deniedAccessTheTokenMay":"{serviceName} 拒绝访问:Token 可能缺少账单读取权限。","ui.billingIsTemporarilyUnavailableCheck":"{serviceName} 账单暂不可用。请检查网络与权限后再试。","ui.billingSource":"账单源:{value}","ui.thisMonthSSpend":"本月花费:{symbol}{value}","ui.budgetUsed":"预算使用:{value}%","ui.dailyFreeQuotaRemaining":"每日免费额度剩余:{value}","ui.thisMonth":"本月","ui.thisMonthSUsage":"本月用量","ui.budget":"预算","ui.free":"免费","ui.resetsIn.pushBillingGroups":"{value} · 距重置 {value2}","ui.billingServiceModel":"账单服务:{serviceName}\n模型:{modelLabel}{versionLine}","ui.pricing":"定价","ui.spend":"花费","ui.mode":"模式","ui.subscriptionQuota":"订阅额度","ui.billing":"账单","ui.temporarilyUnavailableKeepingTheLast":"暂不可用;正在保留上次数据并自动重试。","ui.spendJournalSavedButThe":"账单流水已保存,但可直接查看的账单文件暂未更新:","ui.thisSpendRecordWasNot":"本次账单未保存,不会计入金额:","ui.ledgerUpdatePending":"账单待整理","ui.spendNotSaved":"账单未保存","ui.askYourAgentToUpdate":"发现插件新版本 {latest}。桌面端更新请在插件管理中完成。","ui.updateAvailable":"新版本提醒","ui.updateCommandCopied":"更新命令已复制","ui.versionAndUpdateTitle":"版本与更新","ui.versionAndUpdateDesc":"插件会自己把新版本替换到本机,重启 DSH 后生效。更新只替换插件自己的文件,账单记录与设置不受影响。","ui.versionUnavailable":"当前运行的 DSH 还没载入这一版插件的更新功能,所以这里暂时只显示这一行。重启 DSH 后,下面就会出现当前版本、更新方式与「检查更新」。","ui.versionRunning":"运行中版本 {version}","ui.versionLatest":"最新版本 {version}","ui.versionUnknown":"未知","ui.autoUpdateTitle":"更新方式","ui.autoUpdateDesc":"选「全自动更新」:启动后自动检查并下载新版本,重启 DSH 后生效。选「手动更新」:只检查,不下载,你点「检查更新」时才执行。","ui.updateModeAuto":"全自动更新","ui.updateModeManual":"手动更新","ui.autoUpdateOn":"已开启","ui.autoUpdateOff":"已关闭","ui.updateCheckNow":"检查更新","ui.updateChecking":"检查中…","ui.updateRetrying":"重试","ui.updateUpToDate":"已是最新版本。","ui.updateDisabled":"当前环境不支持自动更新(仅在插件被装载进 profile 时启用)。","ui.updatePendingRestart":"已更新到 {version},重启 DSH 后生效。","ui.updateInProgress":"发现新版本 {version},正在自动更新…","ui.updateAutoOffPending":"有新版本 {version},当前是手动更新方式。","ui.updateFailed":"上次自动更新失败:{error}","ui.updateRollback":"回滚到上一版","ui.updateRolledBack":"已回滚到上一版 {version}。","ui.updateHeld":"新版 {version} 已被你暂缓,不会自动装回来。","ui.updateAllowHeld":"允许更新到 {version}","ui.updateRestartBadge":"重启生效","ui.updateFailedBadge":"更新失败","ui.tools":"工具调用","ui.avgTTFT":"首 token 平均","ui.cacheHit":"缓存命中","ui.input.BottomInfoBar":"输入","ui.output":"输出","ui.savingView":"正在保存切换…","ui.clickToSwitchFullCompact":"单击切换 完整/简洁","ui.pressEnterOrSpaceFor":"按 Enter 或空格切换为简洁模式。","ui.pressEnterOrSpaceFor.BottomInfoBar":"按 Enter 或空格切换为完整模式。","host.hour":"5 小时","host.unknownProvider":"未知服务商","error.subscription.request-failed":"订阅额度请求未知异常","host.settingsFileCouldNotBe":"设置文件写入未完成","host.everydayQuestions":"日常问答","host.mediumCodingTask":"中等编码任务","host.longDocumentAnalysisCodeReview":"长文档分析/代码审查","host.largeProjectRefactorAcrossMultiple":"大工程重构(多轮)","host.subagentWorkflow":"子代理工作流","error.settings.save-failed":"settings.json 落盘失败:{value}","error.balance.credentials":"凭据读取失败","error.balance.not-configured":"未配置 {credential}","error.request.http":"请求失败(HTTP {status})","error.request.parse":"响应格式异常","error.subscription.not-connected":"未找到 ChatGPT 订阅登录凭证(~/.codex/auth.json),请安装 dsh-chatgpt-subscription 插件绑定","error.subscription.credentials-missing":"ChatGPT 订阅登录凭证缺少 id_token,请安装 dsh-chatgpt-subscription 插件重新绑定","error.subscription.opencode-not-configured":"未配置 OpenCode Go(OPENCODE_GO_API_KEY 或 opencode auth.json)","error.subscription.commandcode-not-configured":"未配置 Command Code(COMMAND_CODE_API_KEY、CMD_API_KEY 或 ~/.commandcode/auth.json)","error.subscription.commandcode-auth-failed":"Command Code 登录凭证已失效。请重新登录或更新 API Key","error.subscription.commandcode-unrecognized":"Command Code 返回了无法识别的额度格式(接口可能已变更),已保留上次数据","host.zhipu":"智谱 {mapped}","host.zhipu.parseZaiQuota":"智谱 {value}{value2}","error.subscription.zhipu-not-configured":"未配置智谱 API Key(ZAI_API_KEY 或 ZAI_CODING_CN_API_KEY)","error.subscription.zhipu-auth-failed":"智谱 API 认证失败(密钥过期或不正确)","error.subscription.zhipu-unrecognized":"智谱返回了无法识别的额度格式(接口可能已变更),已保留上次数据","error.request.failed":"请求失败({value} {msg})","error.subscription.xiaomi-not-configured":"未配置小米 MiMo Token Plan 凭据({credName} 或 XIAOMI_API_KEY)","error.subscription.xiaomi-http":"请求失败(HTTP {value})","error.subscription.minimax-not-configured":"未配置 MiniMax 凭据(MINIMAX_API_KEY 或 MINIMAX_CN_API_KEY)。查询 Token Plan 必须使用 Subscription Key,按量 API Key 会被服务端拒绝","error.subscription.minimax-auth-failed":"MiniMax 拒绝了当前 API Key:查询 Token Plan 必须使用 Subscription Key(在 Token Plan 订阅页生成),按量 API Key 会被服务端拒绝(status_code=1004 / HTTP 401)","error.subscription.minimax-unrecognized":"MiniMax 返回了无法识别的额度格式(接口可能已变更),已保留上次数据","error.billing.together-not-configured":"未配置 TOGETHER_API_KEY","host.actualMonthlyBillFromThe":"本月真实账单(Together 官方 Usage API)","error.billing.fireworks-not-configured":"未配置 FIREWORKS_API_KEY","error.billing.fireworks-account":"账户解析失败(未取得 account_id)","host.actualBillForThisPeriod":"本周期真实账单(Fireworks Billing Summary)","host.actualUsageForThisPeriod":"本周期真实用量(billingUsage 回退端点,无金额)","error.billing.aws-not-configured":"未配置 AWS 凭据(AWS_ACCESS_KEY_ID / AWS_SECRET_ACCESS_KEY)","error.billing.aws-http":"请求失败(HTTP {status}),可能缺少 ce:GetCostAndUsage 权限","host.actualMonthlyBillFromAWS":"AWS Cost Explorer 本月真实账单(账单延迟约 24 小时)","error.billing.cloudflare-not-configured":"未配置 CLOUDFLARE_API_KEY(需账号级 Token 并授予 Billing 读权限)","error.billing.cloudflare-account":"未配置 CLOUDFLARE_ACCOUNT_ID","error.billing.cloudflare-http":"请求失败(HTTP {status}),Token 需 Billing 读权限","host.actualMonthlyUsageFromThe":"Cloudflare Billable Usage API(Alpha),本月真实用量","error.billing.request-failed":"账单请求未知异常","host.spendSummaryFileMissingArchived":"账单汇总文件缺失:折叠期间的历史金额暂未计入显示(明细仍在冷归档 usage-archive/,可人工恢复)","host.spendLedgerCouldNotBe":"账单文件写入未完成","host.usageLedgerBusy":"当前仍有回答正在进行,完成后再清除账单记录","error.ledger.clear-failed":"账单记录清理未完成:{value}","error.ledger.snapshot-stale":"折叠汇总落盘失败:{value}","host.basedOnYourLastSessions":"基于你最近 {count} 次会话","host.estimatedFromSpendingOverThe":"基于过去 {SPEND_DAYS} 天消耗速度的估算","host.yourTypicalSession":"你的典型会话","host.patchMustIncludeFieldsOr":"patch 需包含 fields、colors、timeFormat、timeZones 或 customText 之一","host.timeFormatMustBeAnObject":"timeFormat 必须是对象","host.timeFieldMustBeABoolean":"时间格式字段必须是布尔值: {key}","host.timeZonesMustBeAnObject":"timeZones 必须是对象","host.timeZoneMustBeAValid":"时区必须是有效的 IANA 时区: {key}","host.customTextMustBeAString":"自定义文本必须是字符串","host.customTextTooLong":"自定义文本不能超过64字符","host.quotaDisplayModeInvalid":"订阅窗口百分比方向必须是 used 或 remaining","host.infoDensityMustBeFullOrCompact":"信息显示方式必须是完整或简洁","host.fieldsMustBeAnObject":"fields 必须是对象","host.unknownFieldId":"未知字段 id: {key}","host.fieldVisibilityMustBeA":"字段开关必须是布尔值: {key}","host.colorsMustBeAnObject":"colors 必须是对象","host.colorMustBeAPreset":"颜色只接受预设色名或 #RRGGBB: {key}","field.anchorGroup.label":"服务商与模型","field.anchorGroup.note":"显示当前会话使用的服务商和模型。","field.subServiceGroup.label":"订阅服务与模型","field.subServiceGroup.note":"显示订阅服务和当前模型或套餐。","field.billingServiceGroup.label":"账单服务与模型","field.billingServiceGroup.note":"显示账单服务和当前模型。","field.customText.label":"自定义文字","field.customText.note":"显示一段自定义文字,可用作备注或签名。","field.mainTime.label":"主时间","field.mainTime.note":"显示主时区的时间;时区与格式在「时间与日期」中调整。","field.worldTime.label":"世界时间","field.worldTime.note":"显示另一时区的时间;格式与主时间相同。","field.sessionCost.label":"本次会话花费","field.sessionCost.note":"显示本次会话的实际花费,包含子代理。","field.balance.note":"显示账户余额;余额过低时会标红。","field.period.label":"当前时段","field.period.note":"显示当前是高峰还是空闲时段。","field.countdown.label":"下次价格切换","field.countdown.note":"显示距离下次价格切换还有多久。","field.expiry.label":"订阅到期日","field.expiry.note":"服务商提供到期时间时显示。","field.subWindow5h.label":"5 小时额度","field.subWindow5h.note":"显示滚动 5 小时额度的剩余比例。","field.subWindowWeek.label":"每周额度","field.subWindowWeek.note":"显示每周额度的剩余比例。","field.subWindowMonth.label":"每月额度","field.subWindowMonth.note":"显示每月额度的剩余比例。","field.resetCountdown.label":"距额度重置","field.resetCountdown.note":"显示当前额度何时重置。","field.subBalance.label":"可用余额或剩余额度","field.subBalance.note":"按量账户显示可用余额;没有额度窗口的 credits 订阅显示剩余额度。","field.billingSpend.label":"本月用量","field.billingSpend.note":"显示本计费周期的实际用量或花费。","field.budget.label":"预算使用情况","field.budget.note":"服务商支持时显示已使用的预算比例。","field.freeQuota.label":"免费额度","field.freeQuota.note":"服务商明确提供时显示免费额度和重置时间。","field.turnsSteps.label":"轮次与步数","field.turnsSteps.note":"显示对话的轮次和步数,只在完整模式出现。","field.llmTime.label":"模型耗时","field.llmTime.note":"显示模型推理耗时,只在完整模式出现。","field.toolTime.label":"工具耗时","field.toolTime.note":"显示工具调用耗时,只在完整模式出现。","field.cacheHit.note":"显示提示词缓存命中率,只在完整模式出现。","field.tokensIO.label":"输入/输出 Token","field.tokensIO.note":"显示本次会话的输入和输出用量,只在完整模式出现。","field.contextUsage.label":"上下文用量","field.contextUsage.note":"显示上下文占用情况,只在完整模式出现。","ui.contextAria":"上下文已用 {percent}","ui.contextUsed":"上下文已用","ui.contextSystem":"系统提示词","ui.contextTools":"工具定义","ui.contextMessages":"对话消息","ui.contextFigures":"~{used} / {window}","number.thousand":"{value}K","number.million":"{value}M","field.unmapped.label":"暂不支持提示","field.unmapped.note":"当前服务商暂不支持余额查询时显示。","field.noKeyHint.label":"缺少密钥提示","field.noKeyHint.note":"缺少 API Key 时显示设置提示。","field.balanceError.label":"余额更新失败提示","field.balanceError.note":"余额更新失败时显示。","field.usageError.label":"用量更新失败提示","field.usageError.note":"花费暂时不可用时显示。","field.refreshFailure.label":"更新失败提示","field.refreshFailure.note":"任一数据更新失败时显示提醒。","field.persistWarning.label":"记录未保存提醒","field.persistWarning.note":"账单保存失败时显示提醒,建议保留。","field.updateNotice.label":"更新提醒","field.updateNotice.note":"有新版本可下载、或新版已下载待重启时显示短标记。","field.updateFailure.label":"更新失败提醒","field.updateFailure.note":"自动更新失败时显示短标记。","group.native":"原生信息","group.plugin":"插件信息","group.notice":"提醒信息","group.native.desc":"DeepSeek 原生底栏原有的字段,只在完整模式显示。开关只决定开和关,与模式不冲突。","group.plugin.desc":"本插件新增的字段(含接管过来的上下文圆环),简洁模式与完整模式都会显示。","group.notice.desc":"更新、失败等一次性提醒。可整组关掉,不影响上面的信息显示。","ui.listSeparator":"、","ui.sentenceEnd":"。","ui.fieldErrorPrefix":"「{label}」:","ui.turnCount":"{count} 轮","ui.turnCountPlural":"{count} 轮","ui.stepCount":"{count} 步","ui.stepCountPlural":"{count} 步","ui.mainTimeZone":"主时间时区","ui.worldTimeZone":"世界时间时区","ui.timeFormat":"时间格式","ui.year":"年","ui.month":"月","ui.day":"日","ui.hour":"时","ui.minute":"分","ui.second":"秒","ui.customTextTitle":"自定义文本","ui.customTextPlaceholder":"输入文字(最多 64 个字符)","ui.searchPlaceholder":"搜索内容…","ui.searchFieldsLabel":"搜索显示内容","ui.searchResultCount":"找到 {count} 项","ui.enabledFieldsCount":"已启用 {count} 项","ui.noSearchResults":"没有找到匹配内容","ui.timePreview":"预览:","ui.mainTime":"主时间","ui.worldTime":"世界时间","ui.customText":"自定义文本"},"en":{"meta.title":"Bottom Info Bar","meta.description":"Shows the current model, balance and spend under the composer.","ui.requestTimedOut":"Request timed out","ui.requestCanceled":"Request canceled","ui.couldNotParseResponse":"Could not parse response","ui.rpcFailed":"RPC failed","ui.refreshFailed":"Refresh failed","color.red":"Red","color.green":"Green","color.blue":"Blue","color.purple":"Purple","color.orange":"Orange","color.neutral":"Neutral","mode.balance":"Balance","mode.subscription":"Subscription","mode.billing":"Billing","mode.native":"Native stats","mode.common":"General","ui.nativeStatsField":"Native stats field","ui.shownIn":"Shown in: ","ui.pleaseTryAgainLater":"Please try again later","ui.restoreDefaultColor":"Restore default color","ui.infoBarSettings":"Info Bar","ui.settingsAreTemporarilyUnavailable":"Settings are temporarily unavailable","ui.loadingInfoBarSettings":"Loading settings…","ui.couldNotLoadInfoBar":"Could not load Info Bar settings: ","ui.changesAppliedButCouldNot":"Applied, but could not save locally: ","ui.unknownReason":"Unknown reason","ui.couldNotSave":"{errorPrefix}Could not save: {value}","ui.color":"\"{value}\" color: ","ui.hasAnInvalidColorEnter":"\"{value}\" has an invalid color. Enter #RRGGBB (for example, #0044CC).","ui.defaultColorsRestored":"Default colors restored","ui.defaultLabelsRestored":"Default display restored","ui.couldNotReset":"Could not reset: {value}","ui.identifiesTheProviderAndModel":"Shows the provider and model used in this conversation.","ui.show":"Show {label}","ui.clickToHide":"Click to hide","ui.clickToShow":"Click to show","ui.presetColor":"{label} preset color","ui.customColor":"{label} custom color","ui.customColorOpenColorPicker":"Custom color (open color picker)","ui.customColorItem":"Custom…","ui.colorSwatchLabel":"{label} color","ui.hexColor":"{label} hex color","ui.expand":"Expand","ui.collapse":"Collapse","ui.saving":"Saving…","ui.processing":"Working…","ui.visibleFields":"Information to show","ui.timeDateTitle":"Time and date","ui.timeDateDesc":"Time zones and display format for main and world time.","ui.customTextSectionDesc":"Shown in the Info Bar.","ui.resetConfirmTitle":"Reset Info Bar settings","ui.resetConfirmDescFields":"Restore all display choices. Custom colors are not affected and the change applies right away.","ui.resetConfirmDescColors":"All custom colors will be cleared and defaults restored. Field switches are not affected. This applies to the Info Bar right away.","ui.resetConfirmAcknowledge":"I understand this reset cannot be undone","ui.resetConfirmCancel":"Cancel","ui.resetConfirmConfirm":"Reset","ui.resetLabels":"Restore display","ui.resetColors":"Restore colors","ui.resetRowTitle":"Reset to defaults","ui.resetRowDesc":"Restore displayed items or colors.","ui.customTextCount":"{value}/64 characters","ui.couldNotDisplayInfoBar":"Could not display Info Bar settings: {value}","ui.dataAndBilling":"Billing data","ui.dataAndBillingDesc":"Export or clear records.","ui.exportBillingRecords":"Export billing","ui.exportBillingRecordsDesc":"Export as CSV or JSON.","ui.exportBillingCsv":"Export CSV","ui.exportBillingJson":"Export JSON","ui.clearBillingRecords":"Clear billing","ui.clearBillingRecordsDesc":"This cannot be undone.","ui.clearBillingRecordsConfirm":"Clear all billing records saved by this plugin? Export first. This cannot be undone, but settings and sign-in information will stay unchanged.","ui.exportedBillingRecords":"Exported {count} billing records ({format})","ui.noBillingRecordsToExport":"There are no billing records to export.","ui.exportFailed":"Export failed: {value}","ui.exportIncomplete":"Some historical billing records could not be read: {value}. Nothing was exported; try again later.","ui.clearFailed":"Could not clear billing records: {value}","ui.clearFailedWithoutDetails":"Billing records could not be fully cleared","ui.clearedBillingRecords":"Cleared {count} billing records","ui.clearCanceled":"Canceled","ui.exportNotSupported":"File downloads are not supported in this environment.","ui.infoBar":"Info Bar","ui.weekly":"Weekly","ui.monthly":"Monthly","ui.window":"Window","ui.quotaDisplayUsed":"Used","ui.quotaDisplayRemaining":"Remaining","ui.quotaDisplayModeTitle":"Subscription window percentage","ui.quotaDisplayModeDesc":"Show subscription quota windows as remaining or used. The warning threshold always follows the remaining 20% rule.","ui.windowUsedRemaining":"{label} window: used {usedPercent}% (remaining {value}%)","ui.windowUsedRemainingResets":"{label} window: used {usedPercent}% (remaining {value}%) · Resets {value4}","ui.minimax":"MiniMax","ui.supportsImageInput":"Supports image input.","ui.vision":"Vision","ui.unknown":"Unknown","ui.unknownModel":"Unknown model","ui.modelSelectionPending":"Reading current model","ui.modelCapabilityPending":"Checking image-input support","ui.pluginVersion":"\nPlugin version: {current}","ui.provider":"Provider: {provLabel} {modelLabel}\n","ui.pricingPeakOffPeakBeijing":"Pricing: peak/off-peak (Beijing time; weekday peaks 09:00-12:00 and 14:00-18:00; weekends off-peak)","ui.pricingFixed":"Pricing: fixed","ui.pricingNotListedUsingDefaults":"Pricing: not listed; spend is not calculated","ui.zhipu":"Zhipu","ui.xiaomiMiMo":"Xiaomi MiMo","ui.commandCode":"Command Code","ui.subscription":"Subscription","ui.cloudBilling":"Cloud billing","ui.plan":"\nPlan: {plan}","ui.expiresLocalTime":"\nExpires: {value} (local time)","ui.subscriptionServiceModel":"Subscription service: {serviceName}\nModel: {rawModelLabel}{planLine}{expiryLine}{versionLine}","ui.balanceLookupIsNotYet":"This provider's balance is not available yet.","ui.notSupported":"Not supported","ui.notConfigured":"Not configured: ","ui.notConfiguredConfigureItIn":"Not configured: {credName}. Configure it in Settings → Models.","ui.notConfiguredSettingsModels":"{credName} is not configured. Add it in Settings → Models.","ui.estimatedBalance":"Estimated balance: {symbol}{value}","ui.balance":"Balance: {symbol}{value}","ui.balance.pushBalanceGroups":"Balance","ui.low":"Low","ui.estimated":"(estimated)","ui.balanceIsTemporarilyUnavailableShowing":"Balance is temporarily unavailable. Showing the last data and retrying automatically.","ui.couldNotLoadBalanceCheck":"Could not load balance. Check your connection and API key.","ui.balanceUnavailable":"Balance unavailable","ui.beijingTime":"Beijing time: ","ui.peakPrice":"Peak price","ui.offPeakPrice":"Off-peak price","ui.input":": input ¥","ui.mCachedInput":"/M · cached input ¥","ui.mOutput":"/M · output ¥","ui.beijingTimeSwitchesTo":"Beijing time: {atLabel} switches to ","ui.until":"Until ","ui.offPeak":"off-peak","ui.peak":"peak","ui.today":"Today {symbol}{value}","ui.lastDays":"Last 30 days {symbol}{value}","ui.allTime":"All time {symbol}{value}","ui.sessionIncludingSubagents":"Session {costTxt} (including subagents){value}","ui.session":"Session","ui.spendIsTemporarilyUnavailableChat":"Spend is temporarily unavailable. Chat is unaffected.","ui.spendUnavailable":"Spend unavailable","ui.noSignInCredentialsFound":"No sign-in credentials found for {serviceName}. Please reauthorize.","ui.credentialsHaveExpiredPleaseReauthorize":"{serviceName} credentials have expired. Please reauthorize.","ui.deniedAccessReauthorizeOrTry":"{serviceName} denied access. Reauthorize or try again later.","ui.rateLimitReachedPleaseTry":"{serviceName} rate limit reached. Please try again later.","ui.timedOutCheckYourConnection":"{serviceName} timed out. Check your connection and try again.","ui.returnedAnUnrecognizedResponsePlease":"{serviceName} returned an unrecognized response. Please try again later.","ui.isTemporarilyUnavailableCheckYour":"{serviceName} is temporarily unavailable. Check your connection and try again.","ui.subscriptionExpiresLocalTime":"Subscription expires: {value} (local time)","ui.expires":"Expires","ui.subscriptionSource":"Subscription source: {value} (","ui.prepaidBalance":"Available balance","ui.availableBalanceLabel":"Available balance","ui.remainingCredits":"Credits remaining","ui.availableBalance":"Available balance: {balTxt}","ui.availableCredits":"Credits remaining: {value}","ui.credits":"credits","ui.subscriptionSource.titleLines":"Subscription source: {value}","ui.windowRemainingUsed":"{label} window: remaining {value}% (used {usedPercent}%)","ui.resetsResetsIn":" · Resets {value} · Resets in {value2}","ui.windowRemainingUsedResets":"{label} window: remaining {value}% (used {usedPercent}%) · Resets {value4}","ui.resetsIn":"Resets in","ui.configureItInSettingsModels":". Configure it in Settings → Models.","ui.deniedAccessTheTokenMay":"{serviceName} denied access: the token may lack billing read permissions.","ui.billingIsTemporarilyUnavailableCheck":"{serviceName} billing is temporarily unavailable. Check your connection and permissions, then try again.","ui.billingSource":"Billing source: {value}","ui.thisMonthSSpend":"This month’s spend: {symbol}{value}","ui.budgetUsed":"Budget used: {value}%","ui.dailyFreeQuotaRemaining":"Daily free quota remaining: {value}","ui.thisMonth":"This month","ui.thisMonthSUsage":"This month’s usage","ui.budget":"Budget","ui.free":"Free","ui.resetsIn.pushBillingGroups":"{value} · Resets in {value2}","ui.billingServiceModel":"Billing service: {serviceName}\nModel: {modelLabel}{versionLine}","ui.pricing":"Pricing","ui.spend":"Spend","ui.mode":"Mode","ui.subscriptionQuota":"Subscription quota","ui.billing":"Billing","ui.temporarilyUnavailableKeepingTheLast":": temporarily unavailable. Keeping the last data and retrying automatically.","ui.spendJournalSavedButThe":"Spend journal saved, but the readable ledger has not been updated: ","ui.thisSpendRecordWasNot":"This spend record was not saved and will not be added to totals: ","ui.ledgerUpdatePending":"Ledger update pending","ui.spendNotSaved":"Spend not saved","ui.askYourAgentToUpdate":"Plugin version {latest} is available. Update it from plugin management on desktop.","ui.updateAvailable":"Update available","ui.updateCommandCopied":"Update command copied","ui.versionAndUpdateTitle":"Version and updates","ui.versionAndUpdateDesc":"The plugin replaces its own files with a new version; restart DSH to activate. Only the plugin's own files change, so billing records and settings are untouched.","ui.versionUnavailable":"The DSH currently running has not loaded this version of the plugin yet, so only this line can be shown here. Restart DSH and the running version, the update mode and the check button will appear.","ui.versionRunning":"Running version {version}","ui.versionLatest":"Latest version {version}","ui.versionUnknown":"Unknown","ui.autoUpdateTitle":"Update method","ui.autoUpdateDesc":"Automatic: checks and downloads new versions on startup, then applies after you restart DSH. Manual: only checks, and downloads when you press Check now.","ui.updateModeAuto":"Automatic","ui.updateModeManual":"Manual","ui.autoUpdateOn":"On","ui.autoUpdateOff":"Off","ui.updateCheckNow":"Check now","ui.updateChecking":"Checking…","ui.updateRetrying":"Retry","ui.updateUpToDate":"Up to date.","ui.updateDisabled":"Automatic updates are unavailable here (only enabled when the plugin is loaded as a profile plugin).","ui.updatePendingRestart":"Updated to {version}. Restart DSH to activate.","ui.updateInProgress":"Version {version} found; updating automatically…","ui.updateAutoOffPending":"Version {version} is available. Updates are set to manual.","ui.updateFailed":"Last automatic update failed: {error}","ui.updateRollback":"Roll back to previous version","ui.updateRolledBack":"Rolled back to the previous version {version}.","ui.updateHeld":"Version {version} is held back and will not be installed automatically.","ui.updateAllowHeld":"Allow updating to {version}","ui.updateRestartBadge":"Restart to apply","ui.updateFailedBadge":"Update failed","ui.tools":"Tools","ui.avgTTFT":"Avg. TTFT","ui.cacheHit":"Cache hit","ui.input.BottomInfoBar":"Input","ui.output":"Output","ui.savingView":"Saving view…","ui.clickToSwitchFullCompact":"Click to switch full/compact view","ui.pressEnterOrSpaceFor":"Press Enter or Space for compact view.","ui.pressEnterOrSpaceFor.BottomInfoBar":"Press Enter or Space for full view.","host.hour":"5-hour","host.unknownProvider":"Unknown provider","error.subscription.request-failed":"Unexpected subscription quota request failure","host.settingsFileCouldNotBe":"Settings file could not be saved","host.everydayQuestions":"Everyday questions","host.mediumCodingTask":"Medium coding task","host.longDocumentAnalysisCodeReview":"Long document analysis / code review","host.largeProjectRefactorAcrossMultiple":"Large project refactor across multiple turns","host.subagentWorkflow":"Subagent workflow","error.settings.save-failed":"Could not save settings.json: {value}","error.balance.credentials":"Could not read credentials","error.balance.not-configured":"Not configured: {credential}","error.request.http":"Request failed: HTTP {status}.","error.request.parse":"Unexpected response format","error.subscription.not-connected":"ChatGPT subscription is not connected: credentials not found in ~/.codex/auth.json. Install dsh-chatgpt-subscription and sign in.","error.subscription.credentials-missing":"ChatGPT subscription credentials are missing id_token. Install dsh-chatgpt-subscription and reauthorize.","error.subscription.opencode-not-configured":"OpenCode Go is not configured. Set OPENCODE_GO_API_KEY or use opencode auth.json.","error.subscription.commandcode-not-configured":"Command Code is not configured. Set COMMAND_CODE_API_KEY, CMD_API_KEY, or sign in with the Command Code CLI.","error.subscription.commandcode-auth-failed":"Command Code credentials were rejected. Sign in again or update the API key.","error.subscription.commandcode-unrecognized":"Command Code returned an unrecognized quota format; the previous snapshot was kept.","host.zhipu":"Zhipu {mapped}","host.zhipu.parseZaiQuota":"Zhipu {value}{value2}","error.subscription.zhipu-not-configured":"Zhipu API key is not configured. Set ZAI_API_KEY or ZAI_CODING_CN_API_KEY.","error.subscription.zhipu-auth-failed":"Zhipu API authentication failed: the key is expired or invalid.","error.subscription.zhipu-unrecognized":"Zhipu returned an unrecognized quota format (the API may have changed); the last known data is kept.","error.request.failed":"Request failed: {value} {msg}.","error.subscription.xiaomi-not-configured":"Xiaomi MiMo Token Plan credentials are not configured: {credName} or XIAOMI_API_KEY.","error.subscription.xiaomi-http":"Request failed: HTTP {value}.","error.subscription.minimax-not-configured":"MiniMax is not configured. Set MINIMAX_API_KEY or MINIMAX_CN_API_KEY. Token Plan queries require a Subscription Key; pay-as-you-go API keys are rejected by the server.","error.subscription.minimax-auth-failed":"MiniMax rejected the API key: Token Plan queries require a Subscription Key (generated on the Token Plan subscription page). Pay-as-you-go keys are rejected (status_code=1004 / HTTP 401).","error.subscription.minimax-unrecognized":"MiniMax returned an unrecognized quota format (the API may have changed); the last known data is kept.","error.billing.together-not-configured":"Not configured: TOGETHER_API_KEY","host.actualMonthlyBillFromThe":"Actual monthly bill from the Together Usage API","error.billing.fireworks-not-configured":"Not configured: FIREWORKS_API_KEY","error.billing.fireworks-account":"Could not read account (account_id missing)","host.actualBillForThisPeriod":"Actual bill for this period (Fireworks Billing Summary)","host.actualUsageForThisPeriod":"Actual usage for this period (billingUsage fallback; no spend amount)","error.billing.aws-not-configured":"Not configured: AWS credentials (AWS_ACCESS_KEY_ID / AWS_SECRET_ACCESS_KEY)","error.billing.aws-http":"Request failed: HTTP {status}. The token may lack ce:GetCostAndUsage permission","host.actualMonthlyBillFromAWS":"Actual monthly bill from AWS Cost Explorer (about 24 hours behind)","error.billing.cloudflare-not-configured":"Not configured: CLOUDFLARE_API_KEY (requires an account-level token with Billing read permission)","error.billing.cloudflare-account":"Not configured: CLOUDFLARE_ACCOUNT_ID","error.billing.cloudflare-http":"Request failed: HTTP {status}. The token requires Billing read permission","host.actualMonthlyUsageFromThe":"Actual monthly usage from the Cloudflare Billable Usage API (Alpha)","error.billing.request-failed":"Unexpected billing request failure","host.spendSummaryFileMissingArchived":"Spend summary file missing: archived amounts are not included in displayed totals. Details remain in usage-archive/ for manual recovery.","host.spendLedgerCouldNotBe":"Spend ledger could not be saved","host.usageLedgerBusy":"A response is still in progress. Clear billing records after it finishes.","error.ledger.clear-failed":"Billing records could not be fully cleared: {value}","error.ledger.snapshot-stale":"Could not save archived spend summaries: {value}","host.basedOnYourLastSessions":"Based on your last {count} sessions","host.estimatedFromSpendingOverThe":"Estimated from spending over the last {SPEND_DAYS} days","host.yourTypicalSession":"Your typical session","host.patchMustIncludeFieldsOr":"patch must include fields, colors, timeFormat, timeZones or customText","host.timeFormatMustBeAnObject":"timeFormat must be an object","host.timeFieldMustBeABoolean":"Time format field must be a boolean: {key}","host.timeZonesMustBeAnObject":"timeZones must be an object","host.timeZoneMustBeAValid":"Time zone must be a valid IANA zone: {key}","host.customTextMustBeAString":"Custom text must be a string","host.customTextTooLong":"Custom text must not exceed 64 characters","host.quotaDisplayModeInvalid":"Subscription window percentage mode must be \"used\" or \"remaining\"","host.infoDensityMustBeFullOrCompact":"Information display must be full or compact","host.fieldsMustBeAnObject":"fields must be an object","host.unknownFieldId":"Unknown field id: {key}","host.fieldVisibilityMustBeA":"Field visibility must be a boolean: {key}","host.colorsMustBeAnObject":"colors must be an object","host.colorMustBeAPreset":"Color must be a preset name or #RRGGBB: {key}","field.anchorGroup.label":"Provider and model","field.anchorGroup.note":"Shows the provider and model used in this conversation.","field.subServiceGroup.label":"Subscription service and model","field.subServiceGroup.note":"Shows the subscription service and current model or plan.","field.billingServiceGroup.label":"Billing service and model","field.billingServiceGroup.note":"Shows the billing service and current model.","field.customText.label":"Custom text","field.customText.note":"Shows custom text for a note or signature.","field.mainTime.label":"Main time","field.mainTime.note":"Shows the main time zone; adjust zone and format in Time and date.","field.worldTime.label":"World time","field.worldTime.note":"Shows another time zone; it shares the main time format.","field.sessionCost.label":"Session spend","field.sessionCost.note":"Shows actual spend for this session, including subagents.","field.balance.note":"Shows the account balance; a low balance appears in red.","field.period.label":"Current period","field.period.note":"Shows whether the current period is peak or off-peak.","field.countdown.label":"Next price change","field.countdown.note":"Shows the time until the next price change.","field.expiry.label":"Subscription expiry","field.expiry.note":"Shown when the provider supplies an expiry date.","field.subWindow5h.label":"5-hour quota","field.subWindow5h.note":"Shows the remaining rolling 5-hour quota.","field.subWindowWeek.label":"Weekly quota","field.subWindowWeek.note":"Shows the remaining weekly quota.","field.subWindowMonth.label":"Monthly quota","field.subWindowMonth.note":"Shows the remaining monthly quota.","field.resetCountdown.label":"Quota reset","field.resetCountdown.note":"Shows when the current quota resets.","field.subBalance.label":"Available balance or credits","field.subBalance.note":"Shows available balance for pay-as-you-go accounts, or remaining credits when a subscription has no visible quota window.","field.billingSpend.label":"Monthly usage","field.billingSpend.note":"Shows actual usage or spend for the current billing period.","field.budget.label":"Budget status","field.budget.note":"Shown when the provider reports a budget percentage.","field.freeQuota.label":"Free quota","field.freeQuota.note":"Shown when the provider reports a free allowance and reset time.","field.turnsSteps.label":"Turns and steps","field.turnsSteps.note":"Shows conversation turns and steps. Full mode only.","field.llmTime.label":"Model time","field.llmTime.note":"Shows model inference time. Full mode only.","field.toolTime.label":"Tool time","field.toolTime.note":"Shows tool execution time. Full mode only.","field.cacheHit.note":"Shows the prompt cache hit rate. Full mode only.","field.tokensIO.label":"Input / output tokens","field.tokensIO.note":"Shows this session’s input and output usage. Full mode only.","field.contextUsage.label":"Context usage","field.contextUsage.note":"Shows context usage. Full mode only.","ui.contextAria":"{percent} of context used","ui.contextUsed":"Context used","ui.contextSystem":"System prompt","ui.contextTools":"Tool definitions","ui.contextMessages":"Conversation messages","ui.contextFigures":"~{used} / {window}","number.thousand":"{value}K","number.million":"{value}M","field.unmapped.label":"Unsupported hint","field.unmapped.note":"Shown when balance lookup is not supported.","field.noKeyHint.label":"Missing key hint","field.noKeyHint.note":"Shown when an API key is missing.","field.balanceError.label":"Balance update error","field.balanceError.note":"Shown when balance update fails.","field.usageError.label":"Usage update error","field.usageError.note":"Shown when spend data is temporarily unavailable.","field.refreshFailure.label":"Update error","field.refreshFailure.note":"Shown when any data update fails.","field.persistWarning.label":"Unsaved record alert","field.persistWarning.note":"Shown when billing records cannot be saved; recommended.","field.updateNotice.label":"Update notice","field.updateNotice.note":"Shows a short marker when a new version is available or a downloaded version is waiting for a restart.","field.updateFailure.label":"Update failure notice","field.updateFailure.note":"Shows a short marker when the automatic update failed.","group.native":"Native information","group.plugin":"Plugin information","group.notice":"Notices","group.native.desc":"Fields the DeepSeek bar already had. Full mode only. The switch only turns a field on or off; it never changes the mode.","group.plugin.desc":"Fields this plugin adds, the adopted context ring included. Shown in both compact and full mode.","group.notice.desc":"One-off notices such as updates and failures. Turn the whole list off without touching the information above.","ui.listSeparator":", ","ui.sentenceEnd":".","ui.fieldErrorPrefix":"\"{label}\": ","ui.turnCount":"{count} turn","ui.turnCountPlural":"{count} turns","ui.stepCount":"{count} step","ui.stepCountPlural":"{count} steps","ui.mainTimeZone":"Main time zone","ui.worldTimeZone":"World time zone","ui.timeFormat":"Time format","ui.year":"Year","ui.month":"Month","ui.day":"Day","ui.hour":"Hour","ui.minute":"Minute","ui.second":"Second","ui.customTextTitle":"Custom text","ui.customTextPlaceholder":"Enter text (up to 64 characters)","ui.searchPlaceholder":"Search content…","ui.searchFieldsLabel":"Search visible content","ui.searchResultCount":"{count} found","ui.enabledFieldsCount":"{count} enabled","ui.noSearchResults":"No matching content","ui.timePreview":"Preview: ","ui.mainTime":"Main time","ui.worldTime":"World time","ui.customText":"Custom text"}};
63
63
  let t;
64
64
  let localeService;
65
65
  // 文案取值(跟随宿主界面语言):优先 DSH 的 locale 服务;服务缺席、未授权或 bind 失效时
@@ -261,16 +261,17 @@ const FIELD_REGISTRY = [
261
261
  { id: 'billingSpend', label: "field.billingSpend.label", group: 'plugin', modes: ['billing'], colorKind: 'inherit', note: "field.billingSpend.note" },
262
262
  { id: 'budget', label: "field.budget.label", group: 'plugin', modes: ['billing'], colorKind: 'inherit', note: "field.budget.note" },
263
263
  { id: 'freeQuota', label: "field.freeQuota.label", group: 'plugin', modes: ['billing'], colorKind: 'inherit', note: "field.freeQuota.note" },
264
+ // 插件字段 · 上下文占用圆环(DSH 原生 ContextMeter 的接管版):
265
+ // 外观、几何与交互面板与原生一致,但显隐/配色并入本插件字段体系;
266
+ // 始终渲染在本插件信息栏的主行(即「简洁模式」可见的那一行)最右端,原生那一份由样式隐藏。
267
+ // 归 plugin 组:主行两种模式都在,按 native 组处理会让它在简洁模式下消失。
268
+ { id: 'contextUsage', label: "field.contextUsage.label", group: 'plugin', modes: ['common'], colorKind: 'meter', note: "field.contextUsage.note" },
264
269
  // 原生字段(DeepSeek 原生底部栏原有;完整模式独占可见)
265
270
  { id: 'turnsSteps', label: "field.turnsSteps.label", group: 'native', modes: ['native'], colorKind: 'inherit', note: "field.turnsSteps.note" },
266
271
  { id: 'llmTime', label: "field.llmTime.label", group: 'native', modes: ['native'], colorKind: 'inherit', note: "field.llmTime.note" },
267
272
  { id: 'toolTime', label: "field.toolTime.label", group: 'native', modes: ['native'], colorKind: 'inherit', note: "field.toolTime.note" },
268
273
  { id: 'cacheHit', label: "ui.cacheHit", group: 'native', modes: ['native'], colorKind: 'inherit', note: "field.cacheHit.note" },
269
274
  { id: 'tokensIO', label: "field.tokensIO.label", group: 'native', modes: ['native'], colorKind: 'inherit', note: "field.tokensIO.note" },
270
- // 原生信息 · 上下文占用圆环(DSH 原生 ContextMeter 的接管版):
271
- // 外观、几何与交互面板与原生一致,但显隐/配色并入本插件字段体系;
272
- // 始终渲染在本插件信息栏的主行(即「简洁模式」可见的那一行)最右端,原生那一份由样式隐藏。
273
- { id: 'contextUsage', label: "field.contextUsage.label", group: 'native', modes: ['common'], colorKind: 'meter', note: "field.contextUsage.note" },
274
275
  // ---------- 提醒字段(第三个列表「提醒信息」,2026-09-25 用户拍板从插件组独立) ----------
275
276
  // 独立成组的理由:提醒是「一次性事件」而不是「常驻信息」,诉求与插件信息相反 ——
276
277
  // 想看花费但不想被红字打扰的人,必须能只关提醒而不动信息。
@@ -1966,7 +1967,25 @@ function bibSetPollingStop(id) {
1966
1967
  }
1967
1968
  function bibSetVersionSection(props) {
1968
1969
  const state = props.state;
1969
- if (!state) return null;
1970
+ // 【2026-09-25 血案】宿主进程还没加载到这一版插件代码时(典型场景:包文件已被替换成新版,
1971
+ // 但 DSH 还跑着启动时载入的旧 host —— 桌面端更新插件后没重启就是这个样子),
1972
+ // getUpdateState 这个接口在旧 host 里根本不存在,读状态必然失败。
1973
+ // 旧写法是 `if (!state) return null` —— 整块连同标题一起消失。用户看到一个「完全没有更新入口」
1974
+ // 的设置页,只能得出「还是得卸载重装」的结论。所以失败时**必须保留板块**并讲清原因。
1975
+ if (!state) {
1976
+ if (!props.error) return null;
1977
+ return React.createElement('section', { className: 'bib-set-card', 'aria-labelledby': 'bib-set-version-title' },
1978
+ bibSetCardHeader({
1979
+ static: true,
1980
+ titleId: 'bib-set-version-title',
1981
+ title: t('ui.versionAndUpdateTitle'),
1982
+ description: t('ui.versionAndUpdateDesc'),
1983
+ }),
1984
+ React.createElement('div', { className: 'bib-set-data-actions' },
1985
+ React.createElement('div', { className: 'bib-set-data-row' },
1986
+ React.createElement('div', { className: 'bib-set-data-copy' },
1987
+ React.createElement('p', { className: 'bib-set-data-desc' }, t('ui.versionUnavailable'))))));
1988
+ }
1970
1989
  const busy = props.busy === true;
1971
1990
  const shown = function (value) { return typeof value === 'string' && value.length > 0 ? value : t('ui.versionUnknown'); };
1972
1991
  // 方向由 host 判定(见 getUpdateState):update = 磁盘已是新版待重启;rollback = 用户回滚过、
@@ -2086,9 +2105,11 @@ function InfoBarSettingsSection() {
2086
2105
  });
2087
2106
  }, []);
2088
2107
  const [searchQuery, setSearchQuery] = React.useState('');
2089
- // 三个分组各自独立折叠。默认展开「插件信息」与「提醒信息」:提醒是用户要单独掌控的一组,
2090
- // 藏在折叠里等于没有入口;「原生信息」默认折叠(多数人只在完整模式才需要看它)。
2091
- const [groupOpen, setGroupOpen] = React.useState({ native: false, plugin: true, notice: true });
2108
+ // 三个分组各自独立折叠,**默认全部收起**(2026-09-25 用户拍板):
2109
+ // 全展开会让设置页一次性铺满几十行,用户找不到想看的那一组;先给三行标题,
2110
+ // 想看哪组点哪组。搜索框一有输入就自动全展开(见下方搜索框的 onChange),
2111
+ // 所以「找字段」这条路径不会因为默认收起而变慢。
2112
+ const [groupOpen, setGroupOpen] = React.useState({ native: false, plugin: false, notice: false });
2092
2113
  // 决策 4:重置的二次确认。null=未在确认;'fields'/'colors'=待确认的重置类别。
2093
2114
  const [resetConfirm, setResetConfirm] = React.useState(null);
2094
2115
  const [resetAcknowledged, setResetAcknowledged] = React.useState(false);
@@ -2124,13 +2145,21 @@ function InfoBarSettingsSection() {
2124
2145
  // 所以单独拉取并定期跟随,用户不必手动刷新页面。
2125
2146
  const [updateState, setUpdateState] = React.useState(null);
2126
2147
  const [updateBusy, setUpdateBusy] = React.useState(false);
2148
+ // 读不到更新状态时保留原因:不能只是静默不显示(见 bibSetVersionSection 顶部)。
2149
+ // 一旦成功读到过一次就清掉;此后的偶发失败沿用上一次的好状态,不打断已显示的版本信息。
2150
+ const [updateError, setUpdateError] = React.useState(null);
2127
2151
  React.useEffect(function () {
2128
2152
  let active = true;
2129
2153
  function load() {
2130
2154
  rpc('getUpdateState').then(function (res) {
2131
2155
  if (!active) return;
2156
+ setUpdateError(null);
2132
2157
  if (res && typeof res === 'object') setUpdateState(res);
2133
- }).catch(function () { /* 读不到更新状态不影响设置页其余部分 */ });
2158
+ }).catch(function (err) {
2159
+ if (!active) return;
2160
+ // 读不到更新状态不影响设置页其余部分
2161
+ setUpdateError(String((err && err.message) || err || 'unknown'));
2162
+ });
2134
2163
  }
2135
2164
  load();
2136
2165
  const timer = bibSetPollingStart(load, 15000);
@@ -2548,6 +2577,7 @@ function InfoBarSettingsSection() {
2548
2577
  bibSetDataCard({ busy: saving || dataBusy, onExport: runExport, onClear: runClearRecords }),
2549
2578
  bibSetVersionSection({
2550
2579
  state: updateState,
2580
+ error: updateError,
2551
2581
  busy: updateBusy,
2552
2582
  onToggleAuto: onToggleUpdateAuto,
2553
2583
  onCheck: onCheckUpdate,
@@ -3642,9 +3672,11 @@ module.exports = {
3642
3672
 
3643
3673
  // ---- 组装(分隔符收合与「刷新失败」去重见模块级 assembleInfoBarRow) ----
3644
3674
  const nodes = assembleInfoBarRow(groups, trailingErrorGroups, React.createElement);
3645
- // 上下文占用圆环(DSH 原生信息,由本插件接管):挂在主行最右端——即「简洁模式」可见的那一行里的最后一个元素。
3675
+ // 上下文占用圆环(原型是 DSH 原生信息,已由本插件接管):挂在主行最右端——即「简洁模式」可见的那一行里的最后一个元素。
3646
3676
  // 与其它字段同源:fields.contextUsage 管显隐、colors.contextUsage 管配色;数据不足时整块不渲染。
3647
- const contextInfo = full && fieldVisible('contextUsage') ? contextOccupancy(pressureProj) : null;
3677
+ // 【2026-09-25 用户拍板】按「插件信息」对待:门控只有 fieldVisible 一条,**不得再叠加 full** ——
3678
+ // 之前写成 full && fieldVisible(...),结果是简洁模式下圆环整块消失,而它恰恰属于主行。
3679
+ const contextInfo = fieldVisible('contextUsage') ? contextOccupancy(pressureProj) : null;
3648
3680
  const contextNode = contextInfo === null ? null : React.createElement(ContextMeterRing, {
3649
3681
  key: 'ctx',
3650
3682
  context: contextInfo,
package/lib/constants.js CHANGED
@@ -14,6 +14,10 @@ export const BILLING_PROVIDERS = ['together', 'fireworks', 'amazon-bedrock', 'cl
14
14
  // - group:设置页「显示字段」的分组(三组,组内每行说明仍标注出现条件):
15
15
  // native 原生字段(DeepSeek 原生底部栏原有,只在完整模式出现)| plugin 插件字段(本插件新增,两种模式都显示)
16
16
  // | notice 提醒字段(更新与失败等一次性提醒;2026-09-25 用户拍板从 plugin 组独立成第三个列表)
17
+ // 2026-09-25 用户再次澄清组别的含义:组别就是「它属于谁」——**简洁模式只显示 plugin 组,
18
+ // 完整模式显示 native + plugin**。因此一个字段归哪一组,直接决定它在简洁模式下能不能出现。
19
+ // 上下文圆环虽然原型来自 DSH 原生底部栏,但已经被本插件接管、且始终渲染在主行(简洁模式可见的
20
+ // 那一行最右端),所以按 plugin 组对待 —— 否则它在简洁模式下会整块消失。
17
21
  // 排序:原生信息 → 插件信息 → 提醒信息,与设置页三张折叠卡的顺序一致
18
22
  // - note:出现条件说明(设置页每行的小字说明)
19
23
  // - suggestKeep:错误/提醒类字段,页面标注「建议保留」(用户拍板:允许关闭但劝留)
@@ -49,16 +53,17 @@ export const FIELD_REGISTRY = [
49
53
  { id: 'billingSpend', label: "field.billingSpend.label", group: 'plugin', modes: ['billing'], colorKind: 'inherit', note: "field.billingSpend.note" },
50
54
  { id: 'budget', label: "field.budget.label", group: 'plugin', modes: ['billing'], colorKind: 'inherit', note: "field.budget.note" },
51
55
  { id: 'freeQuota', label: "field.freeQuota.label", group: 'plugin', modes: ['billing'], colorKind: 'inherit', note: "field.freeQuota.note" },
56
+ // 插件字段 · 上下文占用圆环(DSH 原生 ContextMeter 的接管版):
57
+ // 外观、几何与交互面板与原生一致,但显隐/配色并入本插件字段体系;
58
+ // 始终渲染在本插件信息栏的主行(即「简洁模式」可见的那一行)最右端,原生那一份由样式隐藏。
59
+ // 归 plugin 组:主行两种模式都在,按 native 组处理会让它在简洁模式下消失。
60
+ { id: 'contextUsage', label: "field.contextUsage.label", group: 'plugin', modes: ['common'], colorKind: 'meter', note: "field.contextUsage.note" },
52
61
  // 原生字段(DeepSeek 原生底部栏原有;完整模式独占可见)
53
62
  { id: 'turnsSteps', label: "field.turnsSteps.label", group: 'native', modes: ['native'], colorKind: 'inherit', note: "field.turnsSteps.note" },
54
63
  { id: 'llmTime', label: "field.llmTime.label", group: 'native', modes: ['native'], colorKind: 'inherit', note: "field.llmTime.note" },
55
64
  { id: 'toolTime', label: "field.toolTime.label", group: 'native', modes: ['native'], colorKind: 'inherit', note: "field.toolTime.note" },
56
65
  { id: 'cacheHit', label: "ui.cacheHit", group: 'native', modes: ['native'], colorKind: 'inherit', note: "field.cacheHit.note" },
57
66
  { id: 'tokensIO', label: "field.tokensIO.label", group: 'native', modes: ['native'], colorKind: 'inherit', note: "field.tokensIO.note" },
58
- // 原生信息 · 上下文占用圆环(DSH 原生 ContextMeter 的接管版):
59
- // 外观、几何与交互面板与原生一致,但显隐/配色并入本插件字段体系;
60
- // 始终渲染在本插件信息栏的主行(即「简洁模式」可见的那一行)最右端,原生那一份由样式隐藏。
61
- { id: 'contextUsage', label: "field.contextUsage.label", group: 'native', modes: ['common'], colorKind: 'meter', note: "field.contextUsage.note" },
62
67
  // ---------- 提醒字段(第三个列表「提醒信息」,2026-09-25 用户拍板从插件组独立) ----------
63
68
  // 独立成组的理由:提醒是「一次性事件」而不是「常驻信息」,诉求与插件信息相反 ——
64
69
  // 想看花费但不想被红字打扰的人,必须能只关提醒而不动信息。
package/lib/locales.js CHANGED
@@ -195,6 +195,7 @@ export const LOCALES = {
195
195
  "ui.updateCommandCopied": "更新命令已复制",
196
196
  "ui.versionAndUpdateTitle": "版本与更新",
197
197
  "ui.versionAndUpdateDesc": "插件会自己把新版本替换到本机,重启 DSH 后生效。更新只替换插件自己的文件,账单记录与设置不受影响。",
198
+ "ui.versionUnavailable": "当前运行的 DSH 还没载入这一版插件的更新功能,所以这里暂时只显示这一行。重启 DSH 后,下面就会出现当前版本、更新方式与「检查更新」。",
198
199
  "ui.versionRunning": "运行中版本 {version}",
199
200
  "ui.versionLatest": "最新版本 {version}",
200
201
  "ui.versionUnknown": "未知",
@@ -371,7 +372,7 @@ export const LOCALES = {
371
372
  "group.plugin": "插件信息",
372
373
  "group.notice": "提醒信息",
373
374
  "group.native.desc": "DeepSeek 原生底栏原有的字段,只在完整模式显示。开关只决定开和关,与模式不冲突。",
374
- "group.plugin.desc": "本插件新增的字段,简洁模式与完整模式都会显示。",
375
+ "group.plugin.desc": "本插件新增的字段(含接管过来的上下文圆环),简洁模式与完整模式都会显示。",
375
376
  "group.notice.desc": "更新、失败等一次性提醒。可整组关掉,不影响上面的信息显示。",
376
377
  "ui.listSeparator": "、",
377
378
  "ui.sentenceEnd": "。",
@@ -593,6 +594,7 @@ export const LOCALES = {
593
594
  "ui.updateCommandCopied": "Update command copied",
594
595
  "ui.versionAndUpdateTitle": "Version and updates",
595
596
  "ui.versionAndUpdateDesc": "The plugin replaces its own files with a new version; restart DSH to activate. Only the plugin's own files change, so billing records and settings are untouched.",
597
+ "ui.versionUnavailable": "The DSH currently running has not loaded this version of the plugin yet, so only this line can be shown here. Restart DSH and the running version, the update mode and the check button will appear.",
596
598
  "ui.versionRunning": "Running version {version}",
597
599
  "ui.versionLatest": "Latest version {version}",
598
600
  "ui.versionUnknown": "Unknown",
@@ -769,7 +771,7 @@ export const LOCALES = {
769
771
  "group.plugin": "Plugin information",
770
772
  "group.notice": "Notices",
771
773
  "group.native.desc": "Fields the DeepSeek bar already had. Full mode only. The switch only turns a field on or off; it never changes the mode.",
772
- "group.plugin.desc": "Fields this plugin adds. Shown in both compact and full mode.",
774
+ "group.plugin.desc": "Fields this plugin adds, the adopted context ring included. Shown in both compact and full mode.",
773
775
  "group.notice.desc": "One-off notices such as updates and failures. Turn the whole list off without touching the information above.",
774
776
  "ui.listSeparator": ", ",
775
777
  "ui.sentenceEnd": ".",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-bottom-info-bar",
3
- "version": "1.19.0",
3
+ "version": "1.19.2",
4
4
  "description": "Shows the current model, balance and spend under the composer.",
5
5
  "keywords": [
6
6
  "deepseek",