From 741845f195efef403dd14e6c39a61e361a8ea218 Mon Sep 17 00:00:00 2001 From: song Date: Tue, 29 Sep 2026 00:51:38 +0800 Subject: [PATCH 1/2] fix(dashboard): proxy SSH source requests in the Vite dev server The workspace calls /api/ssh-source/ensure and /api/ssh-source/goal-lifecycle on the Chat service, but the dev proxy only forwarded /api/chat and /api/actions, so these requests returned a Vite 404 under npm run dev. Signed-off-by: song --- apps/presentation/dashboard/vite.config.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/apps/presentation/dashboard/vite.config.ts b/apps/presentation/dashboard/vite.config.ts index 99bb3ed65e..593694b58b 100644 --- a/apps/presentation/dashboard/vite.config.ts +++ b/apps/presentation/dashboard/vite.config.ts @@ -28,6 +28,10 @@ export default defineConfig({ target: "http://127.0.0.1:8767", changeOrigin: false, }, + "/api/ssh-source": { + target: "http://127.0.0.1:8767", + changeOrigin: false, + }, }, }, preview: { From ca89d0da1c8625f2c4c7cf54e336785fab632490 Mon Sep 17 00:00:00 2001 From: song Date: Tue, 29 Sep 2026 00:51:38 +0800 Subject: [PATCH 2/2] docs(dashboard): state what npm run dev:web serves The README said dev:web opens the workspace on the bundled example. The workspace always reads /status.json through the dev proxy, so without loopx serve-status and loopx chat it opens on a status-load error. Say so, and keep the bundled example as what smoke:demo-readiness validates. Signed-off-by: song --- apps/presentation/dashboard/README.md | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/apps/presentation/dashboard/README.md b/apps/presentation/dashboard/README.md index 4f5123e60f..efc570412d 100644 --- a/apps/presentation/dashboard/README.md +++ b/apps/presentation/dashboard/README.md @@ -33,10 +33,9 @@ run in the full development and packaged personal-workspace browser smokes. ## Fresh Clone Public Preview -No private LoopX state is required for the first dashboard preview. The -app bundles `examples/status.example.json` as its public-safe example source, -so a fresh checkout can validate and open the UI before starting any local -status server: +No private LoopX state is required to validate the dashboard. The app bundles +`examples/status.example.json` as its public-safe example source, and +`smoke:demo-readiness` checks it without a local status server: ```bash cd apps/presentation/dashboard @@ -45,15 +44,14 @@ npm run smoke:demo-readiness -- --skip-browser npm run dev:web ``` -Then open `http://127.0.0.1:5173/`. Use the bundled example source for a public -demo, or switch to a loopback status URL only after you have started -`loopx serve-status` locally. Do not commit `status.local.json` or live -status exports; they can contain local registry/runtime paths and private -project summaries. - -`npm run dev:web` starts only the Vite UI with the bundled example. `npm run dev` -also starts the loopback status and Chat services and therefore requires a -Python 3.11+ interpreter; see the development section below. +`npm run dev:web` starts only the Vite UI at `http://127.0.0.1:5173/`. The +workspace reads `/status.json` through the Vite proxy from `loopx serve-status` +on port 8766 and the Chat APIs from `loopx chat` on port 8767, so without those +services it opens on a status-load error. Start them locally, or use +`npm run dev`, which also starts the loopback status and Chat services and +therefore requires a Python 3.11+ interpreter; see the development section +below. Do not commit `status.local.json` or live status exports; they can +contain local registry/runtime paths and private project summaries. Personal Workspace owns Goal, Task, Chat, output, and report workflows. Run `loopx dashboard` for the installed local workspace; see the