在 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能力主動查看當前畫面的場景。