@nanmicoder/dsh-agent-teams 0.1.5 → 0.1.7

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
  *
@@ -46,6 +50,56 @@ window.__ModuleLoader__.load({
46
50
  }));
47
51
  }
48
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
+ /**
49
103
  * Return the complete upstream/downstream chain around one task.
50
104
  *
51
105
  * Traversal uses both dependency directions and remains cycle-safe, so the UI
@@ -271,7 +325,7 @@ window.__ModuleLoader__.load({
271
325
  }
272
326
  //#endregion
273
327
  //#region \0dsh-css:/home/runner/work/dsh-agent-teams/dsh-agent-teams/src/client/ActivityPanel.module.css.mjs
274
- 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}}";
275
329
  const tagId = "@nanmicoder/dsh-agent-teams/ActivityPanel.module.css";
276
330
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId) + "]") === null) {
277
331
  const tag = document.createElement("style");
@@ -282,6 +336,7 @@ window.__ModuleLoader__.load({
282
336
  }
283
337
  var ActivityPanel_module_css_default = {
284
338
  "agentTeamsBreathe": "aYQbCq_agentTeamsBreathe",
339
+ "agentTeamsDot": "aYQbCq_agentTeamsDot",
285
340
  "agentTeamsFloat": "aYQbCq_agentTeamsFloat",
286
341
  "agentTeamsPanelIn": "aYQbCq_agentTeamsPanelIn",
287
342
  "agentTeamsPulse": "aYQbCq_agentTeamsPulse",
@@ -303,16 +358,21 @@ window.__ModuleLoader__.load({
303
358
  "captainRole": "aYQbCq_captainRole",
304
359
  "captainState": "aYQbCq_captainState",
305
360
  "captainSummary": "aYQbCq_captainSummary",
361
+ "chevron": "aYQbCq_chevron",
306
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",
307
371
  "delegationSection": "aYQbCq_delegationSection",
308
372
  "delegationTree": "aYQbCq_delegationTree",
309
373
  "dependencySection": "aYQbCq_dependencySection",
310
374
  "emptyHint": "aYQbCq_emptyHint",
311
375
  "historicPill": "aYQbCq_historicPill",
312
- "inbox": "aYQbCq_inbox",
313
- "inboxContent": "aYQbCq_inboxContent",
314
- "inboxRoute": "aYQbCq_inboxRoute",
315
- "inboxRow": "aYQbCq_inboxRow",
316
376
  "leadAvatar": "aYQbCq_leadAvatar",
317
377
  "memberArt": "aYQbCq_memberArt",
318
378
  "memberAvatar": "aYQbCq_memberAvatar",
@@ -328,39 +388,40 @@ window.__ModuleLoader__.load({
328
388
  "memberState": "aYQbCq_memberState",
329
389
  "memberStatusLine": "aYQbCq_memberStatusLine",
330
390
  "members": "aYQbCq_members",
391
+ "membersToggle": "aYQbCq_membersToggle",
331
392
  "panel": "aYQbCq_panel",
332
393
  "panelDot": "aYQbCq_panelDot",
333
394
  "panelHead": "aYQbCq_panelHead",
334
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",
335
403
  "sectionHead": "aYQbCq_sectionHead",
336
404
  "sectionHint": "aYQbCq_sectionHint",
337
405
  "sectionTitle": "aYQbCq_sectionTitle",
338
- "stageColumn": "aYQbCq_stageColumn",
339
- "stageConnector": "aYQbCq_stageConnector",
340
- "stageFlow": "aYQbCq_stageFlow",
341
- "stageGroup": "aYQbCq_stageGroup",
406
+ "sectionToggleTitle": "aYQbCq_sectionToggleTitle",
342
407
  "stageLabel": "aYQbCq_stageLabel",
343
- "stageLine": "aYQbCq_stageLine",
344
- "stageTasks": "aYQbCq_stageTasks",
345
408
  "stateArt": "aYQbCq_stateArt",
346
- "taskBadge": "aYQbCq_taskBadge",
347
- "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",
348
416
  "taskEmpty": "aYQbCq_taskEmpty",
349
417
  "taskId": "aYQbCq_taskId",
350
- "taskNode": "aYQbCq_taskNode",
351
- "taskNodeHead": "aYQbCq_taskNodeHead",
352
- "taskOwner": "aYQbCq_taskOwner",
353
- "taskRoute": "aYQbCq_taskRoute",
354
- "taskStart": "aYQbCq_taskStart",
355
- "taskSubject": "aYQbCq_taskSubject",
356
418
  "team": "aYQbCq_team",
357
419
  "teamHead": "aYQbCq_teamHead",
358
420
  "teamName": "aYQbCq_teamName",
359
421
  "teamStats": "aYQbCq_teamStats",
360
422
  "teams": "aYQbCq_teams",
361
- "unclaimed": "aYQbCq_unclaimed",
362
- "unclaimedTitle": "aYQbCq_unclaimedTitle",
363
- "unreadPill": "aYQbCq_unreadPill"
423
+ "unreadPill": "aYQbCq_unreadPill",
424
+ "workGlyph": "aYQbCq_workGlyph"
364
425
  };
365
426
  //#endregion
366
427
  //#region lib/client/ActivityPanel.js
@@ -432,6 +493,47 @@ window.__ModuleLoader__.load({
432
493
  if (status === "cancelled") return "cancelled";
433
494
  return state;
434
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
+ }
435
537
  /** Collapsed badge: an always-visible corner pill while any team exists. */
436
538
  function CollapsedBadge({ count, busy, onClick }) {
437
539
  return (0, react_jsx_runtime.jsxs)("button", {
@@ -450,19 +552,13 @@ window.__ModuleLoader__.load({
450
552
  })]
451
553
  });
452
554
  }
453
- function memberDotState(member, tasks) {
454
- const owned = tasks.filter((task) => task.assignee === member.name);
455
- if (member.activity === "working") return "ongoing";
456
- if (owned.some((task) => task.status === "failed")) return "error";
457
- if (owned.length > 0 && owned.every((task) => task.status === "completed")) return "done";
458
- return "warning";
459
- }
460
- function memberStateLabel(member, tasks) {
555
+ function memberStateLabel(member, tasks, historic) {
461
556
  const owned = tasks.filter((task) => task.assignee === member.name);
462
557
  if (member.activity === "working") return "工作中";
463
558
  if (owned.some((task) => task.status === "failed")) return "有失败";
464
559
  if (owned.some((task) => task.state === "blocked")) return "等待";
465
560
  if (owned.length > 0 && owned.every((task) => task.status === "completed")) return "已交付";
561
+ if (member.status === "removed") return historic ? "已离队" : "已移除";
466
562
  if (owned.length > 0) return "待执行";
467
563
  return "待派工";
468
564
  }
@@ -481,77 +577,77 @@ window.__ModuleLoader__.load({
481
577
  if (member.done === member.total) return "任务已交付";
482
578
  return member.activity === "idle" ? "待继续执行" : "状态未知";
483
579
  }
484
- function dependencyLabel(task, tasks) {
485
- return task.dependencies.map((id) => {
486
- const dependency = tasks.find((candidate) => candidate.id === id);
487
- return dependency?.assignee ? `${id}·${dependency.assignee}` : id;
488
- }).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;
489
584
  }
490
- function TaskNode({ task, tasks, focused, dimmed, pinned, onPin, onHover, onFocusChange }) {
491
- const tone = taskTone(task.state, task.status);
492
- return (0, react_jsx_runtime.jsxs)("button", {
493
- type: "button",
494
- className: ActivityPanel_module_css_default.taskNode,
495
- "data-task-id": task.id,
496
- "data-state": tone,
497
- "data-focused": focused,
498
- "data-dimmed": dimmed,
499
- "aria-pressed": pinned,
500
- title: `${task.id} · ${task.subject}(悬停高亮依赖链 · 点击固定)`,
501
- onClick: () => {
502
- onPin(task.id);
503
- },
504
- onMouseEnter: () => {
505
- onHover(task.id);
506
- },
507
- onMouseLeave: () => {
508
- onHover(null);
509
- },
510
- onFocus: () => {
511
- onFocusChange(task.id);
512
- },
513
- onBlur: () => {
514
- onFocusChange(null);
515
- },
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,
516
607
  children: [
517
- (0, react_jsx_runtime.jsxs)("span", {
518
- className: ActivityPanel_module_css_default.taskNodeHead,
519
- children: [(0, react_jsx_runtime.jsx)("span", {
520
- className: ActivityPanel_module_css_default.taskId,
521
- children: task.id
522
- }), (0, react_jsx_runtime.jsx)("span", {
523
- className: ActivityPanel_module_css_default.taskBadge,
524
- "data-state": tone,
525
- children: taskStatusLabel(task.status)
526
- })]
527
- }),
528
608
  (0, react_jsx_runtime.jsx)("span", {
529
- className: ActivityPanel_module_css_default.taskSubject,
530
- children: task.subject
609
+ className: ActivityPanel_module_css_default.progressTitle,
610
+ children: "总进度"
531
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 }),
532
617
  (0, react_jsx_runtime.jsxs)("span", {
533
- className: ActivityPanel_module_css_default.taskRoute,
534
- children: [(0, react_jsx_runtime.jsx)("span", {
535
- className: ActivityPanel_module_css_default.taskOwner,
536
- children: task.assignee || "待认领"
537
- }), task.dependencies.length === 0 ? (0, react_jsx_runtime.jsx)("span", {
538
- className: ActivityPanel_module_css_default.taskStart,
539
- children: "起点"
540
- }) : (0, react_jsx_runtime.jsxs)("span", {
541
- className: ActivityPanel_module_css_default.taskDeps,
542
- children: ["依赖 ", dependencyLabel(task, tasks)]
543
- })]
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) })]
544
638
  })
545
639
  ]
546
640
  });
547
641
  }
548
642
  function DependencyMap({ tasks }) {
643
+ const [open, setOpen] = (0, react.useState)(true);
549
644
  const [hoverTaskId, setHoverTaskId] = (0, react.useState)(null);
550
645
  const [keyboardTaskId, setKeyboardTaskId] = (0, react.useState)(null);
551
646
  const [pinnedTaskId, setPinnedTaskId] = (0, react.useState)(null);
552
647
  const hoverTimer = (0, react.useRef)(null);
553
648
  const focusedTaskId = dependencyFocusTaskId(pinnedTaskId, keyboardTaskId, hoverTaskId);
554
- const stages = (0, react.useMemo)(() => taskStages(tasks), [tasks]);
649
+ const layout = (0, react.useMemo)(() => compactDagLayout(tasks), [tasks]);
650
+ const parallel = (0, react.useMemo)(() => usesParallelTaskGrid(tasks), [tasks]);
555
651
  const related = (0, react.useMemo)(() => focusedTaskId === null ? null : relatedTaskIds(focusedTaskId, tasks), [focusedTaskId, tasks]);
556
652
  const scheduleHover = (id) => {
557
653
  if (hoverTimer.current !== null) {
@@ -580,63 +676,147 @@ window.__ModuleLoader__.load({
580
676
  };
581
677
  }, []);
582
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));
583
683
  return (0, react_jsx_runtime.jsxs)("section", {
584
684
  className: ActivityPanel_module_css_default.dependencySection,
585
685
  "aria-label": "任务依赖链",
586
686
  "data-dependency-map": true,
587
687
  children: [(0, react_jsx_runtime.jsxs)("header", {
588
688
  className: ActivityPanel_module_css_default.sectionHead,
589
- children: [(0, react_jsx_runtime.jsxs)("span", {
590
- className: ActivityPanel_module_css_default.sectionTitle,
591
- 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
+ ]
592
702
  }), (0, react_jsx_runtime.jsx)("span", {
593
703
  className: ActivityPanel_module_css_default.sectionHint,
594
- children: pinnedTaskId === null ? "悬停高亮依赖链 · 点击固定" : `${pinnedTaskId} 已固定 · Esc 取消`
704
+ children: pinnedTaskId === null ? parallel ? "无前后依赖 · 点击查看详情" : "悬停高亮依赖链 · 点击固定" : `${pinnedTaskId} 已固定 · Esc 取消`
595
705
  })]
596
- }), (0, react_jsx_runtime.jsx)("div", {
597
- className: ActivityPanel_module_css_default.stageFlow,
598
- children: stages.map((stage, index) => (0, react_jsx_runtime.jsxs)("div", {
599
- className: ActivityPanel_module_css_default.stageGroup,
600
- "data-depth": stage.depth,
601
- children: [index > 0 && (0, react_jsx_runtime.jsxs)("span", {
602
- 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,
603
719
  "aria-hidden": true,
604
- 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, {})]
605
- }), (0, react_jsx_runtime.jsxs)("div", {
606
- className: ActivityPanel_module_css_default.stageColumn,
607
- children: [(0, react_jsx_runtime.jsxs)("span", {
608
- className: ActivityPanel_module_css_default.stageLabel,
609
- children: [stage.depth === 0 ? "起点" : `依赖层 ${stage.depth}`, (0, react_jsx_runtime.jsx)("span", { children: stage.tasks.length })]
610
- }), (0, react_jsx_runtime.jsx)("div", {
611
- className: ActivityPanel_module_css_default.stageTasks,
612
- children: stage.tasks.map((task) => (0, react_jsx_runtime.jsx)(TaskNode, {
613
- task,
614
- tasks,
615
- focused: related?.has(task.id) ?? false,
616
- dimmed: related !== null && !related.has(task.id),
617
- pinned: pinnedTaskId === task.id,
618
- onPin: (id) => {
619
- setPinnedTaskId((current) => current === id ? null : id);
620
- },
621
- onHover: scheduleHover,
622
- onFocusChange: setKeyboardTaskId
623
- }, task.id))
624
- })]
625
- })]
626
- }, stage.depth))
627
- })]
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
+ })] })]
628
812
  });
629
813
  }
630
814
  function TeamSection({ team, onNavigate, historic = false }) {
815
+ const [membersOpen, setMembersOpen] = (0, react.useState)(true);
631
816
  const busyCount = team.members.filter((member) => member.activity === "working").length;
632
817
  const assignedCount = team.tasks.filter((task) => task.assignee !== "").length;
633
818
  const completedCount = team.tasks.filter((task) => task.status === "completed").length;
634
819
  const allCompleted = team.tasks.length > 0 && completedCount === team.tasks.length;
635
- const unclaimed = team.tasks.filter((task) => {
636
- if (task.status === "completed" || task.status === "failed" || task.status === "cancelled") return false;
637
- if (task.assignee === "") return true;
638
- return !team.members.some((member) => member.name === task.assignee);
639
- });
640
820
  return (0, react_jsx_runtime.jsxs)("section", {
641
821
  className: ActivityPanel_module_css_default.team,
642
822
  "data-team-id": team.teamId,
@@ -681,132 +861,147 @@ window.__ModuleLoader__.load({
681
861
  className: ActivityPanel_module_css_default.delegationSection,
682
862
  "aria-label": "队长派工关系",
683
863
  "data-delegation-map": true,
684
- children: [(0, react_jsx_runtime.jsxs)("div", {
685
- className: ActivityPanel_module_css_default.captainNode,
686
- children: [
687
- (0, react_jsx_runtime.jsx)("span", {
688
- className: ActivityPanel_module_css_default.captainAvatar,
689
- children: (0, react_jsx_runtime.jsx)("img", {
690
- className: ActivityPanel_module_css_default.leadAvatar,
691
- src: LEAD_ART,
692
- alt: "",
693
- "aria-hidden": true
694
- })
695
- }),
696
- (0, react_jsx_runtime.jsxs)("span", {
697
- className: ActivityPanel_module_css_default.captainInfo,
698
- children: [(0, react_jsx_runtime.jsxs)("span", {
699
- className: ActivityPanel_module_css_default.captainLine,
700
- children: [(0, react_jsx_runtime.jsx)("span", {
701
- className: ActivityPanel_module_css_default.captainName,
702
- children: "队长"
703
- }), (0, react_jsx_runtime.jsx)("span", {
704
- className: ActivityPanel_module_css_default.captainRole,
705
- 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
+ ]
706
897
  })]
707
- }), (0, react_jsx_runtime.jsxs)("span", {
708
- 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,
709
931
  children: [
710
- "已派发 ",
711
- assignedCount,
712
- " 项任务给 ",
713
- team.members.length,
714
- " 名成员"
715
- ]
716
- })]
717
- }),
718
- (0, react_jsx_runtime.jsxs)("span", {
719
- className: ActivityPanel_module_css_default.captainState,
720
- "data-busy": busyCount > 0,
721
- children: [(0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.StateDot, { state: busyCount > 0 ? "ongoing" : allCompleted ? "done" : "warning" }), busyCount > 0 ? `${busyCount} 人执行中` : allCompleted ? "已收齐" : "等待回报"]
722
- })
723
- ]
724
- }), (0, react_jsx_runtime.jsxs)("div", {
725
- className: ActivityPanel_module_css_default.delegationTree,
726
- children: [team.members.length === 0 && (0, react_jsx_runtime.jsx)("span", {
727
- className: ActivityPanel_module_css_default.emptyHint,
728
- children: "暂无成员,等待队长组建团队"
729
- }), team.members.map((member) => {
730
- const owned = team.tasks.filter((task) => task.assignee === member.name);
731
- return (0, react_jsx_runtime.jsxs)("div", {
732
- className: ActivityPanel_module_css_default.memberBlock,
733
- "data-activity": member.activity,
734
- children: [
735
- (0, react_jsx_runtime.jsx)("span", {
736
- className: ActivityPanel_module_css_default.memberBranch,
737
- "aria-hidden": true,
738
- children: (0, react_jsx_runtime.jsx)("span", {})
739
- }),
740
- (0, react_jsx_runtime.jsxs)("button", {
741
- type: "button",
742
- className: ActivityPanel_module_css_default.memberRow,
743
- "data-activity": member.activity,
744
- onClick: () => {
745
- if (member.id !== "") onNavigate(member.id);
746
- },
747
- children: [
748
- (0, react_jsx_runtime.jsxs)("span", {
749
- className: ActivityPanel_module_css_default.memberAvatar,
750
- "data-unread": member.unread > 0,
751
- children: [memberArtUrl(member.name, member.role) !== null ? (0, react_jsx_runtime.jsx)("img", {
752
- className: ActivityPanel_module_css_default.memberArt,
753
- src: memberArtUrl(member.name, member.role) ?? "",
754
- alt: "",
755
- "aria-hidden": true
756
- }) : (0, react_jsx_runtime.jsx)("span", {
757
- className: ActivityPanel_module_css_default.memberInitial,
758
- style: { background: accentOf(member.id) },
759
- children: memberInitial(member.name)
760
- }), (0, react_jsx_runtime.jsx)("img", {
761
- className: ActivityPanel_module_css_default.stateArt,
762
- "data-activity": member.activity,
763
- src: ACTION_ART[member.activity],
764
- alt: "",
765
- "aria-hidden": true
766
- })]
767
- }),
768
- (0, react_jsx_runtime.jsxs)("span", {
769
- className: ActivityPanel_module_css_default.memberInfo,
770
- children: [(0, react_jsx_runtime.jsxs)("span", {
771
- 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,
772
991
  children: [
773
- (0, react_jsx_runtime.jsx)("span", {
774
- className: ActivityPanel_module_css_default.memberName,
775
- children: member.name
776
- }),
777
- member.role !== "" && (0, react_jsx_runtime.jsx)("span", {
778
- className: ActivityPanel_module_css_default.memberRole,
779
- children: member.role
780
- }),
781
- (0, react_jsx_runtime.jsxs)("span", {
782
- className: ActivityPanel_module_css_default.memberState,
783
- "data-activity": member.activity,
784
- children: [(0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.StateDot, { state: memberDotState(member, team.tasks) }), memberStateLabel(member, team.tasks)]
785
- })
992
+ member.done,
993
+ "/",
994
+ member.total
786
995
  ]
787
- }), (0, react_jsx_runtime.jsx)("span", {
788
- className: ActivityPanel_module_css_default.memberStatusLine,
789
- children: memberStatusText(member, team.tasks)
790
- })]
791
- }),
792
- (0, react_jsx_runtime.jsxs)("span", {
793
- className: ActivityPanel_module_css_default.memberCount,
794
- children: [
795
- member.done,
796
- "/",
797
- member.total
798
- ]
799
- })
800
- ]
801
- }),
802
- (0, react_jsx_runtime.jsxs)("div", {
803
- className: ActivityPanel_module_css_default.assignmentLine,
804
- children: [
805
- (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", {
806
1002
  className: ActivityPanel_module_css_default.assignmentLabel,
807
1003
  children: "队长派发"
808
- }),
809
- (0, react_jsx_runtime.jsx)("span", {
1004
+ }), (0, react_jsx_runtime.jsx)("span", {
810
1005
  className: ActivityPanel_module_css_default.assignmentTasks,
811
1006
  children: owned.length === 0 ? (0, react_jsx_runtime.jsx)("span", {
812
1007
  className: ActivityPanel_module_css_default.taskEmpty,
@@ -817,70 +1012,41 @@ window.__ModuleLoader__.load({
817
1012
  title: task.subject,
818
1013
  children: task.id
819
1014
  }, task.id))
820
- }),
821
- member.unread > 0 && (0, react_jsx_runtime.jsxs)("span", {
822
- className: ActivityPanel_module_css_default.unreadPill,
823
- children: [member.unread, " 条消息"]
824
- })
825
- ]
826
- })
827
- ]
828
- }, member.id);
829
- })]
830
- })]
831
- }),
832
- (0, react_jsx_runtime.jsx)(DependencyMap, { tasks: team.tasks }),
833
- unclaimed.length > 0 && (0, react_jsx_runtime.jsxs)("section", {
834
- className: ActivityPanel_module_css_default.unclaimed,
835
- "aria-label": "待认领任务",
836
- children: [(0, react_jsx_runtime.jsx)("span", {
837
- className: ActivityPanel_module_css_default.unclaimedTitle,
838
- children: "待队长认领或改派"
839
- }), (0, react_jsx_runtime.jsx)("span", {
840
- className: ActivityPanel_module_css_default.assignmentTasks,
841
- children: unclaimed.map((task) => (0, react_jsx_runtime.jsxs)("span", {
842
- className: ActivityPanel_module_css_default.assignmentChip,
843
- "data-state": taskTone(task.state, task.status),
844
- title: task.subject,
845
- children: [
846
- task.id,
847
- " · ",
848
- task.assignee || "未分配"
849
- ]
850
- }, task.id))
851
- })]
1015
+ })]
1016
+ })
1017
+ ]
1018
+ }, member.id);
1019
+ })]
1020
+ })
1021
+ ]
852
1022
  }),
853
- team.captainInbox.length > 0 && (0, react_jsx_runtime.jsxs)("section", {
854
- className: ActivityPanel_module_css_default.inbox,
855
- "aria-label": "成员回报队长",
856
- children: [(0, react_jsx_runtime.jsxs)("header", {
857
- className: ActivityPanel_module_css_default.sectionHead,
858
- children: [(0, react_jsx_runtime.jsx)("span", {
859
- className: ActivityPanel_module_css_default.sectionTitle,
860
- children: "成员回报"
861
- }), (0, react_jsx_runtime.jsx)("span", {
862
- className: ActivityPanel_module_css_default.sectionHint,
863
- children: "流向队长"
864
- })]
865
- }), team.captainInbox.slice(-2).map((message, index) => (0, react_jsx_runtime.jsxs)("div", {
866
- className: ActivityPanel_module_css_default.inboxRow,
867
- children: [(0, react_jsx_runtime.jsxs)("span", {
868
- className: ActivityPanel_module_css_default.inboxRoute,
869
- children: [
870
- message.from,
871
- (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconChevronRightOutline14, {}),
872
- "队长"
873
- ]
874
- }), (0, react_jsx_runtime.jsx)("span", {
875
- className: ActivityPanel_module_css_default.inboxContent,
876
- title: message.content,
877
- children: message.content
878
- })]
879
- }, index))]
880
- })
1023
+ (0, react_jsx_runtime.jsx)(DependencyMap, { tasks: team.tasks })
881
1024
  ]
882
1025
  });
883
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
+ }
884
1050
  /** The top-right activity floater. Teams follow the current session: live
885
1051
  * snapshots and historic card summaries are only shown while their captain
886
1052
  * session is the one currently open. */
@@ -1066,65 +1232,10 @@ window.__ModuleLoader__.load({
1066
1232
  }, `${team.captainSessionId}:${team.teamId}`)),
1067
1233
  visibleHistoric.map(({ data: team, owner }) => {
1068
1234
  const teamKey = `${owner}:${team.teamId}`;
1069
- return (0, react_jsx_runtime.jsxs)("section", {
1070
- className: ActivityPanel_module_css_default.team,
1071
- "data-team-id": team.teamId,
1072
- "data-historic": true,
1073
- children: [(0, react_jsx_runtime.jsxs)("header", {
1074
- className: ActivityPanel_module_css_default.teamHead,
1075
- children: [(0, react_jsx_runtime.jsxs)("span", {
1076
- className: ActivityPanel_module_css_default.teamName,
1077
- title: team.teamName,
1078
- children: [
1079
- (0, react_jsx_runtime.jsx)("img", {
1080
- className: ActivityPanel_module_css_default.leadAvatar,
1081
- src: LEAD_ART,
1082
- alt: "",
1083
- "aria-hidden": true
1084
- }),
1085
- " ",
1086
- team.teamName
1087
- ]
1088
- }), (0, react_jsx_runtime.jsx)("span", {
1089
- className: ActivityPanel_module_css_default.historicPill,
1090
- children: "已结束"
1091
- })]
1092
- }), (0, react_jsx_runtime.jsx)("div", {
1093
- className: ActivityPanel_module_css_default.members,
1094
- children: team.members.map((member) => (0, react_jsx_runtime.jsxs)("button", {
1095
- type: "button",
1096
- className: ActivityPanel_module_css_default.memberRow,
1097
- "data-activity": "idle",
1098
- onClick: () => {
1099
- if (member.id !== "") navigateToSession(member.id);
1100
- },
1101
- children: [(0, react_jsx_runtime.jsx)("span", {
1102
- className: ActivityPanel_module_css_default.memberAvatar,
1103
- children: memberArtUrl(member.name, member.role) !== null ? (0, react_jsx_runtime.jsx)("img", {
1104
- className: ActivityPanel_module_css_default.memberArt,
1105
- src: memberArtUrl(member.name, member.role) ?? "",
1106
- alt: "",
1107
- "aria-hidden": true
1108
- }) : (0, react_jsx_runtime.jsx)("span", {
1109
- className: ActivityPanel_module_css_default.memberInitial,
1110
- style: { background: accentOf(member.id) },
1111
- children: memberInitial(member.name)
1112
- })
1113
- }), (0, react_jsx_runtime.jsx)("span", {
1114
- className: ActivityPanel_module_css_default.memberInfo,
1115
- children: (0, react_jsx_runtime.jsxs)("span", {
1116
- className: ActivityPanel_module_css_default.memberLine,
1117
- children: [(0, react_jsx_runtime.jsx)("span", {
1118
- className: ActivityPanel_module_css_default.memberName,
1119
- children: member.name
1120
- }), member.role !== "" && (0, react_jsx_runtime.jsx)("span", {
1121
- className: ActivityPanel_module_css_default.memberRole,
1122
- children: member.role
1123
- })]
1124
- })
1125
- })]
1126
- }, member.id))
1127
- })]
1235
+ return (0, react_jsx_runtime.jsx)(TeamSection, {
1236
+ team: historicCardTeam(team, owner),
1237
+ onNavigate: navigateToSession,
1238
+ historic: true
1128
1239
  }, teamKey);
1129
1240
  })
1130
1241
  ] })