dsh-plugin-t-expert 0.3.39 → 0.3.41

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/lib/catalog.js CHANGED
@@ -28,28 +28,6 @@ import { dirname, join, relative } from "node:path";
28
28
  * }} CatalogMap
29
29
  */
30
30
 
31
- /** 内置的分区目录名(= divisions.json 的键)。 */
32
- export const DEFAULT_DIVISIONS = [
33
- "academic",
34
- "design",
35
- "engineering",
36
- "finance",
37
- "game-development",
38
- "gis",
39
- "healthcare",
40
- "marketing",
41
- "paid-media",
42
- "product",
43
- "project-management",
44
- "research",
45
- "sales",
46
- "security",
47
- "spatial-computing",
48
- "specialized",
49
- "support",
50
- "testing",
51
- ];
52
-
53
31
  /** 分区显示名(面板里用;缺省回退分区 key)。 */
54
32
  export const DIVISION_LABEL = {
55
33
  academic: { zh: "学术", en: "Academic" },
package/lib/client.js CHANGED
@@ -20018,7 +20018,7 @@ var scheduleWorkspaceSchema = external_exports.object({
20018
20018
 
20019
20019
  // src/client.jsx
20020
20020
  var NS = "t-team";
20021
- var CLIENT_BUILD_VERSION = "0.3.39";
20021
+ var CLIENT_BUILD_VERSION = "0.3.41";
20022
20022
  var uiPrefs = { showTaskBadge: true, showScheduleButton: true, showActivePulse: true };
20023
20023
  var UI_PREF_KEYS = Object.keys(uiPrefs);
20024
20024
  var uiPrefsListeners = /* @__PURE__ */ new Set();
@@ -22023,15 +22023,23 @@ function ActivePulse({ ctx, t }) {
22023
22023
  const show = useShowActivePulse();
22024
22024
  const sessions = useAttentionSessions(ctx);
22025
22025
  const [anchor2, setAnchor] = import_react.default.useState(null);
22026
+ import_react.default.useEffect(() => subscribePopoverClaims((owner) => {
22027
+ if (owner !== "pulse") setAnchor(null);
22028
+ }), []);
22029
+ const close = () => {
22030
+ setAnchor(null);
22031
+ releasePopover("pulse");
22032
+ };
22026
22033
  const attention = sessions.length > 0;
22027
22034
  if (!show) return null;
22028
22035
  const label = t(attention ? "pulse.on" : "pulse.off");
22029
22036
  const toggle = (event) => {
22030
22037
  if (anchor2 !== null) {
22031
- setAnchor(null);
22038
+ close();
22032
22039
  return;
22033
22040
  }
22034
22041
  const rect = event.currentTarget.getBoundingClientRect();
22042
+ claimPopover("pulse");
22035
22043
  setAnchor({ right: Math.max(8, window.innerWidth - rect.right - 24), top: Math.round(rect.bottom) + 6 });
22036
22044
  };
22037
22045
  return /* @__PURE__ */ import_react.default.createElement(import_react.default.Fragment, null, /* @__PURE__ */ import_react.default.createElement(
@@ -22067,11 +22075,11 @@ function ActivePulse({ ctx, t }) {
22067
22075
  t,
22068
22076
  sessions,
22069
22077
  anchor: anchor2,
22070
- onClose: () => setAnchor(null),
22078
+ onClose: close,
22071
22079
  onOpen: (id) => {
22072
22080
  expandOwningWorkspaceGroup(ctx, id);
22073
22081
  ctx?.sessions?.open?.(id);
22074
- setAnchor(null);
22082
+ close();
22075
22083
  }
22076
22084
  }
22077
22085
  ));
@@ -22848,6 +22856,21 @@ function useDockUi() {
22848
22856
  () => dockUi
22849
22857
  );
22850
22858
  }
22859
+ var popoverClaim = { owner: "", listeners: /* @__PURE__ */ new Set() };
22860
+ function claimPopover(id) {
22861
+ if (popoverClaim.owner === id) return;
22862
+ popoverClaim.owner = id;
22863
+ for (const listener of [...popoverClaim.listeners]) listener(popoverClaim.owner);
22864
+ }
22865
+ function releasePopover(id) {
22866
+ if (popoverClaim.owner !== id) return;
22867
+ popoverClaim.owner = "";
22868
+ for (const listener of [...popoverClaim.listeners]) listener(popoverClaim.owner);
22869
+ }
22870
+ function subscribePopoverClaims(listener) {
22871
+ popoverClaim.listeners.add(listener);
22872
+ return () => popoverClaim.listeners.delete(listener);
22873
+ }
22851
22874
  function jobDockPerfReset() {
22852
22875
  try {
22853
22876
  performance.clearMarks("t-team-jobs-open");
@@ -22871,6 +22894,9 @@ function JobsBadge({ t, ctx }) {
22871
22894
  import_react.default.useEffect(() => {
22872
22895
  if (!showBadge) setDockOpen(false);
22873
22896
  }, [showBadge]);
22897
+ import_react.default.useEffect(() => subscribePopoverClaims((owner) => {
22898
+ if (owner !== "dock") setDockOpen(false);
22899
+ }), []);
22874
22900
  if (!showBadge) return null;
22875
22901
  if (rows.length === 0 && subagents.length === 0) return null;
22876
22902
  const anyLive = liveCount > 0 || subagentsRunning > 0;
@@ -22890,7 +22916,10 @@ function JobsBadge({ t, ctx }) {
22890
22916
  onClick: () => {
22891
22917
  const next = !ui.open;
22892
22918
  setDockOpen(next);
22893
- if (next) jobDockPerfReset();
22919
+ if (next) {
22920
+ claimPopover("dock");
22921
+ jobDockPerfReset();
22922
+ }
22894
22923
  try {
22895
22924
  if (next) window.localStorage.removeItem(JOB_DOCK_CLOSED_KEY);
22896
22925
  else window.localStorage.setItem(JOB_DOCK_CLOSED_KEY, "1");
package/lib/index.js CHANGED
@@ -19,7 +19,6 @@ import { defineTool } from "@deepseek-ai/dsh-tools";
19
19
  import {
20
20
  CUSTOM_DIVISION,
21
21
  CUSTOM_LIMITS,
22
- DEFAULT_DIVISIONS,
23
22
  catalogDivisions,
24
23
  customExpertPath,
25
24
  divisionOf,
@@ -433,7 +432,9 @@ export function apply(ctx, config) {
433
432
 
434
433
  // ---- 花名册加载 ----
435
434
  let entries = [];
436
- let effectiveDivisions = config.divisions.length > 0 ? config.divisions.slice() : DEFAULT_DIVISIONS.slice();
435
+ // 初始为显式配置的分区(默认空);空数组 = 交给 loadCatalog 自动发现,
436
+ // 加载后 effectiveDivisions 会被 catalogDivisions() 的发现结果覆盖(不再有硬编码分区清单)。
437
+ let effectiveDivisions = config.divisions.slice();
437
438
  /** 自建专家根下发现的分区(默认只有 custom);进指纹,用于新建/删除后自动重载。 */
438
439
  let customDivisions = [];
439
440
  /** 只来自内置根的分区(官方、只读):自建分区不许与它们重名。 */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-plugin-t-expert",
3
- "version": "0.3.39",
3
+ "version": "0.3.41",
4
4
  "type": "module",
5
5
  "description": "T Expert — a 323-expert, 22-division roster with full Chinese translations, as a standalone DeepSeek Harness plugin, with a built-in multi-agent team engine (T Team).",
6
6
  "license": "MIT",