dsh-plugin-t-expert 0.3.39 → 0.3.40

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.
Files changed (2) hide show
  1. package/lib/client.js +34 -5
  2. package/package.json +1 -1
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.40";
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/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.40",
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",