dsh-multi-router 0.5.5 → 0.5.6
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 +7 -0
- package/README.md +12 -2
- package/THIRD_PARTY_NOTICES.md +31 -0
- package/lib/{chunk-EGLF4CWD.js → chunk-U2MU2M5C.js} +10 -3
- package/lib/chunk-U2MU2M5C.js.map +7 -0
- package/lib/{chunk-PQETKUGT.js → chunk-XKDXPB5T.js} +222 -26
- package/lib/chunk-XKDXPB5T.js.map +7 -0
- package/lib/cli.js +1 -1
- package/lib/client.js +62 -7
- package/lib/client.js.map +2 -2
- package/lib/clients.js +5 -3
- package/lib/host.js +3 -2
- package/lib/index.js +3 -2
- package/lib/index.js.map +2 -2
- package/lib/manager.js +2 -2
- package/package.json +1 -1
- package/lib/chunk-EGLF4CWD.js.map +0 -7
- package/lib/chunk-PQETKUGT.js.map +0 -7
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,13 @@
|
|
|
2
2
|
|
|
3
3
|
本项目遵循 [语义化版本](https://semver.org/lang/zh-CN/)。版本号从 `0.1` 起以功能迭代为主,接口在 `1.0` 前可能变化。
|
|
4
4
|
|
|
5
|
+
## 0.5.6
|
|
6
|
+
|
|
7
|
+
- 修复 WorkBuddy 中国版 `workbuddy.cn` 签发的有效令牌被本地误判失效,同时兼容原 `codebuddy.cn` 签发地址;保留 RS256、账号身份与中国版精确签发地址校验。
|
|
8
|
+
- 添加账号 / 更新凭证面板新增 WorkBuddy 手机短信登录,自动填写 UID 与有效期、保存 AT / RT,可验证刷新令牌并保存轮换后的新凭证;无需 Python。同一登录身份更新已有账号,不自动开启签到。
|
|
9
|
+
- 增加「重新验证登录」只读恢复入口,官方状态验证通过后才解除旧认证失败记录,不重置已领取、结果不明、设备限制或平台暂停记录。
|
|
10
|
+
- 短信发送冷却跨重启保存,验证码会话短期有效、提交次数有限;请求不自动重试,平台限制时暂停。只使用官方 HTTPS 接口并启用证书校验,不向面板返回令牌或上游私有错误。
|
|
11
|
+
|
|
5
12
|
## 0.5.5
|
|
6
13
|
|
|
7
14
|
- Token 明细与总览增加模型用时、工具调用用时、首 Token 平均(TTFT)与输出速度(TPS);支持单次展开与筛选内成功调用汇总,TPS 按输出 Token / 解码秒数加权,失败与取消不混入成功性能。DSH 步骤沿用会话统计口径,直接上游请求保留独立计时,工具用时不猜测;旧记录不补算。
|
package/README.md
CHANGED
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
|
|
31
31
|
### 界面预览
|
|
32
32
|
|
|
33
|
-
以下为 **v0.5.5 实际面板 + 合成演示数据**。账号名称已替换,不包含真实手机号、邮箱、身份 ID、设备标识、登录凭证或会话内容;余额、用量和性能均为演示数值。
|
|
33
|
+
以下为 **v0.5.5–v0.5.6 实际面板 + 合成演示数据**。账号名称已替换,不包含真实手机号、邮箱、身份 ID、设备标识、登录凭证或会话内容;余额、用量和性能均为演示数值。
|
|
34
34
|
|
|
35
35
|
| 总览与用量 | Token 明细与调用性能 |
|
|
36
36
|
| --- | --- |
|
|
@@ -106,6 +106,16 @@ Qoder 的 `dfmodel` 在真实目录里显示为 DeepSeek-Flash,未声明具体
|
|
|
106
106
|
|
|
107
107
|
总览、签到记录和插件更新使用一致的表格布局;详细执行规则按需展开,路由继续通过二级弹窗编辑。沿用 DSH 明暗主题,窄窗口的宽表格可在表内横向滚动。
|
|
108
108
|
|
|
109
|
+
### WorkBuddy 面板短信登录
|
|
110
|
+
|
|
111
|
+
打开 **账号与登录 → 添加账号 → WorkBuddy → 短信登录并保存凭证**。输入已有账号的手机号,点击发送验证码,输入短信验证码后点击「登录并保存到账号池」。UID、有效期、AT / RT 自动识别保存,无需安装 Python;默认额外验证一次刷新令牌,并保存轮换后的新 AT / RT。同一登录身份更新已有账号,自动签到开关保持原设置。更新已有凭证也可使用此方式。
|
|
112
|
+
|
|
113
|
+
手机号和验证码仅提交给 WorkBuddy 中国版官方 HTTPS 接口;凭证仅在本机后台保存,不在普通面板响应中返回。短信发送至少间隔 60 秒,冷却跨重启保存;验证码最长 5 分钟有效,最多提交 5 次,登录请求不自动重试。遇到平台限制 / 图形验证时暂停请求,请使用官方客户端登录后读取凭证。仅用于已有账号,注册请在官方客户端完成。流程参考 [WorkBuddy-Daily 登录工具](https://github.com/L0NE-6/WorkBuddy-Daily/blob/main/workbuddy_login.py),保留 HTTPS 证书验证。
|
|
114
|
+
|
|
115
|
+

|
|
116
|
+
|
|
117
|
+
签到显示「令牌失效」时,可点击 **重新验证登录**:只查询官方签到状态,验证通过才解除旧认证失败记录,不提交领取、不清空已完成或结果不明的领取记录。该操作全局间隔至少 30 秒。`workbuddy.cn` 与 `codebuddy.cn` 两个中国版官方签发地址均支持;自动签到默认关闭,需在签到页单独开启。
|
|
118
|
+
|
|
109
119
|
## 每日积分签到
|
|
110
120
|
|
|
111
121
|
在配置面板打开 **积分签到**。当前接入 WorkBuddy 国内版、Trae CN 与 Qoder CN / Global 的签到能力:先查询平台是否开放活动、账号与设备是否已领取,再提交领取;活动是否开放和奖励额度以平台响应为准。WorkBuddy AI 与 Trae Global 暂无已核验的签到接口,面板会显示需到官方客户端查看,不猜测接口或奖励。
|
|
@@ -113,7 +123,7 @@ Qoder 的 `dfmodel` 在真实目录里显示为 DeepSeek-Flash,未声明具体
|
|
|
113
123
|
- 每个账号可选择「立即签到」,或「签到全部可用账号」。**每日自动签到默认关闭**,按账号单独开启;已停用账号不参与。可选择「每日启动时签到」或「每天定时签到」,定时时间按北京时间设置,默认保留 10:05。启动模式在当天首次运行时执行,持续运行则新一天自动执行;定时模式错过时间后在下次启动补查。Qoder 最早 10:05 查询当日领取窗口,WorkBuddy / Trae 启动模式不受此窗口限制。20:05 后仅补查确认未提交领取的查询失败或尚未开放窗口,每个账号最多补查一次;DSH 关闭期间不执行。
|
|
114
124
|
- Qoder 先用 PAT 交换临时 Job Token,活动请求使用 `Cosy-ClientType: 10`;仅领取有效期内 `CLAIM_BENEFIT` 且 `CLAIMABLE` 的活动。宣传、锁定或未开放给此账号的活动显示「无活动」,不会误报令牌失效;奖励仅显示领取响应实际返回的金额。TRAE 沿用客户端登录的 Refresh Token 和真实设备参数续期,不依赖短信登录,也不按账号数组位置保存状态。
|
|
115
125
|
- WorkBuddy 国内版沿用已保存的客户端 AT / RT,按 JWT 中的账号身份校验请求;续期后保存新 AT 和轮换的 RT。先查今日签到状态及活动结束时间,再提交一次领取,已签或活动结束时跳过;面板展示返回的连签天数、活动累计积分和本次奖励。网络或 5xx 仅对领取前的只读状态查询最多重试两次(2 秒、4 秒),领取请求不做快速重试。接口契约参考 [WorkBuddy-Daily](https://github.com/L0NE-6/WorkBuddy-Daily/blob/main/workbuddy_daily.py),未采用成长任务、抽奖或客户端活跃模拟。
|
|
116
|
-
-
|
|
126
|
+
- 启动、定时、手动按钮共用持久化记录;改签到计划、刷新面板或重启不重置记录。当天已处理的账号不会重复进入请求队列,令牌失效后等待显式更新凭证或 WorkBuddy 只读登录验证通过再恢复。
|
|
117
127
|
- 请求串行,账号间至少间隔 10 秒。先持久化当天意图再发请求,重复账号副本按平台身份去重,调整账号顺序不影响记录。每天最多提交一次领取;提交后网络超时或结果不明确时不重复提交,请到官方客户端核对。成功、今日已领、无活动和结果不明的账号不会加入晚间重试队列。
|
|
118
128
|
- 保留 Trae 原有设备身份;同一设备当天的领取已使用或结果不明确时,不切到同设备的其他账号继续领取。Qoder 优先复用官方 CLI 的设备身份,没有时使用连接器持久化的单一设备身份,所有账号一致,不随签到轮换。
|
|
119
129
|
- 验证、403 拒绝或限流会暂停该平台签到;在官方客户端处理后,可以点击「恢复后续签到」。恢复不会清除今日尝试记录与设备限制。401 或明确过期且无法续期的凭证单独显示「令牌失效」,请在「账号与登录」更新凭证;替换凭证只解除认证失败记录,已提交或结果不明的领取记录仍保留。普通网络查询失败不会要求重交令牌。不提供更换设备身份、代理或绕过验证码的能力;不能保证不触发平台风控。
|
package/THIRD_PARTY_NOTICES.md
CHANGED
|
@@ -133,3 +133,34 @@ SOFTWARE.
|
|
|
133
133
|
引入上述代码不构成对任何平台的授权。本项目**仅供个人学习研究**,解析客户端本地登录态或使用未公开接口可能违反对应平台服务条款,详见 [`DISCLAIMER.md`](./DISCLAIMER.md)。
|
|
134
134
|
|
|
135
135
|
若你对本文件的完整性有疑问或发现遗漏,请提交 issue 或 PR。
|
|
136
|
+
|
|
137
|
+
## WorkBuddy-Daily 登录流程参考
|
|
138
|
+
|
|
139
|
+
- 项目:https://github.com/L0NE-6/WorkBuddy-Daily
|
|
140
|
+
- 文件:`workbuddy_login.py`;MIT;Copyright (c) 2026 L0NE-6
|
|
141
|
+
- 本插件以 JavaScript 重写其短信登录接口流程,并增加本机冷却、短期会话、凭证轮换保存;不运行 Python 脚本,不采用关闭 TLS 证书验证、成长任务、活跃模拟或抽奖逻辑。
|
|
142
|
+
|
|
143
|
+
```text
|
|
144
|
+
MIT License
|
|
145
|
+
|
|
146
|
+
Copyright (c) 2026 L0NE-6
|
|
147
|
+
|
|
148
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
149
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
150
|
+
in the Software without restriction, including without limitation the rights
|
|
151
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
152
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
153
|
+
furnished to do so, subject to the following conditions:
|
|
154
|
+
|
|
155
|
+
The above copyright notice and this permission notice shall be included in all
|
|
156
|
+
copies or substantial portions of the Software.
|
|
157
|
+
|
|
158
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
159
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
160
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
161
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
162
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
163
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
164
|
+
SOFTWARE.
|
|
165
|
+
|
|
166
|
+
```
|
|
@@ -5393,7 +5393,7 @@ function workbuddyToken(token) {
|
|
|
5393
5393
|
try {
|
|
5394
5394
|
const [head, body, signature, extra] = token.split(".");
|
|
5395
5395
|
const header = JSON.parse(Buffer.from(head, "base64url")), payload = JSON.parse(Buffer.from(body, "base64url"));
|
|
5396
|
-
if (extra || !signature || header.alg !== "RS256" ||
|
|
5396
|
+
if (extra || !signature || header.alg !== "RS256" || !["https://www.codebuddy.cn/auth/realms/copilot", "https://www.workbuddy.cn/auth/realms/copilot"].includes(payload.iss) || typeof payload.sub !== "string" || !payload.sub) throw Error();
|
|
5397
5397
|
return payload;
|
|
5398
5398
|
} catch {
|
|
5399
5399
|
throw Object.assign(Error("HTTP 401 invalid_workbuddy_cn_token"), { status: 401 });
|
|
@@ -5402,7 +5402,7 @@ function workbuddyToken(token) {
|
|
|
5402
5402
|
async function workbuddyPost(url, headers, signal, fetchImpl) {
|
|
5403
5403
|
let response;
|
|
5404
5404
|
try {
|
|
5405
|
-
response = await fetchImpl(url, { method: "POST", headers: { "Content-Type": "application/json", "Accept-Encoding": "identity", ...headers }, body: "{}", signal });
|
|
5405
|
+
response = await fetchImpl(url, { method: "POST", headers: { "Content-Type": "application/json", "Accept-Encoding": "identity", ...headers }, body: "{}", signal, redirect: "error" });
|
|
5406
5406
|
} catch {
|
|
5407
5407
|
throw Object.assign(Error("workbuddy_checkin_network"), { transient: !signal?.aborted });
|
|
5408
5408
|
}
|
|
@@ -5446,6 +5446,11 @@ function createWorkBuddyCheckin(credential, { fetchImpl = (...args) => fetch(...
|
|
|
5446
5446
|
};
|
|
5447
5447
|
return {
|
|
5448
5448
|
identity: async () => ({ account: (await login()).uid }),
|
|
5449
|
+
validate: async (signal) => {
|
|
5450
|
+
const state = await post("checkin-activity-status", await login(), signal);
|
|
5451
|
+
if (![0, 200].includes(state?.code) || !state.data || typeof state.data.today_checked_in !== "boolean") throw Error("workbuddy_status_invalid");
|
|
5452
|
+
return { valid: true };
|
|
5453
|
+
},
|
|
5449
5454
|
claim: async (signal) => {
|
|
5450
5455
|
let submitted = false;
|
|
5451
5456
|
try {
|
|
@@ -5491,6 +5496,7 @@ function createWorkBuddyCheckin(credential, { fetchImpl = (...args) => fetch(...
|
|
|
5491
5496
|
|
|
5492
5497
|
export {
|
|
5493
5498
|
qoderPluginDataDir,
|
|
5499
|
+
readLimitedText,
|
|
5494
5500
|
supportsCheckin,
|
|
5495
5501
|
Checkins,
|
|
5496
5502
|
jsonCredential,
|
|
@@ -5498,7 +5504,8 @@ export {
|
|
|
5498
5504
|
createAccountClient,
|
|
5499
5505
|
claimTraeCheckin,
|
|
5500
5506
|
createQoderCheckin,
|
|
5507
|
+
workbuddyToken,
|
|
5501
5508
|
refreshWorkBuddyCheckinCredential,
|
|
5502
5509
|
createWorkBuddyCheckin
|
|
5503
5510
|
};
|
|
5504
|
-
//# sourceMappingURL=chunk-
|
|
5511
|
+
//# sourceMappingURL=chunk-U2MU2M5C.js.map
|