ormos ui: the local web app, served by this machine - #84
Merged
Merged
Conversation
A SolidJS + Tailwind app embedded as a static export and served on loopback: status, policy-allowed listening ports, terminals this UI opened with output tails, and the agent audit log. No auth by design -- reachability is the boundary, Tailscale is the identity, and the wildcard only ever arrives typed. Actions are a server-enforced allowlist (open/kill), confined to the policy's allowedRoots and refused under terminalsDisabled; injection never reaches a spawn because nothing the page sends passes through a shell. Dist is committed and CI byte-verifies it from source; dispatch and the no-remnants/no-public-listener contracts are pinned by tests. Typing over WebSocket is a later slice; v1 is read-mostly plus the pair.
The platform-selection CI guard found internal/ui buildable on windows -- the embed package now carries the agent's own build tag, so every platform the guard checks still selects relay alone. The injection test compared the raw fixture path against the server's resolved log; darwin resolves /var to /private/var, so the assertion now resolves the fixture path first.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
The komizo-treatment slice for Ormos (template: komizo PRs #135–#137), built on the agent's local core — the part that survives with the hosted relay/db/app gone.
What ships
ormos uisubcommand (internal/system/ui.go+ dispatch inrun.go): SolidJS 1.9 + Tailwind 4 app built to a static export (ui/→internal/ui/dist, committed), served on loopback :8481 by default;--bindwidens to the tailnet with the same loud-when-unspecified rules komizo uses. Zero auth by design — reachability is the boundary, Tailscale is the identity.policy.json(the agent's ownproxyAlloweddecision), terminals this UI opened with output tails, agent audit log (sessions.log) tail.{open, kill}only: open spawns a PTY (no relay, bounded 8), confined to the policy'sallowedRootsand refused underterminalsDisabled; kill ends a session this UI opened. Nothing the page sends passes through a shell; cwd isEvalSymlinks-resolved and must land inside the policy roots.ui_test.go,ui_dispatch_test.go): loopback-default pin, no Clerk/PocketBase/relay remnants in the web tree, allowlist enforced server-side (403/400/404/405 matrix), reads from local files, injection never reaches spawn (traversal, symlink escape, non-allowlisted shell), terminal limit, dispatch driven through Main (the komizo #136 unreachable-command bug class), real-serve over loopback incl. SPA fallback + embedded asset.ui/andgit diff --exit-code internal/ui/dist— the committed bytes must be what the source produces.package-lock.jsonpinned;npm ciin CI.ormos ui+tailscale serve --bg 8481phone flow.Deliberate v1 cuts
No typing/interactive input (WebSocket input is a later slice — v1 is read-mostly plus open/kill), no preview passthrough, no PB/Clerk features. Hosted volumes and the torn-down stack are untouched.