dsh-connect-modelscope-token-plan 0.6.4 → 0.6.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 +19 -0
- package/client.js +2 -1
- package/cordis.patch.yml +4 -3
- package/lib/host-config.js +1 -1
- package/lib/index.js +44 -7
- package/package.json +46 -15
package/CHANGELOG.md
CHANGED
|
@@ -26,6 +26,25 @@
|
|
|
26
26
|
> **发版时**:顶部开 `## [X.Y.Z] — YYYY-MM-DD`,完整流程见
|
|
27
27
|
> [RELEASING.md](RELEASING.md) §3(本文开头这段是**写作者规范**,那是**发布操作流程**)。
|
|
28
28
|
|
|
29
|
+
## [0.6.5] — 2026-10-21
|
|
30
|
+
|
|
31
|
+
**出图:被拒的图片地址不再原样回显**
|
|
32
|
+
|
|
33
|
+
- 输入的图片地址校验不过时,此前原样回显你给的地址——它可能带着签名串或令牌,
|
|
34
|
+
于是凭据进日志也进面板。现在先脱敏再截断:诊断信息(协议、主机、路径)留着,
|
|
35
|
+
凭据那部分显示为 [REDACTED]。
|
|
36
|
+
|
|
37
|
+
**面板:计数写盘失败不再悄悄冻住**
|
|
38
|
+
|
|
39
|
+
- 本地计数的写入失败此前被吞掉,面板继续显示上一次成功写下的数字——数字看着在涨,
|
|
40
|
+
其实早就冻住,且没有半点痕迹。现在写入失败会记一条异常送进面板(并留一条日志),
|
|
41
|
+
只有真正落盘的写入才算数。
|
|
42
|
+
|
|
43
|
+
**工程:依赖范围放宽**
|
|
44
|
+
|
|
45
|
+
- 插件声明的 AI 运行时依赖范围从 `^0.85.1` 放宽到 `>=0.85.0 <2.0.0`,与当前宿主
|
|
46
|
+
随附的版本对齐,装上时不再被标成「超出上界」。
|
|
47
|
+
|
|
29
48
|
## [0.6.4] — 2026-10-19
|
|
30
49
|
|
|
31
50
|
**出图:上游边缘抖动不再杀死任务**
|
package/client.js
CHANGED
|
@@ -2130,7 +2130,8 @@ var dsh_connect_modelscope_token_plan_client = (function() {
|
|
|
2130
2130
|
*
|
|
2131
2131
|
* **与 ProviderCard 的关键差异,也是这张卡存在的主要理由**:provider 开关翻转会
|
|
2132
2132
|
* 立即重注册,而出图工具的开关翻转**要等下次 Host 启动**——peer 的 tools registry
|
|
2133
|
-
* 没有 unregister
|
|
2133
|
+
* 没有 unregister(完整论述见 src/host/draw-register.ts 文件头注)。所以这张卡必须
|
|
2134
|
+
* 把这件事说出来(`draw.restartHint`),否则用户
|
|
2134
2135
|
* 翻开关后看不到任何变化,会以为坏了。
|
|
2135
2136
|
*
|
|
2136
2137
|
* 缺席原因是**分开渲染**的:`no-tools-service` 是「这个 Host 没提供该服务」(正常),
|
package/cordis.patch.yml
CHANGED
|
@@ -62,8 +62,8 @@
|
|
|
62
62
|
# 适配器出去,每一次调用与每一条 429/错误事件都由 src/host/usage-observer.ts
|
|
63
63
|
# 在流的出口记进同一个 usage-store。口径是**本客户端**:桌面端与 Web 端是
|
|
64
64
|
# 两个 profile,各记各的账、互不可见(`npm run doctor` 并排列出各 profile),
|
|
65
|
-
#
|
|
66
|
-
#
|
|
65
|
+
# 口径的历史与裁定见 docs/PROVIDER-M4.md;别把它当跨端总量。直连魔搭的
|
|
66
|
+
# 其它客户端同样不计入(本插件看不见它们),消耗总量以官方魔粒余额为准。
|
|
67
67
|
#
|
|
68
68
|
# 偏差方向是**按流计次**:重试不在流内部发生,而是流被消费完后由
|
|
69
69
|
# agent/request-error 瀑布决定重发,因而每次重试各记一次(按「魔搭按
|
|
@@ -103,7 +103,8 @@
|
|
|
103
103
|
# 出图计数——那会变成拿 chat 的口径给生图记账。
|
|
104
104
|
#
|
|
105
105
|
# 生效时机:开关值立即保存,但**工具的挂载发生在下次 Host 启动**——
|
|
106
|
-
# peer 的 tools registry 没有 unregister
|
|
106
|
+
# peer 的 tools registry 没有 unregister,工具一旦注册就摘不下来(机制与
|
|
107
|
+
# 后果的完整论述见 src/host/draw-register.ts 文件头注)。
|
|
107
108
|
# 面板会就这一点给出提示(draw.restartHint)。
|
|
108
109
|
drawEnabled: false
|
|
109
110
|
# 出图默认模型(空 = 自动取目录里第一个出图模型)。
|
package/lib/host-config.js
CHANGED
|
@@ -1141,7 +1141,7 @@ const inject = ["webServer"];
|
|
|
1141
1141
|
* 产物反而引入第二份真源;这里用常量、由 test/config.test.mjs 钉住与
|
|
1142
1142
|
* package.json 一致。
|
|
1143
1143
|
*/
|
|
1144
|
-
const PLUGIN_VERSION = "0.6.
|
|
1144
|
+
const PLUGIN_VERSION = "0.6.5";
|
|
1145
1145
|
/**
|
|
1146
1146
|
* 默认值。刻意不含额度常数——理由见本文件头。
|
|
1147
1147
|
* 面板头条是官方魔粒余额,次数口径的推算已在面板收敛时删除,这里若留着
|
package/lib/index.js
CHANGED
|
@@ -985,6 +985,15 @@ function createFileUsageStore({ name, profile = null, retentionDays = 90, maxEve
|
|
|
985
985
|
const file = join(dir, "usage.json");
|
|
986
986
|
/** 最近一次解析异常(损坏即忽略的痕迹),快照转 shapeWarnings。 */
|
|
987
987
|
let anomaly = null;
|
|
988
|
+
/**
|
|
989
|
+
* 最近一次**写**失败的痕迹。
|
|
990
|
+
*
|
|
991
|
+
* 与 {@link anomaly} 分开记,因为两者的寿命不同:解析异常是**读**出来的,下一次
|
|
992
|
+
* 读就会覆盖它(读到好的就恢复);写失败是**写**出来的,只有一次成功的写才能
|
|
993
|
+
* 抹掉它——读得动旧值不代表上一次写落了盘(读回来的永远是上一次**成功**写下去
|
|
994
|
+
* 的那一份)。
|
|
995
|
+
*/
|
|
996
|
+
let writeAnomaly = null;
|
|
988
997
|
/** 只读闸:磁盘版本比本构建新时置位——读照常、写拒绝,绝不 clobber。 */
|
|
989
998
|
let readOnly = false;
|
|
990
999
|
/** 最近一次确认过的内存态;读路径拿它,写路径以它为基线。 */
|
|
@@ -1046,10 +1055,29 @@ function createFileUsageStore({ name, profile = null, retentionDays = 90, maxEve
|
|
|
1046
1055
|
return parsed.payload;
|
|
1047
1056
|
};
|
|
1048
1057
|
const cache = createStateReadCache(readThrough, { now: () => Date.now() });
|
|
1049
|
-
/**
|
|
1058
|
+
/**
|
|
1059
|
+
* 把内存态写盘(原子),失败不抛——计数是尽力而为的观测,不是事务。
|
|
1060
|
+
*
|
|
1061
|
+
* 但「不抛」不等于「不说」。这一句注释原先与实现相反:writeStateFile 失败会**抛**
|
|
1062
|
+
* (state-store.ts 的 writeStateFile 在 catch 里重抛),抛给谁?本仓的用法是
|
|
1063
|
+
* index.ts 那句 `.catch(() => {})`(理由见那里:观测失败不是对话失败)——于是
|
|
1064
|
+
* 一次写失败被彻底咽掉:面板继续显示上一次成功落盘的数字,计数看起来是活的,
|
|
1065
|
+
* 其实早就冻住了,而**没有任何人知道**(没有日志,没有 shapeWarning)。
|
|
1066
|
+
*
|
|
1067
|
+
* 所以失败要留两处痕迹:日志(给操作者)与 {@link writeAnomaly}(进快照的
|
|
1068
|
+
* shapeWarnings,给面板)。吞掉的是失败,不是失败的原因。
|
|
1069
|
+
*/
|
|
1050
1070
|
const persist = async (payload) => {
|
|
1051
|
-
|
|
1052
|
-
|
|
1071
|
+
try {
|
|
1072
|
+
await ensureStateDir(dir);
|
|
1073
|
+
await writeStateFile(file, JSON.stringify(payload), { temporary: temporaryOf(dir, "usage.json") });
|
|
1074
|
+
} catch (error) {
|
|
1075
|
+
const note = `usage-state: write failed (${redactSecrets(errMsg(error))})`;
|
|
1076
|
+
writeAnomaly = note;
|
|
1077
|
+
logger?.warn?.(`${name}: ${note} — the local counters are not reaching disk; the panel still shows the last values that did`);
|
|
1078
|
+
return;
|
|
1079
|
+
}
|
|
1080
|
+
writeAnomaly = null;
|
|
1053
1081
|
cache.remember(payload);
|
|
1054
1082
|
};
|
|
1055
1083
|
/**
|
|
@@ -1266,9 +1294,14 @@ function createFileUsageStore({ name, profile = null, retentionDays = 90, maxEve
|
|
|
1266
1294
|
if (payload === null) return await pathExists(file) ? null : [];
|
|
1267
1295
|
return [...payload.events ?? []];
|
|
1268
1296
|
},
|
|
1269
|
-
/**
|
|
1297
|
+
/**
|
|
1298
|
+
* 最近一次异常(无异常为 null)——快照转 shapeWarnings。
|
|
1299
|
+
*
|
|
1300
|
+
* 写失败的痕迹优先于读侧的解析异常:它更近、也更严重(解析异常说「这份文件
|
|
1301
|
+
* 读不懂」,写失败说「我们刚写的东西没落盘」)。
|
|
1302
|
+
*/
|
|
1270
1303
|
anomaly() {
|
|
1271
|
-
return anomaly;
|
|
1304
|
+
return writeAnomaly ?? anomaly;
|
|
1272
1305
|
}
|
|
1273
1306
|
};
|
|
1274
1307
|
}
|
|
@@ -3780,7 +3813,10 @@ function defineDrawTool({ defineTool, fetchImpl, resolveApiKey, getEntries, sett
|
|
|
3780
3813
|
const images = [];
|
|
3781
3814
|
for (const raw of rawImages) {
|
|
3782
3815
|
const normalized = normalizeImageUrlInput(raw);
|
|
3783
|
-
if (normalized === null)
|
|
3816
|
+
if (normalized === null) {
|
|
3817
|
+
const safe = redactSecrets(raw).slice(0, 80);
|
|
3818
|
+
throw new Error(`imageUrl 不可用:${safe} —— 只接受公网 http(s) 链接或 data:image/...;base64 内联数据(本地文件上游取不到,请先上传)`);
|
|
3819
|
+
}
|
|
3784
3820
|
images.push(normalized);
|
|
3785
3821
|
}
|
|
3786
3822
|
try {
|
|
@@ -5848,7 +5884,8 @@ function registerProviderRoute(ctx, wiring) {
|
|
|
5848
5884
|
*
|
|
5849
5885
|
* 一处**与 provider 路由不同**的地方必须说清:provider 开关翻转会**立即**重注册
|
|
5850
5886
|
* (publish 是活的重建),而出图工具的开关翻转**要等下次 Host 启动**——peer 的
|
|
5851
|
-
* tools registry 没有 unregister
|
|
5887
|
+
* tools registry 没有 unregister,工具一旦注册就摘不下来(完整论述见
|
|
5888
|
+
* draw-register.ts 文件头注)。所以本路由保存成功后
|
|
5852
5889
|
* 不改挂载状态,只在响应里给出 `mountPending`,让面板能说清这件事,而不是让用户
|
|
5853
5890
|
* 以为开关坏了。
|
|
5854
5891
|
*
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "dsh-connect-modelscope-token-plan",
|
|
3
3
|
"displayName": "DSH Connect ModelScope Token Plan",
|
|
4
4
|
"icon": "./icon.svg",
|
|
5
|
-
"version": "0.6.
|
|
5
|
+
"version": "0.6.5",
|
|
6
6
|
"homepage": "https://github.com/eghrhegpe/dsh-connect-modelscope-token-plan",
|
|
7
7
|
"bugs": {
|
|
8
8
|
"url": "https://github.com/eghrhegpe/dsh-connect-modelscope-token-plan/issues"
|
|
@@ -45,6 +45,10 @@
|
|
|
45
45
|
"test:mutate": "node tools/dev/mutate.mjs tools/dev/mutate-spec.json",
|
|
46
46
|
"doctor": "node tools/doctor.mjs",
|
|
47
47
|
"doctor:json": "node tools/doctor.mjs --json",
|
|
48
|
+
"host-range:update": "node tools/update-host-range.mjs",
|
|
49
|
+
"host-range:check": "node tools/update-host-range.mjs --check",
|
|
50
|
+
"market-rules:update": "node tools/check-market-rules.mjs",
|
|
51
|
+
"market-rules:check": "node tools/check-market-rules.mjs --check",
|
|
48
52
|
"build": "tsdown -c tsdown.config.mjs",
|
|
49
53
|
"prepack": "npm run build"
|
|
50
54
|
},
|
|
@@ -74,22 +78,48 @@
|
|
|
74
78
|
"@deepseek-ai/dsh-settings": ">=0.1.5 <0.3",
|
|
75
79
|
"@deepseek-ai/dsh-tools": ">=0.1.5 <0.3",
|
|
76
80
|
"@deepseek-ai/schemastery": "^3.18.2",
|
|
77
|
-
"@earendil-works/pi-ai": "
|
|
81
|
+
"@earendil-works/pi-ai": ">=0.85.0 <2.0.0"
|
|
78
82
|
},
|
|
79
83
|
"peerDependenciesMeta": {
|
|
80
|
-
"@deepseek-ai/cordis": {
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
"@deepseek-ai/dsh-client-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
"@deepseek-ai/dsh-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
"@deepseek-ai/dsh-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
"@
|
|
84
|
+
"@deepseek-ai/cordis": {
|
|
85
|
+
"optional": true
|
|
86
|
+
},
|
|
87
|
+
"@deepseek-ai/dsh-client-locale": {
|
|
88
|
+
"optional": true
|
|
89
|
+
},
|
|
90
|
+
"@deepseek-ai/dsh-client-ui-layout": {
|
|
91
|
+
"optional": true
|
|
92
|
+
},
|
|
93
|
+
"@deepseek-ai/dsh-client-ui-renderer": {
|
|
94
|
+
"optional": true
|
|
95
|
+
},
|
|
96
|
+
"@deepseek-ai/dsh-credentials": {
|
|
97
|
+
"optional": true
|
|
98
|
+
},
|
|
99
|
+
"@deepseek-ai/dsh-home-paths": {
|
|
100
|
+
"optional": true
|
|
101
|
+
},
|
|
102
|
+
"@deepseek-ai/dsh-host-webserver": {
|
|
103
|
+
"optional": true
|
|
104
|
+
},
|
|
105
|
+
"@deepseek-ai/dsh-llm": {
|
|
106
|
+
"optional": true
|
|
107
|
+
},
|
|
108
|
+
"@deepseek-ai/dsh-llm-pi-ai": {
|
|
109
|
+
"optional": true
|
|
110
|
+
},
|
|
111
|
+
"@deepseek-ai/dsh-settings": {
|
|
112
|
+
"optional": true
|
|
113
|
+
},
|
|
114
|
+
"@deepseek-ai/dsh-tools": {
|
|
115
|
+
"optional": true
|
|
116
|
+
},
|
|
117
|
+
"@deepseek-ai/schemastery": {
|
|
118
|
+
"optional": true
|
|
119
|
+
},
|
|
120
|
+
"@earendil-works/pi-ai": {
|
|
121
|
+
"optional": true
|
|
122
|
+
}
|
|
93
123
|
},
|
|
94
124
|
"engines": {
|
|
95
125
|
"node": "^22.19.0 || >=24.0.0"
|
|
@@ -101,6 +131,7 @@
|
|
|
101
131
|
"license": "MIT",
|
|
102
132
|
"devDependencies": {
|
|
103
133
|
"@types/node": "^22.19.0",
|
|
134
|
+
"js-yaml": "^5.3.0",
|
|
104
135
|
"jscpd": "^5.4.0",
|
|
105
136
|
"jsdom": "^30.1.3",
|
|
106
137
|
"react": "18.3.1",
|