@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,205 @@
|
|
|
1
|
+
# Contributing to Hermes WebUI
|
|
2
|
+
|
|
3
|
+
Thanks for contributing.
|
|
4
|
+
|
|
5
|
+
Hermes WebUI is intentionally simple to work on: Python on the server, vanilla JS in the browser, no build step, no bundler, no frontend framework. The best pull requests preserve that simplicity while solving a real problem cleanly.
|
|
6
|
+
|
|
7
|
+
## Before You Start
|
|
8
|
+
|
|
9
|
+
- Read [`AGENTS.md`](AGENTS.md) if an AI assistant is doing or helping with the
|
|
10
|
+
change.
|
|
11
|
+
- Read [`docs/CONTRACTS.md`](docs/CONTRACTS.md) and any linked contract/RFC for
|
|
12
|
+
the subsystem you will touch.
|
|
13
|
+
- For UI or UX work, read [`docs/UIUX-GUIDE.md`](docs/UIUX-GUIDE.md)
|
|
14
|
+
and [`DESIGN.md`](DESIGN.md).
|
|
15
|
+
- For runtime, streaming, recovery, replay, compression, context reconstruction,
|
|
16
|
+
or session metadata work, start with [`docs/rfcs/README.md`](docs/rfcs/README.md)
|
|
17
|
+
and the relevant RFC listed there.
|
|
18
|
+
|
|
19
|
+
Use those documents as review guardrails: keep the change scoped, preserve the
|
|
20
|
+
no-build-step architecture, update docs/changelog when behavior changes, include
|
|
21
|
+
UI evidence for UI changes, and add tests for behavior changes where practical.
|
|
22
|
+
|
|
23
|
+
### Contract-affecting PRs
|
|
24
|
+
|
|
25
|
+
A contract-affecting PR is any change that updates a public contract document,
|
|
26
|
+
an RFC, a contributor guide, a product-semantics test, or behavior that those
|
|
27
|
+
documents already describe. These PRs need an explicit `Contract Routing` section
|
|
28
|
+
in the PR body that names the touched contract family and the evidence used.
|
|
29
|
+
See [`docs/CONTRACTS.md#contract-routing`](docs/CONTRACTS.md#contract-routing)
|
|
30
|
+
for the short routing shape and [`docs/CONTRACTS.md#contract-changes`](docs/CONTRACTS.md#contract-changes)
|
|
31
|
+
for intentional contract changes.
|
|
32
|
+
|
|
33
|
+
If the PR intentionally changes an existing contract, add a `Contract Change`
|
|
34
|
+
section that states the old rule, the new rule, and why the change is justified.
|
|
35
|
+
Do not silently redefine product behavior by changing tests alone; update the
|
|
36
|
+
corresponding docs in the same PR.
|
|
37
|
+
|
|
38
|
+
A release batch should call out included contract-affecting PRs separately
|
|
39
|
+
from ordinary fixes, even when the code diff is small and CI is green.
|
|
40
|
+
|
|
41
|
+
## Two Paths to a Strong Pull Request
|
|
42
|
+
|
|
43
|
+
### Path 1: Small, Focused Changes
|
|
44
|
+
|
|
45
|
+
This is the fastest path to review and merge.
|
|
46
|
+
|
|
47
|
+
- Fix one clear bug or add one tightly scoped improvement
|
|
48
|
+
- Touch the fewest files you can
|
|
49
|
+
- Avoid drive-by refactors mixed into functional changes
|
|
50
|
+
- Run the relevant tests locally before opening the PR
|
|
51
|
+
- Keep the PR description concise and specific
|
|
52
|
+
|
|
53
|
+
These are the changes that are easiest to review and safest to merge quickly.
|
|
54
|
+
|
|
55
|
+
### Path 2: Bigger Changes
|
|
56
|
+
|
|
57
|
+
If you want to change architecture, reshape a workflow, add a substantial UI feature, or alter core behavior, align on direction first.
|
|
58
|
+
|
|
59
|
+
- Open an issue, start a discussion, or open a draft PR early
|
|
60
|
+
- Explain the problem you are solving, not just the implementation you want
|
|
61
|
+
- Call out tradeoffs, migration risk, and any alternatives you considered
|
|
62
|
+
- Keep the final PR easy to review by separating unrelated work
|
|
63
|
+
|
|
64
|
+
Large changes are welcome, but surprise rewrites are hard to review well.
|
|
65
|
+
|
|
66
|
+
## What We Expect in Every PR
|
|
67
|
+
|
|
68
|
+
### 1. One Logical Change Per PR
|
|
69
|
+
|
|
70
|
+
Keep each PR focused. A small related group of fixes is fine. A bug fix plus a CSS cleanup plus a refactor plus a docs rewrite is not.
|
|
71
|
+
|
|
72
|
+
### 2. Local Verification
|
|
73
|
+
|
|
74
|
+
Run the test suite locally:
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
pytest tests/ -v --timeout=60
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
CI also runs this suite on Python `3.11`, `3.12`, and `3.13`.
|
|
81
|
+
|
|
82
|
+
If your change affects browser behavior, also run the relevant manual checks from [TESTING.md](TESTING.md).
|
|
83
|
+
|
|
84
|
+
### 3. Clear PR Description
|
|
85
|
+
|
|
86
|
+
There is currently no PR template in this repo, so include the important sections yourself:
|
|
87
|
+
|
|
88
|
+
- Thinking Path
|
|
89
|
+
- What Changed
|
|
90
|
+
- Why It Matters
|
|
91
|
+
- Verification
|
|
92
|
+
- Risks / Follow-ups
|
|
93
|
+
- Model Used
|
|
94
|
+
|
|
95
|
+
If the change is user-visible, include screenshots or a short video.
|
|
96
|
+
|
|
97
|
+
For UI or UX changes, before/after images are required. PRs that change the interface or interaction flow without before/after images may not receive meaningful review until that evidence is added.
|
|
98
|
+
|
|
99
|
+
### 4. AI Usage Disclosure
|
|
100
|
+
|
|
101
|
+
If AI helped produce the change, say so in the PR description.
|
|
102
|
+
|
|
103
|
+
Include:
|
|
104
|
+
|
|
105
|
+
- Provider
|
|
106
|
+
- Exact model name or ID
|
|
107
|
+
- Any notable mode or tool use that mattered
|
|
108
|
+
|
|
109
|
+
If no AI was used, write: `None — human-authored`.
|
|
110
|
+
|
|
111
|
+
### 5. Keep the Docs Honest
|
|
112
|
+
|
|
113
|
+
If your change alters behavior, architecture, testing, setup, or user-facing workflows, update the relevant docs in the same PR.
|
|
114
|
+
|
|
115
|
+
Common files:
|
|
116
|
+
|
|
117
|
+
- [README.md](README.md) for setup, usage, and contributor-facing commands
|
|
118
|
+
- [ROADMAP.md](ROADMAP.md) for shipped features and sprint history
|
|
119
|
+
- [ARCHITECTURE.md](ARCHITECTURE.md) for implementation details and design constraints
|
|
120
|
+
- [TESTING.md](TESTING.md) for manual and automated verification guidance
|
|
121
|
+
- [CHANGELOG.md](CHANGELOG.md) when maintainers want release-note-ready entries
|
|
122
|
+
|
|
123
|
+
## Project-Specific Guidelines
|
|
124
|
+
|
|
125
|
+
### Preserve the Design Constraints
|
|
126
|
+
|
|
127
|
+
Hermes WebUI is deliberately:
|
|
128
|
+
|
|
129
|
+
- No build step
|
|
130
|
+
- No bundler
|
|
131
|
+
- No frontend framework
|
|
132
|
+
- Easy to modify from a terminal
|
|
133
|
+
|
|
134
|
+
Do not introduce new infrastructure or dependencies unless the gain is clear and the tradeoff is justified.
|
|
135
|
+
|
|
136
|
+
### Match the Existing Shape of the Codebase
|
|
137
|
+
|
|
138
|
+
- Server logic belongs in `api/` with `server.py` staying thin
|
|
139
|
+
- Frontend behavior belongs in the existing `static/*.js` modules
|
|
140
|
+
- Prefer extending current patterns over introducing parallel abstractions
|
|
141
|
+
- Keep changes legible to future contributors working directly from the repo in a terminal
|
|
142
|
+
|
|
143
|
+
### Be Careful With User-Facing Changes
|
|
144
|
+
|
|
145
|
+
This project is heavily UI-driven. If you change interaction flows, session behavior, workspace browsing, onboarding, or mobile layouts:
|
|
146
|
+
|
|
147
|
+
- test the happy path
|
|
148
|
+
- test reload behavior where relevant
|
|
149
|
+
- test narrow/mobile layouts where relevant
|
|
150
|
+
- include before/after images in the PR
|
|
151
|
+
|
|
152
|
+
### Security and Safety Matter
|
|
153
|
+
|
|
154
|
+
This app can expose workspace contents, run agent actions, and optionally sit behind a reverse proxy or Docker deployment. Treat auth, path handling, uploads, streaming, and environment handling as high-risk areas.
|
|
155
|
+
|
|
156
|
+
If your PR touches security-sensitive behavior, say so explicitly in the PR description and explain how you verified it.
|
|
157
|
+
|
|
158
|
+
## Writing a Good PR Message
|
|
159
|
+
|
|
160
|
+
Start with a short Thinking Path that explains the chain from project goal to the specific fix.
|
|
161
|
+
|
|
162
|
+
Example:
|
|
163
|
+
|
|
164
|
+
> - Hermes WebUI aims for near 1:1 parity with the Hermes CLI in a browser
|
|
165
|
+
> - Long-running chat turns rely on SSE streaming and session recovery
|
|
166
|
+
> - Reloading during an in-flight turn can leave the UI in an inconsistent state
|
|
167
|
+
> - The bug was that recovered sessions restored messages but not the live stream state
|
|
168
|
+
> - This PR fixes the recovery path so in-flight turns reconnect cleanly after reload
|
|
169
|
+
> - The benefit is that users can refresh or reconnect without losing visibility into active work
|
|
170
|
+
|
|
171
|
+
Another example:
|
|
172
|
+
|
|
173
|
+
> - Hermes WebUI is intentionally a simple Python + vanilla JS application
|
|
174
|
+
> - The right panel is used for workspace browsing and previews
|
|
175
|
+
> - On mobile, panel state changes need to be obvious and touch-friendly
|
|
176
|
+
> - The existing close affordance was inconsistent with the bottom-nav flow
|
|
177
|
+
> - This PR fixes the mobile panel close behavior and aligns it with the current navigation model
|
|
178
|
+
> - The result is fewer dead-end UI states on phones
|
|
179
|
+
|
|
180
|
+
After that, cover:
|
|
181
|
+
|
|
182
|
+
- what you changed
|
|
183
|
+
- why you changed it
|
|
184
|
+
- how you verified it
|
|
185
|
+
- what risks remain
|
|
186
|
+
|
|
187
|
+
## Review Tips
|
|
188
|
+
|
|
189
|
+
Want the smoothest review?
|
|
190
|
+
|
|
191
|
+
- Keep diffs tight
|
|
192
|
+
- Name things clearly
|
|
193
|
+
- Avoid unnecessary rewrites
|
|
194
|
+
- Add short comments only where the code would otherwise be hard to follow
|
|
195
|
+
- Respond directly to review feedback and update the PR description if the scope changes
|
|
196
|
+
|
|
197
|
+
## Development References
|
|
198
|
+
|
|
199
|
+
- [README.md](README.md)
|
|
200
|
+
- [ARCHITECTURE.md](ARCHITECTURE.md)
|
|
201
|
+
- [TESTING.md](TESTING.md)
|
|
202
|
+
- [ROADMAP.md](ROADMAP.md)
|
|
203
|
+
- [SPRINTS.md](SPRINTS.md)
|
|
204
|
+
|
|
205
|
+
Questions are best raised early, before a large change is finished.
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
# Contributors
|
|
2
|
+
|
|
3
|
+
Hermes WebUI is a community project. **194 people** have shipped code that landed in a release tag — including the long tail of folks whose work was salvaged into batch releases or absorbed via Co-authored-by trailers. This file is the canonical credit roll.
|
|
4
|
+
|
|
5
|
+
A contributor's PR count is the number of distinct PRs they get credit for: PRs they authored that merged directly, PRs they authored that were closed-but-absorbed into a release commit (batch merges, salvage rewrites, cherry-picked-and-attributed work), and PRs where they were explicitly attributed in `CHANGELOG.md`. All count the same.
|
|
6
|
+
|
|
7
|
+
**Total contributors tracked:** 194
|
|
8
|
+
**Total PR credits:** 843
|
|
9
|
+
**Last refreshed:** v0.51.192, 2026-05-31
|
|
10
|
+
|
|
11
|
+
Generated by `scripts/regen_contributors.py` in the maintainer workspace, which unions three sources: the GitHub merged-PR list, `CHANGELOG.md` attribution lines, and `Co-authored-by:` trailers on commits that landed on master (the canonical signal for a CLOSED PR whose commits were cherry-picked in and attributed). If your name is missing or wrong, open a PR against `CONTRIBUTORS.md` — we cross-check against the changelog on each release.
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## Top contributors (5+ PRs landed)
|
|
16
|
+
|
|
17
|
+
| # | Contributor | PRs | First release | Latest release |
|
|
18
|
+
|---|---|---:|---|---|
|
|
19
|
+
| 1 | [@franksong2702](https://github.com/franksong2702) | 148 | `v0.49.3` | `v0.51.153` |
|
|
20
|
+
| 2 | [@Michaelyklam](https://github.com/Michaelyklam) | 117 | `v0.50.240` | `v0.51.139` |
|
|
21
|
+
| 3 | [@bergeouss](https://github.com/bergeouss) | 70 | `v0.48.0` | `v0.51.46` |
|
|
22
|
+
| 4 | [@ai-ag2026](https://github.com/ai-ag2026) | 67 | `v0.50.279` | `v0.51.190` |
|
|
23
|
+
| 5 | [@dso2ng](https://github.com/dso2ng) | 25 | `v0.50.227` | `v0.51.153` |
|
|
24
|
+
| 6 | [@AJV20](https://github.com/AJV20) | 24 | `v0.51.93` | `v0.51.188` |
|
|
25
|
+
| 7 | [@starship-s](https://github.com/starship-s) | 19 | `v0.50.123` | `v0.51.153` |
|
|
26
|
+
| 8 | [@jasonjcwu](https://github.com/jasonjcwu) | 16 | `v0.50.227` | `v0.51.132` |
|
|
27
|
+
| 9 | [@dobby-d-elf](https://github.com/dobby-d-elf) | 15 | `v0.51.38` | `v0.51.161` |
|
|
28
|
+
| 10 | [@Jordan-SkyLF](https://github.com/Jordan-SkyLF) | 12 | `v0.50.18` | `v0.51.66` |
|
|
29
|
+
| 11 | [@aronprins](https://github.com/aronprins) | 10 | `v0.44.0` | `v0.51.45` |
|
|
30
|
+
| 12 | [@JKJameson](https://github.com/JKJameson) | 10 | `v0.50.198` | `v0.51.31` |
|
|
31
|
+
| 13 | [@ccqqlo](https://github.com/ccqqlo) | 9 | `v0.44.0` | `v0.50.270` |
|
|
32
|
+
| 14 | [@24601](https://github.com/24601) | 8 | `v0.50.189` | `v0.51.5` |
|
|
33
|
+
| 15 | [@LumenYoung](https://github.com/LumenYoung) | 8 | `v0.51.47` | `v0.51.99` |
|
|
34
|
+
| 16 | [@Sanjays2402](https://github.com/Sanjays2402) | 8 | `v0.50.292` | `v0.51.158` |
|
|
35
|
+
| 17 | [@armorbreak001](https://github.com/armorbreak001) | 7 | `v0.50.47` | `v0.50.50` |
|
|
36
|
+
| 18 | [@NocGeek](https://github.com/NocGeek) | 7 | `v0.50.251` | `v0.50.252` |
|
|
37
|
+
| 19 | [@Hinotoi-agent](https://github.com/Hinotoi-agent) | 6 | `v0.50.10` | `v0.51.44` |
|
|
38
|
+
| 20 | [@iRonin](https://github.com/iRonin) | 6 | `v0.41.0` | `v0.41.0` |
|
|
39
|
+
| 21 | [@bsgdigital](https://github.com/bsgdigital) | 5 | `v0.50.159` | `v0.51.31` |
|
|
40
|
+
| 22 | [@cloudyun888](https://github.com/cloudyun888) | 5 | `v0.50.47` | `v0.50.140` |
|
|
41
|
+
| 23 | [@fxd-jason](https://github.com/fxd-jason) | 5 | `v0.50.245` | `v0.50.250` |
|
|
42
|
+
| 24 | [@george-andraws](https://github.com/george-andraws) | 5 | `v0.51.139` | `v0.51.153` |
|
|
43
|
+
| 25 | [@happy5318](https://github.com/happy5318) | 5 | `v0.50.238` | `v0.51.31` |
|
|
44
|
+
|
|
45
|
+
## Sustained contributors (3–4 PRs landed)
|
|
46
|
+
|
|
47
|
+
| Contributor | PRs | First release | Latest release |
|
|
48
|
+
|---|---:|---|---|
|
|
49
|
+
| [@AlexeyDsov](https://github.com/AlexeyDsov) | 4 | `v0.50.267` | `v0.51.139` |
|
|
50
|
+
| [@fecolinhares](https://github.com/fecolinhares) | 4 | `v0.50.238` | `v0.50.250` |
|
|
51
|
+
| [@frap129](https://github.com/frap129) | 4 | `v0.50.140` | `v0.50.233` |
|
|
52
|
+
| [@Isla-Liu](https://github.com/Isla-Liu) | 4 | `v0.51.100` | `v0.51.142` |
|
|
53
|
+
| [@KingBoyAndGirl](https://github.com/KingBoyAndGirl) | 4 | `v0.50.238` | `v0.50.240` |
|
|
54
|
+
| [@qxxaa](https://github.com/qxxaa) | 4 | `v0.50.210` | `v0.51.37` |
|
|
55
|
+
| [@renheqiang](https://github.com/renheqiang) | 4 | `v0.50.61` | `v0.50.95` |
|
|
56
|
+
| [@Thanatos-Z](https://github.com/Thanatos-Z) | 4 | `v0.50.257` | `v0.50.278` |
|
|
57
|
+
| [@deboste](https://github.com/deboste) | 3 | `v0.17.1` | `v0.50.297` |
|
|
58
|
+
| [@dutchaiagency](https://github.com/dutchaiagency) | 3 | `v0.50.281` | `v0.50.286` |
|
|
59
|
+
| [@espokaos-ops](https://github.com/espokaos-ops) | 3 | `v0.51.92` | `v0.51.94` |
|
|
60
|
+
| [@lucasrc](https://github.com/lucasrc) | 3 | `v0.51.57` | `v0.51.57` |
|
|
61
|
+
| [@mccxj](https://github.com/mccxj) | 3 | `v0.51.75` | `v0.51.148` |
|
|
62
|
+
| [@mysoul12138](https://github.com/mysoul12138) | 3 | `v0.51.161` | `v0.51.185` |
|
|
63
|
+
| [@pamnard](https://github.com/pamnard) | 3 | `v0.51.186` | `v0.51.191` |
|
|
64
|
+
| [@pavolbiely](https://github.com/pavolbiely) | 3 | `v0.50.159` | `v0.50.233` |
|
|
65
|
+
|
|
66
|
+
## Two-PR contributors (17)
|
|
67
|
+
|
|
68
|
+
[@aliceisjustplaying](https://github.com/aliceisjustplaying), [@allenliang2022](https://github.com/allenliang2022), [@andrewkangkr](https://github.com/andrewkangkr), [@Carry00](https://github.com/Carry00), [@eleboucher](https://github.com/eleboucher), [@insecurejezza](https://github.com/insecurejezza), [@junjunjunbong](https://github.com/junjunjunbong), [@linuxid10t](https://github.com/linuxid10t), [@michael-dg](https://github.com/michael-dg), [@mmartial](https://github.com/mmartial), [@MrFant](https://github.com/MrFant), [@plerohellec](https://github.com/plerohellec), [@renatomott](https://github.com/renatomott), [@swftwolfzyq](https://github.com/swftwolfzyq), [@vcavichini](https://github.com/vcavichini), [@xz-dev](https://github.com/xz-dev), [@zichen0116](https://github.com/zichen0116).
|
|
69
|
+
|
|
70
|
+
## Single-PR contributors (136)
|
|
71
|
+
|
|
72
|
+
Each of these folks landed exactly one PR that shipped — a bug fix, a locale, a security hardening, a doc improvement, an infrastructure tweak. Every one moved the project forward.
|
|
73
|
+
|
|
74
|
+
[@29n](https://github.com/29n), [@86cloudyun-afk](https://github.com/86cloudyun-afk), [@AdoneyGalvan](https://github.com/AdoneyGalvan), [@amlyczz](https://github.com/amlyczz), [@andrewy-wizard](https://github.com/andrewy-wizard), [@Argonaut790](https://github.com/Argonaut790), [@arshkumarsingh](https://github.com/arshkumarsingh), [@ashbuildslife](https://github.com/ashbuildslife), [@Asunfly](https://github.com/Asunfly), [@ayushere](https://github.com/ayushere), [@bengdan](https://github.com/bengdan), [@betamod](https://github.com/betamod), [@bjb2](https://github.com/bjb2), [@Bobby9228](https://github.com/Bobby9228), [@bschmidy10](https://github.com/bschmidy10), [@carlytwozero](https://github.com/carlytwozero), [@Charanis](https://github.com/Charanis), [@ChaseFlorell](https://github.com/ChaseFlorell), [@chwps](https://github.com/chwps), [@colin-chang](https://github.com/colin-chang), [@cyberdyne187](https://github.com/cyberdyne187), [@darkopetrovic](https://github.com/darkopetrovic), [@davidsben](https://github.com/davidsben), [@DavidSchuchert](https://github.com/DavidSchuchert), [@DelightRun](https://github.com/DelightRun), [@dev-rehaann](https://github.com/dev-rehaann), [@dotBeeps](https://github.com/dotBeeps), [@DrMaks22](https://github.com/DrMaks22), [@eba8](https://github.com/eba8), [@emanon312](https://github.com/emanon312), [@eov128](https://github.com/eov128), [@Fail-Safe](https://github.com/Fail-Safe), [@FrancescoFarinola](https://github.com/FrancescoFarinola), [@gabogabucho](https://github.com/gabogabucho), [@galvani](https://github.com/galvani), [@gavinssr](https://github.com/gavinssr), [@GeoffBao](https://github.com/GeoffBao), [@georgebdavis](https://github.com/georgebdavis), [@GiggleSamurai](https://github.com/GiggleSamurai), [@hacker1e7](https://github.com/hacker1e7), [@hacker2005](https://github.com/hacker2005), [@halmisen](https://github.com/halmisen), [@hermes-gimmethebeans](https://github.com/hermes-gimmethebeans), [@hi-friday](https://github.com/hi-friday), [@hualong1009](https://github.com/hualong1009), [@huangzt](https://github.com/huangzt), [@indigokarasu](https://github.com/indigokarasu), [@intellectronica](https://github.com/intellectronica), [@jeffscottward](https://github.com/jeffscottward), [@Jellypowered](https://github.com/Jellypowered), [@jimdawdy-hub](https://github.com/jimdawdy-hub), [@JinYue-GitHub](https://github.com/JinYue-GitHub), [@joaompfp](https://github.com/joaompfp), [@jundev0001](https://github.com/jundev0001), [@KayZz69](https://github.com/KayZz69), [@kcclaw001](https://github.com/kcclaw001), [@kevin-ho](https://github.com/kevin-ho), [@koshikai](https://github.com/koshikai), [@kowenhaoai](https://github.com/kowenhaoai), [@lawrencel1ng](https://github.com/lawrencel1ng), [@leap233](https://github.com/leap233), [@legeantbleu](https://github.com/legeantbleu), [@likawa3b](https://github.com/likawa3b), [@lost9999](https://github.com/lost9999), [@lucky-yonug](https://github.com/lucky-yonug), [@lx3133584](https://github.com/lx3133584), [@MacLeodMike](https://github.com/MacLeodMike), [@malulian](https://github.com/malulian), [@mangodxd](https://github.com/mangodxd), [@mariosam95](https://github.com/mariosam95), [@MatzAgent](https://github.com/MatzAgent), [@mbac](https://github.com/mbac), [@migueltavares](https://github.com/migueltavares), [@MinhoJJang](https://github.com/MinhoJJang), [@mittyok](https://github.com/mittyok), [@mslovy](https://github.com/mslovy), [@mvanhorn](https://github.com/mvanhorn), [@nanookclaw](https://github.com/nanookclaw), [@ng-technology-llc](https://github.com/ng-technology-llc), [@nickgiulioni1](https://github.com/nickgiulioni1), [@octo-patch](https://github.com/octo-patch), [@OneFat3](https://github.com/OneFat3), [@PINKIIILQWQ](https://github.com/PINKIIILQWQ), [@rhelmer](https://github.com/rhelmer), [@rickchew](https://github.com/rickchew), [@RobertoVillegas](https://github.com/RobertoVillegas), [@ruxme](https://github.com/ruxme), [@ryan-remeo](https://github.com/ryan-remeo), [@ryansombraio](https://github.com/ryansombraio), [@s905060](https://github.com/s905060), [@Saik0s](https://github.com/Saik0s), [@samuelgudi](https://github.com/samuelgudi), [@SaulgoodMan-C](https://github.com/SaulgoodMan-C), [@sbe27](https://github.com/sbe27), [@shaoxianbilly](https://github.com/shaoxianbilly), [@sheng-di](https://github.com/sheng-di), [@shruggr](https://github.com/shruggr), [@sixianli](https://github.com/sixianli), [@skspade](https://github.com/skspade), [@smurmann](https://github.com/smurmann), [@snuffxxx](https://github.com/snuffxxx), [@someaka](https://github.com/someaka), [@spektro33](https://github.com/spektro33), [@Stampede](https://github.com/Stampede), [@stocky789](https://github.com/stocky789), [@suinia](https://github.com/suinia), [@sunilkumarvalmiki](https://github.com/sunilkumarvalmiki), [@sunnysktsang](https://github.com/sunnysktsang), [@TaraTheStar](https://github.com/TaraTheStar), [@tgaalman](https://github.com/tgaalman), [@thadreber-web](https://github.com/thadreber-web), [@the-own-lab](https://github.com/the-own-lab), [@theh4v0c](https://github.com/theh4v0c), [@theseussss](https://github.com/theseussss), [@tiansiyuan](https://github.com/tiansiyuan), [@tomaioo](https://github.com/tomaioo), [@trucuit](https://github.com/trucuit), [@ts2111](https://github.com/ts2111), [@v2psv](https://github.com/v2psv), [@vansour](https://github.com/vansour), [@vCillusion](https://github.com/vCillusion), [@vikarag](https://github.com/vikarag), [@waldmanz](https://github.com/waldmanz), [@wali-reheman](https://github.com/wali-reheman), [@watzon](https://github.com/watzon), [@weidzhou](https://github.com/weidzhou), [@weiwei83](https://github.com/weiwei83), [@wind-chant](https://github.com/wind-chant), [@wirtsi](https://github.com/wirtsi), [@woaijiadanoo](https://github.com/woaijiadanoo), [@xingyue52077](https://github.com/xingyue52077), [@xolom](https://github.com/xolom), [@yunyunyunyun-yun](https://github.com/yunyunyunyun-yun), [@yzp12138](https://github.com/yzp12138), [@zapabob](https://github.com/zapabob), [@zenc-cp](https://github.com/zenc-cp).
|
|
75
|
+
|
|
76
|
+
---
|
|
77
|
+
|
|
78
|
+
## How credit is tracked
|
|
79
|
+
|
|
80
|
+
Most PRs in this repo land via one of four paths:
|
|
81
|
+
|
|
82
|
+
1. **Direct merge** — your PR is reviewed and merged on its own. Author shows up directly in `git log` and on the PR's `merged_at` timestamp.
|
|
83
|
+
2. **Squash into a batch release** — your PR is merged together with several other contributor PRs into a single release commit (e.g. `release: v0.51.55 — 9-PR contributor batch`). The original PR closes (not merges) on GitHub but the squashed release commit carries a `Co-authored-by: <you>` trailer plus an entry in `CHANGELOG.md` crediting you by username and PR number.
|
|
84
|
+
3. **Salvaged from a larger PR** — when a PR mixes one good change with several unrelated or risky ones, we split it: the good parts ship in a clean follow-up PR, you get credit in the CHANGELOG entry, and the original PR is closed with a salvage map showing what went where.
|
|
85
|
+
4. **Auto-rebase + auto-fix** — for merge-ready contributor PRs with mechanical blockers (CHANGELOG conflicts, lint, drifted tests), a maintainer rebases the contributor's branch, fixes the blockers, and force-pushes back. The `Co-authored-by` trailer preserves your authorship.
|
|
86
|
+
|
|
87
|
+
All four paths count as a contribution. GitHub's `merged_at` field only catches path 1; paths 2-4 show as "closed" on the contributor's PR even though the work is live in master. That's why this file consults the CHANGELOG attribution lines, not just GitHub's merged-PR list.
|
|
88
|
+
|
|
89
|
+
## Special thanks
|
|
90
|
+
|
|
91
|
+
- **[@aronprins](https://github.com/aronprins)** — `v0.50.0` UI overhaul (PR #242). The CSS-only redesign that defined the design tokens, theme architecture, and three-panel layout that the rest of the app builds on. PR #242 didn't merge as-is, but it is the design language of the app.
|
|
92
|
+
- **[@franksong2702](https://github.com/franksong2702)** — most prolific external contributor across the project's history. 148 PRs spanning the session sidebar, mobile/responsive layout, workspace state machine, profile context, slash autocomplete, breadcrumb navigation, streaming-session exemption, cron output preservation, embedded terminal, the manual-compress async start/status endpoint pair, the worktree status surface (PR #2109) + guarded remove (PR #2156) for the lifecycle umbrella #2057, session post-render dedup (PR #2166), the `/api/session` native-WebUI fast path (PR #2170), tail-window response trim (PR #2171), the second-wave stale-stream guard extension (PR #2158), CSP report collector (PR #2160), and the long tail of polish.
|
|
93
|
+
- **[@Michaelyklam](https://github.com/Michaelyklam)** — most prolific contributor of late-2025/early-2026. 117 PRs covering Docker hardening, profile-scoped skills, KaTeX delimiter parsing, Codex quota surfacing, Goal command, Kanban polish, auto-compression toast lifetime, the localization parity backfills, the v0.51.51 mobile Insights bucketing/layout pair (PRs #2120/#2121), the Hermes run adapter RFC (PR #2105 for #1925), the fork-from-here absolute-index fix (PR #2198 for #2184), and the opencode-go custom-provider overlap routing fix (PR #2204 for #1894).
|
|
94
|
+
- **[@bergeouss](https://github.com/bergeouss)** — provider-management UI, OAuth status, two-container Docker docs, profile isolation hardening, Reveal-in-Finder, the OpenRouter free-tier live fetch, and most of Settings → Providers. 70 PRs.
|
|
95
|
+
- **[@ai-ag2026](https://github.com/ai-ag2026)** — autonomous-AI contributor (Hermes Agent-driven). 67 PRs focused on session recovery (state.db sidecar reconciliation, orphan `.bak` recovery, audit + safe-repair endpoints), workspace/run lifecycle health, the crash-safe turn-journal RFC, the append-only turn-journal helper (PR #2059), the matching lifecycle-events layer (PR #2062), the `Content-Security-Policy-Report-Only` header (PR #2084), and the per-cron toast notification toggle (PR #2100).
|
|
96
|
+
- **[@Jordan-SkyLF](https://github.com/Jordan-SkyLF)** — Live streaming, session recovery, workspace fallback, and a recent burst of presentation polish: the manual "Refresh usage" button on the Provider quota card (PR #2150), cancelled-turn status classification (PR #2151), Firefox sidebar scroll stabilization (PR #2200), early provisional session titles (PR #2202), target-aware "What's new?" links (PR #2207), and MCP tools overflow fix in Settings (PR #2210). 12 PRs total.
|
|
97
|
+
- **[@LumenYoung](https://github.com/LumenYoung)** — contributor focused on the streaming hot path's correctness. 8 PRs including the original stale-stream writeback guard (PR #2136 — the bug class the next two releases extended), gateway-state alive-null classification (PR #2075), compression-banner anchor alignment (PR #2182), and context-progress ring auto-refresh on compression complete (PR #2188).
|
|
98
|
+
- **[@iRonin](https://github.com/iRonin)** — security hardening sprint (PRs #196–#204): session memory leak fix, CSP + Permissions-Policy headers, slow-client connection timeout, optional HTTPS/TLS, upstream branch tracking, CLI session file-browser support. Six consecutive, focused, high-quality security PRs.
|
|
99
|
+
- **[@indigokarasu](https://github.com/indigokarasu)** — visual redesign proposal (PR #213). Icon rail sidebar, design token system, 7 themes. Didn't merge as-is but shaped the design language that landed in v0.50.0.
|
|
100
|
+
- **[@zenc-cp](https://github.com/zenc-cp)** — anti-hallucination guard for the ReAct loop (PR #133). Three-layer approach (ephemeral prompt, live token filtering, session-history cleanup) that the streaming pipeline still uses.
|
|
101
|
+
- **[@deboste](https://github.com/deboste)** — reverse-proxy auth, mobile responsive layout, model routing (PRs #3, #4, #5). Three of the very first community PRs. Early foundation work.
|
|
102
|
+
- **[@Hinotoi-agent](https://github.com/Hinotoi-agent)** — security fixes spanning profile `.env` isolation (PR #351), session-import workspace validation (PR #2048), and bandit B105 hardening. Subtle, high-leverage credential and path-traversal fixes.
|
|
103
|
+
- **[@lucasrc](https://github.com/lucasrc)** — auth-hardening trilogy in v0.51.57 (PRs #2191/#2192/#2193): thread-safe login rate limiter with PBKDF2 key separation, password-hash cache invalidation on settings change, and the full 64-char HMAC-SHA256 session signature with backwards-compatible migration bridge. Three coordinated security PRs that landed together.
|
|
104
|
+
- **[@jasonjcwu](https://github.com/jasonjcwu)** — composer and transcript polish, 16 PRs. Recent: silent compress-status during session switch (PR #2185), concurrent-send loss fix (PR #2186), in-transcript steer message badge (PR #2187), plus sidebar collapse via active-rail click (PR #2054).
|
|
105
|
+
- **[@dobby-d-elf](https://github.com/dobby-d-elf)** — frontend reliability and motion polish: workspace fallback on deleted directories (PR #2138), iPhone PWA bottom-scroll fix (PR #2143), the new "Activity: X tools" composer footer animation (PR #2203) and its follow-up tuning (PR #2212).
|
|
106
|
+
|
|
107
|
+
If you've contributed and aren't here, **open a PR**. We cross-check the CHANGELOG on every release, but if a credit fell through (a Co-authored-by trailer that didn't make it into the changelog entry, an attribution in a PR comment that should be in the release notes), this list is the right place to fix it.
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
---
|
|
2
|
+
version: alpha
|
|
3
|
+
name: Hermes Calm Console
|
|
4
|
+
description: "A restrained agent control surface: conversational content first, tool traces as quiet metadata, minimal chrome."
|
|
5
|
+
colors:
|
|
6
|
+
primary: "#EAE0D5"
|
|
7
|
+
secondary: "#C6AC8F"
|
|
8
|
+
tertiary: "#C6AC8F"
|
|
9
|
+
neutral: "#0A0908"
|
|
10
|
+
surface: "#22333B"
|
|
11
|
+
surfaceSubtle: "#11100E"
|
|
12
|
+
borderSubtle: "#3B4A50"
|
|
13
|
+
ink: "#0A0908"
|
|
14
|
+
success: "#86C08B"
|
|
15
|
+
warning: "#E0B15D"
|
|
16
|
+
error: "#F87171"
|
|
17
|
+
typography:
|
|
18
|
+
body-md:
|
|
19
|
+
fontFamily: "Georgia, Times New Roman, serif"
|
|
20
|
+
fontSize: 15px
|
|
21
|
+
fontWeight: 400
|
|
22
|
+
lineHeight: 1.68
|
|
23
|
+
body-sm:
|
|
24
|
+
fontFamily: "-apple-system, BlinkMacSystemFont, Segoe UI, Inter, system-ui, sans-serif"
|
|
25
|
+
fontSize: 12px
|
|
26
|
+
fontWeight: 400
|
|
27
|
+
lineHeight: 1.45
|
|
28
|
+
user-message:
|
|
29
|
+
fontFamily: "-apple-system, BlinkMacSystemFont, Segoe UI, Inter, system-ui, sans-serif"
|
|
30
|
+
fontSize: 14px
|
|
31
|
+
fontWeight: 400
|
|
32
|
+
lineHeight: 1.55
|
|
33
|
+
mono-xs:
|
|
34
|
+
fontFamily: "SF Mono, ui-monospace, monospace"
|
|
35
|
+
fontSize: 11px
|
|
36
|
+
fontWeight: 500
|
|
37
|
+
lineHeight: 1.55
|
|
38
|
+
rounded:
|
|
39
|
+
sm: 4px
|
|
40
|
+
md: 8px
|
|
41
|
+
lg: 12px
|
|
42
|
+
pill: 999px
|
|
43
|
+
spacing:
|
|
44
|
+
xs: 4px
|
|
45
|
+
sm: 8px
|
|
46
|
+
md: 12px
|
|
47
|
+
lg: 16px
|
|
48
|
+
components:
|
|
49
|
+
app-shell:
|
|
50
|
+
backgroundColor: "{colors.neutral}"
|
|
51
|
+
textColor: "{colors.primary}"
|
|
52
|
+
rounded: "{rounded.sm}"
|
|
53
|
+
padding: 16px
|
|
54
|
+
panel:
|
|
55
|
+
backgroundColor: "{colors.surface}"
|
|
56
|
+
textColor: "{colors.primary}"
|
|
57
|
+
rounded: "{rounded.lg}"
|
|
58
|
+
padding: 16px
|
|
59
|
+
border-line:
|
|
60
|
+
backgroundColor: "{colors.borderSubtle}"
|
|
61
|
+
textColor: "{colors.primary}"
|
|
62
|
+
rounded: "{rounded.sm}"
|
|
63
|
+
padding: 4px
|
|
64
|
+
state-success:
|
|
65
|
+
backgroundColor: "{colors.success}"
|
|
66
|
+
textColor: "{colors.ink}"
|
|
67
|
+
rounded: "{rounded.sm}"
|
|
68
|
+
padding: 4px
|
|
69
|
+
state-warning:
|
|
70
|
+
backgroundColor: "{colors.warning}"
|
|
71
|
+
textColor: "{colors.ink}"
|
|
72
|
+
rounded: "{rounded.sm}"
|
|
73
|
+
padding: 4px
|
|
74
|
+
state-error:
|
|
75
|
+
backgroundColor: "{colors.error}"
|
|
76
|
+
textColor: "{colors.ink}"
|
|
77
|
+
rounded: "{rounded.sm}"
|
|
78
|
+
padding: 4px
|
|
79
|
+
tool-call-group:
|
|
80
|
+
backgroundColor: "{colors.neutral}"
|
|
81
|
+
textColor: "{colors.secondary}"
|
|
82
|
+
rounded: "{rounded.md}"
|
|
83
|
+
padding: 4px
|
|
84
|
+
tool-card:
|
|
85
|
+
backgroundColor: "{colors.surfaceSubtle}"
|
|
86
|
+
textColor: "{colors.secondary}"
|
|
87
|
+
rounded: "{rounded.md}"
|
|
88
|
+
padding: 8px
|
|
89
|
+
user-message:
|
|
90
|
+
backgroundColor: "{colors.tertiary}"
|
|
91
|
+
textColor: "{colors.ink}"
|
|
92
|
+
rounded: "{rounded.lg}"
|
|
93
|
+
padding: 12px
|
|
94
|
+
---
|
|
95
|
+
|
|
96
|
+
## Overview
|
|
97
|
+
|
|
98
|
+
Hermes WebUI should feel like a calm developer console, not a demo page assembled from colorful cards. The primary artifact is the conversation. Tool calls, thinking traces, context compaction records, token usage, and runtime status are useful, but they are transcript metadata and should sit below the visual priority of user and assistant prose.
|
|
99
|
+
|
|
100
|
+
The desired direction is Linear/Vercel precision with a little Claude-style conversational warmth: quiet surfaces, clear spacing, restrained accent use, and progressive disclosure for debugging detail.
|
|
101
|
+
|
|
102
|
+
## Colors
|
|
103
|
+
|
|
104
|
+
- **Primary (#EAE0D5):** main text on dark surfaces. The warm parchment should feel readable and grounded, not like bright white terminal text.
|
|
105
|
+
- **Secondary/Tertiary (#C6AC8F):** metadata and restrained accent. Use sparingly for active state, focus, user bubbles, and quiet emphasis.
|
|
106
|
+
- **Neutral (#0A0908):** app background and ink. This gives the WebUI depth without returning to the previous navy/gold theme.
|
|
107
|
+
- **Surface (#22333B):** panels, sidebar, and stronger interactive surfaces. It should carry the structure while the conversation remains primary.
|
|
108
|
+
- **Light surfaces (#EAE0D5 / #F4EEE7):** light mode uses the palette's parchment as the field and a slightly lifted derived surface for panels.
|
|
109
|
+
- **Semantic colors:** success/warning/error/info are state colors only, not decorative palette choices.
|
|
110
|
+
|
|
111
|
+
## Typography
|
|
112
|
+
|
|
113
|
+
Use Claude-like split typography: assistant prose gets an editorial serif stack (Georgia as the available substitute for Anthropic Serif), while user bubbles and functional UI stay in a crisp sans stack. This keeps the bot voice calmer and more readable without making controls feel bookish. Use monospace only for code, file paths, commands, tool names, and compact metadata. Avoid making whole cards feel like terminal output unless they actually are logs.
|
|
114
|
+
|
|
115
|
+
Scale should stay tight: 11px metadata, 12px labels, 14px body, 16–18px headings. Do not proliferate 10px/10.5px/12.5px one-offs unless there is a real layout constraint.
|
|
116
|
+
|
|
117
|
+
## Layout
|
|
118
|
+
|
|
119
|
+
Conversation rhythm:
|
|
120
|
+
|
|
121
|
+
1. User message — right aligned, compact bubble.
|
|
122
|
+
2. Assistant content — left aligned, prose-first, no heavy bubble.
|
|
123
|
+
3. Tool/thinking/context traces — quiet disclosure rows inside the assistant turn.
|
|
124
|
+
4. Raw logs/details — hidden until explicitly expanded.
|
|
125
|
+
|
|
126
|
+
Metadata should not break the reading flow. A turn that used ten tools should read as one assistant turn with one compact `Used 10 tools` disclosure, not ten content cards.
|
|
127
|
+
|
|
128
|
+
## Elevation & Depth
|
|
129
|
+
|
|
130
|
+
Use almost no shadows in the transcript. Shadows are reserved for popovers, dropdowns, modal dialogs, and floating controls. Cards inside chat should use either a subtle border or a subtle tint, not both aggressively.
|
|
131
|
+
|
|
132
|
+
## Shapes
|
|
133
|
+
|
|
134
|
+
- Rows/list items: `4–8px` radius.
|
|
135
|
+
- Cards/panels: `8–12px` radius.
|
|
136
|
+
- Pills: only true chips/badges use `999px`.
|
|
137
|
+
- Avoid stacks of nested rounded rectangles. If a card contains another card, one of them is probably unnecessary.
|
|
138
|
+
|
|
139
|
+
## Components
|
|
140
|
+
|
|
141
|
+
### Tool/thinking activity group
|
|
142
|
+
|
|
143
|
+
Collapsed by default in settled history and during live runs unless the user has explicitly opened that Activity row before. Persist open/closed disclosure state per chat and per turn, so switching away from a chat and coming back preserves the mode the user left it in. Summary line uses one disclosure for internals and stays intentionally terse, e.g. `Activity: 4 tools`. It should not repeat the always-present thinking area, list individual tool names, or add a second trailing count badge. Expanding reveals thinking and individual tool cards together. Thinking and tools should not create separate transcript rows unless there is an error or approval state that needs attention.
|
|
144
|
+
|
|
145
|
+
### Tool card
|
|
146
|
+
|
|
147
|
+
A tool card is a debug event row, not a chat message. Show icon, name, short target/preview, and status. Arguments and result snippets stay behind expansion. Result snippets should be truncated; full logs belong behind “show more”.
|
|
148
|
+
|
|
149
|
+
### Thinking/context cards
|
|
150
|
+
|
|
151
|
+
Same visual family as tool-call metadata. They should be quieter than assistant prose and should not use bright tinted full cards unless the user expands them.
|
|
152
|
+
|
|
153
|
+
### Composer
|
|
154
|
+
|
|
155
|
+
The composer is the command surface. Keep it legible and focused: modest radius, subtle border, transparent inactive chips, no theatrical hover scaling.
|
|
156
|
+
|
|
157
|
+
## Do's and Don'ts
|
|
158
|
+
|
|
159
|
+
Do:
|
|
160
|
+
|
|
161
|
+
- Collapse noisy agent internals by default.
|
|
162
|
+
- Use one accent color at a time.
|
|
163
|
+
- Prefer neutral borders and restrained surfaces.
|
|
164
|
+
- Make debug traces accessible and inspectable without making them visually dominant.
|
|
165
|
+
- Add stable class/data hooks for future visual regression tests.
|
|
166
|
+
|
|
167
|
+
Don't:
|
|
168
|
+
|
|
169
|
+
- Render every tool call as a first-class chat card.
|
|
170
|
+
- Mix gold, cyan, purple, orange, red, and green as decorative colors in the same viewport.
|
|
171
|
+
- Add new hardcoded radius/color values when a token exists.
|
|
172
|
+
- Use shadows, gradients, and hover transforms for routine controls.
|
|
173
|
+
- Hide important error or approval states; those are allowed to be prominent because they require action.
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
FROM python:3.12-slim
|
|
2
|
+
|
|
3
|
+
LABEL maintainer="nesquena"
|
|
4
|
+
LABEL description="Hermes Web UI — browser interface for Hermes Agent"
|
|
5
|
+
|
|
6
|
+
# Install system packages
|
|
7
|
+
ENV DEBIAN_FRONTEND=noninteractive
|
|
8
|
+
|
|
9
|
+
# Make use of apt-cacher-ng if available
|
|
10
|
+
RUN if [ "A${BUILD_APT_PROXY:-}" != "A" ]; then \
|
|
11
|
+
echo "Using APT proxy: ${BUILD_APT_PROXY}"; \
|
|
12
|
+
printf 'Acquire::http::Proxy "%s";\n' "$BUILD_APT_PROXY" > /etc/apt/apt.conf.d/01proxy; \
|
|
13
|
+
fi \
|
|
14
|
+
&& apt-get update \
|
|
15
|
+
&& apt-get install -y --no-install-recommends ca-certificates wget gnupg \
|
|
16
|
+
&& rm -rf /var/lib/apt/lists/* \
|
|
17
|
+
&& apt-get clean
|
|
18
|
+
|
|
19
|
+
RUN apt-get update -y --fix-missing --no-install-recommends \
|
|
20
|
+
&& apt-get install -y --no-install-recommends \
|
|
21
|
+
apt-utils \
|
|
22
|
+
locales \
|
|
23
|
+
ca-certificates \
|
|
24
|
+
curl \
|
|
25
|
+
rsync \
|
|
26
|
+
openssh-client \
|
|
27
|
+
git \
|
|
28
|
+
xz-utils \
|
|
29
|
+
&& apt-get upgrade -y \
|
|
30
|
+
&& apt-get clean \
|
|
31
|
+
&& rm -rf /var/lib/apt/lists/*
|
|
32
|
+
|
|
33
|
+
# UTF-8
|
|
34
|
+
RUN localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8
|
|
35
|
+
ENV LANG=en_US.utf8
|
|
36
|
+
ENV LC_ALL=C
|
|
37
|
+
|
|
38
|
+
# Set environment variables
|
|
39
|
+
ENV PYTHONDONTWRITEBYTECODE=1 \
|
|
40
|
+
PYTHONUNBUFFERED=1 \
|
|
41
|
+
PYTHONIOENCODING=utf-8
|
|
42
|
+
|
|
43
|
+
WORKDIR /apptoo
|
|
44
|
+
|
|
45
|
+
# Create the unprivileged runtime user. The entrypoint starts as root only for
|
|
46
|
+
# UID/GID alignment and filesystem preparation, then execs the server as this user.
|
|
47
|
+
RUN groupadd -g 1024 hermeswebui \
|
|
48
|
+
&& useradd -u 1024 -d /home/hermeswebui -g hermeswebui -G users -s /bin/bash -m hermeswebui \
|
|
49
|
+
&& mkdir -p /app /uv_cache /workspace \
|
|
50
|
+
&& chown -R hermeswebui:hermeswebui /home/hermeswebui /app /uv_cache /workspace \
|
|
51
|
+
&& chmod 0755 /home/hermeswebui \
|
|
52
|
+
&& chmod 1777 /app /uv_cache /workspace
|
|
53
|
+
|
|
54
|
+
COPY --chmod=555 docker_init.bash /hermeswebui_init.bash
|
|
55
|
+
|
|
56
|
+
RUN touch /.within_container
|
|
57
|
+
|
|
58
|
+
# Remove APT proxy configuration and clean up APT downloaded files
|
|
59
|
+
RUN rm -rf /var/lib/apt/lists/* /etc/apt/apt.conf.d/01proxy \
|
|
60
|
+
&& apt-get clean
|
|
61
|
+
|
|
62
|
+
USER root
|
|
63
|
+
|
|
64
|
+
# Pre-install uv system-wide so the container doesn't need internet access at runtime.
|
|
65
|
+
# Installing as root places uv in /usr/local/bin, available to all users.
|
|
66
|
+
# The init script will skip the download when uv is already on PATH.
|
|
67
|
+
RUN curl -LsSf https://astral.sh/uv/install.sh | env UV_INSTALL_DIR=/usr/local/bin sh
|
|
68
|
+
|
|
69
|
+
COPY --chown=root:root . /apptoo
|
|
70
|
+
|
|
71
|
+
# Bake the git version tag into the image so the settings badge works even
|
|
72
|
+
# when .git is not present (it is excluded by .dockerignore).
|
|
73
|
+
# CI passes: --build-arg HERMES_VERSION=$(git describe --tags --always)
|
|
74
|
+
# Local builds that omit the arg get "unknown" as the fallback.
|
|
75
|
+
ARG HERMES_VERSION=unknown
|
|
76
|
+
RUN echo "__version__ = '${HERMES_VERSION}'" > /apptoo/api/_version.py
|
|
77
|
+
|
|
78
|
+
# Default to binding all interfaces (required for container networking)
|
|
79
|
+
ENV HERMES_WEBUI_HOST=0.0.0.0
|
|
80
|
+
ENV HERMES_WEBUI_PORT=8787
|
|
81
|
+
|
|
82
|
+
EXPOSE 8787
|
|
83
|
+
|
|
84
|
+
HEALTHCHECK --interval=30s --timeout=5s --start-period=10s --retries=3 \
|
|
85
|
+
CMD curl -f http://localhost:8787/health || exit 1
|
|
86
|
+
|
|
87
|
+
# docker_init.bash performs root-only bind-mount setup, then drops to hermeswebui
|
|
88
|
+
# before starting the WebUI server. The production image does not ship sudo.
|
|
89
|
+
USER root
|
|
90
|
+
CMD ["/hermeswebui_init.bash"]
|
|
91
|
+
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Hermes Web UI Contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|