creditdaddy 1.6.0 → 1.6.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.
@@ -0,0 +1,17 @@
1
+ /**
2
+ * 冷却时长的人类可读格式(三个网关共用)。
3
+ * 30_000 → '30 秒'
4
+ * 60_000 → '1 分钟'
5
+ * 120_000 → '2 分钟'
6
+ * 240_000 → '4 分钟'
7
+ * 不足 1 分钟的按秒显示,否则 30s 会被 Math.round 抹成「1 分钟」(或与 0 混淆)。
8
+ */
9
+ export function formatDurationMs(ms) {
10
+ // 冷却截止是 Date.now() + ms 算出来的,正常不会异常;但 NaN / Infinity 直接进模板
11
+ // 会渲染成「NaN 分钟」这种鬼东西,这里统一兜成 0 秒
12
+ const finite = Number.isFinite(ms) ? ms : 0;
13
+ const s = Math.max(0, Math.round(finite / 1000));
14
+ if (s < 60) return `${s} 秒`;
15
+ const m = Math.round(s / 60);
16
+ return `${m} 分钟`;
17
+ }
package/src/i18n/en.json CHANGED
@@ -1,4 +1,5 @@
1
1
  {
2
+ "本机未安装 WorkBuddy / CodeBuddy 客户端,无法切换(切换是把登录写入客户端凭据,由客户端应用;可先安装客户端后在本机导入再切换)": "WorkBuddy / CodeBuddy client is not installed on this machine; cannot switch (switching writes the login into client credentials for the client to apply; install the client, sign in, then import locally before switching)",
2
3
  "\n\n仍要强制切换吗?强制切换会先关闭客户端再写入登录,重新打开客户端即为新账号。": "\n\nForce the switch anyway? Forcing closes the client first, then writes the login; reopen the client to use the new account.",
3
4
  "\n客户端会自动应用新会话;当前登录账号的最新 token 会先保存到 CreditDaddy。": "\nThe client will apply the new session automatically; the latest token of the currently signed-in account is saved to CreditDaddy first.",
4
5
  "\n需先退出 Mirasim;切换后重新打开即为新账号。当前登录会先保存到 CreditDaddy,不会丢号。": "\nNeed to quit Mirasim first; after switching, reopen it to use the new account. The current login is saved to CreditDaddy first, so no account is lost.",
@@ -1130,6 +1131,7 @@
1130
1131
  "已开启": "On",
1131
1132
  "已连接 {n} 个账号": "{n} accounts connected",
1132
1133
  "已领过": "Already claimed",
1134
+ "已领取": "Claimed",
1133
1135
  "已启动 MiniMax Code 客户端": "MiniMax Code client started",
1134
1136
  "已启动 Mirasim 客户端": "Started Mirasim client",
1135
1137
  "已启动 Trae 客户端": "Started Trae client",
@@ -1704,5 +1706,29 @@
1704
1706
  "🔧 移除": "🔧 Removed",
1705
1707
  "修复": "Fixed",
1706
1708
  "新功能": "New",
1707
- "移除": "Removed"
1709
+ "移除": "Removed",
1710
+ "到账": "arrives",
1711
+ "即将到账": "arriving soon",
1712
+ "更新 Qoder 快照路径失败:{err}": "Failed to update Qoder snapshot path: {err}",
1713
+ "<span class=\"lbl\">待生效</span>": "<span class=\"lbl\">Pending</span>",
1714
+ "已重新启动 Qoder 客户端": "Qoder client relaunched",
1715
+ "无法打开 Qoder 客户端(桌面版才能自动拉起)": "Cannot open Qoder client (auto-launch requires the desktop app)",
1716
+ "未找到 Qoder 客户端可执行文件": "Qoder client executable not found",
1717
+ "账号管理": "Accounts",
1718
+ "账号同步与网页会话 Cookie 捕获": "Account sync and web-session cookie capture",
1719
+ "把本机 Qoder / WorkBuddy 账号推为 10Router 上游连接。": "Push local Qoder / WorkBuddy accounts to 10Router as upstream connections.",
1720
+ "填 10Router 面板密码,走 OAuth 通道(带 refreshToken 自动续期);不填则按已保存的走": "Enter the 10Router admin password to use the OAuth channel (keeps refreshToken for auto-renewal); leave blank to use the saved one",
1721
+ "同步账号中…": "Syncing accounts…",
1722
+ "<span class=\"pill gw\" title=\"体验包接口最近一次补全用的账号({n} 个 ZCode 账号按轮转分摊请求,每个请求换一个,与客户端登录无关)\">接口使用中</span>": "<span class=\"pill gw\" title=\"Pack API last used this account ({n} ZCode accounts share requests by rotation, one per request, independent of client login)\">In use by API</span>",
1723
+ "<span class=\"pill gw\" title=\"体验包接口最近一次补全用的账号(多账号时按轮转自动选择,与客户端登录无关)\">接口使用中</span>": "<span class=\"pill gw\" title=\"Pack API last used this account (auto-selected by rotation with multiple accounts, independent of client login)\">In use by API</span>",
1724
+ "<div class=\"z-row\"><span class=\"z-label\">客户端</span><span class=\"z-text\">本机未安装 WorkBuddy / CodeBuddy 客户端:Token 导入、额度读取与每日领取不受影响;但「切换账号」需要本机客户端(切换是写入客户端凭据由其应用)。请先安装并登录客户端,再「本机导入」。</span></div>": "<div class=\"z-row\"><span class=\"z-label\">Client</span><span class=\"z-text\">WorkBuddy / CodeBuddy client is not installed on this machine: token import, quota reading and daily claiming are unaffected, but account switching requires the local client (switching writes client credentials for it to apply). Install and sign in to the client first, then use local import.</span></div>",
1725
+ "本机未安装 WorkBuddy / CodeBuddy 客户端,无法切换:切换是把登录写入客户端凭据,由客户端应用。请先安装客户端并登录,再「本机导入」。": "WorkBuddy / CodeBuddy client is not installed on this machine; cannot switch: switching writes the login into client credentials for the client to apply. Install and sign in to the client first, then use local import.",
1726
+ "{label} 429 限流,冷却 {dur}(连续第 {streak} 次)": "{label} rate limited (429), cooling {dur} (consecutive #{streak})",
1727
+ "{label} 429 限流(事件流),冷却 {dur}(连续第 {streak} 次)": "{label} rate limited (429, event stream), cooling {dur} (consecutive #{streak})",
1728
+ "账号同步已关闭(账号管理弹窗可重新开启)": "Account sync is disabled (re-enable it in the Account Management dialog)",
1729
+ "该渠道的额度卡推送已关闭(CreditDaddy 账号管理弹窗可重新开启)": "Quota card push for this channel is disabled (re-enable it in the Account Management dialog of CreditDaddy)",
1730
+ "> <span class=\"dim\">连接</span></label>": "> <span class=\"dim\">conn</span></label>",
1731
+ "勾选 = 同步该渠道(「连接」= 账号连接;主勾 = 额度卡推送)。10Router 已单独配了同源渠道时,取消对应渠道即可去掉重复卡片。": "Checked = sync this channel (\"conn\" = account connections; main checkbox = quota card push). If 10Router already has a same-source channel configured, untick it here to remove the duplicate card.",
1732
+ "保存渠道设置": "Save channel settings",
1733
+ "渠道同步设置已保存": "Channel sync settings saved"
1708
1734
  }
package/src/i18n/ja.json CHANGED
@@ -1,4 +1,5 @@
1
1
  {
2
+ "本机未安装 WorkBuddy / CodeBuddy 客户端,无法切换(切换是把登录写入客户端凭据,由客户端应用;可先安装客户端后在本机导入再切换)": "このマシンに WorkBuddy / CodeBuddy クライアントがインストールされていないため切り替えられません(切り替えはクライアントの認証情報に書き込み、クライアントが適用します。先にクライアントをインストールしてログインし、「このマシンからインポート」してください)",
2
3
  "\n\n仍要强制切换吗?强制切换会先关闭客户端再写入登录,重新打开客户端即为新账号。": "\n\nそれでも強制的に切り替えますか?強制切り替えでは、先にクライアントを閉じてからログインを書き込みます。クライアントを開き直すと新しいアカウントになります。",
3
4
  "\n客户端会自动应用新会话;当前登录账号的最新 token 会先保存到 CreditDaddy。": "\nクライアントは新しいセッションを自動で適用します。現在ログイン中のアカウントの最新トークンは先に CreditDaddy に保存されます。",
4
5
  "\n需先退出 Mirasim;切换后重新打开即为新账号。当前登录会先保存到 CreditDaddy,不会丢号。": "\n先に Mirasim を終了してください。切り替え後に開き直すと新しいアカウントになります。現在のログインは先に CreditDaddy に保存されるため、アカウントは失われません。",
@@ -1130,6 +1131,7 @@
1130
1131
  "已开启": "オン",
1131
1132
  "已连接 {n} 个账号": "{n} 件のアカウントに接続済み",
1132
1133
  "已领过": "受け取り済み",
1134
+ "已领取": "受け取り済み",
1133
1135
  "已启动 MiniMax Code 客户端": "MiniMax Code クライアントを起動しました",
1134
1136
  "已启动 Mirasim 客户端": "Mirasim クライアントを起動しました",
1135
1137
  "已启动 Trae 客户端": "Trae クライアントを起動しました",
@@ -1704,5 +1706,29 @@
1704
1706
  "🔧 移除": "🔧 削除",
1705
1707
  "修复": "修正",
1706
1708
  "新功能": "新機能",
1707
- "移除": "削除"
1709
+ "移除": "削除",
1710
+ "到账": "付与",
1711
+ "即将到账": "まもなく付与",
1712
+ "更新 Qoder 快照路径失败:{err}": "Qoder スナップショットパスの更新に失敗しました: {err}",
1713
+ "<span class=\"lbl\">待生效</span>": "<span class=\"lbl\">有効化待ち</span>",
1714
+ "已重新启动 Qoder 客户端": "Qoder クライアントを再起動しました",
1715
+ "无法打开 Qoder 客户端(桌面版才能自动拉起)": "Qoder クライアントを開けません(自動起動はデスクトップ版のみ)",
1716
+ "未找到 Qoder 客户端可执行文件": "Qoder クライアントの実行ファイルが見つかりません",
1717
+ "账号管理": "アカウント管理",
1718
+ "账号同步与网页会话 Cookie 捕获": "アカウント同期と Web セッション Cookie の取得",
1719
+ "把本机 Qoder / WorkBuddy 账号推为 10Router 上游连接。": "ローカルの Qoder / WorkBuddy アカウントを 10Router の上流接続として登録します。",
1720
+ "填 10Router 面板密码,走 OAuth 通道(带 refreshToken 自动续期);不填则按已保存的走": "10Router の管理パスワードを入力すると OAuth 経路(refreshToken で自動更新)を使います。空欄なら保存済みのものを使います",
1721
+ "同步账号中…": "アカウントを同期中…",
1722
+ "<span class=\"pill gw\" title=\"体验包接口最近一次补全用的账号({n} 个 ZCode 账号按轮转分摊请求,每个请求换一个,与客户端登录无关)\">接口使用中</span>": "<span class=\"pill gw\" title=\"体験パック API が最後に補完に使ったアカウント({n} 個の ZCode アカウントがローテーションでリクエストを分担、1リクエストごとに交代。クライアントのログインとは無関係)\">API 使用中</span>",
1723
+ "<span class=\"pill gw\" title=\"体验包接口最近一次补全用的账号(多账号时按轮转自动选择,与客户端登录无关)\">接口使用中</span>": "<span class=\"pill gw\" title=\"体験パック API が最後に補完に使ったアカウント(複数アカウント時はローテーションで自動選択。クライアントのログインとは無関係)\">API 使用中</span>",
1724
+ "<div class=\"z-row\"><span class=\"z-label\">客户端</span><span class=\"z-text\">本机未安装 WorkBuddy / CodeBuddy 客户端:Token 导入、额度读取与每日领取不受影响;但「切换账号」需要本机客户端(切换是写入客户端凭据由其应用)。请先安装并登录客户端,再「本机导入」。</span></div>": "<div class=\"z-row\"><span class=\"z-label\">クライアント</span><span class=\"z-text\">このマシンに WorkBuddy / CodeBuddy クライアントが未インストールです:トークン取り込み・残高取得・毎日の受け取りは影響ありませんが、「アカウント切り替え」にはローカル クライアントが必要です(切り替えはクライアントの認証情報への書き込みで、クライアントが適用します)。先にクライアントをインストールしてログインし、「このマシンからインポート」してください。</span></div>",
1725
+ "本机未安装 WorkBuddy / CodeBuddy 客户端,无法切换:切换是把登录写入客户端凭据,由客户端应用。请先安装客户端并登录,再「本机导入」。": "このマシンに WorkBuddy / CodeBuddy クライアントがインストールされていないため切り替えられません:切り替えはクライアントの認証情報に書き込み、クライアントが適用します。先にクライアントをインストールしてログインし、「このマシンからインポート」してください。",
1726
+ "{label} 429 限流,冷却 {dur}(连续第 {streak} 次)": "{label} がレート制限 (429)、{dur} 冷却 (連続 {streak} 回目)",
1727
+ "{label} 429 限流(事件流),冷却 {dur}(连续第 {streak} 次)": "{label} がレート制限 (429、イベントストリーム)、{dur} 冷却 (連続 {streak} 回目)",
1728
+ "账号同步已关闭(账号管理弹窗可重新开启)": "アカウント同期は無効です(アカウント管理ダイアログで再開できます)",
1729
+ "该渠道的额度卡推送已关闭(CreditDaddy 账号管理弹窗可重新开启)": "このチャネルの残高カード推送は無効です(CreditDaddy のアカウント管理ダイアログで再開できます)",
1730
+ "> <span class=\"dim\">连接</span></label>": "> <span class=\"dim\">接続</span></label>",
1731
+ "勾选 = 同步该渠道(「连接」= 账号连接;主勾 = 额度卡推送)。10Router 已单独配了同源渠道时,取消对应渠道即可去掉重复卡片。": "チェック = このチャネルを同期(「接続」= アカウント接続、メインチェック = 残高カード推送)。10Router に同ソースのチャネルが既にある場合は、ここで外せば重複カードをなくせます。",
1732
+ "保存渠道设置": "チャネル設定を保存",
1733
+ "渠道同步设置已保存": "チャネル同期設定を保存しました"
1708
1734
  }
package/src/i18n/ko.json CHANGED
@@ -1,4 +1,5 @@
1
1
  {
2
+ "本机未安装 WorkBuddy / CodeBuddy 客户端,无法切换(切换是把登录写入客户端凭据,由客户端应用;可先安装客户端后在本机导入再切换)": "이 컴퓨터에 WorkBuddy / CodeBuddy 클라이언트가 설치되어 있지 않아 전환할 수 없습니다(전환은 클라이언트 자격 증명에 로그인을 기록하며 클라이언트가 적용합니다. 먼저 클라이언트를 설치하고 로그인한 뒤 로컬 가져오기를 이용하세요)",
2
3
  "\n\n仍要强制切换吗?强制切换会先关闭客户端再写入登录,重新打开客户端即为新账号。": "\n\n그래도 강제로 전환할까요? 강제 전환은 먼저 클라이언트를 닫은 뒤 로그인을 기록합니다. 클라이언트를 다시 열면 새 계정이 됩니다.",
3
4
  "\n客户端会自动应用新会话;当前登录账号的最新 token 会先保存到 CreditDaddy。": "\n클라이언트가 새 세션을 자동으로 적용합니다. 현재 로그인된 계정의 최신 토큰은 먼저 CreditDaddy에 저장됩니다.",
4
5
  "\n需先退出 Mirasim;切换后重新打开即为新账号。当前登录会先保存到 CreditDaddy,不会丢号。": "\n먼저 Mirasim을 종료하세요. 전환 후 다시 열면 새 계정이 됩니다. 현재 로그인은 먼저 CreditDaddy에 저장되므로 계정이 사라지지 않습니다.",
@@ -1130,6 +1131,7 @@
1130
1131
  "已开启": "켜짐",
1131
1132
  "已连接 {n} 个账号": "계정 {n}개 연결됨",
1132
1133
  "已领过": "이미 수령함",
1134
+ "已领取": "수령 완료",
1133
1135
  "已启动 MiniMax Code 客户端": "MiniMax Code 클라이언트를 시작했습니다",
1134
1136
  "已启动 Mirasim 客户端": "Mirasim 클라이언트를 시작함",
1135
1137
  "已启动 Trae 客户端": "Trae 클라이언트를 시작함",
@@ -1704,5 +1706,29 @@
1704
1706
  "🔧 移除": "🔧 제거",
1705
1707
  "修复": "수정",
1706
1708
  "新功能": "새 기능",
1707
- "移除": "제거"
1709
+ "移除": "제거",
1710
+ "到账": "지급",
1711
+ "即将到账": "곧 지급",
1712
+ "更新 Qoder 快照路径失败:{err}": "Qoder 스냅샷 경로 업데이트 실패: {err}",
1713
+ "<span class=\"lbl\">待生效</span>": "<span class=\"lbl\">적용 대기</span>",
1714
+ "已重新启动 Qoder 客户端": "Qoder 클라이언트를 다시 시작했습니다",
1715
+ "无法打开 Qoder 客户端(桌面版才能自动拉起)": "Qoder 클라이언트를 열 수 없습니다(자동 실행은 데스크톱 앱만 지원)",
1716
+ "未找到 Qoder 客户端可执行文件": "Qoder 클라이언트 실행 파일을 찾을 수 없습니다",
1717
+ "账号管理": "계정 관리",
1718
+ "账号同步与网页会话 Cookie 捕获": "계정 동기화 및 웹 세션 쿠키 캡처",
1719
+ "把本机 Qoder / WorkBuddy 账号推为 10Router 上游连接。": "로컬 Qoder / WorkBuddy 계정을 10Router 업스트림 연결로 등록합니다.",
1720
+ "填 10Router 面板密码,走 OAuth 通道(带 refreshToken 自动续期);不填则按已保存的走": "10Router 관리자 비밀번호를 입력하면 OAuth 경로(refreshToken 자동 갱신)를 사용합니다. 비우면 저장된 값을 사용합니다",
1721
+ "同步账号中…": "계정 동기화 중…",
1722
+ "<span class=\"pill gw\" title=\"体验包接口最近一次补全用的账号({n} 个 ZCode 账号按轮转分摊请求,每个请求换一个,与客户端登录无关)\">接口使用中</span>": "<span class=\"pill gw\" title=\"팩 API가 마지막으로 완성에 사용한 계정({n}개 ZCode 계정이 로테이션으로 요청을 분산, 요청마다 교체. 클라이언트 로그인과 무관)\">API 사용 중</span>",
1723
+ "<span class=\"pill gw\" title=\"体验包接口最近一次补全用的账号(多账号时按轮转自动选择,与客户端登录无关)\">接口使用中</span>": "<span class=\"pill gw\" title=\"팩 API가 마지막으로 완성에 사용한 계정(다중 계정 시 로테이션으로 자동 선택. 클라이언트 로그인과 무관)\">API 사용 중</span>",
1724
+ "<div class=\"z-row\"><span class=\"z-label\">客户端</span><span class=\"z-text\">本机未安装 WorkBuddy / CodeBuddy 客户端:Token 导入、额度读取与每日领取不受影响;但「切换账号」需要本机客户端(切换是写入客户端凭据由其应用)。请先安装并登录客户端,再「本机导入」。</span></div>": "<div class=\"z-row\"><span class=\"z-label\">클라이언트</span><span class=\"z-text\">이 컴퓨터에 WorkBuddy / CodeBuddy 클라이언트가 설치되어 있지 않습니다: 토큰 가져오기·잔액 조회·매일 수령은 영향 없지만, 계정 전환에는 로컬 클라이언트가 필요합니다(전환은 클라이언트 자격 증명에 기록하며 클라이언트가 적용). 먼저 클라이언트를 설치하고 로그인한 뒤 로컬 가져오기를 이용하세요.</span></div>",
1725
+ "本机未安装 WorkBuddy / CodeBuddy 客户端,无法切换:切换是把登录写入客户端凭据,由客户端应用。请先安装客户端并登录,再「本机导入」。": "이 컴퓨터에 WorkBuddy / CodeBuddy 클라이언트가 설치되어 있지 않아 전환할 수 없습니다: 전환은 클라이언트 자격 증명에 로그인을 기록하며 클라이언트가 적용합니다. 먼저 클라이언트를 설치하고 로그인한 뒤 로컬 가져오기를 이용하세요.",
1726
+ "{label} 429 限流,冷却 {dur}(连续第 {streak} 次)": "{label} 속도 제한 (429), {dur} 쿨링 (연속 {streak}회)",
1727
+ "{label} 429 限流(事件流),冷却 {dur}(连续第 {streak} 次)": "{label} 속도 제한 (429, 이벤트 스트림), {dur} 쿨링 (연속 {streak}회)",
1728
+ "账号同步已关闭(账号管理弹窗可重新开启)": "계정 동기화가 꺼져 있습니다(계정 관리 대화상자에서 다시 켤 수 있음)",
1729
+ "该渠道的额度卡推送已关闭(CreditDaddy 账号管理弹窗可重新开启)": "이 채널의 잔액 카드 푸시가 꺼져 있습니다(CreditDaddy 계정 관리 대화상자에서 다시 켤 수 있음)",
1730
+ "> <span class=\"dim\">连接</span></label>": "> <span class=\"dim\">연결</span></label>",
1731
+ "勾选 = 同步该渠道(「连接」= 账号连接;主勾 = 额度卡推送)。10Router 已单独配了同源渠道时,取消对应渠道即可去掉重复卡片。": "체크 = 이 채널 동기화(\"연결\" = 계정 연결, 메인 체크 = 잔액 카드 푸시). 10Router에 같은 소스 채널이 이미 있으면 여기서 해제하여 중복 카드를 없앨 수 있습니다.",
1732
+ "保存渠道设置": "채널 설정 저장",
1733
+ "渠道同步设置已保存": "채널 동기화 설정이 저장되었습니다"
1708
1734
  }
@@ -1,4 +1,5 @@
1
1
  {
2
+ "本机未安装 WorkBuddy / CodeBuddy 客户端,无法切换(切换是把登录写入客户端凭据,由客户端应用;可先安装客户端后在本机导入再切换)": "本機未安裝 WorkBuddy / CodeBuddy 客戶端,無法切換(切換是把登錄寫入客戶端憑據,由客戶端應用;可先安裝客戶端後在本機導入再切換)",
2
3
  "\n\n仍要强制切换吗?强制切换会先关闭客户端再写入登录,重新打开客户端即为新账号。": "\n\n仍要強制切換嗎?強制切換會先關閉客戶端再寫入登錄,重新打開客戶端即為新賬號。",
3
4
  "\n客户端会自动应用新会话;当前登录账号的最新 token 会先保存到 CreditDaddy。": "\n客戶端會自動應用新會話;當前登錄賬號的最新 token 會先保存到 CreditDaddy。",
4
5
  "\n需先退出 Mirasim;切换后重新打开即为新账号。当前登录会先保存到 CreditDaddy,不会丢号。": "\n需先退出 Mirasim;切換後重新打開即為新賬號。當前登錄會先保存到 CreditDaddy,不會丟號。",
@@ -1130,6 +1131,7 @@
1130
1131
  "已开启": "已開啟",
1131
1132
  "已连接 {n} 个账号": "已連接 {n} 個賬號",
1132
1133
  "已领过": "已領過",
1134
+ "已领取": "已領取",
1133
1135
  "已启动 MiniMax Code 客户端": "已啟動 MiniMax Code 客戶端",
1134
1136
  "已启动 Mirasim 客户端": "已啟動 Mirasim 客戶端",
1135
1137
  "已启动 Trae 客户端": "已啟動 Trae 客戶端",
@@ -1704,5 +1706,29 @@
1704
1706
  "🔧 移除": "🔧 移除",
1705
1707
  "修复": "修復",
1706
1708
  "新功能": "新功能",
1707
- "移除": "移除"
1709
+ "移除": "移除",
1710
+ "到账": "到賬",
1711
+ "即将到账": "即將到賬",
1712
+ "更新 Qoder 快照路径失败:{err}": "更新 Qoder 快照路徑失敗:{err}",
1713
+ "<span class=\"lbl\">待生效</span>": "<span class=\"lbl\">待生效</span>",
1714
+ "已重新启动 Qoder 客户端": "已重新啟動 Qoder 客戶端",
1715
+ "无法打开 Qoder 客户端(桌面版才能自动拉起)": "無法打開 Qoder 客戶端(桌面版才能自動拉起)",
1716
+ "未找到 Qoder 客户端可执行文件": "未找到 Qoder 客戶端可執行文件",
1717
+ "账号管理": "账号管理",
1718
+ "账号同步与网页会话 Cookie 捕获": "賬號同步與網頁會話 Cookie 捕獲",
1719
+ "把本机 Qoder / WorkBuddy 账号推为 10Router 上游连接。": "把本機 Qoder / WorkBuddy 賬號推為 10Router 上游連接。",
1720
+ "填 10Router 面板密码,走 OAuth 通道(带 refreshToken 自动续期);不填则按已保存的走": "填 10Router 面板密碼,走 OAuth 通道(帶 refreshToken 自動續期);不填則按已保存的走",
1721
+ "同步账号中…": "同步賬號中…",
1722
+ "<span class=\"pill gw\" title=\"体验包接口最近一次补全用的账号({n} 个 ZCode 账号按轮转分摊请求,每个请求换一个,与客户端登录无关)\">接口使用中</span>": "<span class=\"pill gw\" title=\"體驗包介面最近一次補全用的帳號({n} 個 ZCode 帳號按輪轉分攤請求,每個請求換一個,與客戶端登入無關)\">介面使用中</span>",
1723
+ "<span class=\"pill gw\" title=\"体验包接口最近一次补全用的账号(多账号时按轮转自动选择,与客户端登录无关)\">接口使用中</span>": "<span class=\"pill gw\" title=\"體驗包介面最近一次補全用的帳號(多帳號時按輪轉自動選擇,與客戶端登入無關)\">介面使用中</span>",
1724
+ "<div class=\"z-row\"><span class=\"z-label\">客户端</span><span class=\"z-text\">本机未安装 WorkBuddy / CodeBuddy 客户端:Token 导入、额度读取与每日领取不受影响;但「切换账号」需要本机客户端(切换是写入客户端凭据由其应用)。请先安装并登录客户端,再「本机导入」。</span></div>": "<div class=\"z-row\"><span class=\"z-label\">客戶端</span><span class=\"z-text\">本機未安裝 WorkBuddy / CodeBuddy 客戶端:Token 導入、額度讀取與每日領取不受影響;但「切換賬號」需要本機客戶端(切換是寫入客戶端憑據由其應用)。請先安裝並登錄客戶端,再「本機導入」。</span></div>",
1725
+ "本机未安装 WorkBuddy / CodeBuddy 客户端,无法切换:切换是把登录写入客户端凭据,由客户端应用。请先安装客户端并登录,再「本机导入」。": "本機未安裝 WorkBuddy / CodeBuddy 客戶端,無法切換:切換是把登錄寫入客戶端憑據,由客戶端應用。請先安裝並登錄客戶端,再「本機導入」。",
1726
+ "{label} 429 限流,冷却 {dur}(连续第 {streak} 次)": "{label} 429 限流,冷卻 {dur}(連續第 {streak} 次)",
1727
+ "{label} 429 限流(事件流),冷却 {dur}(连续第 {streak} 次)": "{label} 429 限流(事件流),冷卻 {dur}(連續第 {streak} 次)",
1728
+ "账号同步已关闭(账号管理弹窗可重新开启)": "賬號同步已關閉(賬號管理彈窗可重新開啟)",
1729
+ "该渠道的额度卡推送已关闭(CreditDaddy 账号管理弹窗可重新开启)": "該渠道的額度卡推送已關閉(CreditDaddy 賬號管理彈窗可重新開啟)",
1730
+ "> <span class=\"dim\">连接</span></label>": "> <span class=\"dim\">連接</span></label>",
1731
+ "勾选 = 同步该渠道(「连接」= 账号连接;主勾 = 额度卡推送)。10Router 已单独配了同源渠道时,取消对应渠道即可去掉重复卡片。": "勾選 = 同步該渠道(「連接」= 賬號連接;主勾 = 額度卡推送)。10Router 已單獨配了同源渠道時,取消對應渠道即可去掉重複卡片。",
1732
+ "保存渠道设置": "保存渠道設置",
1733
+ "渠道同步设置已保存": "渠道同步設置已保存"
1708
1734
  }
@@ -13,9 +13,12 @@
13
13
  * → data.otherLots[] 其余可用包(同形状;expireTime "YYYY-MM-DD HH:mm:ss")
14
14
  * (/commercial/entitlements/token-packs/list 实测返回空分页壳,summary 已含全部字段,不采用)
15
15
  *
16
- * 卡面口径:Balance 汇总行 = 全部 ACTIVE 包 remaining 之和(储值口径 isCreditBalance);
17
- * 逐包明细腿 = currentLot + otherLots 各一行(detailOnly,name 带面值与到期日,
18
- * 排序按 consumeOrder——官方「赠送先扣、近到期先扣」的消耗顺序)。
16
+ * 卡面口径(issue #37 定版「字段即真相」):Balance 汇总行 = 全部 ACTIVE 包
17
+ * remaining 之和(isCreditBalance + summarizesDetail,used/total 推 Σ消耗/Σ总量,
18
+ * 10R 的池条按真实消耗画空段);逐包明细腿 = currentLot + otherLots 各一行
19
+ * (detailOnly,used=consumed、total=包总量、remainingPercentage=剩余%、
20
+ * name 纯文案「获赠资源包/资源包」,到期日走 resetAt),排序按 consumeOrder
21
+ * ——官方「赠送先扣、近到期先扣」的消耗顺序。
19
22
  *
20
23
  * 安全纪律:会话 cookie 只存本机账号库(0600),推 10Router 只带 token 数字标量。
21
24
  */
@@ -160,8 +163,10 @@ export function longcatSnapshot(packs) {
160
163
 
161
164
  /**
162
165
  * 组装 LongCat 资源包的 10Router external-quota 载荷(储值卡 + 逐包明细)。
163
- * - Balance 汇总行 = 全部 ACTIVE 包 remaining 之和(isCreditBalance + summarizesDetail);
164
- * - 逐包明细腿 = 每包一行(detailOnly,name =「面值 · 至 M-DD」类型徽注),0 剩余包也出行;
166
+ * - Balance 汇总行 = 全部 ACTIVE 包 remaining 之和(isCreditBalance + summarizesDetail,
167
+ * used/total 推 Σ消耗/Σ总量——池条据此画消耗空段);
168
+ * - 逐包明细腿 = 每包一行(detailOnly,used=consumed、total=包总量、name 纯文案),
169
+ * 0 剩余包也出行;
165
170
  * - 无可用包(全部耗尽/过期)→ message 状态卡。
166
171
  * @param {object} account meta.longcatPacks(快照)
167
172
  * @param {{ packs?: Array, error?: string, authInvalid?: boolean }} [liveData]
@@ -206,26 +211,30 @@ export function buildLongcatQuotaPayload(account, liveData = null) {
206
211
  const v = Number(n) || 0;
207
212
  return v >= 1e4 ? `${Math.round(v / 1e4 * 100) / 100} 万` : String(v);
208
213
  };
214
+ // 字段即真相(issue #37):used/total/remainingPercentage 推真实数字,
215
+ // name 只做纯文案——10R 渲染链自会出倒计时、剩余/总量与消耗百分比,
216
+ // 数字拼进 name 只会让卡面同一数值印两遍、进度条与文字互相矛盾。
217
+ const pct1 = (rem, tot) => (tot > 0 ? Math.max(0, Math.min(100, Math.round((rem / tot) * 1000) / 10)) : 0);
218
+ const totalAll = active.reduce((s, p) => s + Math.max(0, Number(p.total) || 0), 0);
219
+ const usedAll = active.reduce((s, p) => s + Math.max(0, Number(p.consumed) || 0), 0);
209
220
  payload.quotas = {
210
221
  Balance: {
211
222
  name: `${t('剩余')} ${f(balance)} (${t('Token')})`,
212
- used: 0,
213
- total: Math.max(0.000001, balance),
214
- remainingPercentage: 100,
223
+ used: usedAll,
224
+ total: totalAll,
225
+ remainingPercentage: pct1(balance, totalAll),
215
226
  displayRemaining: true,
216
227
  isCreditBalance: true,
217
228
  summarizesDetail: true,
218
229
  },
219
230
  };
220
231
  for (const [i, p] of active.entries()) {
221
- const usedPct = p.total > 0 ? Math.round((p.consumed / p.total) * 100) : 0;
222
- const exp = p.expireAt ? ` · ${t('至')} ${String(p.expireAt).slice(5, 10)}` : '';
223
- const kind = p.grantCategory === 'GIFT' || p.source === 'FREE_PACK' ? t('赠送') : '';
232
+ const kind = p.grantCategory === 'GIFT' || p.source === 'FREE_PACK';
224
233
  payload.quotas[`Pack${i + 1}`] = {
225
- name: `${f(p.remaining)} / ${f(p.total)}${kind ? ' · ' + kind : ''}${exp} · ${usedPct}%${t('已消耗')}`,
226
- used: 0,
227
- total: Math.max(0.000001, Number(p.remaining)),
228
- remainingPercentage: Number(p.remaining) > 0 ? 100 : 0,
234
+ name: kind ? t('获赠资源包') : t('资源包'),
235
+ used: Math.max(0, Number(p.consumed) || 0),
236
+ total: Number(p.total),
237
+ remainingPercentage: pct1(Math.max(0, Number(p.remaining)), Number(p.total)),
229
238
  displayRemaining: true,
230
239
  isCreditBalance: true,
231
240
  ...(kind ? { giftPack: true } : {}),