Bundle
dsh-workspace-presets
Per-workspace Agent preset bindings for DeepSeek Harness: bind a preset to a workspace once and every new session there boots with it.
- Source
- GBDJXB
- License
- MIT
- Updated
- Updated yesterday
Readme
# dsh-workspace-presets
**Per-workspace Agent preset bindings for DeepSeek Harness.** Bind an Agent preset to a workspace once, and every new session started in that workspace automatically boots with that preset's full capabilities ā deterministic, zero extra latency, zero extra model cost.
<div align="center">
<a href="https://opensource.org/licenses/MIT"><img alt="License: MIT" src="https://img.shields.io/badge/License-MIT-yellow.svg" /></a>
<img alt="Supported DSH versions: 0.1.1-rc.2" src="https://img.shields.io/badge/DSH-0.1.1--rc.2-4d6bfe" />
<img alt="Workspace presets" src="https://img.shields.io/badge/-Workspace%20presets-4d6bfe" /> <img alt="Auto apply" src="https://img.shields.io/badge/-Auto%20apply-4d6bfe" /> <img alt="zh%20%2F%20en" src="https://img.shields.io/badge/-zh%20%2F%20en-4d6bfe" />
<!-- After publishing, add: npm version / npm downloads / GitHub stars badges. -->
</div>
<div align="center">
š <a href="./README.md"><b>English</b></a> Ā· <a href="./README.zh.md">äøę</a>
</div>
> **TL;DR** ā Bind an Agent preset to each workspace in **Settings ā Workspace presets**, and every new session in that workspace boots with it: deterministic, zero latency, zero extra model cost.
> Install: `dsh plugin --profile web add dsh-workspace-presets` Ā· Uninstall: `dsh plugin --profile web remove dsh-workspace-presets`
>
> **TL;DR** ā åØ **设置 ā å·„ä½åŗé¢č®¾** ē»ęÆäøŖå·„ä½åŗē»å®äøäøŖ Agent é¢č®¾,评巄ä½åŗä¹åę°å»ŗēä¼čÆčŖåØä»„å®åÆåØ:ē”®å®ę§ćé¶å»¶čæćé¶é¢å¤ęØ”åč°ēØć
> å®č£
:`dsh plugin --profile web add dsh-workspace-presets` Ā· åøč½½:`dsh plugin --profile web remove dsh-workspace-presets`
---
## What it does
- Adds a native **"Workspace presets"** page to the DSH settings panel: one row per workspace, each with a preset picker (system / user presets, broken presets flagged).
- **Applies the binding automatically** whenever a *blank* session belongs to a bound workspace ā including the hidden reusable blank session the sidebar keeps per workspace, in every open tab.
- Falls back cleanly: a workspace without a binding keeps DSH's normal behavior (global default, hero-screen chip). An explicit chip choice on a blank session always wins over the binding.
- Sessions that have started, subagent sessions, or archived sessions will not be touched.
## Installation
**Prerequisites:** a DSH deployment that composes Agent presets (the standard install does), and `pnpm` on your PATH (`dsh plugin` forwards to pnpm).
**Supported DSH versions:** `0.1.1-rc.2` (peer range).
**From npm** (once published):
```sh
dsh plugin --profile web add dsh-workspace-presets
```
**Straight from GitHub, without cloning:**
```sh
dsh plugin --profile web add github:YOUR_USERNAME/dsh-workspace-presets
```
**From a local checkout** (clone first):
```powershell
git clone https://github.com/YOUR_USERNAME/dsh-workspace-presets.git
cd dsh-workspace-presets
npm install # ā required for local installs: see the note below
dsh plugin --profile web add .\dsh-workspace-presets # or: dsh plugin --profile web add .
```
> Local-folder installs are `link:` installs: Node resolves the package's modules from the repo's real path, so the plugin's own runtime dependency (`@deepseek-ai/schemastery`) must be installed inside the repo (`npm install` / `pnpm install`) before the profile boots. Registry and git installs do not need this step.
All three forms do the same thing: pnpm installs the package into the profile and `dsh` reconciles `dsh.profile.bundles` automatically (the package declares `dsh.bundle.patch`), so no profile file edits are needed. Then **restart the profile** (`dsh web`) and **hard-refresh the browser** (Ctrl+Shift+R). Open **Settings ā Workspace presets** ā the page should be there.
**Or let an LLM install it for you** ā paste this prompt into any DSH session (or your favorite agent):
```text
Install the dsh-workspace-presets plugin (per-workspace Agent preset bindings for DSH):
1. Pick ONE install source and run it:
- npm: dsh plugin --profile web add dsh-workspace-presets
- GitHub: dsh plugin --profile web add github:OWNER/dsh-workspace-presets
- local: git clone <repo-url> && cd dsh-workspace-presets && npm install --legacy-peer-deps
dsh plugin --profile web add <absolute path to this folder>
(Local installs MUST run npm install inside the repo first, or boot fails with
ERR_MODULE_NOT_FOUND ā see Troubleshooting below.)
2. Restart the profile (dsh web) and tell the user to hard-refresh the browser (Ctrl+Shift+R).
3. Verify: Settings shows the "Workspace presets" page; bind a preset to a workspace;
a new session in that workspace boots with it (a toast confirms the apply).
If anything fails, check the Troubleshooting table in the README before retrying.
```
<details>
<summary><b>Troubleshooting</b></summary>
| Symptom | Cause & fix |
|---|---|
| `dsh plugin` says pnpm is not found | Install pnpm (`npm i -g pnpm`) and re-run. |
| Boot fails with `ERR_MODULE_NOT_FOUND ⦠imported from ā¦\host.js` | Local-folder install without the plugin's own deps: run `npm install` (or `pnpm install`) inside the repo, then restart. Registry/git installs never hit this. |
| Settings page doesn't show after install | The Host half activates on a profile restart ā restart `dsh web`, then hard-refresh the browser. |
| A bound workspace's new session still starts with the default preset | The binding only applies to **blank** sessions, and a manual hero-chip choice always wins; subagent sessions are never touched. Already-started sessions are fixed by design. |
| Plugin mounts twice / namespace registration fails at boot | You combined the bundle channel with a manual `cordis.patch.yml` insert ā keep only one. |
</details>
<details>
<summary><b>Updating</b></summary>
```sh
dsh plugin --profile web add dsh-workspace-presets@latest
```
or bump the version in `$DSH_HOME/profiles/web/package.json` and re-run `pnpm install`. Then restart / hard-refresh as above.
</details>
## Usage
1. Open **Settings ā Workspace presets**.
2. Pick a preset for each workspace (or leave *Follow global default*).
3. Start a new session in that workspace ā it boots with the bound preset; a small toast confirms each automatic apply.
Notes:
- The binding applies at session creation to blank sessions. Changing a binding affects future sessions (a still-blank session running a previous binding is updated too); already-started sessions are never touched.
- A manual preset choice made with the hero-screen chip on a blank session always overrides the workspace binding for that session.
- If a bound preset is deleted or broken, the apply is skipped and the page flags the workspace row; nothing crashes.
## Uninstall
```sh
dsh plugin --profile web remove dsh-workspace-presets
```
then restart the profile. To **disable temporarily** instead, append to the profile's `cordis.patch.yml`:
```yaml
- id: workspace-presets
disabled: true
```
**Residue policy:** the plugin creates no files of its own ā every runtime effect (slots, listeners, styles, the settings namespace) is removed with it. The only possible remainder is an **inert** `workspace-agent-presets:` section in DSH's own settings document: no namespace resolves it, so it affects nothing. To purge it cleanly, click **Settings ā Workspace presets ā Clear all bindings** before removing the plugin, or delete the section from the settings document afterwards.
## Compatibility
- **Non-invasive.** UI lives only in two additive slots with fresh ids (`settings.section` entry `workspace-presets`, `shell.overlay` entry `workspace-presets.overlay`); no shipped UI is patched or replaced.
- **Official APIs only.** Settings namespace + `settings.describe/update/replace`, `agentPresets.list/select`, the `slots`/`locale`/`connection`/`remote`/`timer` services, and the `sessions`/`workspaces` list stores.
- **No files written.** Bindings persist in DSH's own settings document; the plugin never creates or deletes preset directories, session logs, or its own storage.
- **Multi-tab safe.** Selects are idempotent and Host-serialized per session; settings writes are revision-guarded.
## Repository layout
```
dsh-workspace-presets/
āāā host.js # Host half: registers the settings namespace (ā40 lines)
āāā client.js # Web half: settings page + overlay reconciler + toast
āāā cordis.patch.yml # bundle patch: inserts the host row (id: workspace-presets)
āāā package.json # dual-face manifest (main ā host.js, ./client ā client.js)
āāā .gitignore # node_modules/ (local linked installs create it)
āāā LICENSE # MIT
āāā README.md # this file (English)
āāā README.zh.md # äøęē
```
No build step, no `lib/`, no generated files ā the repository **is** the shipped package. (A local `npm install` for linked development creates `node_modules/`, which `.gitignore` excludes.)
`package.json` essentials:
```jsonc
{
"name": "dsh-workspace-presets",
"type": "module",
"main": "host.js",
"exports": { ".": "./host.js", "./client": "./client.js" },
"dsh": {
"bundle": { "patch": "./cordis.patch.yml" },
"client": {
"platform": "web",
"inject": [
"@deepseek-ai/dsh-api-remotes",
"@deepseek-ai/dsh-client-connection",
"@deepseek-ai/dsh-client-locale",
"@deepseek-ai/dsh-client-runtime",
"@deepseek-ai/dsh-client-ui-settings"
]
}
},
"dependencies": { "@deepseek-ai/schemastery": "^3.18.1" }
}
```
(`dsh.client.inject` mirrors the shipped `ui-agent-preset` client package; adjust to the exact DSH version you target.)
## Development
Plain JavaScript (ESM), no build step, no bundler, no JSX ā the repo is the shipped package. `client.js` is a hand-written `window.__ModuleLoader__.load(...)` module using `React.createElement`; the only Host import is `@deepseek-ai/schemastery`, the same fork DSH's own `settings` service validates schemas against.
## License
MIT
Install
dsh plugin --profile web add github:GBDJXB/dsh-workspace-presets
Profile: web
With the hub plugin installed, ask your agent to install it by name ā it resolves the same plan shown here.
dsh plugin --profile web add github:stvlynn/dsh.fish#path:packages/dsh-plugin-hub
install dsh-workspace-presets from the hub
- This source has no pinned commit, so a later push upstream changes what installs. Prefer pinning a commit.