* fix(ui): avoid tooltip trigger overlap when a side fits
* feat(ui): add navigation entry customization
* fix(test): keep tooltip geometry independent of JSX types
* fix(ui): align customization catalogs and integration fixtures
* test(ui): complete customization lifecycle and release integration coverage
* fix(ui): return entry discovery to the installed plugin list
* docs: refresh module graph for entry customization
* build: refresh workspace links for the moved entry customization package
* docs: regenerate catalogs and pairing hashes for the moved entry customization package
* test(web): cover default-loaded entry customization in the Web e2e
* test(ui): describe entry customization as a browser plugin in the host entry spec
* build: order entry customization publication files as workspace constraints require
* test(release): drop the moved entry customization package from the experimental family list
* style(ui): use the shared focus ring color on entry customization triggers
* test(web): re-record goldens for the default-loaded More navigation menus
* test(web): add the More conversation views trigger to the remaining CI-reported goldens
* docs: record region-owned pins for plugin entry customization
* refactor(ui): rebuild entry customization on region-owned pins and More menus
- Each navigation region (left sidebar, Conversation header, right sidebar
guide) persists its own unpinned list under
dsh.slot.manual-order.<list slot key>.v1, filters its own launchers, and
draws its own More button and Menu around its actions slot.
- ui-entry-customization only registers the shared menu rows (entries with
pin buttons, Browse other plugins, Create your plugin) into the three
actions slots and keeps no state.
- Remove ctx.layout.entryVisibility, the plugin store, left-sidebar drag
reordering, and agentPresetNavigation; ui-layout and ui-agent-preset match
release/dsh-0.2.1 again.
- Keep the release <nav> and Conversation tab-bar visibility conditions.
- Move the More glyph into ui-primitives as IconAppsAddOutline{Regular,Medium}.
* docs: compile the entry customization owner props example
* docs(ui): describe the wrapping Conversation tab row in the header comment
* fix(ui): return New Session to the Workspace blank and its unsent draft
- New Session (startSession without options) takes the blank-reuse path
again instead of creating a fresh Session on every call, which hid the
previous blank and its unsent draft since a5c9c2aaeef (#5775).
- A request that names an Agent preset skips blanks listing a different
preset, so Creator entries no longer take over an ordinary draft.
- Record the change in a v0.2.1-rc.2 upgrade guide; the Host refresh of a
stale loaded blank stays deferred (see the Agent Note).
* docs: regenerate the Cordis inspect catalog for New Session blank reuse
* fix(ui): keep the selected entry visible while unpinned
- Left-sidebar rows and View tabs keep the selected entry, with aria-current or aria-selected, until another entry is selected.
- Entry menu Creator action takes no region argument; the registration's region selects the prompt.
- Document the 2px panel-row and 32px View-tab gaps; drop commit hashes from the New Session Agent Note.
* fix(ui): leave a blank of another preset unstaged when starting Creator
startCreatorDraft stages cordis only when the main blank lists no preset or already lists cordis; navigation opens a separate Creator blank otherwise, so a Standard draft blank keeps its preset.
* feat(ui): choose whether a draft prompt replaces, appends to, or keeps an existing draft
- DraftInitializationOptions gains whenDraftExists ('replace' | 'append' | 'keep', default 'keep'); clearPreviousDraft stays and maps to 'replace' only when whenDraftExists is omitted.
- Append adds the prompt as new paragraphs after the existing text and references; attachments stay in every mode.
- The three Create your plugin entries append their regional prompt.
* test(web): align e2e with New Session blank reuse and the visible selected entry
* refactor(ui): share the draft paragraph writer between setDraft and appendDraft
---------
Co-authored-by: Yif <[email protected]>
Co-authored-by: imccyu <[email protected]>
description, kind
| description | kind |
|---|---|
| Package map for the application's Remote layer: typed Client-to-Host capability calls, results, and forwarded events, for users and maintainers navigating the group. | package-group |
api/ — Remote API layers
English | 中文
Summary
The api/ group provides the application's Remote layer: a Client environment can call the business capabilities running on the Host — manage goals, run commands, list the plugin inventory, discover file and session references — as typed method calls, receive results or streams, send uplink items on an open stream, and observe forwarded Host events. remotes decides which capabilities are exposed and how each call reaches the right session's agent; gateway carries the calls and their results between Client and Host. The stack runs over the application's shared Connection; streaming session data is deliberately outside it.
Table of Contents
Packages
The packages below provide the Remote layer; the package READMEs own the exhaustive contracts.
| Package | Role | ctx key |
|---|---|---|
remotes/ |
Chooses which Host capabilities and events the Client can consume. | — |
gateway/ |
Carries typed unary calls, multiplexed streams with their Client uplinks, and forwarded Host events. | ctx.typertGateway / ctx.remote |
remote-access/ |
Decides which Remote methods non-owner Peers may call, filters list results, and streams each Peer's access snapshot. | ctx.remoteAccess / ctx.remote.remoteAccess |
job-controller/ |
Streams one background job's observation record to the Client. | ctx.jobController / ctx.remote.job |
session-controller/ |
Owns Session commands, history streams, live control state, and Agent/Session identity policy. | ctx.sessionController / ctx.remote.session |
settings-controller/ |
Owns the configuration-surface reads and writes over the settings-domain seams. | ctx.settingsController, ctx.credentialsController / ctx.remote.settings, ctx.remote.credentials |
workspace-controller/ |
Owns Workspace mutations and the complete Client Workspace projection. | ctx.workspaceController / ctx.remote.workspace |
terminal-controller/ |
Session-owned interactive shells, screen recovery and browser terminal control. | ctx.terminalController / ctx.remote.terminal |
workspace-files/ |
Owns bounded workspace file access — stat, paged read, list, and the instrumented-operation changes feed — and the Client file resource provider over it. |
ctx.workspaceFiles / ctx.remote.workspaceFiles |
Remote calls run Client → Host over the application's shared Connection; stream items flow Host → Client on the Gateway mux, and a stream's uplink items flow Client → Host on the same logical stream. API Gateway owns Remote transport, while the controller packages own Session, configuration-surface, and Workspace behavior. Feature packages register exact Connection Fetch routes for responses that do not fit Remote invocation, such as streamed downloads.
Related documentation
Start with the API Gateway reference to see the Remote model end to end, then the Typert subsystem page for the shared definitions and Connection for the physical carrier.
- API Gateway reference — the current-state reference for the Typert API Gateway: programming model, generation pipeline, and runtime invocation.
- Typert subsystem reference — the public contracts shared by protocol, Gateway, and consumer assemblies.
- Connection — the RPC carrier,
/apitrust fence, and response envelopes behind every Remote call.
Dev Note
Working context for maintainers — click to expand
None.