跳到主要内容

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)。请注意,只有 Dashboard 的 /chat 嵌入式 TUI 面板仍然需要 WSL / POSIX 终端;Hermes Agent 和 Dashboard 其他页面已经可以在 Windows 原生安装路径下使用。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)。这一项只限制 Dashboard 的 /chat 内嵌终端面板;Hermes Agent 现阶段已经可以在 Windows 原生安装和使用,Dashboard 的其他页面仍可在原生 Windows 路径下使用。

关闭浏览器标签页后,服务器端会干净地回收 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"}