# dsh-slide

[English](README.md) | [简体中文](README.zh-CN.md)

`dsh-slide` 是 DeepSeek Harness Web UI 的 Conversation 级可视化幻灯片编辑器。启用后，当前 Conversation 的默认聊天界面会切换为类似 PowerPoint 的画布，同时继续使用原有 Session、Workspace、模型配置和 AI 输入通道。

![dsh-slide 展示 AI 生成的幻灯片和 Annotation 审阅界面](docs/images/dsh-slide-cover.png)

## 功能

- 可以为当前打开的 Conversation 单独开启或关闭 Slide Editor，不影响其他 Conversation。
- 提供多页 16:9 画布、实时缩略图、对象与页面选择，以及自动 Workspace 持久化。
- 人类只负责选择对象、页面或整份幻灯片并向 AI 下达指令，不提供文字编辑、对象移动、缩放、插入、删除或页面快捷键等直接编辑入口。
- 可导出独立 HTML 演示文稿，支持键盘翻页、全屏和打印为 PDF；Workspace 图片会嵌入导出文件。
- 每个 Annotation 由独立 subagent 处理。选中的内容用于提供任务焦点，但 subagent 始终拥有整份幻灯片的修改权限。
- 每个 Annotation 都有独立消息线程，可以继续补充指令。
- Annotation 会根据首次请求自动总结标题，并支持手动重命名；自定义标题不会被后续模型响应覆盖。
- Subagent 执行期间，输入框位置会显示可见文本和工具调用状态，不展示隐藏 reasoning。
- Annotation 支持折叠、标记解决、重新打开和删除。
- 可拖动右侧面板左边缘调整宽度，宽度会保存在本地；也可以聚焦分隔条后使用方向键调整。
- Workspace 文件浏览器支持单击打开、文本与图片预览、拖拽上传、新建文件夹、重命名和删除。
- 可在设置或编辑器内维护共享初始化 Prompt 和 Workspace 知识文件列表。
- 文件接口绑定当前 Session 的真实 `cwd`，并拒绝路径穿越和符号链接逃逸。

## AI 选区操作

框选或点击一个或多个对象后，可以让 Annotation agent 聚焦这些内容。选区只表示任务关注范围，不限制 agent 的权限；如果完成请求需要调整其他页面或对象，agent 仍然可以修改整份幻灯片。

![选中幻灯片对象后准备向 AI 提交修改请求](docs/images/dsh-slide-selection.png)

## 安装

安装 npm 已发布版本：

```sh
dsh plugin --profile web add dsh-slide@dsh-plugin
dsh web
```

或者从当前源码构建：

```sh
pnpm install
pnpm run build
dsh plugin --profile web add /absolute/path/to/dsh-slide
dsh web
```

## 切换当前 Conversation 模式

Slide Editor 的开关只作用于当前打开的 Conversation，并不会全局替换所有聊天界面。

1. 打开希望用于制作幻灯片的 Conversation。
2. 点击左下角的 **设置**。
3. 进入 **幻灯片编辑器**。
4. 在 **当前 Conversation** 卡片中，开启标记为 **开启幻灯片编辑模式** 的开关。
5. 返回 Conversation。默认聊天界面会切换为 Slide Editor，同时保留该 Conversation 原有的 Session、Workspace 和模型配置。

需要切回普通聊天界面时，保持该 Conversation 为当前会话，再进入同一设置页面关闭开关即可。每个 Conversation 的模式独立保存，切换一个 Conversation 不会影响其他 Conversation。

## 数据存储

每个 Conversation 默认使用以下文件：

```text
.dsh-slide/<session-id>.slides.json
```

在右侧文件浏览器中打开其他 `*.slides.json` 文件后，该文件会成为当前 Conversation 关联的文档。文档保存幻灯片模型和 Annotation 审阅状态；全局设置保存已启用的 Session ID、共享 Prompt、知识文件路径和每个 Session 的文档路径。

## AI Annotation 流程

每个 Annotation 都拥有独立消息线程和一个关注范围：选中对象、选中页面或整份幻灯片。每一轮请求都会在当前 Conversation 下启动一个前台 one-shot `spawn` subagent，并向它提供 Annotation 历史、关注内容、完整 deck JSON、共享指导信息和知识文件路径。选区只用于指导任务，不构成权限限制；每个 Annotation 都可以修改任意对象或页面，也可以新增页面。

服务端通过 NDJSON 实时发送可见文本增量和工具调用开始、结束事件，同时过滤 reasoning 增量。Subagent 最终返回严格 JSON，其中包含简短结果说明和幻灯片操作；浏览器验证操作后立即应用，并同步更新主画布与缩略图。One-shot subagent 不会唤醒父 Conversation，不同 Annotation 可以独立推进。

## 架构

- Host 入口：设置命名空间、Workspace API、Annotation 流和文件路由。
- Browser 入口：一个设置区块，以及仅在当前 Session 开启时以优先级 `-100` 注册的 `conversation` 插槽。
- Browser bundle：通过 `window.__ModuleLoader__` 延迟加载的 CommonJS factory，安装插件不需要重新构建 DSH 前端。

## 当前限制

- 原生可编辑格式是 `*.slides.json`；支持导出 HTML，但暂不支持导出可继续编辑的 PPTX。
- 文件 API 当前限制单次 JSON 上传不超过 32 MB。
- Subagent 响应协议支持更新或删除对象、新增文字或形状、修改页面和新增页面；暂不支持图片生成或任意文档结构重写。
- 编辑器支持文字、矩形和图片；暂不支持富文本、图表、表格、参考线和多人协作光标。
