@nanmicoder/dsh-agent-teams 0.1.9 → 0.1.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/client.js CHANGED
@@ -5,7 +5,6 @@ window.__ModuleLoader__.load({
5
5
  var exports = module.exports;
6
6
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
7
7
  let react_jsx_runtime = require("react/jsx-runtime");
8
- let react_dom_client = require("react-dom/client");
9
8
  let react = require("react");
10
9
  let _deepseek_ai_dsh_client_ui_primitives = require("@deepseek-ai/dsh-client-ui-primitives");
11
10
  /** Use a fill-width grid when the task graph has no real dependency edges. */
@@ -17,10 +16,10 @@ window.__ModuleLoader__.load({
17
16
  /**
18
17
  * Whether an expanded activity panel still belongs to the current session.
19
18
  *
20
- * The panel is mounted through a body portal, so React does not remount it
21
- * when the conversation route changes. Ownership keeps an expanded panel
22
- * from leaking onto the new-session screen (or another conversation) while
23
- * its local open state is being reset.
19
+ * The panel is mounted in the root-scoped shell overlay, so React does not
20
+ * remount it when the conversation route changes. Ownership keeps an expanded
21
+ * panel from leaking onto the new-session screen (or another conversation)
22
+ * while its local open state is being reset.
24
23
  */
25
24
  function activityPanelExpandedForSession(open, owner, current) {
26
25
  return open && owner !== void 0 && owner === current;
@@ -247,12 +246,17 @@ window.__ModuleLoader__.load({
247
246
  /**
248
247
  * Start the single polling loop for the current session's requested targets.
249
248
  *
250
- * With no targets this is deliberately inert: installing the plugin must not
251
- * touch the state route. Live state is polled at the normal cadence; archive
252
- * state is fetched only as a one-time fallback for targets no longer live.
249
+ * With neither targets nor a discovery session this is deliberately inert.
250
+ * A discovery session performs one live+archive pass after selection/restart;
251
+ * it keeps polling only while that captain still owns a live team. This
252
+ * restores legacy/cardless history without turning every ordinary session
253
+ * into a permanent one-second filesystem scan. Explicit card targets retain
254
+ * the normal cadence, and archive state is refreshed when a target or a
255
+ * previously discovered live team disappears.
253
256
  */
254
257
  function startActivityPolling(monitorTargets, runtime = {}) {
255
- if (monitorTargets.length === 0) return {
258
+ const discoverySessionId = runtime.discoverySessionId?.trim();
259
+ if (monitorTargets.length === 0 && (discoverySessionId === void 0 || discoverySessionId === "")) return {
256
260
  firstTick: Promise.resolve(),
257
261
  stop: () => {}
258
262
  };
@@ -265,9 +269,12 @@ window.__ModuleLoader__.load({
265
269
  const settleTargets = runtime.settleTargets ?? settleActivityMonitorTargets;
266
270
  let cancelled = false;
267
271
  let inFlight = false;
272
+ let discoveryComplete = false;
273
+ let discoveredLiveKeys = /* @__PURE__ */ new Set();
268
274
  let controller;
269
275
  const tick = async () => {
270
276
  if (inFlight || cancelled) return;
277
+ if (discoveryComplete && monitorTargets.length === 0 && discoveredLiveKeys.size === 0) return;
271
278
  inFlight = true;
272
279
  controller = new AbortController();
273
280
  try {
@@ -280,8 +287,12 @@ window.__ModuleLoader__.load({
280
287
  if (cancelled || !Array.isArray(body.teams)) return;
281
288
  const liveTeams = body.teams;
282
289
  publishSnapshots({ teams: liveTeams });
290
+ const previousDiscoveredKeys = discoveredLiveKeys;
291
+ discoveredLiveKeys = new Set(discoverySessionId === void 0 || discoverySessionId === "" ? [] : liveTeams.filter((team) => team.captainSessionId === discoverySessionId).map((team) => team.teamId));
292
+ const discoveredTeamArchived = [...previousDiscoveredKeys].some((teamId) => !discoveredLiveKeys.has(teamId));
283
293
  const missing = monitorTargets.filter((target) => !liveTeams.some((team) => team.captainSessionId === target.sessionId && team.teamId === target.teamId));
284
- if (missing.length === 0) return;
294
+ const needsDiscoveryArchive = discoverySessionId !== void 0 && discoverySessionId !== "" && !discoveryComplete;
295
+ if (missing.length === 0 && !needsDiscoveryArchive && !discoveredTeamArchived) return;
285
296
  const archivedResponse = await fetchState(`${ACTIVITY_STATE_URL}?archived=1`, {
286
297
  cache: "no-store",
287
298
  signal: controller.signal
@@ -290,6 +301,7 @@ window.__ModuleLoader__.load({
290
301
  const archivedBody = await archivedResponse.json();
291
302
  if (cancelled || !Array.isArray(archivedBody.teams)) return;
292
303
  publishSnapshots({ archivedTeams: archivedBody.teams });
304
+ discoveryComplete = true;
293
305
  settleTargets(new Set(missing.map((target) => target.key)));
294
306
  } catch (error) {
295
307
  if (error?.name === "AbortError") return;
@@ -353,7 +365,7 @@ window.__ModuleLoader__.load({
353
365
  }
354
366
  //#endregion
355
367
  //#region \0dsh-css:/home/runner/work/dsh-agent-teams/dsh-agent-teams/src/client/AgentTeamsCard.module.css.mjs
356
- const css$1 = ".kPAopq_root{box-sizing:border-box;border:1px solid var(--dsw-alias-line-normal);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{border:1px solid var(--dsw-alias-line-strong);object-fit:cover;background:#0b1d33;border-radius:50%;flex:none;width:24px;height:24px}.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-line-strong);background:var(--dsw-alias-bg-module);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-line-normal);background:var(--dsw-alias-bg-module);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-bg-fill-neutral)}.kPAopq_member:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:1px}.kPAopq_memberArt{border:1px solid var(--dsw-alias-line-strong);object-fit:cover;background:#0b1d33;border-radius:50%;width:20px;height:20px}.kPAopq_memberInitial{background:var(--dsw-alias-bg-fill-business);width:20px;height:20px;color:var(--dsw-alias-label-on-fill);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}";
368
+ const css$1 = ".kPAopq_root{box-sizing:border-box;border:1px solid var(--dsw-alias-line-normal);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-line-strong);background:var(--dsw-alias-bg-module);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-line-normal);background:var(--dsw-alias-bg-module);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-bg-fill-neutral)}.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-bg-fill-business);width:20px;height:20px;color:var(--dsw-alias-label-on-fill);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}";
357
369
  const tagId$1 = "@nanmicoder/dsh-agent-teams/AgentTeamsCard.module.css";
358
370
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$1) + "]") === null) {
359
371
  const tag = document.createElement("style");
@@ -402,7 +414,7 @@ window.__ModuleLoader__.load({
402
414
  } }));
403
415
  }
404
416
  /** Render one durable team as a compact conversation card. */
405
- function AgentTeamsCard({ node, openSession, sessionId }) {
417
+ function AgentTeamsCard({ node, openMember, sessionId }) {
406
418
  const data = node.data;
407
419
  const owner = data.captainSessionId || sessionId;
408
420
  const { teams, archivedTeams } = (0, react.useSyncExternalStore)(subscribeActivitySnapshots, getActivitySnapshotsSnapshot);
@@ -463,7 +475,7 @@ window.__ModuleLoader__.load({
463
475
  type: "button",
464
476
  className: AgentTeamsCard_module_css_default.member,
465
477
  onClick: () => {
466
- if (member.id !== "") openSession(member.id);
478
+ if (member.id !== "") openMember(owner, member.id);
467
479
  },
468
480
  title: member.role === "" ? member.name : `${member.name} · ${member.role}`,
469
481
  children: [memberArtUrl(member.name, member.role) !== null ? (0, react_jsx_runtime.jsx)("img", {
@@ -483,8 +495,162 @@ window.__ModuleLoader__.load({
483
495
  });
484
496
  }
485
497
  //#endregion
498
+ //#region lib/client/panel-geometry.js
499
+ /** Pure persisted geometry rules for the AgentTeams shell-overlay panel. */
500
+ const PANEL_LAYOUT_STORAGE_KEY = "dsh-agent-teams:activity-panel:v1";
501
+ const DEFAULT_PANEL_LAYOUT = Object.freeze({
502
+ mode: "docked",
503
+ x: 0,
504
+ y: 64,
505
+ width: 388,
506
+ height: 640,
507
+ heightMode: "auto"
508
+ });
509
+ function clamp(value, minimum, maximum) {
510
+ return Math.min(Math.max(value, minimum), maximum);
511
+ }
512
+ function finite(value) {
513
+ return typeof value === "number" && Number.isFinite(value);
514
+ }
515
+ /** Decode one versioned localStorage value, rejecting partial/corrupt state. */
516
+ function parsePanelLayout(value) {
517
+ if (value === null) return DEFAULT_PANEL_LAYOUT;
518
+ try {
519
+ const parsed = JSON.parse(value);
520
+ if (typeof parsed !== "object" || parsed === null) return DEFAULT_PANEL_LAYOUT;
521
+ const record = parsed;
522
+ if (record.mode !== "docked" && record.mode !== "floating" || !finite(record.x) || !finite(record.y) || !finite(record.width) || !finite(record.height)) return DEFAULT_PANEL_LAYOUT;
523
+ return {
524
+ mode: record.mode,
525
+ x: record.x,
526
+ y: record.y,
527
+ width: record.width,
528
+ height: record.height,
529
+ heightMode: record.mode === "floating" && record.heightMode === "manual" ? "manual" : "auto"
530
+ };
531
+ } catch {
532
+ return DEFAULT_PANEL_LAYOUT;
533
+ }
534
+ }
535
+ /** Whether the panel should become a simple inset overlay with no gestures. */
536
+ function compactPanelForBounds(bounds) {
537
+ return bounds.width <= 960;
538
+ }
539
+ /** Docked and compact panels always fit content; floating panels may be user-sized. */
540
+ function panelUsesAutoHeight(layout, bounds) {
541
+ return compactPanelForBounds(bounds) || layout.mode === "docked" || layout.heightMode === "auto";
542
+ }
543
+ /** CSS max-height ceiling that keeps an auto-height panel inside its shell. */
544
+ function panelMaximumHeight(layout, bounds) {
545
+ const bottomInset = compactPanelForBounds(bounds) || layout.mode === "floating" ? 12 : 48;
546
+ return Math.max(1, bounds.height - layout.y - bottomInset);
547
+ }
548
+ /** Resolve persisted state into a visible rectangle inside the current shell. */
549
+ function resolvePanelGeometry(layout, bounds) {
550
+ const boundsWidth = Math.max(1, bounds.width);
551
+ const boundsHeight = Math.max(1, bounds.height);
552
+ if (compactPanelForBounds(bounds)) return {
553
+ ...layout,
554
+ x: 12,
555
+ y: 12,
556
+ width: Math.max(1, boundsWidth - 24),
557
+ height: Math.max(1, boundsHeight - 24)
558
+ };
559
+ const maximumWidth = Math.max(1, Math.min(640, boundsWidth - 24));
560
+ const minimumWidth = Math.min(320, maximumWidth);
561
+ const width = clamp(layout.width, minimumWidth, maximumWidth);
562
+ const maximumHeight = Math.max(1, boundsHeight - 24);
563
+ const minimumHeight = Math.min(360, maximumHeight);
564
+ if (layout.mode === "docked") {
565
+ const y = clamp(64, 12, Math.max(12, boundsHeight - minimumHeight - 12));
566
+ const availableHeight = Math.max(1, boundsHeight - y - 48);
567
+ const height = clamp(availableHeight, Math.min(minimumHeight, availableHeight), maximumHeight);
568
+ const anchorRight = clamp(bounds.anchorRight, 0, boundsWidth);
569
+ const maximumX = Math.max(12, boundsWidth - width - 12);
570
+ return {
571
+ mode: "docked",
572
+ x: clamp(anchorRight - 18 - width, 12, maximumX),
573
+ y,
574
+ width,
575
+ height,
576
+ heightMode: layout.heightMode
577
+ };
578
+ }
579
+ const height = clamp(layout.height, minimumHeight, maximumHeight);
580
+ return {
581
+ mode: "floating",
582
+ x: clamp(layout.x, 12, Math.max(12, boundsWidth - width - 12)),
583
+ y: clamp(layout.y, 12, Math.max(12, boundsHeight - height - 12)),
584
+ width,
585
+ height,
586
+ heightMode: layout.heightMode
587
+ };
588
+ }
589
+ /** Undock without a visual jump by adopting the panel's resolved rectangle. */
590
+ function floatPanelLayout(geometry, bounds) {
591
+ return resolvePanelGeometry({
592
+ ...geometry,
593
+ mode: "floating"
594
+ }, bounds);
595
+ }
596
+ /** Return to the right dock, preserving width and restoring content-fit height. */
597
+ function dockPanelLayout(layout, bounds) {
598
+ return resolvePanelGeometry({
599
+ ...layout,
600
+ mode: "docked",
601
+ heightMode: "auto"
602
+ }, bounds);
603
+ }
604
+ /** Translate a floating panel and clamp it back into the visible shell. */
605
+ function movePanelLayout(start, dx, dy, bounds) {
606
+ return resolvePanelGeometry({
607
+ ...start,
608
+ mode: "floating",
609
+ x: start.x + dx,
610
+ y: start.y + dy
611
+ }, bounds);
612
+ }
613
+ /** Resize while keeping the edge opposite the active handle stationary. */
614
+ function resizePanelLayout(start, edge, dx, dy, bounds) {
615
+ if (start.mode === "docked") {
616
+ if (edge !== "left") return resolvePanelGeometry(start, bounds);
617
+ return resolvePanelGeometry({
618
+ ...start,
619
+ width: start.width - dx
620
+ }, bounds);
621
+ }
622
+ const resolved = resolvePanelGeometry(start, bounds);
623
+ const minimumWidth = Math.min(320, resolved.x + resolved.width - 12);
624
+ const minimumHeight = Math.min(360, bounds.height - resolved.y - 12);
625
+ if (edge === "left") {
626
+ const right = resolved.x + resolved.width;
627
+ const maximumWidth = Math.max(1, Math.min(640, right - 12));
628
+ const width = clamp(resolved.width - dx, Math.min(minimumWidth, maximumWidth), maximumWidth);
629
+ return {
630
+ ...resolved,
631
+ x: right - width,
632
+ width
633
+ };
634
+ }
635
+ const maximumHeight = Math.max(1, bounds.height - resolved.y - 12);
636
+ const height = clamp(resolved.height + dy, Math.min(minimumHeight, maximumHeight), maximumHeight);
637
+ if (edge === "bottom") return {
638
+ ...resolved,
639
+ height,
640
+ heightMode: "manual"
641
+ };
642
+ const maximumWidth = Math.max(1, Math.min(640, bounds.width - resolved.x - 12));
643
+ const width = clamp(resolved.width + dx, Math.min(minimumWidth, maximumWidth), maximumWidth);
644
+ return {
645
+ ...resolved,
646
+ width,
647
+ height,
648
+ heightMode: "manual"
649
+ };
650
+ }
651
+ //#endregion
486
652
  //#region \0dsh-css:/home/runner/work/dsh-agent-teams/dsh-agent-teams/src/client/ActivityPanel.module.css.mjs
487
- const css = "html{--agent-teams-panel-width:388px;--agent-teams-panel-top:64px;--agent-teams-panel-bottom-gap:64px;--agent-teams-panel-min-height:560px;--agent-teams-panel-right:calc(18px + var(--dsh-sidebar-width,0px));--agent-teams-panel-gap:14px;--agent-teams-panel-shift:calc(var(--agent-teams-panel-width) + 18px + var(--agent-teams-panel-gap))}html[data-agent-teams-panel-open] [data-phase=active]{box-sizing:border-box;padding-right:var(--agent-teams-panel-shift)}[data-phase=active]{will-change:padding-right;transition:padding-right .36s cubic-bezier(.22,1,.36,1)}.aYQbCq_badge,.aYQbCq_panel{--dsw-alias-line-normal:var(--dsw-static-neutral-bluish-150,#e7e9ee);--dsw-alias-line-strong:color-mix(in srgb, var(--dsw-static-neutral-bluish-200,#e1e5ee) 50%, var(--dsw-static-neutral-bluish-300,#cfd3d6));--dsw-alias-bg-module:var(--dsw-alias-bg-layer-1,#fff);--dsw-alias-bg-fill-neutral:var(--dsw-static-neutral-bluish-100,#eef0f4);--dsw-alias-bg-fill-business:var(--dsw-alias-state-business-primary,#4d6bfe);--dsw-alias-bg-fill-success:var(--dsw-alias-state-success-primary,#12a150);--dsw-alias-bg-fill-warning:var(--dsw-alias-state-warn-primary,#e08700);--dsw-alias-bg-fill-danger:var(--dsw-alias-state-error-primary,#e5484d);--dsw-alias-state-success:var(--dsw-alias-state-success-primary,#12a150);--dsw-alias-state-warning:var(--dsw-alias-state-warn-primary,#e08700);--dsw-alias-state-danger:var(--dsw-alias-state-error-primary,#e5484d);--dsw-alias-label-on-fill:var(--dsw-alias-label-primary-inverted,#fff)}.aYQbCq_badge{top:var(--agent-teams-panel-top);right:var(--agent-teams-panel-right);z-index:2147483000;box-sizing:border-box;border:1px solid var(--dsw-alias-line-normal);background:color-mix(in srgb, var(--dsw-alias-bg-module-platform) 92%, transparent);backdrop-filter:blur(16px);height:34px;box-shadow:0 8px 28px color-mix(in srgb, var(--dsw-alias-label-primary) 14%, transparent);color:var(--dsw-alias-label-secondary);font:inherit;cursor:pointer;border-radius:999px;align-items:center;gap:7px;padding:0 12px;font-size:12px;font-weight:600;line-height:20px;transition:border-color .15s,transform .12s;display:inline-flex;position:fixed}.aYQbCq_badge:hover{border-color:var(--dsw-alias-line-strong);transform:translateY(-1px)}.aYQbCq_badge:active{transform:translateY(0)scale(.98)}.aYQbCq_badge:focus-visible,.aYQbCq_closeButton:focus-visible,.aYQbCq_memberRow:focus-visible,.aYQbCq_membersToggle:focus-visible,.aYQbCq_sectionToggleTitle:focus-visible,.aYQbCq_dagNode:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:2px}.aYQbCq_badgeDot,.aYQbCq_panelDot{background:var(--dsw-alias-label-tertiary);border-radius:50%;width:7px;height:7px}.aYQbCq_badgeDot[data-busy=true],.aYQbCq_panelDot[data-busy=true]{background:var(--dsw-alias-state-business-primary);animation:1.25s ease-in-out infinite aYQbCq_agentTeamsPulse}.aYQbCq_badgeCount,.aYQbCq_memberCount,.aYQbCq_teamStats,.aYQbCq_stageLabel,.aYQbCq_taskId{font-variant-numeric:tabular-nums}.aYQbCq_panel{top:var(--agent-teams-panel-top);right:var(--agent-teams-panel-right);z-index:2147483000;width:min(var(--agent-teams-panel-width), calc(100vw - 24px));min-height:min(var(--agent-teams-panel-min-height), calc(100dvh - var(--agent-teams-panel-top) - var(--agent-teams-panel-bottom-gap)));max-height:calc(100dvh - var(--agent-teams-panel-top) - var(--agent-teams-panel-bottom-gap));box-sizing:border-box;border:1px solid color-mix(in srgb, var(--dsw-alias-line-strong) 58%, transparent);background:color-mix(in srgb, var(--dsw-alias-bg-module) 95%, transparent);backdrop-filter:blur(20px)saturate(1.08);box-shadow:0 12px 32px color-mix(in srgb, var(--dsw-alias-label-primary) 12%, transparent), 0 32px 72px color-mix(in srgb, var(--dsw-alias-label-primary) 16%, transparent);border-radius:16px;flex-direction:column;animation:.18s ease-out aYQbCq_agentTeamsPanelIn;display:flex;position:fixed;overflow:hidden}@keyframes aYQbCq_agentTeamsPanelIn{0%{opacity:0;transform:translateY(-6px)scale(.99)}to{opacity:1;transform:translateY(0)scale(1)}}@keyframes aYQbCq_agentTeamsPulse{0%,to{opacity:.42}50%{opacity:1}}.aYQbCq_panelHead{border-bottom:1px solid var(--dsw-alias-line-normal);flex:none;justify-content:space-between;align-items:center;min-height:44px;padding:0 14px 0 16px;display:flex}.aYQbCq_panelTitle{color:var(--dsw-alias-label-primary);align-items:center;gap:8px;font-size:14px;font-weight:600;line-height:20px;display:inline-flex}.aYQbCq_closeButton{width:28px;height:28px;color:var(--dsw-alias-label-tertiary);cursor:pointer;background:0 0;border:0;border-radius:7px;justify-content:center;align-items:center;padding:0;transition:background-color .12s,color .12s,transform .12s;display:inline-flex}.aYQbCq_closeButton:hover{background:var(--dsw-alias-bg-fill-neutral);color:var(--dsw-alias-label-primary)}.aYQbCq_closeButton:active{transform:scale(.94)}.aYQbCq_teams{overscroll-behavior:contain;scrollbar-width:none;flex-direction:column;min-height:0;display:flex;overflow-y:auto}.aYQbCq_teams::-webkit-scrollbar{display:none}.aYQbCq_team{border-bottom:1px solid var(--dsw-alias-line-normal);flex-direction:column;gap:12px;padding:12px 14px 16px;display:flex}.aYQbCq_team:last-child{border-bottom:0}.aYQbCq_teamHead{align-items:center;gap:10px;min-width:0;display:flex}.aYQbCq_teamName{min-width:0;color:var(--dsw-alias-label-primary);text-overflow:ellipsis;white-space:nowrap;flex:1;font-size:13px;font-weight:600;line-height:18px;overflow:hidden}.aYQbCq_teamStats{color:var(--dsw-alias-label-tertiary);white-space:nowrap;flex:none;gap:8px;font-size:10.5px;line-height:16px;display:inline-flex}.aYQbCq_sectionHead{justify-content:space-between;align-items:center;gap:8px;min-width:0;display:flex}.aYQbCq_sectionTitle{color:var(--dsw-alias-label-secondary);align-items:center;gap:6px;font-size:11px;font-weight:600;line-height:16px;display:inline-flex}.aYQbCq_sectionHint{color:var(--dsw-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;font-size:10px;line-height:14px;overflow:hidden}.aYQbCq_delegationSection{min-width:0}.aYQbCq_captainNode{box-sizing:border-box;border:1px solid color-mix(in srgb, var(--dsw-alias-state-business-primary) 32%, var(--dsw-alias-line-normal));background:color-mix(in srgb, var(--dsw-alias-state-business-primary) 7%, var(--dsw-alias-bg-module));border-radius:10px;grid-template-columns:38px minmax(0,1fr) auto;align-items:center;gap:9px;min-height:48px;padding:8px 10px;display:grid}.aYQbCq_captainAvatar,.aYQbCq_memberAvatar{flex:none;justify-content:center;align-items:center;display:inline-flex;position:relative}.aYQbCq_captainAvatar{width:36px;height:36px}.aYQbCq_leadAvatar,.aYQbCq_memberArt,.aYQbCq_memberInitial{box-sizing:border-box;border:1px solid var(--dsw-alias-line-strong);object-fit:cover;background:#0b1d33;border-radius:50%;width:34px;height:34px}.aYQbCq_captainInfo,.aYQbCq_memberInfo{flex-direction:column;min-width:0;display:flex}.aYQbCq_captainInfo{gap:2px}.aYQbCq_captainLine,.aYQbCq_memberLine{align-items:center;gap:6px;min-width:0;display:flex}.aYQbCq_captainName,.aYQbCq_memberName{color:var(--dsw-alias-label-primary);text-overflow:ellipsis;white-space:nowrap;font-size:12.5px;font-weight:600;line-height:18px;overflow:hidden}.aYQbCq_captainRole,.aYQbCq_memberRole{color:var(--dsw-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;font-size:10px;line-height:14px;overflow:hidden}.aYQbCq_captainSummary,.aYQbCq_memberStatusLine{color:var(--dsw-alias-label-secondary);text-overflow:ellipsis;white-space:nowrap;font-size:10.5px;line-height:15px;overflow:hidden}.aYQbCq_captainState,.aYQbCq_memberState{color:var(--dsw-alias-label-tertiary);white-space:nowrap;flex:none;align-items:center;gap:5px;font-size:10px;font-weight:500;line-height:15px;display:inline-flex}.aYQbCq_captainState[data-busy=true],.aYQbCq_memberState[data-activity=working]{color:var(--dsw-alias-state-business-primary)}.aYQbCq_workGlyph rect{opacity:.5}.aYQbCq_workGlyph[data-active=true] rect{animation:1.1s ease-in-out infinite aYQbCq_agentTeamsDot}@keyframes aYQbCq_agentTeamsDot{0%,to{opacity:.25}50%{opacity:1}}.aYQbCq_progressOverview{flex-direction:column;gap:7px;display:flex}.aYQbCq_progressTitle{color:var(--dsw-alias-label-secondary);font-size:11px;font-weight:600;line-height:16px}.aYQbCq_progressSegments{gap:3px;display:flex}.aYQbCq_progressSegments>span,.aYQbCq_progressEmpty{background:var(--dsw-alias-line-strong);border-radius:2px;flex:1;height:5px}.aYQbCq_progressEmpty{width:100%;display:block}.aYQbCq_progressSegments>span[data-state=running]{background:var(--dsw-alias-state-business-primary)}.aYQbCq_progressSegments>span[data-state=blocked]{background:var(--dsw-alias-state-warning)}.aYQbCq_progressSegments>span[data-state=completed]{background:var(--dsw-alias-state-success)}.aYQbCq_progressSegments>span[data-state=failed]{background:var(--dsw-alias-state-danger)}.aYQbCq_progressSegments>span[data-state=cancelled]{opacity:.55}.aYQbCq_progressLegend{color:var(--dsw-alias-label-tertiary);gap:10px;font-size:9.5px;line-height:14px;display:flex}.aYQbCq_progressLegend>span[data-state=running]{color:var(--dsw-alias-state-business-primary)}.aYQbCq_progressLegend>span[data-state=blocked]{color:var(--dsw-alias-state-warning)}.aYQbCq_progressLegend>span[data-state=completed]{color:var(--dsw-alias-state-success)}.aYQbCq_progressSummary{background:color-mix(in srgb, var(--dsw-alias-state-business-primary) 7%, var(--dsw-alias-bg-module));min-width:0;color:var(--dsw-alias-label-secondary);border-radius:8px;align-items:center;gap:6px;padding:5px 8px;font-size:10px;font-weight:600;line-height:15px;display:flex}.aYQbCq_progressSummary[data-state=warning]{background:color-mix(in srgb, var(--dsw-alias-state-warning) 8%, var(--dsw-alias-bg-module))}.aYQbCq_progressSummary[data-state=completed]{background:color-mix(in srgb, var(--dsw-alias-state-success) 8%, var(--dsw-alias-bg-module))}.aYQbCq_progressSummary>span:last-child{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.aYQbCq_progressSummaryDot{background:var(--dsw-alias-state-business-primary);border-radius:50%;flex:none;width:5px;height:5px}.aYQbCq_progressSummary[data-state=warning] .aYQbCq_progressSummaryDot{background:var(--dsw-alias-state-warning)}.aYQbCq_progressSummary[data-state=completed] .aYQbCq_progressSummaryDot{background:var(--dsw-alias-state-success)}.aYQbCq_membersToggle{background:var(--dsw-alias-bg-module-platform);width:100%;color:var(--dsw-alias-label-secondary);font:inherit;cursor:pointer;border:0;border-radius:8px;justify-content:space-between;align-items:center;gap:8px;padding:6px 8px;font-size:10.5px;font-weight:600;line-height:15px;display:flex}.aYQbCq_membersToggle:hover{background:var(--dsw-alias-bg-fill-neutral)}.aYQbCq_membersToggle>span{align-items:center;gap:5px;display:inline-flex}.aYQbCq_membersToggle>span:last-child{color:var(--dsw-alias-state-business-primary)}.aYQbCq_chevron{flex:none;transition:transform .14s}.aYQbCq_chevron[data-open=true]{transform:rotate(90deg)}.aYQbCq_delegationTree{flex-direction:column;gap:2px;margin-left:18px;padding:9px 0 0 20px;display:flex;position:relative}.aYQbCq_delegationTree:before{background:color-mix(in srgb, var(--dsw-alias-state-business-primary) 48%, var(--dsw-alias-line-normal));content:\"\";width:1px;position:absolute;top:0;bottom:22px;left:0}.aYQbCq_memberBlock{flex-direction:column;min-width:0;padding:3px 0 7px;display:flex;position:relative}.aYQbCq_memberBranch{background:color-mix(in srgb, var(--dsw-alias-state-business-primary) 48%, var(--dsw-alias-line-normal));width:20px;height:1px;display:block;position:absolute;top:23px;right:100%}.aYQbCq_memberBranch:before{background:var(--dsw-alias-state-business-primary);content:\"\";border-radius:50%;width:5px;height:5px;position:absolute;top:-2px;right:-1px}.aYQbCq_memberRow{box-sizing:border-box;width:100%;min-width:0;min-height:44px;color:inherit;font:inherit;text-align:left;cursor:pointer;background:0 0;border:0;border-radius:8px;grid-template-columns:38px minmax(0,1fr) auto;align-items:center;gap:8px;padding:4px 6px;transition:background-color .12s,transform .12s;display:grid}.aYQbCq_memberRow:hover,.aYQbCq_memberRow[data-activity=working]{background:color-mix(in srgb, var(--dsw-alias-state-business-primary) 6%, var(--dsw-alias-bg-module))}.aYQbCq_memberRow:active{transform:scale(.995)}.aYQbCq_memberAvatar{width:34px;height:34px}.aYQbCq_memberAvatar[data-unread=true]:after{border:1px solid var(--dsw-alias-state-business-primary);content:\"\";border-radius:50%;animation:1.5s ease-out infinite aYQbCq_agentTeamsRing;position:absolute;inset:-3px}@keyframes aYQbCq_agentTeamsRing{0%{opacity:.82;transform:scale(.94)}75%,to{opacity:0;transform:scale(1.18)}}.aYQbCq_memberInitial{color:var(--dsw-alias-label-on-fill);justify-content:center;align-items:center;font-size:14px;font-weight:600;line-height:20px;display:inline-flex}.aYQbCq_stateArt{box-sizing:border-box;border:2px solid var(--dsw-alias-bg-module);object-fit:cover;background:#0b1d33;border-radius:50%;width:19px;height:19px;position:absolute;bottom:-4px;right:-4px}.aYQbCq_stateArt[data-activity=working]{animation:2.4s ease-in-out infinite aYQbCq_agentTeamsFloat}.aYQbCq_stateArt[data-activity=idle]{animation:4.2s ease-in-out infinite aYQbCq_agentTeamsBreathe}.aYQbCq_stateArt[data-activity=unknown]{animation:2.8s ease-in-out infinite aYQbCq_agentTeamsThink}@keyframes aYQbCq_agentTeamsFloat{0%,to{transform:translateY(0)rotate(-4deg)}50%{transform:translateY(-2px)rotate(4deg)}}@keyframes aYQbCq_agentTeamsBreathe{0%,to{opacity:.82;transform:scale(1)}50%{opacity:1;transform:scale(1.06)}}@keyframes aYQbCq_agentTeamsThink{0%,to{transform:rotate(-7deg)}50%{transform:rotate(7deg)}}.aYQbCq_memberState{margin-left:auto}.aYQbCq_memberCount{color:var(--dsw-alias-label-tertiary);font-size:10.5px;line-height:16px}.aYQbCq_assignmentLine{align-items:center;gap:7px;min-width:0;padding:0 6px 0 52px;display:flex}.aYQbCq_assignmentLabel{color:var(--dsw-alias-label-tertiary);flex:none;font-size:9.5px;line-height:14px}.aYQbCq_assignmentTasks{flex-wrap:wrap;flex:1;gap:4px;min-width:0;display:flex}.aYQbCq_assignmentChip{background:var(--dsw-alias-bg-fill-neutral);min-height:16px;color:var(--dsw-alias-label-secondary);border-radius:4px;align-items:center;padding:0 5px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:9px;font-weight:600;line-height:14px;display:inline-flex}.aYQbCq_assignmentChip[data-state=running]{background:var(--dsw-alias-bg-fill-business);color:var(--dsw-alias-label-on-fill)}.aYQbCq_assignmentChip[data-state=completed]{background:var(--dsw-alias-bg-fill-success);color:var(--dsw-alias-label-on-fill)}.aYQbCq_assignmentChip[data-state=blocked]{background:var(--dsw-alias-bg-fill-warning);color:var(--dsw-alias-label-on-fill)}.aYQbCq_assignmentChip[data-state=failed]{background:var(--dsw-alias-bg-fill-danger);color:var(--dsw-alias-label-on-fill)}.aYQbCq_assignmentChip[data-state=cancelled]{color:var(--dsw-alias-label-tertiary);text-decoration:line-through}.aYQbCq_unreadPill{color:var(--dsw-alias-state-business-primary);white-space:nowrap;flex:none;font-size:9.5px;font-weight:600;line-height:14px}.aYQbCq_taskEmpty{color:var(--dsw-alias-label-tertiary);font-size:9.5px;line-height:14px}.aYQbCq_dependencySection{border-top:1px solid var(--dsw-alias-line-normal);flex-direction:column;gap:7px;min-width:0;padding-top:10px;display:flex}.aYQbCq_sectionToggleTitle{color:var(--dsw-alias-label-secondary);font:inherit;cursor:pointer;background:0 0;border:0;align-items:center;gap:6px;padding:0;font-size:11px;font-weight:600;line-height:16px;display:inline-flex}.aYQbCq_dagViewport{scrollbar-width:thin;min-width:0;padding:2px 0 4px;overflow-x:auto}.aYQbCq_dagCanvas{min-width:100%;position:relative}.aYQbCq_dagCanvas[data-layout=parallel]{flex-wrap:wrap;gap:8px;display:flex}.aYQbCq_dagCanvas[data-layout=parallel] .aYQbCq_dagNode{flex:92px;min-width:92px;position:relative}.aYQbCq_dagEdges{pointer-events:none;position:absolute;inset:0;overflow:visible}.aYQbCq_dagEdges path{fill:none;stroke:var(--dsw-alias-line-strong);stroke-width:1px;transition:opacity .14s,stroke .14s,stroke-width .14s}.aYQbCq_dagEdges path[data-active=true]{stroke:var(--dsw-alias-state-business-primary);stroke-width:1.6px}.aYQbCq_dagEdges path[data-dimmed=true]{opacity:.24}.aYQbCq_dagNode{box-sizing:border-box;border:1px solid var(--dsw-alias-line-normal);background:var(--dsw-alias-bg-module);color:var(--dsw-alias-label-primary);font:inherit;text-align:left;cursor:pointer;border-radius:6px;flex-direction:column;justify-content:center;gap:1px;padding:0 6px;transition:border-color .14s,background-color .14s,opacity .14s;display:flex;position:absolute}.aYQbCq_dagNode:hover,.aYQbCq_dagNode[data-focused=true]{border-color:var(--dsw-alias-state-business-primary);background:color-mix(in srgb, var(--dsw-alias-state-business-primary) 6%, var(--dsw-alias-bg-module))}.aYQbCq_dagNode[data-dimmed=true]{opacity:.3}.aYQbCq_dagNode[data-state=running][data-dimmed=true]{opacity:.58}.aYQbCq_dagNode[data-state=completed]{border-color:color-mix(in srgb, var(--dsw-alias-state-success) 48%, var(--dsw-alias-line-normal))}.aYQbCq_dagNode[data-state=blocked]{border-color:color-mix(in srgb, var(--dsw-alias-state-warning) 52%, var(--dsw-alias-line-normal))}.aYQbCq_dagNode[data-state=failed]{border-color:color-mix(in srgb, var(--dsw-alias-state-danger) 56%, var(--dsw-alias-line-normal))}.aYQbCq_dagNodeHead{color:var(--dsw-alias-label-primary);align-items:center;gap:4px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:9.5px;font-weight:700;display:flex}.aYQbCq_dagNodeDot{background:var(--dsw-alias-line-strong);border-radius:1.5px;flex:none;width:5px;height:5px}.aYQbCq_dagNode[data-state=running] .aYQbCq_dagNodeDot{background:var(--dsw-alias-state-business-primary)}.aYQbCq_dagNode[data-state=running] .aYQbCq_dagNodeHead{padding-right:12px}.aYQbCq_dagRunningState{width:9px;height:9px;color:var(--dsw-alias-state-business-primary);pointer-events:none;justify-content:center;align-items:center;display:inline-flex;position:absolute;top:4px;right:5px}.aYQbCq_dagRunningState .aYQbCq_workGlyph{width:9px;height:9px}.aYQbCq_dagNode[data-state=blocked] .aYQbCq_dagNodeDot{background:var(--dsw-alias-state-warning)}.aYQbCq_dagNode[data-state=completed] .aYQbCq_dagNodeDot{background:var(--dsw-alias-state-success)}.aYQbCq_dagNode[data-state=failed] .aYQbCq_dagNodeDot{background:var(--dsw-alias-state-danger)}.aYQbCq_dagNodeLabel{color:var(--dsw-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;font-size:8.5px;line-height:11px;overflow:hidden}.aYQbCq_taskDetail{border:1px solid var(--dsw-alias-line-normal);background:var(--dsw-alias-bg-module-platform);border-radius:9px;flex-direction:column;gap:3px;min-width:0;padding:7px 9px;display:flex}.aYQbCq_taskDetailHead{align-items:center;gap:6px;min-width:0;display:flex}.aYQbCq_taskDetailId{color:var(--dsw-alias-state-business-primary);flex:none;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:10px;font-weight:700}.aYQbCq_taskDetailSubject{min-width:0;color:var(--dsw-alias-label-primary);text-overflow:ellipsis;white-space:nowrap;font-size:11px;font-weight:600;line-height:16px;overflow:hidden}.aYQbCq_taskDetailBadge{background:var(--dsw-alias-bg-fill-neutral);color:var(--dsw-alias-label-secondary);border-radius:4px;flex:none;padding:0 5px;font-size:8.5px;font-weight:600;line-height:14px}.aYQbCq_taskDetailBadge[data-state=running]{background:var(--dsw-alias-bg-fill-business);color:var(--dsw-alias-label-on-fill)}.aYQbCq_taskDetailBadge[data-state=blocked]{background:var(--dsw-alias-bg-fill-warning);color:var(--dsw-alias-label-on-fill)}.aYQbCq_taskDetailBadge[data-state=completed]{background:var(--dsw-alias-bg-fill-success);color:var(--dsw-alias-label-on-fill)}.aYQbCq_taskDetailBadge[data-state=failed]{background:var(--dsw-alias-bg-fill-danger);color:var(--dsw-alias-label-on-fill)}.aYQbCq_taskDetailLine,.aYQbCq_taskDetailMeta{color:var(--dsw-alias-label-secondary);font-size:9.5px;line-height:14px}.aYQbCq_taskDetailMeta{color:var(--dsw-alias-label-tertiary)}.aYQbCq_emptyHint{color:var(--dsw-alias-label-tertiary);padding:10px 12px;font-size:11px;line-height:16px}.aYQbCq_historicPill{background:var(--dsw-alias-bg-fill-neutral);color:var(--dsw-alias-label-tertiary);border-radius:4px;flex:none;margin-left:auto;padding:1px 7px;font-size:9.5px;font-weight:600;line-height:15px}.aYQbCq_members{flex-direction:column;gap:3px;display:flex}.aYQbCq_archivedWrap:before{color:var(--dsw-alias-label-tertiary);content:\"已结束 · 历史归档\";padding:5px 14px 0;font-size:9.5px;font-weight:600;line-height:14px;display:block}@media (prefers-reduced-motion:reduce){[data-phase=active],.aYQbCq_panel,.aYQbCq_badge,.aYQbCq_badgeDot,.aYQbCq_panelDot,.aYQbCq_workGlyph rect,.aYQbCq_stateArt,.aYQbCq_memberAvatar[data-unread=true]:after{transition:none;animation:none}}@media (width<=960px){html{--agent-teams-main-shift:0px}html[data-agent-teams-panel-open] [data-phase=active]{padding-right:0}}@media (width<=640px){html{--agent-teams-panel-right:calc(10px + var(--dsh-sidebar-width,0px));--agent-teams-panel-top:56px;--agent-teams-panel-bottom-gap:56px}.aYQbCq_panel{width:auto;left:10px}.aYQbCq_teamStats span[data-stat=messages]{display:none}.aYQbCq_captainNode{grid-template-columns:38px minmax(0,1fr)}.aYQbCq_captainState{display:none}.aYQbCq_delegationTree{margin-left:12px;padding-left:15px}.aYQbCq_memberBranch{width:15px}.aYQbCq_assignmentLine{padding-left:45px}}";
653
+ const css = "html{--agent-teams-panel-shift:420px}html[data-agent-teams-panel-open] [data-phase=active]{box-sizing:border-box;padding-right:var(--agent-teams-panel-shift)}.aYQbCq_badge,.aYQbCq_panel{--dsw-alias-line-normal:var(--dsw-static-neutral-bluish-150,#e7e9ee);--dsw-alias-line-strong:color-mix(in srgb, var(--dsw-static-neutral-bluish-200,#e1e5ee) 50%, var(--dsw-static-neutral-bluish-300,#cfd3d6));--dsw-alias-bg-module:var(--dsw-alias-bg-layer-1,#fff);--dsw-alias-bg-fill-neutral:var(--dsw-static-neutral-bluish-100,#eef0f4);--dsw-alias-bg-fill-business:var(--dsw-alias-state-business-primary,#4d6bfe);--dsw-alias-bg-fill-success:var(--dsw-alias-state-success-primary,#12a150);--dsw-alias-bg-fill-warning:var(--dsw-alias-state-warn-primary,#e08700);--dsw-alias-bg-fill-danger:var(--dsw-alias-state-error-primary,#e5484d);--dsw-alias-state-success:var(--dsw-alias-state-success-primary,#12a150);--dsw-alias-state-warning:var(--dsw-alias-state-warn-primary,#e08700);--dsw-alias-state-danger:var(--dsw-alias-state-error-primary,#e5484d);--dsw-alias-label-on-fill:var(--dsw-alias-label-primary-inverted,#fff)}.aYQbCq_badge{box-sizing:border-box;border:1px solid var(--dsw-alias-line-normal);background:color-mix(in srgb, var(--dsw-alias-bg-module-platform) 92%, transparent);backdrop-filter:blur(16px);height:34px;box-shadow:0 8px 28px color-mix(in srgb, var(--dsw-alias-label-primary) 14%, transparent);color:var(--dsw-alias-label-secondary);font:inherit;cursor:pointer;border-radius:999px;align-items:center;gap:7px;padding:0 12px;font-size:12px;font-weight:600;line-height:20px;transition:border-color .15s,transform .12s;display:inline-flex;position:absolute;top:64px;right:18px}.aYQbCq_badge:hover{border-color:var(--dsw-alias-line-strong);transform:translateY(-1px)}.aYQbCq_badge:active{transform:translateY(0)scale(.98)}.aYQbCq_badge:focus-visible,.aYQbCq_iconButton:focus-visible,.aYQbCq_memberRow:focus-visible,.aYQbCq_membersToggle:focus-visible,.aYQbCq_sectionToggleTitle:focus-visible,.aYQbCq_dagNode:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary);outline-offset:2px}.aYQbCq_badgeDot,.aYQbCq_panelDot{background:var(--dsw-alias-label-tertiary);border-radius:50%;width:7px;height:7px}.aYQbCq_badgeDot[data-busy=true],.aYQbCq_panelDot[data-busy=true]{background:var(--dsw-alias-state-business-primary);animation:1.25s ease-in-out infinite aYQbCq_agentTeamsPulse}.aYQbCq_badgeCount,.aYQbCq_memberCount,.aYQbCq_teamStats,.aYQbCq_stageLabel,.aYQbCq_taskId{font-variant-numeric:tabular-nums}.aYQbCq_panel{box-sizing:border-box;border:1px solid color-mix(in srgb, var(--dsw-alias-line-strong) 58%, transparent);background:color-mix(in srgb, var(--dsw-alias-bg-module) 95%, transparent);backdrop-filter:blur(20px)saturate(1.08);box-shadow:0 12px 32px color-mix(in srgb, var(--dsw-alias-label-primary) 12%, transparent), 0 32px 72px color-mix(in srgb, var(--dsw-alias-label-primary) 16%, transparent);will-change:transform;border-radius:16px;flex-direction:column;animation:.16s ease-out aYQbCq_agentTeamsPanelIn;display:flex;position:absolute;top:0;left:0;overflow:hidden}.aYQbCq_panel[data-dragging],.aYQbCq_panel[data-resizing]{user-select:none;box-shadow:0 16px 38px color-mix(in srgb, var(--dsw-alias-label-primary) 14%, transparent), 0 36px 78px color-mix(in srgb, var(--dsw-alias-label-primary) 18%, transparent)}@keyframes aYQbCq_agentTeamsPanelIn{0%{opacity:0}to{opacity:1}}@keyframes aYQbCq_agentTeamsPulse{0%,to{opacity:.42}50%{opacity:1}}.aYQbCq_panelHead{border-bottom:1px solid var(--dsw-alias-line-normal);cursor:grab;touch-action:none;flex:none;justify-content:space-between;align-items:center;min-height:44px;padding:0 14px 0 16px;display:flex}.aYQbCq_panelHead:active,.aYQbCq_panel[data-dragging] .aYQbCq_panelHead{cursor:grabbing}.aYQbCq_panel[data-compact] .aYQbCq_panelHead{cursor:default;touch-action:auto}.aYQbCq_panelTitle{color:var(--dsw-alias-label-primary);align-items:center;gap:8px;font-size:14px;font-weight:600;line-height:20px;display:inline-flex}.aYQbCq_panelControls{flex:none;align-items:center;gap:2px;display:inline-flex}.aYQbCq_iconButton{width:28px;height:28px;color:var(--dsw-alias-label-tertiary);cursor:pointer;background:0 0;border:0;border-radius:7px;justify-content:center;align-items:center;padding:0;transition:background-color .12s,color .12s,transform .12s;display:inline-flex}.aYQbCq_iconButton:hover{background:var(--dsw-alias-bg-fill-neutral);color:var(--dsw-alias-label-primary)}.aYQbCq_iconButton:active{transform:scale(.94)}.aYQbCq_iconButton[data-control=dock][data-mode=docked] svg{transform:scaleX(-1)}.aYQbCq_resizeHandle{z-index:1;touch-action:none;position:absolute}.aYQbCq_resizeHandle[data-resize-edge=left]{cursor:ew-resize;width:8px;top:44px;bottom:8px;left:0}.aYQbCq_resizeHandle[data-resize-edge=bottom]{cursor:ns-resize;height:8px;bottom:0;left:12px;right:12px}.aYQbCq_resizeHandle[data-resize-edge=corner]{cursor:nwse-resize;width:18px;height:18px;bottom:0;right:0}.aYQbCq_resizeHandle[data-resize-edge=corner]:after{border-right:1px solid var(--dsw-alias-label-tertiary);border-bottom:1px solid var(--dsw-alias-label-tertiary);content:\"\";opacity:.52;width:7px;height:7px;position:absolute;bottom:4px;right:4px}.aYQbCq_teams{overscroll-behavior:contain;scrollbar-color:color-mix(in srgb, var(--dsw-alias-label-tertiary) 28%, transparent) transparent;scrollbar-width:thin;flex-direction:column;min-height:0;display:flex;overflow-y:auto}.aYQbCq_teams::-webkit-scrollbar{width:6px}.aYQbCq_teams::-webkit-scrollbar-track{background:0 0}.aYQbCq_teams::-webkit-scrollbar-thumb{background:color-mix(in srgb, var(--dsw-alias-label-tertiary) 28%, transparent);background-clip:padding-box;border:2px solid #0000;border-radius:999px}.aYQbCq_teams:hover::-webkit-scrollbar-thumb{background:color-mix(in srgb, var(--dsw-alias-label-tertiary) 44%, transparent);background-clip:padding-box}.aYQbCq_team{border-bottom:1px solid var(--dsw-alias-line-normal);flex-direction:column;gap:12px;padding:12px 14px 16px;display:flex}.aYQbCq_team:last-child{border-bottom:0}.aYQbCq_teamHead{align-items:center;gap:10px;min-width:0;display:flex}.aYQbCq_teamName{min-width:0;color:var(--dsw-alias-label-primary);text-overflow:ellipsis;white-space:nowrap;flex:1;font-size:13px;font-weight:600;line-height:18px;overflow:hidden}.aYQbCq_teamStats{color:var(--dsw-alias-label-tertiary);white-space:nowrap;flex:none;gap:8px;font-size:10.5px;line-height:16px;display:inline-flex}.aYQbCq_sectionHead{justify-content:space-between;align-items:center;gap:8px;min-width:0;display:flex}.aYQbCq_sectionTitle{color:var(--dsw-alias-label-secondary);align-items:center;gap:6px;font-size:11px;font-weight:600;line-height:16px;display:inline-flex}.aYQbCq_sectionHint{color:var(--dsw-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;font-size:10px;line-height:14px;overflow:hidden}.aYQbCq_delegationSection{min-width:0}.aYQbCq_captainNode{box-sizing:border-box;border:1px solid color-mix(in srgb, var(--dsw-alias-state-business-primary) 32%, var(--dsw-alias-line-normal));background:color-mix(in srgb, var(--dsw-alias-state-business-primary) 7%, var(--dsw-alias-bg-module));border-radius:10px;grid-template-columns:48px minmax(0,1fr) auto;align-items:center;gap:9px;min-height:56px;padding:6px 10px;display:grid}.aYQbCq_captainAvatar,.aYQbCq_memberAvatar{flex:none;justify-content:center;align-items:center;display:inline-flex;position:relative}.aYQbCq_captainAvatar{width:46px;height:46px}.aYQbCq_leadAvatar,.aYQbCq_memberArt{object-fit:contain;filter:drop-shadow(0 1px 1px #122d4833);background:0 0;border:0;border-radius:0}.aYQbCq_leadAvatar{width:44px;height:44px}.aYQbCq_memberArt{width:40px;height:40px}.aYQbCq_captainInfo,.aYQbCq_memberInfo{flex-direction:column;min-width:0;display:flex}.aYQbCq_captainInfo{gap:2px}.aYQbCq_captainLine,.aYQbCq_memberLine{align-items:center;gap:6px;min-width:0;display:flex}.aYQbCq_captainName,.aYQbCq_memberName{color:var(--dsw-alias-label-primary);text-overflow:ellipsis;white-space:nowrap;font-size:12.5px;font-weight:600;line-height:18px;overflow:hidden}.aYQbCq_captainRole,.aYQbCq_memberRole{color:var(--dsw-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;font-size:10px;line-height:14px;overflow:hidden}.aYQbCq_captainSummary,.aYQbCq_memberStatusLine{color:var(--dsw-alias-label-secondary);text-overflow:ellipsis;white-space:nowrap;font-size:10.5px;line-height:15px;overflow:hidden}.aYQbCq_captainState,.aYQbCq_memberState{color:var(--dsw-alias-label-tertiary);white-space:nowrap;flex:none;align-items:center;gap:5px;font-size:10px;font-weight:500;line-height:15px;display:inline-flex}.aYQbCq_captainState[data-busy=true],.aYQbCq_memberState[data-activity=working]{color:var(--dsw-alias-state-business-primary)}.aYQbCq_workGlyph rect{opacity:.5}.aYQbCq_workGlyph[data-active=true] rect{animation:1.1s ease-in-out infinite aYQbCq_agentTeamsDot}@keyframes aYQbCq_agentTeamsDot{0%,to{opacity:.25}50%{opacity:1}}.aYQbCq_progressOverview{flex-direction:column;gap:7px;display:flex}.aYQbCq_progressTitle{color:var(--dsw-alias-label-secondary);font-size:11px;font-weight:600;line-height:16px}.aYQbCq_progressSegments{gap:3px;display:flex}.aYQbCq_progressSegments>span,.aYQbCq_progressEmpty{background:var(--dsw-alias-line-strong);border-radius:2px;flex:1;height:5px}.aYQbCq_progressEmpty{width:100%;display:block}.aYQbCq_progressSegments>span[data-state=running]{background:var(--dsw-alias-state-business-primary)}.aYQbCq_progressSegments>span[data-state=blocked]{background:var(--dsw-alias-state-warning)}.aYQbCq_progressSegments>span[data-state=completed]{background:var(--dsw-alias-state-success)}.aYQbCq_progressSegments>span[data-state=failed]{background:var(--dsw-alias-state-danger)}.aYQbCq_progressSegments>span[data-state=cancelled]{opacity:.55}.aYQbCq_progressLegend{color:var(--dsw-alias-label-tertiary);gap:10px;font-size:9.5px;line-height:14px;display:flex}.aYQbCq_progressLegend>span[data-state=running]{color:var(--dsw-alias-state-business-primary)}.aYQbCq_progressLegend>span[data-state=blocked]{color:var(--dsw-alias-state-warning)}.aYQbCq_progressLegend>span[data-state=completed]{color:var(--dsw-alias-state-success)}.aYQbCq_progressSummary{background:color-mix(in srgb, var(--dsw-alias-state-business-primary) 7%, var(--dsw-alias-bg-module));min-width:0;color:var(--dsw-alias-label-secondary);border-radius:8px;align-items:center;gap:6px;padding:5px 8px;font-size:10px;font-weight:600;line-height:15px;display:flex}.aYQbCq_progressSummary[data-state=warning]{background:color-mix(in srgb, var(--dsw-alias-state-warning) 8%, var(--dsw-alias-bg-module))}.aYQbCq_progressSummary[data-state=completed]{background:color-mix(in srgb, var(--dsw-alias-state-success) 8%, var(--dsw-alias-bg-module))}.aYQbCq_progressSummary>span:last-child{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.aYQbCq_progressSummaryDot{background:var(--dsw-alias-state-business-primary);border-radius:50%;flex:none;width:5px;height:5px}.aYQbCq_progressSummary[data-state=warning] .aYQbCq_progressSummaryDot{background:var(--dsw-alias-state-warning)}.aYQbCq_progressSummary[data-state=completed] .aYQbCq_progressSummaryDot{background:var(--dsw-alias-state-success)}.aYQbCq_membersToggle{background:var(--dsw-alias-bg-module-platform);width:100%;color:var(--dsw-alias-label-secondary);font:inherit;cursor:pointer;border:0;border-radius:8px;justify-content:space-between;align-items:center;gap:8px;padding:6px 8px;font-size:10.5px;font-weight:600;line-height:15px;display:flex}.aYQbCq_membersToggle:hover{background:var(--dsw-alias-bg-fill-neutral)}.aYQbCq_membersToggle>span{align-items:center;gap:5px;display:inline-flex}.aYQbCq_membersToggle>span:last-child{color:var(--dsw-alias-state-business-primary)}.aYQbCq_chevron{flex:none;transition:transform .14s}.aYQbCq_chevron[data-open=true]{transform:rotate(90deg)}.aYQbCq_delegationTree{flex-direction:column;gap:2px;margin-left:18px;padding:9px 0 0 20px;display:flex;position:relative}.aYQbCq_delegationTree:before{background:color-mix(in srgb, var(--dsw-alias-state-business-primary) 48%, var(--dsw-alias-line-normal));content:\"\";width:1px;position:absolute;top:0;bottom:22px;left:0}.aYQbCq_memberBlock{flex-direction:column;min-width:0;padding:3px 0 7px;display:flex;position:relative}.aYQbCq_memberBranch{background:color-mix(in srgb, var(--dsw-alias-state-business-primary) 48%, var(--dsw-alias-line-normal));width:20px;height:1px;display:block;position:absolute;top:27px;right:100%}.aYQbCq_memberBranch:before{background:var(--dsw-alias-state-business-primary);content:\"\";border-radius:50%;width:5px;height:5px;position:absolute;top:-2px;right:-1px}.aYQbCq_memberRow{box-sizing:border-box;width:100%;min-width:0;min-height:48px;color:inherit;font:inherit;text-align:left;cursor:pointer;background:0 0;border:0;border-radius:8px;grid-template-columns:46px minmax(0,1fr) auto;align-items:center;gap:8px;padding:4px 6px;transition:background-color .12s,transform .12s;display:grid}.aYQbCq_memberRow:hover,.aYQbCq_memberRow[data-activity=working]{background:color-mix(in srgb, var(--dsw-alias-state-business-primary) 6%, var(--dsw-alias-bg-module))}.aYQbCq_memberRow:active{transform:scale(.995)}.aYQbCq_memberAvatar{width:42px;height:42px}.aYQbCq_memberAvatar[data-unread=true]:after{box-sizing:border-box;border:1px solid var(--dsw-alias-bg-module);background:var(--dsw-alias-state-business-primary);content:\"\";border-radius:50%;width:6px;height:6px;animation:1.8s ease-in-out infinite aYQbCq_agentTeamsUnreadPulse;position:absolute;top:0;right:-1px}@keyframes aYQbCq_agentTeamsUnreadPulse{0%,to{opacity:.78;transform:scale(.92)}50%{opacity:1;transform:scale(1.16)}}.aYQbCq_memberInitial{background:var(--dsw-alias-bg-fill-business);width:34px;height:34px;color:var(--dsw-alias-label-on-fill);border-radius:50%;justify-content:center;align-items:center;font-size:14px;font-weight:600;line-height:20px;display:inline-flex}.aYQbCq_stateArt{box-sizing:border-box;object-fit:contain;width:22px;height:22px;filter:drop-shadow(0 0 1px var(--dsw-alias-bg-module)) drop-shadow(0 1px 1px #122d483d);background:0 0;border:0;border-radius:0;position:absolute;bottom:-3px;right:-5px}.aYQbCq_stateArt[data-activity=working]{animation:2.4s ease-in-out infinite aYQbCq_agentTeamsFloat}.aYQbCq_stateArt[data-activity=idle]{animation:4.2s ease-in-out infinite aYQbCq_agentTeamsBreathe}.aYQbCq_stateArt[data-activity=unknown]{animation:2.8s ease-in-out infinite aYQbCq_agentTeamsThink}@keyframes aYQbCq_agentTeamsFloat{0%,to{transform:translateY(0)rotate(-4deg)}50%{transform:translateY(-2px)rotate(4deg)}}@keyframes aYQbCq_agentTeamsBreathe{0%,to{opacity:.82;transform:scale(1)}50%{opacity:1;transform:scale(1.06)}}@keyframes aYQbCq_agentTeamsThink{0%,to{transform:rotate(-7deg)}50%{transform:rotate(7deg)}}.aYQbCq_memberState{margin-left:auto}.aYQbCq_memberCount{color:var(--dsw-alias-label-tertiary);font-size:10.5px;line-height:16px}.aYQbCq_assignmentLine{align-items:center;gap:7px;min-width:0;padding:0 6px 0 60px;display:flex}.aYQbCq_assignmentLabel{color:var(--dsw-alias-label-tertiary);flex:none;font-size:9.5px;line-height:14px}.aYQbCq_assignmentTasks{flex-wrap:wrap;flex:1;gap:4px;min-width:0;display:flex}.aYQbCq_assignmentChip{background:var(--dsw-alias-bg-fill-neutral);min-height:16px;color:var(--dsw-alias-label-secondary);border-radius:4px;align-items:center;padding:0 5px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:9px;font-weight:600;line-height:14px;display:inline-flex}.aYQbCq_assignmentChip[data-state=running]{background:var(--dsw-alias-bg-fill-business);color:var(--dsw-alias-label-on-fill)}.aYQbCq_assignmentChip[data-state=completed]{background:var(--dsw-alias-bg-fill-success);color:var(--dsw-alias-label-on-fill)}.aYQbCq_assignmentChip[data-state=blocked]{background:var(--dsw-alias-bg-fill-warning);color:var(--dsw-alias-label-on-fill)}.aYQbCq_assignmentChip[data-state=failed]{background:var(--dsw-alias-bg-fill-danger);color:var(--dsw-alias-label-on-fill)}.aYQbCq_assignmentChip[data-state=cancelled]{color:var(--dsw-alias-label-tertiary);text-decoration:line-through}.aYQbCq_unreadPill{color:var(--dsw-alias-state-business-primary);white-space:nowrap;flex:none;font-size:9.5px;font-weight:600;line-height:14px}.aYQbCq_taskEmpty{color:var(--dsw-alias-label-tertiary);font-size:9.5px;line-height:14px}.aYQbCq_dependencySection{border-top:1px solid var(--dsw-alias-line-normal);flex-direction:column;gap:7px;min-width:0;padding-top:10px;display:flex}.aYQbCq_sectionToggleTitle{color:var(--dsw-alias-label-secondary);font:inherit;cursor:pointer;background:0 0;border:0;align-items:center;gap:6px;padding:0;font-size:11px;font-weight:600;line-height:16px;display:inline-flex}.aYQbCq_dagViewport{scrollbar-width:thin;min-width:0;padding:2px 0 4px;overflow-x:auto}.aYQbCq_dagCanvas{min-width:100%;position:relative}.aYQbCq_dagCanvas[data-layout=parallel]{flex-wrap:wrap;gap:8px;display:flex}.aYQbCq_dagCanvas[data-layout=parallel] .aYQbCq_dagNode{flex:92px;min-width:92px;position:relative}.aYQbCq_dagEdges{pointer-events:none;position:absolute;inset:0;overflow:visible}.aYQbCq_dagEdges path{fill:none;stroke:var(--dsw-alias-line-strong);stroke-width:1px;transition:opacity .14s,stroke .14s,stroke-width .14s}.aYQbCq_dagEdges path[data-active=true]{stroke:var(--dsw-alias-state-business-primary);stroke-width:1.6px}.aYQbCq_dagEdges path[data-dimmed=true]{opacity:.24}.aYQbCq_dagNode{box-sizing:border-box;border:1px solid var(--dsw-alias-line-normal);background:var(--dsw-alias-bg-module);color:var(--dsw-alias-label-primary);font:inherit;text-align:left;cursor:pointer;border-radius:6px;flex-direction:column;justify-content:center;gap:1px;padding:0 6px;transition:border-color .14s,background-color .14s,opacity .14s;display:flex;position:absolute}.aYQbCq_dagNode:hover,.aYQbCq_dagNode[data-focused=true]{border-color:var(--dsw-alias-state-business-primary);background:color-mix(in srgb, var(--dsw-alias-state-business-primary) 6%, var(--dsw-alias-bg-module))}.aYQbCq_dagNode[data-dimmed=true]{opacity:.3}.aYQbCq_dagNode[data-state=running][data-dimmed=true]{opacity:.58}.aYQbCq_dagNode[data-state=completed]{border-color:color-mix(in srgb, var(--dsw-alias-state-success) 48%, var(--dsw-alias-line-normal))}.aYQbCq_dagNode[data-state=blocked]{border-color:color-mix(in srgb, var(--dsw-alias-state-warning) 52%, var(--dsw-alias-line-normal))}.aYQbCq_dagNode[data-state=failed]{border-color:color-mix(in srgb, var(--dsw-alias-state-danger) 56%, var(--dsw-alias-line-normal))}.aYQbCq_dagNodeHead{color:var(--dsw-alias-label-primary);align-items:center;gap:4px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:9.5px;font-weight:700;display:flex}.aYQbCq_dagNodeDot{background:var(--dsw-alias-line-strong);border-radius:1.5px;flex:none;width:5px;height:5px}.aYQbCq_dagNode[data-state=running] .aYQbCq_dagNodeDot{background:var(--dsw-alias-state-business-primary)}.aYQbCq_dagNode[data-state=running] .aYQbCq_dagNodeHead{padding-right:12px}.aYQbCq_dagRunningState{width:9px;height:9px;color:var(--dsw-alias-state-business-primary);pointer-events:none;justify-content:center;align-items:center;display:inline-flex;position:absolute;top:4px;right:5px}.aYQbCq_dagRunningState .aYQbCq_workGlyph{width:9px;height:9px}.aYQbCq_dagNode[data-state=blocked] .aYQbCq_dagNodeDot{background:var(--dsw-alias-state-warning)}.aYQbCq_dagNode[data-state=completed] .aYQbCq_dagNodeDot{background:var(--dsw-alias-state-success)}.aYQbCq_dagNode[data-state=failed] .aYQbCq_dagNodeDot{background:var(--dsw-alias-state-danger)}.aYQbCq_dagNodeLabel{color:var(--dsw-alias-label-tertiary);text-overflow:ellipsis;white-space:nowrap;font-size:8.5px;line-height:11px;overflow:hidden}.aYQbCq_taskDetail{border:1px solid var(--dsw-alias-line-normal);background:var(--dsw-alias-bg-module-platform);border-radius:9px;flex-direction:column;gap:3px;min-width:0;padding:7px 9px;display:flex}.aYQbCq_taskDetailHead{align-items:center;gap:6px;min-width:0;display:flex}.aYQbCq_taskDetailId{color:var(--dsw-alias-state-business-primary);flex:none;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:10px;font-weight:700}.aYQbCq_taskDetailSubject{min-width:0;color:var(--dsw-alias-label-primary);text-overflow:ellipsis;white-space:nowrap;font-size:11px;font-weight:600;line-height:16px;overflow:hidden}.aYQbCq_taskDetailBadge{background:var(--dsw-alias-bg-fill-neutral);color:var(--dsw-alias-label-secondary);border-radius:4px;flex:none;padding:0 5px;font-size:8.5px;font-weight:600;line-height:14px}.aYQbCq_taskDetailBadge[data-state=running]{background:var(--dsw-alias-bg-fill-business);color:var(--dsw-alias-label-on-fill)}.aYQbCq_taskDetailBadge[data-state=blocked]{background:var(--dsw-alias-bg-fill-warning);color:var(--dsw-alias-label-on-fill)}.aYQbCq_taskDetailBadge[data-state=completed]{background:var(--dsw-alias-bg-fill-success);color:var(--dsw-alias-label-on-fill)}.aYQbCq_taskDetailBadge[data-state=failed]{background:var(--dsw-alias-bg-fill-danger);color:var(--dsw-alias-label-on-fill)}.aYQbCq_taskDetailLine,.aYQbCq_taskDetailMeta{color:var(--dsw-alias-label-secondary);font-size:9.5px;line-height:14px}.aYQbCq_taskDetailMeta{color:var(--dsw-alias-label-tertiary)}.aYQbCq_emptyHint{color:var(--dsw-alias-label-tertiary);padding:10px 12px;font-size:11px;line-height:16px}.aYQbCq_historicPill{background:var(--dsw-alias-bg-fill-neutral);color:var(--dsw-alias-label-tertiary);border-radius:4px;flex:none;margin-left:auto;padding:1px 7px;font-size:9.5px;font-weight:600;line-height:15px}.aYQbCq_members{flex-direction:column;gap:3px;display:flex}.aYQbCq_archivedWrap:before{color:var(--dsw-alias-label-tertiary);content:\"已结束 · 历史归档\";padding:5px 14px 0;font-size:9.5px;font-weight:600;line-height:14px;display:block}@media (prefers-reduced-motion:reduce){.aYQbCq_panel,.aYQbCq_badge,.aYQbCq_badgeDot,.aYQbCq_panelDot,.aYQbCq_workGlyph rect,.aYQbCq_stateArt,.aYQbCq_memberAvatar[data-unread=true]:after{transition:none;animation:none}}@media (width<=960px){html[data-agent-teams-panel-open] [data-phase=active]{padding-right:0}}@media (width<=640px){.aYQbCq_badge{top:56px;right:10px}.aYQbCq_teamStats span[data-stat=messages]{display:none}.aYQbCq_captainNode{grid-template-columns:48px minmax(0,1fr)}.aYQbCq_captainState{display:none}.aYQbCq_delegationTree{margin-left:12px;padding-left:15px}.aYQbCq_memberBranch{width:15px}.aYQbCq_assignmentLine{padding-left:53px}}";
488
654
  const tagId = "@nanmicoder/dsh-agent-teams/ActivityPanel.module.css";
489
655
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId) + "]") === null) {
490
656
  const tag = document.createElement("style");
@@ -499,8 +665,8 @@ window.__ModuleLoader__.load({
499
665
  "agentTeamsFloat": "aYQbCq_agentTeamsFloat",
500
666
  "agentTeamsPanelIn": "aYQbCq_agentTeamsPanelIn",
501
667
  "agentTeamsPulse": "aYQbCq_agentTeamsPulse",
502
- "agentTeamsRing": "aYQbCq_agentTeamsRing",
503
668
  "agentTeamsThink": "aYQbCq_agentTeamsThink",
669
+ "agentTeamsUnreadPulse": "aYQbCq_agentTeamsUnreadPulse",
504
670
  "archivedWrap": "aYQbCq_archivedWrap",
505
671
  "assignmentChip": "aYQbCq_assignmentChip",
506
672
  "assignmentLabel": "aYQbCq_assignmentLabel",
@@ -518,7 +684,6 @@ window.__ModuleLoader__.load({
518
684
  "captainState": "aYQbCq_captainState",
519
685
  "captainSummary": "aYQbCq_captainSummary",
520
686
  "chevron": "aYQbCq_chevron",
521
- "closeButton": "aYQbCq_closeButton",
522
687
  "dagCanvas": "aYQbCq_dagCanvas",
523
688
  "dagEdges": "aYQbCq_dagEdges",
524
689
  "dagNode": "aYQbCq_dagNode",
@@ -532,6 +697,7 @@ window.__ModuleLoader__.load({
532
697
  "dependencySection": "aYQbCq_dependencySection",
533
698
  "emptyHint": "aYQbCq_emptyHint",
534
699
  "historicPill": "aYQbCq_historicPill",
700
+ "iconButton": "aYQbCq_iconButton",
535
701
  "leadAvatar": "aYQbCq_leadAvatar",
536
702
  "memberArt": "aYQbCq_memberArt",
537
703
  "memberAvatar": "aYQbCq_memberAvatar",
@@ -549,6 +715,7 @@ window.__ModuleLoader__.load({
549
715
  "members": "aYQbCq_members",
550
716
  "membersToggle": "aYQbCq_membersToggle",
551
717
  "panel": "aYQbCq_panel",
718
+ "panelControls": "aYQbCq_panelControls",
552
719
  "panelDot": "aYQbCq_panelDot",
553
720
  "panelHead": "aYQbCq_panelHead",
554
721
  "panelTitle": "aYQbCq_panelTitle",
@@ -559,6 +726,7 @@ window.__ModuleLoader__.load({
559
726
  "progressSummary": "aYQbCq_progressSummary",
560
727
  "progressSummaryDot": "aYQbCq_progressSummaryDot",
561
728
  "progressTitle": "aYQbCq_progressTitle",
729
+ "resizeHandle": "aYQbCq_resizeHandle",
562
730
  "sectionHead": "aYQbCq_sectionHead",
563
731
  "sectionHint": "aYQbCq_sectionHint",
564
732
  "sectionTitle": "aYQbCq_sectionTitle",
@@ -587,17 +755,19 @@ window.__ModuleLoader__.load({
587
755
  /**
588
756
  * AgentTeams activity panel: the top-right floater monitoring every team.
589
757
  *
590
- * Modeled on the Claude Code desktop SessionActivityPanel: a fixed glass
591
- * panel at the top-right corner. On wide viewports it cooperatively makes the
592
- * conversation column yield space; narrow viewports keep overlay mode. It
758
+ * Modeled on the Claude Code desktop SessionActivityPanel: a shell-overlay
759
+ * panel that docks at the conversation's top-right edge by default, can be
760
+ * dragged into a floating window, resized, and folded into an activity badge.
761
+ * On wide viewports the docked panel makes the conversation column yield
762
+ * space; narrow viewports keep a simple inset overlay. It
593
763
  * polls the host `/plugins/dsh-agent-teams/state` route for
594
764
  * server-side snapshots (durable files + live subagent activity), with a
595
765
  * collapsed badge that auto-expands once when activity appears. Archived
596
766
  * teams stay available for the owning conversation after live work ends.
597
767
  *
598
- * The floater mounts through a body portal (no top-right slot exists in the
599
- * web shell); it is not a conversation node — the in-conversation panel was
600
- * removed in favor of this always-available monitor.
768
+ * The floater mounts in ui-layout's additive `shell.overlay`; it is not a
769
+ * conversation node — the in-conversation panel was removed in favor of this
770
+ * always-available monitor.
601
771
  * @module dsh-agent-teams/client/activity
602
772
  */
603
773
  /** Grace before the panel collapses once no team remains. */
@@ -608,8 +778,28 @@ window.__ModuleLoader__.load({
608
778
  * right after load. New activity after this window auto-expands as usual.
609
779
  */
610
780
  const AUTO_OPEN_SETTLE_MS = 4e3;
611
- /** Root marker shared with the panel CSS while the portal is expanded. */
781
+ /** Root marker shared with the panel CSS while the shell overlay is expanded. */
612
782
  const PANEL_OPEN_ATTRIBUTE = "data-agent-teams-panel-open";
783
+ /** Shared width concession consumed by the conversation root CSS. */
784
+ const PANEL_SHIFT_PROPERTY = "--agent-teams-panel-shift";
785
+ const PANEL_CONVERSATION_GAP = 14;
786
+ const MOVE_THRESHOLD = 4;
787
+ function initialPanelLayout() {
788
+ if (typeof window === "undefined") return DEFAULT_PANEL_LAYOUT;
789
+ return parsePanelLayout(window.localStorage.getItem(PANEL_LAYOUT_STORAGE_KEY));
790
+ }
791
+ function initialPanelBounds() {
792
+ if (typeof window === "undefined") return {
793
+ width: 1440,
794
+ height: 900,
795
+ anchorRight: 1440
796
+ };
797
+ return {
798
+ width: window.innerWidth,
799
+ height: window.innerHeight,
800
+ anchorRight: window.innerWidth
801
+ };
802
+ }
613
803
  /** Initial-letter fallback for unmatched roles. */
614
804
  function memberInitial(name) {
615
805
  return name.trim().slice(0, 1).toUpperCase() || "?";
@@ -694,6 +884,7 @@ window.__ModuleLoader__.load({
694
884
  return (0, react_jsx_runtime.jsxs)("button", {
695
885
  type: "button",
696
886
  className: ActivityPanel_module_css_default.badge,
887
+ "data-agent-teams-collapsed": true,
697
888
  "data-busy": busy,
698
889
  onClick,
699
890
  "aria-label": `AgentTeams 活动,${count} 个团队`,
@@ -1094,7 +1285,7 @@ window.__ModuleLoader__.load({
1094
1285
  className: ActivityPanel_module_css_default.memberRow,
1095
1286
  "data-activity": member.activity,
1096
1287
  onClick: () => {
1097
- if (member.id !== "") onNavigate(member.id);
1288
+ if (member.id !== "") onNavigate(team.captainSessionId, member.id);
1098
1289
  },
1099
1290
  children: [
1100
1291
  (0, react_jsx_runtime.jsxs)("span", {
@@ -1205,17 +1396,25 @@ window.__ModuleLoader__.load({
1205
1396
  /** The top-right activity floater. Teams follow the current session: live
1206
1397
  * snapshots and historic card summaries are only shown while their captain
1207
1398
  * session is the one currently open. */
1208
- function ActivityPanel({ sessionsList, openSession }) {
1209
- const navigateToSession = (id) => {
1399
+ function ActivityPanel({ sessionsList, openMember }) {
1400
+ const navigateToSession = (parentId, childId) => {
1210
1401
  setOpen(false);
1211
1402
  setWasActive(false);
1212
- openSession(id);
1403
+ openMember(parentId, childId);
1213
1404
  };
1214
1405
  const [open, setOpen] = (0, react.useState)(false);
1215
1406
  const [openOwner, setOpenOwner] = (0, react.useState)();
1216
1407
  const [autoOpened, setAutoOpened] = (0, react.useState)(false);
1217
1408
  const [wasActive, setWasActive] = (0, react.useState)(false);
1218
1409
  const [historic, setHistoric] = (0, react.useState)(/* @__PURE__ */ new Map());
1410
+ const [layout, setLayout] = (0, react.useState)(initialPanelLayout);
1411
+ const [bounds, setBounds] = (0, react.useState)(initialPanelBounds);
1412
+ const [interaction, setInteraction] = (0, react.useState)(null);
1413
+ const panelRef = (0, react.useRef)(null);
1414
+ const boundsRef = (0, react.useRef)(bounds);
1415
+ const gestureRef = (0, react.useRef)(null);
1416
+ const frameRef = (0, react.useRef)(null);
1417
+ const pendingLayoutRef = (0, react.useRef)(null);
1219
1418
  const current = (0, react.useSyncExternalStore)(sessionsList.subscribe, sessionsList.getSnapshot).current;
1220
1419
  const monitorTargets = (0, react.useSyncExternalStore)(subscribeActivityMonitorTargets, getActivityMonitorTargetsSnapshot);
1221
1420
  const { teams, archivedTeams } = (0, react.useSyncExternalStore)(subscribeActivitySnapshots, getActivitySnapshotsSnapshot);
@@ -1226,6 +1425,47 @@ window.__ModuleLoader__.load({
1226
1425
  }, [current]);
1227
1426
  const mountedAtRef = (0, react.useRef)(performance.now());
1228
1427
  const expanded = activityPanelExpandedForSession(open, openOwner, current);
1428
+ const geometry = (0, react.useMemo)(() => resolvePanelGeometry(layout, bounds), [layout, bounds]);
1429
+ const compact = compactPanelForBounds(bounds);
1430
+ const commitLayout = (0, react.useCallback)((next) => {
1431
+ setLayout(next);
1432
+ }, []);
1433
+ (0, react.useEffect)(() => {
1434
+ window.localStorage.setItem(PANEL_LAYOUT_STORAGE_KEY, JSON.stringify(layout));
1435
+ }, [layout]);
1436
+ (0, react.useLayoutEffect)(() => {
1437
+ const overlay = document.querySelector("[data-shell-overlay]");
1438
+ if (overlay === null) return;
1439
+ const conversation = document.querySelector("[data-phase='active']");
1440
+ let frame = null;
1441
+ const measure = () => {
1442
+ frame = null;
1443
+ const overlayRect = overlay.getBoundingClientRect();
1444
+ const conversationRect = conversation?.getBoundingClientRect();
1445
+ const next = {
1446
+ width: overlayRect.width,
1447
+ height: overlayRect.height,
1448
+ anchorRight: conversationRect === void 0 ? overlayRect.width : Math.min(Math.max(conversationRect.right - overlayRect.left, 0), overlayRect.width)
1449
+ };
1450
+ const previous = boundsRef.current;
1451
+ if (previous.width === next.width && previous.height === next.height && previous.anchorRight === next.anchorRight) return;
1452
+ boundsRef.current = next;
1453
+ setBounds(next);
1454
+ };
1455
+ const scheduleMeasure = () => {
1456
+ frame ??= requestAnimationFrame(measure);
1457
+ };
1458
+ measure();
1459
+ const observer = typeof ResizeObserver === "undefined" ? null : new ResizeObserver(scheduleMeasure);
1460
+ observer?.observe(overlay);
1461
+ if (conversation !== null) observer?.observe(conversation);
1462
+ window.addEventListener("resize", scheduleMeasure);
1463
+ return () => {
1464
+ if (frame !== null) cancelAnimationFrame(frame);
1465
+ observer?.disconnect();
1466
+ window.removeEventListener("resize", scheduleMeasure);
1467
+ };
1468
+ }, [current]);
1229
1469
  (0, react.useLayoutEffect)(() => {
1230
1470
  if (openOwner === void 0 || openOwner === current) return;
1231
1471
  setOpen(false);
@@ -1235,19 +1475,30 @@ window.__ModuleLoader__.load({
1235
1475
  }, [current, openOwner]);
1236
1476
  (0, react.useLayoutEffect)(() => {
1237
1477
  const root = document.documentElement;
1238
- if (expanded) root.setAttribute(PANEL_OPEN_ATTRIBUTE, "");
1239
- else root.removeAttribute(PANEL_OPEN_ATTRIBUTE);
1478
+ if (expanded && geometry.mode === "docked" && !compact) {
1479
+ root.setAttribute(PANEL_OPEN_ATTRIBUTE, "");
1480
+ root.style.setProperty(PANEL_SHIFT_PROPERTY, `${geometry.width + PANEL_CONVERSATION_GAP + 18}px`);
1481
+ } else {
1482
+ root.removeAttribute(PANEL_OPEN_ATTRIBUTE);
1483
+ root.style.removeProperty(PANEL_SHIFT_PROPERTY);
1484
+ }
1240
1485
  return () => {
1241
1486
  root.removeAttribute(PANEL_OPEN_ATTRIBUTE);
1487
+ root.style.removeProperty(PANEL_SHIFT_PROPERTY);
1242
1488
  };
1243
- }, [expanded]);
1489
+ }, [
1490
+ compact,
1491
+ expanded,
1492
+ geometry.mode,
1493
+ geometry.width
1494
+ ]);
1244
1495
  (0, react.useEffect)(() => {
1245
- if (currentTargets.length === 0) return;
1246
- const controller = startActivityPolling(currentTargets);
1496
+ if (current === void 0) return;
1497
+ const controller = startActivityPolling(currentTargets, { discoverySessionId: current });
1247
1498
  return () => {
1248
1499
  controller.stop();
1249
1500
  };
1250
- }, [currentTargets]);
1501
+ }, [current, currentTargets]);
1251
1502
  (0, react.useEffect)(() => {
1252
1503
  const onOpenPanel = (event) => {
1253
1504
  const activeSession = currentRef.current;
@@ -1313,7 +1564,114 @@ window.__ModuleLoader__.load({
1313
1564
  wasActive
1314
1565
  ]);
1315
1566
  const busy = (0, react.useMemo)(() => visibleTeams.some((team) => team.members.some((member) => member.activity === "working")), [visibleTeams]);
1316
- if (!(visibleCount > 0) && !expanded) return null;
1567
+ const hasTeams = visibleCount > 0;
1568
+ const panelGeometryForGesture = (0, react.useCallback)(() => {
1569
+ const measuredHeight = panelRef.current?.getBoundingClientRect().height;
1570
+ if (measuredHeight === void 0 || measuredHeight <= 0) return geometry;
1571
+ return {
1572
+ ...geometry,
1573
+ height: measuredHeight
1574
+ };
1575
+ }, [geometry]);
1576
+ const flushScheduledLayout = (0, react.useCallback)(() => {
1577
+ if (frameRef.current !== null) {
1578
+ cancelAnimationFrame(frameRef.current);
1579
+ frameRef.current = null;
1580
+ }
1581
+ const pending = pendingLayoutRef.current;
1582
+ pendingLayoutRef.current = null;
1583
+ if (pending !== null) commitLayout(pending);
1584
+ }, [commitLayout]);
1585
+ const scheduleLayout = (0, react.useCallback)((next) => {
1586
+ pendingLayoutRef.current = next;
1587
+ frameRef.current ??= requestAnimationFrame(() => {
1588
+ frameRef.current = null;
1589
+ const pending = pendingLayoutRef.current;
1590
+ pendingLayoutRef.current = null;
1591
+ if (pending !== null) commitLayout(pending);
1592
+ });
1593
+ }, [commitLayout]);
1594
+ (0, react.useEffect)(() => () => {
1595
+ if (frameRef.current !== null) cancelAnimationFrame(frameRef.current);
1596
+ }, []);
1597
+ const beginMove = (0, react.useCallback)((event) => {
1598
+ if (compact || event.button !== 0 || event.target.closest("button") !== null) return;
1599
+ event.preventDefault();
1600
+ event.currentTarget.setPointerCapture(event.pointerId);
1601
+ gestureRef.current = {
1602
+ kind: "move",
1603
+ pointerId: event.pointerId,
1604
+ originX: event.clientX,
1605
+ originY: event.clientY,
1606
+ start: panelGeometryForGesture(),
1607
+ activated: false
1608
+ };
1609
+ }, [compact, panelGeometryForGesture]);
1610
+ const beginResize = (0, react.useCallback)((edge, event) => {
1611
+ if (compact || event.button !== 0 || geometry.mode === "docked" && edge !== "left") return;
1612
+ event.preventDefault();
1613
+ event.stopPropagation();
1614
+ event.currentTarget.setPointerCapture(event.pointerId);
1615
+ gestureRef.current = {
1616
+ kind: "resize",
1617
+ edge,
1618
+ pointerId: event.pointerId,
1619
+ originX: event.clientX,
1620
+ originY: event.clientY,
1621
+ start: panelGeometryForGesture(),
1622
+ activated: true
1623
+ };
1624
+ setInteraction("resizing");
1625
+ }, [
1626
+ compact,
1627
+ geometry.mode,
1628
+ panelGeometryForGesture
1629
+ ]);
1630
+ const updateGesture = (0, react.useCallback)((event) => {
1631
+ const gesture = gestureRef.current;
1632
+ if (gesture === null || gesture.pointerId !== event.pointerId || !event.currentTarget.hasPointerCapture(event.pointerId)) return;
1633
+ const dx = event.clientX - gesture.originX;
1634
+ const dy = event.clientY - gesture.originY;
1635
+ const activeBounds = boundsRef.current;
1636
+ if (gesture.kind === "move") {
1637
+ if (!gesture.activated && Math.hypot(dx, dy) < MOVE_THRESHOLD) return;
1638
+ if (!gesture.activated) {
1639
+ gesture.activated = true;
1640
+ setInteraction("dragging");
1641
+ }
1642
+ scheduleLayout(movePanelLayout(floatPanelLayout(gesture.start, activeBounds), dx, dy, activeBounds));
1643
+ return;
1644
+ }
1645
+ scheduleLayout(resizePanelLayout(gesture.start, gesture.edge ?? "left", dx, dy, activeBounds));
1646
+ }, [scheduleLayout]);
1647
+ const endGesture = (0, react.useCallback)((event) => {
1648
+ const gesture = gestureRef.current;
1649
+ if (gesture === null || gesture.pointerId !== event.pointerId) return;
1650
+ updateGesture(event);
1651
+ flushScheduledLayout();
1652
+ if (event.currentTarget.hasPointerCapture(event.pointerId)) event.currentTarget.releasePointerCapture(event.pointerId);
1653
+ gestureRef.current = null;
1654
+ setInteraction(null);
1655
+ }, [flushScheduledLayout, updateGesture]);
1656
+ const cancelGesture = (0, react.useCallback)((event) => {
1657
+ const gesture = gestureRef.current;
1658
+ if (gesture === null || gesture.pointerId !== event.pointerId) return;
1659
+ flushScheduledLayout();
1660
+ gestureRef.current = null;
1661
+ setInteraction(null);
1662
+ }, [flushScheduledLayout]);
1663
+ const toggleDock = (0, react.useCallback)(() => {
1664
+ const liveGeometry = panelGeometryForGesture();
1665
+ commitLayout(liveGeometry.mode === "docked" ? floatPanelLayout(liveGeometry, boundsRef.current) : dockPanelLayout(liveGeometry, boundsRef.current));
1666
+ }, [commitLayout, panelGeometryForGesture]);
1667
+ const autoHeight = panelUsesAutoHeight(geometry, bounds);
1668
+ const panelStyle = {
1669
+ width: geometry.width,
1670
+ height: autoHeight ? "auto" : geometry.height,
1671
+ maxHeight: panelMaximumHeight(geometry, bounds),
1672
+ transform: `translate3d(${geometry.x}px, ${geometry.y}px, 0)`
1673
+ };
1674
+ if (!hasTeams && !expanded) return null;
1317
1675
  return (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [!expanded && (0, react_jsx_runtime.jsx)(CollapsedBadge, {
1318
1676
  count: visibleCount,
1319
1677
  busy,
@@ -1323,57 +1681,119 @@ window.__ModuleLoader__.load({
1323
1681
  setOpen(true);
1324
1682
  }
1325
1683
  }), expanded && (0, react_jsx_runtime.jsxs)("aside", {
1684
+ ref: panelRef,
1326
1685
  className: ActivityPanel_module_css_default.panel,
1686
+ style: panelStyle,
1327
1687
  "data-agent-teams-activity": true,
1328
- children: [(0, react_jsx_runtime.jsxs)("header", {
1329
- className: ActivityPanel_module_css_default.panelHead,
1330
- children: [(0, react_jsx_runtime.jsxs)("span", {
1331
- className: ActivityPanel_module_css_default.panelTitle,
1332
- children: ["AgentTeams 活动", (0, react_jsx_runtime.jsx)("span", {
1333
- className: ActivityPanel_module_css_default.panelDot,
1334
- "data-busy": busy,
1335
- "aria-hidden": true
1688
+ "data-panel-mode": geometry.mode,
1689
+ "data-height-mode": autoHeight ? "auto" : "manual",
1690
+ "data-compact": compact || void 0,
1691
+ "data-dragging": interaction === "dragging" || void 0,
1692
+ "data-resizing": interaction === "resizing" || void 0,
1693
+ "aria-label": "AgentTeams 活动面板",
1694
+ children: [
1695
+ (0, react_jsx_runtime.jsxs)("header", {
1696
+ className: ActivityPanel_module_css_default.panelHead,
1697
+ onPointerDown: beginMove,
1698
+ onPointerMove: updateGesture,
1699
+ onPointerUp: endGesture,
1700
+ onPointerCancel: cancelGesture,
1701
+ "data-drag-handle": !compact || void 0,
1702
+ children: [(0, react_jsx_runtime.jsxs)("span", {
1703
+ className: ActivityPanel_module_css_default.panelTitle,
1704
+ children: ["AgentTeams 活动", (0, react_jsx_runtime.jsx)("span", {
1705
+ className: ActivityPanel_module_css_default.panelDot,
1706
+ "data-busy": busy,
1707
+ "aria-hidden": true
1708
+ })]
1709
+ }), (0, react_jsx_runtime.jsxs)("span", {
1710
+ className: ActivityPanel_module_css_default.panelControls,
1711
+ children: [!compact && (0, react_jsx_runtime.jsx)("button", {
1712
+ type: "button",
1713
+ className: ActivityPanel_module_css_default.iconButton,
1714
+ "data-control": "dock",
1715
+ "data-mode": geometry.mode,
1716
+ onClick: toggleDock,
1717
+ "aria-label": geometry.mode === "docked" ? "切换为浮动面板" : "停靠到右侧",
1718
+ title: geometry.mode === "docked" ? "切换为浮动面板" : "停靠到右侧",
1719
+ children: (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconPanelLeftOutline16, {})
1720
+ }), (0, react_jsx_runtime.jsx)("button", {
1721
+ type: "button",
1722
+ className: ActivityPanel_module_css_default.iconButton,
1723
+ "data-control": "collapse",
1724
+ onClick: () => {
1725
+ setOpen(false);
1726
+ setOpenOwner(void 0);
1727
+ },
1728
+ "aria-label": "收起活动面板",
1729
+ title: "收起活动面板",
1730
+ children: (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconChevronDownOutline14, {})
1731
+ })]
1336
1732
  })]
1337
- }), (0, react_jsx_runtime.jsx)("button", {
1338
- type: "button",
1339
- className: ActivityPanel_module_css_default.closeButton,
1340
- onClick: () => {
1341
- setOpen(false);
1342
- setOpenOwner(void 0);
1343
- },
1344
- "aria-label": "关闭",
1345
- children: (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconCloseOutline16, {})
1346
- })]
1347
- }), (0, react_jsx_runtime.jsx)("div", {
1348
- className: ActivityPanel_module_css_default.teams,
1349
- children: visibleCount === 0 ? (0, react_jsx_runtime.jsx)("span", {
1350
- className: ActivityPanel_module_css_default.emptyHint,
1351
- children: "暂无团队活动"
1352
- }) : (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
1353
- visibleTeams.map((team) => (0, react_jsx_runtime.jsx)(TeamSection, {
1354
- team,
1355
- onNavigate: navigateToSession
1356
- }, team.teamId)),
1357
- visibleArchived.map((team) => (0, react_jsx_runtime.jsx)("div", {
1358
- "data-team-id": team.teamId,
1359
- "data-historic": true,
1360
- className: ActivityPanel_module_css_default.archivedWrap,
1361
- children: (0, react_jsx_runtime.jsx)(TeamSection, {
1733
+ }),
1734
+ (0, react_jsx_runtime.jsx)("div", {
1735
+ className: ActivityPanel_module_css_default.teams,
1736
+ children: visibleCount === 0 ? (0, react_jsx_runtime.jsx)("span", {
1737
+ className: ActivityPanel_module_css_default.emptyHint,
1738
+ children: "暂无团队活动"
1739
+ }) : (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
1740
+ visibleTeams.map((team) => (0, react_jsx_runtime.jsx)(TeamSection, {
1362
1741
  team,
1363
- onNavigate: navigateToSession,
1364
- historic: true
1742
+ onNavigate: navigateToSession
1743
+ }, team.teamId)),
1744
+ visibleArchived.map((team) => (0, react_jsx_runtime.jsx)("div", {
1745
+ "data-team-id": team.teamId,
1746
+ "data-historic": true,
1747
+ className: ActivityPanel_module_css_default.archivedWrap,
1748
+ children: (0, react_jsx_runtime.jsx)(TeamSection, {
1749
+ team,
1750
+ onNavigate: navigateToSession,
1751
+ historic: true
1752
+ })
1753
+ }, `${team.captainSessionId}:${team.teamId}`)),
1754
+ visibleHistoric.map(({ data: team, owner }) => {
1755
+ const teamKey = `${owner}:${team.teamId}`;
1756
+ return (0, react_jsx_runtime.jsx)(TeamSection, {
1757
+ team: historicCardTeam(team, owner),
1758
+ onNavigate: navigateToSession,
1759
+ historic: true
1760
+ }, teamKey);
1365
1761
  })
1366
- }, `${team.captainSessionId}:${team.teamId}`)),
1367
- visibleHistoric.map(({ data: team, owner }) => {
1368
- const teamKey = `${owner}:${team.teamId}`;
1369
- return (0, react_jsx_runtime.jsx)(TeamSection, {
1370
- team: historicCardTeam(team, owner),
1371
- onNavigate: navigateToSession,
1372
- historic: true
1373
- }, teamKey);
1374
- })
1375
- ] })
1376
- })]
1762
+ ] })
1763
+ }),
1764
+ !compact && (0, react_jsx_runtime.jsx)("div", {
1765
+ className: ActivityPanel_module_css_default.resizeHandle,
1766
+ "data-resize-edge": "left",
1767
+ onPointerDown: (event) => {
1768
+ beginResize("left", event);
1769
+ },
1770
+ onPointerMove: updateGesture,
1771
+ onPointerUp: endGesture,
1772
+ onPointerCancel: cancelGesture,
1773
+ "aria-hidden": true
1774
+ }),
1775
+ !compact && geometry.mode === "floating" && (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [(0, react_jsx_runtime.jsx)("div", {
1776
+ className: ActivityPanel_module_css_default.resizeHandle,
1777
+ "data-resize-edge": "bottom",
1778
+ onPointerDown: (event) => {
1779
+ beginResize("bottom", event);
1780
+ },
1781
+ onPointerMove: updateGesture,
1782
+ onPointerUp: endGesture,
1783
+ onPointerCancel: cancelGesture,
1784
+ "aria-hidden": true
1785
+ }), (0, react_jsx_runtime.jsx)("div", {
1786
+ className: ActivityPanel_module_css_default.resizeHandle,
1787
+ "data-resize-edge": "corner",
1788
+ onPointerDown: (event) => {
1789
+ beginResize("corner", event);
1790
+ },
1791
+ onPointerMove: updateGesture,
1792
+ onPointerUp: endGesture,
1793
+ onPointerCancel: cancelGesture,
1794
+ "aria-hidden": true
1795
+ })] })
1796
+ ]
1377
1797
  })] });
1378
1798
  }
1379
1799
  //#endregion
@@ -1460,6 +1880,31 @@ window.__ModuleLoader__.load({
1460
1880
  }
1461
1881
  };
1462
1882
  //#endregion
1883
+ //#region lib/client/session-navigation.js
1884
+ /** Version-tolerant navigation into durable AgentTeams member transcripts. */
1885
+ /**
1886
+ * Open one member's persisted transcript.
1887
+ *
1888
+ * Harness rc.8 intentionally removed cold subagents from the ordinary session
1889
+ * list. They must first be rediscovered in their parent's catalog, then opened
1890
+ * with the exact parent/child/mode address. Older runtimes have only `open()`;
1891
+ * the fallback preserves the plugin's rc.6 peer range.
1892
+ */
1893
+ async function openAgentTeamMember(sessions, parentSessionId, childSessionId) {
1894
+ if (sessions.openSubagent === void 0 || sessions.refreshSubagents === void 0) {
1895
+ sessions.open(childSessionId);
1896
+ return "session";
1897
+ }
1898
+ await sessions.refreshSubagents(parentSessionId);
1899
+ const retained = sessions.subagentAddress?.(childSessionId);
1900
+ sessions.openSubagent(retained?.parentSessionId === parentSessionId ? retained : {
1901
+ parentSessionId,
1902
+ childSessionId,
1903
+ mode: "continuable"
1904
+ });
1905
+ return "subagent";
1906
+ }
1907
+ //#endregion
1463
1908
  //#region lib/client/index.js
1464
1909
  /** Required services: conversation nodes, slots, and sessions navigation. */
1465
1910
  const inject = [
@@ -1467,34 +1912,40 @@ window.__ModuleLoader__.load({
1467
1912
  "slots",
1468
1913
  "sessions"
1469
1914
  ];
1915
+ /** The replayed user message is the canonical transcript entry. */
1916
+ function HiddenAgentTeamsCommand() {
1917
+ return null;
1918
+ }
1470
1919
  /**
1471
- * Mount the floater through a body portal (the web shell has no top-right
1472
- * slot) and register the in-conversation team card, whose "activity panel"
1473
- * button re-activates the floater via a window event — the recovery path
1474
- * for a closed floater or a re-opened session.
1920
+ * Register the activity monitor in the shell's additive overlay and the
1921
+ * in-conversation team card. The card's activity button re-opens a folded
1922
+ * monitor via a window event — the recovery path for an old session.
1475
1923
  */
1476
1924
  function apply(ctx) {
1477
- const host = document.createElement("div");
1478
- host.dataset.agentTeamsHost = "";
1479
- document.body.appendChild(host);
1480
- const root = (0, react_dom_client.createRoot)(host);
1481
- root.render((0, react_jsx_runtime.jsx)(ActivityPanel, {
1925
+ const openMember = (parentId, childId) => {
1926
+ openAgentTeamMember(ctx.sessions, parentId, childId).catch((error) => {
1927
+ console.warn(`agent-teams: failed to open member transcript ${childId}: ${String(error)}`);
1928
+ });
1929
+ };
1930
+ const Panel = () => (0, react_jsx_runtime.jsx)(ActivityPanel, {
1482
1931
  sessionsList: ctx.sessions.list,
1483
- openSession: (id) => {
1484
- ctx.sessions.open(id);
1485
- }
1486
- }));
1487
- ctx.effect(() => () => {
1488
- root.unmount();
1489
- host.remove();
1490
- }, "agent-teams: activity panel");
1932
+ openMember
1933
+ });
1934
+ ctx.slots.inject("shell.overlay", () => ctx.slots.register({
1935
+ name: "shell.overlay",
1936
+ id: "agent-teams-activity",
1937
+ order: 80,
1938
+ label: "AgentTeams activity"
1939
+ }, Panel));
1940
+ ctx.slots.inject("conversation.chat.commandview", () => ctx.slots.register({
1941
+ name: "conversation.chat.commandview",
1942
+ key: "agent-teams"
1943
+ }, HiddenAgentTeamsCommand));
1491
1944
  ctx.conversationEvents.register(agentTeamsCardDefinition);
1492
1945
  ctx.slots.inject("conversation.chat.node", () => ctx.slots.register({
1493
1946
  name: "conversation.chat.node",
1494
1947
  key: "agent-teams",
1495
- inject: () => ({ openSession: (id) => {
1496
- ctx.sessions.open(id);
1497
- } })
1948
+ inject: () => ({ openMember })
1498
1949
  }, AgentTeamsCard));
1499
1950
  }
1500
1951
  //#endregion