Skip to content

Releases

v1.2.1 · 界面对齐 dsh

Choose a tag to compare

@YUYUY9527 YUYUY9527 released this 23 Sep 07:06

修复

界面与 dsh 字体不一致、整体不够清爽:

  • 字体改用 dsh 自己的设计变量 —— 正文 --dsw-font-family、等宽 --ds-font-family-code、小字号 --dsw-font-xs-13。此前没有声明正文字体、等宽写死 ui-monospace(Windows 上会退化成 Courier),所以一眼看着「不是 dsh 的字」。
  • 安装命令单行省略号截断:长 github: spec 不再折行把「复制」挤到下一行;完整命令挂在悬停提示(title)上。
  • 徽标与操作合并为右侧固定一列:不换行、跨行对齐;行内边距/圆角/字号与设置页其它 tab 对齐。
  • 顶部信息行压缩为 profile · 外部插件 N · 已核对最新版本(目录移入悬停提示),底部说明缩短为一行。

升级

pnpm --dir "$env:USERPROFILE\.dsh\profiles\web" update dsh-plugin-management

纯客户端(样式)改动,客户端 bundle 会热加载;若没变化刷新一次页面即可,不必重启 dsh。

v1.2.0 · 卸载按钮 + 四项修复

Choose a tag to compare

@YUYUY9527 YUYUY9527 released this 23 Sep 06:54

新增

  • 每行的「卸载」按钮:点一下变「确认卸载」,4 秒内再点一下才执行(破坏性操作不做单点即触发)。走 dsh plugin --profile <p> remove <pkg>,官方转发器会同步把包名从 dsh.profile.bundles 摘掉,避免残留 bundle 行导致下次启动报错。结果面板提示重启 dsh 后才真正不再加载。
    host 侧必须点名:不带 names 一律拒绝;只允许该 profile 里真实存在且非官方的依赖。模型工具同步支持 action="uninstall"。
  • config.sandboxMode(默认 danger-full-access)。

修复

  • 沙箱可写根与 workdir 对不上 → 一键更新必失败:之前没给 ShellExecRequest 传 sandboxPolicy,执行器按 dsh 自己的可写根跑,而 pnpm update 要写 pnpm store(如 D:\.pnpm-store\v11,不在任何 profile 目录里)→ 即使沙箱健康也会在写 store 时 Access is denied。现在显式传 { mode, workspaceRoot: workdir }。
  • 执行器/沙箱不可用不该让整条链路崩:此前只有「shell 服务没挂载」才退 child_process;现在 shell.run() 的任何 rejection(含 SANDBOX_UNAVAILABLE)都归入「执行器不可用」走同一条兜底并留告警。沙箱明确 denied 不兜底(那是策略,不是故障)。
  • 客户端吞异常:版本检查那次请求的 .catch(() => null) 会把任何后端异常变成一句无辜的「未检查」→ 现在把失败原因显示在面板上。
  • registerTool 被调两次:第二次必然抛 tool "external_plugins" is already registered → 只调一次。
  • 同类隐患一并堵掉:void mount() 与 webServer handler 两处 fire-and-forget promise 补 .catch —— 未捕获的 rejection 在 Node 22 默认策略下会直接终止 dsh 进程。

升级

pnpm --dir "$env:USERPROFILE\.dsh\profiles\web" update dsh-plugin-management
# 或
dsh plugin --profile web add github:YUYUY9527/dsh-plugin-management#v1.2.0

装完重启 dsh。

sha256(dsh-plugin-management-1.2.0.tgz) = EEFAF94DC72B7DA8470FB4747F3D8F809E74DB9FC6569E230336AC640D370CB5

v1.1.0 · 每行显示安装命令

Choose a tag to compare

@YUYUY9527 YUYUY9527 released this 22 Sep 07:52

新增

每个插件下方显示自己的安装命令 —— 一行可直接复制的 dsh plugin --profile <profile> add …,右侧带「复制」按钮(点一下即复制,1.5 秒内显示「已复制」);命令本身 user-select: all,点一下全选也能 Ctrl+C。

命令怎么拼:

依赖来源 生成的命令 为什么
registry 包,已知最新版 dsh plugin --profile web add <name>@<latest> 等价于把该包升到最新
registry 包,未知最新版 dsh plugin --profile web add <name> 装最新
本地链接 / file: dsh plugin --profile web add link:… / file:… 原样复用依赖里的 spec,不会把来源换成 registry
github: / tarball URL dsh plugin --profile web add github:… / https:… 同上,命令可复现

profile 跟随面板当前选中的 profile(含「自动」解析结果)。该字段同时出现在模型工具 external_plugins 的 action=list 结果里(installCommand)。

升级

dsh plugin --profile web update dsh-plugin-management   # 跟随 main 的安装会刷新到最新
# 或
dsh plugin --profile web add github:YUYUY9527/dsh-plugin-management#v1.1.0

装完重启 dsh。

v1.0.1 · 修复模型工具未注册

Choose a tag to compare

@YUYUY9527 YUYUY9527 released this 20 Sep 10:11

修复

  • 模型工具 external_plugins 在 1.0.0 里从未注册:createToolSpec() 把 JSON Schema 形态的参数喂给 defineTool()(报 parameters.type must be a value schema object),回落时又把 author-only 的 output.schema: { type: 'json' } 交给 ctx.tools.register(),被 assertSupportedJsonSchema 拒绝(raw 形态里 json 非法,等价于 {})。两次失败都只写一行日志 —— 工具静默消失。
    现在 DSL 交 defineTool、raw 交 register,两条路各有回归测试钉住。
  • 参数非法时统一返回 JSON { ok: false, error },不再从 execute 抛错。

新增

  • host 把工具注册状态随 /inventory 回给面板:若工具没注册上,「外部插件」页会直接显示 模型工具未注册:<state>(<原因>),不必去翻 dsh 日志。

安装 / 升级

# 升级已装的版本
dsh plugin --profile web add github:YUYUY9527/dsh-plugin-management#v1.0.1

# 或按 tarball 安装(本 Release 资产)
dsh plugin --profile web add https://github.com/YUYUY9527/dsh-plugin-management/releases/download/v1.0.1/dsh-plugin-management-1.0.1.tgz

装完重启 dsh。面板与 external_plugins 工具都应可用(面板底部会显示工具注册状态)。

v1.0.0 · 外部插件管理器

Choose a tag to compare

@YUYUY9527 YUYUY9527 released this 20 Sep 09:44

首个公开发布:dsh-plugin-management —— 外部插件管理器(DeepSeek Harness / dsh 插件)。

安装

# 从 GitHub 直接装(纯 JS,无构建步骤)
dsh plugin --profile web add github:YUYUY9527/dsh-plugin-management

# 或就地安装本 Release 的 tgz(锁定版本 / 内网分发)
dsh plugin --profile web add ./dsh-plugin-management-1.0.0.tgz

装完重启 dsh,然后打开 设置 → 插件 → 外部插件。

这个版本有什么

  • 清单:该 profile 的所有外部依赖 —— 已装版本、版本范围、是否生效为插件层(dsh.profile.bundles)、registry 包还是本地 link:
  • 版本检查:pnpm outdated --format json,区分「范围内可更新」与「需 --latest 的跨大版本升级」
  • 一键更新:单个 / 全部 / 跨大版本三种粒度;走 dsh plugin --profile <p> update(官方转发器,会顺带校正 bundles),dsh 不在 PATH 时回落 pnpm update
  • 模型工具 external_plugins:action=list | update,agent 自己就能查与更新
  • host API:GET /dsh-plugin-management/api/inventory、POST /dsh-plugin-management/api/update(仅同源)
  • 纯 ESM、零构建、零运行时依赖;29 条 node:test 用例(含打包契约测试)

注意

更新落地 ≠ 生效:就地替换的包要重启 dsh 才会被 Loader 读进进程;面板会把这句话写在更新结果里。