@nanmicoder/dsh-agent-teams 0.1.9 → 0.1.10

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;
@@ -353,7 +352,7 @@ window.__ModuleLoader__.load({
353
352
  }
354
353
  //#endregion
355
354
  //#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}";
355
+ 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
356
  const tagId$1 = "@nanmicoder/dsh-agent-teams/AgentTeamsCard.module.css";
358
357
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId$1) + "]") === null) {
359
358
  const tag = document.createElement("style");
@@ -483,8 +482,162 @@ window.__ModuleLoader__.load({
483
482
  });
484
483
  }
485
484
  //#endregion
485
+ //#region lib/client/panel-geometry.js
486
+ /** Pure persisted geometry rules for the AgentTeams shell-overlay panel. */
487
+ const PANEL_LAYOUT_STORAGE_KEY = "dsh-agent-teams:activity-panel:v1";
488
+ const DEFAULT_PANEL_LAYOUT = Object.freeze({
489
+ mode: "docked",
490
+ x: 0,
491
+ y: 64,
492
+ width: 388,
493
+ height: 640,
494
+ heightMode: "auto"
495
+ });
496
+ function clamp(value, minimum, maximum) {
497
+ return Math.min(Math.max(value, minimum), maximum);
498
+ }
499
+ function finite(value) {
500
+ return typeof value === "number" && Number.isFinite(value);
501
+ }
502
+ /** Decode one versioned localStorage value, rejecting partial/corrupt state. */
503
+ function parsePanelLayout(value) {
504
+ if (value === null) return DEFAULT_PANEL_LAYOUT;
505
+ try {
506
+ const parsed = JSON.parse(value);
507
+ if (typeof parsed !== "object" || parsed === null) return DEFAULT_PANEL_LAYOUT;
508
+ const record = parsed;
509
+ if (record.mode !== "docked" && record.mode !== "floating" || !finite(record.x) || !finite(record.y) || !finite(record.width) || !finite(record.height)) return DEFAULT_PANEL_LAYOUT;
510
+ return {
511
+ mode: record.mode,
512
+ x: record.x,
513
+ y: record.y,
514
+ width: record.width,
515
+ height: record.height,
516
+ heightMode: record.mode === "floating" && record.heightMode === "manual" ? "manual" : "auto"
517
+ };
518
+ } catch {
519
+ return DEFAULT_PANEL_LAYOUT;
520
+ }
521
+ }
522
+ /** Whether the panel should become a simple inset overlay with no gestures. */
523
+ function compactPanelForBounds(bounds) {
524
+ return bounds.width <= 960;
525
+ }
526
+ /** Docked and compact panels always fit content; floating panels may be user-sized. */
527
+ function panelUsesAutoHeight(layout, bounds) {
528
+ return compactPanelForBounds(bounds) || layout.mode === "docked" || layout.heightMode === "auto";
529
+ }
530
+ /** CSS max-height ceiling that keeps an auto-height panel inside its shell. */
531
+ function panelMaximumHeight(layout, bounds) {
532
+ const bottomInset = compactPanelForBounds(bounds) || layout.mode === "floating" ? 12 : 48;
533
+ return Math.max(1, bounds.height - layout.y - bottomInset);
534
+ }
535
+ /** Resolve persisted state into a visible rectangle inside the current shell. */
536
+ function resolvePanelGeometry(layout, bounds) {
537
+ const boundsWidth = Math.max(1, bounds.width);
538
+ const boundsHeight = Math.max(1, bounds.height);
539
+ if (compactPanelForBounds(bounds)) return {
540
+ ...layout,
541
+ x: 12,
542
+ y: 12,
543
+ width: Math.max(1, boundsWidth - 24),
544
+ height: Math.max(1, boundsHeight - 24)
545
+ };
546
+ const maximumWidth = Math.max(1, Math.min(640, boundsWidth - 24));
547
+ const minimumWidth = Math.min(320, maximumWidth);
548
+ const width = clamp(layout.width, minimumWidth, maximumWidth);
549
+ const maximumHeight = Math.max(1, boundsHeight - 24);
550
+ const minimumHeight = Math.min(360, maximumHeight);
551
+ if (layout.mode === "docked") {
552
+ const y = clamp(64, 12, Math.max(12, boundsHeight - minimumHeight - 12));
553
+ const availableHeight = Math.max(1, boundsHeight - y - 48);
554
+ const height = clamp(availableHeight, Math.min(minimumHeight, availableHeight), maximumHeight);
555
+ const anchorRight = clamp(bounds.anchorRight, 0, boundsWidth);
556
+ const maximumX = Math.max(12, boundsWidth - width - 12);
557
+ return {
558
+ mode: "docked",
559
+ x: clamp(anchorRight - 18 - width, 12, maximumX),
560
+ y,
561
+ width,
562
+ height,
563
+ heightMode: layout.heightMode
564
+ };
565
+ }
566
+ const height = clamp(layout.height, minimumHeight, maximumHeight);
567
+ return {
568
+ mode: "floating",
569
+ x: clamp(layout.x, 12, Math.max(12, boundsWidth - width - 12)),
570
+ y: clamp(layout.y, 12, Math.max(12, boundsHeight - height - 12)),
571
+ width,
572
+ height,
573
+ heightMode: layout.heightMode
574
+ };
575
+ }
576
+ /** Undock without a visual jump by adopting the panel's resolved rectangle. */
577
+ function floatPanelLayout(geometry, bounds) {
578
+ return resolvePanelGeometry({
579
+ ...geometry,
580
+ mode: "floating"
581
+ }, bounds);
582
+ }
583
+ /** Return to the right dock, preserving width and restoring content-fit height. */
584
+ function dockPanelLayout(layout, bounds) {
585
+ return resolvePanelGeometry({
586
+ ...layout,
587
+ mode: "docked",
588
+ heightMode: "auto"
589
+ }, bounds);
590
+ }
591
+ /** Translate a floating panel and clamp it back into the visible shell. */
592
+ function movePanelLayout(start, dx, dy, bounds) {
593
+ return resolvePanelGeometry({
594
+ ...start,
595
+ mode: "floating",
596
+ x: start.x + dx,
597
+ y: start.y + dy
598
+ }, bounds);
599
+ }
600
+ /** Resize while keeping the edge opposite the active handle stationary. */
601
+ function resizePanelLayout(start, edge, dx, dy, bounds) {
602
+ if (start.mode === "docked") {
603
+ if (edge !== "left") return resolvePanelGeometry(start, bounds);
604
+ return resolvePanelGeometry({
605
+ ...start,
606
+ width: start.width - dx
607
+ }, bounds);
608
+ }
609
+ const resolved = resolvePanelGeometry(start, bounds);
610
+ const minimumWidth = Math.min(320, resolved.x + resolved.width - 12);
611
+ const minimumHeight = Math.min(360, bounds.height - resolved.y - 12);
612
+ if (edge === "left") {
613
+ const right = resolved.x + resolved.width;
614
+ const maximumWidth = Math.max(1, Math.min(640, right - 12));
615
+ const width = clamp(resolved.width - dx, Math.min(minimumWidth, maximumWidth), maximumWidth);
616
+ return {
617
+ ...resolved,
618
+ x: right - width,
619
+ width
620
+ };
621
+ }
622
+ const maximumHeight = Math.max(1, bounds.height - resolved.y - 12);
623
+ const height = clamp(resolved.height + dy, Math.min(minimumHeight, maximumHeight), maximumHeight);
624
+ if (edge === "bottom") return {
625
+ ...resolved,
626
+ height,
627
+ heightMode: "manual"
628
+ };
629
+ const maximumWidth = Math.max(1, Math.min(640, bounds.width - resolved.x - 12));
630
+ const width = clamp(resolved.width + dx, Math.min(minimumWidth, maximumWidth), maximumWidth);
631
+ return {
632
+ ...resolved,
633
+ width,
634
+ height,
635
+ heightMode: "manual"
636
+ };
637
+ }
638
+ //#endregion
486
639
  //#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}}";
640
+ 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
641
  const tagId = "@nanmicoder/dsh-agent-teams/ActivityPanel.module.css";
489
642
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId) + "]") === null) {
490
643
  const tag = document.createElement("style");
@@ -499,8 +652,8 @@ window.__ModuleLoader__.load({
499
652
  "agentTeamsFloat": "aYQbCq_agentTeamsFloat",
500
653
  "agentTeamsPanelIn": "aYQbCq_agentTeamsPanelIn",
501
654
  "agentTeamsPulse": "aYQbCq_agentTeamsPulse",
502
- "agentTeamsRing": "aYQbCq_agentTeamsRing",
503
655
  "agentTeamsThink": "aYQbCq_agentTeamsThink",
656
+ "agentTeamsUnreadPulse": "aYQbCq_agentTeamsUnreadPulse",
504
657
  "archivedWrap": "aYQbCq_archivedWrap",
505
658
  "assignmentChip": "aYQbCq_assignmentChip",
506
659
  "assignmentLabel": "aYQbCq_assignmentLabel",
@@ -518,7 +671,6 @@ window.__ModuleLoader__.load({
518
671
  "captainState": "aYQbCq_captainState",
519
672
  "captainSummary": "aYQbCq_captainSummary",
520
673
  "chevron": "aYQbCq_chevron",
521
- "closeButton": "aYQbCq_closeButton",
522
674
  "dagCanvas": "aYQbCq_dagCanvas",
523
675
  "dagEdges": "aYQbCq_dagEdges",
524
676
  "dagNode": "aYQbCq_dagNode",
@@ -532,6 +684,7 @@ window.__ModuleLoader__.load({
532
684
  "dependencySection": "aYQbCq_dependencySection",
533
685
  "emptyHint": "aYQbCq_emptyHint",
534
686
  "historicPill": "aYQbCq_historicPill",
687
+ "iconButton": "aYQbCq_iconButton",
535
688
  "leadAvatar": "aYQbCq_leadAvatar",
536
689
  "memberArt": "aYQbCq_memberArt",
537
690
  "memberAvatar": "aYQbCq_memberAvatar",
@@ -549,6 +702,7 @@ window.__ModuleLoader__.load({
549
702
  "members": "aYQbCq_members",
550
703
  "membersToggle": "aYQbCq_membersToggle",
551
704
  "panel": "aYQbCq_panel",
705
+ "panelControls": "aYQbCq_panelControls",
552
706
  "panelDot": "aYQbCq_panelDot",
553
707
  "panelHead": "aYQbCq_panelHead",
554
708
  "panelTitle": "aYQbCq_panelTitle",
@@ -559,6 +713,7 @@ window.__ModuleLoader__.load({
559
713
  "progressSummary": "aYQbCq_progressSummary",
560
714
  "progressSummaryDot": "aYQbCq_progressSummaryDot",
561
715
  "progressTitle": "aYQbCq_progressTitle",
716
+ "resizeHandle": "aYQbCq_resizeHandle",
562
717
  "sectionHead": "aYQbCq_sectionHead",
563
718
  "sectionHint": "aYQbCq_sectionHint",
564
719
  "sectionTitle": "aYQbCq_sectionTitle",
@@ -587,17 +742,19 @@ window.__ModuleLoader__.load({
587
742
  /**
588
743
  * AgentTeams activity panel: the top-right floater monitoring every team.
589
744
  *
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
745
+ * Modeled on the Claude Code desktop SessionActivityPanel: a shell-overlay
746
+ * panel that docks at the conversation's top-right edge by default, can be
747
+ * dragged into a floating window, resized, and folded into an activity badge.
748
+ * On wide viewports the docked panel makes the conversation column yield
749
+ * space; narrow viewports keep a simple inset overlay. It
593
750
  * polls the host `/plugins/dsh-agent-teams/state` route for
594
751
  * server-side snapshots (durable files + live subagent activity), with a
595
752
  * collapsed badge that auto-expands once when activity appears. Archived
596
753
  * teams stay available for the owning conversation after live work ends.
597
754
  *
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.
755
+ * The floater mounts in ui-layout's additive `shell.overlay`; it is not a
756
+ * conversation node — the in-conversation panel was removed in favor of this
757
+ * always-available monitor.
601
758
  * @module dsh-agent-teams/client/activity
602
759
  */
603
760
  /** Grace before the panel collapses once no team remains. */
@@ -608,8 +765,28 @@ window.__ModuleLoader__.load({
608
765
  * right after load. New activity after this window auto-expands as usual.
609
766
  */
610
767
  const AUTO_OPEN_SETTLE_MS = 4e3;
611
- /** Root marker shared with the panel CSS while the portal is expanded. */
768
+ /** Root marker shared with the panel CSS while the shell overlay is expanded. */
612
769
  const PANEL_OPEN_ATTRIBUTE = "data-agent-teams-panel-open";
770
+ /** Shared width concession consumed by the conversation root CSS. */
771
+ const PANEL_SHIFT_PROPERTY = "--agent-teams-panel-shift";
772
+ const PANEL_CONVERSATION_GAP = 14;
773
+ const MOVE_THRESHOLD = 4;
774
+ function initialPanelLayout() {
775
+ if (typeof window === "undefined") return DEFAULT_PANEL_LAYOUT;
776
+ return parsePanelLayout(window.localStorage.getItem(PANEL_LAYOUT_STORAGE_KEY));
777
+ }
778
+ function initialPanelBounds() {
779
+ if (typeof window === "undefined") return {
780
+ width: 1440,
781
+ height: 900,
782
+ anchorRight: 1440
783
+ };
784
+ return {
785
+ width: window.innerWidth,
786
+ height: window.innerHeight,
787
+ anchorRight: window.innerWidth
788
+ };
789
+ }
613
790
  /** Initial-letter fallback for unmatched roles. */
614
791
  function memberInitial(name) {
615
792
  return name.trim().slice(0, 1).toUpperCase() || "?";
@@ -694,6 +871,7 @@ window.__ModuleLoader__.load({
694
871
  return (0, react_jsx_runtime.jsxs)("button", {
695
872
  type: "button",
696
873
  className: ActivityPanel_module_css_default.badge,
874
+ "data-agent-teams-collapsed": true,
697
875
  "data-busy": busy,
698
876
  onClick,
699
877
  "aria-label": `AgentTeams 活动,${count} 个团队`,
@@ -1216,6 +1394,14 @@ window.__ModuleLoader__.load({
1216
1394
  const [autoOpened, setAutoOpened] = (0, react.useState)(false);
1217
1395
  const [wasActive, setWasActive] = (0, react.useState)(false);
1218
1396
  const [historic, setHistoric] = (0, react.useState)(/* @__PURE__ */ new Map());
1397
+ const [layout, setLayout] = (0, react.useState)(initialPanelLayout);
1398
+ const [bounds, setBounds] = (0, react.useState)(initialPanelBounds);
1399
+ const [interaction, setInteraction] = (0, react.useState)(null);
1400
+ const panelRef = (0, react.useRef)(null);
1401
+ const boundsRef = (0, react.useRef)(bounds);
1402
+ const gestureRef = (0, react.useRef)(null);
1403
+ const frameRef = (0, react.useRef)(null);
1404
+ const pendingLayoutRef = (0, react.useRef)(null);
1219
1405
  const current = (0, react.useSyncExternalStore)(sessionsList.subscribe, sessionsList.getSnapshot).current;
1220
1406
  const monitorTargets = (0, react.useSyncExternalStore)(subscribeActivityMonitorTargets, getActivityMonitorTargetsSnapshot);
1221
1407
  const { teams, archivedTeams } = (0, react.useSyncExternalStore)(subscribeActivitySnapshots, getActivitySnapshotsSnapshot);
@@ -1226,6 +1412,47 @@ window.__ModuleLoader__.load({
1226
1412
  }, [current]);
1227
1413
  const mountedAtRef = (0, react.useRef)(performance.now());
1228
1414
  const expanded = activityPanelExpandedForSession(open, openOwner, current);
1415
+ const geometry = (0, react.useMemo)(() => resolvePanelGeometry(layout, bounds), [layout, bounds]);
1416
+ const compact = compactPanelForBounds(bounds);
1417
+ const commitLayout = (0, react.useCallback)((next) => {
1418
+ setLayout(next);
1419
+ }, []);
1420
+ (0, react.useEffect)(() => {
1421
+ window.localStorage.setItem(PANEL_LAYOUT_STORAGE_KEY, JSON.stringify(layout));
1422
+ }, [layout]);
1423
+ (0, react.useLayoutEffect)(() => {
1424
+ const overlay = document.querySelector("[data-shell-overlay]");
1425
+ if (overlay === null) return;
1426
+ const conversation = document.querySelector("[data-phase='active']");
1427
+ let frame = null;
1428
+ const measure = () => {
1429
+ frame = null;
1430
+ const overlayRect = overlay.getBoundingClientRect();
1431
+ const conversationRect = conversation?.getBoundingClientRect();
1432
+ const next = {
1433
+ width: overlayRect.width,
1434
+ height: overlayRect.height,
1435
+ anchorRight: conversationRect === void 0 ? overlayRect.width : Math.min(Math.max(conversationRect.right - overlayRect.left, 0), overlayRect.width)
1436
+ };
1437
+ const previous = boundsRef.current;
1438
+ if (previous.width === next.width && previous.height === next.height && previous.anchorRight === next.anchorRight) return;
1439
+ boundsRef.current = next;
1440
+ setBounds(next);
1441
+ };
1442
+ const scheduleMeasure = () => {
1443
+ frame ??= requestAnimationFrame(measure);
1444
+ };
1445
+ measure();
1446
+ const observer = typeof ResizeObserver === "undefined" ? null : new ResizeObserver(scheduleMeasure);
1447
+ observer?.observe(overlay);
1448
+ if (conversation !== null) observer?.observe(conversation);
1449
+ window.addEventListener("resize", scheduleMeasure);
1450
+ return () => {
1451
+ if (frame !== null) cancelAnimationFrame(frame);
1452
+ observer?.disconnect();
1453
+ window.removeEventListener("resize", scheduleMeasure);
1454
+ };
1455
+ }, [current]);
1229
1456
  (0, react.useLayoutEffect)(() => {
1230
1457
  if (openOwner === void 0 || openOwner === current) return;
1231
1458
  setOpen(false);
@@ -1235,12 +1462,23 @@ window.__ModuleLoader__.load({
1235
1462
  }, [current, openOwner]);
1236
1463
  (0, react.useLayoutEffect)(() => {
1237
1464
  const root = document.documentElement;
1238
- if (expanded) root.setAttribute(PANEL_OPEN_ATTRIBUTE, "");
1239
- else root.removeAttribute(PANEL_OPEN_ATTRIBUTE);
1465
+ if (expanded && geometry.mode === "docked" && !compact) {
1466
+ root.setAttribute(PANEL_OPEN_ATTRIBUTE, "");
1467
+ root.style.setProperty(PANEL_SHIFT_PROPERTY, `${geometry.width + PANEL_CONVERSATION_GAP + 18}px`);
1468
+ } else {
1469
+ root.removeAttribute(PANEL_OPEN_ATTRIBUTE);
1470
+ root.style.removeProperty(PANEL_SHIFT_PROPERTY);
1471
+ }
1240
1472
  return () => {
1241
1473
  root.removeAttribute(PANEL_OPEN_ATTRIBUTE);
1474
+ root.style.removeProperty(PANEL_SHIFT_PROPERTY);
1242
1475
  };
1243
- }, [expanded]);
1476
+ }, [
1477
+ compact,
1478
+ expanded,
1479
+ geometry.mode,
1480
+ geometry.width
1481
+ ]);
1244
1482
  (0, react.useEffect)(() => {
1245
1483
  if (currentTargets.length === 0) return;
1246
1484
  const controller = startActivityPolling(currentTargets);
@@ -1313,7 +1551,114 @@ window.__ModuleLoader__.load({
1313
1551
  wasActive
1314
1552
  ]);
1315
1553
  const busy = (0, react.useMemo)(() => visibleTeams.some((team) => team.members.some((member) => member.activity === "working")), [visibleTeams]);
1316
- if (!(visibleCount > 0) && !expanded) return null;
1554
+ const hasTeams = visibleCount > 0;
1555
+ const panelGeometryForGesture = (0, react.useCallback)(() => {
1556
+ const measuredHeight = panelRef.current?.getBoundingClientRect().height;
1557
+ if (measuredHeight === void 0 || measuredHeight <= 0) return geometry;
1558
+ return {
1559
+ ...geometry,
1560
+ height: measuredHeight
1561
+ };
1562
+ }, [geometry]);
1563
+ const flushScheduledLayout = (0, react.useCallback)(() => {
1564
+ if (frameRef.current !== null) {
1565
+ cancelAnimationFrame(frameRef.current);
1566
+ frameRef.current = null;
1567
+ }
1568
+ const pending = pendingLayoutRef.current;
1569
+ pendingLayoutRef.current = null;
1570
+ if (pending !== null) commitLayout(pending);
1571
+ }, [commitLayout]);
1572
+ const scheduleLayout = (0, react.useCallback)((next) => {
1573
+ pendingLayoutRef.current = next;
1574
+ frameRef.current ??= requestAnimationFrame(() => {
1575
+ frameRef.current = null;
1576
+ const pending = pendingLayoutRef.current;
1577
+ pendingLayoutRef.current = null;
1578
+ if (pending !== null) commitLayout(pending);
1579
+ });
1580
+ }, [commitLayout]);
1581
+ (0, react.useEffect)(() => () => {
1582
+ if (frameRef.current !== null) cancelAnimationFrame(frameRef.current);
1583
+ }, []);
1584
+ const beginMove = (0, react.useCallback)((event) => {
1585
+ if (compact || event.button !== 0 || event.target.closest("button") !== null) return;
1586
+ event.preventDefault();
1587
+ event.currentTarget.setPointerCapture(event.pointerId);
1588
+ gestureRef.current = {
1589
+ kind: "move",
1590
+ pointerId: event.pointerId,
1591
+ originX: event.clientX,
1592
+ originY: event.clientY,
1593
+ start: panelGeometryForGesture(),
1594
+ activated: false
1595
+ };
1596
+ }, [compact, panelGeometryForGesture]);
1597
+ const beginResize = (0, react.useCallback)((edge, event) => {
1598
+ if (compact || event.button !== 0 || geometry.mode === "docked" && edge !== "left") return;
1599
+ event.preventDefault();
1600
+ event.stopPropagation();
1601
+ event.currentTarget.setPointerCapture(event.pointerId);
1602
+ gestureRef.current = {
1603
+ kind: "resize",
1604
+ edge,
1605
+ pointerId: event.pointerId,
1606
+ originX: event.clientX,
1607
+ originY: event.clientY,
1608
+ start: panelGeometryForGesture(),
1609
+ activated: true
1610
+ };
1611
+ setInteraction("resizing");
1612
+ }, [
1613
+ compact,
1614
+ geometry.mode,
1615
+ panelGeometryForGesture
1616
+ ]);
1617
+ const updateGesture = (0, react.useCallback)((event) => {
1618
+ const gesture = gestureRef.current;
1619
+ if (gesture === null || gesture.pointerId !== event.pointerId || !event.currentTarget.hasPointerCapture(event.pointerId)) return;
1620
+ const dx = event.clientX - gesture.originX;
1621
+ const dy = event.clientY - gesture.originY;
1622
+ const activeBounds = boundsRef.current;
1623
+ if (gesture.kind === "move") {
1624
+ if (!gesture.activated && Math.hypot(dx, dy) < MOVE_THRESHOLD) return;
1625
+ if (!gesture.activated) {
1626
+ gesture.activated = true;
1627
+ setInteraction("dragging");
1628
+ }
1629
+ scheduleLayout(movePanelLayout(floatPanelLayout(gesture.start, activeBounds), dx, dy, activeBounds));
1630
+ return;
1631
+ }
1632
+ scheduleLayout(resizePanelLayout(gesture.start, gesture.edge ?? "left", dx, dy, activeBounds));
1633
+ }, [scheduleLayout]);
1634
+ const endGesture = (0, react.useCallback)((event) => {
1635
+ const gesture = gestureRef.current;
1636
+ if (gesture === null || gesture.pointerId !== event.pointerId) return;
1637
+ updateGesture(event);
1638
+ flushScheduledLayout();
1639
+ if (event.currentTarget.hasPointerCapture(event.pointerId)) event.currentTarget.releasePointerCapture(event.pointerId);
1640
+ gestureRef.current = null;
1641
+ setInteraction(null);
1642
+ }, [flushScheduledLayout, updateGesture]);
1643
+ const cancelGesture = (0, react.useCallback)((event) => {
1644
+ const gesture = gestureRef.current;
1645
+ if (gesture === null || gesture.pointerId !== event.pointerId) return;
1646
+ flushScheduledLayout();
1647
+ gestureRef.current = null;
1648
+ setInteraction(null);
1649
+ }, [flushScheduledLayout]);
1650
+ const toggleDock = (0, react.useCallback)(() => {
1651
+ const liveGeometry = panelGeometryForGesture();
1652
+ commitLayout(liveGeometry.mode === "docked" ? floatPanelLayout(liveGeometry, boundsRef.current) : dockPanelLayout(liveGeometry, boundsRef.current));
1653
+ }, [commitLayout, panelGeometryForGesture]);
1654
+ const autoHeight = panelUsesAutoHeight(geometry, bounds);
1655
+ const panelStyle = {
1656
+ width: geometry.width,
1657
+ height: autoHeight ? "auto" : geometry.height,
1658
+ maxHeight: panelMaximumHeight(geometry, bounds),
1659
+ transform: `translate3d(${geometry.x}px, ${geometry.y}px, 0)`
1660
+ };
1661
+ if (!hasTeams && !expanded) return null;
1317
1662
  return (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [!expanded && (0, react_jsx_runtime.jsx)(CollapsedBadge, {
1318
1663
  count: visibleCount,
1319
1664
  busy,
@@ -1323,57 +1668,119 @@ window.__ModuleLoader__.load({
1323
1668
  setOpen(true);
1324
1669
  }
1325
1670
  }), expanded && (0, react_jsx_runtime.jsxs)("aside", {
1671
+ ref: panelRef,
1326
1672
  className: ActivityPanel_module_css_default.panel,
1673
+ style: panelStyle,
1327
1674
  "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
1675
+ "data-panel-mode": geometry.mode,
1676
+ "data-height-mode": autoHeight ? "auto" : "manual",
1677
+ "data-compact": compact || void 0,
1678
+ "data-dragging": interaction === "dragging" || void 0,
1679
+ "data-resizing": interaction === "resizing" || void 0,
1680
+ "aria-label": "AgentTeams 活动面板",
1681
+ children: [
1682
+ (0, react_jsx_runtime.jsxs)("header", {
1683
+ className: ActivityPanel_module_css_default.panelHead,
1684
+ onPointerDown: beginMove,
1685
+ onPointerMove: updateGesture,
1686
+ onPointerUp: endGesture,
1687
+ onPointerCancel: cancelGesture,
1688
+ "data-drag-handle": !compact || void 0,
1689
+ children: [(0, react_jsx_runtime.jsxs)("span", {
1690
+ className: ActivityPanel_module_css_default.panelTitle,
1691
+ children: ["AgentTeams 活动", (0, react_jsx_runtime.jsx)("span", {
1692
+ className: ActivityPanel_module_css_default.panelDot,
1693
+ "data-busy": busy,
1694
+ "aria-hidden": true
1695
+ })]
1696
+ }), (0, react_jsx_runtime.jsxs)("span", {
1697
+ className: ActivityPanel_module_css_default.panelControls,
1698
+ children: [!compact && (0, react_jsx_runtime.jsx)("button", {
1699
+ type: "button",
1700
+ className: ActivityPanel_module_css_default.iconButton,
1701
+ "data-control": "dock",
1702
+ "data-mode": geometry.mode,
1703
+ onClick: toggleDock,
1704
+ "aria-label": geometry.mode === "docked" ? "切换为浮动面板" : "停靠到右侧",
1705
+ title: geometry.mode === "docked" ? "切换为浮动面板" : "停靠到右侧",
1706
+ children: (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconPanelLeftOutline16, {})
1707
+ }), (0, react_jsx_runtime.jsx)("button", {
1708
+ type: "button",
1709
+ className: ActivityPanel_module_css_default.iconButton,
1710
+ "data-control": "collapse",
1711
+ onClick: () => {
1712
+ setOpen(false);
1713
+ setOpenOwner(void 0);
1714
+ },
1715
+ "aria-label": "收起活动面板",
1716
+ title: "收起活动面板",
1717
+ children: (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconChevronDownOutline14, {})
1718
+ })]
1336
1719
  })]
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, {
1720
+ }),
1721
+ (0, react_jsx_runtime.jsx)("div", {
1722
+ className: ActivityPanel_module_css_default.teams,
1723
+ children: visibleCount === 0 ? (0, react_jsx_runtime.jsx)("span", {
1724
+ className: ActivityPanel_module_css_default.emptyHint,
1725
+ children: "暂无团队活动"
1726
+ }) : (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
1727
+ visibleTeams.map((team) => (0, react_jsx_runtime.jsx)(TeamSection, {
1362
1728
  team,
1363
- onNavigate: navigateToSession,
1364
- historic: true
1729
+ onNavigate: navigateToSession
1730
+ }, team.teamId)),
1731
+ visibleArchived.map((team) => (0, react_jsx_runtime.jsx)("div", {
1732
+ "data-team-id": team.teamId,
1733
+ "data-historic": true,
1734
+ className: ActivityPanel_module_css_default.archivedWrap,
1735
+ children: (0, react_jsx_runtime.jsx)(TeamSection, {
1736
+ team,
1737
+ onNavigate: navigateToSession,
1738
+ historic: true
1739
+ })
1740
+ }, `${team.captainSessionId}:${team.teamId}`)),
1741
+ visibleHistoric.map(({ data: team, owner }) => {
1742
+ const teamKey = `${owner}:${team.teamId}`;
1743
+ return (0, react_jsx_runtime.jsx)(TeamSection, {
1744
+ team: historicCardTeam(team, owner),
1745
+ onNavigate: navigateToSession,
1746
+ historic: true
1747
+ }, teamKey);
1365
1748
  })
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
- })]
1749
+ ] })
1750
+ }),
1751
+ !compact && (0, react_jsx_runtime.jsx)("div", {
1752
+ className: ActivityPanel_module_css_default.resizeHandle,
1753
+ "data-resize-edge": "left",
1754
+ onPointerDown: (event) => {
1755
+ beginResize("left", event);
1756
+ },
1757
+ onPointerMove: updateGesture,
1758
+ onPointerUp: endGesture,
1759
+ onPointerCancel: cancelGesture,
1760
+ "aria-hidden": true
1761
+ }),
1762
+ !compact && geometry.mode === "floating" && (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [(0, react_jsx_runtime.jsx)("div", {
1763
+ className: ActivityPanel_module_css_default.resizeHandle,
1764
+ "data-resize-edge": "bottom",
1765
+ onPointerDown: (event) => {
1766
+ beginResize("bottom", event);
1767
+ },
1768
+ onPointerMove: updateGesture,
1769
+ onPointerUp: endGesture,
1770
+ onPointerCancel: cancelGesture,
1771
+ "aria-hidden": true
1772
+ }), (0, react_jsx_runtime.jsx)("div", {
1773
+ className: ActivityPanel_module_css_default.resizeHandle,
1774
+ "data-resize-edge": "corner",
1775
+ onPointerDown: (event) => {
1776
+ beginResize("corner", event);
1777
+ },
1778
+ onPointerMove: updateGesture,
1779
+ onPointerUp: endGesture,
1780
+ onPointerCancel: cancelGesture,
1781
+ "aria-hidden": true
1782
+ })] })
1783
+ ]
1377
1784
  })] });
1378
1785
  }
1379
1786
  //#endregion
@@ -1467,27 +1874,32 @@ window.__ModuleLoader__.load({
1467
1874
  "slots",
1468
1875
  "sessions"
1469
1876
  ];
1877
+ /** The replayed user message is the canonical transcript entry. */
1878
+ function HiddenAgentTeamsCommand() {
1879
+ return null;
1880
+ }
1470
1881
  /**
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.
1882
+ * Register the activity monitor in the shell's additive overlay and the
1883
+ * in-conversation team card. The card's activity button re-opens a folded
1884
+ * monitor via a window event — the recovery path for an old session.
1475
1885
  */
1476
1886
  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, {
1887
+ const Panel = () => (0, react_jsx_runtime.jsx)(ActivityPanel, {
1482
1888
  sessionsList: ctx.sessions.list,
1483
1889
  openSession: (id) => {
1484
1890
  ctx.sessions.open(id);
1485
1891
  }
1486
- }));
1487
- ctx.effect(() => () => {
1488
- root.unmount();
1489
- host.remove();
1490
- }, "agent-teams: activity panel");
1892
+ });
1893
+ ctx.slots.inject("shell.overlay", () => ctx.slots.register({
1894
+ name: "shell.overlay",
1895
+ id: "agent-teams-activity",
1896
+ order: 80,
1897
+ label: "AgentTeams activity"
1898
+ }, Panel));
1899
+ ctx.slots.inject("conversation.chat.commandview", () => ctx.slots.register({
1900
+ name: "conversation.chat.commandview",
1901
+ key: "agent-teams"
1902
+ }, HiddenAgentTeamsCommand));
1491
1903
  ctx.conversationEvents.register(agentTeamsCardDefinition);
1492
1904
  ctx.slots.inject("conversation.chat.node", () => ctx.slots.register({
1493
1905
  name: "conversation.chat.node",