Spec files that create /tmp/dsh-* directories via mkdtemp now track and delete them in afterEach/afterAll; module-scope fixture dirs (executor spill dirs) are removed in afterAll. The file list came from the observed-residue inventory on the self-hosted CI host: only specs whose dirs actually accumulated were leak sources (issue #3134), superseding the kept-but-unmerged CI sweep branch per the #3233 review decision. Product per-process spill roots (dsh-subprocess-local spawn, dsh-spill-local store) register a process-exit handler that removes the memoized dir, so processes that used the spawn/spill path clean up on normal exit. A SIGKILLed process cannot run in-process teardown; the machine-side timer remains the backstop for that path. Agent Note: .agents/notes/implemented/process/2026-08-28-test-temp-dir-self-cleanup.md
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 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.