# dsh-custom-workspace

[English](README.md) | 中文

这是一个 [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) Web 外部插件，为每个工作区分别保存背景、聊天字体大小、行间距、Markdown 块间距和字体渲染偏好。

## 功能

- 设置主工作区表面的背景颜色或图片 URL。
- 分别调整 Markdown 正文字号和行间距。
- 调整 Markdown 段落、列表、标题、引用和代码块的块间距。
- 开关适用于 Retina 显示屏的灰度抗锯齿渲染。
- 按工作区持久化到 `$DSH_HOME/settings.yaml`。

当前外观跟随当前会话所属的工作区；没有当前会话时使用最近选择的工作区。未保存覆盖值的工作区继承当前 DSH 主题。

## 效果示例

主题默认值（字号和间距继承 DSH）：

![默认工作区外观](assets/screenshots/default.jpg)

紧凑阅读：`13px` 字号、`20px` 行间距、`4px` 块间距、`#eef4ff` 背景：

![使用蓝色背景的紧凑工作区外观](assets/screenshots/compact.jpg)

宽松阅读：`20px` 字号、`38px` 行间距、`28px` 块间距、`#fff3e8` 背景：

![使用暖色背景的宽松工作区外观](assets/screenshots/spacious.jpg)

## 要求

- DeepSeek Harness `0.1.0-rc.6`。
- Node.js `^22.19.0` 或 `>=24.0.0`。
- 通过 loopback 地址访问 DSH Web；设置 RPC 会拒绝非 loopback 浏览器。

## 安装

把已发布的包安装到 Web profile，然后重启 DSH：

```sh
dsh plugin --profile web add dsh-custom-workspace
dsh web
```

打开“设置 → 通用设置 → Workspace 外观”配置当前工作区。每项修改会立即保存。

卸载插件：

```sh
dsh plugin --profile web remove dsh-custom-workspace
```

## 开发

```sh
pnpm install
pnpm run verify
dsh plugin --profile web add link:$PWD
pnpm run watch
```

修改 `src/index.ts` 后需要重启 DSH。`src/client/` 下的浏览器代码由 watcher 重建，并通过 DSH client HMR 加载。

安装 Playwright Chromium 后，可以对正在运行的 Web profile 执行浏览器冒烟测试：

```sh
pnpm exec playwright install chromium
pnpm run verify:browser -- http://127.0.0.1:3081
```

## 持久化与安全

Host half 拥有 `custom-workspace` settings namespace。DSH 的通用 settings API 不暴露第三方 namespace，因此插件注册独立的 `/custom-workspace` Connection RPC channel。该 channel 只接受 loopback 请求，也不会暴露其他 settings namespace。

Browser half 会验证每个响应，再把值交给 presenter。写入失败时会重新加载 Host 值；断开连接或通过非 loopback 地址访问时，设置 scope 会标记为不可用。

## Model Experience

无。工作区外观只影响浏览器显示，不会进入模型请求或会话日志。

## 已知限制

- 即使 DSH Web server 信任某个局域网 hostname，通过该 hostname 访问的浏览器也不能读写本插件设置。
- 背景图片直接使用配置的 URL，是否加载成功取决于浏览器网络和内容安全策略。
- 当前版本面向 DSH `0.1.0-rc.6`；DSH 预发布 API 变化时不提供兼容 shim。

## 许可证

[MIT](LICENSE)
