mslxdff 0.1.225 → 0.1.227

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.
@@ -80,7 +80,10 @@
80
80
  | raccoon 接入 | `-provider raccoon login` | Raccoon(商汤小浣熊)扫码登录:生成 `qrcode_code`→终端二维码 + `login/mp?code=` 链接→**用微信「扫一扫」扫**并确认(浏览器直接打开链接会 404,站点 SPA 无该路由)→轮询拿 token,落盘 `auths/raccoon-<uid>.json`+state(`keys` 一律以文档为准,续期后自愈)并把兜底 6 模型并入 allowlist;`raccoon/<modelId>` 前缀路由(**OpenAI 兼容网关**,**免验证码**);多号自动轮换:请求内撞积分不足/限流就当场换下一个号,**暂不支持手动指定用哪个号**;积分不足长冷 1h、限流短冷 30s;恒 local-only 不借出 |
81
81
  | raccoon 密码登录 | `-provider raccoon login --password` | Raccoon **手机号+密码登录**(多号免扫码):走官方同款 `POST /api/web/auth/v1/login_with_password`,**phone/password 须 AES-128-CFB 加密**(key 硬编码于前端,见 `crypto.js`;发明文会报「手机号或密码不正确」);TTY 下密码**关回显**(逐键 `*`),非 TTY 须 `--password=<密码>`;默认 `--nation 86`;失败给人话(「手机号或密码不正确」),回执回显手机号但**打码**、**不回显密码**;落盘/确认/领奖与扫码登录完全同路 |
82
82
  | raccoon 积分 | `-provider raccoon quota [--json]` / `checkin` | 逐号查积分五分项 / 领「桌面端登录奖励」——**这家没有每日签到**:每日 300 与注册礼包 3000 由服务端自动发(无端点,每日 300 当天 23:59:59 清零),唯一要领的登录奖励 3000 是**每号一次性**且 `login` 时已自动领掉,`checkin` 只是补领兜底;判据只认账单、不认上游 `code:0`(重复领会虚回成功);未登录给 login 指引;daemon 每日 09:00 兜底扫描未领过的号(`MSLXDFF_RACCOON_CHECKIN=0` 关,`_CHECKIN_HOUR` 改点) |
83
- | WorkBuddy 成长任务 | `-workbuddy growth [--json]` / `-wb growth` | 成长任务全自动(拉列表→参与→触发→领奖,串行 1.2s/1s,已领幂等跳过);可自动 `chat_5`/`automation_1`/`skill_1`/`Model_chat_GLM5.2`,需客户端任务标 MANUAL 不发包;daemon 每日 09:30 自动(`MSLXDFF_WORKBUDDY_GROWTH=0` 关,`_GROWTH_HOUR`/`_GROWTH_MODEL` 可配) |
83
+ | WorkBuddy 成长任务 | `-workbuddy growth [--json]` / `-wb growth` | 成长任务全自动(拉列表→参与→触发→领奖,串行 1.2s/1s,已领幂等跳过);三种触发通道分派——`growthEvent` 对话(`chat_5`/`automation_1`/`skill_1`/`Model_chat_GLM5.2`)、桌面指纹事件链(`RichMeow_Chat`/`Buddy_App`/`Buddy_App_QQ`/`create_canvas`/`template_5`/`playbook_prompt`)、专家真实对话回执(`expert_5`/`Expert_team_use_3`);**任务列表与领奖只在 `www.workbuddy.cn` 命中**,accept 前上游不下发 target 须 accept 后重读;仍 MANUAL 的 5 项(`Library_read`/`Expert_lighthouse`/`Hp_Appearance`/`WorkBuddy_Valorant`/`wb_wechat_oa_subscribe_task`)只认客户端真实行为,不空烧对话;daemon 每日 09:30 自动(`MSLXDFF_WORKBUDDY_GROWTH=0` 关,`_GROWTH_HOUR`/`_GROWTH_MODEL` 可配) |
84
+ | WorkBuddy 积分盘点 | `-provider workbuddy quota [--json]` / `credits` / `balance` | **只读**逐号列未领任务(含积分/进度/状态)、连登天数、可兑档位、抽奖次数、未领合计;不发任何写请求 |
85
+ | WorkBuddy 补领 | `-provider workbuddy checkin [--json]` / `claim` | 补领闭环:活跃上报点亮连登 → 兑换 7/14/28 档位 → 抽完全部次数 → 成长任务全量(含桌面/专家通道);输出到账项数/积分/跳过项/未计分告警 |
86
+ | WorkBuddy 连登 | daemon 每日随成长排程 | **签到不点亮连登**——`streak.days` 只认 `/v2/report` 的 `chat_request_send` 事件;不发则 7/14/28 档位积分与抽奖次数永远拿不到(2026-10-20 实测签到成功但 streak 恒 0) |
84
87
  | WorkBuddy 猫猫旅行 | `-workbuddy travel [--json]` / `-wb travel` | 无猫自动同意协议+领养(+300,门槛未达自动补一次对话解锁);到站领奖 / 空闲派出(location 4)/ 旅行中跳过 |
85
88
  | WorkBuddy 余额 | `-workbuddy balance [--json]` / `-wb balance` | 查多号余额(`total/dailyPacks/nextExpire`,TTL 5min) |
86
89
  | WorkBuddy 列表 | `-workbuddy list` / `-wb list` | 列账号(`uid/domain/enterpriseId`) |
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mslxdff",
3
- "version": "0.1.225",
3
+ "version": "0.1.227",
4
4
  "description": "测试项目,请勿使用。",
5
5
  "type": "module",
6
6
  "bin": {
@@ -76,6 +76,8 @@ export async function handleProvider(args) {
76
76
  if (await handleClineLogin(id, sub)) return true;
77
77
  const { handleWorkbuddyLogin } = await import("./workbuddy-login.js");
78
78
  if (await handleWorkbuddyLogin(id, sub, rest)) return true;
79
+ const { handleWorkbuddyQuota } = await import("./workbuddy-quota.js");
80
+ if (await handleWorkbuddyQuota(id, sub, rest)) return true;
79
81
  const { handleCodeartsLogin } = await import("./codearts-login.js");
80
82
  if (await handleCodeartsLogin(id, sub, rest)) return true;
81
83
  const { handleTraeworkLogin } = await import("./traework-login.js");
@@ -0,0 +1,154 @@
1
+ // mslxdff -provider workbuddy quota|checkin —— 查还漏领多少积分 / 手动补领
2
+ //
3
+ // 子命令:
4
+ // quota|credits|balance [--json] 只读:逐号列出未领任务、连登天数、可兑换档位、抽奖次数
5
+ // checkin|claim 补领:连登兑换 + 抽奖 + 成长任务闭环(含桌面/专家类)
6
+ //
7
+ // ⚠ 只读口径(2026-10-20 实测):
8
+ // - 签到每天成功(code 0)**不等于**连登点亮;连登只认 /v2/report 的
9
+ // chat_request_send 事件,所以「签到 OK + 连登 0 天」是常态,不是异常。
10
+ // - 任务列表与领奖只在 www.workbuddy.cn 命中(web 成长中心口径)。
11
+ import { normalizeProviderId } from "../../../providers/model-id.js";
12
+ import { compatFetch } from "../../../compat.js";
13
+
14
+ const QUOTA_SUBS = new Set(["quota", "credits", "balance"]);
15
+ const CLAIM_SUBS = new Set(["checkin", "claim", "signin"]);
16
+
17
+ async function loadCreds() {
18
+ const { loadProviderConfig, loadProviderKeys } = await import("../../../state.js");
19
+ const cfg = loadProviderConfig("workbuddy") || {};
20
+ const keys = loadProviderKeys("workbuddy") || [];
21
+ const authList = Array.isArray(cfg.auths) ? cfg.auths : [];
22
+ const out = [];
23
+ for (let i = 0; i < Math.max(keys.length, authList.length); i++) {
24
+ const a = authList[i] || {};
25
+ const at = keys[i] || "";
26
+ if (!a.uid || !at) continue;
27
+ out.push({ uid: a.uid, at, domain: a.domain, enterpriseId: a.enterpriseId || "" });
28
+ }
29
+ return out;
30
+ }
31
+
32
+ const short = (uid) => String(uid).slice(0, 8);
33
+
34
+ export async function handleWorkbuddyQuota(id, sub, rest = [], deps = {}) {
35
+ const pid = normalizeProviderId(id) || String(id || "").toLowerCase();
36
+ if (pid !== "workbuddy") return false;
37
+ const s = String(sub || "").toLowerCase();
38
+ const isClaim = CLAIM_SUBS.has(s);
39
+ if (!isClaim && !QUOTA_SUBS.has(s)) return false;
40
+
41
+ const log = deps.log || ((m) => console.log(m));
42
+ const exit = deps.exit || ((code) => process.exit(code));
43
+ const json = rest.includes("--json") || rest.includes("-json");
44
+ const fetchImpl = deps.fetchImpl || compatFetch;
45
+ const accounts = await loadCreds();
46
+ if (!accounts.length) {
47
+ if (json) log(JSON.stringify({ error: "not_logged_in", hint: "mslxdff -provider workbuddy login" }));
48
+ else {
49
+ log("未登录:还没有 workbuddy 账号");
50
+ log(" 先运行: mslxdff -provider workbuddy login");
51
+ }
52
+ exit(1);
53
+ return true;
54
+ }
55
+
56
+ const { growthTasks, runGrowthAccount } = await import("../../../providers/workbuddy/growth.js");
57
+ const { growthStreak, lotteryChances, reportChatActivity, runStreakBonus } = await import("../../../providers/workbuddy/activity.js");
58
+
59
+ const rows = [];
60
+ for (const a of accounts) {
61
+ const row = { uid: a.uid, ok: true };
62
+ try {
63
+ if (isClaim) {
64
+ const rep = await reportChatActivity({ ...a, fetchImpl });
65
+ const sb = await runStreakBonus({ ...a, fetchImpl });
66
+ const g = await runGrowthAccount({ ...a, fetchImpl });
67
+ row.activity = rep.ok;
68
+ row.streak = { days: sb.days, redeemed: sb.redeemed, drawn: sb.drawn, credit: sb.credit, errors: sb.errors };
69
+ const claimed = g.tasks.filter((t) => t.status === "claimed");
70
+ row.growth = {
71
+ credit: g.credit, energy: g.energy,
72
+ claimed: claimed.map((t) => t.task_code),
73
+ ignored: g.tasks.filter((t) => t.fired > 0 && !["claimed", "completed"].includes(String(t.status || ""))).map((t) => t.task_code),
74
+ skipped: g.tasks.filter((t) => t.skipped).length,
75
+ error: g.error,
76
+ };
77
+ row.ok = rep.ok || g.ok;
78
+ } else {
79
+ const listed = await growthTasks({ ...a, fetchImpl });
80
+ const tasks = listed.tasks || [];
81
+ const pending = tasks.filter((t) => t.accept_status !== "claimed");
82
+ row.tasksError = listed.ok ? null : listed.msg || "拉取失败";
83
+ row.pending = pending.map((t) => ({
84
+ code: t.task_code,
85
+ credit: Number(t.reward_credit || 0),
86
+ energy: Number(t.reward_energy || 0),
87
+ status: t.accept_status,
88
+ progress: `${t.progress?.current ?? t.current ?? 0}/${t.progress?.target ?? t.target ?? 0}`,
89
+ }));
90
+ row.pendingCredit = row.pending.reduce((n, t) => n + t.credit, 0);
91
+ row.claimed = tasks.filter((t) => t.accept_status === "claimed").length;
92
+ const st = await growthStreak({ ...a, fetchImpl });
93
+ row.streak = { days: st.days, tiers: st.tiers, cards: st.cards, error: st.ok ? undefined : st.msg };
94
+ const lot = await lotteryChances({ ...a, fetchImpl });
95
+ row.chances = lot.chances;
96
+ row.ok = !!listed.ok;
97
+ }
98
+ } catch (e) {
99
+ row.ok = false;
100
+ row.error = String(e?.message || e).slice(0, 160);
101
+ }
102
+ rows.push(row);
103
+ }
104
+
105
+ const failed = rows.filter((r) => !r.ok).length;
106
+
107
+ if (json) {
108
+ log(JSON.stringify({ provider: "workbuddy", mode: isClaim ? "claim" : "quota", accounts: rows, ok: rows.length - failed, total: rows.length }));
109
+ exit(failed === rows.length ? 1 : 0);
110
+ return true;
111
+ }
112
+
113
+ if (isClaim) {
114
+ log(`workbuddy 补领 · 共 ${rows.length} 个号`);
115
+ for (const r of rows) {
116
+ log(` [${short(r.uid)}]`);
117
+ if (r.error) { log(` ❌ ${r.error}`); continue; }
118
+ log(` 活跃上报: ${r.activity ? "✓ 已点亮连登" : "✗ 失败"}`);
119
+ const s = r.streak || {};
120
+ const tiers = (s.redeemed || []).map((x) => `${x.tier}(+${x.credit}c)`).join(" ") || "-";
121
+ log(` 连登: ${s.days ?? "?"} 天 · 兑换 ${tiers} · 抽奖 ${s.drawn ?? 0} 次 · +${s.credit ?? 0} 分`);
122
+ if (s.errors?.length) log(` ⚠ ${s.errors.join(";")}`);
123
+ const g = r.growth || {};
124
+ log(` 成长任务: 到账 ${g.claimed?.length ?? 0} 项 · +${g.credit ?? 0} 分 · 跳过 ${g.skipped ?? 0} 项`);
125
+ if (g.claimed?.length) log(` 已领: ${g.claimed.join(", ")}`);
126
+ if (g.ignored?.length) log(` ⚠ 上报未计分(该任务只认客户端真实行为): ${g.ignored.join(", ")}`);
127
+ if (g.error) log(` ⚠ ${g.error}`);
128
+ }
129
+ log("");
130
+ log(" 复核: mslxdff -provider workbuddy quota");
131
+ exit(failed === rows.length ? 1 : 0);
132
+ return true;
133
+ }
134
+
135
+ log(`workbuddy 已领 / 未领 · 共 ${rows.length} 个号`);
136
+ let totalPending = 0;
137
+ for (const r of rows) {
138
+ if (r.error) { log(` [${short(r.uid)}] ❌ ${r.error}`); continue; }
139
+ totalPending += r.pendingCredit || 0;
140
+ const st = r.streak || {};
141
+ const unlocked = (st.tiers || []).filter((t) => !["locked", "claimed"].includes(t.status));
142
+ log(` [${short(r.uid)}] 已领 ${r.claimed} 项 · 未领 ${r.pending.length} 项 合计 ${r.pendingCredit} 分`);
143
+ log(` 连登 ${st.days} 天${st.cards ? ` · 补签卡 ${st.cards}` : ""} · 可兑档位 ${unlocked.map((t) => t.tier).join(",") || "无"} · 抽奖次数 ${r.chances}`);
144
+ for (const t of r.pending) {
145
+ log(` · ${t.code.padEnd(28)} +${String(t.credit).padEnd(4)} c ${t.status} ${t.progress}`);
146
+ }
147
+ if (r.tasksError) log(` ⚠ 任务列表拉取失败:${r.tasksError}`);
148
+ }
149
+ log("");
150
+ log(` 未领合计 ${totalPending} 分(不含连登档位与抽奖)`);
151
+ log(" 补领: mslxdff -provider workbuddy checkin");
152
+ exit(failed === rows.length ? 1 : 0);
153
+ return true;
154
+ }