Repository navigation
Releases: He2way/dsh-task-console
Release list
v0.27.0 — 支持 DSH 0.2.x(不再被判定不兼容而跳过)
v0.27.0 — 支持 DSH 0.2.x / DSH 0.2.x support
问题:升级到 DSH 0.2.1-rc.2 后整个工作台消失。原因不是崩溃,而是 DSH 现在会静默跳过 engines.dsh 范围不含当前版本的 profile bundle:
dsh: skipping profile bundle "dsh-task-console": Error: Plugin dsh-task-console@0.26.1
is incompatible with dsh 0.2.1-rc.2: requirements {"engines.dsh":">=0.1.5-rc.1 <0.2.0-0"}
插件从未被加载,所以它自己不会给出任何报错。
修复:
engines.dsh扩到">=0.1.5-rc.1 <0.3.0-0",覆盖 0.2 代;并把插件真正用到的客户端 API 在 0.2.1 上逐项核对(modules/remote、slots(shell.overlay仍是 list 槽、register({name,id,order,label}, Component)形式不变)、标准 props(useSessions/useSessionStatus)、sessions(create/fork/retain/using/binding/list)、会话面(prompt/updateQueue/cancel/getSnapshot)、workspaces(list/archiveSession(sessionId, options?))、模块加载握手、dsh.client清单字段)。- 新增
npm run check:compat:用 DSH 自己的评估器(dsh-app-boot的evaluatePluginCompatibility)遍历本机所有 DSH 版本,最新版本会跳过本插件时直接失败。npm test也跑同一检查(本机没有 DSH 时自动跳过),并断言范围仍覆盖 0.1→0.3、CHANGELOG 顶部版本与package.json一致、以及在 DSH 形状的 ctx 上调用apply()仍能完成shell.overlay注册。 - 顺手加固与新版 React 的兼容:任务台里每个
useSessions选择器只返回快照中已有的引用,子代理行改用useMemo派生,避免useSyncExternalStore在快照未变时读到新对象。
升级后注意:profile 组合在启动时计算,所以要把正在运行的 dsh web 重启一次(再按 Ctrl+Shift+R 刷新页面),插件才会重新被组合进来。
Install / 安装
dsh plugin --profile web add dsh-task-console # npm(发布后)
dsh plugin --profile web add ./dsh-task-console.tgz # 本 Release 的预构建 tarballFull changelog / 完整变更记录: CHANGELOG.md
v0.26.1 — 临时 agent 会话在新版 DSH 上恢复可用
v0.26.1 — 临时 agent 会话在新版 DSH 上恢复可用 / Temp agent sessions work again on newer DSH
症状 / Symptom:画布(和卡片)里的「一句话改画布」输入后报 临时 agent 会话不可用,会话列表里还会慢慢堆出空白的临时会话。
原因 / Cause:客户端 sessions 服务悄悄改了两处契约:
sessions.binding(id)不再返回任意会话的绑定,而是只借用「已有人 retain」的绑定("Borrow an already-retained binding without extending its lifetime")。插件用sessions.create新建的临时会话没有任何人 retain,于是binding()一直返回空:会话建出来了、却从未被提示,聊天直接失败。- 会话列表快照不再有
current字段(现在是{ ids, byId, phase, projectionsBySession }),工作区行的字段也从id改成workspaceId;subagentsByParent/jobsBySession已不存在。
修复 / Fix:
- 临时会话现在会在整个任务期间被 retain(
sessions.retain),并在每条退出路径上释放;老客户端的binding()路径保留为回退。 - 当前会话改为按 harness 自己的规则解析——主视图 retain 的那个会话(同时仍兼容旧的
current),于是临时会话建在对话所在的工作区里,卡片聊天「发送到主会话」也能找到会话,任务台会话卡不再显示「未选择会话」。 - 工作区行兼容
workspaceId(旧id),临时会话会真正落在注册的工作区里。 - 子代理卡改读每个会话的
subagentCatalog投影,运行状态取自useSessionStatus;jobsBySession在新客户端没有替代品,「后台任务」卡退化为空态而不是报错。
测试 / Tests:smoke.mjs 用两个假服务把两代契约都钉住——新版(binding() 在 retain() 之前一直为空,这正是回归点:旧代码会失败)与旧版(binding() 始终可用),断言临时会话建在源会话工作区、真的被提示、应用到画布、被归档、并且 retain 恰好释放一次;另加当前会话解析、列表读取、工作区命名与两代子代理投影的断言。
Install / 安装
dsh plugin --profile web add dsh-task-console # npm(发布后)
dsh plugin --profile web add ./dsh-task-console.tgz # 本 Release 的预构建 tarball更新 profile 后请按 Ctrl+Shift+R 硬刷新页面。
Full changelog / 完整变更记录: CHANGELOG.md
v0.26.0 — 画布内嵌 3D 查看器(不需要 Blender)
v0.26.0 — 画布内嵌 3D 查看器 / A 3D viewer on the canvas
不用装 Blender:新增 model 控件,把 .glb / .gltf / .obj / .stl 直接显示在画布上(也可以放进卡片,或用 ⛶ 全屏看)。
- 零依赖、离线可用:查看器是一个自写的 WebGL 页面(
viewer/viewer.html,约 44KB),由npm run embed:viewergzip 进客户端包(和框图同一套做法),跑在沙箱 iframe 里,只通过postMessage与项通信。 - 能渲染:glTF 2.0 / GLB(节点层级与 TRS/矩阵变换、索引与非索引图元、三角带/扇形、顶点法线缺失时用平面法线兜底、
baseColorFactor与内嵌baseColorTexture、doubleSided、alphaMode),以及 OBJ 与二进制/ASCII STL。 - 交互:左键环绕、中键或 Shift 拖动平移、滚轮缩放;
重置视角、线框、网格、背景;状态栏报告三角形数、网格数与包围盒尺寸。 - 怎么载入:拖文件到画布(空白处新建查看器项,已有模型项则替换)、点
打开模型…、或给控件写src(https 地址或data:内嵌)。约 450KB 以内的模型会写进画布状态(刷新/同步后仍在),更大的只在本次会话显示并标注仅本机。 - 对话也能建:
{ "op": "add", "kind": "model", "src": "https://…/x.glb" };提示词里也说明了"大模型请拖进来,不要往对话里塞 base64"。
测试:npm run verify:viewer 构造真实 glTF-binary 立方体并在无头 Chromium 中驱动查看器(载入 triangles=12, meshes=1, materials=1, size=1x1x1、指针拖动真的改变相机、线框/网格/背景、坏文件报错、清空);npm run verify:embed 把同一立方体作为控件放上画布,断言项内沙箱报告 12 三角形 · 1 网格;smoke.mjs 覆盖内嵌页面哈希/缓存、消毒往返、被拒来源、拖拽扩展名、选择器入口与提示词。
Install / 安装
dsh plugin --profile web add dsh-task-console # npm(发布后)
dsh plugin --profile web add ./dsh-task-console.tgz # 本 Release 的预构建 tarballFull changelog / 完整变更记录: CHANGELOG.md
v0.25.0 — 卡片之间可以连线(工作区上下文共享 + 虚线框)
v0.25.0 — 卡片之间可以连线 / Links between cards
卡片之间可以连线了:连线的初始含义是「发起会话时工作区上下文共享」,连线组外面会有一个虚线框把它包起来。
- 怎么画:项工具栏里的
🔗让画布进入连线模式(橡皮筋跟着指针,顶部提示"点另一张卡片完成连线(Esc 或右键取消)"),点第二项即完成;再点自己或按Esc取消。同一对项无论从哪端开始都归一化成一条边;不能连自己,也只能连同画布上的项。 - 长什么样:两项之间一条曲线,中点一个可点标签
⚯ 工作区上下文共享 ×(点击删除这条连线),每个连通组外面一个虚线圆角框,左上角标签⚯ 工作区上下文共享 · 2 项(点击解释含义)。删除某项会一并删除它携带的连线;连线跟着画布平移缩放走。 - 发起会话时的含义:卡片对话与画布对话的提示里都会带上一段
共享的工作区上下文,逐条列出连线的邻居及其内容(标题 / 清单项 / 键值 / 表格行 / 趋势 / 链接…),所以"从这张卡片发起会话"是真的继承了整组。对话也可以用两个新操作驱动:{ "op": "link", "from": …, "to": … }与{ "op": "unlink", … }。 - 协作:连线属于画布状态,本地持久化 + 以
link.upsert/link.delete广播 + 按边"最后写入获胜"合并,任一端删项自动清理悬挂的边。
测试:smoke.mjs 覆盖归一化、自连/跨画布/不存在的目标、连通组成组、邻居内容进入共享上下文、两处提示词、两个操作、删除级联、合并与渲染层;npm run verify:embed 在 Chromium 里真的画一条并断言边、虚线框(frameCount="2"、dashed="dashed"、标签 ⚯ 工作区上下文共享 · 2 项)、标签芯片与提示词段落,再点芯片断言全部消失。
Install / 安装
dsh plugin --profile web add dsh-task-console # npm(发布后)
dsh plugin --profile web add ./dsh-task-console.tgz # 本 Release 的预构建 tarballFull changelog / 完整变更记录: CHANGELOG.md
v0.24.2 — 修复:取不到的图片现在会说明并可换成本地图片
v0.24.2 — 修复:取不到的图片什么都不显示 / An image that cannot load now says so
用户报告:画布里的图片显示失败。
根因:图片控件的 src 是由用户浏览器去取的,取不到时(网络到不了该站点、图床防盗链、链接失效,或那根本不是图片地址)原先只渲染一个裸 <img>,于是静默失败——看不见的破图标、没有说明、也没法在画布上修。这次报告里的地址是 upload.wikimedia.org,本机网络取不到。
修复
- 图片控件现在有明确状态:加载中 / 成功 / 失败。失败时会指出取不到的主机名与地址原文,并说明可能原因。
- 控件内直接给出出路:
用本地图片替换…打开文件选择器 → 读取 → 缩放成有界 JPEG data URL 写回该控件,图片完全不依赖网络即可显示;旁边还有重试、在新标签打开、复制地址,以及"也可以把本地图片粘贴 / 拖到画布上"的提示。 - 替换后真的重新加载:
src一变(替换 /✎编辑 / 对话重构)状态复位为加载中,之前失败的地址会被重新尝试。 - 提示词同步说明:只在确认真实可达时才写 https 图片地址;没有可靠图床时用自包含的
data:image/svg+xml;base64,…画示意图;不要写搜索页或猜测的链接。
测试:smoke.mjs 覆盖两种图片来源、拒绝网页 / file: / javascript: 地址、替换坏图(单控件项与多块项);npm run verify:embed 提供真实 PNG 并在 Chromium 中断言可达图片真的渲染(naturalWidth > 0)、取不到的会点名主机并给出选择器、选中本地文件后变成 data URL 并渲染(IMAGELOCAL replaced=true loaded=2 failed=0)。
Install / 安装
dsh plugin --profile web add dsh-task-console # npm(发布后)
dsh plugin --profile web add ./dsh-task-console.tgz # 本 Release 的预构建 tarballFull changelog / 完整变更记录: CHANGELOG.md
v0.24.1 — 修复:对话在画布上新建控件失败
v0.24.1 — 修复:对话在画布上新建控件失败 / Controls a conversation writes now build
用户报告:在画布里让对话新建控件,画布上出现一摞 未支持的控件:unknown 方框,什么控件都没建出来。
根因(从会话记录里取到了那条真实回复):模型把控件名当成了键写,而不是写文档规定的 kind 字段 —— { "stats": [ … ] }、{ "trend": { … } }、{ "note": "…" }、{ "heading": "标题", "text": "正文" },于是全部落成"未支持的控件"。
修复:控件解析器现在会还原对话真正写出的形状 —— 控件名当键、中文名与同义词(表格 / 计数器 / 折线图 / 待办 / 标题 / 代码块 …,以及 metrics / todo / sparkline / iframe 等英文同义词)、以及完全没写控件名时按字段判断(until → 倒计时、src → 图片、url → 网页应用、values → 趋势、columns+rows → 表格、rows → 键值、label+value → 统计、text → 文本)。仍然建不出来的控件会被跳过并点名(已应用:新增控件 2 · 跳过 1(看板)),不再留下死掉的错误框;画布提示词也把规则和完整示例写清楚了。
顺带修掉一个老 bug:trend 从不读取它自己的规范字段 items,任何经过第二次消毒的趋势控件(画布 add / 实例收养 / 展开控件都会走第二次)都会被静默丢掉 —— {"op":"add","kind":"trend"} 因此永远建不出来。现在 19 种控件都通过"消毒两次结果不变"的测试。
回归测试:报告里那块画布上真实出现过的回复已作为 smoke.mjs 的固定用例(3 个操作、零丢弃、含 8 个控件的卡片 + 2 个裸控件、无 unknown 块);npm run verify:embed 在 Chromium 里把同样形状的回复从主对话送进去,断言 kinds=trend、unsupported=0 且趋势图真的画了出来。
同时包含 v0.24.0 的全部内容:画布可以承载任何插件(🧩 插件 选择器 / [canvas] 的 addPlugin 与 rebuild 操作 / 主对话与专属对话都能驱动)。
Install / 安装
dsh plugin --profile web add dsh-task-console # npm(发布后)
dsh plugin --profile web add ./dsh-task-console.tgz # 本 Release 的预构建 tarballFull changelog / 完整变更记录: CHANGELOG.md · README: README.md
v0.24.0 — 画布可以承载任何插件
v0.24.0 — 画布可以承载任何插件 / The canvas hosts any plugin
🧩 插件(或一句对话)现在可以把另一个插件的原生界面放到画布上 —— 不局限于卡片与控件。
- 两个新的
[canvas]操作 ——addPlugin(id/title/height/bare/x/y)与rebuild(重建某个已有插件项),会校验、计数并汇报为新增插件 1 · 重建插件 1;画布提示词会列出启动清单里的插件(已挂载过的标 ✓)并教这两个操作。 - 主对话与专属对话都可以 —— 画布自带的对话框一直可以;现在任意会话里的
[canvas]块也会被对话行监听器拾取并应用(与[taskcard]建卡同一条路径),作用于块里指名的画布("canvas": "名字或 id",不存在就创建)或当前画布,任务台上出现可点击的提示,点它直接打开那块画布。 - 嵌入约定 —— 插件发布
globalThis.__DSH_<去掉 dsh-plugin- 的 ID>__.mountEmbedded(host, api),api提供render(独立 React root)、dark与onStatus(显示在项头部的实时徽标上:待挂载 / 加载中… / 已挂载 / 未挂载)。mount(host, api)与纯函数形式也接受。 - 一次加载、多处挂载 —— 客户端包每会话只取一次,同一插件每个项各挂自身宿主(无 iframe、无第二份 React);
⟳或rebuild换新修订号 → 重新取包并重新挂载,且修订号保证严格递增。 - 失败也说得清楚 —— 没有嵌入入口 / 启动清单里没有 / 加载失败时显示写明期望全局名与示例的说明面板,而不是空白框;选择器还会列出插件管理端口报告的动态插件。
- 顺带修掉 —— 平面上有插件项 / 内嵌应用时切换画布会触发的两个拆除问题(插件宿主节点的卸载顺序、桥接通知抹掉页面标题)。
另外包含此前未发布的改动:画布对话新增的控件会被收养回对应卡片(canvasAdoptItems),以及内置预设卡「工作时序」(承载 dsh-plugin-tpt-chronicle 面板)。
Install / 安装
dsh plugin --profile web add dsh-task-console # npm(发布后)
dsh plugin --profile web add ./dsh-task-console.tgz # 本 Release 的预构建 tarballFull changelog / 完整变更记录: CHANGELOG.md · README: README.md
v0.22.0 — plugin market listing
dsh-task-console v0.22.0 — plugin market listing
Flip the page over to a glass task console: live background jobs, subagents, session and workspace cards on a draggable board, an infinite canvas that unrolls a card into its own controls, embedded web apps, multi-user collaboration over a bundled relay, an archify architecture dock, and a conversation box that edits the canvas in place.
Install
# from this release's prebuilt tarball (no build step, no build approval)
dsh plugin --profile web add https://github.com/He2way/dsh-task-console/releases/latest/download/dsh-task-console.tgz
# from the repository
dsh plugin --profile web add github:He2way/dsh-task-consoleThen restart dsh web (or refresh) and flip the page with the ⇄ 任务台 toggle.
Highlights in this release
- Cards are a thumbnail of their controls:
⛶unrolls a card onto its own canvas, where each control is a draggable, editable item and the card follows the arrangement. - The canvas takes any control, not only cards (
+ 控件), and has its own centred conversation box for language-driven edits ([canvas]operations, reported back with a summary). - Embedded web apps on cards (sandboxed
http(s)frames) with a drag-to-resize edge. - Every card can go fullscreen, including inside a canvas instance.
- The main composer can collapse into a logo chip while the board is open.
- Zero-dependency collaboration relay in
relay/server.mjs(rooms, snapshot, presence, LWW merge).
Verification — npm test (SSR + protocol + store), npm run test:relay (WebSocket protocol), npm run verify:embed and npm run verify:diagram (headless-Chrome end-to-end runs, including real pointer gestures and the embedded diagram frame).
Listed in the community DSH plugin markets as He2way/dsh-task-console (category ui). MIT licensed.