Add connection status indicator to all service UIs + extend smoke tests #70

Closed
opened 2026-03-20 21:33:42 +00:00 by mik-tf · 7 comments
Owner

Problem

hero_proc_ui has a connection status indicator (green dot in navbar) that shows:

  • UI Server: version + responding status
  • Backend: responding status
  • Last checked timestamp + "Recheck now" button

Other service UIs (hero_redis_ui, hero_embedder_ui, hero_books_ui, hero_inspector_ui, hero_collab_ui, hero_browser_ui, hero_whiteboard_ui, etc.) don't have this. Users can't tell if the backend is healthy without checking container logs.

Part 1 — Connection status component for all UIs

Pattern (from hero_proc_ui)

  • static/js/connection-status.js — standalone JS module
  • Checks UI /health endpoint + backend RPC rpc.health via /rpc/proxy
  • Renders green/red dot + expandable panel on click
  • Auto-checks every 30s

Services to add it to

Service UI Backend Notes
hero_redis_ui hero_redis_server Has own WASM island wrapping iframe
hero_embedder_ui hero_embedder_server WASM island
hero_books_ui hero_books_server Iframe island
hero_inspector_ui hero_inspector_server WASM island
hero_collab_ui hero_collab_server Iframe island
hero_browser_ui hero_browser_server Iframe island
hero_whiteboard_ui hero_whiteboard_server Iframe island
hero_foundry_admin hero_foundry_server WASM island
hero_aibroker_ui hero_aibroker_server WASM island

Implementation

  • Extract connection-status.js from hero_proc_ui into a reusable pattern
  • Each UI includes it in their base template
  • Config: UI health URL + backend RPC URL (service-specific)

Part 2 — Extend smoke tests for new services

Add to hero_services/tests/smoke.sh

Health checks:

  • hero_collab_ui, hero_collab_server
  • hero_browser_ui, hero_browser_server
  • hero_whiteboard_ui, hero_whiteboard_server

RPC connectivity:

  • Call rpc.health or rpc.discover on each server via its UI proxy
  • Verify response contains "result"

Target: 57+ smoke tests covering all services

Part 3 — Foundry seed data

hero_foundry_admin and hero_foundry_ui both show "No repositories" when empty. Need:

  • Demo repos seeded on startup (similar to how hero_books seeds libraries)
  • Or a "Demo" button that populates sample repos

Signed-off-by: mik-tf

## Problem hero_proc_ui has a connection status indicator (green dot in navbar) that shows: - UI Server: version + responding status - Backend: responding status - Last checked timestamp + "Recheck now" button Other service UIs (hero_redis_ui, hero_embedder_ui, hero_books_ui, hero_inspector_ui, hero_collab_ui, hero_browser_ui, hero_whiteboard_ui, etc.) don't have this. Users can't tell if the backend is healthy without checking container logs. ## Part 1 — Connection status component for all UIs ### Pattern (from hero_proc_ui) - `static/js/connection-status.js` — standalone JS module - Checks UI `/health` endpoint + backend RPC `rpc.health` via `/rpc/proxy` - Renders green/red dot + expandable panel on click - Auto-checks every 30s ### Services to add it to | Service UI | Backend | Notes | |---|---|---| | hero_redis_ui | hero_redis_server | Has own WASM island wrapping iframe | | hero_embedder_ui | hero_embedder_server | WASM island | | hero_books_ui | hero_books_server | Iframe island | | hero_inspector_ui | hero_inspector_server | WASM island | | hero_collab_ui | hero_collab_server | Iframe island | | hero_browser_ui | hero_browser_server | Iframe island | | hero_whiteboard_ui | hero_whiteboard_server | Iframe island | | hero_foundry_admin | hero_foundry_server | WASM island | | hero_aibroker_ui | hero_aibroker_server | WASM island | ### Implementation - Extract `connection-status.js` from hero_proc_ui into a reusable pattern - Each UI includes it in their base template - Config: UI health URL + backend RPC URL (service-specific) ## Part 2 — Extend smoke tests for new services ### Add to `hero_services/tests/smoke.sh` **Health checks:** - hero_collab_ui, hero_collab_server - hero_browser_ui, hero_browser_server - hero_whiteboard_ui, hero_whiteboard_server **RPC connectivity:** - Call `rpc.health` or `rpc.discover` on each server via its UI proxy - Verify response contains `"result"` **Target:** 57+ smoke tests covering all services ## Part 3 — Foundry seed data hero_foundry_admin and hero_foundry_ui both show "No repositories" when empty. Need: - Demo repos seeded on startup (similar to how hero_books seeds libraries) - Or a "Demo" button that populates sample repos Signed-off-by: mik-tf
Author
Owner

Implementation Plan

Step 0: Extend connection-status.js module (hero_proc)

The current module's popover is hardcoded — no way to inject service-specific data (model counts, key counts, etc.). Add an optional extraInfoFn callback that returns key/value pairs rendered as extra rows in the popover. Backwards-compatible — services that don't use it see no change.

Step 1a: Add indicator — hero_books_ui

Copy module, add HTML snippet (status-dot + status-label) to navbar in base.html, add init call. Has /health endpoint already.

Step 1b: Add indicator — hero_foundry_admin

Same pattern as books. Has /health endpoint, has base.html with navbar.

Step 2a: Standardize — hero_redis_ui

Replace custom inline polling with standard module. Preserve keys count + memory usage via extraInfoFn calling redis.info.

Step 2b: Standardize — hero_embedder_ui

Replace custom inline polling. Preserve model count + quality levels (Q1-Q4) via extraInfoFn calling info RPC.

Step 2c: Standardize — hero_aibroker_ui

Replace custom inline polling. Preserve model count + provider count via extraInfoFn calling info RPC.

Step 2d: Standardize — hero_inspector_ui

Replace SSE-based status dot with standard module. Keep SSE for service discovery events (separate concern).

Step 3: Rebuild — hero_browser_ui

Full dashboard rebuild following hero_proc_ui pattern:

  • Askama templates (base.html + index.html)
  • Embedded Bootstrap 5.3.3 + Icons 1.13.1 + Unpoly via rust-embed (no CDN)
  • Standard navbar with connection-status.js status dot
  • Sidebar with stats (active sessions, total pages, activity count)
  • Tabs: Sessions, Activity Log, Integration Guide, API Docs
  • Dark/light theme toggle
  • Standard dashboard.css with compact sizing

Step 4: Foundry seed data

Seed demo repositories on startup so neither foundry service shows empty UI:

  • hero_foundry (admin/API backend): create demo repos with branches/tags/commits via the API
  • hero_foundry_ui (web repo browser): discovers same repos from filesystem — distinct read-only browsing UI, not a duplicate

Step 5: Extend smoke tests

Add health + RPC connectivity tests for new/updated services to hero_services/tests/smoke.sh, targeting 57+ total tests.

Step 6: Sync module copies

Copy updated connection-status.js to hero_collab_ui and hero_whiteboard_ui so all copies match.

Repos touched (all on development_mik)

hero_proc, hero_books, hero_foundry, hero_foundry_ui, hero_redis, hero_embedder, hero_aibroker, hero_inspector, hero_browser_mcp, hero_services


Signed-off-by: mik-tf

## Implementation Plan ### Step 0: Extend `connection-status.js` module (hero_proc) The current module's popover is hardcoded — no way to inject service-specific data (model counts, key counts, etc.). Add an optional `extraInfoFn` callback that returns key/value pairs rendered as extra rows in the popover. Backwards-compatible — services that don't use it see no change. ### Step 1a: Add indicator — hero_books_ui Copy module, add HTML snippet (`status-dot` + `status-label`) to navbar in `base.html`, add init call. Has `/health` endpoint already. ### Step 1b: Add indicator — hero_foundry_admin Same pattern as books. Has `/health` endpoint, has `base.html` with navbar. ### Step 2a: Standardize — hero_redis_ui Replace custom inline polling with standard module. Preserve keys count + memory usage via `extraInfoFn` calling `redis.info`. ### Step 2b: Standardize — hero_embedder_ui Replace custom inline polling. Preserve model count + quality levels (Q1-Q4) via `extraInfoFn` calling `info` RPC. ### Step 2c: Standardize — hero_aibroker_ui Replace custom inline polling. Preserve model count + provider count via `extraInfoFn` calling `info` RPC. ### Step 2d: Standardize — hero_inspector_ui Replace SSE-based status dot with standard module. Keep SSE for service discovery events (separate concern). ### Step 3: Rebuild — hero_browser_ui Full dashboard rebuild following hero_proc_ui pattern: - Askama templates (`base.html` + `index.html`) - Embedded Bootstrap 5.3.3 + Icons 1.13.1 + Unpoly via rust-embed (no CDN) - Standard navbar with `connection-status.js` status dot - Sidebar with stats (active sessions, total pages, activity count) - Tabs: Sessions, Activity Log, Integration Guide, API Docs - Dark/light theme toggle - Standard `dashboard.css` with compact sizing ### Step 4: Foundry seed data Seed demo repositories on startup so neither foundry service shows empty UI: - **hero_foundry** (admin/API backend): create demo repos with branches/tags/commits via the API - **hero_foundry_ui** (web repo browser): discovers same repos from filesystem — distinct read-only browsing UI, not a duplicate ### Step 5: Extend smoke tests Add health + RPC connectivity tests for new/updated services to `hero_services/tests/smoke.sh`, targeting 57+ total tests. ### Step 6: Sync module copies Copy updated `connection-status.js` to hero_collab_ui and hero_whiteboard_ui so all copies match. ### Repos touched (all on `development_mik`) hero_proc, hero_books, hero_foundry, hero_foundry_ui, hero_redis, hero_embedder, hero_aibroker, hero_inspector, hero_browser_mcp, hero_services --- Signed-off-by: mik-tf
Author
Owner

Implementation Complete

All steps implemented on development_mik branches across 12 repos. Summary:

Step 0: Extended connection-status.js (hero_proc)

  • Added extraInfoFn callback for service-specific popover data (model counts, keys, etc.)
  • Backwards-compatible — services that don't use it see no change

Step 1a: hero_books_ui — Added indicator

  • connection-status.js + HTML snippet + static file route + init

Step 1b: hero_foundry_admin — Added indicator

  • connection-status.js + navbar dot + static route via rust-embed

Step 2a: hero_redis_ui — Standardized

  • Replaced custom updateServerStatus() with module
  • Keys/memory preserved via extraInfoFn

Step 2b: hero_embedder_ui — Standardized

  • Replaced custom loadServerInfo() with module
  • Model count/quality levels preserved via extraInfoFn

Step 2c: hero_aibroker_ui — Standardized

  • Replaced custom pollStatus() with module
  • Model/provider counts preserved via extraInfoFn
  • Added rust-embed for static assets

Step 2d: hero_inspector — Standardized

  • Replaced SSE-based dot with module
  • SSE for service discovery kept separately

Step 3: hero_browser_ui — Full rebuild

  • Converted from single static index.html to Askama templates
  • Embedded Bootstrap 5.3.3 + Icons (no CDN)
  • Standard navbar with connection-status.js
  • Tabbed layout: Sessions, Integration Guide, API Docs
  • Sidebar with live stats
  • dashboard.css + dashboard.js extracted

Step 4: Foundry seed data

  • seed_data example creates 2 demo repos (hero-app.forge, hero-docs.forge)
  • Each has branches, tags, and multiple commits
  • Both foundry services discover them automatically
  • seed-foundry-repos.sh script for container init

Step 5: Smoke tests extended

  • Added health checks for browser_ui, collab_ui, whiteboard_ui
  • Added RPC tests for browser + aibroker
  • Added foundry repo count verification

Step 6: Module synced

  • Updated connection-status.js in hero_collab_ui and hero_whiteboard_ui

Repos touched

hero_proc, hero_books, hero_foundry, hero_redis, hero_embedder, hero_aibroker, hero_inspector, hero_browser_mcp, hero_services, hero_collab, hero_whiteboard

All on development_mik — ready for verification and squash merge.


Signed-off-by: mik-tf

## Implementation Complete All steps implemented on `development_mik` branches across 12 repos. Summary: ### Step 0: Extended connection-status.js (hero_proc) - Added `extraInfoFn` callback for service-specific popover data (model counts, keys, etc.) - Backwards-compatible — services that don't use it see no change ### Step 1a: hero_books_ui — Added indicator - connection-status.js + HTML snippet + static file route + init ### Step 1b: hero_foundry_admin — Added indicator - connection-status.js + navbar dot + static route via rust-embed ### Step 2a: hero_redis_ui — Standardized - Replaced custom `updateServerStatus()` with module - Keys/memory preserved via `extraInfoFn` ### Step 2b: hero_embedder_ui — Standardized - Replaced custom `loadServerInfo()` with module - Model count/quality levels preserved via `extraInfoFn` ### Step 2c: hero_aibroker_ui — Standardized - Replaced custom `pollStatus()` with module - Model/provider counts preserved via `extraInfoFn` - Added rust-embed for static assets ### Step 2d: hero_inspector — Standardized - Replaced SSE-based dot with module - SSE for service discovery kept separately ### Step 3: hero_browser_ui — Full rebuild - Converted from single static index.html to Askama templates - Embedded Bootstrap 5.3.3 + Icons (no CDN) - Standard navbar with connection-status.js - Tabbed layout: Sessions, Integration Guide, API Docs - Sidebar with live stats - dashboard.css + dashboard.js extracted ### Step 4: Foundry seed data - `seed_data` example creates 2 demo repos (hero-app.forge, hero-docs.forge) - Each has branches, tags, and multiple commits - Both foundry services discover them automatically - `seed-foundry-repos.sh` script for container init ### Step 5: Smoke tests extended - Added health checks for browser_ui, collab_ui, whiteboard_ui - Added RPC tests for browser + aibroker - Added foundry repo count verification ### Step 6: Module synced - Updated connection-status.js in hero_collab_ui and hero_whiteboard_ui ### Repos touched hero_proc, hero_books, hero_foundry, hero_redis, hero_embedder, hero_aibroker, hero_inspector, hero_browser_mcp, hero_services, hero_collab, hero_whiteboard All on `development_mik` — ready for verification and squash merge. --- Signed-off-by: mik-tf
Author
Owner

Post-#70 Follow-up Items

These are pre-existing issues discovered during testing, not regressions from #70:

1. Compute UI blank page

  • hero_compute_ui loads but shows blank content
  • Not touched in #70 — separate investigation needed

2. Foundry seed data not wired into entrypoint

  • seed_data example binary and seed-foundry-repos.sh script were created
  • Need to: build seed_data binary, include in dist, call from Docker entrypoint
  • Both foundry admin and foundry UI show "No repositories registered"

3. Redis SSO token invalid in iframe

  • Redis UI shows {"error":"invalid token"} when loaded via Hero OS iframe
  • SSO token from parent frame not being passed correctly
  • Pre-existing auth flow issue, not related to connection-status changes

4. hero_agent integration (issue #72)

  • Rust replacement for hero_shrimp — 12K lines already written
  • Needs hero_proc lifecycle, admin UI, service config, smoke tests

Signed-off-by: mik-tf

## Post-#70 Follow-up Items These are pre-existing issues discovered during testing, not regressions from #70: ### 1. Compute UI blank page - `hero_compute_ui` loads but shows blank content - Not touched in #70 — separate investigation needed ### 2. Foundry seed data not wired into entrypoint - `seed_data` example binary and `seed-foundry-repos.sh` script were created - Need to: build `seed_data` binary, include in dist, call from Docker entrypoint - Both foundry admin and foundry UI show "No repositories registered" ### 3. Redis SSO token invalid in iframe - Redis UI shows `{"error":"invalid token"}` when loaded via Hero OS iframe - SSO token from parent frame not being passed correctly - Pre-existing auth flow issue, not related to connection-status changes ### 4. hero_agent integration (issue #72) - Rust replacement for hero_shrimp — 12K lines already written - Needs hero_proc lifecycle, admin UI, service config, smoke tests --- Signed-off-by: mik-tf
Author
Owner

Squash Merged to Development

All 11 repos squash merged and pushed. Branches cleaned up.

Working (visible dot + clickable popover):

  • hero_proc_ui
  • hero_books_ui
  • hero_browser_ui (shows Backend Down — needs pingFn fix)

Code deployed but needs per-service fixes:

  • hero_embedder_ui — dot exists but not visible (CSS/init timing)
  • hero_redis_ui — blocked by SSO token issue in iframe
  • hero_inspector_ui — shows "backend down" text, pingFn calls wrong method
  • hero_aibroker_ui — dot visible but not clickable (Bootstrap load order)
  • hero_foundry_admin — dot only on repo pages, not repo list
  • hero_collab_ui — CSS not loading (absolute paths in iframe)
  • hero_whiteboard_ui — web view template loads in iframe, not admin view

Infrastructure delivered:

  • connection-status.js module with extraInfoFn
  • 96 smoke tests (94 pass, 0 fail)
  • UI integrity test section (assets, status-dot, broken paths)
  • Browser UI full dashboard rebuild
  • Foundry seed data example
  • Makefile dist-quick now includes shrimp

Next: Fix remaining 8 services

Each needs specific per-service attention to work correctly in the Hero OS iframe context. Will continue in follow-up.


Signed-off-by: mik-tf

## Squash Merged to Development All 11 repos squash merged and pushed. Branches cleaned up. ### Working (visible dot + clickable popover): - hero_proc_ui - hero_books_ui - hero_browser_ui (shows Backend Down — needs pingFn fix) ### Code deployed but needs per-service fixes: - hero_embedder_ui — dot exists but not visible (CSS/init timing) - hero_redis_ui — blocked by SSO token issue in iframe - hero_inspector_ui — shows "backend down" text, pingFn calls wrong method - hero_aibroker_ui — dot visible but not clickable (Bootstrap load order) - hero_foundry_admin — dot only on repo pages, not repo list - hero_collab_ui — CSS not loading (absolute paths in iframe) - hero_whiteboard_ui — web view template loads in iframe, not admin view ### Infrastructure delivered: - connection-status.js module with extraInfoFn - 96 smoke tests (94 pass, 0 fail) - UI integrity test section (assets, status-dot, broken paths) - Browser UI full dashboard rebuild - Foundry seed data example - Makefile dist-quick now includes shrimp ### Next: Fix remaining 8 services Each needs specific per-service attention to work correctly in the Hero OS iframe context. Will continue in follow-up. --- Signed-off-by: mik-tf
Author
Owner

Connection status indicator — follow-up fixes (round 2)

What was fixed

  • connection-status.js: Added popover retry logic (20x250ms) for CDN bootstrap delay
  • hero_inspector_ui: Fixed RPC method system.ping → inspector.services
  • hero_browser_ui: Fixed RPC method browser.list_sessions → rpc.health
  • hero_aibroker_ui: Added BASE_PATH env var, DOMContentLoaded wrap
  • hero_foundry_admin: Added status dot to base_global.html + navbar_global.html, fixed HERO_FOUNDRY_BASE_PATH
  • hero_collab_ui: Added status dot to standalone chat.html with base tag for proxy paths
  • hero_whiteboard_ui: Added status dot to base_web.html with admin/static/ paths
  • hero_redis_ui: Fixed SSO redirect (JSON→login redirect for retry), static files packaging, iframe-mode dot
  • hero_auth_ui: Added inline connection status poller with UI/Backend breakdown
  • hero_embedder_ui: Added CSS animation + cursor to dashboard.css
  • Smoke tests: Added popover deps verification (113 tests, 110 pass, 0 fail)

All 11 services now have visible + clickable status dot

Remaining: backend connectivity issues (not status indicator)

  • redis_server: Backend unavailable (-32000) — socket not connecting
  • auth: Backend RPC health unreachable
  • aibroker: API key auth error in info RPC call

Pushed to development on all 11 repos.

## Connection status indicator — follow-up fixes (round 2) ### What was fixed - **connection-status.js**: Added popover retry logic (20x250ms) for CDN bootstrap delay - **hero_inspector_ui**: Fixed RPC method system.ping → inspector.services - **hero_browser_ui**: Fixed RPC method browser.list_sessions → rpc.health - **hero_aibroker_ui**: Added BASE_PATH env var, DOMContentLoaded wrap - **hero_foundry_admin**: Added status dot to base_global.html + navbar_global.html, fixed HERO_FOUNDRY_BASE_PATH - **hero_collab_ui**: Added status dot to standalone chat.html with base tag for proxy paths - **hero_whiteboard_ui**: Added status dot to base_web.html with admin/static/ paths - **hero_redis_ui**: Fixed SSO redirect (JSON→login redirect for retry), static files packaging, iframe-mode dot - **hero_auth_ui**: Added inline connection status poller with UI/Backend breakdown - **hero_embedder_ui**: Added CSS animation + cursor to dashboard.css - **Smoke tests**: Added popover deps verification (113 tests, 110 pass, 0 fail) ### All 11 services now have visible + clickable status dot ### Remaining: backend connectivity issues (not status indicator) - redis_server: Backend unavailable (-32000) — socket not connecting - auth: Backend RPC health unreachable - aibroker: API key auth error in info RPC call Pushed to development on all 11 repos.
Author
Owner

Round 3 — connection status for remaining services

Pushed to development

  • hero_proxy_ui — replaced Online badge with clickable status dot (works perfectly)
  • hero_osis_ui — added to Askama base.html template
  • hero_biz — added to Rust format template
  • hero_voice_ui — added to status bar
  • hero_indexer_ui — added to static/index.html
  • hero_shrimp_ui — added to admin.ts TypeScript template

Needs follow-up

  • voice: dot position needs CSS refinement (overlaps toolbar)
  • indexer: served page differs from source file, changes may not reach compiled binary
  • shrimp: needs full make dist to recompile Bun binary

Total: 17 services now have connection status indicator

## Round 3 — connection status for remaining services ### Pushed to development - **hero_proxy_ui** — replaced Online badge with clickable status dot (works perfectly) - **hero_osis_ui** — added to Askama base.html template - **hero_biz** — added to Rust format template - **hero_voice_ui** — added to status bar - **hero_indexer_ui** — added to static/index.html - **hero_shrimp_ui** — added to admin.ts TypeScript template ### Needs follow-up - voice: dot position needs CSS refinement (overlaps toolbar) - indexer: served page differs from source file, changes may not reach compiled binary - shrimp: needs full make dist to recompile Bun binary ### Total: 17 services now have connection status indicator
Author
Owner

Round 4 — voice dot position + indexer popover + proxy root redirect

Fixed

hero_voice_ui — Moved status dot from bottom status bar to navbar header next to "HeroVoice" brand text. Popover placement changed from top to bottom. Matches the hero_proxy_ui pattern perfectly.

hero_indexer_ui — The actual served UI is from lhumina_code/hero_indexer_ui/ (Askama templates in templates/base.html, 2944 lines rendered), NOT from hero_indexer/crates/hero_indexer_ui/static/index.html (167 lines, separate rust-embed app). Replaced the non-clickable CSS-only status dot with the full clickable popover (health + RPC ping + recheck button).

hero_proxy_server — Root handler (/) was showing a service discovery dashboard instead of redirecting to Hero OS. Added HERO_PROXY_DEFAULT_SERVICE check: when set, redirects / to the configured service (e.g. /hero_os_ui/). Dashboard still accessible when env var is unset.

hero_services — Two fixes:

  1. entrypoint.sh: socat bridge was routing port 6666 → hero_proxy_ui.sock (admin dashboard only). Fixed to route to hero_proxy_server TCP:9997 (the actual reverse proxy).
  2. hero_proxy.toml: Added HERO_PROXY_DEFAULT_SERVICE = "hero_os_ui" so root redirects to Hero OS.

UI patterns for connection status indicator

Three different UI architectures encountered across services:

Pattern Services How it works
Shared JS module (connection-status.js) hero_proc_ui, hero_books_ui, hero_embedder_ui, hero_inspector_ui, hero_browser_ui, hero_collab_ui, hero_whiteboard_ui, hero_foundry_admin External JS file loaded via <script src>, configurable per service
Inline JS poller (rust-embed static HTML) hero_voice_ui, hero_proxy_ui, hero_auth_ui Self-contained inline <script> block before </body>, Bootstrap Popover with health+RPC polling
Askama template + inline JS hero_indexer_ui, hero_osis_ui, hero_biz Inline poller added to Askama base.html template, compiled at build time

All patterns produce the same UX: green pulsing dot → click → popover showing UI Server + Backend status + recheck button.

Smoke tests

111 passed, 0 failed, 2 skipped.

Signed-off-by: mik-tf

## Round 4 — voice dot position + indexer popover + proxy root redirect ### Fixed **hero_voice_ui** — Moved status dot from bottom status bar to navbar header next to "HeroVoice" brand text. Popover placement changed from `top` to `bottom`. Matches the hero_proxy_ui pattern perfectly. **hero_indexer_ui** — The actual served UI is from `lhumina_code/hero_indexer_ui/` (Askama templates in `templates/base.html`, 2944 lines rendered), NOT from `hero_indexer/crates/hero_indexer_ui/static/index.html` (167 lines, separate rust-embed app). Replaced the non-clickable CSS-only status dot with the full clickable popover (health + RPC ping + recheck button). **hero_proxy_server** — Root handler (`/`) was showing a service discovery dashboard instead of redirecting to Hero OS. Added `HERO_PROXY_DEFAULT_SERVICE` check: when set, redirects `/` to the configured service (e.g. `/hero_os_ui/`). Dashboard still accessible when env var is unset. **hero_services** — Two fixes: 1. `entrypoint.sh`: socat bridge was routing port 6666 → `hero_proxy_ui.sock` (admin dashboard only). Fixed to route to `hero_proxy_server` TCP:9997 (the actual reverse proxy). 2. `hero_proxy.toml`: Added `HERO_PROXY_DEFAULT_SERVICE = "hero_os_ui"` so root redirects to Hero OS. ### UI patterns for connection status indicator Three different UI architectures encountered across services: | Pattern | Services | How it works | |---------|----------|-------------| | **Shared JS module** (`connection-status.js`) | hero_proc_ui, hero_books_ui, hero_embedder_ui, hero_inspector_ui, hero_browser_ui, hero_collab_ui, hero_whiteboard_ui, hero_foundry_admin | External JS file loaded via `<script src>`, configurable per service | | **Inline JS poller** (rust-embed static HTML) | hero_voice_ui, hero_proxy_ui, hero_auth_ui | Self-contained inline `<script>` block before `</body>`, Bootstrap Popover with health+RPC polling | | **Askama template + inline JS** | hero_indexer_ui, hero_osis_ui, hero_biz | Inline poller added to Askama `base.html` template, compiled at build time | All patterns produce the same UX: green pulsing dot → click → popover showing UI Server + Backend status + recheck button. ### Smoke tests 111 passed, 0 failed, 2 skipped. Signed-off-by: mik-tf
Sign in to join this conversation.
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
lhumina_code/home#70
No description provided.