mslxdff 0.1.174 → 0.1.176

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.
Files changed (117) hide show
  1. package/bin/mslxdff.js +3 -3
  2. package/package.json +1 -1
  3. package/src/auto.js +254 -254
  4. package/src/bench/cline-bench.js +42 -42
  5. package/src/bench/probe.js +70 -70
  6. package/src/bench/report.js +162 -162
  7. package/src/bench/runner.js +77 -77
  8. package/src/bench/via-probe.js +124 -124
  9. package/src/bench/via-routes.js +87 -87
  10. package/src/bench/workbuddy-bench.js +54 -54
  11. package/src/chat/engine.js +160 -160
  12. package/src/chat/gateway.js +163 -163
  13. package/src/chat/orchestrator.js +234 -234
  14. package/src/chat/prompt.js +70 -70
  15. package/src/chat/repl.js +88 -88
  16. package/src/chat/terminal.js +135 -135
  17. package/src/chat/tools.js +306 -306
  18. package/src/chat-pipeline/auto-race.js +26 -1
  19. package/src/chat-pipeline/index.js +131 -131
  20. package/src/chat-pipeline/policy.js +84 -84
  21. package/src/chat-pipeline/serial-trial.js +35 -8
  22. package/src/chat-pipeline/terminal-verdict.js +109 -0
  23. package/src/cli/commands/group.js +249 -249
  24. package/src/cli/commands/model/picks.js +50 -50
  25. package/src/cli/commands/provider/bench-via.js +247 -247
  26. package/src/cli/commands/provider/bench.js +141 -141
  27. package/src/cli/commands/provider/index.js +136 -133
  28. package/src/cli/commands/provider/keys-guard.js +50 -0
  29. package/src/cli/commands/provider/keys.js +7 -0
  30. package/src/cli/commands/provider/models.js +145 -145
  31. package/src/cli/commands/provider/qwenwork-login.js +119 -119
  32. package/src/cli/commands/provider/traework-checkin.js +144 -0
  33. package/src/cli/commands/provider/traework-login.js +7 -45
  34. package/src/cli/commands/sync.js +310 -310
  35. package/src/cli/help.js +3 -0
  36. package/src/cli/status.js +279 -279
  37. package/src/daemon.js +112 -112
  38. package/src/model-capabilities/enrich.js +86 -86
  39. package/src/model-capabilities/index.js +183 -183
  40. package/src/model-capabilities/parse.js +70 -70
  41. package/src/model-trace.js +2 -0
  42. package/src/models.js +225 -225
  43. package/src/providers/cline/auth.js +228 -228
  44. package/src/providers/cline/chat.js +307 -307
  45. package/src/providers/cline.js +2 -2
  46. package/src/providers/codearts/chat.js +7 -1
  47. package/src/providers/codearts/const.js +6 -1
  48. package/src/providers/codearts/index.js +18 -11
  49. package/src/providers/globalqwenwork/cosy.js +123 -123
  50. package/src/providers/globalqwenwork/crypto.js +218 -218
  51. package/src/providers/globalqwenwork/http.js +20 -20
  52. package/src/providers/globalqwenwork/rsa.js +54 -54
  53. package/src/providers/globalqwenwork/sse.js +268 -268
  54. package/src/providers/globalqwenwork/stream.js +130 -130
  55. package/src/providers/globalqwenwork/upstream.js +122 -122
  56. package/src/providers/keyring.js +60 -60
  57. package/src/providers/qoder/chat.js +203 -203
  58. package/src/providers/qoder/index.js +249 -249
  59. package/src/providers/qoder/sse.js +145 -145
  60. package/src/providers/qwenwork/account-store.js +133 -133
  61. package/src/providers/qwenwork/constants.js +67 -67
  62. package/src/providers/qwenwork/cosy.js +120 -120
  63. package/src/providers/qwenwork/crypto.js +218 -218
  64. package/src/providers/qwenwork/http.js +20 -20
  65. package/src/providers/qwenwork/index.js +327 -327
  66. package/src/providers/qwenwork/payload.js +144 -144
  67. package/src/providers/qwenwork/rsa.js +54 -54
  68. package/src/providers/qwenwork/sse.js +268 -268
  69. package/src/providers/qwenwork/stream.js +130 -130
  70. package/src/providers/qwenwork/upstream.js +120 -120
  71. package/src/providers/qwenwork.js +1 -1
  72. package/src/providers/registry.js +79 -79
  73. package/src/providers/traework/account-store.js +87 -2
  74. package/src/providers/traework/checkin.js +51 -9
  75. package/src/providers/traework/constants.js +20 -0
  76. package/src/providers/traework/headers.js +42 -10
  77. package/src/providers/traework/index.js +14 -4
  78. package/src/providers/traework/market-identity.js +116 -0
  79. package/src/providers/workbuddy/chat.js +248 -248
  80. package/src/providers/workbuddy/reshape.js +152 -152
  81. package/src/providers/workbuddy.js +2 -2
  82. package/src/reasoning.js +32 -32
  83. package/src/routes/chat/gateway.js +46 -46
  84. package/src/routes/chat/relay-pipeline.js +294 -294
  85. package/src/routes/chat/via-route-handler.js +146 -146
  86. package/src/routes/hedge.js +255 -255
  87. package/src/routes/models-route.js +167 -167
  88. package/src/routes/peers.js +273 -273
  89. package/src/routes/stream.js +385 -385
  90. package/src/runtime/bootstrap.js +50 -50
  91. package/src/runtime/provider-gate.js +36 -36
  92. package/src/runtime/providers-setup.js +168 -165
  93. package/src/runtime/traework-checkin.js +26 -11
  94. package/src/server.js +69 -69
  95. package/src/state/schemas/allowlist.js +92 -92
  96. package/src/sync-opencode.js +280 -280
  97. package/src/transport/index.js +244 -244
  98. package/src/transport/pool.js +56 -56
  99. package/src/transport/retry.js +24 -24
  100. package/src/transport/sse.js +93 -93
  101. package/src/upstream-probe/display.js +52 -52
  102. package/src/upstream-probe/probe.js +49 -49
  103. package/src/upstream-probe/rotate.js +110 -110
  104. package/src/upstream-probe/start.js +45 -45
  105. package/src/upstream.js +291 -289
  106. package/src/warp-pool/config.js +71 -0
  107. package/src/warp-pool/health.js +65 -0
  108. package/src/warp-pool/index.js +261 -0
  109. package/src/warp-pool/keys.js +29 -0
  110. package/src/warp-pool/nodes.js +94 -0
  111. package/src/warp-pool/register.js +113 -0
  112. package/src/warp-pool/rotate.js +150 -0
  113. package/src/warp-pool/strategy.js +43 -0
  114. package/src/warp-pool/wireproxy.js +153 -0
  115. package/docs/cli_help_mini.md +0 -143
  116. package/src/providers/AGENTS.md +0 -49
  117. package/src/routes/AGENTS.md +0 -37
@@ -0,0 +1,144 @@
1
+ // mslxdff -provider traework checkin|quota —— 签到与积分(仿 qoder 的 login/checkin 分文件范式)。
2
+ //
3
+ // 子命令:
4
+ // checkin 逐号补领今日积分(到账与否**只认领取后复查**,见 providers/traework/checkin.js 头注)
5
+ // quota|credits|balance [--json] 只读查签到状态与积分额度:走 api.trae.cn 状态接口,**不发模型请求、不烧配额**
6
+ //
7
+ // ⚠ 两个读数口径(2026-10-15 实测,别再当余额看):
8
+ // 1. 「额度上限」= 各 entitlement pack 的 credits_limit 求和,是**上限**不是剩余;上游没有已用/剩余字段,
9
+ // 所以模型报 4008(requests exceeded the quota)时这个数照样非零。
10
+ // 2. 今日是否真签到只认 checkinStatus().checked_in,不认 claim 回执 —— raccoon 踩过同一坑
11
+ // (见 raccoon-quota.js:3-5「判据一律走账单,只信回执就会谎报到账」)。
12
+ import { normalizeProviderId } from "../../../providers/model-id.js";
13
+ import { compatFetch } from "../../../compat.js";
14
+
15
+ const CHECKIN_SUBS = new Set(["checkin", "signin"]);
16
+ const QUOTA_SUBS = new Set(["quota", "credits", "balance"]);
17
+ // keys 与 auths 是平行数组(account-store 按位序成对)。不像凭据的槽位 = 多半被 CLI 误写过。
18
+ const looksLikeCredential = (k) => typeof k === "string" && k.trim().length >= 20 && ![...k].some((c) => c.trim() === "");
19
+ const badKeyHint = (i, len) => `keys[${i}] 不像 accessToken(${len} 字符),疑被误写 → mslxdff -provider traework login 重登回填(或查 auths/trae-<uid>.json)`;
20
+
21
+ function isTraework(id) {
22
+ return (normalizeProviderId(id) || String(id || "").toLowerCase()) === "traework";
23
+ }
24
+
25
+ // 按位序配号:keys[i] ↔ auths[i],只回 uid 与 token,绝不外打完整 token(凭据纪律)。
26
+ function accounts(keys, authList) {
27
+ const out = [];
28
+ for (let i = 0; i < Math.max(keys.length, authList.length); i++) {
29
+ const auth = authList[i] || {};
30
+ const at = keys[i] || "";
31
+ if (!auth?.uid && !at) continue;
32
+ out.push({ uid: String(auth.uid || "(无 uid)"), accessToken: at, deviceId: auth.deviceId || "" });
33
+ }
34
+ return out;
35
+ }
36
+
37
+ async function loadCreds(deps) {
38
+ const { loadProviderConfig, loadProviderKeys } = await import("../../../state.js");
39
+ const cfg = deps.config ?? loadProviderConfig("traework") ?? {};
40
+ return {
41
+ keys: deps.keys || loadProviderKeys("traework") || [],
42
+ authList: deps.auths || cfg.auths || [],
43
+ };
44
+ }
45
+
46
+ /** 手动补领今日积分。退出码:一个都没到账 → 1(旧写法恒 0,配合谎报的 ok:true 会让人以为签好了)。 */
47
+ export async function handleTraeworkCheckin(id, sub, rest = [], deps = {}) {
48
+ if (!isTraework(id) || !CHECKIN_SUBS.has(String(sub || "").toLowerCase())) return false;
49
+ const fetchImpl = deps.fetchImpl || compatFetch;
50
+ const log = deps.log || ((m) => console.log(m));
51
+ const exit = deps.exit || ((code) => process.exit(code));
52
+ const { keys, authList } = await loadCreds(deps);
53
+ if (!keys.length || !authList.length) {
54
+ console.error("没有 traework 账号,请先 mslxdff -provider traework login");
55
+ exit(1);
56
+ return true;
57
+ }
58
+ const { checkinStatus, checkinClaimVerified, entUsage } = deps.checkinModule || (await import("../../../providers/traework/checkin.js"));
59
+ let landed = 0, tried = 0;
60
+ for (const a of accounts(keys, authList)) {
61
+ tried++;
62
+ log(`账号 ${a.uid.slice(0, 8)}...`);
63
+ if (!looksLikeCredential(a.accessToken)) { log(` ✗ ${badKeyHint(tried - 1, a.accessToken.length)}`); continue; }
64
+ const cred = { accessToken: a.accessToken, deviceId: a.deviceId, uid: a.uid };
65
+ try {
66
+ const st = await checkinStatus({ cred, fetchImpl });
67
+ log(` 签到状态: checked_in=${st.checkedIn} credits=${st.credits} enable=${st.enable}`);
68
+ const r = await checkinClaimVerified({ cred, fetchImpl, before: st });
69
+ if (r.claimed) { landed++; log(" 签到: ✓ 已到账(复查 checked_in=true)"); }
70
+ else if (r.already) { landed++; log(" 签到: 今日已签过,跳过领取"); }
71
+ else if (r.phantom) log(" 签到: ✗ 未到账 —— 上游回执没报错但复查 checked_in 仍 false,**别当今天签过了**,稍后重试");
72
+ else log(` 签到: ✗ ${r.msg || "未到账"}`);
73
+ const ent = await entUsage({ cred, fetchImpl });
74
+ log(` 积分额度上限: ${ent.totalCredits}(${ent.packCount} 个权益包 · 非剩余可用)`);
75
+ } catch (e) {
76
+ log(` 失败: ${String(e?.message || e).slice(0, 120)}`);
77
+ }
78
+ }
79
+ if (!deps.noExit) exit(landed === 0 && tried > 0 ? 1 : 0);
80
+ return true;
81
+ }
82
+
83
+ /** 只读视图:逐号打印签到状态 + 积分额度上限。 */
84
+ export async function handleTraeworkQuota(id, sub, rest = [], deps = {}) {
85
+ if (!isTraework(id) || !QUOTA_SUBS.has(String(sub || "").toLowerCase())) return false;
86
+ const log = deps.log || ((m) => console.log(m));
87
+ const exit = deps.exit || ((code) => process.exit(code));
88
+ const wantsJson = rest.includes("--json") || rest.includes("-json");
89
+ const { keys, authList } = await loadCreds(deps);
90
+
91
+ if (!keys.length && !authList.length) {
92
+ if (wantsJson) log(JSON.stringify({ error: "not_logged_in", hint: "mslxdff -provider traework login" }));
93
+ else {
94
+ log("未登录:还没有 traework 账号");
95
+ log(" 先运行: mslxdff -provider traework login(登录后自动回填 keys/auths 并签到)");
96
+ }
97
+ exit(1);
98
+ return true;
99
+ }
100
+
101
+ const { checkinStatus, entUsage } = deps.checkinModule || (await import("../../../providers/traework/checkin.js"));
102
+ const fetchImpl = deps.fetchImpl || compatFetch;
103
+ const list = [];
104
+ for (const [i, a] of accounts(keys, authList).entries()) {
105
+ const base = { uid: a.uid, tokenLen: a.accessToken.length };
106
+ if (!looksLikeCredential(a.accessToken)) {
107
+ list.push({ ...base, ok: false, msg: `keys 槽位不像凭据(${a.accessToken.length} 字符),疑被误写`, fix: badKeyHint(i, a.accessToken.length) });
108
+ continue;
109
+ }
110
+ const cred = { accessToken: a.accessToken, deviceId: a.deviceId, uid: a.uid };
111
+ try {
112
+ const st = await checkinStatus({ cred, fetchImpl });
113
+ const ent = await entUsage({ cred, fetchImpl });
114
+ list.push({ ...base, ok: true, checkedIn: st.checkedIn, enable: st.enable, dailyCredits: st.credits, totalCredits: ent.totalCredits, packCount: ent.packCount, isCreditsBilling: ent.isCreditsBilling });
115
+ } catch (e) {
116
+ list.push({ ...base, ok: false, msg: String(e?.message || e).slice(0, 140), fix: "登录态可能已失效:mslxdff -provider traework login" });
117
+ }
118
+ }
119
+ const failed = list.filter((r) => !r.ok).length;
120
+ const allBad = failed === list.length && list.length > 0;
121
+
122
+ if (wantsJson) {
123
+ log(JSON.stringify({ provider: "traework", accounts: list, ok: list.length - failed, total: list.length, note: "totalCredits 是额度上限非剩余" }));
124
+ exit(allBad ? 1 : 0);
125
+ return true;
126
+ }
127
+
128
+ log(`traework 签到与积分 · 共 ${list.length} 个号`);
129
+ for (const r of list) {
130
+ if (!r.ok) {
131
+ log(` [${r.uid}] ❌ ${r.msg}`);
132
+ if (r.fix) log(` → ${r.fix}`);
133
+ continue;
134
+ }
135
+ const sign = r.checkedIn ? "✓ 今日已签到" : r.enable ? "○ 今日未签到" : "- 上游未开放签到";
136
+ log(` [${r.uid}] ${sign} · 每日可领 ${r.dailyCredits} · 额度上限 ${r.totalCredits}(${r.packCount} 个权益包)`);
137
+ }
138
+ log("");
139
+ log(" ⚠ 「额度上限」= 各权益包 credits_limit 之和,**不是剩余可用**;上游无已用/剩余字段。");
140
+ log(" ⚠ 判还能不能用只认模型报错本身:4008 exceeded = 该池已触顶,与上面的总数无关。");
141
+ log(" 补领今日积分: mslxdff -provider traework checkin");
142
+ exit(allBad ? 1 : 0);
143
+ return true;
144
+ }
@@ -139,18 +139,17 @@ export async function handleTraeworkLogin(id, sub, rest = [], deps = {}) {
139
139
  const { saveTraeworkAccount } = await import("../../../providers/traework/account-store.js");
140
140
  const save = deps.saveAccount || saveTraeworkAccount;
141
141
  const saved = await save({ uid, enterpriseId, nickname, accessToken: token, refreshToken, expiresAt, domain: "trae.cn", apiHost: API_HOST, machineId, deviceId });
142
- // 自动签到 + 查积分
142
+ // 自动签到 + 查积分(到账与否只认「领取后复查」,口径见 providers/traework/checkin.js 头注)
143
143
  try {
144
- const { checkinStatus, checkinClaim, entUsage } = await import("../../../providers/traework/checkin.js");
145
- const cred = { accessToken: token, deviceId };
144
+ const { checkinStatus, checkinClaimVerified, entUsage } = await import("../../../providers/traework/checkin.js");
145
+ // 必须带 uid:UG 接口的市场身份(x-device-id 等)是按 uid 派生的,缺 uid 只能拿到不可复现的兜底值
146
+ const cred = { accessToken: token, uid, deviceId };
146
147
  const st = await checkinStatus({ cred, fetchImpl });
147
148
  log(`签到状态: checked_in=${st.checkedIn} credits=${st.credits} enable=${st.enable}`);
148
- if (!st.checkedIn && st.enable) {
149
- await checkinClaim({ cred, fetchImpl });
150
- log("签到: success");
151
- }
149
+ const r = await checkinClaimVerified({ cred, fetchImpl, before: st });
150
+ log(r.claimed ? "签到: ✓ 已到账" : r.already ? "签到: 今日已签过" : `签到: ✗ 未到账(${r.msg || "复查 checked_in=false"})→ 稍后 mslxdff -provider traework checkin 重试`);
152
151
  const ent = await entUsage({ cred, fetchImpl });
153
- log(`当前积分: ${ent.remain}`);
152
+ log(`积分额度上限: ${ent.totalCredits}(${ent.packCount} 个权益包 · 非剩余可用)`);
154
153
  } catch (e) { log(`签到/查积分: ${String(e?.message || e).slice(0, 200)}`); }
155
154
  log("");
156
155
  log("=".repeat(60));
@@ -163,40 +162,3 @@ export async function handleTraeworkLogin(id, sub, rest = [], deps = {}) {
163
162
  if (!deps.noExit) process.exit(0);
164
163
  return true;
165
164
  }
166
-
167
- // 手动签到:-provider traework checkin
168
- export async function handleTraeworkCheckin(id, sub, rest = [], deps = {}) {
169
- if (String(id || "").toLowerCase() !== "traework") return false;
170
- if (sub !== "checkin") return false;
171
- const fetchImpl = deps.fetchImpl || compatFetch;
172
- const log = deps.log || ((m) => console.log(m));
173
- const { loadProviderConfig, loadProviderKeys, defaultStateFile } = await import("../../../state.js");
174
- const cfg = loadProviderConfig("traework");
175
- const keys = deps.keys || loadProviderKeys("traework");
176
- const authList = deps.auths || cfg?.auths || [];
177
- if (!keys.length || !authList.length) { console.error("没有 traework 账号,请先 mslxdff -provider traework login"); process.exit(1); }
178
- const { checkinStatus, checkinClaim, entUsage } = await import("../../../providers/traework/checkin.js");
179
- for (let i = 0; i < Math.min(keys.length, authList.length); i++) {
180
- const auth = authList[i];
181
- const at = keys[i];
182
- if (!auth?.uid || !at) continue;
183
- const cred = { accessToken: at, deviceId: auth?.deviceId || "", uid: auth.uid };
184
- log(`账号 ${auth.uid.slice(0, 8)}...`);
185
- try {
186
- const st = await checkinStatus({ cred, fetchImpl });
187
- log(` 签到状态: checked_in=${st.checkedIn} credits=${st.credits} enable=${st.enable}`);
188
- if (!st.checkedIn && st.enable) {
189
- await checkinClaim({ cred, fetchImpl });
190
- log(` 签到: success`);
191
- const st2 = await checkinStatus({ cred, fetchImpl });
192
- log(` 签到后积分: ${st2.credits}`);
193
- }
194
- const ent = await entUsage({ cred, fetchImpl });
195
- log(` 总积分: ${ent.remain}`);
196
- } catch (e) {
197
- log(` 失败: ${String(e?.message || e).slice(0, 120)}`);
198
- }
199
- }
200
- if (!deps.noExit) process.exit(0);
201
- return true;
202
- }