@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,351 @@
|
|
|
1
|
+
# Hermes Web UI — Roadmap
|
|
2
|
+
|
|
3
|
+
> Web companion to the Hermes Agent CLI. Same workflows, browser-native.
|
|
4
|
+
>
|
|
5
|
+
> Last updated: v0.51.192 (May 31, 2026) — ~7,150 tests collected. Recent themes: forward-looking ruff lint gate (#3273), Windows upgrade state-stranding hotfix (#2905), per-model context_length default-only guard (#3256), gateway-configured banner + tooltip i18n, and an ongoing concentric PR-triage cadence.
|
|
6
|
+
> Test source: `pytest tests/ --collect-only -q`
|
|
7
|
+
> Per-version detail: see [CHANGELOG.md](./CHANGELOG.md)
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## Status snapshot
|
|
12
|
+
|
|
13
|
+
| Surface | Status |
|
|
14
|
+
|---|---|
|
|
15
|
+
| **Hermes CLI parity** | ✅ Complete — every CLI workflow has a web equivalent |
|
|
16
|
+
| **Streaming + tool transparency** | ✅ Live tool cards, reasoning cards, approval prompts, cancel |
|
|
17
|
+
| **Multi-provider model support** | ✅ Any provider configured in `config.yaml` shows in the picker |
|
|
18
|
+
| **Sessions + projects + search** | ✅ CRUD, content search, projects, tags, archive, fork, import |
|
|
19
|
+
| **Mobile + Docker + auth** | ✅ Hamburger nav, slide-overs, password auth, GHCR images |
|
|
20
|
+
| **Auxiliary surfaces** | ✅ Workspace tree + edit, cron CRUD, skills CRUD, memory write, MCP server UI |
|
|
21
|
+
| **Visual polish** | ✅ Light/dark/system themes × 11 skins (default, ares, mono, slate, poseidon, sisyphus, charizard, sienna, catppuccin, nous, geist-contrast), Mermaid, KaTeX, syntax highlighting |
|
|
22
|
+
| **Native distribution** | ✅ macOS desktop app (universal arm64+x86_64 DMG, signed) — separate repo |
|
|
23
|
+
|
|
24
|
+
Remaining gaps and forward work live in [Forward Work](#forward-work) below.
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## Architecture
|
|
29
|
+
|
|
30
|
+
| Layer | Files | Status |
|
|
31
|
+
|---|---|---|
|
|
32
|
+
| Python server | `server.py` + `api/` modules | Thin HTTP shell + auth middleware over the `api/` business logic (config, sessions, streaming, profiles, routes, onboarding, workspace, updates, upload) |
|
|
33
|
+
| HTML template | `static/index.html` | Served from disk |
|
|
34
|
+
| CSS | `static/style.css` | Themes + skins, mobile responsive, KaTeX, table styles |
|
|
35
|
+
| JavaScript | `static/{ui,sessions,messages,workspace,panels,boot,commands,icons,i18n,login,onboarding}.js` | Vanilla-JS modules served as static files — no bundler |
|
|
36
|
+
| Service worker | `static/sw.js` | Offline shell cache, version-pinned assets |
|
|
37
|
+
| Docker | `Dockerfile`, `docker-compose.yml` | `python:3.12-slim`, multi-arch (amd64+arm64), HEALTHCHECK |
|
|
38
|
+
| CI/CD | `.github/workflows/` | ruff lint + sharded pytest + browser smoke + Docker smoke on every PR; auto-release + GHCR publish on tag push |
|
|
39
|
+
| Test isolation | `tests/_pytest_port.py` | Per-worktree port + state-dir derivation, no collisions |
|
|
40
|
+
|
|
41
|
+
> Per-file line counts drift every release; see `ARCHITECTURE.md` for the current module map and `git ls-files` for exact sizes.
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
## Feature parity checklist
|
|
46
|
+
|
|
47
|
+
### Chat and streaming
|
|
48
|
+
- [x] Send messages, get SSE-streaming responses
|
|
49
|
+
- [x] Composer-scoped model picker (per-conversation model selection)
|
|
50
|
+
- [x] Multi-provider API support — OpenAI, Anthropic, Google, OpenRouter, xAI, GLM, DeepSeek, Mistral, MiniMax, Kimi, OpenCode, Nous Portal, custom OpenAI-compatible endpoints
|
|
51
|
+
- [x] Live custom-endpoint model discovery (Ollama, LM Studio, vLLM via `/v1/models`)
|
|
52
|
+
- [x] Free-form OpenRouter model name (autocomplete + custom input)
|
|
53
|
+
- [x] Tool progress shown inline via live tool cards
|
|
54
|
+
- [x] Approval card for dangerous commands (Allow once / session / always, Deny)
|
|
55
|
+
- [x] Approval polling + SSE-pushed approval events
|
|
56
|
+
- [x] Clarify dialog — agent can ask blocking clarifying questions
|
|
57
|
+
- [x] Subagent delegation cards in tool view
|
|
58
|
+
- [x] INFLIGHT guard: switch sessions mid-request without losing response
|
|
59
|
+
- [x] Session restores from localStorage on page load
|
|
60
|
+
- [x] Reconnect banner if page reloaded mid-stream
|
|
61
|
+
- [x] SSE auto-reconnect with stream replay
|
|
62
|
+
- [x] Token / cost estimate per message and per session
|
|
63
|
+
- [x] Context usage indicator (compact ring badge in composer footer)
|
|
64
|
+
- [x] Auto-compaction handling + `/compact` command
|
|
65
|
+
- [x] rAF-throttled token rendering (smooth, no DOM thrash)
|
|
66
|
+
- [x] Cancel / stop button in composer footer
|
|
67
|
+
- [x] Reasoning effort selector (low / medium / high / xhigh) + `/reasoning`
|
|
68
|
+
- [x] Pure-text streaming with crash-recovery — partial messages restored from localStorage on reload
|
|
69
|
+
|
|
70
|
+
### Conversation controls
|
|
71
|
+
- [x] Copy message to clipboard (hover icon on each bubble)
|
|
72
|
+
- [x] Edit last user message and regenerate
|
|
73
|
+
- [x] Regenerate last response
|
|
74
|
+
- [x] Clear conversation (wipe messages, keep session)
|
|
75
|
+
- [x] Branch / fork conversation from any message point (#465)
|
|
76
|
+
- [x] Pure-text + tool-call streams both recover
|
|
77
|
+
|
|
78
|
+
### Sessions
|
|
79
|
+
- [x] Create session (+ button or Cmd/Ctrl+K)
|
|
80
|
+
- [x] Load session (click in sidebar)
|
|
81
|
+
- [x] Delete session (hover trash, toast undo, fallback)
|
|
82
|
+
- [x] Auto-title from first user message + adaptive title refresh (configurable cadence)
|
|
83
|
+
- [x] LLM-generated titles via auxiliary route (configurable model)
|
|
84
|
+
- [x] Rename session inline (double-click, Enter saves, Escape cancels)
|
|
85
|
+
- [x] Title search (live filter)
|
|
86
|
+
- [x] Content search (full-text across all sessions)
|
|
87
|
+
- [x] Date group headers (Today / Yesterday / Earlier) with collapsible groups
|
|
88
|
+
- [x] Pin / star sessions to top
|
|
89
|
+
- [x] Duplicate session
|
|
90
|
+
- [x] Import / Export session as JSON (full messages + metadata)
|
|
91
|
+
- [x] Download as Markdown transcript
|
|
92
|
+
- [x] Tags (`#tag` extraction + filter chips)
|
|
93
|
+
- [x] Archive sessions (hidden by default, "Show N archived" toggle)
|
|
94
|
+
- [x] Projects / folders (chip filter bar, "Unassigned" filter)
|
|
95
|
+
- [x] Per-session profile tracking
|
|
96
|
+
- [x] Per-session toolset override (`/toolsets`)
|
|
97
|
+
- [x] Batch select mode (multi-select, bulk delete / move / archive)
|
|
98
|
+
- [x] CLI session bridge — read CLI sessions from state.db, import as WebUI sessions
|
|
99
|
+
|
|
100
|
+
### Workspace and files
|
|
101
|
+
- [x] Add workspace with path validation (existing directory, follows symlinks)
|
|
102
|
+
- [x] Remove / rename workspace
|
|
103
|
+
- [x] Quick-switch from topbar dropdown
|
|
104
|
+
- [x] Sidebar live workspace display (name + path)
|
|
105
|
+
- [x] New sessions inherit last-used workspace
|
|
106
|
+
- [x] Browse workspace directory tree with type icons
|
|
107
|
+
- [x] Tree view with expand / collapse + lazy load (#22)
|
|
108
|
+
- [x] Breadcrumb navigation in subdirectories
|
|
109
|
+
- [x] Preview text / code (read-only)
|
|
110
|
+
- [x] Preview markdown (rendered + tables + Mermaid + KaTeX)
|
|
111
|
+
- [x] Preview images (PNG, JPG, GIF, SVG, WEBP, AVIF inline)
|
|
112
|
+
- [x] Preview PDF / SVG / audio / video / Excalidraw / CSV / JSON / YAML
|
|
113
|
+
- [x] Edit files inline (Edit button, Enter saves, Escape cancels)
|
|
114
|
+
- [x] Create / rename / delete files and folders (in current directory)
|
|
115
|
+
- [x] Drag-drop / click / clipboard paste upload
|
|
116
|
+
- [x] Archive upload (zip / tar) with extraction
|
|
117
|
+
- [x] Syntax highlighted code preview (Prism.js, language-aware)
|
|
118
|
+
- [x] File preview auto-close on directory navigation
|
|
119
|
+
- [x] Right panel resizable (drag inner edge)
|
|
120
|
+
- [x] Embedded workspace terminal (`/api/terminal/{start,input,output}`)
|
|
121
|
+
- [x] Git branch + dirty status badge in workspace header
|
|
122
|
+
|
|
123
|
+
### Cron jobs
|
|
124
|
+
- [x] List all cron jobs (Tasks sidebar tab)
|
|
125
|
+
- [x] View job details (prompt, schedule, last run, output)
|
|
126
|
+
- [x] Run / pause / resume / delete
|
|
127
|
+
- [x] Create job from UI (name, schedule, prompt, delivery target)
|
|
128
|
+
- [x] Edit job inline (full create-form parity, including skills)
|
|
129
|
+
- [x] Skill picker in create + edit forms
|
|
130
|
+
- [x] Cron run history viewer (expandable per job)
|
|
131
|
+
- [x] Cron completion alerts (toast + badge)
|
|
132
|
+
- [x] Run-status tracking with live watch mode
|
|
133
|
+
|
|
134
|
+
### Skills
|
|
135
|
+
- [x] List all skills grouped by category
|
|
136
|
+
- [x] Search / filter by name, description, category
|
|
137
|
+
- [x] View full SKILL.md content
|
|
138
|
+
- [x] View skill linked files
|
|
139
|
+
- [x] Create / edit / delete skill
|
|
140
|
+
- [x] `/skills` slash command
|
|
141
|
+
|
|
142
|
+
### Memory
|
|
143
|
+
- [x] View personal notes (MEMORY.md) rendered as markdown
|
|
144
|
+
- [x] View user profile (USER.md) rendered as markdown
|
|
145
|
+
- [x] Last-modified timestamp per section
|
|
146
|
+
- [x] Add / edit memory entries inline
|
|
147
|
+
|
|
148
|
+
### Profiles
|
|
149
|
+
- [x] Multi-profile support — create, switch, delete (#28)
|
|
150
|
+
- [x] Topbar profile picker with gateway-status dots
|
|
151
|
+
- [x] Profile management panel (full CRUD)
|
|
152
|
+
- [x] Seamless switching (no server restart, refreshes models / skills / memory / cron / workspace)
|
|
153
|
+
- [x] Profile-local workspace storage
|
|
154
|
+
- [x] First-run onboarding wizard with provider config (OpenRouter / Anthropic / OpenAI / Custom)
|
|
155
|
+
- [x] In-app OAuth for Codex and Claude
|
|
156
|
+
|
|
157
|
+
### Configuration
|
|
158
|
+
- [x] Settings panel (default model, default workspace, send key, theme, voice, font size)
|
|
159
|
+
- [x] Send key preference (Enter or Ctrl+Enter)
|
|
160
|
+
- [x] Password authentication (off by default)
|
|
161
|
+
- [x] Per-session toolset override
|
|
162
|
+
- [x] Personality config via `config.yaml`
|
|
163
|
+
- [x] Reasoning effort persistence
|
|
164
|
+
|
|
165
|
+
### Notifications
|
|
166
|
+
- [x] Cron job completion alerts
|
|
167
|
+
- [x] Background agent error banner
|
|
168
|
+
- [x] Approval pending badge
|
|
169
|
+
- [x] Provider / model mismatch toast warning
|
|
170
|
+
|
|
171
|
+
### Slash commands
|
|
172
|
+
- [x] Command registry + autocomplete dropdown
|
|
173
|
+
- [x] Built-ins: `/help`, `/clear`, `/model`, `/workspace`, `/new`, `/usage`, `/theme`, `/compact`, `/queue`, `/interrupt`, `/steer`, `/goal`, `/btw`, `/reasoning`, `/skills`, `/toolsets`
|
|
174
|
+
- [x] Transparent pass-through for unrecognized commands
|
|
175
|
+
|
|
176
|
+
### Security
|
|
177
|
+
- [x] Password auth with signed HMAC HTTP-only cookies (24h TTL)
|
|
178
|
+
- [x] Security headers (X-Content-Type-Options, X-Frame-Options, Referrer-Policy)
|
|
179
|
+
- [x] CSRF protection (scheme-aware, port-normalized for reverse proxies)
|
|
180
|
+
- [x] PBKDF2 password hashing
|
|
181
|
+
- [x] Rate limiting on auth endpoints
|
|
182
|
+
- [x] Session ID validation
|
|
183
|
+
- [x] SSRF guard on `/api/models/live`, `cfg_base_url`, `custom_providers[]`
|
|
184
|
+
- [x] ENV_LOCK around env mutations
|
|
185
|
+
- [x] XSS sanitization on all rendered HTML
|
|
186
|
+
- [x] HMAC-signed signing keys (random per install)
|
|
187
|
+
- [x] Skills path-traversal guard
|
|
188
|
+
- [x] Secure cookie flags (HttpOnly, SameSite, Secure when HTTPS)
|
|
189
|
+
- [x] Error message sanitization (no stack traces in responses)
|
|
190
|
+
- [x] POST body size limit (20MB)
|
|
191
|
+
- [x] Upload path-traversal guard
|
|
192
|
+
- [x] Credential redaction in API responses
|
|
193
|
+
- [x] Profile `.env` secret isolation on switch
|
|
194
|
+
- [x] Auto-install gate (opt-in via `HERMES_WEBUI_AUTO_INSTALL=1`)
|
|
195
|
+
|
|
196
|
+
### Visual / UX
|
|
197
|
+
- [x] 8 themes — Dark, Light, System (auto-sync), Slate, Solarized, Monokai, Nord, OLED, Sienna
|
|
198
|
+
- [x] 2-axis appearance model (theme + skin) for community theme contributions
|
|
199
|
+
- [x] Mermaid diagram rendering
|
|
200
|
+
- [x] KaTeX math rendering with fence-before-math fix
|
|
201
|
+
- [x] Syntax highlighting (Prism.js, language-aware, YAML newline preservation)
|
|
202
|
+
- [x] Markdown image syntax `` and inline MEDIA: tokens render as `<img>`
|
|
203
|
+
- [x] Plain URL auto-linking
|
|
204
|
+
- [x] Inline markdown in table cells (bold, italic, code, links)
|
|
205
|
+
- [x] Code block copy button
|
|
206
|
+
- [x] Tool card expand / collapse toggle
|
|
207
|
+
- [x] Collapsible thinking / reasoning cards (Claude extended thinking, o3 reasoning tokens)
|
|
208
|
+
- [x] Message timestamps (subtle, full date on hover)
|
|
209
|
+
- [x] Empty composer hides send button (icon-circle with pop-in animation)
|
|
210
|
+
- [x] Pluggable Lucide SVG icons (no emoji rendering inconsistencies)
|
|
211
|
+
- [x] Composer-centric controls (v0.50.0 UI overhaul)
|
|
212
|
+
- [x] Hermes Control Center modal (centralized actions)
|
|
213
|
+
- [x] Workspace panel state machine (defaults closed, opens for browsing / preview)
|
|
214
|
+
- [x] PWA manifest + service worker (offline shell)
|
|
215
|
+
- [x] Favicon (SVG + PNG + ICO)
|
|
216
|
+
- [x] Branded onboarding wizard
|
|
217
|
+
|
|
218
|
+
### Voice
|
|
219
|
+
- [x] Voice input via Web Speech API (push-to-talk dictation)
|
|
220
|
+
- [x] Hands-free voice mode (turn-based conversation, opt-in via Settings → Preferences)
|
|
221
|
+
- [x] TTS playback of responses (configurable voice, rate, pitch)
|
|
222
|
+
|
|
223
|
+
### Mobile
|
|
224
|
+
- [x] Hamburger sidebar (slide-in overlay)
|
|
225
|
+
- [x] Bottom navigation bar (5-tab iOS-style)
|
|
226
|
+
- [x] Files slide-over (right panel as slide-over)
|
|
227
|
+
- [x] 44px minimum touch targets
|
|
228
|
+
- [x] Container queries on composer
|
|
229
|
+
- [x] Android Chrome compatibility fixes
|
|
230
|
+
- [x] PWA installation (manifest + icons + Android support)
|
|
231
|
+
|
|
232
|
+
### Internationalization
|
|
233
|
+
- [x] 9 locales — English, Japanese, Russian, Spanish, German, Chinese (zh + zh-Hant), Portuguese, Korean, French
|
|
234
|
+
- [x] Key-parity test ensures every locale has every key
|
|
235
|
+
- [x] Right-to-left and CJK input (IME composition fixes)
|
|
236
|
+
|
|
237
|
+
### Gateway integration
|
|
238
|
+
- [x] Real-time gateway sessions in sidebar (Telegram, Discord, Slack, Weixin) via SSE + DB polling
|
|
239
|
+
- [x] Cross-channel handoff dock — composer-docked flyout summarizing the live external session
|
|
240
|
+
- [x] Transcript-summary card at 10+ rounds
|
|
241
|
+
- [x] Sidebar dedup keying on per-conversation identity (distinct chats from same platform stay separate)
|
|
242
|
+
- [x] Gateway session sync skips dup / delete options for external sessions
|
|
243
|
+
- [x] LLM Gateway routing metadata display — assistant turns and session metadata show the served model/provider, failover path, and model-switch warnings when response metadata includes `used_provider`, `used_model`, or `routing` (#732)
|
|
244
|
+
|
|
245
|
+
### MCP integration
|
|
246
|
+
- [x] MCP server management UI (System Settings → MCP Servers)
|
|
247
|
+
- [x] Add / edit / delete MCP server entries
|
|
248
|
+
|
|
249
|
+
### Distribution
|
|
250
|
+
- [x] Docker support (multi-arch amd64 + arm64, HEALTHCHECK, UID/GID auto-detect)
|
|
251
|
+
- [x] Two-container Docker compose (webui + agent)
|
|
252
|
+
- [x] GHCR auto-publish on tag push
|
|
253
|
+
- [x] Subpath mount support (reverse proxy at `/hermes/`)
|
|
254
|
+
- [x] PWA installable from any browser
|
|
255
|
+
- [x] Native macOS app — universal Intel + Apple Silicon, signed + notarized DMG, Sparkle 2 auto-update — see `hermes-webui/hermes-swift-mac` repo
|
|
256
|
+
|
|
257
|
+
---
|
|
258
|
+
|
|
259
|
+
## Forward work
|
|
260
|
+
|
|
261
|
+
### Confirmed candidates (open feature requests with sprint-candidate or active interest)
|
|
262
|
+
|
|
263
|
+
| Theme | Tracking | Why |
|
|
264
|
+
|---|---|---|
|
|
265
|
+
| Persistent-host stability | #1458 | Bootstrap fork pattern crashes under launchd / systemd — partial fix shipped (foreground mode); state.db FD leak and HTTP-unhealthy wedge remain |
|
|
266
|
+
| Free-tier OpenRouter variants visible | #1426 | `:free` tool-support filter currently hides them from the picker |
|
|
267
|
+
| macOS scroll override regression | #1360 | Auto-scroll sometimes overrides user scroll on the desktop app |
|
|
268
|
+
| GLM dual-use (main + auxiliary) | #1291 | Currently mutually exclusive; same provider can't serve both surfaces |
|
|
269
|
+
| Auto-assign session to filtered project | #1468 | When user is filtering by project X, new session should default to project X |
|
|
270
|
+
| Update banner "What's new?" link | #1512 | Surface release highlights from the update banner |
|
|
271
|
+
| Sunset legacy `LMSTUDIO_API_KEY` env var | #1502 | Tracking issue — alias stays for one minor cycle, then removed |
|
|
272
|
+
| Hermes Agent dashboard cross-link | #1459 | Detect a running Hermes Agent and surface link in nav |
|
|
273
|
+
| Gateway status card in Settings | #1457 | Current gateway-status dots only on profile picker |
|
|
274
|
+
| Insights — daily token chart + per-model breakdown | #1456 | Existing usage badge is per-message; need rollup view |
|
|
275
|
+
| Logs tab — view agent / errors / gateway logs | #1455 | Currently requires terminal access to log files |
|
|
276
|
+
| Model picker collision handling | #1425 | Same-name models from different providers aren't disambiguated in dropdown |
|
|
277
|
+
| "Reveal in Finder" right-click on workspace | #1424 | macOS desktop app convenience |
|
|
278
|
+
| Configurable session persistence timing | #1406 | Currently every checkpoint, want operator control |
|
|
279
|
+
| Silent credential self-heal on 401 | #1401 | Gateway auth.json drift should resolve without user re-auth |
|
|
280
|
+
| LLM Wiki status panel | #1257 | On / off toggle for Wiki integration |
|
|
281
|
+
| Lightweight in-app Canvas editing | #1255 | Text canvas for prompt drafting / shared notes |
|
|
282
|
+
| Provider / Model source-of-truth alignment | #1240 | Reconcile WebUI vs CLI vs Gateway provider resolution |
|
|
283
|
+
| Built-in SearXNG web search | #1037 | Lightweight search tool with on / off toggle |
|
|
284
|
+
| Subagent session relationship view | #1004 | Show subagent hierarchy in sidebar with expand / collapse |
|
|
285
|
+
|
|
286
|
+
### Backlog (deferred, listed for visibility)
|
|
287
|
+
|
|
288
|
+
- **Insights / monitoring suite** — agent heartbeat + alerts (#716), quota / rate-limit display (#706), data tabs (#722), monitor dashboard concepts (#766, #721)
|
|
289
|
+
- **Native MCP server expose** — Hermes WebUI as an MCP server for direct agent integration (#733)
|
|
290
|
+
- **Teams / agents management panel** — editable names, roles, assignments (#719)
|
|
291
|
+
- **Web UI profile model alignment with Hermes runtime** — design parity (#749)
|
|
292
|
+
- **DOM windowing / message virtualization** — for sessions with hundreds of messages (#734)
|
|
293
|
+
- **Searchable global tool list** (#697)
|
|
294
|
+
- **Add agent / replace model modals** (#698)
|
|
295
|
+
- **Code execution inline cells** — Jupyter-style cell rendering inside chat
|
|
296
|
+
- **Sharing / public conversation URLs** — requires hosted backend with access control (out of scope for self-host)
|
|
297
|
+
|
|
298
|
+
### Intentionally not planned
|
|
299
|
+
- Full SwiftUI rewrite of the frontend — the WKWebView shell already gets 95% of native benefit
|
|
300
|
+
- App Store distribution — sandboxing breaks the local server model
|
|
301
|
+
- Real-time multi-user collaboration — single-user assumption throughout
|
|
302
|
+
- Plugin marketplace — Hermes skills cover this surface
|
|
303
|
+
- Anthropic / Claude proprietary features — Projects AI memory, Claude artifacts sync (not reproducible)
|
|
304
|
+
|
|
305
|
+
---
|
|
306
|
+
|
|
307
|
+
## Sprint history
|
|
308
|
+
|
|
309
|
+
Per-version detail lives in [CHANGELOG.md](./CHANGELOG.md). The table below is a high-level chronology of major sprint themes; individual PR / fix detail moved to CHANGELOG to keep this file readable.
|
|
310
|
+
|
|
311
|
+
| Range | Theme | Highlights |
|
|
312
|
+
|---|---|---|
|
|
313
|
+
| Sprints 1–6 | Foundations + workspace | server / static split, JS module split, workspace CRUD, file editor, message queue + INFLIGHT, isolated test environment |
|
|
314
|
+
| Sprint 7 | Wave 2 core | Cron / skill / memory CRUD, session content search, health endpoint, git init |
|
|
315
|
+
| Sprint 8 | Daily-driver finish line | Edit + regenerate, regenerate last response, clear conversation, Prism.js, queue + INFLIGHT polish |
|
|
316
|
+
| Sprints 9–10 | Codebase health + operational polish | `app.js` → 6 modules, server.py → `api/` modules, tool card UX, background task cancel, regression tests |
|
|
317
|
+
| Sprint 11 | Multi-provider models + streaming | Dynamic model dropdown, smooth scroll pinning, routes extracted to `api/routes.py` |
|
|
318
|
+
| Sprint 12 | Settings + reliability + session QoL | Settings panel, SSE auto-reconnect, pin sessions, JSON import |
|
|
319
|
+
| Sprint 13 | Alerts + polish | Cron alerts, background error banner, session duplicate, browser tab title |
|
|
320
|
+
| Sprint 14 | Visual polish + workspace ops | Mermaid, message timestamps, file rename, folder create, session tags, archive |
|
|
321
|
+
| Sprint 15 | Session projects + code copy | Projects / folders, code copy button, tool card expand / collapse |
|
|
322
|
+
| Sprint 16 | Sidebar visual polish | SVG icons, action dropdown, pin indicator, project border, safe HTML rendering |
|
|
323
|
+
| Sprint 17 | Workspace polish + slash commands | Breadcrumb nav, slash command autocomplete, send key setting (#26) |
|
|
324
|
+
| Sprint 18 | Thinking display + workspace tree | File preview auto-close, thinking / reasoning cards, expandable directory tree (#22) |
|
|
325
|
+
| Sprint 19 | Auth + security hardening | Password auth, login page, security headers, body limit (#23) |
|
|
326
|
+
| Sprint 20 | Voice input + send button | Web Speech API voice, send button polish |
|
|
327
|
+
| Sprint 21 | Mobile responsive + Docker | Hamburger sidebar, mobile nav, slide-over files, Docker support (#21, #7) |
|
|
328
|
+
| Sprint 22 | Multi-profile support | Profile picker, management panel, seamless switching, per-session tracking (#28) |
|
|
329
|
+
| Sprint 23 | Agentic transparency | Token / cost display, subagent cards, skill picker in cron, profile-local storage |
|
|
330
|
+
| Sprint 24 | Web polish | rAF streaming, git detection, collapsible date groups, context ring (#80, #81, #82, #83) |
|
|
331
|
+
| Sprint 25 | macOS desktop application | Native Swift + WKWebView shell, universal DMG, Sparkle 2 auto-update — separate repo |
|
|
332
|
+
| Sprint 26 | Pluggable themes | Light / Slate / Solarized / Monokai / Nord, settings unsaved-changes guard, `/theme` |
|
|
333
|
+
| Sprint 27 | Theme polish | 30+ hardcoded colors → CSS variables, light theme final polish |
|
|
334
|
+
| Sprint 28 | Security hardening | Env race fix, random signing key, upload traversal, PBKDF2 |
|
|
335
|
+
| Sprints 29–32 | Model routing + custom endpoints + reasoning | Model routing by provider prefix, custom endpoint URL fix, OLED theme, top-level reasoning, message_count sync |
|
|
336
|
+
| Sprint 33 | Approval card + Lucide icons | Approval prompt surfaced, emoji → SVG, login CSP fix, update diagnostics |
|
|
337
|
+
| Sprint 34 | v0.50.0 UI overhaul | Composer-centric controls, Control Center modal, workspace state machine, collapsible date groups, rAF throttle, context ring |
|
|
338
|
+
| Sprints 35–37 | Onboarding + i18n + Spanish | First-run wizard, OpenRouter / Anthropic / OpenAI / Custom config, Spanish locale, Docker two-container, mobile Profiles button |
|
|
339
|
+
| Sprints 38–40 | Session + UI polish + Sprint 40 | Five-bug clean-up + sidebar timestamp + test port isolation |
|
|
340
|
+
| Sprints 41–42 | Renderer hardening + KaTeX + handoff | Context ring live usage, renderMd link / image / code stash chain, MEDIA: image rendering, gateway handoff foundation |
|
|
341
|
+
| Sprints 43+ | Continuous contributor sprints | Custom providers, Russian locale, IME fixes, model-switch toast, approval queue multi-slot, profile polish, font-size CSS, contributor wave |
|
|
342
|
+
|
|
343
|
+
---
|
|
344
|
+
|
|
345
|
+
## Versioning conventions
|
|
346
|
+
|
|
347
|
+
- **Patch** (`v0.50.X`) — small batches, contributor PR releases, hotfixes
|
|
348
|
+
- **Minor** (`v0.X.0`) — sprint completion, new feature surface, architecture milestone
|
|
349
|
+
- **Major** (`v1.0.0`) — declared when CLI parity + Claude parity reach steady state and the feature surface stabilizes
|
|
350
|
+
|
|
351
|
+
Per-version detail and contributor attribution live in [CHANGELOG.md](./CHANGELOG.md).
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
# Hermes Web UI — Sprint Planning
|
|
2
|
+
|
|
3
|
+
> Forward-looking sprint plan and active queue.
|
|
4
|
+
>
|
|
5
|
+
> Current state: v0.50.281 | 3995 tests | port 8787
|
|
6
|
+
> Target A (CLI parity): ✅ Complete
|
|
7
|
+
> Target B (Claude parity): ~95% — full subagent transparency UI and code-execution cells remain
|
|
8
|
+
>
|
|
9
|
+
> Per-version detail: [CHANGELOG.md](./CHANGELOG.md)
|
|
10
|
+
> Sprint history (chronology): [ROADMAP.md](./ROADMAP.md)
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## How sprints work here
|
|
15
|
+
|
|
16
|
+
A sprint is a thematic batch — usually 3–8 PRs landed together as a release. Each sprint has:
|
|
17
|
+
|
|
18
|
+
1. **Theme** — single-sentence framing of what changes
|
|
19
|
+
2. **Items** — selected work, with tracking issue / PR
|
|
20
|
+
3. **Out of scope** — what is explicitly deferred and why
|
|
21
|
+
4. **Risks** — known sharp edges
|
|
22
|
+
5. **Retro** — once shipped, what we learned
|
|
23
|
+
|
|
24
|
+
External contributor PRs that don't fit a planned sprint get released individually as patch versions (`v0.50.X`). Sprints are reserved for coherent batches where the items reinforce each other.
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## Active sprint candidates
|
|
29
|
+
|
|
30
|
+
These are the issues currently labeled `sprint-candidate` — the inbox the next sprint plan draws from. Each item already has a confirmed root cause or design direction.
|
|
31
|
+
|
|
32
|
+
| # | Title | Type | Sprint fit |
|
|
33
|
+
|---|---|---|---|
|
|
34
|
+
| #1458 | Persistent-host crashes — bootstrap fork pattern, state.db FD leak, HTTP-unhealthy wedge | bug, stability | Stability sprint candidate |
|
|
35
|
+
| #1426 | OpenRouter free-tier `:free` variants invisible (tool-support filter) | bug + feat | Model picker sprint candidate |
|
|
36
|
+
| #1362 | In-app OAuth login for Codex and Claude (currently terminal-only) | feat, ux | Onboarding sprint candidate |
|
|
37
|
+
| #1360 | macOS desktop app — auto-scroll overrides user scroll (#677 regression) | bug, ux | Desktop app polish |
|
|
38
|
+
| #1291 | GLM mutually exclusive between main agent and auxiliary title generation | bug | Auxiliary-route sprint |
|
|
39
|
+
|
|
40
|
+
The active queue stays small — it's the next 1-2 sprints' worth of work. The broader backlog of feature requests lives in [ROADMAP.md → Forward Work](./ROADMAP.md#forward-work) and on the GitHub `enhancement` label.
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
## Planning principles
|
|
45
|
+
|
|
46
|
+
**Phase-0 fit assessment.** Every sprint candidate gets a marginal-benefit screen first: does this make the product noticeably better for real users, or does it add surface area that costs more to maintain than it earns? Five-question fit screen — need / shape / bloat / clutter / scope.
|
|
47
|
+
|
|
48
|
+
**Salvage over absorb.** When a contributor PR is partial or scoped wrong, prefer splicing the good parts into a maintainer-side PR with `Co-authored-by` attribution rather than asking for multiple rebase rounds. Only absorb whole when the PR is genuinely shippable as-is.
|
|
49
|
+
|
|
50
|
+
**Independent-review gate.** Self-built PRs need either (a) Opus advisor pass on the merged stage diff, or (b) independent review from a separate reviewer. High-risk batches (large LOC, security, locks, durability) get both.
|
|
51
|
+
|
|
52
|
+
**Per-PR release velocity.** When a single PR fixes a real bug and has a clean review, ship it as its own patch release the same day rather than waiting for a sprint batch. Friction-free is the goal — sprint batches exist for coherence, not for arbitrary grouping.
|
|
53
|
+
|
|
54
|
+
**No feature creep mid-PR.** If a contributor proposes a scope addition during review, file it as a separate PR and link from the original. The current PR keeps its original boundaries.
|
|
55
|
+
|
|
56
|
+
**Pre-release gate (mandatory).** Every release runs:
|
|
57
|
+
1. `pytest tests/ -q --timeout=120` clean
|
|
58
|
+
2. Browser sanity check (HTTP-level API tests against a test server)
|
|
59
|
+
3. Opus advisor pass on the merged stage diff with a written brief
|
|
60
|
+
4. CHANGELOG.md + ROADMAP.md + TESTING.md version stamp
|
|
61
|
+
5. CI green on Python 3.11 / 3.12 / 3.13
|
|
62
|
+
|
|
63
|
+
Skipping any of these requires a documented "I'm doing an override" from the maintainer.
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
## Sprint shape
|
|
68
|
+
|
|
69
|
+
A typical sprint runs 3-7 days end to end:
|
|
70
|
+
|
|
71
|
+
| Phase | Duration | Output |
|
|
72
|
+
|---|---|---|
|
|
73
|
+
| Triage | 0.5 day | Active queue → selected items + scope notes |
|
|
74
|
+
| Design / spike | 0.5–1 day | Design notes for items needing them; deferrals documented |
|
|
75
|
+
| Build | 2–4 days | Each item on its own branch + PR for independent review |
|
|
76
|
+
| Review | 0.5–1 day | Maintainer + Opus advisor passes; SHOULD-FIX absorbed in-release |
|
|
77
|
+
| Stage + ship | 0.5 day | Stage branch, full test suite, release PR, tag, deploy, verify live |
|
|
78
|
+
| Hygiene | 0.5 day | Close PRs / issues, GitHub release notes, docs sync, retro |
|
|
79
|
+
|
|
80
|
+
Smaller sprints (1–2 PRs) compress to 1–2 days end to end. Single-PR releases skip the stage branch and ship via a release PR directly off the contributor's branch (or a maintainer-rebased copy if the fork doesn't grant write access).
|
|
81
|
+
|
|
82
|
+
---
|
|
83
|
+
|
|
84
|
+
## Sprint history
|
|
85
|
+
|
|
86
|
+
Per-version detail is in [CHANGELOG.md](./CHANGELOG.md). High-level theme chronology is in [ROADMAP.md → Sprint History](./ROADMAP.md#sprint-history). A few notable sprints worth highlighting:
|
|
87
|
+
|
|
88
|
+
- **Sprint 19** — auth + security hardening. First sprint that made the app safe to leave running beyond localhost.
|
|
89
|
+
- **Sprint 21** — mobile responsive + Docker. Two-container compose enabled the first wave of self-host deployments.
|
|
90
|
+
- **Sprint 22** — multi-profile support. Major CLI-parity unlock; profile switching is now seamless without server restart.
|
|
91
|
+
- **Sprint 25** — macOS desktop application. Native Swift + WKWebView shell, universal Intel + Apple Silicon DMG, Sparkle 2 auto-update. Lives in the separate `hermes-webui/hermes-swift-mac` repo.
|
|
92
|
+
- **Sprint 26** — pluggable themes. CSS-variable-driven 8-theme system that lets community contributors add themes as pure CSS.
|
|
93
|
+
- **Sprint 34** — v0.50.0 UI overhaul. Composer-centric controls, Control Center modal, workspace state machine, rAF streaming throttle.
|
|
94
|
+
|
|
95
|
+
---
|
|
96
|
+
|
|
97
|
+
## Out of scope (across all sprints)
|
|
98
|
+
|
|
99
|
+
These are intentionally not on the roadmap. Listing them here to save planning cycles.
|
|
100
|
+
|
|
101
|
+
- **Multi-user collaboration** — single-user assumption throughout the codebase. Refactoring would be a from-scratch architecture change.
|
|
102
|
+
- **Sharing / public conversation URLs** — requires hosted backend with access control + CDN. Out of scope for self-hosted.
|
|
103
|
+
- **Plugin marketplace** — Hermes skills already cover this surface.
|
|
104
|
+
- **Anthropic / Claude proprietary features** — Projects AI memory, Claude artifacts sync. Not reproducible.
|
|
105
|
+
- **Linux / Windows native app wrappers** — macOS done; demand on other platforms not yet established. Web UI works in any browser.
|
|
106
|
+
- **App Store distribution** — sandboxing breaks the local-server model.
|
|
107
|
+
- **Auto-update mechanism for the Python webapp** — Sparkle 2 covers the Mac app; the webapp updates via `git pull` + restart, which is the same as every other Python service.
|
|
108
|
+
|
|
109
|
+
---
|
|
110
|
+
|
|
111
|
+
## Templates
|
|
112
|
+
|
|
113
|
+
When opening a new sprint plan, copy this structure:
|
|
114
|
+
|
|
115
|
+
```markdown
|
|
116
|
+
# Sprint NN — <theme>
|
|
117
|
+
|
|
118
|
+
**Version target:** vX.Y.Z
|
|
119
|
+
**Theme:** <single sentence>
|
|
120
|
+
**Date started:** YYYY-MM-DD
|
|
121
|
+
**Status:** PLANNED | IN PROGRESS | COMPLETED — vX.Y.Z
|
|
122
|
+
|
|
123
|
+
## Items
|
|
124
|
+
| # | Issue | Title | Complexity | Files | PR |
|
|
125
|
+
|---|-------|-------|------------|-------|-----|
|
|
126
|
+
|
|
127
|
+
## Rationale
|
|
128
|
+
Why these items, why now.
|
|
129
|
+
|
|
130
|
+
## Build approach
|
|
131
|
+
Per-item branch + PR; or single combined branch if items are tightly coupled.
|
|
132
|
+
|
|
133
|
+
## Out of scope
|
|
134
|
+
What did NOT make this sprint and why.
|
|
135
|
+
|
|
136
|
+
## Known risks
|
|
137
|
+
Sharp edges to watch during review.
|
|
138
|
+
|
|
139
|
+
## PR Status
|
|
140
|
+
| Issue | PR | Status |
|
|
141
|
+
|-------|-----|--------|
|
|
142
|
+
|
|
143
|
+
## Retro (post-ship)
|
|
144
|
+
What worked, what we'd do differently.
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
The maintainer's planning notes for each sprint live in the workspace repo (private), not in this file. This file is the public-facing planning shape.
|