dsh-connect-workbuddy 5.15.0 → 5.15.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/CHANGELOG.md +71 -0
- package/README.en.md +5 -5
- package/README.md +7 -7
- package/lib/bin.js +1 -1
- package/lib/client.js +30 -6
- package/lib/{host-heartbeat-KF9F87uw.js → host-heartbeat-Dj8K0mMq.js} +1 -1
- package/lib/index.d.ts +3 -2
- package/lib/index.js +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,76 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 5.15.2 (2026-10-30)
|
|
4
|
+
|
|
5
|
+
> **英文界面下的「最近刷新」不再显示成中文式的时间。** 同步自
|
|
6
|
+
> `dsh-connect-trae` 的 issue #71。
|
|
7
|
+
|
|
8
|
+
### 变更
|
|
9
|
+
|
|
10
|
+
- **「最近刷新」的时刻跟随读者语言**(同步自 `dsh-connect-trae` 的 issue #71)。
|
|
11
|
+
- **问题**:`formatClock` 把 locale 钉死成 `'zh-CN'`,于是英文界面印的是
|
|
12
|
+
`23:59`(中文习惯的 24 小时制),而不是 `11:59 PM`。用户看的是一个
|
|
13
|
+
**显示**格式,却按一个写死的语言来排。
|
|
14
|
+
- **改法**:`toLocaleTimeString('zh-CN', …)` → `toLocaleTimeString(undefined, …)`,
|
|
15
|
+
即跟随读者语言——与同仓库 `AccountPool.tsx` 里那个 `formatClock` 的做法一致
|
|
16
|
+
(它本来就用 `Intl.DateTimeFormat(undefined, …)`)。
|
|
17
|
+
- **影响面**:这个 `formatClock` 只有一个调用点——页脚的「最近刷新」
|
|
18
|
+
(`composer.lastRefresh`)。它是「当下」的同一时刻,不需要日期。
|
|
19
|
+
- **没有连带改的**:`AccountPool.tsx` 的池日志时间戳**本来就**跟随读者语言,
|
|
20
|
+
不在本次范围;`credit-format.ts` 的 `toLocaleString('en-US')` 是金额分组的
|
|
21
|
+
刻意选择(千分位一致),与语言无关,不动。
|
|
22
|
+
|
|
23
|
+
### 测试
|
|
24
|
+
|
|
25
|
+
- 新增 **2** 例(2677 总例,较 5.15.1 净增 2):
|
|
26
|
+
- **源码级**:`formatClock` 不得再出现硬编码的 locale。这一条不依赖测试环境的
|
|
27
|
+
locale——行为级断言在 zh-CN 环境下会因两种写法结果相同而失效,源码级不会。
|
|
28
|
+
- **行为级**:渲染出的「最近刷新」时刻必须等于**读者 locale** 对该时刻的写法。
|
|
29
|
+
`lastRefresh` 是「最近一次刷新的时刻」(即当下),所以期望值取渲染前后两个
|
|
30
|
+
瞬间,容许跨过一分钟边界。
|
|
31
|
+
- **变异验证**:把 locale 改回 `'zh-CN'`,两条用例**同时**转红(源码级点名
|
|
32
|
+
「still pins a locale」,行为级报出实际渲染值 `19:36` 与期望的 `07:36 PM`)。
|
|
33
|
+
- 全仓 **2677** 例通过(159 文件),类型检查通过。
|
|
34
|
+
|
|
35
|
+
## 5.15.1 (2026-10-30)
|
|
36
|
+
|
|
37
|
+
> **积分读数从「权限切换器旁边」挪到「模型选择器左边」。** 两者原本相隔 8px 且都是
|
|
38
|
+
> 可点元素——想去点「完全权限」,结果点到读数、弹出积分浮层。读数不是操作按钮,
|
|
39
|
+
> 紧贴操作按钮只会制造误触。
|
|
40
|
+
|
|
41
|
+
### 变更
|
|
42
|
+
|
|
43
|
+
- **积分读数改挂 `conversation.input.right`**(同步自 `dsh-connect-trae` 的 issue #71)。
|
|
44
|
+
- **动机**:`conversation.input.left` 渲染在 `div.tools` 的**最末尾**,紧挨
|
|
45
|
+
`div.modes` 里的权限选择器,间距只有 8px;两个都是可点元素,误触后弹出的是
|
|
46
|
+
积分浮层——一个纯读数被当成了操作目标。
|
|
47
|
+
- **新位置**:宿主把 `conversation.input.right` 渲染在 `div.trailing` 的
|
|
48
|
+
`standardControls` 内、`conversation.input.model`(模型选择器)**之前**。
|
|
49
|
+
迁过去后与权限选择器之间隔开整段空白。
|
|
50
|
+
- **宿主要改吗**:不用。`conversation.input.right` 早已是 `kind: list` /
|
|
51
|
+
`scope: session` 的现成座位。
|
|
52
|
+
- **老 profile 无需迁移**:`creditPosition` 的两个取值(`composer` / `stats`)、
|
|
53
|
+
设置名、`order: 4` 全部不变。`composer` 的含义是「带模型选择器的那一行」,
|
|
54
|
+
而 `input.right` 渲染的正是那一行。
|
|
55
|
+
- **「输入框下方」那一档不受影响**:`stats` 仍挂 `conversation.composer.dock`。
|
|
56
|
+
|
|
57
|
+
### 补齐一个测试盲点(本次发现)
|
|
58
|
+
|
|
59
|
+
`tests/host-slot-surface.spec.ts` 的 `injectedSlots()` 只读
|
|
60
|
+
`ctx.slots.inject('…')` 的参数,**不读 `register({ name })`**。而 `name` 才是
|
|
61
|
+
注册表实际用来索引的字段——实测:只把 `register({ name })` 从 `input.right`
|
|
62
|
+
改回 `input.left`,整个文件仍然全绿,而插件会「注入一个座位、注册到另一个座位」。
|
|
63
|
+
|
|
64
|
+
现补一条一致性断言:`inject()` 的座位名与 `register({ name })` 必须相等,
|
|
65
|
+
并带「守卫的守卫」(匹配对数 ≥ 3,防止正则失效后空转)。变异验证:只改
|
|
66
|
+
`register({ name })`,新用例立刻红并点名两个座位。
|
|
67
|
+
|
|
68
|
+
### 测试
|
|
69
|
+
|
|
70
|
+
- 全仓 **2675** 例通过(159 文件),类型检查通过。
|
|
71
|
+
- `tests/host-slot-surface.spec.ts` 的 `CLAIMED_SLOTS` 白名单与其余源码注释同步。
|
|
72
|
+
- 构建产物中 `conversation.input.right` 出现 2 次、`input.left` 出现 0 次。
|
|
73
|
+
|
|
3
74
|
## 5.15.0 (2026-10-30)
|
|
4
75
|
|
|
5
76
|
> 一个「每次开新对话都要重新挑思考强度」的抱怨(issue #179),和它附带的那个更值得追查的现象:
|
package/README.en.md
CHANGED
|
@@ -186,9 +186,9 @@ One class of state in the pool **does not go through a draft**: probe results, c
|
|
|
186
186
|
|
|
187
187
|
> ⚠️ **For the CN 「channel verification」 400 (`code 11128`), make sure the plugin is ≥ 5.14.1.** From 5.13.1 the plugin rewrites the known fixed fingerprints **before the request is sent**, and 5.14.0 adds the Web-GUI paragraph's SECOND sentence (#167, the branch still reproducing on 5.13.1); 5.12.x and earlier only had the neutral-head + zero-width ladder, which measured **400 on every rung** for the same body (matrix in [#164](https://github.com/dingminhua/dsh-connect-workbuddy/issues/164)). Anyone left on an older build keeps hitting a 400 that is already fixed, and it looks like "fails every single time, restarting does nothing".
|
|
188
188
|
>
|
|
189
|
-
> ⚠️ **Do not treat the marketplace's "latest" as the schedule — it reads an index that lags.** The community marketplace serves a
|
|
189
|
+
> ⚠️ **Do not treat the marketplace's "latest" as the schedule — it reads an index that lags.** The community marketplace serves a periodically built snapshot, collected per package: at the 2026-10-30 15:00 observation this plugin still listed only 5.13.1 while npm `latest` was already 5.14.1, and a desktop host separately flags any release under 24 hours old as "waiting". Trust `npm view dsh-connect-workbuddy version` and [Releases](https://github.com/dingminhua/dsh-connect-workbuddy/releases), and follow [Update](#update) below (pin the **exact version**); or hand [`docs/PINNED-UPGRADE-LAG.md`](docs/PINNED-UPGRADE-LAG.md) §3 to an AI and let it run.
|
|
190
190
|
>
|
|
191
|
-
> The other thing that stops people from upgrading: **pnpm's 24-hour release-age window** (`minimumReleaseAge`) **silently resolves a floating range back to the previous version**. When you need this fixed right now, pin the **exact version**: `dsh-connect-workbuddy@5.
|
|
191
|
+
> The other thing that stops people from upgrading: **pnpm's 24-hour release-age window** (`minimumReleaseAge`) **silently resolves a floating range back to the previous version**. When you need this fixed right now, pin the **exact version**: `dsh-connect-workbuddy@5.15.1`.
|
|
192
192
|
|
|
193
193
|
### Supported host range
|
|
194
194
|
|
|
@@ -250,7 +250,7 @@ Restart the DSH process after install/update/uninstall.
|
|
|
250
250
|
> | exact `5.14.1` + `minimumReleaseAgeExclude: [dsh-connect-workbuddy]` in the profile's `pnpm-workspace.yaml` | **5.14.1** ✅ |
|
|
251
251
|
> | setting absent (pnpm default) | floating `^5.13.1` → **5.14.1** ✅ |
|
|
252
252
|
>
|
|
253
|
-
> To pick up a new release right away, pin it: `dsh plugin --profile desktop add dsh-connect-workbuddy@5.
|
|
253
|
+
> To pick up a new release right away, pin it: `dsh plugin --profile desktop add dsh-connect-workbuddy@5.15.1`; if the window refuses it, see [`docs/PINNED-UPGRADE-LAG.md`](docs/PINNED-UPGRADE-LAG.md) §2 for the two routes (wait out the window, or add that exclude line). A floating range catches up once the window elapses.
|
|
254
254
|
|
|
255
255
|
The plugin also runs under **Web** and **TUI**; pick the command matching your profile:
|
|
256
256
|
|
|
@@ -267,7 +267,7 @@ dsh plugin --profile dsh-tui add dsh-connect-workbuddy # TUI
|
|
|
267
267
|
**Manual update (one command)**:
|
|
268
268
|
|
|
269
269
|
```sh
|
|
270
|
-
dsh plugin --profile desktop add dsh-connect-workbuddy@5.
|
|
270
|
+
dsh plugin --profile desktop add dsh-connect-workbuddy@5.15.1
|
|
271
271
|
dsh plugin --profile desktop exec dsh-connect-workbuddy doctor # first line carries the version
|
|
272
272
|
```
|
|
273
273
|
|
|
@@ -288,7 +288,7 @@ My profile is desktop.
|
|
|
288
288
|
|
|
289
289
|
> Do not tell an AI to "retry until it succeeds": inside the window every retry gets the same refusal, and pnpm offers no one-shot bypass.
|
|
290
290
|
|
|
291
|
-
**Confirming it actually changed**: the first line of `doctor` (`WorkBuddy Connect 5.
|
|
291
|
+
**Confirming it actually changed**: the first line of `doctor` (`WorkBuddy Connect 5.15.1 on …`), or the top-level `version` in `status --json`. **Do not** look for `/workbuddy status` (the slash command this plugin registers is `/codebuddy`, which forwards to the local CodeBuddy CLI), and **do not** look for a version row in the card's Diagnostics tab (it has exactly eight rows — region, domain, serving account, sign-in expiry, catalog size, enabled count, account pool, last failure — and no version). Restart or reload, then judge.
|
|
292
292
|
|
|
293
293
|
Details (how the market index and the pnpm window each stop you, and both ways through) are in [`docs/PINNED-UPGRADE-LAG.md`](docs/PINNED-UPGRADE-LAG.md); the same text is posted as a long-term pinned issue.
|
|
294
294
|
|
package/README.md
CHANGED
|
@@ -53,7 +53,7 @@
|
|
|
53
53
|
- **视频生成工具 `workbuddy_draw_video`(国内版 / 国际版,默认关闭,逐区授权)** —— 把 WorkBuddy 的视频能力交给 agent:「帮我把这段描述做成 5 秒视频」,模型自己调用工具,跑完把 **mp4 的本地路径**贴回来(视频是二进制,只回 `file://` 路径并渲染成链接,不塞进对话体)。**它和生图不是一个形状**:视频是**异步任务**,`POST /v2/videos/generations` 只回一个 `taskId`,插件再轮询 `POST /v2/videos/tasks` 直到 `completed`(5 秒一次、上限 10 分钟),最后把产物下载到 `os.tmpdir()/workbuddy-video-gen/`。**同一个工具也做图生视频**:给 `image` 参数(与生图同一套输入形态)就切到 `image-to-video` 标签组并按输入图决定比例,不给就是文生视频——**模式由「有没有图」唯一决定**。其余参数:`seconds`(默认 5,须在该模型 `[min,max]` 内)、`resolution`(不在模型 `resolutions` 内会回落默认值并给出告警)、`aspect_ratio`(仅文生视频,`16:9`/`9:16`/`1:1`)、`negative_prompt`、`enable_audio`。**默认不开启**、逐区勾选「允许模型自主生视频」,不勾时工具**根本不注册**;失败后 60 秒冷却,但参数错、没登录、读不到输入图、以及**上游在建任务之前就退回的 4xx**(它明说没扣积分)这类**一分钱没花**的失败不进冷却——改完参数可以立刻重试,不用白等一分钟;上游若在拒绝文案里报了时长区间(`supported range: 4-15 seconds`),插件会记住它,下次同样的越界值直接在本地拦下。**模型可按模式钉住**:卡片「能力」栏在视频开关下方按文生 / 图生各给一行选择框,写进 `preferredVideoModels`(按区、按标签存);它是**软约束**——显式 `model` 写错照旧报错,钉住的模型若已从目录里消失则静默回落到组内第一个。两个区的模型目录不同(国内区 `kling-video-v3` / `minimax-video-h3`,国际区 `kling-video-v3`),id 不跨区。**实测单价(国内区)**:图生视频 4 秒 57.14(`minimax-video-h3`)/ 68.57(`kling-video-v3`),文生视频 5 秒 71.43 / 128.57 积分;**产物实测**是 H.264 + AAC、24fps 的 `1280x720` 或 `1344x768`(没有 1080p,`resolution: "1080p"` 会被拒并回落默认),视频码率 3.7–11.5 Mbps,秒数以 24fps 帧数为准(请求 5 秒得 5.09–5.17 秒)。取证、协议与联调记录见 [docs/VIDEO_GEN.md](docs/VIDEO_GEN.md)。
|
|
54
54
|
|
|
55
55
|
- **本机账号切换** —— 自动发现 WorkBuddy 桌面端留下的多个登录凭据,可按区域切换账号;Token 不写入 DSH 设置。
|
|
56
|
-
- **对话输入框积分读数(国内版 / 国际版自动切换)** —— 对话输入框左侧工具栏常驻一行可点击的读数(如 `WB CN · 1,072`),**按本会话当前选中的模型自动切换区域**:选中 WB CN 的模型就显示国内版余额,选中 WB AI 的模型就显示国际版余额;用其它 provider 的模型时该读数完全不出现。每 5 分钟自动刷新,也可点开手动刷新。点击读数弹出面板:**按账号列出的余额表格**,点某一行即可切换到该账号(与卡片上的账号选择是同一个设置);**当前不能用的账号会在行内标出原因**(如「被限流」「积分耗尽」),标注口径与账号池表格一致。面板里的余额只在打开时才去查,因此不会让 5 分钟的后台刷新按账号数翻倍。要关掉某一边,就在卡片对应区域的 tab
|
|
56
|
+
- **对话输入框积分读数(国内版 / 国际版自动切换)** —— 对话输入框左侧工具栏常驻一行可点击的读数(如 `WB CN · 1,072`),**按本会话当前选中的模型自动切换区域**:选中 WB CN 的模型就显示国内版余额,选中 WB AI 的模型就显示国际版余额;用其它 provider 的模型时该读数完全不出现。每 5 分钟自动刷新,也可点开手动刷新。点击读数弹出面板:**按账号列出的余额表格**,点某一行即可切换到该账号(与卡片上的账号选择是同一个设置);**当前不能用的账号会在行内标出原因**(如「被限流」「积分耗尽」),标注口径与账号池表格一致。面板里的余额只在打开时才去查,因此不会让 5 分钟的后台刷新按账号数翻倍。要关掉某一边,就在卡片对应区域的 tab 下取消勾选「在输入框工具栏显示积分读数」;该区域的供应商被关闭时,读数不显示、开关也置灰。同一个开关下面还有「显示位置」这一行:默认在输入框工具栏(与模型选择同一行,位于模型选择器左侧、与权限切换器隔开),改成「输入框下方」后读数落到轮次/步数/token 统计那一行——装了别的插件把工具栏座位占掉时用得上。
|
|
57
57
|
|
|
58
58
|
<img src="docs/assets/dsh-connect-workbuddy-composer-credits.png" width="360" alt="对话输入框积分面板:国内版账号余额表格、一键测试按钮与最近刷新时间(账号名已打码)" />
|
|
59
59
|
- **账号池:多账号批量操作与自动换号** —— 把要用的账号勾进池子,即可**签到勾选的账号**、**测试勾选的账号 × 你指定的模型**(默认挑该区域倍率为 0 的免费模型);开启**启用账号池**即同时打开**自动换号**——某个请求在上游失败时,插件会依次用池内其他可用账号重试,直到有一个接手、或全部不可用为止,然后才把错误报给你。成员**默认一个都不含**、必须显式勾选(「本机有登录」不等于「要拿它去签到和花积分」);**开启后由池子的排序决定每一次请求用谁**(可用优先,其次快过期先花、积分高、凭据更新的);失败时依次用池内其他可用账号重试。排序**从不写回你保存的选择**——关掉开关,你选定的账号立刻完全生效。只有请求本身不合法(HTTP 400)不换号:同一个请求体换谁都是 400,重试只会白等。**这个开关只管「插件要不要自己决定」**:关掉它,插件不再替你选账号、也不再替你换号,但**签到与测试仍然可用**(它们是手动动作)。测试走的是与模型行同一套真实体积探测,因此**有真实成本**;**不提供自动签到**——签到会真实领取奖励,只在你点按钮时执行。详见[账号池](#账号池)。
|
|
@@ -196,9 +196,9 @@ DSH PiAiAdapter(每个 provider 一套)
|
|
|
196
196
|
|
|
197
197
|
> ⚠️ **国内区的「渠道校验」400(`code 11128`)请确保插件 ≥ 5.14.0。** 5.13.1 起会在**发出请求之前**按句改写已知的固定指纹,5.14.0 又补上了 Web GUI 段落的第二句(#167,5.13.1 上仍然必现的那一支);5.12.x 及更早只有「中性头 + 零宽扰动」三级救援,在同一份 body 上实测**全部 400**(对照矩阵见 [#164](https://github.com/dingminhua/dsh-connect-workbuddy/issues/164))。停在旧版的人会反复撞上这个已经修好的 400,而表现是「每次必现、重启也没用」。
|
|
198
198
|
>
|
|
199
|
-
> ⚠️ **别把插件市场里那个「最新」当日程表——它读的是一份会落后的索引。**
|
|
199
|
+
> ⚠️ **别把插件市场里那个「最新」当日程表——它读的是一份会落后的索引。** 社区市场走定期构建的快照(按包各自收录),2026-10-30 15:00 那次观测里本插件还停在 5.13.1,而当时 npm `latest` 已是 5.14.1;桌面宿主另有「24 小时内发布的版本先标成「新版等待中」」这条规则。以 `npm view dsh-connect-workbuddy version` 与 [Releases](https://github.com/dingminhua/dsh-connect-workbuddy/releases) 为准,按下方[「更新」](#更新)一节做(写**精确版本号**),或者把 [`docs/PINNED-UPGRADE-LAG.md`](docs/PINNED-UPGRADE-LAG.md) §3 那段话丢给 AI 让它替你跑。
|
|
200
200
|
>
|
|
201
|
-
> 另一个会让人升级不到的原因:**pnpm 的 24 小时新版本等待期**(`minimumReleaseAge`)会把浮动范围**静默压回上一个版本**。需要立刻修复时请写**精确版本号**:`dsh plugin --profile desktop add dsh-connect-workbuddy@5.
|
|
201
|
+
> 另一个会让人升级不到的原因:**pnpm 的 24 小时新版本等待期**(`minimumReleaseAge`)会把浮动范围**静默压回上一个版本**。需要立刻修复时请写**精确版本号**:`dsh plugin --profile desktop add dsh-connect-workbuddy@5.15.1`(原因见下方「刚发布的版本请写精确版本号」那条)。
|
|
202
202
|
|
|
203
203
|
### 受支持的宿主范围
|
|
204
204
|
|
|
@@ -262,7 +262,7 @@ npm install dsh-connect-workbuddy
|
|
|
262
262
|
> | 精确 `5.14.1` + profile `pnpm-workspace.yaml` 里 `minimumReleaseAgeExclude: [dsh-connect-workbuddy]` | **5.14.1** ✅ |
|
|
263
263
|
> | 不设该项(pnpm 默认) | 浮动 `^5.13.1` → **5.14.1** ✅ |
|
|
264
264
|
>
|
|
265
|
-
> 想立刻用上新版,请写精确版本号:`dsh plugin --profile desktop add dsh-connect-workbuddy@5.
|
|
265
|
+
> 想立刻用上新版,请写精确版本号:`dsh plugin --profile desktop add dsh-connect-workbuddy@5.15.1`;若被等待期拒绝,见 [`docs/PINNED-UPGRADE-LAG.md`](docs/PINNED-UPGRADE-LAG.md) §2 的两条路(等窗口过去,或加那行 exclude)。过了等待期之后,浮动范围会自然跟上。
|
|
266
266
|
|
|
267
267
|
插件在 **Web**、**Desktop**、**TUI** 三种界面下均可运行,按你使用的 profile 选择对应命令:
|
|
268
268
|
|
|
@@ -274,12 +274,12 @@ dsh plugin --profile dsh-tui add dsh-connect-workbuddy # TUI
|
|
|
274
274
|
## 更新
|
|
275
275
|
|
|
276
276
|
> **市场里显示几就是几,那是快照;`npm view dsh-connect-workbuddy version` 与 [Releases](https://github.com/dingminhua/dsh-connect-workbuddy/releases) 才是准的。**
|
|
277
|
-
> 2026-10-30
|
|
277
|
+
> 2026-10-30 15:00 实测:社区市场索引里本插件还只列到 **5.13.1**,而 npm `latest` 当时已是 **5.14.1**(现在是 5.15.1)。滞后是**按包各自发生**的——同一份索引里 `@changfenhuang/dsh-genui` 0.15.0、`dsh-client-auto-continue` 0.17.0、`billion-context` 0.1.209 都是新的,所以「别人那个包有新版」不能证明「你这个包也该有」。
|
|
278
278
|
|
|
279
279
|
**手动更新(一条命令)**:
|
|
280
280
|
|
|
281
281
|
```sh
|
|
282
|
-
dsh plugin --profile desktop add dsh-connect-workbuddy@5.
|
|
282
|
+
dsh plugin --profile desktop add dsh-connect-workbuddy@5.15.1
|
|
283
283
|
dsh plugin --profile desktop exec dsh-connect-workbuddy doctor # 第一行就是版本
|
|
284
284
|
```
|
|
285
285
|
|
|
@@ -300,7 +300,7 @@ dsh plugin --profile desktop exec dsh-connect-workbuddy doctor # 第一行就
|
|
|
300
300
|
|
|
301
301
|
> 别让 AI「反复重试到成功」:等待期内重试只会拿到同一个拒绝,pnpm 没有一次性的绕过开关。
|
|
302
302
|
|
|
303
|
-
**怎么确认真的升上去了**:`doctor` 的第一行(`WorkBuddy Connect 5.
|
|
303
|
+
**怎么确认真的升上去了**:`doctor` 的第一行(`WorkBuddy Connect 5.15.1 on …`),或 `status --json` 顶层的 `version`。**不要**找 `/workbuddy status`(本插件注册的斜杠命令是 `/codebuddy`,用于转发本机 CodeBuddy CLI),也**不要**在卡片「诊断」栏找版本号(那一栏只有区域 / 域名 / 服务账号 / 登录有效期 / 目录模型数 / 已启用数 / 账号池 / 最近一次失败八行,没有版本行)。装完**重启或重载**再判断。
|
|
304
304
|
|
|
305
305
|
细节(市场索引与 pnpm 等待期分别怎么拦住你、两条绕过路径)见 [`docs/PINNED-UPGRADE-LAG.md`](docs/PINNED-UPGRADE-LAG.md),同一份正文也贴成了长期置顶 issue。
|
|
306
306
|
|
package/lib/bin.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { C as WorkBuddyCredentialStore, D as defaultDesktopAuthDirs, E as defaultDesktopAuthCandidates, I as workbuddyOwnAuthPath, M as legacyWorkbuddyOwnAuthPath, Qt as hostPeersInfo, Rt as WORKBUDDY_APP_EXECUTABLE_ENV, S as WORKBUDDY_AUTH_FILE_ENV, V as WorkBuddyUpstreamClient, Wt as findWorkbuddyAppExecutableWithSource, a as readHostHeartbeat, c as WORKBUDDY_CONNECT_VERSION, d as rosterSeenPath, f as piAiRuntimeInfo, m as FALLBACK_WORKBUDDY_MODELS_GLOBAL, o as workbuddyHostHeartbeatPath, p as FALLBACK_WORKBUDDY_MODELS, r as isHeartbeatProcessAlive, u as describeRosterSeenPayload } from "./host-heartbeat-
|
|
2
|
+
import { C as WorkBuddyCredentialStore, D as defaultDesktopAuthDirs, E as defaultDesktopAuthCandidates, I as workbuddyOwnAuthPath, M as legacyWorkbuddyOwnAuthPath, Qt as hostPeersInfo, Rt as WORKBUDDY_APP_EXECUTABLE_ENV, S as WORKBUDDY_AUTH_FILE_ENV, V as WorkBuddyUpstreamClient, Wt as findWorkbuddyAppExecutableWithSource, a as readHostHeartbeat, c as WORKBUDDY_CONNECT_VERSION, d as rosterSeenPath, f as piAiRuntimeInfo, m as FALLBACK_WORKBUDDY_MODELS_GLOBAL, o as workbuddyHostHeartbeatPath, p as FALLBACK_WORKBUDDY_MODELS, r as isHeartbeatProcessAlive, u as describeRosterSeenPayload } from "./host-heartbeat-Dj8K0mMq.js";
|
|
3
3
|
import { readFile } from "node:fs/promises";
|
|
4
4
|
import { realpathSync } from "node:fs";
|
|
5
5
|
import { fileURLToPath } from "node:url";
|
package/lib/client.js
CHANGED
|
@@ -9447,7 +9447,8 @@ window.__ModuleLoader__.load({
|
|
|
9447
9447
|
//#endregion
|
|
9448
9448
|
//#region src/client/ComposerCredits.tsx
|
|
9449
9449
|
/**
|
|
9450
|
-
* Credit readout for the composer
|
|
9450
|
+
* Credit readout for the composer row (`conversation.input.right`, rendered
|
|
9451
|
+
* immediately before the model picker).
|
|
9451
9452
|
*
|
|
9452
9453
|
* 参考:dingminhua/dsh-connect-trae(MIT,Copyright (c) 2026 LaoDing)
|
|
9453
9454
|
* — 该项目的 `client/ComposerPoints.tsx`:读数形态(`<区域> · <余额>`)、
|
|
@@ -9582,8 +9583,20 @@ window.__ModuleLoader__.load({
|
|
|
9582
9583
|
const value = usage.showCreditsInMainUi;
|
|
9583
9584
|
return typeof value === "boolean" ? value : void 0;
|
|
9584
9585
|
}
|
|
9586
|
+
/**
|
|
9587
|
+
* A same-day instant, as the READER's locale writes it.
|
|
9588
|
+
*
|
|
9589
|
+
* The locale is `undefined` — the reader's, not a fixed one — so an English UI
|
|
9590
|
+
* shows `11:59 PM` rather than the Chinese convention's `23:59`. It used to
|
|
9591
|
+
* hardcode `'zh-CN'`, which meant the English interface printed a Chinese-style
|
|
9592
|
+
* time. Ported from dsh-connect-trae (issue #71).
|
|
9593
|
+
*
|
|
9594
|
+
* Only for instants that are the same day as the reader: a bare clock time on
|
|
9595
|
+
* a timestamp from another day is a different question (and a different
|
|
9596
|
+
* design), which is why this is not reused for anything but "now".
|
|
9597
|
+
*/
|
|
9585
9598
|
function formatClock(value) {
|
|
9586
|
-
return new Date(value).toLocaleTimeString(
|
|
9599
|
+
return new Date(value).toLocaleTimeString(void 0, {
|
|
9587
9600
|
hour: "2-digit",
|
|
9588
9601
|
minute: "2-digit"
|
|
9589
9602
|
});
|
|
@@ -11925,8 +11938,19 @@ window.__ModuleLoader__.load({
|
|
|
11925
11938
|
}
|
|
11926
11939
|
};
|
|
11927
11940
|
/**
|
|
11928
|
-
* Credit readout in the composer
|
|
11929
|
-
* session-scope list slot).
|
|
11941
|
+
* Credit readout in the composer row (`conversation.input.right`, a
|
|
11942
|
+
* session-scope list slot rendered immediately before the model picker).
|
|
11943
|
+
*
|
|
11944
|
+
* `input.right` rather than `input.left` (ported from dsh-connect-trae's
|
|
11945
|
+
* issue #71): the host renders `input.right` inside `div.trailing`'s
|
|
11946
|
+
* `standardControls`, i.e. IMMEDIATELY BEFORE the model picker, while
|
|
11947
|
+
* `input.left` sits at the very end of `div.tools` — 8px from the
|
|
11948
|
+
* permission selector. Both are clickable, so reaching for "完全权限"
|
|
11949
|
+
* landed on the readout and opened the credit popover. A readout is not an
|
|
11950
|
+
* action; next to the model picker it stops competing with a control the
|
|
11951
|
+
* user is actually aiming at. The `composer` SETTING value keeps its
|
|
11952
|
+
* meaning ("the row that carries the model picker"), so saved profiles
|
|
11953
|
+
* need no migration.
|
|
11930
11954
|
*
|
|
11931
11955
|
* 参考:dingminhua/dsh-connect-trae(MIT,Copyright (c) 2026 LaoDing)
|
|
11932
11956
|
* — 该项目的 `registerComposerPoints`:无条件注册插槽、由 gate 读
|
|
@@ -11944,8 +11968,8 @@ window.__ModuleLoader__.load({
|
|
|
11944
11968
|
*/
|
|
11945
11969
|
const registerComposerCredits = () => {
|
|
11946
11970
|
try {
|
|
11947
|
-
return ctx.slots.inject("conversation.input.
|
|
11948
|
-
name: "conversation.input.
|
|
11971
|
+
return ctx.slots.inject("conversation.input.right", () => ctx.slots.register({
|
|
11972
|
+
name: "conversation.input.right",
|
|
11949
11973
|
id: "dsh-connect-workbuddy-composer-credits",
|
|
11950
11974
|
order: 4,
|
|
11951
11975
|
locale: namespace,
|
|
@@ -7932,7 +7932,7 @@ function describeRosterSeenPayload(raw) {
|
|
|
7932
7932
|
//#endregion
|
|
7933
7933
|
//#region src/version.ts
|
|
7934
7934
|
/** The npm package version this build was produced from. */
|
|
7935
|
-
const WORKBUDDY_CONNECT_VERSION = "5.15.
|
|
7935
|
+
const WORKBUDDY_CONNECT_VERSION = "5.15.2";
|
|
7936
7936
|
//#endregion
|
|
7937
7937
|
//#region src/host-heartbeat.ts
|
|
7938
7938
|
/**
|
package/lib/index.d.ts
CHANGED
|
@@ -3458,7 +3458,8 @@ declare function nextRegionEnabled(value: unknown, region: WorkBuddyWebRegion, e
|
|
|
3458
3458
|
/**
|
|
3459
3459
|
* The two seats the credit readout can occupy (issue #62).
|
|
3460
3460
|
*
|
|
3461
|
-
* `composer` is the composer
|
|
3461
|
+
* `composer` is the composer row (`conversation.input.right`, rendered just
|
|
3462
|
+
* before the model picker); `stats` is
|
|
3462
3463
|
* the ambient dock below the composer card (`conversation.composer.dock`),
|
|
3463
3464
|
* beside the shell's own round/step/token pills. Named as a union rather than a
|
|
3464
3465
|
* boolean because a third seat is plausible and `showAtTop: boolean` would have
|
|
@@ -5049,7 +5050,7 @@ interface WorkBuddyRegionState {
|
|
|
5049
5050
|
*
|
|
5050
5051
|
* Two seats, because the first one is not always available:
|
|
5051
5052
|
*
|
|
5052
|
-
* - `composer` — the composer
|
|
5053
|
+
* - `composer` — the composer row (`conversation.input.right`), shared
|
|
5053
5054
|
* with the shell's own controls. It is the closer, more glanceable seat,
|
|
5054
5055
|
* and it is the default so nothing moves for anyone who does not choose.
|
|
5055
5056
|
* - `stats` — the ambient dock below the composer card
|
package/lib/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { $ as parseCreditMultiplier, $t as resolveDshHome, A as isEncryptedCredentialError, At as pickMediaModel, B as WorkBuddyCredentialRejectedError, Bt as deriveAtRestKey, C as WorkBuddyCredentialStore, Ct as IMAGE_TAG_TEXT_TO_IMAGE, D as defaultDesktopAuthDirs, Dt as imageMimeForPath, E as defaultDesktopAuthCandidates, Et as imageDataUrl, F as workbuddyAccountId, Ft as NATIVE_MODALITY_BY_MODEL_ID, G as forceNeutralHead, Gt as isEncryptedFieldWrapper, H as channelGateMemberOf, Ht as fetchAtRestKeyPayload, I as workbuddyOwnAuthPath, It as imageDefaultFor, J as isCredentialRejectedError, Jt as macosNestedAppBundles, K as isContextTooLongBody, Kt as isWorkbuddyBundle, L as CONTEXT_OVERFLOW_MARKER, Lt as nativeModalityOf, M as legacyWorkbuddyOwnAuthPath, Mt as parseQueueAnswer, N as parseWorkBuddyAuth, Nt as queueNoticeText, O as defaultDesktopAuthPath, Ot as isBareBase64Image, P as preferredAccountName, Pt as pruneTempDir, Q as openingEvidenceOfBody, R as CREDENTIAL_REJECTED_CODE, Rt as WORKBUDDY_APP_EXECUTABLE_ENV, S as WORKBUDDY_AUTH_FILE_ENV, St as IMAGE_TAG_IMAGE_TO_IMAGE, T as authFileName, Tt as WorkBuddyImageError, U as classifyUpstreamError, Ut as findWorkbuddyAppExecutable, V as WorkBuddyUpstreamClient, Vt as deriveAtRestKeyId, W as declaredTools, X as knownRegionOf, Xt as readAtRestKey, Y as isFirstMessageGateBody, Yt as openEncryptedField, Z as modelIdOfBody, Zt as workbuddyAppExecutableCandidates, _ as deriveCatalog, _t as WorkBuddyVideoError, a as readHostHeartbeat, at as requestEvidenceOf, b as ENCRYPTED_CREDENTIAL_CODE, bt as resolveVideoParams, c as WORKBUDDY_CONNECT_VERSION, ct as REFUSES_OFF_MODEL_IDS, dt as offDefaultFor, en as withFileLock, et as parseReasoning, f as piAiRuntimeInfo, ft as offRefused, g as applyContextBudgets, gt as VIDEO_TAG_TEXT_TO_VIDEO, h as WorkBuddyCatalog, ht as VIDEO_TAG_IMAGE_TO_VIDEO, i as processStartTimeMs, it as regionOf, j as isVaultAccountId, jt as sniffImageMime, k as hasEncryptedCredentialFields, kt as parseImageDataUrl, l as createFileRosterSeenStore, lt as defaultOffModelIds, m as FALLBACK_WORKBUDDY_MODELS_GLOBAL, mt as withEffectiveOff, n as clearHostHeartbeat, nt as perturbChannelFingerprints, o as workbuddyHostHeartbeatPath, ot as rewriteSessionTitleModel, p as FALLBACK_WORKBUDDY_MODELS, pt as recordRefusal, q as isConversationIdGateBody, qt as macosBundleExecutable, r as isHeartbeatProcessAlive, rt as prepareChatBody, s as writeHostHeartbeat, st as attachBusyLevels, t as WORKBUDDY_HOST_HEARTBEAT_FILENAME, tn as writeFileAtomic, tt as parseUpstreamModel, ut as lastRefusalFor, v as fallbackModelsFor, vt as parseSupportedSecondsRange, w as WorkBuddyEncryptedCredentialError, wt as MAX_INPUT_IMAGE_BYTES, x as WORKBUDDY_AUTH_FILENAME, xt as DEFAULT_IMAGE_SIZE, y as withoutRouters, yt as pickVideoModel, z as WORKBUDDY_FALLBACK_SYSTEM_PROMPT, zt as clearAtRestKeyCache } from "./host-heartbeat-
|
|
1
|
+
import { $ as parseCreditMultiplier, $t as resolveDshHome, A as isEncryptedCredentialError, At as pickMediaModel, B as WorkBuddyCredentialRejectedError, Bt as deriveAtRestKey, C as WorkBuddyCredentialStore, Ct as IMAGE_TAG_TEXT_TO_IMAGE, D as defaultDesktopAuthDirs, Dt as imageMimeForPath, E as defaultDesktopAuthCandidates, Et as imageDataUrl, F as workbuddyAccountId, Ft as NATIVE_MODALITY_BY_MODEL_ID, G as forceNeutralHead, Gt as isEncryptedFieldWrapper, H as channelGateMemberOf, Ht as fetchAtRestKeyPayload, I as workbuddyOwnAuthPath, It as imageDefaultFor, J as isCredentialRejectedError, Jt as macosNestedAppBundles, K as isContextTooLongBody, Kt as isWorkbuddyBundle, L as CONTEXT_OVERFLOW_MARKER, Lt as nativeModalityOf, M as legacyWorkbuddyOwnAuthPath, Mt as parseQueueAnswer, N as parseWorkBuddyAuth, Nt as queueNoticeText, O as defaultDesktopAuthPath, Ot as isBareBase64Image, P as preferredAccountName, Pt as pruneTempDir, Q as openingEvidenceOfBody, R as CREDENTIAL_REJECTED_CODE, Rt as WORKBUDDY_APP_EXECUTABLE_ENV, S as WORKBUDDY_AUTH_FILE_ENV, St as IMAGE_TAG_IMAGE_TO_IMAGE, T as authFileName, Tt as WorkBuddyImageError, U as classifyUpstreamError, Ut as findWorkbuddyAppExecutable, V as WorkBuddyUpstreamClient, Vt as deriveAtRestKeyId, W as declaredTools, X as knownRegionOf, Xt as readAtRestKey, Y as isFirstMessageGateBody, Yt as openEncryptedField, Z as modelIdOfBody, Zt as workbuddyAppExecutableCandidates, _ as deriveCatalog, _t as WorkBuddyVideoError, a as readHostHeartbeat, at as requestEvidenceOf, b as ENCRYPTED_CREDENTIAL_CODE, bt as resolveVideoParams, c as WORKBUDDY_CONNECT_VERSION, ct as REFUSES_OFF_MODEL_IDS, dt as offDefaultFor, en as withFileLock, et as parseReasoning, f as piAiRuntimeInfo, ft as offRefused, g as applyContextBudgets, gt as VIDEO_TAG_TEXT_TO_VIDEO, h as WorkBuddyCatalog, ht as VIDEO_TAG_IMAGE_TO_VIDEO, i as processStartTimeMs, it as regionOf, j as isVaultAccountId, jt as sniffImageMime, k as hasEncryptedCredentialFields, kt as parseImageDataUrl, l as createFileRosterSeenStore, lt as defaultOffModelIds, m as FALLBACK_WORKBUDDY_MODELS_GLOBAL, mt as withEffectiveOff, n as clearHostHeartbeat, nt as perturbChannelFingerprints, o as workbuddyHostHeartbeatPath, ot as rewriteSessionTitleModel, p as FALLBACK_WORKBUDDY_MODELS, pt as recordRefusal, q as isConversationIdGateBody, qt as macosBundleExecutable, r as isHeartbeatProcessAlive, rt as prepareChatBody, s as writeHostHeartbeat, st as attachBusyLevels, t as WORKBUDDY_HOST_HEARTBEAT_FILENAME, tn as writeFileAtomic, tt as parseUpstreamModel, ut as lastRefusalFor, v as fallbackModelsFor, vt as parseSupportedSecondsRange, w as WorkBuddyEncryptedCredentialError, wt as MAX_INPUT_IMAGE_BYTES, x as WORKBUDDY_AUTH_FILENAME, xt as DEFAULT_IMAGE_SIZE, y as withoutRouters, yt as pickVideoModel, z as WORKBUDDY_FALLBACK_SYSTEM_PROMPT, zt as clearAtRestKeyCache } from "./host-heartbeat-Dj8K0mMq.js";
|
|
2
2
|
import z from "@deepseek-ai/schemastery";
|
|
3
3
|
import { appendFile, mkdir, open, readFile, rename, rm, stat, writeFile } from "node:fs/promises";
|
|
4
4
|
import { randomBytes, randomUUID, timingSafeEqual } from "node:crypto";
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "dsh-connect-workbuddy",
|
|
3
3
|
"displayName": "DSH Connect WorkBuddy",
|
|
4
4
|
"description": "把本机登录的 WorkBuddy 模型(国内版与国际版)接入 DeepSeek Harness:每次刷新按上游目录自动读取每个模型的积分倍率,支持逐模型图片输入开关、多账号切换与账号池自动换号,并提供每日签到、卡片与输入框里的胶囊积分读数等只读积分概览。",
|
|
5
|
-
"version": "5.15.
|
|
5
|
+
"version": "5.15.2",
|
|
6
6
|
"author": "dingminhua",
|
|
7
7
|
"copyright": "Copyright (c) 2026 LaoDing",
|
|
8
8
|
"license": "MIT",
|