@nanmicoder/dsh-agent-teams 0.1.11 → 0.1.13

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
@@ -241,18 +241,30 @@ window.__ModuleLoader__.load({
241
241
  }
242
242
  /** Poll cadence for the live host snapshot route. */
243
243
  const ACTIVITY_POLL_MS = 1e3;
244
+ /**
245
+ * Low-frequency probe cadence while a cardless discovery session still owns
246
+ * no team. The probe keeps the panel able to pick up a team created later in
247
+ * that session (e.g. a run_code-wrapped agent_teams_create) without turning
248
+ * every ordinary session into a one-second filesystem scan.
249
+ */
250
+ const ACTIVITY_PROBE_MS = 5e3;
244
251
  /** Host route serving live and archived team snapshots. */
245
252
  const ACTIVITY_STATE_URL = "/plugins/dsh-agent-teams/state";
246
253
  /**
247
254
  * Start the single polling loop for the current session's requested targets.
248
255
  *
249
256
  * 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.
257
+ * Explicit card targets poll at the live cadence from the start. A discovery
258
+ * session performs an immediate live+archive restore pass, then while it
259
+ * still owns no team probes on a low-frequency cadence, so a team created
260
+ * later in that session (e.g. a run_code-wrapped agent_teams_create) is
261
+ * discovered without a manual reload, without turning every ordinary session
262
+ * into a one-second filesystem scan. The moment a team for the discovery
263
+ * session appears, the controller upgrades to the live one-second cadence for
264
+ * the rest of its lifetime. The caller — the session view, which stops the
265
+ * controller when the session is no longer current — bounds the lifetime, and
266
+ * archive state is refreshed when a target or a previously discovered live
267
+ * team disappears.
256
268
  */
257
269
  function startActivityPolling(monitorTargets, runtime = {}) {
258
270
  const discoverySessionId = runtime.discoverySessionId?.trim();
@@ -269,12 +281,20 @@ window.__ModuleLoader__.load({
269
281
  const settleTargets = runtime.settleTargets ?? settleActivityMonitorTargets;
270
282
  let cancelled = false;
271
283
  let inFlight = false;
284
+ let hot = monitorTargets.length > 0;
272
285
  let discoveryComplete = false;
273
286
  let discoveredLiveKeys = /* @__PURE__ */ new Set();
274
287
  let controller;
288
+ let timer;
289
+ const intervalMs = () => hot ? ACTIVITY_POLL_MS : ACTIVITY_PROBE_MS;
290
+ const reschedule = () => {
291
+ cancel(timer);
292
+ timer = schedule(() => {
293
+ tick();
294
+ }, intervalMs());
295
+ };
275
296
  const tick = async () => {
276
297
  if (inFlight || cancelled) return;
277
- if (discoveryComplete && monitorTargets.length === 0 && discoveredLiveKeys.size === 0) return;
278
298
  inFlight = true;
279
299
  controller = new AbortController();
280
300
  try {
@@ -289,6 +309,10 @@ window.__ModuleLoader__.load({
289
309
  publishSnapshots({ teams: liveTeams });
290
310
  const previousDiscoveredKeys = discoveredLiveKeys;
291
311
  discoveredLiveKeys = new Set(discoverySessionId === void 0 || discoverySessionId === "" ? [] : liveTeams.filter((team) => team.captainSessionId === discoverySessionId).map((team) => team.teamId));
312
+ if (!hot && discoveredLiveKeys.size > 0) {
313
+ hot = true;
314
+ reschedule();
315
+ }
292
316
  const discoveredTeamArchived = [...previousDiscoveredKeys].some((teamId) => !discoveredLiveKeys.has(teamId));
293
317
  const missing = monitorTargets.filter((target) => !liveTeams.some((team) => team.captainSessionId === target.sessionId && team.teamId === target.teamId));
294
318
  const needsDiscoveryArchive = discoverySessionId !== void 0 && discoverySessionId !== "" && !discoveryComplete;
@@ -310,9 +334,9 @@ window.__ModuleLoader__.load({
310
334
  }
311
335
  };
312
336
  const firstTick = tick();
313
- const timer = schedule(() => {
337
+ if (timer === void 0) timer = schedule(() => {
314
338
  tick();
315
- }, ACTIVITY_POLL_MS);
339
+ }, intervalMs());
316
340
  return {
317
341
  firstTick,
318
342
  stop: () => {
@@ -414,7 +438,7 @@ window.__ModuleLoader__.load({
414
438
  } }));
415
439
  }
416
440
  /** Render one durable team as a compact conversation card. */
417
- function AgentTeamsCard({ node, openMember, sessionId }) {
441
+ function AgentTeamsCard({ node, openMember, sessionId, t }) {
418
442
  const data = node.data;
419
443
  const owner = data.captainSessionId || sessionId;
420
444
  const { teams, archivedTeams } = (0, react.useSyncExternalStore)(subscribeActivitySnapshots, getActivitySnapshotsSnapshot);
@@ -454,9 +478,9 @@ window.__ModuleLoader__.load({
454
478
  title: resolved.teamName,
455
479
  children: resolved.teamName
456
480
  }),
457
- (0, react_jsx_runtime.jsxs)("span", {
481
+ (0, react_jsx_runtime.jsx)("span", {
458
482
  className: AgentTeamsCard_module_css_default.memberCount,
459
- children: [resolved.members.length, " 名成员"]
483
+ children: t("card.memberCount", { count: resolved.members.length })
460
484
  }),
461
485
  (0, react_jsx_runtime.jsx)("button", {
462
486
  type: "button",
@@ -464,9 +488,9 @@ window.__ModuleLoader__.load({
464
488
  onClick: () => {
465
489
  openActivityPanel(resolved);
466
490
  },
467
- "aria-label": "打开活动面板",
468
- title: "打开活动面板",
469
- children: "活动面板"
491
+ "aria-label": t("action.openActivityPanel"),
492
+ title: t("action.openActivityPanel"),
493
+ children: t("activity.panelButton")
470
494
  })
471
495
  ]
472
496
  }), resolved.members.length > 0 && (0, react_jsx_runtime.jsx)("div", {
@@ -650,7 +674,7 @@ window.__ModuleLoader__.load({
650
674
  }
651
675
  //#endregion
652
676
  //#region \0dsh-css:/home/runner/work/dsh-agent-teams/dsh-agent-teams/src/client/ActivityPanel.module.css.mjs
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_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}}";
677
+ 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}}";
654
678
  const tagId = "@nanmicoder/dsh-agent-teams/ActivityPanel.module.css";
655
679
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId) + "]") === null) {
656
680
  const tag = document.createElement("style");
@@ -667,7 +691,7 @@ window.__ModuleLoader__.load({
667
691
  "agentTeamsPulse": "aYQbCq_agentTeamsPulse",
668
692
  "agentTeamsThink": "aYQbCq_agentTeamsThink",
669
693
  "agentTeamsUnreadPulse": "aYQbCq_agentTeamsUnreadPulse",
670
- "archivedWrap": "aYQbCq_archivedWrap",
694
+ "archiveLabel": "aYQbCq_archiveLabel",
671
695
  "assignmentChip": "aYQbCq_assignmentChip",
672
696
  "assignmentLabel": "aYQbCq_assignmentLabel",
673
697
  "assignmentLine": "aYQbCq_assignmentLine",
@@ -822,15 +846,19 @@ window.__ModuleLoader__.load({
822
846
  /** Badge text follows the raw task status (finer than the 4 visual states):
823
847
  * claimed/pending/failed/cancelled keep their own labels and colors. */
824
848
  const TASK_STATUS_LABEL = {
825
- pending: "待领取",
826
- claimed: "已认领",
827
- in_progress: "进行中",
828
- completed: "已完成",
829
- failed: "失败",
830
- cancelled: "已取消"
849
+ pending: "task.status.pending",
850
+ claimed: "task.status.claimed",
851
+ in_progress: "task.status.inProgress",
852
+ completed: "task.status.completed",
853
+ failed: "task.status.failed",
854
+ cancelled: "task.status.cancelled"
831
855
  };
832
- function taskStatusLabel(status) {
833
- return TASK_STATUS_LABEL[status] ?? status;
856
+ function taskStatusLabel(status, t) {
857
+ const key = TASK_STATUS_LABEL[status];
858
+ return key === void 0 ? status : t(key);
859
+ }
860
+ function formatTaskIds(ids, t) {
861
+ return ids.join(t("format.listSeparator"));
834
862
  }
835
863
  /** Badge/bar coloring key: visual state, widened for terminal statuses. */
836
864
  function taskTone(state, status) {
@@ -880,14 +908,14 @@ window.__ModuleLoader__.load({
880
908
  });
881
909
  }
882
910
  /** Collapsed badge: an always-visible corner pill while any team exists. */
883
- function CollapsedBadge({ count, busy, onClick }) {
911
+ function CollapsedBadge({ count, busy, onClick, t }) {
884
912
  return (0, react_jsx_runtime.jsxs)("button", {
885
913
  type: "button",
886
914
  className: ActivityPanel_module_css_default.badge,
887
915
  "data-agent-teams-collapsed": true,
888
916
  "data-busy": busy,
889
917
  onClick,
890
- "aria-label": `AgentTeams 活动,${count} 个团队`,
918
+ "aria-label": t("activity.badgeAria", { count }),
891
919
  children: [(0, react_jsx_runtime.jsx)("span", {
892
920
  className: ActivityPanel_module_css_default.badgeDot,
893
921
  "data-busy": busy,
@@ -898,62 +926,68 @@ window.__ModuleLoader__.load({
898
926
  })]
899
927
  });
900
928
  }
901
- function memberStateLabel(member, tasks, historic) {
929
+ function memberStateLabel(member, tasks, historic, t) {
902
930
  const owned = tasks.filter((task) => task.assignee === member.name);
903
- if (member.activity === "working") return "工作中";
904
- if (owned.some((task) => task.status === "failed")) return "有失败";
905
- if (owned.some((task) => task.state === "blocked")) return "等待";
906
- if (owned.length > 0 && owned.every((task) => task.status === "completed")) return "已交付";
907
- if (member.status === "removed") return historic ? "已离队" : "已移除";
908
- if (owned.length > 0) return "待执行";
909
- return "待派工";
931
+ if (member.activity === "working") return t("member.state.working");
932
+ if (owned.some((task) => task.status === "failed")) return t("member.state.failed");
933
+ if (owned.some((task) => task.state === "blocked")) return t("member.state.waiting");
934
+ if (owned.length > 0 && owned.every((task) => task.status === "completed")) return t("member.state.delivered");
935
+ if (member.status === "removed") return t(historic ? "member.state.left" : "member.state.removed");
936
+ if (owned.length > 0) return t("member.state.pending");
937
+ return t("member.state.unassigned");
910
938
  }
911
- function memberStatusText(member, tasks) {
939
+ function memberStatusText(member, tasks, t) {
912
940
  const owned = tasks.filter((task) => task.assignee === member.name);
913
941
  const current = owned.find((task) => task.id === member.currentTask);
914
942
  const blocked = owned.find((task) => task.state === "blocked");
915
- if (member.activity === "working" && current !== void 0) return `正在执行 ${current.id}`;
916
- if (member.activity === "working") return "正在处理已派任务";
943
+ if (member.activity === "working" && current !== void 0) return t("member.status.executing", { taskId: current.id });
944
+ if (member.activity === "working") return t("member.status.working");
917
945
  if (blocked !== void 0) {
918
946
  const dependency = tasks.find((task) => blocked.dependencies.includes(task.id) && task.state !== "completed");
919
- if (dependency !== void 0) return `等待 ${dependency.id} · ${dependency.assignee || "待认领"}`;
920
- return "等待前置任务";
947
+ if (dependency !== void 0) return t("member.status.waitingOn", {
948
+ taskId: dependency.id,
949
+ assignee: dependency.assignee || t("task.assignee.unclaimed")
950
+ });
951
+ return t("member.status.waitingPrerequisite");
921
952
  }
922
- if (member.total === 0) return "等待队长派工";
923
- if (member.done === member.total) return "任务已交付";
924
- return member.activity === "idle" ? "待继续执行" : "状态未知";
953
+ if (member.total === 0) return t("member.status.waitingAssignment");
954
+ if (member.done === member.total) return t("member.status.delivered");
955
+ return t(member.activity === "idle" ? "member.status.idle" : "member.status.unknown");
925
956
  }
926
957
  function compactTaskLabel(subject) {
927
958
  const withoutVerb = subject.replace(/^开发\s*/u, "").replace(/^\d+[-_.、\s]*/u, "");
928
959
  const head = withoutVerb.split(/[((·::]/u)[0]?.trim() ?? withoutVerb;
929
960
  return head.length > 18 ? `${head.slice(0, 17)}…` : head;
930
961
  }
931
- function taskSummary(team) {
962
+ function taskSummary(team, t) {
932
963
  const completed = team.tasks.filter((task) => task.status === "completed");
933
964
  const running = team.tasks.filter((task) => task.state === "running");
934
965
  const blocked = team.tasks.filter((task) => task.state === "blocked");
935
966
  const ready = team.tasks.filter((task) => task.state === "open" && task.status !== "completed");
936
- if (team.tasks.length === 0) return "等待队长拆解任务";
937
- if (completed.length === team.tasks.length) return `全部 ${completed.length} 项任务已交付`;
938
- if (blocked.length > 0 && running.length > 0) return `${blocked.slice(0, 3).map((task) => task.id).join("、")}${blocked.length > 3 ? ` 等 ${blocked.length} 项` : ""} 等待前置,其余已开工`;
939
- if (running.length > 0) return `${running.map((task) => task.id).join("、")} 正在执行`;
940
- if (ready.length > 0) return `${ready.map((task) => task.id).join("")} 已就绪待开工`;
941
- if (blocked.length > 0) return `${blocked.map((task) => task.id).join("、")} 等待前置`;
942
- return "等待下一轮调度";
967
+ if (team.tasks.length === 0) return t("task.summary.waitingBreakdown");
968
+ if (completed.length === team.tasks.length) return t("task.summary.allDelivered", { count: completed.length });
969
+ if (blocked.length > 0 && running.length > 0) return t("task.summary.blockedAndRunning", {
970
+ tasks: formatTaskIds(blocked.slice(0, 3).map((task) => task.id), t),
971
+ more: blocked.length > 3 ? t("task.summary.more", { count: blocked.length - 3 }) : ""
972
+ });
973
+ if (running.length > 0) return t("task.summary.running", { tasks: formatTaskIds(running.map((task) => task.id), t) });
974
+ if (ready.length > 0) return t("task.summary.ready", { tasks: formatTaskIds(ready.map((task) => task.id), t) });
975
+ if (blocked.length > 0) return t("task.summary.blocked", { tasks: formatTaskIds(blocked.map((task) => task.id), t) });
976
+ return t("task.summary.waitingSchedule");
943
977
  }
944
- function ProgressOverview({ team }) {
978
+ function ProgressOverview({ team, t }) {
945
979
  const running = team.tasks.filter((task) => task.state === "running").length;
946
980
  const blocked = team.tasks.filter((task) => task.state === "blocked").length;
947
981
  const completed = team.tasks.filter((task) => task.status === "completed").length;
948
982
  const summaryTone = blocked > 0 ? "warning" : completed === team.tasks.length && team.tasks.length > 0 ? "completed" : "running";
949
983
  return (0, react_jsx_runtime.jsxs)("section", {
950
984
  className: ActivityPanel_module_css_default.progressOverview,
951
- "aria-label": "团队总进度",
985
+ "aria-label": t("progress.aria"),
952
986
  "data-progress-summary": true,
953
987
  children: [
954
988
  (0, react_jsx_runtime.jsx)("span", {
955
989
  className: ActivityPanel_module_css_default.progressTitle,
956
- children: "总进度"
990
+ children: t("progress.title")
957
991
  }),
958
992
  team.tasks.length > 0 ? (0, react_jsx_runtime.jsx)("span", {
959
993
  className: ActivityPanel_module_css_default.progressSegments,
@@ -963,29 +997,29 @@ window.__ModuleLoader__.load({
963
997
  (0, react_jsx_runtime.jsxs)("span", {
964
998
  className: ActivityPanel_module_css_default.progressLegend,
965
999
  children: [
966
- (0, react_jsx_runtime.jsxs)("span", {
1000
+ (0, react_jsx_runtime.jsx)("span", {
967
1001
  "data-state": "running",
968
- children: ["■ 进行中 ", running]
1002
+ children: t("progress.running", { count: running })
969
1003
  }),
970
- (0, react_jsx_runtime.jsxs)("span", {
1004
+ (0, react_jsx_runtime.jsx)("span", {
971
1005
  "data-state": "blocked",
972
- children: ["■ 等待依赖 ", blocked]
1006
+ children: t("progress.blocked", { count: blocked })
973
1007
  }),
974
- (0, react_jsx_runtime.jsxs)("span", {
1008
+ (0, react_jsx_runtime.jsx)("span", {
975
1009
  "data-state": "completed",
976
- children: ["■ 已交付 ", completed]
1010
+ children: t("progress.delivered", { count: completed })
977
1011
  })
978
1012
  ]
979
1013
  }),
980
1014
  (0, react_jsx_runtime.jsxs)("span", {
981
1015
  className: ActivityPanel_module_css_default.progressSummary,
982
1016
  "data-state": summaryTone,
983
- children: [(0, react_jsx_runtime.jsx)("span", { className: ActivityPanel_module_css_default.progressSummaryDot }), (0, react_jsx_runtime.jsx)("span", { children: taskSummary(team) })]
1017
+ children: [(0, react_jsx_runtime.jsx)("span", { className: ActivityPanel_module_css_default.progressSummaryDot }), (0, react_jsx_runtime.jsx)("span", { children: taskSummary(team, t) })]
984
1018
  })
985
1019
  ]
986
1020
  });
987
1021
  }
988
- function DependencyMap({ tasks }) {
1022
+ function DependencyMap({ tasks, t }) {
989
1023
  const [open, setOpen] = (0, react.useState)(true);
990
1024
  const [hoverTaskId, setHoverTaskId] = (0, react.useState)(null);
991
1025
  const [keyboardTaskId, setKeyboardTaskId] = (0, react.useState)(null);
@@ -1028,7 +1062,7 @@ window.__ModuleLoader__.load({
1028
1062
  const dependents = tasks.filter((task) => task.dependencies.includes(detailTask.id));
1029
1063
  return (0, react_jsx_runtime.jsxs)("section", {
1030
1064
  className: ActivityPanel_module_css_default.dependencySection,
1031
- "aria-label": "任务依赖链",
1065
+ "aria-label": t("dependency.aria"),
1032
1066
  "data-dependency-map": true,
1033
1067
  children: [(0, react_jsx_runtime.jsxs)("header", {
1034
1068
  className: ActivityPanel_module_css_default.sectionHead,
@@ -1043,11 +1077,11 @@ window.__ModuleLoader__.load({
1043
1077
  (0, react_jsx_runtime.jsx)(Chevron, { open }),
1044
1078
  (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconBranchOutline16, {}),
1045
1079
  " ",
1046
- parallel ? "并行任务" : "任务依赖"
1080
+ t(parallel ? "dependency.parallel" : "dependency.title")
1047
1081
  ]
1048
1082
  }), (0, react_jsx_runtime.jsx)("span", {
1049
1083
  className: ActivityPanel_module_css_default.sectionHint,
1050
- children: pinnedTaskId === null ? parallel ? "无前后依赖 · 点击查看详情" : "悬停高亮依赖链 · 点击固定" : `${pinnedTaskId} 已固定 · Esc 取消`
1084
+ children: pinnedTaskId === null ? t(parallel ? "dependency.hint.parallel" : "dependency.hint.chain") : t("dependency.hint.pinned", { taskId: pinnedTaskId })
1051
1085
  })]
1052
1086
  }), open && (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [(0, react_jsx_runtime.jsx)("div", {
1053
1087
  className: ActivityPanel_module_css_default.dagViewport,
@@ -1112,7 +1146,7 @@ window.__ModuleLoader__.load({
1112
1146
  }),
1113
1147
  task.state === "running" && (0, react_jsx_runtime.jsx)("span", {
1114
1148
  className: ActivityPanel_module_css_default.dagRunningState,
1115
- "aria-label": "运行中",
1149
+ "aria-label": t("task.runningAria"),
1116
1150
  children: (0, react_jsx_runtime.jsx)(WorkGlyph, { active: true })
1117
1151
  })
1118
1152
  ]
@@ -1137,27 +1171,27 @@ window.__ModuleLoader__.load({
1137
1171
  (0, react_jsx_runtime.jsx)("span", {
1138
1172
  className: ActivityPanel_module_css_default.taskDetailBadge,
1139
1173
  "data-state": taskTone(detailTask.state, detailTask.status),
1140
- children: taskStatusLabel(detailTask.status)
1174
+ children: taskStatusLabel(detailTask.status, t)
1141
1175
  })
1142
1176
  ]
1143
1177
  }),
1144
1178
  (0, react_jsx_runtime.jsxs)("span", {
1145
1179
  className: ActivityPanel_module_css_default.taskDetailLine,
1146
1180
  children: [
1147
- detailTask.assignee || "待认领",
1181
+ detailTask.assignee || t("task.assignee.unclaimed"),
1148
1182
  " · ",
1149
- detailTask.status === "completed" ? "已完成并交付" : detailTask.dependencies.length === 0 ? "无前置,可立即开工" : waitingOn.length === 0 ? "前置已就绪,可开工" : `等待 ${waitingOn.join("、")}`
1183
+ 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) })
1150
1184
  ]
1151
1185
  }),
1152
1186
  (0, react_jsx_runtime.jsx)("span", {
1153
1187
  className: ActivityPanel_module_css_default.taskDetailMeta,
1154
- children: dependents.length === 0 ? "无下游任务" : `完成后解锁 ${dependents.map((task) => task.id).join("、")}`
1188
+ children: dependents.length === 0 ? t("task.detail.noDownstream") : t("task.detail.unlocks", { tasks: formatTaskIds(dependents.map((task) => task.id), t) })
1155
1189
  })
1156
1190
  ]
1157
1191
  })] })]
1158
1192
  });
1159
1193
  }
1160
- function TeamSection({ team, onNavigate, historic = false }) {
1194
+ function TeamSection({ team, onNavigate, t, historic = false }) {
1161
1195
  const [membersOpen, setMembersOpen] = (0, react.useState)(true);
1162
1196
  const busyCount = team.members.filter((member) => member.activity === "working").length;
1163
1197
  const assignedCount = team.tasks.filter((task) => task.assignee !== "").length;
@@ -1177,27 +1211,25 @@ window.__ModuleLoader__.load({
1177
1211
  }),
1178
1212
  historic && (0, react_jsx_runtime.jsx)("span", {
1179
1213
  className: ActivityPanel_module_css_default.historicPill,
1180
- children: "已结束"
1214
+ children: t("team.ended")
1181
1215
  }),
1182
1216
  (0, react_jsx_runtime.jsxs)("span", {
1183
1217
  className: ActivityPanel_module_css_default.teamStats,
1184
1218
  children: [
1185
- (0, react_jsx_runtime.jsxs)("span", {
1219
+ (0, react_jsx_runtime.jsx)("span", {
1186
1220
  "data-stat": "members",
1187
- children: [team.members.length, " 成员"]
1221
+ children: t("team.stats.members", { count: team.members.length })
1188
1222
  }),
1189
- (0, react_jsx_runtime.jsxs)("span", {
1223
+ (0, react_jsx_runtime.jsx)("span", {
1190
1224
  "data-stat": "tasks",
1191
- children: [
1192
- completedCount,
1193
- "/",
1194
- team.tasks.length,
1195
- " 完成"
1196
- ]
1225
+ children: t("team.stats.completed", {
1226
+ completed: completedCount,
1227
+ total: team.tasks.length
1228
+ })
1197
1229
  }),
1198
- (0, react_jsx_runtime.jsxs)("span", {
1230
+ (0, react_jsx_runtime.jsx)("span", {
1199
1231
  "data-stat": "messages",
1200
- children: [team.messageCount, " 消息"]
1232
+ children: t("team.stats.messages", { count: team.messageCount })
1201
1233
  })
1202
1234
  ]
1203
1235
  })
@@ -1205,7 +1237,7 @@ window.__ModuleLoader__.load({
1205
1237
  }),
1206
1238
  (0, react_jsx_runtime.jsxs)("section", {
1207
1239
  className: ActivityPanel_module_css_default.delegationSection,
1208
- "aria-label": "队长派工关系",
1240
+ "aria-label": t("delegation.aria"),
1209
1241
  "data-delegation-map": true,
1210
1242
  children: [
1211
1243
  (0, react_jsx_runtime.jsxs)("div", {
@@ -1226,30 +1258,30 @@ window.__ModuleLoader__.load({
1226
1258
  className: ActivityPanel_module_css_default.captainLine,
1227
1259
  children: [(0, react_jsx_runtime.jsx)("span", {
1228
1260
  className: ActivityPanel_module_css_default.captainName,
1229
- children: "队长"
1261
+ children: t("captain.name")
1230
1262
  }), (0, react_jsx_runtime.jsx)("span", {
1231
1263
  className: ActivityPanel_module_css_default.captainRole,
1232
- children: "拆解 · 派发 · 汇总"
1264
+ children: t("captain.role")
1233
1265
  })]
1234
- }), (0, react_jsx_runtime.jsxs)("span", {
1266
+ }), (0, react_jsx_runtime.jsx)("span", {
1235
1267
  className: ActivityPanel_module_css_default.captainSummary,
1236
- children: [
1237
- "已派发 ",
1238
- assignedCount,
1239
- " 项任务给 ",
1240
- team.members.length,
1241
- " 名成员"
1242
- ]
1268
+ children: t("captain.summary", {
1269
+ tasks: assignedCount,
1270
+ members: team.members.length
1271
+ })
1243
1272
  })]
1244
1273
  }),
1245
1274
  (0, react_jsx_runtime.jsxs)("span", {
1246
1275
  className: ActivityPanel_module_css_default.captainState,
1247
1276
  "data-busy": busyCount > 0,
1248
- children: [(0, react_jsx_runtime.jsx)(WorkGlyph, { active: busyCount > 0 }), busyCount > 0 ? `${busyCount} 人执行中` : allCompleted ? "已收齐" : "等待回报"]
1277
+ 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")]
1249
1278
  })
1250
1279
  ]
1251
1280
  }),
1252
- (0, react_jsx_runtime.jsx)(ProgressOverview, { team }),
1281
+ (0, react_jsx_runtime.jsx)(ProgressOverview, {
1282
+ team,
1283
+ t
1284
+ }),
1253
1285
  (0, react_jsx_runtime.jsxs)("button", {
1254
1286
  type: "button",
1255
1287
  className: ActivityPanel_module_css_default.membersToggle,
@@ -1258,17 +1290,13 @@ window.__ModuleLoader__.load({
1258
1290
  },
1259
1291
  "aria-expanded": membersOpen,
1260
1292
  "data-members-toggle": true,
1261
- children: [(0, react_jsx_runtime.jsxs)("span", { children: [
1262
- (0, react_jsx_runtime.jsx)(Chevron, { open: membersOpen }),
1263
- "成员 ",
1264
- team.members.length
1265
- ] }), (0, react_jsx_runtime.jsx)("span", { children: membersOpen ? "收起" : "展开" })]
1293
+ 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") })]
1266
1294
  }),
1267
1295
  membersOpen && (0, react_jsx_runtime.jsxs)("div", {
1268
1296
  className: ActivityPanel_module_css_default.delegationTree,
1269
1297
  children: [team.members.length === 0 && (0, react_jsx_runtime.jsx)("span", {
1270
1298
  className: ActivityPanel_module_css_default.emptyHint,
1271
- children: "暂无成员,等待队长组建团队"
1299
+ children: t("members.empty")
1272
1300
  }), team.members.map((member) => {
1273
1301
  const owned = team.tasks.filter((task) => task.assignee === member.name);
1274
1302
  return (0, react_jsx_runtime.jsxs)("div", {
@@ -1324,12 +1352,12 @@ window.__ModuleLoader__.load({
1324
1352
  (0, react_jsx_runtime.jsxs)("span", {
1325
1353
  className: ActivityPanel_module_css_default.memberState,
1326
1354
  "data-activity": member.activity,
1327
- children: [(0, react_jsx_runtime.jsx)(WorkGlyph, { active: member.activity === "working" }), memberStateLabel(member, team.tasks, historic)]
1355
+ children: [(0, react_jsx_runtime.jsx)(WorkGlyph, { active: member.activity === "working" }), memberStateLabel(member, team.tasks, historic, t)]
1328
1356
  })
1329
1357
  ]
1330
1358
  }), (0, react_jsx_runtime.jsx)("span", {
1331
1359
  className: ActivityPanel_module_css_default.memberStatusLine,
1332
- children: memberStatusText(member, team.tasks)
1360
+ children: memberStatusText(member, team.tasks, t)
1333
1361
  })]
1334
1362
  }),
1335
1363
  (0, react_jsx_runtime.jsxs)("span", {
@@ -1346,12 +1374,12 @@ window.__ModuleLoader__.load({
1346
1374
  className: ActivityPanel_module_css_default.assignmentLine,
1347
1375
  children: [(0, react_jsx_runtime.jsx)("span", {
1348
1376
  className: ActivityPanel_module_css_default.assignmentLabel,
1349
- children: "队长派发"
1377
+ children: t("assignment.label")
1350
1378
  }), (0, react_jsx_runtime.jsx)("span", {
1351
1379
  className: ActivityPanel_module_css_default.assignmentTasks,
1352
1380
  children: owned.length === 0 ? (0, react_jsx_runtime.jsx)("span", {
1353
1381
  className: ActivityPanel_module_css_default.taskEmpty,
1354
- children: "暂无任务"
1382
+ children: t("assignment.empty")
1355
1383
  }) : owned.map((task) => (0, react_jsx_runtime.jsx)("span", {
1356
1384
  className: ActivityPanel_module_css_default.assignmentChip,
1357
1385
  "data-state": taskTone(task.state, task.status),
@@ -1366,7 +1394,10 @@ window.__ModuleLoader__.load({
1366
1394
  })
1367
1395
  ]
1368
1396
  }),
1369
- (0, react_jsx_runtime.jsx)(DependencyMap, { tasks: team.tasks })
1397
+ (0, react_jsx_runtime.jsx)(DependencyMap, {
1398
+ tasks: team.tasks,
1399
+ t
1400
+ })
1370
1401
  ]
1371
1402
  });
1372
1403
  }
@@ -1393,10 +1424,7 @@ window.__ModuleLoader__.load({
1393
1424
  captainInbox: []
1394
1425
  };
1395
1426
  }
1396
- /** The top-right activity floater. Teams follow the current session: live
1397
- * snapshots and historic card summaries are only shown while their captain
1398
- * session is the one currently open. */
1399
- function ActivityPanel({ sessionsList, openMember }) {
1427
+ function ActivityPanel({ sessionsList, openMember, t }) {
1400
1428
  const navigateToSession = (parentId, childId) => {
1401
1429
  setOpen(false);
1402
1430
  setWasActive(false);
@@ -1675,6 +1703,7 @@ window.__ModuleLoader__.load({
1675
1703
  return (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [!expanded && (0, react_jsx_runtime.jsx)(CollapsedBadge, {
1676
1704
  count: visibleCount,
1677
1705
  busy,
1706
+ t,
1678
1707
  onClick: () => {
1679
1708
  if (current === void 0) return;
1680
1709
  setOpenOwner(current);
@@ -1690,7 +1719,7 @@ window.__ModuleLoader__.load({
1690
1719
  "data-compact": compact || void 0,
1691
1720
  "data-dragging": interaction === "dragging" || void 0,
1692
1721
  "data-resizing": interaction === "resizing" || void 0,
1693
- "aria-label": "AgentTeams 活动面板",
1722
+ "aria-label": t("activity.panelAria"),
1694
1723
  children: [
1695
1724
  (0, react_jsx_runtime.jsxs)("header", {
1696
1725
  className: ActivityPanel_module_css_default.panelHead,
@@ -1701,7 +1730,7 @@ window.__ModuleLoader__.load({
1701
1730
  "data-drag-handle": !compact || void 0,
1702
1731
  children: [(0, react_jsx_runtime.jsxs)("span", {
1703
1732
  className: ActivityPanel_module_css_default.panelTitle,
1704
- children: ["AgentTeams 活动", (0, react_jsx_runtime.jsx)("span", {
1733
+ children: [t("activity.title"), (0, react_jsx_runtime.jsx)("span", {
1705
1734
  className: ActivityPanel_module_css_default.panelDot,
1706
1735
  "data-busy": busy,
1707
1736
  "aria-hidden": true
@@ -1714,8 +1743,8 @@ window.__ModuleLoader__.load({
1714
1743
  "data-control": "dock",
1715
1744
  "data-mode": geometry.mode,
1716
1745
  onClick: toggleDock,
1717
- "aria-label": geometry.mode === "docked" ? "切换为浮动面板" : "停靠到右侧",
1718
- title: geometry.mode === "docked" ? "切换为浮动面板" : "停靠到右侧",
1746
+ "aria-label": t(geometry.mode === "docked" ? "activity.float" : "activity.dockRight"),
1747
+ title: t(geometry.mode === "docked" ? "activity.float" : "activity.dockRight"),
1719
1748
  children: (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconPanelLeftOutline16, {})
1720
1749
  }), (0, react_jsx_runtime.jsx)("button", {
1721
1750
  type: "button",
@@ -1725,8 +1754,8 @@ window.__ModuleLoader__.load({
1725
1754
  setOpen(false);
1726
1755
  setOpenOwner(void 0);
1727
1756
  },
1728
- "aria-label": "收起活动面板",
1729
- title: "收起活动面板",
1757
+ "aria-label": t("activity.collapse"),
1758
+ title: t("activity.collapse"),
1730
1759
  children: (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconChevronDownOutline14, {})
1731
1760
  })]
1732
1761
  })]
@@ -1735,27 +1764,33 @@ window.__ModuleLoader__.load({
1735
1764
  className: ActivityPanel_module_css_default.teams,
1736
1765
  children: visibleCount === 0 ? (0, react_jsx_runtime.jsx)("span", {
1737
1766
  className: ActivityPanel_module_css_default.emptyHint,
1738
- children: "暂无团队活动"
1767
+ children: t("activity.empty")
1739
1768
  }) : (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
1740
1769
  visibleTeams.map((team) => (0, react_jsx_runtime.jsx)(TeamSection, {
1741
1770
  team,
1742
- onNavigate: navigateToSession
1771
+ onNavigate: navigateToSession,
1772
+ t
1743
1773
  }, team.teamId)),
1744
- visibleArchived.map((team) => (0, react_jsx_runtime.jsx)("div", {
1774
+ visibleArchived.map((team) => (0, react_jsx_runtime.jsxs)("div", {
1745
1775
  "data-team-id": team.teamId,
1746
1776
  "data-historic": true,
1747
1777
  className: ActivityPanel_module_css_default.archivedWrap,
1748
- children: (0, react_jsx_runtime.jsx)(TeamSection, {
1778
+ children: [(0, react_jsx_runtime.jsx)("span", {
1779
+ className: ActivityPanel_module_css_default.archiveLabel,
1780
+ children: t("archive.label")
1781
+ }), (0, react_jsx_runtime.jsx)(TeamSection, {
1749
1782
  team,
1750
1783
  onNavigate: navigateToSession,
1784
+ t,
1751
1785
  historic: true
1752
- })
1786
+ })]
1753
1787
  }, `${team.captainSessionId}:${team.teamId}`)),
1754
1788
  visibleHistoric.map(({ data: team, owner }) => {
1755
1789
  const teamKey = `${owner}:${team.teamId}`;
1756
1790
  return (0, react_jsx_runtime.jsx)(TeamSection, {
1757
1791
  team: historicCardTeam(team, owner),
1758
1792
  onNavigate: navigateToSession,
1793
+ t,
1759
1794
  historic: true
1760
1795
  }, teamKey);
1761
1796
  })
@@ -1880,6 +1915,173 @@ window.__ModuleLoader__.load({
1880
1915
  }
1881
1916
  };
1882
1917
  //#endregion
1918
+ //#region lib/client/locales.js
1919
+ /** `agentTeams` namespace dictionaries for every plugin-owned Web surface. */
1920
+ /** Dictionary namespace owned by the AgentTeams client plugin. */
1921
+ const AGENT_TEAMS_LOCALE_NAMESPACE = "agentTeams";
1922
+ /** Simplified Chinese dictionary (the key-set source of truth). */
1923
+ const zh = {
1924
+ "card.memberCount": "{count} 名成员",
1925
+ "action.openActivityPanel": "打开活动面板",
1926
+ "activity.panelButton": "活动面板",
1927
+ "activity.badgeAria": "AgentTeams 活动,{count} 个团队",
1928
+ "activity.panelAria": "AgentTeams 活动面板",
1929
+ "activity.title": "AgentTeams 活动",
1930
+ "activity.float": "切换为浮动面板",
1931
+ "activity.dockRight": "停靠到右侧",
1932
+ "activity.collapse": "收起活动面板",
1933
+ "activity.empty": "暂无团队活动",
1934
+ "format.listSeparator": "、",
1935
+ "task.status.pending": "待领取",
1936
+ "task.status.claimed": "已认领",
1937
+ "task.status.inProgress": "进行中",
1938
+ "task.status.completed": "已完成",
1939
+ "task.status.failed": "失败",
1940
+ "task.status.cancelled": "已取消",
1941
+ "member.state.working": "工作中",
1942
+ "member.state.failed": "有失败",
1943
+ "member.state.waiting": "等待",
1944
+ "member.state.delivered": "已交付",
1945
+ "member.state.left": "已离队",
1946
+ "member.state.removed": "已移除",
1947
+ "member.state.pending": "待执行",
1948
+ "member.state.unassigned": "待派工",
1949
+ "member.status.executing": "正在执行 {taskId}",
1950
+ "member.status.working": "正在处理已派任务",
1951
+ "member.status.waitingOn": "等待 {taskId} · {assignee}",
1952
+ "member.status.waitingPrerequisite": "等待前置任务",
1953
+ "member.status.waitingAssignment": "等待队长派工",
1954
+ "member.status.delivered": "任务已交付",
1955
+ "member.status.idle": "待继续执行",
1956
+ "member.status.unknown": "状态未知",
1957
+ "task.assignee.unclaimed": "待认领",
1958
+ "task.summary.waitingBreakdown": "等待队长拆解任务",
1959
+ "task.summary.allDelivered": "全部 {count} 项任务已交付",
1960
+ "task.summary.blockedAndRunning": "{tasks}{more} 等待前置,其余已开工",
1961
+ "task.summary.more": " 等 {count} 项",
1962
+ "task.summary.running": "{tasks} 正在执行",
1963
+ "task.summary.ready": "{tasks} 已就绪待开工",
1964
+ "task.summary.blocked": "{tasks} 等待前置",
1965
+ "task.summary.waitingSchedule": "等待下一轮调度",
1966
+ "progress.aria": "团队总进度",
1967
+ "progress.title": "总进度",
1968
+ "progress.running": "■ 进行中 {count}",
1969
+ "progress.blocked": "■ 等待依赖 {count}",
1970
+ "progress.delivered": "■ 已交付 {count}",
1971
+ "dependency.aria": "任务依赖链",
1972
+ "dependency.parallel": "并行任务",
1973
+ "dependency.title": "任务依赖",
1974
+ "dependency.hint.parallel": "无前后依赖 · 点击查看详情",
1975
+ "dependency.hint.chain": "悬停高亮依赖链 · 点击固定",
1976
+ "dependency.hint.pinned": "{taskId} 已固定 · Esc 取消",
1977
+ "task.runningAria": "运行中",
1978
+ "task.detail.completed": "已完成并交付",
1979
+ "task.detail.noPrerequisite": "无前置,可立即开工",
1980
+ "task.detail.ready": "前置已就绪,可开工",
1981
+ "task.detail.waitingOn": "等待 {tasks}",
1982
+ "task.detail.noDownstream": "无下游任务",
1983
+ "task.detail.unlocks": "完成后解锁 {tasks}",
1984
+ "team.ended": "已结束",
1985
+ "team.stats.members": "{count} 名成员",
1986
+ "team.stats.completed": "{completed}/{total} 完成",
1987
+ "team.stats.messages": "{count} 条消息",
1988
+ "delegation.aria": "队长派工关系",
1989
+ "captain.name": "队长",
1990
+ "captain.role": "拆解 · 派发 · 汇总",
1991
+ "captain.summary": "已派发 {tasks} 项任务给 {members} 名成员",
1992
+ "captain.state.working": "{count} 人执行中",
1993
+ "captain.state.collected": "已收齐",
1994
+ "captain.state.waiting": "等待回报",
1995
+ "members.toggle": "{count} 名成员",
1996
+ "members.collapse": "收起",
1997
+ "members.expand": "展开",
1998
+ "members.empty": "暂无成员,等待队长组建团队",
1999
+ "assignment.label": "队长派发",
2000
+ "assignment.empty": "暂无任务",
2001
+ "archive.label": "已结束 · 历史归档"
2002
+ };
2003
+ /** English dictionary, checked complete against the Chinese source key set. */
2004
+ const en = {
2005
+ "card.memberCount": "{count} members",
2006
+ "action.openActivityPanel": "Open activity panel",
2007
+ "activity.panelButton": "Activity panel",
2008
+ "activity.badgeAria": "AgentTeams activity, {count} teams",
2009
+ "activity.panelAria": "AgentTeams activity panel",
2010
+ "activity.title": "AgentTeams activity",
2011
+ "activity.float": "Switch to floating panel",
2012
+ "activity.dockRight": "Dock to the right",
2013
+ "activity.collapse": "Collapse activity panel",
2014
+ "activity.empty": "No team activity",
2015
+ "format.listSeparator": ", ",
2016
+ "task.status.pending": "Unclaimed",
2017
+ "task.status.claimed": "Claimed",
2018
+ "task.status.inProgress": "In progress",
2019
+ "task.status.completed": "Completed",
2020
+ "task.status.failed": "Failed",
2021
+ "task.status.cancelled": "Cancelled",
2022
+ "member.state.working": "Working",
2023
+ "member.state.failed": "Has failures",
2024
+ "member.state.waiting": "Waiting",
2025
+ "member.state.delivered": "Delivered",
2026
+ "member.state.left": "Left team",
2027
+ "member.state.removed": "Removed",
2028
+ "member.state.pending": "Pending",
2029
+ "member.state.unassigned": "Awaiting assignment",
2030
+ "member.status.executing": "Working on {taskId}",
2031
+ "member.status.working": "Working on assigned tasks",
2032
+ "member.status.waitingOn": "Waiting for {taskId} · {assignee}",
2033
+ "member.status.waitingPrerequisite": "Waiting for prerequisites",
2034
+ "member.status.waitingAssignment": "Waiting for the captain to assign work",
2035
+ "member.status.delivered": "Tasks delivered",
2036
+ "member.status.idle": "Ready to continue",
2037
+ "member.status.unknown": "Status unknown",
2038
+ "task.assignee.unclaimed": "Unclaimed",
2039
+ "task.summary.waitingBreakdown": "Waiting for the captain to break down the work",
2040
+ "task.summary.allDelivered": "All {count} tasks delivered",
2041
+ "task.summary.blockedAndRunning": "{tasks}{more} waiting on prerequisites; other work has started",
2042
+ "task.summary.more": " and {count} more",
2043
+ "task.summary.running": "{tasks} in progress",
2044
+ "task.summary.ready": "{tasks} ready to start",
2045
+ "task.summary.blocked": "{tasks} waiting on prerequisites",
2046
+ "task.summary.waitingSchedule": "Waiting for the next scheduling round",
2047
+ "progress.aria": "Overall team progress",
2048
+ "progress.title": "Overall progress",
2049
+ "progress.running": "■ In progress {count}",
2050
+ "progress.blocked": "■ Waiting {count}",
2051
+ "progress.delivered": "■ Delivered {count}",
2052
+ "dependency.aria": "Task dependency chain",
2053
+ "dependency.parallel": "Parallel tasks",
2054
+ "dependency.title": "Task dependencies",
2055
+ "dependency.hint.parallel": "No dependencies · Click for details",
2056
+ "dependency.hint.chain": "Hover to highlight dependencies · Click to pin",
2057
+ "dependency.hint.pinned": "{taskId} pinned · Esc to clear",
2058
+ "task.runningAria": "Running",
2059
+ "task.detail.completed": "Completed and delivered",
2060
+ "task.detail.noPrerequisite": "No prerequisites; ready to start",
2061
+ "task.detail.ready": "Prerequisites ready; can start",
2062
+ "task.detail.waitingOn": "Waiting for {tasks}",
2063
+ "task.detail.noDownstream": "No downstream tasks",
2064
+ "task.detail.unlocks": "Unlocks {tasks} when complete",
2065
+ "team.ended": "Ended",
2066
+ "team.stats.members": "{count} members",
2067
+ "team.stats.completed": "{completed}/{total} completed",
2068
+ "team.stats.messages": "{count} messages",
2069
+ "delegation.aria": "Captain delegation map",
2070
+ "captain.name": "Captain",
2071
+ "captain.role": "Break down · Delegate · Synthesize",
2072
+ "captain.summary": "Assigned {tasks} tasks to {members} members",
2073
+ "captain.state.working": "{count} active",
2074
+ "captain.state.collected": "All reports received",
2075
+ "captain.state.waiting": "Waiting for reports",
2076
+ "members.toggle": "Members {count}",
2077
+ "members.collapse": "Collapse",
2078
+ "members.expand": "Expand",
2079
+ "members.empty": "No members yet; waiting for the captain to assemble the team",
2080
+ "assignment.label": "Captain assigned",
2081
+ "assignment.empty": "No tasks",
2082
+ "archive.label": "Ended · Archived history"
2083
+ };
2084
+ //#endregion
1883
2085
  //#region lib/client/session-navigation.js
1884
2086
  /** Version-tolerant navigation into durable AgentTeams member transcripts. */
1885
2087
  /**
@@ -1906,11 +2108,12 @@ window.__ModuleLoader__.load({
1906
2108
  }
1907
2109
  //#endregion
1908
2110
  //#region lib/client/index.js
1909
- /** Required services: conversation nodes, slots, and sessions navigation. */
2111
+ /** Required services: conversation nodes, slots, sessions navigation, and locale. */
1910
2112
  const inject = [
1911
2113
  "conversationEvents",
1912
2114
  "slots",
1913
- "sessions"
2115
+ "sessions",
2116
+ "locale"
1914
2117
  ];
1915
2118
  /** The replayed user message is the canonical transcript entry. */
1916
2119
  function HiddenAgentTeamsCommand() {
@@ -1922,20 +2125,26 @@ window.__ModuleLoader__.load({
1922
2125
  * monitor via a window event — the recovery path for an old session.
1923
2126
  */
1924
2127
  function apply(ctx) {
2128
+ ctx.effect(() => ctx.locale.register(AGENT_TEAMS_LOCALE_NAMESPACE, {
2129
+ zh,
2130
+ en
2131
+ }), "agent-teams: dictionaries");
1925
2132
  const openMember = (parentId, childId) => {
1926
2133
  openAgentTeamMember(ctx.sessions, parentId, childId).catch((error) => {
1927
2134
  console.warn(`agent-teams: failed to open member transcript ${childId}: ${String(error)}`);
1928
2135
  });
1929
2136
  };
1930
- const Panel = () => (0, react_jsx_runtime.jsx)(ActivityPanel, {
2137
+ const Panel = ({ t }) => (0, react_jsx_runtime.jsx)(ActivityPanel, {
1931
2138
  sessionsList: ctx.sessions.list,
1932
- openMember
2139
+ openMember,
2140
+ t
1933
2141
  });
1934
2142
  ctx.slots.inject("shell.overlay", () => ctx.slots.register({
1935
2143
  name: "shell.overlay",
1936
2144
  id: "agent-teams-activity",
1937
2145
  order: 80,
1938
- label: "AgentTeams activity"
2146
+ label: "AgentTeams activity",
2147
+ locale: AGENT_TEAMS_LOCALE_NAMESPACE
1939
2148
  }, Panel));
1940
2149
  ctx.slots.inject("conversation.chat.commandview", () => ctx.slots.register({
1941
2150
  name: "conversation.chat.commandview",
@@ -1945,6 +2154,7 @@ window.__ModuleLoader__.load({
1945
2154
  ctx.slots.inject("conversation.chat.node", () => ctx.slots.register({
1946
2155
  name: "conversation.chat.node",
1947
2156
  key: "agent-teams",
2157
+ locale: AGENT_TEAMS_LOCALE_NAMESPACE,
1948
2158
  inject: () => ({ openMember })
1949
2159
  }, AgentTeamsCard));
1950
2160
  }