This repository was archived by the owner on Jul 16, 2026. It is now read-only.
Repository navigation
Conversation
Adds the same env-var-driven UI override that sutando's web-server has (see josh/migrate-to-react on sonichi/sutando, commit c350a10). With this in place, stando can serve any UI bundle by exporting: CLIENT_DIST_DIR=/abs/path/to/dist bash src/startup.sh before launching the voice agent. Without the env var, behavior is unchanged — stando serves its bundled client/dist/ as before. Phase 1.7 of the OSS sync roadmap. Unblocks the workflow where production stando deployments override the default UI with a private branded dist while developer / demo builds still serve the stando default UI from client/. Mechanics ported verbatim from sutando: - resolveClientDistDir() function with tilde expansion - module-level `let CLIENT_DIST_DIR = resolveClientDistDir()` so existing references keep working - per-call re-resolve inside startWebServer() so tests + dynamic env changes pick up the latest value - JSDoc updated to document the override Submodule auto-init block from sutando's startup.sh deliberately NOT ported — stando's client/ is still vendored (not a submodule), and the goal is independence from OSS UI updates, not auto-sync. Co-authored-by: Cursor <cursoragent@cursor.com>
Ports sutando/tests/client-dist-dir-override.test.ts verbatim so the private repo's pluggability contract stays in lockstep with OSS. Same 3 cases: custom dir override serves, default fallback serves bundled UI, path traversal blocked. All 3 pass against the new resolveClientDistDir() in src/web-server.ts. Co-authored-by: Cursor <cursoragent@cursor.com>
The React frontend (client/) is moved out of this repo into the private AG2Platform/stando-ui repo (full history preserved via git subtree split) and plugs back in via CLIENT_DIST_DIR — the same pluggability seam ported in #68. Stando's backend and the UI now ship and version independently; the private UI no longer has to track the OSS sutando UI. Removals: - client/ (97 files) — now lives at AG2Platform/stando-ui - package.json: build:client / dev:client scripts - pnpm-workspace.yaml: client workspace member (lockfile re-pruned) Rewiring so everything still works: - web-server.ts: default dist resolves to ../client/dist (present only in the packaged app, staged by build-app.sh); a dev checkout sets CLIENT_DIST_DIR or gets a 503 with a build hint. Docs/JSDoc updated. - startup.sh: auto-detects a built sibling ../stando-ui/dist when CLIENT_DIST_DIR is unset; otherwise warns. Override always wins. - app/build-app.sh: sources the UI from CLIENT_DIST_DIR or a sibling stando-ui checkout (builds it), stages it at the bundle's client/dist path so the shipped app stays self-contained with no runtime env var. - .github/workflows/release.yml: checks out + builds AG2Platform/stando-ui and passes its dist via CLIENT_DIST_DIR. REQUIRES a new repo secret STANDO_UI_TOKEN (PAT with read access to the private UI repo) — the default GITHUB_TOKEN can't reach another repo. - docs/WIRE.md: the wire contract any UI must honor (ported from OSS). - .env.example / CONTRIBUTING.md / .gitignore: documented + cleaned up. Verified: tsc clean (pre-existing @ai-sdk/openai error unrelated), the CLIENT_DIST_DIR test passes 3/3, frozen lockfile installs, and the server serves the real stando-ui dist end-to-end (200 + hashed assets). Co-authored-by: Cursor <cursoragent@cursor.com>
This was referenced Jun 1, 2026
refactor: extract conversation UI to private stando-ui repo
2 tasks
Author
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 subscribe to this conversation on GitHub.
Already have an account?
Sign in.
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.
Summary
Port the
CLIENT_DIST_DIRenv-var override from OSS sutando (commitc350a10on josh/migrate-to-react) so stando can serve any UI bundle without source edits. After this PR:Why
Phase 1.7 of the OSS sync roadmap. Unblocks the workflow where the production stando deployment overrides the default UI with a private branded dist, while dev / demo builds still serve stando's vendored
client/UI for parity checks.Pairs with the wire contract at AG2Platform/sutando-client/WIRE.md: any bundle that honors the contract works.
What's NOT in this PR (deliberate)
client/. Stando's UI stays vendored. Goal here is independence from OSS UI updates, not auto-sync — the override mechanism is what we want, not the submodule.startup.shsubmodule auto-init block from sutando's PR. That block is submodule-specific and stando isn't using a submodule.client/exactly as before.What changed
Two files:
src/web-server.ts(+37/-6) — addsresolveClientDistDir(), replaces the staticCLIENT_DIST_DIRconst with aletbinding refreshed insidestartWebServer(). JSDoc updated.tests/client-dist-dir-override.test.ts(+130) — verbatim port of sutando's regression test. 3 cases, all pass.Mechanics ported verbatim from sutando so the contract stays in lockstep between repos.
Test plan
pnpm exec tsx --test tests/client-dist-dir-override.test.ts→ 3/3 passpnpm exec tsc --noEmit -p tsconfig.json→ no new errors (pre-existing@ai-sdk/openaiwarning onvoice-agent.ts:48unchanged)CLIENT_DIST_DIR=/some/tmp/dist, dropping anindex.htmlsentinel there, runningbash src/startup.sh, confirming :8080 serves the sentinel.Related
Made with Cursor