`session.create` also adopts an already-live session, and the preceding commit newly allows adopting one under the preset it switched to while blank. Its response still echoed `header.agentPreset`, so that adoption answered with the preset the session had just left — contradicting the request it had accepted and the row `session.list` serves for the same session from `resolveSessionPreset()`. The echo now resolves the same way. The `assertPresetUnchanged` parameter doc said `existing` was the preset the session was created under; both callers now pass what it runs. `composeFrom()` was documented as "infallible" and "cannot fail" beside two `@throws`. It has no composition failure mode — no roster read, no mount, no file — but it does reject a caller error, and the wording now says which. The package-level "switched preset" test re-linked to the same preset id, so it could not tell reading the parent's live scope chain from reading its creation header. A second fixture preset makes the switch real. The Web browser lane's subagent goldens gain the preset badge a child now shows, which is the visible consequence of recording its composition. That lane runs only under DSH_EXAMPLE_MODE=lib and was missed before. The Agent Note records two limits found in review: a cold-resumed continuable child joins its parent's current composition rather than the one its header names, and `toolFilter` does not constrain a joined child. The latter is a regression from the agent-plane move rather than anything this change introduces — with the same tools in the global layer the filter applies normally — and is tracked in #2185. Refs #2185
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.
The subsystem references: http-server.md and workspace.md (the picker seam).