@jungjaehoon/mama-os 0.33.0 → 0.34.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 (60) hide show
  1. package/README.md +15 -17
  2. package/dist/agent/os-agent-capabilities.md +2 -2
  3. package/dist/api/graph-api.d.ts +4 -4
  4. package/dist/api/graph-api.d.ts.map +1 -1
  5. package/dist/api/graph-api.js +47 -78
  6. package/dist/api/graph-api.js.map +1 -1
  7. package/dist/api/index.d.ts +10 -0
  8. package/dist/api/index.d.ts.map +1 -1
  9. package/dist/api/index.js +9 -2
  10. package/dist/api/index.js.map +1 -1
  11. package/dist/api/operator-handler.d.ts +1 -1
  12. package/dist/api/operator-handler.js +1 -1
  13. package/dist/api/runtime-status-handler.d.ts +41 -0
  14. package/dist/api/runtime-status-handler.d.ts.map +1 -0
  15. package/dist/api/runtime-status-handler.js +55 -0
  16. package/dist/api/runtime-status-handler.js.map +1 -0
  17. package/dist/cli/commands/start.js +1 -1
  18. package/dist/cli/commands/start.js.map +1 -1
  19. package/dist/cli/runtime/api-routes-init.js +1 -1
  20. package/dist/cli/runtime/api-routes-init.js.map +1 -1
  21. package/dist/cli/runtime/api-server-init.d.ts +12 -1
  22. package/dist/cli/runtime/api-server-init.d.ts.map +1 -1
  23. package/dist/cli/runtime/api-server-init.js +54 -0
  24. package/dist/cli/runtime/api-server-init.js.map +1 -1
  25. package/dist/cli/runtime/utilities.d.ts +1 -1
  26. package/dist/cli/runtime/utilities.d.ts.map +1 -1
  27. package/dist/cli/runtime/utilities.js +3 -1
  28. package/dist/cli/runtime/utilities.js.map +1 -1
  29. package/dist/multi-agent/dashboard-agent-persona.js +2 -2
  30. package/dist/operator/board-slot-instructions.d.ts +1 -1
  31. package/dist/operator/board-slot-instructions.js +1 -1
  32. package/package.json +1 -2
  33. package/public/viewer/js/modules/system.js +183 -0
  34. package/public/viewer/js/utils/ui-commands.js +4 -9
  35. package/public/viewer/log-viewer.html +2 -192
  36. package/public/viewer/operator/operator.css +1 -0
  37. package/public/viewer/operator/operator.js +14830 -0
  38. package/public/viewer/src/modules/system.ts +242 -0
  39. package/public/viewer/src/utils/ui-commands.ts +4 -8
  40. package/public/viewer/sw.js +44 -10
  41. package/public/viewer/viewer.css +338 -331
  42. package/public/viewer/viewer.html +388 -1472
  43. package/public/ui/assets/index-BDXDGEV6.js +0 -62
  44. package/public/ui/assets/index-po2tN0xq.css +0 -1
  45. package/public/ui/index.html +0 -14
  46. package/public/ui/theme-init.js +0 -20
  47. package/public/viewer/js/modules/agents.js +0 -1153
  48. package/public/viewer/js/modules/chat.js +0 -1993
  49. package/public/viewer/js/modules/connector-feed.js +0 -352
  50. package/public/viewer/js/modules/dashboard.js +0 -456
  51. package/public/viewer/js/modules/entity-audit.js +0 -106
  52. package/public/viewer/js/modules/entity-review.js +0 -66
  53. package/public/viewer/js/modules/settings.js +0 -1257
  54. package/public/viewer/src/modules/agents.ts +0 -1302
  55. package/public/viewer/src/modules/chat.ts +0 -2426
  56. package/public/viewer/src/modules/connector-feed.ts +0 -391
  57. package/public/viewer/src/modules/dashboard.ts +0 -498
  58. package/public/viewer/src/modules/entity-audit.ts +0 -154
  59. package/public/viewer/src/modules/entity-review.ts +0 -175
  60. package/public/viewer/src/modules/settings.ts +0 -1547
@@ -1,7 +1,7 @@
1
1
  /* ============================================================================
2
2
  MAMA Viewer - Brand-Aligned CSS
3
3
  Color Palette: Yellow #FFCE00, Lavender #EDDBF7, Black #131313, Blush #FF9999
4
- Typography: Inter (UI) + Fredoka (markdown headings) + Nunito (chat)
4
+ Typography: Inter (UI) + Fredoka (markdown headings) + Nunito (body)
5
5
  CJK Fallback: Noto Sans KR, Noto Sans JP
6
6
  ============================================================================ */
7
7
 
@@ -76,106 +76,16 @@ button:not([class*="p-"]):not([class*="px-"]):not([class*="py-"]) { padding: 6px
76
76
  [data-tab] { min-height: 44px; }
77
77
  }
78
78
 
79
- /* Floating Chat */
80
79
  .animate-slide-up {
81
80
  animation: slide-up 0.2s ease-out;
82
81
  }
83
-
84
- #chat-bubble {
85
- transition: transform 0.2s ease, opacity 0.2s ease;
86
- }
87
-
88
- #chat-bubble.scale-0 {
89
- transform: scale(0);
90
- opacity: 0;
91
- pointer-events: none;
92
- }
93
-
94
- #chat-panel .chat-message {
95
- font-size: 0.875rem;
96
- }
97
-
98
- #chat-panel .chat-message .message-content {
99
- font-size: 0.875rem;
100
- line-height: 1.4;
101
- }
102
-
103
- /* Chat panel sizing + scroll behavior fixes */
104
- #chat-panel {
105
- width: min(92vw, 420px);
106
- height: min(75vh, 560px);
107
- resize: both;
108
- overflow: auto;
109
- box-sizing: border-box;
110
- min-width: 280px;
111
- min-height: 320px;
112
- max-width: 96vw;
113
- max-height: 85vh;
114
- /* GPU compositing for smooth toggle */
115
- transform: translateZ(0);
116
- will-change: opacity;
117
- }
118
-
119
82
  /* Right panel mode (SmartStore pattern) — override floating panel sizing */
120
- #chat-panel-wrapper {
121
- transition: width 0.15s ease;
122
- height: 100%;
123
- overflow: hidden;
124
- min-width: 280px;
125
- }
126
- #chat-panel-wrapper #chat-panel {
127
- width: 100%;
128
- height: 100%;
129
- min-width: 0;
130
- min-height: 0;
131
- max-width: none;
132
- max-height: none;
133
- resize: none;
134
- overflow: hidden;
135
- transform: none;
136
- will-change: auto;
137
- }
138
- #chat-resize-handle-bar {
139
- display: none;
140
- }
141
- #chat-resize-handle-bar.chat-resize-visible {
142
- display: block;
143
- }
144
-
145
- /* Legacy bubble styles (kept for backward compat) */
146
- #chat-panel.chat-panel-closed {
147
- opacity: 0;
148
- pointer-events: none;
149
- }
150
- #chat-panel.chat-panel-open {
151
- opacity: 1;
152
- pointer-events: auto;
153
- }
154
- .chat-panel-draggable {
155
- position: fixed !important;
156
- right: auto !important;
157
- bottom: auto !important;
158
- }
159
- .no-scroll {
83
+ /* Legacy bubble styles (kept for backward compat) */.no-scroll {
160
84
  overflow: hidden !important;
161
85
  touch-action: none !important;
162
86
  }
163
87
 
164
88
  /* Custom resize handle (works on mobile) */
165
- .chat-resize-handle {
166
- position: absolute;
167
- right: 8px;
168
- bottom: 8px;
169
- width: 18px;
170
- height: 18px;
171
- background:
172
- linear-gradient(135deg, transparent 50%, #D4C4E0 50%) 0 0/100% 100% no-repeat;
173
- border-radius: 3px;
174
- cursor: nwse-resize;
175
- touch-action: none;
176
- opacity: 0.8;
177
- }
178
-
179
89
  /* Sidebar resize handle (mobile row-resize) */
180
90
  #sidebar-resize-handle.sidebar-resize-handle--row {
181
91
  width: 100%;
@@ -193,56 +103,7 @@ button:not([class*="p-"]):not([class*="px-"]):not([class*="py-"]) { padding: 6px
193
103
  background: #D4C4E0;
194
104
  }
195
105
 
196
- /* Mobile chat panel overrides — fix height:100% and overflow:hidden from desktop */
197
- @media (max-width: 767px) {
198
- #chat-panel-wrapper {
199
- height: auto;
200
- }
201
- #chat-panel-wrapper #chat-panel {
202
- overflow: visible;
203
- }
204
- /* Mobile chat header — compact + brand aligned */
205
- #chat-panel-wrapper.mobile-chat-active #chat-header {
206
- padding: 12px 16px;
207
- background: linear-gradient(180deg, #fff 0%, #FAFAF8 100%);
208
- border-bottom: 1px solid #EDE9E1;
209
- }
210
- /* Mobile chat input — larger targets, brand colors */
211
- #chat-panel-wrapper.mobile-chat-active .p-3 {
212
- padding: 12px 16px;
213
- background: #FAFAF8;
214
- border-top: 1px solid #EDE9E1;
215
- }
216
- #chat-panel-wrapper.mobile-chat-active #chat-input {
217
- background: #fff;
218
- border: 1.5px solid #D4C4E0;
219
- border-radius: 20px;
220
- padding: 10px 16px;
221
- font-size: 15px;
222
- min-height: 44px;
223
- }
224
- #chat-panel-wrapper.mobile-chat-active #chat-input:focus {
225
- border-color: #FFCE00;
226
- box-shadow: 0 0 0 3px rgba(255, 206, 0, 0.15);
227
- }
228
- /* Mobile action buttons — 44px touch targets */
229
- #chat-panel-wrapper.mobile-chat-active #chat-attach,
230
- #chat-panel-wrapper.mobile-chat-active #chat-mic,
231
- #chat-panel-wrapper.mobile-chat-active #chat-send {
232
- width: 44px;
233
- height: 44px;
234
- border-radius: 50%;
235
- }
236
- #chat-panel-wrapper.mobile-chat-active #chat-send {
237
- background: #FFCE00;
238
- box-shadow: 0 2px 8px rgba(255, 206, 0, 0.3);
239
- }
240
- /* Mobile message bubbles — slightly larger text */
241
- #chat-panel-wrapper.mobile-chat-active .chat-message .message-content {
242
- font-size: 15px;
243
- line-height: 1.5;
244
- }
245
- }
106
+ @media (max-width: 767px) { /* Mobile action buttons — 44px touch targets */ /* Mobile message bubbles — slightly larger text */}
246
107
 
247
108
  /* Memory viewer mobile layout */
248
109
  @media (max-width: 768px) {
@@ -266,18 +127,6 @@ button:not([class*="p-"]):not([class*="px-"]):not([class*="py-"]) { padding: 6px
266
127
  min-height: 45vh;
267
128
  }
268
129
  }
269
- #chat-messages {
270
- overflow-x: hidden;
271
- overscroll-behavior: contain;
272
- touch-action: pan-y;
273
- }
274
- .chat-message,
275
- .chat-message .message-content {
276
- max-width: 100%;
277
- overflow-wrap: anywhere;
278
- word-break: break-word;
279
- }
280
-
281
130
  @keyframes float {
282
131
  0%, 100% { transform: translate(0, 0) scale(1); }
283
132
  33% { transform: translate(30px, -30px) scale(1.05); }
@@ -293,7 +142,6 @@ button:not([class*="p-"]):not([class*="px-"]):not([class*="py-"]) { padding: 6px
293
142
  STATE CLASSES (Used by JavaScript)
294
143
  ============================================================================ */
295
144
 
296
- /* Chat status indicator */
297
145
  .status-indicator {
298
146
  transition: background-color 200ms ease;
299
147
  }
@@ -394,6 +242,29 @@ button:not([class*="p-"]):not([class*="px-"]):not([class*="py-"]) { padding: 6px
394
242
  border-top: 1px solid #E8DFF0;
395
243
  }
396
244
 
245
+ /* ============================================================================
246
+ MEMORY CONTROL BAR - wraps instead of overflowing
247
+ ============================================================================
248
+ The Knowledge > Memory filter bar used to be three fixed-width inputs on one
249
+ non-wrapping row, so on a narrow viewport the Clear button and Export menu
250
+ were pushed off-screen. The row wraps and the search field is the elastic
251
+ one; `min-width: 0` is what lets a flex input shrink below its intrinsic
252
+ size at all. */
253
+
254
+ .memory-controls {
255
+ flex-wrap: wrap;
256
+ }
257
+
258
+ .memory-controls #topic-filter {
259
+ min-width: 0;
260
+ flex: 0 1 10rem;
261
+ }
262
+
263
+ .memory-controls #search-input {
264
+ min-width: 0;
265
+ flex: 1 1 12rem;
266
+ }
267
+
397
268
  /* ============================================================================
398
269
  CHECKPOINT SIDEBAR - Collapsible & Resizable
399
270
  ============================================================================ */
@@ -447,124 +318,9 @@ button:not([class*="p-"]):not([class*="px-"]):not([class*="py-"]) { padding: 6px
447
318
  }
448
319
 
449
320
  /* ============================================================================
450
- MESSENGER-STYLE CHAT - Brand Colors
321
+ RICH MESSAGE CONTENT - Brand Colors
451
322
  ============================================================================ */
452
323
 
453
- /* Chat message base */
454
- .chat-message {
455
- display: flex;
456
- flex-direction: column;
457
- max-width: 100%;
458
- animation: message-appear 0.2s ease-out;
459
- }
460
-
461
- /* User messages - right aligned, yellow bubble */
462
- .chat-message.user {
463
- align-self: flex-end;
464
- align-items: flex-end;
465
- }
466
-
467
- .chat-message.user .message-content {
468
- background: linear-gradient(135deg, #FFCE00 0%, #E6B800 100%);
469
- color: #131313;
470
- padding: 12px 16px;
471
- border-radius: 20px 20px 4px 20px;
472
- font-size: 15px;
473
- line-height: 1.5;
474
- word-break: break-word;
475
- box-shadow: 0 4px 12px rgba(255, 206, 0, 0.3);
476
- }
477
-
478
- /* Assistant messages - left aligned, white bubble */
479
- .chat-message.assistant {
480
- align-self: flex-start;
481
- align-items: flex-start;
482
- }
483
-
484
- .chat-message.assistant .message-content {
485
- background: #FFFFFF;
486
- color: #131313;
487
- padding: 12px 16px;
488
- border-radius: 20px 20px 20px 4px;
489
- font-size: 15px;
490
- line-height: 1.5;
491
- word-break: break-word;
492
- box-shadow: 0 1px 4px rgba(19, 19, 19, 0.06);
493
- border: 1px solid #EDE9E1;
494
- }
495
-
496
- /* System messages - centered, subtle */
497
- .chat-message.system {
498
- align-self: center;
499
- max-width: 90%;
500
- }
501
-
502
- .chat-message.system .message-content {
503
- background: transparent;
504
- color: #888888;
505
- font-size: 13px;
506
- text-align: center;
507
- padding: 8px 16px;
508
- }
509
-
510
- .chat-message.system.error .message-content {
511
- color: #ef4444;
512
- }
513
-
514
- .chat-message.system.warning .message-content {
515
- color: #f59e0b;
516
- }
517
-
518
- /* Message timestamp */
519
- .message-time {
520
- font-size: 11px;
521
- color: #888888;
522
- margin-top: 4px;
523
- padding: 0 4px;
524
- }
525
-
526
- /* Streaming indicator */
527
- .chat-message.streaming .message-content::after {
528
- content: '▋';
529
- animation: cursor-blink 1s step-end infinite;
530
- margin-left: 2px;
531
- }
532
-
533
- /* Markdown in messages */
534
- .chat-message .message-content p {
535
- margin: 0 0 8px 0;
536
- }
537
-
538
- .chat-message .message-content p:last-child {
539
- margin-bottom: 0;
540
- }
541
-
542
- .chat-message .message-content code {
543
- background: rgba(19, 19, 19, 0.08);
544
- padding: 2px 6px;
545
- border-radius: 4px;
546
- font-family: 'JetBrains Mono', 'Fira Code', monospace;
547
- font-size: 13px;
548
- }
549
-
550
- .chat-message.user .message-content code {
551
- background: rgba(19, 19, 19, 0.15);
552
- }
553
-
554
- .chat-message .message-content pre {
555
- background: #131313;
556
- color: #f3f4f6;
557
- padding: 12px;
558
- border-radius: 12px;
559
- overflow-x: auto;
560
- margin: 8px 0;
561
- }
562
-
563
- .chat-message .message-content pre code {
564
- background: transparent;
565
- padding: 0;
566
- }
567
-
568
324
  /* Quiz choice buttons - Brand style */
569
325
  .quiz-choice-btn {
570
326
  display: block;
@@ -610,6 +366,115 @@ button:not([class*="p-"]):not([class*="px-"]):not([class*="py-"]) { padding: 6px
610
366
  content-visibility: visible;
611
367
  }
612
368
 
369
+ /* The operator bundle stays mounted for the page lifetime; when its route is
370
+ not active the region is simply display:none via .tab-content above. */
371
+ #tab-operator.active > #operator-mount {
372
+ display: flex;
373
+ flex-direction: column;
374
+ flex: 1;
375
+ min-height: 0;
376
+ }
377
+
378
+ /* ── Mobile sub-view chips ──────────────────────────────────────────────────
379
+ Same hash routes as the desktop rail's sub-entries. Desktop hides the row;
380
+ the rail already shows the group's views. */
381
+ .mama-subviews {
382
+ display: none;
383
+ }
384
+ @media (max-width: 767px) {
385
+ .mama-subviews {
386
+ display: flex;
387
+ gap: 8px;
388
+ align-items: center;
389
+ flex-shrink: 0;
390
+ padding: 8px 12px;
391
+ background: #ffffff;
392
+ border-bottom: 1px solid #ede9e1;
393
+ overflow-x: auto;
394
+ -webkit-overflow-scrolling: touch;
395
+ scrollbar-width: none;
396
+ }
397
+ .mama-subviews::-webkit-scrollbar {
398
+ display: none;
399
+ }
400
+ }
401
+ .mama-subview-chip {
402
+ display: inline-flex;
403
+ align-items: center;
404
+ flex-shrink: 0;
405
+ min-height: 44px;
406
+ padding: 0 16px;
407
+ border-radius: 9999px;
408
+ background: #f5f2ed;
409
+ color: #6b6560;
410
+ font-family: Inter, 'Noto Sans KR', sans-serif;
411
+ font-size: 13px;
412
+ font-weight: 600;
413
+ text-decoration: none;
414
+ white-space: nowrap;
415
+ transition:
416
+ background 0.15s ease,
417
+ color 0.15s ease;
418
+ }
419
+ .mama-subview-chip[hidden] {
420
+ display: none;
421
+ }
422
+ .mama-subview-chip.mama-nav-active {
423
+ background: #ffce00;
424
+ color: #131313;
425
+ }
426
+
427
+ /* ── Mobile group bar ── */
428
+ #mama-mobile-tabs {
429
+ display: none;
430
+ position: fixed;
431
+ bottom: 0;
432
+ left: 0;
433
+ right: 0;
434
+ height: 64px;
435
+ background: #ffffff;
436
+ border-top: 1px solid #ede9e1;
437
+ z-index: 100;
438
+ padding: 0 8px;
439
+ align-items: stretch;
440
+ justify-content: space-around;
441
+ }
442
+ .mama-mobile-tab {
443
+ display: flex;
444
+ flex: 1;
445
+ flex-direction: column;
446
+ align-items: center;
447
+ justify-content: center;
448
+ gap: 2px;
449
+ min-height: 44px;
450
+ padding: 8px 12px;
451
+ border: none;
452
+ background: transparent;
453
+ color: #6b6560;
454
+ font-size: 10px;
455
+ font-weight: 600;
456
+ text-decoration: none;
457
+ font-family: 'Inter', 'Noto Sans KR', sans-serif;
458
+ cursor: pointer;
459
+ transition: color 0.15s ease;
460
+ }
461
+ .mama-mobile-tab i,
462
+ .mama-mobile-tab svg {
463
+ width: 20px;
464
+ height: 20px;
465
+ }
466
+ .mama-mobile-tab.mama-nav-active {
467
+ position: relative;
468
+ background: #ffce00;
469
+ color: #131313;
470
+ border-radius: 8px;
471
+ }
472
+ @media (max-width: 767px) {
473
+ #mama-mobile-tabs {
474
+ display: flex;
475
+ }
476
+ }
477
+
613
478
  /* Modal visibility */
614
479
  .modal-overlay {
615
480
  opacity: 0;
@@ -724,29 +589,6 @@ button:not([class*="p-"]):not([class*="px-"]):not([class*="py-"]) { padding: 6px
724
589
  .typing-dot:nth-child(2) { animation-delay: 0.2s; }
725
590
  .typing-dot:nth-child(3) { animation-delay: 0.4s; }
726
591
 
727
- /* Chat typing indicator */
728
- .chat-typing-indicator {
729
- display: flex;
730
- align-items: center;
731
- gap: 8px;
732
- padding: 8px 16px;
733
- color: var(--text-secondary, #888);
734
- font-size: 13px;
735
- }
736
- .chat-typing-indicator .typing-dots {
737
- display: flex;
738
- gap: 4px;
739
- }
740
- .chat-typing-indicator .typing-dots span {
741
- width: 6px;
742
- height: 6px;
743
- border-radius: 50%;
744
- background: var(--text-secondary, #888);
745
- animation: typing-bounce 1.4s ease-in-out infinite;
746
- }
747
- .chat-typing-indicator .typing-dots span:nth-child(2) { animation-delay: 0.2s; }
748
- .chat-typing-indicator .typing-dots span:nth-child(3) { animation-delay: 0.4s; }
749
-
750
592
  /* ============================================================================
751
593
  VIS-NETWORK OVERRIDES
752
594
  ============================================================================ */
@@ -775,11 +617,7 @@ button:not([class*="p-"]):not([class*="px-"]):not([class*="py-"]) { padding: 6px
775
617
  }
776
618
 
777
619
  /* Firefox scrollbar - scoped to scrollable containers */
778
- body,
779
- .tab-content,
780
- #chat-messages,
781
- .overflow-y-auto,
782
- .overflow-auto {
620
+ body, .tab-content, .overflow-y-auto, .overflow-auto {
783
621
  scrollbar-width: thin;
784
622
  scrollbar-color: #D4C4E0 transparent;
785
623
  }
@@ -915,7 +753,7 @@ body,
915
753
  transform: translateY(-1px);
916
754
  }
917
755
 
918
- /* Agent form inputs — focus matches chat input style */
756
+ /* Agent form inputs — brand focus ring */
919
757
  .agent-input:focus {
920
758
  outline: none;
921
759
  border-color: #FFCE00;
@@ -924,42 +762,13 @@ body,
924
762
 
925
763
  /* ============================================================================
926
764
  INPUT STYLES - Brand aligned
927
- ============================================================================ */
928
-
929
- .chat-input-area {
930
- padding: 16px;
931
- border-top: 1px solid #D4C4E0;
932
- background: white;
933
- }
934
- .input-row {
765
+ ============================================================================ */.input-row {
935
766
  display: flex;
936
767
  gap: 8px;
937
768
  }
938
769
  .input-wrapper {
939
770
  flex: 1;
940
- }
941
- .chat-input {
942
- width: 100%;
943
- padding: 12px 16px;
944
- border: 2px solid #D4C4E0;
945
- border-radius: 20px;
946
- background: white;
947
- color: #131313;
948
- font-size: 14px;
949
- font-family: 'Nunito', sans-serif;
950
- resize: none;
951
- transition: border-color 0.2s, box-shadow 0.2s;
952
- }
953
- .chat-input:focus {
954
- outline: none;
955
- border-color: #FFCE00;
956
- box-shadow: 0 0 0 3px rgba(255, 206, 0, 0.2);
957
- }
958
- .chat-input:disabled {
959
- opacity: 0.5;
960
- cursor: not-allowed;
961
- }
962
- .btn-send {
771
+ }.btn-send {
963
772
  display: flex;
964
773
  align-items: center;
965
774
  gap: 6px;
@@ -1034,3 +843,201 @@ div.vis-tooltip {
1034
843
  max-width: 320px;
1035
844
  pointer-events: none;
1036
845
  }
846
+
847
+ /* ============================================================================
848
+ SYSTEM VIEWS (Runtime / Connectors) — read-only runtime truth
849
+ ============================================================================ */
850
+
851
+ .mama-system-panel {
852
+ max-width: 880px;
853
+ }
854
+
855
+ .mama-system-heading {
856
+ font-family: Inter, 'Noto Sans KR', sans-serif;
857
+ font-size: 15px;
858
+ font-weight: 700;
859
+ color: #131313;
860
+ margin: 0 0 4px;
861
+ }
862
+
863
+ .mama-system-note {
864
+ font-size: 12px;
865
+ color: #6b6560;
866
+ margin: 0 0 14px;
867
+ }
868
+
869
+ .mama-system-note code,
870
+ .mama-system-code {
871
+ font-family: 'SF Mono', ui-monospace, Menlo, monospace;
872
+ font-size: 12px;
873
+ background: #f5f2ed;
874
+ border: 1px solid #ede9e1;
875
+ border-radius: var(--radius-button, 6px);
876
+ padding: 2px 6px;
877
+ color: #131313;
878
+ }
879
+
880
+ .mama-system-tiles {
881
+ display: grid;
882
+ grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));
883
+ gap: 10px;
884
+ }
885
+
886
+ .mama-system-tile {
887
+ background: #fff;
888
+ border: 1px solid #ede9e1;
889
+ border-radius: var(--radius-inner, 8px);
890
+ padding: 10px 12px;
891
+ display: flex;
892
+ flex-direction: column;
893
+ gap: 4px;
894
+ border-left: 3px solid #ede9e1;
895
+ }
896
+
897
+ .mama-system-tile[data-tone='ok'] {
898
+ border-left-color: #3a9e7e;
899
+ }
900
+ .mama-system-tile[data-tone='warn'] {
901
+ border-left-color: #e8a040;
902
+ }
903
+ .mama-system-tile[data-tone='bad'] {
904
+ border-left-color: #ff9999;
905
+ }
906
+ .mama-system-tile[data-tone='neutral'] {
907
+ border-left-color: #ffce00;
908
+ }
909
+
910
+ .mama-system-tile-label {
911
+ font-size: 10px;
912
+ text-transform: uppercase;
913
+ letter-spacing: 0.5px;
914
+ /* #9e9891 was ~2.6:1 on white -- below AA for this 10px label. */
915
+ color: #6b6560;
916
+ font-weight: 600;
917
+ }
918
+
919
+ .mama-system-tile-value {
920
+ font-size: 13px;
921
+ font-weight: 600;
922
+ color: #131313;
923
+ overflow-wrap: anywhere;
924
+ }
925
+
926
+ .mama-system-list {
927
+ list-style: none;
928
+ margin: 0;
929
+ padding: 0;
930
+ display: flex;
931
+ flex-direction: column;
932
+ gap: 6px;
933
+ }
934
+
935
+ .mama-system-row {
936
+ display: flex;
937
+ align-items: center;
938
+ gap: 8px;
939
+ background: #fff;
940
+ border: 1px solid #ede9e1;
941
+ border-radius: var(--radius-button, 6px);
942
+ padding: 8px 10px;
943
+ font-size: 12px;
944
+ }
945
+
946
+ .mama-system-dot {
947
+ width: 6px;
948
+ height: 6px;
949
+ border-radius: 1px;
950
+ background: #9e9891;
951
+ flex-shrink: 0;
952
+ }
953
+
954
+ .mama-system-row[data-tone='ok'] .mama-system-dot {
955
+ background: #3a9e7e;
956
+ }
957
+ .mama-system-row[data-tone='warn'] .mama-system-dot {
958
+ background: #e8a040;
959
+ }
960
+
961
+ .mama-system-row-name {
962
+ font-weight: 600;
963
+ color: #131313;
964
+ flex: 1;
965
+ }
966
+
967
+ .mama-system-row-state {
968
+ font-size: 11px;
969
+ color: #6b6560;
970
+ }
971
+
972
+ .mama-system-badge {
973
+ font-size: 9px;
974
+ /* #9e9891 was ~2.5:1 on the #f5f2ed chip -- below AA at 9px. */
975
+ color: #6b6560;
976
+ background: #f5f2ed;
977
+ padding: 1px 4px;
978
+ border-radius: 2px;
979
+ }
980
+
981
+ .mama-system-skeleton {
982
+ display: flex;
983
+ flex-direction: column;
984
+ gap: 8px;
985
+ max-width: 880px;
986
+ }
987
+
988
+ .mama-system-skeleton-row {
989
+ height: 44px;
990
+ border-radius: var(--radius-inner, 8px);
991
+ background: linear-gradient(90deg, #f5f2ed 25%, #ede9e1 50%, #f5f2ed 75%);
992
+ background-size: 200% 100%;
993
+ animation: mama-system-shimmer 1.4s ease-in-out infinite;
994
+ }
995
+
996
+ @keyframes mama-system-shimmer {
997
+ 0% {
998
+ background-position: 200% 0;
999
+ }
1000
+ 100% {
1001
+ background-position: -200% 0;
1002
+ }
1003
+ }
1004
+
1005
+ .mama-system-error,
1006
+ .mama-system-empty {
1007
+ max-width: 440px;
1008
+ background: #fff;
1009
+ border: 1px solid #ede9e1;
1010
+ border-radius: var(--radius-card, 12px);
1011
+ padding: 16px;
1012
+ }
1013
+
1014
+ .mama-system-error-title,
1015
+ .mama-system-empty-title {
1016
+ margin: 0 0 4px;
1017
+ font-size: 13px;
1018
+ font-weight: 700;
1019
+ color: #131313;
1020
+ }
1021
+
1022
+ .mama-system-error-detail,
1023
+ .mama-system-empty-detail {
1024
+ margin: 0 0 12px;
1025
+ font-size: 12px;
1026
+ color: #6b6560;
1027
+ overflow-wrap: anywhere;
1028
+ }
1029
+
1030
+ .mama-system-retry {
1031
+ background: #ffce00;
1032
+ color: #131313;
1033
+ border: none;
1034
+ border-radius: var(--radius-button, 6px);
1035
+ padding: 6px 12px;
1036
+ font-size: 12px;
1037
+ font-weight: 600;
1038
+ cursor: pointer;
1039
+ }
1040
+
1041
+ .mama-system-retry:hover {
1042
+ background: #e6b800;
1043
+ }