dsh-connect-trae 3.9.1 → 3.9.2

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
@@ -1,5 +1,34 @@
1
1
  # Changelog
2
2
 
3
+ ## 3.9.2 (2026-10-18)
4
+
5
+ ### 新增
6
+
7
+ - **批量按钮被禁用时在行内说明原因**:「一键签到所有账号」「一键测试所有账号」变灰时,动作行下方
8
+ 直接写出为什么——本机今日已签到 / 面板里没有可解析出的目标模型 / 一个成员都没勾。此前只是一个
9
+ 不可点的按钮,看不出缘由。
10
+
11
+ ### 修复
12
+
13
+ - **签到列不再渲染永远点不动的按钮**:已领取 / 本设备今日已用原本各带一个灰色死按钮,现在只留状态
14
+ 文字;账号名册表同样处理(不可再签时渲染文字而不是禁用按钮),信息不丢。
15
+ - **池工具行与导入 / 导出区不再各印一遍标题**:两处原本都写了「导入 / 导出账号」,现在是同一行一个
16
+ 标题加两个按钮,并去掉多余的分隔线。
17
+ - **放弃 / 保存的按钮尺寸**:不再套用行内小按钮的紧凑内边距,显式声明为与卡片其它按钮一致(高度
18
+ 32px、13px 字),不再依赖某条规则「缺席」才正确。
19
+
20
+ ### 变更(卡片外观)
21
+
22
+ - 池成员表下的勾选说明句删除;卡头补回 12px 下边距,表格分隔线不会贴着标题。
23
+ - 保存条改与模型区底部同款:左侧「鼓励一下 ★」,右侧放弃 / 保存;其下的面板说明文字删除(三面板
24
+ tab 已写明各自独立)。
25
+
26
+ ### 测试
27
+
28
+ - 全仓 **849** 例通过(另有 1 例是 `CARD_SHOT=1` 才跑的截图用例,默认跳过)。新增:批量按钮禁用
29
+ 原因 3 例、死按钮移除 7 例(断言「按钮缺席 + 状态文字在场」,含名册与池两张表),`card-checkin`
30
+ 的 5 例改写为同样的断言方向。
31
+
3
32
  ## 3.9.1 (2026-10-18)
4
33
 
5
34
  > **3.9.0 从未发布到 npm**(发版时卡在 OTP 认证),本版本是同一套账号池功能加上 tag 之后
package/lib/client.js CHANGED
@@ -587,6 +587,7 @@ window.__ModuleLoader__.load({
587
587
  .dsm-trae-account-checkin{appearance:none;font:inherit;cursor:pointer;white-space:nowrap;border:1px solid rgba(86,134,254,.4);border-radius:7px;padding:2px 9px;font-size:12px;line-height:18px;font-weight:500;color:var(--dsw-alias-brand-primary,#5686fe);background:rgba(86,134,254,.08)}
588
588
  .dsm-trae-account-checkin:hover:not(:disabled){background:rgba(86,134,254,.16)}
589
589
  .dsm-trae-account-checkin:focus-visible{outline:2px solid var(--dsw-alias-brand-primary,#5686fe);outline-offset:1px}
590
+ .dsm-trae-account-checkin-state{font-size:12px;line-height:18px;color:var(--dsw-alias-label-tertiary,#9aa0a8);white-space:nowrap}
590
591
  /* A disabled check-in still STATES something ("claimed", "device used"), so it
591
592
  stays readable 鈥?clearly inactive, not invisible. */
592
593
  .dsm-trae-account-checkin:disabled{opacity:.55;cursor:default;border-color:transparent;color:var(--dsw-alias-label-tertiary,#9aa0a8);background:transparent}
@@ -658,6 +659,8 @@ window.__ModuleLoader__.load({
658
659
  must stay mounted to be clicked. */
659
660
  .dsm-trae-transfer{margin-top:12px;padding-top:10px;border-top:1px solid var(--dsw-alias-border-l2,rgba(127,127,127,.2))}
660
661
  .dsm-trae-transfer-label{margin:0 0 6px;font-size:11px;line-height:16px;color:var(--dsw-alias-label-secondary,GrayText)}
662
+ .dsm-trae-transfer-flat{margin-top:0;padding-top:0;border-top:0}
663
+ .dsm-trae-transfer-flat .dsm-trae-transfer-actions{flex-wrap:nowrap}
661
664
  .dsm-trae-transfer-actions{display:flex;flex-wrap:wrap;gap:8px}
662
665
  .dsm-trae-transfer-file{display:none}
663
666
  .dsm-trae-transfer-status{margin:6px 0 0;font-size:11px;line-height:16px}
@@ -789,12 +792,12 @@ window.__ModuleLoader__.load({
789
792
  .dsm-trae-pool-remove{color:var(--dsw-alias-label-secondary,#c6c9d0)}
790
793
  .dsm-trae-pool-remove:hover:not(:disabled){color:var(--dsw-alias-state-error-primary,#d92d20);border-color:var(--dsw-alias-state-error-primary,#d92d20)}
791
794
  .dsm-trae-pool-busy{font-size:12px;line-height:18px;color:var(--dsw-alias-label-tertiary,#9aa0a8)}
795
+ .dsm-trae-pool-action-note{margin:0;font-size:12px;line-height:18px;color:var(--dsw-alias-label-tertiary,#9aa0a8)}
792
796
  .dsm-trae-pool-card{display:flex;flex-direction:column;min-width:0;border:1px solid var(--dsw-alias-border-l2,#3a3d45);border-radius:var(--dsm-trae-pool-radius);background:var(--dsw-alias-bg-layer-2,#24262c);overflow:hidden}
793
- .dsm-trae-pool-card-head{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:14px var(--dsm-trae-pool-pad-x) 0}
797
+ .dsm-trae-pool-card-head{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:14px var(--dsm-trae-pool-pad-x) 12px}
794
798
  .dsm-trae-pool-card-title{margin:0;font-size:13px;line-height:18px;font-weight:600;color:var(--dsw-alias-label-primary,#e6e6e6)}
795
799
  .dsm-trae-pool-card-tools{display:flex;align-items:center;gap:8px;flex:none}
796
800
  .dsm-trae-pool-count{font-size:12px;line-height:18px;color:var(--dsw-alias-label-tertiary,#9aa0a8)}
797
- .dsm-trae-pool-card-note{margin:0;padding:6px var(--dsm-trae-pool-pad-x) 12px;font-size:12px;line-height:18px;color:var(--dsw-alias-label-tertiary,#9aa0a8)}
798
801
  .dsm-trae-pool-card .dsm-trae-pool-table{border:0;border-radius:0;border-top:1px solid var(--dsw-alias-border-l1,rgba(127,127,127,.18))}
799
802
  .dsm-trae-pool-members{display:flex;flex-direction:column;gap:10px}
800
803
  /* Prose, not a box. Every explanation in this section is one line of muted
@@ -831,7 +834,7 @@ window.__ModuleLoader__.load({
831
834
  .dsm-trae-pool-subtitle{margin:0;font-size:12px;font-weight:600;line-height:18px;color:var(--dsw-alias-label-primary,#e6e6e6)}
832
835
  .dsm-trae-pool-subnote{margin:2px 0 0;font-size:12px;line-height:18px;color:var(--dsw-alias-label-tertiary,#9aa0a8)}
833
836
  .dsm-trae-pool-select-actions{display:flex;flex:none;gap:6px}
834
- .dsm-trae-pool-select-actions .dsm-btn,.dsm-trae-pool-row-actions .dsm-btn,.dsm-trae-pool-save-row .dsm-btn{padding:4px 10px;font-size:12px;line-height:1.4}
837
+ .dsm-trae-pool-select-actions .dsm-btn,.dsm-trae-pool-row-actions .dsm-btn{padding:4px 10px;font-size:12px;line-height:1.4}
835
838
  .dsm-trae-pool-table{--dsm-trae-pool-cols:minmax(0,1.4fr) 128px minmax(0,1.2fr) 96px 128px;display:flex;flex-direction:column;border:1px solid var(--dsw-alias-border-l2,#3a3d45);border-radius:var(--dsm-trae-pool-radius);overflow:hidden;background:var(--dsw-alias-bg-layer-2,#24262c)}
836
839
  .dsm-trae-pool-table-no-checkin{--dsm-trae-pool-cols:minmax(0,1.4fr) 128px minmax(0,1.2fr) 128px}
837
840
  .dsm-trae-pool-row{display:grid;grid-template-columns:var(--dsm-trae-pool-cols);align-items:start;gap:10px;padding:var(--dsm-trae-pool-pad-y) var(--dsm-trae-pool-pad-x);border-top:1px solid var(--dsw-alias-border-l1,rgba(127,127,127,.18))}
@@ -898,8 +901,9 @@ window.__ModuleLoader__.load({
898
901
  /* "Every member is unusable" is the one case that IS the pool's fault, so it
899
902
  keeps the warn tone the base class sets. */
900
903
  .dsm-trae-pool-warning-unusable{border-color:var(--dsw-alias-state-warn-secondary,#fbbf24);background:var(--dsw-alias-state-warn-tertiary,#fef3c7);color:var(--dsw-alias-state-warn-primary,#b45309)}
901
- .dsm-trae-pool-save-row{display:flex;align-items:center;gap:8px}
902
- .dsm-trae-pool-star{margin-inline-end:auto;font-size:12px;line-height:18px;color:var(--dsw-alias-label-secondary,#c6c9d0);text-decoration:none}
904
+ .dsm-trae-pool-save-row{display:flex;align-items:center;justify-content:space-between;gap:12px;border-top:1px solid var(--dsw-alias-border-l2,#36373b);padding-top:12px}
905
+ .dsm-trae-pool-save-buttons{display:flex;align-items:center;justify-content:flex-end;gap:8px}
906
+ .dsm-trae-pool-save-row .dsm-btn{padding:5px 14px;font-size:13px;line-height:1.5}
903
907
  .dsm-trae-pool-dirty{padding:0 6px;border-radius:999px;background:var(--dsw-alias-state-warn-tertiary,#fef3c7);color:var(--dsw-alias-state-warn-primary,#b45309);font-size:10px;line-height:16px}
904
908
  .dsm-trae-pool-save-error{margin:0;font-size:12px;line-height:18px;color:var(--dsw-alias-state-error-primary,#d92d20)}
905
909
  .dsm-trae-pool-target{display:flex;flex-direction:column;gap:6px;font-size:12px;line-height:18px;color:var(--dsw-alias-label-secondary,#c6c9d0)}
@@ -1575,6 +1579,14 @@ window.__ModuleLoader__.load({
1575
1579
  const noCandidate = pool.noCandidate;
1576
1580
  const showNoCandidate = pool.enabled && noCandidate !== void 0;
1577
1581
  const serving = servingAccount(pool);
1582
+ /**
1583
+ * The batch buttons are disabled for reasons the user cannot see (they are not
1584
+ * under the pointer, so a `title` only helps after a hover). Name them here.
1585
+ */
1586
+ const actionNotes = [];
1587
+ if (selected.size === 0) actionNotes.push(t("row.poolActionNoteNoMembers"));
1588
+ if (deviceClaimed) actionNotes.push(t("row.poolActionNoteCheckinDevice"));
1589
+ if (pool.targetModelSource === "none") actionNotes.push(t("row.poolActionNoteTestNone"));
1578
1590
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("section", {
1579
1591
  className: "dsm-trae-pool",
1580
1592
  "aria-label": t("row.poolTitle"),
@@ -1639,6 +1651,10 @@ window.__ModuleLoader__.load({
1639
1651
  })
1640
1652
  ]
1641
1653
  }),
1654
+ actionNotes.length === 0 ? null : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
1655
+ className: "dsm-trae-pool-action-note",
1656
+ children: actionNotes.join(" · ")
1657
+ }),
1642
1658
  showNoCandidate ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(NoCandidateNotice, {
1643
1659
  noCandidate,
1644
1660
  t
@@ -1678,10 +1694,6 @@ window.__ModuleLoader__.load({
1678
1694
  ]
1679
1695
  })]
1680
1696
  }),
1681
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
1682
- className: "dsm-trae-pool-card-note",
1683
- children: t("row.poolCardHint")
1684
- }),
1685
1697
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
1686
1698
  className: pool.checkinSupported ? "dsm-trae-pool-table" : "dsm-trae-pool-table dsm-trae-pool-table-no-checkin",
1687
1699
  role: "table",
@@ -1884,22 +1896,25 @@ window.__ModuleLoader__.load({
1884
1896
  }),
1885
1897
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
1886
1898
  className: "dsm-trae-pool-save-row",
1887
- children: [
1888
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("a", {
1889
- className: "dsm-trae-pool-star",
1890
- href: "https://github.com/dingminhua/dsh-connect-trae",
1891
- target: "_blank",
1892
- rel: "noreferrer noopener",
1893
- children: [t("row.poolStar"), " ★"]
1894
- }),
1895
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
1899
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("a", {
1900
+ className: "dsm-trae-usage-cheer",
1901
+ href: "https://github.com/dingminhua/dsh-connect-trae",
1902
+ target: "_blank",
1903
+ rel: "noreferrer noopener",
1904
+ children: [t("row.cheer"), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
1905
+ className: "dsm-trae-usage-cheer-star",
1906
+ "aria-hidden": "true",
1907
+ children: "★"
1908
+ })]
1909
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
1910
+ className: "dsm-trae-pool-save-buttons",
1911
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
1896
1912
  type: "button",
1897
1913
  className: "dsm-btn dsm-btn-outline",
1898
1914
  disabled: !dirty || busy !== void 0,
1899
1915
  onClick: discard,
1900
1916
  children: t("row.poolDiscard")
1901
- }),
1902
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
1917
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
1903
1918
  type: "button",
1904
1919
  className: "dsm-btn dsm-btn-primary",
1905
1920
  disabled: !dirty || busy !== void 0,
@@ -1907,15 +1922,11 @@ window.__ModuleLoader__.load({
1907
1922
  save();
1908
1923
  },
1909
1924
  children: busy === "save" ? t("row.poolSaving") : t("row.poolSaved")
1910
- })
1911
- ]
1925
+ })]
1926
+ })]
1912
1927
  })
1913
1928
  ]
1914
1929
  }),
1915
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
1916
- className: "dsm-trae-pool-note",
1917
- children: t("row.poolRegionNote")
1918
- }),
1919
1930
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ActivityLog, {
1920
1931
  log,
1921
1932
  t,
@@ -2091,7 +2102,7 @@ window.__ModuleLoader__.load({
2091
2102
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
2092
2103
  className: `dsm-trae-pool-checkin-state dsm-trae-pool-checkin-${checkin === void 0 ? "unknown" : checkin ? "ok" : device === true || deviceClaimed ? "device" : "no"}`,
2093
2104
  children: checkin === void 0 ? t("row.poolCheckinUnknown") : checkin ? t("row.poolCheckedIn") : device === true || deviceClaimed ? t("row.poolDeviceUsed") : t("row.poolNotCheckedIn")
2094
- }), claim === void 0 || onClaim === void 0 ? null : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
2105
+ }), claim === void 0 || onClaim === void 0 || claim.claimable === false ? null : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
2095
2106
  type: "button",
2096
2107
  className: "dsm-btn dsm-btn-outline dsm-trae-pool-claim",
2097
2108
  disabled: claim.disabled || disabled,
@@ -2305,7 +2316,7 @@ window.__ModuleLoader__.load({
2305
2316
  setTimeout(resolve, timeoutMs);
2306
2317
  })]);
2307
2318
  }
2308
- function AccountTransfer({ t, region, accounts, onChanged }) {
2319
+ function AccountTransfer({ t, region, accounts, onChanged, hideLabel = false }) {
2309
2320
  const [phase, setPhase] = (0, react.useState)({ kind: "idle" });
2310
2321
  const [dialog, setDialog] = (0, react.useState)(void 0);
2311
2322
  const [selected, setSelected] = (0, react.useState)(/* @__PURE__ */ new Set());
@@ -2456,7 +2467,7 @@ window.__ModuleLoader__.load({
2456
2467
  const busy = phase.kind === "exporting" || phase.kind === "importing" || phase.kind === "refreshing";
2457
2468
  const veilMessage = phase.kind === "exporting" ? t("row.transferExporting") : phase.kind === "importing" || phase.kind === "refreshing" ? t("row.transferImporting") : "";
2458
2469
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("section", {
2459
- className: "dsm-trae-transfer",
2470
+ className: hideLabel ? "dsm-trae-transfer dsm-trae-transfer-flat" : "dsm-trae-transfer",
2460
2471
  "aria-label": t("row.transferTitle"),
2461
2472
  children: [
2462
2473
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)(BusyOverlay, {
@@ -2464,7 +2475,7 @@ window.__ModuleLoader__.load({
2464
2475
  message: veilMessage,
2465
2476
  ...busy ? { hint: t("row.transferVeilHint") } : {}
2466
2477
  }),
2467
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
2478
+ hideLabel ? null : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
2468
2479
  className: "dsm-trae-transfer-label",
2469
2480
  children: t("row.transferTitle")
2470
2481
  }),
@@ -3801,11 +3812,22 @@ window.__ModuleLoader__.load({
3801
3812
  label: spending ? t("row.checkinClaiming") : claimed ? t("row.checkinClaimed") : deviceSpent ? t("row.checkinDeviceSpentShort") : !usable || reward === void 0 ? t("row.checkinClaim") : t("row.checkinClaimWith", { reward }),
3802
3813
  title,
3803
3814
  disabled: !usable || claimed || deviceSpent || spending,
3804
- busy: spending
3815
+ busy: spending,
3816
+ /**
3817
+ * False when there is nothing left to DO: a disabled "already claimed"
3818
+ * button restates the status line above it, in grey, forever. Callers
3819
+ * drop the control instead of buying it a permanent disabled state.
3820
+ */
3821
+ claimable: !claimed && !deviceSpent,
3822
+ settled: claimed ? "claimed" : deviceSpent ? "device" : void 0
3805
3823
  };
3806
3824
  };
3807
3825
  const checkinControl = (account, state) => {
3808
3826
  const view = claimViewOf(account.id, state);
3827
+ if (!view.claimable) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
3828
+ className: "dsm-trae-account-checkin-state",
3829
+ children: view.settled === "claimed" ? t("row.poolCheckedIn") : t("row.poolDeviceUsed")
3830
+ });
3809
3831
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
3810
3832
  type: "button",
3811
3833
  className: "dsm-trae-account-checkin",
@@ -4217,6 +4239,7 @@ window.__ModuleLoader__.load({
4217
4239
  children: t("row.poolToolsLabel")
4218
4240
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(AccountTransfer, {
4219
4241
  t,
4242
+ hideLabel: true,
4220
4243
  region: activeRegion === "ai" ? "ai" : "cn",
4221
4244
  accounts: status.accounts.map((account) => ({
4222
4245
  id: account.id,
@@ -5370,7 +5393,6 @@ window.__ModuleLoader__.load({
5370
5393
  "row.poolNoCandidateUnusable": "Every selected member is unavailable right now.",
5371
5394
  "row.poolNoCandidateHint": "Traffic keeps landing on the saved selection until one recovers.",
5372
5395
  "row.poolMembersTitle": "Accounts in this pool",
5373
- "row.poolCardHint": "Only checked accounts are checked in, tested and dispatched. Nothing is checked by default — pick the ones you want, then save.",
5374
5396
  "row.poolRescan": "Re-detect accounts",
5375
5397
  "row.poolToolsLabel": "Export / import accounts",
5376
5398
  "row.poolCreditExpiry": "expires {when}",
@@ -5398,6 +5420,9 @@ window.__ModuleLoader__.load({
5398
5420
  "row.poolTargetStaleClear": "Back to automatic",
5399
5421
  "row.poolTargetNone": "No free model available for this panel",
5400
5422
  "row.poolTargetNoneHint": "The pool can only pick a free model; none resolves right now, so tests are disabled.",
5423
+ "row.poolActionNoteCheckinDevice": "This machine already used today's check-in (Trae allows one per device per day) — check-in is unavailable until tomorrow.",
5424
+ "row.poolActionNoteTestNone": "No free model resolves in this panel — pick a target model before testing.",
5425
+ "row.poolActionNoteNoMembers": "Tick the accounts you want in the pool and save first.",
5401
5426
  "row.poolTargetAutoOption": "Automatic (free model)",
5402
5427
  "row.poolTargetLabel": "Target test model",
5403
5428
  "row.poolTargetHint": "The model a probe test uses.",
@@ -5405,7 +5430,6 @@ window.__ModuleLoader__.load({
5405
5430
  "row.poolProbeSizeHint": "How much text a test sends. A one-word probe only proves the account can answer a one-word request — if the upstream refuses long turns, this is where you find out. Bigger is closer to a real conversation, and costs more credit on every account in the batch.",
5406
5431
  "row.poolProbeSizeDefault": "Minimal (default)",
5407
5432
  "row.poolProbeSizeOption": "{wan}0k tokens",
5408
- "row.poolStar": "Star the repo",
5409
5433
  "row.poolSettingsTitle": "Pool settings",
5410
5434
  "row.poolManualAccountLabel": "Manually billed account",
5411
5435
  "row.poolManualAccountHint": "Used while the pool is off. With it on, the Host picks by credits.",
@@ -5437,7 +5461,6 @@ window.__ModuleLoader__.load({
5437
5461
  "row.poolLogTestRowMalformed": "{accountName}: malformed result.",
5438
5462
  "row.poolLogTestDone": "Test finished.",
5439
5463
  "row.poolLogBatchFailed": "Pool action failed: {message}",
5440
- "row.poolRegionNote": "Each panel has its own pool; enterprise shares the CN account's sign-ins.",
5441
5464
  "row.poolSelectAria": "Include {accountName} in the pool",
5442
5465
  "row.poolCheckedIn": "Checked in",
5443
5466
  "row.poolNotCheckedIn": "Not checked in",
@@ -5687,7 +5710,6 @@ window.__ModuleLoader__.load({
5687
5710
  "row.poolNoCandidateUnusable": "所有已选成员当前均不可用。",
5688
5711
  "row.poolNoCandidateHint": "请求会继续落在已保存的账号上,直到有成员恢复可用。",
5689
5712
  "row.poolMembersTitle": "本池包含的账号",
5690
- "row.poolCardHint": "只有勾选的账号才会被签到、测试和轮换。默认一个都不勾 —— 请勾选你要的账号,然后保存。",
5691
5713
  "row.poolRescan": "重新检测账号",
5692
5714
  "row.poolToolsLabel": "导出 / 导入账号",
5693
5715
  "row.poolCreditExpiry": "{when} 过期",
@@ -5715,6 +5737,9 @@ window.__ModuleLoader__.load({
5715
5737
  "row.poolTargetStaleClear": "改回自动",
5716
5738
  "row.poolTargetNone": "本面板暂无可用免费模型",
5717
5739
  "row.poolTargetNoneHint": "账号池只会挑免费模型;当前无法解析出可用模型,测速暂被禁用。",
5740
+ "row.poolActionNoteCheckinDevice": "本机今日的签到已用掉(Trae 按每台设备每天一次限制),明天才能再签。",
5741
+ "row.poolActionNoteTestNone": "本面板没有解析出免费模型——先指定一个目标模型再测速。",
5742
+ "row.poolActionNoteNoMembers": "先勾选要入池的账号并保存。",
5718
5743
  "row.poolTargetAutoOption": "自动(免费模型)",
5719
5744
  "row.poolTargetLabel": "目标测速模型",
5720
5745
  "row.poolTargetHint": "探针测速所用的模型。",
@@ -5722,7 +5747,6 @@ window.__ModuleLoader__.load({
5722
5747
  "row.poolProbeSizeHint": "测试时发送多少文本。只发一个词的探针,只能证明「这个账号能回答一个词」——如果上游拒绝长请求,问题只会在你真实对话时才出现。填得越多越接近真实对话,每个账号每次测试消耗的积分也越多。",
5723
5748
  "row.poolProbeSizeDefault": "最小请求(默认)",
5724
5749
  "row.poolProbeSizeOption": "{wan} 万 token",
5725
- "row.poolStar": "鼓励一下",
5726
5750
  "row.poolSettingsTitle": "账号池设置",
5727
5751
  "row.poolManualAccountLabel": "手动计费账号",
5728
5752
  "row.poolManualAccountHint": "账号池关闭时由它计费;开启后由 Host 按积分挑选。",
@@ -5754,7 +5778,6 @@ window.__ModuleLoader__.load({
5754
5778
  "row.poolLogTestRowMalformed": "{accountName}:结果异常。",
5755
5779
  "row.poolLogTestDone": "测速完成。",
5756
5780
  "row.poolLogBatchFailed": "账号池操作失败:{message}",
5757
- "row.poolRegionNote": "每个面板各有自己的账号池;企业版与国内版共用同一 Trae CN 账号登录。",
5758
5781
  "row.poolSelectAria": "把 {accountName} 加入账号池",
5759
5782
  "row.poolCheckedIn": "已签到",
5760
5783
  "row.poolNotCheckedIn": "未签到",
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "dsh-connect-trae",
3
3
  "displayName": "DSH Connect Trae",
4
4
  "description": "把本机登录的 Trae 模型接入 DeepSeek Harness:国内版与国际版双供应商并行,提供用量/积分概览与每日签到领取。",
5
- "version": "3.9.1",
5
+ "version": "3.9.2",
6
6
  "author": "dingminhua",
7
7
  "copyright": "Copyright (c) 2026 LaoDing",
8
8
  "license": "MIT",