dsh-workbuddy-connect 0.7.7 → 0.7.9

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.en.md CHANGED
@@ -13,7 +13,7 @@ Brings the models available in your signed-in WorkBuddy / WorkBuddy AI desktop a
13
13
  ```text
14
14
  Please install and verify the DSH (DeepSeek Harness) plugin dsh-workbuddy-connect for me (project: https://github.com/corrinehu/dsh-workbuddy-connect).
15
15
  Start by reading the project README and confirming which interface I actually use (Web / Desktop / TUI) and its DSH core version — for the Desktop app, the bundled core, never the standalone CLI's version.
16
- Then install from the official npm package per the version mapping (0.2.1-rc.1 -> 0.7.7, 0.2.0-rc.2 -> 0.7.6, rc.1 -> 0.7.0, 0.1.5-0.1.7 -> 0.6.5), preferring a locally supported non-market channel; on some Desktop distributions (the official Electron app in particular) the profile is app-managed and rules vary by distribution — check mine first, then explore its compliant install route, but never bypass its validation.
16
+ Then install from the official npm package per the version mapping (0.2.1-rc.2 -> 0.7.9, 0.2.1-rc.1 -> 0.7.7, 0.2.0-rc.2 -> 0.7.6, rc.1 -> 0.7.0, 0.1.5-0.1.7 -> 0.6.5), preferring a locally supported non-market channel; on some Desktop distributions (the official Electron app in particular) the profile is app-managed and rules vary by distribution — check mine first, then explore its compliant install route, but never bypass its validation.
17
17
  Ask for my consent and make backups before changing any local files or configuration.
18
18
  After installing, verify the WorkBuddy group appears in the model picker and walk me through one short conversation.
19
19
  If the Desktop install still fails generation validation (e.g. the @types/retry false positive), report it honestly, reference upstream dataelement/dsh-desktop#688, and suggest switching to the standalone Web / TUI — do not modify dependency packages or bypass the check.
@@ -23,7 +23,8 @@ Core-to-plugin quick reference (full table in "Compatibility and release history
23
23
 
24
24
  | DSH core | Recommended plugin |
25
25
  |---|---|
26
- | 0.2.1-rc.1 | 0.7.7 (npm latest) |
26
+ | 0.2.1-rc.2 | 0.7.9 (npm latest) |
27
+ | 0.2.1-rc.1 | 0.7.7 |
27
28
  | 0.2.0-rc.2 | 0.7.6 |
28
29
  | 0.2.0-rc.1 | 0.7.0 |
29
30
  | 0.1.5 – 0.1.7 | 0.6.5 |
@@ -32,8 +33,8 @@ Core-to-plugin quick reference (full table in "Compatibility and release history
32
33
  <summary>Manual install (command line, Web / TUI only)</summary>
33
34
 
34
35
  ```sh
35
- # Web (pin per your actual core — example: 0.2.0-rc.2 -> 0.7.6; or install from source via github:corrinehu/dsh-workbuddy-connect)
36
- dsh plugin --profile web add dsh-workbuddy-connect@0.7.6
36
+ # Web (pin per your actual core — example: 0.2.1-rc.2 -> 0.7.9; or install from source via github:corrinehu/dsh-workbuddy-connect)
37
+ dsh plugin --profile web add dsh-workbuddy-connect@0.7.9
37
38
  dsh web
38
39
 
39
40
  # TUI (example for a 0.1.x core; that profile needs pnpm 11, e.g. npx pnpm@11)
@@ -59,11 +60,11 @@ dsh --profile dsh-tui
59
60
 
60
61
  ![WorkBuddy AI models in the DSH model picker](assets/5.png)
61
62
 
62
- - **Image input**: most models accept images pasted or dropped straight into the conversation (GLM-5.3-Flash, GLM-5.2, the DeepSeek-V4 series, and more); the few text-only models (e.g. GLM-5.1) clearly say so.
63
+ - **Image input**: most models accept images pasted or dropped straight into the conversation (GLM-5.3-Flash, the DeepSeek-V4 series, and more); the few text-only models (e.g. GLM-5.1 / GLM-5.2 on the China endpoint) clearly say so.
63
64
 
64
65
  - **Reasoning levels**: levels explicitly declared by WorkBuddy appear directly — for example, GLM-5.3 and GLM-5.3-Flash offer low / high / max. For models without declared levels, Web and Desktop offer a manual check in the model picker (it sends a few requests and may consume credit); models without a check result or selectable levels keep using WorkBuddy's default.
65
66
 
66
- - **Balance at a glance**: with a WorkBuddy / WorkBuddy AI model selected, the composer shows the account's remaining credit next to the model selector (e.g. `WB.3,401 credits`, `WB AI.3,401 credits` on the international app). Credit is not polled automatically (every status read is a real billing query): one read on mount, then refresh on demand with the ↻ beside it. During session switching, the controls may briefly hide until the model selection is ready, then return automatically. The refresh button remains available even when the model has no reasoning-level detection entry or the balance cannot be read.
67
+ - **Balance at a glance**: with a WorkBuddy / WorkBuddy AI model selected, the composer shows the account's remaining credit next to the model selector (e.g. `WB.3,401 credits`, `WB AI.3,401 credits` on the international app). Credit is not polled automatically (every status read is a real billing query): one read on mount, then refresh on demand with the ↻ before the balance. During session switching, the controls may briefly hide until the model selection is ready, then return automatically. The refresh button remains available even when the model has no reasoning-level detection entry or the balance cannot be read.
67
68
 
68
69
  - **Status and detection**: Settings → Plugins → the matching card shows the account, token validity, remaining credit, and model offers; it also refreshes the model list manually, shows whether the current list came from the upstream or the built-in fallback, and runs manual reasoning-level detection for eligible models. On DSH 0.1.5 the entry lives under Settings → Plugins; on 0.1.6+ it moved to the left-sidebar Plugins panel (workbuddy-connect → View) — and the Settings → Models page shows no WorkBuddy entries on either generation, by design.
69
70
 
@@ -83,7 +84,7 @@ The same UI works unchanged inside the DSH 0.1.5 settings cards:
83
84
 
84
85
  ![Settings card showing the plugin](assets/2.png)
85
86
 
86
- The expanded card has three tabs: Status shows the account, token validity, total credit, catalog source, and reasoning-level detection; Context lists each model's context window, and the international version's "use the upstream's largest declared context window" switch lives here (on by default, so DSH sizes context compression to the largest declared window; turn it off to follow the upstream default instead, and the preference persists across restarts); Details shows per-package credit and model offers. The CN and international versions each get their own card.
87
+ The expanded card has three tabs: Status shows the account, token validity, total credit, catalog source, and reasoning-level detection; Context lists each model's context window, and the international version's "use the upstream's largest declared context window" switch lives here (on by default, so DSH sizes context compression to the largest declared window; turn it off to follow the upstream default instead, and the preference persists across restarts); Details combines credit packages with the same name and shows model offers. The CN and international versions each get their own card.
87
88
 
88
89
  ![Settings card showing account and remaining credit](assets/3.png)
89
90
 
@@ -118,7 +119,7 @@ dsh plugin --profile web exec dsh-workbuddy-connect doctor --provider workbuddy-
118
119
  - **International-version environments not yet covered**: on Windows / WSL / Linux no reliable source for the international app's version has been located yet, so the saved value or the built-in default is used. On macOS, real-shim checks covered complete GPT-family replies, tool calls, and continued turns.
119
120
  - **Behaviour change with no credentials**: a version whose app was never signed in — and that left no plugin-owned copy — no longer shows a model group. The CN version used to display a built-in fallback list, but every model on it failed when selected.
120
121
  - **The enterprise credit path currently covers the CN product only**: the international enterprise billing interface is unverified, so those accounts still read through the personal endpoint pending measurement. The enterprise branch could not be tested locally (the development machine holds a personal account); it was implemented from the official app's interface contract, and reports from enterprise users are welcome.
121
- - **Settings entries vary with the DSH version**: on 0.1.5 / 0.1.6 the plugin installs its settings sections as before (`authFile` / `authFileAI` stay readable from `settings.yaml` and the TUI `/settings`); on 0.1.7+ / 0.2.0 the settings service no longer offers that interface, so the plugin degrades to a settings-less provider — models, the picker, model visibility, and context windows keep working; only the "use the upstream's declared maximum context window" preference stops being persistable.
122
+ - **Settings entries vary with the DSH version**: older services use `installSection`; newer ones use SettingsForms. On DSH 0.2.1-rc.2, 0.7.9 restores the international edition's maximum-context switch, enabled by default. Turning it off uses the upstream default window, and the preference survives restarts. The switch appears only once this plugin's writable settings entry is ready; while waiting, the maximum window remains the default.
122
123
  - Relies on WorkBuddy client interfaces (not a public API); the plugin may need updates as WorkBuddy changes.
123
124
 
124
125
  ## Compatibility and release history
@@ -127,7 +128,8 @@ The plugin version must match the DSH core — a mismatched combination fails to
127
128
 
128
129
  | DSH core | Recommended plugin | Notes |
129
130
  |---|---|---|
130
- | `0.2.1-rc.1` | `0.7.7` | Current line; the core moved to `@earendil-works/pi-ai` 1.3.0, so the plugin bundles 1.3.0 too — a leftover 0.87.1 overrides entry must be removed (see the pi-ai note below). |
131
+ | `0.2.1-rc.2` | `0.7.9` | Targets this core only; `0.2.0-rc.2` and `0.2.1-rc.2` differ. Check the core bundled in your Desktop app. |
132
+ | `0.2.1-rc.1` | `0.7.7` | The core moved to `@earendil-works/pi-ai` 1.3.0, so the plugin bundles 1.3.0 too — a leftover 0.87.1 overrides entry must be removed (see the pi-ai note below). |
131
133
  | `0.2.0-rc.2` | `0.7.6` | Previous core line; fixes enterprise catalog gaps and international chat requests blocked by the upstream channel check. Avoid 0.7.2 with its registry regression. |
132
134
  | `0.2.0-rc.1` | `0.7.0` | 0.7.1 drops rc.1 support; stay on this version. |
133
135
  | `0.1.5` – `0.1.7` | `0.6.5` | Final release for the old cores; 0.7.0 targets 0.2.0 only. |
@@ -136,6 +138,8 @@ The plugin version must match the DSH core — a mismatched combination fails to
136
138
 
137
139
  Release history (full records at [releases](https://github.com/corrinehu/dsh-workbuddy-connect/releases)):
138
140
 
141
+ - **0.7.9**: restores the international edition's maximum-context switch on DSH 0.2.1-rc.2, including delayed initialization and persistent settings (PR [#172](https://github.com/corrinehu/dsh-workbuddy-connect/pull/172), by @1Dreamer666); avoids fetch-blocked local ports that could cause international-edition 502 errors (PR [#164](https://github.com/corrinehu/dsh-workbuddy-connect/pull/164), by @Xiong-Ziyi); combines credit packages with the same name to reduce repeated entries.
142
+ - **0.7.8**: adapts to DSH 0.2.1-rc.2; bundles the official atomic-write helper instead of relying on host module exposure; refreshes the China catalog snapshot and distinguishes Hy3 / Hy3-X; improves probe result labels and fixes the credit-refresh placement and tooltip. Thanks to @chenpiyanghappy for PR [#156](https://github.com/corrinehu/dsh-workbuddy-connect/pull/156).
139
143
  - **0.7.7**: adapts to the DSH 0.2.1-rc.1 core: peers narrow to 0.2.1-rc.1 and the plugin-bundled `@earendil-works/pi-ai` moves to 1.3.0 with it (a profile-level leftover 0.87.1 overrides entry must be removed, or the plugin fails to load).
140
144
  - **0.7.6**: fixes enterprise accounts missing `glm-5.3-flashx` from the model catalog ([#123](https://github.com/corrinehu/dsh-workbuddy-connect/issues/123)), and fixes international chat requests being blocked by the upstream channel check ([#139](https://github.com/corrinehu/dsh-workbuddy-connect/issues/139) / [#142](https://github.com/corrinehu/dsh-workbuddy-connect/issues/142)).
141
145
  - **0.7.5**: restores composer controls after session switching ([#125](https://github.com/corrinehu/dsh-workbuddy-connect/issues/125) / [#132](https://github.com/corrinehu/dsh-workbuddy-connect/issues/132)), fixes WSL helper environment forwarding ([#133](https://github.com/corrinehu/dsh-workbuddy-connect/issues/133)), and adds community projects to both READMEs.
@@ -146,9 +150,9 @@ Release history (full records at [releases](https://github.com/corrinehu/dsh-wor
146
150
  - **0.7.0**: adapts to DSH 0.2.0's settings-service rework and drops 0.1.x support.
147
151
  - **0.6.5**: final release of the 0.1.x line.
148
152
 
149
- Pinned-version install example: `dsh plugin --profile web add dsh-workbuddy-connect@0.7.6`.
153
+ Pinned-version install example: `dsh plugin --profile web add dsh-workbuddy-connect@0.7.9`.
150
154
 
151
- **pi-ai versions are per core line and must not be mixed**: the 0.2.1-rc.1 core line (plugin 0.7.7+) moved to `@earendil-works/pi-ai` 1.3.0 (bundled by the plugin), so a profile-level leftover `overrides: {'@earendil-works/pi-ai': '0.87.1'}` **must be removed** or the plugin fails to load; the 0.2.0-rc.2 core line (plugin 0.7.6) still requires `^0.87.1` — on that line, **do not** upgrade the profile-level pi-ai to 1.x, and do not act on third-party plugin managers' "updatable" prompts, which do not check peer constraints ([#86](https://github.com/corrinehu/dsh-workbuddy-connect/issues/86)).
155
+ **pi-ai versions are per core line and must not be mixed**: the 0.2.1-rc.1 / rc.2 core lines (plugin 0.7.7 / 0.7.8–0.7.9 respectively) moved to `@earendil-works/pi-ai` 1.3.0 (bundled by the plugin), so a profile-level leftover `overrides: {'@earendil-works/pi-ai': '0.87.1'}` **must be removed** or the plugin fails to load; the 0.2.0-rc.2 core line (plugin 0.7.6) still requires `^0.87.1` — on that line, **do not** upgrade the profile-level pi-ai to 1.x, and do not act on third-party plugin managers' "updatable" prompts, which do not check peer constraints ([#86](https://github.com/corrinehu/dsh-workbuddy-connect/issues/86)).
152
156
 
153
157
  ## Disclaimer
154
158
 
@@ -159,10 +163,11 @@ Pinned-version install example: `dsh plugin --profile web add dsh-workbuddy-conn
159
163
 
160
164
  ## Related Projects / Community Ecosystem
161
165
 
162
- - **[HanaAgent](https://github.com/liliMozi/openhanako)**: an independent personal AI Agent project.
166
+ - **[dsh-buddy-checkin](https://github.com/corrinehu/dsh-buddy-checkin)**: a daily check-in plugin for the WorkBuddy China edition, maintained by this project's author.
167
+ - **[dsh-workbuddy-switcher](https://github.com/ddGuo/dsh-workbuddy-switcher)**: a community-maintained WorkBuddy account management and switching plugin.
163
168
  - **[hana-workbuddy-connect](https://github.com/miaoyongxu/hana-workbuddy-connect)**: a community-maintained unofficial adapter project that reuses parts of the `dsh-workbuddy-connect` implementation to bring WorkBuddy / WorkBuddy AI models to HanaAgent.
164
169
 
165
- Both projects are maintained independently by third parties. The compatibility, security, and usage support of `hana-workbuddy-connect` are the responsibility of its maintainer. Listing them here is not an official endorsement, nor does it imply any stability or compatibility commitment on this plugin's internal interfaces.
170
+ See each project's documentation for supported versions and installation requirements. Except for `dsh-buddy-checkin`, these projects are independently maintained by third parties. Listing them here is not an official endorsement or a stability or compatibility commitment for this plugin's internal interfaces.
166
171
 
167
172
  ## Acknowledgements
168
173
 
package/README.md CHANGED
@@ -13,7 +13,7 @@
13
13
  ```text
14
14
  请帮我安装并验证 DSH(DeepSeek Harness)插件 dsh-workbuddy-connect(项目地址:https://github.com/corrinehu/dsh-workbuddy-connect):
15
15
  先阅读项目 README,确认我实际使用的界面(Web / Desktop / TUI)与 DSH 内核版本,桌面版以 App 内置核心为准,不要用独立 CLI 的版本代替;
16
- 再按版本对应关系从 npm 正式包安装(0.2.1-rc.1→0.7.7、0.2.0-rc.2→0.7.6、rc.1→0.7.0、0.1.5–0.1.7→0.6.5),优先走本机受支持的非插件市场渠道;部分 Desktop 发行版(尤其官方 Electron 版)的 profile 由 App 管理,各发行版规则未必相同,先确认我所用的发行版,再探查其合规的安装方式,但不得绕过其校验;
16
+ 再按版本对应关系从 npm 正式包安装(0.2.1-rc.2→0.7.9、0.2.1-rc.1→0.7.7、0.2.0-rc.2→0.7.6、rc.1→0.7.0、0.1.5–0.1.7→0.6.5),优先走本机受支持的非插件市场渠道;部分 Desktop 发行版(尤其官方 Electron 版)的 profile 由 App 管理,各发行版规则未必相同,先确认我所用的发行版,再探查其合规的安装方式,但不得绕过其校验;
17
17
  任何本地文件或配置改动,先征得我同意并做好备份;
18
18
  装完后验证模型选择器里出现 WorkBuddy 分组,并陪我完成一次简短对话;
19
19
  若 Desktop 安装仍因 generation 校验失败(如 @types/retry 误报),请如实报告、参照上游 dataelement/dsh-desktop#688,并建议我改用独立的 Web / TUI,不要修改依赖包或绕过校验。
@@ -23,7 +23,8 @@
23
23
 
24
24
  | DSH 内核 | 推荐插件版 |
25
25
  |---|---|
26
- | 0.2.1-rc.1 | 0.7.7(npm latest) |
26
+ | 0.2.1-rc.2 | 0.7.9(npm latest) |
27
+ | 0.2.1-rc.1 | 0.7.7 |
27
28
  | 0.2.0-rc.2 | 0.7.6 |
28
29
  | 0.2.0-rc.1 | 0.7.0 |
29
30
  | 0.1.5 – 0.1.7 | 0.6.5 |
@@ -32,8 +33,8 @@
32
33
  <summary>手动安装(命令行,仅 Web / TUI)</summary>
33
34
 
34
35
  ```sh
35
- # Web(按实际内核固定版本,示例为 0.2.0-rc.2 → 0.7.6;也可用 github:corrinehu/dsh-workbuddy-connect 从源码安装)
36
- dsh plugin --profile web add dsh-workbuddy-connect@0.7.6
36
+ # Web(按实际内核固定版本,示例为 0.2.1-rc.2 → 0.7.9;也可用 github:corrinehu/dsh-workbuddy-connect 从源码安装)
37
+ dsh plugin --profile web add dsh-workbuddy-connect@0.7.9
37
38
  dsh web
38
39
 
39
40
  # TUI(示例为 0.1.x 内核;该 profile 需用 pnpm 11 安装,如 npx pnpm@11)
@@ -59,11 +60,11 @@ dsh --profile dsh-tui
59
60
 
60
61
  ![WorkBuddy AI 模型出现在 DSH 模型选择器中](assets/5.png)
61
62
 
62
- - **图片输入**:大部分模型支持在对话里直接粘贴或拖入图片(GLM-5.3-Flash、GLM-5.2、DeepSeek-V4 系列等);少数纯文字模型(如 GLM-5.1)会明确提示不支持。
63
+ - **图片输入**:大部分模型支持在对话里直接粘贴或拖入图片(GLM-5.3-Flash、DeepSeek-V4 系列等);少数纯文字模型(如 GLM-5.1、GLM-5.2)会明确提示不支持。
63
64
 
64
65
  - **推理档位**:WorkBuddy 明确声明的档位会直接显示,例如 GLM-5.3 和 GLM-5.3-Flash 可选 low / high / max。未声明档位的模型可在 Web 和 Desktop 的模型选择器中手动检测(发送少量请求,可能消耗积分);未检测或没有可用档位的模型使用 WorkBuddy 默认档位。
65
66
 
66
- - **余额速览**:选中 WorkBuddy / WorkBuddy AI 模型时,输入框底部在模型选择器旁显示当前账号的剩余积分(如 `WB.3,401(积分)`、国际版 `WB AI.3,401(积分)`)。积分不自动轮询(每次读取都是真实计费查询),挂载时读取一次后可点旁边的 ↻ 手动刷新。切换会话时组件可能短暂隐藏,模型选择就绪后自动恢复;即使模型没有推理档位检测入口或余额读取失败,刷新按钮仍保留。
67
+ - **余额速览**:选中 WorkBuddy / WorkBuddy AI 模型时,输入框底部在模型选择器旁显示当前账号的剩余积分(如 `WB.3,401(积分)`、国际版 `WB AI.3,401(积分)`)。积分不自动轮询(每次读取都是真实计费查询),挂载时读取一次后可点积分文字前方的 ↻ 手动刷新。切换会话时组件可能短暂隐藏,模型选择就绪后自动恢复;即使模型没有推理档位检测入口或余额读取失败,刷新按钮仍保留。
67
68
 
68
69
  - **信息查看与检测**:设置 → 插件 → 对应卡片可查看账号、令牌有效期、剩余积分和模型优惠,也可手动刷新模型列表并查看当前列表来自上游还是内置兜底,或对可检测模型手动检测推理档位。DSH 0.1.5 的入口在「设置 → 插件」,0.1.6+ 移到主界面左侧栏「插件」面板(workbuddy-connect → 查看);「设置 → 模型」页两代都不显示 WorkBuddy 条目,属有意设计。
69
70
 
@@ -83,7 +84,7 @@ dsh --profile dsh-tui
83
84
 
84
85
  ![设置卡片显示插件](assets/2.png)
85
86
 
86
- 卡片展开后分「状态 / 上下文 / 明细」三个标签:状态页展示账号、令牌有效期、合计积分、模型列表来源与推理档位检测;上下文页列出各模型上下文窗口,国际版可在这里关闭「使用上游声明的最大上下文窗口」(默认开启,DSH 按上游最大窗口安排上下文压缩;关闭后改用上游默认窗口,偏好持久化);明细页展示各套餐余量与模型优惠。国内版与国际版各有一张自己的卡片。
87
+ 卡片展开后分「状态 / 上下文 / 明细」三个标签:状态页展示账号、令牌有效期、合计积分、模型列表来源与推理档位检测;上下文页列出各模型上下文窗口,国际版可在这里关闭「使用上游声明的最大上下文窗口」(默认开启,DSH 按上游最大窗口安排上下文压缩;关闭后改用上游默认窗口,偏好持久化);明细页合并展示同名积分包的余量与模型优惠。国内版与国际版各有一张自己的卡片。
87
88
 
88
89
  ![设置卡片显示账号与剩余积分](assets/3.png)
89
90
 
@@ -119,7 +120,7 @@ dsh plugin --profile web exec dsh-workbuddy-connect doctor --provider workbuddy-
119
120
  - **国际版仍未覆盖的环境**:Windows / WSL / Linux 下国际版 App 的版本读取尚未找到可靠来源,会退回最近保存的版本或内置值。macOS 上已通过真实 shim 验证 GPT 系完整回复、工具调用与续轮。
120
121
  - **无凭据时的行为变化**:某版 App 从未登录、也没留下插件自留副本时,该版模型分组不再显示。此前国内版会显示一份内置兜底列表,但那些模型选了必然报错。
121
122
  - **企业账号积分目前仅覆盖国内版**:国际版企业账号的计费接口尚未验证,仍按个人版接口读取;待有实测结论后再扩展。企业账号分支在本机无法自测(开发机为个人账号),依据官方 App 的接口契约实现,欢迎企业账号用户反馈实测结果。
122
- - **设置入口随 DSH 版本而异**:0.1.5 / 0.1.6 上插件照常安装 `authFile` / `authFileAI` 等设置分区(`settings.yaml` 与 TUI `/settings` 均可读写);0.1.7+ / 0.2.0 的设置服务不再提供该接口,插件降级为无设置项的 provider——模型、选择器、模型显隐与上下文窗口照常工作,只是「使用上游声明的最大上下文窗口」这一偏好不再可持久化。
123
+ - **设置入口随 DSH 版本而异**:旧版设置服务使用 `installSection`,新版使用 SettingsForms。0.7.9 在 DSH 0.2.1-rc.2 上恢复国际版「使用上游声明的最大上下文窗口」开关,默认开启;关闭后使用上游默认窗口,设置在重启后保留。只有本插件的可写设置入口就绪后才显示开关,等待期间仍使用默认的最大窗口。
123
124
  - 依赖 WorkBuddy 客户端接口(非官方开放 API),WorkBuddy 更新后插件可能需要随之调整。
124
125
 
125
126
  ## 版本兼容与历史版本
@@ -128,7 +129,8 @@ dsh plugin --profile web exec dsh-workbuddy-connect doctor --provider workbuddy-
128
129
 
129
130
  | DSH 内核 | 推荐插件版 | 注意事项 |
130
131
  |---|---|---|
131
- | `0.2.1-rc.1` | `0.7.7` | 当前最新线;内核升级到 `@earendil-works/pi-ai` 1.3.0,插件同步自带 1.3.0,历史遗留的 0.87.1 overrides 必须移除(见下方 pi-ai 说明)。 |
132
+ | `0.2.1-rc.2` | `0.7.9` | 仅适配这一内核;`0.2.0-rc.2` 与 `0.2.1-rc.2` 不同,请核对 App 内置版本。 |
133
+ | `0.2.1-rc.1` | `0.7.7` | 内核升级到 `@earendil-works/pi-ai` 1.3.0,插件同步自带 1.3.0,历史遗留的 0.87.1 overrides 必须移除(见下方 pi-ai 说明)。 |
132
134
  | `0.2.0-rc.2` | `0.7.6` | 上一代内核线;修复企业账号模型目录缺项与国际版对话被渠道校验拦截,勿停留在有注册表回归的 0.7.2。 |
133
135
  | `0.2.0-rc.1` | `0.7.0` | 0.7.1 起不再支持 rc.1,请停留本版。 |
134
136
  | `0.1.5` – `0.1.7` | `0.6.5` | 旧内核最终版;0.7.0 起仅面向 0.2.0。 |
@@ -137,6 +139,8 @@ dsh plugin --profile web exec dsh-workbuddy-connect doctor --provider workbuddy-
137
139
 
138
140
  历次更新(完整记录见 [releases](https://github.com/corrinehu/dsh-workbuddy-connect/releases)):
139
141
 
142
+ - **0.7.9**:恢复 DSH 0.2.1-rc.2 上国际版最大上下文窗口开关,修复延迟初始化及设置持久化(PR [#172](https://github.com/corrinehu/dsh-workbuddy-connect/pull/172),by @1Dreamer666);避免本地服务绑定到 fetch 禁用端口导致国际版 502(PR [#164](https://github.com/corrinehu/dsh-workbuddy-connect/pull/164),by @Xiong-Ziyi);同名积分包合并展示,减少重复条目。
143
+ - **0.7.8**:适配 DSH 0.2.1-rc.2;将官方原子写入工具打包到插件,避免依赖宿主暴露该模块;更新国内模型目录快照,区分 Hy3 / Hy3-X;优化推理检测结果展示,调整积分刷新按钮位置并修正悬停提示。感谢 @chenpiyanghappy 的 PR [#156](https://github.com/corrinehu/dsh-workbuddy-connect/pull/156)。
140
144
  - **0.7.7**:适配 DSH 0.2.1-rc.1 内核:peer 收窄到 0.2.1-rc.1,插件自带的 `@earendil-works/pi-ai` 随内核升级到 1.3.0(profile 级历史遗留的 0.87.1 overrides 必须移除,否则插件无法加载);修复国际版与国内版推理档位检测停留「检测未完成」——上游把档位拒绝码改拼为 `invalid_parameter_value`([#143](https://github.com/corrinehu/dsh-workbuddy-connect/issues/143) / [#148](https://github.com/corrinehu/dsh-workbuddy-connect/issues/148),PR [#145](https://github.com/corrinehu/dsh-workbuddy-connect/pull/145));修复中文 Windows 控制台下注册表缺键诊断因 GBK 编码被误判(zh-CN 实机验证)。
141
145
  - **0.7.6**:修复企业账号模型目录缺少 `glm-5.3-flashx`([#123](https://github.com/corrinehu/dsh-workbuddy-connect/issues/123)),修复国际版对话请求被上游渠道校验拦截([#139](https://github.com/corrinehu/dsh-workbuddy-connect/issues/139) / [#142](https://github.com/corrinehu/dsh-workbuddy-connect/issues/142))。
142
146
  - **0.7.5**:修复切换会话后输入框余额与刷新按钮消失([#125](https://github.com/corrinehu/dsh-workbuddy-connect/issues/125) / [#132](https://github.com/corrinehu/dsh-workbuddy-connect/issues/132)),修复 WSL 调用 Windows 凭据解密程序的环境转发([#133](https://github.com/corrinehu/dsh-workbuddy-connect/issues/133)),README 收录社区项目([#130](https://github.com/corrinehu/dsh-workbuddy-connect/issues/130))。
@@ -147,9 +151,9 @@ dsh plugin --profile web exec dsh-workbuddy-connect doctor --provider workbuddy-
147
151
  - **0.7.0**:适配 DSH 0.2.0 的设置服务改造,不再支持 0.1.x。
148
152
  - **0.6.5**:0.1.x 线最终版本。
149
153
 
150
- 固定版本安装示例:`dsh plugin --profile web add dsh-workbuddy-connect@0.7.6`。
154
+ 固定版本安装示例:`dsh plugin --profile web add dsh-workbuddy-connect@0.7.9`。
151
155
 
152
- **pi-ai 版本按内核线区分,不能混**:0.2.1-rc.1 内核线(插件 0.7.7+)已升级到 `@earendil-works/pi-ai` 1.3.0(由插件自带),profile 级历史遗留的 `overrides: {'@earendil-works/pi-ai': '0.87.1'}` **必须移除**,否则插件会因加载到旧一代 pi-ai 而启动失败;0.2.0-rc.2 内核线(插件 0.7.6)仍要求 `^0.87.1`,在这条线上**不要**把 profile 级的 pi-ai 升到 1.x,第三方插件管理器的「可更新」提示不校验 peer 约束、不能照做([#86](https://github.com/corrinehu/dsh-workbuddy-connect/issues/86))。
156
+ **pi-ai 版本按内核线区分,不能混**:0.2.1-rc.1 / rc.2 内核线(分别对应插件 0.7.7 / 0.7.8–0.7.9)已升级到 `@earendil-works/pi-ai` 1.3.0(由插件自带),profile 级历史遗留的 `overrides: {'@earendil-works/pi-ai': '0.87.1'}` **必须移除**,否则插件会因加载到旧一代 pi-ai 而启动失败;0.2.0-rc.2 内核线(插件 0.7.6)仍要求 `^0.87.1`,在这条线上**不要**把 profile 级的 pi-ai 升到 1.x,第三方插件管理器的「可更新」提示不校验 peer 约束、不能照做([#86](https://github.com/corrinehu/dsh-workbuddy-connect/issues/86))。
153
157
 
154
158
  ## 免责声明
155
159
 
@@ -160,10 +164,11 @@ dsh plugin --profile web exec dsh-workbuddy-connect doctor --provider workbuddy-
160
164
 
161
165
  ## 相关项目 / 社区生态
162
166
 
163
- - **[HanaAgent](https://github.com/liliMozi/openhanako)**:独立的个人 AI Agent 项目。
167
+ - **[dsh-buddy-checkin](https://github.com/corrinehu/dsh-buddy-checkin)**:本项目作者维护的 WorkBuddy 国内版每日签到插件。
168
+ - **[dsh-workbuddy-switcher](https://github.com/ddGuo/dsh-workbuddy-switcher)**:社区维护的 WorkBuddy 账号管理与切换插件。
164
169
  - **[hana-workbuddy-connect](https://github.com/miaoyongxu/hana-workbuddy-connect)**:社区维护的非官方适配项目,复用 `dsh-workbuddy-connect` 的部分实现,为 HanaAgent 接入 WorkBuddy / WorkBuddy AI 模型。
165
170
 
166
- 以上项目均由第三方独立维护。其中,`hana-workbuddy-connect` 的兼容性、安全性及使用支持由其维护者负责。收录不代表官方背书,也不意味着本插件对内部接口提供稳定性或兼容性承诺。
171
+ 适用版本与安装要求请参阅各项目说明。除 `dsh-buddy-checkin` 外,以上项目均由第三方独立维护;收录不代表官方背书,也不构成本插件内部接口的稳定性或兼容性承诺。
167
172
 
168
173
  ## 致谢
169
174
 
@@ -0,0 +1,24 @@
1
+ @deepseek-ai/dsh-atomic-write 0.2.1-rc.2
2
+ Bundled from https://github.com/deepseek-ai/deepseek-harness/tree/main/packages/util/atomic-write
3
+
4
+ MIT License
5
+
6
+ Copyright (c) 2026 DeepSeek
7
+
8
+ Permission is hereby granted, free of charge, to any person obtaining a copy
9
+ of this software and associated documentation files (the "Software"), to deal
10
+ in the Software without restriction, including without limitation the rights
11
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12
+ copies of the Software, and to permit persons to whom the Software is
13
+ furnished to do so, subject to the following conditions:
14
+
15
+ The above copyright notice and this permission notice shall be included in all
16
+ copies or substantial portions of the Software.
17
+
18
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
24
+ SOFTWARE.
package/lib/bin.js CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { C as WORKBUDDY_VARIANTS, O as WorkBuddyUpstreamClient, Q as resolveAppVersion, S as CN_VARIANT, a as readHostHeartbeat, b as atRestKeyProviderFor, c as WORKBUDDY_CONNECT_VERSION, l as FALLBACK_WORKBUDDY_AI_MODELS, m as WorkBuddyCredentialStore, o as workbuddyHostHeartbeatPath, r as isHeartbeatProcessAlive, u as FALLBACK_WORKBUDDY_MODELS, w as variantFor } from "./host-heartbeat-FytEpUGO.js";
2
+ import { C as WORKBUDDY_VARIANTS, O as WorkBuddyUpstreamClient, Q as resolveAppVersion, S as CN_VARIANT, a as readHostHeartbeat, b as atRestKeyProviderFor, c as WORKBUDDY_CONNECT_VERSION, l as FALLBACK_WORKBUDDY_AI_MODELS, m as WorkBuddyCredentialStore, o as workbuddyHostHeartbeatPath, r as isHeartbeatProcessAlive, u as FALLBACK_WORKBUDDY_MODELS, w as variantFor } from "./host-heartbeat-SJaZ33tR.js";
3
3
  import { realpathSync } from "node:fs";
4
4
  import { fileURLToPath } from "node:url";
5
5
  //#region src/bin.ts
package/lib/client.js CHANGED
@@ -456,6 +456,37 @@ window.__ModuleLoader__.load({
456
456
  color: "var(--dsw-alias-state-success-primary, #22a06b)"
457
457
  };
458
458
  /**
459
+ * Chip for a probe that came back `non-validating`.
460
+ *
461
+ * Amber rather than the success green: the upstream accepted a sentinel effort,
462
+ * which tells us it does not check the parameter — not that any level works.
463
+ * The state is an observation, and it used to share the green chip with the
464
+ * verified levels, which read as "these are the supported levels".
465
+ */
466
+ const probeChipNotValidatingStyle = {
467
+ padding: "1px 8px",
468
+ borderRadius: 999,
469
+ fontSize: 11,
470
+ lineHeight: "18px",
471
+ background: "var(--dsw-alias-state-warning-subtle, rgba(214, 142, 23, 0.14))",
472
+ color: "var(--dsw-alias-state-warning-primary, #b26a00)"
473
+ };
474
+ /** Chip for a probe that never produced an answer (cancelled or failed). */
475
+ const probeChipUnknownStyle = {
476
+ padding: "1px 8px",
477
+ borderRadius: 999,
478
+ fontSize: 11,
479
+ lineHeight: "18px",
480
+ background: "var(--dsw-alias-fill-tertiary, rgba(127, 127, 127, 0.12))",
481
+ color: "var(--dsw-alias-label-tertiary, #8a8a8a)"
482
+ };
483
+ /** Pick the chip style that matches what the observation actually says. */
484
+ function probeChipStyleFor(result) {
485
+ if (result.validation === "validating" && result.efforts.length > 0) return modelBadgeChipStyle;
486
+ if (result.validation === "non-validating") return probeChipNotValidatingStyle;
487
+ return probeChipUnknownStyle;
488
+ }
489
+ /**
459
490
  * Localize an upstream promotional badge label, with an unknown-badge fallback.
460
491
  *
461
492
  * The CN catalog spells badges in Chinese (`限时免费`, `夜间折扣`); the
@@ -467,9 +498,32 @@ window.__ModuleLoader__.load({
467
498
  function modelBadgeLabel(badge, t) {
468
499
  if (badge === "限时免费") return t("badgeLimitedFree");
469
500
  if (badge === "夜间折扣") return t("badgeNightDiscount");
501
+ if (badge === "夜间免费") return t("badgeNightFree");
502
+ if (badge === "独家限免") return t("badgeExclusiveFree");
470
503
  if (badge === "Free now") return t("badgeFreeNow");
471
504
  return badge;
472
505
  }
506
+ /**
507
+ * Upstream badge labels that already say "you pay nothing", in either language.
508
+ *
509
+ * The catalog reports both `free: true` and a promotional badge for the same
510
+ * row (`hy3` carries `限时免费`, `step-5-preview` carries `独家限免`). Rendering
511
+ * the generic free chip on top of those printed the same fact twice and, worse,
512
+ * pushed the second chip past the row's horizontal budget — it collapsed into a
513
+ * sliver instead of wrapping. One chip per row is enough: a badge that already
514
+ * states the offer is preferred over the bare "Free".
515
+ */
516
+ const FREE_STATEMENT_BADGES = /* @__PURE__ */ new Set([
517
+ "限时免费",
518
+ "夜间免费",
519
+ "独家限免",
520
+ "Free now"
521
+ ]);
522
+ /** Whether a row still needs the generic free chip next to its badges. */
523
+ function needsFreeChip(free, badges) {
524
+ if (free !== true) return false;
525
+ return !(badges ?? []).some((badge) => FREE_STATEMENT_BADGES.has(badge));
526
+ }
473
527
  const progressTrackStyle = {
474
528
  height: 8,
475
529
  overflow: "hidden",
@@ -637,6 +691,25 @@ window.__ModuleLoader__.load({
637
691
  })]
638
692
  });
639
693
  }
694
+ /** Combine same-name packages for display; expiry data stays per package upstream. */
695
+ function groupCreditPackages(accounts) {
696
+ const groups = /* @__PURE__ */ new Map();
697
+ for (const account of accounts) {
698
+ const group = groups.get(account.packageName);
699
+ if (group === void 0) groups.set(account.packageName, {
700
+ packageName: account.packageName,
701
+ remain: account.remain,
702
+ size: account.size,
703
+ ...account.unlimited === true ? { unlimited: true } : {}
704
+ });
705
+ else {
706
+ group.remain += account.remain;
707
+ group.size = group.size > 0 && account.size > 0 ? group.size + account.size : 0;
708
+ if (account.unlimited === true) group.unlimited = true;
709
+ }
710
+ }
711
+ return [...groups.values()];
712
+ }
640
713
  /**
641
714
  * One billing package as a labeled progress bar.
642
715
  *
@@ -718,7 +791,7 @@ window.__ModuleLoader__.load({
718
791
  children: [model.badges?.map((badge) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
719
792
  style: modelBadgeChipStyle,
720
793
  children: modelBadgeLabel(badge, t)
721
- }, badge)), model.free === true ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
794
+ }, badge)), needsFreeChip(model.free, model.badges) ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
722
795
  style: modelBadgeChipStyle,
723
796
  children: t("freeModel")
724
797
  }) : null]
@@ -822,7 +895,7 @@ window.__ModuleLoader__.load({
822
895
  style: modelBadgeChipStyle,
823
896
  children: modelBadgeLabel(badge, t)
824
897
  }, badge)),
825
- model.free === true ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
898
+ needsFreeChip(model.free, model.badges) ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
826
899
  style: modelBadgeChipStyle,
827
900
  children: t("freeModel")
828
901
  }) : null
@@ -923,7 +996,9 @@ window.__ModuleLoader__.load({
923
996
  style: quotaGroupStyle,
924
997
  children: probe.candidates.map((id) => {
925
998
  const result = probe.results.find((entry) => entry.id === id);
926
- const name = models?.find((model) => model.id === id)?.name ?? result?.name ?? id;
999
+ const row = models?.find((model) => model.id === id);
1000
+ const name = row?.name ?? result?.name ?? id;
1001
+ const declared = (row?.declaredEfforts?.length ?? 0) > 0 ? row.declaredEfforts.join(" / ") : row?.defaultEffort;
927
1002
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
928
1003
  style: modelOfferStyle,
929
1004
  children: [
@@ -932,8 +1007,8 @@ window.__ModuleLoader__.load({
932
1007
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: name }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
933
1008
  style: probeRowEndStyle,
934
1009
  children: [result === void 0 ? null : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
935
- style: modelBadgeChipStyle,
936
- children: result.validation === "validating" && result.efforts.length > 0 ? result.efforts.join(" / ") : t(result.validation === "non-validating" ? "probeResultNotValidating" : "probeResultUnknown")
1010
+ style: probeChipStyleFor(result),
1011
+ children: result.validation === "validating" && result.efforts.length > 0 ? result.efforts.join(" / ") : result.validation === "non-validating" ? t("probeResultNotValidating") + (declared === void 0 ? "" : t("probeDeclaredSuffix", { levels: declared })) : t("probeResultUnknown")
937
1012
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
938
1013
  type: "button",
939
1014
  style: buttonStyle$2,
@@ -1433,13 +1508,13 @@ window.__ModuleLoader__.load({
1433
1508
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("h3", {
1434
1509
  style: quotaTitleStyle,
1435
1510
  children: t("creditsDetailHeading")
1436
- }), status.credits.accounts.filter((account) => account.packageName === "enterprise" || account.remain > 0 || account.unlimited === true).map((account, index) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(CreditBar, {
1511
+ }), groupCreditPackages(status.credits.accounts).filter((account) => account.packageName === "enterprise" || account.remain > 0 || account.unlimited === true).map((account) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(CreditBar, {
1437
1512
  label: account.packageName === "enterprise" ? t("packageEnterprise") : account.packageName,
1438
1513
  remain: account.remain,
1439
1514
  size: account.size,
1440
1515
  unlimited: account.unlimited,
1441
1516
  t
1442
- }, `${account.packageName}-${String(index)}`))]
1517
+ }, account.packageName))]
1443
1518
  }), status.models === void 0 || status.models.length === 0 ? null : /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
1444
1519
  style: quotaListStyle,
1445
1520
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("h3", {
@@ -1560,7 +1635,7 @@ window.__ModuleLoader__.load({
1560
1635
  lineHeight: "16px",
1561
1636
  color: "var(--dsw-alias-label-tertiary)",
1562
1637
  whiteSpace: "nowrap",
1563
- padding: "0 4px"
1638
+ padding: "0 4px 0 0"
1564
1639
  };
1565
1640
  /**
1566
1641
  * The badge's ↻ (#99): the only re-read after the mount fetch. An icon-only
@@ -1890,17 +1965,7 @@ window.__ModuleLoader__.load({
1890
1965
  const showTooltip = tooltipVisible && !confirming && note === void 0;
1891
1966
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
1892
1967
  style: wrapperStyle,
1893
- onMouseEnter: () => {
1894
- setTooltipVisible(true);
1895
- },
1896
- onMouseLeave: () => {
1897
- setTooltipVisible(false);
1898
- },
1899
1968
  children: [
1900
- credit === void 0 ? null : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
1901
- style: creditStyle,
1902
- children: credit
1903
- }),
1904
1969
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
1905
1970
  type: "button",
1906
1971
  style: {
@@ -1929,6 +1994,10 @@ window.__ModuleLoader__.load({
1929
1994
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", { d: "M20 12a8 8 0 1 1-2.34-5.66" }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", { d: "M20 4v4h-4" })]
1930
1995
  })
1931
1996
  }),
1997
+ credit === void 0 ? null : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
1998
+ style: creditStyle,
1999
+ children: credit
2000
+ }),
1932
2001
  visible && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
1933
2002
  type: "button",
1934
2003
  "aria-label": text,
@@ -1939,6 +2008,12 @@ window.__ModuleLoader__.load({
1939
2008
  onClick: () => {
1940
2009
  setConfirming(true);
1941
2010
  },
2011
+ onMouseEnter: () => {
2012
+ setTooltipVisible(true);
2013
+ },
2014
+ onMouseLeave: () => {
2015
+ setTooltipVisible(false);
2016
+ },
1942
2017
  onFocus: () => {
1943
2018
  setTooltipVisible(true);
1944
2019
  },
@@ -2772,7 +2847,7 @@ window.__ModuleLoader__.load({
2772
2847
  };
2773
2848
  //#endregion
2774
2849
  //#region src/version.ts
2775
- const WORKBUDDY_CONNECT_VERSION = "0.7.7";
2850
+ const WORKBUDDY_CONNECT_VERSION = "0.7.9";
2776
2851
  //#endregion
2777
2852
  //#region src/client/WorkBuddyConfigPage.tsx
2778
2853
  /**
@@ -2815,15 +2890,15 @@ window.__ModuleLoader__.load({
2815
2890
  //#region src/client/locales.ts
2816
2891
  /** Plugin-card copy registered under the settings.workbuddy locale namespace. */
2817
2892
  const en = {
2818
- title: "DSH WorkBuddy Connect",
2819
- intro: "Use the models in the WorkBuddy desktop app directly in DSH — zero configuration, ready out of the box.",
2820
- titleAI: "DSH WorkBuddy AI Connect",
2893
+ title: "DSH WorkBuddy Connect (China)",
2894
+ intro: "Use the models in the WorkBuddy desktop app (China edition) directly in DSH — zero configuration, ready out of the box.",
2895
+ titleAI: "DSH WorkBuddy AI Connect (International)",
2821
2896
  introAI: "Use the models in the WorkBuddy AI international desktop app directly in DSH — zero configuration, ready out of the box.",
2822
2897
  expand: "Expand",
2823
2898
  collapse: "Collapse",
2824
2899
  loading: "Loading account…",
2825
2900
  signedOut: "Not signed in",
2826
- signedOutHint: "Sign in once in the WorkBuddy desktop app; this plugin follows that sign-in automatically.",
2901
+ signedOutHint: "Sign in once in the WorkBuddy desktop app (China edition); this plugin follows that sign-in automatically.",
2827
2902
  signedOutHintAI: "Sign in once in the WorkBuddy AI desktop app; this plugin follows that sign-in automatically.",
2828
2903
  signedInAs: "Signed in as {nickname}",
2829
2904
  accessTokenExpires: "Access token expires {time} (refresh is automatic)",
@@ -2873,17 +2948,19 @@ window.__ModuleLoader__.load({
2873
2948
  badgeLimitedFree: "Limited-time free",
2874
2949
  badgeNightDiscount: "Night discount",
2875
2950
  badgeFreeNow: "Free now",
2951
+ badgeExclusiveFree: "Exclusive free",
2952
+ badgeNightFree: "Free at night",
2876
2953
  rate: "{rate} credits per message",
2877
2954
  rateUnknown: "Price unavailable — refresh to update",
2878
2955
  probeLabel: "Reasoning levels",
2879
2956
  probeTooltipIdle: "Detect the reasoning levels {model} accepts",
2880
2957
  probeTooltipVerified: "Accepted levels: {levels} · click to detect again",
2881
- probeTooltipNotValidating: "This model does not check the effort parameter",
2958
+ probeTooltipNotValidating: "This model accepts any effort value, so the probe cannot tell the levels apart · click to re-probe",
2882
2959
  probeTooltipRetry: "Detection did not complete · click to retry",
2883
2960
  probeBubbleBody: "Send test requests to confirm the available reasoning levels. May consume a small amount of credit.",
2884
2961
  probeConfirmAction: "Confirm",
2885
2962
  probeNoteVerified: "Detected: {levels}",
2886
- probeNoteNotValidating: "This model does not check the effort parameter",
2963
+ probeNoteNotValidating: "Could not probe the levels: the upstream does not validate the effort parameter — that is not the same as no level being supported",
2887
2964
  probeNoteUnknown: "Detection did not complete",
2888
2965
  probeNoteDismiss: "Got it",
2889
2966
  probeHeading: "Reasoning effort detection",
@@ -2899,7 +2976,8 @@ window.__ModuleLoader__.load({
2899
2976
  probeConfirmBody: "Send test requests to {model} to confirm its available reasoning levels. May consume a small amount of credit.",
2900
2977
  cancel: "Cancel",
2901
2978
  probeResultVerified: "Verified levels: {levels}",
2902
- probeResultNotValidating: "This model does not check the effort parameter",
2979
+ probeResultNotValidating: "Upstream ignores the effort parameter",
2980
+ probeDeclaredSuffix: " (catalogue declares {levels})",
2903
2981
  probeResultUnknown: "Detection did not complete",
2904
2982
  probeResultAt: "Detected {time}",
2905
2983
  probeResultEmpty: "No detectable models right now.",
@@ -2939,15 +3017,15 @@ window.__ModuleLoader__.load({
2939
3017
  agentUpgradePrompt: "Please open {repository}, check its latest version, and install or update the plugin \"dsh-workbuddy-connect\" in my current DSH profile following the project README (the install command differs by profile). After upgrading, fully quit and restart DSH."
2940
3018
  };
2941
3019
  const zh = {
2942
- title: "DSH WorkBuddy Connect",
2943
- intro: "在 DSH 中直接使用 WorkBuddy 桌面 App 包含的模型,开箱即用,无需额外配置。",
2944
- titleAI: "DSH WorkBuddy AI Connect",
3020
+ title: "DSH WorkBuddy Connect(国内版)",
3021
+ intro: "在 DSH 中直接使用 WorkBuddy 国内版桌面 App 包含的模型,开箱即用,无需额外配置。",
3022
+ titleAI: "DSH WorkBuddy AI Connect(国际版)",
2945
3023
  introAI: "在 DSH 中直接使用 WorkBuddy AI 国际版桌面 App 包含的模型,开箱即用,无需额外配置。",
2946
3024
  expand: "展开",
2947
3025
  collapse: "收起",
2948
3026
  loading: "正在读取账号…",
2949
3027
  signedOut: "未登录",
2950
- signedOutHint: "在 WorkBuddy 桌面 App 里登录一次即可,插件会自动跟随当前登录的账号。",
3028
+ signedOutHint: "在 WorkBuddy 国内版桌面 App 里登录一次即可,插件会自动跟随当前登录的账号。",
2951
3029
  signedOutHintAI: "在 WorkBuddy AI 国际版桌面 App 里登录一次即可,插件会自动跟随当前登录的账号。",
2952
3030
  signedInAs: "已登录:{nickname}",
2953
3031
  accessTokenExpires: "访问令牌 {time} 过期(自动续期)",
@@ -2997,17 +3075,19 @@ window.__ModuleLoader__.load({
2997
3075
  badgeLimitedFree: "限时免费",
2998
3076
  badgeNightDiscount: "夜间折扣",
2999
3077
  badgeFreeNow: "限时免费",
3078
+ badgeExclusiveFree: "独家限免",
3079
+ badgeNightFree: "夜间免费",
3000
3080
  rate: "{rate} 积分/次",
3001
3081
  rateUnknown: "价格未知 — 刷新后更新",
3002
3082
  probeLabel: "推理等级",
3003
3083
  probeTooltipIdle: "检测 {model} 可用的推理档位",
3004
3084
  probeTooltipVerified: "已接受:{levels} · 点击可重新检测",
3005
- probeTooltipNotValidating: "该模型不校验该参数",
3085
+ probeTooltipNotValidating: "该模型接受任意档位参数,探测无法区分可用档位 · 点击可重新检测",
3006
3086
  probeTooltipRetry: "检测未完成 · 点击重试",
3007
3087
  probeBubbleBody: "发送探测请求以确认可用推理档位。可能消耗少量积分。",
3008
3088
  probeConfirmAction: "确认检测",
3009
3089
  probeNoteVerified: "已检测:{levels}",
3010
- probeNoteNotValidating: "该模型不校验该参数",
3090
+ probeNoteNotValidating: "无法探测档位:上游不校验该参数 —— 这不等于该档位不被支持",
3011
3091
  probeNoteUnknown: "检测未完成",
3012
3092
  probeNoteDismiss: "知道了",
3013
3093
  probeHeading: "推理档位检测",
@@ -3023,7 +3103,8 @@ window.__ModuleLoader__.load({
3023
3103
  probeConfirmBody: "向 {model} 发送探测请求,以确认可用推理档位。可能消耗少量积分。",
3024
3104
  cancel: "取消",
3025
3105
  probeResultVerified: "已验证接受的档位:{levels}",
3026
- probeResultNotValidating: "该模型不校验该参数",
3106
+ probeResultNotValidating: "上游不校验档位参数",
3107
+ probeDeclaredSuffix: "(目录声明 {levels})",
3027
3108
  probeResultUnknown: "检测未完成",
3028
3109
  probeResultAt: "检测于 {time}",
3029
3110
  probeResultEmpty: "当前没有可检测的模型。",