`ProfileRuntime.recompose({ reloadBundles: true })` replaced its profile
before the Loader had accepted the update, so a rejected recomposition left
`current`, `layers`, and `originOf` describing a stack that never mounted.
The user patch watchers took a second path through the launcher's
`composeLive`, which wrote the new conflicts into the failure registry
before the update and kept composing from the runtime's stale profile.
Conflict records shared the registry with row failures under a fabricated
entry id and a group id that meant three different things, so the plugin
inventory attributed a conflict to the layer that won the id, and a bundle
disabled after failing kept its import and apply records forever.
The runtime now holds one committed composition — profile, stack ownership,
conflicts — and publishes a candidate only after `entry.update` resolves;
`originOf` reads the committed owners instead of recomputing them. The
watchers call `recompose` through a `reapply` callback, so every live change
goes through the one entry point. Conflicts live on the runtime with their
messages and never enter `pluginFailures`, whose records name rows that
reached the Loader; the inventory lists them under the layer that lost. A
contained group clears its rows' records when it unmounts.
description, kind
| description | kind |
|---|---|
| Package map for the web GUI host half: the HTTP and SPA servers, workspace-directory picking implementations, and the plugin inventory projection. | package-group |
host/ — web-GUI host half
English | 中文
Summary
The host/ group provides the web GUI's plain HTTP server, the SPA dist server that serves the built Web shell, the workspace-directory picking seam with its native, browse, and adaptive composition packages, and the read-only plugin inventory projection. All seven packages are product packages; the browser transport lives in client/, and the composed application is apps/cli booting the dsh-base bundle that serves the web app under apps/web/. The picker backends replace one another behind the shared seam.
Table of Contents
Packages
Seven packages play the host roles; each package README owns its contract and configuration.
| Package | Role | ctx key |
|---|---|---|
webserver/ |
Browser HTTP server: named routes, upgrades, index taps, and the fallback seat | ctx.webServer |
frontend-static/ |
SPA dist server on the webserver fallback seat | consumes ctx.webServer |
directory-picker/ |
Workspace-directory picking seam: capability contract and error vocabulary | ctx.directoryPicker |
directory-picker-native/ |
Native-OS-chooser backend for operators at the host display | registers ctx.directoryPicker |
directory-picker-browse/ |
In-app directory-browser backend, including for remote clients | registers ctx.directoryPicker |
directory-picker-auto/ |
Host-adaptive chooser that mounts the matching backend at boot | mounts a backend |
plugin-inventory/ |
Read-only projection of current Loader entries | Remote pluginInventory/list |
Related documentation
Start with the subsystem references for the transport and the workspace records, then the layering decision behind the Web client.
- HTTP server subsystem — the webserver's routes, matching order, and config.
- Workspace subsystem — the workspace records the directory picker feeds.
- Web config-tree boot and transport layering — ownership of the Web transport layers.
Dev Note
Working context for maintainers — click to expand
None.