Files
deepseek-harness/packages/client/ui-workspace/README.md
T

8.2 KiB

description, kind
description kind
Shared Workspace browser and picker plugin for the dsh web client: grouped or flat session rows, add/rename/reorder, search, fork, archive, and the directory-flow picking hole. package-reference

@deepseek-ai/dsh-client-ui-workspace

English | 中文

Summary

dsh-client-ui-workspace is the shared Workspace browser and picker of the dsh web client: users browse grouped or flat Session rows in the sidebar, pick a Workspace for a new session from the Session Intent hero, and manage Workspaces and Sessions with add, rename, reorder, search, fork, and archive actions; the same Workspace menu and add flow serve both surfaces. Pending user interactions surface as amber warning dots, and the shared sidebar projection hides subagent-origin sessions. Distinct canonical paths remain separate id-keyed Workspaces, and adding a folder goes through a directory-flow child hole that a composed picker package's client half fills.

Table of Contents


Use this package

Use the sidebar to browse Workspaces and their Sessions, reorder them, and start new ones; use the picker in the Session Intent hero to choose a Workspace for a new session. An open Workspace shows five non-blank Sessions by default and keeps the selected blank New Session as one provisional extra row until its first prompt. Show more reveals the hidden remainder; closing and reopening the Workspace restores this folded projection.

Reordering and view options

View options combine grouping with one browser-persisted Session order per account: Manual and Last updated apply in either presentation. Entering Last updated performs a complete recency sort and later user prompts or steers promote their Session once; entering Manual preserves every current position and disables later promotion. Dragging edits the current order in either mode; Manual-mode drags for real Workspaces also update the Host Session account, while Ungrouped and flat-list orders remain browser-local. In a collapsed group, drag boundaries follow rendered rows and place the source before intervening hidden rows, so a drag cannot hide its source. Workspace drag order is Host-durable in either Session order mode.

Collapsed search is one header action beside the view and add actions: activating it expands the field across the header. A non-blank query replaces either browsing mode with one flat result list — case-insensitive title and Workspace substring matches appear immediately, while a 250 ms debounced Host request adds ranked current-conversation content matches and snippets. Each new query aborts the preceding request; a failed content search leaves metadata matches visible with a warning. The list is capped at 20 and opens the selected Session without clearing the query.

Managing sessions

The Session row's Rename action opens a dialog prefilled with the row's display title; confirming an unchanged title is deliberately allowed — it pins the current automatic title against regeneration. Archive commits without a confirmation dialog and the row disappears from every grouping surface when the archive-set echo lands. Fork forks at the source's last completed turn, increments the inherited persisted title on the client, and then opens the child. Workspace Delete opens a confirmation that states the retention boundary; success removes the group while its Sessions remain under Ungrouped.

Pending interactions

Session rows render the runtime's live pendingInteraction classification: approvals report Waiting for approval, plan reviews report Plan awaiting review, and ordinary questions report Waiting for answer. Every pending interaction uses an amber warning dot that takes precedence over the running indicator.


Understand the implementation

Implementation internals — click to expand

The package is one composition: both target slots are declared by other plugins, so apply uses slots.inject() to register for each declaration lifetime and re-register after a declaring slot is restored.

The directory-flow hole

Each registration declares a directory-flow child hole (single kind: conversation.hero.workspace.directoryFlow / sidebar.workspaces.directoryFlow) that the composed picker package's client half fills with its picking interaction — the -native backend's renderless OS-chooser driver, an in-app browsing dialog under a -browse composition. The flat Add workspace... action renders only while the surface's hole is occupied; an empty hole means the composition has no picking affordance. This package owns the trigger and the adoption: the occupant reports one picked path per open through the hole's owner conversation (open/busy/onPicked/onCancel/onError), and the owner adopts it through the object layer, selecting the committed Workspace only after its list projection has refreshed.

View state

Once the Workspace list baseline is ready, browser-persisted expansion and Session-order records retain only current Workspace ids plus Ungrouped and the flat-list account. Real Workspaces initialize from WorkspaceView.sessionIds, while Ungrouped and the cross-Workspace flat list initialize from recency. The shared sidebar projection hides rows whose durable Session summary has origin: 'subagent', and each visible ordinary row inherits the blue activity indicator while any descendant reached through uninterrupted subagent-origin lineage is running.

Hover cards

Workspace and Session hover cards copy the value their row clips: activating a Workspace card writes its full directory path, while activating a non-blank Session card writes its full display title. A provisional blank New Session card remains read-only because its localized label is a placeholder rather than session content.


Further Exploration

These pages cover the sidebar host, the hero surface, and the picking backends.

  • ui-sidebar — the sidebar shell hosting the sidebar.workspaces hole.
  • ui-conversation — the chat surface hosting the Session Intent hero's picker hole.
  • directory-picker-native — the OS-chooser backend filling the directory-flow hole.
  • Workspace Controller — the Host mutations and framework-neutral Client projection that own workspaces and ordering.

Model Experience

None, as the package is a browser-side UI plugin layer that registers nothing model-facing.

KV Cache effect

None; this package neither assembles nor sends a provider request.

Known Limitations and Deferred Work

These limits define the search depth, the archive surface, and the picking carrier; they are current package constraints.

  • No fuzzy content search or event deep links — the content backend uses literal token/phrase matching, and selecting a result opens the Session rather than the matching event.
  • No Session deletion or unarchive control — sessions can be archived, but archived sessions have no viewing or unarchive surface, and Workspace registration deletion does not delete Sessions.
  • Pending user interaction is not aggregated into collapsed groups — a waiting row inside a collapsed group lights no group-header indicator and becomes visible only after that group is expanded.
  • Native folder selection depends on the local Host carrier — under the -native composition, in-process or remote browser deployments cannot open a local operating-system dialog; remote-capable picking is the -browse composition's in-app flow.

Dev Note

Working context for maintainers — click to expand

None.