前言¶
DeepSeek Harness(DSH)里已经有对话功能,但对话是线性的。你想要的是一个长期存在的界面:一个看板、一个打卡表、一个小计算器、一个能盯着某件事的面板。这类东西让模型每次用文字回答都很别扭——它会重复输出同一段 HTML,你还得自己另存、自己打开。
DSH 插件 uid-762/dsh-ai-workbench 把这条路打通:在 DSH 里说一句需求,工作台先问几个具体问题(可选,可跳过),你确认后,模型在项目文件夹里写一个自包含的单文件 HTML;插件自动把它挂成一个可缩放、可拖动的窗口;窗口右侧有绑定的对话窗,你可以在那儿继续让它改;窗口里点了被声明的按钮,动作记进工作台日志;你在对话里提一句,模型读得到这条记录并改文件,窗口刷新。不用写代码,不用装构建工具,也不用离开 DSH。
它是什么¶
插件名称:uid-762/dsh-ai-workbench。维护者:Uid-762。分类:客户端。星标:0。一句话定位:在 DSH 里说一句大白话,AI 就给你造一个能长期存在的窗口——然后你继续跟它聊,它继续改。
核心功能¶
四个区域¶
侧边栏「AI 工作台」行:sidebar.panellist 上的一个图标行(order 56,排在已装插件之后)。点它,中央面板切换成工作台;再点一次会话图标就回到对话。
中央面板(创作面):
- 需求输入框:唯一必须填的东西。Enter 发送,Shift+Enter 换行。
- 提问区(intake):写完需求后,面板先列出 5–7 个问题,每题带几个推荐选项,也可以自己补一句话。确认后才发给模型。点「就按描述做」可以跳过,让模型在构建时自己问。
- 项目列表:一个项目 = 一个文件夹 = 一个模型会话。换项目就是换上下文。
- 窗口列表:每个窗口显示标题、入口文件、声明的动作、状态徽章、💬 对话按钮。
- 导入 / 导出:把整个工作台导出成一个 .dshwb.json 文件(页面已内联,可直接发给别人),或从文件导入。同一个文件导入两次会得到两个工作台。
- 模板市场:拉 market.dshdesktop.com 的目录,一键装别人做好的工作台。
- 动态:Host 记的日志,实时推送(SSE),显示「已发出 / 已送达」计数。
- 底部状态:SSE 是否连着、当前项目绑的是哪个会话。
浮层窗口(产物面 + 对话面):shell.overlay 上的浮层。每个窗口是一张可拖动的卡片,里面左边是 iframe,右边(点 💬 展开)是绑定的对话窗。标题栏有对话、最小化、全屏、重新加载、关闭。右下角可拖拽改尺寸。关掉窗口只是不显示,文档还在账本里,随时能再打开。
对话窗绑的是项目而不是窗口:一个项目一份文件夹、一个会话、一份 manifest,所以同项目的两个窗口共享同一份转录。
窗口标题栏的「打开方式」有两种:
- 应用内浮层:浮在本面板上方显示;适合边聊边看的窗口。
- 独立标签页:在浏览器独立标签页打开;适合要全屏用一阵的窗口。
内置作者技能:插件启动时会往 DSH 的技能注册表里注册一个内置技能 ai-workbench-authoring。它包含产物契约、主题变量白名单、沙箱陷阱、动作上报协议、响应式要求、前端设计原则、反模式清单和 10 个可查的资源站点。模型在写工作台页面时能直接读到它,不需要你单独安装任何技能。
动作上报:只发关键动作¶
这是刻意做窄的一条通道。页面里写:
<button onclick="parent.postMessage({
source: 'dsh-ai-workbench',
action: 'check-in',
data: { day: '2026-10-18' }
}, '*')">今天喝了</button>
并在 _workbench.json 里声明:
{
"title": "喝水打卡",
"entry": "index.html",
"ready": true,
"actions": [
{ "name": "check-in", "label": "打卡", "description": "用户记录今天喝水" }
]
}
动作是记录,不是自动提问。点击只会往工作台日志里写一条带 payload 的记录,并推进面板上的「已发出」计数;它不会自己唤醒模型。你什么时候想让 AI 处理,就在对话窗里说一句「刚打卡了」「把这个月的数据汇总一下」——模型发消息时,摘要里会带上最近的几条交互记录,所以它知道你点了什么,不用你复述。
未声明的动作会被丢弃,并且记一条 warn 日志。这个判断在父窗口做,不在 iframe 里做:iframe 是不可信内容,它自己说自己「已声明」不算数。声明列表每次都从账本重读,所以模型改了 _workbench.json 之后不需要刷新页面就生效。
消息里的 source 字段用于区分来源,父窗口还会校验 event.source 确实是某个已知窗口的 contentWindow——别的 iframe 或上层页面伪造不了。
模板市场¶
除了自己造,还能一键装别人做好的工作台。面板上的「市场」拉 market.dshdesktop.com/index.json,把每条列成一张卡片:标题、作者、版本、体积、md5/sha256、有没有能直接跑的静态页。点「安装」走的是和「导入 .tgz」完全相同的解包路径:内置零依赖 tar 解包器解开,按排名挑出真正的页面入口,落成本地项目。
安装和删除都会立即刷新市场列表——卡片上的「已安装」徽章、可运行标记跟着账本实时重算,不需要刷新页面,也不会出现「删了还显示已装」的旧状态。
市场包分三种形态,插件不猜、不装样子,卡片上直接标出来:
- 自带构建产物的静态页:卡片显示 可直接运行;装完得到一个能立刻打开的窗口。
- 纯 dsh-desktop 组件(需要 desktopWorkbenches 服务):卡片显示 仅描述页;装完得到一页「这是谁做的、怎么装回去」+「让 AI 搭建」按钮。
- 页面壳引用缺失的构建产物:卡片显示 仅描述页;装完同上——这种比上一种更危险,因为它假装 ready。
第三种是真实存在的(比如 standalone/index.html 引用 /assets/standalone.js,而那个文件要 npm run build 才会有)。插件用 referencesMissingAssets() 把这种壳降级成描述页路线,而不是端给用户一个卡死的加载页。「让 AI 搭建」按钮就是它的出路:模型读包源码,在你的项目文件夹里写出一个自包含的 index.html。
网络说明:市场包托管在 GitHub Releases。如果 github.com 不通(常见于国内网络),插件会自动改用镜像重试,并把镜像的耗时放宽到 180 秒——直连仍保持 30 秒快速失败,不会让面板卡住。镜像偶发截断时,sha256 校验会拒绝而不是给你装一个坏工作台。
文件放在哪¶
| 东西 | 路径 |
|---|---|
| 账本(项目、窗口、日志、对话) | <DSH home>/dsh-ai-workbench.json |
| 产物 | <DSH home>/ai-workbench/<项目名 slug>/ |
| 页面清单 | 产物文件夹里的 _workbench.json |
| 导出的工作台 | 你自己选的位置,后缀 .dshwb.json |
| 路由 | /apps/ai-workbench/api/*、/apps/ai-workbench/events |
| iframe 源 | /apps/ai-workbench/api/site/<projectId>/<相对路径> |
<DSH home> 的解析顺序:配置里的 dshHome → $DSH_HOME → ~/.dsh。
产物文件夹是你的:用编辑器、用 git、用别的工具直接改都行,插件下次读页面时就会看到。账本只记「这个窗口指向哪个文件」,不记文件内容。
从上一版升级:账本文件名从 dsh-window-forge.json 改成了 dsh-ai-workbench.json。首次启动时如果新文件不存在、旧文件存在,会读旧文件继续用(旧文件保留不删),所以已有项目不会丢。清单文件名同理:先找 _workbench.json,找不到再找 _forge.json。
安装¶
# 1. 打包(在项目根目录)
pnpm pack --pack-destination .
# 2. 装进某个 profile
dsh plugin --profile <profile> add ./dsh-ai-workbench-0.8.2.tgz
桌面版(Electron)不能用 CLI 装。它对 --profile desktop 会直接报:
error: profile "desktop" is managed exclusively by the Electron application
桌面场景请走应用内的插件安装入口,选择上面那个 .tgz。
升级注意:这个包改过名字(原 dsh-window-forge)。如果旧包还装着,请先卸旧再装新。两个包同时启用会各自注册 /apps/* 前缀路由,虽然前缀不同不会撞车,但会同时出现两个侧边栏图标、两套账本。
想先在隔离环境里试,可以造一个一次性 profile:
dsh workbench-lab --from-default-profile web --dump-config
dsh plugin --profile workbench-lab add ./dsh-ai-workbench-0.8.2.tgz
dsh --profile workbench-lab --port 0 --no-open
最后一行会打印 http://127.0.0.1:<port>/?token=<token>,浏览器打开就能看到。
装完重启(或刷新页面),侧边栏底部会多出一个「AI 工作台」图标。
配置¶
Config 会被 DSH 自动投影成设置页,不需要自己写界面。面板上的开关状态由 Host 通过 GET /state 的 features 字段下发,不在浏览器里存第二份——你在设置页改完,刷新面板就生效。
| 键 | 默认 | 说明 |
|---|---|---|
dshHome |
'' |
覆盖 DSH 家目录;空则按上面的顺序解析 |
ledgerFile |
dsh-ai-workbench.json |
账本文件名 |
serveHttp |
true |
关掉就不注册任何 HTTP 路由 |
registerTool |
true |
关掉就不注册 workbench_window 工具 |
registerSkill |
true |
关掉就不注册内置作者技能 |
interviewFirst |
true |
关掉则需求直接进构建,不先提问 |
chatPane |
true |
关掉则不显示窗口右侧的对话窗 |
适用场景与注意¶
适合谁:需要在 DSH 里创建长期存在的界面,并且希望模型能直接看到你在界面上的操作并继续修改的人。
注意:插件以当前 dsh 进程权限运行,安装前应检查源码与许可证。
短结尾¶
插件用一句大白话让 AI 在 DSH 里造一个可缩放窗口,然后继续跟它聊,解决了线性对话无法承载长期界面的痛点。目录页:https://www.skillhub.cn/plugins/Uid-762/dsh-ai-workbench;GitHub:https://github.com/Uid-762/dsh-ai-workbench。