Files
deepseek-harness/packages/api/workspace-controller/README.md
T
Tianyi Cui 5f773a0ded feat(workspace): restore archived sessions from a settings page
Sessions could be archived from the sidebar row menu but never restored:
the registry-global archive set was a one-way display filter with no
inverse RPC and no surface listing its members.

WorkspaceRegistry.unarchiveSession drops one id from archivedSessionIds in
one durable write on the same operation chain as archive, with no
session-existence probe because a removal cannot introduce an unknown
referent. The Workspace controller exposes it as workspace.unarchiveSession
returning the complete archive set, which the existing archived follow
increment already propagates, so no frame type and no persisted field
changes.

The new client package dsh-client-ui-settings-unarchive-sessions owns the
restore surface: one localized settings.section page listing the archive
set joined with loaded session summaries, newest archive first, searchable
by title or workspace, with one Unarchive action per row.
2026-09-13 16:45:45 +08:00

3.0 KiB

description, kind
description kind
Host and Client workspace control: mutate workspace navigation and follow its complete projection. package-reference

Workspace Controller

English | 中文

Summary

@deepseek-ai/dsh-api-workspace-controller owns the Host ctx.workspaceController service and the generated Client ctx.remote.workspace namespace. Its Remote methods create, rename, remove, and reorder Workspaces, reorder Sessions within a Workspace, archive and unarchive Sessions from Workspace navigation, and follow the complete Workspace projection. Use it through API Gateway when a Client must change or follow Workspace navigation. The package also owns ctx.directoryPickerController and the generated ctx.remote.directoryPicker namespace, because the directory-picking seam it carries is abstract and never a Loader entry of its own.

Table of Contents


Use this package

The Host controller serializes mutations whose correctness depends on current registry state and throws RemoteError with a stable workspace/* or directory-picker/* code for expected failures. Its follow() stream synchronously attaches to durable Workspace changes, emits one complete baseline first, then emits ordered upsert, remove, order, and archived increments. A reconnect starts another generation with a replacement baseline, so consumers do not depend on receiving every increment while disconnected.

The Client entry provides ClientWorkspaceModel and createWorkspaceStateStream(). The model owns Workspace rows, registry order, archived Session ids, unary mutation echoes, and stream/unary race resolution. A newer Host row wins by updatedAt; a committed stream order outranks an older unary response; a removed Workspace id cannot be resurrected by delayed data. The package exposes framework-neutral snapshots and subscriptions, leaving navigation policy and React hooks to the UI owner.


Model Experience

None, as Workspace organization is browser and Host control state and registers no prompt, tool, or session event.

KV Cache effect

No direct effect; Workspace mutations do not alter model requests.

Known Limitations and Deferred Work

  • follow() replaces the whole projection after reconnect and has no durable cursor or incremental catch-up protocol.
  • Process-local deletion markers prevent delayed data from reviving a removed Workspace only for the lifetime of the Client model.

Dev Note

Working context for maintainers — click to expand

None.

Runtime invariant: No companion is published. Workspace Registry owns persistence; every stream generation is a full projection.