DeepSeek Harness:用一句大白话让 AI 在 DSH 里造一个可缩放窗口,然后继续跟它聊

前言

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。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye