creditdaddy 0.9.1 → 0.9.3
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/README.md +234 -225
- package/bin/creditdaddy.js +9 -9
- package/package.json +1 -1
- package/src/daemon.js +2 -1
- package/src/panel.html +2086 -2048
package/README.md
CHANGED
|
@@ -1,225 +1,234 @@
|
|
|
1
|
-
# CreditDaddy
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
-
|
|
23
|
-
- **
|
|
24
|
-
-
|
|
25
|
-
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
-
|
|
30
|
-
|
|
31
|
-
-
|
|
32
|
-
-
|
|
33
|
-
-
|
|
34
|
-
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
-
|
|
41
|
-
-
|
|
42
|
-
-
|
|
43
|
-
-
|
|
44
|
-
-
|
|
45
|
-
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
-
|
|
54
|
-
-
|
|
55
|
-
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
-
|
|
63
|
-
-
|
|
64
|
-
-
|
|
65
|
-
|
|
66
|
-
##
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
node bin/creditdaddy.js
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
node bin/creditdaddy.js
|
|
84
|
-
node bin/creditdaddy.js
|
|
85
|
-
node bin/creditdaddy.js
|
|
86
|
-
node bin/creditdaddy.js
|
|
87
|
-
node bin/creditdaddy.js
|
|
88
|
-
node bin/creditdaddy.js
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
GET
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
GET /api/
|
|
125
|
-
POST /api/
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
POST /api/
|
|
131
|
-
GET /api/
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
POST /api/
|
|
137
|
-
GET /api/
|
|
138
|
-
POST /api/
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
src/
|
|
170
|
-
src/
|
|
171
|
-
src/
|
|
172
|
-
src/
|
|
173
|
-
|
|
174
|
-
src/
|
|
175
|
-
src/
|
|
176
|
-
src/
|
|
177
|
-
src/
|
|
178
|
-
src/
|
|
179
|
-
src/
|
|
180
|
-
src/
|
|
181
|
-
src/
|
|
182
|
-
|
|
183
|
-
src/
|
|
184
|
-
src/
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
##
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
##
|
|
224
|
-
|
|
225
|
-
|
|
1
|
+
# CreditDaddy
|
|
2
|
+
|
|
3
|
+

|
|
4
|
+
|
|
5
|
+
[](https://github.com/techysy/CreditDaddy/releases)
|
|
6
|
+
[](https://github.com/techysy/CreditDaddy/actions/workflows/ci.yml)
|
|
7
|
+
[](LICENSE)
|
|
8
|
+
[](https://github.com/techysy/CreditDaddy/releases)
|
|
9
|
+
[](https://www.npmjs.com/package/creditdaddy)
|
|
10
|
+
|
|
11
|
+
**AI 编程工具多账号本地管理 + 每日积分自动领取(领鸡蛋)助手** —— 目前支持 **Qoder**(国际版 / 国内版)、**WorkBuddy**(腾讯 CodeBuddy 系,国内版 / 国际版)、**ZCode**(智谱 GLM / Z.ai),并可接入 **[10Router](https://github.com/techysy/10router)** 查看其他供应商的额度、同步本机用量。
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
> 项目原名 **QoderDaddy**,v0.3.0 起更名为 CreditDaddy:数据目录自动从 `~/.qoderdaddy` 迁移到 `~/.creditdaddy`(旧目录保留),
|
|
15
|
+
> 旧的 `QODERDADDY_HOME` / `QODERDADDY_PASSWORD` 环境变量与 QoderDaddy 导出文件仍可使用。
|
|
16
|
+
|
|
17
|
+
架构参考 [WorkDaddy](https://github.com/babygoton/WorkDaddy)(本地守护进程 + Web 面板 + 数据全留本机 + 仅监听 127.0.0.1),
|
|
18
|
+
签到能力移植自 [10router](https://github.com/techysy/10router) 的 qoderCheckin / codebuddyCheckin,并按 Qoder App 0.2.x、WorkBuddy 桌面端的真实协议补全。
|
|
19
|
+
|
|
20
|
+
## 功能
|
|
21
|
+
|
|
22
|
+
- **仪表盘 + 分产品标签页**:首页仪表盘汇总账号数、今日领取进度、剩余积分、下次自动领取,各产品概况、需要处理的账号(token 失效 / 即将过期、领取失败)与最近领取记录;Qoder / WorkBuddy / ZCode 各自一个标签页,卡片式账号列表(参考 WorkDaddy),可按国际 / 国内版筛选,显示领取状态、连续天数、剩余积分、积分包到期、token 有效期,支持亮色 / 暗色
|
|
23
|
+
- **10Router 集成**:配置 10Router 地址 + 虚拟 key(sk-…)后,「10Router」标签页**按供应商聚类**渲染 10Router 里其他供应商(CodeBuddy / Qoder / Claude / GLM …)的额度卡片(CodeBuddy / Qoder / GLM 系连接带**国内版 / 国际版**徽标,与账号卡同一语义),默认只显示主额度,其余收进一行摘要(明细可展开);额度告急 / 查询失败会进仪表盘「需要处理」,工具栏显示 10Router 健康(存储驱动降级有提示);并内置 10router-sync 插件的用量同步能力,每小时把本机 ZCode / OpenCode / mirasim / 小米 MiMo 的用量导入 10Router 的用量统计
|
|
24
|
+
- **本机导入**:一键读取本机 Qoder / Qoder CN 客户端(本地解密 `auth.v1.dat`)与 WorkBuddy 客户端(当前 + 历史会话)已登录的账号,token 不出机器;同一用户 token 续期时自动更新
|
|
25
|
+
- **WorkBuddy / ZCode 账号切换**:一键把客户端切换到选中的账号(WorkBuddy 自动应用;ZCode 需先退出客户端),切换前先保全当前登录,绝不丢号,每个账号独立设备指纹
|
|
26
|
+
- **隐私(无痕)登录窗口**:桌面版内置一次性会话的登录窗口,网页授权不带出系统浏览器里已登录的账号、Cookie 也不落盘,适合同一产品登录多个账号
|
|
27
|
+
- **浏览器登录**:三条产品线都能在面板里直接登录新账号,授权后 token 自动入库 —— Qoder 设备码授权(PKCE + nonce,与官方 qodercli 同流程)、WorkBuddy / CodeBuddy(与 WorkBuddy 桌面端同一 state 轮询流程)、ZCode(客户端的 CLI 轮询流程,支持 BigModel 智谱 / Z.ai);WorkBuddy / ZCode 浏览器登录的账号同样可以一键切换客户端
|
|
28
|
+
- **每日自动领取**:守护进程每 ~2 小时扫描一轮;当天已领的账号记忆跳过;"无可领活动"不记忆,每日积分刷新(10:00 UTC+8)后自动重试。"领取日"以 10:00 (UTC+8) 为界,与本机时区无关
|
|
29
|
+
- **国际版领取**:携带 Qoder 客户端生成的设备风控身份(见下文),与客户端内「每天领 100 Credits」一致
|
|
30
|
+
- **导入导出**:可设口令加密,格式与 10router 的 OAuth 迁移文件(`10router-oauth-secure-v1`)互通 —— 10router 导出的 Qoder / CodeBuddy 授权可直接导入(CodeBuddy 对应 WorkBuddy),CreditDaddy 的加密导出也能导入 10router
|
|
31
|
+
- **PAT 支持**:pt- 开头的 Personal Access Token 自动兑换短期 job token
|
|
32
|
+
- **Windows 桌面版**:托盘常驻、关窗不退出、开机自启(后台运行)、托盘一键领取并弹出结果
|
|
33
|
+
- **数据边界**:全部数据存 ~/.creditdaddy(0600 权限 + 原子写 + 进程内串行写入),无任何遥测、无第三方依赖
|
|
34
|
+
- **本机防护**:只监听 127.0.0.1,并校验 Host 头(防 DNS 重绑定)、拒绝跨站 Origin(防 CSRF),网页无法偷读或篡改本机账号
|
|
35
|
+
|
|
36
|
+
## WorkBuddy 说明
|
|
37
|
+
|
|
38
|
+
- **账号来源**:WorkBuddy 与 CodeBuddy CLI / 插件共用凭据目录 `%LOCALAPPDATA%\CodeBuddyExtension\Data\Public\auth\`(macOS `~/Library/Application Support/CodeBuddyExtension/…`,Linux `~/.local/share/CodeBuddyExtension/…`),
|
|
39
|
+
`workbuddy-desktop.info` 是当前登录会话,带时间戳的同名文件是历史会话。登录 token 是 Keycloak JWT,按签发方区分:`codebuddy.cn` / `workbuddy.cn` / `copilot.tencent.com` → 国内版,`codebuddy.ai` / `workbuddy.ai` → 国际版
|
|
40
|
+
- **签到**:`POST {域名}/v2/billing/meter/checkin-activity-status` 查今日是否已签(已签不再请求),未签则 `POST …/daily-checkin`;国内版每日签到送积分并累计连签天数
|
|
41
|
+
- **积分**:`POST {域名}/v2/billing/meter/get-user-resource`,循环额度包(体验版月度额度)按本周期计,活动赠送包按剩余量与到期时间计
|
|
42
|
+
- **浏览器登录**:`POST {域名}/v2/plugin/auth/state?platform=WorkBuddy` 取授权地址,用户登录后轮询 `/v2/plugin/auth/token?state=`(11217 = 等待)拿 token,再轮询 `/v2/plugin/login/account?state=`(12151 = 等待)与 `/v2/plugin/accounts` 补齐账号信息,组装成与 `workbuddy-desktop.info` 同结构的会话;国内版走 www.codebuddy.cn,国际版走 www.codebuddy.ai
|
|
43
|
+
- **token 刷新**:只在 token 过期或接口返回 401 时用 refreshToken 刷新(`/v2/plugin/auth/token/refresh`);若该账号正是 WorkBuddy 客户端当前登录的账号,会把新 token 同步写回客户端,避免客户端掉线。refreshToken 也失效时(如在别处登出),需要在 WorkBuddy 重新登录后再「本机导入」同步
|
|
44
|
+
- **切换账号**:写入 `workbuddy-desktop.info` 并清除登出标记,WorkBuddy 监听该文件并自动应用;切换前会先把客户端当前会话的最新 token 保存到 CreditDaddy
|
|
45
|
+
- **国际版「保持活跃」**:国际版没有签到接口,官方规则为「当天有 ≥1 次有效对话请求即视为活跃用户,发放每日赠送积分」。调度器每天为每个国际版账号发一条免费档模型(rateMultiplier 0,~0 消耗)的极短流式请求(`POST {域名}/v2/chat/completions`,system 提示 + typed blocks 是网关必需格式),2xx 即当日活跃达成;额度耗尽时会得到「等官方发放后再试」的明确提示
|
|
46
|
+
|
|
47
|
+
## ZCode 说明
|
|
48
|
+
|
|
49
|
+
- **账号来源**:ZCode 桌面客户端把当前登录存在 `~/.zcode/v2/credentials.json`(值用客户端私有的 `enc:v1:` AES-256-GCM 加密,密钥从机器信息派生),CreditDaddy 本地解密读取,token 不出机器
|
|
50
|
+
- **浏览器登录**:与客户端的 CLI 轮询登录同一协议 —— `POST https://zcode.z.ai/api/v1/oauth/cli/init`(本地随机 poll token)拿授权地址(回调指向 zcode.z.ai 服务端,无需 `zcode://` 协议,任何浏览器都能用),用户登录后轮询 `/api/v1/oauth/cli/poll/{flow_id}`;Z.ai 账号再用 `api.z.ai/api/auth/z/login` 换业务 token。拿到的凭据按 `credentials.json` 格式用本机密钥加密保存,可直接切换到 ZCode 客户端
|
|
51
|
+
- **没有每日签到,活动领取可自动轮询(开关默认关)**:ZCode 积分靠「活动领取」(billing/preview → billing/claim)。标签页打开「自动领取」后,每轮签到结束会轮询可领活动:先试免验证码领取,需要验证码时 —— 桌面版用隐藏窗口跑阿里云验证码 SDK 静默验证(触发风控时弹出窗口让人工完成,2 分钟超时),NAS / 纯 CLI 环境标记「需手动领取」;平时保持关闭即可,活动期前再开。也可点卡片上的领取按钮手动领取。ZCode 卡片不显示任何签到 / 领取徽标,结果只看运行日志与仪表盘最近记录
|
|
52
|
+
- **客户端版本跟随本机**:billing 类接口校验客户端版本(过低直接 3001),请求头里上报的版本取本机已安装 ZCode 的版本(Windows 注册表读取),没有客户端时用兜底值
|
|
53
|
+
- **出口可切换**:ZCode 上游请求默认「直连优先、代理兜底」,标签页提示条里可切「代理优先、直连兜底」。代理地址可在面板配置(`zcode-net.json`,0600,优先),未配置时取 `HTTPS_PROXY` 环境变量;http 代理 + CONNECT 隧道,纯 Node 内置实现;`NO_PROXY` 与 loopback 始终直连
|
|
54
|
+
- **额度展示**:查询 BigModel Coding Plan(quota/limit + subscription/list)与 Z.ai / Start Plan(billing/balance);balances 为空时从生效套餐的权益派生展示额度(未到生效时间的权益显示「xx 生效」);无有效套餐时显示「仅免费额度」
|
|
55
|
+
- **账号切换**:写回 `credentials.json` / `config.json`,并为每个账号写入独立的设备 ID(`telemetry-state.json` 的 deviceMid),避免账号间被风控关联;需先退出 ZCode 客户端(运行中会覆盖回内存里的旧登录)。切换前当前登录会先保存进 CreditDaddy,不会丢号
|
|
56
|
+
- 协议移植自 [zcode-switch](https://github.com/pjpv/zcode-switch)(MIT)
|
|
57
|
+
|
|
58
|
+
## 10Router 集成
|
|
59
|
+
|
|
60
|
+
在面板「10Router」标签页填 10Router 的访问地址和仪表盘里创建的 **虚拟 key**(sk-…),key 只保存在守护进程数据目录的 `tenrouter.json`(0600,不随账号导出),面板只显示脱敏值。
|
|
61
|
+
|
|
62
|
+
- **供应商额度卡片**:读取 10Router 的 `GET /api/usage/quotas`(**10Router 1.2.1+**),一次拿到全部可查额度的供应商连接,口径与 10Router 仪表盘的 Provider Limits 一致;剩余不足 10% 标红并进入仪表盘「需要处理」。10Router 端按连接缓存 5 分钟,「刷新额度」会强制重查。老版本 10Router 会提示升级,用量同步不受影响
|
|
63
|
+
- **用量同步**(同 10router-sync 插件 `export-usage.mjs`,行结构逐行一致):ZCode `~/.zcode/cli/db/db.sqlite`(只导出官方 `builtin:` / `account:` 渠道)、OpenCode `~/.local/share/opencode/opencode.db`、mirasim `~/.mirasim/insights/usage-*.ndjson`(跳过经 10Router 中转的调用)、小米 MiMo `mimocode.db`,POST 到 10Router 的 `/api/settings/database/import-usage`(10Router 1.0.7+,服务端按行签名去重)。每个来源记住已同步到的时间,之后只发新行(回退 2 天重叠兜底);可开启每小时自动同步,也可手动「同步用量」
|
|
64
|
+
- 读取 SQLite 需要 Node 22.5+ 内置的 `node:sqlite`(桌面版自带;fnOS 依赖 nodejs_v24);数据库先复制到临时目录再读,不碰客户端正在写的文件
|
|
65
|
+
|
|
66
|
+
## Qoder 国际版领取说明(重要)
|
|
67
|
+
|
|
68
|
+
实测 Qoder 国际版服务端只向**携带设备风控身份**(`Cosy-MachineToken / Cosy-MachineCode / Cosy-MachineType`)的请求下发「每天领 100 Credits」活动;不带时只返回推广活动,这也是旧版本(以及 10router)国际版一直"无可领活动"的原因。
|
|
69
|
+
|
|
70
|
+
- 风控身份由 **本机 Qoder 客户端自带的 `resources/umid/runtime-info`** 生成,CreditDaddy 直接调用它(每 50 分钟刷新),因此**国际版领取需要本机安装 Qoder 客户端**(无需保持登录、无需打开)
|
|
71
|
+
- **每台设备每天只能有一个国际版账号领取**(服务端按设备限领)。本机已有账号领取后,其余国际版账号显示「本机已领」并当日不再请求;账号列表中靠前的账号优先领取
|
|
72
|
+
- 国内版不需要风控身份,所有账号都能领取
|
|
73
|
+
- **fnOS / NAS(Linux,无 Qoder 客户端)**:在面板 Qoder 页一键安装「设备身份组件」(或 `creditdaddy umid install`)—— 从 npm 官方包 `@qoder-ai/qodercli` 下载(校验 npm 完整性),取出其内置的 Linux x64 / arm64 UMID 程序,参数与 qodercli 一致(国际版 env=4),之后 NAS 也能领取国际版;NAS 是独立设备,同样每天限领一个国际版账号。CreditDaddy 不分发该二进制
|
|
74
|
+
|
|
75
|
+
## 快速开始
|
|
76
|
+
|
|
77
|
+
需要 Node 18+,零依赖:
|
|
78
|
+
|
|
79
|
+
node bin/creditdaddy.js daemon # 启动守护进程,打开 http://127.0.0.1:47860
|
|
80
|
+
|
|
81
|
+
CLI 用法:
|
|
82
|
+
|
|
83
|
+
node bin/creditdaddy.js scan # 导入本机 Qoder / WorkBuddy / ZCode 客户端已登录的账号
|
|
84
|
+
node bin/creditdaddy.js add <token> # 添加 Qoder 国际版账号
|
|
85
|
+
node bin/creditdaddy.js add <token> --cn # 添加 Qoder 国内版账号
|
|
86
|
+
node bin/creditdaddy.js add <token> --workbuddy # 添加 WorkBuddy 国内版账号(--intl 为国际版)
|
|
87
|
+
node bin/creditdaddy.js add <token> --name 工作号
|
|
88
|
+
node bin/creditdaddy.js list # 查看账号
|
|
89
|
+
node bin/creditdaddy.js checkin # 立即领取全部
|
|
90
|
+
node bin/creditdaddy.js checkin --cn # 只签 Qoder 国内版(--intl 只签国际版)
|
|
91
|
+
node bin/creditdaddy.js checkin --workbuddy # 只签 WorkBuddy
|
|
92
|
+
node bin/creditdaddy.js remove <id前缀> # 删除账号
|
|
93
|
+
node bin/creditdaddy.js export backup.json --password 口令 # 加密导出(10router 可导入)
|
|
94
|
+
node bin/creditdaddy.js export backup.json # 明文导出(含明文 token)
|
|
95
|
+
node bin/creditdaddy.js import backup.json [--password 口令] # 导入 CreditDaddy / 10router 导出文件
|
|
96
|
+
node bin/creditdaddy.js umid install # Linux / fnOS:安装 Qoder 设备身份组件(国际版领取用)
|
|
97
|
+
node bin/creditdaddy.js help # 帮助
|
|
98
|
+
|
|
99
|
+
## 导入导出格式
|
|
100
|
+
|
|
101
|
+
加密文件与 10router `src/lib/auth/secureTransfer.js` 完全一致:
|
|
102
|
+
|
|
103
|
+
{ "format": "10router-oauth-secure-v1", "kdf": { "alg": "scrypt", "N": 16384, "r": 8, "p": 1, "keyLen": 32, "salt": "…" },
|
|
104
|
+
"cipher": "aes-256-gcm", "iv": "…", "tag": "…", "payload": "…" }
|
|
105
|
+
|
|
106
|
+
解密后的载荷:`{ provider, exportedAt, accounts: [{ provider, name, email, uid, accessToken, refreshToken, expiresAt, providerSpecificData }] }`。
|
|
107
|
+
导入 10router 文件时取 qoder / qoder-cn / codebuddy-cn / codebuddy-intl 账号(后两者映射为 WorkBuddy);10router 按提供商导入,混合导出时建议按单个版本导出。
|
|
108
|
+
|
|
109
|
+
## API 端点
|
|
110
|
+
|
|
111
|
+
Qoder 侧(国际版 openapi.qoder.sh,国内版 openapi.qoder.com.cn):
|
|
112
|
+
|
|
113
|
+
GET /sash/api/v1/me/campaigns 活动(活动)列表,返回 uid / campaigns
|
|
114
|
+
POST /sash/api/v1/me/campaigns/{id}/claim 领取
|
|
115
|
+
GET /api/v1/userinfo 账号信息
|
|
116
|
+
GET /api/v2/quota/usage 配额
|
|
117
|
+
POST /api/v1/jobToken/exchange PAT → job token
|
|
118
|
+
|
|
119
|
+
领取请求头与 Qoder App 客户端一致:`Authorization`、`Cosy-ClientType: 10`、`Cosy-Version`(客户端版本)、
|
|
120
|
+
`Cosy-MachineOS`(如 `x86_64_win32`)、`Cosy-MachineHostname`、`Cosy-MachineId`,以及上述风控三件套。
|
|
121
|
+
|
|
122
|
+
### 本地 HTTP API
|
|
123
|
+
|
|
124
|
+
GET /api/accounts 账号列表(脱敏)
|
|
125
|
+
POST /api/accounts 添加 {name, provider, token}
|
|
126
|
+
PATCH /api/accounts/:id 修改备注名 {name}
|
|
127
|
+
DELETE /api/accounts/:id 删除
|
|
128
|
+
POST /api/accounts/:id/checkin 单账号领取
|
|
129
|
+
GET /api/accounts/:id/quota 积分(统一结构 total / used / remaining / parts)
|
|
130
|
+
POST /api/accounts/:id/switch 切换 WorkBuddy / ZCode 客户端到此账号
|
|
131
|
+
GET /api/accounts/:id/zcode/plans ZCode 可领取活动列表
|
|
132
|
+
POST /api/accounts/:id/zcode/claim ZCode 领取活动 {planId, captchaParam?, region?}
|
|
133
|
+
GET /api/zcode/captcha-config ZCode 领取验证码配置
|
|
134
|
+
POST /api/checkin 全部领取 {provider?, product?, skipIfCheckedToday?}(默认跳过今日已签)
|
|
135
|
+
POST /api/auth/device/start 发起浏览器登录 {provider: qoder / qoder-cn / workbuddy / workbuddy-intl / zcode-bigmodel / zcode-zai}
|
|
136
|
+
POST /api/auth/device/poll 轮询登录结果 {sessionId}
|
|
137
|
+
GET /api/local/detect 检测本机 Qoder 客户端 / WorkBuddy 凭据目录 / 旧版 IDE / CLI
|
|
138
|
+
POST /api/local/scan 读取本机已登录账号(Qoder + WorkBuddy + ZCode)
|
|
139
|
+
POST /api/local/import 导入扫描候选 {candidateId, provider?}
|
|
140
|
+
GET /api/status 状态(版本、调度器、风控身份是否可用)
|
|
141
|
+
GET /api/tenrouter 10Router 集成配置(key 脱敏);PUT 保存 {endpoint, key?, syncEnabled?, sources?};DELETE 断开
|
|
142
|
+
POST /api/tenrouter/test 测试地址与 key {endpoint?, key?}
|
|
143
|
+
GET /api/tenrouter/quotas 10Router 其他供应商额度总览(?force=1 跳过缓存)
|
|
144
|
+
GET /api/tenrouter/health 10Router 自身健康(ok / driver / lastDriverError,驱动降级有提示)
|
|
145
|
+
POST /api/tenrouter/sync 立即同步本机用量到 10Router {dryRun?}
|
|
146
|
+
GET /api/qoder/umid Qoder 设备身份组件状态(Linux / fnOS)
|
|
147
|
+
POST /api/qoder/umid/install 下载官方 qodercli 并提取设备身份组件
|
|
148
|
+
GET /api/logs 日志
|
|
149
|
+
POST /api/export 导出 {password?, provider?, product?}
|
|
150
|
+
POST /api/import 导入 {data, password?}
|
|
151
|
+
|
|
152
|
+
设置环境变量 `CREDITDADDY_PASSWORD` 后,所有 /api/* 需要 `x-qd-key` 头(fnOS 部署自动启用,密码在安装向导里设置、「应用设置」里可改)。面板遇到密码缺失或错误会弹框要密码并自动重试该请求。
|
|
153
|
+
|
|
154
|
+
## 领取状态说明
|
|
155
|
+
|
|
156
|
+
| status | 含义 | 当日记忆 |
|
|
157
|
+
|---|---|---|
|
|
158
|
+
| checked-in | 领取成功,含金额 | ✓ 记忆,今天不再重复请求 |
|
|
159
|
+
| already | 有积分活动但已领过 | ✓ 记忆 |
|
|
160
|
+
| limited | 国际版:本机今日额度已被其他账号领取 | ✓ 记忆 |
|
|
161
|
+
| no-activity | 当前无可领活动(可能窗口未开) | ✗ 下轮重试 |
|
|
162
|
+
| failed | 鉴权失败 / 网络错误等 | ✗ 下轮重试 |
|
|
163
|
+
|
|
164
|
+
> ⚠️ 非官方接口,Qoder / WorkBuddy / ZCode 调整服务端时可能失效。请遵守平台服务条款,仅管理自己的账号。
|
|
165
|
+
|
|
166
|
+
## 目录结构
|
|
167
|
+
|
|
168
|
+
bin/creditdaddy.js CLI 入口
|
|
169
|
+
src/constants.js 端点与请求头常量(版本号取自 package.json)
|
|
170
|
+
src/qoderClient.js Qoder OpenAPI 客户端(领取核心)
|
|
171
|
+
src/qoderApp.js 本机 Qoder 客户端集成:安装探测、设备风控身份、safeStorage 解密
|
|
172
|
+
src/qoderUmid.js Qoder 设备身份组件(Linux / fnOS:从官方 qodercli 提取 UMID)
|
|
173
|
+
src/tenrouter.js 10Router 集成:配置、额度总览、用量同步调度
|
|
174
|
+
src/usageSync.js 本机 ZCode / OpenCode / mirasim / MiMo 用量读取(同 10router-sync 插件口径)
|
|
175
|
+
src/providers.js 产品线注册表:按 provider 分发领取 / 积分 / 校验
|
|
176
|
+
src/workbuddyClient.js WorkBuddy API:领取、积分、token 刷新
|
|
177
|
+
src/workbuddyLocal.js 本机 WorkBuddy 会话读取与账号切换
|
|
178
|
+
src/zcrypto.js ZCode 本机凭据加解密(enc:v1: AES-256-GCM)
|
|
179
|
+
src/zcodeClient.js ZCode 额度查询 + 活动领取(billing preview/claim、验证码配置、出口切换)
|
|
180
|
+
src/zcodeAutoClaim.js ZCode 活动自动轮询领取(免验证码 → 静默验证码 → 需手动)
|
|
181
|
+
src/zcodeLocal.js 本机 ZCode 凭据读取与账号切换
|
|
182
|
+
desktop/preload.js 桌面版 preload:暴露隐私登录窗口能力
|
|
183
|
+
src/checkin.js 调度器(2h tick + 当日去重 + 本机限领 + 串行执行)
|
|
184
|
+
src/accounts.js 账号新增 / 导入 / 续期的统一入口
|
|
185
|
+
src/transfer.js 导入导出(10router 迁移格式互通)
|
|
186
|
+
src/authDevice.js 浏览器登录统一入口(Qoder 设备码 PKCE + 分发 WorkBuddy / ZCode)
|
|
187
|
+
src/workbuddyAuth.js WorkBuddy / CodeBuddy 浏览器登录
|
|
188
|
+
src/zcodeAuth.js ZCode 浏览器登录(BigModel / Z.ai)
|
|
189
|
+
src/localDetect.js 旧版 IDE / CLI token 扫描
|
|
190
|
+
src/daemon.js 本地 HTTP API + 面板托管
|
|
191
|
+
src/panel.html Web 管理面板
|
|
192
|
+
src/store.js 本机存储(原子写 / 0600 / 串行读改写)
|
|
193
|
+
src/logger.js 环形缓冲日志
|
|
194
|
+
test/ 冒烟测试
|
|
195
|
+
desktop/ Windows 桌面版(Electron 壳)
|
|
196
|
+
fnos-packaging/ fnOS fpk 打包
|
|
197
|
+
|
|
198
|
+
## Windows 桌面版(Electron 壳)
|
|
199
|
+
|
|
200
|
+
Releases 下载 **CreditDaddy-Setup-x.y.z.exe**(安装版)或 **CreditDaddy-Portable-x.y.z.exe**(免安装):
|
|
201
|
+
|
|
202
|
+
- 打开即用:内置 Node daemon,无需单独安装 Node.js
|
|
203
|
+
- 关闭窗口 = 隐藏到托盘,**后台自动领取不中断**;单击托盘图标打开面板,右键菜单可「立即领取 / 开机自启 / 打开数据目录 / 项目主页 / 退出」
|
|
204
|
+
- Windows 10 可能把新图标收在任务栏右下角的 `^` 折叠区,可拖到任务栏常驻
|
|
205
|
+
- 数据存 `%USERPROFILE%\.creditdaddy`(便携版与安装版通用同一数据目录)
|
|
206
|
+
- 从 QoderDaddy 升级:CreditDaddy 是新的应用 ID,会与旧版并存安装;首次启动自动迁移数据,确认无误后请在「应用和功能」卸载 QoderDaddy,避免两个程序同时领取
|
|
207
|
+
|
|
208
|
+
fnOS / NAS 用户请用 **fpk** 包(见 DEPLOY.md,分**标签页版** `creditdaddy-*.fpk` 与**窗口版** `creditdaddy-window-*.fpk`);功能与桌面版一致,面板端口都是 47860。
|
|
209
|
+
|
|
210
|
+
## macOS 桌面版
|
|
211
|
+
|
|
212
|
+
Releases 下载 **mac-CreditDaddy-x.y.z-arm64.dmg**(Apple Silicon)或 **mac-CreditDaddy-x.y.z-x64.dmg**(Intel),另有同名 zip。拖入「应用程序」即可,功能与 Windows 桌面版一致(托盘常驻、内置 daemon、数据存 `~/.creditdaddy`)。未签名:首次打开在「系统设置 → 隐私与安全性」里放行。⚠️ macOS 版由 CI 构建,未在真机验证,问题请提 Issue。
|
|
213
|
+
|
|
214
|
+
## npm 包(Node ≥ 20)
|
|
215
|
+
|
|
216
|
+
```bash
|
|
217
|
+
npm install -g creditdaddy # 全局安装
|
|
218
|
+
creditdaddy daemon # 启动守护进程 + 面板(127.0.0.1:47860)
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
适合 fnOS / Linux / macOS 上只想跑 daemon + 面板的场景(fpk 之外的另一条路)。核心零依赖,bin/src 原样打包。
|
|
222
|
+
|
|
223
|
+
## 开发
|
|
224
|
+
|
|
225
|
+
npm test # 运行测试(node --test,零依赖)
|
|
226
|
+
npm start # 启动守护进程
|
|
227
|
+
cd desktop && npm install && npx electron . # 本地运行桌面壳(直接使用仓库源码)
|
|
228
|
+
|
|
229
|
+
推送 / PR 会在 GitHub Actions 上跑测试(Ubuntu + Windows,Node 20 / 24)。
|
|
230
|
+
发版:同步修改 `package.json`、`desktop/package.json`、`fnos-packaging/manifest` 的版本号后打 `v*` tag。
|
|
231
|
+
|
|
232
|
+
## License
|
|
233
|
+
|
|
234
|
+
MIT
|
package/bin/creditdaddy.js
CHANGED
|
@@ -4,10 +4,10 @@
|
|
|
4
4
|
* creditdaddy daemon 启动守护进程(默认)
|
|
5
5
|
* creditdaddy add <token> 添加账号(--cn 国内版 --name 名字)
|
|
6
6
|
* creditdaddy list 查看账号
|
|
7
|
-
* creditdaddy checkin
|
|
7
|
+
* creditdaddy checkin 立即领取全部账号
|
|
8
8
|
* creditdaddy remove <id> 删除账号
|
|
9
9
|
* creditdaddy export/import 导出/导入账号
|
|
10
|
-
* creditdaddy logs
|
|
10
|
+
* creditdaddy logs 查看领取状态(state.json)
|
|
11
11
|
* creditdaddy help 显示帮助
|
|
12
12
|
*/
|
|
13
13
|
|
|
@@ -17,21 +17,21 @@ import { logger } from '../src/logger.js';
|
|
|
17
17
|
const args = process.argv.slice(2);
|
|
18
18
|
const cmd = args[0] || 'daemon';
|
|
19
19
|
|
|
20
|
-
const HELP = `CreditDaddy — Qoder / WorkBuddy / ZCode 多账号管理 +
|
|
20
|
+
const HELP = `CreditDaddy — Qoder / WorkBuddy / ZCode 多账号管理 + 每日积分自动领取
|
|
21
21
|
|
|
22
22
|
用法:
|
|
23
23
|
creditdaddy daemon [--port 47860] [--host 127.0.0.1] 启动守护进程 + Web 面板
|
|
24
24
|
creditdaddy add <token> [--cn] [--name 名字] 添加 Qoder 账号(--cn 为国内版)
|
|
25
25
|
creditdaddy add <token> --workbuddy [--intl] 添加 WorkBuddy 账号(登录 token)
|
|
26
26
|
creditdaddy list 查看账号
|
|
27
|
-
creditdaddy checkin [--cn | --intl]
|
|
27
|
+
creditdaddy checkin [--cn | --intl] 立即领取
|
|
28
28
|
creditdaddy remove <id前缀> 删除账号
|
|
29
29
|
creditdaddy export [file.json] [--password 口令] [--cn|--intl]
|
|
30
30
|
导出账号;带口令则加密(与 10router 迁移文件互通)
|
|
31
31
|
creditdaddy import <file.json> [--password 口令] 导入 CreditDaddy / 10router 导出文件
|
|
32
32
|
creditdaddy scan 导入本机 Qoder / WorkBuddy / ZCode 客户端已登录的账号
|
|
33
|
-
creditdaddy umid [install|remove] Qoder 设备身份组件(Linux / fnOS
|
|
34
|
-
creditdaddy logs
|
|
33
|
+
creditdaddy umid [install|remove] Qoder 设备身份组件(Linux / fnOS 国际版领取用)
|
|
34
|
+
creditdaddy logs 查看领取状态
|
|
35
35
|
creditdaddy help 显示本帮助`;
|
|
36
36
|
|
|
37
37
|
function flag(name) {
|
|
@@ -71,7 +71,7 @@ async function main() {
|
|
|
71
71
|
if (accounts.length === 0) return console.log('(还没有账号,用 creditdaddy add <token> 添加)');
|
|
72
72
|
for (const a of accounts) {
|
|
73
73
|
const p = publicAccount(a);
|
|
74
|
-
console.log(`[${p.id.slice(0, 8)}] ${(p.name || '(未命名)').padEnd(16)} ${p.provider.padEnd(14)} ${p.tokenMasked} ${p.lastCheckin ? '
|
|
74
|
+
console.log(`[${p.id.slice(0, 8)}] ${(p.name || '(未命名)').padEnd(16)} ${p.provider.padEnd(14)} ${p.tokenMasked} ${p.lastCheckin ? '上次领取 ' + p.lastCheckin.slice(0, 16) : '未领取'}`);
|
|
75
75
|
}
|
|
76
76
|
break;
|
|
77
77
|
}
|
|
@@ -156,7 +156,7 @@ async function main() {
|
|
|
156
156
|
if (sub === 'install') {
|
|
157
157
|
console.log('正在从 npm 下载官方 @qoder-ai/qodercli 并提取设备身份组件(约 30MB)…');
|
|
158
158
|
const m = await umid.installUmid();
|
|
159
|
-
console.log(`✓ 已安装:qodercli ${m.version} / ${m.arch},Qoder
|
|
159
|
+
console.log(`✓ 已安装:qodercli ${m.version} / ${m.arch},Qoder 国际版领取可用`);
|
|
160
160
|
} else if (sub === 'remove') {
|
|
161
161
|
umid.removeUmid();
|
|
162
162
|
console.log('✓ 已移除设备身份组件');
|
|
@@ -164,7 +164,7 @@ async function main() {
|
|
|
164
164
|
const info = umid.umidInfo();
|
|
165
165
|
if (!info.supported) console.log('当前平台不需要该组件(Windows / macOS 使用 Qoder 客户端自带的 runtime-info)');
|
|
166
166
|
else if (info.installed) console.log(`已安装:qodercli ${info.installed.version} / ${info.installed.arch}(${info.installed.installedAt.slice(0, 10)})`);
|
|
167
|
-
else console.log('未安装。运行 creditdaddy umid install
|
|
167
|
+
else console.log('未安装。运行 creditdaddy umid install 安装后即可领取 Qoder 国际版');
|
|
168
168
|
}
|
|
169
169
|
break;
|
|
170
170
|
}
|