dsh-plugin-t-expert 0.4.57 → 0.4.58

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
@@ -16,7 +16,39 @@
16
16
  > 发布时**不要再跑 `npm version`**(那会把已提交好的版本又升一级,发出去的号与 CHANGELOG、tag 就对不上),
17
17
  > 只补一个 annotated tag(`git tag -a`,因为 `git push --follow-tags` 只推带注释的 tag)。
18
18
 
19
- ## [0.4.57] — 未发布
19
+ ## [0.4.58] — 未发布
20
+
21
+ **面板的 ☁️ 标识改成可点的下载入口** —— 之前它只是个 `<span>`,注释却写着「点选与召唤都会自动下载」。
22
+
23
+ ### 现象
24
+
25
+ 用户反馈:「部分专家有头像、部分怎么点都没有」。
26
+
27
+ ### 根因
28
+
29
+ `warmupAssets`(下载预热)只挂在两处:
30
+
31
+ - `@` 弹窗的 `pick()`(`summon.jsx`)
32
+ - 输入框 `@` 菜单的 `onPick()`(`index.jsx`)
33
+
34
+ **面板列表(`settings.jsx`)完全没有触发点**。于是规律很清楚:
35
+
36
+ - **召唤过 / 在 @ 弹窗选过**的专家 → 附件已下载 → 有头像 ✓
37
+ - **只在面板里看过**的专家 → 永远不触发下载 → 永远 emoji ✗
38
+
39
+ 而面板那个 ☁️ 标识本身是个 `<span>`(注释写着「只是个标识、不是按钮」),点它同样没用。
40
+
41
+ ### 修复
42
+
43
+ 把 ☁️ 改成 `<button>`,点击即 `warmupAssets(remote, expert)`;点完立刻收起标识
44
+ (下载在后台跑,不给即时反馈会让人以为没生效)。CSS 加 `.t-team-cloud` 抹掉按钮默认外观。
45
+
46
+ ### 教训
47
+
48
+ **同一个动作(下载预热)在三个入口里只挂了两处** —— 注释写的是「点选与召唤都会自动下载」,
49
+ 但面板那条路径压根没实现。写「A 和 B 都会做 X」这类注释时,得真的去核对 B。
50
+
51
+
20
52
 
21
53
  **清理残留的诊断 alert** —— 0.4.55 那次「移除诊断」的字符串替换没匹配上,`alert` 留到了源码里。
22
54
 
package/lib/client.js CHANGED
@@ -67,7 +67,7 @@ var SectionBoundary = class extends import_react.default.Component {
67
67
 
68
68
  // src/client/state.js
69
69
  var NS = "t-team";
70
- var CLIENT_BUILD_VERSION = "0.4.57";
70
+ var CLIENT_BUILD_VERSION = "0.4.58";
71
71
  var PLUGIN_ID = "dsh-plugin-t-expert";
72
72
  var DIVISION_FALLBACK = "specialized";
73
73
  var NEW_DIVISION = "__new";
@@ -339,6 +339,7 @@ var CSS = `
339
339
  .t-team-prompt-body{margin:0;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12px;line-height:19px;white-space:pre-wrap;word-break:break-word;color:var(--dsw-alias-label-secondary)}
340
340
  .t-team-avatar{display:flex;align-items:center;justify-content:center;width:44px;height:44px;border-radius:50%;background:var(--dsw-alias-bg-layer-3);font-size:22px;line-height:1}
341
341
  .t-team-avatar img{width:100%;height:100%;border-radius:50%;object-fit:cover;display:block}
342
+ .t-team-cloud{border:0;background:none;padding:0;margin-inline-start:4px;cursor:pointer;font-size:inherit;line-height:1}.t-team-cloud:hover{opacity:.7}
342
343
  .t-team-identity{display:flex;min-width:0;flex-direction:column;padding-right:46px}
343
344
  .t-team-card-name{font-size:14px;font-weight:600;line-height:20px;color:var(--dsw-alias-label-primary);display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;overflow:hidden}
344
345
  .t-team-card-division{font-size:13px;line-height:18px;margin-top:2px;color:var(--dsw-alias-label-secondary)}
@@ -21586,6 +21587,7 @@ function SettingsPanel({ t, ctx, remote, skillRemote, getActive, initialTab, vie
21586
21587
  const [query, setQuery] = import_react5.default.useState("");
21587
21588
  const [avatars, setAvatars] = import_react5.default.useState({});
21588
21589
  const [avatarRev, setAvatarRev] = import_react5.default.useState(0);
21590
+ const [cloudClicked, setCloudClicked] = import_react5.default.useState({});
21589
21591
  const [division, setDivision] = import_react5.default.useState("");
21590
21592
  const [status, setStatus] = import_react5.default.useState("");
21591
21593
  const [error62, setError] = import_react5.default.useState("");
@@ -21920,7 +21922,19 @@ function SettingsPanel({ t, ctx, remote, skillRemote, getActive, initialTab, vie
21920
21922
  /* @__PURE__ */ import_react5.default.createElement("span", { className: "t-team-group-chevron", "aria-hidden": "true" }, open2 ? "\u25BE" : "\u25B8")
21921
21923
  ), open2 && /* @__PURE__ */ import_react5.default.createElement("div", { className: "t-team-grid" }, group.items.map((expert) => {
21922
21924
  const on = enabledSet.has(expert.slug);
21923
- return /* @__PURE__ */ import_react5.default.createElement("div", { className: "t-team-card", "data-enabled": on, key: expert.slug }, /* @__PURE__ */ import_react5.default.createElement("div", { className: "t-team-card-body" }, /* @__PURE__ */ import_react5.default.createElement("div", { className: "t-team-avatar" }, avatars[expert.slug] === void 0 ? expert.emoji || "\u{1F9E9}" : /* @__PURE__ */ import_react5.default.createElement("img", { src: avatars[expert.slug], alt: "" })), /* @__PURE__ */ import_react5.default.createElement("div", { className: "t-team-identity" }, /* @__PURE__ */ import_react5.default.createElement("div", { className: "t-team-card-name" }, displayName(expert, active), expert.custom === true && /* @__PURE__ */ import_react5.default.createElement(Tag2, { tone: "info" }, t("custom.badge")), expert.assets === "missing" && /* @__PURE__ */ import_react5.default.createElement("span", { title: t("assets.cloud"), style: { marginInlineStart: 4 } }, "\u2601\uFE0F")), /* @__PURE__ */ import_react5.default.createElement("div", { className: "t-team-card-division" }, divisionLabel(expert, active)), /* @__PURE__ */ import_react5.default.createElement("div", { className: "t-team-card-slug" }, expert.slug)), /* @__PURE__ */ import_react5.default.createElement("p", { className: "t-team-card-desc" }, displayDescription(expert, active)), expert.conflict === true && /* @__PURE__ */ import_react5.default.createElement("div", { className: "t-team-conflict", style: { gridColumn: "1/-1" } }, t("settings.conflict"))), /* @__PURE__ */ import_react5.default.createElement("div", { className: "t-team-card-tools" }, /* @__PURE__ */ import_react5.default.createElement(
21925
+ return /* @__PURE__ */ import_react5.default.createElement("div", { className: "t-team-card", "data-enabled": on, key: expert.slug }, /* @__PURE__ */ import_react5.default.createElement("div", { className: "t-team-card-body" }, /* @__PURE__ */ import_react5.default.createElement("div", { className: "t-team-avatar" }, avatars[expert.slug] === void 0 ? expert.emoji || "\u{1F9E9}" : /* @__PURE__ */ import_react5.default.createElement("img", { src: avatars[expert.slug], alt: "" })), /* @__PURE__ */ import_react5.default.createElement("div", { className: "t-team-identity" }, /* @__PURE__ */ import_react5.default.createElement("div", { className: "t-team-card-name" }, displayName(expert, active), expert.custom === true && /* @__PURE__ */ import_react5.default.createElement(Tag2, { tone: "info" }, t("custom.badge")), expert.assets === "missing" && cloudClicked[expert.slug] !== true && /* @__PURE__ */ import_react5.default.createElement(
21926
+ "button",
21927
+ {
21928
+ type: "button",
21929
+ className: "t-team-cloud",
21930
+ title: t("assets.cloud"),
21931
+ onClick: () => {
21932
+ warmupAssets(remote, expert);
21933
+ setCloudClicked((prev) => ({ ...prev, [expert.slug]: true }));
21934
+ }
21935
+ },
21936
+ "\u2601\uFE0F"
21937
+ )), /* @__PURE__ */ import_react5.default.createElement("div", { className: "t-team-card-division" }, divisionLabel(expert, active)), /* @__PURE__ */ import_react5.default.createElement("div", { className: "t-team-card-slug" }, expert.slug)), /* @__PURE__ */ import_react5.default.createElement("p", { className: "t-team-card-desc" }, displayDescription(expert, active)), expert.conflict === true && /* @__PURE__ */ import_react5.default.createElement("div", { className: "t-team-conflict", style: { gridColumn: "1/-1" } }, t("settings.conflict"))), /* @__PURE__ */ import_react5.default.createElement("div", { className: "t-team-card-tools" }, /* @__PURE__ */ import_react5.default.createElement(
21924
21938
  Button2,
21925
21939
  {
21926
21940
  variant: "ghost",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-plugin-t-expert",
3
- "version": "0.4.57",
3
+ "version": "0.4.58",
4
4
  "type": "module",
5
5
  "description": "T Expert — a 623-expert, 22-division roster with full Chinese translations, as a standalone DeepSeek Harness plugin.",
6
6
  "icon": "icon.svg",