@bitseek/hermes-webui 0.1.0-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +213 -0
- package/bin/hermes-webui.mjs +588 -0
- package/package.json +25 -0
- package/scripts/sync-vendor.mjs +74 -0
- package/templates/launchd/com.bitseek.hermes-webui.plist +21 -0
- package/templates/systemd/hermes-webui.service +13 -0
- package/templates/windows/hermes-webui-task.ps1 +3 -0
- package/vendor/agent-frontend-shell/.bitseek-source.json +6 -0
- package/vendor/agent-frontend-shell/.dockerignore +7 -0
- package/vendor/agent-frontend-shell/.env.docker.example +89 -0
- package/vendor/agent-frontend-shell/.env.example +34 -0
- package/vendor/agent-frontend-shell/.github/FUNDING.yml +3 -0
- package/vendor/agent-frontend-shell/.github/workflows/browser-smoke.yml +42 -0
- package/vendor/agent-frontend-shell/.github/workflows/docker-smoke.yml +233 -0
- package/vendor/agent-frontend-shell/.github/workflows/native-windows-startup.yml +132 -0
- package/vendor/agent-frontend-shell/.github/workflows/release.yml +57 -0
- package/vendor/agent-frontend-shell/.github/workflows/tests.yml +88 -0
- package/vendor/agent-frontend-shell/.vscode/launch.json +59 -0
- package/vendor/agent-frontend-shell/.vscode/settings.json +13 -0
- package/vendor/agent-frontend-shell/AGENTS.md +80 -0
- package/vendor/agent-frontend-shell/ARCHITECTURE.md +1658 -0
- package/vendor/agent-frontend-shell/BUGS.md +52 -0
- package/vendor/agent-frontend-shell/CHANGELOG.md +7295 -0
- package/vendor/agent-frontend-shell/CONTRIBUTING.md +205 -0
- package/vendor/agent-frontend-shell/CONTRIBUTORS.md +107 -0
- package/vendor/agent-frontend-shell/DESIGN.md +173 -0
- package/vendor/agent-frontend-shell/Dockerfile +91 -0
- package/vendor/agent-frontend-shell/LICENSE +21 -0
- package/vendor/agent-frontend-shell/README-CUSTOM.md +76 -0
- package/vendor/agent-frontend-shell/README.md +705 -0
- package/vendor/agent-frontend-shell/ROADMAP.md +351 -0
- package/vendor/agent-frontend-shell/SPRINTS.md +147 -0
- package/vendor/agent-frontend-shell/TESTING.md +1932 -0
- package/vendor/agent-frontend-shell/THEMES.md +170 -0
- package/vendor/agent-frontend-shell/api/__init__.py +1 -0
- package/vendor/agent-frontend-shell/api/agent_health.py +392 -0
- package/vendor/agent-frontend-shell/api/agent_sessions.py +782 -0
- package/vendor/agent-frontend-shell/api/auth.py +592 -0
- package/vendor/agent-frontend-shell/api/background.py +87 -0
- package/vendor/agent-frontend-shell/api/clarify.py +238 -0
- package/vendor/agent-frontend-shell/api/commands.py +124 -0
- package/vendor/agent-frontend-shell/api/compression_anchor.py +134 -0
- package/vendor/agent-frontend-shell/api/config.py +5178 -0
- package/vendor/agent-frontend-shell/api/dashboard_probe.py +255 -0
- package/vendor/agent-frontend-shell/api/extensions.py +253 -0
- package/vendor/agent-frontend-shell/api/gateway_chat.py +435 -0
- package/vendor/agent-frontend-shell/api/gateway_watcher.py +230 -0
- package/vendor/agent-frontend-shell/api/goals.py +608 -0
- package/vendor/agent-frontend-shell/api/helpers.py +474 -0
- package/vendor/agent-frontend-shell/api/kanban_bridge.py +1255 -0
- package/vendor/agent-frontend-shell/api/metering.py +194 -0
- package/vendor/agent-frontend-shell/api/models.py +4210 -0
- package/vendor/agent-frontend-shell/api/oauth.py +770 -0
- package/vendor/agent-frontend-shell/api/onboarding.py +1046 -0
- package/vendor/agent-frontend-shell/api/passkeys.py +365 -0
- package/vendor/agent-frontend-shell/api/profiles.py +1499 -0
- package/vendor/agent-frontend-shell/api/providers.py +2175 -0
- package/vendor/agent-frontend-shell/api/request_diagnostics.py +160 -0
- package/vendor/agent-frontend-shell/api/rollback.py +320 -0
- package/vendor/agent-frontend-shell/api/routes.py +13990 -0
- package/vendor/agent-frontend-shell/api/run_journal.py +284 -0
- package/vendor/agent-frontend-shell/api/runner_client.py +156 -0
- package/vendor/agent-frontend-shell/api/runtime_adapter.py +431 -0
- package/vendor/agent-frontend-shell/api/session_discoverability.py +640 -0
- package/vendor/agent-frontend-shell/api/session_events.py +45 -0
- package/vendor/agent-frontend-shell/api/session_lifecycle.py +208 -0
- package/vendor/agent-frontend-shell/api/session_ops.py +207 -0
- package/vendor/agent-frontend-shell/api/session_recovery.py +655 -0
- package/vendor/agent-frontend-shell/api/skill_usage.py +32 -0
- package/vendor/agent-frontend-shell/api/startup.py +128 -0
- package/vendor/agent-frontend-shell/api/state_sync.py +187 -0
- package/vendor/agent-frontend-shell/api/streaming.py +7048 -0
- package/vendor/agent-frontend-shell/api/system_health.py +167 -0
- package/vendor/agent-frontend-shell/api/terminal.py +410 -0
- package/vendor/agent-frontend-shell/api/turn_journal.py +214 -0
- package/vendor/agent-frontend-shell/api/updates.py +1261 -0
- package/vendor/agent-frontend-shell/api/upload.py +322 -0
- package/vendor/agent-frontend-shell/api/usage.py +26 -0
- package/vendor/agent-frontend-shell/api/workspace.py +867 -0
- package/vendor/agent-frontend-shell/api/workspace_git.py +1261 -0
- package/vendor/agent-frontend-shell/api/worktrees.py +357 -0
- package/vendor/agent-frontend-shell/bootstrap.py +492 -0
- package/vendor/agent-frontend-shell/ctl.sh +427 -0
- package/vendor/agent-frontend-shell/docker-compose.custom.yml +26 -0
- package/vendor/agent-frontend-shell/docker-compose.three-container.yml +168 -0
- package/vendor/agent-frontend-shell/docker-compose.two-container.yml +147 -0
- package/vendor/agent-frontend-shell/docker-compose.yml +57 -0
- package/vendor/agent-frontend-shell/docker_init.bash +459 -0
- package/vendor/agent-frontend-shell/docs/CONTRACTS.md +207 -0
- package/vendor/agent-frontend-shell/docs/EXTENSIONS.md +212 -0
- package/vendor/agent-frontend-shell/docs/ISSUES.md +23 -0
- package/vendor/agent-frontend-shell/docs/UIUX-GUIDE.md +196 -0
- package/vendor/agent-frontend-shell/docs/advanced-chat-setup.md +83 -0
- package/vendor/agent-frontend-shell/docs/docker.md +337 -0
- package/vendor/agent-frontend-shell/docs/onboarding-agent-checklist.md +207 -0
- package/vendor/agent-frontend-shell/docs/onboarding.md +202 -0
- package/vendor/agent-frontend-shell/docs/remote-access.md +75 -0
- package/vendor/agent-frontend-shell/docs/rfcs/README.md +53 -0
- package/vendor/agent-frontend-shell/docs/rfcs/agent-source-boundary.md +70 -0
- package/vendor/agent-frontend-shell/docs/rfcs/canonical-session-resolution.md +124 -0
- package/vendor/agent-frontend-shell/docs/rfcs/hermes-run-adapter-contract.md +1079 -0
- package/vendor/agent-frontend-shell/docs/rfcs/turn-journal.md +195 -0
- package/vendor/agent-frontend-shell/docs/rfcs/webui-run-state-consistency-contract.md +157 -0
- package/vendor/agent-frontend-shell/docs/supervisor.md +280 -0
- package/vendor/agent-frontend-shell/docs/troubleshooting.md +132 -0
- package/vendor/agent-frontend-shell/docs/ui-ux/index.html +863 -0
- package/vendor/agent-frontend-shell/docs/ui-ux/two-stage-proposal.html +768 -0
- package/vendor/agent-frontend-shell/docs/why-hermes.md +489 -0
- package/vendor/agent-frontend-shell/docs/workspace-git.md +92 -0
- package/vendor/agent-frontend-shell/docs/wsl-autostart.md +126 -0
- package/vendor/agent-frontend-shell/eslint.runtime-guard.config.mjs +35 -0
- package/vendor/agent-frontend-shell/extensions/bitseek-design-system.md +330 -0
- package/vendor/agent-frontend-shell/extensions/branding/assets/apple-touch-icon.png +0 -0
- package/vendor/agent-frontend-shell/extensions/branding/assets/empty-logo.svg +739 -0
- package/vendor/agent-frontend-shell/extensions/branding/assets/favicon-192.png +0 -0
- package/vendor/agent-frontend-shell/extensions/branding/assets/favicon-32.png +0 -0
- package/vendor/agent-frontend-shell/extensions/branding/assets/favicon-512.png +0 -0
- package/vendor/agent-frontend-shell/extensions/branding/assets/favicon-512.svg +745 -0
- package/vendor/agent-frontend-shell/extensions/branding/assets/favicon.ico +0 -0
- package/vendor/agent-frontend-shell/extensions/branding/assets/favicon.svg +745 -0
- package/vendor/agent-frontend-shell/extensions/branding/assets/titlebar-icon-v2.svg +751 -0
- package/vendor/agent-frontend-shell/extensions/branding/assets/titlebar-icon-v3.svg +739 -0
- package/vendor/agent-frontend-shell/extensions/branding/assets/titlebar-icon.svg +745 -0
- package/vendor/agent-frontend-shell/extensions/branding/branding.js +112 -0
- package/vendor/agent-frontend-shell/extensions/branding/config.json +14 -0
- package/vendor/agent-frontend-shell/extensions/branding/manifest.json +53 -0
- package/vendor/agent-frontend-shell/extensions/index.js +67 -0
- package/vendor/agent-frontend-shell/extensions/loader/hermes-loader.js +77 -0
- package/vendor/agent-frontend-shell/extensions/manifest.json +16 -0
- package/vendor/agent-frontend-shell/extensions/pages/ai-teammates/page.css +333 -0
- package/vendor/agent-frontend-shell/extensions/pages/ai-teammates/page.js +487 -0
- package/vendor/agent-frontend-shell/extensions/pages/manifest.json +6 -0
- package/vendor/agent-frontend-shell/extensions/pages/registry.css +56 -0
- package/vendor/agent-frontend-shell/extensions/pages/registry.js +302 -0
- package/vendor/agent-frontend-shell/extensions/themes/bitseek/index.css +93 -0
- package/vendor/agent-frontend-shell/extensions/themes/bitseek/index.js +98 -0
- package/vendor/agent-frontend-shell/install.sh +63 -0
- package/vendor/agent-frontend-shell/mcp_server.py +567 -0
- package/vendor/agent-frontend-shell/package.json +12 -0
- package/vendor/agent-frontend-shell/pyproject.toml +56 -0
- package/vendor/agent-frontend-shell/pytest.ini +3 -0
- package/vendor/agent-frontend-shell/requirements.txt +5 -0
- package/vendor/agent-frontend-shell/server.py +624 -0
- package/vendor/agent-frontend-shell/start.ps1 +210 -0
- package/vendor/agent-frontend-shell/start.sh +65 -0
- package/vendor/agent-frontend-shell/static/apple-touch-icon.png +0 -0
- package/vendor/agent-frontend-shell/static/boot.js +1990 -0
- package/vendor/agent-frontend-shell/static/commands.js +1402 -0
- package/vendor/agent-frontend-shell/static/favicon-192.png +0 -0
- package/vendor/agent-frontend-shell/static/favicon-32.png +0 -0
- package/vendor/agent-frontend-shell/static/favicon-512.png +0 -0
- package/vendor/agent-frontend-shell/static/favicon-512.svg +18 -0
- package/vendor/agent-frontend-shell/static/favicon.ico +0 -0
- package/vendor/agent-frontend-shell/static/favicon.svg +20 -0
- package/vendor/agent-frontend-shell/static/i18n.js +15389 -0
- package/vendor/agent-frontend-shell/static/icons.js +92 -0
- package/vendor/agent-frontend-shell/static/index.html +1506 -0
- package/vendor/agent-frontend-shell/static/login.js +177 -0
- package/vendor/agent-frontend-shell/static/manifest.json +53 -0
- package/vendor/agent-frontend-shell/static/messages.js +3521 -0
- package/vendor/agent-frontend-shell/static/onboarding.js +800 -0
- package/vendor/agent-frontend-shell/static/panels.js +7995 -0
- package/vendor/agent-frontend-shell/static/pwa-startup.js +83 -0
- package/vendor/agent-frontend-shell/static/sessions.js +5165 -0
- package/vendor/agent-frontend-shell/static/style.css +4774 -0
- package/vendor/agent-frontend-shell/static/sw.js +173 -0
- package/vendor/agent-frontend-shell/static/terminal.js +632 -0
- package/vendor/agent-frontend-shell/static/ui.js +8997 -0
- package/vendor/agent-frontend-shell/static/vendor/js-yaml/4.1.0/js-yaml.min.js +2 -0
- package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_AMS-Regular.ttf +0 -0
- package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_AMS-Regular.woff +0 -0
- package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_AMS-Regular.woff2 +0 -0
- package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_Caligraphic-Bold.ttf +0 -0
- package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_Caligraphic-Bold.woff +0 -0
- package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_Caligraphic-Bold.woff2 +0 -0
- package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_Caligraphic-Regular.ttf +0 -0
- package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_Caligraphic-Regular.woff +0 -0
- package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_Caligraphic-Regular.woff2 +0 -0
- package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_Fraktur-Bold.ttf +0 -0
- package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_Fraktur-Bold.woff +0 -0
- package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_Fraktur-Bold.woff2 +0 -0
- package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_Fraktur-Regular.ttf +0 -0
- package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_Fraktur-Regular.woff +0 -0
- package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_Fraktur-Regular.woff2 +0 -0
- package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_Main-Bold.ttf +0 -0
- package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_Main-Bold.woff +0 -0
- package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_Main-Bold.woff2 +0 -0
- package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_Main-BoldItalic.ttf +0 -0
- package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_Main-BoldItalic.woff +0 -0
- package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_Main-BoldItalic.woff2 +0 -0
- package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_Main-Italic.ttf +0 -0
- package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_Main-Italic.woff +0 -0
- package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_Main-Italic.woff2 +0 -0
- package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_Main-Regular.ttf +0 -0
- package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_Main-Regular.woff +0 -0
- package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_Main-Regular.woff2 +0 -0
- package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_Math-BoldItalic.ttf +0 -0
- package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_Math-BoldItalic.woff +0 -0
- package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_Math-BoldItalic.woff2 +0 -0
- package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_Math-Italic.ttf +0 -0
- package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_Math-Italic.woff +0 -0
- package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_Math-Italic.woff2 +0 -0
- package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_SansSerif-Bold.ttf +0 -0
- package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_SansSerif-Bold.woff +0 -0
- package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_SansSerif-Bold.woff2 +0 -0
- package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_SansSerif-Italic.ttf +0 -0
- package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_SansSerif-Italic.woff +0 -0
- package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_SansSerif-Italic.woff2 +0 -0
- package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_SansSerif-Regular.ttf +0 -0
- package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_SansSerif-Regular.woff +0 -0
- package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_SansSerif-Regular.woff2 +0 -0
- package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_Script-Regular.ttf +0 -0
- package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_Script-Regular.woff +0 -0
- package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_Script-Regular.woff2 +0 -0
- package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_Size1-Regular.ttf +0 -0
- package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_Size1-Regular.woff +0 -0
- package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_Size1-Regular.woff2 +0 -0
- package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_Size2-Regular.ttf +0 -0
- package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_Size2-Regular.woff +0 -0
- package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_Size2-Regular.woff2 +0 -0
- package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_Size3-Regular.ttf +0 -0
- package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_Size3-Regular.woff +0 -0
- package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_Size3-Regular.woff2 +0 -0
- package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_Size4-Regular.ttf +0 -0
- package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_Size4-Regular.woff +0 -0
- package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_Size4-Regular.woff2 +0 -0
- package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_Typewriter-Regular.ttf +0 -0
- package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_Typewriter-Regular.woff +0 -0
- package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_Typewriter-Regular.woff2 +0 -0
- package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/katex.min.css +1 -0
- package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/katex.min.js +1 -0
- package/vendor/agent-frontend-shell/static/vendor/smd.min.js +29 -0
- package/vendor/agent-frontend-shell/static/workspace.js +680 -0
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
# Project Contracts
|
|
2
|
+
|
|
3
|
+
This document is a contributor-facing index for existing Hermes WebUI contracts,
|
|
4
|
+
RFCs, design constraints, and review expectations. It does not replace the
|
|
5
|
+
source documents and it does not mark proposals as implemented. Follow each
|
|
6
|
+
linked document's status and scope.
|
|
7
|
+
|
|
8
|
+
Use this file when starting a change so the relevant public contract is visible
|
|
9
|
+
before code is edited. This first version focuses on documentation routing; it
|
|
10
|
+
does not change runtime behavior, maintainer policy, bot behavior, or CI gates.
|
|
11
|
+
|
|
12
|
+
## Start here
|
|
13
|
+
|
|
14
|
+
- [`AGENTS.md`](../AGENTS.md): repository entry point for AI assistants,
|
|
15
|
+
public-safety rules, and the short redline checklist.
|
|
16
|
+
- [`CONTRIBUTING.md`](../CONTRIBUTING.md): contribution style, verification,
|
|
17
|
+
PR description expectations, UI evidence, and project-specific constraints.
|
|
18
|
+
- [`README.md`](../README.md): product overview, quick start, architecture map,
|
|
19
|
+
feature inventory, and docs index.
|
|
20
|
+
- [`CHANGELOG.md`](../CHANGELOG.md): release-note-ready history. Update it when
|
|
21
|
+
maintainers should carry the change into release notes.
|
|
22
|
+
|
|
23
|
+
## Runtime, durability, and state contracts
|
|
24
|
+
|
|
25
|
+
- [`docs/rfcs/webui-run-state-consistency-contract.md`](rfcs/webui-run-state-consistency-contract.md):
|
|
26
|
+
proposed consistency rules for current WebUI streaming, recovery, replay,
|
|
27
|
+
model-context reconstruction, compression, UI scene/cache, and sidebar metadata
|
|
28
|
+
repairs. Start here for narrow fixes that keep the existing WebUI execution
|
|
29
|
+
path.
|
|
30
|
+
- [`docs/rfcs/canonical-session-resolution.md`](rfcs/canonical-session-resolution.md):
|
|
31
|
+
proposed contract for resolving URL routes, query parameters, localStorage,
|
|
32
|
+
sidebar rows, and compression-lineage IDs to one canonical visible session
|
|
33
|
+
target. Start here for session routing, boot restore, stale parent, or
|
|
34
|
+
compression-tip selection changes.
|
|
35
|
+
- [`docs/rfcs/hermes-run-adapter-contract.md`](rfcs/hermes-run-adapter-contract.md):
|
|
36
|
+
proposed event/control contract, runtime-state ownership matrix,
|
|
37
|
+
acceptance-test catalog, and reversible migration gates for moving WebUI
|
|
38
|
+
execution behind an adapter boundary. Use this for adapter-seam, control-plane,
|
|
39
|
+
runner, sidecar, or execution-ownership work; do not treat it as authorization
|
|
40
|
+
to implement those slices.
|
|
41
|
+
- [`docs/rfcs/turn-journal.md`](rfcs/turn-journal.md): proposed crash-safe
|
|
42
|
+
write-ahead journal for browser-originated chat turns.
|
|
43
|
+
- [`docs/rfcs/README.md`](rfcs/README.md): RFC conventions and current RFC index.
|
|
44
|
+
|
|
45
|
+
When a change touches streaming, recovery, replay, compression, context
|
|
46
|
+
reconstruction, cancellation, approval/clarify, session metadata, or run state,
|
|
47
|
+
read the relevant RFC before editing. In the PR description, name the state layer
|
|
48
|
+
or event/control surface affected and include a regression test or manual
|
|
49
|
+
verification for the relevant invariant.
|
|
50
|
+
|
|
51
|
+
Proposed RFCs are review guardrails, not implementation authorization. Do not
|
|
52
|
+
implement RFC fragments unless the task or tracking issue explicitly asks for
|
|
53
|
+
that slice.
|
|
54
|
+
|
|
55
|
+
## UI, UX, and theme contracts
|
|
56
|
+
|
|
57
|
+
- [`DESIGN.md`](../DESIGN.md): design tokens and the current calm-console
|
|
58
|
+
direction: conversation first, quiet metadata, restrained accents, and
|
|
59
|
+
progressive disclosure for debugging detail.
|
|
60
|
+
- [`docs/UIUX-GUIDE.md`](UIUX-GUIDE.md): contributor-facing synthesis of the
|
|
61
|
+
repository's UI/UX principles, sourced from existing project docs and code
|
|
62
|
+
comments.
|
|
63
|
+
- [`docs/ui-ux/index.html`](ui-ux/index.html): message-area inventory wired to
|
|
64
|
+
the real app stylesheet.
|
|
65
|
+
- [`docs/ui-ux/two-stage-proposal.html`](ui-ux/two-stage-proposal.html):
|
|
66
|
+
existing two-stage chat UX proposal for issue #536.
|
|
67
|
+
- [`THEMES.md`](../THEMES.md): theme and skin guidance; the core palette
|
|
68
|
+
variable contract lives in `static/style.css`.
|
|
69
|
+
|
|
70
|
+
Current appearance has a theme axis (`light`, `dark`, `system`) and a separate
|
|
71
|
+
skin axis (`default`, `ares`, `mono`, `slate`, `poseidon`, `sisyphus`,
|
|
72
|
+
`charizard`, `sienna`, `catppuccin`, `nous`, `geist-contrast`) in
|
|
73
|
+
`static/boot.js` and `static/style.css`. Do not follow stale `data-theme`-only theme guidance unless
|
|
74
|
+
the current code and tests prove that model still applies.
|
|
75
|
+
|
|
76
|
+
For UI or UX work, include before/after evidence, verify relevant responsive
|
|
77
|
+
states, and prefer stable class/data hooks over one-off visual behavior.
|
|
78
|
+
|
|
79
|
+
## Choosing the relevant contract
|
|
80
|
+
|
|
81
|
+
Before editing, identify which contract family the task exercises. This is a
|
|
82
|
+
routing check, not a request to read every document in the repository. Read the
|
|
83
|
+
documents that match the touched subsystem.
|
|
84
|
+
|
|
85
|
+
Use this lightweight note in an issue comment, draft PR, task note, or AI-agent
|
|
86
|
+
handoff when it helps clarify scope:
|
|
87
|
+
|
|
88
|
+
```markdown
|
|
89
|
+
## Contract Routing
|
|
90
|
+
|
|
91
|
+
Task type:
|
|
92
|
+
Touched areas:
|
|
93
|
+
Relevant public docs:
|
|
94
|
+
- `AGENTS.md`
|
|
95
|
+
- `CONTRIBUTING.md`
|
|
96
|
+
- `docs/CONTRACTS.md`
|
|
97
|
+
- <subsystem-specific documents>
|
|
98
|
+
Scope boundaries:
|
|
99
|
+
Evidence needed before claiming done:
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
For small, obvious fixes, keep this short. The goal is to avoid routing mistakes,
|
|
103
|
+
not to create process overhead.
|
|
104
|
+
|
|
105
|
+
## Contract changes
|
|
106
|
+
|
|
107
|
+
Changing contract documents, RFC guidance, or contract tests changes review
|
|
108
|
+
expectations for future contributors. A PR that intentionally changes an
|
|
109
|
+
existing contract should include a `Contract Change` section in its PR body with:
|
|
110
|
+
|
|
111
|
+
- the previous contract,
|
|
112
|
+
- the new contract,
|
|
113
|
+
- the affected docs and tests,
|
|
114
|
+
- the compatibility or migration reason.
|
|
115
|
+
|
|
116
|
+
Contract tests and corresponding docs must move together. Tests that encode
|
|
117
|
+
product semantics must not silently redefine the contract by asserting the
|
|
118
|
+
opposite behavior without updating the public docs and naming the change in the
|
|
119
|
+
PR body.
|
|
120
|
+
|
|
121
|
+
The static tests for this guidance are advisory coverage. They pin contributor
|
|
122
|
+
wording so the rule stays visible. This advisory coverage is not an automated
|
|
123
|
+
policy gate; static coverage is not an automated policy gate and does not enforce
|
|
124
|
+
PR-body content on GitHub. A future release-time or CI check could
|
|
125
|
+
surface contract-affecting diffs whose PR body lacks `Contract Routing`, but this
|
|
126
|
+
document only defines the review expectation.
|
|
127
|
+
|
|
128
|
+
Release batches should list included contract-affecting PRs explicitly so
|
|
129
|
+
reviewers can distinguish ordinary green-CI fixes from changes that update the
|
|
130
|
+
project's product or runtime guardrails.
|
|
131
|
+
|
|
132
|
+
## PR preparation checklist
|
|
133
|
+
|
|
134
|
+
Before opening or updating a PR, verify `CONTRIBUTING.md` against the actual PR
|
|
135
|
+
body. This checklist applies even when code and tests are already done.
|
|
136
|
+
|
|
137
|
+
Required checks:
|
|
138
|
+
|
|
139
|
+
- The PR solves one logical problem.
|
|
140
|
+
- The PR body contains all required sections from `CONTRIBUTING.md`:
|
|
141
|
+
`Thinking Path`, `What Changed`, `Why It Matters`, `Verification`,
|
|
142
|
+
`Risks / Follow-ups`, and `Model Used`.
|
|
143
|
+
- `Model Used` discloses provider/model and notable agent/tool use, or says
|
|
144
|
+
`None -- human-authored`.
|
|
145
|
+
- UI/UX changes include before/after evidence and responsive-state coverage.
|
|
146
|
+
- Runtime/streaming changes name the state layer or invariant being changed and
|
|
147
|
+
list the regression or manual invariant check.
|
|
148
|
+
- Contract-affecting PRs include `Contract Routing`; intentional contract
|
|
149
|
+
changes also include `Contract Change`.
|
|
150
|
+
- Onboarding/setup validation used isolated `HERMES_HOME` and
|
|
151
|
+
`HERMES_WEBUI_STATE_DIR`, unless the human operator explicitly requested real
|
|
152
|
+
state.
|
|
153
|
+
- Docs and `CHANGELOG.md` updates are either included or explicitly not needed.
|
|
154
|
+
- After the GitHub write, read the PR back and verify the headings rendered as
|
|
155
|
+
intended.
|
|
156
|
+
|
|
157
|
+
Green CI plus a focused diff is not sufficient if the PR description or evidence
|
|
158
|
+
does not match the touched subsystem.
|
|
159
|
+
|
|
160
|
+
## Setup, onboarding, and operational references
|
|
161
|
+
|
|
162
|
+
- [`TESTING.md`](../TESTING.md): automated test command and manual browser test
|
|
163
|
+
plan.
|
|
164
|
+
- [`ARCHITECTURE.md`](../ARCHITECTURE.md): API, module layout, and design
|
|
165
|
+
constraints.
|
|
166
|
+
- [`docs/onboarding.md`](onboarding.md): first-run wizard and provider setup.
|
|
167
|
+
- [`docs/onboarding-agent-checklist.md`](onboarding-agent-checklist.md): safety
|
|
168
|
+
rules for assistant-led install, reinstall, bootstrap, provider setup, local
|
|
169
|
+
model setup, Docker onboarding, and WSL onboarding.
|
|
170
|
+
- [`docs/docker.md`](docker.md): Docker compose setup, common failures, and
|
|
171
|
+
bind-mount migration.
|
|
172
|
+
- [`docs/troubleshooting.md`](troubleshooting.md): diagnostic flows for common
|
|
173
|
+
failures.
|
|
174
|
+
- [`docs/EXTENSIONS.md`](EXTENSIONS.md): administrator-controlled WebUI
|
|
175
|
+
extension injection.
|
|
176
|
+
|
|
177
|
+
## Quick redline checklist
|
|
178
|
+
|
|
179
|
+
Before opening a change for review, confirm:
|
|
180
|
+
|
|
181
|
+
- The change solves one logical problem; unrelated refactors are split out.
|
|
182
|
+
- `AGENTS.md`, this index, and any linked contract for the touched subsystem were
|
|
183
|
+
read before editing.
|
|
184
|
+
- Behavior, setup, architecture, testing, or workflow changes update the relevant
|
|
185
|
+
docs; release-note-ready changes update `CHANGELOG.md`.
|
|
186
|
+
- UI/UX changes include before/after evidence and cover relevant desktop,
|
|
187
|
+
narrow, and mobile states.
|
|
188
|
+
- Runtime, streaming, recovery, replay, compression, or sidebar changes state
|
|
189
|
+
which layer they mutate and include a regression for the invariant.
|
|
190
|
+
- New dependencies, build tools, frameworks, or long-lived processes are avoided
|
|
191
|
+
unless the benefit and rollback story are explicit.
|
|
192
|
+
- Onboarding/setup validation uses isolated `HERMES_HOME` and
|
|
193
|
+
`HERMES_WEBUI_STATE_DIR` unless the human operator explicitly asks to use real
|
|
194
|
+
state.
|
|
195
|
+
- Secrets, private paths, local-only workflows, and personal notes stay out of
|
|
196
|
+
tracked docs and examples.
|
|
197
|
+
|
|
198
|
+
## Future evolution
|
|
199
|
+
|
|
200
|
+
This index is not intended to make the first contract set final. Future PRs may
|
|
201
|
+
add, revise, split, or retire contracts when real issues, implementation changes,
|
|
202
|
+
RFC decisions, contributor feedback, or review experience show that guidance is
|
|
203
|
+
incomplete or stale.
|
|
204
|
+
|
|
205
|
+
Potential follow-up areas include session import/export, cron, extensions,
|
|
206
|
+
security boundaries, Docker/runtime isolation, and lightweight checks that keep
|
|
207
|
+
key contract links from drifting.
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
# WebUI Extensions
|
|
2
|
+
|
|
3
|
+
Hermes WebUI supports a small, opt-in extension surface for self-hosted installs.
|
|
4
|
+
It lets an administrator serve local static assets and inject same-origin CSS or
|
|
5
|
+
JavaScript into the app shell without editing the WebUI source tree.
|
|
6
|
+
|
|
7
|
+
> **Trust model — read this first.** Extensions execute with full WebUI session
|
|
8
|
+
> authority. An extension JS file can call any API the logged-in user can call,
|
|
9
|
+
> including reading conversation history, sending messages, modifying settings,
|
|
10
|
+
> and triggering tool actions. **Only enable extensions you wrote yourself or
|
|
11
|
+
> from sources you trust as much as the WebUI source itself.** If your WebUI is
|
|
12
|
+
> shared with users you do not fully trust, do not enable extensions.
|
|
13
|
+
> Do not point `HERMES_WEBUI_EXTENSION_DIR` at a user-writable directory.
|
|
14
|
+
|
|
15
|
+
This is intentionally not a plugin marketplace or dependency system. It is a
|
|
16
|
+
safe escape hatch for local dashboards, internal tooling, and workflow-specific
|
|
17
|
+
panels that should not live in core Hermes WebUI.
|
|
18
|
+
|
|
19
|
+
## What extensions can do
|
|
20
|
+
|
|
21
|
+
Extensions can:
|
|
22
|
+
|
|
23
|
+
- serve files from one configured local directory at `/extensions/...`
|
|
24
|
+
- inject configured same-origin stylesheets into `<head>`
|
|
25
|
+
- inject configured same-origin scripts before `</body>`
|
|
26
|
+
- call the normal WebUI APIs available to the browser session
|
|
27
|
+
|
|
28
|
+
Extensions cannot, by themselves:
|
|
29
|
+
|
|
30
|
+
- bypass WebUI authentication
|
|
31
|
+
- serve files outside the configured extension directory
|
|
32
|
+
- load third-party scripts/styles through the built-in injection config
|
|
33
|
+
- change Hermes Agent permissions, models, memory, or tools unless they call
|
|
34
|
+
existing authenticated APIs that already allow those changes
|
|
35
|
+
|
|
36
|
+
## Configuration
|
|
37
|
+
|
|
38
|
+
Extensions are disabled by default. Configure them with environment variables
|
|
39
|
+
before starting the WebUI server. `HERMES_WEBUI_EXTENSION_DIR` must point to an
|
|
40
|
+
existing directory before any script or stylesheet URLs are injected:
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
export HERMES_WEBUI_EXTENSION_DIR=/path/to/my-extension/static
|
|
44
|
+
export HERMES_WEBUI_EXTENSION_SCRIPT_URLS=/extensions/app.js
|
|
45
|
+
export HERMES_WEBUI_EXTENSION_STYLESHEET_URLS=/extensions/app.css
|
|
46
|
+
./start.sh
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
Multiple URLs may be comma-separated:
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
export HERMES_WEBUI_EXTENSION_SCRIPT_URLS=/extensions/runtime.js,/extensions/app.js
|
|
53
|
+
export HERMES_WEBUI_EXTENSION_STYLESHEET_URLS=/extensions/base.css,/extensions/theme.css
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
## URL rules
|
|
57
|
+
|
|
58
|
+
Injected asset URLs are deliberately restricted:
|
|
59
|
+
|
|
60
|
+
- must be same-origin paths
|
|
61
|
+
- must start with `/extensions/` or `/static/`
|
|
62
|
+
- must not include a URL scheme, host, fragment, quote, angle bracket, newline,
|
|
63
|
+
NUL byte, or backslash
|
|
64
|
+
|
|
65
|
+
Allowed examples:
|
|
66
|
+
|
|
67
|
+
```text
|
|
68
|
+
/extensions/app.js
|
|
69
|
+
/extensions/app.css
|
|
70
|
+
/extensions/app.js?v=1
|
|
71
|
+
/static/theme.css
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
Rejected examples:
|
|
75
|
+
|
|
76
|
+
```text
|
|
77
|
+
https://example.com/app.js
|
|
78
|
+
//example.com/app.js
|
|
79
|
+
javascript:alert(1)
|
|
80
|
+
/api/session
|
|
81
|
+
/extensions/app.js#fragment
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
These restrictions keep the existing Content Security Policy intact and avoid
|
|
85
|
+
turning the extension hook into a third-party script loader. Invalid configured
|
|
86
|
+
URLs are ignored rather than injected.
|
|
87
|
+
|
|
88
|
+
## Static file serving
|
|
89
|
+
|
|
90
|
+
When `HERMES_WEBUI_EXTENSION_DIR` points at an existing directory, files under
|
|
91
|
+
that directory are available below `/extensions/`:
|
|
92
|
+
|
|
93
|
+
```text
|
|
94
|
+
/path/to/my-extension/static/app.js -> /extensions/app.js
|
|
95
|
+
/path/to/my-extension/static/ui.css -> /extensions/ui.css
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
The static handler is sandboxed:
|
|
99
|
+
|
|
100
|
+
- path traversal is rejected, including encoded traversal
|
|
101
|
+
- dotfiles and dot-directories are not served
|
|
102
|
+
- symlinks that resolve outside the extension directory are rejected
|
|
103
|
+
- missing or invalid extension directories behave as disabled
|
|
104
|
+
- failures return a generic 404 without exposing local filesystem paths
|
|
105
|
+
|
|
106
|
+
## Security notes
|
|
107
|
+
|
|
108
|
+
Only enable extensions from directories you control. Extension JavaScript runs in
|
|
109
|
+
the WebUI origin and can call the same authenticated WebUI APIs as the logged-in
|
|
110
|
+
browser session.
|
|
111
|
+
|
|
112
|
+
For shared or remotely exposed installations:
|
|
113
|
+
|
|
114
|
+
- keep `HERMES_WEBUI_PASSWORD` enabled
|
|
115
|
+
- bind to loopback unless you intentionally expose the service
|
|
116
|
+
- review extension code before enabling it
|
|
117
|
+
- prefer small, auditable extension files
|
|
118
|
+
- avoid serving generated or user-writable directories as extension roots
|
|
119
|
+
|
|
120
|
+
## Extension authoring guidance
|
|
121
|
+
|
|
122
|
+
Extensions share the page with the WebUI app, so they should be additive and
|
|
123
|
+
reversible. Prefer small, well-scoped DOM changes that can be removed or hidden
|
|
124
|
+
without breaking the built-in Chat, Tasks, Settings, or session views.
|
|
125
|
+
|
|
126
|
+
Recommended patterns:
|
|
127
|
+
|
|
128
|
+
- create extension-specific containers with unique IDs or class prefixes
|
|
129
|
+
- add UI next to existing views instead of replacing large app containers
|
|
130
|
+
- keep event listeners scoped to extension-owned elements where possible
|
|
131
|
+
- preserve built-in navigation behavior and restore any view state you change
|
|
132
|
+
- use `hidden`, `aria-*`, and extension-scoped CSS for panels or overlays
|
|
133
|
+
- guard initialization so reloading or re-injecting the script does not create
|
|
134
|
+
duplicate buttons, panels, timers, or event listeners
|
|
135
|
+
|
|
136
|
+
Avoid destructive mutations such as replacing `document.body.innerHTML`,
|
|
137
|
+
`main.innerHTML`, or other broad WebUI containers. Those patterns can remove or
|
|
138
|
+
mask the app's existing panels and leave normal navigation unable to recover
|
|
139
|
+
after an extension view is opened.
|
|
140
|
+
|
|
141
|
+
For custom pages, prefer adding a dedicated panel and toggling it alongside the
|
|
142
|
+
built-in views:
|
|
143
|
+
|
|
144
|
+
```javascript
|
|
145
|
+
(() => {
|
|
146
|
+
if (document.getElementById('my-extension-panel')) return;
|
|
147
|
+
|
|
148
|
+
const panel = document.createElement('section');
|
|
149
|
+
panel.id = 'my-extension-panel';
|
|
150
|
+
panel.className = 'main-view my-extension-panel';
|
|
151
|
+
panel.hidden = true;
|
|
152
|
+
panel.textContent = 'My extension page';
|
|
153
|
+
|
|
154
|
+
document.querySelector('main')?.appendChild(panel);
|
|
155
|
+
|
|
156
|
+
function showPanel() {
|
|
157
|
+
document.querySelectorAll('main > .main-view').forEach((view) => {
|
|
158
|
+
view.hidden = view !== panel;
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
// Wire showPanel() to an extension-owned button or menu item.
|
|
163
|
+
})();
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
If host CSS overrides `[hidden]`, add an extension-scoped rule such as:
|
|
167
|
+
|
|
168
|
+
```css
|
|
169
|
+
.my-extension-panel[hidden] {
|
|
170
|
+
display: none !important;
|
|
171
|
+
}
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
## Minimal example
|
|
175
|
+
|
|
176
|
+
Create a local extension directory:
|
|
177
|
+
|
|
178
|
+
```bash
|
|
179
|
+
mkdir -p ~/.hermes/webui-extension
|
|
180
|
+
cat > ~/.hermes/webui-extension/app.css <<'CSS'
|
|
181
|
+
.my-extension-badge {
|
|
182
|
+
position: fixed;
|
|
183
|
+
right: 12px;
|
|
184
|
+
bottom: 12px;
|
|
185
|
+
padding: 6px 10px;
|
|
186
|
+
border-radius: 999px;
|
|
187
|
+
background: #202236;
|
|
188
|
+
color: #fff;
|
|
189
|
+
font: 12px system-ui, sans-serif;
|
|
190
|
+
z-index: 9999;
|
|
191
|
+
}
|
|
192
|
+
CSS
|
|
193
|
+
cat > ~/.hermes/webui-extension/app.js <<'JS'
|
|
194
|
+
(() => {
|
|
195
|
+
const badge = document.createElement('div');
|
|
196
|
+
badge.className = 'my-extension-badge';
|
|
197
|
+
badge.textContent = 'Extension loaded';
|
|
198
|
+
document.body.appendChild(badge);
|
|
199
|
+
})();
|
|
200
|
+
JS
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
Start WebUI with the extension enabled:
|
|
204
|
+
|
|
205
|
+
```bash
|
|
206
|
+
HERMES_WEBUI_EXTENSION_DIR=~/.hermes/webui-extension \
|
|
207
|
+
HERMES_WEBUI_EXTENSION_STYLESHEET_URLS=/extensions/app.css \
|
|
208
|
+
HERMES_WEBUI_EXTENSION_SCRIPT_URLS=/extensions/app.js \
|
|
209
|
+
./start.sh
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
Open the WebUI and confirm the badge appears.
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# Upstream Issues — Root Cause Analysis
|
|
2
|
+
|
|
3
|
+
## #1256: Browser tools fail with "Playwright not installed"
|
|
4
|
+
|
|
5
|
+
### Root Cause
|
|
6
|
+
The check lives in **hermes-agent** (upstream), not hermes-webui:
|
|
7
|
+
|
|
8
|
+
```
|
|
9
|
+
hermes-agent/tools/browser_tool.py → check_browser_requirements()
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
`check_browser_requirements()` does not recognize CDP (Chrome DevTools Protocol) mode — it only looks for a local Playwright/Puppeteer install. When the agent runs in CDP mode (connecting to an existing browser), the check still fails.
|
|
13
|
+
|
|
14
|
+
### WebUI side
|
|
15
|
+
The WebUI already passes `CLI_TOOLSETS` correctly per-request. The `enabled_toolsets` field in the cron/chat config is dynamic and works as intended.
|
|
16
|
+
|
|
17
|
+
### Fix required
|
|
18
|
+
The fix must happen in `hermes-agent/tools/browser_tool.py`:
|
|
19
|
+
- `check_browser_requirements()` should skip the Playwright check when CDP mode is configured
|
|
20
|
+
- Or add a `BROWSER_MODE=cdp` env var that bypasses the local browser requirement
|
|
21
|
+
|
|
22
|
+
### Workaround
|
|
23
|
+
Use `CLOUD_BROWSER=true` or configure `browser.base_url` to point to a remote CDP endpoint. This bypasses the local Playwright requirement.
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
# UI/UX Guide
|
|
2
|
+
|
|
3
|
+
This document summarizes UI/UX principles that are already visible in the
|
|
4
|
+
repository. It is a contributor guide, not a new design proposal. Source
|
|
5
|
+
documents include [`DESIGN.md`](../DESIGN.md), [`README.md`](../README.md),
|
|
6
|
+
[`THEMES.md`](../THEMES.md), [`docs/ui-ux/index.html`](ui-ux/index.html),
|
|
7
|
+
[`docs/ui-ux/two-stage-proposal.html`](ui-ux/two-stage-proposal.html), and
|
|
8
|
+
design comments in `static/style.css`.
|
|
9
|
+
|
|
10
|
+
Use this guide when a change touches layout, chat rendering, composer chrome,
|
|
11
|
+
navigation, theme/skin behavior, responsive behavior, or visual hierarchy. For
|
|
12
|
+
purely backend changes, use the runtime/state contracts instead.
|
|
13
|
+
|
|
14
|
+
## Product shape
|
|
15
|
+
|
|
16
|
+
Hermes WebUI is a browser workbench for Hermes Agent with near-CLI parity and a
|
|
17
|
+
simple implementation shape: Python on the server, vanilla JavaScript in the
|
|
18
|
+
browser, no build step, no bundler, and no frontend framework.
|
|
19
|
+
|
|
20
|
+
The primary layout is three-panel:
|
|
21
|
+
|
|
22
|
+
- left sidebar for sessions and navigation,
|
|
23
|
+
- center panel for chat,
|
|
24
|
+
- right panel for workspace file browsing and previews.
|
|
25
|
+
|
|
26
|
+
Model, profile, workspace, attachments, voice input, context usage, Stop, and
|
|
27
|
+
Send controls live in the composer footer. Settings and session-level tools live
|
|
28
|
+
in the Hermes Control Center. Preserve this shape unless the change explicitly
|
|
29
|
+
justifies a different interaction model.
|
|
30
|
+
|
|
31
|
+
## Core feeling: calm developer console
|
|
32
|
+
|
|
33
|
+
The main artifact is the conversation. Tool calls, thinking traces, context
|
|
34
|
+
compaction records, token usage, runtime status, and other internals are useful,
|
|
35
|
+
but they are transcript metadata. They should sit below user and assistant prose
|
|
36
|
+
in visual priority.
|
|
37
|
+
|
|
38
|
+
Prefer:
|
|
39
|
+
|
|
40
|
+
- quiet surfaces,
|
|
41
|
+
- clear spacing,
|
|
42
|
+
- restrained accent use,
|
|
43
|
+
- progressive disclosure for debugging detail,
|
|
44
|
+
- legible text over decorative chrome.
|
|
45
|
+
|
|
46
|
+
Avoid turning the interface into a demo page of colorful cards. Errors,
|
|
47
|
+
approvals, and other action-required states may be prominent because the user
|
|
48
|
+
must notice and respond to them.
|
|
49
|
+
|
|
50
|
+
## Conversation hierarchy
|
|
51
|
+
|
|
52
|
+
A chat turn should read as one coherent story:
|
|
53
|
+
|
|
54
|
+
1. User message: right-aligned, compact bubble.
|
|
55
|
+
2. Assistant content: left-aligned, prose-first, not a heavy bubble.
|
|
56
|
+
3. Tool, thinking, progress, and context traces: quiet disclosure rows inside or
|
|
57
|
+
adjacent to the assistant turn.
|
|
58
|
+
4. Raw logs and verbose details: hidden until explicitly expanded.
|
|
59
|
+
|
|
60
|
+
Do not render every internal event as a first-class chat card. A turn that used
|
|
61
|
+
many tools should summarize the work as inspectable activity, not make the user
|
|
62
|
+
read a stack of unrelated-looking cards.
|
|
63
|
+
|
|
64
|
+
## Tool, thinking, and activity traces
|
|
65
|
+
|
|
66
|
+
Tool cards are debug event rows, not chat messages. Show the icon, name, short
|
|
67
|
+
target or preview, and status first. Arguments, result snippets, and long logs
|
|
68
|
+
belong behind expansion, with result snippets truncated and full output behind a
|
|
69
|
+
show-more affordance where needed.
|
|
70
|
+
|
|
71
|
+
Thinking and context cards should share the quiet metadata visual family. They
|
|
72
|
+
should not overpower assistant prose. Collapsed activity summaries should be
|
|
73
|
+
terse, for example `Activity: 4 tools`, and should not duplicate the thinking
|
|
74
|
+
area, list every tool name in the summary, or add redundant trailing count
|
|
75
|
+
badges.
|
|
76
|
+
|
|
77
|
+
Visible interim assistant progress is part of the live conversation timeline,
|
|
78
|
+
not raw debug detail. Compact Activity may collapse tool arguments, long tool
|
|
79
|
+
results, and low-level reasoning detail, but it must not make concise
|
|
80
|
+
user-visible progress text available only inside a collapsed disclosure.
|
|
81
|
+
|
|
82
|
+
The existing two-stage proposal in `docs/ui-ux/two-stage-proposal.html` records a
|
|
83
|
+
compatible direction for long turns: live work can be grouped as a worklog, then
|
|
84
|
+
settled history can collapse while the final answer reads as the calm
|
|
85
|
+
conclusion. Treat that page as an existing proposal, not as shipped behavior
|
|
86
|
+
unless the code and tests prove it is implemented.
|
|
87
|
+
|
|
88
|
+
## Typography and content
|
|
89
|
+
|
|
90
|
+
Use split typography intentionally:
|
|
91
|
+
|
|
92
|
+
- assistant prose uses the same system sans stack as the rest of the UI by
|
|
93
|
+
default (`--font-ui` in `static/style.css`),
|
|
94
|
+
- editorial serif assistant prose is historical/proposal or skin-scoped only;
|
|
95
|
+
do not reintroduce a global assistant serif without explicit design approval
|
|
96
|
+
plus code and test evidence,
|
|
97
|
+
- user bubbles and functional UI also use the system sans stack unless a scoped
|
|
98
|
+
skin intentionally overrides typography,
|
|
99
|
+
- monospace is for code, file paths, commands, tool names, and compact metadata.
|
|
100
|
+
|
|
101
|
+
Keep scale tight. Avoid introducing near-duplicate one-off font sizes, colors,
|
|
102
|
+
radius values, or spacing values when an existing token works.
|
|
103
|
+
|
|
104
|
+
## Color, depth, and shape
|
|
105
|
+
|
|
106
|
+
Use one accent at a time. Semantic colors are for semantic state: success,
|
|
107
|
+
warning, error, and info. Do not mix many bright colors decoratively in the same
|
|
108
|
+
viewport.
|
|
109
|
+
|
|
110
|
+
Use almost no shadows in the transcript. Reserve shadows for popovers,
|
|
111
|
+
dropdowns, modals, and floating controls. Chat cards should usually use either a
|
|
112
|
+
subtle border or a subtle tint, not aggressive combinations of both.
|
|
113
|
+
|
|
114
|
+
Avoid stacks of nested rounded rectangles. Rows and list items should feel
|
|
115
|
+
compact; panels and cards may be slightly rounder; true pills are reserved for
|
|
116
|
+
chips and badges.
|
|
117
|
+
|
|
118
|
+
## Composer and controls
|
|
119
|
+
|
|
120
|
+
The composer is the command surface. Keep it legible, stable, and focused:
|
|
121
|
+
|
|
122
|
+
- no theatrical hover scaling for routine controls,
|
|
123
|
+
- no ambient chrome that crowds the model/workspace/profile controls,
|
|
124
|
+
- no new footer buttons on tight layouts without a clear value tradeoff,
|
|
125
|
+
- keep Stop/Send and context feedback easy to find while composing.
|
|
126
|
+
|
|
127
|
+
When adding a control, consider where users will find it on both wide desktop and
|
|
128
|
+
mobile. If a setting or quota/control surface does not fit in the composer, route
|
|
129
|
+
it through the appropriate Control Center panel instead of squeezing the footer.
|
|
130
|
+
|
|
131
|
+
## Responsive behavior
|
|
132
|
+
|
|
133
|
+
Mobile is not an afterthought. The repository documents a responsive layout with
|
|
134
|
+
a hamburger sidebar, mobile-accessible top tabs, a right-edge file slide-over,
|
|
135
|
+
full-height chat/composer behavior on phones, and touch-friendly controls.
|
|
136
|
+
|
|
137
|
+
For UI changes, verify the relevant states:
|
|
138
|
+
|
|
139
|
+
- wide desktop,
|
|
140
|
+
- ordinary laptop width,
|
|
141
|
+
- narrow/mobile width,
|
|
142
|
+
- open and closed side panels when relevant,
|
|
143
|
+
- long chat content and live streaming when relevant.
|
|
144
|
+
|
|
145
|
+
Controls should remain usable at touch sizes, and mobile navigation should not
|
|
146
|
+
steal chat height unnecessarily.
|
|
147
|
+
|
|
148
|
+
## Themes and skins
|
|
149
|
+
|
|
150
|
+
Theme and skin work should use the existing variable system. `THEMES.md` points
|
|
151
|
+
to the core palette variables in `static/style.css`; skin comments in the CSS
|
|
152
|
+
show the expected pattern for full palette rewrites and accent-only changes.
|
|
153
|
+
|
|
154
|
+
Current implementation has two appearance axes, sourced from `static/boot.js`:
|
|
155
|
+
`theme` is only `light`, `dark`, or `system` and resolves to the `.dark` class
|
|
156
|
+
for dark mode; `skin` is a separate axis applied with `data-skin` and currently
|
|
157
|
+
includes `default`, `ares`, `mono`, `slate`, `poseidon`, `sisyphus`,
|
|
158
|
+
`charizard`, `sienna`, `catppuccin`, `nous`, and `geist-contrast` / Geist Contrast. `slate` is both an active skin
|
|
159
|
+
and a legacy theme-name migration target; `solarized`, `monokai`, `nord`, and
|
|
160
|
+
`oled` are legacy theme names mapped to current theme/skin pairs. Do not follow
|
|
161
|
+
stale `data-theme`-only guidance without first proving the current
|
|
162
|
+
`static/boot.js`, `static/index.html`, and `static/style.css` contracts still
|
|
163
|
+
support it.
|
|
164
|
+
|
|
165
|
+
Do not hardcode new colors, radii, shadows, or typography values into isolated
|
|
166
|
+
components when a token or existing variable can carry the intent. If a token is
|
|
167
|
+
missing, explain why a new one is needed.
|
|
168
|
+
|
|
169
|
+
## Evidence expected for UI changes
|
|
170
|
+
|
|
171
|
+
For any interface or interaction change:
|
|
172
|
+
|
|
173
|
+
- include before/after images or a short video,
|
|
174
|
+
- mention the tested viewport sizes and responsive states,
|
|
175
|
+
- reference the affected visual inventory or design source when applicable,
|
|
176
|
+
- add or update tests for behavior, state persistence, or regression-prone DOM
|
|
177
|
+
structure where practical,
|
|
178
|
+
- keep stable class or data hooks when they help future visual regression tests.
|
|
179
|
+
|
|
180
|
+
## Do / don't summary
|
|
181
|
+
|
|
182
|
+
Do:
|
|
183
|
+
|
|
184
|
+
- keep the conversation primary,
|
|
185
|
+
- collapse noisy internals by default when settled,
|
|
186
|
+
- make debugging details accessible without making them visually dominant,
|
|
187
|
+
- use existing tokens, variables, and component patterns,
|
|
188
|
+
- protect action-required states such as errors and approvals.
|
|
189
|
+
|
|
190
|
+
Don't:
|
|
191
|
+
|
|
192
|
+
- make every tool call look like a separate chat message,
|
|
193
|
+
- add decorative color or motion without a user-facing reason,
|
|
194
|
+
- introduce a frontend framework, bundler, or build step for ordinary UI work,
|
|
195
|
+
- hide important recovery, error, or approval state,
|
|
196
|
+
- treat proposal mockups as shipped behavior without code/test evidence.
|