@mstar-harness/dsh 3.8.0 → 3.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/client.js CHANGED
@@ -72,6 +72,41 @@ __export(exports_client, {
72
72
  });
73
73
  module.exports = __toCommonJS(exports_client);
74
74
 
75
+ // src/client/panel/mstar-glyph.tsx
76
+ var jsx_runtime = require("react/jsx-runtime");
77
+ function MstarGlyph({ size = 16, className }) {
78
+ return /* @__PURE__ */ jsx_runtime.jsx("svg", {
79
+ className,
80
+ width: size,
81
+ height: size,
82
+ viewBox: "0 0 512 512",
83
+ "aria-hidden": "true",
84
+ children: /* @__PURE__ */ jsx_runtime.jsx("path", {
85
+ fill: "currentColor",
86
+ d: "M256 72l36 140 140 36-140 36-36 156-36-156-140-36 140-36 36-140z"
87
+ })
88
+ });
89
+ }
90
+
91
+ // src/client/panel/definition.ts
92
+ var MSTAR_PANEL_ID = "@mstar-harness/dsh";
93
+ var MSTAR_PANEL_KIND = "mstar-workflow";
94
+ var MSTAR_GUIDE_ORDER = 20;
95
+ function mstarPanelDefinition(t) {
96
+ const title = () => t("view.mstar-workflow");
97
+ return {
98
+ id: MSTAR_PANEL_ID,
99
+ kind: MSTAR_PANEL_KIND,
100
+ title,
101
+ guide: [{
102
+ order: MSTAR_GUIDE_ORDER,
103
+ title,
104
+ description: () => t("guide.description"),
105
+ icon: MstarGlyph
106
+ }]
107
+ };
108
+ }
109
+
75
110
  // src/engine-status-wire.ts
76
111
  var ENGINE_STATUS_CHANNEL = "/api";
77
112
  var ENGINE_STATUS_ENDPOINT = "mstar/engineStatus";
@@ -288,10 +323,28 @@ class MstarEngineStatusClient {
288
323
  }
289
324
  }
290
325
 
326
+ // src/client/panel/MstarPanelTitle.tsx
327
+ var jsx_runtime2 = require("react/jsx-runtime");
328
+ function MstarPanelTitle({ useTabInfo }) {
329
+ const { tab } = useTabInfo();
330
+ return /* @__PURE__ */ jsx_runtime2.jsxs("span", {
331
+ style: { display: "inline-flex", alignItems: "center", gap: "var(--mstar-space-1, 4px)" },
332
+ children: [
333
+ /* @__PURE__ */ jsx_runtime2.jsx(MstarGlyph, {
334
+ size: 14
335
+ }),
336
+ /* @__PURE__ */ jsx_runtime2.jsx("span", {
337
+ children: tab.title
338
+ })
339
+ ]
340
+ });
341
+ }
342
+
291
343
  // src/client/panel/locale.ts
292
344
  var NS = "mstar-panel";
293
345
  var zh = {
294
- "view.mstar-workflow": "MStar 工作流",
346
+ "view.mstar-workflow": "启明星工作流",
347
+ "guide.description": "查看工作区状态、计划与迭代进度",
295
348
  "tab.tasks": "任务迭代",
296
349
  "tab.agents": "代理执行",
297
350
  "tab.events": "事件记录",
@@ -414,7 +467,8 @@ var zh = {
414
467
  "freshness.refresh-note": "该会话已存储的快照——不是实时值"
415
468
  };
416
469
  var en = {
417
- "view.mstar-workflow": "MStar Workflow",
470
+ "view.mstar-workflow": "Morning Star Workflow",
471
+ "guide.description": "Workspace state, plans, and iteration progress",
418
472
  "tab.tasks": "Task Iteration",
419
473
  "tab.agents": "Agent Run",
420
474
  "tab.events": "Event Log",
@@ -537,8 +591,21 @@ var en = {
537
591
  "freshness.refresh-note": "the stored snapshot for this session — never a live value"
538
592
  };
539
593
 
594
+ // src/client/panel/panel-store.ts
595
+ var import_dsh_client_store = require("@deepseek-ai/dsh-client-store");
596
+ function createPanelStore() {
597
+ return import_dsh_client_store.defineStore({
598
+ init: () => ({ byTab: {} }),
599
+ actions: {
600
+ select(d, tabId, section) {
601
+ d.byTab[tabId] = section;
602
+ }
603
+ }
604
+ });
605
+ }
606
+
540
607
  // src/client/panel/PanelView.tsx
541
- var import_react4 = require("react");
608
+ var React2 = __toESM(require("react"));
542
609
 
543
610
  // src/client/panel/panel.module.css
544
611
  var css = `
@@ -553,37 +620,74 @@ var css = `
553
620
  }
554
621
 
555
622
 
556
- .\\32 0fd0e45_root {
623
+ .\\32 0fd0e45_root,
624
+ .f83e09fa_emptyRoot {
557
625
  --mstar-space-1: 4px;
558
626
  --mstar-space-2: 8px;
559
627
  --mstar-space-3: 12px;
560
628
  --mstar-space-4: 16px;
561
629
  --mstar-space-5: 24px;
562
630
  --mstar-space-6: 32px;
563
- display: grid;
564
- grid-template-columns: minmax(0, 1fr) 300px;
565
- grid-template-rows: minmax(0, 1fr);
566
- grid-template-areas: 'main sidebar';
631
+ }
632
+
633
+ .\\32 0fd0e45_root {
634
+ display: flex;
635
+ flex-direction: column;
567
636
  height: 100%;
568
637
  min-height: 0;
569
638
  width: 100%;
570
- padding: 0;
571
-
572
- padding-bottom: calc(var(--dsh-composer-height, 152px) + var(--mstar-space-3));
573
639
  overflow: hidden;
640
+ container-type: inline-size;
574
641
  }
575
642
 
576
643
 
577
- .\\32 0fd0e45_root[data-mstar-panel='no-harness'] {
578
- grid-template-columns: 1fr;
579
- grid-template-areas: 'main';
644
+
645
+ .\\31 843711c_groupGrid {
646
+ display: grid;
647
+ grid-template-columns: minmax(0, 1fr);
648
+ gap: var(--mstar-space-4);
580
649
  }
581
650
 
582
651
 
583
- .\\35 8245a20_noHarnessCard {
584
- flex: 1;
652
+
653
+ @container (max-width: 480px) {
654
+ .dd4ec22c_scroll {
655
+ padding: var(--mstar-space-3);
656
+ }
657
+
658
+ .\\38 1fe4f58_meta {
659
+ padding: var(--mstar-space-3);
660
+ }
661
+
662
+ .\\31 843711c_groupGrid {
663
+ gap: var(--mstar-space-3);
664
+ }
665
+ }
666
+
667
+
668
+
669
+ @container (min-width: 720px) {
670
+ .\\31 843711c_groupGrid {
671
+ grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
672
+ }
673
+ }
674
+
675
+
676
+ .f83e09fa_emptyRoot {
677
+ display: flex;
678
+ align-items: center;
679
+ justify-content: center;
680
+ height: 100%;
585
681
  min-height: 0;
586
682
  width: 100%;
683
+ padding: var(--mstar-space-4);
684
+ overflow: hidden;
685
+ }
686
+
687
+
688
+ .\\35 8245a20_noHarnessCard {
689
+ flex: 1 0 auto;
690
+ width: 100%;
587
691
  max-width: 400px;
588
692
  align-self: center;
589
693
  display: flex;
@@ -618,50 +722,16 @@ var css = `
618
722
  font: var(--dsw-font-xxxs-11);
619
723
  }
620
724
 
621
- @media (max-width: 860px) {
622
- .\\32 0fd0e45_root {
623
- grid-template-columns: 1fr;
624
- grid-template-rows: minmax(0, 1fr) minmax(0, 1fr);
625
- grid-template-areas:
626
- 'main'
627
- 'sidebar';
628
- }
629
- .c87acfc7_sidebar {
630
- border-left: 0;
631
- border-top: 1px solid var(--dsw-alias-border-l1);
632
- }
633
-
634
- .\\37 7aea5a6_iterationHeadSplit {
635
- flex-direction: column;
636
- }
637
- .\\37 7aea5a6_iterationHeadSplit > .c3b8dcb0_iterationBranches {
638
- flex: 0 1 auto;
639
- max-width: none;
640
- }
641
- }
642
725
 
643
726
 
644
- .f83e09fa_emptyRoot {
645
- display: flex;
646
- align-items: center;
647
- justify-content: center;
648
- height: 100%;
727
+ .dd4ec22c_scroll {
728
+ flex: 1 1 auto;
649
729
  min-height: 0;
650
- width: 100%;
651
- padding: var(--mstar-space-4);
652
- overflow: hidden;
653
- }
654
-
655
-
656
-
657
- .ea90e208_main {
658
- grid-area: main;
659
730
  display: flex;
660
731
  flex-direction: column;
661
- min-width: 0;
662
- min-height: 0;
663
732
  padding: var(--mstar-space-4);
664
- overflow: hidden;
733
+ overflow-y: auto;
734
+ overflow-x: hidden;
665
735
  }
666
736
 
667
737
 
@@ -670,7 +740,7 @@ var css = `
670
740
  display: flex;
671
741
  flex: none;
672
742
  gap: var(--mstar-space-1);
673
- padding: 0;
743
+ padding: var(--mstar-space-1) var(--mstar-space-2);
674
744
  margin: 0 0 var(--mstar-space-2);
675
745
  border-bottom: 1px solid var(--dsw-alias-border-l1);
676
746
  }
@@ -680,7 +750,7 @@ var css = `
680
750
  appearance: none;
681
751
  border: 0;
682
752
  background: none;
683
- padding: var(--mstar-space-2) var(--mstar-space-3);
753
+ padding: var(--mstar-space-1) var(--mstar-space-2);
684
754
  color: var(--dsw-alias-label-secondary);
685
755
  font: var(--dsw-font-xxs-12);
686
756
  cursor: pointer;
@@ -698,19 +768,10 @@ var css = `
698
768
  }
699
769
 
700
770
 
701
- .\\39 0bec3c2_content {
702
- flex: 1;
703
- min-height: 0;
704
- display: flex;
705
- flex-direction: column;
706
- overflow: hidden;
707
- }
708
-
709
771
 
710
772
 
711
773
  .\\33 b1c4147_iterationPage {
712
- flex: 1;
713
- min-height: 0;
774
+ flex: 1 0 auto;
714
775
  display: flex;
715
776
  flex-direction: column;
716
777
  gap: var(--mstar-space-3);
@@ -820,49 +881,39 @@ var css = `
820
881
 
821
882
  .\\37 7aea5a6_iterationHeadSplit {
822
883
  display: flex;
823
- align-items: stretch;
824
- gap: var(--mstar-space-4);
884
+ flex-direction: column;
885
+ gap: var(--mstar-space-3);
825
886
  min-width: 0;
826
887
  }
827
888
 
828
- @media (min-width: 861px) {
829
-
830
- .\\37 7aea5a6_iterationHeadSplit > .c3b8dcb0_iterationBranches {
831
- flex: 0 1 260px;
832
- max-width: 280px;
833
- min-width: 0;
834
- }
889
+ .\\37 7aea5a6_iterationHeadSplit > .c3b8dcb0_iterationBranches {
890
+ min-width: 0;
835
891
  }
836
892
 
837
893
  .\\37 7aea5a6_iterationHeadSplit > .c52f7b85_iterationStepsRow {
838
- flex: 1 1 0;
839
894
  min-width: 0;
840
895
  }
841
896
 
842
897
 
843
898
  .c52f7b85_iterationStepsRow {
844
899
  display: flex;
900
+ flex-direction: column;
845
901
  align-items: stretch;
846
- gap: var(--mstar-space-3);
902
+ gap: var(--mstar-space-2);
847
903
  margin: 0;
848
904
  padding: 0;
849
905
  list-style: none;
850
- overflow-x: auto;
851
- overscroll-behavior: contain;
852
906
  }
853
907
 
854
908
  .\\38 1013a9d_iterationStepItem {
855
- flex: 1 1 0;
856
909
  min-width: 0;
857
910
  display: flex;
858
- flex-direction: column;
859
911
  align-items: center;
860
- justify-content: center;
861
- gap: var(--mstar-space-1);
862
- text-align: center;
912
+ gap: var(--mstar-space-2);
863
913
  }
864
914
 
865
915
  .\\37 befde45_iterationStepBadge {
916
+ flex: none;
866
917
  display: inline-flex;
867
918
  align-items: center;
868
919
  justify-content: center;
@@ -877,6 +928,7 @@ var css = `
877
928
  }
878
929
 
879
930
  .d6cd23a5_iterationStepPhase {
931
+ flex: 1 1 auto;
880
932
  overflow-wrap: anywhere;
881
933
  color: var(--dsw-alias-label-secondary);
882
934
  font: var(--dsw-font-xxxs-11);
@@ -884,6 +936,7 @@ var css = `
884
936
 
885
937
 
886
938
  .de293024_iterationStepChip {
939
+ flex: none;
887
940
  display: inline-flex;
888
941
  align-items: center;
889
942
  padding: 0 var(--mstar-space-2);
@@ -933,6 +986,7 @@ var css = `
933
986
 
934
987
 
935
988
  .afea5850_iterationVerdictSeat {
989
+ flex: none;
936
990
  display: flex;
937
991
  align-items: center;
938
992
  justify-content: center;
@@ -1009,32 +1063,19 @@ var css = `
1009
1063
 
1010
1064
 
1011
1065
  .\\38 7f7efbe_iterationTasks {
1012
- flex: 1;
1013
- min-height: 0;
1014
- overflow-y: auto;
1015
- overscroll-behavior: contain;
1016
- }
1017
-
1018
-
1019
-
1020
- .c87acfc7_sidebar {
1021
- grid-area: sidebar;
1022
1066
  display: flex;
1023
1067
  flex-direction: column;
1068
+ gap: var(--mstar-space-3);
1024
1069
  min-width: 0;
1025
- min-height: 0;
1026
- border-left: 1px solid var(--dsw-alias-border-l1);
1027
1070
  }
1028
1071
 
1029
1072
 
1030
- .a0b80516_sidebarScroll {
1031
- flex: 1;
1032
- min-height: 0;
1033
- overflow-y: auto;
1073
+
1074
+ .c87acfc7_sidebar {
1034
1075
  display: flex;
1035
1076
  flex-direction: column;
1036
- gap: var(--mstar-space-4);
1037
- padding: var(--mstar-space-4);
1077
+ gap: var(--mstar-space-2);
1078
+ min-width: 0;
1038
1079
  }
1039
1080
 
1040
1081
 
@@ -1271,7 +1312,7 @@ if (typeof document !== "undefined" && document.querySelector("style[data-plugin
1271
1312
  tag.textContent = css;
1272
1313
  document.head.appendChild(tag);
1273
1314
  }
1274
- var panel_module_default = { root: "20fd0e45_root", emptyRoot: "f83e09fa_emptyRoot", noHarnessCard: "58245a20_noHarnessCard", noHarnessIcon: "ffb65da7_noHarnessIcon", noHarnessTitle: "81e1817c_noHarnessTitle", noHarnessHint: "a2289da7_noHarnessHint", sidebar: "c87acfc7_sidebar", iterationHeadSplit: "77aea5a6_iterationHeadSplit", iterationBranches: "c3b8dcb0_iterationBranches", main: "ea90e208_main", tabNav: "4bb38bc9_tabNav", tab: "98f72e4c_tab", tabActive: "59e199de_tabActive", content: "90bec3c2_content", iterationPage: "3b1c4147_iterationPage", iterationHead: "8a629a8e_iterationHead", iterationSummary: "2d1bee34_iterationSummary", iterationSummaryId: "17162a99_iterationSummaryId", iterationSummaryVerdict: "d3d74135_iterationSummaryVerdict", iterationSummaryStatus: "d9a886be_iterationSummaryStatus", iterationSummaryStatusMuted: "13bf2f41_iterationSummaryStatusMuted", iterationSummaryHint: "ede5708d_iterationSummaryHint", iterationHeadBody: "64d1da62_iterationHeadBody", iterationStepsRow: "c52f7b85_iterationStepsRow", iterationStepItem: "81013a9d_iterationStepItem", iterationStepBadge: "7befde45_iterationStepBadge", iterationStepPhase: "d6cd23a5_iterationStepPhase", iterationStepChip: "de293024_iterationStepChip", iterationVerdictSeat: "afea5850_iterationVerdictSeat", iterationVerdict: "ebe6bbcd_iterationVerdict", iterationBranchesTitle: "e6921da6_iterationBranchesTitle", iterationBranchList: "8a2cd65c_iterationBranchList", iterationBranchRow: "997b0230_iterationBranchRow", iterationBranchLabel: "6cafc032_iterationBranchLabel", iterationBranchValue: "cdcd06ed_iterationBranchValue", iterationTasks: "87f7efbe_iterationTasks", sidebarScroll: "a0b80516_sidebarScroll", meta: "81fe4f58_meta", metaLine: "0fc275e2_metaLine", section: "fcdd0ccc_section", sectionTitle: "aded23ea_sectionTitle", subTitle: "b7190159_subTitle", defList: "26763614_defList", defTerm: "670df156_defTerm", defValue: "3f1b3a05_defValue", planList: "a129f16e_planList", residualList: "113e0aa2_residualList", leaseList: "33dfcc85_leaseList", violationList: "999efdc0_violationList", planId: "744bf63f_planId", leasePlan: "560663a6_leasePlan", leaseHolder: "a68a6d03_leaseHolder", leaseWorktree: "db027b44_leaseWorktree", findingSeverity: "1797fd51_findingSeverity", findingTitle: "c80b7bb0_findingTitle", findingPlan: "616667ad_findingPlan", violationCode: "e42c0bfd_violationCode", knowledgeCategories: "e2098247_knowledgeCategories", planStatus: "a3021d7c_planStatus", truncated: "1849d129_truncated", knowledge: "3eb5feeb_knowledge", direction: "df6dc76a_direction", selection: "4364e615_selection", selectionId: "0ae21b10_selectionId", selectionMeta: "5e43d3a8_selectionMeta", selectionWarning: "da64723f_selectionWarning", selectionCode: "ac988a64_selectionCode", empty: "18a7beee_empty", freshness: "c75c59b0_freshness" };
1315
+ var panel_module_default = { root: "20fd0e45_root", emptyRoot: "f83e09fa_emptyRoot", groupGrid: "1843711c_groupGrid", scroll: "dd4ec22c_scroll", meta: "81fe4f58_meta", noHarnessCard: "58245a20_noHarnessCard", noHarnessIcon: "ffb65da7_noHarnessIcon", noHarnessTitle: "81e1817c_noHarnessTitle", noHarnessHint: "a2289da7_noHarnessHint", tabNav: "4bb38bc9_tabNav", tab: "98f72e4c_tab", tabActive: "59e199de_tabActive", iterationPage: "3b1c4147_iterationPage", iterationHead: "8a629a8e_iterationHead", iterationSummary: "2d1bee34_iterationSummary", iterationSummaryId: "17162a99_iterationSummaryId", iterationSummaryVerdict: "d3d74135_iterationSummaryVerdict", iterationSummaryStatus: "d9a886be_iterationSummaryStatus", iterationSummaryStatusMuted: "13bf2f41_iterationSummaryStatusMuted", iterationSummaryHint: "ede5708d_iterationSummaryHint", iterationHeadBody: "64d1da62_iterationHeadBody", iterationHeadSplit: "77aea5a6_iterationHeadSplit", iterationBranches: "c3b8dcb0_iterationBranches", iterationStepsRow: "c52f7b85_iterationStepsRow", iterationStepItem: "81013a9d_iterationStepItem", iterationStepBadge: "7befde45_iterationStepBadge", iterationStepPhase: "d6cd23a5_iterationStepPhase", iterationStepChip: "de293024_iterationStepChip", iterationVerdictSeat: "afea5850_iterationVerdictSeat", iterationVerdict: "ebe6bbcd_iterationVerdict", iterationBranchesTitle: "e6921da6_iterationBranchesTitle", iterationBranchList: "8a2cd65c_iterationBranchList", iterationBranchRow: "997b0230_iterationBranchRow", iterationBranchLabel: "6cafc032_iterationBranchLabel", iterationBranchValue: "cdcd06ed_iterationBranchValue", iterationTasks: "87f7efbe_iterationTasks", sidebar: "c87acfc7_sidebar", metaLine: "0fc275e2_metaLine", section: "fcdd0ccc_section", sectionTitle: "aded23ea_sectionTitle", subTitle: "b7190159_subTitle", defList: "26763614_defList", defTerm: "670df156_defTerm", defValue: "3f1b3a05_defValue", planList: "a129f16e_planList", residualList: "113e0aa2_residualList", leaseList: "33dfcc85_leaseList", violationList: "999efdc0_violationList", planId: "744bf63f_planId", leasePlan: "560663a6_leasePlan", leaseHolder: "a68a6d03_leaseHolder", leaseWorktree: "db027b44_leaseWorktree", findingSeverity: "1797fd51_findingSeverity", findingTitle: "c80b7bb0_findingTitle", findingPlan: "616667ad_findingPlan", violationCode: "e42c0bfd_violationCode", knowledgeCategories: "e2098247_knowledgeCategories", planStatus: "a3021d7c_planStatus", truncated: "1849d129_truncated", knowledge: "3eb5feeb_knowledge", direction: "df6dc76a_direction", selection: "4364e615_selection", selectionId: "0ae21b10_selectionId", selectionMeta: "5e43d3a8_selectionMeta", selectionWarning: "da64723f_selectionWarning", selectionCode: "ac988a64_selectionCode", empty: "18a7beee_empty", freshness: "c75c59b0_freshness" };
1275
1316
 
1276
1317
  // src/client/panel/plan-sort.ts
1277
1318
  var PLAN_CAP = 5;
@@ -1546,23 +1587,6 @@ function bucketOf(role) {
1546
1587
  return "reviewer";
1547
1588
  return null;
1548
1589
  }
1549
- function sddImplementColumnId(stages) {
1550
- const s = stages.find((x) => x.stage === "sdd-implement");
1551
- return s === undefined ? null : s.id;
1552
- }
1553
- function superviseEdges(stages, entries) {
1554
- const columnId = sddImplementColumnId(stages);
1555
- if (columnId === null)
1556
- return [];
1557
- const evidenced = entries.some((e) => e.view.kind === "dispatch" && bucketOf(e.view.role) !== null);
1558
- return [{
1559
- kind: "supervise",
1560
- source: `${columnId}:implementor`,
1561
- target: `${columnId}:reviewer`,
1562
- entityKey: null,
1563
- evidenced
1564
- }];
1565
- }
1566
1590
  function entityKeyOf(role) {
1567
1591
  if (role !== "" && KNOWN_AGENTS.some((a) => a.id === role))
1568
1592
  return role;
@@ -1637,37 +1661,6 @@ function aggregateEntities(entries, pairStatus, currentStep) {
1637
1661
  idle: false
1638
1662
  }));
1639
1663
  }
1640
- function actualEdges(entries) {
1641
- const byPlan = new Map;
1642
- entries.forEach((e, idx) => {
1643
- const v = e.view;
1644
- if (v.kind !== "dispatch")
1645
- return;
1646
- if (v.planId === null)
1647
- return;
1648
- const key = entityKeyOf(v.role);
1649
- const list = byPlan.get(v.planId);
1650
- if (list === undefined)
1651
- byPlan.set(v.planId, [{ key, ts: v.ts, idx }]);
1652
- else
1653
- list.push({ key, ts: v.ts, idx });
1654
- });
1655
- const pairEdges = new Map;
1656
- for (const planId of Array.from(byPlan.keys()).sort()) {
1657
- const rows = byPlan.get(planId).slice().sort((a, b) => a.ts - b.ts || (a.key < b.key ? -1 : a.key > b.key ? 1 : 0) || a.idx - b.idx);
1658
- for (let i = 0;i + 1 < rows.length; i++) {
1659
- if (rows[i].key === rows[i + 1].key)
1660
- continue;
1661
- const a = rows[i].key;
1662
- const b = rows[i + 1].key;
1663
- if (a === GENERAL_BUCKET || b === GENERAL_BUCKET)
1664
- continue;
1665
- const pairKey = a < b ? `${a}|${b}` : `${b}|${a}`;
1666
- pairEdges.set(pairKey, { kind: "actual", source: a, target: b, entityKey: null });
1667
- }
1668
- }
1669
- return Array.from(pairEdges.values());
1670
- }
1671
1664
  function idleEntities(evidencedRoles, litKeys, currentStep) {
1672
1665
  const out = [];
1673
1666
  for (const known of KNOWN_AGENTS) {
@@ -1742,7 +1735,6 @@ function projectAgents(source, currentStep) {
1742
1735
  empty: false,
1743
1736
  note: null,
1744
1737
  entities: idleEntities(new Set, new Set, currentStep),
1745
- edges: superviseEdges(stages, []),
1746
1738
  executing: 0,
1747
1739
  pending: 0,
1748
1740
  activePlanId,
@@ -1784,13 +1776,9 @@ function projectAgents(source, currentStep) {
1784
1776
  const lit = aggregateEntities(filtered, pairStatus, currentStep);
1785
1777
  const litKeys = new Set(lit.map((e) => e.key));
1786
1778
  const entities = [...lit, ...idleEntities(evidencedRoles, litKeys, currentStep)];
1787
- const edges = [
1788
- ...actualEdges(filtered),
1789
- ...superviseEdges(stages, entries)
1790
- ];
1791
1779
  const executing = entities.filter((e) => e.status === "running").length;
1792
1780
  const pending = stages.reduce((sum, s) => sum + (evidenced.has(s.id) ? 0 : s.roles.length), 0);
1793
- return { stages, degraded: false, empty, note, entities, edges, executing, pending, activePlanId, activePlanCount };
1781
+ return { stages, degraded: false, empty, note, entities, executing, pending, activePlanId, activePlanCount };
1794
1782
  }
1795
1783
  var FLOW_EVENT_WINDOW = 50;
1796
1784
  function roleStageIndex() {
@@ -1960,19 +1948,19 @@ function projectFlowEvents(source) {
1960
1948
  }
1961
1949
 
1962
1950
  // src/client/panel/panel-meta.tsx
1963
- var jsx_runtime = require("react/jsx-runtime");
1951
+ var jsx_runtime3 = require("react/jsx-runtime");
1964
1952
  function PanelMeta({ t, source }) {
1965
- return /* @__PURE__ */ jsx_runtime.jsxs("footer", {
1953
+ return /* @__PURE__ */ jsx_runtime3.jsxs("footer", {
1966
1954
  className: panel_module_default.meta,
1967
1955
  "data-mstar-meta": true,
1968
1956
  "data-mstar-watermark": true,
1969
1957
  children: [
1970
- /* @__PURE__ */ jsx_runtime.jsx("p", {
1958
+ /* @__PURE__ */ jsx_runtime3.jsx("p", {
1971
1959
  className: panel_module_default.metaLine,
1972
1960
  "data-mstar-meta-version": true,
1973
1961
  children: t("watermark.version", { version: str(source.version) ?? t("panel.unknown") })
1974
1962
  }),
1975
- /* @__PURE__ */ jsx_runtime.jsx("p", {
1963
+ /* @__PURE__ */ jsx_runtime3.jsx("p", {
1976
1964
  className: panel_module_default.metaLine,
1977
1965
  "data-mstar-meta-harness": true,
1978
1966
  children: t("watermark.harness", { dir: source.harnessDir ?? t("watermark.none") })
@@ -1982,7 +1970,7 @@ function PanelMeta({ t, source }) {
1982
1970
  }
1983
1971
 
1984
1972
  // src/client/panel/state-section.tsx
1985
- var jsx_runtime2 = require("react/jsx-runtime");
1973
+ var jsx_runtime4 = require("react/jsx-runtime");
1986
1974
  function enforcementLabel(t, enforcement) {
1987
1975
  if (enforcement === null || enforcement === undefined || typeof enforcement !== "object") {
1988
1976
  return t("panel.unknown");
@@ -2003,230 +1991,230 @@ function StateSection({ t, state, enforcement }) {
2003
1991
  const leases = Array.isArray(state?.leases) ? state.leases : [];
2004
1992
  const knowledge = state?.knowledge ?? null;
2005
1993
  const selection = state?.selection;
2006
- return /* @__PURE__ */ jsx_runtime2.jsxs("section", {
1994
+ return /* @__PURE__ */ jsx_runtime4.jsxs("section", {
2007
1995
  className: panel_module_default.section,
2008
1996
  "data-mstar-section": "state",
2009
1997
  children: [
2010
- /* @__PURE__ */ jsx_runtime2.jsx("h2", {
1998
+ /* @__PURE__ */ jsx_runtime4.jsx("h2", {
2011
1999
  className: panel_module_default.sectionTitle,
2012
2000
  children: t("state.title")
2013
2001
  }),
2014
- /* @__PURE__ */ jsx_runtime2.jsx("h3", {
2002
+ /* @__PURE__ */ jsx_runtime4.jsx("h3", {
2015
2003
  className: panel_module_default.subTitle,
2016
2004
  children: t("state.selection")
2017
2005
  }),
2018
- selection?.kind === "active" ? /* @__PURE__ */ jsx_runtime2.jsxs("p", {
2006
+ selection?.kind === "active" ? /* @__PURE__ */ jsx_runtime4.jsxs("p", {
2019
2007
  className: panel_module_default.selection,
2020
2008
  "data-selection-kind": "active",
2021
2009
  "data-selection-workflow": selection.workflowId,
2022
2010
  children: [
2023
- /* @__PURE__ */ jsx_runtime2.jsx("span", {
2011
+ /* @__PURE__ */ jsx_runtime4.jsx("span", {
2024
2012
  className: panel_module_default.selectionId,
2025
2013
  children: selection.workflowId
2026
2014
  }),
2027
- selection.warning !== undefined ? /* @__PURE__ */ jsx_runtime2.jsx("span", {
2015
+ selection.warning !== undefined ? /* @__PURE__ */ jsx_runtime4.jsx("span", {
2028
2016
  className: panel_module_default.selectionWarning,
2029
2017
  "data-selection-warning": true,
2030
2018
  children: selection.warning.message
2031
2019
  }) : null
2032
2020
  ]
2033
- }) : selection?.kind === "terminal" ? /* @__PURE__ */ jsx_runtime2.jsxs("p", {
2021
+ }) : selection?.kind === "terminal" ? /* @__PURE__ */ jsx_runtime4.jsxs("p", {
2034
2022
  className: panel_module_default.selection,
2035
2023
  "data-selection-kind": "terminal",
2036
2024
  "data-selection-workflow": selection.workflowId,
2037
2025
  children: [
2038
- /* @__PURE__ */ jsx_runtime2.jsx("span", {
2026
+ /* @__PURE__ */ jsx_runtime4.jsx("span", {
2039
2027
  className: panel_module_default.selectionId,
2040
2028
  children: selection.workflowId
2041
2029
  }),
2042
- /* @__PURE__ */ jsx_runtime2.jsx("span", {
2030
+ /* @__PURE__ */ jsx_runtime4.jsx("span", {
2043
2031
  className: panel_module_default.selectionMeta,
2044
2032
  "data-selection-history": true,
2045
2033
  children: t("state.selection.history")
2046
2034
  })
2047
2035
  ]
2048
- }) : /* @__PURE__ */ jsx_runtime2.jsxs("p", {
2036
+ }) : /* @__PURE__ */ jsx_runtime4.jsxs("p", {
2049
2037
  className: panel_module_default.selection,
2050
2038
  "data-selection-kind": "error",
2051
2039
  "data-selection-code": selection?.code ?? t("panel.unknown"),
2052
2040
  children: [
2053
- /* @__PURE__ */ jsx_runtime2.jsx("span", {
2041
+ /* @__PURE__ */ jsx_runtime4.jsx("span", {
2054
2042
  className: panel_module_default.selectionCode,
2055
2043
  children: selection?.code ?? t("panel.unknown")
2056
2044
  }),
2057
- /* @__PURE__ */ jsx_runtime2.jsx("span", {
2045
+ /* @__PURE__ */ jsx_runtime4.jsx("span", {
2058
2046
  className: panel_module_default.selectionMeta,
2059
2047
  children: selection?.message ?? t("state.none")
2060
2048
  })
2061
2049
  ]
2062
2050
  }),
2063
- /* @__PURE__ */ jsx_runtime2.jsx("h3", {
2051
+ /* @__PURE__ */ jsx_runtime4.jsx("h3", {
2064
2052
  className: panel_module_default.subTitle,
2065
2053
  children: t("state.plans")
2066
2054
  }),
2067
- visiblePlans.length === 0 ? /* @__PURE__ */ jsx_runtime2.jsx("p", {
2055
+ visiblePlans.length === 0 ? /* @__PURE__ */ jsx_runtime4.jsx("p", {
2068
2056
  className: panel_module_default.empty,
2069
2057
  "data-mstar-empty": "no-plans",
2070
2058
  children: t("state.none")
2071
- }) : /* @__PURE__ */ jsx_runtime2.jsx("ul", {
2059
+ }) : /* @__PURE__ */ jsx_runtime4.jsx("ul", {
2072
2060
  className: panel_module_default.planList,
2073
- children: visiblePlans.map((plan, i) => /* @__PURE__ */ jsx_runtime2.jsxs("li", {
2061
+ children: visiblePlans.map((plan, i) => /* @__PURE__ */ jsx_runtime4.jsxs("li", {
2074
2062
  "data-plan-id": str(plan.id) ?? "unknown",
2075
2063
  "data-plan-status": str(plan.status) ?? "unknown",
2076
2064
  children: [
2077
- /* @__PURE__ */ jsx_runtime2.jsx("span", {
2065
+ /* @__PURE__ */ jsx_runtime4.jsx("span", {
2078
2066
  className: panel_module_default.planStatus,
2079
2067
  "data-status": str(plan.status) ?? "unknown",
2080
2068
  children: str(plan.status) ?? t("panel.unknown")
2081
2069
  }),
2082
- /* @__PURE__ */ jsx_runtime2.jsx("span", {
2070
+ /* @__PURE__ */ jsx_runtime4.jsx("span", {
2083
2071
  className: panel_module_default.planId,
2084
2072
  children: str(plan.id) ?? t("panel.unknown")
2085
2073
  })
2086
2074
  ]
2087
2075
  }, str(plan.id) ?? `plan-${i}`))
2088
2076
  }),
2089
- hiddenPlans > 0 ? /* @__PURE__ */ jsx_runtime2.jsx("p", {
2077
+ hiddenPlans > 0 ? /* @__PURE__ */ jsx_runtime4.jsx("p", {
2090
2078
  className: panel_module_default.truncated,
2091
2079
  "data-plan-truncated": true,
2092
2080
  children: t("state.plans.more", { count: String(hiddenPlans) })
2093
2081
  }) : null,
2094
- /* @__PURE__ */ jsx_runtime2.jsx("h3", {
2082
+ /* @__PURE__ */ jsx_runtime4.jsx("h3", {
2095
2083
  className: panel_module_default.subTitle,
2096
2084
  children: t("state.residuals")
2097
2085
  }),
2098
- visibleFindings === null || visibleFindings.length === 0 ? /* @__PURE__ */ jsx_runtime2.jsx("p", {
2086
+ visibleFindings === null || visibleFindings.length === 0 ? /* @__PURE__ */ jsx_runtime4.jsx("p", {
2099
2087
  className: panel_module_default.empty,
2100
2088
  "data-mstar-empty": "no-residuals",
2101
2089
  children: t("state.none")
2102
- }) : /* @__PURE__ */ jsx_runtime2.jsx("ul", {
2090
+ }) : /* @__PURE__ */ jsx_runtime4.jsx("ul", {
2103
2091
  className: panel_module_default.residualList,
2104
- children: visibleFindings.map((finding, i) => /* @__PURE__ */ jsx_runtime2.jsxs("li", {
2092
+ children: visibleFindings.map((finding, i) => /* @__PURE__ */ jsx_runtime4.jsxs("li", {
2105
2093
  "data-residual-finding": true,
2106
2094
  "data-residual-finding-id": str(finding.id) ?? "unknown",
2107
2095
  "data-residual-finding-severity": str(finding.severity) ?? "unknown",
2108
2096
  "data-residual-finding-plan": str(finding.planId) ?? "unknown",
2109
2097
  children: [
2110
- /* @__PURE__ */ jsx_runtime2.jsx("span", {
2098
+ /* @__PURE__ */ jsx_runtime4.jsx("span", {
2111
2099
  className: panel_module_default.findingSeverity,
2112
2100
  "data-severity": str(finding.severity) ?? "unknown",
2113
2101
  children: str(finding.severity) ?? t("panel.unknown")
2114
2102
  }),
2115
- /* @__PURE__ */ jsx_runtime2.jsx("span", {
2103
+ /* @__PURE__ */ jsx_runtime4.jsx("span", {
2116
2104
  className: panel_module_default.findingTitle,
2117
2105
  children: str(finding.title) ?? t("panel.unknown")
2118
2106
  }),
2119
- str(finding.planId) !== null ? /* @__PURE__ */ jsx_runtime2.jsx("span", {
2107
+ str(finding.planId) !== null ? /* @__PURE__ */ jsx_runtime4.jsx("span", {
2120
2108
  className: panel_module_default.findingPlan,
2121
2109
  children: finding.planId
2122
2110
  }) : null
2123
2111
  ]
2124
2112
  }, str(finding.id) ?? `finding-${i}`))
2125
2113
  }),
2126
- hiddenFindings > 0 ? /* @__PURE__ */ jsx_runtime2.jsx("p", {
2114
+ hiddenFindings > 0 ? /* @__PURE__ */ jsx_runtime4.jsx("p", {
2127
2115
  className: panel_module_default.truncated,
2128
2116
  "data-residual-truncated": true,
2129
2117
  children: t("state.residual.more", { count: String(hiddenFindings) })
2130
2118
  }) : null,
2131
- /* @__PURE__ */ jsx_runtime2.jsx("h3", {
2119
+ /* @__PURE__ */ jsx_runtime4.jsx("h3", {
2132
2120
  className: panel_module_default.subTitle,
2133
2121
  children: t("state.policy")
2134
2122
  }),
2135
- /* @__PURE__ */ jsx_runtime2.jsxs("dl", {
2123
+ /* @__PURE__ */ jsx_runtime4.jsxs("dl", {
2136
2124
  className: panel_module_default.defList,
2137
2125
  children: [
2138
- /* @__PURE__ */ jsx_runtime2.jsx("dt", {
2126
+ /* @__PURE__ */ jsx_runtime4.jsx("dt", {
2139
2127
  className: panel_module_default.defTerm,
2140
2128
  children: t("state.enforcement")
2141
2129
  }),
2142
- /* @__PURE__ */ jsx_runtime2.jsx("dd", {
2130
+ /* @__PURE__ */ jsx_runtime4.jsx("dd", {
2143
2131
  className: panel_module_default.defValue,
2144
2132
  "data-field": "enforcement",
2145
2133
  children: enforcementLabel(t, enforcement)
2146
2134
  }),
2147
- /* @__PURE__ */ jsx_runtime2.jsx("dt", {
2135
+ /* @__PURE__ */ jsx_runtime4.jsx("dt", {
2148
2136
  className: panel_module_default.defTerm,
2149
2137
  children: t("state.policy.push")
2150
2138
  }),
2151
- /* @__PURE__ */ jsx_runtime2.jsx("dd", {
2139
+ /* @__PURE__ */ jsx_runtime4.jsx("dd", {
2152
2140
  className: panel_module_default.defValue,
2153
2141
  "data-field": "push-policy",
2154
2142
  children: str(state?.pushPolicy) ?? t("state.none")
2155
2143
  }),
2156
- /* @__PURE__ */ jsx_runtime2.jsx("dt", {
2144
+ /* @__PURE__ */ jsx_runtime4.jsx("dt", {
2157
2145
  className: panel_module_default.defTerm,
2158
2146
  children: t("state.policy.worktree")
2159
2147
  }),
2160
- /* @__PURE__ */ jsx_runtime2.jsx("dd", {
2148
+ /* @__PURE__ */ jsx_runtime4.jsx("dd", {
2161
2149
  className: panel_module_default.defValue,
2162
2150
  "data-field": "worktree-mode",
2163
2151
  children: str(state?.worktreeMode) ?? t("state.none")
2164
2152
  }),
2165
- /* @__PURE__ */ jsx_runtime2.jsx("dt", {
2153
+ /* @__PURE__ */ jsx_runtime4.jsx("dt", {
2166
2154
  className: panel_module_default.defTerm,
2167
2155
  children: t("state.policy.control-worktree")
2168
2156
  }),
2169
- /* @__PURE__ */ jsx_runtime2.jsx("dd", {
2157
+ /* @__PURE__ */ jsx_runtime4.jsx("dd", {
2170
2158
  className: panel_module_default.defValue,
2171
2159
  "data-field": "control-worktree-path",
2172
2160
  children: str(state?.controlWorktreePath) ?? t("state.none")
2173
2161
  })
2174
2162
  ]
2175
2163
  }),
2176
- /* @__PURE__ */ jsx_runtime2.jsx("h3", {
2164
+ /* @__PURE__ */ jsx_runtime4.jsx("h3", {
2177
2165
  className: panel_module_default.subTitle,
2178
2166
  children: t("state.leases")
2179
2167
  }),
2180
- leases.length === 0 ? /* @__PURE__ */ jsx_runtime2.jsx("p", {
2168
+ leases.length === 0 ? /* @__PURE__ */ jsx_runtime4.jsx("p", {
2181
2169
  className: panel_module_default.empty,
2182
2170
  "data-mstar-empty": "no-leases",
2183
2171
  children: t("state.none")
2184
- }) : /* @__PURE__ */ jsx_runtime2.jsx("ul", {
2172
+ }) : /* @__PURE__ */ jsx_runtime4.jsx("ul", {
2185
2173
  className: panel_module_default.leaseList,
2186
- children: leases.map((lease, i) => /* @__PURE__ */ jsx_runtime2.jsxs("li", {
2174
+ children: leases.map((lease, i) => /* @__PURE__ */ jsx_runtime4.jsxs("li", {
2187
2175
  "data-lease-plan": str(lease.planId) ?? "unknown",
2188
2176
  children: [
2189
- /* @__PURE__ */ jsx_runtime2.jsx("span", {
2177
+ /* @__PURE__ */ jsx_runtime4.jsx("span", {
2190
2178
  className: panel_module_default.leasePlan,
2191
2179
  children: str(lease.planId) ?? t("panel.unknown")
2192
2180
  }),
2193
- /* @__PURE__ */ jsx_runtime2.jsx("span", {
2181
+ /* @__PURE__ */ jsx_runtime4.jsx("span", {
2194
2182
  className: panel_module_default.leaseHolder,
2195
2183
  children: str(lease.holder) ?? t("panel.unknown")
2196
2184
  }),
2197
- str(lease.worktreePath) !== null ? /* @__PURE__ */ jsx_runtime2.jsx("span", {
2185
+ str(lease.worktreePath) !== null ? /* @__PURE__ */ jsx_runtime4.jsx("span", {
2198
2186
  className: panel_module_default.leaseWorktree,
2199
2187
  children: lease.worktreePath
2200
2188
  }) : null
2201
2189
  ]
2202
2190
  }, str(lease.planId) ?? `lease-${i}`))
2203
2191
  }),
2204
- /* @__PURE__ */ jsx_runtime2.jsx("h3", {
2192
+ /* @__PURE__ */ jsx_runtime4.jsx("h3", {
2205
2193
  className: panel_module_default.subTitle,
2206
2194
  children: t("state.knowledge")
2207
2195
  }),
2208
- knowledge === null ? /* @__PURE__ */ jsx_runtime2.jsx("p", {
2196
+ knowledge === null ? /* @__PURE__ */ jsx_runtime4.jsx("p", {
2209
2197
  className: panel_module_default.empty,
2210
2198
  "data-mstar-empty": "no-knowledge",
2211
2199
  children: t("state.none")
2212
- }) : /* @__PURE__ */ jsx_runtime2.jsxs("p", {
2200
+ }) : /* @__PURE__ */ jsx_runtime4.jsxs("p", {
2213
2201
  className: panel_module_default.knowledge,
2214
2202
  "data-knowledge-docs": count(knowledge.docCount) === null ? "unknown" : String(knowledge.docCount),
2215
2203
  children: [
2216
- /* @__PURE__ */ jsx_runtime2.jsx("span", {
2204
+ /* @__PURE__ */ jsx_runtime4.jsx("span", {
2217
2205
  children: t("state.knowledge.docs", { count: count(knowledge.docCount) === null ? t("panel.unknown") : String(knowledge.docCount) })
2218
2206
  }),
2219
- Array.isArray(knowledge.categories) && knowledge.categories.length > 0 ? /* @__PURE__ */ jsx_runtime2.jsx("span", {
2207
+ Array.isArray(knowledge.categories) && knowledge.categories.length > 0 ? /* @__PURE__ */ jsx_runtime4.jsx("span", {
2220
2208
  className: panel_module_default.knowledgeCategories,
2221
2209
  children: knowledge.categories.filter((category) => typeof category === "string").join(" · ")
2222
2210
  }) : null
2223
2211
  ]
2224
2212
  }),
2225
- /* @__PURE__ */ jsx_runtime2.jsx("h3", {
2213
+ /* @__PURE__ */ jsx_runtime4.jsx("h3", {
2226
2214
  className: panel_module_default.subTitle,
2227
2215
  children: t("state.direction")
2228
2216
  }),
2229
- /* @__PURE__ */ jsx_runtime2.jsx("p", {
2217
+ /* @__PURE__ */ jsx_runtime4.jsx("p", {
2230
2218
  className: panel_module_default.direction,
2231
2219
  "data-direction": true,
2232
2220
  children: str(state?.direction) ?? t("state.none")
@@ -2236,46 +2224,36 @@ function StateSection({ t, state, enforcement }) {
2236
2224
  }
2237
2225
 
2238
2226
  // src/client/panel/sidebar.tsx
2239
- var jsx_runtime3 = require("react/jsx-runtime");
2227
+ var jsx_runtime5 = require("react/jsx-runtime");
2240
2228
  function Sidebar({ t, state, source }) {
2241
- return /* @__PURE__ */ jsx_runtime3.jsxs("aside", {
2229
+ return /* @__PURE__ */ jsx_runtime5.jsx("aside", {
2242
2230
  className: panel_module_default.sidebar,
2243
2231
  "data-mstar-sidebar": true,
2244
- children: [
2245
- /* @__PURE__ */ jsx_runtime3.jsx("div", {
2246
- className: panel_module_default.sidebarScroll,
2247
- "data-mstar-sidebar-scroll": true,
2248
- children: state === null ? /* @__PURE__ */ jsx_runtime3.jsx("p", {
2249
- className: panel_module_default.empty,
2250
- "data-mstar-empty": "no-state",
2251
- children: t("state.none")
2252
- }) : /* @__PURE__ */ jsx_runtime3.jsx(StateSection, {
2253
- t,
2254
- state,
2255
- enforcement: source.enforcement
2256
- })
2257
- }),
2258
- /* @__PURE__ */ jsx_runtime3.jsx(PanelMeta, {
2259
- t,
2260
- source
2261
- })
2262
- ]
2232
+ children: state === null ? /* @__PURE__ */ jsx_runtime5.jsx("p", {
2233
+ className: panel_module_default.empty,
2234
+ "data-mstar-empty": "no-state",
2235
+ children: t("state.none")
2236
+ }) : /* @__PURE__ */ jsx_runtime5.jsx(StateSection, {
2237
+ t,
2238
+ state,
2239
+ enforcement: source.enforcement
2240
+ })
2263
2241
  });
2264
2242
  }
2265
2243
 
2266
2244
  // src/client/panel/TabNav.tsx
2267
- var jsx_runtime4 = require("react/jsx-runtime");
2245
+ var jsx_runtime6 = require("react/jsx-runtime");
2268
2246
  var TABS = [
2269
2247
  { id: "tasks", label: "tab.tasks" },
2270
2248
  { id: "agents", label: "tab.agents" },
2271
2249
  { id: "events", label: "tab.events" }
2272
2250
  ];
2273
2251
  function TabNav({ active, onChange, t }) {
2274
- return /* @__PURE__ */ jsx_runtime4.jsx("nav", {
2252
+ return /* @__PURE__ */ jsx_runtime6.jsx("nav", {
2275
2253
  className: panel_module_default.tabNav,
2276
2254
  "data-mstar-tab-nav": true,
2277
2255
  role: "tablist",
2278
- children: TABS.map((tab) => /* @__PURE__ */ jsx_runtime4.jsx("button", {
2256
+ children: TABS.map((tab) => /* @__PURE__ */ jsx_runtime6.jsx("button", {
2279
2257
  type: "button",
2280
2258
  role: "tab",
2281
2259
  className: active === tab.id ? `${panel_module_default.tab} ${panel_module_default.tabActive}` : panel_module_default.tab,
@@ -2288,7 +2266,7 @@ function TabNav({ active, onChange, t }) {
2288
2266
  });
2289
2267
  }
2290
2268
 
2291
- // src/client/panel/pages/AgentCanvasPage.tsx
2269
+ // src/client/panel/pages/AgentListPage.tsx
2292
2270
  var import_react2 = require("react");
2293
2271
 
2294
2272
  // src/client/panel/zones/zones.module.css
@@ -2405,22 +2383,16 @@ var css2 = `
2405
2383
 
2406
2384
 
2407
2385
  .\\31 2dfaa6e_kanban {
2408
- display: flex;
2409
- align-items: flex-start;
2410
- gap: var(--mstar-space-1);
2411
2386
  min-width: 0;
2412
- overflow-x: auto;
2413
- overscroll-behavior: contain;
2414
2387
  }
2415
2388
 
2416
2389
 
2417
2390
  .\\31 f8473a4_kanbanColumn {
2418
2391
  box-sizing: border-box;
2419
2392
  display: flex;
2420
- flex: 1 1 0;
2421
2393
  flex-direction: column;
2422
2394
  gap: var(--mstar-space-2);
2423
- min-width: 120px;
2395
+ min-width: 0;
2424
2396
  padding: var(--mstar-space-2);
2425
2397
  border: 1px solid var(--dsw-alias-border-l1);
2426
2398
  border-radius: 8px;
@@ -2439,10 +2411,10 @@ var css2 = `
2439
2411
  opacity: 0.7;
2440
2412
  }
2441
2413
 
2414
+
2442
2415
  .\\33 b1cc701_kanbanColumnHeader {
2443
2416
  display: flex;
2444
2417
  align-items: center;
2445
- justify-content: space-between;
2446
2418
  gap: var(--mstar-space-1);
2447
2419
  min-width: 0;
2448
2420
  }
@@ -2460,6 +2432,7 @@ var css2 = `
2460
2432
 
2461
2433
  .\\34 96af60d_kanbanCount {
2462
2434
  flex: none;
2435
+ margin-left: auto;
2463
2436
  min-width: 18px;
2464
2437
  padding: 0 var(--mstar-space-1);
2465
2438
  border: 1px solid var(--dsw-alias-border-l2);
@@ -2529,7 +2502,6 @@ var css2 = `
2529
2502
 
2530
2503
  .\\36 3518033_kanbanArrow {
2531
2504
  flex: none;
2532
- align-self: center;
2533
2505
  width: 18px;
2534
2506
  height: 18px;
2535
2507
  display: inline-flex;
@@ -2641,28 +2613,28 @@ if (typeof document !== "undefined" && document.querySelector("style[data-plugin
2641
2613
  var zones_module_default = { zone: "0390dc47_zone", zoneHeader: "fa5472ae_zoneHeader", zoneEmpty: "2358ca74_zoneEmpty", legend: "0214fc64_legend", legendTitle: "7fdf3af2_legendTitle", legendList: "5751e1ec_legendList", legendItem: "c648f79b_legendItem", legendSwatch: "84f03998_legendSwatch", swatchAgentRunning: "637ae7a1_swatchAgentRunning", swatchAgentSettled: "e8a7988b_swatchAgentSettled", swatchAgentIdle: "d34b3834_swatchAgentIdle", tasksHeader: "9c376db8_tasksHeader", tasksTotal: "b5ad0f15_tasksTotal", kanban: "12dfaa6e_kanban", kanbanColumn: "1f8473a4_kanbanColumn", kanbanColumnHeader: "3b1cc701_kanbanColumnHeader", kanbanColumnTitle: "503b6432_kanbanColumnTitle", kanbanCount: "496af60d_kanbanCount", kanbanCards: "161359fd_kanbanCards", planCard: "73f0e028_planCard", planCardId: "a37c7a75_planCardId", planCardStatus: "11b4fd6a_planCardStatus", kanbanArrow: "63518033_kanbanArrow", kanbanMore: "0c600f2f_kanbanMore", kanbanMoreButton: "d0f95d1f_kanbanMoreButton", zoneTitle: "a2f9476f_zoneTitle", rollupList: "1ca74b3b_rollupList", rollupItem: "371169b4_rollupItem", rollupMilestone: "5f3f5403_rollupMilestone", rollupCount: "d87816b2_rollupCount", severityChip: "8f4e5388_severityChip" };
2642
2614
 
2643
2615
  // src/client/panel/zones/Legend.tsx
2644
- var jsx_runtime5 = require("react/jsx-runtime");
2616
+ var jsx_runtime7 = require("react/jsx-runtime");
2645
2617
  function Legend({ t }) {
2646
2618
  const items = [
2647
2619
  { key: "agent-running", swatch: zones_module_default.swatchAgentRunning, label: t("zone.legend.agent-running") },
2648
2620
  { key: "agent-settled", swatch: zones_module_default.swatchAgentSettled, label: t("zone.legend.agent-settled") },
2649
2621
  { key: "agent-idle", swatch: zones_module_default.swatchAgentIdle, label: t("zone.legend.agent-idle") }
2650
2622
  ];
2651
- return /* @__PURE__ */ jsx_runtime5.jsxs("div", {
2623
+ return /* @__PURE__ */ jsx_runtime7.jsxs("div", {
2652
2624
  className: zones_module_default.legend,
2653
2625
  "data-mstar-legend": true,
2654
2626
  children: [
2655
- /* @__PURE__ */ jsx_runtime5.jsx("span", {
2627
+ /* @__PURE__ */ jsx_runtime7.jsx("span", {
2656
2628
  className: zones_module_default.legendTitle,
2657
2629
  children: t("zone.legend.title")
2658
2630
  }),
2659
- /* @__PURE__ */ jsx_runtime5.jsx("ul", {
2631
+ /* @__PURE__ */ jsx_runtime7.jsx("ul", {
2660
2632
  className: zones_module_default.legendList,
2661
- children: items.map((item) => /* @__PURE__ */ jsx_runtime5.jsxs("li", {
2633
+ children: items.map((item) => /* @__PURE__ */ jsx_runtime7.jsxs("li", {
2662
2634
  className: zones_module_default.legendItem,
2663
2635
  "data-mstar-legend-item": item.key,
2664
2636
  children: [
2665
- /* @__PURE__ */ jsx_runtime5.jsx("span", {
2637
+ /* @__PURE__ */ jsx_runtime7.jsx("span", {
2666
2638
  className: `${zones_module_default.legendSwatch} ${item.swatch}`
2667
2639
  }),
2668
2640
  item.label
@@ -2675,7 +2647,7 @@ function Legend({ t }) {
2675
2647
 
2676
2648
  // src/client/panel/pages/IterationInfoSection.tsx
2677
2649
  var import_react = require("react");
2678
- var jsx_runtime6 = require("react/jsx-runtime");
2650
+ var jsx_runtime8 = require("react/jsx-runtime");
2679
2651
  function nextExpandedOnActivation(prev, prevActive, nextActive) {
2680
2652
  return !prevActive && nextActive ? true : prev;
2681
2653
  }
@@ -2704,33 +2676,33 @@ function IterationInfoSection({ iteration, t }) {
2704
2676
  const verdictLabel = (verdict) => verdict === "pass" ? t("graph.pass") : verdict === "fail" ? t("graph.fail") : t("panel.unknown");
2705
2677
  const idLabel = iteration.iterationId ?? t("panel.unknown");
2706
2678
  const statusLabel = active && iteration.currentStep !== null ? t("zone.iteration.step-label", { n: String(iteration.currentStep), total: String(iteration.steps.length) }) : t("page.iteration.not-started");
2707
- const stepsRow = /* @__PURE__ */ jsx_runtime6.jsx("ol", {
2679
+ const stepsRow = /* @__PURE__ */ jsx_runtime8.jsx("ol", {
2708
2680
  className: panel_module_default.iterationStepsRow,
2709
2681
  "data-iteration-head-steps": true,
2710
- children: iteration.steps.map((step) => /* @__PURE__ */ jsx_runtime6.jsxs("li", {
2682
+ children: iteration.steps.map((step) => /* @__PURE__ */ jsx_runtime8.jsxs("li", {
2711
2683
  className: panel_module_default.iterationStepItem,
2712
2684
  "data-step": step.step,
2713
2685
  "data-step-state": step.state,
2714
2686
  children: [
2715
- /* @__PURE__ */ jsx_runtime6.jsx("span", {
2687
+ /* @__PURE__ */ jsx_runtime8.jsx("span", {
2716
2688
  className: panel_module_default.iterationStepBadge,
2717
2689
  "data-step-badge": true,
2718
2690
  children: t("zone.iteration.step-badge", { n: String(step.step) })
2719
2691
  }),
2720
- /* @__PURE__ */ jsx_runtime6.jsx("span", {
2692
+ /* @__PURE__ */ jsx_runtime8.jsx("span", {
2721
2693
  className: panel_module_default.iterationStepPhase,
2722
2694
  "data-step-phase": true,
2723
2695
  children: t(`zone.phase.${step.id}`)
2724
2696
  }),
2725
- /* @__PURE__ */ jsx_runtime6.jsx("span", {
2697
+ /* @__PURE__ */ jsx_runtime8.jsx("span", {
2726
2698
  className: panel_module_default.iterationStepChip,
2727
2699
  "data-step-chip": true,
2728
2700
  children: t(STATE_LABEL[step.state])
2729
2701
  }),
2730
- /* @__PURE__ */ jsx_runtime6.jsx("span", {
2702
+ /* @__PURE__ */ jsx_runtime8.jsx("span", {
2731
2703
  className: panel_module_default.iterationVerdictSeat,
2732
2704
  "data-step-verdict-seat": true,
2733
- children: step.state === "current" && step.verdict !== "unknown" && /* @__PURE__ */ jsx_runtime6.jsx("span", {
2705
+ children: step.state === "current" && step.verdict !== "unknown" && /* @__PURE__ */ jsx_runtime8.jsx("span", {
2734
2706
  className: panel_module_default.iterationVerdict,
2735
2707
  "data-iteration-verdict": step.verdict,
2736
2708
  children: verdictLabel(step.verdict)
@@ -2739,13 +2711,13 @@ function IterationInfoSection({ iteration, t }) {
2739
2711
  ]
2740
2712
  }, step.step))
2741
2713
  });
2742
- return /* @__PURE__ */ jsx_runtime6.jsxs("section", {
2714
+ return /* @__PURE__ */ jsx_runtime8.jsxs("section", {
2743
2715
  className: panel_module_default.iterationHead,
2744
2716
  "data-iteration-head": true,
2745
2717
  "data-iteration-head-active": active ? "true" : "false",
2746
2718
  "data-iteration-head-expanded": expanded ? "true" : "false",
2747
2719
  children: [
2748
- /* @__PURE__ */ jsx_runtime6.jsxs("button", {
2720
+ /* @__PURE__ */ jsx_runtime8.jsxs("button", {
2749
2721
  type: "button",
2750
2722
  className: panel_module_default.iterationSummary,
2751
2723
  "data-iteration-head-toggle": true,
@@ -2754,56 +2726,56 @@ function IterationInfoSection({ iteration, t }) {
2754
2726
  "aria-controls": "iteration-head-body",
2755
2727
  onClick: () => setExpanded((v) => !v),
2756
2728
  children: [
2757
- /* @__PURE__ */ jsx_runtime6.jsx("span", {
2729
+ /* @__PURE__ */ jsx_runtime8.jsx("span", {
2758
2730
  className: panel_module_default.iterationSummaryId,
2759
2731
  "data-iteration-head-id": idLabel,
2760
2732
  children: idLabel
2761
2733
  }),
2762
- /* @__PURE__ */ jsx_runtime6.jsx("span", {
2734
+ /* @__PURE__ */ jsx_runtime8.jsx("span", {
2763
2735
  className: panel_module_default.iterationSummaryVerdict,
2764
2736
  "data-iteration-head-verdict": iteration.verdict,
2765
2737
  children: verdictLabel(iteration.verdict)
2766
2738
  }),
2767
- /* @__PURE__ */ jsx_runtime6.jsx("span", {
2739
+ /* @__PURE__ */ jsx_runtime8.jsx("span", {
2768
2740
  className: active ? panel_module_default.iterationSummaryStatus : panel_module_default.iterationSummaryStatusMuted,
2769
2741
  "data-iteration-head-status": statusLabel,
2770
2742
  children: statusLabel
2771
2743
  }),
2772
- /* @__PURE__ */ jsx_runtime6.jsx("span", {
2744
+ /* @__PURE__ */ jsx_runtime8.jsx("span", {
2773
2745
  className: panel_module_default.iterationSummaryHint,
2774
2746
  "data-iteration-head-hint": true,
2775
2747
  children: t(expanded ? "page.iteration.collapse" : "page.iteration.expand")
2776
2748
  })
2777
2749
  ]
2778
2750
  }),
2779
- expanded && /* @__PURE__ */ jsx_runtime6.jsx("div", {
2751
+ expanded && /* @__PURE__ */ jsx_runtime8.jsx("div", {
2780
2752
  className: panel_module_default.iterationHeadBody,
2781
2753
  id: "iteration-head-body",
2782
2754
  "data-iteration-head-body": true,
2783
- children: iterationSplitActive(active, iteration.branches) ? /* @__PURE__ */ jsx_runtime6.jsxs("div", {
2755
+ children: iterationSplitActive(active, iteration.branches) ? /* @__PURE__ */ jsx_runtime8.jsxs("div", {
2784
2756
  className: panel_module_default.iterationHeadSplit,
2785
2757
  "data-iteration-head-split": true,
2786
2758
  children: [
2787
- /* @__PURE__ */ jsx_runtime6.jsxs("div", {
2759
+ /* @__PURE__ */ jsx_runtime8.jsxs("div", {
2788
2760
  className: panel_module_default.iterationBranches,
2789
2761
  "data-iteration-head-branches": true,
2790
2762
  children: [
2791
- /* @__PURE__ */ jsx_runtime6.jsx("h3", {
2763
+ /* @__PURE__ */ jsx_runtime8.jsx("h3", {
2792
2764
  className: panel_module_default.iterationBranchesTitle,
2793
2765
  "data-branches-title": true,
2794
2766
  children: t("zone.branches.title")
2795
2767
  }),
2796
- /* @__PURE__ */ jsx_runtime6.jsx("ul", {
2768
+ /* @__PURE__ */ jsx_runtime8.jsx("ul", {
2797
2769
  className: panel_module_default.iterationBranchList,
2798
- children: BRANCH_ROWS.map((row) => /* @__PURE__ */ jsx_runtime6.jsxs("li", {
2770
+ children: BRANCH_ROWS.map((row) => /* @__PURE__ */ jsx_runtime8.jsxs("li", {
2799
2771
  className: panel_module_default.iterationBranchRow,
2800
2772
  "data-branch": row.kind,
2801
2773
  children: [
2802
- /* @__PURE__ */ jsx_runtime6.jsx("span", {
2774
+ /* @__PURE__ */ jsx_runtime8.jsx("span", {
2803
2775
  className: panel_module_default.iterationBranchLabel,
2804
2776
  children: t(row.label)
2805
2777
  }),
2806
- /* @__PURE__ */ jsx_runtime6.jsx("code", {
2778
+ /* @__PURE__ */ jsx_runtime8.jsx("code", {
2807
2779
  className: panel_module_default.iterationBranchValue,
2808
2780
  "data-branch-value": true,
2809
2781
  children: iteration.branches?.[row.value] ?? "—"
@@ -2821,25 +2793,23 @@ function IterationInfoSection({ iteration, t }) {
2821
2793
  });
2822
2794
  }
2823
2795
 
2824
- // src/client/panel/pages/agent-canvas.module.css
2796
+ // src/client/panel/pages/agent-list.module.css
2825
2797
  var css3 = `
2826
2798
 
2827
2799
 
2828
2800
 
2829
- .\\36 2d5f9b2_canvasPage {
2830
- flex: 1;
2831
- min-height: 0;
2801
+ .c7b89a22_listPage {
2832
2802
  display: flex;
2833
2803
  flex-direction: column;
2834
2804
  gap: var(--mstar-space-2);
2835
- padding: var(--mstar-space-3);
2805
+ min-width: 0;
2836
2806
 
2837
2807
  --mstar-canvas-emphasis-current: 100%;
2838
2808
  --mstar-canvas-emphasis-next: 75%;
2839
2809
  --mstar-canvas-emphasis-off: 45%;
2840
2810
  }
2841
2811
 
2842
- .\\37 608ed94_canvasHeader {
2812
+ .e5d7e3c4_listHeader {
2843
2813
  display: flex;
2844
2814
  align-items: baseline;
2845
2815
  justify-content: space-between;
@@ -2848,7 +2818,7 @@ var css3 = `
2848
2818
  min-width: 0;
2849
2819
  }
2850
2820
 
2851
- .\\39 e2394fd_canvasTitle {
2821
+ .\\39 01ce16d_listTitle {
2852
2822
  margin: 0;
2853
2823
  color: var(--dsw-alias-label-primary);
2854
2824
  font: var(--dsw-font-xs-13);
@@ -2856,7 +2826,7 @@ var css3 = `
2856
2826
  }
2857
2827
 
2858
2828
 
2859
- .\\37 4514c6f_canvasSummary {
2829
+ .\\36 678f1df_listSummary {
2860
2830
  flex: none;
2861
2831
  color: var(--dsw-alias-label-caption);
2862
2832
  font: var(--dsw-font-xxxs-11);
@@ -2864,7 +2834,7 @@ var css3 = `
2864
2834
  }
2865
2835
 
2866
2836
 
2867
- .\\38 5e71ac9_canvasNote {
2837
+ .\\37 f7cda39_listNote {
2868
2838
  flex: none;
2869
2839
  margin: 0;
2870
2840
  color: var(--dsw-alias-label-caption);
@@ -2872,66 +2842,35 @@ var css3 = `
2872
2842
  }
2873
2843
 
2874
2844
 
2875
- .\\34 374ac40_canvasLegend {
2845
+ .\\31 bf37650_listLegend {
2876
2846
  flex: none;
2877
2847
  }
2878
2848
 
2879
2849
 
2880
2850
 
2881
- .\\30 ceb0467_canvasViewport {
2882
- position: relative;
2883
- flex: 1;
2884
- min-height: 0;
2885
- overflow: hidden;
2886
- touch-action: none;
2887
- background: var(--dsw-alias-bg-layer-1);
2888
- border: 1px solid var(--dsw-alias-border-l1);
2889
- border-radius: 8px;
2890
- cursor: grab;
2891
- user-select: none;
2892
- }
2893
-
2894
- .\\30 ceb0467_canvasViewport:active {
2895
- cursor: grabbing;
2851
+ .dccb9592_agentList {
2852
+ min-width: 0;
2896
2853
  }
2897
2854
 
2898
2855
 
2899
2856
 
2900
- .\\34 8d128d6_canvasContent {
2901
- position: absolute;
2902
- top: 0;
2903
- left: 0;
2904
- background-color: var(--dsw-alias-bg-layer-1);
2905
- background-image:
2906
- linear-gradient(var(--dsw-alias-border-l1) 1px, transparent 1px),
2907
- linear-gradient(90deg, var(--dsw-alias-border-l1) 1px, transparent 1px);
2908
- background-size: 24px 24px;
2909
- will-change: transform;
2910
- }
2911
-
2912
-
2913
- .\\37 f010373_canvasColumnLabel {
2914
- position: absolute;
2915
- padding: 0 var(--mstar-space-1);
2916
- overflow: hidden;
2917
- text-overflow: ellipsis;
2918
- white-space: nowrap;
2919
- color: var(--dsw-alias-label-caption);
2920
- font: var(--dsw-font-xxxs-11);
2921
- font-weight: 600;
2922
- letter-spacing: 0.03em;
2923
- text-transform: uppercase;
2857
+ .\\37 a1e7d59_agentGroup {
2858
+ display: flex;
2859
+ flex-direction: column;
2860
+ gap: var(--mstar-space-2);
2861
+ min-width: 0;
2862
+ padding: var(--mstar-space-3);
2863
+ border: 1px solid var(--dsw-alias-border-l1);
2864
+ border-radius: 8px;
2865
+ background: var(--dsw-alias-bg-layer-1);
2924
2866
  }
2925
2867
 
2926
-
2927
- .fcf0fc76_canvasGroupLabel {
2928
- position: absolute;
2868
+ .a4d5691a_groupLabel {
2929
2869
  display: flex;
2930
2870
  align-items: center;
2931
2871
  gap: var(--mstar-space-2);
2932
2872
  min-width: 0;
2933
2873
  padding: 0 var(--mstar-space-1);
2934
- overflow: hidden;
2935
2874
  color: var(--dsw-alias-label-primary);
2936
2875
  font: var(--dsw-font-xxxs-11);
2937
2876
  font-weight: 600;
@@ -2940,7 +2879,7 @@ var css3 = `
2940
2879
  }
2941
2880
 
2942
2881
 
2943
- .f17a7dfb_canvasGroupPlan {
2882
+ .\\39 6c8bb5f_groupPlan {
2944
2883
  display: flex;
2945
2884
  align-items: center;
2946
2885
  gap: var(--mstar-space-1);
@@ -2960,7 +2899,7 @@ var css3 = `
2960
2899
  }
2961
2900
 
2962
2901
 
2963
- .\\32 387c06e_canvasGroupPlanMore {
2902
+ .c775aa0a_groupPlanMore {
2964
2903
  flex: none;
2965
2904
  color: var(--dsw-alias-label-caption);
2966
2905
  font: var(--dsw-font-xxxs-11);
@@ -2969,7 +2908,7 @@ var css3 = `
2969
2908
  }
2970
2909
 
2971
2910
 
2972
- .\\34 eb1cc60_canvasGroupNoPlan {
2911
+ .\\35 d27d864_groupNoPlan {
2973
2912
  color: var(--dsw-alias-label-caption);
2974
2913
  font: var(--dsw-font-xxxs-11);
2975
2914
  font-weight: 400;
@@ -2979,41 +2918,64 @@ var css3 = `
2979
2918
 
2980
2919
 
2981
2920
 
2982
- .d0988ac1_canvasEdges {
2983
- position: absolute;
2984
- top: 0;
2985
- left: 0;
2986
- pointer-events: none;
2921
+ .\\32 a00f734_stageGroup {
2922
+ display: flex;
2923
+ flex-direction: column;
2924
+ gap: var(--mstar-space-1);
2925
+ min-width: 0;
2926
+ }
2927
+
2928
+ .\\37 212d235_stageLabel {
2929
+ padding: 0 var(--mstar-space-1);
2930
+ overflow: hidden;
2931
+ text-overflow: ellipsis;
2932
+ white-space: nowrap;
2933
+ color: var(--dsw-alias-label-caption);
2934
+ font: var(--dsw-font-xxxs-11);
2935
+ font-weight: 600;
2936
+ letter-spacing: 0.03em;
2937
+ text-transform: uppercase;
2987
2938
  }
2988
2939
 
2989
2940
 
2990
- .ee3e51b3_canvasEdgeCurve {
2991
- fill: none;
2941
+
2942
+ .\\31 3172d67_subBucket {
2943
+ display: flex;
2944
+ flex-direction: column;
2945
+ gap: var(--mstar-space-1);
2946
+ min-width: 0;
2992
2947
  }
2993
2948
 
2994
- .e6a1115e_canvasEdgeActual {
2995
- stroke: var(--dsw-alias-state-business-primary);
2996
- stroke-width: 1.5;
2949
+ .\\37 78a2d3f_subBucketLabel {
2950
+ display: flex;
2951
+ align-items: center;
2952
+ gap: var(--mstar-space-1);
2953
+ color: var(--dsw-alias-label-caption);
2954
+ font: var(--dsw-font-xxxs-11);
2955
+ letter-spacing: 0.03em;
2956
+ text-transform: uppercase;
2997
2957
  }
2998
2958
 
2999
2959
 
3000
- .d3a4fb6c_canvasArrowActual {
3001
- fill: var(--dsw-alias-state-business-primary);
2960
+ .\\37 78a2d3f_subBucketLabel::after {
2961
+ content: '';
2962
+ flex: 1;
2963
+ border-top: 1px dashed var(--dsw-alias-border-l2);
3002
2964
  }
3003
2965
 
3004
2966
 
3005
2967
 
3006
- .\\34 4301340_canvasCards {
3007
- position: absolute;
3008
- top: 0;
3009
- left: 0;
2968
+ .b34ac147_cardList {
3010
2969
  margin: 0;
3011
2970
  padding: 0;
3012
2971
  list-style: none;
2972
+ display: flex;
2973
+ flex-direction: column;
2974
+ gap: var(--mstar-space-1);
2975
+ min-width: 0;
3013
2976
  }
3014
2977
 
3015
2978
  .a9030174_agentCard {
3016
- position: absolute;
3017
2979
  box-sizing: border-box;
3018
2980
  display: flex;
3019
2981
  flex-direction: column;
@@ -3046,14 +3008,14 @@ var css3 = `
3046
3008
  .\\34 e2c7873_agentCardRunning {
3047
3009
  border-color: var(--dsw-alias-state-business-primary);
3048
3010
  box-shadow: 0 0 0 1px var(--dsw-alias-state-business-primary);
3049
- animation: canvas-card-pulse 1.6s ease-in-out infinite;
3011
+ animation: agent-card-pulse 1.6s ease-in-out infinite;
3050
3012
  }
3051
3013
 
3052
3014
  .\\34 e2c7873_agentCardRunning:hover {
3053
3015
  border-color: var(--dsw-alias-state-business-primary);
3054
3016
  }
3055
3017
 
3056
- @keyframes canvas-card-pulse {
3018
+ @keyframes agent-card-pulse {
3057
3019
  0%, 100% {
3058
3020
  box-shadow: 0 0 0 1px var(--dsw-alias-state-business-primary);
3059
3021
  }
@@ -3083,50 +3045,6 @@ var css3 = `
3083
3045
  }
3084
3046
 
3085
3047
 
3086
- .\\34 fd21091_agentPort {
3087
- position: absolute;
3088
- width: 3px;
3089
- height: 3px;
3090
- border-radius: 999px;
3091
- background: var(--dsw-alias-label-caption);
3092
- opacity: 0;
3093
- pointer-events: none;
3094
- transition: opacity 150ms ease;
3095
- }
3096
-
3097
- .a9030174_agentCard:hover .\\34 fd21091_agentPort {
3098
- opacity: 1;
3099
- }
3100
-
3101
- .\\34 e2c7873_agentCardRunning:hover .\\34 fd21091_agentPort {
3102
- background: var(--dsw-alias-state-business-primary);
3103
- }
3104
-
3105
- .\\34 fd21091_agentPort[data-agent-port='north'] {
3106
- top: 0;
3107
- left: 50%;
3108
- transform: translate(-50%, -50%);
3109
- }
3110
-
3111
- .\\34 fd21091_agentPort[data-agent-port='south'] {
3112
- bottom: 0;
3113
- left: 50%;
3114
- transform: translate(-50%, 50%);
3115
- }
3116
-
3117
- .\\34 fd21091_agentPort[data-agent-port='west'] {
3118
- left: 0;
3119
- top: 50%;
3120
- transform: translate(-50%, -50%);
3121
- }
3122
-
3123
- .\\34 fd21091_agentPort[data-agent-port='east'] {
3124
- right: 0;
3125
- top: 50%;
3126
- transform: translate(50%, -50%);
3127
- }
3128
-
3129
-
3130
3048
  .c2c54212_onDemandBadge {
3131
3049
  align-self: flex-start;
3132
3050
  padding: 0 var(--mstar-space-1);
@@ -3136,46 +3054,6 @@ var css3 = `
3136
3054
  font: var(--dsw-font-xxxs-11);
3137
3055
  }
3138
3056
 
3139
-
3140
- .\\37 78a2d3f_subBucketLabel {
3141
- position: absolute;
3142
- display: flex;
3143
- align-items: center;
3144
- gap: var(--mstar-space-1);
3145
- color: var(--dsw-alias-label-caption);
3146
- font: var(--dsw-font-xxxs-11);
3147
- letter-spacing: 0.03em;
3148
- text-transform: uppercase;
3149
- }
3150
-
3151
-
3152
- .\\37 78a2d3f_subBucketLabel::after {
3153
- content: '';
3154
- flex: 1;
3155
- border-top: 1px dashed var(--dsw-alias-border-l2);
3156
- }
3157
-
3158
-
3159
- .\\39 94a2772_canvasEdgeSupervise {
3160
- stroke: var(--dsw-alias-label-caption);
3161
- stroke-width: 1.5;
3162
- stroke-dasharray: 5 4;
3163
- }
3164
-
3165
- .b2bb1e47_canvasEdgeSuperviseLit {
3166
-
3167
- stroke: var(--dsw-alias-state-business-primary);
3168
- stroke-dasharray: none;
3169
- }
3170
-
3171
- .ad3aae58_canvasArrowSupervise {
3172
- fill: var(--dsw-alias-label-caption);
3173
- }
3174
-
3175
- .\\32 6e265a1_canvasArrowSuperviseLit {
3176
- fill: var(--dsw-alias-state-business-primary);
3177
- }
3178
-
3179
3057
  .e7716946_agentCardLine {
3180
3058
  display: flex;
3181
3059
  align-items: center;
@@ -3268,7 +3146,7 @@ var css3 = `
3268
3146
  color: var(--dsw-alias-label-caption);
3269
3147
  }
3270
3148
  `;
3271
- var tagId3 = "@mstar-harness/dsh/agent-canvas.module.css";
3149
+ var tagId3 = "@mstar-harness/dsh/agent-list.module.css";
3272
3150
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId3) + "]") === null) {
3273
3151
  const tag = document.createElement("style");
3274
3152
  tag.dataset.plugin = "@mstar-harness/dsh";
@@ -3276,51 +3154,29 @@ if (typeof document !== "undefined" && document.querySelector("style[data-plugin
3276
3154
  tag.textContent = css3;
3277
3155
  document.head.appendChild(tag);
3278
3156
  }
3279
- var agent_canvas_module_default = { canvasPage: "62d5f9b2_canvasPage", canvasHeader: "7608ed94_canvasHeader", canvasTitle: "9e2394fd_canvasTitle", canvasSummary: "74514c6f_canvasSummary", canvasNote: "85e71ac9_canvasNote", canvasLegend: "4374ac40_canvasLegend", canvasViewport: "0ceb0467_canvasViewport", canvasContent: "48d128d6_canvasContent", canvasColumnLabel: "7f010373_canvasColumnLabel", canvasGroupLabel: "fcf0fc76_canvasGroupLabel", canvasGroupPlan: "f17a7dfb_canvasGroupPlan", canvasGroupPlanMore: "2387c06e_canvasGroupPlanMore", canvasGroupNoPlan: "4eb1cc60_canvasGroupNoPlan", canvasEdges: "d0988ac1_canvasEdges", canvasEdgeCurve: "ee3e51b3_canvasEdgeCurve", canvasEdgeActual: "e6a1115e_canvasEdgeActual", canvasArrowActual: "d3a4fb6c_canvasArrowActual", canvasCards: "44301340_canvasCards", agentCard: "a9030174_agentCard", agentCardRunning: "4e2c7873_agentCardRunning", agentCardIdle: "1a8bb13e_agentCardIdle", agentCardDone: "d6bf2954_agentCardDone", agentPort: "4fd21091_agentPort", onDemandBadge: "c2c54212_onDemandBadge", subBucketLabel: "778a2d3f_subBucketLabel", canvasEdgeSupervise: "994a2772_canvasEdgeSupervise", canvasEdgeSuperviseLit: "b2bb1e47_canvasEdgeSuperviseLit", canvasArrowSupervise: "ad3aae58_canvasArrowSupervise", canvasArrowSuperviseLit: "26e265a1_canvasArrowSuperviseLit", agentCardLine: "e7716946_agentCardLine", agentCardName: "a47ac04f_agentCardName", agentCount: "e2aedf35_agentCount", agentRoleChip: "e26900b4_agentRoleChip", agentRecord: "1e3b3403_agentRecord", agentStatusDot: "030ace7f_agentStatusDot", agentStatusRunning: "23846eb7_agentStatusRunning", agentStatusSettled: "91dcfc09_agentStatusSettled", agentStatusError: "eeb20a6e_agentStatusError", agentStatusAdvisory: "ec5fca43_agentStatusAdvisory", agentStatusIdle: "63e283ba_agentStatusIdle" };
3157
+ var agent_list_module_default = { listPage: "c7b89a22_listPage", listHeader: "e5d7e3c4_listHeader", listTitle: "901ce16d_listTitle", listSummary: "6678f1df_listSummary", listNote: "7f7cda39_listNote", listLegend: "1bf37650_listLegend", agentList: "dccb9592_agentList", agentGroup: "7a1e7d59_agentGroup", groupLabel: "a4d5691a_groupLabel", groupPlan: "96c8bb5f_groupPlan", groupPlanMore: "c775aa0a_groupPlanMore", groupNoPlan: "5d27d864_groupNoPlan", stageGroup: "2a00f734_stageGroup", stageLabel: "7212d235_stageLabel", subBucket: "13172d67_subBucket", subBucketLabel: "778a2d3f_subBucketLabel", cardList: "b34ac147_cardList", agentCard: "a9030174_agentCard", agentCardRunning: "4e2c7873_agentCardRunning", agentCardIdle: "1a8bb13e_agentCardIdle", agentCardDone: "d6bf2954_agentCardDone", onDemandBadge: "c2c54212_onDemandBadge", agentCardLine: "e7716946_agentCardLine", agentCardName: "a47ac04f_agentCardName", agentCount: "e2aedf35_agentCount", agentRoleChip: "e26900b4_agentRoleChip", agentRecord: "1e3b3403_agentRecord", agentStatusDot: "030ace7f_agentStatusDot", agentStatusRunning: "23846eb7_agentStatusRunning", agentStatusSettled: "91dcfc09_agentStatusSettled", agentStatusError: "eeb20a6e_agentStatusError", agentStatusAdvisory: "ec5fca43_agentStatusAdvisory", agentStatusIdle: "63e283ba_agentStatusIdle" };
3280
3158
 
3281
- // src/client/panel/pages/AgentCanvasPage.tsx
3282
- var jsx_runtime7 = require("react/jsx-runtime");
3283
- var PAN_ORIGIN = { x: 0, y: 0 };
3284
- function panDragStart(pan, x, y) {
3285
- return { originX: pan.x, originY: pan.y, startX: x, startY: y };
3286
- }
3287
- function panDragMove(drag, x, y) {
3288
- return { x: drag.originX + (x - drag.startX), y: drag.originY + (y - drag.startY) };
3289
- }
3290
- function panTransform(pan) {
3291
- return `translate(${pan.x}px, ${pan.y}px)`;
3292
- }
3293
- var COL_W = 200;
3294
- var COL_GAP = 56;
3295
- var CARD_W = 176;
3296
- var CARD_H = 72;
3297
- var ROW_GAP = 12;
3298
- var PAD_X = 24;
3299
- var PAD_Y = 24;
3300
- var COL_PAD = 12;
3301
- var LABEL_H = 18;
3302
- var SUB_LABEL_H = 14;
3303
- var SUB_GAP = 4;
3304
- var GROUP_GAP = 24;
3305
- var STANDOFF = 10;
3306
- var SIDE_GAP = 18;
3159
+ // src/client/panel/pages/AgentListPage.tsx
3160
+ var jsx_runtime9 = require("react/jsx-runtime");
3307
3161
  var UNKNOWN_COLUMN = "unknown";
3308
- var GENERAL_SINK_STAGE = "sdd-implement";
3309
- function layoutAgents(view) {
3310
- const columnIds = view.stages.map((s) => s.id);
3311
- const unknownSinkId = columnIds[columnIds.length - 1] ?? UNKNOWN_COLUMN;
3312
- const sddStage = view.stages.find((s) => s.stage === GENERAL_SINK_STAGE);
3313
- const sddSinkId = sddStage === undefined ? unknownSinkId : sddStage.id;
3314
- const buckets = new Map;
3315
- for (const entity of view.entities) {
3316
- const colId = entity.zone === GENERAL_BUCKET ? unknownSinkId : entity.zone === "on-demand" ? sddSinkId : entity.zone === "flow" && entity.stage !== null ? `${entity.stage.phase}:${entity.stage.stage}` : sddSinkId;
3317
- const bucketId = columnIds.includes(colId) ? colId : sddSinkId;
3318
- const bucket = buckets.get(bucketId);
3319
- if (bucket === undefined)
3320
- buckets.set(bucketId, [entity]);
3321
- else
3322
- bucket.push(entity);
3162
+ function orderedByRole(members, order) {
3163
+ const byKey = new Map(members.map((e) => [e.key, e]));
3164
+ const ordered = [];
3165
+ const claimed = new Set;
3166
+ for (const role of order) {
3167
+ const entity = byKey.get(role);
3168
+ if (entity !== undefined) {
3169
+ ordered.push(entity);
3170
+ claimed.add(role);
3171
+ }
3172
+ }
3173
+ for (const entity of members) {
3174
+ if (!claimed.has(entity.key))
3175
+ ordered.push(entity);
3323
3176
  }
3177
+ return ordered;
3178
+ }
3179
+ function buildGroups(view) {
3324
3180
  const rawGroups = [];
3325
3181
  for (const stage of view.stages) {
3326
3182
  const last = rawGroups[rawGroups.length - 1];
@@ -3328,294 +3184,73 @@ function layoutAgents(view) {
3328
3184
  rawGroups.push({
3329
3185
  phase: stage.phase,
3330
3186
  index: rawGroups.length + 1,
3331
- columnIds: [stage.id],
3187
+ stageIds: [stage.id],
3332
3188
  planNote: stage.phase === "autonomous-execute"
3333
3189
  });
3334
3190
  } else {
3335
- last.columnIds.push(stage.id);
3336
- }
3337
- }
3338
- const groups = rawGroups.map((g) => ({ ...g, label: { x: 0, y: 0, w: 0, h: 0 } }));
3339
- const cards = new Map;
3340
- const columns = [];
3341
- const subBuckets = new Map;
3342
- let unknown = null;
3343
- const colY = PAD_Y + LABEL_H + COL_PAD;
3344
- let groupX = PAD_X;
3345
- let canvasBottom = colY;
3346
- for (const group of groups) {
3347
- const groupW = group.columnIds.length * (COL_W + COL_GAP) - COL_GAP;
3348
- group.label = { x: groupX, y: PAD_Y, w: groupW, h: LABEL_H };
3349
- let groupBottom = colY;
3350
- group.columnIds.forEach((id, ci) => {
3351
- const colX = groupX + ci * (COL_W + COL_GAP);
3352
- const column = { id, x: colX, y: colY, w: COL_W, h: 0 };
3353
- columns.push(column);
3354
- const list = buckets.get(id) ?? [];
3355
- if (id === sddSinkId && sddStage !== undefined) {
3356
- const implementor = list.filter((e) => e.bucket === "implementor");
3357
- const reviewer = list.filter((e) => e.bucket === "reviewer");
3358
- const rest = list.filter((e) => e.bucket !== "implementor" && e.bucket !== "reviewer");
3359
- const rosterIndex = new Map(KNOWN_AGENTS.map((a, i) => [a.id, i]));
3360
- const implementorKey = (e) => {
3361
- if (e.zone === "flow") {
3362
- const i = sddStage.roles.indexOf(e.role);
3363
- return i === -1 ? Number.MAX_SAFE_INTEGER : i;
3364
- }
3365
- if (e.zone === "on-demand") {
3366
- return sddStage.roles.length + (rosterIndex.get(e.role) ?? Number.MAX_SAFE_INTEGER);
3367
- }
3368
- return Number.MAX_SAFE_INTEGER;
3369
- };
3370
- implementor.sort((a, b) => implementorKey(a) - implementorKey(b));
3371
- const implLabelY = colY + LABEL_H + COL_PAD;
3372
- const implCards = [];
3373
- let cy = implLabelY + SUB_LABEL_H + SUB_GAP;
3374
- for (const entity of implementor) {
3375
- const box = { x: colX + (COL_W - CARD_W) / 2, y: cy, w: CARD_W, h: CARD_H };
3376
- cards.set(entity.key, box);
3377
- implCards.push(box);
3378
- cy += CARD_H + ROW_GAP;
3379
- }
3380
- const revLabelY = cy;
3381
- const revCards = [];
3382
- cy = revLabelY + SUB_LABEL_H + SUB_GAP;
3383
- for (const entity of reviewer) {
3384
- const box = { x: colX + (COL_W - CARD_W) / 2, y: cy, w: CARD_W, h: CARD_H };
3385
- cards.set(entity.key, box);
3386
- revCards.push(box);
3387
- cy += CARD_H + ROW_GAP;
3388
- }
3389
- for (const entity of rest) {
3390
- const box = { x: colX + (COL_W - CARD_W) / 2, y: cy, w: CARD_W, h: CARD_H };
3391
- cards.set(entity.key, box);
3392
- cy += CARD_H + ROW_GAP;
3393
- }
3394
- const colBottom = cy - ROW_GAP;
3395
- column.h = Math.max(colBottom - colY + COL_PAD, CARD_H + LABEL_H + COL_PAD * 2);
3396
- const band = (boxes) => boxes.length === 0 ? null : { x: colX, y: boxes[0].y, w: COL_W, h: boxes[boxes.length - 1].y + CARD_H - boxes[0].y };
3397
- const labelW = CARD_W;
3398
- subBuckets.set(id, {
3399
- implementor: { label: { x: colX + (COL_W - CARD_W) / 2, y: implLabelY, w: labelW }, band: band(implCards) },
3400
- reviewer: { label: { x: colX + (COL_W - CARD_W) / 2, y: revLabelY, w: labelW }, band: band(revCards) }
3401
- });
3402
- } else if (id === unknownSinkId) {
3403
- const flowList = list.filter((e) => e.zone !== GENERAL_BUCKET);
3404
- const generalList = list.filter((e) => e.zone === GENERAL_BUCKET);
3405
- let cy = colY + LABEL_H + COL_PAD;
3406
- for (const entity of flowList) {
3407
- cards.set(entity.key, { x: colX + (COL_W - CARD_W) / 2, y: cy, w: CARD_W, h: CARD_H });
3408
- cy += CARD_H + ROW_GAP;
3409
- }
3410
- const unknownLabelY = cy;
3411
- const unknownBoxes = [];
3412
- cy = unknownLabelY + SUB_LABEL_H + SUB_GAP;
3413
- for (const entity of generalList) {
3414
- const box = { x: colX + (COL_W - CARD_W) / 2, y: cy, w: CARD_W, h: CARD_H };
3415
- cards.set(entity.key, box);
3416
- unknownBoxes.push(box);
3417
- cy += CARD_H + ROW_GAP;
3418
- }
3419
- const colBottom = cy - ROW_GAP;
3420
- column.h = Math.max(colBottom - colY + COL_PAD, CARD_H + LABEL_H + COL_PAD * 2);
3421
- const labelW = CARD_W;
3422
- unknown = {
3423
- label: { x: colX + (COL_W - CARD_W) / 2, y: unknownLabelY, w: labelW },
3424
- band: unknownBoxes.length === 0 ? null : { x: colX, y: unknownBoxes[0].y, w: COL_W, h: unknownBoxes[unknownBoxes.length - 1].y + CARD_H - unknownBoxes[0].y }
3425
- };
3426
- } else {
3427
- list.forEach((entity, i) => {
3428
- cards.set(entity.key, {
3429
- x: colX + (COL_W - CARD_W) / 2,
3430
- y: colY + LABEL_H + COL_PAD + i * (CARD_H + ROW_GAP),
3431
- w: CARD_W,
3432
- h: CARD_H
3433
- });
3434
- });
3435
- const h = COL_PAD * 2 + LABEL_H + list.length * CARD_H + Math.max(0, list.length - 1) * ROW_GAP;
3436
- column.h = Math.max(h, CARD_H + LABEL_H + COL_PAD * 2);
3437
- }
3438
- groupBottom = Math.max(groupBottom, colY + column.h);
3439
- });
3440
- canvasBottom = Math.max(canvasBottom, groupBottom);
3441
- groupX += groupW + GROUP_GAP;
3442
- }
3443
- return {
3444
- width: groups.length === 0 ? 0 : groupX - GROUP_GAP + PAD_X,
3445
- height: canvasBottom + PAD_Y,
3446
- columns,
3447
- cards,
3448
- subBuckets,
3449
- unknown,
3450
- groups
3451
- };
3452
- }
3453
- function superviseAnchor(anchor, layout) {
3454
- const idx = anchor.lastIndexOf(":");
3455
- if (idx === -1)
3456
- return null;
3457
- const columnId = anchor.slice(0, idx);
3458
- const bucket = anchor.slice(idx + 1);
3459
- if (bucket !== "implementor" && bucket !== "reviewer")
3460
- return null;
3461
- const column = layout.columns.find((c) => c.id === columnId);
3462
- if (column === undefined)
3463
- return null;
3464
- const geometry = layout.subBuckets.get(columnId);
3465
- if (geometry === undefined)
3466
- return null;
3467
- const partition = bucket === "implementor" ? geometry.implementor : geometry.reviewer;
3468
- const band = partition.band;
3469
- if (band === null)
3470
- return null;
3471
- const cardLeft = column.x + (COL_W - CARD_W) / 2;
3472
- const x = cardLeft + CARD_W + SIDE_GAP;
3473
- const y = bucket === "implementor" ? band.y + band.h : band.y;
3474
- return { x, y };
3475
- }
3476
- function portPoint(box, port) {
3477
- switch (port) {
3478
- case "north":
3479
- return { x: box.x + box.w / 2, y: box.y };
3480
- case "south":
3481
- return { x: box.x + box.w / 2, y: box.y + box.h };
3482
- case "west":
3483
- return { x: box.x, y: box.y + box.h / 2 };
3484
- case "east":
3485
- return { x: box.x + box.w, y: box.y + box.h / 2 };
3486
- }
3487
- }
3488
- function columnIndexOfBox(layout, box) {
3489
- return layout.columns.findIndex((c) => box.x >= c.x && box.x < c.x + c.w && box.y >= c.y && box.y < c.y + c.h);
3490
- }
3491
- function captionRows(layout, columnId) {
3492
- const rows = [];
3493
- const geometry = layout.subBuckets.get(columnId);
3494
- if (geometry !== undefined) {
3495
- for (const p of [geometry.implementor, geometry.reviewer]) {
3496
- if (p.band !== null)
3497
- rows.push({ x: p.label.x, y: p.label.y, w: p.label.w, h: SUB_LABEL_H });
3191
+ last.stageIds.push(stage.id);
3498
3192
  }
3499
3193
  }
3500
- const lastId = layout.columns[layout.columns.length - 1]?.id;
3501
- if (columnId === lastId && layout.unknown !== null && layout.unknown.band !== null) {
3502
- rows.push({ x: layout.unknown.label.x, y: layout.unknown.label.y, w: layout.unknown.label.w, h: SUB_LABEL_H });
3503
- }
3504
- return rows;
3505
- }
3506
- function intermediateCardBoxes(layout, srcCol, tgtCol) {
3507
- const lo = Math.min(srcCol, tgtCol);
3508
- const hi = Math.max(srcCol, tgtCol);
3509
- const boxes = [];
3510
- for (const box of layout.cards.values()) {
3511
- const col = columnIndexOfBox(layout, box);
3512
- if (col > lo && col < hi)
3513
- boxes.push(box);
3514
- }
3515
- return boxes;
3516
- }
3517
- function crossesCardBody(g, layout, srcCol, tgtCol) {
3518
- return intermediateCardBoxes(layout, srcCol, tgtCol).some((card) => boxOverlaps(g, card));
3519
- }
3520
- function horizontalBBox(sx, sy, tx, ty) {
3521
- const dx = tx - sx;
3522
- const off = Math.max(Math.abs(dx) / 2, 24);
3523
- const dir = dx < 0 ? -1 : 1;
3524
- const xs = [sx, tx, sx + dir * off, tx - dir * off];
3525
- const minX = Math.min(...xs);
3526
- const maxX = Math.max(...xs);
3527
- const minY = Math.min(sy, ty);
3528
- const maxY = Math.max(sy, ty);
3529
- return { x: minX, y: minY, w: maxX - minX, h: maxY - minY };
3530
- }
3531
- function boxOverlaps(a, b) {
3532
- return a.x < b.x + b.w && a.x + a.w > b.x && a.y < b.y + b.h && a.y + a.h > b.y;
3533
- }
3534
- function sideGapDetour(sx, sy, endX, endY, sourceBox, targetBox, layout, srcCol, tgtCol) {
3535
- const forward = srcCol < tgtCol;
3536
- const band = intermediateCardBoxes(layout, srcCol, tgtCol);
3537
- const bandBottom = band.reduce((m, c) => Math.max(m, c.y + c.h), 0);
3538
- const detourY = bandBottom + SIDE_GAP;
3539
- const sourceGapX = forward ? sourceBox.x + sourceBox.w + SIDE_GAP : sourceBox.x - SIDE_GAP;
3540
- const targetGapX = forward ? targetBox.x - SIDE_GAP : targetBox.x + targetBox.w + SIDE_GAP;
3541
- const d = `M ${sx} ${sy} L ${sourceGapX} ${sy} L ${sourceGapX} ${detourY} L ${targetGapX} ${detourY} L ${targetGapX} ${endY} L ${endX} ${endY}`;
3542
- return { d, x1: sx, y1: sy, x2: endX, y2: endY };
3543
- }
3544
- function sameColumnStandoff(gap) {
3545
- return Math.min(STANDOFF, Math.max(2, gap - 8));
3546
- }
3547
- function crossesSameColumnCard(layout, cx, startY, endY, sourceBox, targetBox) {
3548
- const seg = { x: cx, y: Math.min(startY, endY), w: 0, h: Math.abs(endY - startY) };
3549
- for (const box of layout.cards.values()) {
3550
- if (box === sourceBox || box === targetBox)
3194
+ const stageById = new Map(view.stages.map((s) => [s.id, s]));
3195
+ const lastStageId = view.stages.length > 0 ? view.stages[view.stages.length - 1].id : null;
3196
+ const implementorHostId = view.stages.find((s) => s.roles.some((r) => SDD_BUCKET_ROLES.implementor.includes(r)))?.id ?? lastStageId;
3197
+ const members = new Map;
3198
+ for (const entity of view.entities) {
3199
+ const stageId = entity.zone === GENERAL_BUCKET ? lastStageId : entity.zone === "on-demand" ? implementorHostId : entity.zone === "flow" && entity.stage !== null ? `${entity.stage.phase}:${entity.stage.stage}` : implementorHostId;
3200
+ if (stageId === null)
3551
3201
  continue;
3552
- if (boxOverlaps(seg, box))
3553
- return true;
3554
- }
3555
- return false;
3556
- }
3557
- function horizontalCurve(sx, sy, tx, ty) {
3558
- const dx = tx - sx;
3559
- const off = Math.max(Math.abs(dx) / 2, 24);
3560
- const dir = dx < 0 ? -1 : 1;
3561
- const d = `M ${sx} ${sy} C ${sx + dir * off} ${sy}, ${tx - dir * off} ${ty}, ${tx} ${ty}`;
3562
- return { d, x1: sx, y1: sy, x2: tx, y2: ty };
3563
- }
3564
- function verticalCurve(sx, sy, tx, ty) {
3565
- const span = ty - sy;
3566
- const d = `M ${sx} ${sy} C ${sx} ${sy + span / 3}, ${tx} ${ty - span / 3}, ${tx} ${ty}`;
3567
- return { d, x1: sx, y1: sy, x2: tx, y2: ty };
3568
- }
3569
- function edgePath(edge, layout) {
3570
- if (edge.kind === "supervise") {
3571
- const source = superviseAnchor(edge.source, layout);
3572
- const target = superviseAnchor(edge.target, layout);
3573
- if (source === null || target === null)
3574
- return null;
3575
- return verticalCurve(source.x, source.y, target.x, target.y);
3576
- }
3577
- const sourceBox = layout.cards.get(edge.source);
3578
- const targetBox = layout.cards.get(edge.target);
3579
- if (sourceBox === undefined || targetBox === undefined)
3580
- return null;
3581
- const srcCol = columnIndexOfBox(layout, sourceBox);
3582
- const tgtCol = columnIndexOfBox(layout, targetBox);
3583
- if (srcCol < tgtCol) {
3584
- const s = portPoint(sourceBox, "east");
3585
- const t = portPoint(targetBox, "west");
3586
- const endX = t.x - STANDOFF;
3587
- if (crossesCardBody(horizontalBBox(s.x, s.y, endX, t.y), layout, srcCol, tgtCol)) {
3588
- return sideGapDetour(s.x, s.y, endX, t.y, sourceBox, targetBox, layout, srcCol, tgtCol);
3589
- }
3590
- return horizontalCurve(s.x, s.y, endX, t.y);
3591
- }
3592
- if (srcCol > tgtCol) {
3593
- const s = portPoint(sourceBox, "west");
3594
- const t = portPoint(targetBox, "east");
3595
- const endX = t.x + STANDOFF;
3596
- if (crossesCardBody(horizontalBBox(s.x, s.y, endX, t.y), layout, srcCol, tgtCol)) {
3597
- return sideGapDetour(s.x, s.y, endX, t.y, sourceBox, targetBox, layout, srcCol, tgtCol);
3598
- }
3599
- return horizontalCurve(s.x, s.y, endX, t.y);
3600
- }
3601
- const forward = sourceBox.y + sourceBox.h <= targetBox.y;
3602
- const gap = forward ? targetBox.y - (sourceBox.y + sourceBox.h) : sourceBox.y - (targetBox.y + targetBox.h);
3603
- const standoff = sameColumnStandoff(gap);
3604
- const cx = sourceBox.x + sourceBox.w / 2;
3605
- const startY = forward ? sourceBox.y + sourceBox.h : sourceBox.y;
3606
- const endY = forward ? targetBox.y - standoff : targetBox.y + targetBox.h + standoff;
3607
- const colId = layout.columns[srcCol]?.id;
3608
- const crossesCaption = colId !== undefined && captionRows(layout, colId).some((row) => cx >= row.x && cx <= row.x + row.w && Math.min(startY, endY) < row.y + row.h && Math.max(startY, endY) > row.y);
3609
- if (crossesCaption || crossesSameColumnCard(layout, cx, startY, endY, sourceBox, targetBox)) {
3610
- const sideX = sourceBox.x - SIDE_GAP;
3611
- return verticalCurve(sideX, startY, sideX, endY);
3202
+ const list = members.get(stageId);
3203
+ if (list === undefined)
3204
+ members.set(stageId, [entity]);
3205
+ else
3206
+ list.push(entity);
3612
3207
  }
3613
- return verticalCurve(cx, startY, cx, endY);
3208
+ return rawGroups.map((raw) => ({
3209
+ phase: raw.phase,
3210
+ index: raw.index,
3211
+ planNote: raw.planNote,
3212
+ stages: raw.stageIds.map((stageId) => {
3213
+ const stage = stageById.get(stageId);
3214
+ const list = members.get(stageId) ?? [];
3215
+ const isImplementorHost = stageId === implementorHostId;
3216
+ const isLast = stageId === lastStageId;
3217
+ const flow = [];
3218
+ const implementor = [];
3219
+ const reviewer = [];
3220
+ const unknown = [];
3221
+ for (const entity of list) {
3222
+ if (isLast && entity.zone === GENERAL_BUCKET)
3223
+ unknown.push(entity);
3224
+ else if (isImplementorHost && entity.bucket === "implementor")
3225
+ implementor.push(entity);
3226
+ else if (isImplementorHost && entity.bucket === "reviewer")
3227
+ reviewer.push(entity);
3228
+ else
3229
+ flow.push(entity);
3230
+ }
3231
+ const buckets = [];
3232
+ if (implementor.length > 0) {
3233
+ buckets.push({ id: "implementor", entities: orderedByRole(implementor, SDD_BUCKET_ROLES.implementor) });
3234
+ }
3235
+ if (reviewer.length > 0) {
3236
+ buckets.push({ id: "reviewer", entities: orderedByRole(reviewer, SDD_BUCKET_ROLES.reviewer) });
3237
+ }
3238
+ if (unknown.length > 0) {
3239
+ buckets.push({ id: UNKNOWN_COLUMN, entities: orderedByRole(unknown, []) });
3240
+ }
3241
+ return {
3242
+ id: stageId,
3243
+ label: stageId.slice(stageId.indexOf(":") + 1),
3244
+ flow: orderedByRole(flow, stage?.roles ?? []),
3245
+ buckets
3246
+ };
3247
+ })
3248
+ }));
3614
3249
  }
3615
3250
  function StatusPoint({ status, done }) {
3616
- const className = agent_canvas_module_default.agentStatusDot + (status === "running" ? ` ${agent_canvas_module_default.agentStatusRunning}` : status === "settled" ? done ? ` ${agent_canvas_module_default.agentStatusSettled}` : ` ${agent_canvas_module_default.agentStatusIdle}` : status === "error" || status === "denied" ? ` ${agent_canvas_module_default.agentStatusError}` : status === "advisory" ? ` ${agent_canvas_module_default.agentStatusAdvisory}` : ` ${agent_canvas_module_default.agentStatusIdle}`);
3251
+ const className = agent_list_module_default.agentStatusDot + (status === "running" ? ` ${agent_list_module_default.agentStatusRunning}` : status === "settled" ? done ? ` ${agent_list_module_default.agentStatusSettled}` : ` ${agent_list_module_default.agentStatusIdle}` : status === "error" || status === "denied" ? ` ${agent_list_module_default.agentStatusError}` : status === "advisory" ? ` ${agent_list_module_default.agentStatusAdvisory}` : ` ${agent_list_module_default.agentStatusIdle}`);
3617
3252
  if (status === "settled" && done) {
3618
- return /* @__PURE__ */ jsx_runtime7.jsx("span", {
3253
+ return /* @__PURE__ */ jsx_runtime9.jsx("span", {
3619
3254
  className,
3620
3255
  "data-agent-status": status,
3621
3256
  "data-agent-done": "true",
@@ -3623,13 +3258,13 @@ function StatusPoint({ status, done }) {
3623
3258
  children: "✓"
3624
3259
  });
3625
3260
  }
3626
- return /* @__PURE__ */ jsx_runtime7.jsx("span", {
3261
+ return /* @__PURE__ */ jsx_runtime9.jsx("span", {
3627
3262
  className,
3628
3263
  "data-agent-status": status,
3629
3264
  "aria-hidden": "true"
3630
3265
  });
3631
3266
  }
3632
- function EntityCard({ entity, t, box }) {
3267
+ function EntityCard({ entity, t }) {
3633
3268
  const running = entity.status === "running";
3634
3269
  const done = entity.status === "settled" && entity.emphasis !== "off";
3635
3270
  const title = entity.idle ? entity.name : entity.role !== "" ? entity.role : entity.name;
@@ -3638,9 +3273,8 @@ function EntityCard({ entity, t, box }) {
3638
3273
  record2.push(entity.agent);
3639
3274
  if (entity.task !== null)
3640
3275
  record2.push(entity.task);
3641
- return /* @__PURE__ */ jsx_runtime7.jsxs("li", {
3642
- className: entity.idle ? `${agent_canvas_module_default.agentCard} ${agent_canvas_module_default.agentCardIdle}` : running ? `${agent_canvas_module_default.agentCard} ${agent_canvas_module_default.agentCardRunning}` : done ? `${agent_canvas_module_default.agentCard} ${agent_canvas_module_default.agentCardDone}` : agent_canvas_module_default.agentCard,
3643
- style: { left: box.x, top: box.y, width: box.w, height: box.h },
3276
+ return /* @__PURE__ */ jsx_runtime9.jsxs("li", {
3277
+ className: entity.idle ? `${agent_list_module_default.agentCard} ${agent_list_module_default.agentCardIdle}` : running ? `${agent_list_module_default.agentCard} ${agent_list_module_default.agentCardRunning}` : done ? `${agent_list_module_default.agentCard} ${agent_list_module_default.agentCardDone}` : agent_list_module_default.agentCard,
3644
3278
  "data-agent-entity": entity.key,
3645
3279
  "data-agent-status": entity.status,
3646
3280
  "data-agent-idle": entity.idle ? "true" : undefined,
@@ -3650,106 +3284,71 @@ function EntityCard({ entity, t, box }) {
3650
3284
  "data-agent-bucket": entity.bucket ?? undefined,
3651
3285
  "data-agent-emphasis": entity.emphasis ?? undefined,
3652
3286
  children: [
3653
- entity.zone === "on-demand" && /* @__PURE__ */ jsx_runtime7.jsx("span", {
3654
- className: agent_canvas_module_default.onDemandBadge,
3287
+ entity.zone === "on-demand" && /* @__PURE__ */ jsx_runtime9.jsx("span", {
3288
+ className: agent_list_module_default.onDemandBadge,
3655
3289
  "data-agent-on-demand": "true",
3656
3290
  children: t("zone.agents.on-demand")
3657
3291
  }),
3658
- /* @__PURE__ */ jsx_runtime7.jsx("span", {
3659
- className: agent_canvas_module_default.agentPort,
3660
- "data-agent-port": "north",
3661
- "aria-hidden": "true"
3662
- }),
3663
- /* @__PURE__ */ jsx_runtime7.jsx("span", {
3664
- className: agent_canvas_module_default.agentPort,
3665
- "data-agent-port": "south",
3666
- "aria-hidden": "true"
3667
- }),
3668
- /* @__PURE__ */ jsx_runtime7.jsx("span", {
3669
- className: agent_canvas_module_default.agentPort,
3670
- "data-agent-port": "west",
3671
- "aria-hidden": "true"
3672
- }),
3673
- /* @__PURE__ */ jsx_runtime7.jsx("span", {
3674
- className: agent_canvas_module_default.agentPort,
3675
- "data-agent-port": "east",
3676
- "aria-hidden": "true"
3677
- }),
3678
- /* @__PURE__ */ jsx_runtime7.jsxs("div", {
3679
- className: agent_canvas_module_default.agentCardLine,
3292
+ /* @__PURE__ */ jsx_runtime9.jsxs("div", {
3293
+ className: agent_list_module_default.agentCardLine,
3680
3294
  children: [
3681
- /* @__PURE__ */ jsx_runtime7.jsx("span", {
3682
- className: agent_canvas_module_default.agentCardName,
3295
+ /* @__PURE__ */ jsx_runtime9.jsx("span", {
3296
+ className: agent_list_module_default.agentCardName,
3683
3297
  title,
3684
3298
  children: title
3685
3299
  }),
3686
- /* @__PURE__ */ jsx_runtime7.jsx(StatusPoint, {
3300
+ /* @__PURE__ */ jsx_runtime9.jsx(StatusPoint, {
3687
3301
  status: entity.status,
3688
3302
  done
3689
3303
  }),
3690
- entity.count > 1 && /* @__PURE__ */ jsx_runtime7.jsx("span", {
3691
- className: agent_canvas_module_default.agentCount,
3304
+ entity.count > 1 && /* @__PURE__ */ jsx_runtime9.jsx("span", {
3305
+ className: agent_list_module_default.agentCount,
3692
3306
  "data-agent-count": entity.count,
3693
3307
  children: `×${entity.count}`
3694
3308
  })
3695
3309
  ]
3696
3310
  }),
3697
- entity.role !== "" && entity.role !== entity.key && /* @__PURE__ */ jsx_runtime7.jsx("span", {
3698
- className: agent_canvas_module_default.agentRoleChip,
3311
+ entity.role !== "" && entity.role !== entity.key && /* @__PURE__ */ jsx_runtime9.jsx("span", {
3312
+ className: agent_list_module_default.agentRoleChip,
3699
3313
  "data-agent-role": entity.role,
3700
3314
  children: entity.role
3701
3315
  }),
3702
- record2.length > 0 && /* @__PURE__ */ jsx_runtime7.jsx("span", {
3703
- className: agent_canvas_module_default.agentRecord,
3316
+ record2.length > 0 && /* @__PURE__ */ jsx_runtime9.jsx("span", {
3317
+ className: agent_list_module_default.agentRecord,
3704
3318
  "data-agent-record": true,
3705
3319
  children: record2.join(" · ")
3706
3320
  })
3707
3321
  ]
3708
3322
  });
3709
3323
  }
3710
- function AgentCanvasPage({ view, iteration, t, initialPan }) {
3711
- const { entities, edges, degraded, note, executing, pending } = view;
3712
- const [pan, setPan] = import_react2.useState(() => initialPan ?? PAN_ORIGIN);
3713
- const dragRef = import_react2.useRef(null);
3714
- const layout = import_react2.useMemo(() => layoutAgents(view), [view]);
3715
- const edgeGeoms = import_react2.useMemo(() => edges.map((edge) => ({ edge, curve: edgePath(edge, layout) })), [edges, layout]);
3716
- const handlePointerDown = (e) => {
3717
- if (e.button !== 0 || !e.isPrimary)
3718
- return;
3719
- e.preventDefault();
3720
- e.currentTarget.setPointerCapture(e.pointerId);
3721
- dragRef.current = panDragStart(pan, e.clientX, e.clientY);
3722
- };
3723
- const handlePointerMove = (e) => {
3724
- const drag = dragRef.current;
3725
- if (drag === null)
3726
- return;
3727
- setPan(panDragMove(drag, e.clientX, e.clientY));
3728
- };
3729
- const handlePointerEnd = (e) => {
3730
- dragRef.current = null;
3731
- if (e.currentTarget.hasPointerCapture(e.pointerId)) {
3732
- e.currentTarget.releasePointerCapture(e.pointerId);
3733
- }
3734
- };
3324
+ function subBucketLabel(id, t) {
3325
+ if (id === "implementor")
3326
+ return t("zone.agents.bucket.implementor");
3327
+ if (id === "reviewer")
3328
+ return t("zone.agents.bucket.reviewer");
3329
+ return t("zone.agents.unknown-sub");
3330
+ }
3331
+ function AgentListPage({ view, iteration, t }) {
3332
+ const { degraded, note, executing, pending } = view;
3333
+ const groups = import_react2.useMemo(() => buildGroups(view), [view]);
3735
3334
  const noteInfo = degraded ? { anchor: "degraded", text: t("flow.degraded") } : note === "empty" ? { anchor: "empty", text: t("flow.empty") } : note === "settle-only" ? { anchor: "settle-only", text: t("flow.settle-only") } : null;
3736
- return /* @__PURE__ */ jsx_runtime7.jsxs("div", {
3737
- className: agent_canvas_module_default.canvasPage,
3335
+ return /* @__PURE__ */ jsx_runtime9.jsxs("div", {
3336
+ className: agent_list_module_default.listPage,
3738
3337
  "data-mstar-page": "agents",
3739
3338
  children: [
3740
- /* @__PURE__ */ jsx_runtime7.jsx(IterationInfoSection, {
3339
+ /* @__PURE__ */ jsx_runtime9.jsx(IterationInfoSection, {
3741
3340
  iteration,
3742
3341
  t
3743
3342
  }),
3744
- /* @__PURE__ */ jsx_runtime7.jsxs("header", {
3745
- className: agent_canvas_module_default.canvasHeader,
3343
+ /* @__PURE__ */ jsx_runtime9.jsxs("header", {
3344
+ className: agent_list_module_default.listHeader,
3746
3345
  children: [
3747
- /* @__PURE__ */ jsx_runtime7.jsx("h2", {
3748
- className: agent_canvas_module_default.canvasTitle,
3346
+ /* @__PURE__ */ jsx_runtime9.jsx("h2", {
3347
+ className: agent_list_module_default.listTitle,
3749
3348
  children: t("zone.agents.title")
3750
3349
  }),
3751
- /* @__PURE__ */ jsx_runtime7.jsx("span", {
3752
- className: agent_canvas_module_default.canvasSummary,
3350
+ /* @__PURE__ */ jsx_runtime9.jsx("span", {
3351
+ className: agent_list_module_default.listSummary,
3753
3352
  "data-agent-summary": true,
3754
3353
  "data-agent-summary-executing": executing,
3755
3354
  "data-agent-summary-pending": pending,
@@ -3757,172 +3356,81 @@ function AgentCanvasPage({ view, iteration, t, initialPan }) {
3757
3356
  })
3758
3357
  ]
3759
3358
  }),
3760
- noteInfo !== null && /* @__PURE__ */ jsx_runtime7.jsx("p", {
3761
- className: agent_canvas_module_default.canvasNote,
3762
- "data-canvas-note": noteInfo.anchor,
3359
+ noteInfo !== null && /* @__PURE__ */ jsx_runtime9.jsx("p", {
3360
+ className: agent_list_module_default.listNote,
3361
+ "data-agents-note": noteInfo.anchor,
3763
3362
  children: noteInfo.text
3764
3363
  }),
3765
- /* @__PURE__ */ jsx_runtime7.jsx("div", {
3766
- className: agent_canvas_module_default.canvasViewport,
3767
- "data-canvas-viewport": true,
3768
- onPointerDown: handlePointerDown,
3769
- onPointerMove: handlePointerMove,
3770
- onPointerUp: handlePointerEnd,
3771
- onPointerCancel: handlePointerEnd,
3772
- onLostPointerCapture: handlePointerEnd,
3773
- children: /* @__PURE__ */ jsx_runtime7.jsxs("div", {
3774
- className: agent_canvas_module_default.canvasContent,
3775
- "data-canvas-pan": true,
3776
- style: { transform: panTransform(pan), width: layout.width, height: layout.height },
3364
+ /* @__PURE__ */ jsx_runtime9.jsx("div", {
3365
+ className: `${agent_list_module_default.agentList} ${panel_module_default.groupGrid}`,
3366
+ "data-agent-list": true,
3367
+ children: groups.map((group) => /* @__PURE__ */ jsx_runtime9.jsxs("section", {
3368
+ className: agent_list_module_default.agentGroup,
3369
+ "data-agent-group": group.phase,
3370
+ "data-agent-group-index": group.index,
3777
3371
  children: [
3778
- layout.groups.map((group) => /* @__PURE__ */ jsx_runtime7.jsxs("span", {
3779
- className: agent_canvas_module_default.canvasGroupLabel,
3780
- style: { left: group.label.x, top: group.label.y, width: group.label.w },
3781
- "data-canvas-group": group.phase,
3782
- "data-canvas-group-index": group.index,
3372
+ /* @__PURE__ */ jsx_runtime9.jsxs("span", {
3373
+ className: agent_list_module_default.groupLabel,
3783
3374
  children: [
3784
3375
  group.phase === "iteration-start" ? t("zone.agents.group.phase-1") : group.phase === "autonomous-execute" ? t("zone.agents.group.phase-2") : t("zone.agents.group.phase-n", { n: String(group.index) }),
3785
- group.planNote && (view.activePlanId === null ? /* @__PURE__ */ jsx_runtime7.jsx("span", {
3786
- className: agent_canvas_module_default.canvasGroupNoPlan,
3787
- "data-canvas-group-no-plan": true,
3376
+ group.planNote && (view.activePlanId === null ? /* @__PURE__ */ jsx_runtime9.jsx("span", {
3377
+ className: agent_list_module_default.groupNoPlan,
3378
+ "data-agent-group-no-plan": true,
3788
3379
  children: t("zone.agents.group.no-plan")
3789
- }) : /* @__PURE__ */ jsx_runtime7.jsxs("span", {
3790
- className: agent_canvas_module_default.canvasGroupPlan,
3791
- "data-canvas-group-plan": view.activePlanId,
3380
+ }) : /* @__PURE__ */ jsx_runtime9.jsxs("span", {
3381
+ className: agent_list_module_default.groupPlan,
3382
+ "data-agent-group-plan": view.activePlanId,
3792
3383
  children: [
3793
3384
  t("zone.agents.group.plan", { plan: view.activePlanId }),
3794
- view.activePlanCount > 1 && /* @__PURE__ */ jsx_runtime7.jsx("span", {
3795
- className: agent_canvas_module_default.canvasGroupPlanMore,
3796
- "data-canvas-group-plan-more": true,
3385
+ view.activePlanCount > 1 && /* @__PURE__ */ jsx_runtime9.jsx("span", {
3386
+ className: agent_list_module_default.groupPlanMore,
3387
+ "data-agent-group-plan-more": true,
3797
3388
  children: t("zone.agents.group.plan-more", { n: String(view.activePlanCount - 1) })
3798
3389
  })
3799
3390
  ]
3800
3391
  }))
3801
3392
  ]
3802
- }, group.phase)),
3803
- layout.columns.map((col) => /* @__PURE__ */ jsx_runtime7.jsx("span", {
3804
- className: agent_canvas_module_default.canvasColumnLabel,
3805
- style: { left: col.x, top: col.y },
3806
- "data-canvas-column": col.id,
3807
- children: col.id.slice(col.id.indexOf(":") + 1)
3808
- }, col.id)),
3809
- Array.from(layout.subBuckets.entries()).map(([colId, geometry]) => /* @__PURE__ */ jsx_runtime7.jsxs("span", {
3810
- children: [
3811
- geometry.implementor.band !== null && /* @__PURE__ */ jsx_runtime7.jsx("span", {
3812
- className: agent_canvas_module_default.subBucketLabel,
3813
- style: { left: geometry.implementor.label.x, top: geometry.implementor.label.y, width: geometry.implementor.label.w },
3814
- "data-sub-bucket": "implementor",
3815
- children: t("zone.agents.bucket.implementor")
3816
- }),
3817
- geometry.reviewer.band !== null && /* @__PURE__ */ jsx_runtime7.jsx("span", {
3818
- className: agent_canvas_module_default.subBucketLabel,
3819
- style: { left: geometry.reviewer.label.x, top: geometry.reviewer.label.y, width: geometry.reviewer.label.w },
3820
- "data-sub-bucket": "reviewer",
3821
- children: t("zone.agents.bucket.reviewer")
3822
- })
3823
- ]
3824
- }, colId)),
3825
- layout.unknown !== null && layout.unknown.band !== null && /* @__PURE__ */ jsx_runtime7.jsx("span", {
3826
- className: agent_canvas_module_default.subBucketLabel,
3827
- style: { left: layout.unknown.label.x, top: layout.unknown.label.y, width: layout.unknown.label.w },
3828
- "data-sub-bucket": UNKNOWN_COLUMN,
3829
- children: t("zone.agents.unknown-sub")
3830
3393
  }),
3831
- /* @__PURE__ */ jsx_runtime7.jsxs("svg", {
3832
- className: agent_canvas_module_default.canvasEdges,
3833
- width: layout.width,
3834
- height: layout.height,
3835
- "aria-hidden": "true",
3394
+ group.stages.map((stage) => /* @__PURE__ */ jsx_runtime9.jsxs("section", {
3395
+ className: agent_list_module_default.stageGroup,
3396
+ "data-agent-stage": stage.id,
3836
3397
  children: [
3837
- /* @__PURE__ */ jsx_runtime7.jsxs("defs", {
3398
+ /* @__PURE__ */ jsx_runtime9.jsx("span", {
3399
+ className: agent_list_module_default.stageLabel,
3400
+ children: stage.label
3401
+ }),
3402
+ stage.flow.length > 0 && /* @__PURE__ */ jsx_runtime9.jsx("ul", {
3403
+ className: agent_list_module_default.cardList,
3404
+ children: stage.flow.map((entity) => /* @__PURE__ */ jsx_runtime9.jsx(EntityCard, {
3405
+ entity,
3406
+ t
3407
+ }, entity.key))
3408
+ }),
3409
+ stage.buckets.map((bucket) => /* @__PURE__ */ jsx_runtime9.jsxs("section", {
3410
+ className: agent_list_module_default.subBucket,
3411
+ "data-sub-bucket": bucket.id,
3838
3412
  children: [
3839
- /* @__PURE__ */ jsx_runtime7.jsx("marker", {
3840
- id: "canvas-arrow-actual",
3841
- markerUnits: "userSpaceOnUse",
3842
- viewBox: "0 0 6 8",
3843
- refX: "6",
3844
- refY: "4",
3845
- markerWidth: "6",
3846
- markerHeight: "8",
3847
- orient: "auto",
3848
- children: /* @__PURE__ */ jsx_runtime7.jsx("path", {
3849
- className: agent_canvas_module_default.canvasArrowActual,
3850
- d: "M 0 1 L 6 4 L 0 7 z"
3851
- })
3852
- }),
3853
- /* @__PURE__ */ jsx_runtime7.jsx("marker", {
3854
- id: "canvas-arrow-supervise",
3855
- markerUnits: "userSpaceOnUse",
3856
- viewBox: "0 0 6 8",
3857
- refX: "6",
3858
- refY: "4",
3859
- markerWidth: "6",
3860
- markerHeight: "8",
3861
- orient: "auto-start-reverse",
3862
- children: /* @__PURE__ */ jsx_runtime7.jsx("path", {
3863
- className: agent_canvas_module_default.canvasArrowSupervise,
3864
- d: "M 0 1 L 6 4 L 0 7 z"
3865
- })
3413
+ /* @__PURE__ */ jsx_runtime9.jsx("span", {
3414
+ className: agent_list_module_default.subBucketLabel,
3415
+ children: subBucketLabel(bucket.id, t)
3866
3416
  }),
3867
- /* @__PURE__ */ jsx_runtime7.jsx("marker", {
3868
- id: "canvas-arrow-supervise-lit",
3869
- markerUnits: "userSpaceOnUse",
3870
- viewBox: "0 0 6 8",
3871
- refX: "6",
3872
- refY: "4",
3873
- markerWidth: "6",
3874
- markerHeight: "8",
3875
- orient: "auto-start-reverse",
3876
- children: /* @__PURE__ */ jsx_runtime7.jsx("path", {
3877
- className: agent_canvas_module_default.canvasArrowSuperviseLit,
3878
- d: "M 0 1 L 6 4 L 0 7 z"
3879
- })
3417
+ /* @__PURE__ */ jsx_runtime9.jsx("ul", {
3418
+ className: agent_list_module_default.cardList,
3419
+ children: bucket.entities.map((entity) => /* @__PURE__ */ jsx_runtime9.jsx(EntityCard, {
3420
+ entity,
3421
+ t
3422
+ }, entity.key))
3880
3423
  })
3881
3424
  ]
3882
- }),
3883
- edgeGeoms.map((geom, i) => {
3884
- const curve = geom.curve;
3885
- if (curve === null)
3886
- return null;
3887
- if (geom.edge.kind === "supervise") {
3888
- const lit = geom.edge.evidenced === true;
3889
- return /* @__PURE__ */ jsx_runtime7.jsx("path", {
3890
- className: `${agent_canvas_module_default.canvasEdgeCurve} ${lit ? `${agent_canvas_module_default.canvasEdgeSupervise} ${agent_canvas_module_default.canvasEdgeSuperviseLit}` : agent_canvas_module_default.canvasEdgeSupervise}`,
3891
- d: curve.d,
3892
- markerStart: lit ? "url(#canvas-arrow-supervise-lit)" : "url(#canvas-arrow-supervise)",
3893
- markerEnd: lit ? "url(#canvas-arrow-supervise-lit)" : "url(#canvas-arrow-supervise)",
3894
- "data-agent-edge-supervise": `${geom.edge.source}->${geom.edge.target}`,
3895
- "data-agent-edge-supervise-lit": lit ? "true" : undefined
3896
- }, `supervise-${i}-${geom.edge.source}-${geom.edge.target}`);
3897
- }
3898
- return /* @__PURE__ */ jsx_runtime7.jsx("path", {
3899
- className: `${agent_canvas_module_default.canvasEdgeCurve} ${agent_canvas_module_default.canvasEdgeActual}`,
3900
- d: curve.d,
3901
- markerEnd: "url(#canvas-arrow-actual)",
3902
- "data-agent-edge-actual": `${geom.edge.source}->${geom.edge.target}`
3903
- }, `actual-${i}-${geom.edge.source}-${geom.edge.target}`);
3904
- })
3425
+ }, bucket.id))
3905
3426
  ]
3906
- }),
3907
- /* @__PURE__ */ jsx_runtime7.jsx("ul", {
3908
- className: agent_canvas_module_default.canvasCards,
3909
- children: entities.map((entity) => {
3910
- const box = layout.cards.get(entity.key);
3911
- if (box === undefined)
3912
- return null;
3913
- return /* @__PURE__ */ jsx_runtime7.jsx(EntityCard, {
3914
- entity,
3915
- t,
3916
- box
3917
- }, entity.key);
3918
- })
3919
- })
3427
+ }, stage.id))
3920
3428
  ]
3921
- })
3429
+ }, group.phase))
3922
3430
  }),
3923
- /* @__PURE__ */ jsx_runtime7.jsx("div", {
3924
- className: agent_canvas_module_default.canvasLegend,
3925
- children: /* @__PURE__ */ jsx_runtime7.jsx(Legend, {
3431
+ /* @__PURE__ */ jsx_runtime9.jsx("div", {
3432
+ className: agent_list_module_default.listLegend,
3433
+ children: /* @__PURE__ */ jsx_runtime9.jsx(Legend, {
3926
3434
  t
3927
3435
  })
3928
3436
  })
@@ -3986,15 +3494,9 @@ var css4 = `
3986
3494
 
3987
3495
 
3988
3496
 
3497
+
3989
3498
  .\\38 e395e34_eventLogPage {
3990
- flex: 1;
3991
- min-height: 0;
3992
- display: grid;
3993
- grid-template-columns: repeat(2, minmax(0, 1fr));
3994
- grid-template-rows: minmax(0, 1fr);
3995
- gap: var(--mstar-space-3);
3996
- padding: var(--mstar-space-3);
3997
- overflow: hidden;
3499
+ min-width: 0;
3998
3500
  }
3999
3501
 
4000
3502
 
@@ -4004,7 +3506,6 @@ var css4 = `
4004
3506
  flex-direction: column;
4005
3507
  gap: var(--mstar-space-2);
4006
3508
  min-width: 0;
4007
- min-height: 0;
4008
3509
  padding: var(--mstar-space-3);
4009
3510
  border: 1px solid var(--dsw-alias-border-l1);
4010
3511
  border-radius: 8px;
@@ -4038,9 +3539,6 @@ var css4 = `
4038
3539
  margin: 0;
4039
3540
  padding: 0;
4040
3541
  list-style: none;
4041
- flex: 1;
4042
- min-height: 0;
4043
- overflow-y: auto;
4044
3542
  }
4045
3543
 
4046
3544
 
@@ -4235,15 +3733,6 @@ var css4 = `
4235
3733
  .bd3cb6ff_detailValueMissing {
4236
3734
  color: var(--dsw-alias-label-caption);
4237
3735
  }
4238
-
4239
-
4240
-
4241
- @media (max-width: 1200px) {
4242
- .\\38 e395e34_eventLogPage {
4243
- grid-template-columns: 1fr;
4244
- grid-template-rows: minmax(0, 1fr) minmax(0, 1fr);
4245
- }
4246
- }
4247
3736
  `;
4248
3737
  var tagId4 = "@mstar-harness/dsh/event-log.module.css";
4249
3738
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId4) + "]") === null) {
@@ -4256,7 +3745,7 @@ if (typeof document !== "undefined" && document.querySelector("style[data-plugin
4256
3745
  var event_log_module_default = { eventLogPage: "8e395e34_eventLogPage", section: "fcdd0ccc_section", sectionTitle: "aded23ea_sectionTitle", empty: "18a7beee_empty", rowList: "40959323_rowList", eventSummary: "5a6ad2b9_eventSummary", violationSummary: "c5acc9f0_violationSummary", eventDetails: "1e6e6b57_eventDetails", eventRole: "397ccf2b_eventRole", eventStage: "18dd486b_eventStage", eventTarget: "90ce3f22_eventTarget", eventTime: "ae6064ce_eventTime", eventAgent: "ff483c84_eventAgent", eventDuration: "3e37545b_eventDuration", statusChip: "c32c2c65_statusChip", statusDot: "88d97a8a_statusDot", statusDispatched: "d260dfec_statusDispatched", statusAdvisory: "8bbef368_statusAdvisory", statusDenied: "d1f67934_statusDenied", statusOk: "ba35cad1_statusOk", statusError: "819501bf_statusError", statusUnknown: "53c75757_statusUnknown", settledMark: "398c5713_settledMark", settleGlyph: "83e240f0_settleGlyph", unexpectedBadge: "88450335_unexpectedBadge", severityChip: "8f4e5388_severityChip", violationCode: "e42c0bfd_violationCode", violationMessage: "35d5910f_violationMessage", detailBody: "558cab30_detailBody", detailField: "3f8595e8_detailField", detailLabel: "a6812cb2_detailLabel", detailValue: "079e736d_detailValue", detailValueMissing: "bd3cb6ff_detailValueMissing" };
4257
3746
 
4258
3747
  // src/client/panel/pages/EventLogPage.tsx
4259
- var jsx_runtime8 = require("react/jsx-runtime");
3748
+ var jsx_runtime10 = require("react/jsx-runtime");
4260
3749
  function flowStatusLabel(status, t) {
4261
3750
  switch (status) {
4262
3751
  case "dispatched":
@@ -4307,16 +3796,16 @@ function orDash(value) {
4307
3796
  }
4308
3797
  function DetailField({ field, label, value }) {
4309
3798
  const missing = value === "";
4310
- return /* @__PURE__ */ jsx_runtime8.jsxs("div", {
3799
+ return /* @__PURE__ */ jsx_runtime10.jsxs("div", {
4311
3800
  className: event_log_module_default.detailField,
4312
3801
  "data-event-log-field": field,
4313
3802
  "data-event-log-missing": missing ? "true" : "false",
4314
3803
  children: [
4315
- /* @__PURE__ */ jsx_runtime8.jsx("span", {
3804
+ /* @__PURE__ */ jsx_runtime10.jsx("span", {
4316
3805
  className: event_log_module_default.detailLabel,
4317
3806
  children: label
4318
3807
  }),
4319
- /* @__PURE__ */ jsx_runtime8.jsx("span", {
3808
+ /* @__PURE__ */ jsx_runtime10.jsx("span", {
4320
3809
  className: missing ? `${event_log_module_default.detailValue} ${event_log_module_default.detailValueMissing}` : event_log_module_default.detailValue,
4321
3810
  children: missing ? "—" : value
4322
3811
  })
@@ -4328,88 +3817,88 @@ function EventDetailsBody({
4328
3817
  source,
4329
3818
  t
4330
3819
  }) {
4331
- return /* @__PURE__ */ jsx_runtime8.jsxs("div", {
3820
+ return /* @__PURE__ */ jsx_runtime10.jsxs("div", {
4332
3821
  className: event_log_module_default.detailBody,
4333
3822
  "data-event-log-detail-body": true,
4334
3823
  children: [
4335
- /* @__PURE__ */ jsx_runtime8.jsx(DetailField, {
3824
+ /* @__PURE__ */ jsx_runtime10.jsx(DetailField, {
4336
3825
  field: "role",
4337
3826
  label: t("event-log.field.role"),
4338
3827
  value: entry.role
4339
3828
  }),
4340
- /* @__PURE__ */ jsx_runtime8.jsx(DetailField, {
3829
+ /* @__PURE__ */ jsx_runtime10.jsx(DetailField, {
4341
3830
  field: "agent",
4342
3831
  label: t("event-log.field.agent"),
4343
3832
  value: entry.agent
4344
3833
  }),
4345
- /* @__PURE__ */ jsx_runtime8.jsx(DetailField, {
3834
+ /* @__PURE__ */ jsx_runtime10.jsx(DetailField, {
4346
3835
  field: "stage",
4347
3836
  label: t("event-log.field.stage"),
4348
3837
  value: entry.stage
4349
3838
  }),
4350
- /* @__PURE__ */ jsx_runtime8.jsx(DetailField, {
3839
+ /* @__PURE__ */ jsx_runtime10.jsx(DetailField, {
4351
3840
  field: "plan",
4352
3841
  label: t("event-log.field.plan"),
4353
3842
  value: source?.planId ?? ""
4354
3843
  }),
4355
- /* @__PURE__ */ jsx_runtime8.jsx(DetailField, {
3844
+ /* @__PURE__ */ jsx_runtime10.jsx(DetailField, {
4356
3845
  field: "task",
4357
3846
  label: t("event-log.field.task"),
4358
3847
  value: source?.taskId ?? ""
4359
3848
  }),
4360
- /* @__PURE__ */ jsx_runtime8.jsx(DetailField, {
3849
+ /* @__PURE__ */ jsx_runtime10.jsx(DetailField, {
4361
3850
  field: "category",
4362
3851
  label: t("event-log.field.category"),
4363
3852
  value: source?.taskCategory ?? ""
4364
3853
  }),
4365
- /* @__PURE__ */ jsx_runtime8.jsx(DetailField, {
3854
+ /* @__PURE__ */ jsx_runtime10.jsx(DetailField, {
4366
3855
  field: "time",
4367
3856
  label: t("event-log.field.time"),
4368
3857
  value: source === undefined ? "" : formatEventTimeFull(source.ts)
4369
3858
  }),
4370
- /* @__PURE__ */ jsx_runtime8.jsx(DetailField, {
3859
+ /* @__PURE__ */ jsx_runtime10.jsx(DetailField, {
4371
3860
  field: "kind",
4372
3861
  label: t("event-log.field.kind"),
4373
3862
  value: entry.eventKind === "dispatch" ? t("event-log.kind.dispatch") : entry.eventKind === "settle" ? t("event-log.kind.settle") : entry.eventKind
4374
3863
  }),
4375
- /* @__PURE__ */ jsx_runtime8.jsx(DetailField, {
3864
+ /* @__PURE__ */ jsx_runtime10.jsx(DetailField, {
4376
3865
  field: "status",
4377
3866
  label: t("event-log.field.status"),
4378
3867
  value: flowStatusLabel(entry.status, t)
4379
3868
  }),
4380
- /* @__PURE__ */ jsx_runtime8.jsx(DetailField, {
3869
+ /* @__PURE__ */ jsx_runtime10.jsx(DetailField, {
4381
3870
  field: "expected",
4382
3871
  label: t("event-log.field.expected"),
4383
3872
  value: entry.eventKind === "settle" || isWorkflowKind(entry.eventKind) ? "" : entry.expected ? t("event-log.yes") : t("event-log.no")
4384
3873
  }),
4385
- /* @__PURE__ */ jsx_runtime8.jsx(DetailField, {
3874
+ /* @__PURE__ */ jsx_runtime10.jsx(DetailField, {
4386
3875
  field: "settled",
4387
3876
  label: t("event-log.field.settled"),
4388
3877
  value: entry.eventKind === "settle" || isWorkflowKind(entry.eventKind) ? "" : entry.settled ? t("event-log.yes") : t("event-log.no")
4389
3878
  }),
4390
- /* @__PURE__ */ jsx_runtime8.jsx(DetailField, {
3879
+ /* @__PURE__ */ jsx_runtime10.jsx(DetailField, {
4391
3880
  field: "duration",
4392
3881
  label: t("event-log.field.duration"),
4393
3882
  value: entry.durationMs === null ? "" : `${entry.durationMs}ms`
4394
3883
  }),
4395
- isWorkflowKind(entry.eventKind) && /* @__PURE__ */ jsx_runtime8.jsxs(jsx_runtime8.Fragment, {
3884
+ isWorkflowKind(entry.eventKind) && /* @__PURE__ */ jsx_runtime10.jsxs(jsx_runtime10.Fragment, {
4396
3885
  children: [
4397
- /* @__PURE__ */ jsx_runtime8.jsx(DetailField, {
3886
+ /* @__PURE__ */ jsx_runtime10.jsx(DetailField, {
4398
3887
  field: "run-id",
4399
3888
  label: t("event-log.field.run-id"),
4400
3889
  value: source?.runId ?? ""
4401
3890
  }),
4402
- /* @__PURE__ */ jsx_runtime8.jsx(DetailField, {
3891
+ /* @__PURE__ */ jsx_runtime10.jsx(DetailField, {
4403
3892
  field: "name",
4404
3893
  label: t("event-log.field.name"),
4405
3894
  value: entry.name
4406
3895
  }),
4407
- /* @__PURE__ */ jsx_runtime8.jsx(DetailField, {
3896
+ /* @__PURE__ */ jsx_runtime10.jsx(DetailField, {
4408
3897
  field: "members",
4409
3898
  label: t("event-log.field.members"),
4410
3899
  value: source?.memberCount !== undefined ? String(source.memberCount) : ""
4411
3900
  }),
4412
- /* @__PURE__ */ jsx_runtime8.jsx(DetailField, {
3901
+ /* @__PURE__ */ jsx_runtime10.jsx(DetailField, {
4413
3902
  field: "stop-reason",
4414
3903
  label: t("event-log.field.stop-reason"),
4415
3904
  value: source?.stopReason ?? ""
@@ -4426,68 +3915,68 @@ function EventLogEventRow({
4426
3915
  }) {
4427
3916
  const time = formatEventTime(entry.ts);
4428
3917
  const workflowIdentity = isWorkflowKind(entry.eventKind) ? entry.name !== "" ? entry.name : entry.runId !== "" ? entry.runId : "" : "";
4429
- return /* @__PURE__ */ jsx_runtime8.jsx("li", {
3918
+ return /* @__PURE__ */ jsx_runtime10.jsx("li", {
4430
3919
  className: event_log_module_default.eventRow,
4431
3920
  "data-event-log-row-kind": "event",
4432
3921
  "data-event-log-row-id": entry.id,
4433
3922
  "data-event-log-expected": entry.expected ? "true" : "false",
4434
- children: /* @__PURE__ */ jsx_runtime8.jsxs("details", {
3923
+ children: /* @__PURE__ */ jsx_runtime10.jsxs("details", {
4435
3924
  className: event_log_module_default.eventDetails,
4436
3925
  "data-event-log-details": true,
4437
3926
  children: [
4438
- /* @__PURE__ */ jsx_runtime8.jsxs("summary", {
3927
+ /* @__PURE__ */ jsx_runtime10.jsxs("summary", {
4439
3928
  className: event_log_module_default.eventSummary,
4440
3929
  "data-event-log-summary": true,
4441
3930
  children: [
4442
- /* @__PURE__ */ jsx_runtime8.jsx("span", {
3931
+ /* @__PURE__ */ jsx_runtime10.jsx("span", {
4443
3932
  className: event_log_module_default.eventRole,
4444
- children: entry.eventKind === "settle" ? /* @__PURE__ */ jsx_runtime8.jsx("span", {
3933
+ children: entry.eventKind === "settle" ? /* @__PURE__ */ jsx_runtime10.jsx("span", {
4445
3934
  className: event_log_module_default.settleGlyph,
4446
3935
  "aria-hidden": "true",
4447
3936
  children: "✓"
4448
- }) : workflowIdentity !== "" ? /* @__PURE__ */ jsx_runtime8.jsx("span", {
3937
+ }) : workflowIdentity !== "" ? /* @__PURE__ */ jsx_runtime10.jsx("span", {
4449
3938
  "data-event-log-name": workflowIdentity,
4450
3939
  children: workflowIdentity
4451
3940
  }) : entry.role !== "" ? entry.role : t("panel.unknown")
4452
3941
  }),
4453
- entry.stage !== "" && /* @__PURE__ */ jsx_runtime8.jsx("span", {
3942
+ entry.stage !== "" && /* @__PURE__ */ jsx_runtime10.jsx("span", {
4454
3943
  className: event_log_module_default.eventStage,
4455
3944
  "data-event-log-stage": entry.stage,
4456
3945
  children: entry.stage
4457
3946
  }),
4458
- entry.task !== "" && /* @__PURE__ */ jsx_runtime8.jsx("span", {
3947
+ entry.task !== "" && /* @__PURE__ */ jsx_runtime10.jsx("span", {
4459
3948
  className: event_log_module_default.eventTarget,
4460
3949
  "data-event-log-target": entry.task,
4461
3950
  children: entry.task
4462
3951
  }),
4463
- time !== "" && /* @__PURE__ */ jsx_runtime8.jsx("span", {
3952
+ time !== "" && /* @__PURE__ */ jsx_runtime10.jsx("span", {
4464
3953
  className: event_log_module_default.eventTime,
4465
3954
  "data-event-log-time": time,
4466
3955
  children: time
4467
3956
  }),
4468
- /* @__PURE__ */ jsx_runtime8.jsxs("span", {
3957
+ /* @__PURE__ */ jsx_runtime10.jsxs("span", {
4469
3958
  className: `${event_log_module_default.statusChip} ${flowStatusClass(entry.status)}`,
4470
3959
  "data-event-log-status": entry.status,
4471
3960
  children: [
4472
- /* @__PURE__ */ jsx_runtime8.jsx("span", {
3961
+ /* @__PURE__ */ jsx_runtime10.jsx("span", {
4473
3962
  className: event_log_module_default.statusDot,
4474
3963
  "aria-hidden": "true"
4475
3964
  }),
4476
3965
  flowStatusLabel(entry.status, t)
4477
3966
  ]
4478
3967
  }),
4479
- entry.eventKind === "dispatch" && entry.settled && /* @__PURE__ */ jsx_runtime8.jsx("span", {
3968
+ entry.eventKind === "dispatch" && entry.settled && /* @__PURE__ */ jsx_runtime10.jsx("span", {
4480
3969
  className: event_log_module_default.settledMark,
4481
3970
  "data-event-log-settled": "true",
4482
3971
  "aria-hidden": "true",
4483
3972
  children: "✓"
4484
3973
  }),
4485
- entry.agent !== "" && /* @__PURE__ */ jsx_runtime8.jsx("span", {
3974
+ entry.agent !== "" && /* @__PURE__ */ jsx_runtime10.jsx("span", {
4486
3975
  className: event_log_module_default.eventAgent,
4487
3976
  "data-event-log-agent": entry.agent,
4488
3977
  children: entry.agent
4489
3978
  }),
4490
- entry.durationMs !== null && /* @__PURE__ */ jsx_runtime8.jsxs("span", {
3979
+ entry.durationMs !== null && /* @__PURE__ */ jsx_runtime10.jsxs("span", {
4491
3980
  className: event_log_module_default.eventDuration,
4492
3981
  "data-event-log-duration": entry.durationMs,
4493
3982
  children: [
@@ -4495,14 +3984,14 @@ function EventLogEventRow({
4495
3984
  "ms"
4496
3985
  ]
4497
3986
  }),
4498
- entry.eventKind === "dispatch" && !entry.expected && /* @__PURE__ */ jsx_runtime8.jsx("span", {
3987
+ entry.eventKind === "dispatch" && !entry.expected && /* @__PURE__ */ jsx_runtime10.jsx("span", {
4499
3988
  className: event_log_module_default.unexpectedBadge,
4500
3989
  "data-event-log-unexpected": "true",
4501
3990
  children: t("flow.unexpected")
4502
3991
  })
4503
3992
  ]
4504
3993
  }),
4505
- /* @__PURE__ */ jsx_runtime8.jsx(EventDetailsBody, {
3994
+ /* @__PURE__ */ jsx_runtime10.jsx(EventDetailsBody, {
4506
3995
  entry,
4507
3996
  source,
4508
3997
  t
@@ -4513,50 +4002,50 @@ function EventLogEventRow({
4513
4002
  }
4514
4003
  function ViolationRow({ entry, t }) {
4515
4004
  const severity = entry.severity !== "" ? entry.severity : "unknown";
4516
- return /* @__PURE__ */ jsx_runtime8.jsx("li", {
4005
+ return /* @__PURE__ */ jsx_runtime10.jsx("li", {
4517
4006
  className: event_log_module_default.violationRow,
4518
4007
  "data-event-log-row-kind": "violation",
4519
4008
  "data-event-log-row-id": entry.id,
4520
- children: /* @__PURE__ */ jsx_runtime8.jsxs("details", {
4009
+ children: /* @__PURE__ */ jsx_runtime10.jsxs("details", {
4521
4010
  className: event_log_module_default.eventDetails,
4522
4011
  "data-event-log-details": true,
4523
4012
  children: [
4524
- /* @__PURE__ */ jsx_runtime8.jsxs("summary", {
4013
+ /* @__PURE__ */ jsx_runtime10.jsxs("summary", {
4525
4014
  className: event_log_module_default.violationSummary,
4526
4015
  "data-event-log-summary": true,
4527
4016
  children: [
4528
- /* @__PURE__ */ jsx_runtime8.jsx("span", {
4017
+ /* @__PURE__ */ jsx_runtime10.jsx("span", {
4529
4018
  className: event_log_module_default.severityChip,
4530
4019
  "data-event-log-severity": severity,
4531
4020
  children: entry.severity !== "" ? entry.severity : t("panel.unknown")
4532
4021
  }),
4533
- entry.code !== "" && /* @__PURE__ */ jsx_runtime8.jsx("code", {
4022
+ entry.code !== "" && /* @__PURE__ */ jsx_runtime10.jsx("code", {
4534
4023
  className: event_log_module_default.violationCode,
4535
4024
  "data-event-log-code": entry.code,
4536
4025
  children: entry.code
4537
4026
  }),
4538
- /* @__PURE__ */ jsx_runtime8.jsx("span", {
4027
+ /* @__PURE__ */ jsx_runtime10.jsx("span", {
4539
4028
  className: event_log_module_default.violationMessage,
4540
4029
  "data-event-log-message": entry.message,
4541
4030
  children: orDash(entry.message)
4542
4031
  })
4543
4032
  ]
4544
4033
  }),
4545
- /* @__PURE__ */ jsx_runtime8.jsxs("div", {
4034
+ /* @__PURE__ */ jsx_runtime10.jsxs("div", {
4546
4035
  className: event_log_module_default.detailBody,
4547
4036
  "data-event-log-detail-body": true,
4548
4037
  children: [
4549
- /* @__PURE__ */ jsx_runtime8.jsx(DetailField, {
4038
+ /* @__PURE__ */ jsx_runtime10.jsx(DetailField, {
4550
4039
  field: "severity",
4551
4040
  label: t("event-log.field.severity"),
4552
4041
  value: entry.severity
4553
4042
  }),
4554
- /* @__PURE__ */ jsx_runtime8.jsx(DetailField, {
4043
+ /* @__PURE__ */ jsx_runtime10.jsx(DetailField, {
4555
4044
  field: "code",
4556
4045
  label: t("event-log.field.code"),
4557
4046
  value: entry.code
4558
4047
  }),
4559
- /* @__PURE__ */ jsx_runtime8.jsx(DetailField, {
4048
+ /* @__PURE__ */ jsx_runtime10.jsx(DetailField, {
4560
4049
  field: "message",
4561
4050
  label: t("event-log.field.message"),
4562
4051
  value: entry.message
@@ -4573,38 +4062,38 @@ function EventLogPage({ view, t }) {
4573
4062
  const violationEntries = entries.filter((e) => e.kind === "violation");
4574
4063
  const eventById = new Map(view.events.map((event) => [event.id, event]));
4575
4064
  if (eventEntries.length === 0 && violationEntries.length === 0) {
4576
- return /* @__PURE__ */ jsx_runtime8.jsx("div", {
4065
+ return /* @__PURE__ */ jsx_runtime10.jsx("div", {
4577
4066
  className: event_log_module_default.eventLogPage,
4578
4067
  "data-mstar-page": "events",
4579
- children: /* @__PURE__ */ jsx_runtime8.jsx("p", {
4068
+ children: /* @__PURE__ */ jsx_runtime10.jsx("p", {
4580
4069
  className: event_log_module_default.empty,
4581
4070
  "data-event-log-empty": true,
4582
4071
  children: t("event-log.empty")
4583
4072
  })
4584
4073
  });
4585
4074
  }
4586
- return /* @__PURE__ */ jsx_runtime8.jsxs("div", {
4587
- className: event_log_module_default.eventLogPage,
4075
+ return /* @__PURE__ */ jsx_runtime10.jsxs("div", {
4076
+ className: `${event_log_module_default.eventLogPage} ${panel_module_default.groupGrid}`,
4588
4077
  "data-mstar-page": "events",
4589
4078
  children: [
4590
- /* @__PURE__ */ jsx_runtime8.jsxs("section", {
4079
+ /* @__PURE__ */ jsx_runtime10.jsxs("section", {
4591
4080
  className: event_log_module_default.section,
4592
4081
  "data-event-log-section": "events",
4593
4082
  "data-event-log-section-count": eventEntries.length,
4594
4083
  children: [
4595
- /* @__PURE__ */ jsx_runtime8.jsx("h2", {
4084
+ /* @__PURE__ */ jsx_runtime10.jsx("h2", {
4596
4085
  className: event_log_module_default.sectionTitle,
4597
4086
  "data-event-log-section-title": true,
4598
4087
  children: t("event-log.section.events")
4599
4088
  }),
4600
- eventEntries.length === 0 ? /* @__PURE__ */ jsx_runtime8.jsx("p", {
4089
+ eventEntries.length === 0 ? /* @__PURE__ */ jsx_runtime10.jsx("p", {
4601
4090
  className: event_log_module_default.empty,
4602
4091
  "data-event-log-empty-section": "events",
4603
4092
  children: t("event-log.empty.events")
4604
- }) : /* @__PURE__ */ jsx_runtime8.jsx("ul", {
4093
+ }) : /* @__PURE__ */ jsx_runtime10.jsx("ul", {
4605
4094
  className: event_log_module_default.rowList,
4606
4095
  "data-event-log-list": "events",
4607
- children: eventEntries.map((entry) => /* @__PURE__ */ jsx_runtime8.jsx(EventLogEventRow, {
4096
+ children: eventEntries.map((entry) => /* @__PURE__ */ jsx_runtime10.jsx(EventLogEventRow, {
4608
4097
  entry,
4609
4098
  source: eventById.get(entry.id),
4610
4099
  t
@@ -4612,24 +4101,24 @@ function EventLogPage({ view, t }) {
4612
4101
  })
4613
4102
  ]
4614
4103
  }),
4615
- /* @__PURE__ */ jsx_runtime8.jsxs("section", {
4104
+ /* @__PURE__ */ jsx_runtime10.jsxs("section", {
4616
4105
  className: event_log_module_default.section,
4617
4106
  "data-event-log-section": "violations",
4618
4107
  "data-event-log-section-count": violationEntries.length,
4619
4108
  children: [
4620
- /* @__PURE__ */ jsx_runtime8.jsx("h2", {
4109
+ /* @__PURE__ */ jsx_runtime10.jsx("h2", {
4621
4110
  className: event_log_module_default.sectionTitle,
4622
4111
  "data-event-log-section-title": true,
4623
4112
  children: t("event-log.section.violations")
4624
4113
  }),
4625
- violationEntries.length === 0 ? /* @__PURE__ */ jsx_runtime8.jsx("p", {
4114
+ violationEntries.length === 0 ? /* @__PURE__ */ jsx_runtime10.jsx("p", {
4626
4115
  className: event_log_module_default.empty,
4627
4116
  "data-event-log-empty-section": "violations",
4628
4117
  children: t("event-log.empty.violations")
4629
- }) : /* @__PURE__ */ jsx_runtime8.jsx("ul", {
4118
+ }) : /* @__PURE__ */ jsx_runtime10.jsx("ul", {
4630
4119
  className: event_log_module_default.rowList,
4631
4120
  "data-event-log-list": "violations",
4632
- children: violationEntries.map((entry) => /* @__PURE__ */ jsx_runtime8.jsx(ViolationRow, {
4121
+ children: violationEntries.map((entry) => /* @__PURE__ */ jsx_runtime10.jsx(ViolationRow, {
4633
4122
  entry,
4634
4123
  t
4635
4124
  }, entry.id))
@@ -4642,7 +4131,7 @@ function EventLogPage({ view, t }) {
4642
4131
 
4643
4132
  // src/client/panel/zones/TaskBoard.tsx
4644
4133
  var React = __toESM(require("react"));
4645
- var jsx_runtime9 = require("react/jsx-runtime");
4134
+ var jsx_runtime11 = require("react/jsx-runtime");
4646
4135
  var COLUMN_TITLE = {
4647
4136
  Todo: "zone.state.Todo",
4648
4137
  InProgress: "zone.state.InProgress",
@@ -4675,97 +4164,93 @@ function TaskBoard({ view, t }) {
4675
4164
  const empty = view.total === 0;
4676
4165
  const [expanded, setExpanded] = React.useState(new Set);
4677
4166
  const toggle = (id) => setExpanded((prev) => toggleKanbanExpanded(prev, id));
4678
- return /* @__PURE__ */ jsx_runtime9.jsxs("section", {
4167
+ return /* @__PURE__ */ jsx_runtime11.jsxs("section", {
4679
4168
  className: zones_module_default.zone,
4680
4169
  "data-zone": "tasks",
4681
4170
  children: [
4682
- /* @__PURE__ */ jsx_runtime9.jsxs("header", {
4171
+ /* @__PURE__ */ jsx_runtime11.jsxs("header", {
4683
4172
  className: zones_module_default.tasksHeader,
4684
4173
  "data-zone-header": true,
4685
4174
  children: [
4686
- /* @__PURE__ */ jsx_runtime9.jsx("h2", {
4175
+ /* @__PURE__ */ jsx_runtime11.jsx("h2", {
4687
4176
  className: zones_module_default.zoneHeader,
4688
4177
  children: t("zone.tasks.title")
4689
4178
  }),
4690
- /* @__PURE__ */ jsx_runtime9.jsx("span", {
4179
+ /* @__PURE__ */ jsx_runtime11.jsx("span", {
4691
4180
  className: zones_module_default.tasksTotal,
4692
4181
  "data-tasks-total": view.total,
4693
4182
  children: t("zone.tasks.total", { count: String(view.total) })
4694
4183
  })
4695
4184
  ]
4696
4185
  }),
4697
- empty && /* @__PURE__ */ jsx_runtime9.jsx("p", {
4186
+ empty && /* @__PURE__ */ jsx_runtime11.jsx("p", {
4698
4187
  className: zones_module_default.zoneEmpty,
4699
4188
  "data-zone-empty": "no-plans",
4700
4189
  children: t("zone.tasks.no-plans")
4701
4190
  }),
4702
- /* @__PURE__ */ jsx_runtime9.jsx("div", {
4703
- className: zones_module_default.kanban,
4191
+ /* @__PURE__ */ jsx_runtime11.jsx("div", {
4192
+ className: `${zones_module_default.kanban} ${panel_module_default.groupGrid}`,
4704
4193
  "data-mstar-kanban": true,
4705
- children: columns.map((column, i) => {
4706
- const arrow = i > 0 ? leadingArrow(column.id) : null;
4194
+ children: columns.map((column) => {
4195
+ const arrow = leadingArrow(column.id);
4707
4196
  const isExpanded = expanded.has(column.id);
4708
4197
  const shown = visibleKanbanPlans(column, isExpanded);
4709
4198
  const overflow = column.capped === null ? 0 : column.count - column.capped;
4710
- return /* @__PURE__ */ jsx_runtime9.jsxs(React.Fragment, {
4199
+ return /* @__PURE__ */ jsx_runtime11.jsxs("div", {
4200
+ className: zones_module_default.kanbanColumn,
4201
+ "data-kanban-column": column.id,
4711
4202
  children: [
4712
- arrow !== null && /* @__PURE__ */ jsx_runtime9.jsx("span", {
4713
- className: zones_module_default.kanbanArrow,
4714
- "data-kanban-arrow": arrow.label,
4715
- "aria-hidden": "true",
4716
- children: arrow.glyph
4203
+ /* @__PURE__ */ jsx_runtime11.jsxs("header", {
4204
+ className: zones_module_default.kanbanColumnHeader,
4205
+ children: [
4206
+ arrow !== null && /* @__PURE__ */ jsx_runtime11.jsx("span", {
4207
+ className: zones_module_default.kanbanArrow,
4208
+ "data-kanban-arrow": arrow.label,
4209
+ "aria-hidden": "true",
4210
+ children: arrow.glyph
4211
+ }),
4212
+ /* @__PURE__ */ jsx_runtime11.jsx("span", {
4213
+ className: zones_module_default.kanbanColumnTitle,
4214
+ children: t(COLUMN_TITLE[column.id])
4215
+ }),
4216
+ /* @__PURE__ */ jsx_runtime11.jsx("span", {
4217
+ className: zones_module_default.kanbanCount,
4218
+ "data-kanban-count": column.count,
4219
+ children: column.count
4220
+ })
4221
+ ]
4717
4222
  }),
4718
- /* @__PURE__ */ jsx_runtime9.jsxs("div", {
4719
- className: zones_module_default.kanbanColumn,
4720
- "data-kanban-column": column.id,
4223
+ /* @__PURE__ */ jsx_runtime11.jsxs("ul", {
4224
+ className: zones_module_default.kanbanCards,
4225
+ id: `kanban-cards-${column.id}`,
4721
4226
  children: [
4722
- /* @__PURE__ */ jsx_runtime9.jsxs("header", {
4723
- className: zones_module_default.kanbanColumnHeader,
4227
+ shown.map((plan, j) => /* @__PURE__ */ jsx_runtime11.jsxs("li", {
4228
+ className: zones_module_default.planCard,
4229
+ "data-plan-id": plan.id,
4230
+ "data-plan-status": plan.status,
4724
4231
  children: [
4725
- /* @__PURE__ */ jsx_runtime9.jsx("span", {
4726
- className: zones_module_default.kanbanColumnTitle,
4727
- children: t(COLUMN_TITLE[column.id])
4232
+ /* @__PURE__ */ jsx_runtime11.jsx("code", {
4233
+ className: zones_module_default.planCardId,
4234
+ children: plan.id
4728
4235
  }),
4729
- /* @__PURE__ */ jsx_runtime9.jsx("span", {
4730
- className: zones_module_default.kanbanCount,
4731
- "data-kanban-count": column.count,
4732
- children: column.count
4733
- })
4734
- ]
4735
- }),
4736
- /* @__PURE__ */ jsx_runtime9.jsxs("ul", {
4737
- className: zones_module_default.kanbanCards,
4738
- id: `kanban-cards-${column.id}`,
4739
- children: [
4740
- shown.map((plan, j) => /* @__PURE__ */ jsx_runtime9.jsxs("li", {
4741
- className: zones_module_default.planCard,
4742
- "data-plan-id": plan.id,
4743
- "data-plan-status": plan.status,
4744
- children: [
4745
- /* @__PURE__ */ jsx_runtime9.jsx("code", {
4746
- className: zones_module_default.planCardId,
4747
- children: plan.id
4748
- }),
4749
- /* @__PURE__ */ jsx_runtime9.jsx("span", {
4750
- className: zones_module_default.planCardStatus,
4751
- "data-status": plan.status,
4752
- children: plan.status
4753
- })
4754
- ]
4755
- }, plan.id === "" ? `card-${j}` : plan.id)),
4756
- overflow > 0 && /* @__PURE__ */ jsx_runtime9.jsx("li", {
4757
- className: zones_module_default.kanbanMore,
4758
- children: /* @__PURE__ */ jsx_runtime9.jsx("button", {
4759
- type: "button",
4760
- className: zones_module_default.kanbanMoreButton,
4761
- "data-kanban-more": isExpanded ? "collapse" : "expand",
4762
- "aria-expanded": isExpanded,
4763
- "aria-controls": `kanban-cards-${column.id}`,
4764
- onClick: () => toggle(column.id),
4765
- children: isExpanded ? t("zone.tasks.collapse") : t("zone.tasks.more", { count: String(overflow) })
4766
- })
4236
+ /* @__PURE__ */ jsx_runtime11.jsx("span", {
4237
+ className: zones_module_default.planCardStatus,
4238
+ "data-status": plan.status,
4239
+ children: plan.status
4767
4240
  })
4768
4241
  ]
4242
+ }, plan.id === "" ? `card-${j}` : plan.id)),
4243
+ overflow > 0 && /* @__PURE__ */ jsx_runtime11.jsx("li", {
4244
+ className: zones_module_default.kanbanMore,
4245
+ children: /* @__PURE__ */ jsx_runtime11.jsx("button", {
4246
+ type: "button",
4247
+ className: zones_module_default.kanbanMoreButton,
4248
+ "data-kanban-more": isExpanded ? "collapse" : "expand",
4249
+ "aria-expanded": isExpanded,
4250
+ "aria-controls": `kanban-cards-${column.id}`,
4251
+ onClick: () => toggle(column.id),
4252
+ children: isExpanded ? t("zone.tasks.collapse") : t("zone.tasks.more", { count: String(overflow) })
4253
+ })
4769
4254
  })
4770
4255
  ]
4771
4256
  })
@@ -4778,64 +4263,64 @@ function TaskBoard({ view, t }) {
4778
4263
  }
4779
4264
 
4780
4265
  // src/client/panel/zones/ProjectRollup.tsx
4781
- var jsx_runtime10 = require("react/jsx-runtime");
4266
+ var jsx_runtime12 = require("react/jsx-runtime");
4782
4267
  function ProjectRollup({ view, t }) {
4783
4268
  const { milestones, openResiduals } = view;
4784
- return /* @__PURE__ */ jsx_runtime10.jsxs("section", {
4269
+ return /* @__PURE__ */ jsx_runtime12.jsxs("section", {
4785
4270
  className: zones_module_default.zone,
4786
4271
  "data-zone": "project",
4787
4272
  children: [
4788
- /* @__PURE__ */ jsx_runtime10.jsx("header", {
4273
+ /* @__PURE__ */ jsx_runtime12.jsx("header", {
4789
4274
  className: zones_module_default.tasksHeader,
4790
4275
  "data-zone-header": true,
4791
- children: /* @__PURE__ */ jsx_runtime10.jsx("h2", {
4276
+ children: /* @__PURE__ */ jsx_runtime12.jsx("h2", {
4792
4277
  className: zones_module_default.zoneHeader,
4793
4278
  children: t("zone.project.title")
4794
4279
  })
4795
4280
  }),
4796
- /* @__PURE__ */ jsx_runtime10.jsx("h3", {
4281
+ /* @__PURE__ */ jsx_runtime12.jsx("h3", {
4797
4282
  className: zones_module_default.zoneTitle,
4798
4283
  "data-project-milestones-title": true,
4799
4284
  children: t("zone.project.milestones")
4800
4285
  }),
4801
- milestones.length === 0 ? /* @__PURE__ */ jsx_runtime10.jsx("p", {
4286
+ milestones.length === 0 ? /* @__PURE__ */ jsx_runtime12.jsx("p", {
4802
4287
  className: zones_module_default.zoneEmpty,
4803
4288
  "data-mstar-empty": "no-milestones",
4804
4289
  children: t("zone.project.none")
4805
- }) : /* @__PURE__ */ jsx_runtime10.jsx("ul", {
4290
+ }) : /* @__PURE__ */ jsx_runtime12.jsx("ul", {
4806
4291
  className: zones_module_default.rollupList,
4807
4292
  "data-project-milestones": true,
4808
- children: milestones.map((milestone, i) => /* @__PURE__ */ jsx_runtime10.jsx("li", {
4293
+ children: milestones.map((milestone, i) => /* @__PURE__ */ jsx_runtime12.jsx("li", {
4809
4294
  className: zones_module_default.rollupItem,
4810
4295
  "data-project-milestone": true,
4811
- children: /* @__PURE__ */ jsx_runtime10.jsx("span", {
4296
+ children: /* @__PURE__ */ jsx_runtime12.jsx("span", {
4812
4297
  className: zones_module_default.rollupMilestone,
4813
4298
  children: milestone
4814
4299
  })
4815
4300
  }, `${milestone}-${i}`))
4816
4301
  }),
4817
- /* @__PURE__ */ jsx_runtime10.jsx("h3", {
4302
+ /* @__PURE__ */ jsx_runtime12.jsx("h3", {
4818
4303
  className: zones_module_default.zoneTitle,
4819
4304
  "data-project-residuals-title": true,
4820
4305
  children: t("zone.project.residuals")
4821
4306
  }),
4822
- openResiduals.length === 0 ? /* @__PURE__ */ jsx_runtime10.jsx("p", {
4307
+ openResiduals.length === 0 ? /* @__PURE__ */ jsx_runtime12.jsx("p", {
4823
4308
  className: zones_module_default.zoneEmpty,
4824
4309
  "data-mstar-empty": "no-project-residuals",
4825
4310
  children: t("zone.project.none")
4826
- }) : /* @__PURE__ */ jsx_runtime10.jsx("ul", {
4311
+ }) : /* @__PURE__ */ jsx_runtime12.jsx("ul", {
4827
4312
  className: zones_module_default.rollupList,
4828
4313
  "data-project-residuals": true,
4829
- children: openResiduals.map((row, i) => /* @__PURE__ */ jsx_runtime10.jsxs("li", {
4314
+ children: openResiduals.map((row, i) => /* @__PURE__ */ jsx_runtime12.jsxs("li", {
4830
4315
  className: zones_module_default.rollupItem,
4831
4316
  "data-project-residual": true,
4832
4317
  children: [
4833
- /* @__PURE__ */ jsx_runtime10.jsx("span", {
4318
+ /* @__PURE__ */ jsx_runtime12.jsx("span", {
4834
4319
  className: zones_module_default.severityChip,
4835
4320
  "data-severity": row.severity,
4836
4321
  children: row.severity
4837
4322
  }),
4838
- /* @__PURE__ */ jsx_runtime10.jsx("span", {
4323
+ /* @__PURE__ */ jsx_runtime12.jsx("span", {
4839
4324
  className: zones_module_default.rollupCount,
4840
4325
  "data-project-residual-count": row.count,
4841
4326
  children: row.count
@@ -4848,25 +4333,24 @@ function ProjectRollup({ view, t }) {
4848
4333
  }
4849
4334
 
4850
4335
  // src/client/panel/pages/IterationTaskPage.tsx
4851
- var jsx_runtime11 = require("react/jsx-runtime");
4336
+ var jsx_runtime13 = require("react/jsx-runtime");
4852
4337
  function IterationTaskPage({ view, t }) {
4853
- return /* @__PURE__ */ jsx_runtime11.jsxs("div", {
4338
+ return /* @__PURE__ */ jsx_runtime13.jsxs("div", {
4854
4339
  className: panel_module_default.iterationPage,
4855
4340
  "data-mstar-page": "tasks",
4856
4341
  children: [
4857
- /* @__PURE__ */ jsx_runtime11.jsx(IterationInfoSection, {
4342
+ /* @__PURE__ */ jsx_runtime13.jsx(IterationInfoSection, {
4858
4343
  iteration: view.iteration,
4859
4344
  t
4860
4345
  }),
4861
- /* @__PURE__ */ jsx_runtime11.jsxs("div", {
4346
+ /* @__PURE__ */ jsx_runtime13.jsxs("div", {
4862
4347
  className: panel_module_default.iterationTasks,
4863
- "data-mstar-tasks-scroll": true,
4864
4348
  children: [
4865
- /* @__PURE__ */ jsx_runtime11.jsx(TaskBoard, {
4349
+ /* @__PURE__ */ jsx_runtime13.jsx(TaskBoard, {
4866
4350
  view: view.tasks,
4867
4351
  t
4868
4352
  }),
4869
- /* @__PURE__ */ jsx_runtime11.jsx(ProjectRollup, {
4353
+ /* @__PURE__ */ jsx_runtime13.jsx(ProjectRollup, {
4870
4354
  view: view.project,
4871
4355
  t
4872
4356
  })
@@ -4881,14 +4365,17 @@ var import_react3 = require("react");
4881
4365
  var EMPTY_SNAPSHOT = { entries: new Map };
4882
4366
  var NO_SUBSCRIBE = () => () => {};
4883
4367
  var readEmptySnapshot = () => EMPTY_SNAPSHOT;
4368
+ var ANCHOR_PLUGIN = "mstar-engine";
4369
+ var LEGACY_ANCHOR_PLUGIN = "mstar-engine-status";
4884
4370
  function latestEngineStatusRow(nodes) {
4885
4371
  for (let i = nodes.length - 1;i >= 0; i--) {
4886
4372
  const node = nodes[i];
4887
4373
  if (node.kind !== "context" || node.form !== "catalog")
4888
4374
  continue;
4889
4375
  const source = node.source;
4890
- if (source?.kind === "plugin" && source.plugin === "mstar-engine-status")
4376
+ if (source?.kind === "plugin" && (source.plugin === ANCHOR_PLUGIN || source.plugin === LEGACY_ANCHOR_PLUGIN)) {
4891
4377
  return node;
4378
+ }
4892
4379
  }
4893
4380
  return null;
4894
4381
  }
@@ -4954,39 +4441,45 @@ function useMstarEngineStatus(seats) {
4954
4441
  }
4955
4442
 
4956
4443
  // src/client/panel/PanelView.tsx
4957
- var jsx_runtime12 = require("react/jsx-runtime");
4444
+ var jsx_runtime14 = require("react/jsx-runtime");
4958
4445
  function formatSnapshotTime(at) {
4959
4446
  const ms = Date.parse(at);
4960
4447
  return Number.isNaN(ms) ? null : new Date(ms).toLocaleTimeString("en-GB");
4961
4448
  }
4962
- function PanelContent({ tab, source, t }) {
4963
- if (tab === "agents") {
4964
- const view = projectGraph(source);
4965
- return /* @__PURE__ */ jsx_runtime12.jsx(AgentCanvasPage, {
4449
+ function PanelContent({ section, source, t }) {
4450
+ const view = React2.useMemo(() => projectGraph(source), [source]);
4451
+ if (section === "agents") {
4452
+ return /* @__PURE__ */ jsx_runtime14.jsx(AgentListPage, {
4966
4453
  view: view.agents,
4967
4454
  iteration: view.iteration,
4968
4455
  t
4969
4456
  });
4970
4457
  }
4971
- if (tab === "events")
4972
- return /* @__PURE__ */ jsx_runtime12.jsx(EventLogPage, {
4973
- view: projectGraph(source),
4458
+ if (section === "events")
4459
+ return /* @__PURE__ */ jsx_runtime14.jsx(EventLogPage, {
4460
+ view,
4974
4461
  t
4975
4462
  });
4976
- return /* @__PURE__ */ jsx_runtime12.jsx(IterationTaskPage, {
4977
- view: projectGraph(source),
4463
+ return /* @__PURE__ */ jsx_runtime14.jsx(IterationTaskPage, {
4464
+ view,
4978
4465
  t
4979
4466
  });
4980
4467
  }
4981
- function PanelView({ t, useChat, useSessions, sessionId, engineStatus }) {
4468
+ function PanelView({ t, useChat, useSessions, sessionId, engineStatus, useTabInfo, useStore, actions }) {
4982
4469
  const view = useMstarEngineStatus({ useChat, useSessions, sessionId, engineStatus });
4983
- const [tab, setTab] = import_react4.useState("tasks");
4470
+ const tabInfo = useTabInfo();
4471
+ const tabId = tabInfo.tab.id;
4472
+ const section = useStore((s) => s.byTab[tabId]) ?? "tasks";
4473
+ if (!tabInfo.tab.visible)
4474
+ return null;
4475
+ const selectSection = (next) => {
4476
+ actions.select(tabId, next);
4477
+ };
4984
4478
  if (view.state === "waiting") {
4985
- return /* @__PURE__ */ jsx_runtime12.jsx("div", {
4479
+ return /* @__PURE__ */ jsx_runtime14.jsx("div", {
4986
4480
  className: panel_module_default.emptyRoot,
4987
4481
  "data-mstar-panel": "waiting",
4988
- "data-conversation-composer-overlay": "",
4989
- children: /* @__PURE__ */ jsx_runtime12.jsx("p", {
4482
+ children: /* @__PURE__ */ jsx_runtime14.jsx("p", {
4990
4483
  className: panel_module_default.empty,
4991
4484
  "data-mstar-empty": "waiting",
4992
4485
  children: t("empty.waiting")
@@ -4994,11 +4487,10 @@ function PanelView({ t, useChat, useSessions, sessionId, engineStatus }) {
4994
4487
  });
4995
4488
  }
4996
4489
  if (view.state === "loading") {
4997
- return /* @__PURE__ */ jsx_runtime12.jsx("div", {
4490
+ return /* @__PURE__ */ jsx_runtime14.jsx("div", {
4998
4491
  className: panel_module_default.emptyRoot,
4999
4492
  "data-mstar-panel": "loading",
5000
- "data-conversation-composer-overlay": "",
5001
- children: /* @__PURE__ */ jsx_runtime12.jsx("p", {
4493
+ children: /* @__PURE__ */ jsx_runtime14.jsx("p", {
5002
4494
  className: panel_module_default.empty,
5003
4495
  "data-mstar-empty": "loading",
5004
4496
  children: t("empty.loading")
@@ -5006,11 +4498,10 @@ function PanelView({ t, useChat, useSessions, sessionId, engineStatus }) {
5006
4498
  });
5007
4499
  }
5008
4500
  if (view.state === "unavailable") {
5009
- return /* @__PURE__ */ jsx_runtime12.jsx("div", {
4501
+ return /* @__PURE__ */ jsx_runtime14.jsx("div", {
5010
4502
  className: panel_module_default.emptyRoot,
5011
4503
  "data-mstar-panel": "unavailable",
5012
- "data-conversation-composer-overlay": "",
5013
- children: /* @__PURE__ */ jsx_runtime12.jsx("p", {
4504
+ children: /* @__PURE__ */ jsx_runtime14.jsx("p", {
5014
4505
  className: panel_module_default.empty,
5015
4506
  "data-mstar-empty": "unavailable",
5016
4507
  "data-mstar-unavailable-reason": view.reason,
@@ -5021,34 +4512,34 @@ function PanelView({ t, useChat, useSessions, sessionId, engineStatus }) {
5021
4512
  const source = view.payload;
5022
4513
  const snapshotTime = formatSnapshotTime(view.at);
5023
4514
  const noHarness = source.harnessDir === null && source.state === null && source.iteration == null;
5024
- const freshness = /* @__PURE__ */ jsx_runtime12.jsxs("footer", {
4515
+ const freshness = /* @__PURE__ */ jsx_runtime14.jsxs("footer", {
5025
4516
  className: panel_module_default.freshness,
5026
4517
  "data-mstar-freshness": true,
5027
4518
  children: [
5028
- snapshotTime === null ? null : /* @__PURE__ */ jsx_runtime12.jsx("span", {
4519
+ snapshotTime === null ? null : /* @__PURE__ */ jsx_runtime14.jsx("span", {
5029
4520
  "data-mstar-freshness-at": view.at,
5030
4521
  "data-mstar-freshness-turn": String(view.turn),
5031
4522
  children: t("freshness.last-updated", { time: snapshotTime, turn: String(view.turn) })
5032
4523
  }),
5033
- /* @__PURE__ */ jsx_runtime12.jsx("span", {
4524
+ /* @__PURE__ */ jsx_runtime14.jsx("span", {
5034
4525
  children: t("freshness.refresh-note")
5035
4526
  })
5036
4527
  ]
5037
4528
  });
5038
4529
  if (noHarness) {
5039
- return /* @__PURE__ */ jsx_runtime12.jsx("div", {
4530
+ return /* @__PURE__ */ jsx_runtime14.jsx("div", {
5040
4531
  className: panel_module_default.root,
5041
4532
  "data-mstar-panel": "no-harness",
5042
- "data-conversation-composer-overlay": "",
5043
- children: /* @__PURE__ */ jsx_runtime12.jsxs("main", {
5044
- className: panel_module_default.main,
4533
+ children: /* @__PURE__ */ jsx_runtime14.jsxs("div", {
4534
+ className: panel_module_default.scroll,
4535
+ "data-mstar-scroll": true,
5045
4536
  "data-mstar-graph": true,
5046
4537
  children: [
5047
- /* @__PURE__ */ jsx_runtime12.jsxs("div", {
4538
+ /* @__PURE__ */ jsx_runtime14.jsxs("div", {
5048
4539
  className: panel_module_default.noHarnessCard,
5049
4540
  "data-mstar-empty-card": true,
5050
4541
  children: [
5051
- /* @__PURE__ */ jsx_runtime12.jsxs("svg", {
4542
+ /* @__PURE__ */ jsx_runtime14.jsxs("svg", {
5052
4543
  className: panel_module_default.noHarnessIcon,
5053
4544
  "data-mstar-empty-icon": true,
5054
4545
  width: "32",
@@ -5061,25 +4552,25 @@ function PanelView({ t, useChat, useSessions, sessionId, engineStatus }) {
5061
4552
  strokeLinejoin: "round",
5062
4553
  "aria-hidden": "true",
5063
4554
  children: [
5064
- /* @__PURE__ */ jsx_runtime12.jsx("path", {
4555
+ /* @__PURE__ */ jsx_runtime14.jsx("path", {
5065
4556
  d: "M3 7a2 2 0 0 1 2-2h4l2 2h8a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"
5066
4557
  }),
5067
- /* @__PURE__ */ jsx_runtime12.jsx("path", {
4558
+ /* @__PURE__ */ jsx_runtime14.jsx("path", {
5068
4559
  d: "M9.7 9.4a2.4 2.4 0 1 1 3.4 2.2c-.7.3-1 .8-1 1.5"
5069
4560
  }),
5070
- /* @__PURE__ */ jsx_runtime12.jsx("circle", {
4561
+ /* @__PURE__ */ jsx_runtime14.jsx("circle", {
5071
4562
  cx: "12",
5072
4563
  cy: "16.4",
5073
4564
  r: "0.6"
5074
4565
  })
5075
4566
  ]
5076
4567
  }),
5077
- /* @__PURE__ */ jsx_runtime12.jsx("p", {
4568
+ /* @__PURE__ */ jsx_runtime14.jsx("p", {
5078
4569
  className: panel_module_default.noHarnessTitle,
5079
4570
  "data-mstar-empty": "no-harness",
5080
4571
  children: t("empty.no-harness")
5081
4572
  }),
5082
- /* @__PURE__ */ jsx_runtime12.jsx("p", {
4573
+ /* @__PURE__ */ jsx_runtime14.jsx("p", {
5083
4574
  className: panel_module_default.noHarnessHint,
5084
4575
  children: t("empty.no-harness-hint")
5085
4576
  })
@@ -5090,34 +4581,35 @@ function PanelView({ t, useChat, useSessions, sessionId, engineStatus }) {
5090
4581
  })
5091
4582
  });
5092
4583
  }
5093
- return /* @__PURE__ */ jsx_runtime12.jsxs("div", {
4584
+ return /* @__PURE__ */ jsx_runtime14.jsxs("div", {
5094
4585
  className: panel_module_default.root,
5095
4586
  "data-mstar-panel": "panel",
5096
- "data-conversation-composer-overlay": "",
5097
4587
  children: [
5098
- /* @__PURE__ */ jsx_runtime12.jsxs("main", {
5099
- className: panel_module_default.main,
4588
+ /* @__PURE__ */ jsx_runtime14.jsx(TabNav, {
4589
+ active: section,
4590
+ onChange: selectSection,
4591
+ t
4592
+ }),
4593
+ /* @__PURE__ */ jsx_runtime14.jsxs("div", {
4594
+ className: panel_module_default.scroll,
4595
+ "data-mstar-scroll": true,
4596
+ "data-mstar-graph": true,
5100
4597
  children: [
5101
- /* @__PURE__ */ jsx_runtime12.jsx(TabNav, {
5102
- active: tab,
5103
- onChange: setTab,
4598
+ /* @__PURE__ */ jsx_runtime14.jsx(PanelContent, {
4599
+ section,
4600
+ source,
5104
4601
  t
5105
4602
  }),
5106
- /* @__PURE__ */ jsx_runtime12.jsx("div", {
5107
- className: panel_module_default.content,
5108
- "data-mstar-graph": true,
5109
- children: /* @__PURE__ */ jsx_runtime12.jsx(PanelContent, {
5110
- tab,
5111
- source,
5112
- t
5113
- })
4603
+ /* @__PURE__ */ jsx_runtime14.jsx(Sidebar, {
4604
+ t,
4605
+ state: source.state,
4606
+ source
5114
4607
  }),
5115
4608
  freshness
5116
4609
  ]
5117
4610
  }),
5118
- /* @__PURE__ */ jsx_runtime12.jsx(Sidebar, {
4611
+ /* @__PURE__ */ jsx_runtime14.jsx(PanelMeta, {
5119
4612
  t,
5120
- state: source.state,
5121
4613
  source
5122
4614
  })
5123
4615
  ]
@@ -5125,18 +4617,24 @@ function PanelView({ t, useChat, useSessions, sessionId, engineStatus }) {
5125
4617
  }
5126
4618
 
5127
4619
  // src/client/index.ts
5128
- var inject = ["slots", "sessions", "locale", "connection"];
4620
+ var inject = ["slots", "sessions", "locale", "connection", "sidebarRightTabs"];
5129
4621
  function apply(ctx) {
5130
4622
  const engineStatus = new MstarEngineStatusClient(ctx.connection);
5131
4623
  ctx.effect(() => () => engineStatus.dispose(), "ui-mstar-panel: engine-status client");
4624
+ const t = ctx.locale.bind(NS);
5132
4625
  ctx.effect(() => ctx.locale.register(NS, { zh, en }), "ui-mstar-panel: dictionaries");
5133
- ctx.slots.inject("conversation.view", () => ctx.slots.register({
5134
- name: "conversation.view",
5135
- id: "mstar-workflow",
5136
- order: 20,
5137
- label: () => ctx.locale.bind(NS)("view.mstar-workflow"),
5138
- locale: NS
5139
- }, (props) => PanelView({ ...props, engineStatus })));
4626
+ ctx.effect(() => ctx.sidebarRightTabs.register(mstarPanelDefinition(t)), "ui-mstar-panel: tab type");
4627
+ const panelStore = createPanelStore();
4628
+ ctx.effect(() => ctx.slots.inject("sidebar.right.pane.tab", () => ctx.slots.register({
4629
+ name: "sidebar.right.pane.tab",
4630
+ key: MSTAR_PANEL_ID,
4631
+ locale: NS,
4632
+ store: panelStore
4633
+ }, (props) => PanelView({ ...props, engineStatus }))), "ui-mstar-panel: panel body");
4634
+ ctx.effect(() => ctx.slots.inject("sidebar.right.pane.tab.title", () => ctx.slots.register({
4635
+ name: "sidebar.right.pane.tab.title",
4636
+ key: MSTAR_PANEL_ID
4637
+ }, MstarPanelTitle)), "ui-mstar-panel: panel chip title");
5140
4638
  }
5141
4639
 
5142
4640
  return module.exports; } });