personal memory agent
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

Collapse observe card to 'No observers connected' when no observers are present

Add a collapsed empty state to the OBSERVATION STATUS card on the health dashboard.

When state.observers is empty, the card now shows 'No observers connected' with a link to /app/remote/ and the badge switches to a gray 'No observers' state.

When observers connect, the card expands back to the full six-channel observation grid.

+42 -1
+42 -1
apps/health/workspace.html
··· 158 158 gap: 1em; 159 159 } 160 160 161 + .observe-content.hidden { 162 + display: none; 163 + } 164 + 165 + .observe-empty { 166 + text-align: center; 167 + color: #6b7280; 168 + padding: 2em 1em; 169 + font-size: 0.95em; 170 + } 171 + 172 + .observe-empty a { 173 + color: #10b981; 174 + text-decoration: none; 175 + font-weight: 500; 176 + } 177 + 178 + .observe-empty a:hover { 179 + text-decoration: underline; 180 + } 181 + 161 182 .observe-section { 162 183 display: flex; 163 184 flex-direction: column; ··· 654 675 <span id="observeModeLabel">Waiting...</span> 655 676 </div> 656 677 </div> 657 - <div class="observe-content"> 678 + <div class="observe-empty" id="observeEmpty"> 679 + No observers connected — <a href="/app/remote/">Manage remotes →</a> 680 + </div> 681 + <div class="observe-content hidden" id="observeContent"> 658 682 <div class="observe-section"> 659 683 <div class="observe-section-title">Screencast</div> 660 684 <div class="observe-section-value" id="screencastStatus">Waiting...</div> ··· 807 831 transcribeDetail: document.getElementById('transcribeDetail'), 808 832 observersCard: document.getElementById('observersCard'), 809 833 observersGrid: document.getElementById('observersGrid'), 834 + observeContent: document.getElementById('observeContent'), 835 + observeEmpty: document.getElementById('observeEmpty'), 810 836 cortexSection: document.getElementById('cortexSection'), 811 837 cortexGrid: document.getElementById('cortexGrid'), 812 838 importerSection: document.getElementById('importerSection'), ··· 972 998 973 999 // Update observe mode badge 974 1000 function updateObserveMode() { 1001 + if (state.observers.size === 0) { 1002 + elements.observeModeBadge.className = 'health-badge idle'; 1003 + elements.observeModeLabel.textContent = 'No observers'; 1004 + return; 1005 + } 1006 + 975 1007 const mode = state.observers.get(state.localHost)?.mode; 976 1008 const badge = elements.observeModeBadge; 977 1009 const label = elements.observeModeLabel; ··· 993 1025 994 1026 // Update observe card 995 1027 function updateObserve() { 1028 + if (state.observers.size === 0) { 1029 + elements.observeEmpty.classList.remove('hidden'); 1030 + elements.observeContent.classList.add('hidden'); 1031 + updateObserveMode(); 1032 + return; 1033 + } 1034 + elements.observeEmpty.classList.add('hidden'); 1035 + elements.observeContent.classList.remove('hidden'); 1036 + 996 1037 const primary = state.localHost ? state.observers.get(state.localHost) : null; 997 1038 const tmux = state.localHost ? state.observers.get(state.localHost + '.tmux') : null; 998 1039