feat: web ui to manage hermes agent - #1813
Closed
austinpickett wants to merge 3 commits into
Closed
austinpickett wants to merge 3 commits into
austinpickett wants to merge 3 commits into
Conversation
austinpickett
marked this pull request as draft
March 17, 2026 20:09
austinpickett
force-pushed
the
feat/web-ui
branch
2 times, most recently
from
March 19, 2026 13:47
95bf391 to
cab2cd5
Compare
austinpickett
marked this pull request as ready for review
March 19, 2026 14:25
austinpickett
force-pushed
the
feat/web-ui
branch
from
March 19, 2026 20:05
247dcc1 to
e104e79
Compare
|
Looking forward to this! |
austinpickett
force-pushed
the
feat/web-ui
branch
from
March 29, 2026 22:47
e104e79 to
4a23336
Compare
austinpickett
force-pushed
the
feat/web-ui
branch
from
March 30, 2026 00:43
b6cc700 to
6d13dab
Compare
teknium1
pushed a commit
that referenced
this pull request
Apr 11, 2026
Adds an embedded web UI dashboard accessible via `hermes web`. Provides a browser-based interface for: - Monitoring agent status, gateway, and active/recent sessions - Editing config.yaml with a schema-driven form editor - Managing API keys in .env (set, clear, view redacted) Backend: FastAPI server (hermes_cli/web_server.py) with REST endpoints. Frontend: Vite + React + TypeScript + Tailwind v4 SPA (web/ directory). Also adds: - `/reload` slash command for hot-reloading .env variables - `delete_env_value()` and `reload_env()` utilities in config.py - `[web]` optional dependency extra (fastapi + uvicorn) - Web build step in `hermes update` (both git and zip paths) - hermes_cli/web_dist/ to .gitignore and package-data Salvaged from PR #1813 by austinpickett onto current main. Fixes applied during salvage: - Replaced hardcoded CONFIG_SCHEMA with dynamic generation from DEFAULT_CONFIG - Restricted CORS to localhost origins (was allow_origins=[*]) - Dropped _maybe_reload_env from model_tools.py (stale reverts to core dispatch) - Dropped .python-version file - Skipped all stale-branch reverts (pyproject.toml, model_tools.py, etc.)
kshitijk4poor
added a commit
to kshitijk4poor/hermes-agent
that referenced
this pull request
Apr 12, 2026
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
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
) 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>
angelburgosrosado
pushed a commit
to angelburgosrosado/hermes-agent
that referenced
this pull request
Apr 28, 2026
Adds an embedded web UI dashboard accessible via `hermes web`. Provides a browser-based interface for: - Monitoring agent status, gateway, and active/recent sessions - Editing config.yaml with a schema-driven form editor - Managing API keys in .env (set, clear, view redacted) Backend: FastAPI server (hermes_cli/web_server.py) with REST endpoints. Frontend: Vite + React + TypeScript + Tailwind v4 SPA (web/ directory). Also adds: - `/reload` slash command for hot-reloading .env variables - `delete_env_value()` and `reload_env()` utilities in config.py - `[web]` optional dependency extra (fastapi + uvicorn) - Web build step in `hermes update` (both git and zip paths) - hermes_cli/web_dist/ to .gitignore and package-data Salvaged from PR NousResearch#1813 by austinpickett onto current main. Fixes applied during salvage: - Replaced hardcoded CONFIG_SCHEMA with dynamic generation from DEFAULT_CONFIG - Restricted CORS to localhost origins (was allow_origins=[*]) - Dropped _maybe_reload_env from model_tools.py (stale reverts to core dispatch) - Dropped .python-version file - Skipped all stale-branch reverts (pyproject.toml, model_tools.py, etc.)
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>
jh1nresh
pushed a commit
to jh1nresh/hermes-agent
that referenced
this pull request
Aug 26, 2026
Adds an embedded web UI dashboard accessible via `hermes web`. Provides a browser-based interface for: - Monitoring agent status, gateway, and active/recent sessions - Editing config.yaml with a schema-driven form editor - Managing API keys in .env (set, clear, view redacted) Backend: FastAPI server (hermes_cli/web_server.py) with REST endpoints. Frontend: Vite + React + TypeScript + Tailwind v4 SPA (web/ directory). Also adds: - `/reload` slash command for hot-reloading .env variables - `delete_env_value()` and `reload_env()` utilities in config.py - `[web]` optional dependency extra (fastapi + uvicorn) - Web build step in `hermes update` (both git and zip paths) - hermes_cli/web_dist/ to .gitignore and package-data Salvaged from PR NousResearch#1813 by austinpickett onto current main. Fixes applied during salvage: - Replaced hardcoded CONFIG_SCHEMA with dynamic generation from DEFAULT_CONFIG - Restricted CORS to localhost origins (was allow_origins=[*]) - Dropped _maybe_reload_env from model_tools.py (stale reverts to core dispatch) - Dropped .python-version file - Skipped all stale-branch reverts (pyproject.toml, model_tools.py, etc.)
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.
What does this PR do?
Adds an embedded web UI dashboard to Hermes Agent, accessible via
hermes web. It provides a browser-based interface for managing configuration (~/.hermes/config.yaml), API keys (~/.hermes/.env), and monitoring active/recent chat sessions — without needing to manually edit files or restart sessions.Also adds automatic hot-reloading of environment variables: when a user updates an API key (via the web UI or by editing
.envdirectly), running chat sessions pick up the change within seconds, with no restart or manual/reloadneeded.Related Issue
N/A — new feature, no existing issue.
Type of Change
Changes Made
Backend (Python)
hermes_cli/web_server.py— New FastAPI server with REST endpoints:/api/status,/api/sessions,/api/config(GET/PUT),/api/config/defaults,/api/config/schema,/api/env(GET/PUT/DELETE). Serves the built SPA with client-side routing fallback.hermes_cli/config.py— Addedreload_env()(re-reads.envintoos.environ),delete_env_value()(removes a key from.envandos.environ)model_tools.py— Added_maybe_reload_env()auto-reload: checks.envfile mtime every 5s before tool dispatch, transparently refreshesos.environwhen the file changescli.py— Added/reloadslash command for explicit manual env reloadhermes_cli/commands.py— Registered/reloadin the help menu under "Tools & Skills"hermes_cli/main.py— Addedhermes websubcommand (--port,--host,--no-openflags) andcmd_web()handlerpyproject.toml— Added[web]optional dependency (fastapi,uvicorn), included in[all]extra, addedweb_dist/**/*to package-data.gitignore— Addedhermes_cli/web_dist/, changedhermes_agent.egg-info/to*.egg-info/Frontend (Vite + React + TypeScript + Tailwind v4)
web/vite.config.ts— Vite config with Tailwind v4,@/path alias, build output tohermes_cli/web_dist/, dev proxy for/apiweb/tsconfig.app.json— AddedbaseUrl/pathsfor alias resolutionweb/index.html— Updated title to "Hermes Agent"web/src/index.css— Dark theme using Tailwind v4@themewith oklch custom propertiesweb/src/App.tsx— Main layout with Status / Config / API Keys navigationweb/src/lib/api.ts— Typed API client for all backend endpointsweb/src/lib/utils.ts—cn()class merging utilityweb/src/lib/nested.ts—getNestedValue()/setNestedValue()for dot-path object accessweb/src/hooks/useToast.ts— Shared toast notification hookweb/src/components/Toast.tsx— Reusable toast banner componentweb/src/components/AutoField.tsx— Schema-driven form field renderer (string, number, boolean, select, list, text, nested objects)web/src/components/ui/— 8 shadcn/ui-style primitives: Card, Badge, Button, Input, Label, Select, Switch, Separator, Tabsweb/src/pages/StatusPage.tsx— Agent version, active session count, gateway status, config version, active/recent session list with auto-refreshweb/src/pages/ConfigPage.tsx— Tabbed config editor driven by backend schema, with save/reset/export/importweb/src/pages/EnvPage.tsx— API key management with save, clear (delete), masked input, category grouping, "Get key" linksweb/README.md— Updated from Vite boilerplate to project-specific docsHow to Test
pip install fastapi uvicorncd web && npm install && npm run buildpython -m hermes_cli.main webhttp://127.0.0.1:9119— verify Status, Config, and API Keys pages loadpython -m hermes_cli.main chat/reload— verify it reports the count of updated vars/help— verify/reloadappears under "Tools & Skills"Checklist
Code
fix(scope):,feat(scope):, etc.)pytest tests/ -qand all tests passDocumentation & Housekeeping
docs/, docstrings) — or N/Acli-config.yaml.exampleif I added/changed config keys — or N/ACONTRIBUTING.mdorAGENTS.mdif I changed architecture or workflows — or N/AScreenshots / Logs