magicrew-auth 0.3.14 → 0.3.16

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/AGENTS.md ADDED
@@ -0,0 +1,116 @@
1
+ # AGENTS.md —— 给 AI 执行者的入口
2
+
3
+ > 人类请看 [README](./README.md)。这份只回答两件事:**你现在该读哪一份**、
4
+ > **忘了哪一条会静默出错**。
5
+ >
6
+ > 结构照搬 [magpie-plugin-scaffold](../magpie-plugin-scaffold/AGENTS.md) 的入口式写法;
7
+ > 下面第二节是本仓库自己的坑,不是通用套话。
8
+
9
+ ---
10
+
11
+ ## 一、先定位你在哪一步
12
+
13
+ | 你在做什么 | 必读(按顺序) | 做完的判据 |
14
+ |---|---|---|
15
+ | **改协议 / 接口调用** | [docs/internals.md](./docs/internals.md) 的「三、接口清单」「十二、流式」「十六、上下文窗口」 | 改动在两站(`magicrew` 与 `magicrew-intl`)都验过 |
16
+ | **改登录链路** | internals 的「二、三层凭证」「十一、浏览器登录怎么做到全自动」 | 三条登录路径(本机浏览器 / 浏览器登录 / 手填 JWT)都还能登 |
17
+ | **改 key / 续期** | internals 的「十三、签新 key 会吊销旧 key」「十四、三层凭据的有效期与保活」 | 没引入第二份 refresh_token(会和 `src/keys.mjs` 分叉) |
18
+ | **改模型目录** | internals 的「十六、上下文窗口必须查库」+ HOOKS 十一之二(`free`) | 上下文来自查库;`free` 来自厂商声明,不从 `rate` 反推 |
19
+ | **改签到 / 首任务** | internals 的 checkin 小节(一次性闸门、五种状态) | 不漏发、不重发、失败方向是「宁可晚一轮」 |
20
+ | **代码写完,准备交付** | [CHECKLIST.md](./CHECKLIST.md) 的 **A 表** | A 表全勾 + `node scripts/check.mjs` 退出 0 |
21
+ | **要发版本** | **[UPDATING.md](https://github.com/MYCF711/magpie-plugin-scaffold/blob/main/UPDATING.md)**(脚手架的,七步) | CHECKLIST B 表全勾 + 四条验证 |
22
+ | **用户说「更新了没变化」** | 本文件坑 12(git 源只提示、要手动点更新) | `magpie plugin list` 里的 commit 真的变了 |
23
+
24
+ **最容易漏的是「要发版本」这一行。** `git push` 只是七步里的第 4 步 ——
25
+ 本仓库真踩过:0.3.14 只 push,结果 GitHub 右侧「暂无发布版本」、npm 停在 0.3.8。
26
+
27
+ ---
28
+
29
+ ## 二、本仓库的坑
30
+
31
+ | # | 症状(出问题时你看到什么) | 判据 | 出处 |
32
+ |---|---|---|---|
33
+ | 1 | 改好了国内站,国际站用户报同样的错 | **两站是同一个 Go 服务、逐字符同构**,改一处就要两站都验;`SITES.cn` / `SITES.intl` 只是 host 不同 | internals 一 |
34
+ | 2 | 国际站 `/v1/chat/completions` 回 `HTTP 500` + 22 字节裸文本(不是 JSON) | 国际站网关**强制**要 `organization-code` 头,缺了就是这个 500 | internals 一 / 五 |
35
+ | 3 | 换了 key 之后老 key 立刻失效、用户被要求重登 | **签新 key 会吊销旧 key**,别在热路径上调签发;续期走 `src/keys.mjs` 的唯一出口 | internals 十三 |
36
+ | 4 | 刷新 token 之后两处 refresh_token 不一致、用户莫名掉登录 | 只允许**一个**出口持有 refresh_token;`src/hooks/refresh.mjs` 绕过出口就会分叉 | internals 二 / 十四 |
37
+ | 5 | agent 说「上下文放不下」,而实际模型能吃更长 | 上下文窗口**必须查 magpie 的模型库**,不能填保守值(早前一刀切 256K,实际 1M) | internals 十六 |
38
+ | 6 | 流式回复拿到了,但 `usage` 永远是空、额度不扣 | 流式请求必须补 `stream_options.include_usage`,否则上游不回 usage | internals 十二 |
39
+ | 7 | 模型被标成免费、Free first 一直派到它 | `free` 只认厂商声明(`input_points === 0`),**不能从 `rate === 0` 反推**;价格缺失 = 不列,不猜 | internals 十六 · HOOKS 十一之二 |
40
+ | 8 | 新号邀请奖励不到账 | 国际站判据是**有没有话题**,不是有没有项目 —— 项目打开工作台就会自动建 | internals checkin 小节 |
41
+ | 9 | 一个号天天烧一次模型积分 | 首任务是**每账号一辈子一次**(`isAutoChatSettled`),别改回按日期;失败才重试,最多 3 次 | internals checkin 小节 |
42
+ | 10 | 话题接口抖一下,就白花一次积分去补消息 | 查不到判据时**这次不发**、不落标记、不计数 —— 消息发出去花钱且不可撤 | `src/tasks.mjs` 的 `autoFirstChat` |
43
+ | 11 | Windows 上点登录,浏览器窗口拉不起来 | 浏览器可执行文件名**随版本变**(`msedge.exe` / Chrome 各版本目录不同),要逐个试候选,别写死一个名字 | internals 十一 |
44
+ | 12 | 用户点「检查更新」显示有新提交,点了更新却没变化 | 本仓库是 **git 源**:magpie 比默认分支 HEAD 的 commit,只提示不自动更新,要用户点那一行的「更新」;更新后 `magpie plugin list` 的 commit 应变化 | 脚手架 UPDATING 一 |
45
+ | 13 | 想让卡片标题 / 「源码」按钮对,去改了 magpie 的缓存 | 插件对 magpie 目录**只有读的份**;唯一载体是 `registry-entry.json`(提交给 `registry.json`) | internals 二 · README |
46
+
47
+ 补充一条最容易误信的旧说法:
48
+
49
+ | 症状 | 判据 | 出处 |
50
+ |---|---|---|
51
+ | 以为 checkin 会「顺带续 key」 | **从来没有**。`src/hooks/checkin.mjs` → `src/tasks.mjs` 全链路没 import 过 `ensureKey`;保活由 magpie 按 `refreshLead` 主动调 `auth.refresh` | internals 十四 · CHANGELOG 0.x |
52
+
53
+ ---
54
+
55
+ ## 三、命令
56
+
57
+ ```bash
58
+ # 合规检查(脚手架里的脚本,直接指到本仓库)
59
+ node ../magpie-plugin-scaffold/scripts/check.mjs .
60
+
61
+ # 两站都要能跑:真实登录态在 ~/.cache/magpie/magicrew-session-<siteId>.json
62
+ # siteId = magicrew(国内) / magicrew-intl(国际)
63
+ # 探针脚本必须放进仓库目录用 magpie 自带的 bun 跑(node 连不上国际站域名):
64
+ ~/.cache/magpie/bun/1.4.4/magpie-bun.exe ./_probe/xxx.mjs
65
+
66
+ # 打包面预演
67
+ npm pack --dry-run
68
+
69
+ # 发布(包内 name 是 Magicrew,npm 包名是 magicrew-auth)
70
+ npm run publish:npm
71
+
72
+ # Release:本仓库没有 .github/workflows,必须手工建
73
+ git tag v0.3.16 && git push origin v0.3.16
74
+ # 然后 POST /repos/MYCF711/magpie-magicrew-auth/releases
75
+ ```
76
+
77
+ ---
78
+
79
+ ## 四、两个交付门
80
+
81
+ **门 1 · 代码交付**
82
+
83
+ ```
84
+ □ node ../magpie-plugin-scaffold/scripts/check.mjs . 退出码 = 0
85
+ □ CHECKLIST.md 的 A 表全勾
86
+ □ 改动涉及的站点都跑过(国内 / 国际,别只验一个)
87
+ ```
88
+
89
+ **门 2 · 发布**
90
+
91
+ ```
92
+ □ CHECKLIST.md 的 B 表全勾(七步)
93
+ □ 四条验证:npm view magicrew-auth version / tarball 内容 / magpie plugin list / Release 在
94
+ ```
95
+
96
+ ⚠ 没过门 2 不许说「已发布」。
97
+
98
+ ---
99
+
100
+ ## 五、文档地图
101
+
102
+ | 文件 | 管什么 | 什么时候读 |
103
+ |---|---|---|
104
+ | [README](./README.md) | 用户看的门面:功能、模型、安装 | 改用户可见行为时 |
105
+ | [docs/internals.md](./docs/internals.md) | 16 章实测:两站同构、三层凭证、接口清单、协议要点 | 改代码前按章查 |
106
+ | [CHANGELOG.md](./CHANGELOG.md) | 每版一节 | 写新版本时 |
107
+ | [CHECKLIST.md](./CHECKLIST.md) | 两张勾选表 | 两个交付门 |
108
+ | 脚手架 [AGENTS.md](../magpie-plugin-scaffold/AGENTS.md) | 通用坑(九项清单、三条铁律、check 能查什么) | 第一次接触这个插件族时 |
109
+
110
+ ---
111
+
112
+ ## 六、这份文件的维护规矩
113
+
114
+ 1. 任何一次「不报错、要几小时才找到」的坑,收工前在第二节加一行(症状 → 判据 → 出处)。
115
+ 2. 第二节只放一句话判据,论证留在 `docs/internals.md`。
116
+ 3. 判据要能当场验证(命令、字段、界面现象),写不成判据的是感想。
package/CHANGELOG.md CHANGED
@@ -1,5 +1,73 @@
1
1
  # 更新记录
2
2
 
3
+ ## 0.3.16
4
+
5
+ **加了给 AI 执行者的入口 —— 因为「发布」这一步真的被漏过一次**
6
+
7
+ 不是功能改动。这个仓库 0.3.14 发布时只 `git push`,没发 npm、没打 tag、没建 Release,
8
+ 结果 GitHub 右侧一直挂着「暂无发布版本」、npm 停在 0.3.8。根因不是不知道有发布流程,
9
+ 是它没进阅读路径。
10
+
11
+ - **新增 `AGENTS.md`** —— 按「你在哪一步」给阅读顺序(改协议 / 改登录 / 改 key /
12
+ 改模型 / 改签到 / 交付 / 发版),外加**本仓库 13 条会静默出错的坑**,
13
+ 每条带「症状 → 判据 → 出处章节」。坑都来自 `docs/internals.md` 的实测记录
14
+ - **新增 `CHECKLIST.md`** —— A 表代码交付前 14 项(含「两站都验过」「上下文来自查库」
15
+ 「流式带 include_usage」「话题查不到就不发」),B 表发版前七步带命令与判据
16
+ - [README](./README.md) —— 顶部加三行指路:改代码 / 发版前先看这两份;发布是七步,
17
+ `git push` 只是第 4 步
18
+
19
+ ## 0.3.15
20
+
21
+ **修掉「网页已经登好、magpie 里一直转圈等」—— 弹窗永远拉不起来**
22
+
23
+ 现象:点「浏览器登录」,浏览器里登完了、跳到 agent 界面了,magpie 的卡片一直停在
24
+ 「请在浏览器中完成登录」,直到 5 分钟超时。
25
+
26
+ 根因在 `~/.cache/magpie/magicrew-login-<site>.log` 里躺着,每次都是同一行:
27
+
28
+ ```
29
+ launch: 本机没找到 Chrome / Edge / Bravo / Chromium
30
+ ```
31
+
32
+ **这台机器上 Edge 是装着的**(122.0.2365.106,微软官方包)。`findBrowser()` 写死的
33
+ 文件名是 `msedge.exe`,但这台机器上微软落盘的名字是 **`Microsoft Edge.exe`**
34
+ (带空格、带大写)—— 而另一台机器的 156 版只有 `msedge.exe`。**落盘名随安装方式/版本变**,
35
+ 写死任何一个都必有一类机器命中不到。`existsSync` 一路 miss → 返回 `null` →
36
+ 永远走「降级到系统浏览器 + 让用户去 Console 粘一行」。用户看到的就是「登好了但插件还在等」。
37
+
38
+ 顺带两件事:
39
+
40
+ - **国产 Chromium 系一个都没列**。用户日常用的是 360 极速浏览器 X(360ChromeX,
41
+ Chrome 132 内核),实测 `--remote-debugging-port=0` + CDP `Runtime.evaluate`
42
+ 完全可用 —— 没有任何理由不支持。
43
+ - **只挑「第一个存在的」**,一旦那个起不来就彻底失败。改成**逐个试**,
44
+ 第一个真写出 `DevToolsActivePort` 的才算数;全失败时把每个候选的失败原因都带出来。
45
+
46
+ ### 浏览器优先级(按「谁最干净」排,不是按名气)
47
+
48
+ ```
49
+ ① Chrome / Chromium 自己装的,无企业策略、无强制登录 ← 首选
50
+ ② 国产 Chromium 系 用户日常在用的,CDP 实测一样能用
51
+ ③ Edge 垫底:策略最多、最容易被拦、且用户明确不想用它
52
+ ```
53
+
54
+ 本机实测(Chromium 154.0.8037.93,scoop 安装):**起 CDP 650–800ms,页面就绪 ~2s,
55
+ `waitForCreds` 正常读到凭据,关窗后 profile 彻底删除。**
56
+
57
+ - `findBrowser()` 改为返回 `{ name, path }`(原来是裸字符串),新增 `browserCandidates()`
58
+ - 新增 scoop / 便携版 Chromium 路径(本机就是 scoop 装的那条)
59
+ - `waitPort()` 支持「进程已退出就别白等 8 秒」的提前放弃
60
+ - `launchLoginBrowser()` 返回体新增 `name` / `exe`,卡片文案会写明用的是哪个浏览器
61
+ - `local-browser.mjs` 的 `roots()` 补上 360 / QQ / 搜狗等,让「本机已登录就直接认」也能命中
62
+ - 判据:`node tests/browser-detect.mjs`(Edge 真实文件名 / 国产覆盖 / Chromium 优先 / 逐个试)
63
+
64
+ ### 为什么先修「怎么把窗口拉起来」,而不是去补更多登录方式
65
+
66
+ 这条链只有一个出口:**窗口拉不起来,后面的 CDP 读取一步都走不到**。
67
+ 0.3.12 及更早的失败还是**静默**的 —— 它会「成功」降级到剪贴板通道,而那一步要求
68
+ 用户知道有 F12 这回事。所以症状不是「报错」,而是「看起来什么都没发生」。
69
+ 判据落在 `magicrew-login-<site>.log` 里,就是为了这种静默失败下次能一眼看见。
70
+
3
71
  ## 0.3.14
4
72
 
5
73
  **两处判据修正:国际站看「话题」而不是「项目」;「免费」不再从倍率反推**
@@ -91,6 +159,7 @@ magicrew#g8rptf (66p0q…) first_ai_work PENDING/PENDING → COMPLETED/GRANTE
91
159
  再调一次 `ensureFirstTaskOnce` 直接返回 `{ settled: true }`:不打网络、不发消息,
92
160
  一次性闸门生效。
93
161
 
162
+
94
163
  ## 0.3.12
95
164
 
96
165
  **插件不再写 magpie 自己的缓存**
package/CHECKLIST.md ADDED
@@ -0,0 +1,110 @@
1
+ # CHECKLIST —— 两张表,两个交付门
2
+
3
+ > 给 `magpie-magicrew-auth`。`scripts/check.mjs`(在脚手架仓库里)只查**能自动查的那部分**;
4
+ > 下面这些查不到,但漏了照样出事,而且通常**不报错**。
5
+ >
6
+ > 逐条勾,勾不上就是还没好。表格里的「判据」都能当场验。
7
+
8
+ ---
9
+
10
+ ## A 表 · 代码交付前
11
+
12
+ ```
13
+ □ 1. config.models 有内容
14
+ 判据:插件装上后模型列表不是空的(未登录时也要有静态表)
15
+ 出处:README
16
+
17
+ □ 2. authorize() 立刻返回
18
+ 判据:登录时没有长时间转圈
19
+ 出处:docs/internals.md 二
20
+
21
+ □ 3. 两站都验过
22
+ 判据:国内(magicrew)与国际(magicrew-intl)各跑一次目标路径,都通
23
+ 出处:internals 一 —— 同一个 Go 服务,一边过不代表另一边过
24
+
25
+ □ 4. 国际站请求带 organization-code
26
+ 判据:/v1/chat/completions 不是 HTTP 500 + 22 字节裸文本
27
+ 出处:internals 一 / 五
28
+
29
+ □ 5. 上下文窗口来自查库,不是保守常数
30
+ 判据:模型条目的 limit.context 与实际能吃的长度对得上(早前一刀切 256K 是错的)
31
+ 出处:internals 十六
32
+
33
+ □ 6. 流式请求带 stream_options.include_usage
34
+ 判据:流式回复里有 usage,额度真的扣了
35
+ 出处:internals 十二
36
+
37
+ □ 7. 模型 free 来自厂商声明,不是从 rate 反推
38
+ 判据:input_points === 0 才 free;缺失就不列,不猜
39
+ 出处:internals 十六 · HOOKS 十一之二
40
+
41
+ □ 8. 只有一处持有 refresh_token
42
+ 判据:`src/hooks/refresh.mjs` 没有绕过 `src/keys.mjs`;没有第二次签发 key 的调用
43
+ 出处:internals 十三 / 十四
44
+
45
+ □ 9. 首任务仍是一次性闸门
46
+ 判据:isAutoChatSettled 还在用;失败最多 3 次;不落日期格式
47
+ 出处:internals checkin 小节
48
+
49
+ □ 10. 话题查不到时「这次不发」
50
+ 判据:fetchProjectTopics 抛错时不写标记、不计数、不发送
51
+ 出处:src/tasks.mjs 的 autoFirstChat
52
+
53
+ □ 11. 登录三条路径都还能登
54
+ 判据:本机浏览器接上 / 浏览器登录 / 手填 JWT,各走一次
55
+ 出处:internals 十一
56
+
57
+ □ 12. 浏览器可执行文件是逐个试候选,不是写死一个名字
58
+ 判据:Windows 上点登录能起浏览器(文件名随浏览器版本变)
59
+ 出处:internals 十一
60
+
61
+ □ 13. 没有写 magpie 的市场缓存
62
+ 判据:src 里搜不到 plugin-market.json
63
+ 出处:CHANGELOG 0.1.9 那段事故
64
+
65
+ □ 14. node ../magpie-plugin-scaffold/scripts/check.mjs . 退出码 = 0
66
+ 判据:末尾「失败 0」
67
+ ```
68
+
69
+ ---
70
+
71
+ ## B 表 · 发版前(七步,一步不能少)
72
+
73
+ > ⚠ **`git push` 只是第 4 步。** 本仓库真踩过:0.3.14 只 push,
74
+ > 结果 GitHub 右侧一直写着「暂无发布版本」、npm 停在 0.3.8。
75
+
76
+ ```
77
+ □ 第 0 步 · 写 CHANGELOG
78
+ 判据:顶部是这个版本的一节,一条一行,说用户能感知的变化
79
+
80
+ □ 第 1 步 · bump version
81
+ 命令:npm version patch --no-git-tag-version
82
+ 判据:package.json 的 version 变了(同版本重打会命中 bun 缓存)
83
+
84
+ □ 第 2 步 · 打包面预演
85
+ 命令:npm pack --dry-run
86
+ 判据:清单里有 README.md / CHANGELOG.md / docs / AGENTS.md / CHECKLIST.md
87
+
88
+ □ 第 3 步 · 提交
89
+
90
+ □ 第 4 步 · 推到默认分支
91
+ 命令:git push origin main
92
+ 判据:git 源装的人靠这里检测 —— 推别的分支不算
93
+
94
+ □ 第 5 步 · npm publish
95
+ 命令:npm run publish:npm ← 包内 name 是 Magicrew,npm 包名是 magicrew-auth
96
+ 判据:返回 + magicrew-auth@<版本>,且 package.json 的 name 已还原成 Magicrew
97
+
98
+ □ 第 6 步 · tag + Release
99
+ 命令:git tag v<version> && git push origin v<version>
100
+ 本仓库**没有** .github/workflows ⇒ Release 必须手工建:
101
+ POST /repos/MYCF711/magpie-magicrew-auth/releases
102
+ { tag_name, target_commitish:"main", name, body:<CHANGELOG 该版本段>, draft:false }
103
+ 判据:tag 与 version 一致;Release 不是 draft
104
+
105
+ □ 第 7 步 · 四条验证
106
+ ① npm view magicrew-auth version → 新版本(登记可能延迟 1-2 分钟)
107
+ ② 下载 dist.tarball 解包看内容 → 要看到新代码,不只看版本号
108
+ ③ magpie plugin list → commit 变了(git 源看 commit 不看 version)
109
+ ④ GET /releases/tags/v<version> → 200 且 draft=false
110
+ ```