diff --git a/hermes_cli/session_export_html.py b/hermes_cli/session_export_html.py
index d11cb791251..286e566e702 100644
--- a/hermes_cli/session_export_html.py
+++ b/hermes_cli/session_export_html.py
@@ -18,6 +18,7 @@ ICON_WRENCH = ''
ICON_HERMES = ''
HTML_TEMPLATE = """
@@ -272,6 +273,12 @@ HTML_TEMPLATE = """
border-left: 4px solid var(--accent-color);
}}
+ .message-system {{
+ background-color: var(--bg-color);
+ border-left: 4px solid var(--secondary-text);
+ opacity: 0.9;
+ }}
+
.message-tool {{
background-color: #f8fafc;
border-style: dotted;
@@ -286,6 +293,11 @@ HTML_TEMPLATE = """
background-color: #041c1c;
}}
+ .message-system {{
+ background-color: #020617;
+ border-left: 4px solid var(--secondary-text);
+ }}
+
.message-tool {{
background-color: #0f172a;
}}
@@ -599,6 +611,8 @@ def _generate_messages_html(messages: List[Dict[str, Any]]) -> str:
role_icon = ICON_USER
elif role == "assistant":
role_icon = ICON_BOT
+ elif role == "system":
+ role_icon = ICON_SHIELD
# Handle multimodal or complex content
if isinstance(content, list):
@@ -725,7 +739,22 @@ def generate_multi_session_html_export(sessions: List[Dict[str, Any]]) -> str:
model = s.get("model", "Unknown")
started_at = _format_timestamp(s.get("started_at", 0))
messages = s.get("messages", [])
- messages_html = _generate_messages_html(messages)
+
+ # System Prompt Handling: Prepend if present in session metadata and not already in messages
+ system_prompt = s.get("system_prompt")
+ all_messages = []
+ if system_prompt:
+ # Avoid duplicating if the first message in the list is already the system prompt
+ first_msg = messages[0] if messages else None
+ if not (first_msg and first_msg.get("role") == "system" and first_msg.get("content") == system_prompt):
+ all_messages.append({
+ "role": "system",
+ "content": system_prompt,
+ "timestamp": s.get("started_at", 0)
+ })
+ all_messages.extend(messages)
+
+ messages_html = _generate_messages_html(all_messages)
view_class = "session-view"
if not is_multi: view_class += " active"