dsh-composer-tweaks: Client-side tweaks for DSH input boxes and sidebar session rows

前言

DeepSeek Harness(DSH)的 Composer 是智能体对话里写提示词、插引用、发指令的主入口。默认界面里 GenUI 小按钮、添加文件 与 添加文件夹 分两条路、输入框只有 Lexical 视图、用户消息按纯文本显示;侧栏会话行的置顶与开窗、子智能体会话树等,也与不少人日常习惯不完全一致。

@jason25417/dsh-composer-tweaks 把上述能力收进一个客户端 bundle:从 0.2.0 起合并了原 dsh-markdown-composer 的全部功能,在不动宿主核心组件的前提下,用槽位与命令扩展输入框和侧栏。下面介绍它做什么、怎么装、怎么用,以及 macOS 混选文件/文件夹为何必须依赖 Host 半。

这是什么

  • 名称:@jason25417/dsh-composer-tweaks(GitHub:Jason25417/dsh-composer-tweaks)
  • 维护者:Jason25417(package.json 作者为 Jason Tu)
  • 分类:客户端(dsh.client.platform: web)
  • 许可:MIT
  • 当前版本(资料中明确):0.2.3;要求 dsh 版本 >=0.2.1-rc.0 <0.3.0,Node >=20
  • 一句话:Composer 与侧栏行的小调整——混选文件/文件夹、GenUI 提示词开关、Markdown 源码/视图与用户消息渲染、侧栏开窗与子会话树等。

若你本机仍单独安装着 dsh-markdown-composer,应与 README 迁移说明一致:不要两个 bundle 并存,否则会重复注册同一批槽位。

核心功能

输入框与加号菜单

  1. 隐藏 GenUI 输入框小按钮(选择器 button[aria-label="GenUI prompt"])。
  2. GenUI 提示词开关进左下角加号菜单:command genui-prompt,菜单项实时显示开/关。
  3. 「添加文件」与「添加文件夹」合并为「文件或文件夹」:command files-and-folders;在 macOS 上由 Host 调原生 NSOpenPanel,可同时多选文件和目录,插入语义与桌面端拖拽一致(@ 引用 chip,文件夹 appearance=folder)。
  4. 输入框下方「源码 / 视图」开关(conversation.composer.dock,order 2):
    - 源码模式:输入框上方等宽 textarea 写 Markdown,实时写回宿主草稿;⌘/Ctrl+Enter 发送。
    - 模式记在 localStorage,key 仍为 dsh-markdown-composer.mode(老用户设置不丢)。
  5. 聊天记录里用户消息按 Markdown 渲染(conversation.user.text.node 的 text 键,priority 0);助手消息仍由宿主渲染。

视图模式是宿主原生 Lexical 输入框(所见即所输);源码模式是等宽面板。宿主 composer 没有浏览器侧 Markdown 富文本层,因此没有输入框内的所见即所得——编译后的 Markdown 体现在发送后的用户消息展示上。

侧栏会话行(0.2.1 起及后续)

  1. 「在新窗口打开」:替换行内原「置顶」按钮;调用 @local/dsh-popout-window 的 POST /popout/open;置顶仍在右键菜单。
  2. Agent 创建标记(0.2.2):非手开会话左侧显示小机器人图标;数据来自 ~/.dsh/session-origin.ndjson,Host 提供 GET /api/dsh-session-origin/list。
  3. 子会话树(0.2.3):有子智能体的父会话左侧显示 ▸,浮层按 subagentCatalog 展开,点节点在对话区打开子会话(不替换官方侧栏组件)。

合并后的菜单与兼容

  • 加号 →「指令」区保留:GenUI 提示词(开/关)、文件或文件夹。
  • 本插件将 composer 的 filePicker 判为不可用以隐藏宿主内置「文件」行;若宿主改实现导致隐藏失败,最坏情况是新旧两个入口并存,能力不丢。
  • 0.2.0 合并说明:inject 为 ['slots', 'locale', 'commandUi'];locale 为扁平点号键;解析器唯一源在 markdown.js。

安装与启用

市场或 SkillHub 目录页 安装后,须完全退出并重开一次 DSH Desktop(Host 半仅在启动时挂载;Client 半可热加载)。未重开就点「文件或文件夹」会提示宿主半未加载。

CLI 安装(README 原文):

dsh plugin --profile <profile> add @jason25417/dsh-composer-tweaks

也可通过 npm、release tarball 或源码 link 安装。卸载示例见 README:

# plugin_manager remove_bundle target=@local/dsh-composer-tweaks

典型用法

一次选多个文件和文件夹(macOS)

  1. 在 Composer 左下角加号菜单选 文件或文件夹(或触发 command files-and-folders)。
  2. 宿主弹出 NSOpenPanel,多选文件与文件夹后确认。
  3. 每一项按拖拽同款规则插入输入框:@相对路径 或带尾斜杠的文件夹 chip;路径含空白时用 @"…" 包裹。
  4. 插件在 shell.overlay 显示帧级 Toast:已插入 N 项 / 已取消选择 / 失败原因;取消时不插入。

非 macOS 上 Host 路由返回 501,error.code 为 unsupported-platform,不假装成功。

Markdown 源码模式

  1. 在输入框下方 dock 切换到 源码。
  2. 从宿主草稿灌入 textarea;编辑时 inputActions.setDraft(value) 实时同步。
  3. 用宿主发送键或 ⌘/Ctrl+Enter(inputActions.submit())发送。
  4. 切回 视图 时,宿主 setDraft 经 resolveDraftInput 把 @路径、/命令 解析回 chip,引用一般不丢。

侧栏

  • 点 在新窗口打开 将当前会话 popout。
  • 带机器人图标的行表示由 dsh-external-bridge / dsh-session-bridge 创建;有 ▸ 的父会话可展开子智能体树。

Host 半接口(混选实现)

浏览器无法一次混选文件与目录,故 macOS 上由 Host 执行与 DSH 自带目录选择器同路的 osascript + NSOpenPanel:

  • 路由:POST /api/dsh-composer/pick(connection.fetch,同源 GUI)
  • 成功:{ ok: true, paths: [{ path, isDirectory }] };取消:paths: []

适用场景与注意

适合谁:长期在 DSH Desktop(尤其 macOS)里写带 @ 引用的提示词、希望输入框更干净、需要 Markdown 源码编辑与用户消息可读渲染,并依赖侧栏开窗与子会话导航的开发者。

运行与信任:插件在当前 DSH 进程权限下执行;安装前应查看 GitHub 源码 与 MIT 许可证。SkillHub 等社区目录为独立生态站点,与 DeepSeek / 幻方无官方从属关系。

已知边界(README):

  • 混选仅 macOS;Windows/Linux 明确 501。
  • 用户消息 Markdown 为子集(标题、围栏代码、引用、单层列表等);表格、嵌套列表按原文显示;HTML 按文本防 XSS。
  • GenUI 隐藏依赖固定 aria-label="GenUI prompt";源码模式隐藏原生输入区依赖 [data-input-scroll] 与 html[data-dsh-markdown-source],宿主改 DOM 时可能双输入区同显,但不坏草稿数据。
  • 插入的是路径引用,不是把文件内容上传到消息体(与普通文件拖拽一致;图片上传预览不在此混选器范围)。

维护者自测:node --test tests/*.test.mjs,README 记载 36 项通过。

结尾

dsh-composer-tweaks 把 Composer 微调、Markdown 输入/展示和侧栏会话行增强收成单一 bundle,减少多插件槽位冲突;macOS 上「文件或文件夹」一条入口覆盖原先分立的文件与目录选择。安装后记得完全重启 Desktop,Host 路由才会生效。

  • 目录页:https://www.skillhub.cn/plugins/Jason25417/dsh-composer-tweaks
  • 源码与说明:https://github.com/Jason25417/dsh-composer-tweaks
羽毛球分组比赛记分
小程序二维码

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

Xiaoye