@nanmicoder/dsh-agent-teams 0.1.4 → 0.1.6

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
@@ -8,8 +8,12 @@ window.__ModuleLoader__.load({
8
8
  let react_dom_client = require("react-dom/client");
9
9
  let react = require("react");
10
10
  let _deepseek_ai_dsh_client_ui_primitives = require("@deepseek-ai/dsh-client-ui-primitives");
11
- //#region lib/client/activity-model.js
12
- /** Pure relationship projections used by the AgentTeams activity panel. */
11
+ /** Use a fill-width grid when the task graph has no real dependency edges. */
12
+ function usesParallelTaskGrid(tasks) {
13
+ if (tasks.length === 0) return false;
14
+ const taskIds = new Set(tasks.map((task) => task.id));
15
+ return tasks.every((task) => task.dependencies.every((dependency) => !taskIds.has(dependency)));
16
+ }
13
17
  /**
14
18
  * Whether an expanded activity panel still belongs to the current session.
15
19
  *
@@ -21,6 +25,16 @@ window.__ModuleLoader__.load({
21
25
  function activityPanelExpandedForSession(open, owner, current) {
22
26
  return open && owner !== void 0 && owner === current;
23
27
  }
28
+ /**
29
+ * Resolve the task whose dependency chain should be highlighted.
30
+ *
31
+ * A pinned task is an explicit user choice. Keyboard focus takes precedence
32
+ * over delayed pointer intent so an older hover timer cannot steal the active
33
+ * chain from someone navigating the task map with the keyboard.
34
+ */
35
+ function dependencyFocusTaskId(pinnedTaskId, keyboardTaskId, hoverTaskId) {
36
+ return pinnedTaskId ?? keyboardTaskId ?? hoverTaskId;
37
+ }
24
38
  /** Group tasks by their precomputed dependency depth. */
25
39
  function taskStages(tasks) {
26
40
  const byDepth = /* @__PURE__ */ new Map();
@@ -36,6 +50,56 @@ window.__ModuleLoader__.load({
36
50
  }));
37
51
  }
38
52
  /**
53
+ * Lay tasks out as the reference panel's compact left-to-right DAG.
54
+ *
55
+ * Columns are dependency-depth stages. Rows are stable task-id order within
56
+ * each stage. Edges use cubic curves so fan-in remains readable without
57
+ * turning every task into a large card.
58
+ */
59
+ function compactDagLayout(tasks) {
60
+ const stages = taskStages(tasks);
61
+ const positions = /* @__PURE__ */ new Map();
62
+ const nodes = [];
63
+ for (const [column, stage] of stages.entries()) for (const [row, task] of stage.tasks.entries()) {
64
+ const x = column * 118;
65
+ const y = row * 38;
66
+ positions.set(task.id, {
67
+ x,
68
+ y
69
+ });
70
+ nodes.push({
71
+ task,
72
+ x,
73
+ y
74
+ });
75
+ }
76
+ const edges = [];
77
+ for (const task of tasks) {
78
+ const target = positions.get(task.id);
79
+ if (target === void 0) continue;
80
+ for (const dependency of task.dependencies) {
81
+ const source = positions.get(dependency);
82
+ if (source === void 0) continue;
83
+ const x1 = source.x + 92;
84
+ const y1 = source.y + 30 / 2;
85
+ const x2 = target.x;
86
+ const y2 = target.y + 30 / 2;
87
+ edges.push({
88
+ from: dependency,
89
+ to: task.id,
90
+ path: `M${x1} ${y1}C${x1 + 14} ${y1},${x2 - 14} ${y2},${x2} ${y2}`
91
+ });
92
+ }
93
+ }
94
+ const rows = Math.max(1, ...stages.map((stage) => stage.tasks.length));
95
+ return {
96
+ width: stages.length === 0 ? 0 : stages.length * 92 + (stages.length - 1) * 26,
97
+ height: stages.length === 0 ? 0 : rows * 30 + (rows - 1) * 8,
98
+ nodes,
99
+ edges
100
+ };
101
+ }
102
+ /**
39
103
  * Return the complete upstream/downstream chain around one task.
40
104
  *
41
105
  * Traversal uses both dependency directions and remains cycle-safe, so the UI
@@ -261,7 +325,7 @@ window.__ModuleLoader__.load({
261
325
  }
262
326
  //#endregion
263
327
  //#region \0dsh-css:/home/runner/work/dsh-agent-teams/dsh-agent-teams/src/client/ActivityPanel.module.css.mjs
264
- const css = "html{--agent-teams-panel-width:388px;--agent-teams-panel-right:calc(18px + var(--dsh-sidebar-width,0px));--agent-teams-panel-gap:14px;--agent-teams-panel-shift:calc(var(--agent-teams-panel-width) + 18px + var(--agent-teams-panel-gap))}html[data-agent-teams-panel-open] [data-phase=active]{box-sizing:border-box;padding-right:var(--agent-teams-panel-shift)}[data-phase=active]{will-change:padding-right;transition:padding-right .36s cubic-bezier(.22,1,.36,1)}.aYQbCq_badge{top:64px;right:var(--agent-teams-panel-right);z-index:2147483000;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:fixed}.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_closeButton:focus-visible,.aYQbCq_memberRow:focus-visible,.aYQbCq_taskNode: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{top:64px;right:var(--agent-teams-panel-right);z-index:2147483000;width:min(var(--agent-teams-panel-width), calc(100vw - 24px));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-platform) 95%, transparent);backdrop-filter:blur(20px)saturate(1.08);max-height:70dvh;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);border-radius:16px;flex-direction:column;animation:.18s ease-out aYQbCq_agentTeamsPanelIn;display:flex;position:fixed;overflow:hidden}@keyframes aYQbCq_agentTeamsPanelIn{0%{opacity:0;transform:translateY(-6px)scale(.99)}to{opacity:1;transform:translateY(0)scale(1)}}@keyframes aYQbCq_agentTeamsPulse{0%,to{opacity:.42}50%{opacity:1}}.aYQbCq_panelHead{border-bottom:1px solid var(--dsw-alias-line-normal);flex:none;justify-content:space-between;align-items:center;min-height:44px;padding:0 14px 0 16px;display:flex}.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_closeButton{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_closeButton:hover{background:var(--dsw-alias-bg-fill-neutral);color:var(--dsw-alias-label-primary)}.aYQbCq_closeButton:active{transform:scale(.94)}.aYQbCq_teams{overscroll-behavior:contain;flex-direction:column;min-height:0;display:flex;overflow-y:auto}.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:38px minmax(0,1fr) auto;align-items:center;gap:9px;min-height:48px;padding:8px 10px;display:grid}.aYQbCq_captainAvatar,.aYQbCq_memberAvatar{flex:none;justify-content:center;align-items:center;display:inline-flex;position:relative}.aYQbCq_captainAvatar{width:36px;height:36px}.aYQbCq_leadAvatar,.aYQbCq_memberArt,.aYQbCq_memberInitial{box-sizing:border-box;border:1px solid var(--dsw-alias-line-strong);object-fit:cover;background:#0b1d33;border-radius:50%;width:34px;height:34px}.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_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:23px;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:44px;color:inherit;font:inherit;text-align:left;cursor:pointer;background:0 0;border:0;border-radius:8px;grid-template-columns:38px 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:34px;height:34px}.aYQbCq_memberAvatar[data-unread=true]:after{border:1px solid var(--dsw-alias-state-business-primary);content:\"\";border-radius:50%;animation:1.5s ease-out infinite aYQbCq_agentTeamsRing;position:absolute;inset:-3px}@keyframes aYQbCq_agentTeamsRing{0%{opacity:.82;transform:scale(.94)}75%,to{opacity:0;transform:scale(1.18)}}.aYQbCq_memberInitial{color:var(--dsw-alias-label-on-fill);justify-content:center;align-items:center;font-size:14px;font-weight:600;line-height:20px;display:inline-flex}.aYQbCq_stateArt{box-sizing:border-box;border:2px solid var(--dsw-alias-bg-module-platform);object-fit:cover;background:#0b1d33;border-radius:50%;width:19px;height:19px;position:absolute;bottom:-4px;right:-4px}.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 52px;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_stageFlow{scrollbar-width:thin;align-items:stretch;gap:0;min-width:0;padding:1px 1px 5px;display:flex;overflow-x:auto}.aYQbCq_stageGroup{flex:1 0 126px;min-width:126px;display:flex;position:relative}.aYQbCq_stageConnector{width:22px;height:14px;color:var(--dsw-alias-label-tertiary);flex:none;align-items:center;margin-top:0;display:flex}.aYQbCq_stageLine{background:var(--dsw-alias-line-strong);flex:1;height:1px;display:block}.aYQbCq_stageColumn{flex-direction:column;flex:1;gap:5px;min-width:0;display:flex}.aYQbCq_stageLabel{color:var(--dsw-alias-label-tertiary);justify-content:space-between;align-items:center;gap:6px;padding:0 2px;font-size:9.5px;font-weight:600;line-height:14px;display:flex}.aYQbCq_stageLabel span{background:var(--dsw-alias-bg-fill-neutral);border-radius:4px;justify-content:center;align-items:center;min-width:14px;height:14px;font-size:8.5px;display:inline-flex}.aYQbCq_stageTasks{flex-direction:column;gap:5px;display:flex}.aYQbCq_taskNode{box-sizing:border-box;border:1px solid var(--dsw-alias-line-normal);background:var(--dsw-alias-bg-module);min-width:0;min-height:72px;color:var(--dsw-alias-label-primary);font:inherit;text-align:left;cursor:pointer;border-radius:8px;flex-direction:column;gap:4px;padding:7px 8px;transition:border-color .14s,opacity .14s,transform .12s,background-color .14s;display:flex}.aYQbCq_taskNode:hover,.aYQbCq_taskNode[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));transform:translateY(-1px)}.aYQbCq_taskNode[data-dimmed=true]{opacity:.34}.aYQbCq_taskNode[data-state=completed]{border-color:color-mix(in srgb, var(--dsw-alias-state-success) 48%, var(--dsw-alias-line-normal))}.aYQbCq_taskNode[data-state=blocked]{border-color:color-mix(in srgb, var(--dsw-alias-state-warning) 52%, var(--dsw-alias-line-normal))}.aYQbCq_taskNode[data-state=failed]{border-color:color-mix(in srgb, var(--dsw-alias-state-danger) 56%, var(--dsw-alias-line-normal))}.aYQbCq_taskNodeHead,.aYQbCq_taskRoute{justify-content:space-between;align-items:center;gap:5px;min-width:0;display:flex}.aYQbCq_taskId{color:var(--dsw-alias-label-tertiary);font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:9.5px;font-weight:700}.aYQbCq_taskBadge{background:var(--dsw-alias-bg-fill-neutral);min-height:14px;color:var(--dsw-alias-label-secondary);border-radius:4px;flex:none;align-items:center;padding:0 4px;font-size:8.5px;font-weight:600;line-height:13px;display:inline-flex}.aYQbCq_taskBadge[data-state=running]{background:var(--dsw-alias-bg-fill-business);color:var(--dsw-alias-label-on-fill)}.aYQbCq_taskBadge[data-state=completed]{background:var(--dsw-alias-bg-fill-success);color:var(--dsw-alias-label-on-fill)}.aYQbCq_taskBadge[data-state=blocked]{background:var(--dsw-alias-bg-fill-warning);color:var(--dsw-alias-label-on-fill)}.aYQbCq_taskBadge[data-state=failed]{background:var(--dsw-alias-bg-fill-danger);color:var(--dsw-alias-label-on-fill)}.aYQbCq_taskBadge[data-state=cancelled]{color:var(--dsw-alias-label-tertiary);text-decoration:line-through}.aYQbCq_taskSubject{min-height:30px;color:var(--dsw-alias-label-primary);-webkit-line-clamp:2;-webkit-box-orient:vertical;font-size:10.5px;font-weight:500;line-height:15px;display:-webkit-box;overflow:hidden}.aYQbCq_taskRoute{color:var(--dsw-alias-label-tertiary);margin-top:auto;font-size:8.5px;line-height:13px}.aYQbCq_taskOwner,.aYQbCq_taskDeps{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.aYQbCq_taskOwner{max-width:48%;color:var(--dsw-alias-label-secondary);font-weight:600}.aYQbCq_taskDeps{text-align:right;flex:1}.aYQbCq_taskStart{color:var(--dsw-alias-label-tertiary)}.aYQbCq_unclaimed,.aYQbCq_inbox{border-top:1px solid var(--dsw-alias-line-normal);flex-direction:column;gap:5px;min-width:0;padding-top:10px;display:flex}.aYQbCq_unclaimedTitle{color:var(--dsw-alias-label-secondary);font-size:10.5px;font-weight:600;line-height:15px}.aYQbCq_inboxRow{border-radius:6px;grid-template-columns:112px minmax(0,1fr);align-items:center;gap:8px;min-width:0;min-height:24px;padding:2px 5px;display:grid}.aYQbCq_inboxRow:hover{background:var(--dsw-alias-bg-module)}.aYQbCq_inboxRoute{min-width:0;color:var(--dsw-alias-state-business-primary);text-overflow:ellipsis;white-space:nowrap;align-items:center;gap:3px;font-size:9.5px;font-weight:600;line-height:14px;display:inline-flex;overflow:hidden}.aYQbCq_inboxContent{min-width:0;color:var(--dsw-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;font-size:10px;line-height:14px;overflow:hidden}.aYQbCq_emptyHint{color:var(--dsw-alias-label-tertiary);padding:10px 12px;font-size:11px;line-height:16px}.aYQbCq_team[data-historic],.aYQbCq_archivedWrap{opacity:.82}.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){[data-phase=active],.aYQbCq_panel,.aYQbCq_badge,.aYQbCq_badgeDot,.aYQbCq_panelDot,.aYQbCq_stateArt,.aYQbCq_memberAvatar[data-unread=true]:after{transition:none;animation:none}}@media (width<=960px){html{--agent-teams-main-shift:0px}html[data-agent-teams-panel-open] [data-phase=active]{padding-right:0}}@media (width<=640px){html{--agent-teams-panel-right:calc(10px + var(--dsh-sidebar-width,0px))}.aYQbCq_panel{width:auto;max-height:calc(100dvh - 68px);top:56px;left:10px}.aYQbCq_badge{top:56px}.aYQbCq_teamStats span[data-stat=messages]{display:none}.aYQbCq_captainNode{grid-template-columns:38px minmax(0,1fr)}.aYQbCq_captainState{display:none}.aYQbCq_delegationTree{margin-left:12px;padding-left:15px}.aYQbCq_memberBranch{width:15px}.aYQbCq_assignmentLine{padding-left:45px}}";
328
+ const css = "html{--agent-teams-panel-width:388px;--agent-teams-panel-top:64px;--agent-teams-panel-bottom-gap:64px;--agent-teams-panel-min-height:560px;--agent-teams-panel-right:calc(18px + var(--dsh-sidebar-width,0px));--agent-teams-panel-gap:14px;--agent-teams-panel-shift:calc(var(--agent-teams-panel-width) + 18px + var(--agent-teams-panel-gap))}html[data-agent-teams-panel-open] [data-phase=active]{box-sizing:border-box;padding-right:var(--agent-teams-panel-shift)}[data-phase=active]{will-change:padding-right;transition:padding-right .36s cubic-bezier(.22,1,.36,1)}.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{top:var(--agent-teams-panel-top);right:var(--agent-teams-panel-right);z-index:2147483000;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:fixed}.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_closeButton: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{top:var(--agent-teams-panel-top);right:var(--agent-teams-panel-right);z-index:2147483000;width:min(var(--agent-teams-panel-width), calc(100vw - 24px));min-height:min(var(--agent-teams-panel-min-height), calc(100dvh - var(--agent-teams-panel-top) - var(--agent-teams-panel-bottom-gap)));max-height:calc(100dvh - var(--agent-teams-panel-top) - var(--agent-teams-panel-bottom-gap));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);border-radius:16px;flex-direction:column;animation:.18s ease-out aYQbCq_agentTeamsPanelIn;display:flex;position:fixed;overflow:hidden}@keyframes aYQbCq_agentTeamsPanelIn{0%{opacity:0;transform:translateY(-6px)scale(.99)}to{opacity:1;transform:translateY(0)scale(1)}}@keyframes aYQbCq_agentTeamsPulse{0%,to{opacity:.42}50%{opacity:1}}.aYQbCq_panelHead{border-bottom:1px solid var(--dsw-alias-line-normal);flex:none;justify-content:space-between;align-items:center;min-height:44px;padding:0 14px 0 16px;display:flex}.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_closeButton{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_closeButton:hover{background:var(--dsw-alias-bg-fill-neutral);color:var(--dsw-alias-label-primary)}.aYQbCq_closeButton:active{transform:scale(.94)}.aYQbCq_teams{overscroll-behavior:contain;scrollbar-width:none;flex-direction:column;min-height:0;display:flex;overflow-y:auto}.aYQbCq_teams::-webkit-scrollbar{display:none}.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:38px minmax(0,1fr) auto;align-items:center;gap:9px;min-height:48px;padding:8px 10px;display:grid}.aYQbCq_captainAvatar,.aYQbCq_memberAvatar{flex:none;justify-content:center;align-items:center;display:inline-flex;position:relative}.aYQbCq_captainAvatar{width:36px;height:36px}.aYQbCq_leadAvatar,.aYQbCq_memberArt,.aYQbCq_memberInitial{box-sizing:border-box;border:1px solid var(--dsw-alias-line-strong);object-fit:cover;background:#0b1d33;border-radius:50%;width:34px;height:34px}.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:23px;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:44px;color:inherit;font:inherit;text-align:left;cursor:pointer;background:0 0;border:0;border-radius:8px;grid-template-columns:38px 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:34px;height:34px}.aYQbCq_memberAvatar[data-unread=true]:after{border:1px solid var(--dsw-alias-state-business-primary);content:\"\";border-radius:50%;animation:1.5s ease-out infinite aYQbCq_agentTeamsRing;position:absolute;inset:-3px}@keyframes aYQbCq_agentTeamsRing{0%{opacity:.82;transform:scale(.94)}75%,to{opacity:0;transform:scale(1.18)}}.aYQbCq_memberInitial{color:var(--dsw-alias-label-on-fill);justify-content:center;align-items:center;font-size:14px;font-weight:600;line-height:20px;display:inline-flex}.aYQbCq_stateArt{box-sizing:border-box;border:2px solid var(--dsw-alias-bg-module);object-fit:cover;background:#0b1d33;border-radius:50%;width:19px;height:19px;position:absolute;bottom:-4px;right:-4px}.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 52px;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){[data-phase=active],.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{--agent-teams-main-shift:0px}html[data-agent-teams-panel-open] [data-phase=active]{padding-right:0}}@media (width<=640px){html{--agent-teams-panel-right:calc(10px + var(--dsh-sidebar-width,0px));--agent-teams-panel-top:56px;--agent-teams-panel-bottom-gap:56px}.aYQbCq_panel{width:auto;left:10px}.aYQbCq_teamStats span[data-stat=messages]{display:none}.aYQbCq_captainNode{grid-template-columns:38px minmax(0,1fr)}.aYQbCq_captainState{display:none}.aYQbCq_delegationTree{margin-left:12px;padding-left:15px}.aYQbCq_memberBranch{width:15px}.aYQbCq_assignmentLine{padding-left:45px}}";
265
329
  const tagId = "@nanmicoder/dsh-agent-teams/ActivityPanel.module.css";
266
330
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId) + "]") === null) {
267
331
  const tag = document.createElement("style");
@@ -272,6 +336,7 @@ window.__ModuleLoader__.load({
272
336
  }
273
337
  var ActivityPanel_module_css_default = {
274
338
  "agentTeamsBreathe": "aYQbCq_agentTeamsBreathe",
339
+ "agentTeamsDot": "aYQbCq_agentTeamsDot",
275
340
  "agentTeamsFloat": "aYQbCq_agentTeamsFloat",
276
341
  "agentTeamsPanelIn": "aYQbCq_agentTeamsPanelIn",
277
342
  "agentTeamsPulse": "aYQbCq_agentTeamsPulse",
@@ -293,16 +358,21 @@ window.__ModuleLoader__.load({
293
358
  "captainRole": "aYQbCq_captainRole",
294
359
  "captainState": "aYQbCq_captainState",
295
360
  "captainSummary": "aYQbCq_captainSummary",
361
+ "chevron": "aYQbCq_chevron",
296
362
  "closeButton": "aYQbCq_closeButton",
363
+ "dagCanvas": "aYQbCq_dagCanvas",
364
+ "dagEdges": "aYQbCq_dagEdges",
365
+ "dagNode": "aYQbCq_dagNode",
366
+ "dagNodeDot": "aYQbCq_dagNodeDot",
367
+ "dagNodeHead": "aYQbCq_dagNodeHead",
368
+ "dagNodeLabel": "aYQbCq_dagNodeLabel",
369
+ "dagRunningState": "aYQbCq_dagRunningState",
370
+ "dagViewport": "aYQbCq_dagViewport",
297
371
  "delegationSection": "aYQbCq_delegationSection",
298
372
  "delegationTree": "aYQbCq_delegationTree",
299
373
  "dependencySection": "aYQbCq_dependencySection",
300
374
  "emptyHint": "aYQbCq_emptyHint",
301
375
  "historicPill": "aYQbCq_historicPill",
302
- "inbox": "aYQbCq_inbox",
303
- "inboxContent": "aYQbCq_inboxContent",
304
- "inboxRoute": "aYQbCq_inboxRoute",
305
- "inboxRow": "aYQbCq_inboxRow",
306
376
  "leadAvatar": "aYQbCq_leadAvatar",
307
377
  "memberArt": "aYQbCq_memberArt",
308
378
  "memberAvatar": "aYQbCq_memberAvatar",
@@ -318,39 +388,40 @@ window.__ModuleLoader__.load({
318
388
  "memberState": "aYQbCq_memberState",
319
389
  "memberStatusLine": "aYQbCq_memberStatusLine",
320
390
  "members": "aYQbCq_members",
391
+ "membersToggle": "aYQbCq_membersToggle",
321
392
  "panel": "aYQbCq_panel",
322
393
  "panelDot": "aYQbCq_panelDot",
323
394
  "panelHead": "aYQbCq_panelHead",
324
395
  "panelTitle": "aYQbCq_panelTitle",
396
+ "progressEmpty": "aYQbCq_progressEmpty",
397
+ "progressLegend": "aYQbCq_progressLegend",
398
+ "progressOverview": "aYQbCq_progressOverview",
399
+ "progressSegments": "aYQbCq_progressSegments",
400
+ "progressSummary": "aYQbCq_progressSummary",
401
+ "progressSummaryDot": "aYQbCq_progressSummaryDot",
402
+ "progressTitle": "aYQbCq_progressTitle",
325
403
  "sectionHead": "aYQbCq_sectionHead",
326
404
  "sectionHint": "aYQbCq_sectionHint",
327
405
  "sectionTitle": "aYQbCq_sectionTitle",
328
- "stageColumn": "aYQbCq_stageColumn",
329
- "stageConnector": "aYQbCq_stageConnector",
330
- "stageFlow": "aYQbCq_stageFlow",
331
- "stageGroup": "aYQbCq_stageGroup",
406
+ "sectionToggleTitle": "aYQbCq_sectionToggleTitle",
332
407
  "stageLabel": "aYQbCq_stageLabel",
333
- "stageLine": "aYQbCq_stageLine",
334
- "stageTasks": "aYQbCq_stageTasks",
335
408
  "stateArt": "aYQbCq_stateArt",
336
- "taskBadge": "aYQbCq_taskBadge",
337
- "taskDeps": "aYQbCq_taskDeps",
409
+ "taskDetail": "aYQbCq_taskDetail",
410
+ "taskDetailBadge": "aYQbCq_taskDetailBadge",
411
+ "taskDetailHead": "aYQbCq_taskDetailHead",
412
+ "taskDetailId": "aYQbCq_taskDetailId",
413
+ "taskDetailLine": "aYQbCq_taskDetailLine",
414
+ "taskDetailMeta": "aYQbCq_taskDetailMeta",
415
+ "taskDetailSubject": "aYQbCq_taskDetailSubject",
338
416
  "taskEmpty": "aYQbCq_taskEmpty",
339
417
  "taskId": "aYQbCq_taskId",
340
- "taskNode": "aYQbCq_taskNode",
341
- "taskNodeHead": "aYQbCq_taskNodeHead",
342
- "taskOwner": "aYQbCq_taskOwner",
343
- "taskRoute": "aYQbCq_taskRoute",
344
- "taskStart": "aYQbCq_taskStart",
345
- "taskSubject": "aYQbCq_taskSubject",
346
418
  "team": "aYQbCq_team",
347
419
  "teamHead": "aYQbCq_teamHead",
348
420
  "teamName": "aYQbCq_teamName",
349
421
  "teamStats": "aYQbCq_teamStats",
350
422
  "teams": "aYQbCq_teams",
351
- "unclaimed": "aYQbCq_unclaimed",
352
- "unclaimedTitle": "aYQbCq_unclaimedTitle",
353
- "unreadPill": "aYQbCq_unreadPill"
423
+ "unreadPill": "aYQbCq_unreadPill",
424
+ "workGlyph": "aYQbCq_workGlyph"
354
425
  };
355
426
  //#endregion
356
427
  //#region lib/client/ActivityPanel.js
@@ -422,6 +493,47 @@ window.__ModuleLoader__.load({
422
493
  if (status === "cancelled") return "cancelled";
423
494
  return state;
424
495
  }
496
+ function Chevron({ open }) {
497
+ return (0, react_jsx_runtime.jsx)("svg", {
498
+ className: ActivityPanel_module_css_default.chevron,
499
+ "data-open": open,
500
+ width: "9",
501
+ height: "9",
502
+ viewBox: "0 0 10 10",
503
+ fill: "none",
504
+ stroke: "currentColor",
505
+ strokeWidth: "1.5",
506
+ strokeLinecap: "round",
507
+ "aria-hidden": true,
508
+ children: (0, react_jsx_runtime.jsx)("path", { d: "M3.5 2l3 3-3 3" })
509
+ });
510
+ }
511
+ function WorkGlyph({ active }) {
512
+ return (0, react_jsx_runtime.jsx)("svg", {
513
+ className: ActivityPanel_module_css_default.workGlyph,
514
+ "data-active": active,
515
+ width: "11",
516
+ height: "11",
517
+ viewBox: "0 0 11 11",
518
+ fill: "currentColor",
519
+ "aria-hidden": true,
520
+ children: [
521
+ [0, 0],
522
+ [4.2, 0],
523
+ [8.4, 0],
524
+ [0, 4.2],
525
+ [4.2, 4.2],
526
+ [8.4, 4.2]
527
+ ].map(([x, y], index) => (0, react_jsx_runtime.jsx)("rect", {
528
+ x,
529
+ y,
530
+ width: "2.6",
531
+ height: "2.6",
532
+ rx: ".6",
533
+ style: { animationDelay: `${index * .15}s` }
534
+ }, `${x}:${y}`))
535
+ });
536
+ }
425
537
  /** Collapsed badge: an always-visible corner pill while any team exists. */
426
538
  function CollapsedBadge({ count, busy, onClick }) {
427
539
  return (0, react_jsx_runtime.jsxs)("button", {
@@ -440,19 +552,13 @@ window.__ModuleLoader__.load({
440
552
  })]
441
553
  });
442
554
  }
443
- function memberDotState(member, tasks) {
444
- const owned = tasks.filter((task) => task.assignee === member.name);
445
- if (member.activity === "working") return "ongoing";
446
- if (owned.some((task) => task.status === "failed")) return "error";
447
- if (owned.length > 0 && owned.every((task) => task.status === "completed")) return "done";
448
- return "warning";
449
- }
450
- function memberStateLabel(member, tasks) {
555
+ function memberStateLabel(member, tasks, historic) {
451
556
  const owned = tasks.filter((task) => task.assignee === member.name);
452
557
  if (member.activity === "working") return "工作中";
453
558
  if (owned.some((task) => task.status === "failed")) return "有失败";
454
559
  if (owned.some((task) => task.state === "blocked")) return "等待";
455
560
  if (owned.length > 0 && owned.every((task) => task.status === "completed")) return "已交付";
561
+ if (member.status === "removed") return historic ? "已离队" : "已移除";
456
562
  if (owned.length > 0) return "待执行";
457
563
  return "待派工";
458
564
  }
@@ -471,76 +577,95 @@ window.__ModuleLoader__.load({
471
577
  if (member.done === member.total) return "任务已交付";
472
578
  return member.activity === "idle" ? "待继续执行" : "状态未知";
473
579
  }
474
- function dependencyLabel(task, tasks) {
475
- return task.dependencies.map((id) => {
476
- const dependency = tasks.find((candidate) => candidate.id === id);
477
- return dependency?.assignee ? `${id}·${dependency.assignee}` : id;
478
- }).join("、");
580
+ function compactTaskLabel(subject) {
581
+ const withoutVerb = subject.replace(/^开发\s*/u, "").replace(/^\d+[-_.、\s]*/u, "");
582
+ const head = withoutVerb.split(/[((·::]/u)[0]?.trim() ?? withoutVerb;
583
+ return head.length > 18 ? `${head.slice(0, 17)}…` : head;
479
584
  }
480
- function TaskNode({ task, tasks, focused, dimmed, pinned, onPin, onPreview }) {
481
- const tone = taskTone(task.state, task.status);
482
- return (0, react_jsx_runtime.jsxs)("button", {
483
- type: "button",
484
- className: ActivityPanel_module_css_default.taskNode,
485
- "data-task-id": task.id,
486
- "data-state": tone,
487
- "data-focused": focused,
488
- "data-dimmed": dimmed,
489
- "aria-pressed": pinned,
490
- title: `${task.id} · ${task.subject}(点击固定依赖链)`,
491
- onClick: () => {
492
- onPin(task.id);
493
- },
494
- onMouseEnter: () => {
495
- onPreview(task.id);
496
- },
497
- onMouseLeave: () => {
498
- onPreview(null);
499
- },
500
- onFocus: () => {
501
- onPreview(task.id);
502
- },
503
- onBlur: () => {
504
- onPreview(null);
505
- },
585
+ function taskSummary(team) {
586
+ const completed = team.tasks.filter((task) => task.status === "completed");
587
+ const running = team.tasks.filter((task) => task.state === "running");
588
+ const blocked = team.tasks.filter((task) => task.state === "blocked");
589
+ const ready = team.tasks.filter((task) => task.state === "open" && task.status !== "completed");
590
+ if (team.tasks.length === 0) return "等待队长拆解任务";
591
+ if (completed.length === team.tasks.length) return `全部 ${completed.length} 项任务已交付`;
592
+ if (blocked.length > 0 && running.length > 0) return `${blocked.slice(0, 3).map((task) => task.id).join("")}${blocked.length > 3 ? ` 等 ${blocked.length} 项` : ""} 等待前置,其余已开工`;
593
+ if (running.length > 0) return `${running.map((task) => task.id).join("")} 正在执行`;
594
+ if (ready.length > 0) return `${ready.map((task) => task.id).join("")} 已就绪待开工`;
595
+ if (blocked.length > 0) return `${blocked.map((task) => task.id).join("、")} 等待前置`;
596
+ return "等待下一轮调度";
597
+ }
598
+ function ProgressOverview({ team }) {
599
+ const running = team.tasks.filter((task) => task.state === "running").length;
600
+ const blocked = team.tasks.filter((task) => task.state === "blocked").length;
601
+ const completed = team.tasks.filter((task) => task.status === "completed").length;
602
+ const summaryTone = blocked > 0 ? "warning" : completed === team.tasks.length && team.tasks.length > 0 ? "completed" : "running";
603
+ return (0, react_jsx_runtime.jsxs)("section", {
604
+ className: ActivityPanel_module_css_default.progressOverview,
605
+ "aria-label": "团队总进度",
606
+ "data-progress-summary": true,
506
607
  children: [
507
- (0, react_jsx_runtime.jsxs)("span", {
508
- className: ActivityPanel_module_css_default.taskNodeHead,
509
- children: [(0, react_jsx_runtime.jsx)("span", {
510
- className: ActivityPanel_module_css_default.taskId,
511
- children: task.id
512
- }), (0, react_jsx_runtime.jsx)("span", {
513
- className: ActivityPanel_module_css_default.taskBadge,
514
- "data-state": tone,
515
- children: taskStatusLabel(task.status)
516
- })]
517
- }),
518
608
  (0, react_jsx_runtime.jsx)("span", {
519
- className: ActivityPanel_module_css_default.taskSubject,
520
- children: task.subject
609
+ className: ActivityPanel_module_css_default.progressTitle,
610
+ children: "总进度"
521
611
  }),
612
+ team.tasks.length > 0 ? (0, react_jsx_runtime.jsx)("span", {
613
+ className: ActivityPanel_module_css_default.progressSegments,
614
+ "aria-hidden": true,
615
+ children: team.tasks.map((task) => (0, react_jsx_runtime.jsx)("span", { "data-state": taskTone(task.state, task.status) }, task.id))
616
+ }) : (0, react_jsx_runtime.jsx)("span", { className: ActivityPanel_module_css_default.progressEmpty }),
522
617
  (0, react_jsx_runtime.jsxs)("span", {
523
- className: ActivityPanel_module_css_default.taskRoute,
524
- children: [(0, react_jsx_runtime.jsx)("span", {
525
- className: ActivityPanel_module_css_default.taskOwner,
526
- children: task.assignee || "待认领"
527
- }), task.dependencies.length === 0 ? (0, react_jsx_runtime.jsx)("span", {
528
- className: ActivityPanel_module_css_default.taskStart,
529
- children: "起点"
530
- }) : (0, react_jsx_runtime.jsxs)("span", {
531
- className: ActivityPanel_module_css_default.taskDeps,
532
- children: ["依赖 ", dependencyLabel(task, tasks)]
533
- })]
618
+ className: ActivityPanel_module_css_default.progressLegend,
619
+ children: [
620
+ (0, react_jsx_runtime.jsxs)("span", {
621
+ "data-state": "running",
622
+ children: ["■ 进行中 ", running]
623
+ }),
624
+ (0, react_jsx_runtime.jsxs)("span", {
625
+ "data-state": "blocked",
626
+ children: ["■ 等待依赖 ", blocked]
627
+ }),
628
+ (0, react_jsx_runtime.jsxs)("span", {
629
+ "data-state": "completed",
630
+ children: ["■ 已交付 ", completed]
631
+ })
632
+ ]
633
+ }),
634
+ (0, react_jsx_runtime.jsxs)("span", {
635
+ className: ActivityPanel_module_css_default.progressSummary,
636
+ "data-state": summaryTone,
637
+ children: [(0, react_jsx_runtime.jsx)("span", { className: ActivityPanel_module_css_default.progressSummaryDot }), (0, react_jsx_runtime.jsx)("span", { children: taskSummary(team) })]
534
638
  })
535
639
  ]
536
640
  });
537
641
  }
538
642
  function DependencyMap({ tasks }) {
539
- const [previewTaskId, setPreviewTaskId] = (0, react.useState)(null);
643
+ const [open, setOpen] = (0, react.useState)(true);
644
+ const [hoverTaskId, setHoverTaskId] = (0, react.useState)(null);
645
+ const [keyboardTaskId, setKeyboardTaskId] = (0, react.useState)(null);
540
646
  const [pinnedTaskId, setPinnedTaskId] = (0, react.useState)(null);
541
- const focusedTaskId = pinnedTaskId ?? previewTaskId;
542
- const stages = (0, react.useMemo)(() => taskStages(tasks), [tasks]);
647
+ const hoverTimer = (0, react.useRef)(null);
648
+ const focusedTaskId = dependencyFocusTaskId(pinnedTaskId, keyboardTaskId, hoverTaskId);
649
+ const layout = (0, react.useMemo)(() => compactDagLayout(tasks), [tasks]);
650
+ const parallel = (0, react.useMemo)(() => usesParallelTaskGrid(tasks), [tasks]);
543
651
  const related = (0, react.useMemo)(() => focusedTaskId === null ? null : relatedTaskIds(focusedTaskId, tasks), [focusedTaskId, tasks]);
652
+ const scheduleHover = (id) => {
653
+ if (hoverTimer.current !== null) {
654
+ clearTimeout(hoverTimer.current);
655
+ hoverTimer.current = null;
656
+ }
657
+ if (id === null) {
658
+ setHoverTaskId(null);
659
+ return;
660
+ }
661
+ hoverTimer.current = setTimeout(() => {
662
+ hoverTimer.current = null;
663
+ setHoverTaskId(id);
664
+ }, 180);
665
+ };
666
+ (0, react.useEffect)(() => () => {
667
+ if (hoverTimer.current !== null) clearTimeout(hoverTimer.current);
668
+ }, []);
544
669
  (0, react.useEffect)(() => {
545
670
  const onKeyDown = (event) => {
546
671
  if (event.key === "Escape") setPinnedTaskId(null);
@@ -551,62 +676,147 @@ window.__ModuleLoader__.load({
551
676
  };
552
677
  }, []);
553
678
  if (tasks.length === 0) return null;
679
+ const fallbackTask = tasks.find((task) => task.state === "blocked") ?? tasks.find((task) => task.state === "running") ?? tasks[0];
680
+ const detailTask = tasks.find((task) => task.id === focusedTaskId) ?? fallbackTask;
681
+ const waitingOn = detailTask.dependencies.filter((dependency) => tasks.find((task) => task.id === dependency)?.status !== "completed");
682
+ const dependents = tasks.filter((task) => task.dependencies.includes(detailTask.id));
554
683
  return (0, react_jsx_runtime.jsxs)("section", {
555
684
  className: ActivityPanel_module_css_default.dependencySection,
556
685
  "aria-label": "任务依赖链",
557
686
  "data-dependency-map": true,
558
687
  children: [(0, react_jsx_runtime.jsxs)("header", {
559
688
  className: ActivityPanel_module_css_default.sectionHead,
560
- children: [(0, react_jsx_runtime.jsxs)("span", {
561
- className: ActivityPanel_module_css_default.sectionTitle,
562
- children: [(0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconBranchOutline16, {}), " 任务依赖"]
689
+ children: [(0, react_jsx_runtime.jsxs)("button", {
690
+ type: "button",
691
+ className: ActivityPanel_module_css_default.sectionToggleTitle,
692
+ onClick: () => {
693
+ setOpen((current) => !current);
694
+ },
695
+ "aria-expanded": open,
696
+ children: [
697
+ (0, react_jsx_runtime.jsx)(Chevron, { open }),
698
+ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconBranchOutline16, {}),
699
+ " ",
700
+ parallel ? "并行任务" : "任务依赖"
701
+ ]
563
702
  }), (0, react_jsx_runtime.jsx)("span", {
564
703
  className: ActivityPanel_module_css_default.sectionHint,
565
- children: pinnedTaskId === null ? "悬停预览 · 点击固定" : `${pinnedTaskId} 已固定 · Esc 取消`
704
+ children: pinnedTaskId === null ? parallel ? "无前后依赖 · 点击查看详情" : "悬停高亮依赖链 · 点击固定" : `${pinnedTaskId} 已固定 · Esc 取消`
566
705
  })]
567
- }), (0, react_jsx_runtime.jsx)("div", {
568
- className: ActivityPanel_module_css_default.stageFlow,
569
- children: stages.map((stage, index) => (0, react_jsx_runtime.jsxs)("div", {
570
- className: ActivityPanel_module_css_default.stageGroup,
571
- "data-depth": stage.depth,
572
- children: [index > 0 && (0, react_jsx_runtime.jsxs)("span", {
573
- className: ActivityPanel_module_css_default.stageConnector,
706
+ }), open && (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [(0, react_jsx_runtime.jsx)("div", {
707
+ className: ActivityPanel_module_css_default.dagViewport,
708
+ children: (0, react_jsx_runtime.jsxs)("div", {
709
+ className: ActivityPanel_module_css_default.dagCanvas,
710
+ "data-layout": parallel ? "parallel" : "dependency",
711
+ style: parallel ? void 0 : {
712
+ width: layout.width,
713
+ height: layout.height
714
+ },
715
+ children: [!parallel && (0, react_jsx_runtime.jsx)("svg", {
716
+ className: ActivityPanel_module_css_default.dagEdges,
717
+ width: layout.width,
718
+ height: layout.height,
574
719
  "aria-hidden": true,
575
- children: [(0, react_jsx_runtime.jsx)("span", { className: ActivityPanel_module_css_default.stageLine }), (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconChevronRightOutline14, {})]
576
- }), (0, react_jsx_runtime.jsxs)("div", {
577
- className: ActivityPanel_module_css_default.stageColumn,
578
- children: [(0, react_jsx_runtime.jsxs)("span", {
579
- className: ActivityPanel_module_css_default.stageLabel,
580
- children: [stage.depth === 0 ? "起点" : `依赖层 ${stage.depth}`, (0, react_jsx_runtime.jsx)("span", { children: stage.tasks.length })]
581
- }), (0, react_jsx_runtime.jsx)("div", {
582
- className: ActivityPanel_module_css_default.stageTasks,
583
- children: stage.tasks.map((task) => (0, react_jsx_runtime.jsx)(TaskNode, {
584
- task,
585
- tasks,
586
- focused: related?.has(task.id) ?? false,
587
- dimmed: related !== null && !related.has(task.id),
588
- pinned: pinnedTaskId === task.id,
589
- onPin: (id) => {
590
- setPinnedTaskId((current) => current === id ? null : id);
591
- },
592
- onPreview: setPreviewTaskId
593
- }, task.id))
594
- })]
595
- })]
596
- }, stage.depth))
597
- })]
720
+ children: layout.edges.map((edge) => {
721
+ const active = related !== null && related.has(edge.from) && related.has(edge.to);
722
+ return (0, react_jsx_runtime.jsx)("path", {
723
+ d: edge.path,
724
+ "data-active": active,
725
+ "data-dimmed": related !== null && !active
726
+ }, `${edge.from}:${edge.to}`);
727
+ })
728
+ }), layout.nodes.map(({ task, x, y }) => (0, react_jsx_runtime.jsxs)("button", {
729
+ type: "button",
730
+ className: ActivityPanel_module_css_default.dagNode,
731
+ style: parallel ? { height: 30 } : {
732
+ left: x,
733
+ top: y,
734
+ width: 92,
735
+ height: 30
736
+ },
737
+ "data-task-id": task.id,
738
+ "data-state": taskTone(task.state, task.status),
739
+ "data-focused": related?.has(task.id) ?? false,
740
+ "data-dimmed": related !== null && !related.has(task.id),
741
+ "aria-pressed": pinnedTaskId === task.id,
742
+ title: `${task.id} · ${task.subject}`,
743
+ onClick: () => {
744
+ setPinnedTaskId((current) => current === task.id ? null : task.id);
745
+ },
746
+ onMouseEnter: () => {
747
+ scheduleHover(task.id);
748
+ },
749
+ onMouseLeave: () => {
750
+ scheduleHover(null);
751
+ },
752
+ onFocus: () => {
753
+ setKeyboardTaskId(task.id);
754
+ },
755
+ onBlur: () => {
756
+ setKeyboardTaskId(null);
757
+ },
758
+ children: [
759
+ (0, react_jsx_runtime.jsxs)("span", {
760
+ className: ActivityPanel_module_css_default.dagNodeHead,
761
+ children: [(0, react_jsx_runtime.jsx)("span", { className: ActivityPanel_module_css_default.dagNodeDot }), task.id]
762
+ }),
763
+ (0, react_jsx_runtime.jsx)("span", {
764
+ className: ActivityPanel_module_css_default.dagNodeLabel,
765
+ children: compactTaskLabel(task.subject)
766
+ }),
767
+ task.state === "running" && (0, react_jsx_runtime.jsx)("span", {
768
+ className: ActivityPanel_module_css_default.dagRunningState,
769
+ "aria-label": "运行中",
770
+ children: (0, react_jsx_runtime.jsx)(WorkGlyph, { active: true })
771
+ })
772
+ ]
773
+ }, task.id))]
774
+ })
775
+ }), (0, react_jsx_runtime.jsxs)("section", {
776
+ className: ActivityPanel_module_css_default.taskDetail,
777
+ "data-task-detail": detailTask.id,
778
+ children: [
779
+ (0, react_jsx_runtime.jsxs)("span", {
780
+ className: ActivityPanel_module_css_default.taskDetailHead,
781
+ children: [
782
+ (0, react_jsx_runtime.jsx)("span", {
783
+ className: ActivityPanel_module_css_default.taskDetailId,
784
+ children: detailTask.id
785
+ }),
786
+ (0, react_jsx_runtime.jsx)("span", {
787
+ className: ActivityPanel_module_css_default.taskDetailSubject,
788
+ title: detailTask.subject,
789
+ children: detailTask.subject.replace(/^开发\s*/u, "")
790
+ }),
791
+ (0, react_jsx_runtime.jsx)("span", {
792
+ className: ActivityPanel_module_css_default.taskDetailBadge,
793
+ "data-state": taskTone(detailTask.state, detailTask.status),
794
+ children: taskStatusLabel(detailTask.status)
795
+ })
796
+ ]
797
+ }),
798
+ (0, react_jsx_runtime.jsxs)("span", {
799
+ className: ActivityPanel_module_css_default.taskDetailLine,
800
+ children: [
801
+ detailTask.assignee || "待认领",
802
+ " · ",
803
+ detailTask.status === "completed" ? "已完成并交付" : detailTask.dependencies.length === 0 ? "无前置,可立即开工" : waitingOn.length === 0 ? "前置已就绪,可开工" : `等待 ${waitingOn.join("、")}`
804
+ ]
805
+ }),
806
+ (0, react_jsx_runtime.jsx)("span", {
807
+ className: ActivityPanel_module_css_default.taskDetailMeta,
808
+ children: dependents.length === 0 ? "无下游任务" : `完成后解锁 ${dependents.map((task) => task.id).join("、")}`
809
+ })
810
+ ]
811
+ })] })]
598
812
  });
599
813
  }
600
814
  function TeamSection({ team, onNavigate, historic = false }) {
815
+ const [membersOpen, setMembersOpen] = (0, react.useState)(true);
601
816
  const busyCount = team.members.filter((member) => member.activity === "working").length;
602
817
  const assignedCount = team.tasks.filter((task) => task.assignee !== "").length;
603
818
  const completedCount = team.tasks.filter((task) => task.status === "completed").length;
604
819
  const allCompleted = team.tasks.length > 0 && completedCount === team.tasks.length;
605
- const unclaimed = team.tasks.filter((task) => {
606
- if (task.status === "completed" || task.status === "failed" || task.status === "cancelled") return false;
607
- if (task.assignee === "") return true;
608
- return !team.members.some((member) => member.name === task.assignee);
609
- });
610
820
  return (0, react_jsx_runtime.jsxs)("section", {
611
821
  className: ActivityPanel_module_css_default.team,
612
822
  "data-team-id": team.teamId,
@@ -651,132 +861,147 @@ window.__ModuleLoader__.load({
651
861
  className: ActivityPanel_module_css_default.delegationSection,
652
862
  "aria-label": "队长派工关系",
653
863
  "data-delegation-map": true,
654
- children: [(0, react_jsx_runtime.jsxs)("div", {
655
- className: ActivityPanel_module_css_default.captainNode,
656
- children: [
657
- (0, react_jsx_runtime.jsx)("span", {
658
- className: ActivityPanel_module_css_default.captainAvatar,
659
- children: (0, react_jsx_runtime.jsx)("img", {
660
- className: ActivityPanel_module_css_default.leadAvatar,
661
- src: LEAD_ART,
662
- alt: "",
663
- "aria-hidden": true
664
- })
665
- }),
666
- (0, react_jsx_runtime.jsxs)("span", {
667
- className: ActivityPanel_module_css_default.captainInfo,
668
- children: [(0, react_jsx_runtime.jsxs)("span", {
669
- className: ActivityPanel_module_css_default.captainLine,
670
- children: [(0, react_jsx_runtime.jsx)("span", {
671
- className: ActivityPanel_module_css_default.captainName,
672
- children: "队长"
673
- }), (0, react_jsx_runtime.jsx)("span", {
674
- className: ActivityPanel_module_css_default.captainRole,
675
- children: "拆解 · 派发 · 汇总"
864
+ children: [
865
+ (0, react_jsx_runtime.jsxs)("div", {
866
+ className: ActivityPanel_module_css_default.captainNode,
867
+ children: [
868
+ (0, react_jsx_runtime.jsx)("span", {
869
+ className: ActivityPanel_module_css_default.captainAvatar,
870
+ children: (0, react_jsx_runtime.jsx)("img", {
871
+ className: ActivityPanel_module_css_default.leadAvatar,
872
+ src: LEAD_ART,
873
+ alt: "",
874
+ "aria-hidden": true
875
+ })
876
+ }),
877
+ (0, react_jsx_runtime.jsxs)("span", {
878
+ className: ActivityPanel_module_css_default.captainInfo,
879
+ children: [(0, react_jsx_runtime.jsxs)("span", {
880
+ className: ActivityPanel_module_css_default.captainLine,
881
+ children: [(0, react_jsx_runtime.jsx)("span", {
882
+ className: ActivityPanel_module_css_default.captainName,
883
+ children: "队长"
884
+ }), (0, react_jsx_runtime.jsx)("span", {
885
+ className: ActivityPanel_module_css_default.captainRole,
886
+ children: "拆解 · 派发 · 汇总"
887
+ })]
888
+ }), (0, react_jsx_runtime.jsxs)("span", {
889
+ className: ActivityPanel_module_css_default.captainSummary,
890
+ children: [
891
+ "已派发 ",
892
+ assignedCount,
893
+ " 项任务给 ",
894
+ team.members.length,
895
+ " 名成员"
896
+ ]
676
897
  })]
677
- }), (0, react_jsx_runtime.jsxs)("span", {
678
- className: ActivityPanel_module_css_default.captainSummary,
898
+ }),
899
+ (0, react_jsx_runtime.jsxs)("span", {
900
+ className: ActivityPanel_module_css_default.captainState,
901
+ "data-busy": busyCount > 0,
902
+ children: [(0, react_jsx_runtime.jsx)(WorkGlyph, { active: busyCount > 0 }), busyCount > 0 ? `${busyCount} 人执行中` : allCompleted ? "已收齐" : "等待回报"]
903
+ })
904
+ ]
905
+ }),
906
+ (0, react_jsx_runtime.jsx)(ProgressOverview, { team }),
907
+ (0, react_jsx_runtime.jsxs)("button", {
908
+ type: "button",
909
+ className: ActivityPanel_module_css_default.membersToggle,
910
+ onClick: () => {
911
+ setMembersOpen((current) => !current);
912
+ },
913
+ "aria-expanded": membersOpen,
914
+ "data-members-toggle": true,
915
+ children: [(0, react_jsx_runtime.jsxs)("span", { children: [
916
+ (0, react_jsx_runtime.jsx)(Chevron, { open: membersOpen }),
917
+ "成员 ",
918
+ team.members.length
919
+ ] }), (0, react_jsx_runtime.jsx)("span", { children: membersOpen ? "收起" : "展开" })]
920
+ }),
921
+ membersOpen && (0, react_jsx_runtime.jsxs)("div", {
922
+ className: ActivityPanel_module_css_default.delegationTree,
923
+ children: [team.members.length === 0 && (0, react_jsx_runtime.jsx)("span", {
924
+ className: ActivityPanel_module_css_default.emptyHint,
925
+ children: "暂无成员,等待队长组建团队"
926
+ }), team.members.map((member) => {
927
+ const owned = team.tasks.filter((task) => task.assignee === member.name);
928
+ return (0, react_jsx_runtime.jsxs)("div", {
929
+ className: ActivityPanel_module_css_default.memberBlock,
930
+ "data-activity": member.activity,
679
931
  children: [
680
- "已派发 ",
681
- assignedCount,
682
- " 项任务给 ",
683
- team.members.length,
684
- " 名成员"
685
- ]
686
- })]
687
- }),
688
- (0, react_jsx_runtime.jsxs)("span", {
689
- className: ActivityPanel_module_css_default.captainState,
690
- "data-busy": busyCount > 0,
691
- children: [(0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.StateDot, { state: busyCount > 0 ? "ongoing" : allCompleted ? "done" : "warning" }), busyCount > 0 ? `${busyCount} 人执行中` : allCompleted ? "已收齐" : "等待回报"]
692
- })
693
- ]
694
- }), (0, react_jsx_runtime.jsxs)("div", {
695
- className: ActivityPanel_module_css_default.delegationTree,
696
- children: [team.members.length === 0 && (0, react_jsx_runtime.jsx)("span", {
697
- className: ActivityPanel_module_css_default.emptyHint,
698
- children: "暂无成员,等待队长组建团队"
699
- }), team.members.map((member) => {
700
- const owned = team.tasks.filter((task) => task.assignee === member.name);
701
- return (0, react_jsx_runtime.jsxs)("div", {
702
- className: ActivityPanel_module_css_default.memberBlock,
703
- "data-activity": member.activity,
704
- children: [
705
- (0, react_jsx_runtime.jsx)("span", {
706
- className: ActivityPanel_module_css_default.memberBranch,
707
- "aria-hidden": true,
708
- children: (0, react_jsx_runtime.jsx)("span", {})
709
- }),
710
- (0, react_jsx_runtime.jsxs)("button", {
711
- type: "button",
712
- className: ActivityPanel_module_css_default.memberRow,
713
- "data-activity": member.activity,
714
- onClick: () => {
715
- if (member.id !== "") onNavigate(member.id);
716
- },
717
- children: [
718
- (0, react_jsx_runtime.jsxs)("span", {
719
- className: ActivityPanel_module_css_default.memberAvatar,
720
- "data-unread": member.unread > 0,
721
- children: [memberArtUrl(member.name, member.role) !== null ? (0, react_jsx_runtime.jsx)("img", {
722
- className: ActivityPanel_module_css_default.memberArt,
723
- src: memberArtUrl(member.name, member.role) ?? "",
724
- alt: "",
725
- "aria-hidden": true
726
- }) : (0, react_jsx_runtime.jsx)("span", {
727
- className: ActivityPanel_module_css_default.memberInitial,
728
- style: { background: accentOf(member.id) },
729
- children: memberInitial(member.name)
730
- }), (0, react_jsx_runtime.jsx)("img", {
731
- className: ActivityPanel_module_css_default.stateArt,
732
- "data-activity": member.activity,
733
- src: ACTION_ART[member.activity],
734
- alt: "",
735
- "aria-hidden": true
736
- })]
737
- }),
738
- (0, react_jsx_runtime.jsxs)("span", {
739
- className: ActivityPanel_module_css_default.memberInfo,
740
- children: [(0, react_jsx_runtime.jsxs)("span", {
741
- className: ActivityPanel_module_css_default.memberLine,
932
+ (0, react_jsx_runtime.jsx)("span", {
933
+ className: ActivityPanel_module_css_default.memberBranch,
934
+ "aria-hidden": true,
935
+ children: (0, react_jsx_runtime.jsx)("span", {})
936
+ }),
937
+ (0, react_jsx_runtime.jsxs)("button", {
938
+ type: "button",
939
+ className: ActivityPanel_module_css_default.memberRow,
940
+ "data-activity": member.activity,
941
+ onClick: () => {
942
+ if (member.id !== "") onNavigate(member.id);
943
+ },
944
+ children: [
945
+ (0, react_jsx_runtime.jsxs)("span", {
946
+ className: ActivityPanel_module_css_default.memberAvatar,
947
+ "data-unread": member.unread > 0,
948
+ children: [memberArtUrl(member.name, member.role) !== null ? (0, react_jsx_runtime.jsx)("img", {
949
+ className: ActivityPanel_module_css_default.memberArt,
950
+ src: memberArtUrl(member.name, member.role) ?? "",
951
+ alt: "",
952
+ "aria-hidden": true
953
+ }) : (0, react_jsx_runtime.jsx)("span", {
954
+ className: ActivityPanel_module_css_default.memberInitial,
955
+ style: { background: accentOf(member.id) },
956
+ children: memberInitial(member.name)
957
+ }), (0, react_jsx_runtime.jsx)("img", {
958
+ className: ActivityPanel_module_css_default.stateArt,
959
+ "data-activity": member.activity,
960
+ src: ACTION_ART[member.activity],
961
+ alt: "",
962
+ "aria-hidden": true
963
+ })]
964
+ }),
965
+ (0, react_jsx_runtime.jsxs)("span", {
966
+ className: ActivityPanel_module_css_default.memberInfo,
967
+ children: [(0, react_jsx_runtime.jsxs)("span", {
968
+ className: ActivityPanel_module_css_default.memberLine,
969
+ children: [
970
+ (0, react_jsx_runtime.jsx)("span", {
971
+ className: ActivityPanel_module_css_default.memberName,
972
+ children: member.name
973
+ }),
974
+ member.role !== "" && (0, react_jsx_runtime.jsx)("span", {
975
+ className: ActivityPanel_module_css_default.memberRole,
976
+ children: member.role
977
+ }),
978
+ (0, react_jsx_runtime.jsxs)("span", {
979
+ className: ActivityPanel_module_css_default.memberState,
980
+ "data-activity": member.activity,
981
+ children: [(0, react_jsx_runtime.jsx)(WorkGlyph, { active: member.activity === "working" }), memberStateLabel(member, team.tasks, historic)]
982
+ })
983
+ ]
984
+ }), (0, react_jsx_runtime.jsx)("span", {
985
+ className: ActivityPanel_module_css_default.memberStatusLine,
986
+ children: memberStatusText(member, team.tasks)
987
+ })]
988
+ }),
989
+ (0, react_jsx_runtime.jsxs)("span", {
990
+ className: ActivityPanel_module_css_default.memberCount,
742
991
  children: [
743
- (0, react_jsx_runtime.jsx)("span", {
744
- className: ActivityPanel_module_css_default.memberName,
745
- children: member.name
746
- }),
747
- member.role !== "" && (0, react_jsx_runtime.jsx)("span", {
748
- className: ActivityPanel_module_css_default.memberRole,
749
- children: member.role
750
- }),
751
- (0, react_jsx_runtime.jsxs)("span", {
752
- className: ActivityPanel_module_css_default.memberState,
753
- "data-activity": member.activity,
754
- children: [(0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.StateDot, { state: memberDotState(member, team.tasks) }), memberStateLabel(member, team.tasks)]
755
- })
992
+ member.done,
993
+ "/",
994
+ member.total
756
995
  ]
757
- }), (0, react_jsx_runtime.jsx)("span", {
758
- className: ActivityPanel_module_css_default.memberStatusLine,
759
- children: memberStatusText(member, team.tasks)
760
- })]
761
- }),
762
- (0, react_jsx_runtime.jsxs)("span", {
763
- className: ActivityPanel_module_css_default.memberCount,
764
- children: [
765
- member.done,
766
- "/",
767
- member.total
768
- ]
769
- })
770
- ]
771
- }),
772
- (0, react_jsx_runtime.jsxs)("div", {
773
- className: ActivityPanel_module_css_default.assignmentLine,
774
- children: [
775
- (0, react_jsx_runtime.jsx)("span", {
996
+ })
997
+ ]
998
+ }),
999
+ (0, react_jsx_runtime.jsxs)("div", {
1000
+ className: ActivityPanel_module_css_default.assignmentLine,
1001
+ children: [(0, react_jsx_runtime.jsx)("span", {
776
1002
  className: ActivityPanel_module_css_default.assignmentLabel,
777
1003
  children: "队长派发"
778
- }),
779
- (0, react_jsx_runtime.jsx)("span", {
1004
+ }), (0, react_jsx_runtime.jsx)("span", {
780
1005
  className: ActivityPanel_module_css_default.assignmentTasks,
781
1006
  children: owned.length === 0 ? (0, react_jsx_runtime.jsx)("span", {
782
1007
  className: ActivityPanel_module_css_default.taskEmpty,
@@ -787,70 +1012,41 @@ window.__ModuleLoader__.load({
787
1012
  title: task.subject,
788
1013
  children: task.id
789
1014
  }, task.id))
790
- }),
791
- member.unread > 0 && (0, react_jsx_runtime.jsxs)("span", {
792
- className: ActivityPanel_module_css_default.unreadPill,
793
- children: [member.unread, " 条消息"]
794
- })
795
- ]
796
- })
797
- ]
798
- }, member.id);
799
- })]
800
- })]
801
- }),
802
- (0, react_jsx_runtime.jsx)(DependencyMap, { tasks: team.tasks }),
803
- unclaimed.length > 0 && (0, react_jsx_runtime.jsxs)("section", {
804
- className: ActivityPanel_module_css_default.unclaimed,
805
- "aria-label": "待认领任务",
806
- children: [(0, react_jsx_runtime.jsx)("span", {
807
- className: ActivityPanel_module_css_default.unclaimedTitle,
808
- children: "待队长认领或改派"
809
- }), (0, react_jsx_runtime.jsx)("span", {
810
- className: ActivityPanel_module_css_default.assignmentTasks,
811
- children: unclaimed.map((task) => (0, react_jsx_runtime.jsxs)("span", {
812
- className: ActivityPanel_module_css_default.assignmentChip,
813
- "data-state": taskTone(task.state, task.status),
814
- title: task.subject,
815
- children: [
816
- task.id,
817
- " · ",
818
- task.assignee || "未分配"
819
- ]
820
- }, task.id))
821
- })]
1015
+ })]
1016
+ })
1017
+ ]
1018
+ }, member.id);
1019
+ })]
1020
+ })
1021
+ ]
822
1022
  }),
823
- team.captainInbox.length > 0 && (0, react_jsx_runtime.jsxs)("section", {
824
- className: ActivityPanel_module_css_default.inbox,
825
- "aria-label": "成员回报队长",
826
- children: [(0, react_jsx_runtime.jsxs)("header", {
827
- className: ActivityPanel_module_css_default.sectionHead,
828
- children: [(0, react_jsx_runtime.jsx)("span", {
829
- className: ActivityPanel_module_css_default.sectionTitle,
830
- children: "成员回报"
831
- }), (0, react_jsx_runtime.jsx)("span", {
832
- className: ActivityPanel_module_css_default.sectionHint,
833
- children: "流向队长"
834
- })]
835
- }), team.captainInbox.slice(-2).map((message, index) => (0, react_jsx_runtime.jsxs)("div", {
836
- className: ActivityPanel_module_css_default.inboxRow,
837
- children: [(0, react_jsx_runtime.jsxs)("span", {
838
- className: ActivityPanel_module_css_default.inboxRoute,
839
- children: [
840
- message.from,
841
- (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconChevronRightOutline14, {}),
842
- "队长"
843
- ]
844
- }), (0, react_jsx_runtime.jsx)("span", {
845
- className: ActivityPanel_module_css_default.inboxContent,
846
- title: message.content,
847
- children: message.content
848
- })]
849
- }, index))]
850
- })
1023
+ (0, react_jsx_runtime.jsx)(DependencyMap, { tasks: team.tasks })
851
1024
  ]
852
1025
  });
853
1026
  }
1027
+ /** Legacy conversation cards may outlive their host archive. Project their
1028
+ * durable roster through the same rebuilt panel instead of a second UI. */
1029
+ function historicCardTeam(data, owner) {
1030
+ return {
1031
+ workspace: "",
1032
+ teamId: data.teamId,
1033
+ name: data.teamName,
1034
+ captainSessionId: data.captainSessionId || owner,
1035
+ members: data.members.map((member) => ({
1036
+ ...member,
1037
+ status: "removed",
1038
+ activity: "idle",
1039
+ progress: 0,
1040
+ done: 0,
1041
+ total: 0,
1042
+ currentTask: "",
1043
+ unread: 0
1044
+ })),
1045
+ tasks: [],
1046
+ messageCount: 0,
1047
+ captainInbox: []
1048
+ };
1049
+ }
854
1050
  /** The top-right activity floater. Teams follow the current session: live
855
1051
  * snapshots and historic card summaries are only shown while their captain
856
1052
  * session is the one currently open. */
@@ -1036,65 +1232,10 @@ window.__ModuleLoader__.load({
1036
1232
  }, `${team.captainSessionId}:${team.teamId}`)),
1037
1233
  visibleHistoric.map(({ data: team, owner }) => {
1038
1234
  const teamKey = `${owner}:${team.teamId}`;
1039
- return (0, react_jsx_runtime.jsxs)("section", {
1040
- className: ActivityPanel_module_css_default.team,
1041
- "data-team-id": team.teamId,
1042
- "data-historic": true,
1043
- children: [(0, react_jsx_runtime.jsxs)("header", {
1044
- className: ActivityPanel_module_css_default.teamHead,
1045
- children: [(0, react_jsx_runtime.jsxs)("span", {
1046
- className: ActivityPanel_module_css_default.teamName,
1047
- title: team.teamName,
1048
- children: [
1049
- (0, react_jsx_runtime.jsx)("img", {
1050
- className: ActivityPanel_module_css_default.leadAvatar,
1051
- src: LEAD_ART,
1052
- alt: "",
1053
- "aria-hidden": true
1054
- }),
1055
- " ",
1056
- team.teamName
1057
- ]
1058
- }), (0, react_jsx_runtime.jsx)("span", {
1059
- className: ActivityPanel_module_css_default.historicPill,
1060
- children: "已结束"
1061
- })]
1062
- }), (0, react_jsx_runtime.jsx)("div", {
1063
- className: ActivityPanel_module_css_default.members,
1064
- children: team.members.map((member) => (0, react_jsx_runtime.jsxs)("button", {
1065
- type: "button",
1066
- className: ActivityPanel_module_css_default.memberRow,
1067
- "data-activity": "idle",
1068
- onClick: () => {
1069
- if (member.id !== "") navigateToSession(member.id);
1070
- },
1071
- children: [(0, react_jsx_runtime.jsx)("span", {
1072
- className: ActivityPanel_module_css_default.memberAvatar,
1073
- children: memberArtUrl(member.name, member.role) !== null ? (0, react_jsx_runtime.jsx)("img", {
1074
- className: ActivityPanel_module_css_default.memberArt,
1075
- src: memberArtUrl(member.name, member.role) ?? "",
1076
- alt: "",
1077
- "aria-hidden": true
1078
- }) : (0, react_jsx_runtime.jsx)("span", {
1079
- className: ActivityPanel_module_css_default.memberInitial,
1080
- style: { background: accentOf(member.id) },
1081
- children: memberInitial(member.name)
1082
- })
1083
- }), (0, react_jsx_runtime.jsx)("span", {
1084
- className: ActivityPanel_module_css_default.memberInfo,
1085
- children: (0, react_jsx_runtime.jsxs)("span", {
1086
- className: ActivityPanel_module_css_default.memberLine,
1087
- children: [(0, react_jsx_runtime.jsx)("span", {
1088
- className: ActivityPanel_module_css_default.memberName,
1089
- children: member.name
1090
- }), member.role !== "" && (0, react_jsx_runtime.jsx)("span", {
1091
- className: ActivityPanel_module_css_default.memberRole,
1092
- children: member.role
1093
- })]
1094
- })
1095
- })]
1096
- }, member.id))
1097
- })]
1235
+ return (0, react_jsx_runtime.jsx)(TeamSection, {
1236
+ team: historicCardTeam(team, owner),
1237
+ onNavigate: navigateToSession,
1238
+ historic: true
1098
1239
  }, teamKey);
1099
1240
  })
1100
1241
  ] })