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