Skip to content

Releases

v0.3.0 —— 斜杠命令 + ↑/↓ 历史指令回填

Choose a tag to compare

@TiChuXiXi TiChuXiXi released this 10 Oct 09:11

把作者早期两个插件里最常用的两件事收进本插件 —— 都是同一作者、MIT,来源已在源码注释与 README 里标注。

斜杠快速命令(移植自 dsh-command-md)

~/.dsh/commands/<名字>.md 一个文件一条全局斜杠命令,命令名就是去掉 .md 的文件名(文法与官方注册表逐字一致:/^[a-z][a-z0-9_-]*$/)。

---
description: 审查当前工作区的代码改动
input-hint: 可选的补充说明
---

请审查当前工作区的代码改动,重点关注潜在 bug 和安全问题。

$ARGUMENTS
行为 说明
frontmatter 读 description(发现界面里的说明)与 input-hint(输入提示),其余键忽略但容忍
$ARGUMENTS 换成用户敲在命令名后面的原始参数;没有这个占位符时正文原样发出
改文件立即生效 正文是每次调用时重新读盘的,不用重启
新增 / 删除文件 需要重启 dsh web 才反映(注册是启动时扫一遍目录)
执行结果 正文作为一条普通用户消息交给 agent,与用户自己把这段话敲进输入框等价,不是系统注入

走官方 ctx.commands.register(),所以发现、补全、command/run / command/done 生命周期事件全归官方。与 app 级命令(/goal 之类)重名时只跳过这一条并告警,不会把其余命令一起带走。

↑/↓ 快速切换历史指令(移植自 dsh-message-jump)

在输入框里按 ↑ 翻出本会话里自己敲过的指令,再按 ↑ 往更早走,↓ 往新的走。第一次 ↑ 时当前草稿会存起来,一路 ↓ 翻回最新一条之后再按 ↓(或按 Esc)就原样还回来。穿梭时输入框上方有一条 历史指令 … ↑↓ 3/12 · Esc 退出 的提示条。

键 接管条件 行为
↑ 光标已贴在草稿最开头(或草稿为空) 进入穿梭 / 往更早一条
↓ 只在穿梭模式里 往新一条;已是最新时还回原草稿并退出
Esc 只在穿梭模式里 还回原草稿并退出
任何真实输入 只在穿梭模式里 立即退出穿梭(打字 / 退格 / 粘贴 / 拖入 / 输入法)
/、@ 候选菜单开着时 —— 一律不抢键(那里 ↑/↓ 是选候选)

数据不是从聊天视图里抠的(那里只有已加载的一窗),而是走新增的 host 端点 history:读 ctx.sessionQuery.readSession() 的完整事件日志,只挑 source.kind === 'user' 的真实用户指令 —— 所以「更早」那些也在,而 AGENTS.md、技能目录、定时提醒这类 agent.inject() 塞进去的系统上下文不在。

回填走官方 inputActions.setDraft() 整条替换草稿:不碰编辑器内部,不自己实现输入框。host 通道取不到历史时 ↑/↓ 完全不接管 —— 宁可这个功能静默失效,也不能让用户觉得键盘坏了。

dsh-message-jump 另一半的悬浮指令导航条没有收进来。

其余变化

  • 新增 lib/commands-md.js:命令文件的纯解析层(frontmatter / $ARGUMENTS / 目录扫描),零依赖,可脱离 DSH 单测。
  • index.js 新增 RPC history 与命令注册;lib/client.js 新增 conversation.input.dock 占位。
  • commands / sessionQuery 刻意不写进 inject:ctx.get() 懒取,缺席只让对应功能降级或报错,不会把整个插件挡在门外。

验证

  • node scripts/selftest.mjs —— 47/47(上一版 35),新增命令文件解析、history 端点过滤、handler 消息形状。
  • node scripts/dom-probe.mjs —— 83/83(上一版 70),新增 dock 注册与 ↑/↓ 全套键位断言(接管条件、边界、stash、Esc、菜单让键、通道失败降级、发完消息后重拉)。
  • 拿真实会话日志核对过 source.kind 过滤:38 条 user/message 里只有 11 条 kind 是 user(正是人工输入),其余 27 条是 time-context / runtime-context / skill-catalog / agent-instructions / compact-checkpoint / user-approval。
  • 拿真实 ~/.dsh/commands 目录核对过扫描结果:4 条命令全部正确解析,$ARGUMENTS 替换生效。

安装

dsh plugin --profile web add dsh-file-extras@0.3.0

装完重启 dsh web(host 半区是进程内代码)并刷新页面(客户端 bundle 在插件激活时读入)。

v0.2.0

Choose a tag to compare

@TiChuXiXi TiChuXiXi released this 10 Oct 05:47

0.2.0 —— 右键「@ 到对话」

文件 / 文件夹的右键菜单新增 @ 到对话:把路径以官方引用芯片的形式插进当前对话的输入框。
只插入、不发送 —— 后面还要接着写字,替你按发送键是越权。

多选时一次插一批(@ 到对话(N 项))。

没有重新实现「对话里 @ 文件」

芯片交给官方会话自己的 Lexical 编辑器插:

ctx.conversation.input.for(actx).addFiles(references, [])

和「把文件拖进输入框」是同一条路,所以序列化(模型看到的文本)、点击芯片在右侧栏预览、
草稿持久化、发送时展开,全部沿用官方行为。

本插件只做两件事:从文件树认出用户点了哪个路径、拼出和官方 @ 补全逐字一致的提及文本
(复刻 @deepseek-ai/dsh-file-reference 的 formatFileMention):

情况 提及文本
文件 @src/index.ts
目录 @src/
含空格的文件 @"my notes.txt"
含空格的目录 @"my docs/(引号故意不闭合,官方语法如此)

路径按「相对会话工作区根 + 正斜杠」给(官方候选就是这个形式,模型也按这个解析);
会话工作区与树根不一致时退回绝对路径,不硬拼一个错的相对路径。

「当前对话」取 ctx.sidebarRight.mounted。conversation / sessions / sidebarRight
三个服务是点击那一刻 ctx.get() 的,没有写进 dsh.client.inject —— 缺一个只让这一项报错,
不会拖垮元数据 / 菜单 / 删除。拿不到会话、会话没被 retain、输入框正忙(正在提交)、
路径含无法表示的字符,都明确报错,不静默失败。

菜单全貌

位置 菜单项
文件 下载 / @ 到对话 / 复制路径 / 删除
文件夹 上传文件到此处… / @ 到对话 / 复制路径 / 删除
空白处 上传文件到此处… / 复制路径 / 刷新大小与日期 / 全选可见项(有选择时再加 清除选择 与 删除 N 项)

验证

  • host 半区 node scripts/selftest.mjs —— 35/35(真文件系统 + 三套回收站后端)
  • 浏览器半区 node scripts/dom-probe.mjs —— 70/70(headless Chrome 里跑真实 lib/client.js,本次新增 12 条)

新增断言覆盖:文件 / 目录 / 多选三种菜单形态、引用字段逐字段比对、
for() 拿到的正是 sessions.scope 借出的那个 context、带空格的文件与目录、
以及四条失败路径(没有打开的对话 / 会话没被 retain / 输入框正忙 / 工作区不一致)。

顺带修掉的坑

scripts/dom-probe.mjs 里页面探针是一整个模板字面量,注释中写反引号会把它提前截断,
pageScript 静默变成 串 / 串 / 串 = NaN,表现成「探针没有返回值」,极难反查。
已清掉反引号并加了 typeof pageScript !== 'string' 的当场拦截。

安装 / 升级

dsh plugin --profile web add dsh-file-extras@0.2.0

装完重启 dsh web(host 半区是进程内代码)。


0.1.0 以来的全部变化

  • 删除(文件夹 / 单文件 / 多文件):二次确认框逐项列出「是什么、多大、文件夹含多少内容」,
    默认移到回收站(可还原),「永久删除」藏在默认不勾的复选框后面。
    回收站是三套真实后端:Windows SHFileOperation、Linux freedesktop Trash 规范、macOS ~/.Trash;
    回收站不可用时报错,绝不静默降级成永久删除。
  • 多选:Ctrl/⌘ 切换、Shift 区间、空白处「全选可见项」,Esc 分层收(确认框 → 菜单 → 选择)。
  • 大文件流式传输:下载改成 stat 预检 + <a download> 原生导航(不再 fetch → blob,
    内存零拷贝、无大小上限、立即开始);上传请求流直接落盘,先写 .part-<uuid> 再原子 rename。
  • 修改日期统一为 YYYY-MM-DD HH:mm:ss。

v0.1.0

Choose a tag to compare

@TiChuXiXi TiChuXiXi released this 09 Oct 07:22

dsh-file-extras v0.1.0

DSH Web GUI 的工作区文件树增强插件(首发版)。

功能

  • 文件/文件夹行尾显示大小与修改日期(1.2 KB · 2026-03-04 13:06:07,宽 1024 进制自动选单位)
  • 文件右键:下载 / 复制路径
  • 文件夹右键:上传文件到此处… / 复制路径
  • 空白处右键:上传 / 复制路径 / 刷新大小与日期
  • 树外右键一律不接管,浏览器默认菜单照旧
  • 窄栏自动把元数据换行到名字下方,时间戳完整不截断

安装

dsh plugin --profile web add dsh-file-extras

装完刷新页面生效。

自检

  • node scripts/selftest.mjs —— host 半区,18 个用例(真文件系统)
  • node scripts/dom-probe.mjs —— 浏览器半区,headless Chrome,35 条断言