dsh-codearts 1.2.11 → 1.2.13

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/CHANGELOG.md CHANGED
@@ -3,6 +3,29 @@
3
3
  本文件记录本插件的重要改动。格式参考 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.1.0/),
4
4
  版本号遵循 [语义化版本](https://semver.org/lang/zh-CN/)。
5
5
 
6
+ ## [1.2.13] - 2026-11-09
7
+
8
+ ### 修复
9
+
10
+ - **带图的请求不再被误判「上下文放不下」**:图片在请求里是 `data:image/...;base64,...`
11
+ 字面量,旧的估算按字符数折算,一张 400 KB 的 A4 页渲染图会被算成十几万 token
12
+ (真实视觉编码器只要一两千),8 张图就能把 1M 窗口假性撑爆,上游一次请求都没发出,
13
+ 用户只看到「请新建会话」。现在图片按像素面积估:只读图片头(PNG IHDR / JPEG SOF /
14
+ GIF)拿宽高,按 28×28 块折算并钳在 85~8000,读不出尺寸时退回 1600;文本仍按原规则,
15
+ `role` / `tool_calls` 等结构化字段也照旧。感谢 [@rachel1028-blip](https://github.com/rachel1028-blip)
16
+ 的 [PR #6](https://github.com/elegant01/dsh-codearts/pull/6)。
17
+ - **`pnpm build` 在含空格的路径下不再挂**:`scripts/wrap-client.mjs` 改用
18
+ `fileURLToPath` 取路径,工作目录里的空格不会再被编码成 `%20` 让最后一步找不到产物。
19
+
20
+ ## [1.2.12] - 2026-11-09
21
+
22
+ ### 变更
23
+
24
+ - **账号「暂停」从按钮改成开关**:账号行现在是「启用 [开关]」——开着表示参与轮转,关掉
25
+ 就是暂停。以前是一个写着「暂停 / 恢复」的按钮,当前状态要靠按钮文案反推;现在开关
26
+ 的位置直接说明这个号还能不能接活。开关用的是宿主自带的 `Switch`,和启用类开关同款,
27
+ 只在写入进行中禁用;凭证、备注、展示顺序照旧保留,恢复不需要重新登录。
28
+
6
29
  ## [1.2.11] - 2026-11-08
7
30
 
8
31
  ### 新增
package/lib/bin.mjs CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { G as codeartsAccountsPath, H as CodeArtsAccountStore, f as fetchCallerIdentity, i as discoverModels, n as CodeArtsUsageTracker, r as codeartsUsagePath, t as CODEARTS_VERSION, z as isBenefitModel } from "./version-Dq3wXMop.mjs";
2
+ import { G as codeartsAccountsPath, H as CodeArtsAccountStore, f as fetchCallerIdentity, i as discoverModels, n as CodeArtsUsageTracker, r as codeartsUsagePath, t as CODEARTS_VERSION, z as isBenefitModel } from "./version-E5iTxpWh.mjs";
3
3
  import { existsSync, statSync } from "node:fs";
4
4
  //#region src/bin.ts
5
5
  /**
@@ -102,8 +102,8 @@ interface CodeArtsSettingsKey {
102
102
  /** 账号暂停/置顶。 */
103
103
  accountPaused: string;
104
104
  accountPinned: string;
105
- accountPause: string;
106
- accountResume: string;
105
+ /** 「启用」开关的标签:关掉即暂停,不参与轮转。 */
106
+ accountEnabled: string;
107
107
  accountPin: string;
108
108
  accountUnpin: string;
109
109
  accountToday: string;
@@ -62,7 +62,7 @@ function subscribeSidebarPanelWanted(listener) {
62
62
  }
63
63
  //#endregion
64
64
  //#region \0dsh-css:/home/runner/work/dsh-codearts/dsh-codearts/src/client/CodeArtsPluginCard.module.css.mjs
65
- const css$1 = ".xoziZG_card{border:.5px solid var(--dsw-alias-settings-card-stroke);border-radius:var(--dsw-radius-lg);background:var(--dsw-alias-settings-card-fill);max-width:720px}.xoziZG_header{align-items:flex-start;gap:12px;padding:14px 16px;display:flex}.xoziZG_headText{flex-direction:column;flex:1;gap:6px;min-width:0;display:flex}.xoziZG_name{color:var(--dsw-alias-label-primary);font-size:15px;font-weight:600;line-height:22px}.xoziZG_desc{color:var(--dsw-alias-label-tertiary);font-size:13px;line-height:20px}.xoziZG_statusLine{color:var(--dsw-alias-label-primary);align-items:center;gap:6px;font-size:14px;font-weight:500;line-height:22px;display:inline-flex}.xoziZG_meta{color:var(--dsw-alias-label-tertiary);font-variant-numeric:tabular-nums;font-size:12px;line-height:18px}.xoziZG_body{border-top:.5px solid var(--dsw-alias-border-l2);margin:0 16px;padding:4px 0 16px}.xoziZG_tabs{margin-top:12px}.xoziZG_tabPanel{padding-top:2px}.xoziZG_accountToolbar{gap:8px;margin-top:12px;display:flex}.xoziZG_accountToolbar>*{flex:1}.xoziZG_manualForm{border:.5px solid var(--dsw-alias-border-l3);border-radius:var(--dsw-radius-md);margin-top:12px;padding:12px}.xoziZG_accountCard{flex-direction:column;gap:10px;margin-top:12px;display:flex}.xoziZG_accountEntry{border:.5px solid var(--dsw-alias-border-l2);border-radius:var(--dsw-radius-md);background:var(--dsw-alias-bg-layer-2)}.xoziZG_accountRow{align-items:center;gap:10px;padding:12px;display:flex}.xoziZG_claimAllRow{border-top:.5px solid var(--dsw-alias-border-l2);justify-content:flex-end;padding:10px 12px 0;display:flex}.xoziZG_avatar{background:var(--dsw-alias-bg-layer-3);width:32px;height:32px;color:var(--dsw-alias-label-primary);border-radius:50%;flex:none;justify-content:center;align-items:center;font-size:14px;font-weight:600;display:inline-flex}.xoziZG_accountInfo{flex-direction:column;flex:1;gap:2px;min-width:0;display:flex}.xoziZG_accountNameRow{align-items:center;gap:6px;min-width:0;display:flex}.xoziZG_accountName{color:var(--dsw-alias-label-primary);text-overflow:ellipsis;white-space:nowrap;font-size:14px;font-weight:600;line-height:20px;overflow:hidden}.xoziZG_accountRowActions{flex-wrap:wrap;flex:none;justify-content:flex-end;gap:6px;display:flex}.xoziZG_accountHint{color:var(--dsw-alias-label-tertiary);margin:0;padding:0 12px 12px;font-size:12px;line-height:18px}.xoziZG_creditBlock{border-top:.5px solid var(--dsw-alias-border-l2);padding:12px}.xoziZG_balanceRow{flex-wrap:wrap;align-items:baseline;gap:6px;display:flex}.xoziZG_balance{color:var(--dsw-alias-label-primary);letter-spacing:-.02em;font-variant-numeric:tabular-nums;font-size:28px;font-weight:600;line-height:34px}.xoziZG_balanceUnit{color:var(--dsw-alias-label-secondary);font-size:12px}.xoziZG_balanceMeta{color:var(--dsw-alias-label-tertiary);margin-left:2px;font-size:12px}.xoziZG_updated{color:var(--dsw-alias-label-tertiary);font-variant-numeric:tabular-nums;margin-left:auto;font-size:12px}.xoziZG_creditRows{flex-direction:column;gap:4px;margin-top:8px;display:flex}.xoziZG_creditRow{color:var(--dsw-alias-label-secondary);font-variant-numeric:tabular-nums;justify-content:space-between;align-items:baseline;gap:12px;font-size:12px;line-height:18px;display:flex}.xoziZG_usageBar{background:var(--dsw-alias-border-l2);border-radius:2px;height:4px;margin-top:4px;display:block;overflow:hidden}.xoziZG_usageFill{background:var(--dsw-alias-brand-primary);border-radius:2px;height:100%;transition:width .2s;display:block}.xoziZG_expiryRow{margin-top:2px}.xoziZG_expiryLabel{color:var(--dsw-alias-state-warn-label)}.xoziZG_bar{background:var(--dsw-alias-bg-layer-3);border-radius:2px;height:4px;margin-top:6px;display:block;overflow:hidden}.xoziZG_barFill{background:var(--dsw-alias-state-warn-primary);border-radius:2px;height:100%;display:block}.xoziZG_creditLink{margin-top:8px;display:inline-block}.xoziZG_creditFooter{border-top:.5px solid var(--dsw-alias-border-l2);justify-content:space-between;align-items:center;gap:8px;margin-top:12px;padding-top:10px;display:flex}.xoziZG_creditHint{color:var(--dsw-alias-label-tertiary);margin:8px 0 0;font-size:12px;line-height:18px}.xoziZG_section{margin-top:16px}.xoziZG_sectionHead{justify-content:space-between;align-items:baseline;gap:12px;display:flex}.xoziZG_sectionLabel{color:var(--dsw-alias-label-tertiary);font-size:11px;font-weight:500}.xoziZG_count{color:var(--dsw-alias-label-secondary);font-variant-numeric:tabular-nums;flex:none;font-size:12px}.xoziZG_hint{color:var(--dsw-alias-label-secondary);margin:8px 0 0;font-size:13px;line-height:20px}.xoziZG_error{color:var(--dsw-alias-state-error-primary);margin:10px 0 0;font-size:13px;line-height:20px}.xoziZG_actions{flex-wrap:wrap;align-items:center;gap:8px;margin-top:12px;display:flex}.xoziZG_danger{color:var(--dsw-alias-state-error-primary)}.xoziZG_link{appearance:none;color:var(--dsw-alias-brand-text);font:inherit;text-align:left;word-break:break-all;cursor:pointer;background:0 0;border:none;padding:0;font-size:12px}.xoziZG_link:hover{text-decoration:underline}.xoziZG_choices{flex-direction:column;gap:2px;margin-top:8px;display:flex}.xoziZG_choiceRow{border-radius:var(--dsw-radius-sm);align-items:center;gap:8px;margin:0 -6px;padding:5px 6px;display:flex}.xoziZG_choiceRow:hover{background:var(--dsw-alias-interactive-bg-hover)}.xoziZG_statGrid{grid-template-columns:repeat(3,minmax(0,1fr));gap:8px;margin:10px 0 14px;display:grid}.xoziZG_statCard{border:.5px solid var(--dsw-alias-border-l3);border-radius:var(--dsw-radius-md);flex-direction:column;gap:1px;padding:8px 10px;display:flex}.xoziZG_statLabel{color:var(--dsw-alias-label-tertiary);font-size:11px;line-height:16px}.xoziZG_statValue{color:var(--dsw-alias-label-primary);font-variant-numeric:tabular-nums;font-size:15px;line-height:20px}.xoziZG_statSub{color:var(--dsw-alias-label-tertiary);font-variant-numeric:tabular-nums;font-size:11px;line-height:16px}.xoziZG_modelChart{flex-direction:column;gap:2px;margin-top:8px;display:flex}.xoziZG_modelRow{font-variant-numeric:tabular-nums;border-radius:6px;grid-template-columns:minmax(0,1.2fr) minmax(48px,1fr) 56px 52px 64px;align-items:center;gap:8px;padding:4px 0;display:grid;position:relative}.xoziZG_modelRow:hover{background:var(--dsw-alias-interactive-bg-hover)}.xoziZG_usageTip{z-index:5;border:.5px solid var(--dsw-alias-border-l3);border-radius:var(--dsw-radius-md);background:var(--dsw-alias-bg-layer-3);min-width:180px;max-width:260px;color:var(--dsw-alias-label-secondary);text-align:left;font-variant-numeric:tabular-nums;pointer-events:none;padding:8px 10px;font-size:12px;line-height:1.9;position:absolute;bottom:calc(100% + 6px);right:0;box-shadow:0 10px 28px #00000073}.xoziZG_usageTip[data-float=true]{z-index:40;position:fixed;bottom:auto;right:auto}.xoziZG_usageTipName{max-width:240px;color:var(--dsw-alias-label-primary);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.xoziZG_usageTipSep{background:var(--dsw-alias-border-l2);height:1px;margin:4px 0}.xoziZG_usageTipRow{justify-content:space-between;gap:24px;display:flex}.xoziZG_usageTipRow span:last-child{color:var(--dsw-alias-label-primary);font-weight:600}.xoziZG_modelName{color:var(--dsw-alias-label-primary);text-overflow:ellipsis;white-space:nowrap;font-size:12px;line-height:18px;overflow:hidden}.xoziZG_modelTrack{background:var(--dsw-alias-border-l2);border-radius:4px;height:8px;display:block;overflow:hidden}.xoziZG_modelFill{background:var(--dsw-alias-brand-primary);border-radius:4px;height:100%;transition:width .16s;display:block}.xoziZG_modelTokens,.xoziZG_modelShare,.xoziZG_modelRequests{color:var(--dsw-alias-label-secondary);text-align:right;white-space:nowrap;font-size:11px;line-height:16px}.xoziZG_modelRequests{color:var(--dsw-alias-label-tertiary)}.xoziZG_heatGrid{grid-template-columns:repeat(7,minmax(0,1fr));gap:4px;margin:8px 0 2px;display:grid}.xoziZG_heatWeekday{color:var(--dsw-alias-label-tertiary);text-align:center;font-size:10px;line-height:14px}.xoziZG_heatCell{background:color-mix(in srgb, var(--dsw-alias-label-primary) 6%, transparent);height:36px;color:var(--dsw-alias-label-tertiary);font-variant-numeric:tabular-nums;border:0;border-radius:8px;outline:0;justify-content:center;align-items:center;font-size:12px;transition:background .12s ease-out;display:flex}.xoziZG_heatCell[data-tone=empty]{color:var(--dsw-alias-label-tertiary)}.xoziZG_heatCell[data-tone=pad]{background:0 0}.xoziZG_heatCell[data-tone=out]{color:var(--dsw-alias-label-tertiary);opacity:.45;background:0 0}.xoziZG_heatCell[data-tone=lv1]{color:#0f1115;background:#ddf4e7}.xoziZG_heatCell[data-tone=lv2]{color:#0f1115;background:#b3e8cc}.xoziZG_heatCell[data-tone=lv3]{color:#0f1115;background:#7dd8ac}.xoziZG_heatCell[data-tone=lv4]{color:#fff;background:#40c584}.xoziZG_heatCell[data-tone=lv5]{color:#fff;background:#16a34a}.xoziZG_heatCell[data-today=true]{font-weight:700;box-shadow:inset 0 -2px}.xoziZG_heatHours{grid-template-columns:repeat(24,minmax(0,1fr));gap:3px;margin:8px 0 0;display:grid}.xoziZG_heatHourCell{background:color-mix(in srgb, var(--dsw-alias-label-primary) 6%, transparent);border-radius:4px;height:26px;transition:background .12s ease-out}.xoziZG_heatHourCell[data-tone=lv1]{background:#ddf4e7}.xoziZG_heatHourCell[data-tone=lv2]{background:#b3e8cc}.xoziZG_heatHourCell[data-tone=lv3]{background:#7dd8ac}.xoziZG_heatHourCell[data-tone=lv4]{background:#40c584}.xoziZG_heatHourCell[data-tone=lv5]{background:#16a34a}.xoziZG_heatAxis{color:var(--dsw-alias-label-tertiary);font-variant-numeric:tabular-nums;grid-template-columns:repeat(24,minmax(0,1fr));gap:3px;font-size:10px;line-height:14px;display:grid}.xoziZG_heatAxisSlot{text-align:center;white-space:nowrap;overflow:hidden}.xoziZG_heatLegend{color:var(--dsw-alias-label-tertiary);justify-content:flex-start;align-items:center;gap:3px;margin:0 0 6px;font-size:10px;display:flex}.xoziZG_heatLegendChip{border-radius:3px;width:10px;height:10px}.xoziZG_heatLegendChip[data-tone=lv1]{background:#ddf4e7}.xoziZG_heatLegendChip[data-tone=lv2]{background:#b3e8cc}.xoziZG_heatLegendChip[data-tone=lv3]{background:#7dd8ac}.xoziZG_heatLegendChip[data-tone=lv4]{background:#40c584}.xoziZG_heatLegendChip[data-tone=lv5]{background:#16a34a}.xoziZG_trendTip{color:var(--dsw-alias-label-secondary);font-variant-numeric:tabular-nums;margin:2px 0 0;font-size:11px;line-height:16px}.xoziZG_check{flex:1;min-width:0}.xoziZG_check>span{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.xoziZG_manual{border:.5px solid var(--dsw-alias-border-l3);border-radius:var(--dsw-radius-md);margin-top:12px;padding:0 12px}.xoziZG_manual[open]{padding-bottom:12px}.xoziZG_manualSummary{color:var(--dsw-alias-label-secondary);cursor:pointer;align-items:center;gap:6px;padding:9px 0;font-size:13px;list-style:none;display:flex}.xoziZG_manualSummary::-webkit-details-marker{display:none}.xoziZG_field{flex-direction:column;gap:5px;margin-top:10px;display:flex}.xoziZG_fieldLabel{color:var(--dsw-alias-label-tertiary);font-size:12px}.xoziZG_area{box-sizing:border-box;resize:vertical;border:.5px solid var(--dsw-alias-border-l4);border-radius:var(--dsw-radius-md);background:var(--dsw-alias-bg-layer-1);width:100%;color:var(--dsw-alias-label-primary);padding:6px 8px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:13px;line-height:20px}.xoziZG_area::placeholder{color:var(--dsw-alias-label-dimmed)}.xoziZG_area:focus{border-color:var(--dsw-alias-state-business-primary);outline:none}.xoziZG_skeleton{flex-direction:column;gap:10px;padding:4px 0;display:flex}.xoziZG_skeletonRow{border-radius:var(--dsw-radius-sm,4px);background:var(--dsw-alias-border-l2);height:12px;animation:1.4s ease-in-out infinite xoziZG_skeletonBreath}.xoziZG_skeletonRow:nth-child(2){width:72%}.xoziZG_skeletonRow:nth-child(3){width:46%}@keyframes xoziZG_skeletonBreath{0%,to{opacity:.45}50%{opacity:.9}}@media (prefers-reduced-motion:reduce){.xoziZG_skeletonRow{animation:none}}.xoziZG_modelSpec{color:var(--dsw-alias-label-tertiary);white-space:nowrap;font-variant-numeric:tabular-nums;font-size:11px;line-height:16px}.xoziZG_doctorList{flex-direction:column;gap:2px;margin-top:8px;display:flex}.xoziZG_doctorRow{align-items:center;gap:8px;padding:4px 0;display:flex}.xoziZG_doctorName{color:var(--dsw-alias-label-secondary);flex:none;font-size:12px;line-height:18px}.xoziZG_doctorRow .xoziZG_meta{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}";
65
+ const css$1 = ".xoziZG_card{border:.5px solid var(--dsw-alias-settings-card-stroke);border-radius:var(--dsw-radius-lg);background:var(--dsw-alias-settings-card-fill);max-width:720px}.xoziZG_header{align-items:flex-start;gap:12px;padding:14px 16px;display:flex}.xoziZG_headText{flex-direction:column;flex:1;gap:6px;min-width:0;display:flex}.xoziZG_name{color:var(--dsw-alias-label-primary);font-size:15px;font-weight:600;line-height:22px}.xoziZG_desc{color:var(--dsw-alias-label-tertiary);font-size:13px;line-height:20px}.xoziZG_statusLine{color:var(--dsw-alias-label-primary);align-items:center;gap:6px;font-size:14px;font-weight:500;line-height:22px;display:inline-flex}.xoziZG_meta{color:var(--dsw-alias-label-tertiary);font-variant-numeric:tabular-nums;font-size:12px;line-height:18px}.xoziZG_body{border-top:.5px solid var(--dsw-alias-border-l2);margin:0 16px;padding:4px 0 16px}.xoziZG_tabs{margin-top:12px}.xoziZG_tabPanel{padding-top:2px}.xoziZG_accountToolbar{gap:8px;margin-top:12px;display:flex}.xoziZG_accountToolbar>*{flex:1}.xoziZG_manualForm{border:.5px solid var(--dsw-alias-border-l3);border-radius:var(--dsw-radius-md);margin-top:12px;padding:12px}.xoziZG_accountCard{flex-direction:column;gap:10px;margin-top:12px;display:flex}.xoziZG_accountEntry{border:.5px solid var(--dsw-alias-border-l2);border-radius:var(--dsw-radius-md);background:var(--dsw-alias-bg-layer-2)}.xoziZG_accountRow{align-items:center;gap:10px;padding:12px;display:flex}.xoziZG_claimAllRow{border-top:.5px solid var(--dsw-alias-border-l2);justify-content:flex-end;padding:10px 12px 0;display:flex}.xoziZG_avatar{background:var(--dsw-alias-bg-layer-3);width:32px;height:32px;color:var(--dsw-alias-label-primary);border-radius:50%;flex:none;justify-content:center;align-items:center;font-size:14px;font-weight:600;display:inline-flex}.xoziZG_accountInfo{flex-direction:column;flex:1;gap:2px;min-width:0;display:flex}.xoziZG_accountNameRow{align-items:center;gap:6px;min-width:0;display:flex}.xoziZG_accountName{color:var(--dsw-alias-label-primary);text-overflow:ellipsis;white-space:nowrap;font-size:14px;font-weight:600;line-height:20px;overflow:hidden}.xoziZG_accountRowActions{flex-wrap:wrap;flex:none;justify-content:flex-end;align-items:center;gap:6px;display:flex}.xoziZG_accountToggle{align-items:center;gap:6px;display:inline-flex}.xoziZG_accountToggleLabel{color:var(--dsw-alias-label-secondary);white-space:nowrap;font-size:12px;line-height:20px}.xoziZG_accountHint{color:var(--dsw-alias-label-tertiary);margin:0;padding:0 12px 12px;font-size:12px;line-height:18px}.xoziZG_creditBlock{border-top:.5px solid var(--dsw-alias-border-l2);padding:12px}.xoziZG_balanceRow{flex-wrap:wrap;align-items:baseline;gap:6px;display:flex}.xoziZG_balance{color:var(--dsw-alias-label-primary);letter-spacing:-.02em;font-variant-numeric:tabular-nums;font-size:28px;font-weight:600;line-height:34px}.xoziZG_balanceUnit{color:var(--dsw-alias-label-secondary);font-size:12px}.xoziZG_balanceMeta{color:var(--dsw-alias-label-tertiary);margin-left:2px;font-size:12px}.xoziZG_updated{color:var(--dsw-alias-label-tertiary);font-variant-numeric:tabular-nums;margin-left:auto;font-size:12px}.xoziZG_creditRows{flex-direction:column;gap:4px;margin-top:8px;display:flex}.xoziZG_creditRow{color:var(--dsw-alias-label-secondary);font-variant-numeric:tabular-nums;justify-content:space-between;align-items:baseline;gap:12px;font-size:12px;line-height:18px;display:flex}.xoziZG_usageBar{background:var(--dsw-alias-border-l2);border-radius:2px;height:4px;margin-top:4px;display:block;overflow:hidden}.xoziZG_usageFill{background:var(--dsw-alias-brand-primary);border-radius:2px;height:100%;transition:width .2s;display:block}.xoziZG_expiryRow{margin-top:2px}.xoziZG_expiryLabel{color:var(--dsw-alias-state-warn-label)}.xoziZG_bar{background:var(--dsw-alias-bg-layer-3);border-radius:2px;height:4px;margin-top:6px;display:block;overflow:hidden}.xoziZG_barFill{background:var(--dsw-alias-state-warn-primary);border-radius:2px;height:100%;display:block}.xoziZG_creditLink{margin-top:8px;display:inline-block}.xoziZG_creditFooter{border-top:.5px solid var(--dsw-alias-border-l2);justify-content:space-between;align-items:center;gap:8px;margin-top:12px;padding-top:10px;display:flex}.xoziZG_creditHint{color:var(--dsw-alias-label-tertiary);margin:8px 0 0;font-size:12px;line-height:18px}.xoziZG_section{margin-top:16px}.xoziZG_sectionHead{justify-content:space-between;align-items:baseline;gap:12px;display:flex}.xoziZG_sectionLabel{color:var(--dsw-alias-label-tertiary);font-size:11px;font-weight:500}.xoziZG_count{color:var(--dsw-alias-label-secondary);font-variant-numeric:tabular-nums;flex:none;font-size:12px}.xoziZG_hint{color:var(--dsw-alias-label-secondary);margin:8px 0 0;font-size:13px;line-height:20px}.xoziZG_error{color:var(--dsw-alias-state-error-primary);margin:10px 0 0;font-size:13px;line-height:20px}.xoziZG_actions{flex-wrap:wrap;align-items:center;gap:8px;margin-top:12px;display:flex}.xoziZG_danger{color:var(--dsw-alias-state-error-primary)}.xoziZG_link{appearance:none;color:var(--dsw-alias-brand-text);font:inherit;text-align:left;word-break:break-all;cursor:pointer;background:0 0;border:none;padding:0;font-size:12px}.xoziZG_link:hover{text-decoration:underline}.xoziZG_choices{flex-direction:column;gap:2px;margin-top:8px;display:flex}.xoziZG_choiceRow{border-radius:var(--dsw-radius-sm);align-items:center;gap:8px;margin:0 -6px;padding:5px 6px;display:flex}.xoziZG_choiceRow:hover{background:var(--dsw-alias-interactive-bg-hover)}.xoziZG_statGrid{grid-template-columns:repeat(3,minmax(0,1fr));gap:8px;margin:10px 0 14px;display:grid}.xoziZG_statCard{border:.5px solid var(--dsw-alias-border-l3);border-radius:var(--dsw-radius-md);flex-direction:column;gap:1px;padding:8px 10px;display:flex}.xoziZG_statLabel{color:var(--dsw-alias-label-tertiary);font-size:11px;line-height:16px}.xoziZG_statValue{color:var(--dsw-alias-label-primary);font-variant-numeric:tabular-nums;font-size:15px;line-height:20px}.xoziZG_statSub{color:var(--dsw-alias-label-tertiary);font-variant-numeric:tabular-nums;font-size:11px;line-height:16px}.xoziZG_modelChart{flex-direction:column;gap:2px;margin-top:8px;display:flex}.xoziZG_modelRow{font-variant-numeric:tabular-nums;border-radius:6px;grid-template-columns:minmax(0,1.2fr) minmax(48px,1fr) 56px 52px 64px;align-items:center;gap:8px;padding:4px 0;display:grid;position:relative}.xoziZG_modelRow:hover{background:var(--dsw-alias-interactive-bg-hover)}.xoziZG_usageTip{z-index:5;border:.5px solid var(--dsw-alias-border-l3);border-radius:var(--dsw-radius-md);background:var(--dsw-alias-bg-layer-3);min-width:180px;max-width:260px;color:var(--dsw-alias-label-secondary);text-align:left;font-variant-numeric:tabular-nums;pointer-events:none;padding:8px 10px;font-size:12px;line-height:1.9;position:absolute;bottom:calc(100% + 6px);right:0;box-shadow:0 10px 28px #00000073}.xoziZG_usageTip[data-float=true]{z-index:40;position:fixed;bottom:auto;right:auto}.xoziZG_usageTipName{max-width:240px;color:var(--dsw-alias-label-primary);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.xoziZG_usageTipSep{background:var(--dsw-alias-border-l2);height:1px;margin:4px 0}.xoziZG_usageTipRow{justify-content:space-between;gap:24px;display:flex}.xoziZG_usageTipRow span:last-child{color:var(--dsw-alias-label-primary);font-weight:600}.xoziZG_modelName{color:var(--dsw-alias-label-primary);text-overflow:ellipsis;white-space:nowrap;font-size:12px;line-height:18px;overflow:hidden}.xoziZG_modelTrack{background:var(--dsw-alias-border-l2);border-radius:4px;height:8px;display:block;overflow:hidden}.xoziZG_modelFill{background:var(--dsw-alias-brand-primary);border-radius:4px;height:100%;transition:width .16s;display:block}.xoziZG_modelTokens,.xoziZG_modelShare,.xoziZG_modelRequests{color:var(--dsw-alias-label-secondary);text-align:right;white-space:nowrap;font-size:11px;line-height:16px}.xoziZG_modelRequests{color:var(--dsw-alias-label-tertiary)}.xoziZG_heatGrid{grid-template-columns:repeat(7,minmax(0,1fr));gap:4px;margin:8px 0 2px;display:grid}.xoziZG_heatWeekday{color:var(--dsw-alias-label-tertiary);text-align:center;font-size:10px;line-height:14px}.xoziZG_heatCell{background:color-mix(in srgb, var(--dsw-alias-label-primary) 6%, transparent);height:36px;color:var(--dsw-alias-label-tertiary);font-variant-numeric:tabular-nums;border:0;border-radius:8px;outline:0;justify-content:center;align-items:center;font-size:12px;transition:background .12s ease-out;display:flex}.xoziZG_heatCell[data-tone=empty]{color:var(--dsw-alias-label-tertiary)}.xoziZG_heatCell[data-tone=pad]{background:0 0}.xoziZG_heatCell[data-tone=out]{color:var(--dsw-alias-label-tertiary);opacity:.45;background:0 0}.xoziZG_heatCell[data-tone=lv1]{color:#0f1115;background:#ddf4e7}.xoziZG_heatCell[data-tone=lv2]{color:#0f1115;background:#b3e8cc}.xoziZG_heatCell[data-tone=lv3]{color:#0f1115;background:#7dd8ac}.xoziZG_heatCell[data-tone=lv4]{color:#fff;background:#40c584}.xoziZG_heatCell[data-tone=lv5]{color:#fff;background:#16a34a}.xoziZG_heatCell[data-today=true]{font-weight:700;box-shadow:inset 0 -2px}.xoziZG_heatHours{grid-template-columns:repeat(24,minmax(0,1fr));gap:3px;margin:8px 0 0;display:grid}.xoziZG_heatHourCell{background:color-mix(in srgb, var(--dsw-alias-label-primary) 6%, transparent);border-radius:4px;height:26px;transition:background .12s ease-out}.xoziZG_heatHourCell[data-tone=lv1]{background:#ddf4e7}.xoziZG_heatHourCell[data-tone=lv2]{background:#b3e8cc}.xoziZG_heatHourCell[data-tone=lv3]{background:#7dd8ac}.xoziZG_heatHourCell[data-tone=lv4]{background:#40c584}.xoziZG_heatHourCell[data-tone=lv5]{background:#16a34a}.xoziZG_heatAxis{color:var(--dsw-alias-label-tertiary);font-variant-numeric:tabular-nums;grid-template-columns:repeat(24,minmax(0,1fr));gap:3px;font-size:10px;line-height:14px;display:grid}.xoziZG_heatAxisSlot{text-align:center;white-space:nowrap;overflow:hidden}.xoziZG_heatLegend{color:var(--dsw-alias-label-tertiary);justify-content:flex-start;align-items:center;gap:3px;margin:0 0 6px;font-size:10px;display:flex}.xoziZG_heatLegendChip{border-radius:3px;width:10px;height:10px}.xoziZG_heatLegendChip[data-tone=lv1]{background:#ddf4e7}.xoziZG_heatLegendChip[data-tone=lv2]{background:#b3e8cc}.xoziZG_heatLegendChip[data-tone=lv3]{background:#7dd8ac}.xoziZG_heatLegendChip[data-tone=lv4]{background:#40c584}.xoziZG_heatLegendChip[data-tone=lv5]{background:#16a34a}.xoziZG_trendTip{color:var(--dsw-alias-label-secondary);font-variant-numeric:tabular-nums;margin:2px 0 0;font-size:11px;line-height:16px}.xoziZG_check{flex:1;min-width:0}.xoziZG_check>span{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.xoziZG_manual{border:.5px solid var(--dsw-alias-border-l3);border-radius:var(--dsw-radius-md);margin-top:12px;padding:0 12px}.xoziZG_manual[open]{padding-bottom:12px}.xoziZG_manualSummary{color:var(--dsw-alias-label-secondary);cursor:pointer;align-items:center;gap:6px;padding:9px 0;font-size:13px;list-style:none;display:flex}.xoziZG_manualSummary::-webkit-details-marker{display:none}.xoziZG_field{flex-direction:column;gap:5px;margin-top:10px;display:flex}.xoziZG_fieldLabel{color:var(--dsw-alias-label-tertiary);font-size:12px}.xoziZG_area{box-sizing:border-box;resize:vertical;border:.5px solid var(--dsw-alias-border-l4);border-radius:var(--dsw-radius-md);background:var(--dsw-alias-bg-layer-1);width:100%;color:var(--dsw-alias-label-primary);padding:6px 8px;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:13px;line-height:20px}.xoziZG_area::placeholder{color:var(--dsw-alias-label-dimmed)}.xoziZG_area:focus{border-color:var(--dsw-alias-state-business-primary);outline:none}.xoziZG_skeleton{flex-direction:column;gap:10px;padding:4px 0;display:flex}.xoziZG_skeletonRow{border-radius:var(--dsw-radius-sm,4px);background:var(--dsw-alias-border-l2);height:12px;animation:1.4s ease-in-out infinite xoziZG_skeletonBreath}.xoziZG_skeletonRow:nth-child(2){width:72%}.xoziZG_skeletonRow:nth-child(3){width:46%}@keyframes xoziZG_skeletonBreath{0%,to{opacity:.45}50%{opacity:.9}}@media (prefers-reduced-motion:reduce){.xoziZG_skeletonRow{animation:none}}.xoziZG_modelSpec{color:var(--dsw-alias-label-tertiary);white-space:nowrap;font-variant-numeric:tabular-nums;font-size:11px;line-height:16px}.xoziZG_doctorList{flex-direction:column;gap:2px;margin-top:8px;display:flex}.xoziZG_doctorRow{align-items:center;gap:8px;padding:4px 0;display:flex}.xoziZG_doctorName{color:var(--dsw-alias-label-secondary);flex:none;font-size:12px;line-height:18px}.xoziZG_doctorRow .xoziZG_meta{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}";
66
66
  const tagId$1 = "dsh-codearts/CodeArtsPluginCard.module.css";
67
67
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$1) + "]") === null) {
68
68
  const tag = document.createElement("style");
@@ -72,96 +72,98 @@ if (typeof document !== "undefined" && document.querySelector("style[data-plugin
72
72
  document.head.appendChild(tag);
73
73
  }
74
74
  var CodeArtsPluginCard_module_css_default = {
75
- "usageFill": "xoziZG_usageFill",
76
- "modelName": "xoziZG_modelName",
77
- "tabPanel": "xoziZG_tabPanel",
75
+ "modelSpec": "xoziZG_modelSpec",
78
76
  "sectionHead": "xoziZG_sectionHead",
79
- "card": "xoziZG_card",
80
- "usageTip": "xoziZG_usageTip",
81
- "expiryRow": "xoziZG_expiryRow",
82
- "statusLine": "xoziZG_statusLine",
83
- "tabs": "xoziZG_tabs",
77
+ "heatLegend": "xoziZG_heatLegend",
78
+ "heatLegendChip": "xoziZG_heatLegendChip",
79
+ "usageTipRow": "xoziZG_usageTipRow",
80
+ "heatAxisSlot": "xoziZG_heatAxisSlot",
81
+ "accountToolbar": "xoziZG_accountToolbar",
82
+ "heatGrid": "xoziZG_heatGrid",
83
+ "sectionLabel": "xoziZG_sectionLabel",
84
+ "actions": "xoziZG_actions",
85
+ "modelTrack": "xoziZG_modelTrack",
86
+ "body": "xoziZG_body",
87
+ "claimAllRow": "xoziZG_claimAllRow",
84
88
  "creditBlock": "xoziZG_creditBlock",
85
- "link": "xoziZG_link",
86
- "statGrid": "xoziZG_statGrid",
89
+ "avatar": "xoziZG_avatar",
90
+ "expiryLabel": "xoziZG_expiryLabel",
87
91
  "creditRows": "xoziZG_creditRows",
92
+ "statSub": "xoziZG_statSub",
93
+ "usageBar": "xoziZG_usageBar",
94
+ "link": "xoziZG_link",
95
+ "expiryRow": "xoziZG_expiryRow",
96
+ "modelRow": "xoziZG_modelRow",
97
+ "modelFill": "xoziZG_modelFill",
88
98
  "heatHours": "xoziZG_heatHours",
89
- "manual": "xoziZG_manual",
90
- "fieldLabel": "xoziZG_fieldLabel",
91
- "area": "xoziZG_area",
99
+ "trendTip": "xoziZG_trendTip",
100
+ "skeleton": "xoziZG_skeleton",
101
+ "skeletonRow": "xoziZG_skeletonRow",
102
+ "section": "xoziZG_section",
103
+ "doctorList": "xoziZG_doctorList",
92
104
  "doctorRow": "xoziZG_doctorRow",
93
- "heatCell": "xoziZG_heatCell",
94
- "creditHint": "xoziZG_creditHint",
95
- "heatWeekday": "xoziZG_heatWeekday",
96
- "heatLegend": "xoziZG_heatLegend",
97
105
  "balanceUnit": "xoziZG_balanceUnit",
98
- "updated": "xoziZG_updated",
99
- "heatAxisSlot": "xoziZG_heatAxisSlot",
100
- "field": "xoziZG_field",
101
- "skeleton": "xoziZG_skeleton",
102
- "trendTip": "xoziZG_trendTip",
103
- "manualSummary": "xoziZG_manualSummary",
104
- "hint": "xoziZG_hint",
105
- "modelRequests": "xoziZG_modelRequests",
106
106
  "name": "xoziZG_name",
107
- "accountInfo": "xoziZG_accountInfo",
108
- "heatAxis": "xoziZG_heatAxis",
109
- "usageBar": "xoziZG_usageBar",
110
- "barFill": "xoziZG_barFill",
107
+ "statLabel": "xoziZG_statLabel",
108
+ "check": "xoziZG_check",
109
+ "accountRow": "xoziZG_accountRow",
110
+ "manualSummary": "xoziZG_manualSummary",
111
+ "skeletonBreath": "xoziZG_skeletonBreath",
112
+ "manual": "xoziZG_manual",
113
+ "accountToggle": "xoziZG_accountToggle",
114
+ "usageTipName": "xoziZG_usageTipName",
115
+ "modelShare": "xoziZG_modelShare",
116
+ "choices": "xoziZG_choices",
117
+ "statGrid": "xoziZG_statGrid",
111
118
  "danger": "xoziZG_danger",
119
+ "accountName": "xoziZG_accountName",
120
+ "barFill": "xoziZG_barFill",
121
+ "header": "xoziZG_header",
112
122
  "accountHint": "xoziZG_accountHint",
113
- "modelShare": "xoziZG_modelShare",
114
- "accountToolbar": "xoziZG_accountToolbar",
115
- "section": "xoziZG_section",
116
- "modelTokens": "xoziZG_modelTokens",
117
- "skeletonRow": "xoziZG_skeletonRow",
118
- "sectionLabel": "xoziZG_sectionLabel",
123
+ "creditHint": "xoziZG_creditHint",
124
+ "card": "xoziZG_card",
119
125
  "creditRow": "xoziZG_creditRow",
126
+ "accountNameRow": "xoziZG_accountNameRow",
127
+ "modelChart": "xoziZG_modelChart",
120
128
  "usageTipSep": "xoziZG_usageTipSep",
121
- "skeletonBreath": "xoziZG_skeletonBreath",
122
- "body": "xoziZG_body",
123
- "modelSpec": "xoziZG_modelSpec",
124
- "heatLegendChip": "xoziZG_heatLegendChip",
129
+ "modelName": "xoziZG_modelName",
125
130
  "heatHourCell": "xoziZG_heatHourCell",
126
- "modelRow": "xoziZG_modelRow",
131
+ "creditFooter": "xoziZG_creditFooter",
132
+ "error": "xoziZG_error",
133
+ "accountCard": "xoziZG_accountCard",
134
+ "field": "xoziZG_field",
135
+ "accountInfo": "xoziZG_accountInfo",
136
+ "creditLink": "xoziZG_creditLink",
137
+ "count": "xoziZG_count",
138
+ "modelRequests": "xoziZG_modelRequests",
139
+ "heatCell": "xoziZG_heatCell",
140
+ "tabPanel": "xoziZG_tabPanel",
141
+ "statValue": "xoziZG_statValue",
142
+ "balanceMeta": "xoziZG_balanceMeta",
143
+ "usageTip": "xoziZG_usageTip",
144
+ "heatAxis": "xoziZG_heatAxis",
145
+ "choiceRow": "xoziZG_choiceRow",
146
+ "accountToggleLabel": "xoziZG_accountToggleLabel",
147
+ "area": "xoziZG_area",
127
148
  "balance": "xoziZG_balance",
128
149
  "meta": "xoziZG_meta",
129
- "avatar": "xoziZG_avatar",
130
- "heatGrid": "xoziZG_heatGrid",
131
- "check": "xoziZG_check",
132
- "statLabel": "xoziZG_statLabel",
133
- "statSub": "xoziZG_statSub",
134
- "statCard": "xoziZG_statCard",
135
- "modelChart": "xoziZG_modelChart",
136
- "actions": "xoziZG_actions",
137
- "choices": "xoziZG_choices",
138
- "usageTipName": "xoziZG_usageTipName",
139
- "balanceMeta": "xoziZG_balanceMeta",
140
- "expiryLabel": "xoziZG_expiryLabel",
141
- "accountName": "xoziZG_accountName",
142
- "creditLink": "xoziZG_creditLink",
143
- "doctorList": "xoziZG_doctorList",
144
- "accountNameRow": "xoziZG_accountNameRow",
145
- "accountCard": "xoziZG_accountCard",
150
+ "modelTokens": "xoziZG_modelTokens",
146
151
  "balanceRow": "xoziZG_balanceRow",
147
- "error": "xoziZG_error",
148
- "modelFill": "xoziZG_modelFill",
152
+ "statusLine": "xoziZG_statusLine",
149
153
  "bar": "xoziZG_bar",
150
- "creditFooter": "xoziZG_creditFooter",
151
- "modelTrack": "xoziZG_modelTrack",
152
- "choiceRow": "xoziZG_choiceRow",
153
- "accountEntry": "xoziZG_accountEntry",
154
154
  "headText": "xoziZG_headText",
155
- "header": "xoziZG_header",
156
- "count": "xoziZG_count",
157
- "usageTipRow": "xoziZG_usageTipRow",
158
- "accountRow": "xoziZG_accountRow",
159
- "manualForm": "xoziZG_manualForm",
155
+ "hint": "xoziZG_hint",
156
+ "desc": "xoziZG_desc",
157
+ "usageFill": "xoziZG_usageFill",
158
+ "fieldLabel": "xoziZG_fieldLabel",
160
159
  "doctorName": "xoziZG_doctorName",
161
- "statValue": "xoziZG_statValue",
162
- "claimAllRow": "xoziZG_claimAllRow",
163
- "accountRowActions": "xoziZG_accountRowActions",
164
- "desc": "xoziZG_desc"
160
+ "accountEntry": "xoziZG_accountEntry",
161
+ "tabs": "xoziZG_tabs",
162
+ "heatWeekday": "xoziZG_heatWeekday",
163
+ "manualForm": "xoziZG_manualForm",
164
+ "statCard": "xoziZG_statCard",
165
+ "updated": "xoziZG_updated",
166
+ "accountRowActions": "xoziZG_accountRowActions"
165
167
  };
166
168
  //#endregion
167
169
  //#region src/client/CodeArtsPluginCard.tsx
@@ -1678,12 +1680,17 @@ function CodeArtsPluginCard({ t }) {
1678
1680
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
1679
1681
  className: CodeArtsPluginCard_module_css_default.accountRowActions,
1680
1682
  children: [
1681
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
1682
- variant: "outline",
1683
- size: "sm",
1684
- disabled: busy || loginPending || flagBusy === account.id,
1685
- onClick: () => void setAccountFlag(account.id, { paused: !account.paused }),
1686
- children: account.paused ? t("accountResume") : t("accountPause")
1683
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
1684
+ className: CodeArtsPluginCard_module_css_default.accountToggle,
1685
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
1686
+ className: CodeArtsPluginCard_module_css_default.accountToggleLabel,
1687
+ children: t("accountEnabled")
1688
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Switch, {
1689
+ checked: !account.paused,
1690
+ disabled: busy || loginPending || flagBusy === account.id,
1691
+ label: `${accountName(account)} ${t("accountEnabled")}`,
1692
+ onChange: (next) => void setAccountFlag(account.id, { paused: !next })
1693
+ })]
1687
1694
  }),
1688
1695
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
1689
1696
  variant: "outline",
@@ -2669,14 +2676,14 @@ if (typeof document !== "undefined" && document.querySelector("style[data-plugin
2669
2676
  document.head.appendChild(tag);
2670
2677
  }
2671
2678
  var CodeArtsPanel_module_css_default = {
2672
- "body": "Z66cgG_body",
2673
- "title": "Z66cgG_title",
2674
- "page": "Z66cgG_page",
2675
- "back": "Z66cgG_back",
2676
- "head": "Z66cgG_head",
2677
2679
  "desc": "Z66cgG_desc",
2680
+ "head": "Z66cgG_head",
2681
+ "back": "Z66cgG_back",
2682
+ "icon": "Z66cgG_icon",
2678
2683
  "backCaret": "Z66cgG_backCaret",
2679
- "icon": "Z66cgG_icon"
2684
+ "title": "Z66cgG_title",
2685
+ "page": "Z66cgG_page",
2686
+ "body": "Z66cgG_body"
2680
2687
  };
2681
2688
  //#endregion
2682
2689
  //#region src/client/CodeArtsPanel.tsx
@@ -2840,8 +2847,7 @@ const zh = {
2840
2847
  modelSpecTitle: "上游返回的上下文窗口 {context} token,最大输出 {output} token",
2841
2848
  accountPaused: "已暂停",
2842
2849
  accountPinned: "已置顶",
2843
- accountPause: "暂停",
2844
- accountResume: "恢复",
2850
+ accountEnabled: "启用",
2845
2851
  accountPin: "置顶",
2846
2852
  accountUnpin: "取消置顶",
2847
2853
  accountToday: "今日 {n} 次 · 失败 {failed}",
@@ -3027,8 +3033,7 @@ const en = {
3027
3033
  modelSpecTitle: "Context window {context} tokens, max output {output} tokens reported upstream",
3028
3034
  accountPaused: "Paused",
3029
3035
  accountPinned: "Pinned",
3030
- accountPause: "Pause",
3031
- accountResume: "Resume",
3036
+ accountEnabled: "Enabled",
3032
3037
  accountPin: "Pin",
3033
3038
  accountUnpin: "Unpin",
3034
3039
  accountToday: "Today {n} · {failed} failed",
package/lib/index.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { A as signedGet, B as markModelUnavailable, C as isTpmLimit, D as pickDailyWelfareCampaign, E as modelUnavailableReasonText, F as creditRatioLabel, G as codeartsAccountsPath, H as CodeArtsAccountStore, I as filterEnabledModels, J as startLogin, K as codeartsAuthPath, L as forgetModelUnavailable, M as CodeArtsCatalog, N as FALLBACK_CODEARTS_MODELS, O as prepareChatBody, P as clearBenefitBlocked, R as isBenefitBlocked, S as isQueueableRate, T as maxTokensCeilingFor, U as CodeArtsCredentialStore, V as modelUnavailableReason, W as MANUAL_ACCOUNT_ID, _ as isConcurrencyCap, a as refreshCatalog, b as isNotMultimodal, c as chatStream, d as degradeTokenCeiling, f as fetchCallerIdentity, g as firstFrameError, h as fetchWelfareCampaigns, i as discoverModels, j as upstreamErrorMessage, k as rateLimitFrame, l as claimDailyWelfare, m as fetchQueueStatus, n as CodeArtsUsageTracker, o as SNAP_HOST, p as fetchModels, q as credentialFromOAuth, r as codeartsUsagePath, s as canonicalModel, t as CODEARTS_VERSION, u as clearQueueStatus, v as isIamTokenError, w as isWelfareClaimedStatus, x as isParamInvalidFrame, y as isModelNotAccessible, z as isBenefitModel } from "./version-Dq3wXMop.mjs";
1
+ import { A as signedGet, B as markModelUnavailable, C as isTpmLimit, D as pickDailyWelfareCampaign, E as modelUnavailableReasonText, F as creditRatioLabel, G as codeartsAccountsPath, H as CodeArtsAccountStore, I as filterEnabledModels, J as startLogin, K as codeartsAuthPath, L as forgetModelUnavailable, M as CodeArtsCatalog, N as FALLBACK_CODEARTS_MODELS, O as prepareChatBody, P as clearBenefitBlocked, R as isBenefitBlocked, S as isQueueableRate, T as maxTokensCeilingFor, U as CodeArtsCredentialStore, V as modelUnavailableReason, W as MANUAL_ACCOUNT_ID, _ as isConcurrencyCap, a as refreshCatalog, b as isNotMultimodal, c as chatStream, d as degradeTokenCeiling, f as fetchCallerIdentity, g as firstFrameError, h as fetchWelfareCampaigns, i as discoverModels, j as upstreamErrorMessage, k as rateLimitFrame, l as claimDailyWelfare, m as fetchQueueStatus, n as CodeArtsUsageTracker, o as SNAP_HOST, p as fetchModels, q as credentialFromOAuth, r as codeartsUsagePath, s as canonicalModel, t as CODEARTS_VERSION, u as clearQueueStatus, v as isIamTokenError, w as isWelfareClaimedStatus, x as isParamInvalidFrame, y as isModelNotAccessible, z as isBenefitModel } from "./version-E5iTxpWh.mjs";
2
2
  import { i as lazyApi, r as createProvider } from "./models-CgKCibpk.mjs";
3
3
  import z from "@deepseek-ai/schemastery";
4
4
  import { randomBytes, timingSafeEqual } from "node:crypto";
@@ -1382,6 +1382,8 @@ var upstream_exports = /* @__PURE__ */ __exportAll({
1382
1382
  claimDailyWelfare: () => claimDailyWelfare,
1383
1383
  clearQueueStatus: () => clearQueueStatus,
1384
1384
  degradeTokenCeiling: () => degradeTokenCeiling,
1385
+ estimateImageTokens: () => estimateImageTokens,
1386
+ estimatePromptTokens: () => estimatePromptTokens,
1385
1387
  estimateTokens: () => estimateTokens,
1386
1388
  fetchCallerIdentity: () => fetchCallerIdentity,
1387
1389
  fetchModels: () => fetchModels,
@@ -1523,10 +1525,13 @@ function degradeTokenCeiling(id) {
1523
1525
  return next;
1524
1526
  }
1525
1527
  /**
1526
- * 粗估一段文本占多少 token:CJK 每字约 1,其余每 4 字符约 1。
1528
+ * 粗估一段**文本**占多少 token:CJK 每字约 1,其余每 4 字符约 1。
1527
1529
  *
1528
1530
  * 只要保守就够用 —— 它的用途是「在我们这边就把装不下的情况判掉」,
1529
1531
  * 而不是精确计费(上游不会告诉我们超没超,只会回一句参数非法)。
1532
+ *
1533
+ * **不要拿它去量带图的 content。** 图片在请求里是 base64 字面量,按字符折算会
1534
+ * 虚报两个数量级;整条 prompt 的估算走 `estimatePromptTokens`。
1530
1535
  */
1531
1536
  function estimateTokens(text) {
1532
1537
  let cjk = 0;
@@ -1536,6 +1541,126 @@ function estimateTokens(text) {
1536
1541
  }
1537
1542
  return Math.ceil(cjk + (text.length - cjk) / 4);
1538
1543
  }
1544
+ /** 单张图 token 的下限/上限:防止极端尺寸把整个估算拉飞。 */
1545
+ const IMAGE_TOKEN_MIN = 85;
1546
+ const IMAGE_TOKEN_MAX = 8e3;
1547
+ /**
1548
+ * 视觉编码器把图切成 28×28 的块,每块约 1 token —— 所以图片的代价随**像素面积**
1549
+ * 走,和它在请求里编码成多少字符无关。
1550
+ */
1551
+ const IMAGE_PATCH_AREA = 784;
1552
+ /** 读不出图片尺寸时的保守兜底(≈ 一张 1024×1024)。 */
1553
+ const IMAGE_TOKEN_FALLBACK = 1600;
1554
+ /** 解析图片头最多解码这么多 base64 字符(≈72 KB):够覆盖 PNG IHDR 与 JPEG 的 SOF。 */
1555
+ const IMAGE_HEAD_BASE64_CHARS = 98304;
1556
+ function clamp(value, min, max) {
1557
+ return Math.min(max, Math.max(min, value));
1558
+ }
1559
+ function be32(bytes, offset) {
1560
+ return (bytes[offset] << 24 | bytes[offset + 1] << 16 | bytes[offset + 2] << 8 | bytes[offset + 3]) >>> 0;
1561
+ }
1562
+ /** 从图片头读宽高(不解码像素)。认不出格式返回 undefined。 */
1563
+ function imageDimensions(bytes) {
1564
+ if (bytes.length >= 24 && bytes[0] === 137 && bytes[1] === 80 && bytes[2] === 78 && bytes[3] === 71) return {
1565
+ width: be32(bytes, 16),
1566
+ height: be32(bytes, 20)
1567
+ };
1568
+ if (bytes.length >= 10 && bytes[0] === 71 && bytes[1] === 73 && bytes[2] === 70) return {
1569
+ width: bytes[6] | bytes[7] << 8,
1570
+ height: bytes[8] | bytes[9] << 8
1571
+ };
1572
+ if (bytes.length >= 4 && bytes[0] === 255 && bytes[1] === 216) {
1573
+ let i = 2;
1574
+ while (i + 9 < bytes.length) {
1575
+ if (bytes[i] !== 255) {
1576
+ i += 1;
1577
+ continue;
1578
+ }
1579
+ const marker = bytes[i + 1];
1580
+ if (marker === 216 || marker === 1 || marker >= 208 && marker <= 215) {
1581
+ i += 2;
1582
+ continue;
1583
+ }
1584
+ const length = bytes[i + 2] << 8 | bytes[i + 3];
1585
+ if (length <= 0) break;
1586
+ if (marker >= 192 && marker <= 207 && marker !== 196 && marker !== 200 && marker !== 204) return {
1587
+ height: bytes[i + 5] << 8 | bytes[i + 6],
1588
+ width: bytes[i + 7] << 8 | bytes[i + 8]
1589
+ };
1590
+ i += 2 + length;
1591
+ }
1592
+ }
1593
+ }
1594
+ /**
1595
+ * 一张 `data:image/...;base64,...` 占多少 token。
1596
+ *
1597
+ * **不能拿 estimateTokens 去量 base64。** 一张 400 KB 的 A4 页渲染图 base64 后约
1598
+ * 55 万字符,按「4 字符 1 token」会算成 13.7 万 token —— 比真实视觉编码器的读数
1599
+ * 大两个数量级(同一张图通常 1~3 千)。后果是宿主那边上下文还很空、插件这边已经
1600
+ * 报「上下文放不下」,用户只看到一句让他新建会话的错,实际上一次都没发出去。
1601
+ *
1602
+ * 所以图片单独走面积估算:读图片头拿宽高,按 28×28 的块数折算。
1603
+ */
1604
+ function estimateImageTokens(url) {
1605
+ const comma = url.indexOf(",");
1606
+ if (comma === -1 || !/^data:image\//i.test(url.slice(0, comma))) return IMAGE_TOKEN_FALLBACK;
1607
+ const base64 = url.slice(comma + 1, comma + 1 + IMAGE_HEAD_BASE64_CHARS);
1608
+ let bytes;
1609
+ try {
1610
+ bytes = new Uint8Array(Buffer.from(base64, "base64"));
1611
+ } catch {
1612
+ return IMAGE_TOKEN_FALLBACK;
1613
+ }
1614
+ const size = imageDimensions(bytes);
1615
+ if (!size || size.width <= 0 || size.height <= 0) return IMAGE_TOKEN_FALLBACK;
1616
+ return clamp(Math.ceil(size.width * size.height / IMAGE_PATCH_AREA), IMAGE_TOKEN_MIN, IMAGE_TOKEN_MAX);
1617
+ }
1618
+ /** 一条消息 content 的 token 数:文本走 estimateTokens,图片走面积估算。 */
1619
+ function estimateContentTokens(content) {
1620
+ if (typeof content === "string") return estimateTokens(content);
1621
+ if (content === void 0 || content === null) return 0;
1622
+ if (!Array.isArray(content)) return estimateTokens(JSON.stringify(content));
1623
+ let total = 0;
1624
+ for (const part of content) {
1625
+ if (!part || typeof part !== "object") {
1626
+ total += estimateTokens(JSON.stringify(part ?? ""));
1627
+ continue;
1628
+ }
1629
+ const block = part;
1630
+ if (block.type === "image_url") {
1631
+ const image = block.image_url;
1632
+ const url = typeof image === "string" ? image : typeof image?.url === "string" ? image.url : "";
1633
+ total += estimateImageTokens(url);
1634
+ continue;
1635
+ }
1636
+ if (block.type === "text" && typeof block.text === "string") {
1637
+ total += estimateTokens(block.text);
1638
+ continue;
1639
+ }
1640
+ total += estimateTokens(JSON.stringify(block));
1641
+ }
1642
+ return total;
1643
+ }
1644
+ /**
1645
+ * 整个 prompt 的 token 数(messages + tools)。
1646
+ *
1647
+ * 逐条走 `estimateContentTokens`,而不是 `estimateTokens(JSON.stringify(messages))`:
1648
+ * 后者会把图片的 base64 当成正文去量,一条带图的请求就能虚报出几十万 token。
1649
+ * 非 content 的结构化字段(role / tool_calls / tool_call_id / name)照旧按 JSON 量。
1650
+ */
1651
+ function estimatePromptTokens(messages, tools) {
1652
+ let total = 0;
1653
+ if (Array.isArray(messages)) for (const message of messages) {
1654
+ if (!message || typeof message !== "object") continue;
1655
+ const record = message;
1656
+ total += estimateContentTokens(record.content);
1657
+ const { content: _content, ...rest } = record;
1658
+ if (Object.keys(rest).length > 0) total += estimateTokens(JSON.stringify(rest));
1659
+ }
1660
+ else if (messages !== void 0) total += estimateTokens(JSON.stringify(messages));
1661
+ if (tools !== void 0) total += estimateTokens(JSON.stringify(tools));
1662
+ return total;
1663
+ }
1539
1664
  /** 上游要求 chat_id 为 32 位小写十六进制。 */
1540
1665
  const CHAT_ID_RE = /^[0-9a-f]{32}$/;
1541
1666
  /** 稳定地把消息内容序列化成锚点文本(字符串原样,多模态数组走 JSON)。 */
@@ -1638,7 +1763,7 @@ function prepareChatBody(rawJson, contextWindow = 0) {
1638
1763
  if (typeof body.max_tokens === "number") {
1639
1764
  let maxTokens = Math.min(body.max_tokens, ceiling);
1640
1765
  if (contextWindow > 0) {
1641
- const promptTokens = estimateTokens(`${JSON.stringify(body.messages ?? "")}${JSON.stringify(body.tools ?? "")}`);
1766
+ const promptTokens = estimatePromptTokens(body.messages, body.tools);
1642
1767
  const room = contextWindow - promptTokens - PROMPT_ESTIMATE_MARGIN;
1643
1768
  if (room < MIN_USEFUL_OUTPUT_TOKENS) {
1644
1769
  body.max_tokens = maxTokens;
@@ -3213,6 +3338,6 @@ function percentileOf(buckets, ratio) {
3213
3338
  }
3214
3339
  //#endregion
3215
3340
  //#region src/version.ts
3216
- const CODEARTS_VERSION = "1.2.11";
3341
+ const CODEARTS_VERSION = "1.2.13";
3217
3342
  //#endregion
3218
3343
  export { signedGet as A, markModelUnavailable as B, isTpmLimit as C, pickDailyWelfareCampaign as D, modelUnavailableReasonText as E, creditRatioLabel as F, codeartsAccountsPath as G, CodeArtsAccountStore as H, filterEnabledModels as I, startLogin as J, codeartsAuthPath as K, forgetModelUnavailable as L, CodeArtsCatalog as M, FALLBACK_CODEARTS_MODELS as N, prepareChatBody as O, clearBenefitBlocked as P, isBenefitBlocked as R, isQueueableRate as S, maxTokensCeilingFor as T, CodeArtsCredentialStore as U, modelUnavailableReason as V, MANUAL_ACCOUNT_ID as W, isConcurrencyCap as _, refreshCatalog as a, isNotMultimodal as b, chatStream as c, degradeTokenCeiling as d, fetchCallerIdentity as f, firstFrameError as g, fetchWelfareCampaigns as h, discoverModels as i, upstreamErrorMessage as j, rateLimitFrame as k, claimDailyWelfare as l, fetchQueueStatus as m, CodeArtsUsageTracker as n, SNAP_HOST as o, fetchModels as p, credentialFromOAuth as q, codeartsUsagePath as r, canonicalModel as s, CODEARTS_VERSION as t, clearQueueStatus as u, isIamTokenError as v, isWelfareClaimedStatus as w, isParamInvalidFrame as x, isModelNotAccessible as y, isBenefitModel as z };
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "dsh-codearts",
3
3
  "displayName": "DSH CodeArts Connect",
4
4
  "description": "把华为云 CodeArts 接入 DeepSeek Harness —— 内置 OAuth2 登录(PKCE + DPoP),登录后即可在 DSH 对话窗口使用 CodeArts 的模型。",
5
- "version": "1.2.11",
5
+ "version": "1.2.13",
6
6
  "packageManager": "pnpm@11.24.0",
7
7
  "author": "elegant01",
8
8
  "keywords": [