feat: web UI dashboard for managing Hermes Agent (salvage of #7621) - #8204
Closed
kshitijk4poor wants to merge 11 commits into
Closed
kshitijk4poor wants to merge 11 commits into
kshitijk4poor wants to merge 11 commits into
Conversation
kshitijk4poor
force-pushed
the
feat/web-ui-dashboard-salvage
branch
7 times, most recently
from
April 12, 2026 09:05
a044b3f to
989f633
Compare
Salvage of PR NousResearch#7621 by @teknium1, based on original PR NousResearch#1813 by @austinpickett. Adds an embedded web UI dashboard accessible via `hermes web`: - Status page: agent version, active sessions, gateway status, platforms - Config editor: schema-driven form with tabbed categories, import/export - API Keys page: set, clear, and view redacted values with category grouping Backend (hermes_cli/web_server.py): - FastAPI server with REST endpoints (/api/status, /api/sessions, etc.) - Dynamic CONFIG_SCHEMA generated from DEFAULT_CONFIG (157 fields) Frontend (web/): - Vite + React + TypeScript + Tailwind v4 SPA - shadcn/ui-style components, auto-refresh status page, toast notifications Fixes applied during salvage (vs PR NousResearch#7621): - Path traversal: added resolve().is_relative_to() check in serve_spa - Replaced duplicate delete_env_value() with existing remove_env_value() (which has input validation, managed-mode check, and sanitization) - CORS: replaced static origin list with allow_origin_regex matching any localhost port (fixes custom --port not being allowed) - reload_env(): now removes known Hermes vars deleted from .env - SessionDB: added db.close() in finally blocks to prevent handle leaks - Extracted _build_web_ui() helper (was copy-pasted 3 times) - Endpoints return generic errors; full exceptions logged server-side - ConfigPage: removed .yaml/.yml from file import accept (only JSON works) - Added .gitattributes to collapse package-lock.json in diffs - Non-localhost --host binding now logs a security warning - Added 17 tests for reload_env, redact_key, API endpoints, schema generation, and path traversal prevention
kshitijk4poor
force-pushed
the
feat/web-ui-dashboard-salvage
branch
from
April 12, 2026 09:34
989f633 to
62f5379
Compare
This snapshots the current local branch state so the remote reflects the in-progress dashboard salvage, skill visibility fix, supporting docs, and new local skills before further iteration. Constraint: User requested pushing the full local source state on the current branch Rejected: Split into multiple thematic commits | branch state should match the current working tree in one push Confidence: medium Scope-risk: broad Reversibility: clean Directive: .omx runtime state/logs were intentionally excluded from this commit Tested: python -m pytest tests/hermes_cli/test_web_server.py tests/hermes_cli/test_skills_hub.py -q Not-tested: Full repository test suite, frontend build/runtime validation for the broader dashboard changes
The web UI was mixing runtime availability with CLI-enabled toolset state and was also surfacing stale gateway platform entries from old runtime-status files. This update makes the dashboard follow current profile configuration, keeps backward compatibility for cached frontend bundles, and hides ghost platform statuses when the gateway daemon is down. Constraint: Existing PR branch had to stay incrementally updateable without rewriting history Rejected: Remove the old available field immediately | cached frontend bundles would render every toolset inactive Rejected: Trust runtime gateway platform entries while the daemon is stopped | stale status files produce ghost platforms Confidence: high Scope-risk: moderate Reversibility: clean Directive: Preserve API compatibility for web clients when changing response fields that may be cached in browser bundles Tested: python -m pytest tests/hermes_cli/test_web_server.py -q Tested: npm run build (web) Not-tested: Full repository test suite, interactive browser verification via CDP after MCP transport reset
Port the official hermes-agent.nousresearch.com design system: - Amber/warm-brown palette (#ffac02 accent, #170d02 background, #ffe6cb text) - Bundle custom fonts (Mondwest, Collapse, RulesExpanded, RulesCompressed, Courier Prime) - Grid-border layout with structural borders instead of rounded cards with shadows - Uppercase tracking, monospace body text, display headings - Dither texture utility, blink cursor animation, thin amber scrollbars - Plus-lighter blend mode on headings - Sharp-edged components (no border-radius) to match landing page aesthetic
…sresearch.com Major visual overhaul to match the official Hermes Agent site and NousResearch/design-language canonical design system: Color palette: - Dark teal background (#041C1C) matching LENS_0 from design-language - Warm cream text (#ffe6cb) as midground color - Subtle borders at 15% foreground opacity Typography: - Mondwest for nav labels, UI text, body - RulesExpanded Bold for card/section headings - RulesCompressed for badges (canonical pattern) - Collapse for brand mark - System monospace (SF Mono) for dynamic values like model names Overlays (from NousResearch/design-language): - Noise: color-dodge blend on #eaeaea at 10% opacity (CSS approx of canonical WebGL shader) - Vignette: top-left amber radial gradient, lighten blend, 22% opacity - Cards/header slightly transparent so grain composites through EnvPage redesign: - Group API keys by provider (Nous Portal first, then alphabetical) - API key + base URL grouped per provider in collapsible rows - All providers shown by default (no hidden-behind-advanced for LLM keys) - All provider groups collapsed by default UX fixes: - All dropdowns/accordions collapsed by default (skills, env providers) - Analytics chart colors: cream (#ffe6cb) for input, emerald for output - Session preview text: added right padding to prevent italic glyph clipping - Skill description text vertically centered in collapsed rows - Blink cursor only animates on group:hover (canonical pattern)
- Light/dark mode toggle with localStorage persistence (warm paper palette) - Session sort (newest/oldest/longest/shortest) and 'Open in CLI' button - Log output copy button, skills category filter with auto-expand - Config page: emoji → Lucide icons, info tooltips on all fields - Status page: System Info card (Hermes Home, Config Path, Release Date) - Analytics: theme-adaptive chart colors (bg-foreground/50, emerald output) - Tooltip component for Gateway PID, Config Version, Cache Hit, etc. - Mock API with realistic dummy data for GitHub Pages demo - Skills toolset emoji replaced with Lucide icons
- SWR-like useAPI hook: stale-while-revalidate cache eliminates loading spinners on page revisits, background refresh keeps data fresh - Session search now searches message content (progressive deep search with batched fetches, module-level cache, content match badges) - Activity heatmap: proper 7-row GitHub-style grid with week columns, day-of-week labels, month labels (pixel-based collision avoidance), CSS custom property colors for light/dark mode adaptation - Model donut: fixed rounding gap (last segment extends to 100%) - Cost trend: interactive hover with crosshair, dot, and date/cost tooltip - Tooltips: 200ms hover delay, fade-in animation, arrow pointer - Config migration: 'Migrate' badge replaced with 'Outdated' status + advisory banner with copyable CLI command (hermes config migrate) - Logs: line numbers in gutter - Sessions: sort labels clarified, search placeholder updated - Page transitions: CSS-driven opacity fade without component remount - Misc: duplicate import fix, sharp-edge consistency, light mode heatmap
… system Vendor lightweight components from NousResearch/design-language without heavy dependencies (three.js, gsap, leva, nanostores). This is the foundation for proper design system integration. Added: - nous/utils/ — cn, polyRef, colorDodge, colorMix (pure, no deps) - nous/lens.ts — static Lens system (LENS_DARK/LENS_LIGHT presets, applyLens sets CSS custom props matching canonical --background, --midground, --foreground layer vars) - nous/ui/blend-mode.ts — static BlendMode (colorDodge computation against Lens palette, no nanostores) - nous/ui/grid/ — Grid/Cell components + grid.css (auto-column layout via CSS :has() selectors) - nous/ui/typography/ — Typography, H2, Small with CVA variants - nous/ui/hover-bg.tsx — bg-midground hover highlight - nous/ui/blink.tsx — dither cursor on group hover Changed: - index.css: adopt design-language CSS var system (--background, --midground, --foreground with -base/-alpha companions), derive Tailwind @theme tokens from Lens vars, add arc-border animation, use canonical font family names (Rules Compressed/Expanded), adopt canonical scrollbar/selection/base styles
teknium1
added a commit
that referenced
this pull request
Apr 13, 2026
) Adds an embedded web UI dashboard accessible via `hermes web`: - Status page: agent version, active sessions, gateway status, connected platforms - Config editor: schema-driven form with tabbed categories, import/export, reset - API Keys page: set, clear, and view redacted values with category grouping - Sessions, Skills, Cron, Logs, and Analytics pages Backend: - hermes_cli/web_server.py: FastAPI server with REST endpoints - hermes_cli/config.py: reload_env() utility for hot-reloading .env - hermes_cli/main.py: `hermes web` subcommand (--port, --host, --no-open) - cli.py / commands.py: /reload slash command for .env hot-reload - pyproject.toml: [web] optional dependency extra (fastapi + uvicorn) - Both update paths (git + zip) auto-build web frontend when npm available Frontend: - Vite + React + TypeScript + Tailwind v4 SPA in web/ - shadcn/ui-style components, Nous design language - Auto-refresh status page, toast notifications, masked password inputs Security: - Path traversal guard (resolve().is_relative_to()) on SPA file serving - CORS localhost-only via allow_origin_regex - Generic error messages (no internal leak), SessionDB handles closed properly Tests: 47 tests covering reload_env, redact_key, API endpoints, schema generation, path traversal, category merging, internal key stripping, and full config round-trip. Original work by @austinpickett (PR #1813), salvaged by @kshitijk4poor (PR #7621 → #8204), re-salvaged onto current main with stale-branch regressions removed.
- Header: Small (Mondwest nav labels), HoverBg (midground hover)
- Theme toggle: applyLens(LENS_DARK/LENS_LIGHT) sets canonical CSS vars
- Card: blendColor('mg/0.03') for bg, Typography expanded for titles
- Badge: midground colors (bg mg/0.075, text mg, opacity var)
- Button: arc-border animated gradient stroke on default variant hover
- StatusPage + AnalyticsPage: Grid/Cell for summary card layouts
- SessionsPage: HoverBg on session row hover
- Donut chart: teal replaces cream (visible in light mode)
- Fix badge text clipping (leading-none + py-1)
teknium1
added a commit
that referenced
this pull request
Apr 13, 2026
) Adds an embedded web UI dashboard accessible via `hermes web`: - Status page: agent version, active sessions, gateway status, connected platforms - Config editor: schema-driven form with tabbed categories, import/export, reset - API Keys page: set, clear, and view redacted values with category grouping - Sessions, Skills, Cron, Logs, and Analytics pages Backend: - hermes_cli/web_server.py: FastAPI server with REST endpoints - hermes_cli/config.py: reload_env() utility for hot-reloading .env - hermes_cli/main.py: `hermes web` subcommand (--port, --host, --no-open) - cli.py / commands.py: /reload slash command for .env hot-reload - pyproject.toml: [web] optional dependency extra (fastapi + uvicorn) - Both update paths (git + zip) auto-build web frontend when npm available Frontend: - Vite + React + TypeScript + Tailwind v4 SPA in web/ - shadcn/ui-style components, Nous design language - Auto-refresh status page, toast notifications, masked password inputs Security: - Path traversal guard (resolve().is_relative_to()) on SPA file serving - CORS localhost-only via allow_origin_regex - Generic error messages (no internal leak), SessionDB handles closed properly Tests: 47 tests covering reload_env, redact_key, API endpoints, schema generation, path traversal, category merging, internal key stripping, and full config round-trip. Original work by @austinpickett (PR #1813), salvaged by @kshitijk4poor (PR #7621 → #8204), re-salvaged onto current main with stale-branch regressions removed.
teknium1
added a commit
that referenced
this pull request
Apr 13, 2026
* feat: web UI dashboard for managing Hermes Agent (salvage of #8204/#7621) Adds an embedded web UI dashboard accessible via `hermes web`: - Status page: agent version, active sessions, gateway status, connected platforms - Config editor: schema-driven form with tabbed categories, import/export, reset - API Keys page: set, clear, and view redacted values with category grouping - Sessions, Skills, Cron, Logs, and Analytics pages Backend: - hermes_cli/web_server.py: FastAPI server with REST endpoints - hermes_cli/config.py: reload_env() utility for hot-reloading .env - hermes_cli/main.py: `hermes web` subcommand (--port, --host, --no-open) - cli.py / commands.py: /reload slash command for .env hot-reload - pyproject.toml: [web] optional dependency extra (fastapi + uvicorn) - Both update paths (git + zip) auto-build web frontend when npm available Frontend: - Vite + React + TypeScript + Tailwind v4 SPA in web/ - shadcn/ui-style components, Nous design language - Auto-refresh status page, toast notifications, masked password inputs Security: - Path traversal guard (resolve().is_relative_to()) on SPA file serving - CORS localhost-only via allow_origin_regex - Generic error messages (no internal leak), SessionDB handles closed properly Tests: 47 tests covering reload_env, redact_key, API endpoints, schema generation, path traversal, category merging, internal key stripping, and full config round-trip. Original work by @austinpickett (PR #1813), salvaged by @kshitijk4poor (PR #7621 → #8204), re-salvaged onto current main with stale-branch regressions removed. * fix(web): clean up status page cards, always rebuild on `hermes web` - Remove config version migration alert banner from status page - Remove config version card (internal noise, not surfaced in TUI) - Reorder status cards: Agent → Gateway → Active Sessions (3-col grid) - `hermes web` now always rebuilds from source before serving, preventing stale web_dist when editing frontend files * feat(web): full-text search across session messages - Add GET /api/sessions/search endpoint backed by FTS5 - Auto-append prefix wildcards so partial words match (e.g. 'nimb' → 'nimby') - Debounced search (300ms) with spinner in the search icon slot - Search results show FTS5 snippets with highlighted match delimiters - Expanding a search hit auto-scrolls to the first matching message - Matching messages get a warning ring + 'match' badge - Inline term highlighting within Markdown (text, bold, italic, headings, lists) - Clear button (x) on search input for quick reset --------- Co-authored-by: emozilla <emozilla@nousresearch.com>
Collaborator
|
Merged via PR #8756. Your work (and @austinpickett's original PR #1813) was salvaged onto current main with stale-branch regressions removed. Thanks for the contribution! |
aj-nt
pushed a commit
to aj-nt/hermes-agent
that referenced
this pull request
May 1, 2026
* feat: web UI dashboard for managing Hermes Agent (salvage of NousResearch#8204/NousResearch#7621) Adds an embedded web UI dashboard accessible via `hermes web`: - Status page: agent version, active sessions, gateway status, connected platforms - Config editor: schema-driven form with tabbed categories, import/export, reset - API Keys page: set, clear, and view redacted values with category grouping - Sessions, Skills, Cron, Logs, and Analytics pages Backend: - hermes_cli/web_server.py: FastAPI server with REST endpoints - hermes_cli/config.py: reload_env() utility for hot-reloading .env - hermes_cli/main.py: `hermes web` subcommand (--port, --host, --no-open) - cli.py / commands.py: /reload slash command for .env hot-reload - pyproject.toml: [web] optional dependency extra (fastapi + uvicorn) - Both update paths (git + zip) auto-build web frontend when npm available Frontend: - Vite + React + TypeScript + Tailwind v4 SPA in web/ - shadcn/ui-style components, Nous design language - Auto-refresh status page, toast notifications, masked password inputs Security: - Path traversal guard (resolve().is_relative_to()) on SPA file serving - CORS localhost-only via allow_origin_regex - Generic error messages (no internal leak), SessionDB handles closed properly Tests: 47 tests covering reload_env, redact_key, API endpoints, schema generation, path traversal, category merging, internal key stripping, and full config round-trip. Original work by @austinpickett (PR NousResearch#1813), salvaged by @kshitijk4poor (PR NousResearch#7621 → NousResearch#8204), re-salvaged onto current main with stale-branch regressions removed. * fix(web): clean up status page cards, always rebuild on `hermes web` - Remove config version migration alert banner from status page - Remove config version card (internal noise, not surfaced in TUI) - Reorder status cards: Agent → Gateway → Active Sessions (3-col grid) - `hermes web` now always rebuilds from source before serving, preventing stale web_dist when editing frontend files * feat(web): full-text search across session messages - Add GET /api/sessions/search endpoint backed by FTS5 - Auto-append prefix wildcards so partial words match (e.g. 'nimb' → 'nimby') - Debounced search (300ms) with spinner in the search icon slot - Search results show FTS5 snippets with highlighted match delimiters - Expanding a search hit auto-scrolls to the first matching message - Matching messages get a warning ring + 'match' badge - Inline term highlighting within Markdown (text, bold, italic, headings, lists) - Clear button (x) on search input for quick reset --------- Co-authored-by: emozilla <emozilla@nousresearch.com>
02356abc
pushed a commit
to 02356abc/hermes-agent
that referenced
this pull request
May 14, 2026
* feat: web UI dashboard for managing Hermes Agent (salvage of NousResearch#8204/NousResearch#7621) Adds an embedded web UI dashboard accessible via `hermes web`: - Status page: agent version, active sessions, gateway status, connected platforms - Config editor: schema-driven form with tabbed categories, import/export, reset - API Keys page: set, clear, and view redacted values with category grouping - Sessions, Skills, Cron, Logs, and Analytics pages Backend: - hermes_cli/web_server.py: FastAPI server with REST endpoints - hermes_cli/config.py: reload_env() utility for hot-reloading .env - hermes_cli/main.py: `hermes web` subcommand (--port, --host, --no-open) - cli.py / commands.py: /reload slash command for .env hot-reload - pyproject.toml: [web] optional dependency extra (fastapi + uvicorn) - Both update paths (git + zip) auto-build web frontend when npm available Frontend: - Vite + React + TypeScript + Tailwind v4 SPA in web/ - shadcn/ui-style components, Nous design language - Auto-refresh status page, toast notifications, masked password inputs Security: - Path traversal guard (resolve().is_relative_to()) on SPA file serving - CORS localhost-only via allow_origin_regex - Generic error messages (no internal leak), SessionDB handles closed properly Tests: 47 tests covering reload_env, redact_key, API endpoints, schema generation, path traversal, category merging, internal key stripping, and full config round-trip. Original work by @austinpickett (PR NousResearch#1813), salvaged by @kshitijk4poor (PR NousResearch#7621 → NousResearch#8204), re-salvaged onto current main with stale-branch regressions removed. * fix(web): clean up status page cards, always rebuild on `hermes web` - Remove config version migration alert banner from status page - Remove config version card (internal noise, not surfaced in TUI) - Reorder status cards: Agent → Gateway → Active Sessions (3-col grid) - `hermes web` now always rebuilds from source before serving, preventing stale web_dist when editing frontend files * feat(web): full-text search across session messages - Add GET /api/sessions/search endpoint backed by FTS5 - Auto-append prefix wildcards so partial words match (e.g. 'nimb' → 'nimby') - Debounced search (300ms) with spinner in the search icon slot - Search results show FTS5 snippets with highlighted match delimiters - Expanding a search hit auto-scrolls to the first matching message - Matching messages get a warning ring + 'match' badge - Inline term highlighting within Markdown (text, bold, italic, headings, lists) - Clear button (x) on search input for quick reset --------- Co-authored-by: emozilla <emozilla@nousresearch.com>
gweeteve
pushed a commit
to gweeteve/hermes-agent
that referenced
this pull request
Jun 2, 2026
* feat: web UI dashboard for managing Hermes Agent (salvage of NousResearch#8204/NousResearch#7621) Adds an embedded web UI dashboard accessible via `hermes web`: - Status page: agent version, active sessions, gateway status, connected platforms - Config editor: schema-driven form with tabbed categories, import/export, reset - API Keys page: set, clear, and view redacted values with category grouping - Sessions, Skills, Cron, Logs, and Analytics pages Backend: - hermes_cli/web_server.py: FastAPI server with REST endpoints - hermes_cli/config.py: reload_env() utility for hot-reloading .env - hermes_cli/main.py: `hermes web` subcommand (--port, --host, --no-open) - cli.py / commands.py: /reload slash command for .env hot-reload - pyproject.toml: [web] optional dependency extra (fastapi + uvicorn) - Both update paths (git + zip) auto-build web frontend when npm available Frontend: - Vite + React + TypeScript + Tailwind v4 SPA in web/ - shadcn/ui-style components, Nous design language - Auto-refresh status page, toast notifications, masked password inputs Security: - Path traversal guard (resolve().is_relative_to()) on SPA file serving - CORS localhost-only via allow_origin_regex - Generic error messages (no internal leak), SessionDB handles closed properly Tests: 47 tests covering reload_env, redact_key, API endpoints, schema generation, path traversal, category merging, internal key stripping, and full config round-trip. Original work by @austinpickett (PR NousResearch#1813), salvaged by @kshitijk4poor (PR NousResearch#7621 → NousResearch#8204), re-salvaged onto current main with stale-branch regressions removed. * fix(web): clean up status page cards, always rebuild on `hermes web` - Remove config version migration alert banner from status page - Remove config version card (internal noise, not surfaced in TUI) - Reorder status cards: Agent → Gateway → Active Sessions (3-col grid) - `hermes web` now always rebuilds from source before serving, preventing stale web_dist when editing frontend files * feat(web): full-text search across session messages - Add GET /api/sessions/search endpoint backed by FTS5 - Auto-append prefix wildcards so partial words match (e.g. 'nimb' → 'nimby') - Debounced search (300ms) with spinner in the search icon slot - Search results show FTS5 snippets with highlighted match delimiters - Expanding a search hit auto-scrolls to the first matching message - Matching messages get a warning ring + 'match' badge - Inline term highlighting within Markdown (text, bold, italic, headings, lists) - Clear button (x) on search input for quick reset --------- Co-authored-by: emozilla <emozilla@nousresearch.com>
waefrebeorn
pushed a commit
to waefrebeorn/slermes
that referenced
this pull request
Jul 2, 2026
* feat: web UI dashboard for managing Hermes Agent (salvage of NousResearch#8204/NousResearch#7621) Adds an embedded web UI dashboard accessible via `hermes web`: - Status page: agent version, active sessions, gateway status, connected platforms - Config editor: schema-driven form with tabbed categories, import/export, reset - API Keys page: set, clear, and view redacted values with category grouping - Sessions, Skills, Cron, Logs, and Analytics pages Backend: - hermes_cli/web_server.py: FastAPI server with REST endpoints - hermes_cli/config.py: reload_env() utility for hot-reloading .env - hermes_cli/main.py: `hermes web` subcommand (--port, --host, --no-open) - cli.py / commands.py: /reload slash command for .env hot-reload - pyproject.toml: [web] optional dependency extra (fastapi + uvicorn) - Both update paths (git + zip) auto-build web frontend when npm available Frontend: - Vite + React + TypeScript + Tailwind v4 SPA in web/ - shadcn/ui-style components, Nous design language - Auto-refresh status page, toast notifications, masked password inputs Security: - Path traversal guard (resolve().is_relative_to()) on SPA file serving - CORS localhost-only via allow_origin_regex - Generic error messages (no internal leak), SessionDB handles closed properly Tests: 47 tests covering reload_env, redact_key, API endpoints, schema generation, path traversal, category merging, internal key stripping, and full config round-trip. Original work by @austinpickett (PR NousResearch#1813), salvaged by @kshitijk4poor (PR NousResearch#7621 → NousResearch#8204), re-salvaged onto current main with stale-branch regressions removed. * fix(web): clean up status page cards, always rebuild on `hermes web` - Remove config version migration alert banner from status page - Remove config version card (internal noise, not surfaced in TUI) - Reorder status cards: Agent → Gateway → Active Sessions (3-col grid) - `hermes web` now always rebuilds from source before serving, preventing stale web_dist when editing frontend files * feat(web): full-text search across session messages - Add GET /api/sessions/search endpoint backed by FTS5 - Auto-append prefix wildcards so partial words match (e.g. 'nimb' → 'nimby') - Debounced search (300ms) with spinner in the search icon slot - Search results show FTS5 snippets with highlighted match delimiters - Expanding a search hit auto-scrolls to the first matching message - Matching messages get a warning ring + 'match' badge - Inline term highlighting within Markdown (text, bold, italic, headings, lists) - Clear button (x) on search input for quick reset --------- Co-authored-by: emozilla <emozilla@nousresearch.com>
prmartinow
pushed a commit
to prmartinow/hermes-agent
that referenced
this pull request
Aug 26, 2026
* feat: web UI dashboard for managing Hermes Agent (salvage of NousResearch#8204/NousResearch#7621) Adds an embedded web UI dashboard accessible via `hermes web`: - Status page: agent version, active sessions, gateway status, connected platforms - Config editor: schema-driven form with tabbed categories, import/export, reset - API Keys page: set, clear, and view redacted values with category grouping - Sessions, Skills, Cron, Logs, and Analytics pages Backend: - hermes_cli/web_server.py: FastAPI server with REST endpoints - hermes_cli/config.py: reload_env() utility for hot-reloading .env - hermes_cli/main.py: `hermes web` subcommand (--port, --host, --no-open) - cli.py / commands.py: /reload slash command for .env hot-reload - pyproject.toml: [web] optional dependency extra (fastapi + uvicorn) - Both update paths (git + zip) auto-build web frontend when npm available Frontend: - Vite + React + TypeScript + Tailwind v4 SPA in web/ - shadcn/ui-style components, Nous design language - Auto-refresh status page, toast notifications, masked password inputs Security: - Path traversal guard (resolve().is_relative_to()) on SPA file serving - CORS localhost-only via allow_origin_regex - Generic error messages (no internal leak), SessionDB handles closed properly Tests: 47 tests covering reload_env, redact_key, API endpoints, schema generation, path traversal, category merging, internal key stripping, and full config round-trip. Original work by @austinpickett (PR NousResearch#1813), salvaged by @kshitijk4poor (PR NousResearch#7621 → NousResearch#8204), re-salvaged onto current main with stale-branch regressions removed. * fix(web): clean up status page cards, always rebuild on `hermes web` - Remove config version migration alert banner from status page - Remove config version card (internal noise, not surfaced in TUI) - Reorder status cards: Agent → Gateway → Active Sessions (3-col grid) - `hermes web` now always rebuilds from source before serving, preventing stale web_dist when editing frontend files * feat(web): full-text search across session messages - Add GET /api/sessions/search endpoint backed by FTS5 - Auto-append prefix wildcards so partial words match (e.g. 'nimb' → 'nimby') - Debounced search (300ms) with spinner in the search icon slot - Search results show FTS5 snippets with highlighted match delimiters - Expanding a search hit auto-scrolls to the first matching message - Matching messages get a warning ring + 'match' badge - Inline term highlighting within Markdown (text, bold, italic, headings, lists) - Clear button (x) on search input for quick reset --------- Co-authored-by: emozilla <emozilla@nousresearch.com>
melon-xf
added a commit
to melon-xf/hermes-agent
that referenced
this pull request
Sep 3, 2026
* feat: web UI dashboard for managing Hermes Agent (salvage of NousResearch#8204/NousResearch#7621) Adds an embedded web UI dashboard accessible via `hermes web`: - Status page: agent version, active sessions, gateway status, connected platforms - Config editor: schema-driven form with tabbed categories, import/export, reset - API Keys page: set, clear, and view redacted values with category grouping - Sessions, Skills, Cron, Logs, and Analytics pages Backend: - hermes_cli/web_server.py: FastAPI server with REST endpoints - hermes_cli/config.py: reload_env() utility for hot-reloading .env - hermes_cli/main.py: `hermes web` subcommand (--port, --host, --no-open) - cli.py / commands.py: /reload slash command for .env hot-reload - pyproject.toml: [web] optional dependency extra (fastapi + uvicorn) - Both update paths (git + zip) auto-build web frontend when npm available Frontend: - Vite + React + TypeScript + Tailwind v4 SPA in web/ - shadcn/ui-style components, Nous design language - Auto-refresh status page, toast notifications, masked password inputs Security: - Path traversal guard (resolve().is_relative_to()) on SPA file serving - CORS localhost-only via allow_origin_regex - Generic error messages (no internal leak), SessionDB handles closed properly Tests: 47 tests covering reload_env, redact_key, API endpoints, schema generation, path traversal, category merging, internal key stripping, and full config round-trip. Original work by @austinpickett (PR NousResearch#1813), salvaged by @kshitijk4poor (PR NousResearch#7621 → NousResearch#8204), re-salvaged onto current main with stale-branch regressions removed. * fix(web): clean up status page cards, always rebuild on `hermes web` - Remove config version migration alert banner from status page - Remove config version card (internal noise, not surfaced in TUI) - Reorder status cards: Agent → Gateway → Active Sessions (3-col grid) - `hermes web` now always rebuilds from source before serving, preventing stale web_dist when editing frontend files * feat(web): full-text search across session messages - Add GET /api/sessions/search endpoint backed by FTS5 - Auto-append prefix wildcards so partial words match (e.g. 'nimb' → 'nimby') - Debounced search (300ms) with spinner in the search icon slot - Search results show FTS5 snippets with highlighted match delimiters - Expanding a search hit auto-scrolls to the first matching message - Matching messages get a warning ring + 'match' badge - Inline term highlighting within Markdown (text, bold, italic, headings, lists) - Clear button (x) on search input for quick reset --------- Co-authored-by: emozilla <emozilla@nousresearch.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Salvage of PR #7621 by @teknium1 (originally from PR #1813 by @austinpickett) onto current main.
Adds an embedded web UI dashboard accessible via
hermes web:Backend
hermes_cli/web_server.py— FastAPI server with REST endpoints (/api/status,/api/sessions,/api/config,/api/env)hermes_cli/config.py— Addedreload_env()utility (with proper deleted-var cleanup)hermes_cli/main.py— Addedhermes websubcommand (--port,--host,--no-open), extracted_build_web_ui()helpercli.py/commands.py— Added/reloadslash command for hot-reloading .envpyproject.toml— Added[web]optional dependency extra (fastapi + uvicorn)Frontend
web/Fixes applied during salvage (vs PR #7621)
serve_spa(URL-encoded%2e%2e/bypass)resolve().is_relative_to()guarddelete_env_value()missing validation, managed check, sanitizationremove_env_value()--port(middleware copied origins at init, list mutation was no-op)allow_origin_regexmatching any localhost portreload_env()didn't remove deleted vars.envdb.close()infinallyblocks_build_web_ui()helperstr(e)in 500 responses)_log.exception()server-side.yamlimport but only parsed JSON.yaml/.ymlfromacceptattributelogging.warning()when--hostis not localhost.gitattributesfor generated filespackage-lock.jsonin diffsGET /api/confignormalizesmodeldict → string;PUTreads disk to reconstruct model dict — no_model_metaleakage_CATEGORY_ORDER(30 → 15 tabs)_build_schema_from_config— nowf"{prefix}.{key}" if prefix else keyGET /api/configstrips_config_version,_model_metaand all_-prefixed keysschema.typebeforetypeof value— prevents wrong widget for dict valuesNumber.isNaN()guard — ignores invalid input instead of writing NaNreact-router-domdependencypackage.json(app uses state-based navigation)reload_env,redact_key, API endpoints, schema generation, path traversal, category merging, internal key stripping, and full config round-tripTest plan
python -m pytest tests/hermes_cli/test_web_server.py -n0 -q→ 27 passedpython -m pytest tests/hermes_cli/test_config.py tests/hermes_cli/test_commands.py tests/hermes_cli/test_web_server.py -n0 -q→ 173 passed_model_metaleakage%2e%2e/sequences