creditdaddy 1.6.2 → 1.6.5

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 CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  # CreditDaddy
6
6
 
7
- **AI 编程工具多账号本地管理 + 每日积分自动领取(领鸡蛋)助手:Qoder · WorkBuddy · ZCode · mirasim · 妙手 · Trae · MiniMax · ModelScope,集成 10Router 额度总览、用量同步与网页会话额度卡(Token Harbor / 小米 MiMo / River / ModelScope 魔搭 / LongCat)**
7
+ **AI 编程工具多账号本地管理 + 每日积分自动领取(领鸡蛋)助手:Qoder · WorkBuddy · ZCode · mirasim · 妙手 · Trae · MiniMax · ModelScope · 豆包,集成 10Router 额度总览、用量同步与网页会话额度卡(Token Harbor / 小米 MiMo / River / ModelScope 魔搭 / LongCat)**
8
8
 
9
9
  [![Release](https://img.shields.io/github/v/release/techysy/CreditDaddy?label=%E7%89%88%E6%9C%AC&color=2563eb)](https://github.com/techysy/CreditDaddy/releases/latest)
10
10
  [![CI](https://img.shields.io/github/actions/workflow/status/techysy/CreditDaddy/ci.yml?branch=main&label=CI)](https://github.com/techysy/CreditDaddy/actions/workflows/ci.yml)
@@ -52,6 +52,23 @@ function panelUrl(host, port) {
52
52
  return `http://${h}:${port}`;
53
53
  }
54
54
 
55
+ /**
56
+ * 改账号/状态的命令(add / import / checkin / remove / scan)在 daemon 活着时必须拒绝:
57
+ * withAccounts 的串行队列只在单进程内有效,CLI 进程基于旧快照整份写回,会把 daemon
58
+ * 刚轮换掉的 refreshToken / 刚写的签到水位冲掉(凭据链当场作废——refreshGuard 事故同款)。
59
+ */
60
+ async function assertDaemonNotRunning() {
61
+ const { statusRuntime } = await import('../src/bgdaemon.js');
62
+ let s;
63
+ try { s = await statusRuntime(); } catch { return; } // 状态探测不了就不拦(保持旧行为)
64
+ if (s.running) {
65
+ console.error(`✗ 检测到后台 daemon 正在运行(pid ${s.pid},端口 ${s.port})。`);
66
+ console.error(' 两个进程同时写 accounts.json / state.json 会互相覆盖(凭据/签到记录丢失)。');
67
+ console.error(' 请改用面板里的对应操作,或先 creditdaddy stop 再执行本命令。');
68
+ process.exit(1);
69
+ }
70
+ }
71
+
55
72
  /** 把运行时长说成人话(status 用) */
56
73
  function humanUptime(ms) {
57
74
  if (!Number.isFinite(ms) || ms < 0) return '未知';
@@ -181,6 +198,7 @@ async function main() {
181
198
  break;
182
199
  }
183
200
  case 'add': {
201
+ await assertDaemonNotRunning();
184
202
  const token = args[1];
185
203
  if (!token) { console.error('用法: creditdaddy add <token> [--cn] [--name 名字]'); process.exit(1); }
186
204
  const { publicAccount } = await import('../src/store.js');
@@ -206,6 +224,7 @@ async function main() {
206
224
  break;
207
225
  }
208
226
  case 'checkin': {
227
+ await assertDaemonNotRunning();
209
228
  const { runCheckinTick } = await import('../src/checkin.js');
210
229
  const provider = args.includes('--workbuddy')
211
230
  ? (args.includes('--intl') ? 'workbuddy-intl' : 'workbuddy')
@@ -218,6 +237,7 @@ async function main() {
218
237
  break;
219
238
  }
220
239
  case 'remove': {
240
+ await assertDaemonNotRunning();
221
241
  const id = args[1];
222
242
  if (!id) { console.error('用法: creditdaddy remove <id前缀>(id 见 creditdaddy list)'); process.exit(1); }
223
243
  const { withAccounts } = await import('../src/store.js');
@@ -259,6 +279,7 @@ async function main() {
259
279
  break;
260
280
  }
261
281
  case 'import': {
282
+ await assertDaemonNotRunning();
262
283
  const file = args[1];
263
284
  if (!file) { console.error('用法: creditdaddy import <file.json>'); process.exit(1); }
264
285
  const { readFileSync } = await import('node:fs');
@@ -283,6 +304,7 @@ async function main() {
283
304
  break;
284
305
  }
285
306
  case 'scan': {
307
+ await assertDaemonNotRunning();
286
308
  const { readQoderAppAccounts } = await import('../src/qoderApp.js');
287
309
  const { readWorkbuddySessions } = await import('../src/workbuddyLocal.js');
288
310
  const { liveToAccount: zcodeLive } = await import('../src/zcodeLocal.js');
package/build.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
- "version": "1.6.2",
3
- "commit": "79b48f0",
2
+ "version": "1.6.5",
3
+ "commit": "ad9240e",
4
4
  "branch": "main",
5
- "builtAt": "2026-10-28T00:45:02.695Z",
5
+ "builtAt": "2026-11-01T12:17:18.319Z",
6
6
  "channel": "local",
7
7
  "dirty": false
8
8
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "creditdaddy",
3
- "version": "1.6.2",
4
- "description": "CreditDaddy — Qoder / WorkBuddy / ZCode / mirasim / 妙手 / Trae / MiniMax / ModelScope 多账号本地管理与每日积分自动签到助手,及 10Router 供应商 Cookie 会话捕获与外部配额(Token Harbor / 小米 MiMo / River / ModelScope 魔搭 / LongCat)",
3
+ "version": "1.6.5",
4
+ "description": "CreditDaddy — Qoder / WorkBuddy / ZCode / mirasim / 妙手 / Trae / MiniMax / ModelScope / 豆包 多账号本地管理与每日积分自动签到助手,及 10Router 供应商 Cookie 会话捕获与外部配额(Token Harbor / 小米 MiMo / River / ModelScope 魔搭 / LongCat)",
5
5
  "homepage": "https://github.com/techysy/CreditDaddy",
6
6
  "repository": {
7
7
  "type": "git",
package/src/checkin.js CHANGED
@@ -190,6 +190,10 @@ function runZcodeTick(accountIds, { force = false } = {}) {
190
190
  return { results, summary: zcodeLastTick.summary };
191
191
  } finally {
192
192
  zcodeTicking = false;
193
+ // 手动轮(pollZcodeNow)结束时不会像定时轮那样 .finally 里补排下一个 tick;
194
+ // 若手动轮进行中用户刚开启自动领取,syncZcodeScheduler 又因 zcodeTicking=true
195
+ // 跳过了排程——这里兜底补排(内部先清旧句柄,重复调用无害),否则自动领取静默死掉
196
+ if (autoClaimEnabled()) scheduleZcodeNextTick();
193
197
  }
194
198
  });
195
199
  zcodeQueue = run.catch(() => {});
package/src/constants.js CHANGED
@@ -35,7 +35,7 @@ export const WEB_USAGE_PATH = '/api/v2/me/usages/big_model_credits';
35
35
  export const JOB_TOKEN_EXCHANGE_PATH = '/api/v1/jobToken/exchange';
36
36
 
37
37
  // 账号的 provider = 产品 + 区域。新增产品时在此登记,并在 providers.js 挂上对应实现。
38
- export const PROVIDERS = ['qoder', 'qoder-cn', 'workbuddy', 'workbuddy-intl', 'zcode', 'mirasim', 'catpaw', 'trae', 'minimax', 'tokenharbor', 'xiaomi-mimo', 'river', 'modelscope', 'longcat', 'doubao'];
38
+ export const PROVIDERS = ['qoder', 'qoder-cn', 'workbuddy', 'workbuddy-intl', 'zcode', 'mirasim', 'catpaw', 'trae', 'minimax', 'tokenharbor', 'xiaomi-mimo', 'river', 'modelscope', 'longcat', 'doubao', 'loomy'];
39
39
  export const PROVIDER_LABEL = {
40
40
  qoder: 'Qoder 国际版',
41
41
  'qoder-cn': 'Qoder 国内版',
@@ -52,6 +52,7 @@ export const PROVIDER_LABEL = {
52
52
  modelscope: 'ModelScope 魔搭',
53
53
  longcat: 'LongCat',
54
54
  doubao: '豆包',
55
+ loomy: '讯飞 Loomy',
55
56
  };
56
57
  /** provider → 产品线(qoder / workbuddy / zcode / mirasim / catpaw / trae / minimax / tokenharbor / xiaomi-mimo / river) */
57
58
  export const productOf = (provider) => {
@@ -68,6 +69,7 @@ export const productOf = (provider) => {
68
69
  if (p === 'modelscope') return 'modelscope';
69
70
  if (p === 'longcat') return 'longcat';
70
71
  if (p === 'doubao') return 'doubao';
72
+ if (p === 'loomy') return 'loomy';
71
73
  return 'qoder';
72
74
  };
73
75
  /** provider 是否国内版 */
@@ -169,7 +169,14 @@ export const COOKIE_SITES = [
169
169
  // 只在面板出示快捷按钮。
170
170
  entryOnly: true, // 只出「打开豆包」按钮,无会话捕获 / 无探测 / 无账号行
171
171
  hint: '在豆包客户端(或网页)登录后捕获会话,CD 只读展示体验额度与每日签到状态(+200/天);签到请在「打开豆包」里手动完成——活动在客户端内,CD 不代签;仅个人账号可参与(飞书企业号被排除),凭据只存本机。'
172
- }
172
+ },
173
+ // ⚠ 码道 CodeArts(issue #40)已于 2026-10-30 撤下,不再提供:
174
+ // 华为云控制台会话受闲置超时 + WAF 指印(HWWAFSESID / browserCheckResult)绑定,
175
+ // 浏览器里能靠 SPA 持续续期,本机无法续 —— 实测新鲜会话当日内即失效(网关回登录页),
176
+ // 且登录窗关早一拍只能收到残缺会话(35 条 vs 完整 47 条)。
177
+ // 签到要求「每天固定时刻会话有效」,而该会话有效期以小时计 —— 维持它需要用户每天
178
+ // 重登一次浏览器,那就失去自动化意义。叠加新号可能接到推广电话,按「臭鸡蛋标准」撤下。
179
+ // 若日后码道开放长期凭据(AK/SK 或 OAuth refresh),可按既有 cookieSites 结构重新接入。
173
180
  ];
174
181
 
175
182
  export const getSite = (id) => COOKIE_SITES.find((s) => s.id === id) || null;