@nanmicoder/dsh-agent-teams 0.1.10 → 0.1.12

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/client.js CHANGED
@@ -246,12 +246,17 @@ window.__ModuleLoader__.load({
246
246
  /**
247
247
  * Start the single polling loop for the current session's requested targets.
248
248
  *
249
- * With no targets this is deliberately inert: installing the plugin must not
250
- * touch the state route. Live state is polled at the normal cadence; archive
251
- * state is fetched only as a one-time fallback for targets no longer live.
249
+ * With neither targets nor a discovery session this is deliberately inert.
250
+ * A discovery session performs one live+archive pass after selection/restart;
251
+ * it keeps polling only while that captain still owns a live team. This
252
+ * restores legacy/cardless history without turning every ordinary session
253
+ * into a permanent one-second filesystem scan. Explicit card targets retain
254
+ * the normal cadence, and archive state is refreshed when a target or a
255
+ * previously discovered live team disappears.
252
256
  */
253
257
  function startActivityPolling(monitorTargets, runtime = {}) {
254
- if (monitorTargets.length === 0) return {
258
+ const discoverySessionId = runtime.discoverySessionId?.trim();
259
+ if (monitorTargets.length === 0 && (discoverySessionId === void 0 || discoverySessionId === "")) return {
255
260
  firstTick: Promise.resolve(),
256
261
  stop: () => {}
257
262
  };
@@ -264,9 +269,12 @@ window.__ModuleLoader__.load({
264
269
  const settleTargets = runtime.settleTargets ?? settleActivityMonitorTargets;
265
270
  let cancelled = false;
266
271
  let inFlight = false;
272
+ let discoveryComplete = false;
273
+ let discoveredLiveKeys = /* @__PURE__ */ new Set();
267
274
  let controller;
268
275
  const tick = async () => {
269
276
  if (inFlight || cancelled) return;
277
+ if (discoveryComplete && monitorTargets.length === 0 && discoveredLiveKeys.size === 0) return;
270
278
  inFlight = true;
271
279
  controller = new AbortController();
272
280
  try {
@@ -279,8 +287,12 @@ window.__ModuleLoader__.load({
279
287
  if (cancelled || !Array.isArray(body.teams)) return;
280
288
  const liveTeams = body.teams;
281
289
  publishSnapshots({ teams: liveTeams });
290
+ const previousDiscoveredKeys = discoveredLiveKeys;
291
+ discoveredLiveKeys = new Set(discoverySessionId === void 0 || discoverySessionId === "" ? [] : liveTeams.filter((team) => team.captainSessionId === discoverySessionId).map((team) => team.teamId));
292
+ const discoveredTeamArchived = [...previousDiscoveredKeys].some((teamId) => !discoveredLiveKeys.has(teamId));
282
293
  const missing = monitorTargets.filter((target) => !liveTeams.some((team) => team.captainSessionId === target.sessionId && team.teamId === target.teamId));
283
- if (missing.length === 0) return;
294
+ const needsDiscoveryArchive = discoverySessionId !== void 0 && discoverySessionId !== "" && !discoveryComplete;
295
+ if (missing.length === 0 && !needsDiscoveryArchive && !discoveredTeamArchived) return;
284
296
  const archivedResponse = await fetchState(`${ACTIVITY_STATE_URL}?archived=1`, {
285
297
  cache: "no-store",
286
298
  signal: controller.signal
@@ -289,6 +301,7 @@ window.__ModuleLoader__.load({
289
301
  const archivedBody = await archivedResponse.json();
290
302
  if (cancelled || !Array.isArray(archivedBody.teams)) return;
291
303
  publishSnapshots({ archivedTeams: archivedBody.teams });
304
+ discoveryComplete = true;
292
305
  settleTargets(new Set(missing.map((target) => target.key)));
293
306
  } catch (error) {
294
307
  if (error?.name === "AbortError") return;
@@ -401,7 +414,7 @@ window.__ModuleLoader__.load({
401
414
  } }));
402
415
  }
403
416
  /** Render one durable team as a compact conversation card. */
404
- function AgentTeamsCard({ node, openSession, sessionId }) {
417
+ function AgentTeamsCard({ node, openMember, sessionId, t }) {
405
418
  const data = node.data;
406
419
  const owner = data.captainSessionId || sessionId;
407
420
  const { teams, archivedTeams } = (0, react.useSyncExternalStore)(subscribeActivitySnapshots, getActivitySnapshotsSnapshot);
@@ -441,9 +454,9 @@ window.__ModuleLoader__.load({
441
454
  title: resolved.teamName,
442
455
  children: resolved.teamName
443
456
  }),
444
- (0, react_jsx_runtime.jsxs)("span", {
457
+ (0, react_jsx_runtime.jsx)("span", {
445
458
  className: AgentTeamsCard_module_css_default.memberCount,
446
- children: [resolved.members.length, " 名成员"]
459
+ children: t("card.memberCount", { count: resolved.members.length })
447
460
  }),
448
461
  (0, react_jsx_runtime.jsx)("button", {
449
462
  type: "button",
@@ -451,9 +464,9 @@ window.__ModuleLoader__.load({
451
464
  onClick: () => {
452
465
  openActivityPanel(resolved);
453
466
  },
454
- "aria-label": "打开活动面板",
455
- title: "打开活动面板",
456
- children: "活动面板"
467
+ "aria-label": t("action.openActivityPanel"),
468
+ title: t("action.openActivityPanel"),
469
+ children: t("activity.panelButton")
457
470
  })
458
471
  ]
459
472
  }), resolved.members.length > 0 && (0, react_jsx_runtime.jsx)("div", {
@@ -462,7 +475,7 @@ window.__ModuleLoader__.load({
462
475
  type: "button",
463
476
  className: AgentTeamsCard_module_css_default.member,
464
477
  onClick: () => {
465
- if (member.id !== "") openSession(member.id);
478
+ if (member.id !== "") openMember(owner, member.id);
466
479
  },
467
480
  title: member.role === "" ? member.name : `${member.name} · ${member.role}`,
468
481
  children: [memberArtUrl(member.name, member.role) !== null ? (0, react_jsx_runtime.jsx)("img", {
@@ -637,7 +650,7 @@ window.__ModuleLoader__.load({
637
650
  }
638
651
  //#endregion
639
652
  //#region \0dsh-css:/home/runner/work/dsh-agent-teams/dsh-agent-teams/src/client/ActivityPanel.module.css.mjs
640
- const css = "html{--agent-teams-panel-shift:420px}html[data-agent-teams-panel-open] [data-phase=active]{box-sizing:border-box;padding-right:var(--agent-teams-panel-shift)}.aYQbCq_badge,.aYQbCq_panel{--dsw-alias-line-normal:var(--dsw-static-neutral-bluish-150,#e7e9ee);--dsw-alias-line-strong:color-mix(in srgb, var(--dsw-static-neutral-bluish-200,#e1e5ee) 50%, var(--dsw-static-neutral-bluish-300,#cfd3d6));--dsw-alias-bg-module:var(--dsw-alias-bg-layer-1,#fff);--dsw-alias-bg-fill-neutral:var(--dsw-static-neutral-bluish-100,#eef0f4);--dsw-alias-bg-fill-business:var(--dsw-alias-state-business-primary,#4d6bfe);--dsw-alias-bg-fill-success:var(--dsw-alias-state-success-primary,#12a150);--dsw-alias-bg-fill-warning:var(--dsw-alias-state-warn-primary,#e08700);--dsw-alias-bg-fill-danger:var(--dsw-alias-state-error-primary,#e5484d);--dsw-alias-state-success:var(--dsw-alias-state-success-primary,#12a150);--dsw-alias-state-warning:var(--dsw-alias-state-warn-primary,#e08700);--dsw-alias-state-danger:var(--dsw-alias-state-error-primary,#e5484d);--dsw-alias-label-on-fill:var(--dsw-alias-label-primary-inverted,#fff)}.aYQbCq_badge{box-sizing:border-box;border:1px solid var(--dsw-alias-line-normal);background:color-mix(in srgb, var(--dsw-alias-bg-module-platform) 92%, transparent);backdrop-filter:blur(16px);height:34px;box-shadow:0 8px 28px color-mix(in srgb, var(--dsw-alias-label-primary) 14%, transparent);color:var(--dsw-alias-label-secondary);font:inherit;cursor:pointer;border-radius:999px;align-items:center;gap:7px;padding:0 12px;font-size:12px;font-weight:600;line-height:20px;transition:border-color .15s,transform .12s;display:inline-flex;position:absolute;top:64px;right:18px}.aYQbCq_badge:hover{border-color:var(--dsw-alias-line-strong);transform:translateY(-1px)}.aYQbCq_badge:active{transform:translateY(0)scale(.98)}.aYQbCq_badge:focus-visible,.aYQbCq_iconButton:focus-visible,.aYQbCq_memberRow:focus-visible,.aYQbCq_membersToggle:focus-visible,.aYQbCq_sectionToggleTitle:focus-visible,.aYQbCq_dagNode:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:2px}.aYQbCq_badgeDot,.aYQbCq_panelDot{background:var(--dsw-alias-label-tertiary);border-radius:50%;width:7px;height:7px}.aYQbCq_badgeDot[data-busy=true],.aYQbCq_panelDot[data-busy=true]{background:var(--dsw-alias-state-business-primary);animation:1.25s ease-in-out infinite aYQbCq_agentTeamsPulse}.aYQbCq_badgeCount,.aYQbCq_memberCount,.aYQbCq_teamStats,.aYQbCq_stageLabel,.aYQbCq_taskId{font-variant-numeric:tabular-nums}.aYQbCq_panel{box-sizing:border-box;border:1px solid color-mix(in srgb, var(--dsw-alias-line-strong) 58%, transparent);background:color-mix(in srgb, var(--dsw-alias-bg-module) 95%, transparent);backdrop-filter:blur(20px)saturate(1.08);box-shadow:0 12px 32px color-mix(in srgb, var(--dsw-alias-label-primary) 12%, transparent), 0 32px 72px color-mix(in srgb, var(--dsw-alias-label-primary) 16%, transparent);will-change:transform;border-radius:16px;flex-direction:column;animation:.16s ease-out aYQbCq_agentTeamsPanelIn;display:flex;position:absolute;top:0;left:0;overflow:hidden}.aYQbCq_panel[data-dragging],.aYQbCq_panel[data-resizing]{user-select:none;box-shadow:0 16px 38px color-mix(in srgb, var(--dsw-alias-label-primary) 14%, transparent), 0 36px 78px color-mix(in srgb, var(--dsw-alias-label-primary) 18%, transparent)}@keyframes aYQbCq_agentTeamsPanelIn{0%{opacity:0}to{opacity:1}}@keyframes aYQbCq_agentTeamsPulse{0%,to{opacity:.42}50%{opacity:1}}.aYQbCq_panelHead{border-bottom:1px solid var(--dsw-alias-line-normal);cursor:grab;touch-action:none;flex:none;justify-content:space-between;align-items:center;min-height:44px;padding:0 14px 0 16px;display:flex}.aYQbCq_panelHead:active,.aYQbCq_panel[data-dragging] .aYQbCq_panelHead{cursor:grabbing}.aYQbCq_panel[data-compact] .aYQbCq_panelHead{cursor:default;touch-action:auto}.aYQbCq_panelTitle{color:var(--dsw-alias-label-primary);align-items:center;gap:8px;font-size:14px;font-weight:600;line-height:20px;display:inline-flex}.aYQbCq_panelControls{flex:none;align-items:center;gap:2px;display:inline-flex}.aYQbCq_iconButton{width:28px;height:28px;color:var(--dsw-alias-label-tertiary);cursor:pointer;background:0 0;border:0;border-radius:7px;justify-content:center;align-items:center;padding:0;transition:background-color .12s,color .12s,transform .12s;display:inline-flex}.aYQbCq_iconButton:hover{background:var(--dsw-alias-bg-fill-neutral);color:var(--dsw-alias-label-primary)}.aYQbCq_iconButton:active{transform:scale(.94)}.aYQbCq_iconButton[data-control=dock][data-mode=docked] svg{transform:scaleX(-1)}.aYQbCq_resizeHandle{z-index:1;touch-action:none;position:absolute}.aYQbCq_resizeHandle[data-resize-edge=left]{cursor:ew-resize;width:8px;top:44px;bottom:8px;left:0}.aYQbCq_resizeHandle[data-resize-edge=bottom]{cursor:ns-resize;height:8px;bottom:0;left:12px;right:12px}.aYQbCq_resizeHandle[data-resize-edge=corner]{cursor:nwse-resize;width:18px;height:18px;bottom:0;right:0}.aYQbCq_resizeHandle[data-resize-edge=corner]:after{border-right:1px solid var(--dsw-alias-label-tertiary);border-bottom:1px solid var(--dsw-alias-label-tertiary);content:\"\";opacity:.52;width:7px;height:7px;position:absolute;bottom:4px;right:4px}.aYQbCq_teams{overscroll-behavior:contain;scrollbar-color:color-mix(in srgb, var(--dsw-alias-label-tertiary) 28%, transparent) transparent;scrollbar-width:thin;flex-direction:column;min-height:0;display:flex;overflow-y:auto}.aYQbCq_teams::-webkit-scrollbar{width:6px}.aYQbCq_teams::-webkit-scrollbar-track{background:0 0}.aYQbCq_teams::-webkit-scrollbar-thumb{background:color-mix(in srgb, var(--dsw-alias-label-tertiary) 28%, transparent);background-clip:padding-box;border:2px solid #0000;border-radius:999px}.aYQbCq_teams:hover::-webkit-scrollbar-thumb{background:color-mix(in srgb, var(--dsw-alias-label-tertiary) 44%, transparent);background-clip:padding-box}.aYQbCq_team{border-bottom:1px solid var(--dsw-alias-line-normal);flex-direction:column;gap:12px;padding:12px 14px 16px;display:flex}.aYQbCq_team:last-child{border-bottom:0}.aYQbCq_teamHead{align-items:center;gap:10px;min-width:0;display:flex}.aYQbCq_teamName{min-width:0;color:var(--dsw-alias-label-primary);text-overflow:ellipsis;white-space:nowrap;flex:1;font-size:13px;font-weight:600;line-height:18px;overflow:hidden}.aYQbCq_teamStats{color:var(--dsw-alias-label-tertiary);white-space:nowrap;flex:none;gap:8px;font-size:10.5px;line-height:16px;display:inline-flex}.aYQbCq_sectionHead{justify-content:space-between;align-items:center;gap:8px;min-width:0;display:flex}.aYQbCq_sectionTitle{color:var(--dsw-alias-label-secondary);align-items:center;gap:6px;font-size:11px;font-weight:600;line-height:16px;display:inline-flex}.aYQbCq_sectionHint{color:var(--dsw-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;font-size:10px;line-height:14px;overflow:hidden}.aYQbCq_delegationSection{min-width:0}.aYQbCq_captainNode{box-sizing:border-box;border:1px solid color-mix(in srgb, var(--dsw-alias-state-business-primary) 32%, var(--dsw-alias-line-normal));background:color-mix(in srgb, var(--dsw-alias-state-business-primary) 7%, var(--dsw-alias-bg-module));border-radius:10px;grid-template-columns:48px minmax(0,1fr) auto;align-items:center;gap:9px;min-height:56px;padding:6px 10px;display:grid}.aYQbCq_captainAvatar,.aYQbCq_memberAvatar{flex:none;justify-content:center;align-items:center;display:inline-flex;position:relative}.aYQbCq_captainAvatar{width:46px;height:46px}.aYQbCq_leadAvatar,.aYQbCq_memberArt{object-fit:contain;filter:drop-shadow(0 1px 1px #122d4833);background:0 0;border:0;border-radius:0}.aYQbCq_leadAvatar{width:44px;height:44px}.aYQbCq_memberArt{width:40px;height:40px}.aYQbCq_captainInfo,.aYQbCq_memberInfo{flex-direction:column;min-width:0;display:flex}.aYQbCq_captainInfo{gap:2px}.aYQbCq_captainLine,.aYQbCq_memberLine{align-items:center;gap:6px;min-width:0;display:flex}.aYQbCq_captainName,.aYQbCq_memberName{color:var(--dsw-alias-label-primary);text-overflow:ellipsis;white-space:nowrap;font-size:12.5px;font-weight:600;line-height:18px;overflow:hidden}.aYQbCq_captainRole,.aYQbCq_memberRole{color:var(--dsw-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;font-size:10px;line-height:14px;overflow:hidden}.aYQbCq_captainSummary,.aYQbCq_memberStatusLine{color:var(--dsw-alias-label-secondary);text-overflow:ellipsis;white-space:nowrap;font-size:10.5px;line-height:15px;overflow:hidden}.aYQbCq_captainState,.aYQbCq_memberState{color:var(--dsw-alias-label-tertiary);white-space:nowrap;flex:none;align-items:center;gap:5px;font-size:10px;font-weight:500;line-height:15px;display:inline-flex}.aYQbCq_captainState[data-busy=true],.aYQbCq_memberState[data-activity=working]{color:var(--dsw-alias-state-business-primary)}.aYQbCq_workGlyph rect{opacity:.5}.aYQbCq_workGlyph[data-active=true] rect{animation:1.1s ease-in-out infinite aYQbCq_agentTeamsDot}@keyframes aYQbCq_agentTeamsDot{0%,to{opacity:.25}50%{opacity:1}}.aYQbCq_progressOverview{flex-direction:column;gap:7px;display:flex}.aYQbCq_progressTitle{color:var(--dsw-alias-label-secondary);font-size:11px;font-weight:600;line-height:16px}.aYQbCq_progressSegments{gap:3px;display:flex}.aYQbCq_progressSegments>span,.aYQbCq_progressEmpty{background:var(--dsw-alias-line-strong);border-radius:2px;flex:1;height:5px}.aYQbCq_progressEmpty{width:100%;display:block}.aYQbCq_progressSegments>span[data-state=running]{background:var(--dsw-alias-state-business-primary)}.aYQbCq_progressSegments>span[data-state=blocked]{background:var(--dsw-alias-state-warning)}.aYQbCq_progressSegments>span[data-state=completed]{background:var(--dsw-alias-state-success)}.aYQbCq_progressSegments>span[data-state=failed]{background:var(--dsw-alias-state-danger)}.aYQbCq_progressSegments>span[data-state=cancelled]{opacity:.55}.aYQbCq_progressLegend{color:var(--dsw-alias-label-tertiary);gap:10px;font-size:9.5px;line-height:14px;display:flex}.aYQbCq_progressLegend>span[data-state=running]{color:var(--dsw-alias-state-business-primary)}.aYQbCq_progressLegend>span[data-state=blocked]{color:var(--dsw-alias-state-warning)}.aYQbCq_progressLegend>span[data-state=completed]{color:var(--dsw-alias-state-success)}.aYQbCq_progressSummary{background:color-mix(in srgb, var(--dsw-alias-state-business-primary) 7%, var(--dsw-alias-bg-module));min-width:0;color:var(--dsw-alias-label-secondary);border-radius:8px;align-items:center;gap:6px;padding:5px 8px;font-size:10px;font-weight:600;line-height:15px;display:flex}.aYQbCq_progressSummary[data-state=warning]{background:color-mix(in srgb, var(--dsw-alias-state-warning) 8%, var(--dsw-alias-bg-module))}.aYQbCq_progressSummary[data-state=completed]{background:color-mix(in srgb, var(--dsw-alias-state-success) 8%, var(--dsw-alias-bg-module))}.aYQbCq_progressSummary>span:last-child{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.aYQbCq_progressSummaryDot{background:var(--dsw-alias-state-business-primary);border-radius:50%;flex:none;width:5px;height:5px}.aYQbCq_progressSummary[data-state=warning] .aYQbCq_progressSummaryDot{background:var(--dsw-alias-state-warning)}.aYQbCq_progressSummary[data-state=completed] .aYQbCq_progressSummaryDot{background:var(--dsw-alias-state-success)}.aYQbCq_membersToggle{background:var(--dsw-alias-bg-module-platform);width:100%;color:var(--dsw-alias-label-secondary);font:inherit;cursor:pointer;border:0;border-radius:8px;justify-content:space-between;align-items:center;gap:8px;padding:6px 8px;font-size:10.5px;font-weight:600;line-height:15px;display:flex}.aYQbCq_membersToggle:hover{background:var(--dsw-alias-bg-fill-neutral)}.aYQbCq_membersToggle>span{align-items:center;gap:5px;display:inline-flex}.aYQbCq_membersToggle>span:last-child{color:var(--dsw-alias-state-business-primary)}.aYQbCq_chevron{flex:none;transition:transform .14s}.aYQbCq_chevron[data-open=true]{transform:rotate(90deg)}.aYQbCq_delegationTree{flex-direction:column;gap:2px;margin-left:18px;padding:9px 0 0 20px;display:flex;position:relative}.aYQbCq_delegationTree:before{background:color-mix(in srgb, var(--dsw-alias-state-business-primary) 48%, var(--dsw-alias-line-normal));content:\"\";width:1px;position:absolute;top:0;bottom:22px;left:0}.aYQbCq_memberBlock{flex-direction:column;min-width:0;padding:3px 0 7px;display:flex;position:relative}.aYQbCq_memberBranch{background:color-mix(in srgb, var(--dsw-alias-state-business-primary) 48%, var(--dsw-alias-line-normal));width:20px;height:1px;display:block;position:absolute;top:27px;right:100%}.aYQbCq_memberBranch:before{background:var(--dsw-alias-state-business-primary);content:\"\";border-radius:50%;width:5px;height:5px;position:absolute;top:-2px;right:-1px}.aYQbCq_memberRow{box-sizing:border-box;width:100%;min-width:0;min-height:48px;color:inherit;font:inherit;text-align:left;cursor:pointer;background:0 0;border:0;border-radius:8px;grid-template-columns:46px minmax(0,1fr) auto;align-items:center;gap:8px;padding:4px 6px;transition:background-color .12s,transform .12s;display:grid}.aYQbCq_memberRow:hover,.aYQbCq_memberRow[data-activity=working]{background:color-mix(in srgb, var(--dsw-alias-state-business-primary) 6%, var(--dsw-alias-bg-module))}.aYQbCq_memberRow:active{transform:scale(.995)}.aYQbCq_memberAvatar{width:42px;height:42px}.aYQbCq_memberAvatar[data-unread=true]:after{box-sizing:border-box;border:1px solid var(--dsw-alias-bg-module);background:var(--dsw-alias-state-business-primary);content:\"\";border-radius:50%;width:6px;height:6px;animation:1.8s ease-in-out infinite aYQbCq_agentTeamsUnreadPulse;position:absolute;top:0;right:-1px}@keyframes aYQbCq_agentTeamsUnreadPulse{0%,to{opacity:.78;transform:scale(.92)}50%{opacity:1;transform:scale(1.16)}}.aYQbCq_memberInitial{background:var(--dsw-alias-bg-fill-business);width:34px;height:34px;color:var(--dsw-alias-label-on-fill);border-radius:50%;justify-content:center;align-items:center;font-size:14px;font-weight:600;line-height:20px;display:inline-flex}.aYQbCq_stateArt{box-sizing:border-box;object-fit:contain;width:22px;height:22px;filter:drop-shadow(0 0 1px var(--dsw-alias-bg-module)) drop-shadow(0 1px 1px #122d483d);background:0 0;border:0;border-radius:0;position:absolute;bottom:-3px;right:-5px}.aYQbCq_stateArt[data-activity=working]{animation:2.4s ease-in-out infinite aYQbCq_agentTeamsFloat}.aYQbCq_stateArt[data-activity=idle]{animation:4.2s ease-in-out infinite aYQbCq_agentTeamsBreathe}.aYQbCq_stateArt[data-activity=unknown]{animation:2.8s ease-in-out infinite aYQbCq_agentTeamsThink}@keyframes aYQbCq_agentTeamsFloat{0%,to{transform:translateY(0)rotate(-4deg)}50%{transform:translateY(-2px)rotate(4deg)}}@keyframes aYQbCq_agentTeamsBreathe{0%,to{opacity:.82;transform:scale(1)}50%{opacity:1;transform:scale(1.06)}}@keyframes aYQbCq_agentTeamsThink{0%,to{transform:rotate(-7deg)}50%{transform:rotate(7deg)}}.aYQbCq_memberState{margin-left:auto}.aYQbCq_memberCount{color:var(--dsw-alias-label-tertiary);font-size:10.5px;line-height:16px}.aYQbCq_assignmentLine{align-items:center;gap:7px;min-width:0;padding:0 6px 0 60px;display:flex}.aYQbCq_assignmentLabel{color:var(--dsw-alias-label-tertiary);flex:none;font-size:9.5px;line-height:14px}.aYQbCq_assignmentTasks{flex-wrap:wrap;flex:1;gap:4px;min-width:0;display:flex}.aYQbCq_assignmentChip{background:var(--dsw-alias-bg-fill-neutral);min-height:16px;color:var(--dsw-alias-label-secondary);border-radius:4px;align-items:center;padding:0 5px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:9px;font-weight:600;line-height:14px;display:inline-flex}.aYQbCq_assignmentChip[data-state=running]{background:var(--dsw-alias-bg-fill-business);color:var(--dsw-alias-label-on-fill)}.aYQbCq_assignmentChip[data-state=completed]{background:var(--dsw-alias-bg-fill-success);color:var(--dsw-alias-label-on-fill)}.aYQbCq_assignmentChip[data-state=blocked]{background:var(--dsw-alias-bg-fill-warning);color:var(--dsw-alias-label-on-fill)}.aYQbCq_assignmentChip[data-state=failed]{background:var(--dsw-alias-bg-fill-danger);color:var(--dsw-alias-label-on-fill)}.aYQbCq_assignmentChip[data-state=cancelled]{color:var(--dsw-alias-label-tertiary);text-decoration:line-through}.aYQbCq_unreadPill{color:var(--dsw-alias-state-business-primary);white-space:nowrap;flex:none;font-size:9.5px;font-weight:600;line-height:14px}.aYQbCq_taskEmpty{color:var(--dsw-alias-label-tertiary);font-size:9.5px;line-height:14px}.aYQbCq_dependencySection{border-top:1px solid var(--dsw-alias-line-normal);flex-direction:column;gap:7px;min-width:0;padding-top:10px;display:flex}.aYQbCq_sectionToggleTitle{color:var(--dsw-alias-label-secondary);font:inherit;cursor:pointer;background:0 0;border:0;align-items:center;gap:6px;padding:0;font-size:11px;font-weight:600;line-height:16px;display:inline-flex}.aYQbCq_dagViewport{scrollbar-width:thin;min-width:0;padding:2px 0 4px;overflow-x:auto}.aYQbCq_dagCanvas{min-width:100%;position:relative}.aYQbCq_dagCanvas[data-layout=parallel]{flex-wrap:wrap;gap:8px;display:flex}.aYQbCq_dagCanvas[data-layout=parallel] .aYQbCq_dagNode{flex:92px;min-width:92px;position:relative}.aYQbCq_dagEdges{pointer-events:none;position:absolute;inset:0;overflow:visible}.aYQbCq_dagEdges path{fill:none;stroke:var(--dsw-alias-line-strong);stroke-width:1px;transition:opacity .14s,stroke .14s,stroke-width .14s}.aYQbCq_dagEdges path[data-active=true]{stroke:var(--dsw-alias-state-business-primary);stroke-width:1.6px}.aYQbCq_dagEdges path[data-dimmed=true]{opacity:.24}.aYQbCq_dagNode{box-sizing:border-box;border:1px solid var(--dsw-alias-line-normal);background:var(--dsw-alias-bg-module);color:var(--dsw-alias-label-primary);font:inherit;text-align:left;cursor:pointer;border-radius:6px;flex-direction:column;justify-content:center;gap:1px;padding:0 6px;transition:border-color .14s,background-color .14s,opacity .14s;display:flex;position:absolute}.aYQbCq_dagNode:hover,.aYQbCq_dagNode[data-focused=true]{border-color:var(--dsw-alias-state-business-primary);background:color-mix(in srgb, var(--dsw-alias-state-business-primary) 6%, var(--dsw-alias-bg-module))}.aYQbCq_dagNode[data-dimmed=true]{opacity:.3}.aYQbCq_dagNode[data-state=running][data-dimmed=true]{opacity:.58}.aYQbCq_dagNode[data-state=completed]{border-color:color-mix(in srgb, var(--dsw-alias-state-success) 48%, var(--dsw-alias-line-normal))}.aYQbCq_dagNode[data-state=blocked]{border-color:color-mix(in srgb, var(--dsw-alias-state-warning) 52%, var(--dsw-alias-line-normal))}.aYQbCq_dagNode[data-state=failed]{border-color:color-mix(in srgb, var(--dsw-alias-state-danger) 56%, var(--dsw-alias-line-normal))}.aYQbCq_dagNodeHead{color:var(--dsw-alias-label-primary);align-items:center;gap:4px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:9.5px;font-weight:700;display:flex}.aYQbCq_dagNodeDot{background:var(--dsw-alias-line-strong);border-radius:1.5px;flex:none;width:5px;height:5px}.aYQbCq_dagNode[data-state=running] .aYQbCq_dagNodeDot{background:var(--dsw-alias-state-business-primary)}.aYQbCq_dagNode[data-state=running] .aYQbCq_dagNodeHead{padding-right:12px}.aYQbCq_dagRunningState{width:9px;height:9px;color:var(--dsw-alias-state-business-primary);pointer-events:none;justify-content:center;align-items:center;display:inline-flex;position:absolute;top:4px;right:5px}.aYQbCq_dagRunningState .aYQbCq_workGlyph{width:9px;height:9px}.aYQbCq_dagNode[data-state=blocked] .aYQbCq_dagNodeDot{background:var(--dsw-alias-state-warning)}.aYQbCq_dagNode[data-state=completed] .aYQbCq_dagNodeDot{background:var(--dsw-alias-state-success)}.aYQbCq_dagNode[data-state=failed] .aYQbCq_dagNodeDot{background:var(--dsw-alias-state-danger)}.aYQbCq_dagNodeLabel{color:var(--dsw-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;font-size:8.5px;line-height:11px;overflow:hidden}.aYQbCq_taskDetail{border:1px solid var(--dsw-alias-line-normal);background:var(--dsw-alias-bg-module-platform);border-radius:9px;flex-direction:column;gap:3px;min-width:0;padding:7px 9px;display:flex}.aYQbCq_taskDetailHead{align-items:center;gap:6px;min-width:0;display:flex}.aYQbCq_taskDetailId{color:var(--dsw-alias-state-business-primary);flex:none;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:10px;font-weight:700}.aYQbCq_taskDetailSubject{min-width:0;color:var(--dsw-alias-label-primary);text-overflow:ellipsis;white-space:nowrap;font-size:11px;font-weight:600;line-height:16px;overflow:hidden}.aYQbCq_taskDetailBadge{background:var(--dsw-alias-bg-fill-neutral);color:var(--dsw-alias-label-secondary);border-radius:4px;flex:none;padding:0 5px;font-size:8.5px;font-weight:600;line-height:14px}.aYQbCq_taskDetailBadge[data-state=running]{background:var(--dsw-alias-bg-fill-business);color:var(--dsw-alias-label-on-fill)}.aYQbCq_taskDetailBadge[data-state=blocked]{background:var(--dsw-alias-bg-fill-warning);color:var(--dsw-alias-label-on-fill)}.aYQbCq_taskDetailBadge[data-state=completed]{background:var(--dsw-alias-bg-fill-success);color:var(--dsw-alias-label-on-fill)}.aYQbCq_taskDetailBadge[data-state=failed]{background:var(--dsw-alias-bg-fill-danger);color:var(--dsw-alias-label-on-fill)}.aYQbCq_taskDetailLine,.aYQbCq_taskDetailMeta{color:var(--dsw-alias-label-secondary);font-size:9.5px;line-height:14px}.aYQbCq_taskDetailMeta{color:var(--dsw-alias-label-tertiary)}.aYQbCq_emptyHint{color:var(--dsw-alias-label-tertiary);padding:10px 12px;font-size:11px;line-height:16px}.aYQbCq_historicPill{background:var(--dsw-alias-bg-fill-neutral);color:var(--dsw-alias-label-tertiary);border-radius:4px;flex:none;margin-left:auto;padding:1px 7px;font-size:9.5px;font-weight:600;line-height:15px}.aYQbCq_members{flex-direction:column;gap:3px;display:flex}.aYQbCq_archivedWrap:before{color:var(--dsw-alias-label-tertiary);content:\"已结束 · 历史归档\";padding:5px 14px 0;font-size:9.5px;font-weight:600;line-height:14px;display:block}@media (prefers-reduced-motion:reduce){.aYQbCq_panel,.aYQbCq_badge,.aYQbCq_badgeDot,.aYQbCq_panelDot,.aYQbCq_workGlyph rect,.aYQbCq_stateArt,.aYQbCq_memberAvatar[data-unread=true]:after{transition:none;animation:none}}@media (width<=960px){html[data-agent-teams-panel-open] [data-phase=active]{padding-right:0}}@media (width<=640px){.aYQbCq_badge{top:56px;right:10px}.aYQbCq_teamStats span[data-stat=messages]{display:none}.aYQbCq_captainNode{grid-template-columns:48px minmax(0,1fr)}.aYQbCq_captainState{display:none}.aYQbCq_delegationTree{margin-left:12px;padding-left:15px}.aYQbCq_memberBranch{width:15px}.aYQbCq_assignmentLine{padding-left:53px}}";
653
+ const css = "html{--agent-teams-panel-shift:420px}html[data-agent-teams-panel-open] [data-phase=active]{box-sizing:border-box;padding-right:var(--agent-teams-panel-shift)}.aYQbCq_badge,.aYQbCq_panel{--dsw-alias-line-normal:var(--dsw-static-neutral-bluish-150,#e7e9ee);--dsw-alias-line-strong:color-mix(in srgb, var(--dsw-static-neutral-bluish-200,#e1e5ee) 50%, var(--dsw-static-neutral-bluish-300,#cfd3d6));--dsw-alias-bg-module:var(--dsw-alias-bg-layer-1,#fff);--dsw-alias-bg-fill-neutral:var(--dsw-static-neutral-bluish-100,#eef0f4);--dsw-alias-bg-fill-business:var(--dsw-alias-state-business-primary,#4d6bfe);--dsw-alias-bg-fill-success:var(--dsw-alias-state-success-primary,#12a150);--dsw-alias-bg-fill-warning:var(--dsw-alias-state-warn-primary,#e08700);--dsw-alias-bg-fill-danger:var(--dsw-alias-state-error-primary,#e5484d);--dsw-alias-state-success:var(--dsw-alias-state-success-primary,#12a150);--dsw-alias-state-warning:var(--dsw-alias-state-warn-primary,#e08700);--dsw-alias-state-danger:var(--dsw-alias-state-error-primary,#e5484d);--dsw-alias-label-on-fill:var(--dsw-alias-label-primary-inverted,#fff)}.aYQbCq_badge{box-sizing:border-box;border:1px solid var(--dsw-alias-line-normal);background:color-mix(in srgb, var(--dsw-alias-bg-module-platform) 92%, transparent);backdrop-filter:blur(16px);height:34px;box-shadow:0 8px 28px color-mix(in srgb, var(--dsw-alias-label-primary) 14%, transparent);color:var(--dsw-alias-label-secondary);font:inherit;cursor:pointer;border-radius:999px;align-items:center;gap:7px;padding:0 12px;font-size:12px;font-weight:600;line-height:20px;transition:border-color .15s,transform .12s;display:inline-flex;position:absolute;top:64px;right:18px}.aYQbCq_badge:hover{border-color:var(--dsw-alias-line-strong);transform:translateY(-1px)}.aYQbCq_badge:active{transform:translateY(0)scale(.98)}.aYQbCq_badge:focus-visible,.aYQbCq_iconButton:focus-visible,.aYQbCq_memberRow:focus-visible,.aYQbCq_membersToggle:focus-visible,.aYQbCq_sectionToggleTitle:focus-visible,.aYQbCq_dagNode:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:2px}.aYQbCq_badgeDot,.aYQbCq_panelDot{background:var(--dsw-alias-label-tertiary);border-radius:50%;width:7px;height:7px}.aYQbCq_badgeDot[data-busy=true],.aYQbCq_panelDot[data-busy=true]{background:var(--dsw-alias-state-business-primary);animation:1.25s ease-in-out infinite aYQbCq_agentTeamsPulse}.aYQbCq_badgeCount,.aYQbCq_memberCount,.aYQbCq_teamStats,.aYQbCq_stageLabel,.aYQbCq_taskId{font-variant-numeric:tabular-nums}.aYQbCq_panel{box-sizing:border-box;border:1px solid color-mix(in srgb, var(--dsw-alias-line-strong) 58%, transparent);background:color-mix(in srgb, var(--dsw-alias-bg-module) 95%, transparent);backdrop-filter:blur(20px)saturate(1.08);box-shadow:0 12px 32px color-mix(in srgb, var(--dsw-alias-label-primary) 12%, transparent), 0 32px 72px color-mix(in srgb, var(--dsw-alias-label-primary) 16%, transparent);will-change:transform;border-radius:16px;flex-direction:column;animation:.16s ease-out aYQbCq_agentTeamsPanelIn;display:flex;position:absolute;top:0;left:0;overflow:hidden}.aYQbCq_panel[data-dragging],.aYQbCq_panel[data-resizing]{user-select:none;box-shadow:0 16px 38px color-mix(in srgb, var(--dsw-alias-label-primary) 14%, transparent), 0 36px 78px color-mix(in srgb, var(--dsw-alias-label-primary) 18%, transparent)}@keyframes aYQbCq_agentTeamsPanelIn{0%{opacity:0}to{opacity:1}}@keyframes aYQbCq_agentTeamsPulse{0%,to{opacity:.42}50%{opacity:1}}.aYQbCq_panelHead{border-bottom:1px solid var(--dsw-alias-line-normal);cursor:grab;touch-action:none;flex:none;justify-content:space-between;align-items:center;min-height:44px;padding:0 14px 0 16px;display:flex}.aYQbCq_panelHead:active,.aYQbCq_panel[data-dragging] .aYQbCq_panelHead{cursor:grabbing}.aYQbCq_panel[data-compact] .aYQbCq_panelHead{cursor:default;touch-action:auto}.aYQbCq_panelTitle{color:var(--dsw-alias-label-primary);align-items:center;gap:8px;font-size:14px;font-weight:600;line-height:20px;display:inline-flex}.aYQbCq_panelControls{flex:none;align-items:center;gap:2px;display:inline-flex}.aYQbCq_iconButton{width:28px;height:28px;color:var(--dsw-alias-label-tertiary);cursor:pointer;background:0 0;border:0;border-radius:7px;justify-content:center;align-items:center;padding:0;transition:background-color .12s,color .12s,transform .12s;display:inline-flex}.aYQbCq_iconButton:hover{background:var(--dsw-alias-bg-fill-neutral);color:var(--dsw-alias-label-primary)}.aYQbCq_iconButton:active{transform:scale(.94)}.aYQbCq_iconButton[data-control=dock][data-mode=docked] svg{transform:scaleX(-1)}.aYQbCq_resizeHandle{z-index:1;touch-action:none;position:absolute}.aYQbCq_resizeHandle[data-resize-edge=left]{cursor:ew-resize;width:8px;top:44px;bottom:8px;left:0}.aYQbCq_resizeHandle[data-resize-edge=bottom]{cursor:ns-resize;height:8px;bottom:0;left:12px;right:12px}.aYQbCq_resizeHandle[data-resize-edge=corner]{cursor:nwse-resize;width:18px;height:18px;bottom:0;right:0}.aYQbCq_resizeHandle[data-resize-edge=corner]:after{border-right:1px solid var(--dsw-alias-label-tertiary);border-bottom:1px solid var(--dsw-alias-label-tertiary);content:\"\";opacity:.52;width:7px;height:7px;position:absolute;bottom:4px;right:4px}.aYQbCq_teams{overscroll-behavior:contain;scrollbar-color:color-mix(in srgb, var(--dsw-alias-label-tertiary) 28%, transparent) transparent;scrollbar-width:thin;flex-direction:column;min-height:0;display:flex;overflow-y:auto}.aYQbCq_teams::-webkit-scrollbar{width:6px}.aYQbCq_teams::-webkit-scrollbar-track{background:0 0}.aYQbCq_teams::-webkit-scrollbar-thumb{background:color-mix(in srgb, var(--dsw-alias-label-tertiary) 28%, transparent);background-clip:padding-box;border:2px solid #0000;border-radius:999px}.aYQbCq_teams:hover::-webkit-scrollbar-thumb{background:color-mix(in srgb, var(--dsw-alias-label-tertiary) 44%, transparent);background-clip:padding-box}.aYQbCq_team{border-bottom:1px solid var(--dsw-alias-line-normal);flex-direction:column;gap:12px;padding:12px 14px 16px;display:flex}.aYQbCq_team:last-child{border-bottom:0}.aYQbCq_teamHead{align-items:center;gap:10px;min-width:0;display:flex}.aYQbCq_teamName{min-width:0;color:var(--dsw-alias-label-primary);text-overflow:ellipsis;white-space:nowrap;flex:1;font-size:13px;font-weight:600;line-height:18px;overflow:hidden}.aYQbCq_teamStats{color:var(--dsw-alias-label-tertiary);white-space:nowrap;flex:none;gap:8px;font-size:10.5px;line-height:16px;display:inline-flex}.aYQbCq_sectionHead{justify-content:space-between;align-items:center;gap:8px;min-width:0;display:flex}.aYQbCq_sectionTitle{color:var(--dsw-alias-label-secondary);align-items:center;gap:6px;font-size:11px;font-weight:600;line-height:16px;display:inline-flex}.aYQbCq_sectionHint{color:var(--dsw-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;font-size:10px;line-height:14px;overflow:hidden}.aYQbCq_delegationSection{min-width:0}.aYQbCq_captainNode{box-sizing:border-box;border:1px solid color-mix(in srgb, var(--dsw-alias-state-business-primary) 32%, var(--dsw-alias-line-normal));background:color-mix(in srgb, var(--dsw-alias-state-business-primary) 7%, var(--dsw-alias-bg-module));border-radius:10px;grid-template-columns:48px minmax(0,1fr) auto;align-items:center;gap:9px;min-height:56px;padding:6px 10px;display:grid}.aYQbCq_captainAvatar,.aYQbCq_memberAvatar{flex:none;justify-content:center;align-items:center;display:inline-flex;position:relative}.aYQbCq_captainAvatar{width:46px;height:46px}.aYQbCq_leadAvatar,.aYQbCq_memberArt{object-fit:contain;filter:drop-shadow(0 1px 1px #122d4833);background:0 0;border:0;border-radius:0}.aYQbCq_leadAvatar{width:44px;height:44px}.aYQbCq_memberArt{width:40px;height:40px}.aYQbCq_captainInfo,.aYQbCq_memberInfo{flex-direction:column;min-width:0;display:flex}.aYQbCq_captainInfo{gap:2px}.aYQbCq_captainLine,.aYQbCq_memberLine{align-items:center;gap:6px;min-width:0;display:flex}.aYQbCq_captainName,.aYQbCq_memberName{color:var(--dsw-alias-label-primary);text-overflow:ellipsis;white-space:nowrap;font-size:12.5px;font-weight:600;line-height:18px;overflow:hidden}.aYQbCq_captainRole,.aYQbCq_memberRole{color:var(--dsw-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;font-size:10px;line-height:14px;overflow:hidden}.aYQbCq_captainSummary,.aYQbCq_memberStatusLine{color:var(--dsw-alias-label-secondary);text-overflow:ellipsis;white-space:nowrap;font-size:10.5px;line-height:15px;overflow:hidden}.aYQbCq_captainState,.aYQbCq_memberState{color:var(--dsw-alias-label-tertiary);white-space:nowrap;flex:none;align-items:center;gap:5px;font-size:10px;font-weight:500;line-height:15px;display:inline-flex}.aYQbCq_captainState[data-busy=true],.aYQbCq_memberState[data-activity=working]{color:var(--dsw-alias-state-business-primary)}.aYQbCq_workGlyph rect{opacity:.5}.aYQbCq_workGlyph[data-active=true] rect{animation:1.1s ease-in-out infinite aYQbCq_agentTeamsDot}@keyframes aYQbCq_agentTeamsDot{0%,to{opacity:.25}50%{opacity:1}}.aYQbCq_progressOverview{flex-direction:column;gap:7px;display:flex}.aYQbCq_progressTitle{color:var(--dsw-alias-label-secondary);font-size:11px;font-weight:600;line-height:16px}.aYQbCq_progressSegments{gap:3px;display:flex}.aYQbCq_progressSegments>span,.aYQbCq_progressEmpty{background:var(--dsw-alias-line-strong);border-radius:2px;flex:1;height:5px}.aYQbCq_progressEmpty{width:100%;display:block}.aYQbCq_progressSegments>span[data-state=running]{background:var(--dsw-alias-state-business-primary)}.aYQbCq_progressSegments>span[data-state=blocked]{background:var(--dsw-alias-state-warning)}.aYQbCq_progressSegments>span[data-state=completed]{background:var(--dsw-alias-state-success)}.aYQbCq_progressSegments>span[data-state=failed]{background:var(--dsw-alias-state-danger)}.aYQbCq_progressSegments>span[data-state=cancelled]{opacity:.55}.aYQbCq_progressLegend{color:var(--dsw-alias-label-tertiary);gap:10px;font-size:9.5px;line-height:14px;display:flex}.aYQbCq_progressLegend>span[data-state=running]{color:var(--dsw-alias-state-business-primary)}.aYQbCq_progressLegend>span[data-state=blocked]{color:var(--dsw-alias-state-warning)}.aYQbCq_progressLegend>span[data-state=completed]{color:var(--dsw-alias-state-success)}.aYQbCq_progressSummary{background:color-mix(in srgb, var(--dsw-alias-state-business-primary) 7%, var(--dsw-alias-bg-module));min-width:0;color:var(--dsw-alias-label-secondary);border-radius:8px;align-items:center;gap:6px;padding:5px 8px;font-size:10px;font-weight:600;line-height:15px;display:flex}.aYQbCq_progressSummary[data-state=warning]{background:color-mix(in srgb, var(--dsw-alias-state-warning) 8%, var(--dsw-alias-bg-module))}.aYQbCq_progressSummary[data-state=completed]{background:color-mix(in srgb, var(--dsw-alias-state-success) 8%, var(--dsw-alias-bg-module))}.aYQbCq_progressSummary>span:last-child{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.aYQbCq_progressSummaryDot{background:var(--dsw-alias-state-business-primary);border-radius:50%;flex:none;width:5px;height:5px}.aYQbCq_progressSummary[data-state=warning] .aYQbCq_progressSummaryDot{background:var(--dsw-alias-state-warning)}.aYQbCq_progressSummary[data-state=completed] .aYQbCq_progressSummaryDot{background:var(--dsw-alias-state-success)}.aYQbCq_membersToggle{background:var(--dsw-alias-bg-module-platform);width:100%;color:var(--dsw-alias-label-secondary);font:inherit;cursor:pointer;border:0;border-radius:8px;justify-content:space-between;align-items:center;gap:8px;padding:6px 8px;font-size:10.5px;font-weight:600;line-height:15px;display:flex}.aYQbCq_membersToggle:hover{background:var(--dsw-alias-bg-fill-neutral)}.aYQbCq_membersToggle>span{align-items:center;gap:5px;display:inline-flex}.aYQbCq_membersToggle>span:last-child{color:var(--dsw-alias-state-business-primary)}.aYQbCq_chevron{flex:none;transition:transform .14s}.aYQbCq_chevron[data-open=true]{transform:rotate(90deg)}.aYQbCq_delegationTree{flex-direction:column;gap:2px;margin-left:18px;padding:9px 0 0 20px;display:flex;position:relative}.aYQbCq_delegationTree:before{background:color-mix(in srgb, var(--dsw-alias-state-business-primary) 48%, var(--dsw-alias-line-normal));content:\"\";width:1px;position:absolute;top:0;bottom:22px;left:0}.aYQbCq_memberBlock{flex-direction:column;min-width:0;padding:3px 0 7px;display:flex;position:relative}.aYQbCq_memberBranch{background:color-mix(in srgb, var(--dsw-alias-state-business-primary) 48%, var(--dsw-alias-line-normal));width:20px;height:1px;display:block;position:absolute;top:27px;right:100%}.aYQbCq_memberBranch:before{background:var(--dsw-alias-state-business-primary);content:\"\";border-radius:50%;width:5px;height:5px;position:absolute;top:-2px;right:-1px}.aYQbCq_memberRow{box-sizing:border-box;width:100%;min-width:0;min-height:48px;color:inherit;font:inherit;text-align:left;cursor:pointer;background:0 0;border:0;border-radius:8px;grid-template-columns:46px minmax(0,1fr) auto;align-items:center;gap:8px;padding:4px 6px;transition:background-color .12s,transform .12s;display:grid}.aYQbCq_memberRow:hover,.aYQbCq_memberRow[data-activity=working]{background:color-mix(in srgb, var(--dsw-alias-state-business-primary) 6%, var(--dsw-alias-bg-module))}.aYQbCq_memberRow:active{transform:scale(.995)}.aYQbCq_memberAvatar{width:42px;height:42px}.aYQbCq_memberAvatar[data-unread=true]:after{box-sizing:border-box;border:1px solid var(--dsw-alias-bg-module);background:var(--dsw-alias-state-business-primary);content:\"\";border-radius:50%;width:6px;height:6px;animation:1.8s ease-in-out infinite aYQbCq_agentTeamsUnreadPulse;position:absolute;top:0;right:-1px}@keyframes aYQbCq_agentTeamsUnreadPulse{0%,to{opacity:.78;transform:scale(.92)}50%{opacity:1;transform:scale(1.16)}}.aYQbCq_memberInitial{background:var(--dsw-alias-bg-fill-business);width:34px;height:34px;color:var(--dsw-alias-label-on-fill);border-radius:50%;justify-content:center;align-items:center;font-size:14px;font-weight:600;line-height:20px;display:inline-flex}.aYQbCq_stateArt{box-sizing:border-box;object-fit:contain;width:22px;height:22px;filter:drop-shadow(0 0 1px var(--dsw-alias-bg-module)) drop-shadow(0 1px 1px #122d483d);background:0 0;border:0;border-radius:0;position:absolute;bottom:-3px;right:-5px}.aYQbCq_stateArt[data-activity=working]{animation:2.4s ease-in-out infinite aYQbCq_agentTeamsFloat}.aYQbCq_stateArt[data-activity=idle]{animation:4.2s ease-in-out infinite aYQbCq_agentTeamsBreathe}.aYQbCq_stateArt[data-activity=unknown]{animation:2.8s ease-in-out infinite aYQbCq_agentTeamsThink}@keyframes aYQbCq_agentTeamsFloat{0%,to{transform:translateY(0)rotate(-4deg)}50%{transform:translateY(-2px)rotate(4deg)}}@keyframes aYQbCq_agentTeamsBreathe{0%,to{opacity:.82;transform:scale(1)}50%{opacity:1;transform:scale(1.06)}}@keyframes aYQbCq_agentTeamsThink{0%,to{transform:rotate(-7deg)}50%{transform:rotate(7deg)}}.aYQbCq_memberState{margin-left:auto}.aYQbCq_memberCount{color:var(--dsw-alias-label-tertiary);font-size:10.5px;line-height:16px}.aYQbCq_assignmentLine{align-items:center;gap:7px;min-width:0;padding:0 6px 0 60px;display:flex}.aYQbCq_assignmentLabel{color:var(--dsw-alias-label-tertiary);flex:none;font-size:9.5px;line-height:14px}.aYQbCq_assignmentTasks{flex-wrap:wrap;flex:1;gap:4px;min-width:0;display:flex}.aYQbCq_assignmentChip{background:var(--dsw-alias-bg-fill-neutral);min-height:16px;color:var(--dsw-alias-label-secondary);border-radius:4px;align-items:center;padding:0 5px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:9px;font-weight:600;line-height:14px;display:inline-flex}.aYQbCq_assignmentChip[data-state=running]{background:var(--dsw-alias-bg-fill-business);color:var(--dsw-alias-label-on-fill)}.aYQbCq_assignmentChip[data-state=completed]{background:var(--dsw-alias-bg-fill-success);color:var(--dsw-alias-label-on-fill)}.aYQbCq_assignmentChip[data-state=blocked]{background:var(--dsw-alias-bg-fill-warning);color:var(--dsw-alias-label-on-fill)}.aYQbCq_assignmentChip[data-state=failed]{background:var(--dsw-alias-bg-fill-danger);color:var(--dsw-alias-label-on-fill)}.aYQbCq_assignmentChip[data-state=cancelled]{color:var(--dsw-alias-label-tertiary);text-decoration:line-through}.aYQbCq_unreadPill{color:var(--dsw-alias-state-business-primary);white-space:nowrap;flex:none;font-size:9.5px;font-weight:600;line-height:14px}.aYQbCq_taskEmpty{color:var(--dsw-alias-label-tertiary);font-size:9.5px;line-height:14px}.aYQbCq_dependencySection{border-top:1px solid var(--dsw-alias-line-normal);flex-direction:column;gap:7px;min-width:0;padding-top:10px;display:flex}.aYQbCq_sectionToggleTitle{color:var(--dsw-alias-label-secondary);font:inherit;cursor:pointer;background:0 0;border:0;align-items:center;gap:6px;padding:0;font-size:11px;font-weight:600;line-height:16px;display:inline-flex}.aYQbCq_dagViewport{scrollbar-width:thin;min-width:0;padding:2px 0 4px;overflow-x:auto}.aYQbCq_dagCanvas{min-width:100%;position:relative}.aYQbCq_dagCanvas[data-layout=parallel]{flex-wrap:wrap;gap:8px;display:flex}.aYQbCq_dagCanvas[data-layout=parallel] .aYQbCq_dagNode{flex:92px;min-width:92px;position:relative}.aYQbCq_dagEdges{pointer-events:none;position:absolute;inset:0;overflow:visible}.aYQbCq_dagEdges path{fill:none;stroke:var(--dsw-alias-line-strong);stroke-width:1px;transition:opacity .14s,stroke .14s,stroke-width .14s}.aYQbCq_dagEdges path[data-active=true]{stroke:var(--dsw-alias-state-business-primary);stroke-width:1.6px}.aYQbCq_dagEdges path[data-dimmed=true]{opacity:.24}.aYQbCq_dagNode{box-sizing:border-box;border:1px solid var(--dsw-alias-line-normal);background:var(--dsw-alias-bg-module);color:var(--dsw-alias-label-primary);font:inherit;text-align:left;cursor:pointer;border-radius:6px;flex-direction:column;justify-content:center;gap:1px;padding:0 6px;transition:border-color .14s,background-color .14s,opacity .14s;display:flex;position:absolute}.aYQbCq_dagNode:hover,.aYQbCq_dagNode[data-focused=true]{border-color:var(--dsw-alias-state-business-primary);background:color-mix(in srgb, var(--dsw-alias-state-business-primary) 6%, var(--dsw-alias-bg-module))}.aYQbCq_dagNode[data-dimmed=true]{opacity:.3}.aYQbCq_dagNode[data-state=running][data-dimmed=true]{opacity:.58}.aYQbCq_dagNode[data-state=completed]{border-color:color-mix(in srgb, var(--dsw-alias-state-success) 48%, var(--dsw-alias-line-normal))}.aYQbCq_dagNode[data-state=blocked]{border-color:color-mix(in srgb, var(--dsw-alias-state-warning) 52%, var(--dsw-alias-line-normal))}.aYQbCq_dagNode[data-state=failed]{border-color:color-mix(in srgb, var(--dsw-alias-state-danger) 56%, var(--dsw-alias-line-normal))}.aYQbCq_dagNodeHead{color:var(--dsw-alias-label-primary);align-items:center;gap:4px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:9.5px;font-weight:700;display:flex}.aYQbCq_dagNodeDot{background:var(--dsw-alias-line-strong);border-radius:1.5px;flex:none;width:5px;height:5px}.aYQbCq_dagNode[data-state=running] .aYQbCq_dagNodeDot{background:var(--dsw-alias-state-business-primary)}.aYQbCq_dagNode[data-state=running] .aYQbCq_dagNodeHead{padding-right:12px}.aYQbCq_dagRunningState{width:9px;height:9px;color:var(--dsw-alias-state-business-primary);pointer-events:none;justify-content:center;align-items:center;display:inline-flex;position:absolute;top:4px;right:5px}.aYQbCq_dagRunningState .aYQbCq_workGlyph{width:9px;height:9px}.aYQbCq_dagNode[data-state=blocked] .aYQbCq_dagNodeDot{background:var(--dsw-alias-state-warning)}.aYQbCq_dagNode[data-state=completed] .aYQbCq_dagNodeDot{background:var(--dsw-alias-state-success)}.aYQbCq_dagNode[data-state=failed] .aYQbCq_dagNodeDot{background:var(--dsw-alias-state-danger)}.aYQbCq_dagNodeLabel{color:var(--dsw-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;font-size:8.5px;line-height:11px;overflow:hidden}.aYQbCq_taskDetail{border:1px solid var(--dsw-alias-line-normal);background:var(--dsw-alias-bg-module-platform);border-radius:9px;flex-direction:column;gap:3px;min-width:0;padding:7px 9px;display:flex}.aYQbCq_taskDetailHead{align-items:center;gap:6px;min-width:0;display:flex}.aYQbCq_taskDetailId{color:var(--dsw-alias-state-business-primary);flex:none;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:10px;font-weight:700}.aYQbCq_taskDetailSubject{min-width:0;color:var(--dsw-alias-label-primary);text-overflow:ellipsis;white-space:nowrap;font-size:11px;font-weight:600;line-height:16px;overflow:hidden}.aYQbCq_taskDetailBadge{background:var(--dsw-alias-bg-fill-neutral);color:var(--dsw-alias-label-secondary);border-radius:4px;flex:none;padding:0 5px;font-size:8.5px;font-weight:600;line-height:14px}.aYQbCq_taskDetailBadge[data-state=running]{background:var(--dsw-alias-bg-fill-business);color:var(--dsw-alias-label-on-fill)}.aYQbCq_taskDetailBadge[data-state=blocked]{background:var(--dsw-alias-bg-fill-warning);color:var(--dsw-alias-label-on-fill)}.aYQbCq_taskDetailBadge[data-state=completed]{background:var(--dsw-alias-bg-fill-success);color:var(--dsw-alias-label-on-fill)}.aYQbCq_taskDetailBadge[data-state=failed]{background:var(--dsw-alias-bg-fill-danger);color:var(--dsw-alias-label-on-fill)}.aYQbCq_taskDetailLine,.aYQbCq_taskDetailMeta{color:var(--dsw-alias-label-secondary);font-size:9.5px;line-height:14px}.aYQbCq_taskDetailMeta{color:var(--dsw-alias-label-tertiary)}.aYQbCq_emptyHint{color:var(--dsw-alias-label-tertiary);padding:10px 12px;font-size:11px;line-height:16px}.aYQbCq_historicPill{background:var(--dsw-alias-bg-fill-neutral);color:var(--dsw-alias-label-tertiary);border-radius:4px;flex:none;margin-left:auto;padding:1px 7px;font-size:9.5px;font-weight:600;line-height:15px}.aYQbCq_members{flex-direction:column;gap:3px;display:flex}.aYQbCq_archiveLabel{color:var(--dsw-alias-label-tertiary);padding:5px 14px 0;font-size:9.5px;font-weight:600;line-height:14px;display:block}@media (prefers-reduced-motion:reduce){.aYQbCq_panel,.aYQbCq_badge,.aYQbCq_badgeDot,.aYQbCq_panelDot,.aYQbCq_workGlyph rect,.aYQbCq_stateArt,.aYQbCq_memberAvatar[data-unread=true]:after{transition:none;animation:none}}@media (width<=960px){html[data-agent-teams-panel-open] [data-phase=active]{padding-right:0}}@media (width<=640px){.aYQbCq_badge{top:56px;right:10px}.aYQbCq_teamStats span[data-stat=messages]{display:none}.aYQbCq_captainNode{grid-template-columns:48px minmax(0,1fr)}.aYQbCq_captainState{display:none}.aYQbCq_delegationTree{margin-left:12px;padding-left:15px}.aYQbCq_memberBranch{width:15px}.aYQbCq_assignmentLine{padding-left:53px}}";
641
654
  const tagId = "@nanmicoder/dsh-agent-teams/ActivityPanel.module.css";
642
655
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId) + "]") === null) {
643
656
  const tag = document.createElement("style");
@@ -654,7 +667,7 @@ window.__ModuleLoader__.load({
654
667
  "agentTeamsPulse": "aYQbCq_agentTeamsPulse",
655
668
  "agentTeamsThink": "aYQbCq_agentTeamsThink",
656
669
  "agentTeamsUnreadPulse": "aYQbCq_agentTeamsUnreadPulse",
657
- "archivedWrap": "aYQbCq_archivedWrap",
670
+ "archiveLabel": "aYQbCq_archiveLabel",
658
671
  "assignmentChip": "aYQbCq_assignmentChip",
659
672
  "assignmentLabel": "aYQbCq_assignmentLabel",
660
673
  "assignmentLine": "aYQbCq_assignmentLine",
@@ -809,15 +822,19 @@ window.__ModuleLoader__.load({
809
822
  /** Badge text follows the raw task status (finer than the 4 visual states):
810
823
  * claimed/pending/failed/cancelled keep their own labels and colors. */
811
824
  const TASK_STATUS_LABEL = {
812
- pending: "待领取",
813
- claimed: "已认领",
814
- in_progress: "进行中",
815
- completed: "已完成",
816
- failed: "失败",
817
- cancelled: "已取消"
825
+ pending: "task.status.pending",
826
+ claimed: "task.status.claimed",
827
+ in_progress: "task.status.inProgress",
828
+ completed: "task.status.completed",
829
+ failed: "task.status.failed",
830
+ cancelled: "task.status.cancelled"
818
831
  };
819
- function taskStatusLabel(status) {
820
- return TASK_STATUS_LABEL[status] ?? status;
832
+ function taskStatusLabel(status, t) {
833
+ const key = TASK_STATUS_LABEL[status];
834
+ return key === void 0 ? status : t(key);
835
+ }
836
+ function formatTaskIds(ids, t) {
837
+ return ids.join(t("format.listSeparator"));
821
838
  }
822
839
  /** Badge/bar coloring key: visual state, widened for terminal statuses. */
823
840
  function taskTone(state, status) {
@@ -867,14 +884,14 @@ window.__ModuleLoader__.load({
867
884
  });
868
885
  }
869
886
  /** Collapsed badge: an always-visible corner pill while any team exists. */
870
- function CollapsedBadge({ count, busy, onClick }) {
887
+ function CollapsedBadge({ count, busy, onClick, t }) {
871
888
  return (0, react_jsx_runtime.jsxs)("button", {
872
889
  type: "button",
873
890
  className: ActivityPanel_module_css_default.badge,
874
891
  "data-agent-teams-collapsed": true,
875
892
  "data-busy": busy,
876
893
  onClick,
877
- "aria-label": `AgentTeams 活动,${count} 个团队`,
894
+ "aria-label": t("activity.badgeAria", { count }),
878
895
  children: [(0, react_jsx_runtime.jsx)("span", {
879
896
  className: ActivityPanel_module_css_default.badgeDot,
880
897
  "data-busy": busy,
@@ -885,62 +902,68 @@ window.__ModuleLoader__.load({
885
902
  })]
886
903
  });
887
904
  }
888
- function memberStateLabel(member, tasks, historic) {
905
+ function memberStateLabel(member, tasks, historic, t) {
889
906
  const owned = tasks.filter((task) => task.assignee === member.name);
890
- if (member.activity === "working") return "工作中";
891
- if (owned.some((task) => task.status === "failed")) return "有失败";
892
- if (owned.some((task) => task.state === "blocked")) return "等待";
893
- if (owned.length > 0 && owned.every((task) => task.status === "completed")) return "已交付";
894
- if (member.status === "removed") return historic ? "已离队" : "已移除";
895
- if (owned.length > 0) return "待执行";
896
- return "待派工";
907
+ if (member.activity === "working") return t("member.state.working");
908
+ if (owned.some((task) => task.status === "failed")) return t("member.state.failed");
909
+ if (owned.some((task) => task.state === "blocked")) return t("member.state.waiting");
910
+ if (owned.length > 0 && owned.every((task) => task.status === "completed")) return t("member.state.delivered");
911
+ if (member.status === "removed") return t(historic ? "member.state.left" : "member.state.removed");
912
+ if (owned.length > 0) return t("member.state.pending");
913
+ return t("member.state.unassigned");
897
914
  }
898
- function memberStatusText(member, tasks) {
915
+ function memberStatusText(member, tasks, t) {
899
916
  const owned = tasks.filter((task) => task.assignee === member.name);
900
917
  const current = owned.find((task) => task.id === member.currentTask);
901
918
  const blocked = owned.find((task) => task.state === "blocked");
902
- if (member.activity === "working" && current !== void 0) return `正在执行 ${current.id}`;
903
- if (member.activity === "working") return "正在处理已派任务";
919
+ if (member.activity === "working" && current !== void 0) return t("member.status.executing", { taskId: current.id });
920
+ if (member.activity === "working") return t("member.status.working");
904
921
  if (blocked !== void 0) {
905
922
  const dependency = tasks.find((task) => blocked.dependencies.includes(task.id) && task.state !== "completed");
906
- if (dependency !== void 0) return `等待 ${dependency.id} · ${dependency.assignee || "待认领"}`;
907
- return "等待前置任务";
923
+ if (dependency !== void 0) return t("member.status.waitingOn", {
924
+ taskId: dependency.id,
925
+ assignee: dependency.assignee || t("task.assignee.unclaimed")
926
+ });
927
+ return t("member.status.waitingPrerequisite");
908
928
  }
909
- if (member.total === 0) return "等待队长派工";
910
- if (member.done === member.total) return "任务已交付";
911
- return member.activity === "idle" ? "待继续执行" : "状态未知";
929
+ if (member.total === 0) return t("member.status.waitingAssignment");
930
+ if (member.done === member.total) return t("member.status.delivered");
931
+ return t(member.activity === "idle" ? "member.status.idle" : "member.status.unknown");
912
932
  }
913
933
  function compactTaskLabel(subject) {
914
934
  const withoutVerb = subject.replace(/^开发\s*/u, "").replace(/^\d+[-_.、\s]*/u, "");
915
935
  const head = withoutVerb.split(/[((·::]/u)[0]?.trim() ?? withoutVerb;
916
936
  return head.length > 18 ? `${head.slice(0, 17)}…` : head;
917
937
  }
918
- function taskSummary(team) {
938
+ function taskSummary(team, t) {
919
939
  const completed = team.tasks.filter((task) => task.status === "completed");
920
940
  const running = team.tasks.filter((task) => task.state === "running");
921
941
  const blocked = team.tasks.filter((task) => task.state === "blocked");
922
942
  const ready = team.tasks.filter((task) => task.state === "open" && task.status !== "completed");
923
- if (team.tasks.length === 0) return "等待队长拆解任务";
924
- if (completed.length === team.tasks.length) return `全部 ${completed.length} 项任务已交付`;
925
- if (blocked.length > 0 && running.length > 0) return `${blocked.slice(0, 3).map((task) => task.id).join("、")}${blocked.length > 3 ? ` 等 ${blocked.length} 项` : ""} 等待前置,其余已开工`;
926
- if (running.length > 0) return `${running.map((task) => task.id).join("、")} 正在执行`;
927
- if (ready.length > 0) return `${ready.map((task) => task.id).join("")} 已就绪待开工`;
928
- if (blocked.length > 0) return `${blocked.map((task) => task.id).join("、")} 等待前置`;
929
- return "等待下一轮调度";
943
+ if (team.tasks.length === 0) return t("task.summary.waitingBreakdown");
944
+ if (completed.length === team.tasks.length) return t("task.summary.allDelivered", { count: completed.length });
945
+ if (blocked.length > 0 && running.length > 0) return t("task.summary.blockedAndRunning", {
946
+ tasks: formatTaskIds(blocked.slice(0, 3).map((task) => task.id), t),
947
+ more: blocked.length > 3 ? t("task.summary.more", { count: blocked.length - 3 }) : ""
948
+ });
949
+ if (running.length > 0) return t("task.summary.running", { tasks: formatTaskIds(running.map((task) => task.id), t) });
950
+ if (ready.length > 0) return t("task.summary.ready", { tasks: formatTaskIds(ready.map((task) => task.id), t) });
951
+ if (blocked.length > 0) return t("task.summary.blocked", { tasks: formatTaskIds(blocked.map((task) => task.id), t) });
952
+ return t("task.summary.waitingSchedule");
930
953
  }
931
- function ProgressOverview({ team }) {
954
+ function ProgressOverview({ team, t }) {
932
955
  const running = team.tasks.filter((task) => task.state === "running").length;
933
956
  const blocked = team.tasks.filter((task) => task.state === "blocked").length;
934
957
  const completed = team.tasks.filter((task) => task.status === "completed").length;
935
958
  const summaryTone = blocked > 0 ? "warning" : completed === team.tasks.length && team.tasks.length > 0 ? "completed" : "running";
936
959
  return (0, react_jsx_runtime.jsxs)("section", {
937
960
  className: ActivityPanel_module_css_default.progressOverview,
938
- "aria-label": "团队总进度",
961
+ "aria-label": t("progress.aria"),
939
962
  "data-progress-summary": true,
940
963
  children: [
941
964
  (0, react_jsx_runtime.jsx)("span", {
942
965
  className: ActivityPanel_module_css_default.progressTitle,
943
- children: "总进度"
966
+ children: t("progress.title")
944
967
  }),
945
968
  team.tasks.length > 0 ? (0, react_jsx_runtime.jsx)("span", {
946
969
  className: ActivityPanel_module_css_default.progressSegments,
@@ -950,29 +973,29 @@ window.__ModuleLoader__.load({
950
973
  (0, react_jsx_runtime.jsxs)("span", {
951
974
  className: ActivityPanel_module_css_default.progressLegend,
952
975
  children: [
953
- (0, react_jsx_runtime.jsxs)("span", {
976
+ (0, react_jsx_runtime.jsx)("span", {
954
977
  "data-state": "running",
955
- children: ["■ 进行中 ", running]
978
+ children: t("progress.running", { count: running })
956
979
  }),
957
- (0, react_jsx_runtime.jsxs)("span", {
980
+ (0, react_jsx_runtime.jsx)("span", {
958
981
  "data-state": "blocked",
959
- children: ["■ 等待依赖 ", blocked]
982
+ children: t("progress.blocked", { count: blocked })
960
983
  }),
961
- (0, react_jsx_runtime.jsxs)("span", {
984
+ (0, react_jsx_runtime.jsx)("span", {
962
985
  "data-state": "completed",
963
- children: ["■ 已交付 ", completed]
986
+ children: t("progress.delivered", { count: completed })
964
987
  })
965
988
  ]
966
989
  }),
967
990
  (0, react_jsx_runtime.jsxs)("span", {
968
991
  className: ActivityPanel_module_css_default.progressSummary,
969
992
  "data-state": summaryTone,
970
- children: [(0, react_jsx_runtime.jsx)("span", { className: ActivityPanel_module_css_default.progressSummaryDot }), (0, react_jsx_runtime.jsx)("span", { children: taskSummary(team) })]
993
+ children: [(0, react_jsx_runtime.jsx)("span", { className: ActivityPanel_module_css_default.progressSummaryDot }), (0, react_jsx_runtime.jsx)("span", { children: taskSummary(team, t) })]
971
994
  })
972
995
  ]
973
996
  });
974
997
  }
975
- function DependencyMap({ tasks }) {
998
+ function DependencyMap({ tasks, t }) {
976
999
  const [open, setOpen] = (0, react.useState)(true);
977
1000
  const [hoverTaskId, setHoverTaskId] = (0, react.useState)(null);
978
1001
  const [keyboardTaskId, setKeyboardTaskId] = (0, react.useState)(null);
@@ -1015,7 +1038,7 @@ window.__ModuleLoader__.load({
1015
1038
  const dependents = tasks.filter((task) => task.dependencies.includes(detailTask.id));
1016
1039
  return (0, react_jsx_runtime.jsxs)("section", {
1017
1040
  className: ActivityPanel_module_css_default.dependencySection,
1018
- "aria-label": "任务依赖链",
1041
+ "aria-label": t("dependency.aria"),
1019
1042
  "data-dependency-map": true,
1020
1043
  children: [(0, react_jsx_runtime.jsxs)("header", {
1021
1044
  className: ActivityPanel_module_css_default.sectionHead,
@@ -1030,11 +1053,11 @@ window.__ModuleLoader__.load({
1030
1053
  (0, react_jsx_runtime.jsx)(Chevron, { open }),
1031
1054
  (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconBranchOutline16, {}),
1032
1055
  " ",
1033
- parallel ? "并行任务" : "任务依赖"
1056
+ t(parallel ? "dependency.parallel" : "dependency.title")
1034
1057
  ]
1035
1058
  }), (0, react_jsx_runtime.jsx)("span", {
1036
1059
  className: ActivityPanel_module_css_default.sectionHint,
1037
- children: pinnedTaskId === null ? parallel ? "无前后依赖 · 点击查看详情" : "悬停高亮依赖链 · 点击固定" : `${pinnedTaskId} 已固定 · Esc 取消`
1060
+ children: pinnedTaskId === null ? t(parallel ? "dependency.hint.parallel" : "dependency.hint.chain") : t("dependency.hint.pinned", { taskId: pinnedTaskId })
1038
1061
  })]
1039
1062
  }), open && (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [(0, react_jsx_runtime.jsx)("div", {
1040
1063
  className: ActivityPanel_module_css_default.dagViewport,
@@ -1099,7 +1122,7 @@ window.__ModuleLoader__.load({
1099
1122
  }),
1100
1123
  task.state === "running" && (0, react_jsx_runtime.jsx)("span", {
1101
1124
  className: ActivityPanel_module_css_default.dagRunningState,
1102
- "aria-label": "运行中",
1125
+ "aria-label": t("task.runningAria"),
1103
1126
  children: (0, react_jsx_runtime.jsx)(WorkGlyph, { active: true })
1104
1127
  })
1105
1128
  ]
@@ -1124,27 +1147,27 @@ window.__ModuleLoader__.load({
1124
1147
  (0, react_jsx_runtime.jsx)("span", {
1125
1148
  className: ActivityPanel_module_css_default.taskDetailBadge,
1126
1149
  "data-state": taskTone(detailTask.state, detailTask.status),
1127
- children: taskStatusLabel(detailTask.status)
1150
+ children: taskStatusLabel(detailTask.status, t)
1128
1151
  })
1129
1152
  ]
1130
1153
  }),
1131
1154
  (0, react_jsx_runtime.jsxs)("span", {
1132
1155
  className: ActivityPanel_module_css_default.taskDetailLine,
1133
1156
  children: [
1134
- detailTask.assignee || "待认领",
1157
+ detailTask.assignee || t("task.assignee.unclaimed"),
1135
1158
  " · ",
1136
- detailTask.status === "completed" ? "已完成并交付" : detailTask.dependencies.length === 0 ? "无前置,可立即开工" : waitingOn.length === 0 ? "前置已就绪,可开工" : `等待 ${waitingOn.join("、")}`
1159
+ detailTask.status === "completed" ? t("task.detail.completed") : detailTask.dependencies.length === 0 ? t("task.detail.noPrerequisite") : waitingOn.length === 0 ? t("task.detail.ready") : t("task.detail.waitingOn", { tasks: formatTaskIds(waitingOn, t) })
1137
1160
  ]
1138
1161
  }),
1139
1162
  (0, react_jsx_runtime.jsx)("span", {
1140
1163
  className: ActivityPanel_module_css_default.taskDetailMeta,
1141
- children: dependents.length === 0 ? "无下游任务" : `完成后解锁 ${dependents.map((task) => task.id).join("、")}`
1164
+ children: dependents.length === 0 ? t("task.detail.noDownstream") : t("task.detail.unlocks", { tasks: formatTaskIds(dependents.map((task) => task.id), t) })
1142
1165
  })
1143
1166
  ]
1144
1167
  })] })]
1145
1168
  });
1146
1169
  }
1147
- function TeamSection({ team, onNavigate, historic = false }) {
1170
+ function TeamSection({ team, onNavigate, t, historic = false }) {
1148
1171
  const [membersOpen, setMembersOpen] = (0, react.useState)(true);
1149
1172
  const busyCount = team.members.filter((member) => member.activity === "working").length;
1150
1173
  const assignedCount = team.tasks.filter((task) => task.assignee !== "").length;
@@ -1164,27 +1187,25 @@ window.__ModuleLoader__.load({
1164
1187
  }),
1165
1188
  historic && (0, react_jsx_runtime.jsx)("span", {
1166
1189
  className: ActivityPanel_module_css_default.historicPill,
1167
- children: "已结束"
1190
+ children: t("team.ended")
1168
1191
  }),
1169
1192
  (0, react_jsx_runtime.jsxs)("span", {
1170
1193
  className: ActivityPanel_module_css_default.teamStats,
1171
1194
  children: [
1172
- (0, react_jsx_runtime.jsxs)("span", {
1195
+ (0, react_jsx_runtime.jsx)("span", {
1173
1196
  "data-stat": "members",
1174
- children: [team.members.length, " 成员"]
1197
+ children: t("team.stats.members", { count: team.members.length })
1175
1198
  }),
1176
- (0, react_jsx_runtime.jsxs)("span", {
1199
+ (0, react_jsx_runtime.jsx)("span", {
1177
1200
  "data-stat": "tasks",
1178
- children: [
1179
- completedCount,
1180
- "/",
1181
- team.tasks.length,
1182
- " 完成"
1183
- ]
1201
+ children: t("team.stats.completed", {
1202
+ completed: completedCount,
1203
+ total: team.tasks.length
1204
+ })
1184
1205
  }),
1185
- (0, react_jsx_runtime.jsxs)("span", {
1206
+ (0, react_jsx_runtime.jsx)("span", {
1186
1207
  "data-stat": "messages",
1187
- children: [team.messageCount, " 消息"]
1208
+ children: t("team.stats.messages", { count: team.messageCount })
1188
1209
  })
1189
1210
  ]
1190
1211
  })
@@ -1192,7 +1213,7 @@ window.__ModuleLoader__.load({
1192
1213
  }),
1193
1214
  (0, react_jsx_runtime.jsxs)("section", {
1194
1215
  className: ActivityPanel_module_css_default.delegationSection,
1195
- "aria-label": "队长派工关系",
1216
+ "aria-label": t("delegation.aria"),
1196
1217
  "data-delegation-map": true,
1197
1218
  children: [
1198
1219
  (0, react_jsx_runtime.jsxs)("div", {
@@ -1213,30 +1234,30 @@ window.__ModuleLoader__.load({
1213
1234
  className: ActivityPanel_module_css_default.captainLine,
1214
1235
  children: [(0, react_jsx_runtime.jsx)("span", {
1215
1236
  className: ActivityPanel_module_css_default.captainName,
1216
- children: "队长"
1237
+ children: t("captain.name")
1217
1238
  }), (0, react_jsx_runtime.jsx)("span", {
1218
1239
  className: ActivityPanel_module_css_default.captainRole,
1219
- children: "拆解 · 派发 · 汇总"
1240
+ children: t("captain.role")
1220
1241
  })]
1221
- }), (0, react_jsx_runtime.jsxs)("span", {
1242
+ }), (0, react_jsx_runtime.jsx)("span", {
1222
1243
  className: ActivityPanel_module_css_default.captainSummary,
1223
- children: [
1224
- "已派发 ",
1225
- assignedCount,
1226
- " 项任务给 ",
1227
- team.members.length,
1228
- " 名成员"
1229
- ]
1244
+ children: t("captain.summary", {
1245
+ tasks: assignedCount,
1246
+ members: team.members.length
1247
+ })
1230
1248
  })]
1231
1249
  }),
1232
1250
  (0, react_jsx_runtime.jsxs)("span", {
1233
1251
  className: ActivityPanel_module_css_default.captainState,
1234
1252
  "data-busy": busyCount > 0,
1235
- children: [(0, react_jsx_runtime.jsx)(WorkGlyph, { active: busyCount > 0 }), busyCount > 0 ? `${busyCount} 人执行中` : allCompleted ? "已收齐" : "等待回报"]
1253
+ children: [(0, react_jsx_runtime.jsx)(WorkGlyph, { active: busyCount > 0 }), busyCount > 0 ? t("captain.state.working", { count: busyCount }) : t(allCompleted ? "captain.state.collected" : "captain.state.waiting")]
1236
1254
  })
1237
1255
  ]
1238
1256
  }),
1239
- (0, react_jsx_runtime.jsx)(ProgressOverview, { team }),
1257
+ (0, react_jsx_runtime.jsx)(ProgressOverview, {
1258
+ team,
1259
+ t
1260
+ }),
1240
1261
  (0, react_jsx_runtime.jsxs)("button", {
1241
1262
  type: "button",
1242
1263
  className: ActivityPanel_module_css_default.membersToggle,
@@ -1245,17 +1266,13 @@ window.__ModuleLoader__.load({
1245
1266
  },
1246
1267
  "aria-expanded": membersOpen,
1247
1268
  "data-members-toggle": true,
1248
- children: [(0, react_jsx_runtime.jsxs)("span", { children: [
1249
- (0, react_jsx_runtime.jsx)(Chevron, { open: membersOpen }),
1250
- "成员 ",
1251
- team.members.length
1252
- ] }), (0, react_jsx_runtime.jsx)("span", { children: membersOpen ? "收起" : "展开" })]
1269
+ children: [(0, react_jsx_runtime.jsxs)("span", { children: [(0, react_jsx_runtime.jsx)(Chevron, { open: membersOpen }), t("members.toggle", { count: team.members.length })] }), (0, react_jsx_runtime.jsx)("span", { children: t(membersOpen ? "members.collapse" : "members.expand") })]
1253
1270
  }),
1254
1271
  membersOpen && (0, react_jsx_runtime.jsxs)("div", {
1255
1272
  className: ActivityPanel_module_css_default.delegationTree,
1256
1273
  children: [team.members.length === 0 && (0, react_jsx_runtime.jsx)("span", {
1257
1274
  className: ActivityPanel_module_css_default.emptyHint,
1258
- children: "暂无成员,等待队长组建团队"
1275
+ children: t("members.empty")
1259
1276
  }), team.members.map((member) => {
1260
1277
  const owned = team.tasks.filter((task) => task.assignee === member.name);
1261
1278
  return (0, react_jsx_runtime.jsxs)("div", {
@@ -1272,7 +1289,7 @@ window.__ModuleLoader__.load({
1272
1289
  className: ActivityPanel_module_css_default.memberRow,
1273
1290
  "data-activity": member.activity,
1274
1291
  onClick: () => {
1275
- if (member.id !== "") onNavigate(member.id);
1292
+ if (member.id !== "") onNavigate(team.captainSessionId, member.id);
1276
1293
  },
1277
1294
  children: [
1278
1295
  (0, react_jsx_runtime.jsxs)("span", {
@@ -1311,12 +1328,12 @@ window.__ModuleLoader__.load({
1311
1328
  (0, react_jsx_runtime.jsxs)("span", {
1312
1329
  className: ActivityPanel_module_css_default.memberState,
1313
1330
  "data-activity": member.activity,
1314
- children: [(0, react_jsx_runtime.jsx)(WorkGlyph, { active: member.activity === "working" }), memberStateLabel(member, team.tasks, historic)]
1331
+ children: [(0, react_jsx_runtime.jsx)(WorkGlyph, { active: member.activity === "working" }), memberStateLabel(member, team.tasks, historic, t)]
1315
1332
  })
1316
1333
  ]
1317
1334
  }), (0, react_jsx_runtime.jsx)("span", {
1318
1335
  className: ActivityPanel_module_css_default.memberStatusLine,
1319
- children: memberStatusText(member, team.tasks)
1336
+ children: memberStatusText(member, team.tasks, t)
1320
1337
  })]
1321
1338
  }),
1322
1339
  (0, react_jsx_runtime.jsxs)("span", {
@@ -1333,12 +1350,12 @@ window.__ModuleLoader__.load({
1333
1350
  className: ActivityPanel_module_css_default.assignmentLine,
1334
1351
  children: [(0, react_jsx_runtime.jsx)("span", {
1335
1352
  className: ActivityPanel_module_css_default.assignmentLabel,
1336
- children: "队长派发"
1353
+ children: t("assignment.label")
1337
1354
  }), (0, react_jsx_runtime.jsx)("span", {
1338
1355
  className: ActivityPanel_module_css_default.assignmentTasks,
1339
1356
  children: owned.length === 0 ? (0, react_jsx_runtime.jsx)("span", {
1340
1357
  className: ActivityPanel_module_css_default.taskEmpty,
1341
- children: "暂无任务"
1358
+ children: t("assignment.empty")
1342
1359
  }) : owned.map((task) => (0, react_jsx_runtime.jsx)("span", {
1343
1360
  className: ActivityPanel_module_css_default.assignmentChip,
1344
1361
  "data-state": taskTone(task.state, task.status),
@@ -1353,7 +1370,10 @@ window.__ModuleLoader__.load({
1353
1370
  })
1354
1371
  ]
1355
1372
  }),
1356
- (0, react_jsx_runtime.jsx)(DependencyMap, { tasks: team.tasks })
1373
+ (0, react_jsx_runtime.jsx)(DependencyMap, {
1374
+ tasks: team.tasks,
1375
+ t
1376
+ })
1357
1377
  ]
1358
1378
  });
1359
1379
  }
@@ -1380,14 +1400,11 @@ window.__ModuleLoader__.load({
1380
1400
  captainInbox: []
1381
1401
  };
1382
1402
  }
1383
- /** The top-right activity floater. Teams follow the current session: live
1384
- * snapshots and historic card summaries are only shown while their captain
1385
- * session is the one currently open. */
1386
- function ActivityPanel({ sessionsList, openSession }) {
1387
- const navigateToSession = (id) => {
1403
+ function ActivityPanel({ sessionsList, openMember, t }) {
1404
+ const navigateToSession = (parentId, childId) => {
1388
1405
  setOpen(false);
1389
1406
  setWasActive(false);
1390
- openSession(id);
1407
+ openMember(parentId, childId);
1391
1408
  };
1392
1409
  const [open, setOpen] = (0, react.useState)(false);
1393
1410
  const [openOwner, setOpenOwner] = (0, react.useState)();
@@ -1480,12 +1497,12 @@ window.__ModuleLoader__.load({
1480
1497
  geometry.width
1481
1498
  ]);
1482
1499
  (0, react.useEffect)(() => {
1483
- if (currentTargets.length === 0) return;
1484
- const controller = startActivityPolling(currentTargets);
1500
+ if (current === void 0) return;
1501
+ const controller = startActivityPolling(currentTargets, { discoverySessionId: current });
1485
1502
  return () => {
1486
1503
  controller.stop();
1487
1504
  };
1488
- }, [currentTargets]);
1505
+ }, [current, currentTargets]);
1489
1506
  (0, react.useEffect)(() => {
1490
1507
  const onOpenPanel = (event) => {
1491
1508
  const activeSession = currentRef.current;
@@ -1662,6 +1679,7 @@ window.__ModuleLoader__.load({
1662
1679
  return (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [!expanded && (0, react_jsx_runtime.jsx)(CollapsedBadge, {
1663
1680
  count: visibleCount,
1664
1681
  busy,
1682
+ t,
1665
1683
  onClick: () => {
1666
1684
  if (current === void 0) return;
1667
1685
  setOpenOwner(current);
@@ -1677,7 +1695,7 @@ window.__ModuleLoader__.load({
1677
1695
  "data-compact": compact || void 0,
1678
1696
  "data-dragging": interaction === "dragging" || void 0,
1679
1697
  "data-resizing": interaction === "resizing" || void 0,
1680
- "aria-label": "AgentTeams 活动面板",
1698
+ "aria-label": t("activity.panelAria"),
1681
1699
  children: [
1682
1700
  (0, react_jsx_runtime.jsxs)("header", {
1683
1701
  className: ActivityPanel_module_css_default.panelHead,
@@ -1688,7 +1706,7 @@ window.__ModuleLoader__.load({
1688
1706
  "data-drag-handle": !compact || void 0,
1689
1707
  children: [(0, react_jsx_runtime.jsxs)("span", {
1690
1708
  className: ActivityPanel_module_css_default.panelTitle,
1691
- children: ["AgentTeams 活动", (0, react_jsx_runtime.jsx)("span", {
1709
+ children: [t("activity.title"), (0, react_jsx_runtime.jsx)("span", {
1692
1710
  className: ActivityPanel_module_css_default.panelDot,
1693
1711
  "data-busy": busy,
1694
1712
  "aria-hidden": true
@@ -1701,8 +1719,8 @@ window.__ModuleLoader__.load({
1701
1719
  "data-control": "dock",
1702
1720
  "data-mode": geometry.mode,
1703
1721
  onClick: toggleDock,
1704
- "aria-label": geometry.mode === "docked" ? "切换为浮动面板" : "停靠到右侧",
1705
- title: geometry.mode === "docked" ? "切换为浮动面板" : "停靠到右侧",
1722
+ "aria-label": t(geometry.mode === "docked" ? "activity.float" : "activity.dockRight"),
1723
+ title: t(geometry.mode === "docked" ? "activity.float" : "activity.dockRight"),
1706
1724
  children: (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconPanelLeftOutline16, {})
1707
1725
  }), (0, react_jsx_runtime.jsx)("button", {
1708
1726
  type: "button",
@@ -1712,8 +1730,8 @@ window.__ModuleLoader__.load({
1712
1730
  setOpen(false);
1713
1731
  setOpenOwner(void 0);
1714
1732
  },
1715
- "aria-label": "收起活动面板",
1716
- title: "收起活动面板",
1733
+ "aria-label": t("activity.collapse"),
1734
+ title: t("activity.collapse"),
1717
1735
  children: (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconChevronDownOutline14, {})
1718
1736
  })]
1719
1737
  })]
@@ -1722,27 +1740,33 @@ window.__ModuleLoader__.load({
1722
1740
  className: ActivityPanel_module_css_default.teams,
1723
1741
  children: visibleCount === 0 ? (0, react_jsx_runtime.jsx)("span", {
1724
1742
  className: ActivityPanel_module_css_default.emptyHint,
1725
- children: "暂无团队活动"
1743
+ children: t("activity.empty")
1726
1744
  }) : (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
1727
1745
  visibleTeams.map((team) => (0, react_jsx_runtime.jsx)(TeamSection, {
1728
1746
  team,
1729
- onNavigate: navigateToSession
1747
+ onNavigate: navigateToSession,
1748
+ t
1730
1749
  }, team.teamId)),
1731
- visibleArchived.map((team) => (0, react_jsx_runtime.jsx)("div", {
1750
+ visibleArchived.map((team) => (0, react_jsx_runtime.jsxs)("div", {
1732
1751
  "data-team-id": team.teamId,
1733
1752
  "data-historic": true,
1734
1753
  className: ActivityPanel_module_css_default.archivedWrap,
1735
- children: (0, react_jsx_runtime.jsx)(TeamSection, {
1754
+ children: [(0, react_jsx_runtime.jsx)("span", {
1755
+ className: ActivityPanel_module_css_default.archiveLabel,
1756
+ children: t("archive.label")
1757
+ }), (0, react_jsx_runtime.jsx)(TeamSection, {
1736
1758
  team,
1737
1759
  onNavigate: navigateToSession,
1760
+ t,
1738
1761
  historic: true
1739
- })
1762
+ })]
1740
1763
  }, `${team.captainSessionId}:${team.teamId}`)),
1741
1764
  visibleHistoric.map(({ data: team, owner }) => {
1742
1765
  const teamKey = `${owner}:${team.teamId}`;
1743
1766
  return (0, react_jsx_runtime.jsx)(TeamSection, {
1744
1767
  team: historicCardTeam(team, owner),
1745
1768
  onNavigate: navigateToSession,
1769
+ t,
1746
1770
  historic: true
1747
1771
  }, teamKey);
1748
1772
  })
@@ -1867,12 +1891,205 @@ window.__ModuleLoader__.load({
1867
1891
  }
1868
1892
  };
1869
1893
  //#endregion
1894
+ //#region lib/client/locales.js
1895
+ /** `agentTeams` namespace dictionaries for every plugin-owned Web surface. */
1896
+ /** Dictionary namespace owned by the AgentTeams client plugin. */
1897
+ const AGENT_TEAMS_LOCALE_NAMESPACE = "agentTeams";
1898
+ /** Simplified Chinese dictionary (the key-set source of truth). */
1899
+ const zh = {
1900
+ "card.memberCount": "{count} 名成员",
1901
+ "action.openActivityPanel": "打开活动面板",
1902
+ "activity.panelButton": "活动面板",
1903
+ "activity.badgeAria": "AgentTeams 活动,{count} 个团队",
1904
+ "activity.panelAria": "AgentTeams 活动面板",
1905
+ "activity.title": "AgentTeams 活动",
1906
+ "activity.float": "切换为浮动面板",
1907
+ "activity.dockRight": "停靠到右侧",
1908
+ "activity.collapse": "收起活动面板",
1909
+ "activity.empty": "暂无团队活动",
1910
+ "format.listSeparator": "、",
1911
+ "task.status.pending": "待领取",
1912
+ "task.status.claimed": "已认领",
1913
+ "task.status.inProgress": "进行中",
1914
+ "task.status.completed": "已完成",
1915
+ "task.status.failed": "失败",
1916
+ "task.status.cancelled": "已取消",
1917
+ "member.state.working": "工作中",
1918
+ "member.state.failed": "有失败",
1919
+ "member.state.waiting": "等待",
1920
+ "member.state.delivered": "已交付",
1921
+ "member.state.left": "已离队",
1922
+ "member.state.removed": "已移除",
1923
+ "member.state.pending": "待执行",
1924
+ "member.state.unassigned": "待派工",
1925
+ "member.status.executing": "正在执行 {taskId}",
1926
+ "member.status.working": "正在处理已派任务",
1927
+ "member.status.waitingOn": "等待 {taskId} · {assignee}",
1928
+ "member.status.waitingPrerequisite": "等待前置任务",
1929
+ "member.status.waitingAssignment": "等待队长派工",
1930
+ "member.status.delivered": "任务已交付",
1931
+ "member.status.idle": "待继续执行",
1932
+ "member.status.unknown": "状态未知",
1933
+ "task.assignee.unclaimed": "待认领",
1934
+ "task.summary.waitingBreakdown": "等待队长拆解任务",
1935
+ "task.summary.allDelivered": "全部 {count} 项任务已交付",
1936
+ "task.summary.blockedAndRunning": "{tasks}{more} 等待前置,其余已开工",
1937
+ "task.summary.more": " 等 {count} 项",
1938
+ "task.summary.running": "{tasks} 正在执行",
1939
+ "task.summary.ready": "{tasks} 已就绪待开工",
1940
+ "task.summary.blocked": "{tasks} 等待前置",
1941
+ "task.summary.waitingSchedule": "等待下一轮调度",
1942
+ "progress.aria": "团队总进度",
1943
+ "progress.title": "总进度",
1944
+ "progress.running": "■ 进行中 {count}",
1945
+ "progress.blocked": "■ 等待依赖 {count}",
1946
+ "progress.delivered": "■ 已交付 {count}",
1947
+ "dependency.aria": "任务依赖链",
1948
+ "dependency.parallel": "并行任务",
1949
+ "dependency.title": "任务依赖",
1950
+ "dependency.hint.parallel": "无前后依赖 · 点击查看详情",
1951
+ "dependency.hint.chain": "悬停高亮依赖链 · 点击固定",
1952
+ "dependency.hint.pinned": "{taskId} 已固定 · Esc 取消",
1953
+ "task.runningAria": "运行中",
1954
+ "task.detail.completed": "已完成并交付",
1955
+ "task.detail.noPrerequisite": "无前置,可立即开工",
1956
+ "task.detail.ready": "前置已就绪,可开工",
1957
+ "task.detail.waitingOn": "等待 {tasks}",
1958
+ "task.detail.noDownstream": "无下游任务",
1959
+ "task.detail.unlocks": "完成后解锁 {tasks}",
1960
+ "team.ended": "已结束",
1961
+ "team.stats.members": "{count} 名成员",
1962
+ "team.stats.completed": "{completed}/{total} 完成",
1963
+ "team.stats.messages": "{count} 条消息",
1964
+ "delegation.aria": "队长派工关系",
1965
+ "captain.name": "队长",
1966
+ "captain.role": "拆解 · 派发 · 汇总",
1967
+ "captain.summary": "已派发 {tasks} 项任务给 {members} 名成员",
1968
+ "captain.state.working": "{count} 人执行中",
1969
+ "captain.state.collected": "已收齐",
1970
+ "captain.state.waiting": "等待回报",
1971
+ "members.toggle": "{count} 名成员",
1972
+ "members.collapse": "收起",
1973
+ "members.expand": "展开",
1974
+ "members.empty": "暂无成员,等待队长组建团队",
1975
+ "assignment.label": "队长派发",
1976
+ "assignment.empty": "暂无任务",
1977
+ "archive.label": "已结束 · 历史归档"
1978
+ };
1979
+ /** English dictionary, checked complete against the Chinese source key set. */
1980
+ const en = {
1981
+ "card.memberCount": "{count} members",
1982
+ "action.openActivityPanel": "Open activity panel",
1983
+ "activity.panelButton": "Activity panel",
1984
+ "activity.badgeAria": "AgentTeams activity, {count} teams",
1985
+ "activity.panelAria": "AgentTeams activity panel",
1986
+ "activity.title": "AgentTeams activity",
1987
+ "activity.float": "Switch to floating panel",
1988
+ "activity.dockRight": "Dock to the right",
1989
+ "activity.collapse": "Collapse activity panel",
1990
+ "activity.empty": "No team activity",
1991
+ "format.listSeparator": ", ",
1992
+ "task.status.pending": "Unclaimed",
1993
+ "task.status.claimed": "Claimed",
1994
+ "task.status.inProgress": "In progress",
1995
+ "task.status.completed": "Completed",
1996
+ "task.status.failed": "Failed",
1997
+ "task.status.cancelled": "Cancelled",
1998
+ "member.state.working": "Working",
1999
+ "member.state.failed": "Has failures",
2000
+ "member.state.waiting": "Waiting",
2001
+ "member.state.delivered": "Delivered",
2002
+ "member.state.left": "Left team",
2003
+ "member.state.removed": "Removed",
2004
+ "member.state.pending": "Pending",
2005
+ "member.state.unassigned": "Awaiting assignment",
2006
+ "member.status.executing": "Working on {taskId}",
2007
+ "member.status.working": "Working on assigned tasks",
2008
+ "member.status.waitingOn": "Waiting for {taskId} · {assignee}",
2009
+ "member.status.waitingPrerequisite": "Waiting for prerequisites",
2010
+ "member.status.waitingAssignment": "Waiting for the captain to assign work",
2011
+ "member.status.delivered": "Tasks delivered",
2012
+ "member.status.idle": "Ready to continue",
2013
+ "member.status.unknown": "Status unknown",
2014
+ "task.assignee.unclaimed": "Unclaimed",
2015
+ "task.summary.waitingBreakdown": "Waiting for the captain to break down the work",
2016
+ "task.summary.allDelivered": "All {count} tasks delivered",
2017
+ "task.summary.blockedAndRunning": "{tasks}{more} waiting on prerequisites; other work has started",
2018
+ "task.summary.more": " and {count} more",
2019
+ "task.summary.running": "{tasks} in progress",
2020
+ "task.summary.ready": "{tasks} ready to start",
2021
+ "task.summary.blocked": "{tasks} waiting on prerequisites",
2022
+ "task.summary.waitingSchedule": "Waiting for the next scheduling round",
2023
+ "progress.aria": "Overall team progress",
2024
+ "progress.title": "Overall progress",
2025
+ "progress.running": "■ In progress {count}",
2026
+ "progress.blocked": "■ Waiting {count}",
2027
+ "progress.delivered": "■ Delivered {count}",
2028
+ "dependency.aria": "Task dependency chain",
2029
+ "dependency.parallel": "Parallel tasks",
2030
+ "dependency.title": "Task dependencies",
2031
+ "dependency.hint.parallel": "No dependencies · Click for details",
2032
+ "dependency.hint.chain": "Hover to highlight dependencies · Click to pin",
2033
+ "dependency.hint.pinned": "{taskId} pinned · Esc to clear",
2034
+ "task.runningAria": "Running",
2035
+ "task.detail.completed": "Completed and delivered",
2036
+ "task.detail.noPrerequisite": "No prerequisites; ready to start",
2037
+ "task.detail.ready": "Prerequisites ready; can start",
2038
+ "task.detail.waitingOn": "Waiting for {tasks}",
2039
+ "task.detail.noDownstream": "No downstream tasks",
2040
+ "task.detail.unlocks": "Unlocks {tasks} when complete",
2041
+ "team.ended": "Ended",
2042
+ "team.stats.members": "{count} members",
2043
+ "team.stats.completed": "{completed}/{total} completed",
2044
+ "team.stats.messages": "{count} messages",
2045
+ "delegation.aria": "Captain delegation map",
2046
+ "captain.name": "Captain",
2047
+ "captain.role": "Break down · Delegate · Synthesize",
2048
+ "captain.summary": "Assigned {tasks} tasks to {members} members",
2049
+ "captain.state.working": "{count} active",
2050
+ "captain.state.collected": "All reports received",
2051
+ "captain.state.waiting": "Waiting for reports",
2052
+ "members.toggle": "Members {count}",
2053
+ "members.collapse": "Collapse",
2054
+ "members.expand": "Expand",
2055
+ "members.empty": "No members yet; waiting for the captain to assemble the team",
2056
+ "assignment.label": "Captain assigned",
2057
+ "assignment.empty": "No tasks",
2058
+ "archive.label": "Ended · Archived history"
2059
+ };
2060
+ //#endregion
2061
+ //#region lib/client/session-navigation.js
2062
+ /** Version-tolerant navigation into durable AgentTeams member transcripts. */
2063
+ /**
2064
+ * Open one member's persisted transcript.
2065
+ *
2066
+ * Harness rc.8 intentionally removed cold subagents from the ordinary session
2067
+ * list. They must first be rediscovered in their parent's catalog, then opened
2068
+ * with the exact parent/child/mode address. Older runtimes have only `open()`;
2069
+ * the fallback preserves the plugin's rc.6 peer range.
2070
+ */
2071
+ async function openAgentTeamMember(sessions, parentSessionId, childSessionId) {
2072
+ if (sessions.openSubagent === void 0 || sessions.refreshSubagents === void 0) {
2073
+ sessions.open(childSessionId);
2074
+ return "session";
2075
+ }
2076
+ await sessions.refreshSubagents(parentSessionId);
2077
+ const retained = sessions.subagentAddress?.(childSessionId);
2078
+ sessions.openSubagent(retained?.parentSessionId === parentSessionId ? retained : {
2079
+ parentSessionId,
2080
+ childSessionId,
2081
+ mode: "continuable"
2082
+ });
2083
+ return "subagent";
2084
+ }
2085
+ //#endregion
1870
2086
  //#region lib/client/index.js
1871
- /** Required services: conversation nodes, slots, and sessions navigation. */
2087
+ /** Required services: conversation nodes, slots, sessions navigation, and locale. */
1872
2088
  const inject = [
1873
2089
  "conversationEvents",
1874
2090
  "slots",
1875
- "sessions"
2091
+ "sessions",
2092
+ "locale"
1876
2093
  ];
1877
2094
  /** The replayed user message is the canonical transcript entry. */
1878
2095
  function HiddenAgentTeamsCommand() {
@@ -1884,17 +2101,26 @@ window.__ModuleLoader__.load({
1884
2101
  * monitor via a window event — the recovery path for an old session.
1885
2102
  */
1886
2103
  function apply(ctx) {
1887
- const Panel = () => (0, react_jsx_runtime.jsx)(ActivityPanel, {
2104
+ ctx.effect(() => ctx.locale.register(AGENT_TEAMS_LOCALE_NAMESPACE, {
2105
+ zh,
2106
+ en
2107
+ }), "agent-teams: dictionaries");
2108
+ const openMember = (parentId, childId) => {
2109
+ openAgentTeamMember(ctx.sessions, parentId, childId).catch((error) => {
2110
+ console.warn(`agent-teams: failed to open member transcript ${childId}: ${String(error)}`);
2111
+ });
2112
+ };
2113
+ const Panel = ({ t }) => (0, react_jsx_runtime.jsx)(ActivityPanel, {
1888
2114
  sessionsList: ctx.sessions.list,
1889
- openSession: (id) => {
1890
- ctx.sessions.open(id);
1891
- }
2115
+ openMember,
2116
+ t
1892
2117
  });
1893
2118
  ctx.slots.inject("shell.overlay", () => ctx.slots.register({
1894
2119
  name: "shell.overlay",
1895
2120
  id: "agent-teams-activity",
1896
2121
  order: 80,
1897
- label: "AgentTeams activity"
2122
+ label: "AgentTeams activity",
2123
+ locale: AGENT_TEAMS_LOCALE_NAMESPACE
1898
2124
  }, Panel));
1899
2125
  ctx.slots.inject("conversation.chat.commandview", () => ctx.slots.register({
1900
2126
  name: "conversation.chat.commandview",
@@ -1904,9 +2130,8 @@ window.__ModuleLoader__.load({
1904
2130
  ctx.slots.inject("conversation.chat.node", () => ctx.slots.register({
1905
2131
  name: "conversation.chat.node",
1906
2132
  key: "agent-teams",
1907
- inject: () => ({ openSession: (id) => {
1908
- ctx.sessions.open(id);
1909
- } })
2133
+ locale: AGENT_TEAMS_LOCALE_NAMESPACE,
2134
+ inject: () => ({ openMember })
1910
2135
  }, AgentTeamsCard));
1911
2136
  }
1912
2137
  //#endregion