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