magicrew-auth 0.3.8 → 0.3.14
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 +312 -0
- package/docs/incident-2026-10-28-/347/254/254/344/272/214/344/270/252/350/264/246/345/217/267/344/270/262/345/217/267.md +68 -0
- package/docs/internals.md +45 -1
- package/index.mjs +3 -22
- package/package.json +1 -5
- package/src/api.mjs +82 -0
- package/src/chat-task.mjs +335 -0
- package/src/context.mjs +78 -60
- package/src/hooks/methods.mjs +16 -0
- package/src/hooks/models.mjs +45 -2
- package/src/inspect.mjs +191 -0
- package/src/store.mjs +103 -0
- package/src/tasks.mjs +194 -5
- package/src/self-register.mjs +0 -234
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,317 @@
|
|
|
1
1
|
# 更新记录
|
|
2
2
|
|
|
3
|
+
## 0.3.14
|
|
4
|
+
|
|
5
|
+
**两处判据修正:国际站看「话题」而不是「项目」;「免费」不再从倍率反推**
|
|
6
|
+
|
|
7
|
+
来自 PR #4(`fix/free-rate-and-topic-guard`,白九)。两点判断都对,都收;
|
|
8
|
+
落地时各改了一处。
|
|
9
|
+
|
|
10
|
+
### 一、国际站首对话:判据从「有没有项目」换成「有没有话题」
|
|
11
|
+
|
|
12
|
+
上一版把「已有工作台项目」当成「发过消息」。**这个前提不成立** —— 项目在打开
|
|
13
|
+
工作台时就会自动建,「建了项目、一句话没说」的新号很常见,而那种号正是要补的。
|
|
14
|
+
被误判成「用过」之后还会落一次性标记,等于永久跳过。
|
|
15
|
+
|
|
16
|
+
改成:拿项目 → 列它的话题 → 有话题才跳过,没话题就补一条。
|
|
17
|
+
|
|
18
|
+
```
|
|
19
|
+
GET /api/v1/super-agent/projects/{id}/topics
|
|
20
|
+
→ { code:1000, data:{ total, list:[{ id, chat_topic_id, chat_conversation_id, topic_name, task_status, … }] } }
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
### 二、`free` 改成三分支(按 `HOOKS.md` 十一之二)
|
|
24
|
+
|
|
25
|
+
`free` 的判据是「花不花这份订阅的额度」,**不能从 `rate` 反推**。原来的二元
|
|
26
|
+
判断把「价格为 0」和「价格未知」混在一起,两种情况都变成 `rate: 0`:
|
|
27
|
+
|
|
28
|
+
| `input_points` | 处理 |
|
|
29
|
+
|---|---|
|
|
30
|
+
| > 0 | `rate = n / 2000`,不设 `free` |
|
|
31
|
+
| === 0 | `free: true`,不给 `rate`(厂商声明免费 → 进 Free first 那一档) |
|
|
32
|
+
| 缺失 | **不列** —— 不猜价格,也不谎标免费 |
|
|
33
|
+
|
|
34
|
+
产出走 `modelEntry` 已有的 `free` / `rate` 出口(`src/context.mjs` 里
|
|
35
|
+
`free` 为真时不输出 `rate`,两者不会同时出现)。
|
|
36
|
+
|
|
37
|
+
### 与原 PR 的两处不同
|
|
38
|
+
|
|
39
|
+
1. **查不到 ≠ 没说过话。** 原版 `fetchProjectTopics(...).catch(() => [])`,
|
|
40
|
+
接口抖一下就当成「没有话题」,于是白花一次积分去补消息。改成:查不到就
|
|
41
|
+
**这次不发**、不落标记、不计失败次数,留到下次登录 / 签到再查。
|
|
42
|
+
失败方向要选「宁可漏一轮」那一侧 —— 消息发出去是花钱且不可撤的。
|
|
43
|
+
2. **`Number("") === 0` 会误判免费。** 原版用 `p.inputPoints != null` 判「已知」,
|
|
44
|
+
空串也会通过并被算成 0 点。现在要求非空且是有限数字,才算已知价格。
|
|
45
|
+
|
|
46
|
+
### 实测(2026-10-28,两站真接口)
|
|
47
|
+
|
|
48
|
+
```
|
|
49
|
+
magicrew org=66p0q56qo47j workspace 801580653401091055 projects 1 topics 2 ✓
|
|
50
|
+
magicrew-intl org=67u4oe6fbenj workspace 801566935627653258 projects 1 topics 1 ✓
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
两站同一个 workspace 下 `GET /projects/{id}/topics` 都是 `code:1000`、
|
|
54
|
+
`data.list[]` 字段名逐字一致(`chat_topic_id` / `chat_conversation_id` /
|
|
55
|
+
`topic_name` / `task_status`),与国内站的 chat-task 链路同构。
|
|
56
|
+
|
|
57
|
+
⚠ 当前两个账号的模型表里 **76 条模型的 `input_points` 全部 > 0,没有一条 0**
|
|
58
|
+
(国内 27 + 国际 49,实测快照)—— 所以三分支这批改动眼下不改变任何列表内容,
|
|
59
|
+
它防的是「以后出现真免费的模型」。这一条未能在本机实测覆盖。
|
|
60
|
+
|
|
61
|
+
## 0.3.13
|
|
62
|
+
|
|
63
|
+
**首任务补完:登录那一刻做一次,之后永不再发(补齐 0.3.12 的另一半)**
|
|
64
|
+
|
|
65
|
+
0.3.12 已经把闸门从「按日期」换成「按账号一次」(`src/store.mjs` 的
|
|
66
|
+
`isAutoChatSettled` / `noteAutoChatFailure`),国内站的 `autoFirstWork` 也接上了。
|
|
67
|
+
这一版补齐剩下的:
|
|
68
|
+
|
|
69
|
+
- 国际站的 `autoFirstChat` 同样走一次性闸门;「已有工作台项目」直接落成 `sent`,
|
|
70
|
+
以后连查都不查
|
|
71
|
+
- **登录成功那一刻**就做 —— `src/hooks/methods.mjs` 三条登录路径
|
|
72
|
+
(本机浏览器接上 / 浏览器登录 / 手填登录态)都会 `kickoffFirstTask(c, jwt, org)`,
|
|
73
|
+
发射后不管、不阻塞登录;签到退回兜底位,只防「登录那次进程被杀 / 网络抖」
|
|
74
|
+
- `docs/internals.md` 的 checkin 小节按现状重写:标记文件结构、五种状态各写不写、
|
|
75
|
+
老日期格式怎么读
|
|
76
|
+
|
|
77
|
+
回顾 0.3.11 的问题:闸门按**日期**记(`{ [org]: "YYYY-MM-DD" }`),服务端没把
|
|
78
|
+
`first_ai_work` 翻成 COMPLETED 时,第二天签到又看到 PENDING,就再发一条 ——
|
|
79
|
+
一个号天天烧一次模型积分。可这只是「让邀请奖励到账」的一次性条件,做一次就够。
|
|
80
|
+
|
|
81
|
+
### 实测(2026-10-28,改完当场跑到的)
|
|
82
|
+
|
|
83
|
+
```
|
|
84
|
+
magicrew (h97gk…) first_ai_work PENDING/PENDING → COMPLETED/GRANTED
|
|
85
|
+
magicrew#g8rptf (66p0q…) first_ai_work PENDING/PENDING → COMPLETED/GRANTED
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
两个号各发一条(都是 `Qwen3.5 Flash`,topicId `973747526032797697` /
|
|
89
|
+
`973747424593612801`),结算后任务真的翻成 COMPLETED/GRANTED —— 邀请奖励那条判据拿到。
|
|
90
|
+
|
|
91
|
+
再调一次 `ensureFirstTaskOnce` 直接返回 `{ settled: true }`:不打网络、不发消息,
|
|
92
|
+
一次性闸门生效。
|
|
93
|
+
|
|
94
|
+
## 0.3.12
|
|
95
|
+
|
|
96
|
+
**插件不再写 magpie 自己的缓存**
|
|
97
|
+
|
|
98
|
+
`src/self-register.mjs` 每次加载都往 `~/.cache/magpie/plugin-market.json` merge 一条
|
|
99
|
+
自己的条目。那份文件属于 magpie;按包名 merge 意味着一旦包进了官方 registry,
|
|
100
|
+
每次启动都会把 registry 条目盖回包里写死的那份 —— 插件不该改写 magpie 给它自己看的列表。
|
|
101
|
+
|
|
102
|
+
- 删掉 `src/self-register.mjs` 与 `index.mjs` 里的调用
|
|
103
|
+
- 顺带修掉一个一直没生效的 bug:条目里 `package` 写的是 `Magicrew`,而 npm 包名是
|
|
104
|
+
`magicrew-auth`,两者对不上,这条自注册从来没能对上卡片
|
|
105
|
+
- 卡片标题与文案的唯一载体是 registry 条目;其余行为一行未动
|
|
106
|
+
|
|
107
|
+
## 0.3.11
|
|
108
|
+
|
|
109
|
+
**签到接管「完成第一次 AI 工作」—— 不再单开一个按钮**
|
|
110
|
+
|
|
111
|
+
之前的做法是加一个「进行一次聊天」按钮,手动点。实际用起来多余:
|
|
112
|
+
签到本来就是每天跑一次,而首任务只需要做一次。
|
|
113
|
+
|
|
114
|
+
现在 checkin 里直接做掉,**两个站点都覆盖**:
|
|
115
|
+
|
|
116
|
+
| 站点 | 判据 | 动作 |
|
|
117
|
+
|---|---|---|
|
|
118
|
+
| 国内站 | `first_ai_work` 待完成 | 建话题 + 发一条消息,轮询等变 COMPLETED |
|
|
119
|
+
| 国际站 | 没有 onboarding 任务,改看「有没有工作台项目」 | 一个项目都没有(从没说过话)→ 建项目 + 发一条 |
|
|
120
|
+
|
|
121
|
+
一次签到的完整动作:
|
|
122
|
+
|
|
123
|
+
1. 领每日登录积分
|
|
124
|
+
2. 首任务 / 首对话没做过 → 替它发一条消息(纯协议,不开浏览器)
|
|
125
|
+
3. 其余新手福利 PUT 完成
|
|
126
|
+
4. 报积分变化
|
|
127
|
+
|
|
128
|
+
「进行一次聊天」按钮已撤掉,登录方式回到原来的两条。
|
|
129
|
+
|
|
130
|
+
### 实测(2026-10-28)
|
|
131
|
+
|
|
132
|
+
国际站新号 `bdfbfvre6ml3`(被 `IV3E15GQDCDR` 邀请)发一条消息后:
|
|
133
|
+
|
|
134
|
+
```
|
|
135
|
+
邀请人 dhj:积分 150 → 350
|
|
136
|
+
奖励明细:{ reward_points: 200, description: "注册奖励", status: "COMPLETED" }
|
|
137
|
+
invited_user_id: usi_817a358e06be15b7… ← 正是那个新号
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
国内站同样的链路此前已验过(+1000)。**「被邀请人完成首个任务或对话」这条判据,
|
|
141
|
+
两个站点都靠一条真实消息满足。**
|
|
142
|
+
|
|
143
|
+
### 新号没有项目怎么办
|
|
144
|
+
|
|
145
|
+
新注册的账号只有工作区、没有项目,直接发消息会失败。实测
|
|
146
|
+
`POST /api/v1/super-agent/projects { workspace_id, project_name }` 可以建,
|
|
147
|
+
名字从固定池里随机挑(和话题名同一个池),已集成进 `runChatTask`。
|
|
148
|
+
|
|
149
|
+
## 0.3.10
|
|
150
|
+
|
|
151
|
+
**新增「进行一次聊天(未完成的账号)」—— 纯协议补完首次 AI 工作,不开浏览器**
|
|
152
|
+
|
|
153
|
+
邀请奖励不是注册即得,条件是「被邀请人完成首个任务或对话」。而这道判定只认
|
|
154
|
+
**产品内真的跑完过一次** —— 通过 magpie 调模型不算(实测同一个号调了好几轮、
|
|
155
|
+
真扣了积分,`first_ai_work` 仍是 PENDING)。
|
|
156
|
+
|
|
157
|
+
所以要补的就是「在产品里发一条消息」。原来只能靠 CDP 开浏览器点输入框,
|
|
158
|
+
现在不用了。
|
|
159
|
+
|
|
160
|
+
### 协议(2026-10-27 抓包摸清,已实测跑通)
|
|
161
|
+
|
|
162
|
+
消息走 **Socket.IO**(Engine.IO v3):
|
|
163
|
+
|
|
164
|
+
```
|
|
165
|
+
连接 wss://<host>/socket.io/?EIO=3&transport=websocket
|
|
166
|
+
登录 42/im,<ns>["login",{context:{authorization:JWT, organization_code, language:"zh_CN"}}]
|
|
167
|
+
聊天 42/im,<ns>["chat",{context:{…},data:{message:{…},conversation_id}}]
|
|
168
|
+
→ 43/im,<ns>[{code:1000,…seq}]
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
几个反直觉的点,都在 `src/chat-task.mjs` 顶部注释里:
|
|
172
|
+
|
|
173
|
+
- **鉴权在消息体里**,握手头不带 token —— 所以不用 Cookie、不用登录态
|
|
174
|
+
- **不需要先发 `40` CONNECT**,直接 `42` 事件就能被受理
|
|
175
|
+
- `<ns>` 是客户端自己生成的唯一数字(浏览器用 `Date.now()`),随便给都行
|
|
176
|
+
- 消息里的 `conversation_id` 必须非空,空着回 `3007`;填错回 `3016 话题未找到`
|
|
177
|
+
|
|
178
|
+
三个 id 的来源(最容易卡住的地方):
|
|
179
|
+
|
|
180
|
+
```
|
|
181
|
+
conversation_id ← topic.chat_conversation_id
|
|
182
|
+
message.topic_id ← topic.chat_topic_id
|
|
183
|
+
(⚠ 不是 project.current_topic_id,用它会 3016)
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
话题直接建:`POST /api/v1/super-agent/topics { topic_name, project_id }`,
|
|
187
|
+
返回体里就带 `chat_topic_id` / `chat_conversation_id`。
|
|
188
|
+
|
|
189
|
+
### 按钮行为
|
|
190
|
+
|
|
191
|
+
点一下,遍历该站点所有账号:
|
|
192
|
+
|
|
193
|
+
- 首任务已完成 → 跳过
|
|
194
|
+
- 本站没有新手福利(国际站)→ 跳过
|
|
195
|
+
- 未完成 → 建话题、发一条、等 AI 回复
|
|
196
|
+
|
|
197
|
+
两个细节:
|
|
198
|
+
|
|
199
|
+
- **话题名从固定池随机挑**(`TOPIC_NAMES`,8 个日常短语),免得一堆「测试话题」扎堆
|
|
200
|
+
- **模型按积分倍率自动选最便宜的**:查 `/api/v1/products/model-points`,按
|
|
201
|
+
`input_points + output_points` 升序取最小 —— 目前是 `qwen3.5-flash`(20 / 200),
|
|
202
|
+
也正是网页的默认模型。没有免费档
|
|
203
|
+
|
|
204
|
+
### 模型列表显示计费倍率
|
|
205
|
+
|
|
206
|
+
网站(模型选择器)名字后面带一个「0.01×」这样的倍率,插件这边原来只有名字。
|
|
207
|
+
|
|
208
|
+
倍率本身来自运营后台的「模型参考倍率」,前端 locale 原文是
|
|
209
|
+
`division: 模型平均金额 ÷ 当前基准金额`。那套配置走 admin 接口,
|
|
210
|
+
普通账号的 token 调不到(`/api/v1/flows/model-multipliers` 回 31001)。
|
|
211
|
+
magpie 的模型条目里也没有倍率字段,所以直接把倍率拼进 `name`。
|
|
212
|
+
|
|
213
|
+
数值用 `input_points / 2000` 估:
|
|
214
|
+
|
|
215
|
+
| 模型 | in | 网站 | 本插件 |
|
|
216
|
+
|---|---|---|---|
|
|
217
|
+
| Qwen3.5 Flash | 20 | 0.01× | **0.01×** |
|
|
218
|
+
| Qwen3.8 Flash | 100 | 0.05× | **0.05×** |
|
|
219
|
+
| Qwen3.7 Plus | 200 | 0.10× | **0.10×** |
|
|
220
|
+
| MiMo V2.6 Flash | 100 | 0.04× | 0.05× |
|
|
221
|
+
| Seed 2.0 Pro | 480 | 0.26× | 0.24× |
|
|
222
|
+
| Qwen3.8 Max | 1200 | 0.56× | 0.60× |
|
|
223
|
+
|
|
224
|
+
低位完全吻合;高位因为真实公式里 output 也参与,有 10% 左右偏差,横向比价够用。
|
|
225
|
+
统一两位小数(否则 0.15 会被截成 0.1,和 0.10 混同)。
|
|
226
|
+
计费接口失败时退回原名,不影响模型列表。
|
|
227
|
+
|
|
228
|
+
### 0.3.9 的「体检」按钮撤掉了
|
|
229
|
+
|
|
230
|
+
功能还在(`src/inspect.mjs` 的 `listAccounts` / `inspectOne` 被新按钮复用),
|
|
231
|
+
但不再单独占一个登录方式的位置 —— 需求是「原本两个按钮不动,只加一个」。
|
|
232
|
+
|
|
233
|
+
### 实测
|
|
234
|
+
|
|
235
|
+
```
|
|
236
|
+
[0s] 挑选模型… [0s] 定位项目… [0s] 建一个话题… [1s] 发送消息…
|
|
237
|
+
结果: { ok: true, replies: 1, topicName: "介绍一下你自己",
|
|
238
|
+
model: "Qwen3.5 Flash", messageId: "973731075754430466" }
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
从建话题到 AI 回复完,全程 1 秒多。
|
|
242
|
+
|
|
243
|
+
## 0.3.9
|
|
244
|
+
|
|
245
|
+
这一版两件事:新增「体检」,以及删掉一个从来没被读过的字段。
|
|
246
|
+
|
|
247
|
+
### 新增「体检」:一键看清每个号的首任务做没做、邀请奖励到没到账
|
|
248
|
+
|
|
249
|
+
拉新有个坑:**邀请奖励不是注册即得**。官方前端 locale 的原文是
|
|
250
|
+
「被邀请人完成首个任务或对话后,即可获得 {{points}} 积分奖励」。
|
|
251
|
+
于是每次都要手工去网页翻「免费积分计划」那张表确认,号一多就分不清
|
|
252
|
+
哪个小号还没跑、哪笔钱卡在什么状态。
|
|
253
|
+
|
|
254
|
+
在 magpie 的登录方式列表里加两条**只读**检查:
|
|
255
|
+
|
|
256
|
+
- `超级麦吉: 体检(首任务 / 邀请奖励)`
|
|
257
|
+
- `MagiCrew: 体检(首任务 / 邀请奖励)`
|
|
258
|
+
|
|
259
|
+
点一下,列出该站点所有账号的:积分、首任务状态、邀请码 / 已邀人数 /
|
|
260
|
+
已到账积分、奖励明细(含量、状态、对应被邀请人)。
|
|
261
|
+
|
|
262
|
+
实现:
|
|
263
|
+
|
|
264
|
+
- 新增 `src/inspect.mjs`
|
|
265
|
+
- `listAccounts()` 枚举宿主 `~/.config/magpie/plugin-auth.json` 里的 magicrew 账号
|
|
266
|
+
(跟 zcode 插件同一套办法,只读本地文件)
|
|
267
|
+
- `inspectOne()` 对单个账号并发查 5 个接口,任一失败只记录不中断
|
|
268
|
+
- `buildReport()` 拼成可直接展示的纯文本
|
|
269
|
+
- `src/api.mjs` 新增 `fetchInviteRewards()` —— `GET /api/v1/invitations/rewards`
|
|
270
|
+
- `src/hooks/methods.mjs` 各挂一条 method:不输入、不改任何状态;
|
|
271
|
+
用 `throw` 把报告当错误信息弹出来,不在账号列表里留下一条假登录
|
|
272
|
+
|
|
273
|
+
⚠ 顺带核实的两件事(实测,已写进代码注释):
|
|
274
|
+
|
|
275
|
+
1. **通过 magpie 调模型不算「完成首任务」**。同一个号用 magpie 调了好几轮、
|
|
276
|
+
真扣了积分,`first_ai_work` 仍然是 PENDING,邀请奖励一分不发。
|
|
277
|
+
必须在网页 / 官方客户端里跑完一次对话或任务。
|
|
278
|
+
2. **8 项任务里只有 `first_ai_work` 要真发消息**。`ai_ppt` 那项虽然也有
|
|
279
|
+
「写好内容,点击发送」的引导,但原文写着「这里仅用于了解发送入口和操作方式,
|
|
280
|
+
不会实际生成内容」—— 是纯点击导览,`PUT` 就能完成。
|
|
281
|
+
|
|
282
|
+
一个小坑记一下:宿主里的键名有 `magicrew-intl` / `magicrew-intl#z983c8` 这种,
|
|
283
|
+
过滤正则写成 `/^magicrew(#|$)/` 会把国际站全部漏掉(体检显示「还没有登录任何账号」)。
|
|
284
|
+
正确写法 `/^magicrew(-intl)?(#|$)/`。
|
|
285
|
+
|
|
286
|
+
### 「承载」徽章由 magpie 自己派生:删掉从没被读过的 `magpie.carries`
|
|
287
|
+
|
|
288
|
+
0.3.5 为了卡片上那个「承载 X、Y」的徽章,在 `package.json` 里加了 `magpie.carries`。
|
|
289
|
+
那是我方提的方案([#3902](https://github.com/yetone/magpie/issues/3902) 里的 option 1),
|
|
290
|
+
magpie 侧**从未发布过读它的版本** —— 上游选了另一条路:
|
|
291
|
+
|
|
292
|
+
- `766356c`,v0.1.1744 起,`/api/plugins` 每个插件多一个 `serves` 字段:插件**注册的
|
|
293
|
+
provider 名**,每个一次,内置订阅迁到插件上的那些不重复列(页面按内置名字画)。
|
|
294
|
+
- 徽章出现条件:有内置订阅迁到这个插件 **或** 注册了两个及以上 provider。单 provider 不出现
|
|
295
|
+
—— 行的标题本来就说了它是谁。
|
|
296
|
+
- 「… 正由此插件代替内置运行」那句 tooltip 只留在「名字里有内置订阅」的徽章上。
|
|
297
|
+
- 名字就是 `cfg.provider[id].name`,所以想让它读起来清楚,改的是**供应商名**,不是 package.json。
|
|
298
|
+
|
|
299
|
+
实测(v0.1.1744,windows/amd64,独立 data 目录,本包 0.3.8 以文件夹方式安装):
|
|
300
|
+
|
|
301
|
+
```
|
|
302
|
+
$ curl /api/plugins
|
|
303
|
+
{"spec":"...\\magpie-magicrew-auth","providers":["超级麦吉","MagiCrew"],
|
|
304
|
+
"moved":[],"serves":["超级麦吉","MagiCrew"]}
|
|
305
|
+
|
|
306
|
+
卡片:承载 超级麦吉、MagiCrew (一个 pm-chip moved)
|
|
307
|
+
title: null (没有内置订阅 → 没有「代替内置」那句)
|
|
308
|
+
```
|
|
309
|
+
|
|
310
|
+
修法:删掉 `magpie.carries`。宿主不读它,留着只会让下一个人以为它有用。
|
|
311
|
+
|
|
312
|
+
判据:装 magpie ≥ 0.1.1744,本包注册 2 个 provider ⇒ 卡片上必然有「承载 超级麦吉、MagiCrew」,
|
|
313
|
+
package.json 里不需要任何字段。
|
|
314
|
+
|
|
3
315
|
## 0.3.8
|
|
4
316
|
|
|
5
317
|
**签到补上「每日登录积分」—— 国际站一直领不到,根因是它压根不在 onboarding 任务里**
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
# 事故记录 2026-10-28 · 添加第二个账号却刷新了第一个的凭证
|
|
2
|
+
|
|
3
|
+
> 状态:**已修复并验证**(插件 0.3.12 / magpie 已重启)
|
|
4
|
+
> 待办:本文件内容等 Hindsight 后端(192.168.1.6:8888)恢复后灌入记忆库
|
|
5
|
+
|
|
6
|
+
## 症状
|
|
7
|
+
|
|
8
|
+
在 magpie 里点「添加新账号」:
|
|
9
|
+
|
|
10
|
+
- 第一次:正常,成功加进账号 A
|
|
11
|
+
- 第二次:**不开窗口,一秒内就成功**,但 magpie 里没多出账号,A 的凭证被刷新了
|
|
12
|
+
|
|
13
|
+
## 根因
|
|
14
|
+
|
|
15
|
+
不是仓库代码的问题 —— **magpie 里装的插件版本太老(0.3.5)**。
|
|
16
|
+
|
|
17
|
+
| 事实 | 证据 |
|
|
18
|
+
|---|---|
|
|
19
|
+
| magpie 加载的是 Magicrew 0.3.5 | `~/.config/magpie/plugins/node_modules/Magicrew/package.json` version=0.3.5;`bun.lock` 锁 `#825416b` |
|
|
20
|
+
| 0.3.5 用**固定复用 profile** | 0.3.5 `src/browser-login.mjs:25` → `join(homedir(), ".cache", "magpie", "magicrew-login-profile")`,注释原文「profile 目录**不删**,下次还能复用登录态」 |
|
|
21
|
+
| 该目录里躺着上一个账号的凭据 | 读 `.../magicrew-login-profile/Default/Local Storage/leveldb` → origin `www.letsmagic.cn`,org=`66p0q56qo47j` |
|
|
22
|
+
| 第二次打开时立刻被判「已登录」 | 同一 profile → `waitForCreds` 第一轮(1.5 s)就读到残留 → 判定成功 → 关窗 |
|
|
23
|
+
| magpie 侧按同身份处理 → 替换而非新增 | `providers-state.json` 的 `accountNames` 只有 `h97gkbu8bruj` 一条 |
|
|
24
|
+
|
|
25
|
+
链路:**复用 profile 残留凭据 → 立刻判成功 → 提交同 uid → magpie 替换旧账号 → 用户看到「直接刷新凭证」**。
|
|
26
|
+
|
|
27
|
+
## 代码里早在 0.3.6 就修了(提交 6ca3255)
|
|
28
|
+
|
|
29
|
+
- `newProfileDir()`:每次登录一个新目录,结束即删
|
|
30
|
+
- `sweepProfiles()`:清残留,且**必删**历史复用目录 `magicrew-login-profile`
|
|
31
|
+
- `waitForCreds(…, { baseline })`:窗口打开时就存在的凭据不算登录成功
|
|
32
|
+
- `~/.cache/magpie/magicrew-orgs-<site>.json`:加过的 org 名单,挡住「本机浏览器里那把属于已加过账号」时仍自动接上
|
|
33
|
+
|
|
34
|
+
## 这次做了什么
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
# 1. 备份 magpie 插件清单(可回滚)
|
|
38
|
+
cd ~/.config/magpie/plugins
|
|
39
|
+
cp package.json package.json.bak-before-magicrew-012-20261028-003807
|
|
40
|
+
cp bun.lock bun.lock.bak-before-magicrew-012-20261028-003807
|
|
41
|
+
|
|
42
|
+
# 2. 升级(关键:plugin add 不重解析 commit,必须 update)
|
|
43
|
+
cd /e/Downloads && ./magpie-windows-amd64.exe plugin update # → Magicrew 0.3.12
|
|
44
|
+
|
|
45
|
+
# 3. 旧的复用 profile 移出 sweep 范围
|
|
46
|
+
mv ~/.cache/magpie/magicrew-login-profile ~/.cache/magicrew-profile-backup-20261028-004617
|
|
47
|
+
|
|
48
|
+
# 4. 预灌已知 org 名单(本机真实 Edge 里也有 h97gkbu8bruj 的登录态,不挡会被自动接上)
|
|
49
|
+
# magicrew: h97gkbu8bruj, 7fli52t2tc2b, 66p0q56qo47j, orgcode67890
|
|
50
|
+
# magicrew-intl: 67u4oe6fbenj, orgcode67890
|
|
51
|
+
|
|
52
|
+
# 5. 重启 magpie 加载新代码
|
|
53
|
+
powershell -NoProfile -Command "Stop-Process -Id <pid> -Force; Start-Process 'E:\Downloads\magpie-windows-amd64.exe' -ArgumentList 'gui','plugins'"
|
|
54
|
+
curl.exe -s -o /dev/null -w "%{http_code}\n" --max-time 10 http://127.0.0.1:3425/v1/models # 200
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
## 验证结果
|
|
58
|
+
|
|
59
|
+
- `magpie plugin list` → `(Magicrew 0.3.12)`,账号仍在:`h97gkbu8bruj`(超级麦吉)、`1451895195@qq.com`(MagiCrew)
|
|
60
|
+
- `bun.lock` → `Magicrew@github:MYCF711/magpie-magicrew-auth#970a3ea`
|
|
61
|
+
- `readLocalCreds("www.letsmagic.cn").org = h97gkbu8bruj`,在 `readKnownOrgs("magicrew")` 里 → **点添加不会再自动接上旧账号**
|
|
62
|
+
- 模型列表已重新拉取:国内 27 / 国际 49
|
|
63
|
+
|
|
64
|
+
## 三条可复用判据
|
|
65
|
+
|
|
66
|
+
1. **`magpie plugin add <git-url>` 不会升级已装插件** —— bun.lock 锁着 `#<sha>`,add 只是确认依赖存在;升级必须 `magpie plugin update`。
|
|
67
|
+
2. **`~/.cache/magpie/plugin-host/*.js` 没生成新文件 = 插件代码没重载** —— 改完必须重启 magpie 进程。
|
|
68
|
+
3. **一次性 profile 的代价要讲清楚**:独立 user-data-dir 没有日常浏览器的 cookie,所以每次「添加账号」都要在弹窗里重登一次;只有「本机浏览器里登好的、且不在 orgs 名单里的」才会自动接上。
|
package/docs/internals.md
CHANGED
|
@@ -693,9 +693,53 @@ mgw_8f9a…(18:14 又一次续期换的) → 网关请求 HTTP 200 正
|
|
|
693
693
|
└─ src/hooks/refresh.mjs 直接调 api.refreshGatewayKey(auth.refresh)
|
|
694
694
|
⚠ 不经过 keys.mjs,也不读 key-store
|
|
695
695
|
|
|
696
|
-
每天一次 checkin → runCheckin() ←
|
|
696
|
+
每天一次 checkin → runCheckin() ← 领积分 / 补首任务 / 新手福利,**不碰 key**
|
|
697
697
|
```
|
|
698
698
|
|
|
699
|
+
### checkin 现在做四件事(0.3.11 起)
|
|
700
|
+
|
|
701
|
+
```
|
|
702
|
+
① POST /api/v1/login-gift 领每日登录积分(国内 +200、国际 +50;当天已领回 granted:false,幂等)
|
|
703
|
+
② 首任务 / 首对话没做过 → 走 Socket.IO 发一条消息(纯 Node,不开浏览器)
|
|
704
|
+
国内站:onboarding 的 first_ai_work 还是 PENDING → 建话题 + 发一条,轮询等 COMPLETED
|
|
705
|
+
国际站:onboarding 恒返回空任务 → 改看「有没有话题」,一个话题都没有才发
|
|
706
|
+
③ 其余新手福利 → PUT /api/v1/onboarding/tasks/<code>/completion
|
|
707
|
+
④ 报积分变化
|
|
708
|
+
```
|
|
709
|
+
|
|
710
|
+
② 是唯一有外部副作用的动作:会建项目 / 话题、真花一次模型积分(挑最便宜的模型)。
|
|
711
|
+
|
|
712
|
+
**它是每个账号一辈子只做一次的事,不是每天的事**(0.3.12 改正)。真正的触发点是
|
|
713
|
+
**登录成功那一刻**(`src/hooks/methods.mjs` 三条登录路径都会 `kickoffFirstTask`,
|
|
714
|
+
发射后不管、不阻塞登录);签到只是兜底 —— 万一登录那次没跑成(进程被杀、网络抖),
|
|
715
|
+
下一次签到接着做。
|
|
716
|
+
|
|
717
|
+
闸门落在 `~/.cache/magpie/magicrew-autochat-<siteId>.json`
|
|
718
|
+
(`siteId` 取 `magicrew` / `magicrew-intl`),内容是:
|
|
719
|
+
|
|
720
|
+
```json
|
|
721
|
+
{ "<org>": { "at": "ISO", "status": "sent|failed|gave-up", "attempts": 1,
|
|
722
|
+
"topicId": "…", "model": "Qwen3.5 Flash", "reason": "…" } }
|
|
723
|
+
```
|
|
724
|
+
|
|
725
|
+
规则:
|
|
726
|
+
|
|
727
|
+
| 情况 | 写什么 | 之后还发不发 |
|
|
728
|
+
|---|---|---|
|
|
729
|
+
| 消息发出去了 | `status: "sent"` | **永远不发**(换天、重登、重启都一样) |
|
|
730
|
+
| 真去发了但失败 | `status: "failed"`,`attempts++` | 发,最多 3 次 |
|
|
731
|
+
| 连失败 3 次 | `status: "gave-up"` | 不发(别让永远失败的号每次撞一遍) |
|
|
732
|
+
| 还没有工作台 / 项目 | 不写 | 发,下次再来(只读接口,成本低) |
|
|
733
|
+
| 有项目、但话题一个都没有 | 不写 | **发**(项目是打开工作台时自动建的,不代表说过话) |
|
|
734
|
+
| 话题清单查不到(接口失败) | 不写 | **这次不发**,下次再来(不把「查不到」当「没说过话」白花积分) |
|
|
735
|
+
| 服务端本来就是 COMPLETED | `status: "sent"` + `reason` | 不发 |
|
|
736
|
+
|
|
737
|
+
老版本(0.3.11)记的是 `{ [org]: "YYYY-MM-DD" }` 字符串日期 —— 读的时候按「已发过」
|
|
738
|
+
归一化,所以升级上来不会补发一遍。
|
|
739
|
+
|
|
740
|
+
怎么发的(协议帧、三个 id 从哪来、为什么不用浏览器)见 `src/chat-task.mjs` 顶部注释。
|
|
741
|
+
key 依然一个都不碰。
|
|
742
|
+
|
|
699
743
|
### ⚠ 更正(2026-10-27):checkin 并不续 key
|
|
700
744
|
|
|
701
745
|
早前这里写着「每天一次 `checkin` 里 `ensureKey(c, getAuth, { leadMs: 24h })`,
|
package/index.mjs
CHANGED
|
@@ -29,7 +29,6 @@
|
|
|
29
29
|
// magpie 把包里每个具名导出当成一个独立插件,所以它们在供应商列表、用量概览、
|
|
30
30
|
// 模型目录里各占一行,不聚合、不互相覆盖登录态。
|
|
31
31
|
|
|
32
|
-
import { startSelfRegister } from "./src/self-register.mjs"
|
|
33
32
|
import { SITES, siteCtx, REFRESH_LEAD_MS } from "./src/context.mjs"
|
|
34
33
|
import { makeConfig } from "./src/hooks/config.mjs"
|
|
35
34
|
import { makeMethods } from "./src/hooks/methods.mjs"
|
|
@@ -40,29 +39,11 @@ import { makeCheckin } from "./src/hooks/checkin.mjs"
|
|
|
40
39
|
import { makeModels } from "./src/hooks/models.mjs"
|
|
41
40
|
import { makeHeaders } from "./src/hooks/headers.mjs"
|
|
42
41
|
|
|
43
|
-
const COMMUNITY_ENTRY = {
|
|
44
|
-
package: "Magicrew",
|
|
45
|
-
name: "超级麦吉 / MagiCrew",
|
|
46
|
-
providers: ["magicrew", "magicrew-intl"],
|
|
47
|
-
community: true,
|
|
48
|
-
summary: {
|
|
49
|
-
en: "Magicrew (super-magic) — an OpenAI-compatible gateway behind the agent platform, both builds: 超级麦吉 (letsmagic.cn) and MagiCrew (magicrew.ai).",
|
|
50
|
-
zh: "超级麦吉 / MagiCrew:Agent 平台背后的 OpenAI 兼容网关,国内站与国际站双份。",
|
|
51
|
-
},
|
|
52
|
-
}
|
|
53
|
-
|
|
54
42
|
/** 一个站点进,一个完整插件出 */
|
|
55
43
|
function buildPlugin(c) {
|
|
56
|
-
return async (
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
log: (msg) => {
|
|
60
|
-
try {
|
|
61
|
-
client?.app?.log?.({ service: c.PROVIDER, level: "info", message: msg })
|
|
62
|
-
} catch {}
|
|
63
|
-
},
|
|
64
|
-
})
|
|
65
|
-
|
|
44
|
+
return async () => {
|
|
45
|
+
// 卡片标题与文案不在这里做 —— 那是 registry 条目的职责。
|
|
46
|
+
// 插件不写 magpie 自己的缓存目录:那份文件属于 magpie,插件只读不写。
|
|
66
47
|
return {
|
|
67
48
|
config: makeConfig(c),
|
|
68
49
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "magicrew-auth",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.14",
|
|
4
4
|
"description": "超级麦吉 / MagiCrew for magpie and OpenCode — one package, two providers: letsmagic.cn (国内) and magicrew.ai (international). Password or web-JWT sign-in, the account's own live model list, points balance, newcomer rewards, invite codes.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./index.mjs",
|
|
@@ -45,10 +45,6 @@
|
|
|
45
45
|
"magpie": {
|
|
46
46
|
"maxConcurrency": 4,
|
|
47
47
|
"autoCheckin": true,
|
|
48
|
-
"carries": [
|
|
49
|
-
"超级麦吉 (letsmagic.cn)",
|
|
50
|
-
"MagiCrew (magicrew.ai)"
|
|
51
|
-
],
|
|
52
48
|
"icon": "data:image/png;base64,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"
|
|
53
49
|
}
|
|
54
50
|
}
|