A picker showed directory names, so the settings page could only ever list `standard` / `core-web` / `cordis` and hope the reader knew what they meant. A preset may now publish display text in an optional `preset.yml` beside its composition, and the section renders cards — name, description, and the one in use — instead of rows. The file carries display text ONLY. `id` is the directory name and `trust` comes from the root a preset was discovered under, so neither is writable there: otherwise a locally authored preset could name itself into the shipped set. It is a separate file because a composition is a top-level list of plugin rows — YAML cannot carry sibling keys beside it, and a fake metadata row would hand the Loader something to load. Every read failure degrades to no metadata; absent, malformed, wrongly typed, and blank all mean the same thing and the picker falls back to the id. Presentation is not capability: a preset whose name is broken still mounts. The editor gained name and description fields above the YAML, and clearing both removes the file rather than storing a blank name.
host/ — web-GUI host half
English | 中文
The host side of the dsh web GUI: the API gateway every client shape shares, and the plain HTTP server it rides on. The browser side lives in client/; the composed application is apps/cli booting the dsh-base bundle serving apps/web. All product packages.
| Package | Role | ctx key |
|---|---|---|
apiproxy/ |
Shared host API gateway and wire contract | ctx.apiProxy |
webserver/ |
HTTP route carrier | ctx.httpServer |
frontend-static/ |
SPA dist server on the webserver fallback seat | consumes ctx.httpServer |
directory-picker/ |
Workspace-directory picking seam | ctx.directoryPicker |
directory-picker-native/ |
Native directory-picker backend and browser interaction | registers ctx.directoryPicker |
directory-picker-browse/ |
In-app directory-browser backend and interaction | registers ctx.directoryPicker |
directory-picker-auto/ |
Host-adaptive picker composition | mounts a backend |
apiproxy remains transport-independent; client/connection supplies the browser/HTTP carrier. Picker implementations replace one another behind the shared seam.