@nanmicoder/dsh-agent-teams 0.1.20 → 0.1.22-rc.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/README.md +36 -15
  2. package/README_ZH.md +36 -15
  3. package/assets/readme/workspace.png +0 -0
  4. package/compatibility.json +22 -2
  5. package/lib/capabilities.js +3 -1
  6. package/lib/client/ActivityPanel.js +80 -51
  7. package/lib/client/AgentTeamsCard.js +14 -5
  8. package/lib/client/TeamChatEntry.js +22 -0
  9. package/lib/client/WorkspaceActivity.js +100 -0
  10. package/lib/client/activity-model.js +73 -8
  11. package/lib/client/activity-monitor.js +11 -4
  12. package/lib/client/agent-teams-card-definition.js +11 -1
  13. package/lib/client/icons.js +18 -0
  14. package/lib/client/index.js +35 -4
  15. package/lib/client/locales.js +44 -0
  16. package/lib/client/session-navigation.js +13 -1
  17. package/lib/client/workspace-state.js +43 -0
  18. package/lib/client.js +832 -210
  19. package/lib/client.js.map +1 -1
  20. package/lib/git-artifact-stamp.json +5 -0
  21. package/lib/harness-compat.js +20 -3
  22. package/lib/index.js +1 -1
  23. package/lib/mailbox.js +23 -3
  24. package/lib/members.js +3 -3
  25. package/lib/quality-gates.js +54 -0
  26. package/lib/scheduler.js +8 -2
  27. package/lib/snapshot.js +1 -0
  28. package/lib/state.js +15 -3
  29. package/lib/tools.js +71 -22
  30. package/lib/types/capabilities.d.ts +0 -1
  31. package/lib/types/client/ActivityPanel.d.ts +18 -1
  32. package/lib/types/client/AgentTeamsCard.d.ts +14 -2
  33. package/lib/types/client/TeamChatEntry.d.ts +4 -0
  34. package/lib/types/client/WorkspaceActivity.d.ts +22 -0
  35. package/lib/types/client/activity-model.d.ts +37 -1
  36. package/lib/types/client/activity-monitor.d.ts +4 -0
  37. package/lib/types/client/agent-teams-card-definition.d.ts +8 -0
  38. package/lib/types/client/icons.d.ts +5 -0
  39. package/lib/types/client/locales.d.ts +44 -0
  40. package/lib/types/client/session-navigation.d.ts +13 -2
  41. package/lib/types/client/workspace-state.d.ts +19 -0
  42. package/lib/types/harness-compat.d.ts +14 -1
  43. package/lib/types/mailbox.d.ts +4 -0
  44. package/lib/types/quality-gates.d.ts +7 -1
  45. package/lib/types/scheduler.d.ts +1 -0
  46. package/lib/types/snapshot.d.ts +2 -0
  47. package/lib/types/types.d.ts +16 -0
  48. package/package.json +61 -54
  49. package/pnpm-workspace.yaml +288 -0
  50. package/release-notes/v0.1.21-rc.1.md +14 -0
  51. package/release-notes/v0.1.21.md +23 -0
  52. package/release-notes/v0.1.22-rc.1.md +24 -0
  53. package/scripts/compatibility.mjs +26 -4
  54. package/scripts/doctor.mjs +7 -2
package/lib/client.js CHANGED
@@ -7,6 +7,138 @@ window.__ModuleLoader__.load({
7
7
  let react_jsx_runtime = require("react/jsx-runtime");
8
8
  let react = require("react");
9
9
  let _deepseek_ai_dsh_client_ui_primitives = require("@deepseek-ai/dsh-client-ui-primitives");
10
+ //#region lib/client/icons.js
11
+ /** Plugin-owned icons avoid depending on the host's generated design-export names. */
12
+ const stroke = {
13
+ fill: "none",
14
+ stroke: "currentColor",
15
+ strokeWidth: 1.5,
16
+ strokeLinecap: "round",
17
+ strokeLinejoin: "round"
18
+ };
19
+ function IconBranchOutline16() {
20
+ return (0, react_jsx_runtime.jsxs)("svg", {
21
+ width: "16",
22
+ height: "16",
23
+ viewBox: "0 0 16 16",
24
+ "aria-hidden": "true",
25
+ ...stroke,
26
+ children: [
27
+ (0, react_jsx_runtime.jsx)("circle", {
28
+ cx: "4",
29
+ cy: "3",
30
+ r: "1.5"
31
+ }),
32
+ (0, react_jsx_runtime.jsx)("circle", {
33
+ cx: "12",
34
+ cy: "4",
35
+ r: "1.5"
36
+ }),
37
+ (0, react_jsx_runtime.jsx)("circle", {
38
+ cx: "4",
39
+ cy: "13",
40
+ r: "1.5"
41
+ }),
42
+ (0, react_jsx_runtime.jsx)("path", { d: "M4 4.5v7M4 9h3a5 5 0 0 0 5-3.5" })
43
+ ]
44
+ });
45
+ }
46
+ function IconChevronDownOutline14() {
47
+ return (0, react_jsx_runtime.jsx)("svg", {
48
+ width: "14",
49
+ height: "14",
50
+ viewBox: "0 0 14 14",
51
+ "aria-hidden": "true",
52
+ ...stroke,
53
+ children: (0, react_jsx_runtime.jsx)("path", { d: "m3 5 4 4 4-4" })
54
+ });
55
+ }
56
+ function IconPanelLeftOutline16() {
57
+ return (0, react_jsx_runtime.jsxs)("svg", {
58
+ width: "16",
59
+ height: "16",
60
+ viewBox: "0 0 16 16",
61
+ "aria-hidden": "true",
62
+ ...stroke,
63
+ children: [(0, react_jsx_runtime.jsx)("rect", {
64
+ x: "2",
65
+ y: "2.5",
66
+ width: "12",
67
+ height: "11",
68
+ rx: "2"
69
+ }), (0, react_jsx_runtime.jsx)("path", { d: "M6 2.5v11" })]
70
+ });
71
+ }
72
+ function IconStopFill16() {
73
+ return (0, react_jsx_runtime.jsx)("svg", {
74
+ width: "16",
75
+ height: "16",
76
+ viewBox: "0 0 16 16",
77
+ "aria-hidden": "true",
78
+ children: (0, react_jsx_runtime.jsx)("rect", {
79
+ x: "4",
80
+ y: "4",
81
+ width: "8",
82
+ height: "8",
83
+ rx: "1",
84
+ fill: "currentColor"
85
+ })
86
+ });
87
+ }
88
+ function IconWarningOutline16() {
89
+ return (0, react_jsx_runtime.jsxs)("svg", {
90
+ width: "16",
91
+ height: "16",
92
+ viewBox: "0 0 16 16",
93
+ "aria-hidden": "true",
94
+ ...stroke,
95
+ children: [(0, react_jsx_runtime.jsx)("path", { d: "m7 2-5.5 10a1 1 0 0 0 1 1.5h11a1 1 0 0 0 1-1.5L9 2a1.1 1.1 0 0 0-2 0Z" }), (0, react_jsx_runtime.jsx)("path", { d: "M8 6v3m0 2v.1" })]
96
+ });
97
+ }
98
+ //#endregion
99
+ //#region lib/client/session-navigation.js
100
+ /** Version-tolerant navigation into durable AgentTeams member transcripts. */
101
+ /** Newer sessions retain view ownership instead of publishing list.current. */
102
+ function currentSessionId(state) {
103
+ if ("current" in state) return state.current;
104
+ return Object.values(state.byId).find((row) => (row.retainedBy?.mainView ?? 0) > 0)?.id;
105
+ }
106
+ /**
107
+ * Open one member's persisted transcript.
108
+ *
109
+ * Harness rc.8 intentionally removed cold subagents from the ordinary session
110
+ * list. They must first be rediscovered in their parent's catalog, then opened
111
+ * with the exact parent/child/mode address. Older runtimes have only `open()`;
112
+ * the fallback preserves ordinary-session navigation. New layouts also select
113
+ * the Conversation panel and cancel catalog refreshes superseded by navigation.
114
+ */
115
+ async function openAgentTeamMember(sessions, parentSessionId, childSessionId, layout, workspace) {
116
+ if (sessions.open === void 0 && workspace !== void 0) {
117
+ workspace.openSession({
118
+ parentSessionId,
119
+ childSessionId,
120
+ mode: "continuable"
121
+ });
122
+ return "subagent";
123
+ }
124
+ const navigation = layout?.beginNavigation?.();
125
+ if (sessions.openSubagent === void 0 || sessions.refreshSubagents === void 0) {
126
+ if (sessions.open === void 0) throw new Error("Harness does not expose session navigation");
127
+ sessions.open(childSessionId);
128
+ layout?.selectPanel?.(null);
129
+ return "session";
130
+ }
131
+ await sessions.refreshSubagents(parentSessionId);
132
+ if (navigation?.aborted) return "cancelled";
133
+ const retained = sessions.subagentAddress?.(childSessionId);
134
+ sessions.openSubagent(retained?.parentSessionId === parentSessionId ? retained : {
135
+ parentSessionId,
136
+ childSessionId,
137
+ mode: "continuable"
138
+ });
139
+ layout?.selectPanel?.(null);
140
+ return "subagent";
141
+ }
10
142
  /** Compact `provider/model` route, or just the model when the provider is absent. */
11
143
  function memberRouteLabel(member) {
12
144
  if (member === void 0) return "";
@@ -31,6 +163,69 @@ window.__ModuleLoader__.load({
31
163
  const slash = trimmed.lastIndexOf("/");
32
164
  return slash === -1 ? trimmed : trimmed.slice(slash + 1);
33
165
  }
166
+ /**
167
+ * Latest terminal-task `updatedAt` owned by one member.
168
+ * @param memberName - member whose owned tasks are scanned.
169
+ * @param tasks - team tasks carrying durable `updatedAt` stamps.
170
+ * @returns the newest terminal stamp, or undefined when the member owns none.
171
+ */
172
+ function memberFinishedAt(memberName, tasks) {
173
+ let latest;
174
+ for (const task of tasks) {
175
+ if (task.assignee !== memberName) continue;
176
+ if (task.status !== "completed" && task.status !== "failed" && task.status !== "cancelled") continue;
177
+ const stamp = task.updatedAt;
178
+ if (typeof stamp !== "number" || !Number.isFinite(stamp)) continue;
179
+ if (latest === void 0 || stamp > latest) latest = stamp;
180
+ }
181
+ return latest;
182
+ }
183
+ /** Whether a member still has live work (running activity or an open task). */
184
+ function memberIsRunning(member, tasks) {
185
+ if (member.activity === "working" || member.status === "working") return true;
186
+ return tasks.some((task) => task.assignee === member.name && (task.status === "pending" || task.status === "claimed" || task.status === "in_progress"));
187
+ }
188
+ /**
189
+ * Order the delegation member list for issue #192.
190
+ *
191
+ * Running members keep their incoming relative order and come first; finished
192
+ * members follow sorted by finish time, newest first. Members without a
193
+ * derivable finish time keep their incoming relative order after the stamped
194
+ * ones, so an older host that omits stamps never reorders them randomly.
195
+ * @param members - delegation roster in snapshot order.
196
+ * @param tasks - team tasks carrying durable `updatedAt` stamps.
197
+ * @returns the members in display order.
198
+ */
199
+ function orderDelegationMembers(members, tasks) {
200
+ const running = [];
201
+ const finishedStamped = [];
202
+ const finishedUnstamped = [];
203
+ members.forEach((member, index) => {
204
+ if (memberIsRunning(member, tasks)) {
205
+ running.push({
206
+ member,
207
+ index
208
+ });
209
+ return;
210
+ }
211
+ const finishedAt = memberFinishedAt(member.name, tasks);
212
+ if (finishedAt === void 0) finishedUnstamped.push({
213
+ member,
214
+ index
215
+ });
216
+ else finishedStamped.push({
217
+ member,
218
+ index,
219
+ finishedAt
220
+ });
221
+ });
222
+ finishedStamped.sort((left, right) => right.finishedAt - left.finishedAt || left.index - right.index);
223
+ return [
224
+ ...running,
225
+ ...finishedStamped,
226
+ ...finishedUnstamped
227
+ ].map((entry) => entry.member);
228
+ }
34
229
  /** Whether the captain chat should keep showing the in-progress banner. */
35
230
  function teamIsActive(team) {
36
231
  if (team.halted === true || team.phase === "staged") return false;
@@ -94,13 +289,17 @@ window.__ModuleLoader__.load({
94
289
  * each stage. Edges use cubic curves so fan-in remains readable without
95
290
  * turning every task into a large card.
96
291
  */
97
- function compactDagLayout(tasks) {
292
+ function compactDagLayout(tasks, dimensions) {
293
+ const nodeWidth = dimensions?.nodeWidth ?? 92;
294
+ const nodeHeight = dimensions?.nodeHeight ?? 30;
295
+ const columnGap = dimensions?.columnGap ?? 26;
296
+ const rowGap = dimensions?.rowGap ?? 8;
98
297
  const stages = taskStages(tasks);
99
298
  const positions = /* @__PURE__ */ new Map();
100
299
  const nodes = [];
101
300
  for (const [column, stage] of stages.entries()) for (const [row, task] of stage.tasks.entries()) {
102
- const x = column * 118;
103
- const y = row * 38;
301
+ const x = column * (nodeWidth + columnGap);
302
+ const y = row * (nodeHeight + rowGap);
104
303
  positions.set(task.id, {
105
304
  x,
106
305
  y
@@ -118,10 +317,10 @@ window.__ModuleLoader__.load({
118
317
  for (const dependency of task.dependencies) {
119
318
  const source = positions.get(dependency);
120
319
  if (source === void 0) continue;
121
- const x1 = source.x + 92;
122
- const y1 = source.y + 30 / 2;
320
+ const x1 = source.x + nodeWidth;
321
+ const y1 = source.y + nodeHeight / 2;
123
322
  const x2 = target.x;
124
- const y2 = target.y + 30 / 2;
323
+ const y2 = target.y + nodeHeight / 2;
125
324
  edges.push({
126
325
  from: dependency,
127
326
  to: task.id,
@@ -131,8 +330,8 @@ window.__ModuleLoader__.load({
131
330
  }
132
331
  const rows = Math.max(1, ...stages.map((stage) => stage.tasks.length));
133
332
  return {
134
- width: stages.length === 0 ? 0 : stages.length * 92 + (stages.length - 1) * 26,
135
- height: stages.length === 0 ? 0 : rows * 30 + (rows - 1) * 8,
333
+ width: stages.length === 0 ? 0 : stages.length * nodeWidth + (stages.length - 1) * columnGap,
334
+ height: stages.length === 0 ? 0 : rows * nodeHeight + (rows - 1) * rowGap,
136
335
  nodes,
137
336
  edges
138
337
  };
@@ -342,9 +541,11 @@ window.__ModuleLoader__.load({
342
541
  cache: "no-store",
343
542
  signal: controller.signal
344
543
  });
345
- if (!liveResponse.ok) return;
544
+ if (!liveResponse.ok) throw new Error("Activity unavailable");
346
545
  const body = await liveResponse.json();
347
- if (cancelled || !Array.isArray(body.teams)) return;
546
+ if (cancelled) return;
547
+ if (!Array.isArray(body.teams)) throw new Error("Invalid activity response");
548
+ runtime.onStatus?.("ready");
348
549
  const liveTeams = body.teams;
349
550
  publishSnapshots({ teams: liveTeams });
350
551
  const previousDiscoveredKeys = discoveredLiveKeys;
@@ -361,14 +562,16 @@ window.__ModuleLoader__.load({
361
562
  cache: "no-store",
362
563
  signal: controller.signal
363
564
  });
364
- if (!archivedResponse.ok) return;
565
+ if (!archivedResponse.ok) throw new Error("Archive unavailable");
365
566
  const archivedBody = await archivedResponse.json();
366
- if (cancelled || !Array.isArray(archivedBody.teams)) return;
567
+ if (cancelled) return;
568
+ if (!Array.isArray(archivedBody.teams)) throw new Error("Invalid archive response");
367
569
  publishSnapshots({ archivedTeams: archivedBody.teams });
368
570
  discoveryComplete = true;
369
571
  settleTargets(new Set(missing.map((target) => target.key)));
370
572
  } catch (error) {
371
573
  if (error?.name === "AbortError") return;
574
+ if (!cancelled) runtime.onStatus?.("error");
372
575
  } finally {
373
576
  inFlight = false;
374
577
  }
@@ -429,16 +632,17 @@ window.__ModuleLoader__.load({
429
632
  }
430
633
  //#endregion
431
634
  //#region \0dsh-css:/home/runner/work/dsh-agent-teams/dsh-agent-teams/src/client/AgentTeamsCard.module.css.mjs
432
- const css$1 = ".kPAopq_root{box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-module-platform);border-radius:10px;flex-direction:column;gap:8px;width:100%;min-width:0;padding:10px 12px;display:flex}.kPAopq_head{align-items:center;gap:8px;min-width:0;display:flex}.kPAopq_leadAvatar{object-fit:contain;filter:drop-shadow(0 1px 1px #122d4833);background:0 0;border:0;border-radius:0;flex:none;width:30px;height:30px}.kPAopq_teamName{color:var(--dsw-alias-label-primary);text-overflow:ellipsis;white-space:nowrap;flex:0 auto;font-size:13px;font-weight:600;line-height:20px;overflow:hidden}.kPAopq_memberCount{color:var(--dsw-alias-label-tertiary);white-space:nowrap;flex:none;margin-left:auto;font-size:11px;line-height:16px}.kPAopq_panelButton{border:1px solid var(--dsw-alias-border-l3);background:var(--dsw-alias-bg-layer-1);color:var(--dsw-alias-label-secondary);font:inherit;cursor:pointer;border-radius:999px;flex:none;padding:2px 8px;font-size:10.5px;font-weight:600;line-height:16px;transition:border-color .12s,color .12s}.kPAopq_panelButton:hover{border-color:var(--dsw-alias-state-business-primary);color:var(--dsw-alias-state-business-primary)}.kPAopq_panelButton:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:1px}.kPAopq_members{flex-wrap:wrap;gap:6px;min-width:0;display:flex}.kPAopq_member{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-1);max-width:160px;color:var(--dsw-alias-label-secondary);font:inherit;cursor:pointer;border-radius:999px;align-items:center;gap:5px;padding:3px 8px 3px 3px;font-size:11px;font-weight:500;line-height:16px;transition:border-color .12s,background-color .12s;display:inline-flex}.kPAopq_member:hover{border-color:var(--dsw-alias-state-business-primary);background:var(--dsw-alias-button-ghost-active-fill)}.kPAopq_member:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:1px}.kPAopq_memberArt{object-fit:contain;filter:drop-shadow(0 1px 1px #122d482e);background:0 0;border:0;border-radius:0;width:24px;height:24px}.kPAopq_memberInitial{background:var(--dsw-alias-state-business-primary);width:20px;height:20px;color:var(--dsw-alias-label-primary-inverted);border-radius:50%;justify-content:center;align-items:center;font-size:10px;font-weight:600;line-height:20px;display:inline-flex}.kPAopq_memberName{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}";
433
- const tagId$1 = "@nanmicoder/dsh-agent-teams/AgentTeamsCard.module.css";
434
- if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$1) + "]") === null) {
635
+ const css$2 = ".kPAopq_root{box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-module-platform);border-radius:10px;flex-direction:column;gap:8px;width:100%;min-width:0;padding:10px 12px;display:flex}.kPAopq_head{align-items:center;gap:8px;min-width:0;display:flex}.kPAopq_leadAvatar{object-fit:contain;filter:drop-shadow(0 1px 1px #122d4833);background:0 0;border:0;border-radius:0;flex:none;width:30px;height:30px}.kPAopq_teamName{color:var(--dsw-alias-label-primary);text-overflow:ellipsis;white-space:nowrap;flex:0 auto;font-size:13px;font-weight:600;line-height:20px;overflow:hidden}.kPAopq_memberCount{color:var(--dsw-alias-label-tertiary);white-space:nowrap;flex:none;margin-left:auto;font-size:11px;line-height:16px}.kPAopq_panelButton{border:1px solid var(--dsw-alias-border-l3);background:var(--dsw-alias-bg-layer-1);color:var(--dsw-alias-label-secondary);font:inherit;cursor:pointer;border-radius:999px;flex:none;padding:2px 8px;font-size:10.5px;font-weight:600;line-height:16px;transition:border-color .12s,color .12s}.kPAopq_panelButton:hover{border-color:var(--dsw-alias-state-business-primary);color:var(--dsw-alias-state-business-primary)}.kPAopq_panelButton:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:1px}.kPAopq_members{flex-wrap:wrap;gap:6px;min-width:0;display:flex}.kPAopq_member{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-1);max-width:160px;color:var(--dsw-alias-label-secondary);font:inherit;cursor:pointer;border-radius:999px;align-items:center;gap:5px;padding:3px 8px 3px 3px;font-size:11px;font-weight:500;line-height:16px;transition:border-color .12s,background-color .12s;display:inline-flex}.kPAopq_member:hover{border-color:var(--dsw-alias-state-business-primary);background:var(--dsw-alias-button-ghost-active-fill)}.kPAopq_member:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:1px}.kPAopq_memberArt{object-fit:contain;filter:drop-shadow(0 1px 1px #122d482e);background:0 0;border:0;border-radius:0;width:24px;height:24px}.kPAopq_memberInitial{background:var(--dsw-alias-state-business-primary);width:20px;height:20px;color:var(--dsw-alias-label-primary-inverted);border-radius:50%;justify-content:center;align-items:center;font-size:10px;font-weight:600;line-height:20px;display:inline-flex}.kPAopq_memberName{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.kPAopq_chatEntry{border:1px solid var(--dsw-alias-border-l2);color:var(--dsw-alias-label-secondary);font:inherit;white-space:nowrap;cursor:pointer;background:0 0;border-radius:7px;align-items:center;gap:5px;padding:3px 8px;font-size:12px;display:inline-flex}.kPAopq_chatEntry img{object-fit:contain;width:22px;height:22px}.kPAopq_chatEntry:hover{background:var(--dsw-alias-bg-module-platform)}.kPAopq_chatEntry:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:2px}.kPAopq_turnCards{gap:8px;margin-block:10px;display:grid}@media (width<=600px){.kPAopq_head{flex-wrap:wrap}}";
636
+ const tagId$2 = "@nanmicoder/dsh-agent-teams/AgentTeamsCard.module.css";
637
+ if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$2) + "]") === null) {
435
638
  const tag = document.createElement("style");
436
639
  tag.dataset.plugin = "@nanmicoder/dsh-agent-teams";
437
- tag.dataset.pluginCss = tagId$1;
438
- tag.textContent = css$1;
640
+ tag.dataset.pluginCss = tagId$2;
641
+ tag.textContent = css$2;
439
642
  document.head.appendChild(tag);
440
643
  }
441
644
  var AgentTeamsCard_module_css_default = {
645
+ "chatEntry": "kPAopq_chatEntry",
442
646
  "head": "kPAopq_head",
443
647
  "leadAvatar": "kPAopq_leadAvatar",
444
648
  "member": "kPAopq_member",
@@ -449,7 +653,8 @@ window.__ModuleLoader__.load({
449
653
  "members": "kPAopq_members",
450
654
  "panelButton": "kPAopq_panelButton",
451
655
  "root": "kPAopq_root",
452
- "teamName": "kPAopq_teamName"
656
+ "teamName": "kPAopq_teamName",
657
+ "turnCards": "kPAopq_turnCards"
453
658
  };
454
659
  //#endregion
455
660
  //#region lib/client/AgentTeamsCard.js
@@ -466,7 +671,7 @@ window.__ModuleLoader__.load({
466
671
  */
467
672
  /** Window event name the floater listens for to open itself. */
468
673
  const OPEN_PANEL_EVENT = "agent-teams:open-panel";
469
- /** Re-activate the top-right activity panel, carrying this team's summary
674
+ /** Open the matching team view, carrying this team's summary
470
675
  * so the panel can show it even when the team no longer exists on disk
471
676
  * (historical session review). */
472
677
  function openActivityPanel(data) {
@@ -478,8 +683,20 @@ window.__ModuleLoader__.load({
478
683
  } }));
479
684
  }
480
685
  /** Render one durable team as a compact conversation card. */
481
- function AgentTeamsCard({ node, openMember, sessionId, t }) {
482
- const data = node.data;
686
+ const noWorkspace = () => void 0;
687
+ const noSubscription = () => () => {};
688
+ function AgentTeamsCard({ node, openMember, sessionId, t, workspaceBridge }) {
689
+ const native = (0, react.useSyncExternalStore)(workspaceBridge?.subscribe ?? noSubscription, workspaceBridge?.getSnapshot ?? noWorkspace);
690
+ const location = node.location;
691
+ if (native && (location.kind === "turn" || location.kind === "step") && location.turn.status === "closed") return null;
692
+ return (0, react_jsx_runtime.jsx)(AgentTeamsSummary, {
693
+ data: node.data,
694
+ openMember,
695
+ sessionId,
696
+ t
697
+ });
698
+ }
699
+ function AgentTeamsSummary({ data, openMember, sessionId, t }) {
483
700
  const owner = data.captainSessionId || sessionId;
484
701
  const { teams, archivedTeams } = (0, react.useSyncExternalStore)(subscribeActivitySnapshots, getActivitySnapshotsSnapshot);
485
702
  (0, react.useEffect)(() => {
@@ -528,9 +745,9 @@ window.__ModuleLoader__.load({
528
745
  onClick: () => {
529
746
  openActivityPanel(resolved);
530
747
  },
531
- "aria-label": t("action.openActivityPanel"),
532
- title: t("action.openActivityPanel"),
533
- children: t("activity.panelButton")
748
+ "aria-label": t("workspace.focus"),
749
+ title: t("workspace.focus"),
750
+ children: t("workspace.focus")
534
751
  })
535
752
  ]
536
753
  }), resolved.members.length > 0 && (0, react_jsx_runtime.jsx)("div", {
@@ -560,13 +777,13 @@ window.__ModuleLoader__.load({
560
777
  }
561
778
  //#endregion
562
779
  //#region \0dsh-css:/home/runner/work/dsh-agent-teams/dsh-agent-teams/src/client/ActivityPanel.module.css.mjs
563
- const css = "html{--agent-teams-panel-shift:420px}html[data-agent-teams-panel-open] [data-phase=active]{box-sizing:border-box;padding-right:var(--agent-teams-panel-shift)}.aYQbCq_badge{box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2);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-bg-mask-3) 29%, transparent);color:var(--dsw-alias-label-secondary);font:inherit;cursor:pointer;border-radius:999px;align-items:center;gap:7px;padding:0 12px;font-size:12px;font-weight:600;line-height:20px;transition:border-color .15s,transform .12s;display:inline-flex;position:absolute;top:64px;right:18px}.aYQbCq_badge:hover{border-color:var(--dsw-alias-border-l3);transform:translateY(-1px)}.aYQbCq_badge:active{transform:translateY(0)scale(.98)}.aYQbCq_badge:focus-visible,.aYQbCq_iconButton:focus-visible,.aYQbCq_memberRow:focus-visible,.aYQbCq_membersToggle:focus-visible,.aYQbCq_sectionToggleTitle:focus-visible,.aYQbCq_dagNode:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:2px}.aYQbCq_badgeDot,.aYQbCq_panelDot{background:var(--dsw-alias-label-tertiary);border-radius:50%;width:7px;height:7px}.aYQbCq_badgeDot[data-busy=true],.aYQbCq_panelDot[data-busy=true]{background:var(--dsw-alias-state-business-primary);animation:1.25s ease-in-out infinite aYQbCq_agentTeamsPulse}.aYQbCq_badgeCount,.aYQbCq_memberCount,.aYQbCq_teamStats,.aYQbCq_stageLabel,.aYQbCq_taskId{font-variant-numeric:tabular-nums}.aYQbCq_panel{box-sizing:border-box;border:1px solid color-mix(in srgb, var(--dsw-alias-border-l3) 58%, transparent);background:color-mix(in srgb, var(--dsw-alias-bg-layer-1) 95%, transparent);backdrop-filter:blur(20px)saturate(1.08);box-shadow:0 12px 32px color-mix(in srgb, var(--dsw-alias-bg-mask-3) 25%, transparent), 0 32px 72px color-mix(in srgb, var(--dsw-alias-bg-mask-3) 33%, transparent);will-change:transform;border-radius:16px;flex-direction:column;animation:.16s ease-out aYQbCq_agentTeamsPanelIn;display:flex;position:absolute;top:0;left:0;overflow:hidden}.aYQbCq_panel[data-dragging],.aYQbCq_panel[data-resizing]{user-select:none;box-shadow:0 16px 38px color-mix(in srgb, var(--dsw-alias-bg-mask-3) 29%, transparent), 0 36px 78px color-mix(in srgb, var(--dsw-alias-bg-mask-3) 38%, transparent)}@keyframes aYQbCq_agentTeamsPanelIn{0%{opacity:0}to{opacity:1}}@keyframes aYQbCq_agentTeamsPulse{0%,to{opacity:.42}50%{opacity:1}}.aYQbCq_panelHead{border-bottom:1px solid var(--dsw-alias-border-l2);cursor:grab;touch-action:none;flex:none;justify-content:space-between;align-items:center;min-height:44px;padding:0 14px 0 16px;display:flex}.aYQbCq_panelHead:active,.aYQbCq_panel[data-dragging] .aYQbCq_panelHead{cursor:grabbing}.aYQbCq_panel[data-compact] .aYQbCq_panelHead{cursor:default;touch-action:auto}.aYQbCq_panelTitle{color:var(--dsw-alias-label-primary);align-items:center;gap:8px;font-size:14px;font-weight:600;line-height:20px;display:inline-flex}.aYQbCq_panelControls{flex:none;align-items:center;gap:2px;display:inline-flex}.aYQbCq_iconButton{width:28px;height:28px;color:var(--dsw-alias-label-tertiary);cursor:pointer;background:0 0;border:0;border-radius:7px;justify-content:center;align-items:center;padding:0;transition:background-color .12s,color .12s,transform .12s;display:inline-flex}.aYQbCq_iconButton:hover{background:var(--dsw-alias-button-ghost-active-fill);color:var(--dsw-alias-label-primary)}.aYQbCq_iconButton:active{transform:scale(.94)}.aYQbCq_iconButton[data-control=dock][data-mode=docked] svg{transform:scaleX(-1)}.aYQbCq_resizeHandle{z-index:5;touch-action:none;pointer-events:auto;position:absolute}.aYQbCq_resizeHandle[data-resize-edge=left]{cursor:ew-resize;width:14px;top:44px;bottom:14px;left:0}.aYQbCq_resizeHandle[data-resize-edge=left]:after{background:color-mix(in srgb, var(--dsw-alias-label-tertiary) 42%, transparent);content:\"\";opacity:.45;border-radius:999px;width:3px;height:48px;transition:background-color .12s,opacity .12s;position:absolute;top:50%;left:4px;transform:translateY(-50%)}.aYQbCq_resizeHandle[data-resize-edge=bottom]{cursor:ns-resize;height:14px;bottom:0;left:20px;right:20px}.aYQbCq_resizeHandle[data-resize-edge=bottom]:after{background:color-mix(in srgb, var(--dsw-alias-label-tertiary) 42%, transparent);content:\"\";opacity:.45;border-radius:999px;width:48px;height:3px;transition:background-color .12s,opacity .12s;position:absolute;bottom:4px;left:50%;transform:translate(-50%)}.aYQbCq_resizeHandle[data-resize-edge=corner]{cursor:nwse-resize;width:28px;height:28px;bottom:0;right:0}.aYQbCq_resizeHandle[data-resize-edge=corner]:after{border-right:2px solid var(--dsw-alias-label-tertiary);border-bottom:2px solid var(--dsw-alias-label-tertiary);content:\"\";opacity:.58;width:10px;height:10px;transition:border-color .12s,opacity .12s;position:absolute;bottom:6px;right:6px}.aYQbCq_resizeHandle:hover:after,.aYQbCq_panel[data-resizing] .aYQbCq_resizeHandle:after{background-color:var(--dsw-alias-state-business-primary);border-color:var(--dsw-alias-state-business-primary);opacity:.95}.aYQbCq_teams{overscroll-behavior:contain;scrollbar-color:color-mix(in srgb, var(--dsw-alias-label-tertiary) 28%, transparent) transparent;scrollbar-width:thin;flex-direction:column;min-height:0;display:flex;overflow-y:auto}.aYQbCq_teams::-webkit-scrollbar{width:6px}.aYQbCq_teams::-webkit-scrollbar-track{background:0 0}.aYQbCq_teams::-webkit-scrollbar-thumb{background:color-mix(in srgb, var(--dsw-alias-label-tertiary) 28%, transparent);background-clip:padding-box;border:2px solid #0000;border-radius:999px}.aYQbCq_teams:hover::-webkit-scrollbar-thumb{background:color-mix(in srgb, var(--dsw-alias-label-tertiary) 44%, transparent);background-clip:padding-box}.aYQbCq_team{border-bottom:1px solid var(--dsw-alias-border-l2);flex-direction:column;gap:12px;padding:12px 14px 16px;display:flex;container:aYQbCq_agent-team/inline-size}.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_teamStopButton{border:1px solid var(--dsw-alias-border-l2);width:26px;height:26px;color:var(--dsw-alias-label-tertiary);cursor:pointer;background:0 0;border-radius:7px;flex:none;place-items:center;padding:0;transition:border-color .15s,background .15s,color .15s;display:grid}.aYQbCq_teamStopButton:hover{border-color:color-mix(in srgb, var(--dsw-alias-state-error-primary) 42%, var(--dsw-alias-border-l2));background:color-mix(in srgb, var(--dsw-alias-state-error-primary) 7%, transparent);color:var(--dsw-alias-state-error-primary)}.aYQbCq_teamStopButton:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:2px}.aYQbCq_stopModalActions{justify-content:flex-end;gap:8px;display:flex}.aYQbCq_stopModalActions button{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-button-ghost-active-fill);min-height:34px;color:var(--dsw-alias-label-primary);cursor:pointer;font:inherit;border-radius:8px;justify-content:center;align-items:center;gap:6px;padding:6px 13px;font-size:12px;font-weight:600;display:inline-flex}.aYQbCq_stopModalActions button[data-danger]{border-color:var(--dsw-alias-state-error-primary);background:var(--dsw-alias-state-error-primary);color:var(--dsw-alias-label-primary-inverted)}.aYQbCq_stopModalActions button:disabled{cursor:wait;opacity:.58}.aYQbCq_stopModalError{background:color-mix(in srgb, var(--dsw-alias-state-error-primary) 8%, transparent);color:var(--dsw-alias-state-error-primary);border-radius:8px;align-items:flex-start;gap:7px;margin:0;padding:9px 10px;font-size:12px;line-height:18px;display:flex}.aYQbCq_stopModalError svg{flex:none;margin-top:1px}.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-border-l2));background:color-mix(in srgb, var(--dsw-alias-state-business-primary) 7%, var(--dsw-alias-bg-layer-1));border-radius:10px;grid-template-columns:48px minmax(0,1fr) auto;align-items:center;gap:9px;min-height:56px;padding:6px 10px;display:grid}.aYQbCq_captainAvatar,.aYQbCq_memberAvatar{flex:none;justify-content:center;align-items:center;display:inline-flex;position:relative}.aYQbCq_captainAvatar{width:46px;height:46px}.aYQbCq_leadAvatar,.aYQbCq_memberArt{object-fit:contain;filter:drop-shadow(0 1px 1px #122d4833);background:0 0;border:0;border-radius:0}.aYQbCq_leadAvatar{width:44px;height:44px}.aYQbCq_memberArt{width:40px;height:40px}.aYQbCq_captainInfo,.aYQbCq_memberInfo{flex-direction:column;min-width:0;display:flex}.aYQbCq_captainInfo{gap:2px}.aYQbCq_captainLine,.aYQbCq_memberLine{align-items:center;gap:6px;min-width:0;display:flex}.aYQbCq_captainName,.aYQbCq_memberName{color:var(--dsw-alias-label-primary);text-overflow:ellipsis;white-space:nowrap;font-size:12.5px;font-weight:600;line-height:18px;overflow:hidden}.aYQbCq_captainRole,.aYQbCq_memberRole{color:var(--dsw-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;font-size:10px;line-height:14px;overflow:hidden}.aYQbCq_captainSummary,.aYQbCq_memberStatusLine{color:var(--dsw-alias-label-secondary);text-overflow:ellipsis;white-space:nowrap;font-size:10.5px;line-height:15px;overflow:hidden}.aYQbCq_taskDetailModel{color:var(--dsw-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:9.5px;line-height:14px;overflow:hidden}.aYQbCq_memberModel{box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-button-ghost-active-fill);min-width:0;max-width:132px;color:var(--dsw-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;border-radius:999px;flex:0 auto;align-items:center;padding:0 6px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:9px;font-weight:600;line-height:15px;display:inline-flex;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-border-l3);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-warn-primary)}.aYQbCq_progressSegments>span[data-state=completed]{background:var(--dsw-alias-state-success-primary)}.aYQbCq_progressSegments>span[data-state=failed]{background:var(--dsw-alias-state-error-primary)}.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-warn-primary)}.aYQbCq_progressLegend>span[data-state=completed]{color:var(--dsw-alias-state-success-primary)}.aYQbCq_progressSummary{background:color-mix(in srgb, var(--dsw-alias-state-business-primary) 7%, var(--dsw-alias-bg-layer-1));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-warn-primary) 8%, var(--dsw-alias-bg-layer-1))}.aYQbCq_progressSummary[data-state=completed]{background:color-mix(in srgb, var(--dsw-alias-state-success-primary) 8%, var(--dsw-alias-bg-layer-1))}.aYQbCq_progressSummary[data-state=discarded]{background:var(--dsw-alias-button-ghost-active-fill)}.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-warn-primary)}.aYQbCq_progressSummary[data-state=completed] .aYQbCq_progressSummaryDot{background:var(--dsw-alias-state-success-primary)}.aYQbCq_progressSummary[data-state=discarded] .aYQbCq_progressSummaryDot{background:var(--dsw-alias-label-tertiary)}.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-button-ghost-active-fill)}.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-border-l2));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-border-l2));width:20px;height:1px;display:block;position:absolute;top:27px;right:100%}.aYQbCq_memberBranch:before{background:var(--dsw-alias-state-business-primary);content:\"\";border-radius:50%;width:5px;height:5px;position:absolute;top:-2px;right:-1px}.aYQbCq_memberRow{box-sizing:border-box;width:100%;min-width:0;min-height:48px;color:inherit;font:inherit;text-align:left;cursor:pointer;background:0 0;border:0;border-radius:8px;grid-template-columns:46px minmax(0,1fr) auto;align-items:center;gap:8px;padding:4px 6px;transition:background-color .12s,transform .12s;display:grid}.aYQbCq_memberRow:hover,.aYQbCq_memberRow[data-activity=working]{background:color-mix(in srgb, var(--dsw-alias-state-business-primary) 6%, var(--dsw-alias-bg-layer-1))}.aYQbCq_memberRow:active{transform:scale(.995)}.aYQbCq_memberAvatar{width:42px;height:42px}.aYQbCq_memberAvatar[data-unread=true]:after{box-sizing:border-box;border:1px solid var(--dsw-alias-bg-layer-1);background:var(--dsw-alias-state-business-primary);content:\"\";border-radius:50%;width:6px;height:6px;animation:1.8s ease-in-out infinite aYQbCq_agentTeamsUnreadPulse;position:absolute;top:0;right:-1px}@keyframes aYQbCq_agentTeamsUnreadPulse{0%,to{opacity:.78;transform:scale(.92)}50%{opacity:1;transform:scale(1.16)}}.aYQbCq_memberInitial{background:var(--dsw-alias-state-business-primary);width:34px;height:34px;color:var(--dsw-alias-label-primary-inverted);border-radius:50%;justify-content:center;align-items:center;font-size:14px;font-weight:600;line-height:20px;display:inline-flex}.aYQbCq_stateArt{box-sizing:border-box;object-fit:contain;width:22px;height:22px;filter:drop-shadow(0 0 1px var(--dsw-alias-bg-layer-1)) drop-shadow(0 1px 1px #122d483d);background:0 0;border:0;border-radius:0;position:absolute;bottom:-3px;right:-5px}.aYQbCq_stateArt[data-activity=working]{animation:2.4s ease-in-out infinite aYQbCq_agentTeamsFloat}.aYQbCq_stateArt[data-activity=idle]{animation:4.2s ease-in-out infinite aYQbCq_agentTeamsBreathe}.aYQbCq_stateArt[data-activity=unknown]{animation:2.8s ease-in-out infinite aYQbCq_agentTeamsThink}@keyframes aYQbCq_agentTeamsFloat{0%,to{transform:translateY(0)rotate(-4deg)}50%{transform:translateY(-2px)rotate(4deg)}}@keyframes aYQbCq_agentTeamsBreathe{0%,to{opacity:.82;transform:scale(1)}50%{opacity:1;transform:scale(1.06)}}@keyframes aYQbCq_agentTeamsThink{0%,to{transform:rotate(-7deg)}50%{transform:rotate(7deg)}}.aYQbCq_memberState{margin-left:auto}.aYQbCq_memberCount{color:var(--dsw-alias-label-tertiary);font-size:10.5px;line-height:16px}.aYQbCq_assignmentLine{align-items:center;gap:7px;min-width:0;padding:0 6px 0 60px;display:flex}.aYQbCq_assignmentLabel{color:var(--dsw-alias-label-tertiary);flex:none;font-size:9.5px;line-height:14px}.aYQbCq_assignmentTasks{flex-wrap:wrap;flex:1;gap:4px;min-width:0;display:flex}.aYQbCq_assignmentChip{background:var(--dsw-alias-button-ghost-active-fill);max-width:100%;min-height:16px;color:var(--dsw-alias-label-secondary);text-overflow:ellipsis;white-space:nowrap;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;overflow:hidden}.aYQbCq_assignmentChip[data-state=running]{background:var(--dsw-alias-state-business-primary);color:var(--dsw-alias-label-primary-inverted)}.aYQbCq_assignmentChip[data-state=completed]{background:var(--dsw-alias-state-success-primary);color:var(--dsw-alias-label-primary-inverted)}.aYQbCq_assignmentChip[data-state=blocked]{background:var(--dsw-alias-state-warn-primary);color:var(--dsw-alias-label-primary-inverted)}.aYQbCq_assignmentChip[data-state=failed]{background:var(--dsw-alias-state-error-primary);color:var(--dsw-alias-label-primary-inverted)}.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-border-l2);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-border-l3);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-border-l2);background:var(--dsw-alias-bg-layer-1);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-layer-1))}.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-primary) 48%, var(--dsw-alias-border-l2))}.aYQbCq_dagNode[data-state=blocked]{border-color:color-mix(in srgb, var(--dsw-alias-state-warn-primary) 52%, var(--dsw-alias-border-l2))}.aYQbCq_dagNode[data-state=failed]{border-color:color-mix(in srgb, var(--dsw-alias-state-error-primary) 56%, var(--dsw-alias-border-l2))}.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-border-l3);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-warn-primary)}.aYQbCq_dagNode[data-state=completed] .aYQbCq_dagNodeDot{background:var(--dsw-alias-state-success-primary)}.aYQbCq_dagNode[data-state=failed] .aYQbCq_dagNodeDot{background:var(--dsw-alias-state-error-primary)}.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-border-l2);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-button-ghost-active-fill);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-state-business-primary);color:var(--dsw-alias-label-primary-inverted)}.aYQbCq_taskDetailBadge[data-state=blocked]{background:var(--dsw-alias-state-warn-primary);color:var(--dsw-alias-label-primary-inverted)}.aYQbCq_taskDetailBadge[data-state=completed]{background:var(--dsw-alias-state-success-primary);color:var(--dsw-alias-label-primary-inverted)}.aYQbCq_taskDetailBadge[data-state=failed]{background:var(--dsw-alias-state-error-primary);color:var(--dsw-alias-label-primary-inverted)}.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_planEditor{border:1px solid color-mix(in srgb, var(--dsw-alias-state-business-primary) 30%, var(--dsw-alias-border-l2));background:color-mix(in srgb, var(--dsw-alias-bg-module-platform) 94%, var(--dsw-alias-state-business-primary));box-shadow:inset 0 1px 0 color-mix(in srgb, var(--dsw-alias-label-primary) 5%, transparent);border-radius:10px;flex-direction:column;gap:12px;margin:0 10px 12px;padding:12px;display:flex}.aYQbCq_planHeader>span{justify-content:space-between;align-items:center;gap:8px;display:flex}.aYQbCq_planHeader>span>span{flex-direction:column;gap:2px;min-width:0;display:flex}.aYQbCq_planHeader strong{color:var(--dsw-alias-label-primary);font-size:12px}.aYQbCq_planHeader small{color:var(--dsw-alias-label-secondary);font-size:9px;font-weight:500;line-height:13px}.aYQbCq_planHeader em{background:var(--dsw-alias-state-business-primary);color:var(--dsw-alias-label-primary-inverted);border-radius:999px;flex:none;padding:1px 7px;font-size:9px;font-style:normal;line-height:16px}.aYQbCq_planHeader p{color:var(--dsw-alias-label-secondary);margin:5px 0 0;font-size:10px;line-height:15px}.aYQbCq_planFlow{grid-template-columns:repeat(3,minmax(0,1fr));margin:0;padding:0;list-style:none;display:grid}.aYQbCq_planFlow li{min-width:0;color:var(--dsw-alias-label-tertiary);align-items:center;gap:5px;font-size:9px;font-weight:600;line-height:14px;display:flex;position:relative}.aYQbCq_planFlow li:not(:last-child):after{background:var(--dsw-alias-border-l2);content:\"\";flex:1;min-width:8px;height:1px;margin-right:5px}.aYQbCq_planFlow li>span{border:1px solid var(--dsw-alias-border-l2);border-radius:50%;flex:none;place-items:center;width:18px;height:18px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:9px;display:grid}.aYQbCq_planFlow li[data-active]{color:var(--dsw-alias-state-business-primary)}.aYQbCq_planFlow li[data-active]>span{border-color:var(--dsw-alias-state-business-primary);background:color-mix(in srgb, var(--dsw-alias-state-business-primary) 12%, transparent)}.aYQbCq_planSection{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-module-platform);border-radius:8px;overflow:hidden}.aYQbCq_planSectionToggle,.aYQbCq_planCardHeader{box-sizing:border-box;width:100%;color:var(--dsw-alias-label-primary);cursor:pointer;text-align:left;background:0 0;border:0}.aYQbCq_planSectionToggle{justify-content:space-between;align-items:center;gap:8px;min-height:42px;padding:7px 9px;display:flex}.aYQbCq_planSectionToggle:hover,.aYQbCq_planCardHeader:hover{background:color-mix(in srgb, var(--dsw-alias-button-ghost-active-fill) 46%, transparent)}.aYQbCq_planSectionToggle>span{align-items:baseline;gap:7px;min-width:0;display:flex}.aYQbCq_planSectionToggle strong{font-size:10.5px}.aYQbCq_planSectionToggle small{color:var(--dsw-alias-label-tertiary);font-size:9px}.aYQbCq_planList{border-top:1px solid var(--dsw-alias-border-l2);flex-direction:column;gap:0;display:flex}.aYQbCq_planEmpty{color:var(--dsw-alias-label-tertiary);text-align:center;margin:0;padding:12px;font-size:10px}.aYQbCq_planCard{background:0 0;border:0;border-radius:0;min-width:0;margin:0;padding:0;display:block;position:relative}.aYQbCq_planCard+.aYQbCq_planCard{border-top:1px solid var(--dsw-alias-border-l2)}.aYQbCq_planCard[data-open=true]{background:color-mix(in srgb, var(--dsw-alias-bg-base) 62%, transparent)}.aYQbCq_planCardHeader{grid-template-columns:minmax(80px,.9fr) minmax(72px,1.15fr) auto 12px;align-items:center;gap:7px;min-height:40px;padding:6px 9px;display:grid}.aYQbCq_planCardIdentity{flex-direction:column;gap:1px;min-width:0;display:flex}.aYQbCq_planCardIdentity strong,.aYQbCq_planTaskSummary{color:var(--dsw-alias-label-primary);text-overflow:ellipsis;white-space:nowrap;font-size:10px;font-weight:650;line-height:14px;overflow:hidden}.aYQbCq_planCardIdentity>span,.aYQbCq_planCardMeta{color:var(--dsw-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;font-size:8.5px;line-height:12px;overflow:hidden}.aYQbCq_planTaskId{background:var(--dsw-alias-button-ghost-active-fill);width:max-content;color:var(--dsw-alias-label-secondary);border-radius:4px;padding:1px 5px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:8.5px;font-weight:700;line-height:14px}.aYQbCq_planDirty{background:color-mix(in srgb, var(--dsw-alias-state-warn-primary) 13%, transparent);color:var(--dsw-alias-state-warn-primary);border-radius:999px;justify-self:end;padding:1px 5px;font-size:8px;font-style:normal;font-weight:650;line-height:14px}.aYQbCq_planChevron{color:var(--dsw-alias-label-tertiary);flex:none;transition:transform .18s cubic-bezier(.2,.7,.2,1)}.aYQbCq_planChevron[data-open=true]{transform:rotate(90deg)}.aYQbCq_planCardBody{flex-direction:column;gap:8px;padding:0 9px 9px;display:flex}.aYQbCq_planCardBody fieldset{border:0;flex-direction:column;gap:7px;min-width:0;margin:0;padding:0;display:flex}.aYQbCq_planCardBody label,.aYQbCq_planNewTask label{min-width:0;color:var(--dsw-alias-label-tertiary);flex-direction:column;flex:1;gap:4px;font-size:9px;display:flex}.aYQbCq_planCardBody label small{color:var(--dsw-alias-label-tertiary);font-size:8px;line-height:11px}.aYQbCq_planCard input,.aYQbCq_planCard textarea,.aYQbCq_planCard select,.aYQbCq_planNewTask input{box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-base);width:100%;min-width:0;color:var(--dsw-alias-label-primary);font:inherit;border-radius:6px;outline:none;font-size:10.5px;line-height:16px;transition:border-color .16s,box-shadow .16s}.aYQbCq_planCard input,.aYQbCq_planCard select,.aYQbCq_planNewTask input{min-height:32px;padding:6px 8px}.aYQbCq_planCard textarea{resize:vertical;min-height:58px;padding:7px 8px}.aYQbCq_planCard input:focus-visible,.aYQbCq_planCard textarea:focus-visible,.aYQbCq_planCard select:focus-visible,.aYQbCq_planNewTask input:focus-visible{border-color:var(--dsw-alias-state-business-primary);box-shadow:0 0 0 2px color-mix(in srgb, var(--dsw-alias-state-business-primary) 16%, transparent)}.aYQbCq_planGrid{grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:6px;display:grid}.aYQbCq_planModelPicker{grid-template-columns:minmax(0,1fr);gap:5px;display:grid}.aYQbCq_planModelMenu{width:100%;display:flex}.aYQbCq_planModelTrigger{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-base);width:100%;min-height:38px;color:var(--dsw-alias-label-primary);cursor:pointer;text-align:left;border-radius:7px;justify-content:space-between;align-items:center;gap:8px;padding:7px 9px;transition:border-color .16s,background-color .16s,transform .12s;display:flex}.aYQbCq_planModelTrigger:hover:not(:disabled){border-color:var(--dsw-alias-border-l3);background:var(--dsw-alias-interactive-bg-hover)}.aYQbCq_planModelTrigger:active:not(:disabled){transform:translateY(1px)}.aYQbCq_planModelTrigger:focus-visible{border-color:var(--dsw-alias-state-business-primary);outline:2px solid color-mix(in srgb, var(--dsw-alias-state-business-primary) 16%, transparent);outline-offset:1px}.aYQbCq_planModelTrigger:disabled{cursor:wait;opacity:.64}.aYQbCq_planModelTriggerCopy{align-items:baseline;gap:6px;min-width:0;display:flex}.aYQbCq_planModelTriggerCopy strong,.aYQbCq_planModelTriggerCopy span{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.aYQbCq_planModelTriggerCopy strong{color:var(--dsw-alias-label-primary);font-size:10px;font-weight:650;line-height:15px}.aYQbCq_planModelTriggerCopy span{color:var(--dsw-alias-label-tertiary);font-size:9px;line-height:14px}.aYQbCq_planModelMenuRow{grid-template-columns:auto minmax(0,1fr) auto;align-items:center;gap:8px;width:100%;min-width:0;display:grid}.aYQbCq_planModelMenuRow>span:first-child{color:var(--dsw-alias-label-primary)}.aYQbCq_planModelMenuRow strong{color:var(--dsw-alias-label-tertiary);text-align:right;text-overflow:ellipsis;white-space:nowrap;font-weight:450;overflow:hidden}.aYQbCq_planModelMenuBack{align-items:center;gap:7px;display:inline-flex}.aYQbCq_planModelMenuBack svg{transform:rotate(180deg)}.aYQbCq_planModelEffortRow{flex-direction:column;align-items:flex-start;min-width:0;display:flex}.aYQbCq_planModelEffortRow small{width:100%;color:var(--dsw-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;font-size:10px;line-height:14px;overflow:hidden}.aYQbCq_planModelHint{color:var(--dsw-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;font-size:8.5px;line-height:12px;overflow:hidden}.aYQbCq_planModelNotice{background:color-mix(in srgb, var(--dsw-alias-state-warn-primary) 9%, transparent);color:var(--dsw-alias-label-secondary);border-radius:6px;grid-column:1/-1;justify-content:space-between;align-items:center;gap:8px;padding:6px 7px;font-size:8.5px;line-height:12px;display:flex}.aYQbCq_planModelNotice button{color:var(--dsw-alias-state-business-primary);cursor:pointer;font:inherit;background:0 0;border:0;flex:none;padding:2px 6px;font-weight:650}.aYQbCq_planActions,.aYQbCq_planApproveRow,.aYQbCq_planNewTask,.aYQbCq_planConfirm,.aYQbCq_planApproveActions,.aYQbCq_planSecondaryActions{align-items:center;gap:7px;display:flex}.aYQbCq_planReviewActions{grid-template-columns:minmax(0,1fr);gap:6px;width:100%;display:grid}.aYQbCq_planSecondaryActions{grid-template-columns:minmax(0,1fr) auto;display:grid}.aYQbCq_planActions{justify-content:flex-end}.aYQbCq_planActions button,.aYQbCq_planNewTask button,.aYQbCq_planApproveRow button,.aYQbCq_planConfirm button{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-button-ghost-active-fill);min-height:30px;color:var(--dsw-alias-label-primary);cursor:pointer;border-radius:6px;flex:none;padding:5px 10px;font-size:9.5px;font-weight:600;transition:background .16s,border-color .16s,transform .16s}.aYQbCq_planActions button:hover:not(:disabled),.aYQbCq_planNewTask button:hover:not(:disabled),.aYQbCq_planApproveRow button:hover:not(:disabled),.aYQbCq_planConfirm button:hover:not(:disabled){border-color:var(--dsw-alias-label-tertiary)}.aYQbCq_planActions button:active:not(:disabled),.aYQbCq_planNewTask button:active:not(:disabled),.aYQbCq_planApproveRow button:active:not(:disabled),.aYQbCq_planConfirm button:active:not(:disabled){transform:scale(.98)}.aYQbCq_planActions button[data-danger],.aYQbCq_planConfirm button[data-danger]{color:var(--dsw-alias-state-error-primary)}.aYQbCq_planFeedback{min-width:0;color:var(--dsw-alias-label-secondary);flex:1;align-items:center;gap:5px;font-size:9px;line-height:13px;animation:.18s ease-out aYQbCq_plan-feedback-in;display:inline-flex}.aYQbCq_planFeedback[data-tone=success]{color:var(--dsw-alias-state-success-primary)}.aYQbCq_planFeedback[data-tone=error]{color:var(--dsw-alias-state-error-primary)}.aYQbCq_planFeedback>span{border:1px solid;border-radius:50%;flex:none;place-items:center;width:15px;height:15px;display:grid}.aYQbCq_planFeedback svg{width:11px;height:11px}@keyframes aYQbCq_plan-feedback-in{0%{opacity:0;transform:translateY(-2px)}to{opacity:1;transform:translateY(0)}}.aYQbCq_planConfirm{border:1px solid color-mix(in srgb, var(--dsw-alias-state-error-primary) 30%, var(--dsw-alias-border-l2));background:color-mix(in srgb, var(--dsw-alias-state-error-primary) 7%, transparent);border-radius:7px;flex-wrap:wrap;justify-content:flex-end;padding:7px}.aYQbCq_planConfirm>span{min-width:140px;color:var(--dsw-alias-label-secondary);flex:1;font-size:9px;line-height:13px}.aYQbCq_planNewTask{align-items:flex-end}.aYQbCq_planNewTask label{gap:4px}.aYQbCq_planNewTask label>span{line-height:13px}.aYQbCq_planApproveRow{z-index:1;border:1px solid var(--dsw-alias-border-l2);background:color-mix(in srgb, var(--dsw-alias-bg-module-platform) 94%, transparent);min-height:50px;box-shadow:0 -5px 16px color-mix(in srgb, var(--dsw-alias-bg-base) 35%, transparent);backdrop-filter:blur(8px);border-radius:8px;flex-direction:column;justify-content:flex-end;align-items:stretch;margin:0 -4px -4px;padding:8px;position:sticky;bottom:0}.aYQbCq_planApproveRow[data-armed=true]{border-color:color-mix(in srgb, var(--dsw-alias-state-business-primary) 45%, var(--dsw-alias-border-l2))}.aYQbCq_planApproveRow[data-discard=true]{border-color:color-mix(in srgb, var(--dsw-alias-state-error-primary) 45%, var(--dsw-alias-border-l2))}.aYQbCq_planApproveCopy{flex-direction:column;flex:1;gap:2px;min-width:0;display:flex}.aYQbCq_planApproveCopy strong{color:var(--dsw-alias-label-primary);font-size:9.5px;line-height:13px}.aYQbCq_planApproveCopy small{color:var(--dsw-alias-label-tertiary);font-size:8.5px;line-height:12px}.aYQbCq_planApproveRow button{background:var(--dsw-alias-state-business-primary);min-height:32px;color:var(--dsw-alias-label-primary-inverted);padding-inline:13px}.aYQbCq_planReviewActions>button[data-plan-approve]{width:100%}.aYQbCq_planApproveActions>button:first-child{background:var(--dsw-alias-button-ghost-active-fill);color:var(--dsw-alias-label-primary)}.aYQbCq_planSecondaryActions>button,.aYQbCq_planApproveActions>button[data-danger]{border-color:var(--dsw-alias-border-l2);background:var(--dsw-alias-button-ghost-active-fill);color:var(--dsw-alias-label-primary)}.aYQbCq_planSecondaryActions>button[data-danger],.aYQbCq_planApproveActions>button[data-danger]{color:var(--dsw-alias-state-error-primary)}.aYQbCq_planSectionToggle:focus-visible,.aYQbCq_planCardHeader:focus-visible,.aYQbCq_planActions button:focus-visible,.aYQbCq_planNewTask button:focus-visible,.aYQbCq_planApproveRow button:focus-visible,.aYQbCq_planConfirm button:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:-2px}.aYQbCq_planActions button:disabled,.aYQbCq_planNewTask button:disabled,.aYQbCq_planApproveRow button:disabled{cursor:default;opacity:.55}.aYQbCq_historicPill{background:var(--dsw-alias-button-ghost-active-fill);color:var(--dsw-alias-label-tertiary);border-radius:4px;flex:none;margin-left:auto;padding:1px 7px;font-size:9.5px;font-weight:600;line-height:15px}.aYQbCq_members{flex-direction:column;gap:3px;display:flex}.aYQbCq_archiveLabel{color:var(--dsw-alias-label-tertiary);padding:5px 14px 0;font-size:9.5px;font-weight:600;line-height:14px;display:block}@media (prefers-reduced-motion:reduce){.aYQbCq_panel,.aYQbCq_badge,.aYQbCq_badgeDot,.aYQbCq_panelDot,.aYQbCq_workGlyph rect,.aYQbCq_stateArt,.aYQbCq_memberAvatar[data-unread=true]:after,.aYQbCq_planChevron,.aYQbCq_planFeedback,.aYQbCq_planActions button,.aYQbCq_planNewTask button,.aYQbCq_planApproveRow button,.aYQbCq_planConfirm button,.aYQbCq_planCard input,.aYQbCq_planCard textarea,.aYQbCq_planCard select,.aYQbCq_planNewTask input{transition:none;animation:none}}@media (width<=960px){html[data-agent-teams-panel-open] [data-phase=active]{padding-right:0}}@media (width<=640px){.aYQbCq_badge{top:56px;right:10px}.aYQbCq_teamStats span[data-stat=messages]{display:none}.aYQbCq_captainNode{grid-template-columns:48px minmax(0,1fr)}.aYQbCq_captainState{display:none}.aYQbCq_delegationTree{margin-left:12px;padding-left:15px}.aYQbCq_memberBranch{width:15px}.aYQbCq_assignmentLine{padding-left:53px}.aYQbCq_planFlow li{gap:4px;font-size:8px}.aYQbCq_planFlow li:not(:last-child):after{margin-right:3px}.aYQbCq_planCardHeader{grid-template-columns:auto minmax(0,1fr) auto}.aYQbCq_planCardHeader .aYQbCq_planCardMeta{display:none}.aYQbCq_planGrid,.aYQbCq_planModelPicker{grid-template-columns:minmax(0,1fr)}.aYQbCq_planNewTask,.aYQbCq_planApproveRow{flex-direction:column;align-items:stretch}.aYQbCq_planNewTask button,.aYQbCq_planApproveRow>button,.aYQbCq_planApproveActions,.aYQbCq_planReviewActions{width:100%}.aYQbCq_planApproveActions button,.aYQbCq_planReviewActions button,.aYQbCq_planSecondaryActions button{flex:1}}@container aYQbCq_agent-team (width<=360px){.aYQbCq_planEditor{margin-inline:0;padding-inline:10px}.aYQbCq_planHeader>span{align-items:flex-start}.aYQbCq_planFlow li{gap:3px;font-size:7.5px}.aYQbCq_planFlow li:not(:last-child):after{min-width:4px;margin-right:2px}.aYQbCq_planSecondaryActions,.aYQbCq_planApproveActions{grid-template-columns:minmax(0,1fr);width:100%;display:grid}.aYQbCq_planSecondaryActions button,.aYQbCq_planApproveActions button{width:100%}}";
564
- const tagId = "@nanmicoder/dsh-agent-teams/ActivityPanel.module.css";
565
- if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId) + "]") === null) {
780
+ const css$1 = "html{--agent-teams-panel-shift:420px}html[data-agent-teams-panel-open] [data-phase=active]{box-sizing:border-box;padding-right:var(--agent-teams-panel-shift)}.aYQbCq_badge{box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2);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-bg-mask-3) 29%, transparent);color:var(--dsw-alias-label-secondary);font:inherit;cursor:pointer;border-radius:999px;align-items:center;gap:7px;padding:0 12px;font-size:12px;font-weight:600;line-height:20px;transition:border-color .15s,transform .12s;display:inline-flex;position:absolute;top:64px;right:18px}.aYQbCq_badge:hover{border-color:var(--dsw-alias-border-l3);transform:translateY(-1px)}.aYQbCq_badge:active{transform:translateY(0)scale(.98)}.aYQbCq_badge:focus-visible,.aYQbCq_iconButton:focus-visible,.aYQbCq_memberRow:focus-visible,.aYQbCq_membersToggle:focus-visible,.aYQbCq_sectionToggleTitle:focus-visible,.aYQbCq_dagNode:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:2px}.aYQbCq_badgeDot,.aYQbCq_panelDot{background:var(--dsw-alias-label-tertiary);border-radius:50%;width:7px;height:7px}.aYQbCq_badgeDot[data-busy=true],.aYQbCq_panelDot[data-busy=true]{background:var(--dsw-alias-state-business-primary);animation:1.25s ease-in-out infinite aYQbCq_agentTeamsPulse}.aYQbCq_badgeCount,.aYQbCq_memberCount,.aYQbCq_teamStats,.aYQbCq_stageLabel,.aYQbCq_taskId{font-variant-numeric:tabular-nums}.aYQbCq_panel{box-sizing:border-box;border:1px solid color-mix(in srgb, var(--dsw-alias-border-l3) 58%, transparent);background:color-mix(in srgb, var(--dsw-alias-bg-layer-1) 95%, transparent);backdrop-filter:blur(20px)saturate(1.08);box-shadow:0 12px 32px color-mix(in srgb, var(--dsw-alias-bg-mask-3) 25%, transparent), 0 32px 72px color-mix(in srgb, var(--dsw-alias-bg-mask-3) 33%, transparent);will-change:transform;border-radius:16px;flex-direction:column;animation:.16s ease-out aYQbCq_agentTeamsPanelIn;display:flex;position:absolute;top:0;left:0;overflow:hidden}.aYQbCq_panel[data-dragging],.aYQbCq_panel[data-resizing]{user-select:none;box-shadow:0 16px 38px color-mix(in srgb, var(--dsw-alias-bg-mask-3) 29%, transparent), 0 36px 78px color-mix(in srgb, var(--dsw-alias-bg-mask-3) 38%, transparent)}@keyframes aYQbCq_agentTeamsPanelIn{0%{opacity:0}to{opacity:1}}@keyframes aYQbCq_agentTeamsPulse{0%,to{opacity:.42}50%{opacity:1}}.aYQbCq_panelHead{border-bottom:1px solid var(--dsw-alias-border-l2);cursor:grab;touch-action:none;flex:none;justify-content:space-between;align-items:center;min-height:44px;padding:0 14px 0 16px;display:flex}.aYQbCq_panelHead:active,.aYQbCq_panel[data-dragging] .aYQbCq_panelHead{cursor:grabbing}.aYQbCq_panel[data-compact] .aYQbCq_panelHead{cursor:default;touch-action:auto}.aYQbCq_panelTitle{color:var(--dsw-alias-label-primary);align-items:center;gap:8px;font-size:14px;font-weight:600;line-height:20px;display:inline-flex}.aYQbCq_panelControls{flex:none;align-items:center;gap:2px;display:inline-flex}.aYQbCq_iconButton{width:28px;height:28px;color:var(--dsw-alias-label-tertiary);cursor:pointer;background:0 0;border:0;border-radius:7px;justify-content:center;align-items:center;padding:0;transition:background-color .12s,color .12s,transform .12s;display:inline-flex}.aYQbCq_iconButton:hover{background:var(--dsw-alias-button-ghost-active-fill);color:var(--dsw-alias-label-primary)}.aYQbCq_iconButton:active{transform:scale(.94)}.aYQbCq_iconButton[data-control=dock][data-mode=docked] svg{transform:scaleX(-1)}.aYQbCq_resizeHandle{z-index:5;touch-action:none;pointer-events:auto;position:absolute}.aYQbCq_resizeHandle[data-resize-edge=left]{cursor:ew-resize;width:14px;top:44px;bottom:14px;left:0}.aYQbCq_resizeHandle[data-resize-edge=left]:after{background:color-mix(in srgb, var(--dsw-alias-label-tertiary) 42%, transparent);content:\"\";opacity:.45;border-radius:999px;width:3px;height:48px;transition:background-color .12s,opacity .12s;position:absolute;top:50%;left:4px;transform:translateY(-50%)}.aYQbCq_resizeHandle[data-resize-edge=bottom]{cursor:ns-resize;height:14px;bottom:0;left:20px;right:20px}.aYQbCq_resizeHandle[data-resize-edge=bottom]:after{background:color-mix(in srgb, var(--dsw-alias-label-tertiary) 42%, transparent);content:\"\";opacity:.45;border-radius:999px;width:48px;height:3px;transition:background-color .12s,opacity .12s;position:absolute;bottom:4px;left:50%;transform:translate(-50%)}.aYQbCq_resizeHandle[data-resize-edge=corner]{cursor:nwse-resize;width:28px;height:28px;bottom:0;right:0}.aYQbCq_resizeHandle[data-resize-edge=corner]:after{border-right:2px solid var(--dsw-alias-label-tertiary);border-bottom:2px solid var(--dsw-alias-label-tertiary);content:\"\";opacity:.58;width:10px;height:10px;transition:border-color .12s,opacity .12s;position:absolute;bottom:6px;right:6px}.aYQbCq_resizeHandle:hover:after,.aYQbCq_panel[data-resizing] .aYQbCq_resizeHandle:after{background-color:var(--dsw-alias-state-business-primary);border-color:var(--dsw-alias-state-business-primary);opacity:.95}.aYQbCq_teams{overscroll-behavior:contain;scrollbar-color:color-mix(in srgb, var(--dsw-alias-label-tertiary) 28%, transparent) transparent;scrollbar-width:thin;flex-direction:column;min-height:0;display:flex;overflow-y:auto}.aYQbCq_teams::-webkit-scrollbar{width:6px}.aYQbCq_teams::-webkit-scrollbar-track{background:0 0}.aYQbCq_teams::-webkit-scrollbar-thumb{background:color-mix(in srgb, var(--dsw-alias-label-tertiary) 28%, transparent);background-clip:padding-box;border:2px solid #0000;border-radius:999px}.aYQbCq_teams:hover::-webkit-scrollbar-thumb{background:color-mix(in srgb, var(--dsw-alias-label-tertiary) 44%, transparent);background-clip:padding-box}.aYQbCq_team{border-bottom:1px solid var(--dsw-alias-border-l2);flex-direction:column;gap:12px;padding:12px 14px 16px;display:flex;container:aYQbCq_agent-team/inline-size}.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_teamStopButton{border:1px solid var(--dsw-alias-border-l2);width:26px;height:26px;color:var(--dsw-alias-label-tertiary);cursor:pointer;background:0 0;border-radius:7px;flex:none;place-items:center;padding:0;transition:border-color .15s,background .15s,color .15s;display:grid}.aYQbCq_teamStopButton:hover{border-color:color-mix(in srgb, var(--dsw-alias-state-error-primary) 42%, var(--dsw-alias-border-l2));background:color-mix(in srgb, var(--dsw-alias-state-error-primary) 7%, transparent);color:var(--dsw-alias-state-error-primary)}.aYQbCq_teamStopButton:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:2px}.aYQbCq_stopModalActions{justify-content:flex-end;gap:8px;display:flex}.aYQbCq_stopModalActions button{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-button-ghost-active-fill);min-height:34px;color:var(--dsw-alias-label-primary);cursor:pointer;font:inherit;border-radius:8px;justify-content:center;align-items:center;gap:6px;padding:6px 13px;font-size:12px;font-weight:600;display:inline-flex}.aYQbCq_stopModalActions button[data-danger]{border-color:var(--dsw-alias-state-error-primary);background:var(--dsw-alias-state-error-primary);color:var(--dsw-alias-label-primary-inverted)}.aYQbCq_stopModalActions button:disabled{cursor:wait;opacity:.58}.aYQbCq_stopModalError{background:color-mix(in srgb, var(--dsw-alias-state-error-primary) 8%, transparent);color:var(--dsw-alias-state-error-primary);border-radius:8px;align-items:flex-start;gap:7px;margin:0;padding:9px 10px;font-size:12px;line-height:18px;display:flex}.aYQbCq_stopModalError svg{flex:none;margin-top:1px}.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-border-l2));background:color-mix(in srgb, var(--dsw-alias-state-business-primary) 7%, var(--dsw-alias-bg-layer-1));border-radius:10px;grid-template-columns:48px minmax(0,1fr) auto;align-items:center;gap:9px;min-height:56px;padding:6px 10px;display:grid}.aYQbCq_captainAvatar,.aYQbCq_memberAvatar{flex:none;justify-content:center;align-items:center;display:inline-flex;position:relative}.aYQbCq_captainAvatar{width:46px;height:46px}.aYQbCq_leadAvatar,.aYQbCq_memberArt{object-fit:contain;filter:drop-shadow(0 1px 1px #122d4833);background:0 0;border:0;border-radius:0}.aYQbCq_leadAvatar{width:44px;height:44px}.aYQbCq_memberArt{width:40px;height:40px}.aYQbCq_captainInfo,.aYQbCq_memberInfo{flex-direction:column;min-width:0;display:flex}.aYQbCq_captainInfo{gap:2px}.aYQbCq_captainLine,.aYQbCq_memberLine{align-items:center;gap:6px;min-width:0;display:flex}.aYQbCq_captainName,.aYQbCq_memberName{color:var(--dsw-alias-label-primary);text-overflow:ellipsis;white-space:nowrap;font-size:12.5px;font-weight:600;line-height:18px;overflow:hidden}.aYQbCq_captainRole,.aYQbCq_memberRole{color:var(--dsw-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;font-size:10px;line-height:14px;overflow:hidden}.aYQbCq_captainSummary,.aYQbCq_memberStatusLine{color:var(--dsw-alias-label-secondary);text-overflow:ellipsis;white-space:nowrap;font-size:10.5px;line-height:15px;overflow:hidden}.aYQbCq_taskDetailModel{color:var(--dsw-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:9.5px;line-height:14px;overflow:hidden}.aYQbCq_memberModel{box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-button-ghost-active-fill);min-width:0;max-width:132px;color:var(--dsw-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;border-radius:999px;flex:0 auto;align-items:center;padding:0 6px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:9px;font-weight:600;line-height:15px;display:inline-flex;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-border-l3);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-warn-primary)}.aYQbCq_progressSegments>span[data-state=completed]{background:var(--dsw-alias-state-success-primary)}.aYQbCq_progressSegments>span[data-state=failed]{background:var(--dsw-alias-state-error-primary)}.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-warn-primary)}.aYQbCq_progressLegend>span[data-state=completed]{color:var(--dsw-alias-state-success-primary)}.aYQbCq_progressSummary{background:color-mix(in srgb, var(--dsw-alias-state-business-primary) 7%, var(--dsw-alias-bg-layer-1));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-warn-primary) 8%, var(--dsw-alias-bg-layer-1))}.aYQbCq_progressSummary[data-state=completed]{background:color-mix(in srgb, var(--dsw-alias-state-success-primary) 8%, var(--dsw-alias-bg-layer-1))}.aYQbCq_progressSummary[data-state=discarded]{background:var(--dsw-alias-button-ghost-active-fill)}.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-warn-primary)}.aYQbCq_progressSummary[data-state=completed] .aYQbCq_progressSummaryDot{background:var(--dsw-alias-state-success-primary)}.aYQbCq_progressSummary[data-state=discarded] .aYQbCq_progressSummaryDot{background:var(--dsw-alias-label-tertiary)}.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-button-ghost-active-fill)}.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-border-l2));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-border-l2));width:20px;height:1px;display:block;position:absolute;top:27px;right:100%}.aYQbCq_memberBranch:before{background:var(--dsw-alias-state-business-primary);content:\"\";border-radius:50%;width:5px;height:5px;position:absolute;top:-2px;right:-1px}.aYQbCq_memberRow{box-sizing:border-box;width:100%;min-width:0;min-height:48px;color:inherit;font:inherit;text-align:left;cursor:pointer;background:0 0;border:0;border-radius:8px;grid-template-columns:46px minmax(0,1fr) auto;align-items:center;gap:8px;padding:4px 6px;transition:background-color .12s,transform .12s;display:grid}.aYQbCq_memberRow:hover,.aYQbCq_memberRow[data-activity=working]{background:color-mix(in srgb, var(--dsw-alias-state-business-primary) 6%, var(--dsw-alias-bg-layer-1))}.aYQbCq_memberRow:active{transform:scale(.995)}.aYQbCq_memberAvatar{width:42px;height:42px}.aYQbCq_memberAvatar[data-unread=true]:after{box-sizing:border-box;border:1px solid var(--dsw-alias-bg-layer-1);background:var(--dsw-alias-state-business-primary);content:\"\";border-radius:50%;width:6px;height:6px;animation:1.8s ease-in-out infinite aYQbCq_agentTeamsUnreadPulse;position:absolute;top:0;right:-1px}@keyframes aYQbCq_agentTeamsUnreadPulse{0%,to{opacity:.78;transform:scale(.92)}50%{opacity:1;transform:scale(1.16)}}.aYQbCq_memberInitial{background:var(--dsw-alias-state-business-primary);width:34px;height:34px;color:var(--dsw-alias-label-primary-inverted);border-radius:50%;justify-content:center;align-items:center;font-size:14px;font-weight:600;line-height:20px;display:inline-flex}.aYQbCq_stateArt{box-sizing:border-box;object-fit:contain;width:22px;height:22px;filter:drop-shadow(0 0 1px var(--dsw-alias-bg-layer-1)) drop-shadow(0 1px 1px #122d483d);background:0 0;border:0;border-radius:0;position:absolute;bottom:-3px;right:-5px}.aYQbCq_stateArt[data-activity=working]{animation:2.4s ease-in-out infinite aYQbCq_agentTeamsFloat}.aYQbCq_stateArt[data-activity=idle]{animation:4.2s ease-in-out infinite aYQbCq_agentTeamsBreathe}.aYQbCq_stateArt[data-activity=unknown]{animation:2.8s ease-in-out infinite aYQbCq_agentTeamsThink}@keyframes aYQbCq_agentTeamsFloat{0%,to{transform:translateY(0)rotate(-4deg)}50%{transform:translateY(-2px)rotate(4deg)}}@keyframes aYQbCq_agentTeamsBreathe{0%,to{opacity:.82;transform:scale(1)}50%{opacity:1;transform:scale(1.06)}}@keyframes aYQbCq_agentTeamsThink{0%,to{transform:rotate(-7deg)}50%{transform:rotate(7deg)}}.aYQbCq_memberState{margin-left:auto}.aYQbCq_memberCount{color:var(--dsw-alias-label-tertiary);font-size:10.5px;line-height:16px}.aYQbCq_assignmentLine{align-items:center;gap:7px;min-width:0;padding:0 6px 0 60px;display:flex}.aYQbCq_assignmentLabel{color:var(--dsw-alias-label-tertiary);flex:none;font-size:9.5px;line-height:14px}.aYQbCq_assignmentTasks{flex-wrap:wrap;flex:1;gap:4px;min-width:0;display:flex}.aYQbCq_assignmentChip{background:var(--dsw-alias-button-ghost-active-fill);max-width:100%;min-height:16px;color:var(--dsw-alias-label-secondary);text-overflow:ellipsis;white-space:nowrap;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;overflow:hidden}.aYQbCq_assignmentChip[data-state=running]{background:var(--dsw-alias-state-business-primary);color:var(--dsw-alias-label-primary-inverted)}.aYQbCq_assignmentChip[data-state=completed]{background:var(--dsw-alias-state-success-primary);color:var(--dsw-alias-label-primary-inverted)}.aYQbCq_assignmentChip[data-state=blocked]{background:var(--dsw-alias-state-warn-primary);color:var(--dsw-alias-label-primary-inverted)}.aYQbCq_assignmentChip[data-state=failed]{background:var(--dsw-alias-state-error-primary);color:var(--dsw-alias-label-primary-inverted)}.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-border-l2);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-border-l3);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-border-l2);background:var(--dsw-alias-bg-layer-1);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-layer-1))}.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-primary) 48%, var(--dsw-alias-border-l2))}.aYQbCq_dagNode[data-state=blocked]{border-color:color-mix(in srgb, var(--dsw-alias-state-warn-primary) 52%, var(--dsw-alias-border-l2))}.aYQbCq_dagNode[data-state=failed]{border-color:color-mix(in srgb, var(--dsw-alias-state-error-primary) 56%, var(--dsw-alias-border-l2))}.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-border-l3);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-warn-primary)}.aYQbCq_dagNode[data-state=completed] .aYQbCq_dagNodeDot{background:var(--dsw-alias-state-success-primary)}.aYQbCq_dagNode[data-state=failed] .aYQbCq_dagNodeDot{background:var(--dsw-alias-state-error-primary)}.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-border-l2);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-button-ghost-active-fill);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-state-business-primary);color:var(--dsw-alias-label-primary-inverted)}.aYQbCq_taskDetailBadge[data-state=blocked]{background:var(--dsw-alias-state-warn-primary);color:var(--dsw-alias-label-primary-inverted)}.aYQbCq_taskDetailBadge[data-state=completed]{background:var(--dsw-alias-state-success-primary);color:var(--dsw-alias-label-primary-inverted)}.aYQbCq_taskDetailBadge[data-state=failed]{background:var(--dsw-alias-state-error-primary);color:var(--dsw-alias-label-primary-inverted)}.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_planEditor{border:1px solid color-mix(in srgb, var(--dsw-alias-state-business-primary) 30%, var(--dsw-alias-border-l2));background:color-mix(in srgb, var(--dsw-alias-bg-module-platform) 94%, var(--dsw-alias-state-business-primary));box-shadow:inset 0 1px 0 color-mix(in srgb, var(--dsw-alias-label-primary) 5%, transparent);border-radius:10px;flex-direction:column;gap:12px;margin:0 10px 12px;padding:12px;display:flex}.aYQbCq_planHeader>span{justify-content:space-between;align-items:center;gap:8px;display:flex}.aYQbCq_planHeader>span>span{flex-direction:column;gap:2px;min-width:0;display:flex}.aYQbCq_planHeader strong{color:var(--dsw-alias-label-primary);font-size:12px}.aYQbCq_planHeader small{color:var(--dsw-alias-label-secondary);font-size:9px;font-weight:500;line-height:13px}.aYQbCq_planHeader em{background:var(--dsw-alias-state-business-primary);color:var(--dsw-alias-label-primary-inverted);border-radius:999px;flex:none;padding:1px 7px;font-size:9px;font-style:normal;line-height:16px}.aYQbCq_planHeader p{color:var(--dsw-alias-label-secondary);margin:5px 0 0;font-size:10px;line-height:15px}.aYQbCq_planFlow{grid-template-columns:repeat(3,minmax(0,1fr));margin:0;padding:0;list-style:none;display:grid}.aYQbCq_planFlow li{min-width:0;color:var(--dsw-alias-label-tertiary);align-items:center;gap:5px;font-size:9px;font-weight:600;line-height:14px;display:flex;position:relative}.aYQbCq_planFlow li:not(:last-child):after{background:var(--dsw-alias-border-l2);content:\"\";flex:1;min-width:8px;height:1px;margin-right:5px}.aYQbCq_planFlow li>span{border:1px solid var(--dsw-alias-border-l2);border-radius:50%;flex:none;place-items:center;width:18px;height:18px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:9px;display:grid}.aYQbCq_planFlow li[data-active]{color:var(--dsw-alias-state-business-primary)}.aYQbCq_planFlow li[data-active]>span{border-color:var(--dsw-alias-state-business-primary);background:color-mix(in srgb, var(--dsw-alias-state-business-primary) 12%, transparent)}.aYQbCq_planSection{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-module-platform);border-radius:8px;overflow:hidden}.aYQbCq_planSectionToggle,.aYQbCq_planCardHeader{box-sizing:border-box;width:100%;color:var(--dsw-alias-label-primary);cursor:pointer;text-align:left;background:0 0;border:0}.aYQbCq_planSectionToggle{justify-content:space-between;align-items:center;gap:8px;min-height:42px;padding:7px 9px;display:flex}.aYQbCq_planSectionToggle:hover,.aYQbCq_planCardHeader:hover{background:color-mix(in srgb, var(--dsw-alias-button-ghost-active-fill) 46%, transparent)}.aYQbCq_planSectionToggle>span{align-items:baseline;gap:7px;min-width:0;display:flex}.aYQbCq_planSectionToggle strong{font-size:10.5px}.aYQbCq_planSectionToggle small{color:var(--dsw-alias-label-tertiary);font-size:9px}.aYQbCq_planList{border-top:1px solid var(--dsw-alias-border-l2);flex-direction:column;gap:0;display:flex}.aYQbCq_planEmpty{color:var(--dsw-alias-label-tertiary);text-align:center;margin:0;padding:12px;font-size:10px}.aYQbCq_planCard{background:0 0;border:0;border-radius:0;min-width:0;margin:0;padding:0;display:block;position:relative}.aYQbCq_planCard+.aYQbCq_planCard{border-top:1px solid var(--dsw-alias-border-l2)}.aYQbCq_planCard[data-open=true]{background:color-mix(in srgb, var(--dsw-alias-bg-base) 62%, transparent)}.aYQbCq_planCardHeader{grid-template-columns:minmax(80px,.9fr) minmax(72px,1.15fr) auto 12px;align-items:center;gap:7px;min-height:40px;padding:6px 9px;display:grid}.aYQbCq_planCardIdentity{flex-direction:column;gap:1px;min-width:0;display:flex}.aYQbCq_planCardIdentity strong,.aYQbCq_planTaskSummary{color:var(--dsw-alias-label-primary);text-overflow:ellipsis;white-space:nowrap;font-size:10px;font-weight:650;line-height:14px;overflow:hidden}.aYQbCq_planCardIdentity>span,.aYQbCq_planCardMeta{color:var(--dsw-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;font-size:8.5px;line-height:12px;overflow:hidden}.aYQbCq_planTaskId{background:var(--dsw-alias-button-ghost-active-fill);width:max-content;color:var(--dsw-alias-label-secondary);border-radius:4px;padding:1px 5px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:8.5px;font-weight:700;line-height:14px}.aYQbCq_planDirty{background:color-mix(in srgb, var(--dsw-alias-state-warn-primary) 13%, transparent);color:var(--dsw-alias-state-warn-primary);border-radius:999px;justify-self:end;padding:1px 5px;font-size:8px;font-style:normal;font-weight:650;line-height:14px}.aYQbCq_planChevron{color:var(--dsw-alias-label-tertiary);flex:none;transition:transform .18s cubic-bezier(.2,.7,.2,1)}.aYQbCq_planChevron[data-open=true]{transform:rotate(90deg)}.aYQbCq_planCardBody{flex-direction:column;gap:8px;padding:0 9px 9px;display:flex}.aYQbCq_planCardBody fieldset{border:0;flex-direction:column;gap:7px;min-width:0;margin:0;padding:0;display:flex}.aYQbCq_planCardBody label,.aYQbCq_planNewTask label{min-width:0;color:var(--dsw-alias-label-tertiary);flex-direction:column;flex:1;gap:4px;font-size:9px;display:flex}.aYQbCq_planCardBody label small{color:var(--dsw-alias-label-tertiary);font-size:8px;line-height:11px}.aYQbCq_planCard input,.aYQbCq_planCard textarea,.aYQbCq_planCard select,.aYQbCq_planNewTask input{box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-base);width:100%;min-width:0;color:var(--dsw-alias-label-primary);font:inherit;border-radius:6px;outline:none;font-size:10.5px;line-height:16px;transition:border-color .16s,box-shadow .16s}.aYQbCq_planCard input,.aYQbCq_planCard select,.aYQbCq_planNewTask input{min-height:32px;padding:6px 8px}.aYQbCq_planCard textarea{resize:vertical;min-height:58px;padding:7px 8px}.aYQbCq_planCard input:focus-visible,.aYQbCq_planCard textarea:focus-visible,.aYQbCq_planCard select:focus-visible,.aYQbCq_planNewTask input:focus-visible{border-color:var(--dsw-alias-state-business-primary);box-shadow:0 0 0 2px color-mix(in srgb, var(--dsw-alias-state-business-primary) 16%, transparent)}.aYQbCq_planGrid{grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:6px;display:grid}.aYQbCq_planModelPicker{grid-template-columns:minmax(0,1fr);gap:5px;display:grid}.aYQbCq_planModelMenu{width:100%;display:flex}.aYQbCq_planModelTrigger{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-base);width:100%;min-height:38px;color:var(--dsw-alias-label-primary);cursor:pointer;text-align:left;border-radius:7px;justify-content:space-between;align-items:center;gap:8px;padding:7px 9px;transition:border-color .16s,background-color .16s,transform .12s;display:flex}.aYQbCq_planModelTrigger:hover:not(:disabled){border-color:var(--dsw-alias-border-l3);background:var(--dsw-alias-interactive-bg-hover)}.aYQbCq_planModelTrigger:active:not(:disabled){transform:translateY(1px)}.aYQbCq_planModelTrigger:focus-visible{border-color:var(--dsw-alias-state-business-primary);outline:2px solid color-mix(in srgb, var(--dsw-alias-state-business-primary) 16%, transparent);outline-offset:1px}.aYQbCq_planModelTrigger:disabled{cursor:wait;opacity:.64}.aYQbCq_planModelTriggerCopy{align-items:baseline;gap:6px;min-width:0;display:flex}.aYQbCq_planModelTriggerCopy strong,.aYQbCq_planModelTriggerCopy span{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.aYQbCq_planModelTriggerCopy strong{color:var(--dsw-alias-label-primary);font-size:10px;font-weight:650;line-height:15px}.aYQbCq_planModelTriggerCopy span{color:var(--dsw-alias-label-tertiary);font-size:9px;line-height:14px}.aYQbCq_planModelMenuRow{grid-template-columns:auto minmax(0,1fr) auto;align-items:center;gap:8px;width:100%;min-width:0;display:grid}.aYQbCq_planModelMenuRow>span:first-child{color:var(--dsw-alias-label-primary)}.aYQbCq_planModelMenuRow strong{color:var(--dsw-alias-label-tertiary);text-align:right;text-overflow:ellipsis;white-space:nowrap;font-weight:450;overflow:hidden}.aYQbCq_planModelMenuBack{align-items:center;gap:7px;display:inline-flex}.aYQbCq_planModelMenuBack svg{transform:rotate(180deg)}.aYQbCq_planModelEffortRow{flex-direction:column;align-items:flex-start;min-width:0;display:flex}.aYQbCq_planModelEffortRow small{width:100%;color:var(--dsw-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;font-size:10px;line-height:14px;overflow:hidden}.aYQbCq_planModelHint{color:var(--dsw-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;font-size:8.5px;line-height:12px;overflow:hidden}.aYQbCq_planModelNotice{background:color-mix(in srgb, var(--dsw-alias-state-warn-primary) 9%, transparent);color:var(--dsw-alias-label-secondary);border-radius:6px;grid-column:1/-1;justify-content:space-between;align-items:center;gap:8px;padding:6px 7px;font-size:8.5px;line-height:12px;display:flex}.aYQbCq_planModelNotice button{color:var(--dsw-alias-state-business-primary);cursor:pointer;font:inherit;background:0 0;border:0;flex:none;padding:2px 6px;font-weight:650}.aYQbCq_planActions,.aYQbCq_planApproveRow,.aYQbCq_planNewTask,.aYQbCq_planConfirm,.aYQbCq_planApproveActions,.aYQbCq_planSecondaryActions{align-items:center;gap:7px;display:flex}.aYQbCq_planReviewActions{grid-template-columns:minmax(0,1fr);gap:6px;width:100%;display:grid}.aYQbCq_planSecondaryActions{grid-template-columns:minmax(0,1fr) auto;display:grid}.aYQbCq_planActions{justify-content:flex-end}.aYQbCq_planActions button,.aYQbCq_planNewTask button,.aYQbCq_planApproveRow button,.aYQbCq_planConfirm button{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-button-ghost-active-fill);min-height:30px;color:var(--dsw-alias-label-primary);cursor:pointer;border-radius:6px;flex:none;padding:5px 10px;font-size:9.5px;font-weight:600;transition:background .16s,border-color .16s,transform .16s}.aYQbCq_planActions button:hover:not(:disabled),.aYQbCq_planNewTask button:hover:not(:disabled),.aYQbCq_planApproveRow button:hover:not(:disabled),.aYQbCq_planConfirm button:hover:not(:disabled){border-color:var(--dsw-alias-label-tertiary)}.aYQbCq_planActions button:active:not(:disabled),.aYQbCq_planNewTask button:active:not(:disabled),.aYQbCq_planApproveRow button:active:not(:disabled),.aYQbCq_planConfirm button:active:not(:disabled){transform:scale(.98)}.aYQbCq_planActions button[data-danger],.aYQbCq_planConfirm button[data-danger]{color:var(--dsw-alias-state-error-primary)}.aYQbCq_planFeedback{min-width:0;color:var(--dsw-alias-label-secondary);flex:1;align-items:center;gap:5px;font-size:9px;line-height:13px;animation:.18s ease-out aYQbCq_plan-feedback-in;display:inline-flex}.aYQbCq_planFeedback[data-tone=success]{color:var(--dsw-alias-state-success-primary)}.aYQbCq_planFeedback[data-tone=error]{color:var(--dsw-alias-state-error-primary)}.aYQbCq_planFeedback>span{border:1px solid;border-radius:50%;flex:none;place-items:center;width:15px;height:15px;display:grid}.aYQbCq_planFeedback svg{width:11px;height:11px}@keyframes aYQbCq_plan-feedback-in{0%{opacity:0;transform:translateY(-2px)}to{opacity:1;transform:translateY(0)}}.aYQbCq_planConfirm{border:1px solid color-mix(in srgb, var(--dsw-alias-state-error-primary) 30%, var(--dsw-alias-border-l2));background:color-mix(in srgb, var(--dsw-alias-state-error-primary) 7%, transparent);border-radius:7px;flex-wrap:wrap;justify-content:flex-end;padding:7px}.aYQbCq_planConfirm>span{min-width:140px;color:var(--dsw-alias-label-secondary);flex:1;font-size:9px;line-height:13px}.aYQbCq_planNewTask{align-items:flex-end}.aYQbCq_planNewTask label{gap:4px}.aYQbCq_planNewTask label>span{line-height:13px}.aYQbCq_planApproveRow{z-index:1;border:1px solid var(--dsw-alias-border-l2);background:color-mix(in srgb, var(--dsw-alias-bg-module-platform) 94%, transparent);min-height:50px;box-shadow:0 -5px 16px color-mix(in srgb, var(--dsw-alias-bg-base) 35%, transparent);backdrop-filter:blur(8px);border-radius:8px;flex-direction:column;justify-content:flex-end;align-items:stretch;margin:0 -4px -4px;padding:8px;position:sticky;bottom:0}.aYQbCq_planApproveRow[data-armed=true]{border-color:color-mix(in srgb, var(--dsw-alias-state-business-primary) 45%, var(--dsw-alias-border-l2))}.aYQbCq_planApproveRow[data-discard=true]{border-color:color-mix(in srgb, var(--dsw-alias-state-error-primary) 45%, var(--dsw-alias-border-l2))}.aYQbCq_planApproveCopy{flex-direction:column;flex:1;gap:2px;min-width:0;display:flex}.aYQbCq_planApproveCopy strong{color:var(--dsw-alias-label-primary);font-size:9.5px;line-height:13px}.aYQbCq_planApproveCopy small{color:var(--dsw-alias-label-tertiary);font-size:8.5px;line-height:12px}.aYQbCq_planApproveRow button{background:var(--dsw-alias-state-business-primary);min-height:32px;color:var(--dsw-alias-label-primary-inverted);padding-inline:13px}.aYQbCq_planReviewActions>button[data-plan-approve]{width:100%}.aYQbCq_planApproveActions>button:first-child{background:var(--dsw-alias-button-ghost-active-fill);color:var(--dsw-alias-label-primary)}.aYQbCq_planSecondaryActions>button,.aYQbCq_planApproveActions>button[data-danger]{border-color:var(--dsw-alias-border-l2);background:var(--dsw-alias-button-ghost-active-fill);color:var(--dsw-alias-label-primary)}.aYQbCq_planSecondaryActions>button[data-danger],.aYQbCq_planApproveActions>button[data-danger]{color:var(--dsw-alias-state-error-primary)}.aYQbCq_planSectionToggle:focus-visible,.aYQbCq_planCardHeader:focus-visible,.aYQbCq_planActions button:focus-visible,.aYQbCq_planNewTask button:focus-visible,.aYQbCq_planApproveRow button:focus-visible,.aYQbCq_planConfirm button:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:-2px}.aYQbCq_planActions button:disabled,.aYQbCq_planNewTask button:disabled,.aYQbCq_planApproveRow button:disabled{cursor:default;opacity:.55}.aYQbCq_historicPill{background:var(--dsw-alias-button-ghost-active-fill);color:var(--dsw-alias-label-tertiary);border-radius:4px;flex:none;margin-left:auto;padding:1px 7px;font-size:9.5px;font-weight:600;line-height:15px}.aYQbCq_members{flex-direction:column;gap:3px;display:flex}.aYQbCq_archiveLabel{color:var(--dsw-alias-label-tertiary);padding:5px 14px 0;font-size:9.5px;font-weight:600;line-height:14px;display:block}@media (prefers-reduced-motion:reduce){.aYQbCq_panel,.aYQbCq_badge,.aYQbCq_badgeDot,.aYQbCq_panelDot,.aYQbCq_workGlyph rect,.aYQbCq_stateArt,.aYQbCq_memberAvatar[data-unread=true]:after,.aYQbCq_planChevron,.aYQbCq_planFeedback,.aYQbCq_planActions button,.aYQbCq_planNewTask button,.aYQbCq_planApproveRow button,.aYQbCq_planConfirm button,.aYQbCq_planCard input,.aYQbCq_planCard textarea,.aYQbCq_planCard select,.aYQbCq_planNewTask input{transition:none;animation:none}}@media (width<=960px){html[data-agent-teams-panel-open] [data-phase=active]{padding-right:0}}@media (width<=640px){.aYQbCq_badge{top:56px;right:10px}.aYQbCq_teamStats span[data-stat=messages]{display:none}.aYQbCq_captainNode{grid-template-columns:48px minmax(0,1fr)}.aYQbCq_captainState{display:none}.aYQbCq_delegationTree{margin-left:12px;padding-left:15px}.aYQbCq_memberBranch{width:15px}.aYQbCq_assignmentLine{padding-left:53px}.aYQbCq_planFlow li{gap:4px;font-size:8px}.aYQbCq_planFlow li:not(:last-child):after{margin-right:3px}.aYQbCq_planCardHeader{grid-template-columns:auto minmax(0,1fr) auto}.aYQbCq_planCardHeader .aYQbCq_planCardMeta{display:none}.aYQbCq_planGrid,.aYQbCq_planModelPicker{grid-template-columns:minmax(0,1fr)}.aYQbCq_planNewTask,.aYQbCq_planApproveRow{flex-direction:column;align-items:stretch}.aYQbCq_planNewTask button,.aYQbCq_planApproveRow>button,.aYQbCq_planApproveActions,.aYQbCq_planReviewActions{width:100%}.aYQbCq_planApproveActions button,.aYQbCq_planReviewActions button,.aYQbCq_planSecondaryActions button{flex:1}}@container aYQbCq_agent-team (width<=360px){.aYQbCq_planEditor{margin-inline:0;padding-inline:10px}.aYQbCq_planHeader>span{align-items:flex-start}.aYQbCq_planFlow li{gap:3px;font-size:7.5px}.aYQbCq_planFlow li:not(:last-child):after{min-width:4px;margin-right:2px}.aYQbCq_planSecondaryActions,.aYQbCq_planApproveActions{grid-template-columns:minmax(0,1fr);width:100%;display:grid}.aYQbCq_planSecondaryActions button,.aYQbCq_planApproveActions button{width:100%}}.aYQbCq_dagOwner{text-overflow:ellipsis;max-width:64px;margin-left:auto;font-size:9px;font-weight:400;overflow:hidden}.aYQbCq_team[data-workspace-team]{background:0 0;border:0;padding:0;container:none}.aYQbCq_team[data-workspace-team] .aYQbCq_teamHead{flex-wrap:wrap;gap:8px;padding-bottom:18px}.aYQbCq_team[data-workspace-team] .aYQbCq_teamName{font-size:15px}.aYQbCq_team[data-workspace-team] .aYQbCq_teamStats{flex-wrap:wrap}.aYQbCq_team[data-workspace-team] .aYQbCq_delegationSection,.aYQbCq_team[data-workspace-team] .aYQbCq_dependencySection{min-width:0}.aYQbCq_team[data-workspace-team] .aYQbCq_dagNodeLabel{white-space:normal;-webkit-line-clamp:2;-webkit-box-orient:vertical;line-height:1.4;display:-webkit-box;overflow:hidden}.aYQbCq_team[data-workspace-team] .aYQbCq_sectionHead{flex-wrap:wrap;gap:6px}.aYQbCq_team[data-workspace-team] .aYQbCq_sectionHint{white-space:normal}.aYQbCq_team[data-workspace-team] .aYQbCq_memberLine{flex-wrap:wrap}.aYQbCq_team[data-workspace-team] .aYQbCq_memberStatusLine,.aYQbCq_team[data-workspace-team] .aYQbCq_taskDetailSubject{white-space:normal}.aYQbCq_team[data-workspace-team] .aYQbCq_dagViewport{padding-bottom:12px}@container (width>=1000px){.aYQbCq_team[data-workspace-team]{grid-template-columns:minmax(260px,.85fr) minmax(0,1.35fr);align-items:start;column-gap:32px;display:grid}.aYQbCq_team[data-workspace-team]>.aYQbCq_teamHead,.aYQbCq_team[data-workspace-team]>:not(.aYQbCq_teamHead):not(.aYQbCq_delegationSection):not(.aYQbCq_dependencySection){grid-column:1/-1}.aYQbCq_team[data-workspace-team] .aYQbCq_dependencySection{border-top:0;border-left:1px solid var(--dsw-alias-border-l2);margin:0;padding:0 0 0 28px}.aYQbCq_team[data-workspace-team] .aYQbCq_captainNode{padding-top:0}.aYQbCq_team[data-workspace-team] .aYQbCq_dagCanvas[data-layout=parallel]{grid-template-columns:repeat(2,minmax(0,1fr))}}.aYQbCq_team[data-workspace-team] .aYQbCq_dagNode{border-radius:9px;padding:10px 11px}.aYQbCq_team[data-workspace-team] .aYQbCq_dagNodeHead{margin-bottom:7px;font-size:10px}.aYQbCq_team[data-workspace-team] .aYQbCq_dagNodeLabel{letter-spacing:0;font-size:12px}.aYQbCq_team[data-workspace-team] .aYQbCq_dagOwner{font-size:10px}.aYQbCq_team[data-workspace-team] .aYQbCq_taskDetail{margin-top:14px;padding:14px}.aYQbCq_team[data-workspace-team] .aYQbCq_captainName{font-size:14px}.aYQbCq_team[data-workspace-team] .aYQbCq_captainRole{font-size:11px}.aYQbCq_team[data-workspace-team] .aYQbCq_captainSummary{font-size:12px;line-height:1.6}.aYQbCq_team[data-workspace-team] .aYQbCq_captainState{font-size:11px}.aYQbCq_team[data-workspace-team] .aYQbCq_memberName{font-size:13px}.aYQbCq_team[data-workspace-team] .aYQbCq_memberRole,.aYQbCq_team[data-workspace-team] .aYQbCq_memberState,.aYQbCq_team[data-workspace-team] .aYQbCq_memberCount{font-size:11px}.aYQbCq_team[data-workspace-team] .aYQbCq_memberStatusLine{font-size:12px;line-height:1.6}.aYQbCq_team[data-workspace-team] .aYQbCq_taskDetailSubject{font-size:13px;line-height:1.6}.aYQbCq_team[data-workspace-team] .aYQbCq_taskDetailLine,.aYQbCq_team[data-workspace-team] .aYQbCq_taskDetailMeta{font-size:12px;line-height:1.6}.aYQbCq_team[data-workspace-team] .aYQbCq_captainNode{background:var(--dsw-alias-bg-module-platform);border-color:var(--dsw-alias-border-l2)}.aYQbCq_team[data-workspace-team] .aYQbCq_planEditor{border-color:var(--dsw-alias-border-l2);background:0 0;margin:0 0 24px;padding:16px}@container (width>=1000px){.aYQbCq_team[data-workspace-team]:has(>[data-staging-editor]){grid-template-columns:minmax(0,1fr) minmax(0,1fr)}.aYQbCq_team[data-workspace-team]>[data-staging-editor]{grid-row:2/4;grid-column:1!important}.aYQbCq_team[data-workspace-team]:has(>[data-staging-editor])>.aYQbCq_delegationSection{grid-area:2/2}.aYQbCq_team[data-workspace-team]:has(>[data-staging-editor])>.aYQbCq_dependencySection{border-left:0;grid-area:3/2;padding:24px 0 0}}.aYQbCq_team[data-workspace-team] .aYQbCq_memberBlock[data-selected-member] .aYQbCq_memberRow{outline:1px solid var(--dsw-alias-state-business-primary);outline-offset:3px}.aYQbCq_team[data-workspace-team] .aYQbCq_dagOwner{white-space:nowrap;max-width:105px}.aYQbCq_team[data-workspace-team] .aYQbCq_planApproveRow{position:static}";
781
+ const tagId$1 = "@nanmicoder/dsh-agent-teams/ActivityPanel.module.css";
782
+ if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$1) + "]") === null) {
566
783
  const tag = document.createElement("style");
567
784
  tag.dataset.plugin = "@nanmicoder/dsh-agent-teams";
568
- tag.dataset.pluginCss = tagId;
569
- tag.textContent = css;
785
+ tag.dataset.pluginCss = tagId$1;
786
+ tag.textContent = css$1;
570
787
  document.head.appendChild(tag);
571
788
  }
572
789
  var ActivityPanel_module_css_default = {
@@ -601,6 +818,7 @@ window.__ModuleLoader__.load({
601
818
  "dagNodeDot": "aYQbCq_dagNodeDot",
602
819
  "dagNodeHead": "aYQbCq_dagNodeHead",
603
820
  "dagNodeLabel": "aYQbCq_dagNodeLabel",
821
+ "dagOwner": "aYQbCq_dagOwner",
604
822
  "dagRunningState": "aYQbCq_dagRunningState",
605
823
  "dagViewport": "aYQbCq_dagViewport",
606
824
  "delegationSection": "aYQbCq_delegationSection",
@@ -2074,6 +2292,8 @@ window.__ModuleLoader__.load({
2074
2292
  }
2075
2293
  if (member.total === 0) return t("member.status.waitingAssignment");
2076
2294
  if (member.done === member.total) return t("member.status.delivered");
2295
+ if (owned.some((task) => task.status === "failed")) return t("task.detail.failed");
2296
+ if (owned.length > 0 && owned.every((task) => task.status === "completed" || task.status === "cancelled")) return t("member.status.settled");
2077
2297
  return t(member.activity === "idle" ? "member.status.idle" : "member.status.unknown");
2078
2298
  }
2079
2299
  function compactTaskLabel(subject) {
@@ -2112,7 +2332,7 @@ window.__ModuleLoader__.load({
2112
2332
  const blocked = discarded ? 0 : team.tasks.filter((task) => task.state === "blocked").length;
2113
2333
  const completed = discarded ? 0 : team.tasks.filter((task) => task.status === "completed").length;
2114
2334
  const settled = !discarded && team.tasks.length > 0 && team.tasks.every((task) => task.status === "completed" || task.status === "failed" || task.status === "cancelled");
2115
- const summaryTone = discarded ? "discarded" : blocked > 0 ? "warning" : settled ? "completed" : "running";
2335
+ const summaryTone = discarded ? "discarded" : blocked > 0 || team.tasks.some((task) => task.status === "failed" || task.status === "cancelled") ? "warning" : settled ? "completed" : "running";
2116
2336
  return (0, react_jsx_runtime.jsxs)("section", {
2117
2337
  className: ActivityPanel_module_css_default.progressOverview,
2118
2338
  "aria-label": t("progress.aria"),
@@ -2152,14 +2372,21 @@ window.__ModuleLoader__.load({
2152
2372
  ]
2153
2373
  });
2154
2374
  }
2155
- function DependencyMap({ tasks, members, t, discarded = false }) {
2375
+ function DependencyMap({ tasks, members, t, discarded = false, workspace = false, onSelectTask }) {
2156
2376
  const [open, setOpen] = (0, react.useState)(true);
2157
2377
  const [hoverTaskId, setHoverTaskId] = (0, react.useState)(null);
2158
2378
  const [keyboardTaskId, setKeyboardTaskId] = (0, react.useState)(null);
2159
2379
  const [pinnedTaskId, setPinnedTaskId] = (0, react.useState)(null);
2160
2380
  const hoverTimer = (0, react.useRef)(null);
2161
2381
  const focusedTaskId = dependencyFocusTaskId(pinnedTaskId, keyboardTaskId, hoverTaskId);
2162
- const layout = (0, react.useMemo)(() => compactDagLayout(tasks), [tasks]);
2382
+ const nodeWidth = workspace ? 164 : 92;
2383
+ const nodeHeight = workspace ? 76 : 30;
2384
+ const layout = (0, react.useMemo)(() => compactDagLayout(tasks, workspace ? {
2385
+ nodeWidth: 164,
2386
+ nodeHeight: 76,
2387
+ columnGap: 36,
2388
+ rowGap: 16
2389
+ } : void 0), [tasks, workspace]);
2163
2390
  const parallel = (0, react.useMemo)(() => usesParallelTaskGrid(tasks), [tasks]);
2164
2391
  const related = (0, react.useMemo)(() => focusedTaskId === null ? null : relatedTaskIds(focusedTaskId, tasks), [focusedTaskId, tasks]);
2165
2392
  const scheduleHover = (id) => {
@@ -2181,13 +2408,16 @@ window.__ModuleLoader__.load({
2181
2408
  }, []);
2182
2409
  (0, react.useEffect)(() => {
2183
2410
  const onKeyDown = (event) => {
2184
- if (event.key === "Escape") setPinnedTaskId(null);
2411
+ if (event.key === "Escape") {
2412
+ setPinnedTaskId(null);
2413
+ onSelectTask?.(null);
2414
+ }
2185
2415
  };
2186
2416
  window.addEventListener("keydown", onKeyDown);
2187
2417
  return () => {
2188
2418
  window.removeEventListener("keydown", onKeyDown);
2189
2419
  };
2190
- }, []);
2420
+ }, [onSelectTask]);
2191
2421
  if (tasks.length === 0) return null;
2192
2422
  const fallbackTask = tasks.find((task) => task.state === "blocked") ?? tasks.find((task) => task.state === "running") ?? tasks[0];
2193
2423
  const detailTask = tasks.find((task) => task.id === focusedTaskId) ?? fallbackTask;
@@ -2209,13 +2439,13 @@ window.__ModuleLoader__.load({
2209
2439
  "aria-expanded": open,
2210
2440
  children: [
2211
2441
  (0, react_jsx_runtime.jsx)(Chevron, { open }),
2212
- (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconBranchOutline16, {}),
2442
+ (0, react_jsx_runtime.jsx)(IconBranchOutline16, {}),
2213
2443
  " ",
2214
2444
  t(parallel ? "dependency.parallel" : "dependency.title")
2215
2445
  ]
2216
2446
  }), (0, react_jsx_runtime.jsx)("span", {
2217
2447
  className: ActivityPanel_module_css_default.sectionHint,
2218
- children: pinnedTaskId === null ? t(parallel ? "dependency.hint.parallel" : "dependency.hint.chain") : t("dependency.hint.pinned", { taskId: pinnedTaskId })
2448
+ children: pinnedTaskId === null ? t(parallel ? "dependency.hint.parallel" : workspace ? "workspace.dependencies" : "dependency.hint.chain") : t("dependency.hint.pinned", { taskId: pinnedTaskId })
2219
2449
  })]
2220
2450
  }), open && (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [(0, react_jsx_runtime.jsx)("div", {
2221
2451
  className: ActivityPanel_module_css_default.dagViewport,
@@ -2241,15 +2471,14 @@ window.__ModuleLoader__.load({
2241
2471
  })
2242
2472
  }), layout.nodes.map(({ task, x, y }) => {
2243
2473
  const model = taskModelLabel(task, members);
2244
- const shortModel = compactModelLabel(model);
2245
2474
  return (0, react_jsx_runtime.jsxs)("button", {
2246
2475
  type: "button",
2247
2476
  className: ActivityPanel_module_css_default.dagNode,
2248
- style: parallel ? { height: 30 } : {
2477
+ style: parallel ? { height: nodeHeight } : {
2249
2478
  left: x,
2250
2479
  top: y,
2251
- width: 92,
2252
- height: 30
2480
+ width: nodeWidth,
2481
+ height: nodeHeight
2253
2482
  },
2254
2483
  "data-task-id": task.id,
2255
2484
  "data-state": discarded ? "cancelled" : taskTone(task.state, task.status),
@@ -2259,7 +2488,9 @@ window.__ModuleLoader__.load({
2259
2488
  "aria-pressed": pinnedTaskId === task.id,
2260
2489
  title: taskTitle(task, model),
2261
2490
  onClick: () => {
2262
- setPinnedTaskId((current) => current === task.id ? null : task.id);
2491
+ const next = pinnedTaskId === task.id ? null : task.id;
2492
+ setPinnedTaskId(next);
2493
+ onSelectTask?.(next);
2263
2494
  },
2264
2495
  onMouseEnter: () => {
2265
2496
  scheduleHover(task.id);
@@ -2276,11 +2507,18 @@ window.__ModuleLoader__.load({
2276
2507
  children: [
2277
2508
  (0, react_jsx_runtime.jsxs)("span", {
2278
2509
  className: ActivityPanel_module_css_default.dagNodeHead,
2279
- children: [(0, react_jsx_runtime.jsx)("span", { className: ActivityPanel_module_css_default.dagNodeDot }), task.id]
2510
+ children: [
2511
+ (0, react_jsx_runtime.jsx)("span", { className: ActivityPanel_module_css_default.dagNodeDot }),
2512
+ task.id,
2513
+ workspace && (0, react_jsx_runtime.jsx)("span", {
2514
+ className: ActivityPanel_module_css_default.dagOwner,
2515
+ children: task.assignee || t("task.assignee.unclaimed")
2516
+ })
2517
+ ]
2280
2518
  }),
2281
2519
  (0, react_jsx_runtime.jsx)("span", {
2282
2520
  className: ActivityPanel_module_css_default.dagNodeLabel,
2283
- children: task.state === "running" && shortModel !== "" ? shortModel : compactTaskLabel(task.subject)
2521
+ children: workspace ? task.subject : compactTaskLabel(task.subject)
2284
2522
  }),
2285
2523
  task.state === "running" && (0, react_jsx_runtime.jsx)("span", {
2286
2524
  className: ActivityPanel_module_css_default.dagRunningState,
@@ -2319,7 +2557,7 @@ window.__ModuleLoader__.load({
2319
2557
  children: [
2320
2558
  detailTask.assignee || t("task.assignee.unclaimed"),
2321
2559
  " · ",
2322
- discarded ? t("task.detail.notRun") : detailTask.status === "completed" ? t("task.detail.completed") : detailTask.dependencies.length === 0 ? t("task.detail.noPrerequisite") : waitingOn.length === 0 ? t("task.detail.ready") : t("task.detail.waitingOn", { tasks: formatTaskIds(waitingOn, t) })
2560
+ discarded ? t("task.detail.notRun") : detailTask.status === "completed" ? t("task.detail.completed") : detailTask.status === "cancelled" ? t("task.detail.cancelled") : detailTask.status === "failed" ? t("task.detail.failed") : detailTask.dependencies.length === 0 ? t("task.detail.noPrerequisite") : waitingOn.length === 0 ? t("task.detail.ready") : t("task.detail.waitingOn", { tasks: formatTaskIds(waitingOn, t) })
2323
2561
  ]
2324
2562
  }),
2325
2563
  detailModel !== "" && (0, react_jsx_runtime.jsx)("span", {
@@ -2335,8 +2573,10 @@ window.__ModuleLoader__.load({
2335
2573
  })] })]
2336
2574
  });
2337
2575
  }
2338
- function TeamSection({ team, modelDirectory, onContinuePlanning, onDiscarded, onNavigate, t, historic = false }) {
2339
- const [membersOpen, setMembersOpen] = (0, react.useState)(true);
2576
+ function TeamSection({ team, modelDirectory, onContinuePlanning, onDiscarded, onNavigate, t, historic = false, workspace = false }) {
2577
+ const [selectedTaskId, setSelectedTaskId] = (0, react.useState)(null);
2578
+ const selectedAssignee = team.tasks.find((task) => task.id === selectedTaskId)?.assignee;
2579
+ const [membersOpen, setMembersOpen] = (0, react.useState)(workspace);
2340
2580
  const [stopOpen, setStopOpen] = (0, react.useState)(false);
2341
2581
  const [stopping, setStopping] = (0, react.useState)(false);
2342
2582
  const [stopError, setStopError] = (0, react.useState)("");
@@ -2384,6 +2624,7 @@ window.__ModuleLoader__.load({
2384
2624
  return (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [(0, react_jsx_runtime.jsxs)("section", {
2385
2625
  className: ActivityPanel_module_css_default.team,
2386
2626
  "data-team-id": team.teamId,
2627
+ "data-workspace-team": workspace || void 0,
2387
2628
  children: [
2388
2629
  (0, react_jsx_runtime.jsxs)("header", {
2389
2630
  className: ActivityPanel_module_css_default.teamHead,
@@ -2430,7 +2671,7 @@ window.__ModuleLoader__.load({
2430
2671
  setStopError("");
2431
2672
  setStopOpen(true);
2432
2673
  },
2433
- children: (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconStopFill16, {})
2674
+ children: (0, react_jsx_runtime.jsx)(IconStopFill16, {})
2434
2675
  })
2435
2676
  ]
2436
2677
  }),
@@ -2498,137 +2739,146 @@ window.__ModuleLoader__.load({
2498
2739
  t,
2499
2740
  discarded
2500
2741
  }),
2501
- (0, react_jsx_runtime.jsxs)("button", {
2502
- type: "button",
2503
- className: ActivityPanel_module_css_default.membersToggle,
2504
- onClick: () => {
2505
- setMembersOpen((current) => !current);
2506
- },
2507
- "aria-expanded": membersOpen,
2508
- "data-members-toggle": true,
2509
- children: [(0, react_jsx_runtime.jsxs)("span", { children: [(0, react_jsx_runtime.jsx)(Chevron, { open: membersOpen }), t("members.toggle", { count: team.members.length })] }), (0, react_jsx_runtime.jsx)("span", { children: t(membersOpen ? "members.collapse" : "members.expand") })]
2510
- }),
2511
- membersOpen && (0, react_jsx_runtime.jsxs)("div", {
2512
- className: ActivityPanel_module_css_default.delegationTree,
2513
- children: [team.members.length === 0 && (0, react_jsx_runtime.jsx)("span", {
2514
- className: ActivityPanel_module_css_default.emptyHint,
2515
- children: t("members.empty")
2516
- }), team.members.map((member) => {
2517
- const owned = team.tasks.filter((task) => task.assignee === member.name);
2518
- const memberModel = memberRouteLabel(member);
2519
- return (0, react_jsx_runtime.jsxs)("div", {
2520
- className: ActivityPanel_module_css_default.memberBlock,
2521
- "data-activity": member.activity,
2522
- children: [
2523
- (0, react_jsx_runtime.jsx)("span", {
2524
- className: ActivityPanel_module_css_default.memberBranch,
2525
- "aria-hidden": true,
2526
- children: (0, react_jsx_runtime.jsx)("span", {})
2527
- }),
2528
- (0, react_jsx_runtime.jsxs)("button", {
2529
- type: "button",
2530
- className: ActivityPanel_module_css_default.memberRow,
2531
- "data-activity": member.activity,
2532
- onClick: () => {
2533
- if (member.id !== "") onNavigate(team.captainSessionId, member.id);
2534
- },
2535
- children: [
2536
- (0, react_jsx_runtime.jsxs)("span", {
2537
- className: ActivityPanel_module_css_default.memberAvatar,
2538
- "data-unread": member.unread > 0,
2539
- children: [memberArtUrl(member.name, member.role) !== null ? (0, react_jsx_runtime.jsx)("img", {
2540
- className: ActivityPanel_module_css_default.memberArt,
2541
- src: memberArtUrl(member.name, member.role) ?? "",
2542
- alt: "",
2543
- "aria-hidden": true
2544
- }) : (0, react_jsx_runtime.jsx)("span", {
2545
- className: ActivityPanel_module_css_default.memberInitial,
2546
- style: { background: accentOf(member.id) },
2547
- children: memberInitial(member.name)
2548
- }), (0, react_jsx_runtime.jsx)("img", {
2549
- className: ActivityPanel_module_css_default.stateArt,
2550
- "data-activity": member.activity,
2551
- src: ACTION_ART[member.activity],
2552
- alt: "",
2553
- "aria-hidden": true
2554
- })]
2555
- }),
2556
- (0, react_jsx_runtime.jsxs)("span", {
2557
- className: ActivityPanel_module_css_default.memberInfo,
2558
- children: [(0, react_jsx_runtime.jsxs)("span", {
2559
- className: ActivityPanel_module_css_default.memberLine,
2742
+ (() => {
2743
+ const orderedMembers = orderDelegationMembers(team.members, team.tasks);
2744
+ const runningMembers = orderedMembers.filter((member) => member.activity === "working" || member.status === "working" || team.tasks.some((task) => task.assignee === member.name && (task.status === "pending" || task.status === "claimed" || task.status === "in_progress")));
2745
+ const visibleMembers = membersOpen ? orderedMembers : runningMembers;
2746
+ const hiddenFinishedCount = orderedMembers.length - visibleMembers.length;
2747
+ const expandLabel = membersOpen ? t("members.collapse") : hiddenFinishedCount > 0 ? t("members.expandFinished", { count: hiddenFinishedCount }) : t("members.expand");
2748
+ return (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [(0, react_jsx_runtime.jsxs)("button", {
2749
+ type: "button",
2750
+ className: ActivityPanel_module_css_default.membersToggle,
2751
+ onClick: () => {
2752
+ setMembersOpen((current) => !current);
2753
+ },
2754
+ "aria-expanded": membersOpen,
2755
+ "data-members-toggle": true,
2756
+ children: [(0, react_jsx_runtime.jsxs)("span", { children: [(0, react_jsx_runtime.jsx)(Chevron, { open: membersOpen }), t("members.toggle", { count: team.members.length })] }), (0, react_jsx_runtime.jsx)("span", { children: expandLabel })]
2757
+ }), (membersOpen || visibleMembers.length > 0) && (0, react_jsx_runtime.jsxs)("div", {
2758
+ className: ActivityPanel_module_css_default.delegationTree,
2759
+ children: [team.members.length === 0 && (0, react_jsx_runtime.jsx)("span", {
2760
+ className: ActivityPanel_module_css_default.emptyHint,
2761
+ children: t("members.empty")
2762
+ }), visibleMembers.map((member) => {
2763
+ const owned = team.tasks.filter((task) => task.assignee === member.name);
2764
+ const memberModel = memberRouteLabel(member);
2765
+ return (0, react_jsx_runtime.jsxs)("div", {
2766
+ className: ActivityPanel_module_css_default.memberBlock,
2767
+ "data-activity": member.activity,
2768
+ "data-selected-member": workspace && selectedAssignee === member.name || void 0,
2769
+ children: [
2770
+ (0, react_jsx_runtime.jsx)("span", {
2771
+ className: ActivityPanel_module_css_default.memberBranch,
2772
+ "aria-hidden": true,
2773
+ children: (0, react_jsx_runtime.jsx)("span", {})
2774
+ }),
2775
+ (0, react_jsx_runtime.jsxs)("button", {
2776
+ type: "button",
2777
+ className: ActivityPanel_module_css_default.memberRow,
2778
+ "data-activity": member.activity,
2779
+ onClick: () => {
2780
+ if (member.id !== "") onNavigate(team.captainSessionId, member.id);
2781
+ },
2782
+ children: [
2783
+ (0, react_jsx_runtime.jsxs)("span", {
2784
+ className: ActivityPanel_module_css_default.memberAvatar,
2785
+ "data-unread": member.unread > 0,
2786
+ children: [memberArtUrl(member.name, member.role) !== null ? (0, react_jsx_runtime.jsx)("img", {
2787
+ className: ActivityPanel_module_css_default.memberArt,
2788
+ src: memberArtUrl(member.name, member.role) ?? "",
2789
+ alt: "",
2790
+ "aria-hidden": true
2791
+ }) : (0, react_jsx_runtime.jsx)("span", {
2792
+ className: ActivityPanel_module_css_default.memberInitial,
2793
+ style: { background: accentOf(member.id) },
2794
+ children: memberInitial(member.name)
2795
+ }), (0, react_jsx_runtime.jsx)("img", {
2796
+ className: ActivityPanel_module_css_default.stateArt,
2797
+ "data-activity": member.activity,
2798
+ src: ACTION_ART[member.activity],
2799
+ alt: "",
2800
+ "aria-hidden": true
2801
+ })]
2802
+ }),
2803
+ (0, react_jsx_runtime.jsxs)("span", {
2804
+ className: ActivityPanel_module_css_default.memberInfo,
2805
+ children: [(0, react_jsx_runtime.jsxs)("span", {
2806
+ className: ActivityPanel_module_css_default.memberLine,
2807
+ children: [
2808
+ (0, react_jsx_runtime.jsx)("span", {
2809
+ className: ActivityPanel_module_css_default.memberName,
2810
+ children: member.name
2811
+ }),
2812
+ member.role !== "" && (0, react_jsx_runtime.jsx)("span", {
2813
+ className: ActivityPanel_module_css_default.memberRole,
2814
+ children: member.role
2815
+ }),
2816
+ memberModel !== "" && (0, react_jsx_runtime.jsx)("span", {
2817
+ className: ActivityPanel_module_css_default.memberModel,
2818
+ role: "img",
2819
+ "data-member-model": memberModel,
2820
+ title: memberModel,
2821
+ "aria-label": memberModel,
2822
+ children: compactModelLabel(memberModel)
2823
+ }),
2824
+ (0, react_jsx_runtime.jsxs)("span", {
2825
+ className: ActivityPanel_module_css_default.memberState,
2826
+ "data-activity": member.activity,
2827
+ children: [(0, react_jsx_runtime.jsx)(WorkGlyph, { active: member.activity === "working" }), discarded ? t("member.state.notCreated") : stopped ? t("member.state.stopped") : team.phase === "staged" ? t("member.state.staged") : memberStateLabel(member, team.tasks, historic, t)]
2828
+ })
2829
+ ]
2830
+ }), (0, react_jsx_runtime.jsx)("span", {
2831
+ className: ActivityPanel_module_css_default.memberStatusLine,
2832
+ children: discarded ? t("member.status.discarded") : stopped ? t("member.status.stopped") : team.phase === "staged" ? t("member.status.staged") : historic && owned.length > 0 && owned.every((task) => task.status === "completed" || task.status === "failed" || task.status === "cancelled") ? t("member.status.settled") : memberStatusText(member, team.tasks, t)
2833
+ })]
2834
+ }),
2835
+ (0, react_jsx_runtime.jsxs)("span", {
2836
+ className: ActivityPanel_module_css_default.memberCount,
2560
2837
  children: [
2561
- (0, react_jsx_runtime.jsx)("span", {
2562
- className: ActivityPanel_module_css_default.memberName,
2563
- children: member.name
2564
- }),
2565
- member.role !== "" && (0, react_jsx_runtime.jsx)("span", {
2566
- className: ActivityPanel_module_css_default.memberRole,
2567
- children: member.role
2568
- }),
2569
- memberModel !== "" && (0, react_jsx_runtime.jsx)("span", {
2570
- className: ActivityPanel_module_css_default.memberModel,
2571
- role: "img",
2572
- "data-member-model": memberModel,
2573
- title: memberModel,
2574
- "aria-label": memberModel,
2575
- children: compactModelLabel(memberModel)
2576
- }),
2577
- (0, react_jsx_runtime.jsxs)("span", {
2578
- className: ActivityPanel_module_css_default.memberState,
2579
- "data-activity": member.activity,
2580
- children: [(0, react_jsx_runtime.jsx)(WorkGlyph, { active: member.activity === "working" }), discarded ? t("member.state.notCreated") : stopped ? t("member.state.stopped") : team.phase === "staged" ? t("member.state.staged") : memberStateLabel(member, team.tasks, historic, t)]
2581
- })
2838
+ member.done,
2839
+ "/",
2840
+ member.total
2582
2841
  ]
2583
- }), (0, react_jsx_runtime.jsx)("span", {
2584
- className: ActivityPanel_module_css_default.memberStatusLine,
2585
- children: discarded ? t("member.status.discarded") : stopped ? t("member.status.stopped") : team.phase === "staged" ? t("member.status.staged") : historic && owned.length > 0 && owned.every((task) => task.status === "completed" || task.status === "failed" || task.status === "cancelled") ? t("member.status.settled") : memberStatusText(member, team.tasks, t)
2586
- })]
2587
- }),
2588
- (0, react_jsx_runtime.jsxs)("span", {
2589
- className: ActivityPanel_module_css_default.memberCount,
2590
- children: [
2591
- member.done,
2592
- "/",
2593
- member.total
2594
- ]
2595
- })
2596
- ]
2597
- }),
2598
- (0, react_jsx_runtime.jsxs)("div", {
2599
- className: ActivityPanel_module_css_default.assignmentLine,
2600
- children: [(0, react_jsx_runtime.jsx)("span", {
2601
- className: ActivityPanel_module_css_default.assignmentLabel,
2602
- children: t(discarded ? "assignment.discarded" : team.phase === "staged" ? "assignment.staged" : "assignment.label")
2603
- }), (0, react_jsx_runtime.jsx)("span", {
2604
- className: ActivityPanel_module_css_default.assignmentTasks,
2605
- children: owned.length === 0 ? (0, react_jsx_runtime.jsx)("span", {
2606
- className: ActivityPanel_module_css_default.taskEmpty,
2607
- children: t("assignment.empty")
2608
- }) : owned.map((task) => {
2609
- const model = taskModelLabel(task, team.members);
2610
- const shortModel = compactModelLabel(model);
2611
- return (0, react_jsx_runtime.jsx)("span", {
2612
- className: ActivityPanel_module_css_default.assignmentChip,
2613
- "data-state": discarded ? "cancelled" : taskTone(task.state, task.status),
2614
- "data-task-model": model || void 0,
2615
- title: taskTitle(task, model),
2616
- children: task.state === "running" && shortModel !== "" ? `${task.id} · ${shortModel}` : task.id
2617
- }, task.id);
2618
- })
2619
- })]
2620
- })
2621
- ]
2622
- }, member.id || member.name);
2623
- })]
2624
- })
2842
+ })
2843
+ ]
2844
+ }),
2845
+ (0, react_jsx_runtime.jsxs)("div", {
2846
+ className: ActivityPanel_module_css_default.assignmentLine,
2847
+ children: [(0, react_jsx_runtime.jsx)("span", {
2848
+ className: ActivityPanel_module_css_default.assignmentLabel,
2849
+ children: t(discarded ? "assignment.discarded" : team.phase === "staged" ? "assignment.staged" : "assignment.label")
2850
+ }), (0, react_jsx_runtime.jsx)("span", {
2851
+ className: ActivityPanel_module_css_default.assignmentTasks,
2852
+ children: owned.length === 0 ? (0, react_jsx_runtime.jsx)("span", {
2853
+ className: ActivityPanel_module_css_default.taskEmpty,
2854
+ children: t("assignment.empty")
2855
+ }) : owned.map((task) => {
2856
+ const model = taskModelLabel(task, team.members);
2857
+ const shortModel = compactModelLabel(model);
2858
+ return (0, react_jsx_runtime.jsx)("span", {
2859
+ className: ActivityPanel_module_css_default.assignmentChip,
2860
+ "data-state": discarded ? "cancelled" : taskTone(task.state, task.status),
2861
+ "data-task-model": model || void 0,
2862
+ title: taskTitle(task, model),
2863
+ children: task.state === "running" && shortModel !== "" ? `${task.id} · ${shortModel}` : task.id
2864
+ }, task.id);
2865
+ })
2866
+ })]
2867
+ })
2868
+ ]
2869
+ }, member.id || member.name);
2870
+ })]
2871
+ })] });
2872
+ })()
2625
2873
  ]
2626
2874
  }),
2627
2875
  (0, react_jsx_runtime.jsx)(DependencyMap, {
2628
2876
  tasks: team.tasks,
2629
2877
  members: team.members,
2630
2878
  t,
2631
- discarded
2879
+ discarded,
2880
+ workspace,
2881
+ onSelectTask: setSelectedTaskId
2632
2882
  })
2633
2883
  ]
2634
2884
  }), (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Modal, {
@@ -2658,13 +2908,13 @@ window.__ModuleLoader__.load({
2658
2908
  onClick: () => {
2659
2909
  stopTeam();
2660
2910
  },
2661
- children: [(0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconStopFill16, {}), stopping ? t("team.stopping") : t("team.stopConfirm")]
2911
+ children: [(0, react_jsx_runtime.jsx)(IconStopFill16, {}), stopping ? t("team.stopping") : t("team.stopConfirm")]
2662
2912
  })]
2663
2913
  }),
2664
2914
  children: stopError !== "" && (0, react_jsx_runtime.jsxs)("p", {
2665
2915
  className: ActivityPanel_module_css_default.stopModalError,
2666
2916
  role: "alert",
2667
- children: [(0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconWarningOutline16, {}), stopError]
2917
+ children: [(0, react_jsx_runtime.jsx)(IconWarningOutline16, {}), stopError]
2668
2918
  })
2669
2919
  })] });
2670
2920
  }
@@ -2711,7 +2961,7 @@ window.__ModuleLoader__.load({
2711
2961
  const gestureRef = (0, react.useRef)(null);
2712
2962
  const frameRef = (0, react.useRef)(null);
2713
2963
  const pendingLayoutRef = (0, react.useRef)(null);
2714
- const current = (0, react.useSyncExternalStore)(sessionsList.subscribe, sessionsList.getSnapshot).current;
2964
+ const current = currentSessionId((0, react.useSyncExternalStore)(sessionsList.subscribe, sessionsList.getSnapshot));
2715
2965
  const autoOpenTrackerRef = (0, react.useRef)({
2716
2966
  sessionId: current,
2717
2967
  restoreComplete: false,
@@ -3052,7 +3302,7 @@ window.__ModuleLoader__.load({
3052
3302
  onClick: toggleDock,
3053
3303
  "aria-label": t(geometry.mode === "docked" ? "activity.float" : "activity.dockRight"),
3054
3304
  title: t(geometry.mode === "docked" ? "activity.float" : "activity.dockRight"),
3055
- children: (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconPanelLeftOutline16, {})
3305
+ children: (0, react_jsx_runtime.jsx)(IconPanelLeftOutline16, {})
3056
3306
  }), (0, react_jsx_runtime.jsx)("button", {
3057
3307
  type: "button",
3058
3308
  className: ActivityPanel_module_css_default.iconButton,
@@ -3063,7 +3313,7 @@ window.__ModuleLoader__.load({
3063
3313
  },
3064
3314
  "aria-label": t("activity.collapse"),
3065
3315
  title: t("activity.collapse"),
3066
- children: (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconChevronDownOutline14, {})
3316
+ children: (0, react_jsx_runtime.jsx)(IconChevronDownOutline14, {})
3067
3317
  })]
3068
3318
  })]
3069
3319
  }),
@@ -3142,6 +3392,271 @@ window.__ModuleLoader__.load({
3142
3392
  })] });
3143
3393
  }
3144
3394
  //#endregion
3395
+ //#region lib/client/workspace-state.js
3396
+ function createWorkspaceState() {
3397
+ let snapshot = {
3398
+ statuses: /* @__PURE__ */ new Map(),
3399
+ history: /* @__PURE__ */ new Map(),
3400
+ selected: /* @__PURE__ */ new Map()
3401
+ };
3402
+ const listeners = /* @__PURE__ */ new Set();
3403
+ const publish = (next) => {
3404
+ snapshot = next;
3405
+ for (const listener of listeners) listener();
3406
+ };
3407
+ return {
3408
+ getSnapshot: () => snapshot,
3409
+ subscribe: (listener) => {
3410
+ listeners.add(listener);
3411
+ return () => {
3412
+ listeners.delete(listener);
3413
+ };
3414
+ },
3415
+ status(session, status) {
3416
+ if (snapshot.statuses.get(session) === status) return;
3417
+ publish({
3418
+ ...snapshot,
3419
+ statuses: new Map(snapshot.statuses).set(session, status)
3420
+ });
3421
+ },
3422
+ select(session, team) {
3423
+ if (snapshot.selected.get(session) === team) return;
3424
+ publish({
3425
+ ...snapshot,
3426
+ selected: new Map(snapshot.selected).set(session, team)
3427
+ });
3428
+ },
3429
+ remember(session, data) {
3430
+ const owner = data.captainSessionId || session;
3431
+ if (owner !== session) return;
3432
+ publish({
3433
+ ...snapshot,
3434
+ history: new Map(snapshot.history).set(`${owner}:${data.teamId}`, {
3435
+ ...data,
3436
+ captainSessionId: owner
3437
+ }),
3438
+ selected: new Map(snapshot.selected).set(owner, data.teamId)
3439
+ });
3440
+ }
3441
+ };
3442
+ }
3443
+ /** Records restored at mount never reopen a closed tab; new teams are announced once. */
3444
+ function createTeamDiscovery() {
3445
+ let restored = false;
3446
+ let known = /* @__PURE__ */ new Set();
3447
+ return (teams) => {
3448
+ const added = restored ? teams.find((team) => !known.has(team.teamId))?.teamId : void 0;
3449
+ known = new Set(teams.map((team) => team.teamId));
3450
+ restored = true;
3451
+ return added;
3452
+ };
3453
+ }
3454
+ //#endregion
3455
+ //#region \0dsh-css:/home/runner/work/dsh-agent-teams/dsh-agent-teams/src/client/WorkspaceActivity.module.css.mjs
3456
+ const css = ".eDfHrq_root{height:100%;min-height:0;color:var(--dsw-alias-label-primary);background:var(--dsw-alias-bg-base);font-family:inherit;overflow:auto;container:eDfHrq_team-workspace/inline-size}.eDfHrq_content{max-width:1400px;margin:0 auto;padding:12px 20px 28px}.eDfHrq_selector{flex-wrap:wrap;gap:6px;margin-bottom:24px;display:flex}.eDfHrq_selector button{border:1px solid var(--dsw-alias-border-l2);text-align:left;overflow-wrap:anywhere;border-radius:8px;align-items:center;gap:12px;max-width:100%;padding:8px 10px;display:flex}.eDfHrq_selector span{color:var(--dsw-alias-label-tertiary);white-space:nowrap;font-size:10px}.eDfHrq_selector button[aria-pressed=true]{background:var(--dsw-alias-bg-module-platform);border-color:var(--dsw-alias-label-tertiary)}.eDfHrq_root button{color:inherit;cursor:pointer;font-family:inherit}.eDfHrq_root button:active{transform:scale(.98)}.eDfHrq_root button:focus-visible{outline:2px solid var(--dsw-alias-label-secondary);outline-offset:3px}.eDfHrq_empty{max-width:42ch;padding:36px 0}.eDfHrq_emptyMark{color:var(--dsw-alias-label-tertiary);font-size:32px}.eDfHrq_empty h3{margin:16px 0 10px;font-size:16px;font-weight:550}.eDfHrq_empty p{color:var(--dsw-alias-label-secondary);font-size:13px;line-height:1.8}.eDfHrq_empty button,.eDfHrq_error button{background:var(--dsw-alias-bg-module-platform);border:1px solid var(--dsw-alias-border-l2);border-radius:8px;padding:8px 12px;font-size:12px}.eDfHrq_error{border:1px solid var(--dsw-alias-border-l2);border-radius:8px;align-items:start;gap:12px;margin-bottom:20px;padding:12px;font-size:12px;line-height:1.65;display:flex}.eDfHrq_error button{flex:none}.eDfHrq_skeleton{gap:16px;padding-top:20px;display:grid}.eDfHrq_skeleton i{background:var(--dsw-alias-bg-module-platform);border-radius:8px;height:66px;animation:1.8s ease-in-out infinite alternate eDfHrq_breathe}.eDfHrq_skeleton i:first-child{width:70%;height:36px}.eDfHrq_skeleton i:last-child{animation-delay:.3s}@keyframes eDfHrq_breathe{to{opacity:.45}}@container (width>=720px){.eDfHrq_content{padding:20px 28px 32px}}@media (prefers-reduced-motion:reduce){.eDfHrq_skeleton i{animation:none}}";
3457
+ const tagId = "@nanmicoder/dsh-agent-teams/WorkspaceActivity.module.css";
3458
+ if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId) + "]") === null) {
3459
+ const tag = document.createElement("style");
3460
+ tag.dataset.plugin = "@nanmicoder/dsh-agent-teams";
3461
+ tag.dataset.pluginCss = tagId;
3462
+ tag.textContent = css;
3463
+ document.head.appendChild(tag);
3464
+ }
3465
+ var WorkspaceActivity_module_css_default = {
3466
+ "breathe": "eDfHrq_breathe",
3467
+ "content": "eDfHrq_content",
3468
+ "empty": "eDfHrq_empty",
3469
+ "emptyMark": "eDfHrq_emptyMark",
3470
+ "error": "eDfHrq_error",
3471
+ "root": "eDfHrq_root",
3472
+ "selector": "eDfHrq_selector",
3473
+ "skeleton": "eDfHrq_skeleton",
3474
+ "team-workspace": "eDfHrq_team-workspace"
3475
+ };
3476
+ //#endregion
3477
+ //#region lib/client/WorkspaceActivity.js
3478
+ /** Native workspace content; discovery remains mounted independently of tab lifetime. */
3479
+ const TEAM_TAB_KIND = "agent-teams";
3480
+ const TEAM_TAB_ID = "@nanmicoder/dsh-agent-teams/activity";
3481
+ /** Optional host integration is observable so installing/removing it also switches the fallback. */
3482
+ function createWorkspaceBridge() {
3483
+ let sidebar;
3484
+ const listeners = /* @__PURE__ */ new Set();
3485
+ return {
3486
+ getSnapshot: () => sidebar,
3487
+ subscribe: (listener) => {
3488
+ listeners.add(listener);
3489
+ return () => {
3490
+ listeners.delete(listener);
3491
+ };
3492
+ },
3493
+ set(value) {
3494
+ sidebar = value;
3495
+ for (const listener of listeners) listener();
3496
+ }
3497
+ };
3498
+ }
3499
+ function ActivitySurface({ bridge, state, ...props }) {
3500
+ const sidebar = (0, react.useSyncExternalStore)(bridge.subscribe, bridge.getSnapshot);
3501
+ return sidebar === void 0 ? (0, react_jsx_runtime.jsx)(ActivityPanel, { ...props }) : (0, react_jsx_runtime.jsx)(WorkspaceMonitor, {
3502
+ ...props,
3503
+ sidebar,
3504
+ state
3505
+ });
3506
+ }
3507
+ function WorkspaceMonitor({ sessionsList, sidebar, state }) {
3508
+ const current = currentSessionId((0, react.useSyncExternalStore)(sessionsList.subscribe, sessionsList.getSnapshot));
3509
+ const targets = (0, react.useSyncExternalStore)(subscribeActivityMonitorTargets, getActivityMonitorTargetsSnapshot);
3510
+ const currentTargets = (0, react.useMemo)(() => targets.filter((target) => target.sessionId === current), [targets, current]);
3511
+ const discover = (0, react.useMemo)(() => createTeamDiscovery(), [current]);
3512
+ (0, react.useEffect)(() => {
3513
+ if (current === void 0) return;
3514
+ state.status(current, "loading");
3515
+ const controller = startActivityPolling(currentTargets, {
3516
+ discoverySessionId: current,
3517
+ onStatus(status) {
3518
+ state.status(current, status);
3519
+ },
3520
+ publishSnapshots(update) {
3521
+ updateActivitySnapshots(update);
3522
+ if (update.teams === void 0) return;
3523
+ const added = discover(update.teams.filter((team) => team.captainSessionId === current));
3524
+ if (added !== void 0 && sidebar.mounted.getSnapshot() === current && !sidebar.isExpanded()) {
3525
+ state.select(current, added);
3526
+ sidebar.openTab(TEAM_TAB_KIND);
3527
+ }
3528
+ }
3529
+ });
3530
+ return () => {
3531
+ controller.stop();
3532
+ };
3533
+ }, [
3534
+ current,
3535
+ currentTargets,
3536
+ discover,
3537
+ sidebar,
3538
+ state
3539
+ ]);
3540
+ (0, react.useEffect)(() => {
3541
+ const open = (event) => {
3542
+ if (current === void 0 || sidebar.mounted.getSnapshot() !== current) return;
3543
+ const data = event.detail;
3544
+ if (data?.captainSessionId && data.captainSessionId !== current) return;
3545
+ if (data?.teamId) state.remember(current, data);
3546
+ sidebar.openTab(TEAM_TAB_KIND);
3547
+ };
3548
+ window.addEventListener(OPEN_PANEL_EVENT, open);
3549
+ return () => {
3550
+ window.removeEventListener(OPEN_PANEL_EVENT, open);
3551
+ };
3552
+ }, [
3553
+ current,
3554
+ sidebar,
3555
+ state
3556
+ ]);
3557
+ return null;
3558
+ }
3559
+ function WorkspaceActivity({ sessionId, useTabInfo, t, state, modelDirectories, openMember }) {
3560
+ const { tab } = useTabInfo();
3561
+ const snapshots = (0, react.useSyncExternalStore)(subscribeActivitySnapshots, getActivitySnapshotsSnapshot);
3562
+ const local = (0, react.useSyncExternalStore)(state.subscribe, state.getSnapshot);
3563
+ const [retry, setRetry] = (0, react.useState)(0);
3564
+ const live = snapshots.teams.filter((team) => team.captainSessionId === sessionId);
3565
+ const archived = snapshots.archivedTeams.filter((team) => team.captainSessionId === sessionId && !live.some((item) => item.teamId === team.teamId));
3566
+ const historic = [...local.history.values()].filter((team) => team.captainSessionId === sessionId && !live.some((item) => item.teamId === team.teamId) && !archived.some((item) => item.teamId === team.teamId)).map((team) => historicCardTeam(team, sessionId));
3567
+ const records = [
3568
+ ...live,
3569
+ ...archived,
3570
+ ...historic
3571
+ ];
3572
+ const selected = records.find((team) => team.teamId === local.selected.get(sessionId)) ?? records[0];
3573
+ const history = selected !== void 0 && !live.includes(selected);
3574
+ const status = local.statuses.get(sessionId) ?? "loading";
3575
+ (0, react.useEffect)(() => {
3576
+ if (retry === 0 || !tab.visible) return;
3577
+ const controller = startActivityPolling([], {
3578
+ discoverySessionId: sessionId,
3579
+ onStatus: (value) => state.status(sessionId, value)
3580
+ });
3581
+ controller.firstTick.finally(() => {
3582
+ controller.stop();
3583
+ });
3584
+ return () => {
3585
+ controller.stop();
3586
+ };
3587
+ }, [
3588
+ retry,
3589
+ sessionId,
3590
+ state,
3591
+ tab.visible
3592
+ ]);
3593
+ const backToChat = () => {
3594
+ tab.actions.close();
3595
+ requestAnimationFrame(() => document.querySelector("[data-composer-card] [contenteditable=\"true\"][role=\"textbox\"], [data-composer-card] textarea")?.focus());
3596
+ };
3597
+ return (0, react_jsx_runtime.jsx)("div", {
3598
+ className: WorkspaceActivity_module_css_default.root,
3599
+ "data-agent-teams-workspace": true,
3600
+ "data-session-id": sessionId,
3601
+ children: (0, react_jsx_runtime.jsxs)("div", {
3602
+ className: WorkspaceActivity_module_css_default.content,
3603
+ children: [
3604
+ status === "error" && (0, react_jsx_runtime.jsxs)("div", {
3605
+ className: WorkspaceActivity_module_css_default.error,
3606
+ role: "alert",
3607
+ children: [(0, react_jsx_runtime.jsx)("span", { children: t("workspace.error") }), (0, react_jsx_runtime.jsx)("button", {
3608
+ onClick: () => setRetry((value) => value + 1),
3609
+ children: t("workspace.retry")
3610
+ })]
3611
+ }),
3612
+ records.length > 1 && (0, react_jsx_runtime.jsx)("nav", {
3613
+ className: WorkspaceActivity_module_css_default.selector,
3614
+ "aria-label": t("workspace.title"),
3615
+ children: records.map((team) => (0, react_jsx_runtime.jsxs)("button", {
3616
+ "aria-pressed": selected?.teamId === team.teamId,
3617
+ onClick: () => state.select(sessionId, team.teamId),
3618
+ children: [team.name, (0, react_jsx_runtime.jsx)("span", { children: t(live.includes(team) ? "workspace.current" : "workspace.history") })]
3619
+ }, team.teamId))
3620
+ }),
3621
+ selected === void 0 ? status === "loading" ? (0, react_jsx_runtime.jsxs)("div", {
3622
+ className: WorkspaceActivity_module_css_default.skeleton,
3623
+ role: "status",
3624
+ "aria-label": t("workspace.loading"),
3625
+ children: [
3626
+ (0, react_jsx_runtime.jsx)("i", {}),
3627
+ (0, react_jsx_runtime.jsx)("i", {}),
3628
+ (0, react_jsx_runtime.jsx)("i", {})
3629
+ ]
3630
+ }) : (0, react_jsx_runtime.jsxs)("section", {
3631
+ className: WorkspaceActivity_module_css_default.empty,
3632
+ children: [
3633
+ (0, react_jsx_runtime.jsx)("span", {
3634
+ className: WorkspaceActivity_module_css_default.emptyMark,
3635
+ "aria-hidden": true,
3636
+ children: "↳"
3637
+ }),
3638
+ (0, react_jsx_runtime.jsx)("h3", { children: t("workspace.emptyTitle") }),
3639
+ (0, react_jsx_runtime.jsx)("p", { children: t("workspace.emptyBody") }),
3640
+ (0, react_jsx_runtime.jsx)("button", {
3641
+ onClick: backToChat,
3642
+ children: t("workspace.back")
3643
+ })
3644
+ ]
3645
+ }) : (0, react_jsx_runtime.jsx)(react_jsx_runtime.Fragment, { children: (0, react_jsx_runtime.jsx)(TeamSection, {
3646
+ team: selected,
3647
+ workspace: true,
3648
+ historic: history,
3649
+ modelDirectory: selected.phase === "staged" ? modelDirectories.directoryFor(sessionId) : void 0,
3650
+ onContinuePlanning: backToChat,
3651
+ onDiscarded: backToChat,
3652
+ onNavigate: openMember,
3653
+ t
3654
+ }, `${sessionId}:${selected.teamId}`) })
3655
+ ]
3656
+ })
3657
+ });
3658
+ }
3659
+ //#endregion
3145
3660
  //#region lib/client/agent-teams-card-definition.js
3146
3661
  /**
3147
3662
  * AgentTeams conversation card: a lightweight in-conversation summary shown
@@ -3197,7 +3712,7 @@ window.__ModuleLoader__.load({
3197
3712
  },
3198
3713
  update: (context, match) => {
3199
3714
  if (match.event.type !== "tool/result") return context.state;
3200
- if (match.event.data.error !== void 0 || match.event.data.message.content.some((block) => block.type === "tool-result" && block.isError === true)) return context.state;
3715
+ if (match.event.data.error !== void 0 || toolResultFailed(match.event.data.message)) return context.state;
3201
3716
  return {
3202
3717
  ...context.state,
3203
3718
  accepted: true
@@ -3224,6 +3739,53 @@ window.__ModuleLoader__.load({
3224
3739
  };
3225
3740
  }
3226
3741
  };
3742
+ /** V4 tool-role results carry isError directly; older logs nest tool-result blocks. */
3743
+ function toolResultFailed(message) {
3744
+ return message.isError === true || message.content.some((block) => typeof block === "object" && block !== null && "type" in block && block.type === "tool-result" && "isError" in block && block.isError === true);
3745
+ }
3746
+ /** Keep summaries tied to the create turn, including multiple teams in one turn. */
3747
+ function teamCardsForTurn(nodes, turn) {
3748
+ return [...nodes].filter((node) => node.kind === "agent-teams" && (node.location.kind === "turn" || node.location.kind === "step") && node.location.turn.turn === turn);
3749
+ }
3750
+ //#endregion
3751
+ //#region lib/client/TeamChatEntry.js
3752
+ /** Session-owned entry points: a persistent title action and a durable turn card. */
3753
+ function TeamChatEntry({ sessionId, t }) {
3754
+ const { teams, archivedTeams } = (0, react.useSyncExternalStore)(subscribeActivitySnapshots, getActivitySnapshotsSnapshot);
3755
+ const team = [...teams, ...archivedTeams].find((team) => team.captainSessionId === sessionId);
3756
+ if (!team) return null;
3757
+ return (0, react_jsx_runtime.jsxs)("button", {
3758
+ className: AgentTeamsCard_module_css_default.chatEntry,
3759
+ "data-team-chat-entry": true,
3760
+ type: "button",
3761
+ title: t("workspace.focus"),
3762
+ onClick: () => openActivityPanel({
3763
+ teamId: team.teamId,
3764
+ captainSessionId: sessionId,
3765
+ teamName: team.name,
3766
+ members: team.members
3767
+ }),
3768
+ children: [(0, react_jsx_runtime.jsx)("img", {
3769
+ src: LEAD_ART,
3770
+ alt: "",
3771
+ "aria-hidden": true
3772
+ }), t("workspace.focus")]
3773
+ });
3774
+ }
3775
+ function TeamTurnCard({ sessionId, turn, useChat, t, openMember }) {
3776
+ const cards = teamCardsForTurn(useChat((snapshot) => snapshot.nodes).values(), turn.turn);
3777
+ if (turn.status !== "closed" || cards.length === 0) return null;
3778
+ return (0, react_jsx_runtime.jsx)("div", {
3779
+ className: AgentTeamsCard_module_css_default.turnCards,
3780
+ "data-team-turn-cards": true,
3781
+ children: cards.map((node) => (0, react_jsx_runtime.jsx)(AgentTeamsSummary, {
3782
+ data: node.data,
3783
+ sessionId,
3784
+ t,
3785
+ openMember
3786
+ }, node.key))
3787
+ });
3788
+ }
3227
3789
  //#endregion
3228
3790
  //#region lib/client/locales.js
3229
3791
  /** `agentTeams` namespace dictionaries for every plugin-owned Web surface. */
@@ -3231,6 +3793,25 @@ window.__ModuleLoader__.load({
3231
3793
  const AGENT_TEAMS_LOCALE_NAMESPACE = "agentTeams";
3232
3794
  /** Simplified Chinese dictionary (the key-set source of truth). */
3233
3795
  const zh = {
3796
+ "workspace.dependencies": "从左到右:完成前置后解锁 · 点击查看详情",
3797
+ "workspace.title": "团队协作",
3798
+ "workspace.guide": "查看成员分工、任务依赖与执行进度",
3799
+ "workspace.eyebrow": "AGENT TEAMS",
3800
+ "workspace.description": "队长统筹分工,成员按任务依赖并行协作。",
3801
+ "workspace.relationships": "队长协调成员分工;任务连线表示前置依赖。点击任务可定位负责成员。",
3802
+ "workspace.emptyTitle": "当前会话还没有团队",
3803
+ "workspace.emptyBody": "在聊天中使用 /agent-teams 描述目标,确认计划后即可在这里查看协作进度。",
3804
+ "workspace.loading": "正在读取团队状态",
3805
+ "workspace.error": "暂时无法连接团队服务,正在自动重试。已加载的状态可能不是最新。",
3806
+ "workspace.retry": "重新连接",
3807
+ "workspace.current": "当前团队",
3808
+ "workspace.history": "历史记录",
3809
+ "workspace.back": "返回对话",
3810
+ "workspace.tasks": "项任务",
3811
+ "workspace.members": "名成员",
3812
+ "workspace.completed": "已完成",
3813
+ "workspace.focus": "查看团队",
3814
+ "workspace.noTasks": "等待队长拆解任务",
3234
3815
  "card.memberCount": "{count} 名成员",
3235
3816
  "action.openActivityPanel": "打开活动面板",
3236
3817
  "activity.panelButton": "活动面板",
@@ -3309,6 +3890,8 @@ window.__ModuleLoader__.load({
3309
3890
  "dependency.hint.pinned": "{taskId} 已固定 · Esc 取消",
3310
3891
  "task.runningAria": "运行中",
3311
3892
  "task.model": "{model}",
3893
+ "task.detail.cancelled": "任务已取消,不会继续执行",
3894
+ "task.detail.failed": "任务失败,等待明确重试",
3312
3895
  "task.detail.completed": "已完成并交付",
3313
3896
  "task.detail.noPrerequisite": "无前置,可立即开工",
3314
3897
  "task.detail.ready": "前置已就绪,可开工",
@@ -3412,6 +3995,7 @@ window.__ModuleLoader__.load({
3412
3995
  "members.toggle": "{count} 名成员",
3413
3996
  "members.collapse": "收起",
3414
3997
  "members.expand": "展开",
3998
+ "members.expandFinished": "展开已结束({count})",
3415
3999
  "members.empty": "暂无成员,等待队长组建团队",
3416
4000
  "assignment.label": "队长派发",
3417
4001
  "assignment.staged": "计划任务",
@@ -3422,6 +4006,25 @@ window.__ModuleLoader__.load({
3422
4006
  };
3423
4007
  /** English dictionary, checked complete against the Chinese source key set. */
3424
4008
  const en = {
4009
+ "workspace.dependencies": "Left to right: prerequisites unlock tasks · Select for details",
4010
+ "workspace.title": "Team workspace",
4011
+ "workspace.guide": "Members, task dependencies, and execution progress",
4012
+ "workspace.eyebrow": "AGENT TEAMS",
4013
+ "workspace.description": "The captain coordinates. Members work in parallel as dependencies clear.",
4014
+ "workspace.relationships": "The captain coordinates members. Connections show task prerequisites. Select a task to locate its owner.",
4015
+ "workspace.emptyTitle": "No team in this conversation yet",
4016
+ "workspace.emptyBody": "Use /agent-teams in chat to describe your goal. Review the plan, then follow the team here.",
4017
+ "workspace.loading": "Loading team activity",
4018
+ "workspace.error": "The team service is unavailable. Retrying automatically; loaded activity may be out of date.",
4019
+ "workspace.retry": "Reconnect",
4020
+ "workspace.current": "Current team",
4021
+ "workspace.history": "History",
4022
+ "workspace.back": "Back to conversation",
4023
+ "workspace.tasks": "tasks",
4024
+ "workspace.members": "members",
4025
+ "workspace.completed": "completed",
4026
+ "workspace.focus": "View team",
4027
+ "workspace.noTasks": "Waiting for the captain to define tasks",
3425
4028
  "card.memberCount": "{count} members",
3426
4029
  "action.openActivityPanel": "Open activity panel",
3427
4030
  "activity.panelButton": "Activity panel",
@@ -3500,6 +4103,8 @@ window.__ModuleLoader__.load({
3500
4103
  "dependency.hint.pinned": "{taskId} pinned · Esc to clear",
3501
4104
  "task.runningAria": "Running",
3502
4105
  "task.model": "{model}",
4106
+ "task.detail.cancelled": "Cancelled; execution will not continue",
4107
+ "task.detail.failed": "Failed; awaiting an explicit retry",
3503
4108
  "task.detail.completed": "Completed and delivered",
3504
4109
  "task.detail.noPrerequisite": "No prerequisites; ready to start",
3505
4110
  "task.detail.ready": "Prerequisites ready; can start",
@@ -3603,6 +4208,7 @@ window.__ModuleLoader__.load({
3603
4208
  "members.toggle": "Members {count}",
3604
4209
  "members.collapse": "Collapse",
3605
4210
  "members.expand": "Expand",
4211
+ "members.expandFinished": "Show finished ({count})",
3606
4212
  "members.empty": "No members yet; waiting for the captain to assemble the team",
3607
4213
  "assignment.label": "Captain assigned",
3608
4214
  "assignment.staged": "Planned task",
@@ -3612,36 +4218,6 @@ window.__ModuleLoader__.load({
3612
4218
  "archive.discardedLabel": "Plan discarded · Archived history"
3613
4219
  };
3614
4220
  //#endregion
3615
- //#region lib/client/session-navigation.js
3616
- /** Version-tolerant navigation into durable AgentTeams member transcripts. */
3617
- /**
3618
- * Open one member's persisted transcript.
3619
- *
3620
- * Harness rc.8 intentionally removed cold subagents from the ordinary session
3621
- * list. They must first be rediscovered in their parent's catalog, then opened
3622
- * with the exact parent/child/mode address. Older runtimes have only `open()`;
3623
- * the fallback preserves ordinary-session navigation. New layouts also select
3624
- * the Conversation panel and cancel catalog refreshes superseded by navigation.
3625
- */
3626
- async function openAgentTeamMember(sessions, parentSessionId, childSessionId, layout) {
3627
- const navigation = layout?.beginNavigation?.();
3628
- if (sessions.openSubagent === void 0 || sessions.refreshSubagents === void 0) {
3629
- sessions.open(childSessionId);
3630
- layout?.selectPanel?.(null);
3631
- return "session";
3632
- }
3633
- await sessions.refreshSubagents(parentSessionId);
3634
- if (navigation?.aborted) return "cancelled";
3635
- const retained = sessions.subagentAddress?.(childSessionId);
3636
- sessions.openSubagent(retained?.parentSessionId === parentSessionId ? retained : {
3637
- parentSessionId,
3638
- childSessionId,
3639
- mode: "continuable"
3640
- });
3641
- layout?.selectPanel?.(null);
3642
- return "subagent";
3643
- }
3644
- //#endregion
3645
4221
  //#region lib/client/index.js
3646
4222
  /** Required services: conversation nodes, slots, sessions navigation, and locale. */
3647
4223
  const inject = [
@@ -3663,24 +4239,67 @@ window.__ModuleLoader__.load({
3663
4239
  * monitor via a window event — the recovery path for an old session.
3664
4240
  */
3665
4241
  function apply(ctx) {
4242
+ const bridge = createWorkspaceBridge();
4243
+ const state = createWorkspaceState();
3666
4244
  ctx.effect(() => ctx.locale.register(AGENT_TEAMS_LOCALE_NAMESPACE, {
3667
4245
  zh,
3668
4246
  en
3669
4247
  }), "agent-teams: dictionaries");
3670
4248
  const openMember = (parentId, childId) => {
3671
- openAgentTeamMember(ctx.sessions, parentId, childId, ctx.layout).catch((error) => {
4249
+ openAgentTeamMember(ctx.sessions, parentId, childId, ctx.layout, ctx.get("uiWorkspace")).catch((error) => {
3672
4250
  console.warn(`agent-teams: failed to open member transcript ${childId}: ${String(error)}`);
3673
4251
  });
3674
4252
  };
3675
4253
  const Panel = ({ t, usePanelInfo }) => {
3676
- return (0, react_jsx_runtime.jsx)(ActivityPanel, {
3677
- conversationVisible: (usePanelInfo ?? useLegacyPanelInfo)((panel) => panel.activePanelId === null),
4254
+ const conversationVisible = (usePanelInfo ?? useLegacyPanelInfo)((panel) => panel.activePanelId === null);
4255
+ return (0, react_jsx_runtime.jsx)(ActivitySurface, {
4256
+ bridge,
4257
+ state,
4258
+ conversationVisible,
3678
4259
  sessionsList: ctx.sessions.list,
3679
4260
  modelDirectories: ctx.modelDirectories,
3680
4261
  openMember,
3681
4262
  t
3682
4263
  });
3683
4264
  };
4265
+ ctx.inject(["sidebarRight", "sidebarRightTabs"], (native) => {
4266
+ const t = native.locale.bind(AGENT_TEAMS_LOCALE_NAMESPACE);
4267
+ native.effect(() => native.sidebarRightTabs.register({
4268
+ id: TEAM_TAB_ID,
4269
+ kind: TEAM_TAB_KIND,
4270
+ title: () => t("workspace.title")
4271
+ }));
4272
+ native.slots.inject("conversation.session.header.actions", () => native.slots.register({
4273
+ name: "conversation.session.header.actions",
4274
+ id: "agent-teams-entry",
4275
+ order: 50,
4276
+ locale: AGENT_TEAMS_LOCALE_NAMESPACE
4277
+ }, TeamChatEntry));
4278
+ native.slots.inject("conversation.chat.turnTail", () => native.slots.register({
4279
+ name: "conversation.chat.turnTail",
4280
+ id: "agent-teams-summary",
4281
+ order: 50,
4282
+ locale: AGENT_TEAMS_LOCALE_NAMESPACE,
4283
+ inject: () => ({ openMember })
4284
+ }, TeamTurnCard));
4285
+ native.slots.inject("sidebar.right.pane.tab", () => {
4286
+ const dispose = native.slots.register({
4287
+ name: "sidebar.right.pane.tab",
4288
+ key: TEAM_TAB_ID,
4289
+ locale: AGENT_TEAMS_LOCALE_NAMESPACE,
4290
+ inject: () => ({
4291
+ state,
4292
+ modelDirectories: native.modelDirectories,
4293
+ openMember
4294
+ })
4295
+ }, WorkspaceActivity);
4296
+ bridge.set(native.sidebarRight);
4297
+ return () => {
4298
+ bridge.set(void 0);
4299
+ dispose();
4300
+ };
4301
+ });
4302
+ });
3684
4303
  ctx.slots.inject("shell.overlay", () => ctx.slots.register({
3685
4304
  name: "shell.overlay",
3686
4305
  id: "agent-teams-activity",
@@ -3697,7 +4316,10 @@ window.__ModuleLoader__.load({
3697
4316
  name: "conversation.chat.node",
3698
4317
  key: "agent-teams",
3699
4318
  locale: AGENT_TEAMS_LOCALE_NAMESPACE,
3700
- inject: () => ({ openMember })
4319
+ inject: () => ({
4320
+ openMember,
4321
+ workspaceBridge: bridge
4322
+ })
3701
4323
  }, AgentTeamsCard));
3702
4324
  }
3703
4325
  //#endregion