cortico-world-workbuddy 0.3.4 → 0.3.5
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 +45 -0
- package/README.md +50 -15
- package/SECURITY.md +17 -0
- package/package.json +2 -2
- package/scripts/contract-regression.mjs +1 -2
- package/scripts/contract.mjs +15 -0
- package/scripts/reinstall.ps1 +3 -2
- package/scripts/verify-ui.mjs +1 -1
- package/src/config.js +1 -1
- package/src/safety.js +20 -19
- package/src/world.js +11 -17
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,50 @@
|
|
|
1
1
|
# 更新日志
|
|
2
2
|
|
|
3
|
+
## 0.3.5
|
|
4
|
+
|
|
5
|
+
继续做减法:删掉只在页面挂载时算一次的顶部徽标,避免「顶部当前模型」与「面板里刚选的模型」同屏不一致。
|
|
6
|
+
|
|
7
|
+
### 删掉的功能
|
|
8
|
+
|
|
9
|
+
- **顶部徽标行整体移除**(当前模型 / 倍率 / 今日积分)。这三个值由 `webUi()` 在挂载时一次性计算,
|
|
10
|
+
之后既不随点选刷新、也不随限时折扣时段变化,属于「假状态」;对应的真实值分别以
|
|
11
|
+
模型目录顶部芯片、逐模型倍率列、用量与成本面板为准。
|
|
12
|
+
- 两盏灯(WorkBuddy / 主进程)保留:它们是页面外唯一能一眼判断可用性的信号,
|
|
13
|
+
主进程的实时状态另有模型目录顶部的只读芯片兜底。
|
|
14
|
+
|
|
15
|
+
### 安全清单与目录
|
|
16
|
+
|
|
17
|
+
- 安全清单与 WorkBuddy「选择模型」列表逐项对齐(22 → 17):补 `glm-5.3-flashx`、`minimax-m3-pay`
|
|
18
|
+
(显示名 MiniMax-M3)、`kimi-k3.1-pro-highspeed`;把已不存在的 `kimi-k3-1` 换成 `kimi-k3-2`;
|
|
19
|
+
移除应用选择器不显示、但目录里仍可调用的 8 个 id(`deepseek-v4-flash`、`deepseek-v3-2-volc`、
|
|
20
|
+
`hy3-b`、`hy3-c`、`hy3-x`、`kimi-k2.5`、`minimax-m2.7`、`hunyuan-chat`)。`hunyuan-chat` 在 v3
|
|
21
|
+
目录里没有 `credits` 字段,倍率无法核验,属于第 2 条原则的例外。
|
|
22
|
+
- `refreshCatalog()` 增加降级保护:v3 接口失败退回 legacy 目录时,如果本地已有 v3 目录就保留它
|
|
23
|
+
(legacy 目录只有 33 个模型、没有促销),避免倍率与限时折扣被一次失败刷新抹掉。
|
|
24
|
+
|
|
25
|
+
### 用途边界与免责声明
|
|
26
|
+
|
|
27
|
+
- README 新增「用途与边界」一节:**只在你与桌宠 Coo 的文字对话中按需调用**本机已登录的
|
|
28
|
+
WorkBuddy 模型;明确它不是 API 网关、不是批量/自动化工具、不做多账号或凭据共享、
|
|
29
|
+
不绕过计费,并写明「请勿改造成对第三方开放的模型服务」。
|
|
30
|
+
- README「免责」扩写为四条(设计用途、积分自担、风控由上游裁量、超范围使用后果自负),
|
|
31
|
+
附 WorkBuddy 服务条款与 AUP 链接;`SECURITY.md` 同步新增 "Scope of use" 一节;
|
|
32
|
+
`package.json` 的 description 也标注「仅用于桌宠文字对话」。
|
|
33
|
+
- `safeOnly` 的配置说明由「22 个」更正为「17 个」,与 0.3.5 的安全清单一致。
|
|
34
|
+
|
|
35
|
+
### 契约与文档
|
|
36
|
+
|
|
37
|
+
- `contract.mjs` 新增 `!('badges' in ui)`;`contract-regression.mjs` 删除依赖徽标的跨日断言
|
|
38
|
+
(跨日归零仍由提示词变量断言覆盖)。
|
|
39
|
+
- README 介绍段漏掉的「是否启用Workbuddy 开关」描述一并删除(0.3.4 已移除该功能)。
|
|
40
|
+
|
|
41
|
+
### 测试工具(实机测试中发现并修掉)
|
|
42
|
+
|
|
43
|
+
- `reinstall.ps1`:`pnpm remove` 补 `--store-dir`。全局 pnpm 的 store 与宿主不一致时 remove 会失败,
|
|
44
|
+
而 add 会因 lockfile 已有同 spec 直接「Already up to date」跳过链接,留下指向不存在目录的坏 junction;
|
|
45
|
+
现在 remove 失败立即报错退出,不再假装装好。
|
|
46
|
+
- `verify-ui.mjs`:等「今日积分」芯片真正有数字再取值,避免面板首帧读到空串。
|
|
47
|
+
|
|
3
48
|
## 0.3.4
|
|
4
49
|
|
|
5
50
|
按复核结论做减法:移除反复「假开启」的「中转站优先」功能,只保留可确认的事实。
|
package/README.md
CHANGED
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
把 **本机已登录的 WorkBuddy 客户端**的模型桥接进
|
|
4
4
|
[Coopanion](https://github.com/Pal-AI-Lab/Coopanion) 桌宠:Coo 可以直接调用你
|
|
5
5
|
WorkBuddy 账号里的模型,World 面板里可以浏览模型目录、查看每个模型的
|
|
6
|
-
**默认积分倍率**(如 `x0.79
|
|
7
|
-
|
|
6
|
+
**默认积分倍率**(如 `x0.79`)并点选要用的默认模型;`wb_*` 工具按需调用,
|
|
7
|
+
不开启任何「每轮强制走 WorkBuddy」的行为。
|
|
8
8
|
|
|
9
9
|
这是一个 Cortico 的 World 扩展(`kind: world`,`api: 6`),纯 ESM JS、零运行时依赖,
|
|
10
10
|
面板产物已随包构建好(`dist/webui.js`)。
|
|
@@ -14,7 +14,26 @@ WorkBuddy 账号里的模型,World 面板里可以浏览模型目录、查看
|
|
|
14
14
|
> 按上游给出的倍率真实扣费;扩展不提供账号、不共享凭据、不绕过计费。
|
|
15
15
|
> 请自行评估账号风险,官方 WorkBuddy 客户端始终是最安全的选择。
|
|
16
16
|
|
|
17
|
-
##
|
|
17
|
+
## 用途与边界
|
|
18
|
+
|
|
19
|
+
本扩展只做一件事:在你与桌宠 Coo 进行**文字对话**时,让 Coo 按需调用你**本机已登录的
|
|
20
|
+
WorkBuddy 账号**里的对话模型,并把回答转述给你。
|
|
21
|
+
|
|
22
|
+
它不是、也不应被当作:
|
|
23
|
+
|
|
24
|
+
- **通用 API 网关 / OpenAI 兼容服务**:扩展不监听端口、不对外提供 HTTP 接口,
|
|
25
|
+
除宿主内的 Coo 外没有任何调用方;
|
|
26
|
+
- **批量、自动化或爬取工具**:没有批量接口、没有循环调用、没有后台任务,
|
|
27
|
+
每一次调用都由 Coo 在一次对话中显式发起;
|
|
28
|
+
- **多账号池、凭据共享或转售服务**:只读取本机当前登录态,不收集、不上传、不共享凭据;
|
|
29
|
+
- **绕过计费的手段**:每次 `wb_chat` 都按上游倍率真实扣你自己的积分,
|
|
30
|
+
扩展不伪造计费、不改写用量、不模拟官方客户端以外的身份。
|
|
31
|
+
|
|
32
|
+
请勿把本扩展或其组件用于上述任何用途,也不要把它改造成对第三方开放的模型服务。
|
|
33
|
+
把它接进「每回合强制调用」「多账号轮询」「给别的应用当 API」这类场景,既超出本扩展的设计,
|
|
34
|
+
也超出 WorkBuddy 服务条款允许的使用范围,风险与后果由使用者自行承担。
|
|
35
|
+
|
|
36
|
+
## 安装(0.3.5,Coopanion 0.2.17 实机验证)
|
|
18
37
|
|
|
19
38
|
一条命令(推荐,脚本会做完打包、装卸、哈希与版本校验):
|
|
20
39
|
|
|
@@ -32,7 +51,7 @@ powershell -NoProfile -ExecutionPolicy Bypass -File scripts/reinstall.ps1
|
|
|
32
51
|
cd "C:\Users\<你>\AppData\Local\Programs\Coopanion\data\extensions"
|
|
33
52
|
node "C:\Users\<你>\AppData\Local\Programs\Coopanion\resources\app\node_modules\pnpm\bin\pnpm.cjs" remove cortico-world-workbuddy
|
|
34
53
|
node "C:\Users\<你>\AppData\Local\Programs\Coopanion\resources\app\node_modules\pnpm\bin\pnpm.cjs" `
|
|
35
|
-
add "$env:LOCALAPPDATA\cortico-world-workbuddy\build\cortico-world-workbuddy-0.3.
|
|
54
|
+
add "$env:LOCALAPPDATA\cortico-world-workbuddy\build\cortico-world-workbuddy-0.3.5.tgz" `
|
|
36
55
|
--config.strict-dep-builds=false `
|
|
37
56
|
--store-dir "C:\Users\<你>\AppData\Local\Programs\Coopanion\data\pnpm\store\v11"
|
|
38
57
|
```
|
|
@@ -141,12 +160,16 @@ WorkBuddy 官方对话给出的口径是:只调用「官方公开目录里、
|
|
|
141
160
|
`disabled`、内部路由别名、媒体/代码补全与状态不明的模型都不要经外部软件调用,否则有风控/封号风险。
|
|
142
161
|
这里把它落成代码:
|
|
143
162
|
|
|
144
|
-
- 白名单
|
|
145
|
-
|
|
146
|
-
`
|
|
147
|
-
`hy4-preview`、`kimi-k2.
|
|
148
|
-
`minimax-m3.1-flash`、`mimo-v2.6-pro`、`space-bunny`、`step-5-preview`。
|
|
149
|
-
其中 `hy3
|
|
163
|
+
- 白名单 17 个(`src/safety.js` 的 `SAFE_MODEL_IDS`,0.3.5 起与 WorkBuddy「选择模型」列表逐项对齐,
|
|
164
|
+
按 DeepSeek / GLM / 混元 / Kimi / 其他分组):
|
|
165
|
+
`deepseek-v4.1-flash`、`deepseek-v4-pro`、`glm-5.3`、`glm-5.3-flash`、`glm-5.3-flashx`、`glm-5.2`、
|
|
166
|
+
`hy3`、`hy4-preview`、`kimi-k2.8-preview`、`kimi-k3-2`、`kimi-k3.1-pro`、`kimi-k3.1-pro-highspeed`、
|
|
167
|
+
`minimax-m3-pay`、`minimax-m3.1-flash`、`mimo-v2.6-pro`、`space-bunny`、`step-5-preview`。
|
|
168
|
+
其中 `hy3`、`kimi-k2.8-preview`、`step-5-preview`、`hy4-preview` 标为「谨慎」(免费试用/预览,别做高频自动化)。
|
|
169
|
+
- 旧 id `kimi-k3-1` 在 v3 目录里已不存在(Kimi-K3 现在只对应 `kimi-k3-2`),0.3.5 一并换掉;
|
|
170
|
+
同时移除了应用选择器不显示、但目录里仍可调用的 8 个 id(`deepseek-v4-flash`、`deepseek-v3-2-volc`、
|
|
171
|
+
`hy3-b`、`hy3-c`、`hy3-x`、`kimi-k2.5`、`minimax-m2.7`、`hunyuan-chat`)——其中 `hunyuan-chat`
|
|
172
|
+
在 v3 目录里没有 `credits` 字段,倍率无法核验。
|
|
150
173
|
- 其余全部**拒绝**:`wb-lite`(目录 `disabled:true`)、`auto` / `fast-model` / `balanced-model` /
|
|
151
174
|
`deep-model`(内部路由别名)、4 个媒体模型、`codewise-*`、其他 `hy4-preview*` 变体(只精确放行
|
|
152
175
|
`hy4-preview`)、19 个已下架的、
|
|
@@ -227,7 +250,7 @@ UI 验证脚本的两个约定(踩过坑,别再用固定 sleep):每轮
|
|
|
227
250
|
并把「路由挂载」与「面板渲染」拆成两条断言——否则一次产物没加载就会被误判成「按钮没了」。
|
|
228
251
|
|
|
229
252
|
版本号规范:任何改动都 bump `package.json` 的 `version`,备份目录按版本命名
|
|
230
|
-
(`F:\coo-connect-wb\0.3.
|
|
253
|
+
(`F:\coo-connect-wb\0.3.5\`),再用 `scripts/reinstall.ps1` 装;它先把 tgz 解出来,再拿**解出来的内容**与安装目录逐文件比对哈希,
|
|
231
254
|
不一致直接非零退出。
|
|
232
255
|
|
|
233
256
|
打包注意:**不要用 PowerShell 的 `Get-Content -Raw | Set-Content` 改 `package.json`**
|
|
@@ -235,7 +258,7 @@ UI 验证脚本的两个约定(踩过坑,别再用固定 sleep):每轮
|
|
|
235
258
|
用 node 读写 JSON;tgz 必须以 `package/` 为前缀:
|
|
236
259
|
|
|
237
260
|
```bash
|
|
238
|
-
tar -czf cortico-world-workbuddy-0.3.
|
|
261
|
+
tar -czf cortico-world-workbuddy-0.3.5.tgz -C <stage> package
|
|
239
262
|
```
|
|
240
263
|
|
|
241
264
|
协议细节参照 [dsh-connect-workbuddy](https://github.com/dingminhua/dsh-connect-workbuddy)
|
|
@@ -286,7 +309,7 @@ node scripts/selfcheck.mjs # dry-mount 框架契约
|
|
|
286
309
|
node scripts/verify-ui.mjs --runs 3
|
|
287
310
|
|
|
288
311
|
# 2. 提交并打 tag
|
|
289
|
-
git tag v0.3.
|
|
312
|
+
git tag v0.3.5 && git push --tags
|
|
290
313
|
|
|
291
314
|
# 3. 发布(prepack 会自动重建 dist/webui.js)
|
|
292
315
|
npm publish --access public
|
|
@@ -311,5 +334,17 @@ node scripts/selfcheck.mjs --allow-missing-host # 找不到宿主 → 警告 +
|
|
|
311
334
|
## 免责
|
|
312
335
|
|
|
313
336
|
本扩展与腾讯 / WorkBuddy 官方无关,也不代表 Pal AI Lab / Cortico / Coopanion 官方立场。
|
|
314
|
-
|
|
315
|
-
|
|
337
|
+
它使用的不是 WorkBuddy 官方开放 API,而是本机客户端自身的接口;上游一旦调整或收紧,
|
|
338
|
+
扩展可能失效,也可能带来账号层面的风险。
|
|
339
|
+
|
|
340
|
+
使用即表示你理解并接受:
|
|
341
|
+
|
|
342
|
+
1. **仅限个人、本地、桌宠文字对话中的按需调用**——这是本扩展唯一的设计用途;
|
|
343
|
+
2. 所有调用消耗**你自己账号**的积分,倍率与扣费以上游为准,扩展只做记录与展示;
|
|
344
|
+
3. 账号状态、积分变动、风控与封禁由上游裁量,本扩展作者不承担任何责任;
|
|
345
|
+
4. 把本扩展用于对外提供接口、批量调用、多账号共享、绕过计费或其它未声明用途,
|
|
346
|
+
属于超出设计范围的使用,后果由使用者自行承担。
|
|
347
|
+
|
|
348
|
+
凭据读取范围、网络出口与本扩展写盘内容见 [SECURITY.md](./SECURITY.md)。
|
|
349
|
+
官方 [服务条款](https://www.workbuddy.cn/document/term) 与
|
|
350
|
+
[可接受使用政策](https://www.workbuddy.cn/document/acceptable-use-policy) 始终优先于本扩展的任何行为。
|
package/SECURITY.md
CHANGED
|
@@ -4,6 +4,23 @@ This extension talks to *your own* WorkBuddy account on *your own* machine. It h
|
|
|
4
4
|
no telemetry and no third-party analytics. This file states exactly what it touches, so you can
|
|
5
5
|
judge the risk before installing.
|
|
6
6
|
|
|
7
|
+
## Scope of use
|
|
8
|
+
|
|
9
|
+
This extension exists for one purpose: letting the Coo desktop pet answer **text conversations**
|
|
10
|
+
with you by calling a model from **your own, locally signed-in WorkBuddy account**, one call at a
|
|
11
|
+
time, only when a turn actually needs it.
|
|
12
|
+
|
|
13
|
+
It is **not** an API gateway, an OpenAI-compatible server, a batch/automation/crawling tool, a
|
|
14
|
+
multi-account pool, a credential-sharing service, or a way to bypass WorkBuddy billing. It opens no
|
|
15
|
+
listening port, exposes no HTTP endpoint, runs no background chat job, and sends only what your own
|
|
16
|
+
WorkBuddy client would send. Every `wb_chat` call is user-driven and consumes your own credits at
|
|
17
|
+
the upstream rate.
|
|
18
|
+
|
|
19
|
+
Do not redistribute, resell, or repurpose this extension as a model service for third parties.
|
|
20
|
+
That is outside its design and outside WorkBuddy's terms of service — see the Acceptable Use Policy
|
|
21
|
+
(§4 Restricted Use) and the Terms of Service (§3.5 Monitoring and Circumvention, §12) under
|
|
22
|
+
<https://www.workbuddy.cn/document/>.
|
|
23
|
+
|
|
7
24
|
## What it reads
|
|
8
25
|
|
|
9
26
|
| Path | Why | Data |
|
package/package.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "cortico-world-workbuddy",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.5",
|
|
4
4
|
"type": "module",
|
|
5
|
-
"description": "
|
|
5
|
+
"description": "仅用于桌宠 Coo 的文字对话:按需调用本机已登录的 WorkBuddy 模型,读取本机登录态,列出模型目录与默认积分倍率;不提供 API、不代理其它应用。",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"keywords": [
|
|
8
8
|
"cortico-world",
|
|
@@ -141,8 +141,7 @@ export async function runRegression(ok, { pkgDir } = {}) {
|
|
|
141
141
|
const rolledVars = rollW.world.envPromptVars();
|
|
142
142
|
ok(rolledVars['workbuddy.todayCredit'] === '0', '跨日后提示词里的今日积分归零', rolledVars['workbuddy.todayCredit']);
|
|
143
143
|
ok(rollW.world.today.day !== '2020-01-01', '跨日后 today.day 翻到当天', rollW.world.today.day);
|
|
144
|
-
|
|
145
|
-
ok(rolledUi.badges.find((b) => b.label === '今日积分')?.value === '0', '跨日后详情页徽标归零');
|
|
144
|
+
// 0.3.5 起没有顶部徽标,「今日积分」以用量面板为准,跨日归零由上面的提示词变量断言覆盖。
|
|
146
145
|
// 断言必须跟宿主机时区走:原先硬编码 +08 的 00:30,在 UTC 的 CI 上会算成前一日而红叉。
|
|
147
146
|
// 用本地 getter 拼出期望值,仍能抓住「改用 toISOString 的 UTC 日期」这类回归。
|
|
148
147
|
const midnight = new Date(2026, 10, 3, 0, 30, 0);
|
package/scripts/contract.mjs
CHANGED
|
@@ -310,8 +310,23 @@ const ui = uiWorld.webUi('zh');
|
|
|
310
310
|
ok(ui.panels.map((p) => p.id).join(',') === 'models,account,usage', '0.3.4 面板只剩 models/account/usage', ui.panels.map((p) => p.id));
|
|
311
311
|
ok(Array.isArray(ui.lamps) && ui.lamps.length === 2, '灯态只保留 WorkBuddy + 主进程两盏', ui.lamps?.length);
|
|
312
312
|
ok(!('storage' in ui), '不再声明 storage(否则宿主会生成空的「数据清理」页签)');
|
|
313
|
+
// 0.3.5:顶部徽标只在挂载时渲染一次,会与面板实时状态不一致,整段删除。
|
|
314
|
+
ok(!('badges' in ui), '不再有顶部徽标(当前模型/倍率/今日积分以面板为准)', Object.keys(ui));
|
|
313
315
|
ok(!('prefer' in uiWorld.cfg), '配置里不再有 prefer 开关字段', Object.keys(uiWorld.cfg));
|
|
314
316
|
|
|
317
|
+
// 0.3.5:v3 接口失败退回 legacy 时,不拿降级目录覆盖已有的 v3 目录(否则促销与倍率全丢)
|
|
318
|
+
const guardWorld = makeWorld(TOKEN_AUTO);
|
|
319
|
+
guardWorld.host = { log: { warn: () => {}, info: () => {}, error: () => {} } };
|
|
320
|
+
guardWorld.tokens = { accessToken: 'test-only', source: 'test' };
|
|
321
|
+
guardWorld.catalog = [{ id: 'glm-5.3', creditMultiplier: 0.69 }];
|
|
322
|
+
guardWorld.promos = [{ id: 'night', modelIds: ['glm-5.3'], discount: { multiplier: 0.5 } }];
|
|
323
|
+
guardWorld.catalogSource = 'v3-config';
|
|
324
|
+
guardWorld.upstream = () => ({ fetchCatalog: async () => ({ models: [{ id: 'legacy-only' }], promos: [], source: 'legacy' }) });
|
|
325
|
+
const guarded = await guardWorld.refreshCatalog();
|
|
326
|
+
ok(guarded.length === 1 && guarded[0].id === 'glm-5.3', 'legacy 刷新结果不覆盖已有的 v3 目录', guarded.map((m) => m.id));
|
|
327
|
+
ok(guardWorld.promos.length === 1 && guardWorld.catalogSource === 'v3-config', '保留 v3 来源与促销', guardWorld.catalogSource);
|
|
328
|
+
ok(/v3|legacy/.test(String(guardWorld.lastError ?? '')), '保留旧目录时给出提示', guardWorld.lastError);
|
|
329
|
+
|
|
315
330
|
// 账本并发:append 与 prune 串行,不互相覆盖
|
|
316
331
|
const ledger = new UsageLedger({ dataDir: mkdtempSync(join(tmpdir(), 'wb-ledger-')), log: { warn: () => {} } });
|
|
317
332
|
await Promise.all(
|
package/scripts/reinstall.ps1
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
#!/usr/bin/env pwsh
|
|
2
2
|
<#
|
|
3
3
|
.SYNOPSIS
|
|
4
4
|
一键重装 cortico-world-workbuddy:打包(npm pack)→ 卸载旧版 → 安装 → 校验哈希与版本。
|
|
@@ -145,7 +145,8 @@ if ($packedPkg.version -ne $version) { Fail "tgz 里的版本是 $($packedPkg.ve
|
|
|
145
145
|
Push-Location $extDir
|
|
146
146
|
try {
|
|
147
147
|
Step "卸载 $name(同版本重装必须先 remove,否则 pnpm 会复用旧包)"
|
|
148
|
-
node $pnpmCjs remove $name 2>&1 | Out-Null
|
|
148
|
+
node $pnpmCjs remove $name --store-dir $storeDir 2>&1 | Out-Null
|
|
149
|
+
if ($LASTEXITCODE -ne 0) { Fail 'pnpm remove 失败(多半是全局 store 与宿主 store 不一致)' }
|
|
149
150
|
Step '安装新包'
|
|
150
151
|
$out = node $pnpmCjs add $tgz --config.strict-dep-builds=false --store-dir $storeDir 2>&1 | Out-String
|
|
151
152
|
if ($LASTEXITCODE -ne 0) { Write-Host $out; Fail 'pnpm add 失败' }
|
package/scripts/verify-ui.mjs
CHANGED
|
@@ -317,7 +317,7 @@ for (let run = 1; run <= RUNS; run += 1) {
|
|
|
317
317
|
const rows = document.querySelectorAll('table tr').length;
|
|
318
318
|
return { hasRefresh: !!btn, chip: (chip?.textContent || '').trim(), rows };
|
|
319
319
|
})()`);
|
|
320
|
-
return v.hasRefresh && v.rows >= 4 ? v : false;
|
|
320
|
+
return v.hasRefresh && v.rows >= 4 && /\d/.test(v.chip) ? v : false;
|
|
321
321
|
});
|
|
322
322
|
row.checks.usageRendered = usage.hasRefresh === true;
|
|
323
323
|
row.checks.usageRows = usage.rows;
|
package/src/config.js
CHANGED
|
@@ -77,7 +77,7 @@ export const WB_CONFIG_GROUP = {
|
|
|
77
77
|
type: 'boolean',
|
|
78
78
|
title: '只调用安全清单模型',
|
|
79
79
|
description:
|
|
80
|
-
'默认开:wb_chat / wb_select_model 只接受 WorkBuddy
|
|
80
|
+
'默认开:wb_chat / wb_select_model 只接受 WorkBuddy 官方模型列表里的对话模型(17 个),disabled、内部路由别名、媒体与代码补全模型一律拒绝。关掉会放行这些项,但那既超出本扩展的用途范围,也容易触发上游限制,风险自负。',
|
|
81
81
|
'x-hot': true,
|
|
82
82
|
},
|
|
83
83
|
},
|
package/src/safety.js
CHANGED
|
@@ -6,42 +6,43 @@
|
|
|
6
6
|
* 状态不明(请求格式报错)、媒体/代码补全模型,一律不通过外部软件调用。
|
|
7
7
|
*
|
|
8
8
|
* 这里把结论固化成三件事:
|
|
9
|
-
* 1. SAFE_MODEL_IDS:可直接用 wb_chat 调用的白名单(
|
|
9
|
+
* 1. SAFE_MODEL_IDS:可直接用 wb_chat 调用的白名单(0.3.5 起对齐 WorkBuddy
|
|
10
|
+
* 应用「选择模型」列表里的 17 个);
|
|
10
11
|
* 2. classifyModel():给目录里每个模型打等级与理由,供面板展示与拦截;
|
|
11
12
|
* 3. DEFAULT_SAFE_MODEL:当前选择失效时的回落项(同样是白名单内的 flash 档)。
|
|
12
13
|
*
|
|
14
|
+
* 0.3.5 按官方选择器重新校对过一遍:目录里仍有、但应用选择器不显示的 id
|
|
15
|
+
* (deepseek-v4-flash / deepseek-v3-2-volc / hy3-b / hy3-c / hy3-x / kimi-k2.5 /
|
|
16
|
+
* minimax-m2.7 / hunyuan-chat)不再放行;其中 hunyuan-chat 在 v3 目录里没有
|
|
17
|
+
* credits 字段,倍率无法核验。旧 id kimi-k3-1 在 v3 目录中已不存在,换成 kimi-k3-2。
|
|
18
|
+
*
|
|
13
19
|
* 清单会随官方目录变化而过时——这正是 classifyModel 返回 safe=false 时给出
|
|
14
20
|
* 「不在安全清单内」的原因,而不是断言模型不可用。用户可以显式关掉 safeOnly
|
|
15
21
|
* 自行承担风险,扩展不做单方面放行。
|
|
16
22
|
*/
|
|
17
23
|
|
|
18
|
-
/** WorkBuddy
|
|
24
|
+
/** WorkBuddy 选择器里的公开对话模型白名单。 */
|
|
19
25
|
export const SAFE_MODEL_IDS = [
|
|
20
26
|
// DeepSeek
|
|
21
27
|
'deepseek-v4.1-flash',
|
|
22
|
-
'deepseek-v4-flash',
|
|
23
28
|
'deepseek-v4-pro',
|
|
24
|
-
'deepseek-v3-2-volc',
|
|
25
29
|
// GLM
|
|
26
|
-
'glm-5.3-flash',
|
|
27
30
|
'glm-5.3',
|
|
31
|
+
'glm-5.3-flash',
|
|
32
|
+
'glm-5.3-flashx',
|
|
28
33
|
'glm-5.2',
|
|
29
34
|
// 混元
|
|
30
35
|
'hy3',
|
|
31
|
-
'hy3-b',
|
|
32
|
-
'hy3-c',
|
|
33
|
-
'hy3-x',
|
|
34
|
-
'hunyuan-chat',
|
|
35
36
|
// 混元 4 预览:0.1.7 探测时它正忙(超时被判成不可用),用户指出后复测通过,
|
|
36
37
|
// 按用户要求纳入白名单;仍属 preview 档,放在 CAUTION 里提示「别高频自动化」。
|
|
37
38
|
'hy4-preview',
|
|
38
39
|
// Kimi
|
|
39
|
-
'kimi-k2.5',
|
|
40
40
|
'kimi-k2.8-preview',
|
|
41
|
-
'kimi-k3-
|
|
41
|
+
'kimi-k3-2',
|
|
42
42
|
'kimi-k3.1-pro',
|
|
43
|
+
'kimi-k3.1-pro-highspeed',
|
|
43
44
|
// 其他
|
|
44
|
-
'minimax-
|
|
45
|
+
'minimax-m3-pay',
|
|
45
46
|
'minimax-m3.1-flash',
|
|
46
47
|
'mimo-v2.6-pro',
|
|
47
48
|
'space-bunny',
|
|
@@ -50,15 +51,15 @@ export const SAFE_MODEL_IDS = [
|
|
|
50
51
|
|
|
51
52
|
/** 白名单分组(面板与 wb_list_models 用同一份顺序)。 */
|
|
52
53
|
export const SAFE_MODEL_GROUPS = [
|
|
53
|
-
{ label: 'DeepSeek', ids: ['deepseek-v4.1-flash', 'deepseek-v4-
|
|
54
|
-
{ label: 'GLM', ids: ['glm-5.3-flash', 'glm-5.3', 'glm-5.2'] },
|
|
55
|
-
{ label: '混元', ids: ['hy3', '
|
|
56
|
-
{ label: 'Kimi', ids: ['kimi-k2.
|
|
57
|
-
{ label: '其他', ids: ['minimax-
|
|
54
|
+
{ label: 'DeepSeek', ids: ['deepseek-v4.1-flash', 'deepseek-v4-pro'] },
|
|
55
|
+
{ label: 'GLM', ids: ['glm-5.3', 'glm-5.3-flash', 'glm-5.3-flashx', 'glm-5.2'] },
|
|
56
|
+
{ label: '混元', ids: ['hy3', 'hy4-preview'] },
|
|
57
|
+
{ label: 'Kimi', ids: ['kimi-k2.8-preview', 'kimi-k3-2', 'kimi-k3.1-pro', 'kimi-k3.1-pro-highspeed'] },
|
|
58
|
+
{ label: '其他', ids: ['minimax-m3-pay', 'minimax-m3.1-flash', 'mimo-v2.6-pro', 'space-bunny', 'step-5-preview'] },
|
|
58
59
|
];
|
|
59
60
|
|
|
60
61
|
/** 白名单里属于「免费试用/预览」的模型:能用,但不适合高频自动化调用。 */
|
|
61
|
-
export const CAUTION_MODEL_IDS = ['hy3', '
|
|
62
|
+
export const CAUTION_MODEL_IDS = ['hy3', 'kimi-k2.8-preview', 'step-5-preview', 'hy4-preview'];
|
|
62
63
|
|
|
63
64
|
/** 当前选择失效时的回落模型。 */
|
|
64
65
|
export const DEFAULT_SAFE_MODEL = 'deepseek-v4.1-flash';
|
|
@@ -158,7 +159,7 @@ export function classifyModel(id, model) {
|
|
|
158
159
|
|
|
159
160
|
/** 白名单模型的建议默认次序:优先 flash 档,避开试用/预览。 */
|
|
160
161
|
export function preferredSafeModel(availableIds = SAFE_MODEL_IDS) {
|
|
161
|
-
const order = [DEFAULT_SAFE_MODEL, '
|
|
162
|
+
const order = [DEFAULT_SAFE_MODEL, 'glm-5.3-flash', 'minimax-m3.1-flash'];
|
|
162
163
|
for (const id of order) if (availableIds.includes(id)) return id;
|
|
163
164
|
const firstStable = availableIds.find((id) => inList(id, SAFE_MODEL_IDS) && !inList(id, CAUTION_MODEL_IDS));
|
|
164
165
|
return firstStable ?? DEFAULT_SAFE_MODEL;
|
package/src/world.js
CHANGED
|
@@ -327,6 +327,14 @@ export class WorkBuddyWorld {
|
|
|
327
327
|
const tokens = await this.ensureTokens();
|
|
328
328
|
if (!tokens) throw new WbUpstreamError('no-auth', { kind: 'session_dead' });
|
|
329
329
|
const { models, promos, source } = await this.upstream().fetchCatalog(tokens);
|
|
330
|
+
// v3 接口偶发失败时 upstream 会退回 legacy(模型更少、没有促销)。本地已经有
|
|
331
|
+
// 一份完整的 v3 目录时,不拿这种降级结果覆盖它,否则倍率与限时折扣会一起丢失。
|
|
332
|
+
if (source === 'legacy' && this.catalogSource === 'v3-config' && this.catalog.length > 0) {
|
|
333
|
+
this.lastError = 'v3 目录暂时不可用,已保留上一次的完整目录(含促销与倍率)';
|
|
334
|
+
this.log.warn(`workbuddy: ${this.lastError}`);
|
|
335
|
+
this.broadcast({ kind: 'catalog', count: this.catalog.length });
|
|
336
|
+
return this.catalog;
|
|
337
|
+
}
|
|
330
338
|
this.catalog = models;
|
|
331
339
|
this.promos = promos;
|
|
332
340
|
this.catalogSource = source;
|
|
@@ -750,23 +758,9 @@ export class WorkBuddyWorld {
|
|
|
750
758
|
: '正在检测 WorkBuddy 主进程…',
|
|
751
759
|
},
|
|
752
760
|
],
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
value: this.cfg.model || '—',
|
|
757
|
-
tone: this.cfg.model ? 'on' : 'off',
|
|
758
|
-
},
|
|
759
|
-
{
|
|
760
|
-
label: zh ? '倍率' : 'Multiplier',
|
|
761
|
-
value: this.selectedMultiplier() ?? '—',
|
|
762
|
-
tone: 'plain',
|
|
763
|
-
},
|
|
764
|
-
{
|
|
765
|
-
label: zh ? '今日积分' : 'Today',
|
|
766
|
-
value: `${Math.round(this.today.credit * 100) / 100}`,
|
|
767
|
-
tone: this.today.credit > 0 ? 'on' : 'plain',
|
|
768
|
-
},
|
|
769
|
-
],
|
|
761
|
+
// 0.3.5:顶部徽标(当前模型/倍率/今日积分)只在页面挂载时算一次,之后不会更新,
|
|
762
|
+
// 会与面板内的实时状态打架,因此整段删除;这三处信息分别以
|
|
763
|
+
// 模型目录芯片、逐模型倍率列、用量与成本面板为准。
|
|
770
764
|
config: [WB_CONFIG_GROUP],
|
|
771
765
|
panels: [
|
|
772
766
|
{
|