botmux 2.106.0 → 2.107.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (182) hide show
  1. package/dist/bot-registry.d.ts +25 -0
  2. package/dist/bot-registry.d.ts.map +1 -1
  3. package/dist/bot-registry.js +6 -0
  4. package/dist/bot-registry.js.map +1 -1
  5. package/dist/core/command-handler.d.ts.map +1 -1
  6. package/dist/core/command-handler.js +5 -0
  7. package/dist/core/command-handler.js.map +1 -1
  8. package/dist/core/dashboard-ipc-server.d.ts.map +1 -1
  9. package/dist/core/dashboard-ipc-server.js +27 -1
  10. package/dist/core/dashboard-ipc-server.js.map +1 -1
  11. package/dist/core/dashboard-rows.d.ts +6 -0
  12. package/dist/core/dashboard-rows.d.ts.map +1 -1
  13. package/dist/core/dashboard-rows.js +25 -0
  14. package/dist/core/dashboard-rows.js.map +1 -1
  15. package/dist/core/pending-response.d.ts +1 -0
  16. package/dist/core/pending-response.d.ts.map +1 -1
  17. package/dist/core/pending-response.js +1 -0
  18. package/dist/core/pending-response.js.map +1 -1
  19. package/dist/core/resource-monitor/attribution.d.ts +70 -0
  20. package/dist/core/resource-monitor/attribution.d.ts.map +1 -0
  21. package/dist/core/resource-monitor/attribution.js +222 -0
  22. package/dist/core/resource-monitor/attribution.js.map +1 -0
  23. package/dist/core/resource-monitor/procfs.d.ts +22 -0
  24. package/dist/core/resource-monitor/procfs.d.ts.map +1 -0
  25. package/dist/core/resource-monitor/procfs.js +134 -0
  26. package/dist/core/resource-monitor/procfs.js.map +1 -0
  27. package/dist/core/resource-monitor/ring-buffer.d.ts +15 -0
  28. package/dist/core/resource-monitor/ring-buffer.d.ts.map +1 -0
  29. package/dist/core/resource-monitor/ring-buffer.js +61 -0
  30. package/dist/core/resource-monitor/ring-buffer.js.map +1 -0
  31. package/dist/core/resource-monitor/runtime.d.ts +31 -0
  32. package/dist/core/resource-monitor/runtime.d.ts.map +1 -0
  33. package/dist/core/resource-monitor/runtime.js +92 -0
  34. package/dist/core/resource-monitor/runtime.js.map +1 -0
  35. package/dist/core/resource-monitor/top-selector.d.ts +18 -0
  36. package/dist/core/resource-monitor/top-selector.d.ts.map +1 -0
  37. package/dist/core/resource-monitor/top-selector.js +57 -0
  38. package/dist/core/resource-monitor/top-selector.js.map +1 -0
  39. package/dist/core/resource-monitor/types.d.ts +181 -0
  40. package/dist/core/resource-monitor/types.d.ts.map +1 -0
  41. package/dist/core/resource-monitor/types.js +2 -0
  42. package/dist/core/resource-monitor/types.js.map +1 -0
  43. package/dist/core/session-manager.d.ts +3 -1
  44. package/dist/core/session-manager.d.ts.map +1 -1
  45. package/dist/core/session-manager.js +31 -1
  46. package/dist/core/session-manager.js.map +1 -1
  47. package/dist/core/types.d.ts +1 -0
  48. package/dist/core/types.d.ts.map +1 -1
  49. package/dist/core/types.js.map +1 -1
  50. package/dist/daemon.d.ts +1 -1
  51. package/dist/daemon.d.ts.map +1 -1
  52. package/dist/daemon.js +44 -22
  53. package/dist/daemon.js.map +1 -1
  54. package/dist/dashboard/bot-payload.d.ts +1 -0
  55. package/dist/dashboard/bot-payload.d.ts.map +1 -1
  56. package/dist/dashboard/bot-payload.js +1 -0
  57. package/dist/dashboard/bot-payload.js.map +1 -1
  58. package/dist/dashboard/resource-monitor-service.d.ts +56 -0
  59. package/dist/dashboard/resource-monitor-service.d.ts.map +1 -0
  60. package/dist/dashboard/resource-monitor-service.js +446 -0
  61. package/dist/dashboard/resource-monitor-service.js.map +1 -0
  62. package/dist/dashboard/web/bot-defaults.d.ts.map +1 -1
  63. package/dist/dashboard/web/bot-defaults.js +160 -1
  64. package/dist/dashboard/web/bot-defaults.js.map +1 -1
  65. package/dist/dashboard/web/dashboard-routes.d.ts.map +1 -1
  66. package/dist/dashboard/web/dashboard-routes.js +18 -0
  67. package/dist/dashboard/web/dashboard-routes.js.map +1 -1
  68. package/dist/dashboard/web/i18n.d.ts.map +1 -1
  69. package/dist/dashboard/web/i18n.js +274 -2
  70. package/dist/dashboard/web/i18n.js.map +1 -1
  71. package/dist/dashboard/web/monitor-room-store.d.ts +20 -0
  72. package/dist/dashboard/web/monitor-room-store.d.ts.map +1 -0
  73. package/dist/dashboard/web/monitor-room-store.js +80 -0
  74. package/dist/dashboard/web/monitor-room-store.js.map +1 -0
  75. package/dist/dashboard/web/monitor-room.d.ts +31 -0
  76. package/dist/dashboard/web/monitor-room.d.ts.map +1 -0
  77. package/dist/dashboard/web/monitor-room.js +393 -0
  78. package/dist/dashboard/web/monitor-room.js.map +1 -0
  79. package/dist/dashboard/web/monitoring-page.d.ts +155 -0
  80. package/dist/dashboard/web/monitoring-page.d.ts.map +1 -0
  81. package/dist/dashboard/web/monitoring-page.js +189 -0
  82. package/dist/dashboard/web/monitoring-page.js.map +1 -0
  83. package/dist/dashboard/web/overview-page.d.ts.map +1 -1
  84. package/dist/dashboard/web/overview-page.js +108 -1
  85. package/dist/dashboard/web/overview-page.js.map +1 -1
  86. package/dist/dashboard/web/preferences.d.ts +3 -0
  87. package/dist/dashboard/web/preferences.d.ts.map +1 -1
  88. package/dist/dashboard/web/preferences.js +18 -0
  89. package/dist/dashboard/web/preferences.js.map +1 -1
  90. package/dist/dashboard/web/session-terminal.d.ts +7 -0
  91. package/dist/dashboard/web/session-terminal.d.ts.map +1 -0
  92. package/dist/dashboard/web/session-terminal.js +17 -0
  93. package/dist/dashboard/web/session-terminal.js.map +1 -0
  94. package/dist/dashboard/web/sessions-page.d.ts.map +1 -1
  95. package/dist/dashboard/web/sessions-page.js +2 -1
  96. package/dist/dashboard/web/sessions-page.js.map +1 -1
  97. package/dist/dashboard/web/sessions.d.ts +4 -0
  98. package/dist/dashboard/web/sessions.d.ts.map +1 -1
  99. package/dist/dashboard/web/sessions.js +98 -17
  100. package/dist/dashboard/web/sessions.js.map +1 -1
  101. package/dist/dashboard/web/skills-page.js +1 -1
  102. package/dist/dashboard/web/skills-page.js.map +1 -1
  103. package/dist/dashboard/web/substitute-targets.d.ts +30 -0
  104. package/dist/dashboard/web/substitute-targets.d.ts.map +1 -0
  105. package/dist/dashboard/web/substitute-targets.js +99 -0
  106. package/dist/dashboard/web/substitute-targets.js.map +1 -0
  107. package/dist/dashboard/web/ui.d.ts +1 -1
  108. package/dist/dashboard/web/ui.d.ts.map +1 -1
  109. package/dist/dashboard/web/ui.js +4 -1
  110. package/dist/dashboard/web/ui.js.map +1 -1
  111. package/dist/dashboard-web/app.js +3 -3
  112. package/dist/dashboard-web/chunks/bot-defaults-page-OCIHPGEU.js +438 -0
  113. package/dist/dashboard-web/chunks/chunk-3N2PPQVD.js +1 -0
  114. package/dist/dashboard-web/chunks/chunk-3UJYRR2Q.js +37 -0
  115. package/dist/dashboard-web/chunks/{chunk-VFCACTRF.js → chunk-PE6W3C2C.js} +1 -1
  116. package/dist/dashboard-web/chunks/chunk-QW54DWU3.js +325 -0
  117. package/dist/dashboard-web/chunks/{connectors-VDOAKUW3.js → connectors-IGETYWCP.js} +1 -1
  118. package/dist/dashboard-web/chunks/{groups-page-CX5AN4XG.js → groups-page-MYBS4ZYJ.js} +1 -1
  119. package/dist/dashboard-web/chunks/{insights-page-DOMRL4S6.js → insights-page-UPA32V2S.js} +1 -1
  120. package/dist/dashboard-web/chunks/monitor-room-RFX4HPS5.js +51 -0
  121. package/dist/dashboard-web/chunks/monitoring-page-7T3BESZ2.js +1 -0
  122. package/dist/dashboard-web/chunks/overview-page-LJSBCQW4.js +1 -0
  123. package/dist/dashboard-web/chunks/{roles-page-3FEAH6S4.js → roles-page-ESURTVQH.js} +1 -1
  124. package/dist/dashboard-web/chunks/{schedules-CTQEA7IE.js → schedules-LML2ISOT.js} +1 -1
  125. package/dist/dashboard-web/chunks/sessions-YB73XOTU.js +1 -0
  126. package/dist/dashboard-web/chunks/sessions-page-MCO5QR7Z.js +1 -0
  127. package/dist/dashboard-web/chunks/{settings-page-R23I3IZG.js → settings-page-OSDKNVS3.js} +1 -1
  128. package/dist/dashboard-web/chunks/skills-page-PXBZJ6P6.js +2 -0
  129. package/dist/dashboard-web/chunks/{team-federation-page-ZKL3YMGN.js → team-federation-page-TTPVHFPX.js} +1 -1
  130. package/dist/dashboard-web/chunks/{workflows-4BYQQBFP.js → workflows-FCPM4S4D.js} +1 -1
  131. package/dist/dashboard-web/index.html +2 -1
  132. package/dist/dashboard-web/style.css +818 -8
  133. package/dist/dashboard.js +37 -0
  134. package/dist/dashboard.js.map +1 -1
  135. package/dist/i18n/en.d.ts.map +1 -1
  136. package/dist/i18n/en.js +8 -0
  137. package/dist/i18n/en.js.map +1 -1
  138. package/dist/i18n/zh.d.ts.map +1 -1
  139. package/dist/i18n/zh.js +8 -0
  140. package/dist/i18n/zh.js.map +1 -1
  141. package/dist/im/lark/card-builder.d.ts.map +1 -1
  142. package/dist/im/lark/card-builder.js +18 -0
  143. package/dist/im/lark/card-builder.js.map +1 -1
  144. package/dist/im/lark/card-handler.d.ts.map +1 -1
  145. package/dist/im/lark/card-handler.js +12 -2
  146. package/dist/im/lark/card-handler.js.map +1 -1
  147. package/dist/im/lark/event-dispatcher.d.ts +3 -0
  148. package/dist/im/lark/event-dispatcher.d.ts.map +1 -1
  149. package/dist/im/lark/event-dispatcher.js +59 -2
  150. package/dist/im/lark/event-dispatcher.js.map +1 -1
  151. package/dist/im/lark/message-parser.d.ts +35 -0
  152. package/dist/im/lark/message-parser.d.ts.map +1 -1
  153. package/dist/im/lark/message-parser.js +56 -0
  154. package/dist/im/lark/message-parser.js.map +1 -1
  155. package/dist/im/lark/substitute-command.d.ts +2 -0
  156. package/dist/im/lark/substitute-command.d.ts.map +1 -0
  157. package/dist/im/lark/substitute-command.js +51 -0
  158. package/dist/im/lark/substitute-command.js.map +1 -0
  159. package/dist/services/substitute-chat-toggle-store.d.ts +3 -0
  160. package/dist/services/substitute-chat-toggle-store.d.ts.map +1 -0
  161. package/dist/services/substitute-chat-toggle-store.js +58 -0
  162. package/dist/services/substitute-chat-toggle-store.js.map +1 -0
  163. package/dist/services/substitute-mode-normalize.d.ts +22 -0
  164. package/dist/services/substitute-mode-normalize.d.ts.map +1 -0
  165. package/dist/services/substitute-mode-normalize.js +56 -0
  166. package/dist/services/substitute-mode-normalize.js.map +1 -0
  167. package/dist/services/substitute-mode-store.d.ts +50 -0
  168. package/dist/services/substitute-mode-store.d.ts.map +1 -0
  169. package/dist/services/substitute-mode-store.js +115 -0
  170. package/dist/services/substitute-mode-store.js.map +1 -0
  171. package/dist/types.d.ts +14 -0
  172. package/dist/types.d.ts.map +1 -1
  173. package/dist/worker.js +20 -1
  174. package/dist/worker.js.map +1 -1
  175. package/package.json +1 -1
  176. package/dist/dashboard-web/chunks/bot-defaults-page-3OIY7N76.js +0 -409
  177. package/dist/dashboard-web/chunks/chunk-BNEXMNQD.js +0 -31
  178. package/dist/dashboard-web/chunks/chunk-DKKOGZCG.js +0 -317
  179. package/dist/dashboard-web/chunks/overview-page-AZBAXVZ7.js +0 -1
  180. package/dist/dashboard-web/chunks/sessions-LVZCXO2Z.js +0 -1
  181. package/dist/dashboard-web/chunks/sessions-page-NHBJDSBC.js +0 -1
  182. package/dist/dashboard-web/chunks/skills-page-VUG3EPWX.js +0 -2
@@ -552,12 +552,565 @@ main {
552
552
  font-size: 12px;
553
553
  }
554
554
 
555
+ /* Botmux total-RSS breakdown lines (self / external CLI) — tighter + quieter
556
+ than the primary CPU small, and the parenthetical daemon·worker detail stays
557
+ inline/normal-weight (overriding the bold block `.metric-card span` rule). */
558
+ .metric-card small.metric-breakdown {
559
+ margin-top: 3px;
560
+ font-size: 11px;
561
+ }
562
+
563
+ .metric-card .metric-breakdown-detail {
564
+ display: inline;
565
+ color: var(--muted);
566
+ font-size: 11px;
567
+ font-weight: 400;
568
+ }
569
+
570
+ .metric-label-with-help {
571
+ display: flex;
572
+ align-items: center;
573
+ gap: 6px;
574
+ min-width: 0;
575
+ }
576
+
577
+ .metric-card .metric-label-with-help > span {
578
+ display: inline;
579
+ }
580
+
581
+ .metric-card .resource-help-tip {
582
+ position: relative;
583
+ display: inline-flex;
584
+ flex: 0 0 auto;
585
+ color: inherit;
586
+ }
587
+
588
+ .resource-help-button {
589
+ --help-icon-size: 16px;
590
+ border: 1px solid var(--border);
591
+ background: var(--surface-muted);
592
+ color: var(--muted);
593
+ }
594
+
595
+ .resource-help-button:hover,
596
+ .resource-help-button:focus-visible {
597
+ border-color: var(--accent);
598
+ color: var(--accent);
599
+ background: var(--accent-soft);
600
+ }
601
+
602
+ .metric-card .resource-help-popover {
603
+ position: absolute;
604
+ top: calc(100% + 8px);
605
+ left: 50%;
606
+ z-index: 40;
607
+ display: block;
608
+ width: min(260px, calc(100vw - 32px));
609
+ padding: 9px 10px;
610
+ border: 1px solid var(--border);
611
+ border-radius: var(--radius-sm);
612
+ background: var(--surface-raised);
613
+ color: var(--fg);
614
+ box-shadow: var(--shadow);
615
+ font-size: 12px;
616
+ font-weight: 600;
617
+ line-height: 1.45;
618
+ white-space: pre-line;
619
+ text-transform: none;
620
+ transform: translate(-50%, 4px);
621
+ opacity: 0;
622
+ pointer-events: none;
623
+ transition: opacity .12s ease, transform .12s ease;
624
+ }
625
+
626
+ .resource-help-tip:hover .resource-help-popover,
627
+ .resource-help-tip:focus-within .resource-help-popover {
628
+ opacity: 1;
629
+ pointer-events: auto;
630
+ transform: translate(-50%, 0);
631
+ }
632
+
555
633
  .overview-grid {
556
634
  display: grid;
557
635
  grid-template-columns: repeat(2, minmax(0, 1fr));
558
636
  gap: 16px;
559
637
  }
560
638
 
639
+ .resource-strip {
640
+ display: grid;
641
+ grid-template-columns: minmax(132px, 1fr) repeat(4, max-content);
642
+ gap: 12px;
643
+ align-items: center;
644
+ margin-bottom: 18px;
645
+ padding: 10px 14px;
646
+ color: inherit;
647
+ text-decoration: none;
648
+ background: var(--surface);
649
+ border: 1px solid var(--border-soft);
650
+ border-radius: var(--radius);
651
+ box-shadow: var(--shadow);
652
+ transition: transform .16s ease, border-color .16s ease, background-color .16s ease;
653
+ }
654
+
655
+ .resource-strip:hover {
656
+ transform: translateY(-1px);
657
+ border-color: var(--accent);
658
+ background: var(--surface-raised);
659
+ }
660
+
661
+ .resource-strip-title,
662
+ .resource-strip-metric {
663
+ min-width: 0;
664
+ display: inline-flex;
665
+ align-items: center;
666
+ gap: 7px;
667
+ white-space: nowrap;
668
+ }
669
+
670
+ .resource-strip-title {
671
+ color: var(--muted);
672
+ font-size: 12px;
673
+ font-weight: 800;
674
+ text-transform: uppercase;
675
+ }
676
+
677
+ .resource-strip-title em {
678
+ color: var(--fg);
679
+ font-style: normal;
680
+ text-transform: none;
681
+ }
682
+
683
+ .resource-strip-metric {
684
+ padding-left: 12px;
685
+ border-left: 1px solid var(--border-soft);
686
+ font-variant-numeric: tabular-nums;
687
+ }
688
+
689
+ .resource-strip-metric span {
690
+ color: var(--muted);
691
+ font-size: 11px;
692
+ font-weight: 800;
693
+ text-transform: uppercase;
694
+ }
695
+
696
+ .resource-strip-metric strong {
697
+ color: var(--fg);
698
+ font-size: 13px;
699
+ font-weight: 850;
700
+ overflow: hidden;
701
+ text-overflow: ellipsis;
702
+ }
703
+
704
+ .resource-health-dot {
705
+ flex: 0 0 auto;
706
+ width: 8px;
707
+ height: 8px;
708
+ border-radius: 50%;
709
+ background: var(--faint);
710
+ }
711
+
712
+ .resource-health-dot.ok {
713
+ background: var(--success);
714
+ }
715
+
716
+ .resource-health-dot.warn {
717
+ background: var(--warning);
718
+ }
719
+
720
+ .resource-health-dot.danger {
721
+ background: var(--danger);
722
+ }
723
+
724
+ .resource-strip-metric.ok strong {
725
+ color: var(--success);
726
+ }
727
+
728
+ .resource-strip-metric.warn strong {
729
+ color: var(--warning);
730
+ }
731
+
732
+ .resource-strip-metric.danger strong {
733
+ color: var(--danger);
734
+ }
735
+
736
+ .resource-page {
737
+ isolation: isolate;
738
+ display: grid;
739
+ gap: 16px;
740
+ }
741
+
742
+ .resource-page > .panel {
743
+ position: relative;
744
+ z-index: 10;
745
+ }
746
+
747
+ .resource-page > .resource-pressure {
748
+ z-index: 30;
749
+ overflow: visible;
750
+ }
751
+
752
+ .resource-metrics {
753
+ position: relative;
754
+ z-index: 30;
755
+ display: grid;
756
+ grid-template-columns: repeat(4, minmax(150px, 1fr));
757
+ gap: 12px;
758
+ }
759
+
760
+ .runtime-health-grid,
761
+ .runtime-session-grid {
762
+ display: grid;
763
+ grid-template-columns: repeat(4, minmax(150px, 1fr));
764
+ gap: 12px;
765
+ padding: 14px;
766
+ }
767
+
768
+ .runtime-pressure-grid {
769
+ padding: 14px;
770
+ }
771
+
772
+ .runtime-health-card,
773
+ .runtime-session-card {
774
+ min-width: 0;
775
+ }
776
+
777
+ .runtime-health-card strong {
778
+ font-size: 24px;
779
+ }
780
+
781
+ .runtime-session-card strong {
782
+ overflow: hidden;
783
+ font-size: 17px;
784
+ line-height: 1.2;
785
+ text-overflow: ellipsis;
786
+ white-space: nowrap;
787
+ }
788
+
789
+ .runtime-health-card small,
790
+ .runtime-session-card small {
791
+ line-height: 1.4;
792
+ }
793
+
794
+ .runtime-status-pill {
795
+ display: inline-flex !important;
796
+ align-items: center;
797
+ width: fit-content;
798
+ min-height: 24px;
799
+ padding: 3px 9px;
800
+ border: 1px solid var(--border);
801
+ border-radius: 999px;
802
+ background: var(--surface-muted);
803
+ color: var(--muted) !important;
804
+ font-size: 12px !important;
805
+ font-weight: 800 !important;
806
+ line-height: 1;
807
+ text-transform: uppercase;
808
+ white-space: nowrap;
809
+ }
810
+
811
+ .runtime-status-pill.fresh {
812
+ border-color: color-mix(in srgb, var(--success) 34%, var(--border));
813
+ background: var(--success-soft);
814
+ color: var(--success) !important;
815
+ }
816
+
817
+ .runtime-status-pill.stale {
818
+ border-color: color-mix(in srgb, var(--warning) 42%, var(--border));
819
+ background: var(--warning-soft);
820
+ color: var(--warning) !important;
821
+ }
822
+
823
+ .runtime-status-pill.unsupported {
824
+ border-color: var(--border);
825
+ background: var(--surface-muted);
826
+ color: var(--faint) !important;
827
+ }
828
+
829
+ .runtime-status-pill.unknown {
830
+ border-color: var(--border-soft);
831
+ background: transparent;
832
+ color: var(--muted) !important;
833
+ }
834
+
835
+ .resource-unavailable {
836
+ padding: 14px;
837
+ }
838
+
839
+ .resource-unavailable-card {
840
+ display: grid;
841
+ grid-template-columns: auto minmax(0, 1fr) auto;
842
+ gap: 14px;
843
+ align-items: center;
844
+ min-height: 86px;
845
+ padding: 14px;
846
+ border: 1px solid var(--border-soft);
847
+ border-radius: var(--radius);
848
+ background: var(--surface-muted);
849
+ }
850
+
851
+ .resource-unavailable-status {
852
+ width: 10px;
853
+ height: 10px;
854
+ border: 3px solid var(--warning-soft);
855
+ border-radius: 50%;
856
+ background: var(--warning);
857
+ }
858
+
859
+ .resource-unavailable-copy {
860
+ min-width: 0;
861
+ }
862
+
863
+ .resource-unavailable-copy span {
864
+ display: block;
865
+ margin-bottom: 4px;
866
+ color: var(--muted);
867
+ font-size: 11px;
868
+ font-weight: 850;
869
+ letter-spacing: .04em;
870
+ text-transform: uppercase;
871
+ }
872
+
873
+ .resource-unavailable-copy h2 {
874
+ margin: 0 0 4px;
875
+ color: var(--fg);
876
+ font-size: 17px;
877
+ line-height: 1.2;
878
+ }
879
+
880
+ .resource-unavailable-copy p {
881
+ margin: 0;
882
+ max-width: 62ch;
883
+ color: var(--muted);
884
+ font-size: 13px;
885
+ }
886
+
887
+ .resource-unavailable-tags {
888
+ display: flex;
889
+ flex-wrap: wrap;
890
+ justify-content: flex-end;
891
+ gap: 8px;
892
+ }
893
+
894
+ .resource-unavailable-tags span {
895
+ display: inline-flex;
896
+ align-items: center;
897
+ min-height: 28px;
898
+ padding: 0 10px;
899
+ border: 1px solid var(--border-soft);
900
+ border-radius: 999px;
901
+ color: var(--muted);
902
+ background: var(--surface);
903
+ font-size: 12px;
904
+ font-weight: 750;
905
+ }
906
+
907
+ .resource-trend-grid {
908
+ display: grid;
909
+ grid-template-columns: repeat(auto-fit, minmax(190px, 1fr));
910
+ gap: 12px;
911
+ padding: 14px;
912
+ }
913
+
914
+ .resource-trend-cell {
915
+ min-width: 0;
916
+ padding: 12px;
917
+ border: 1px solid var(--border-soft);
918
+ border-radius: 8px;
919
+ background: var(--surface-muted);
920
+ }
921
+
922
+ .resource-trend-cell b {
923
+ display: block;
924
+ min-height: 18px;
925
+ overflow: hidden;
926
+ text-overflow: ellipsis;
927
+ white-space: nowrap;
928
+ }
929
+
930
+ .resource-chart {
931
+ display: grid;
932
+ grid-template-columns: 54px minmax(0, 1fr);
933
+ gap: 8px;
934
+ margin-top: 10px;
935
+ min-height: 98px;
936
+ }
937
+
938
+ .resource-chart-y {
939
+ display: flex;
940
+ flex-direction: column;
941
+ justify-content: space-between;
942
+ padding: 2px 0 20px;
943
+ color: var(--faint);
944
+ font-size: 10px;
945
+ font-weight: 700;
946
+ line-height: 1.2;
947
+ text-align: right;
948
+ font-variant-numeric: tabular-nums;
949
+ }
950
+
951
+ .resource-chart-plot {
952
+ min-width: 0;
953
+ }
954
+
955
+ .resource-spark {
956
+ display: block;
957
+ width: 100%;
958
+ height: 78px;
959
+ border-left: 1px solid var(--border-soft);
960
+ border-bottom: 1px solid var(--border-soft);
961
+ }
962
+
963
+ .resource-grid-line {
964
+ stroke: var(--border-soft);
965
+ stroke-width: 1;
966
+ vector-effect: non-scaling-stroke;
967
+ }
968
+
969
+ .resource-spark polyline {
970
+ fill: none;
971
+ stroke: var(--accent);
972
+ stroke-width: 2.5;
973
+ vector-effect: non-scaling-stroke;
974
+ }
975
+
976
+ .resource-chart-x {
977
+ display: flex;
978
+ justify-content: space-between;
979
+ padding-top: 4px;
980
+ color: var(--faint);
981
+ font-size: 10px;
982
+ font-weight: 700;
983
+ line-height: 1.2;
984
+ font-variant-numeric: tabular-nums;
985
+ }
986
+
987
+ .resource-table {
988
+ display: grid;
989
+ padding: 0 14px 14px;
990
+ }
991
+
992
+ .resource-session-table {
993
+ --resource-session-row-height: 42px;
994
+ }
995
+
996
+ .resource-session-scroll {
997
+ display: grid;
998
+ max-height: calc(var(--resource-session-row-height) * 10);
999
+ overflow-y: auto;
1000
+ overscroll-behavior: contain;
1001
+ padding-right: 4px;
1002
+ scrollbar-gutter: stable;
1003
+ scrollbar-color: color-mix(in srgb, var(--accent) 42%, var(--border)) transparent;
1004
+ scrollbar-width: thin;
1005
+ }
1006
+
1007
+ .resource-session-scroll::-webkit-scrollbar {
1008
+ width: 6px;
1009
+ }
1010
+
1011
+ .resource-session-scroll::-webkit-scrollbar-track {
1012
+ background: transparent;
1013
+ }
1014
+
1015
+ .resource-session-scroll::-webkit-scrollbar-thumb {
1016
+ border-radius: 999px;
1017
+ background: color-mix(in srgb, var(--accent) 32%, var(--border));
1018
+ }
1019
+
1020
+ .resource-row {
1021
+ display: grid;
1022
+ gap: 12px;
1023
+ align-items: center;
1024
+ min-height: 42px;
1025
+ padding: 8px 0;
1026
+ border-bottom: 1px solid var(--border-soft);
1027
+ }
1028
+
1029
+ .resource-bot-table .resource-row {
1030
+ grid-template-columns: minmax(150px, 1.2fr) minmax(86px, .75fr) repeat(3, minmax(72px, .55fr)) repeat(2, minmax(84px, .75fr));
1031
+ }
1032
+
1033
+ .resource-session-table .resource-row {
1034
+ grid-template-columns: minmax(220px, 1.4fr) minmax(110px, .8fr) repeat(5, minmax(78px, .7fr));
1035
+ }
1036
+
1037
+ .resource-row b,
1038
+ .resource-row span {
1039
+ min-width: 0;
1040
+ overflow: hidden;
1041
+ text-overflow: ellipsis;
1042
+ white-space: nowrap;
1043
+ }
1044
+
1045
+ .resource-row span {
1046
+ color: var(--muted);
1047
+ }
1048
+
1049
+ .resource-row-head {
1050
+ min-height: 34px;
1051
+ font-size: 11px;
1052
+ font-weight: 800;
1053
+ text-transform: uppercase;
1054
+ }
1055
+
1056
+ .resource-row.is-tracked b::after {
1057
+ content: "trend";
1058
+ display: inline-block;
1059
+ margin-left: 8px;
1060
+ color: var(--accent-strong);
1061
+ font-size: 11px;
1062
+ font-weight: 800;
1063
+ }
1064
+
1065
+ .resource-sortbar {
1066
+ display: flex;
1067
+ flex-wrap: wrap;
1068
+ gap: 8px;
1069
+ padding: 0 14px 12px;
1070
+ }
1071
+
1072
+ .resource-sortbar button {
1073
+ border: 1px solid var(--border-soft);
1074
+ border-radius: 8px;
1075
+ padding: 6px 10px;
1076
+ color: var(--muted);
1077
+ background: transparent;
1078
+ }
1079
+
1080
+ .resource-sortbar button.on {
1081
+ color: var(--fg);
1082
+ border-color: var(--accent);
1083
+ background: var(--surface-muted);
1084
+ }
1085
+
1086
+ .resource-hot {
1087
+ max-width: 320px;
1088
+ overflow: hidden;
1089
+ color: var(--muted);
1090
+ text-overflow: ellipsis;
1091
+ white-space: nowrap;
1092
+ }
1093
+
1094
+ .resource-reasons {
1095
+ color: var(--accent-strong) !important;
1096
+ }
1097
+
1098
+ @media (max-width: 900px) {
1099
+ .resource-strip,
1100
+ .resource-metrics,
1101
+ .runtime-health-grid,
1102
+ .runtime-session-grid,
1103
+ .resource-unavailable-card,
1104
+ .resource-bot-table .resource-row,
1105
+ .resource-session-table .resource-row {
1106
+ grid-template-columns: 1fr;
1107
+ }
1108
+
1109
+ .resource-unavailable-tags {
1110
+ justify-content: flex-start;
1111
+ }
1112
+ }
1113
+
561
1114
  .overview-list {
562
1115
  list-style: none;
563
1116
  margin: 0;
@@ -707,6 +1260,13 @@ a:focus-visible {
707
1260
  flex: 0 0 auto;
708
1261
  }
709
1262
 
1263
+ .monitor-room-open {
1264
+ min-height: 38px;
1265
+ padding: 0 14px;
1266
+ border-radius: 999px;
1267
+ font-weight: 700;
1268
+ }
1269
+
710
1270
  .filter-toggle {
711
1271
  display: inline-flex;
712
1272
  align-items: center;
@@ -892,6 +1452,12 @@ tr[data-chat]:hover { background: var(--surface-muted); cursor: pointer; }
892
1452
  text-align: center;
893
1453
  font-variant-numeric: tabular-nums;
894
1454
  }
1455
+ .session-location-cell {
1456
+ max-width: 220px;
1457
+ overflow: hidden;
1458
+ text-overflow: ellipsis;
1459
+ white-space: nowrap;
1460
+ }
895
1461
 
896
1462
  button,
897
1463
  .btn-link {
@@ -922,6 +1488,25 @@ button:disabled {
922
1488
  cursor: default;
923
1489
  }
924
1490
 
1491
+ .help-icon-button {
1492
+ display: inline-grid;
1493
+ place-items: center;
1494
+ flex: 0 0 var(--help-icon-size, 20px);
1495
+ width: var(--help-icon-size, 20px);
1496
+ height: var(--help-icon-size, 20px);
1497
+ min-width: var(--help-icon-size, 20px);
1498
+ min-height: var(--help-icon-size, 20px);
1499
+ max-width: var(--help-icon-size, 20px);
1500
+ max-height: var(--help-icon-size, 20px);
1501
+ padding: 0;
1502
+ border-radius: 999px;
1503
+ box-sizing: border-box;
1504
+ font-size: var(--help-icon-font-size, 11px);
1505
+ font-weight: 800;
1506
+ line-height: 1;
1507
+ cursor: help;
1508
+ }
1509
+
925
1510
  button.contrast {
926
1511
  background: var(--danger);
927
1512
  color: var(--on-danger);
@@ -2163,6 +2748,239 @@ fieldset legend {
2163
2748
  keep hidden tables invisible across view toggles such as sessions board/table. */
2164
2749
  table[hidden] { display: none !important; }
2165
2750
  .bulk-bar #bulk-count { font-weight: 800; margin-right: 4px; }
2751
+
2752
+ /* ── Session monitor room ───────────────────────────────────────────────── */
2753
+ .monitor-room-page {
2754
+ min-height: calc(100vh - 120px);
2755
+ align-content: start;
2756
+ }
2757
+
2758
+ .monitor-room-actions {
2759
+ display: inline-flex;
2760
+ align-items: center;
2761
+ justify-content: flex-end;
2762
+ gap: 8px;
2763
+ flex-wrap: wrap;
2764
+ }
2765
+
2766
+ .monitor-room-toggle {
2767
+ display: inline-flex;
2768
+ align-items: center;
2769
+ gap: 7px;
2770
+ min-height: 38px;
2771
+ padding: 0 12px;
2772
+ border: 1px solid var(--border-soft);
2773
+ border-radius: 999px;
2774
+ background: var(--surface);
2775
+ color: var(--muted);
2776
+ font-size: 12.5px;
2777
+ font-weight: 700;
2778
+ cursor: pointer;
2779
+ user-select: none;
2780
+ }
2781
+
2782
+ .monitor-room-toggle input {
2783
+ margin: 0;
2784
+ }
2785
+
2786
+ .monitor-room-toggle:has(input:checked) {
2787
+ color: var(--accent);
2788
+ border-color: color-mix(in srgb, var(--accent) 45%, transparent);
2789
+ background: var(--accent-soft);
2790
+ }
2791
+
2792
+ .monitor-room-summary {
2793
+ margin: -4px 0 12px;
2794
+ color: var(--muted);
2795
+ font-size: 13px;
2796
+ font-weight: 700;
2797
+ }
2798
+
2799
+ .monitor-room-grid {
2800
+ display: grid;
2801
+ gap: 14px;
2802
+ align-items: start;
2803
+ justify-content: center;
2804
+ }
2805
+
2806
+ .monitor-room-grid[data-count="0"] {
2807
+ display: block;
2808
+ }
2809
+
2810
+ .monitor-room-card {
2811
+ display: flex;
2812
+ flex-direction: column;
2813
+ min-width: 0;
2814
+ min-height: 0;
2815
+ border: 1px solid var(--border-soft);
2816
+ border-radius: var(--radius);
2817
+ background: var(--surface);
2818
+ box-shadow: var(--shadow);
2819
+ overflow: hidden;
2820
+ }
2821
+
2822
+ .monitor-room-card-head {
2823
+ flex: none;
2824
+ display: flex;
2825
+ align-items: center;
2826
+ justify-content: space-between;
2827
+ gap: 10px;
2828
+ min-height: 48px;
2829
+ padding: 9px 10px;
2830
+ border-bottom: 1px solid var(--border-soft);
2831
+ }
2832
+
2833
+ .monitor-room-card-title {
2834
+ min-width: 0;
2835
+ display: inline-flex;
2836
+ align-items: center;
2837
+ gap: 8px;
2838
+ }
2839
+
2840
+ .monitor-room-card-meta {
2841
+ min-width: 0;
2842
+ display: grid;
2843
+ gap: 2px;
2844
+ }
2845
+
2846
+ .monitor-room-card-meta strong {
2847
+ min-width: 0;
2848
+ overflow: hidden;
2849
+ text-overflow: ellipsis;
2850
+ white-space: nowrap;
2851
+ font-size: 13px;
2852
+ }
2853
+
2854
+ .monitor-room-card-meta small {
2855
+ min-width: 0;
2856
+ display: inline-flex;
2857
+ align-items: center;
2858
+ gap: 6px;
2859
+ overflow: hidden;
2860
+ text-overflow: ellipsis;
2861
+ white-space: nowrap;
2862
+ color: var(--muted);
2863
+ font-size: 11px;
2864
+ }
2865
+
2866
+ .monitor-room-card-actions {
2867
+ flex: none;
2868
+ display: inline-flex;
2869
+ align-items: center;
2870
+ gap: 6px;
2871
+ }
2872
+
2873
+ .monitor-room-frame-wrap {
2874
+ position: relative;
2875
+ flex: none;
2876
+ min-height: 0;
2877
+ aspect-ratio: var(--monitor-room-viewport-ratio, 16 / 10);
2878
+ overflow: hidden;
2879
+ background: #000;
2880
+ }
2881
+
2882
+ .monitor-room-frame {
2883
+ position: absolute;
2884
+ left: 0;
2885
+ top: 0;
2886
+ width: 100%;
2887
+ height: 100%;
2888
+ min-height: 0;
2889
+ border: 0;
2890
+ background: #000;
2891
+ transform-origin: 0 0;
2892
+ }
2893
+
2894
+ .monitor-room-placeholder,
2895
+ .monitor-room-empty {
2896
+ flex: 1;
2897
+ min-height: 260px;
2898
+ display: grid;
2899
+ place-items: center;
2900
+ align-content: center;
2901
+ gap: 10px;
2902
+ padding: 26px;
2903
+ text-align: center;
2904
+ color: var(--muted);
2905
+ background: color-mix(in srgb, var(--surface-raised) 82%, #000);
2906
+ }
2907
+
2908
+ .monitor-room-placeholder b,
2909
+ .monitor-room-empty h2 {
2910
+ margin: 0;
2911
+ color: var(--fg);
2912
+ font-size: 16px;
2913
+ }
2914
+
2915
+ .monitor-room-placeholder span,
2916
+ .monitor-room-empty p {
2917
+ margin: 0;
2918
+ max-width: 520px;
2919
+ line-height: 1.6;
2920
+ }
2921
+
2922
+ .monitor-room-card-empty .monitor-room-frame-wrap {
2923
+ background: var(--surface-muted);
2924
+ }
2925
+
2926
+ .monitor-room-popover-backdrop {
2927
+ position: fixed;
2928
+ inset: 0;
2929
+ z-index: 80;
2930
+ display: grid;
2931
+ place-items: center;
2932
+ padding: clamp(14px, 3vw, 34px);
2933
+ background: rgba(15, 23, 42, 0.28);
2934
+ backdrop-filter: blur(2px);
2935
+ }
2936
+
2937
+ .monitor-room-popover {
2938
+ width: min(1480px, 94vw);
2939
+ height: min(980px, 88vh);
2940
+ display: grid;
2941
+ grid-template-rows: auto minmax(0, 1fr);
2942
+ overflow: hidden;
2943
+ border: 1px solid var(--border-soft);
2944
+ border-radius: var(--radius);
2945
+ background: var(--surface);
2946
+ box-shadow: 0 28px 80px rgba(15, 23, 42, 0.26);
2947
+ outline: none;
2948
+ }
2949
+
2950
+ .monitor-room-popover-head {
2951
+ display: flex;
2952
+ align-items: center;
2953
+ justify-content: space-between;
2954
+ gap: 12px;
2955
+ min-height: 52px;
2956
+ padding: 9px 10px 9px 12px;
2957
+ border-bottom: 1px solid var(--border-soft);
2958
+ }
2959
+
2960
+ .monitor-room-popover-frame {
2961
+ display: block;
2962
+ width: 100%;
2963
+ height: 100%;
2964
+ min-height: 0;
2965
+ border: 0;
2966
+ background: #000;
2967
+ }
2968
+
2969
+ @media (max-width: 760px) {
2970
+ .monitor-room-card {
2971
+ min-height: 0;
2972
+ }
2973
+ .monitor-room-frame-wrap {
2974
+ min-height: 0;
2975
+ }
2976
+ .monitor-room-popover-backdrop {
2977
+ padding: 10px;
2978
+ }
2979
+ .monitor-room-popover {
2980
+ width: 100%;
2981
+ height: 92vh;
2982
+ }
2983
+ }
2166
2984
  .idle-cleanup-bar {
2167
2985
  display: grid;
2168
2986
  grid-template-columns: minmax(0, 1fr) auto;
@@ -4674,15 +5492,7 @@ button.contrast:hover { background: var(--danger-soft); border-color: var(--dang
4674
5492
  }
4675
5493
 
4676
5494
  .skills-help-button {
4677
- width: 20px;
4678
- height: 20px;
4679
- min-height: 20px;
4680
- padding: 0;
4681
- border-radius: 999px;
4682
5495
  color: var(--muted);
4683
- font-size: 11px;
4684
- font-weight: 800;
4685
- line-height: 1;
4686
5496
  }
4687
5497
 
4688
5498
  .skills-help-popover {