Skip to content

feat: add hermes-status plugin#898

Open
Mel-SRK wants to merge 1 commit into
noctalia-dev:mainfrom
Mel-SRK:add-hermes-status
Open

feat: add hermes-status plugin#898
Mel-SRK wants to merge 1 commit into
noctalia-dev:mainfrom
Mel-SRK:add-hermes-status

Conversation

@Mel-SRK
Copy link
Copy Markdown

@Mel-SRK Mel-SRK commented May 29, 2026

Hermes Agent Status Plugin

Traffic-light status indicator for Hermes Agent (CLI + Gateway) in Noctalia Shell.

What it does

Shows real-time Hermes Agent status in the status bar:

Icon Color Status Trigger
Green Online Gateway running, idle
Blue Busy Thinking, tool call, processing
🔔 Amber Needs You Awaiting user approval
Orange Degraded Platform connection issue
Red Offline Gateway not running

Architecture

hermes hooks → hermes-status-hook → signal file → noctalia plugin (QML)
  • Hook writes are sub-second; UI refreshes on signal file change
  • Fallback polling every 30s for gateway/platform status
  • Busy signals auto-revert after 30s stale timeout

Features

  • Real-time hook-based status updates
  • Click-to-expand detail panel (Gateway PID, session state, tokens, platform connections)
  • Settings UI (script path, poll interval, signal file path, hide when idle)
  • Supports Niri compositor

Preview

preview

Source

Full source and installation guide: https://github.com/Mel-SRK/noctalia-hermes

Traffic-light status indicator for Hermes Agent (CLI + Gateway).
Shows online/busy/attention/degraded/offline states in the status bar
with real-time hook-based updates via hermes shell hooks.

Features:
- Real-time status via hook signal file (sub-second latency)
- Fallback polling with configurable interval
- Click-to-expand detail panel (Gateway PID, session, tokens, platforms)
- Settings UI for script path, poll interval, signal file
- Supports Niri compositor
@github-actions
Copy link
Copy Markdown
Contributor

Automatic Manifest Check


File: hermes-status/manifest.json

  • (H) Line 7: Do not add the 'official' property. It's automatically false and is NOT needed!
+  "official": false,

@github-actions
Copy link
Copy Markdown
Contributor

Automatic Code Quality Review


File: hermes-status/BarWidget.qml

  • (L) Line 124: When it comes to translations there is no need for fallback values. From: pluginApi?.tr("example") || "value". To: pluginApi?.tr("example")
+        "label": pluginApi?.tr("menu.refresh") ?? "Refresh",
  • (L) Line 129: When it comes to translations there is no need for fallback values. From: pluginApi?.tr("example") || "value". To: pluginApi?.tr("example")
+        "label": pluginApi?.tr("menu.clear-attention") ?? "Clear Attention",
  • (H) Missing required property sectionWidgetIndex. For example:
property int sectionWidgetIndex: -1
  • (H) Missing required property sectionWidgetsCount. For example:
property int sectionWidgetsCount: 0

File: hermes-status/Panel.qml

  • (H) Line 120: Do not use hardcoded values, always prefer to use the Style singleton instead
+        spacing: 4
  • (H) Line 133: Use translations instead of hardcoded text. Instead of: "Example Label". To: pluginApi?.tr("panel.example-label")
+            text: "Hermes"
  • (H) Line 169: Use translations instead of hardcoded text. Instead of: "Example Label". To: pluginApi?.tr("panel.example-label")
+            text: "Gateway"
  • (H) Line 188: Use translations instead of hardcoded text. Instead of: "Example Label". To: pluginApi?.tr("panel.example-label")
+            text: "Session"
  • (H) Line 208: Use translations instead of hardcoded text. Instead of: "Example Label". To: pluginApi?.tr("panel.example-label")
+            text: "Tokens"
  • (H) Line 229: Use translations instead of hardcoded text. Instead of: "Example Label". To: pluginApi?.tr("panel.example-label")
+            text: "Cost"

File: hermes-status/Settings.qml

  • (L) Line 21: When it comes to translations there is no need for fallback values. From: pluginApi?.tr("example") || "value". To: pluginApi?.tr("example")
+      text: pluginApi?.tr("settings.statusScript") ?? "Status check script"
  • (L) Line 43: When it comes to translations there is no need for fallback values. From: pluginApi?.tr("example") || "value". To: pluginApi?.tr("example")
+      text: pluginApi?.tr("settings.pollInterval") ?? "Poll interval (seconds)"
  • (L) Line 66: When it comes to translations there is no need for fallback values. From: pluginApi?.tr("example") || "value". To: pluginApi?.tr("example")
+      text: pluginApi?.tr("settings.signalFile") ?? "Signal file"
  • (L) Line 85: When it comes to translations there is no need for fallback values. From: pluginApi?.tr("example") || "value". To: pluginApi?.tr("example")
+    label: pluginApi?.tr("settings.hideWhenIdle") ?? "Hide when idle"
  • (L) Line 86: When it comes to translations there is no need for fallback values. From: pluginApi?.tr("example") || "value". To: pluginApi?.tr("example")
+    description: pluginApi?.tr("settings.hideWhenIdleDesc") ?? "Only show when gateway is offline, busy, or needs attention"

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.

1 participant