Repository navigation
registry: add magpie-providers-hub (10 providers, third-party dsh-providers-hub adapter) - #502
Conversation
|
提完这条之后又自查了一遍「插件在宿主地盘上落东西」,追加修掉一处,顺便把只读的两处也一并交代清楚。 又修掉一处写
目前包内对宿主目录的写入:零。三处曾经写的都处理完了 ——
两处只读,也说明一下(不想让你自己翻包才发现)
两处都是「拿不到就回退」,没有它们插件照常工作。如果你认为插件读这两个文件也不合适,我可以改成完全不碰 —— 只是旧版用户的登录态需要重新登录一次。 状态
|
|
谢谢这么细的自查,宿主写入这块的处理是对的。不过这条现在合不了,原因有两个:
建议是只保留 registry 里还没有的渠道:AStudio、Accio、LobsterAI、MagiCrew 国内/国际。重复的那几个,如果你的实现修好了现有插件没修的问题,欢迎直接给那几个包提 PR。 npm 发布之后,把重复的渠道去掉再推一版,我会把代码拉下来,用真实加载跑一遍再看。 |
|
收到,两条我都认同,按你的意见改。先确认一下第二条的边界,免得改错方向。 1. npm账号在 npm 的 72 小时安全暂停里(recovery-code 触发),到 2026-11-02 06:31 (+08:00) 解除。解除当天我用 2. 重叠的渠道你点的四个我核对过了,确实重:
保留不重叠的五个: 想跟你确认的是:你说的「只保留 registry 里还没有的渠道」,是指
我倾向 (b) —— (a) 只是把重复藏起来,用户装完还是会在供应商列表里看到两套 OfficeAce / AutoClaw / Loomy / MiniMax,你要避免的困惑并没有真的消失。代价是我这边要重装那几个社区插件(登录态要重来一次),这个我能接受。 如果你说 (a) 就够,我就只改条目。你说哪个我就按哪个做。 3. 顺带做 AutoClaw 国际版登录时我踩到过社区的 OAuth 实现里几个真机问题( |
|
按你说的做了,两步都推上去了: 1. 条目收敛(本分支第二个提交): 2. 包侧 0.4.6:你点的五个渠道留在包里但默认不注册 —— 入口模块对这五条导出的是对象占位(magpie 只把函数导出当插件),所以用户装完默认只有上面五条供应商;想用重叠渠道的人设 另外把「默认不注册」做成了真的:模块级 sweep(额度扫描 + 旁路补签)对未注册渠道同样跳过 —— 不发请求、不进快照,不是只藏卡片。 npm:账号的 72 小时安全暂停到 2026-11-02 06:31(+08:00)解除,当天我用 |
|
开关补了一个对普通用户更顺手的形态,同时把「读」的清单如实补齐: 开关文件(插件只读) —— { "extraChannels": "all" }或 读的清单更新(上一条评论列过两处,现在多一处):
写入仍然是零。 |
|
npm 已发布: npm view magpie-providers-hub version # 0.4.7
npm view magpie-providers-hub dist-tags # latest: 0.4.7所以「装不到的坏按钮」这一条已经不存在了。我在一个干净的临时目录里 关于发布账号(正文里也写了):包是 其余按你上一轮的意见都已落地:条目只列五条不重叠的;五个重叠渠道留在包里默认不注册(含 sweep 也跳过);宿主写入为零,只读三处( 我这边随时可以按你的 review 改。 |
|
谢谢更新,npm 上的 0.4.7 我下载下来(shasum 渠道本身没问题。 默认注册的五个都是厂商自己的产品,用用户自己的账号登录,请求只发往厂商自己的域名,不是中转站:
包里没有 postinstall,没有依赖,没有混淆代码,也没有遥测。页面跑在沙盒里,只读 但现在还合不了,有下面几个问题: 1. Windows 上的 PowerShell 命令注入(必须修)
只要其中出现一个 建议直接删掉 2. 往 magpie 的配置目录里写文件,而且凭据文件谁都能读评论里说「宿主写入为零」,但实际有这些写入:
建议去掉旁路凭据文件,账号统一存在 magpie 的账号槽里( 3. 读取了所有供应商的凭据
4. 重叠渠道的代码仍然随 npm 包发布这五个渠道默认不注册,但只要设一个环境变量,或者在 magpie 的配置目录里放一个
这些对你登记的五个渠道没有用处。你之前倾向的方案 (b) 是对的:请把这五个渠道的代码从发布包里删掉, 小问题PR 的两个提交标题开头有一个 BOM( registry 条目本身没问题:格式和其他条目一致,和当前 main 合并后跑 前三条修好、第四条去掉之后,发一个新版本,把条目里的版本说明更新一下,我会再下载 tarball,在沙盒 HOME 里按 magpie 插件宿主的方式加载一遍,没问题就合并。 |
|
四条我都接受,没有异议。逐条说改法,动手顺序按你的严重度排: 1. PowerShell 注入 —— 采纳你的建议: 2. 往 magpie 配置目录写文件 —— 旁路凭据文件整个去掉,账号只存 magpie 账号槽( 3. 读所有供应商的凭据 —— 按前缀过滤后再取 value(只留 4. 五个重叠渠道删掉 —— 你说得对,我之前的方案 (b) 才是对的。 留的五条:AStudio / Accio / LobsterAI / MagiCrew 国内 / MagiCrew 国际 —— 它们的凭据流全部是各厂商正牌 OAuth 或浏览器登录,没有一处需要本地解密或伪造头。 改完发新版本,条目里的说明同步更新(版本号 + 「五条」的措辞)。 |
|
v0.5.0 已发布,四条意见全部落地。逐条对应: 1. PowerShell 注入 — 2. 宿主目录写入 — 全部清零:
副作用:冷启动时 sweep 靠各实例的 3. 只读自己的账号槽 — 4. 五个重叠渠道的代码删掉 — 采纳你的建议(我之前倾向 (b) 是对的):
验证:
包内容:22 个文件 / 169 kB, 麻烦你再拉一次代码看。 |
yetone
left a comment
There was a problem hiding this comment.
谢谢,v0.5.0 的源码我按四条逐一核对过了,代码层面的修复都成立。但现在还不能合并,主要卡在 0.5.0 并没有发布到 npm。
四条修复(看的是 Gyl1219/magpie-providers-hub@69c91b1,package.json 0.5.0)
- PowerShell 注入:
notify()和那次spawnSync都已删除,src/里不再出现 PowerShell。剩下的child_process只有magicrew-browser.mjs:用参数数组 spawn 浏览器(没有走 shell),以及 Windows 上的taskkill /PID <pid>,都不会拼接外部文本。✔ - 写 magpie 的配置目录:
saveCredential/credential.json和accio-state.json都已删除。现在的写入只剩三处:包自己目录下的page/snapshot.js(插件自己的文件夹,没问题)、系统临时目录里的浏览器 profile,以及DSH_HUB_DEBUG=1时写到<tmp>/providers-hub/debug.log的调试日志。✔ - 读取所有供应商的凭据:
readOwnAuthEntries现在先按 key 前缀(hub-/providers-hub*)过滤,再取 value。✔ - 重叠渠道:
officeace/autoclaw/loomy/minimaxintl的源码已删除,DPAPI 探针和伪造 XFF 的代码也随之移除。✔
在 mote 上,用沙盒 HOME 跑 npm test:135 个测试,130 pass,0 fail。
另外,包里默认注册的五个渠道我又核对了一遍,都是厂商自己的产品,用户用自己的账号登录,请求只发往厂商自己的域名,不是中转站:AStudio 是讯飞,Accio 是阿里,LobsterAI 是有道,MagiCrew 是 letsmagic.cn / magicrew.ai。
合并前需要处理的
- 0.5.0 不在 npm 上。
npm view magpie-providers-hub versions --prefer-online --registry=https://registry.npmjs.org/只返回0.0.0-stage和0.4.7,latest仍然是0.4.7(直接读 registry 文档,结果也一样)。你的仓库里也没有 Release,也没有 Actions 运行记录,所以publish.yml还没跑过。magpie 从 registry 安装的是 npm 上的 latest,也就是说,现在合并的话,用户装到的是还带着上面四个问题的 0.4.7。请先把 0.5.0 真正发布出去(如果是npm stage publish,还需要在 npm 上批准这次 stage)。 - registry 条目的 summary 已经过时。 en 和 zh 的 summary 都还写着「另外五个重叠渠道也打进包里,设
MAGPIE_HUB_EXTRA_CHANNELS打开」,0.5.0 已经不是这样了,请改掉。 - 和 main 冲突。 请 rebase 到最新的 main。条目放在数组末尾即可。
可选:0.0.0-stage 这个版本留在 npm 上没什么用,可以 npm deprecate 掉。等主账号解禁并配好 Trusted Publishing 之后,用带 --provenance 的方式发版,这样任何人都能核对 tarball 是不是从仓库里的某个提交构建出来的。
0.5.0 能用 npm view 查到、summary 更新、rebase 完成之后,我会再下载 tarball,在沙盒 HOME 里加载一遍,没问题就合并。
Third-party adapter of iJetLi/dsh-providers-hub (MIT). Five providers, each its own channel: hub-astudio, hub-accio, hub-lobsterai, hub-magicrew, hub-magicrew-intl. Channels overlapping existing registry entries are not shipped (0.5.0 removed them). npm: magpie-providers-hub@0.5.0
5fab6cc to
f7685c8
Compare
yetone
left a comment
There was a problem hiding this comment.
谢谢,0.5.0 已经发到 npm 上了,registry 条目的 summary 也改好了。但现在还不能合并:0.5.0 的 tarball 里打进了你自己机器上的 page/snapshot.js,所以每个装这个插件的用户,都会把你账号的积分和签到结果当成自己的看到。另外 PR 和 main 仍然有冲突。
核对了什么(PR head 5fab6cc)
npm view magpie-providers-hub --prefer-online --registry=https://registry.npmjs.org/:版本有0.0.0-stage、0.4.7、0.5.0,latest是0.5.0,gitHead是69c91b15af34a4b87a6295f968f009ceeb3cffa8。- 下载了
magpie-providers-hub-0.5.0.tgz,sha512 和 registry 上的dist.integrity一致。我拿它和 Gyl1219/magpie-providers-hub@69c91b1 逐个文件比了一遍:16 个文件里,15 个和源码逐字节相同。唯一不同的是page/snapshot.js,它不在仓库里(被.gitignore忽略了),却进了 tarball。tarball 里没有dependencies,也没有 install 脚本,scripts只有test。tools/self-register.mjs没有打进包里。 - 源码 69c91b1 在 mote 上用沙盒 HOME 跑
npm test:135 个测试,130 pass,0 fail,5 个 cancelled。cancelled 的是tests/self-register.test.mjs,报错 "Promise resolution is still pending but the event loop has already resolved"。这个工具不在包里,所以不影响用户,但最好把测试修好,或者删掉。 - 没有中转站:包里出现的域名只有各厂商自己的,xfyun.cn / xf-yun.com(讯飞)、accio.com / accio-ai.com / phoenix-gw.alibaba.com(阿里)、lobsterai.youdao.com(有道)、letsmagic.cn / magicrew.ai,外加 static.geetest.com(登录验证码)。五个渠道都是厂商自己的产品,用户用自己的账号登录。✔
- registry 条目:和当前 main 比,只多出
magpie-providers-hub这一条,summary 里已经没有MAGPIE_HUB_EXTRA_CHANNELS了。✔ - 在仓库根目录跑
bun scripts/check.mjs:结果见文末。
必须修:page/snapshot.js 被打进了 npm 包
包里这个文件是你 2026-10-27 23:28 UTC 在自己机器上生成的快照,内容包括:
- 已经删掉的渠道:officeace、minimaxintl、autoclaw、autoclawintl、loomy,以及它们的余额和签到结果;
- OfficeAce 的一段报错,里面带着一个华为云 IAM 的 AK ID(
HSTABCP1EPH7DY5U3T83); - AStudio、LobsterAI、MagiCrew 的积分余额(比如「星火积分 剩余 60000」「长期(23 批)· 剩 2258.49」)和签到结果。
更要紧的是,buildSnapshot() 遇到这一轮没查到额度的渠道,会「沿用上一份快照里的桶」。我在 mote 上做了一次探针:沙盒 HOME,没登录任何账号,所有 fetch 都会抛错,一共发出 0 个网络请求。在解压出来的 0.5.0 包上调用 _internal.sweepAllChannels(),然后重新读取 snapshot.js:
astudio signedIn false buckets: 会员积分 剩余 0 / 购买积分 剩余 0 / 赠送积分 剩余 7200 · 11-01 到期 / 星火积分 剩余 60000
checkin: {"outcome":"done","message":"今天已领取每日签到奖励及福利礼包"}
lobsterai signedIn false buckets: 临期 · 剩 72.02 / 长期(23 批)· 剩 2258.49
magicrew signedIn false buckets: 每日赠送 剩余 200 / 积分包 剩余 1350 / 积分余额 剩余 1000
checkin: {"outcome":"claimed","credit":200,...}
也就是说,一个全新安装、一个账号都没登录的用户,打开页面会看到你账号的积分和「今日已签到」。在下一次写快照之前,页面上还会显示那五个已经删掉的渠道。用户以后的每份快照都会继续沿用这些数据,直到他自己登录了对应渠道。
请发一个 0.5.1:
- 不要把
page/snapshot.js打进包里:在files里加"!page/snapshot.js",或者发布前把它删掉。发完用npm pack --dry-run确认文件列表里已经没有它了。页面在 snapshot.js 不存在的时候,要能显示成空状态。 - 一个渠道当前没登录(
signedIn为假)时,不要沿用旧快照里的桶和签到结果。至少要保证,旧快照里的数据不会出现在一个从来没登录过的渠道上。 - 发布以后,在 npm 上把 0.5.0 deprecate 掉(
npm deprecate magpie-providers-hub@0.5.0 "...")。0.4.7 也一样,它同样带着之前那四个问题。
冲突
GitHub 上仍然显示 CONFLICTING。你分支上的 registry.json 其实已经等于当前 main 再加上你这一条(两边逐行 diff 只多出这一条),但分支的 merge-base 停在 9608d03,main 在那之后又改过四次 registry(#503、#506、#508、#514)。请把最新的 main merge 进来,或者 rebase 一下。
0.5.1 能用 npm view 查到,并且冲突解决之后,我会再下载一次 tarball,重新比对、重新探针,没问题就合并。
(附:在 5fab6cc 上跑插件仓库全套 HOME=$(mktemp -d) bun test:3689 pass,8 skip,1 fail。挂的是 layerfs 的 "item 3: an import over the file limit is refused",跑了 46 秒,就是 #528 那个超时,和这个 PR 无关。bun scripts/check.mjs:退出码 0。)
|
三条都处理好了。 1. 0.5.0 已发布到 npm
2. summary 已更新 —— en/zh 两处都改成五条渠道的实际状态,「另外五个打进包里、设 3. 已 rebase 到当前 main —— 分支现在是单个提交、直接基于 关于 现在这条 PR 应该是干净的了:条目在数组末尾、只列五条、和 main 零冲突、npm 上有 0.5.0 可装。麻烦你再拉一次 tarball 在沙盒 HOME 里加载验证。 |
There was a problem hiding this comment.
谢谢 rebase,冲突已经没了(f7685c8,mergeable 为 true,diff 只有你这一条 registry 条目)。但上次那条必须修的还在,所以这次仍然不能合并。
(这条 review 第一次提交时误贴成了上一次的正文,已改成现在这份。)
在 f7685c8 上核对的
npm view magpie-providers-hub versions --prefer-online:仍然只有0.0.0-stage、0.4.7、0.5.0,没有 0.5.1;latest是 0.5.0。npm view magpie-providers-hub@0.5.0 deprecated和@0.4.7 deprecated:都是空的,两个版本都没有 deprecate。- 在一个新建的空目录里
npm pack magpie-providers-hub@latest(没有运行包里的任何东西):16 个文件,page/snapshot.js还在包里,里面那个华为云 IAM AK ID 也还在。所以全新安装的用户依然会看到你账号的积分、签到结果和已删掉的五个渠道。 - 第三方中转:这个条目列的五条是 AStudio(讯飞)、Accio(阿里)、LobsterAI(有道)、MagiCrew 国内/国际,都是厂商自己的产品,用户用自己的账号登录,没有中转站。✔
还要做的(和上次一样)
- 发 0.5.1,不带
page/snapshot.js(files里加"!page/snapshot.js",发布前用npm pack --dry-run确认),页面在没有 snapshot.js 时显示空状态。 - 没登录的渠道不沿用旧快照里的桶和签到结果。
npm deprecate掉 0.5.0 和 0.4.7。- 小事:条目请按 main 的写法写成紧凑的一两行(像上面
magpie-aws-bedrock-sso那样),这样之后改 registry 的 PR 不容易和它冲突。
如果 npm 账号要到 11-02 才能操作,那这个 PR 就等到那时候。0.5.1 能在 npm 上查到、旧版本 deprecate 之后,我会重新下载 tarball、再跑一次探针,没问题就合并。
|
抓得好,这个是真的严重 —— 我完全没想到 已修,0.5.1 在 npm 上( 我在干净目录装了 0.5.1 验过, window.__PROVIDERS_HUB_SNAPSHOT__ = {"at":0,"runId":null,"provider":"Providers Hub","models":0,"channels":[]};
两处根因1. 打包规则 —— 2. 你探针指出的那条更关键的 —— 顺带修了你看到的 5 个 cancelled: 新增的门禁(都是照着你这次的发现写的)
另外
麻烦你再拉一次 0.5.1 验。 |
|
Merged at f7685c8. Verified 0.5.1's tarball independently (shasum baafab66…, empty snapshot template, no keys or balances). Two things still open:
|
|
两件事都处理完了,其中第一件不用等 11-02。 1.
|
|
补一条结论 —— 上一轮我只是"建议去确认",现在真查完了。 那颗 AK:风险为零,不需要轮换作者去华为云控制台核对了,结果和判断一致:
(具体 id 不在这里贴 —— 那是作者账号的有效凭据标识,不该出现在公开 PR 里。这也是我上一条回复的疏忽,已改。)
三个让它失效的因素:
这类 id 本来就不会出现在控制台的"访问密钥"列表里(那个列表只显示长期密钥),所以作者那边"只看到一个、找不到另一个"是正确结果。 本地那份含该 id 与各渠道余额的快照备份也已删除,仓库内复查零残留。 剩下的
这条 PR 我这边没有待办了。再次谢谢这轮 review —— 快照那条尤其关键,那是真会伤到用户的漏出方式。 |
给
registry.json加一条。{ "package": "magpie-providers-hub", "name": "Providers Hub", "providers": ["hub-astudio","hub-accio","hub-lobsterai","hub-magicrew","hub-magicrew-intl"], "community": true, "summary": { "en": "…", "zh": "…" } }这个包
npm — https://www.npmjs.com/package/magpie-providers-hub (0.4.7,2026-10-30 已发布)
源码 — https://github.com/Gyl1219/magpie-providers-hub
它是 iJetLi/dsh-providers-hub(MIT)的第三方 magpie 适配,README / UPSTREAM.md / NOTICE.md 三处声明归属;运行时不依赖 DSH(
index.mjs与src/只 importnode:内置模块和彼此)。一个插件,五条供应商:每个渠道是自己的 provider id(
hub-<渠道>),于是可以各自登录、各自看额度、各自单独关掉。这是拆成多条的原因 —— magpie 的 failover 和开关都是 provider 粒度,聚合成一条就都做不到。关于发布账号(先交代,省得你去查)
npm 上是
gyl1219发布的,GitHub 源码在Gyl1219名下,主 npm 账号是gyl0511。原因是主账号目前在 npm 的 72 小时安全暂停里(recovery-code 触发,2026-11-02 06:31 解除),期间不能发布;为了不耽误这条 PR 才用备用账号发布。owner add gyl0511会在暂停解除后补上(这颗分阶段 token 没有账号读权限,CLI 做不了,我跟进)。包本身的维护权与源码归属都是同一个作者,不是转手包。三条审核会问的
1. provider id 与代码一致。
node -e "import('magpie-providers-hub').then(m => console.log(m.DEFAULT_PROVIDER_IDS))"打出的就是上面那五个。id 全部 ASCII 是故意的:它会进模型 id、CLI 参数和<provider>/<account>槽 key。(包内另外五个重叠渠道见下节,默认不注册。)2. 不写宿主文件(#399 卡的就是这条,所以先自查了)。
包永远不会去碰 magpie 的市场缓存:
src/self-register.mjs挪到了tools/(手工跑的脚本,files白名单不含它,不随 npm 发布 ——npm pack只会看到 22 个文件);~/.cache/magpie挪到了系统临时目录;notify-debug.log改为默认不写(DSH_HUB_DEBUG=1才写)。tests/no-host-writes.test.mjs三条都钉死:发布代码里不出现市场缓存的文件名、files不含tools//tests/、以及一个加载探针(沙箱 HOME + 预置plugin-market.json,加载后 mtime 与内容必须零变化 —— 和当初查 0.1.8/0.1.9 用的是同一个探针)。child_process只在三处用:Windows 通知、AutoClaw 桌面端凭据探测、MagiCrew 浏览器登录 —— 都在登录/通知时,加载时不跑。3. 凭据存在哪。
进 magpie 的账号槽,另外旁路写一份
~/.config/magpie/<channel>-credential.json。侧边栏页面是沙盒(connect-src 'none',只读快照),任何 token 都不会写进去。两个我没填的字段
icon— 别的条目里的 icon key("opencode"、"kimi"、"zcode")看起来是内置图标名,我不知道这份词表,编一个大概会静默回落,所以不填;插件自己声明的auth.icon(data URI)已经在渲染了。replaces— 没有替代任何内置订阅,所以没有。关于重叠渠道(按上一轮意见改的)
点名的四个重叠我核对过并处理了:
officeace、autoclaw/autoclaw-cn、loomy、minimax-code-global对应的五个渠道(含 AutoClaw 国内/国际两条)留在包里但默认不注册 —— 入口模块对这五条导出的是对象占位(magpie 只把函数导出当插件),模块级 sweep(额度扫描 + 旁路补签)对它们同样跳过,不发请求也不进快照。想用的人设MAGPIE_HUB_EXTRA_CHANNELS=<id,…|all>或写~/.config/magpie/providers-hub.json({"extraChannels":"all"},插件只读)再重启。代码不删的原因:已登录用户升级不掉线。registry 条目只列不重叠的五条,装完默认也只有这五条供应商。
English summary: adds a registry entry for
magpie-providers-hub@0.4.7(published on npm today), a third-party adapter of iJetLi/dsh-providers-hub (MIT) with five registered per-channel providers (hub-*). The five channels that overlap with existing registry entries are shipped but unregistered by default (MAGPIE_HUB_EXTRA_CHANNELS/ a read-only config file turns them on), and the module-level sweep skips them too. The package writes no host files — the self-register module lives intools/outsidefiles, the browser-login temp profile moved to the system temp dir, and the debug log is off by default;tests/no-host-writes.test.mjsasserts all of it plus the same load probe used on 0.1.9.Unrelated to Huawei, iFlytek, MiniMax, Zhipu, NetEase or any of the vendors above.