在 DeepSeek Harness (DSH) 的会话中,Agent 生成的 self-contained HTML 通常仅作为文本流流转。当需要讲解、圈画或对画面进行交互时,需要一个独立的平面。dsh-teaching-board 提供了这个“教学平面”,将 Agent 的 HTML 投影成可讲解的板书界面,并允许使用者直接在板面上圈画、截图发回对话。
安装与启用¶
这是一个 profile 级的 bundle。安装一次后,该进程下所有会话都能获得 stage_* 工具与“教学平面”页签。
dsh plugin --profile web add @arcaneorion/dsh-teaching-board
# 然后重启 dsh --profile web 并刷新页面
注意:旧包 @arcaneorion/dsh-stage-panel@0.1.0 已废弃,请勿继续使用。
核心能力¶
插件提供以下核心功能:
- 板书展示:在
sandbox="allow-scripts"的 iframe 中渲染面板 HTML。 - 手写勾画:支持画笔、橡皮、4 色、粗细调节、撤销、清空。画笔模式下默认不拦截点击事件,点击控件时会转发点击而非落笔。
- 内置截图:克隆文档、Canvas 换位图、SVG 序列化,生成零依赖的 PNG。
- 截图交互:
- 用户截图:通过
inputActions.addAttachments作为草稿图片提交。 - Agent 主动截图:通过
stage_snapshot工具触发,Agent 可以请求查看当前面板的快照。
- 用户截图:通过
- 状态与工具:提供
stage_status/stage_choice状态条工具,以及stage_panel板面操作工具。 - 自带手册:插件自带
skills/stage-panel,挂载后任何 preset 都无需额外安装手册。
板面模型¶
stage_panel 不是一次调用画一张图,而是一块板可以被多次写。这类似上课时的黑板:老师写、擦一角、再写。
| 参数 | 作用 |
|---|---|
board |
板面 id。同一 id 的连续调用 = 同一块板的演进;换 id 才是换新板(新主题)。省略 = 一次性整块替换,不保留笔迹 |
op |
open(开板/整块重写) / append(默认,在板尾再写一段) / set(替换指定区域) / remove(擦掉该区域) |
region |
set / remove 操作的目标区域名 |
数据流与增量更新:
客户端的板面内容是会话日志里同一 board id 的调用折叠结果,没有私有状态。append、set、remove 通过 postMessage 原地更新 iframe 内容,保留滚动位置、动画和笔迹。只有 open 或切换 board 时才会整块重建文档。
笔迹锚定:
笔迹坐标存储的是文档坐标。滚动或 AI 修改内容导致重排时,笔迹会跟随对应的文本块移动(锚定在 .stg-block),不会像旧版那样钉在屏幕上脱节。
架构与限制¶
沙箱与注入:
面板 iframe 是 sandbox="allow-scripts"(无 allow-same-origin)。父页面无法直接读取 DOM 或截图,因此勾画与光栅化必须在 iframe 内部完成。插件通过注入 runtime 来实现这些功能。
截图限制:
* 截图需要面板处于挂载状态(conversation.view 处于活跃页签)。用户切到其他页签时无法截图。
* 截图仅包含视口画面,且为 PNG 格式。单图超过约 1.2 MB 时会自动退化为 JPEG。
* 外链字体或图片不会进截图,也不会渲染(面板规范要求 self-contained)。
适用场景¶
- 需要在多轮对话中保持同一块“板书”内容的场景。
- 需要用户或 Agent 对 HTML 结果进行标注和反馈的场景。
- 需要利用 Agent 的
stage_snapshot能力主动查看当前画面的场景。