Skip to content

Releases: He2way/dsh-task-console

v0.27.0 — 支持 DSH 0.2.x(不再被判定不兼容而跳过)

Choose a tag to compare

@He2way He2way released this 23 Oct 08:38

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 的预构建 tarball

Full changelog / 完整变更记录: CHANGELOG.md

v0.26.1 — 临时 agent 会话在新版 DSH 上恢复可用

Choose a tag to compare

@He2way He2way released this 22 Sep 11:53

v0.26.1 — 临时 agent 会话在新版 DSH 上恢复可用 / Temp agent sessions work again on newer DSH

症状 / Symptom:画布(和卡片)里的「一句话改画布」输入后报 临时 agent 会话不可用,会话列表里还会慢慢堆出空白的临时会话。

原因 / Cause:客户端 sessions 服务悄悄改了两处契约:

  1. sessions.binding(id) 不再返回任意会话的绑定,而是只借用「已有人 retain」的绑定("Borrow an already-retained binding without extending its lifetime")。插件用 sessions.create 新建的临时会话没有任何人 retain,于是 binding() 一直返回空:会话建出来了、却从未被提示,聊天直接失败。
  2. 会话列表快照不再有 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)

Choose a tag to compare

@He2way He2way released this 22 Sep 11:24

v0.26.0 — 画布内嵌 3D 查看器 / A 3D viewer on the canvas

不用装 Blender:新增 model 控件,把 .glb / .gltf / .obj / .stl 直接显示在画布上(也可以放进卡片,或用 ⛶ 全屏看)。

  • 零依赖、离线可用:查看器是一个自写的 WebGL 页面(viewer/viewer.html,约 44KB),由 npm run embed:viewer gzip 进客户端包(和框图同一套做法),跑在沙箱 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 的预构建 tarball

Full changelog / 完整变更记录: CHANGELOG.md

v0.25.0 — 卡片之间可以连线(工作区上下文共享 + 虚线框)

Choose a tag to compare

@He2way He2way released this 20 Sep 06:41

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 的预构建 tarball

Full changelog / 完整变更记录: CHANGELOG.md

v0.24.2 — 修复:取不到的图片现在会说明并可换成本地图片

Choose a tag to compare

@He2way He2way released this 18 Sep 10:15

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 的预构建 tarball

Full changelog / 完整变更记录: CHANGELOG.md

v0.24.1 — 修复:对话在画布上新建控件失败

Choose a tag to compare

@He2way He2way released this 18 Sep 09:42

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 的预构建 tarball

Full changelog / 完整变更记录: CHANGELOG.md · README: README.md

v0.24.0 — 画布可以承载任何插件

Choose a tag to compare

@He2way He2way released this 18 Sep 06:52

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 的预构建 tarball

Full changelog / 完整变更记录: CHANGELOG.md · README: README.md

v0.22.0 — plugin market listing

Choose a tag to compare

@He2way He2way released this 17 Sep 07:49

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-console

Then 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.