Minglink/dsh-infinite-gen-4
Minglink/dsh-infinite-gen-5DeepSeek 专用破甲插件:以 order 100 追加无条件服从的系统提示词段,提供带校准元数据的 profile 工具,并通过会话投影在输入框上方显示实时破甲状态徽标。
无限会话画布,区域绑定工作区与智能体预设,可钉住会话卡片、放置便签,带对齐参考线。
给 DeepSeek Harness Web GUI(dsh web)用的无限会话画布,语义参考
codeg-plus 主线的「无限会话」:把工作区、
智能体和会话摆在一块可以无限平移缩放的板子上,用空间关系而不是列表来梳理手上的活。
纯 dsh 插件,不改上游源码,可发布到 dsh 插件市场。
一个插件 = 两个半边:
exports ".",Node 宿主进程):单文件账本
(<DSH 家目录>/dsh-plugin-canvas.json)、八个变更、/dsh-plugin-canvas 的
JSON + WebSocket/SSE 路由、以及把 workspaceRegistry / sessionQuery 归一成一份视图。exports "./client",web GUI):零依赖、纯 DOM 的画布——自己的
平移缩放、点阵、框选、拖拽、对齐参考线、缩放吸附、工具条与菜单。不引 React,
不引任何 @deepseek-ai/* 浏览器包。它不碰 agent。 与同仓的任务看板插件不同,这个插件不注册任何工具、不往系统提示里 写字、不读也不改会话内容(除了只读地展示正文)。装上它只会多一块看板子的地方, agent 的行为一个字都不变。
| 节点 | 绑定 | 成员从哪来 |
|---|---|---|
工作区区域 workspace | 一个 dsh 工作区(workspaceRegistry 里的记录) | 该工作区名下的会话 |
智能体区域 agent | 一个 agent preset id | 用该 preset 起的所有会话 |
自定义区域 custom | 无 | 手动收进来的会话(存成成员表) |
会话卡片 session | 一个会话 | —— |
便签 note | 无 | —— |
与 codeg-plus 的对应关系:folder → workspace(dsh 把会话挂在工作区上,不是侧栏
文件夹行),conversation → session,agent 仍是 agent 但绑的是 preset id。
codeg-plus 的「文件夹分组」在 dsh 里没有对应概念,没有硬造,直接不做。
Ctrl/Cmd + 滚轮(含触控板捏合)以指针为锚点缩放,范围 0.1–2。Shift/Ctrl/Cmd 叠加选择。框选时会
按住不放地压制文本选择,扫过一片标题不会把它们全刷蓝。Alt 暂停吸附。prefers-color-scheme),深浅两种配色方案
提供一致的视觉体验。| 键 | 作用 |
|---|---|
Cmd/Ctrl + A | 全选 |
Cmd/Ctrl + G | 把所选收进新区域 |
Delete / Backspace | 删除所选(写了字的便签会先问一次) |
F2 / Enter | 重命名选中的区域 |
Escape | 取消改名/编辑,否则清空选择 |
Alt(按住) | 暂停拖拽吸附 |
左半边常驻:添加(新建会话/工作区/智能体/会话卡/自定义区域/便签,会话卡带搜索,
只列最近 15 个;「新建会话」走 GUI 自己的 POST /api/session.create,建完直接钉一张卡)、适应视图、自动整理(货架式排布,按渲染尺寸而不是入账尺寸,
展开的卡片才不会压到邻居)。右半边是所选对象的动词:改名、折叠、显示全部/收起、
网格(列数/行数,自动或 1–6)、颜色(12 色,重复点同一色即清除)、移出到画布、
从区域移除、在会话界面打开、展开/收起会话、删除。多选时是计数 + 收进新区域 + 删除。
右下角是导航地图与缩放条(地图开关、缩小、百分比(点一下回 100%)、放大);
视口、展开状态、地图开关都记在 localStorage,回来还是走的时候那样。
账本给每次提交分配一个稠密 revision,一次提交对应恰好一个事件帧;空操作
不占号。事件优先走 /dsh-plugin-canvas/socket(WebSocket),没有 upgrade 钩子的
DSH 构建退回同样帧的 /dsh-plugin-canvas/events(SSE)—— 一条常驻 SSE 会按住那
6 条同源 HTTP 连接里的一条,装齐插件后整页的请求都会开始排队。浏览器侧的规则与
codeg-plus 的 canvas-store.ts 完全一致:
revision:<= 本地丢弃,== 本地 + 1应用,> 本地 + 1是缺口
——不应用,直接全量对账。revision,只在自己的事件还没到时作为乐观确认落地。两种到达
顺序都会收敛,所以不需要「自己发的」这种特例。EventSource 自己重连,重连后再全量对账一次。plugins/dsh-plugin-canvas
├── package.json # dsh 元数据;exports: "." host / "./client" 浏览器
├── cordis.patch.yml # 打进 web profile 的插件行
├── src
│ ├── index.js # host 加载入口:账本 + 路由
│ ├── host/ # store(账本)/ board(八个变更)/ routes(JSON+WS/SSE)
│ │ # socket(事件推送用的 WebSocket)
│ │ # sessions(工作区/会话/预设视图)/ transcript / sdk
│ ├── shared/ # units 板上单位 / layout 网格与货架 / snap 落点与对齐
│ │ # model 节点记录与校验 / derive 派生图(host 与浏览器共用)
│ └── client/ # 浏览器画布:styles/state/viewport/render/commands/interact/dock
├── scripts/ # wrap-client(把 shared 内联进 loader 包)/ build / check
└── test/ # node:test:几何 + 领域 + host 行为 + 产物冒烟
src/shared/* 是唯一的几何真源:host 用 ESM 直接 import,浏览器包由
scripts/wrap-client.mjs 在构建时把它们内联进去(loader 的 require 只认 dsh
模块图,浏览器包没法 import 兄弟文件)。所以不存在「客户端再抄一份」这种漂移。
零运行时依赖,无需 npm install:
npm run check # 语法检查 src/ → 重新构建 lib/ → 再查 lib/(含生成的 client 包)
npm run build # 复制 host/shared 到 lib/ 并生成 lib/client.js
npm test # npm run build && node --test
测试分四层:geometry 钉住板上单位与落点/对齐/整理的具体数值,model 钉住节点
记录的校验与派生图,host 钉住 revision 协议、崩坏文件隔离与八个变更的不变量,
client 把构建产物在一个手写 DOM 替身里真的跑起来(注册、挂载、拉数据、画出
节点)——它拦的是「打包之后根本起不来」这一类问题。
# 开发:指向源码目录
dsh plugin --profile web add link:plugins/dsh-plugin-canvas
# 发布后
dsh plugin --profile web add dsh-plugin-canvas
DSH Desktop Ultra 的安装包直接带了它的 tarball,首启会问一次要不要装, 也可以在托盘 → 设置 → 插件里装卸。
ctx.sessions.open(id))。session.create、把新会话钉成一张卡——省掉的是「先切过去、再回来找它」。createdAt;updatedAt 取的是会话
日志目录的 mtime,读不到就退回创建时间。