import { defineConfig, loadEnv } from "vite"; // Where the dev proxy forwards `/api/*` (and the events WS) to. Default to a // local `maestro-registry` on 127.0.0.1:8080. Override by exporting either: // MAESTRO_REGISTRY=https://maestro-registry.example.com (preferred) // MAESTRO_REGISTRY=wss://maestro-registry.example.com/daemon // The second form (the daemon-facing URL) is normalised: ws/wss → http/https // and any trailing `/daemon` is stripped, since the proxy needs the base URL. function resolveProxyTarget(raw: string | undefined): string { if (!raw) return "http://127.0.0.1:8080"; return raw .replace(/^wss:\/\//, "https://") .replace(/^ws:\/\//, "http://") .replace(/\/daemon\/?$/, "") .replace(/\/+$/, ""); } export default defineConfig(({ mode }) => { const env = loadEnv(mode, process.cwd(), ""); const target = resolveProxyTarget(env.MAESTRO_REGISTRY); const secure = target.startsWith("https://"); // `/api/attach/:id` is a DAEMON-served broker WebSocket (NAP-243), not a // registry route — the registry returns 404 for it. In production the // `maestro-web` binary splits this traffic; in dev we replicate that here by // forwarding `/api/attach` straight to the local daemon. Override with // MAESTRO_DAEMON; defaults to the standard local daemon bind. const daemonTarget = env.MAESTRO_DAEMON ? resolveProxyTarget(env.MAESTRO_DAEMON) : "http://127.0.0.1:7070"; return { build: { target: "es2022", outDir: "dist", emptyOutDir: true, sourcemap: false, }, server: { port: 5173, // NOTE: order matters — Vite uses the first matching key, so the more // specific `/api/attach` must come before the catch-all `/api`. proxy: { "/api/attach": { target: daemonTarget, changeOrigin: false, ws: true, secure: false, }, "/api": { target, changeOrigin: secure, ws: true, secure: false, }, }, }, }; });