@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.
Files changed (233) hide show
  1. package/README.md +213 -0
  2. package/bin/hermes-webui.mjs +588 -0
  3. package/package.json +25 -0
  4. package/scripts/sync-vendor.mjs +74 -0
  5. package/templates/launchd/com.bitseek.hermes-webui.plist +21 -0
  6. package/templates/systemd/hermes-webui.service +13 -0
  7. package/templates/windows/hermes-webui-task.ps1 +3 -0
  8. package/vendor/agent-frontend-shell/.bitseek-source.json +6 -0
  9. package/vendor/agent-frontend-shell/.dockerignore +7 -0
  10. package/vendor/agent-frontend-shell/.env.docker.example +89 -0
  11. package/vendor/agent-frontend-shell/.env.example +34 -0
  12. package/vendor/agent-frontend-shell/.github/FUNDING.yml +3 -0
  13. package/vendor/agent-frontend-shell/.github/workflows/browser-smoke.yml +42 -0
  14. package/vendor/agent-frontend-shell/.github/workflows/docker-smoke.yml +233 -0
  15. package/vendor/agent-frontend-shell/.github/workflows/native-windows-startup.yml +132 -0
  16. package/vendor/agent-frontend-shell/.github/workflows/release.yml +57 -0
  17. package/vendor/agent-frontend-shell/.github/workflows/tests.yml +88 -0
  18. package/vendor/agent-frontend-shell/.vscode/launch.json +59 -0
  19. package/vendor/agent-frontend-shell/.vscode/settings.json +13 -0
  20. package/vendor/agent-frontend-shell/AGENTS.md +80 -0
  21. package/vendor/agent-frontend-shell/ARCHITECTURE.md +1658 -0
  22. package/vendor/agent-frontend-shell/BUGS.md +52 -0
  23. package/vendor/agent-frontend-shell/CHANGELOG.md +7295 -0
  24. package/vendor/agent-frontend-shell/CONTRIBUTING.md +205 -0
  25. package/vendor/agent-frontend-shell/CONTRIBUTORS.md +107 -0
  26. package/vendor/agent-frontend-shell/DESIGN.md +173 -0
  27. package/vendor/agent-frontend-shell/Dockerfile +91 -0
  28. package/vendor/agent-frontend-shell/LICENSE +21 -0
  29. package/vendor/agent-frontend-shell/README-CUSTOM.md +76 -0
  30. package/vendor/agent-frontend-shell/README.md +705 -0
  31. package/vendor/agent-frontend-shell/ROADMAP.md +351 -0
  32. package/vendor/agent-frontend-shell/SPRINTS.md +147 -0
  33. package/vendor/agent-frontend-shell/TESTING.md +1932 -0
  34. package/vendor/agent-frontend-shell/THEMES.md +170 -0
  35. package/vendor/agent-frontend-shell/api/__init__.py +1 -0
  36. package/vendor/agent-frontend-shell/api/agent_health.py +392 -0
  37. package/vendor/agent-frontend-shell/api/agent_sessions.py +782 -0
  38. package/vendor/agent-frontend-shell/api/auth.py +592 -0
  39. package/vendor/agent-frontend-shell/api/background.py +87 -0
  40. package/vendor/agent-frontend-shell/api/clarify.py +238 -0
  41. package/vendor/agent-frontend-shell/api/commands.py +124 -0
  42. package/vendor/agent-frontend-shell/api/compression_anchor.py +134 -0
  43. package/vendor/agent-frontend-shell/api/config.py +5178 -0
  44. package/vendor/agent-frontend-shell/api/dashboard_probe.py +255 -0
  45. package/vendor/agent-frontend-shell/api/extensions.py +253 -0
  46. package/vendor/agent-frontend-shell/api/gateway_chat.py +435 -0
  47. package/vendor/agent-frontend-shell/api/gateway_watcher.py +230 -0
  48. package/vendor/agent-frontend-shell/api/goals.py +608 -0
  49. package/vendor/agent-frontend-shell/api/helpers.py +474 -0
  50. package/vendor/agent-frontend-shell/api/kanban_bridge.py +1255 -0
  51. package/vendor/agent-frontend-shell/api/metering.py +194 -0
  52. package/vendor/agent-frontend-shell/api/models.py +4210 -0
  53. package/vendor/agent-frontend-shell/api/oauth.py +770 -0
  54. package/vendor/agent-frontend-shell/api/onboarding.py +1046 -0
  55. package/vendor/agent-frontend-shell/api/passkeys.py +365 -0
  56. package/vendor/agent-frontend-shell/api/profiles.py +1499 -0
  57. package/vendor/agent-frontend-shell/api/providers.py +2175 -0
  58. package/vendor/agent-frontend-shell/api/request_diagnostics.py +160 -0
  59. package/vendor/agent-frontend-shell/api/rollback.py +320 -0
  60. package/vendor/agent-frontend-shell/api/routes.py +13990 -0
  61. package/vendor/agent-frontend-shell/api/run_journal.py +284 -0
  62. package/vendor/agent-frontend-shell/api/runner_client.py +156 -0
  63. package/vendor/agent-frontend-shell/api/runtime_adapter.py +431 -0
  64. package/vendor/agent-frontend-shell/api/session_discoverability.py +640 -0
  65. package/vendor/agent-frontend-shell/api/session_events.py +45 -0
  66. package/vendor/agent-frontend-shell/api/session_lifecycle.py +208 -0
  67. package/vendor/agent-frontend-shell/api/session_ops.py +207 -0
  68. package/vendor/agent-frontend-shell/api/session_recovery.py +655 -0
  69. package/vendor/agent-frontend-shell/api/skill_usage.py +32 -0
  70. package/vendor/agent-frontend-shell/api/startup.py +128 -0
  71. package/vendor/agent-frontend-shell/api/state_sync.py +187 -0
  72. package/vendor/agent-frontend-shell/api/streaming.py +7048 -0
  73. package/vendor/agent-frontend-shell/api/system_health.py +167 -0
  74. package/vendor/agent-frontend-shell/api/terminal.py +410 -0
  75. package/vendor/agent-frontend-shell/api/turn_journal.py +214 -0
  76. package/vendor/agent-frontend-shell/api/updates.py +1261 -0
  77. package/vendor/agent-frontend-shell/api/upload.py +322 -0
  78. package/vendor/agent-frontend-shell/api/usage.py +26 -0
  79. package/vendor/agent-frontend-shell/api/workspace.py +867 -0
  80. package/vendor/agent-frontend-shell/api/workspace_git.py +1261 -0
  81. package/vendor/agent-frontend-shell/api/worktrees.py +357 -0
  82. package/vendor/agent-frontend-shell/bootstrap.py +492 -0
  83. package/vendor/agent-frontend-shell/ctl.sh +427 -0
  84. package/vendor/agent-frontend-shell/docker-compose.custom.yml +26 -0
  85. package/vendor/agent-frontend-shell/docker-compose.three-container.yml +168 -0
  86. package/vendor/agent-frontend-shell/docker-compose.two-container.yml +147 -0
  87. package/vendor/agent-frontend-shell/docker-compose.yml +57 -0
  88. package/vendor/agent-frontend-shell/docker_init.bash +459 -0
  89. package/vendor/agent-frontend-shell/docs/CONTRACTS.md +207 -0
  90. package/vendor/agent-frontend-shell/docs/EXTENSIONS.md +212 -0
  91. package/vendor/agent-frontend-shell/docs/ISSUES.md +23 -0
  92. package/vendor/agent-frontend-shell/docs/UIUX-GUIDE.md +196 -0
  93. package/vendor/agent-frontend-shell/docs/advanced-chat-setup.md +83 -0
  94. package/vendor/agent-frontend-shell/docs/docker.md +337 -0
  95. package/vendor/agent-frontend-shell/docs/onboarding-agent-checklist.md +207 -0
  96. package/vendor/agent-frontend-shell/docs/onboarding.md +202 -0
  97. package/vendor/agent-frontend-shell/docs/remote-access.md +75 -0
  98. package/vendor/agent-frontend-shell/docs/rfcs/README.md +53 -0
  99. package/vendor/agent-frontend-shell/docs/rfcs/agent-source-boundary.md +70 -0
  100. package/vendor/agent-frontend-shell/docs/rfcs/canonical-session-resolution.md +124 -0
  101. package/vendor/agent-frontend-shell/docs/rfcs/hermes-run-adapter-contract.md +1079 -0
  102. package/vendor/agent-frontend-shell/docs/rfcs/turn-journal.md +195 -0
  103. package/vendor/agent-frontend-shell/docs/rfcs/webui-run-state-consistency-contract.md +157 -0
  104. package/vendor/agent-frontend-shell/docs/supervisor.md +280 -0
  105. package/vendor/agent-frontend-shell/docs/troubleshooting.md +132 -0
  106. package/vendor/agent-frontend-shell/docs/ui-ux/index.html +863 -0
  107. package/vendor/agent-frontend-shell/docs/ui-ux/two-stage-proposal.html +768 -0
  108. package/vendor/agent-frontend-shell/docs/why-hermes.md +489 -0
  109. package/vendor/agent-frontend-shell/docs/workspace-git.md +92 -0
  110. package/vendor/agent-frontend-shell/docs/wsl-autostart.md +126 -0
  111. package/vendor/agent-frontend-shell/eslint.runtime-guard.config.mjs +35 -0
  112. package/vendor/agent-frontend-shell/extensions/bitseek-design-system.md +330 -0
  113. package/vendor/agent-frontend-shell/extensions/branding/assets/apple-touch-icon.png +0 -0
  114. package/vendor/agent-frontend-shell/extensions/branding/assets/empty-logo.svg +739 -0
  115. package/vendor/agent-frontend-shell/extensions/branding/assets/favicon-192.png +0 -0
  116. package/vendor/agent-frontend-shell/extensions/branding/assets/favicon-32.png +0 -0
  117. package/vendor/agent-frontend-shell/extensions/branding/assets/favicon-512.png +0 -0
  118. package/vendor/agent-frontend-shell/extensions/branding/assets/favicon-512.svg +745 -0
  119. package/vendor/agent-frontend-shell/extensions/branding/assets/favicon.ico +0 -0
  120. package/vendor/agent-frontend-shell/extensions/branding/assets/favicon.svg +745 -0
  121. package/vendor/agent-frontend-shell/extensions/branding/assets/titlebar-icon-v2.svg +751 -0
  122. package/vendor/agent-frontend-shell/extensions/branding/assets/titlebar-icon-v3.svg +739 -0
  123. package/vendor/agent-frontend-shell/extensions/branding/assets/titlebar-icon.svg +745 -0
  124. package/vendor/agent-frontend-shell/extensions/branding/branding.js +112 -0
  125. package/vendor/agent-frontend-shell/extensions/branding/config.json +14 -0
  126. package/vendor/agent-frontend-shell/extensions/branding/manifest.json +53 -0
  127. package/vendor/agent-frontend-shell/extensions/index.js +67 -0
  128. package/vendor/agent-frontend-shell/extensions/loader/hermes-loader.js +77 -0
  129. package/vendor/agent-frontend-shell/extensions/manifest.json +16 -0
  130. package/vendor/agent-frontend-shell/extensions/pages/ai-teammates/page.css +333 -0
  131. package/vendor/agent-frontend-shell/extensions/pages/ai-teammates/page.js +487 -0
  132. package/vendor/agent-frontend-shell/extensions/pages/manifest.json +6 -0
  133. package/vendor/agent-frontend-shell/extensions/pages/registry.css +56 -0
  134. package/vendor/agent-frontend-shell/extensions/pages/registry.js +302 -0
  135. package/vendor/agent-frontend-shell/extensions/themes/bitseek/index.css +93 -0
  136. package/vendor/agent-frontend-shell/extensions/themes/bitseek/index.js +98 -0
  137. package/vendor/agent-frontend-shell/install.sh +63 -0
  138. package/vendor/agent-frontend-shell/mcp_server.py +567 -0
  139. package/vendor/agent-frontend-shell/package.json +12 -0
  140. package/vendor/agent-frontend-shell/pyproject.toml +56 -0
  141. package/vendor/agent-frontend-shell/pytest.ini +3 -0
  142. package/vendor/agent-frontend-shell/requirements.txt +5 -0
  143. package/vendor/agent-frontend-shell/server.py +624 -0
  144. package/vendor/agent-frontend-shell/start.ps1 +210 -0
  145. package/vendor/agent-frontend-shell/start.sh +65 -0
  146. package/vendor/agent-frontend-shell/static/apple-touch-icon.png +0 -0
  147. package/vendor/agent-frontend-shell/static/boot.js +1990 -0
  148. package/vendor/agent-frontend-shell/static/commands.js +1402 -0
  149. package/vendor/agent-frontend-shell/static/favicon-192.png +0 -0
  150. package/vendor/agent-frontend-shell/static/favicon-32.png +0 -0
  151. package/vendor/agent-frontend-shell/static/favicon-512.png +0 -0
  152. package/vendor/agent-frontend-shell/static/favicon-512.svg +18 -0
  153. package/vendor/agent-frontend-shell/static/favicon.ico +0 -0
  154. package/vendor/agent-frontend-shell/static/favicon.svg +20 -0
  155. package/vendor/agent-frontend-shell/static/i18n.js +15389 -0
  156. package/vendor/agent-frontend-shell/static/icons.js +92 -0
  157. package/vendor/agent-frontend-shell/static/index.html +1506 -0
  158. package/vendor/agent-frontend-shell/static/login.js +177 -0
  159. package/vendor/agent-frontend-shell/static/manifest.json +53 -0
  160. package/vendor/agent-frontend-shell/static/messages.js +3521 -0
  161. package/vendor/agent-frontend-shell/static/onboarding.js +800 -0
  162. package/vendor/agent-frontend-shell/static/panels.js +7995 -0
  163. package/vendor/agent-frontend-shell/static/pwa-startup.js +83 -0
  164. package/vendor/agent-frontend-shell/static/sessions.js +5165 -0
  165. package/vendor/agent-frontend-shell/static/style.css +4774 -0
  166. package/vendor/agent-frontend-shell/static/sw.js +173 -0
  167. package/vendor/agent-frontend-shell/static/terminal.js +632 -0
  168. package/vendor/agent-frontend-shell/static/ui.js +8997 -0
  169. package/vendor/agent-frontend-shell/static/vendor/js-yaml/4.1.0/js-yaml.min.js +2 -0
  170. package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_AMS-Regular.ttf +0 -0
  171. package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_AMS-Regular.woff +0 -0
  172. package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_AMS-Regular.woff2 +0 -0
  173. package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_Caligraphic-Bold.ttf +0 -0
  174. package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_Caligraphic-Bold.woff +0 -0
  175. package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_Caligraphic-Bold.woff2 +0 -0
  176. package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_Caligraphic-Regular.ttf +0 -0
  177. package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_Caligraphic-Regular.woff +0 -0
  178. package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_Caligraphic-Regular.woff2 +0 -0
  179. package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_Fraktur-Bold.ttf +0 -0
  180. package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_Fraktur-Bold.woff +0 -0
  181. package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_Fraktur-Bold.woff2 +0 -0
  182. package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_Fraktur-Regular.ttf +0 -0
  183. package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_Fraktur-Regular.woff +0 -0
  184. package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_Fraktur-Regular.woff2 +0 -0
  185. package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_Main-Bold.ttf +0 -0
  186. package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_Main-Bold.woff +0 -0
  187. package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_Main-Bold.woff2 +0 -0
  188. package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_Main-BoldItalic.ttf +0 -0
  189. package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_Main-BoldItalic.woff +0 -0
  190. package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_Main-BoldItalic.woff2 +0 -0
  191. package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_Main-Italic.ttf +0 -0
  192. package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_Main-Italic.woff +0 -0
  193. package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_Main-Italic.woff2 +0 -0
  194. package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_Main-Regular.ttf +0 -0
  195. package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_Main-Regular.woff +0 -0
  196. package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_Main-Regular.woff2 +0 -0
  197. package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_Math-BoldItalic.ttf +0 -0
  198. package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_Math-BoldItalic.woff +0 -0
  199. package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_Math-BoldItalic.woff2 +0 -0
  200. package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_Math-Italic.ttf +0 -0
  201. package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_Math-Italic.woff +0 -0
  202. package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_Math-Italic.woff2 +0 -0
  203. package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_SansSerif-Bold.ttf +0 -0
  204. package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_SansSerif-Bold.woff +0 -0
  205. package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_SansSerif-Bold.woff2 +0 -0
  206. package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_SansSerif-Italic.ttf +0 -0
  207. package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_SansSerif-Italic.woff +0 -0
  208. package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_SansSerif-Italic.woff2 +0 -0
  209. package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_SansSerif-Regular.ttf +0 -0
  210. package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_SansSerif-Regular.woff +0 -0
  211. package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_SansSerif-Regular.woff2 +0 -0
  212. package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_Script-Regular.ttf +0 -0
  213. package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_Script-Regular.woff +0 -0
  214. package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_Script-Regular.woff2 +0 -0
  215. package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_Size1-Regular.ttf +0 -0
  216. package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_Size1-Regular.woff +0 -0
  217. package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_Size1-Regular.woff2 +0 -0
  218. package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_Size2-Regular.ttf +0 -0
  219. package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_Size2-Regular.woff +0 -0
  220. package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_Size2-Regular.woff2 +0 -0
  221. package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_Size3-Regular.ttf +0 -0
  222. package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_Size3-Regular.woff +0 -0
  223. package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_Size3-Regular.woff2 +0 -0
  224. package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_Size4-Regular.ttf +0 -0
  225. package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_Size4-Regular.woff +0 -0
  226. package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_Size4-Regular.woff2 +0 -0
  227. package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_Typewriter-Regular.ttf +0 -0
  228. package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_Typewriter-Regular.woff +0 -0
  229. package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/fonts/KaTeX_Typewriter-Regular.woff2 +0 -0
  230. package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/katex.min.css +1 -0
  231. package/vendor/agent-frontend-shell/static/vendor/katex/0.16.22/katex.min.js +1 -0
  232. package/vendor/agent-frontend-shell/static/vendor/smd.min.js +29 -0
  233. 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 `![alt](url)` 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.