Web 儀表板
Web 儀表板是一個基於瀏覽器的用戶界面,用於管理您的 Hermes Agent 安裝。您無需編輯 YAML 文件或運行 CLI 命令,即可通過簡潔的 Web 界面配置設置、管理 API 密鑰並監控會話。
快速開始
hermes dashboard
這將啟動一個本地 Web 服務器,並在瀏覽器中打開 http://127.0.0.1:9119。儀表板完全在您的機器上運行——沒有數據會離開 localhost。
選項
| 標誌 | 默認值 | 描述 |
|---|---|---|
--port | 9119 | Web 服務器運行的端口 |
--host | 127.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、網關和錯誤日誌文件,支持過濾和實時追蹤。
- 文件 — 在
agent、errors和gateway日誌文件之間切換 - 級別 — 按日誌級別過濾: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(行數)、level、component。
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:3000http://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) | 深青色 + 奶油色 | 系統字體棧,15px | 0.5rem 圓角,舒適 |
Midnight (midnight) | 深藍色紫羅蘭 | Inter + JetBrains Mono,14px | 0.75rem 圓角,舒適 |
Ember (ember) | 暖 crimson / 青銅色 | Spectral(襯線體)+ IBM Plex Mono,15px | 0.25rem 圓角,舒適 |
Mono (mono) | 灰度 | IBM Plex Sans + IBM Plex Mono,13px | 0 圓角,緊湊 |
Cyberpunk (cyberpunk) | 黑色背景上的霓虹綠 | 全部使用 Share Tech Mono,14px | 0 圓角,緊湊 |
Rosé (rose) | 粉色和象牙白 | Fraunces(襯線體)+ DM Mono,16px | 1rem 圓角,寬鬆 |
引用 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)。
排版模型
| 鍵 | 類型 | 描述 |
|---|---|---|
fontSans | string | 正文副本的 CSS font-family 堆棧(應用於 html、body) |
fontMono | string | 代碼塊、<code>、.font-mono 工具類、密集讀數顯示的 CSS font-family 堆棧 |
fontDisplay | string | 可選的標題/展示字體堆棧。回退到 fontSans |
fontUrl | string | 可選的外部樣式表 URL。在切換主題時作為 <link rel="stylesheet"> 注入到 <head> 中。同一 URL 永遠不會被注入兩次。適用於 Google Fonts、Bunny Fonts、自託管的 @font-face 樣式表以及任何可鏈接的資源 |
baseSize | string | 根字體大小 — 控制整個儀表板的 rem 比例。例如:"14px"、"16px" |
lineHeight | string | 默認行高,例如 "1.5"、"1.65" |
letterSpacing | string | 默認字間距,例如 "0"、"0.01em"、"-0.01em" |
佈局模型
| 鍵 | 值 | 描述 |
|---|---|---|
radius | 任意 CSS 長度單位 | 圓角令牌。級聯到 --radius-sm/md/lg/xl,因此所有圓角元素會同步變化。 |
density | compact | comfortable | spacious | 間距乘數。Compact = 0.85×,comfortable = 1.0×(默認),spacious = 1.2×。縮放 Tailwind 的基礎間距,因此 padding、gap 和 space-between 工具類都會按比例變化。 |
顏色覆蓋(可選)
大多數主題不需要此項 — 三層調色板會派生出每個 shadcn 令牌。但如果你想要一個派生無法產生的特定強調色(例如柔和色調主題中更柔和的破壞性紅色,或品牌特定的成功綠色),可以在此處固定單個令牌。
支持的鍵:card、cardForeground、popover、popoverForeground、primary、primaryForeground、secondary、secondaryForeground、muted、mutedForeground、accent、accentForeground、destructive、destructiveForeground、success、warning、border、input、ring。
此處設置的任何鍵僅覆蓋當前激活主題的派生值 — 切換到其他主題時會清除這些覆蓋。
佈局變體
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: {...}
支持的桶:card、header、footer、sidebar、tab、progress、badge、backdrop、page。屬性名稱使用駝峰命名法(clipPath),並轉換為短橫線命名法(clip-path)輸出。值是純 CSS 字符串 — CSS 接受的任何內容(clip-path、border-image、background、box-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.position | end、after:<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 | 導航下方的全寬條帶 |
sidebar | Cockpit 側邊欄軌道(僅在 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、PluginSlotapi— Hermes API 客戶端,以及原始fetchJSONutils—cn()、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/themes | GET | 列出可用主題 + 當前激活的主題名稱。內置主題返回 {name, label, description};用戶主題還包含一個 definition 字段,其中包含完整的規範化主題對象。 |
/api/dashboard/theme | PUT | 設置激活主題。請求體:{"name": "midnight"} |