# @zoytown/dsh-avatar

[English](README.md) | 中文

[DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness)（dsh）的壁纸主题插件：
在设置页上传图片，选中后整个 dsh Web 界面以它为背景——遮罩强度、背景模糊、填充方式均可调。

- **界面内上传**——点击或拖拽（png / jpg / webp / gif，默认单张 20 MB 上限）；
  文件以内容寻址名落盘 `~/.dsh/avatar/v1/`
- **图库**——已上传图片的缩略图网格；点选即应用，悬停可删除，选「无背景」恢复纯色主题
- **可读性控制**——遮罩滑杆（界面表面在图片上保持半透明）、模糊滑杆、铺满/完整/平铺三种填充；
  调整即时预览并自动保存
- **明暗自适应**——遮罩颜色跟随当前 light/dark 配色自动取色；一张图同时服务两种外观

## 安装

```bash
dsh plugin --profile web add @zoytown/dsh-avatar
```

然后在 dsh Web 界面打开 **设置 → 背景**。卸载用
`dsh plugin --profile web remove @zoytown/dsh-avatar`——界面完全还原；已上传的图片保留在
`~/.dsh/avatar/`，需要时手动删除该目录。

## 配置

row 配置（在你的 `cordis.patch.yml` 里按 id `dsh-avatar` 覆盖；必须整体重述所有字段）：

| 字段 | 默认值 | 含义 |
|---|---|---|
| `maxImageBytes` | `20971520` | 单张图片上传上限（字节） |
| `trustedHosts` | `[]` | 允许**读取图片字节**的非 loopback 来源（`host` 或 `host:port`）。上传与偏好读写始终仅限 loopback——harness 的 settings API 本身钉死 loopback。 |
| `dshHome` | *(未设)* | 覆盖壁纸目录所在的 dsh home |

用户偏好（当前壁纸、遮罩强度、模糊、填充）存于 `~/.dsh/settings.yaml` 的 `avatar` 段。

## 范围与限制

- **仅支持 dsh web。** Electron 形态没有 HTTP 服务器，本插件依赖的图片路由在那里不存在。
- **远程（非 loopback）浏览器为只读。** harness 拒绝非 loopback 来源的偏好读写，
  「背景」页会自行禁用并说明，壁纸也不会在远程侧生效。
- **数据不出本机。** 本插件不发起任何外部请求，不上报任何内容。
- 壁纸激活时 sticky 表头与小徽标会轻微半透明——这正是遮罩在工作；觉得难读就调高遮罩滑杆。

## 开发

```bash
pnpm install   # 请用 pnpm——npm 当前在此依赖图上会崩溃
pnpm run typecheck && pnpm run test && pnpm run build && pnpm run test
```

架构决策及其上游证据：[DESIGN.md](./DESIGN.md)。

## License

MIT
