跳到主要內容

Web 儀表板

Web 儀表板是一個基於瀏覽器的用戶界面,用於管理您的 Hermes Agent 安裝。您無需編輯 YAML 文件或運行 CLI 命令,即可通過簡潔的 Web 界面配置設置、管理 API 密鑰並監控會話。

快速開始

hermes dashboard

這將啟動一個本地 Web 服務器,並在瀏覽器中打開 http://127.0.0.1:9119。儀表板完全在您的機器上運行——沒有數據會離開 localhost。

選項

標誌默認值描述
--port9119Web 服務器運行的端口
--host127.0.0.1綁定地址
--no-open不自動打開瀏覽器
# Custom port
hermes dashboard --port 8080

# Bind to all interfaces (use with caution on shared networks)
hermes dashboard --host 0.0.0.0

# Start without opening browser
hermes dashboard --no-open

前置條件

默認的 hermes-agent 安裝不包含 HTTP 棧或 PTY 助手——這些都是可選的額外組件。Web 儀表板需要 FastAPI 和 Uvicorn(web 額外組件)。Chat 標籤頁還需要 ptyprocess 以便在偽終端後啟動嵌入式 TUI(POSIX 上的 pty 額外組件)。使用以下命令安裝兩者:

pip install 'hermes-agent[web,pty]'

web 額外組件會引入 FastAPI/Uvicorn;pty 額外組件會引入 ptyprocess(POSIX)或 pywinpty(原生 Windows——請注意,嵌入式 TUI 本身仍然需要 WSL)。pip install hermes-agent[all] 包含這兩個額外組件,如果您還想要消息傳遞/語音等功能,這是最簡單的途徑。

當您在缺少依賴項的情況下運行 hermes dashboard 時,它會提示您需要安裝的內容。如果前端尚未構建且存在 npm,它將在首次啟動時自動構建。

頁面

狀態

著陸頁顯示您的安裝狀態的實時概覽:

  • Agent 版本和發佈日期
  • 網關狀態——運行/停止、PID、已連接的平臺及其狀態
  • 活躍會話——過去 5 分鐘內活躍會話的數量
  • 最近會話——列出最近的 20 個會話,包括模型、消息數量、令牌使用情況以及對話預覽

狀態頁面每 5 秒自動刷新一次。

Chat

Chat 標籤頁將完整的 Hermes TUI(與從 hermes --tui 獲得的界面相同)直接嵌入到瀏覽器中。您在終端 TUI 中可以執行的所有操作——斜槓命令、模型選擇器、工具調用卡片、Markdown 流式傳輸、澄清/超級用戶/批准提示、皮膚主題——在此處同樣有效,因為儀表板正在運行真實的 TUI 二進制文件,並通過 xterm.js 及其 WebGL 渲染器渲染其 ANSI 輸出,以實現像素完美的單元格佈局。

工作原理:

  • /api/pty 打開一個使用儀表板會話令牌進行身份驗證的 WebSocket
  • 服務器在 POSIX 偽終端後啟動 hermes --tui
  • 擊鍵發送到 PTY;ANSI 輸出流回瀏覽器
  • xterm.js 的 WebGL 渲染器將每個單元格繪製到整數像素網格上;鼠標跟蹤(SGR 1006)、寬字符(Unicode 11)和框線字形均原生渲染
  • 調整瀏覽器窗口大小會通過 @xterm/addon-fit 插件調整 TUI 的大小

恢復現有會話:Sessions 標籤頁,點擊任何會話旁邊的播放圖標 (▶)。這將跳轉到 /chat?resume=<id> 並使用 --resume 啟動 TUI,加載完整的歷史記錄。

前置條件:

  • Node.js(與 hermes --tui 的要求相同;TUI 捆綁包在首次啟動時構建)
  • ptyprocess——由 pty 額外組件安裝(pip install 'hermes-agent[web,pty]',或 [all] 涵蓋兩者)
  • POSIX 內核(Linux、macOS 或 WSL)。不支持原生 Windows Python——請使用 WSL。

關閉瀏覽器標籤頁後,服務器端會乾淨地回收 PTY。重新打開將啟動一個新會話。

Config

一個基於表單的 config.yaml 編輯器。所有 150+ 個配置字段均從 DEFAULT_CONFIG 自動發現,並組織成帶標籤的類別:

  • model——默認模型、提供商、基礎 URL、推理設置
  • terminal——後端(local/docker/ssh/modal)、超時、Shell 偏好
  • display——皮膚、工具進度、恢復顯示、旋轉器設置
  • agent——最大迭代次數、網關超時、服務層級
  • delegation——子代理限制、推理努力程度
  • memory——提供商選擇、上下文注入設置
  • approvals——危險命令批准模式(ask/yolo/deny)
  • 等等——config.yaml 的每個部分都有相應的表單字段

具有已知有效值的字段(終端後端、皮膚、批准模式等)呈現為下拉菜單。布爾值呈現為切換開關。其他所有內容均為文本輸入。

操作:

  • Save——立即將更改寫入 config.yaml
  • Reset to defaults——將所有字段恢復為默認值(直到您點擊 Save 才會保存)
  • Export——將當前配置下載為 JSON
  • Import——上傳 JSON 配置文件以替換當前值
提示

配置更改將在下一個 agent 會話或網關重啟時生效。Web 儀表板編輯的是與 hermes config set 和網關讀取的同一個 config.yaml 文件。

API Keys

管理存儲 API 密鑰和憑據的 .env 文件。密鑰按類別分組:

  • LLM 提供商 — OpenRouter、Anthropic、OpenAI、DeepSeek 等。
  • 工具 API 密鑰 — Browserbase、Firecrawl、Tavily、ElevenLabs 等。
  • 消息平臺 — Telegram、Discord、Slack 機器人令牌等。
  • Agent 設置 — 非敏感環境變量,如 API_SERVER_ENABLED

每個密鑰顯示:

  • 當前是否已設置(帶有脫敏的值預覽)
  • 用途描述
  • 指向提供商註冊/密鑰頁面的鏈接
  • 用於設置或更新值的輸入字段
  • 用於刪除它的刪除按鈕

高級/很少使用的密鑰默認隱藏,可通過切換開關顯示。

會話 (Sessions)

瀏覽和檢查所有 agent 會話。每一行顯示會話標題、來源平臺圖標(CLI、Telegram、Discord、Slack、cron)、模型名稱、消息數量、工具調用數量以及上次活躍的時間。實時會話標有脈衝徽章。

  • 搜索 — 使用 FTS5 對所有消息內容進行全文搜索。結果顯示高亮片段,展開時自動滾動到第一條匹配的消息。
  • 展開 — 點擊會話以加載其完整消息歷史。消息按角色(用戶、助手、系統、工具)進行顏色編碼,並以帶語法高亮的 Markdown 格式渲染。
  • 工具調用 — 包含工具調用的助手消息會顯示可摺疊塊,其中包含函數名稱和 JSON 參數。
  • 刪除 — 使用垃圾桶圖標刪除會話及其消息歷史。

日誌 (Logs)

查看 agent、網關和錯誤日誌文件,支持過濾和實時追蹤。

  • 文件 — 在 agenterrorsgateway 日誌文件之間切換
  • 級別 — 按日誌級別過濾:ALL、DEBUG、INFO、WARNING 或 ERROR
  • 組件 — 按源組件過濾:all、gateway、agent、tools、cli 或 cron
  • 行數 — 選擇顯示的行數(50、100、200 或 500)
  • 自動刷新 — 切換實時追蹤,每 5 秒輪詢新日誌行
  • 顏色編碼 — 日誌行按嚴重性著色(錯誤為紅色,警告為黃色,調試為暗淡色)

分析 (Analytics)

基於會話歷史計算的使用情況和成本分析。選擇一個時間段(7、30 或 90 天)以查看:

  • 摘要卡片 — 總 token 數(輸入/輸出)、緩存命中率、總預估或實際成本,以及總會話數和日均會話數
  • 每日 token 圖表 — 堆疊條形圖顯示每天的輸入和輸出 token 使用情況,懸停提示顯示細分數據和成本
  • 每日細分表 — 每天日期、會話數、輸入 token、輸出 token、緩存命中率和成本
  • 每模型細分 — 表格顯示使用的每個模型、其會話數、token 使用量和預估成本

Cron

創建和管理按計劃重複運行 agent 提示的定時 cron 任務。

  • 創建 — 填寫名稱(可選)、提示詞、cron 表達式(例如 0 9 * * *)和交付目標(本地、Telegram、Discord、Slack 或電子郵件)
  • 任務列表 — 每個任務顯示其名稱、提示詞預覽、調度表達式、狀態徽章(啟用/暫停/錯誤)、交付目標、上次運行時間和下次運行時間
  • 暫停 / 恢復 — 在活動和暫停狀態之間切換任務
  • 立即觸發 — 在正常調度之外立即執行任務
  • 刪除 — 永久刪除 cron 任務

技能 (Skills)

瀏覽、搜索和切換技能及工具集。技能從 ~/.hermes/skills/ 加載並按類別分組。

  • 搜索 — 按名稱、描述或類別過濾技能和工具集
  • 類別過濾 — 點擊類別標籤以縮小列表範圍(例如 MLOps、MCP、紅隊測試、AI)
  • 切換 — 使用開關啟用或禁用單個技能。更改將在下一個會話中生效。
  • 工具集 — 單獨的部分顯示內置工具集(文件操作、網頁瀏覽等),包括其活動/非活動狀態、設置要求以及包含的工具列表
安全

Web 儀表板讀取並寫入包含 API 密鑰和秘密的 .env 文件。它默認綁定到 127.0.0.1 — 僅可從本地機器訪問。如果綁定到 0.0.0.0,網絡上的任何人都可以查看和修改你的憑據。儀表板本身沒有身份驗證機制。

/reload Slash 命令

儀表板 PR 還為交互式 CLI 添加了 /reload slash 命令。通過 Web 儀表板更改 API 密鑰(或直接編輯 .env)後,在活動 CLI 會話中使用 /reload 即可在不重啟的情況下應用更改:

You → /reload
Reloaded .env (3 var(s) updated)

這會將 ~/.hermes/.env 重新讀入正在運行的進程環境中。當你通過儀表板添加了新的提供商密鑰並希望立即使用時,此功能非常有用。

REST API

Web 儀表板暴露了一個供前端使用的 REST API。你也可以直接調用這些端點以實現自動化:

GET /api/status

返回 agent 版本、網關狀態、平臺狀態和活動會話計數。

GET /api/sessions

返回最近的 20 個會話及其元數據(模型、token 計數、時間戳、預覽)。

GET /api/config

以 JSON 格式返回當前的 config.yaml 內容。

GET /api/config/defaults

返回默認配置值。

GET /api/config/schema

返回一個描述每個配置字段的 schema —— 包括類型、描述、類別,以及適用的選擇項。前端使用此信息為每個字段渲染正確的輸入控件。

PUT /api/config

保存新配置。請求體:{"config": {...}}

GET /api/env

返回所有已知的環境變量,包括其設置/未設置狀態、脫敏值、描述和類別。

PUT /api/env

設置環境變量。請求體:{"key": "VAR_NAME", "value": "secret"}

DELETE /api/env

移除環境變量。請求體:{"key": "VAR_NAME"}

GET /api/sessions/{session_id}

返回單個會話的元數據。

GET /api/sessions/{session_id}/messages

返回會話的完整消息歷史,包括工具調用和時間戳。

GET /api/sessions/search

對消息內容進行全文搜索。查詢參數:q。返回匹配的會話 ID 及高亮片段。

DELETE /api/sessions/{session_id}

刪除會話及其消息歷史。

GET /api/logs

返回日誌行。查詢參數:file(agent/errors/gateway)、lines(行數)、levelcomponent

GET /api/analytics/usage

返回 token 用量、成本和會話分析數據。查詢參數:days(默認 30)。響應包含每日細分數據和按模型聚合的數據。

GET /api/cron/jobs

返回所有已配置的 cron 任務,包括其狀態、調度計劃和運行歷史。

POST /api/cron/jobs

創建新的 cron 任務。請求體:{"prompt": "...", "schedule": "0 9 * * *", "name": "...", "deliver": "local"}

POST /api/cron/jobs/{job_id}/pause

暫停 cron 任務。

POST /api/cron/jobs/{job_id}/resume

恢復已暫停的 cron 任務。

POST /api/cron/jobs/{job_id}/trigger

立即觸發 cron 任務,不受其調度計劃限制。

DELETE /api/cron/jobs/{job_id}

刪除 cron 任務。

GET /api/skills

返回所有技能,包括其名稱、描述、類別和啟用狀態。

PUT /api/skills/toggle

啟用或禁用技能。請求體:{"name": "skill-name", "enabled": true}

GET /api/tools/toolsets

返回所有工具集,包括其標籤、描述、工具列表以及激活/配置狀態。

CORS

Web 服務器將 CORS 限制為僅允許 localhost 源:

  • http://localhost:9119 / http://127.0.0.1:9119(生產環境)
  • http://localhost:3000 / http://127.0.0.1:3000
  • http://localhost:5173 / http://127.0.0.1:5173(Vite 開發服務器)

如果你在自定義端口上運行服務器,該源會自動添加。

開發

如果你要為 Web 儀表板前端做貢獻:

# Terminal 1: start the backend API
hermes dashboard --no-open

# Terminal 2: start the Vite dev server with HMR
cd web/
npm install
npm run dev

位於 http://localhost:5173 的 Vite 開發服務器會將 /api 請求代理到位於 http://127.0.0.1:9119 的 FastAPI 後端。

前端基於 React 19、TypeScript、Tailwind CSS v4 和 shadcn/ui 風格組件構建。生產構建輸出到 hermes_cli/web_dist/,由 FastAPI 服務器作為靜態 SPA 提供服務。

更新時自動構建

當你運行 hermes update 時,如果可用 npm,Web 前端會自動重新構建。這使儀表板與代碼更新保持同步。如果未安裝 npm,更新將跳過前端構建,hermes dashboard 將在首次啟動時構建它。

主題

主題通過三個層面控制儀表板的視覺呈現:

  • 調色板(Palette) — 顏色(背景、文本、強調色、暖光效果、噪點)
  • 排版(Typography) — 字體族、基礎字號、行高、字母間距
  • 佈局(Layout) — 圓角半徑和密度(間距倍數)

從標題欄實時切換主題 — 點擊語言切換器旁邊的調色板圖標。選擇會持久化保存到 config.yaml 中的 dashboard.theme 字段,並在頁面加載時恢復。

內置主題

每個內置主題都自帶調色板、排版和佈局 — 切換時產生的變化不僅限於顏色。

主題調色板排版佈局
Hermes Teal (default)深青色 + 奶油色系統字體棧,15px0.5rem 圓角,舒適
Midnight (midnight)深藍色紫羅蘭Inter + JetBrains Mono,14px0.75rem 圓角,舒適
Ember (ember)暖 crimson / 青銅色Spectral(襯線體)+ IBM Plex Mono,15px0.25rem 圓角,舒適
Mono (mono)灰度IBM Plex Sans + IBM Plex Mono,13px0 圓角,緊湊
Cyberpunk (cyberpunk)黑色背景上的霓虹綠全部使用 Share Tech Mono,14px0 圓角,緊湊
Rosé (rose)粉色和象牙白Fraunces(襯線體)+ DM Mono,16px1rem 圓角,寬鬆

引用 Google Fonts 的主題(除 Hermes Teal 外的所有主題)會按需加載樣式表 — 首次切換到這些主題時,<link> 標籤會被注入到 <head> 中。

自定義主題

將 YAML 文件放入 ~/.hermes/dashboard-themes/,它會自動出現在選擇器中。文件可以儘可能簡單,只需包含名稱和你想要覆蓋的字段 — 每個缺失的字段都會繼承合理的默認值。

最小示例(僅顏色,使用簡短十六進制表示法):

# ~/.hermes/dashboard-themes/neon.yaml
name: neon
label: Neon
description: Pure magenta on black
colors:
background: "#000000"
midground: "#ff00ff"

完整示例(所有調節項):

# ~/.hermes/dashboard-themes/ocean.yaml
name: ocean
label: Ocean Deep
description: Deep sea blues with coral accents

palette:
background:
hex: "#0a1628"
alpha: 1.0
midground:
hex: "#a8d0ff"
alpha: 1.0
foreground:
hex: "#ffffff"
alpha: 0.0
warmGlow: "rgba(255, 107, 107, 0.35)"
noiseOpacity: 0.7

typography:
fontSans: "Poppins, system-ui, sans-serif"
fontMono: "Fira Code, ui-monospace, monospace"
fontDisplay: "Poppins, system-ui, sans-serif" # optional, falls back to fontSans
fontUrl: "https://fonts.googleapis.com/css2?family=Poppins:wght@400;500;600&family=Fira+Code:wght@400;500&display=swap"
baseSize: "15px"
lineHeight: "1.6"
letterSpacing: "-0.003em"

layout:
radius: "0.75rem" # 0 | 0.25rem | 0.5rem | 0.75rem | 1rem | any length
density: comfortable # compact | comfortable | spacious

# Optional — pin individual shadcn tokens that would otherwise derive from
# the palette. Any key listed here wins over the palette cascade.
colorOverrides:
destructive: "#ff6b6b"
ring: "#ff6b6b"

創建文件後刷新儀表板。

調色板模型

調色板是一個三層三元組——背景(background)、中景(midground)、前景(foreground)——外加一個暖光暈 rgba() 字符串和一個噪點不透明度乘數。每個 shadcn 令牌(card、muted、border、primary、popover 等)都是通過儀表板樣式表中的 CSS color-mix() 從該三元組派生而來的,因此覆蓋三種顏色會級聯影響到整個 UI。

  • background — 最深的畫布顏色(通常接近黑色)。頁面背景和卡片填充色均源自此顏色。
  • midground — 主要文本和強調色。大多數 UI 裝飾元素讀取此顏色。
  • foreground — 頂層高亮色。在默認主題中,這是 alpha 為 0 的白色(不可見);希望頂部有明亮強調色的主題可以提高其 alpha 值。
  • warmGlow — 環境背景使用的 rgba() 暗角顏色。
  • noiseOpacity — 顆粒疊加層的 0–1.2 乘數。值越低越柔和,值越高越粗糙。

每一層接受 {hex, alpha}對象或純十六進制字符串(alpha 默認為 1.0)。

排版模型

類型描述
fontSansstring正文副本的 CSS font-family 堆棧(應用於 htmlbody
fontMonostring代碼塊、<code>.font-mono 工具類、密集讀數顯示的 CSS font-family 堆棧
fontDisplaystring可選的標題/展示字體堆棧。回退到 fontSans
fontUrlstring可選的外部樣式表 URL。在切換主題時作為 <link rel="stylesheet"> 注入到 <head> 中。同一 URL 永遠不會被注入兩次。適用於 Google Fonts、Bunny Fonts、自託管的 @font-face 樣式表以及任何可鏈接的資源
baseSizestring根字體大小 — 控制整個儀表板的 rem 比例。例如:"14px""16px"
lineHeightstring默認行高,例如 "1.5""1.65"
letterSpacingstring默認字間距,例如 "0""0.01em""-0.01em"

佈局模型

描述
radius任意 CSS 長度單位圓角令牌。級聯到 --radius-sm/md/lg/xl,因此所有圓角元素會同步變化。
densitycompact | comfortable | spacious間距乘數。Compact = 0.85×,comfortable = 1.0×(默認),spacious = 1.2×。縮放 Tailwind 的基礎間距,因此 padding、gap 和 space-between 工具類都會按比例變化。

顏色覆蓋(可選)

大多數主題不需要此項 — 三層調色板會派生出每個 shadcn 令牌。但如果你想要一個派生無法產生的特定強調色(例如柔和色調主題中更柔和的破壞性紅色,或品牌特定的成功綠色),可以在此處固定單個令牌。

支持的鍵:cardcardForegroundpopoverpopoverForegroundprimaryprimaryForegroundsecondarysecondaryForegroundmutedmutedForegroundaccentaccentForegrounddestructivedestructiveForegroundsuccesswarningborderinputring

此處設置的任何鍵僅覆蓋當前激活主題的派生值 — 切換到其他主題時會清除這些覆蓋。

佈局變體

layoutVariant 選擇整體外殼佈局。默認為 standard

變體行為
standard單列,最大寬度 1600px(默認)
cockpit左側側邊欄軌道(260px)+ 主要內容。由插件通過 sidebar 插槽填充
tiled取消最大寬度限制,使頁面可以使用整個視口
layoutVariant: cockpit

當前變體暴露為 document.documentElement.dataset.layoutVariant,因此自定義 CSS 可以通過 :root[data-layout-variant="cockpit"] 進行定位。

主題資源

隨主題一起提供藝術作品 URL。每個命名插槽成為一個 CSS 變量(--theme-asset-<name>),供插件和內置外殼讀取;bg 插槽自動連接到背景。

assets:
bg: "https://example.com/hero-bg.jpg" # full-viewport background
hero: "/my-images/strike-freedom.png" # for plugin sidebars
crest: "/my-images/crest.svg" # for header slot plugins
logo: "/my-images/logo.png"
sidebar: "/my-images/rail.png"
header: "/my-images/header-art.png"
custom:
scanLines: "/my-images/scanlines.png" # → --theme-asset-custom-scanLines

值接受純 URL(自動包裹在 url(...) 中)、預包裹的 url(...)/linear-gradient(...)/radial-gradient(...) 表達式,以及 none

組件裝飾覆蓋

主題可以通過 componentStyles 塊重新設置單個外殼組件的樣式,而無需編寫 CSS 選擇器。每個桶中的條目成為 CSS 變量(--component-<bucket>-<kebab-property>),供外殼的共享組件讀取 — 因此 card: 覆蓋應用於每個 <Card>header: 應用於應用欄,等等。

componentStyles:
card:
clipPath: "polygon(12px 0, 100% 0, 100% calc(100% - 12px), calc(100% - 12px) 100%, 0 100%, 0 12px)"
background: "linear-gradient(180deg, rgba(10, 22, 52, 0.85), rgba(5, 9, 26, 0.92))"
boxShadow: "inset 0 0 0 1px rgba(64, 200, 255, 0.28)"
header:
background: "linear-gradient(180deg, rgba(16, 32, 72, 0.95), rgba(5, 9, 26, 0.9))"
tab:
clipPath: "polygon(6px 0, 100% 0, calc(100% - 6px) 100%, 0 100%)"
sidebar: {...}
backdrop: {...}
footer: {...}
progress: {...}
badge: {...}
page: {...}

支持的桶:cardheaderfootersidebartabprogressbadgebackdroppage。屬性名稱使用駝峰命名法(clipPath),並轉換為短橫線命名法(clip-path)輸出。值是純 CSS 字符串 — CSS 接受的任何內容(clip-pathborder-imagebackgroundbox-shadow、動畫等)。

自定義 CSS

對於不適合 componentStyles 的選擇器級別裝飾 — 偽元素、動畫、媒體查詢、主題範圍覆蓋 — 將原始 CSS 放入 customCSS 字段:

customCSS: |
:root[data-layout-variant="cockpit"] body::before {
content: "";
position: fixed;
inset: 0;
pointer-events: none;
z-index: 100;
background: repeating-linear-gradient(to bottom,
transparent 0px, transparent 2px,
rgba(64, 200, 255, 0.035) 3px, rgba(64, 200, 255, 0.035) 4px);
mix-blend-mode: screen;
}

CSS 在應用主題時作為單個 scoped <style data-hermes-theme-css> 標籤注入,並在切換主題時清理。每個主題上限為 32 KiB。

儀表板插件

插件位於 ~/.hermes/plugins/<name>/dashboard/(用戶)或倉庫的 plugins/<name>/dashboard/(捆綁)。每個插件都包含一個 manifest.json 以及一個使用暴露在 window.__HERMES_PLUGIN_SDK__ 上的插件 SDK 的普通 JS bundle。

清單 (Manifest)

{
"name": "my-plugin",
"label": "My Plugin",
"icon": "Sparkles",
"version": "1.0.0",
"tab": {
"path": "/my-plugin",
"position": "after:skills",
"override": "/",
"hidden": false
},
"slots": ["sidebar", "header-left"],
"entry": "dist/index.js",
"css": "dist/index.css",
"api": "api.py"
}
字段描述
tab.path插件組件渲染的路由路徑
tab.positionendafter:<tab>before:<tab>
tab.override當設置為內置路徑(//sessions 等)時,此插件將替換該頁面,而不是添加新標籤頁
tab.hidden當為 true 時,註冊組件 + 插槽但跳過導航條目。供僅使用插槽的插件使用
slots此插件填充的 Shell 插槽(文檔輔助;實際註冊發生在 JS bundle 中)

Shell 插槽

插件通過調用 window.__HERMES_PLUGINS__.registerSlot(pluginName, slotName, Component) 將組件注入到命名的 Shell 位置。多個插件可以填充同一個插槽——它們按註冊順序堆疊渲染。

插槽位置
backdrop在背景層堆棧內部
header-left在頂部欄中 Hermes 品牌標識之前
header-right在主題/語言切換器之前
header-banner導航下方的全寬條帶
sidebarCockpit 側邊欄軌道(僅在 layoutVariant === "cockpit" 時渲染)
pre-main在路由出口上方
post-main在路由出口下方
footer-left / footer-right頁腳單元格內容(替換默認值)
overlay固定在其他所有內容之上的定位層

插件 SDK

暴露在 window.__HERMES_PLUGIN_SDK__ 上:

  • React + hooks(useState、useEffect、useCallback、useMemo、useRef、useContext、createContext)
  • components — Card、Badge、Button、Input、Label、Select、Separator、Tabs、PluginSlot
  • api — Hermes API 客戶端,以及原始 fetchJSON
  • utilscn()timeAgo()isoTimeAgo()
  • useI18n — 用於多語言插件的 i18n hook

演示:Strike Freedom Cockpit

plugins/strike-freedom-cockpit/ 提供了一個完整的皮膚演示,展示了所有擴展點——cockpit 佈局變體、主題提供的 hero/crest 資源、通過 componentStyles實現的缺角卡片效果、通過 customCSS實現的掃描線效果,以及一個填充側邊欄、頭部和頁腳的僅插槽插件。將主題 YAML 複製到/.hermes/dashboard-themes/並將插件目錄複製到/.hermes/plugins/` 即可嘗試。

主題 API

端點方法描述
/api/dashboard/themesGET列出可用主題 + 當前激活的主題名稱。內置主題返回 {name, label, description};用戶主題還包含一個 definition 字段,其中包含完整的規範化主題對象。
/api/dashboard/themePUT設置激活主題。請求體:{"name": "midnight"}