feat(maestro): serve the web UI from the daemon
The browser reached the daemon through maestro-web, a second binary that served the SPA and reverse-proxied /api/* — two TCP connections and a WebSocket frame re-encode on every keystroke and every byte of PTY output. On one machine that hop buys nothing. The daemon now embeds the bundle and serves it off its own listener, behind a default-on `web` feature. `--no-default-features` builds without pnpm or node; MAESTRO_WEB_DIST still takes a prebuilt bundle. The router's fallback answers an unmatched /api/* with 404 rather than the SPA shell, so a client expecting JSON gets a status it can read instead of HTML. Removes maestro-web and the [web] config section. An existing [web] block is ignored, not rejected. The installer deletes a leftover maestro-web.service on upgrade. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
2ad2858fd5
commit
4fc90aabfb
+9
-7
@@ -1,7 +1,8 @@
|
||||
# maestro-web
|
||||
# Maestro web UI
|
||||
|
||||
Browser UI for Maestro. Talks to a single local daemon over its `/api/*`
|
||||
HTTP/WS surface — session catalog, spawn/kill, and terminal I/O.
|
||||
Browser UI for Maestro. The daemon embeds this bundle and serves it off its own
|
||||
listener, so the page talks back to the same origin over `/api/*` — session
|
||||
catalog, spawn/kill, and terminal I/O.
|
||||
|
||||
## Framework choice: vanilla TypeScript
|
||||
|
||||
@@ -56,7 +57,7 @@ attaches: open the same `#/attach/<id>` URL in another tab.
|
||||
```sh
|
||||
pnpm install
|
||||
pnpm dev # http://localhost:5173, proxies /api → http://127.0.0.1:7070
|
||||
pnpm build # → dist/, embedded into the maestro-web binary at cargo build time
|
||||
pnpm build # → dist/, embedded into the maestro binary at cargo build time
|
||||
```
|
||||
|
||||
The Vite dev server proxies `/api` and the WebSockets to a local daemon.
|
||||
@@ -69,6 +70,7 @@ MAESTRO_DAEMON_URL=http://laptop.lan:7070 pnpm dev
|
||||
|
||||
## Production
|
||||
|
||||
`pnpm build` writes the bundle to `web/dist/`. The `maestro-web` crate embeds
|
||||
that directory at compile time and serves it from `/`, reverse-proxying `/api/*`
|
||||
to the daemon. See `crates/maestro-web/src/static_bundle.rs`.
|
||||
`pnpm build` writes the bundle to `web/dist/`. Under its default `web` feature
|
||||
the daemon embeds that directory at compile time and serves it from `/`,
|
||||
alongside the `/api/*` routes. See
|
||||
`crates/maestro-daemon/src/static_bundle.rs`.
|
||||
|
||||
@@ -7,8 +7,8 @@ import type { Session, Uuid } from "./types.js";
|
||||
export const INITIAL_RECONNECT_MS = 500;
|
||||
export const MAX_RECONNECT_MS = 10_000;
|
||||
|
||||
/** Close codes at or above this are application-defined; `maestro-web` uses
|
||||
* them to relay a daemon rejection, which retrying would only loop on. */
|
||||
/** Close codes at or above this are application-defined; the daemon uses
|
||||
* them to signal a rejection, which retrying would only loop on. */
|
||||
const APPLICATION_CLOSE = 4000;
|
||||
|
||||
/** Normal Closure — the peer ended the stream deliberately. */
|
||||
|
||||
Reference in New Issue
Block a user