hermes - ✅(Solved) Fix [Feature]: Support configurable startup/session panels and improve TUI skin parity [1 pull requests, 1 participants]

Official PRs (…)
ON THIS PAGE

Recommended Tools

×6

Utilities matched from this issue’s tags and category — try them while you read without losing context.

GitHub issue graph ai analysis

Paste a GitHub issue URL. We fetch that issue, discover linked issues from bodies/comments/timeline, collect linked pull requests, and produce a structured English report.

The report is written in English Markdown for sharing and archival.

Helpful · Quick feedback

Loading…
GitHub stats
NousResearch/hermes-agent#17977Fetched 2026-05-01 05:54:40
View on GitHub
Comments
0
Participants
1
Timeline
5
Reactions
0
Author
Participants
Timeline (top)
labeled ×4cross-referenced ×1

Root Cause

The result is that deeper skin and startup/session customization currently requires local source patches. Those patches are fragile because they need to be reapplied or repaired after hermes update. This seems like a general theming/configuration gap rather than something specific to one skin.

Fix Action

Fix / Workaround

The result is that deeper skin and startup/session customization currently requires local source patches. Those patches are fragile because they need to be reapplied or repaired after hermes update. This seems like a general theming/configuration gap rather than something specific to one skin.

Local source patches

I tested local patches that added an alternate startup/session dashboard behind a skin flag. This proved the use case, but it is not a good long-term approach because local source patches are overwritten or broken by updates.

PR fix notes

PR #18163: feat(skin): pass spinner, tool_emojis, and status bar colors to TUI

Description (problem / solution / changelog)

Summary

Completes the Python to TUI skin data pipeline by passing spinner, tool_emojis, and all 8 status_bar_* color fields through resolve_skin() and mapping them properly in fromSkin().

Changes

tui_gateway/server.py

  • resolve_skin() now sends spinner, tool_emojis, status_bar_bg, status_bar_text, status_bar_strong, status_bar_dim, status_bar_good, status_bar_warn, status_bar_bad, status_bar_critical
  • Wrapped colors/branding with or {} for safety before .get() calls

ui-tui/src/gatewayTypes.ts

  • Added spinner, tool_emojis, and all 8 status_bar_* fields to GatewaySkin

ui-tui/src/theme.ts

  • fromSkin() now reads status_bar_bg/status_bar_text instead of hardcoded default colors for statusBg/statusFg
  • statusGood/statusWarn look up status_bar_good/status_bar_warn first, then fall back to ui_ok/ui_warn, then default colors
  • statusBad/statusCritical look up status_bar_bad/status_bar_critical before falling back to defaults

Backward Compatibility

All new fields are optional. Skins that don't set them continue to work identically -- every value falls through to the same defaults as before.

Refs

Closes #17977

Changed files

  • tui_gateway/server.py (modified, +17/-3)
  • ui-tui/src/gatewayTypes.ts (modified, +10/-0)
  • ui-tui/src/theme.ts (modified, +6/-6)

Code Example

I am happy to test and review the behavior. I may be able to help with a PR, but I wanted to confirm the desired upstream API before implementing.

This is a feature request based on source inspection rather than a runtime crash.

Relevant upstream files inspected:

• hermes_cli/skin_engine.py
• hermes_cli/banner.py
• tui_gateway/server.py
• ui-tui/src/gatewayTypes.ts
• ui-tui/src/theme.ts
• ui-tui/src/components/branding.tsx

I also searched existing issues and did not find an obvious duplicate for configurable startup/session panels or TUI skin parity.
RAW_BUFFERClick to expand / collapse

Problem or Use Case

Hermes has a YAML skin system that supports custom colors, branding, banner logo/hero art, spinner settings, tool emojis, and tool prefixes. The pure YAML skin path works well for basic visual customization, but there are two limitations today that affect any non-trivial custom skin:

  1. The CLI and TUI skin support are not fully aligned.

    The Python skin engine exposes fields such as spinner, tool_emojis, status bar colors, completion menu colors, selection_bg, and shell_dollar, but the TUI gateway payload and TUI theme types only consume a subset of those fields. This means a skin can define values that are valid at the skin-engine layer but are ignored or hardcoded in the TUI.

  2. The startup/session panel is not configurable.

    Both CLI and TUI currently render a fixed default Tools + Skills style panel. That default is useful, but it is hardcoded. There does not appear to be a supported way to choose a different panel type for users who want startup/session context oriented around a different workflow, such as operational agent status, project status, recent sessions, MCP state, or a minimal focused panel.

The result is that deeper skin and startup/session customization currently requires local source patches. Those patches are fragile because they need to be reapplied or repaired after hermes update. This seems like a general theming/configuration gap rather than something specific to one skin.

Proposed Solution

Add a configurable startup/session panel slot and improve the TUI skin bridge so it consumes the same skin semantics as the Python skin engine.

  1. Add a startup/session panel slot

Make the current panel explicit as the default, while allowing users to select alternate built-in panel types.

Simple form:

─ yaml startup_panel: default

Example alternate form:

─ yaml startup_panel: agent_stats

default would preserve current behavior: Tools + Skills + optional MCP details.

agent_stats is just one example of a possible built-in panel type. It could render operational state useful for users running multiple Hermes profiles/gateways, such as:

• active profile / agent roster • gateway health • session count, message count, and tool-call count • channel/source distribution, such as cli, cron, discord, telegram, etc. • active model/provider/context signal • recent skills, if available

The broader idea is not limited to stats. The goal is to make the startup/session panel a configurable slot rather than a hardcoded layout. Future built-in panel types could include examples like:

─ yaml startup_panel: minimal startup_panel: sessions startup_panel: mcp startup_panel: project

A future more extensible shape could also be considered:

─ yaml startup_panel: type: agent_stats

That would leave room for section-level options later, for example:

─ yaml startup_panel: type: agent_stats sections: - profiles - gateway_health - channels - session_counts - model_signal

But a simple string enum would be enough as a first step.

Unknown values should gracefully fall back to default.

  1. Improve TUI skin parity

Extend the TUI skin payload/types/mapping to cover the fields the skin engine already supports or documents. In particular:

• spinner • tool_emojis • status_bar_dim • status_bar_good • status_bar_dim • status_bar_good • status_bar_good • status_bar_critical • status_bar_critical • status_bar_critical

Implementation-wise, this likely means updating:

Implementation-wise, this likely means updating: Implementation-wise, this likely means updating: • ui-tui/src/gatewayTypes.ts so the payload is typed • ui-tui/src/gatewayTypes.ts so the payload is typed • ui-tui/src/gatewayTypes.ts so the payload is typed • Data collection should be best-effort and degrade gracefully. • CLI and TUI should remain aligned in behavior where possible.

────────────────────────────────────

• CLI and TUI should remain aligned in behavior where possible.

────────────────────────────────────

• CLI and TUI should remain aligned in behavior where possible.

Alternatives Considered

Local source patches

I tested local patches that added an alternate startup/session dashboard behind a skin flag. This proved the use case, but it is not a good long-term approach because local source patches are overwritten or broken by updates.

A boolean such as show_stats: true

This works for a single local experiment, but it is not the right upstream API. It sounds like a small display toggle, while the actual behavior is selecting a different startup/session panel layout. A string enum like startup_panel: agent_stats is clearer and leaves room for future panel modes, such as minimal, sessions, mcp, or project.

A fully custom user-defined panel system immediately

A fully pluggable panel system would be powerful, but it may be too large for a first implementation. A small set of built-in panel types behind a stable startup_panel option would solve the immediate problem while keeping the design open for future extensibility.

A skill

This does not seem like a good fit for a skill. The feature affects first-class CLI/TUI rendering, typed TUI JSON-RPC payloads, and the skin/theme system itself. It cannot be implemented cleanly as instructions or shell commands.

Feature Type

CLI improvement

Scope

Medium (few files, < 300 lines)

Contribution

  • I'd like to implement this myself and submit a PR

Debug Report (optional)

I am happy to test and review the behavior. I may be able to help with a PR, but I wanted to confirm the desired upstream API before implementing.

This is a feature request based on source inspection rather than a runtime crash.

Relevant upstream files inspected:

• hermes_cli/skin_engine.py
• hermes_cli/banner.py
• tui_gateway/server.py
• ui-tui/src/gatewayTypes.ts
• ui-tui/src/theme.ts
• ui-tui/src/components/branding.tsx

I also searched existing issues and did not find an obvious duplicate for configurable startup/session panels or TUI skin parity.

extent analysis

TL;DR

Implement a configurable startup/session panel slot and improve TUI skin bridge to consume the same skin semantics as the Python skin engine.

Guidance

  • Add a startup_panel field to the YAML skin configuration to allow users to select alternate built-in panel types.
  • Update the TUI skin payload and types to cover the fields supported by the skin engine, such as spinner, tool_emojis, and status_bar colors.
  • Ensure that unknown values for startup_panel fall back to the default behavior.
  • Review and update relevant files, including hermes_cli/skin_engine.py, ui-tui/src/gatewayTypes.ts, and ui-tui/src/theme.ts, to implement the changes.

Example

startup_panel: agent_stats

This example sets the startup/session panel to the agent_stats type, which could render operational state useful for users running multiple Hermes profiles/gateways.

Notes

The implementation should be done in a way that keeps the design open for future extensibility, such as adding more built-in panel types or allowing for custom user-defined panels.

Recommendation

Apply the proposed solution to add a configurable startup/session panel slot and improve TUI skin parity, as it addresses the current limitations and provides a clear and extensible API for future customization.

Vote matrix · Quick signals

Works
Did the solution work? Tap to confirm.
Easy Fix
Was it a quick fix?
Time Saver
Did it save you time?
Blocking
Was it severely blocking?
Common Issue
Are others likely hitting this too?
Flaky / Intermittent
Is it intermittent?
Verified / Reproducible
Can you reproduce it reliably?
Loading…

Still need to ship something?

×6

Another batch ranked right after the header list — different links, same matching logic.

Back to top recommendations

TRENDING

hermes - ✅(Solved) Fix [Feature]: Support configurable startup/session panels and improve TUI skin parity [1 pull requests, 1 participants]