Skip to content

feat: web UI dashboard for managing Hermes Agent (salvage of #7621) - #8204

Closed
kshitijk4poor wants to merge 11 commits into
NousResearch:mainfrom
kshitijk4poor:feat/web-ui-dashboard-salvage
Closed

kshitijk4poor wants to merge 11 commits into
NousResearch:mainfrom
kshitijk4poor:feat/web-ui-dashboard-salvage

Conversation

@kshitijk4poor

@kshitijk4poor kshitijk4poor commented Apr 12, 2026

Copy link
Copy Markdown
Contributor

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:

  • Status page: agent version, active sessions, gateway status, connected platforms
  • Config editor: schema-driven form with tabbed categories, import/export, reset to defaults
  • 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, /api/config, /api/env)
  • hermes_cli/config.py — Added reload_env() utility (with proper deleted-var cleanup)
  • hermes_cli/main.py — Added hermes web subcommand (--port, --host, --no-open), extracted _build_web_ui() helper
  • cli.py / commands.py — Added /reload slash command for hot-reloading .env
  • pyproject.toml — Added [web] optional dependency extra (fastapi + uvicorn)
  • Both update paths (git + zip) now build the web frontend automatically when npm is available

Frontend

  • Vite + React + TypeScript + Tailwind v4 SPA in web/
  • shadcn/ui-style components (Card, Badge, Button, Input, Tabs, etc.)
  • Auto-refresh status page, toast notifications, masked password inputs

Fixes applied during salvage (vs PR #7621)

Issue Fix
Path traversal in serve_spa (URL-encoded %2e%2e/ bypass) Added resolve().is_relative_to() guard
Duplicate delete_env_value() missing validation, managed check, sanitization Deleted; use existing remove_env_value()
CORS broken for custom --port (middleware copied origins at init, list mutation was no-op) Replaced with allow_origin_regex matching any localhost port
reload_env() didn't remove deleted vars Now removes known Hermes vars absent from .env
SessionDB handle leaks (created per request, never closed) Added db.close() in finally blocks
Web build code copy-pasted 3× Extracted _build_web_ui() helper
Error messages leaked internals (str(e) in 500 responses) Generic message + _log.exception() server-side
ConfigPage accepted .yaml import but only parsed JSON Removed .yaml/.yml from accept attribute
No security warning for non-localhost bind Added logging.warning() when --host is not localhost
No .gitattributes for generated files Added to collapse package-lock.json in diffs
Config view/edit broken: model type mismatch GET /api/config normalizes model dict → string; PUT reads disk to reconstruct model dict — no _model_meta leakage
30 category tabs (many with 1 field) Top-level scalars → "general" category; small categories merged; ordered tabs via _CATEGORY_ORDER (30 → 15 tabs)
Schema prefix logic inverted Fixed _build_schema_from_config — now f"{prefix}.{key}" if prefix else key
Internal keys leaked to frontend GET /api/config strips _config_version, _model_meta and all _-prefixed keys
AutoField typeof-first trap Reordered to check schema.type before typeof value — prevents wrong widget for dict values
Number field NaN corruption Added Number.isNaN() guard — ignores invalid input instead of writing NaN
Unused react-router-dom dependency Removed from package.json (app uses state-based navigation)
Zero tests Added 27 tests covering reload_env, redact_key, API endpoints, schema generation, path traversal, category merging, internal key stripping, and full config round-trip

Test plan

  • python -m pytest tests/hermes_cli/test_web_server.py -n0 -q → 27 passed
  • python -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
  • Config round-trip verified: model dict subkeys (provider, base_url, api_mode) preserved through GET→edit→PUT cycle without _model_meta leakage
  • Schema type-match verified: all 161 schema fields have config values of the expected type
  • Path traversal verified blocked with URL-encoded %2e%2e/ sequences

@kshitijk4poor
kshitijk4poor force-pushed the feat/web-ui-dashboard-salvage branch 7 times, most recently from a044b3f to 989f633 Compare April 12, 2026 09:05
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
kshitijk4poor force-pushed the feat/web-ui-dashboard-salvage branch from 989f633 to 62f5379 Compare April 12, 2026 09:34
kshitijk4poor and others added 8 commits April 12, 2026 16:11
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.
SHL0MS and others added 2 commits April 12, 2026 23:18
- 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>
@teknium1

Copy link
Copy Markdown
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!

@teknium1 teknium1 closed this Apr 13, 2026
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#7621NousResearch#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#7621NousResearch#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#7621NousResearch#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#7621NousResearch#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#7621NousResearch#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#7621NousResearch#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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants