magicrew-auth 0.3.8 → 0.3.13
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 +254 -0
- package/README.md +208 -208
- 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 +43 -1
- package/index.mjs +3 -22
- package/package.json +1 -5
- package/src/api.mjs +57 -0
- package/src/browser-login.mjs +408 -408
- package/src/chat-task.mjs +335 -0
- package/src/clipboard.mjs +106 -106
- package/src/context.mjs +78 -60
- package/src/hooks/loader.mjs +93 -93
- package/src/hooks/methods.mjs +16 -0
- package/src/hooks/models.mjs +34 -2
- package/src/icons.mjs +24 -24
- package/src/inspect.mjs +191 -0
- package/src/model-context.mjs +100 -100
- package/src/store.mjs +103 -0
- package/src/tasks.mjs +182 -5
- package/src/self-register.mjs +0 -234
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,259 @@
|
|
|
1
1
|
# 更新记录
|
|
2
2
|
|
|
3
|
+
## 0.3.13
|
|
4
|
+
|
|
5
|
+
**首任务补完:登录那一刻做一次,之后永不再发(补齐 0.3.12 的另一半)**
|
|
6
|
+
|
|
7
|
+
0.3.12 已经把闸门从「按日期」换成「按账号一次」(`src/store.mjs` 的
|
|
8
|
+
`isAutoChatSettled` / `noteAutoChatFailure`),国内站的 `autoFirstWork` 也接上了。
|
|
9
|
+
这一版补齐剩下的:
|
|
10
|
+
|
|
11
|
+
- 国际站的 `autoFirstChat` 同样走一次性闸门;「已有工作台项目」直接落成 `sent`,
|
|
12
|
+
以后连查都不查
|
|
13
|
+
- **登录成功那一刻**就做 —— `src/hooks/methods.mjs` 三条登录路径
|
|
14
|
+
(本机浏览器接上 / 浏览器登录 / 手填登录态)都会 `kickoffFirstTask(c, jwt, org)`,
|
|
15
|
+
发射后不管、不阻塞登录;签到退回兜底位,只防「登录那次进程被杀 / 网络抖」
|
|
16
|
+
- `docs/internals.md` 的 checkin 小节按现状重写:标记文件结构、五种状态各写不写、
|
|
17
|
+
老日期格式怎么读
|
|
18
|
+
|
|
19
|
+
回顾 0.3.11 的问题:闸门按**日期**记(`{ [org]: "YYYY-MM-DD" }`),服务端没把
|
|
20
|
+
`first_ai_work` 翻成 COMPLETED 时,第二天签到又看到 PENDING,就再发一条 ——
|
|
21
|
+
一个号天天烧一次模型积分。可这只是「让邀请奖励到账」的一次性条件,做一次就够。
|
|
22
|
+
|
|
23
|
+
### 实测(2026-10-28,改完当场跑到的)
|
|
24
|
+
|
|
25
|
+
```
|
|
26
|
+
magicrew (h97gk…) first_ai_work PENDING/PENDING → COMPLETED/GRANTED
|
|
27
|
+
magicrew#g8rptf (66p0q…) first_ai_work PENDING/PENDING → COMPLETED/GRANTED
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
两个号各发一条(都是 `Qwen3.5 Flash`,topicId `973747526032797697` /
|
|
31
|
+
`973747424593612801`),结算后任务真的翻成 COMPLETED/GRANTED —— 邀请奖励那条判据拿到。
|
|
32
|
+
|
|
33
|
+
再调一次 `ensureFirstTaskOnce` 直接返回 `{ settled: true }`:不打网络、不发消息,
|
|
34
|
+
一次性闸门生效。
|
|
35
|
+
|
|
36
|
+
## 0.3.12
|
|
37
|
+
|
|
38
|
+
**插件不再写 magpie 自己的缓存**
|
|
39
|
+
|
|
40
|
+
`src/self-register.mjs` 每次加载都往 `~/.cache/magpie/plugin-market.json` merge 一条
|
|
41
|
+
自己的条目。那份文件属于 magpie;按包名 merge 意味着一旦包进了官方 registry,
|
|
42
|
+
每次启动都会把 registry 条目盖回包里写死的那份 —— 插件不该改写 magpie 给它自己看的列表。
|
|
43
|
+
|
|
44
|
+
- 删掉 `src/self-register.mjs` 与 `index.mjs` 里的调用
|
|
45
|
+
- 顺带修掉一个一直没生效的 bug:条目里 `package` 写的是 `Magicrew`,而 npm 包名是
|
|
46
|
+
`magicrew-auth`,两者对不上,这条自注册从来没能对上卡片
|
|
47
|
+
- 卡片标题与文案的唯一载体是 registry 条目;其余行为一行未动
|
|
48
|
+
|
|
49
|
+
## 0.3.11
|
|
50
|
+
|
|
51
|
+
**签到接管「完成第一次 AI 工作」—— 不再单开一个按钮**
|
|
52
|
+
|
|
53
|
+
之前的做法是加一个「进行一次聊天」按钮,手动点。实际用起来多余:
|
|
54
|
+
签到本来就是每天跑一次,而首任务只需要做一次。
|
|
55
|
+
|
|
56
|
+
现在 checkin 里直接做掉,**两个站点都覆盖**:
|
|
57
|
+
|
|
58
|
+
| 站点 | 判据 | 动作 |
|
|
59
|
+
|---|---|---|
|
|
60
|
+
| 国内站 | `first_ai_work` 待完成 | 建话题 + 发一条消息,轮询等变 COMPLETED |
|
|
61
|
+
| 国际站 | 没有 onboarding 任务,改看「有没有工作台项目」 | 一个项目都没有(从没说过话)→ 建项目 + 发一条 |
|
|
62
|
+
|
|
63
|
+
一次签到的完整动作:
|
|
64
|
+
|
|
65
|
+
1. 领每日登录积分
|
|
66
|
+
2. 首任务 / 首对话没做过 → 替它发一条消息(纯协议,不开浏览器)
|
|
67
|
+
3. 其余新手福利 PUT 完成
|
|
68
|
+
4. 报积分变化
|
|
69
|
+
|
|
70
|
+
「进行一次聊天」按钮已撤掉,登录方式回到原来的两条。
|
|
71
|
+
|
|
72
|
+
### 实测(2026-10-28)
|
|
73
|
+
|
|
74
|
+
国际站新号 `bdfbfvre6ml3`(被 `IV3E15GQDCDR` 邀请)发一条消息后:
|
|
75
|
+
|
|
76
|
+
```
|
|
77
|
+
邀请人 dhj:积分 150 → 350
|
|
78
|
+
奖励明细:{ reward_points: 200, description: "注册奖励", status: "COMPLETED" }
|
|
79
|
+
invited_user_id: usi_817a358e06be15b7… ← 正是那个新号
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
国内站同样的链路此前已验过(+1000)。**「被邀请人完成首个任务或对话」这条判据,
|
|
83
|
+
两个站点都靠一条真实消息满足。**
|
|
84
|
+
|
|
85
|
+
### 新号没有项目怎么办
|
|
86
|
+
|
|
87
|
+
新注册的账号只有工作区、没有项目,直接发消息会失败。实测
|
|
88
|
+
`POST /api/v1/super-agent/projects { workspace_id, project_name }` 可以建,
|
|
89
|
+
名字从固定池里随机挑(和话题名同一个池),已集成进 `runChatTask`。
|
|
90
|
+
|
|
91
|
+
## 0.3.10
|
|
92
|
+
|
|
93
|
+
**新增「进行一次聊天(未完成的账号)」—— 纯协议补完首次 AI 工作,不开浏览器**
|
|
94
|
+
|
|
95
|
+
邀请奖励不是注册即得,条件是「被邀请人完成首个任务或对话」。而这道判定只认
|
|
96
|
+
**产品内真的跑完过一次** —— 通过 magpie 调模型不算(实测同一个号调了好几轮、
|
|
97
|
+
真扣了积分,`first_ai_work` 仍是 PENDING)。
|
|
98
|
+
|
|
99
|
+
所以要补的就是「在产品里发一条消息」。原来只能靠 CDP 开浏览器点输入框,
|
|
100
|
+
现在不用了。
|
|
101
|
+
|
|
102
|
+
### 协议(2026-10-27 抓包摸清,已实测跑通)
|
|
103
|
+
|
|
104
|
+
消息走 **Socket.IO**(Engine.IO v3):
|
|
105
|
+
|
|
106
|
+
```
|
|
107
|
+
连接 wss://<host>/socket.io/?EIO=3&transport=websocket
|
|
108
|
+
登录 42/im,<ns>["login",{context:{authorization:JWT, organization_code, language:"zh_CN"}}]
|
|
109
|
+
聊天 42/im,<ns>["chat",{context:{…},data:{message:{…},conversation_id}}]
|
|
110
|
+
→ 43/im,<ns>[{code:1000,…seq}]
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
几个反直觉的点,都在 `src/chat-task.mjs` 顶部注释里:
|
|
114
|
+
|
|
115
|
+
- **鉴权在消息体里**,握手头不带 token —— 所以不用 Cookie、不用登录态
|
|
116
|
+
- **不需要先发 `40` CONNECT**,直接 `42` 事件就能被受理
|
|
117
|
+
- `<ns>` 是客户端自己生成的唯一数字(浏览器用 `Date.now()`),随便给都行
|
|
118
|
+
- 消息里的 `conversation_id` 必须非空,空着回 `3007`;填错回 `3016 话题未找到`
|
|
119
|
+
|
|
120
|
+
三个 id 的来源(最容易卡住的地方):
|
|
121
|
+
|
|
122
|
+
```
|
|
123
|
+
conversation_id ← topic.chat_conversation_id
|
|
124
|
+
message.topic_id ← topic.chat_topic_id
|
|
125
|
+
(⚠ 不是 project.current_topic_id,用它会 3016)
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
话题直接建:`POST /api/v1/super-agent/topics { topic_name, project_id }`,
|
|
129
|
+
返回体里就带 `chat_topic_id` / `chat_conversation_id`。
|
|
130
|
+
|
|
131
|
+
### 按钮行为
|
|
132
|
+
|
|
133
|
+
点一下,遍历该站点所有账号:
|
|
134
|
+
|
|
135
|
+
- 首任务已完成 → 跳过
|
|
136
|
+
- 本站没有新手福利(国际站)→ 跳过
|
|
137
|
+
- 未完成 → 建话题、发一条、等 AI 回复
|
|
138
|
+
|
|
139
|
+
两个细节:
|
|
140
|
+
|
|
141
|
+
- **话题名从固定池随机挑**(`TOPIC_NAMES`,8 个日常短语),免得一堆「测试话题」扎堆
|
|
142
|
+
- **模型按积分倍率自动选最便宜的**:查 `/api/v1/products/model-points`,按
|
|
143
|
+
`input_points + output_points` 升序取最小 —— 目前是 `qwen3.5-flash`(20 / 200),
|
|
144
|
+
也正是网页的默认模型。没有免费档
|
|
145
|
+
|
|
146
|
+
### 模型列表显示计费倍率
|
|
147
|
+
|
|
148
|
+
网站(模型选择器)名字后面带一个「0.01×」这样的倍率,插件这边原来只有名字。
|
|
149
|
+
|
|
150
|
+
倍率本身来自运营后台的「模型参考倍率」,前端 locale 原文是
|
|
151
|
+
`division: 模型平均金额 ÷ 当前基准金额`。那套配置走 admin 接口,
|
|
152
|
+
普通账号的 token 调不到(`/api/v1/flows/model-multipliers` 回 31001)。
|
|
153
|
+
magpie 的模型条目里也没有倍率字段,所以直接把倍率拼进 `name`。
|
|
154
|
+
|
|
155
|
+
数值用 `input_points / 2000` 估:
|
|
156
|
+
|
|
157
|
+
| 模型 | in | 网站 | 本插件 |
|
|
158
|
+
|---|---|---|---|
|
|
159
|
+
| Qwen3.5 Flash | 20 | 0.01× | **0.01×** |
|
|
160
|
+
| Qwen3.8 Flash | 100 | 0.05× | **0.05×** |
|
|
161
|
+
| Qwen3.7 Plus | 200 | 0.10× | **0.10×** |
|
|
162
|
+
| MiMo V2.6 Flash | 100 | 0.04× | 0.05× |
|
|
163
|
+
| Seed 2.0 Pro | 480 | 0.26× | 0.24× |
|
|
164
|
+
| Qwen3.8 Max | 1200 | 0.56× | 0.60× |
|
|
165
|
+
|
|
166
|
+
低位完全吻合;高位因为真实公式里 output 也参与,有 10% 左右偏差,横向比价够用。
|
|
167
|
+
统一两位小数(否则 0.15 会被截成 0.1,和 0.10 混同)。
|
|
168
|
+
计费接口失败时退回原名,不影响模型列表。
|
|
169
|
+
|
|
170
|
+
### 0.3.9 的「体检」按钮撤掉了
|
|
171
|
+
|
|
172
|
+
功能还在(`src/inspect.mjs` 的 `listAccounts` / `inspectOne` 被新按钮复用),
|
|
173
|
+
但不再单独占一个登录方式的位置 —— 需求是「原本两个按钮不动,只加一个」。
|
|
174
|
+
|
|
175
|
+
### 实测
|
|
176
|
+
|
|
177
|
+
```
|
|
178
|
+
[0s] 挑选模型… [0s] 定位项目… [0s] 建一个话题… [1s] 发送消息…
|
|
179
|
+
结果: { ok: true, replies: 1, topicName: "介绍一下你自己",
|
|
180
|
+
model: "Qwen3.5 Flash", messageId: "973731075754430466" }
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
从建话题到 AI 回复完,全程 1 秒多。
|
|
184
|
+
|
|
185
|
+
## 0.3.9
|
|
186
|
+
|
|
187
|
+
这一版两件事:新增「体检」,以及删掉一个从来没被读过的字段。
|
|
188
|
+
|
|
189
|
+
### 新增「体检」:一键看清每个号的首任务做没做、邀请奖励到没到账
|
|
190
|
+
|
|
191
|
+
拉新有个坑:**邀请奖励不是注册即得**。官方前端 locale 的原文是
|
|
192
|
+
「被邀请人完成首个任务或对话后,即可获得 {{points}} 积分奖励」。
|
|
193
|
+
于是每次都要手工去网页翻「免费积分计划」那张表确认,号一多就分不清
|
|
194
|
+
哪个小号还没跑、哪笔钱卡在什么状态。
|
|
195
|
+
|
|
196
|
+
在 magpie 的登录方式列表里加两条**只读**检查:
|
|
197
|
+
|
|
198
|
+
- `超级麦吉: 体检(首任务 / 邀请奖励)`
|
|
199
|
+
- `MagiCrew: 体检(首任务 / 邀请奖励)`
|
|
200
|
+
|
|
201
|
+
点一下,列出该站点所有账号的:积分、首任务状态、邀请码 / 已邀人数 /
|
|
202
|
+
已到账积分、奖励明细(含量、状态、对应被邀请人)。
|
|
203
|
+
|
|
204
|
+
实现:
|
|
205
|
+
|
|
206
|
+
- 新增 `src/inspect.mjs`
|
|
207
|
+
- `listAccounts()` 枚举宿主 `~/.config/magpie/plugin-auth.json` 里的 magicrew 账号
|
|
208
|
+
(跟 zcode 插件同一套办法,只读本地文件)
|
|
209
|
+
- `inspectOne()` 对单个账号并发查 5 个接口,任一失败只记录不中断
|
|
210
|
+
- `buildReport()` 拼成可直接展示的纯文本
|
|
211
|
+
- `src/api.mjs` 新增 `fetchInviteRewards()` —— `GET /api/v1/invitations/rewards`
|
|
212
|
+
- `src/hooks/methods.mjs` 各挂一条 method:不输入、不改任何状态;
|
|
213
|
+
用 `throw` 把报告当错误信息弹出来,不在账号列表里留下一条假登录
|
|
214
|
+
|
|
215
|
+
⚠ 顺带核实的两件事(实测,已写进代码注释):
|
|
216
|
+
|
|
217
|
+
1. **通过 magpie 调模型不算「完成首任务」**。同一个号用 magpie 调了好几轮、
|
|
218
|
+
真扣了积分,`first_ai_work` 仍然是 PENDING,邀请奖励一分不发。
|
|
219
|
+
必须在网页 / 官方客户端里跑完一次对话或任务。
|
|
220
|
+
2. **8 项任务里只有 `first_ai_work` 要真发消息**。`ai_ppt` 那项虽然也有
|
|
221
|
+
「写好内容,点击发送」的引导,但原文写着「这里仅用于了解发送入口和操作方式,
|
|
222
|
+
不会实际生成内容」—— 是纯点击导览,`PUT` 就能完成。
|
|
223
|
+
|
|
224
|
+
一个小坑记一下:宿主里的键名有 `magicrew-intl` / `magicrew-intl#z983c8` 这种,
|
|
225
|
+
过滤正则写成 `/^magicrew(#|$)/` 会把国际站全部漏掉(体检显示「还没有登录任何账号」)。
|
|
226
|
+
正确写法 `/^magicrew(-intl)?(#|$)/`。
|
|
227
|
+
|
|
228
|
+
### 「承载」徽章由 magpie 自己派生:删掉从没被读过的 `magpie.carries`
|
|
229
|
+
|
|
230
|
+
0.3.5 为了卡片上那个「承载 X、Y」的徽章,在 `package.json` 里加了 `magpie.carries`。
|
|
231
|
+
那是我方提的方案([#3902](https://github.com/yetone/magpie/issues/3902) 里的 option 1),
|
|
232
|
+
magpie 侧**从未发布过读它的版本** —— 上游选了另一条路:
|
|
233
|
+
|
|
234
|
+
- `766356c`,v0.1.1744 起,`/api/plugins` 每个插件多一个 `serves` 字段:插件**注册的
|
|
235
|
+
provider 名**,每个一次,内置订阅迁到插件上的那些不重复列(页面按内置名字画)。
|
|
236
|
+
- 徽章出现条件:有内置订阅迁到这个插件 **或** 注册了两个及以上 provider。单 provider 不出现
|
|
237
|
+
—— 行的标题本来就说了它是谁。
|
|
238
|
+
- 「… 正由此插件代替内置运行」那句 tooltip 只留在「名字里有内置订阅」的徽章上。
|
|
239
|
+
- 名字就是 `cfg.provider[id].name`,所以想让它读起来清楚,改的是**供应商名**,不是 package.json。
|
|
240
|
+
|
|
241
|
+
实测(v0.1.1744,windows/amd64,独立 data 目录,本包 0.3.8 以文件夹方式安装):
|
|
242
|
+
|
|
243
|
+
```
|
|
244
|
+
$ curl /api/plugins
|
|
245
|
+
{"spec":"...\\magpie-magicrew-auth","providers":["超级麦吉","MagiCrew"],
|
|
246
|
+
"moved":[],"serves":["超级麦吉","MagiCrew"]}
|
|
247
|
+
|
|
248
|
+
卡片:承载 超级麦吉、MagiCrew (一个 pm-chip moved)
|
|
249
|
+
title: null (没有内置订阅 → 没有「代替内置」那句)
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
修法:删掉 `magpie.carries`。宿主不读它,留着只会让下一个人以为它有用。
|
|
253
|
+
|
|
254
|
+
判据:装 magpie ≥ 0.1.1744,本包注册 2 个 provider ⇒ 卡片上必然有「承载 超级麦吉、MagiCrew」,
|
|
255
|
+
package.json 里不需要任何字段。
|
|
256
|
+
|
|
3
257
|
## 0.3.8
|
|
4
258
|
|
|
5
259
|
**签到补上「每日登录积分」—— 国际站一直领不到,根因是它压根不在 onboarding 任务里**
|