jasper-zsh
dsh-plugin-skill-panel
DeepSeek Harness(DSH)的只读技能清单插件,在 Web GUI 中展示全局技能和当前会话可见的技能,并从会话日志推导技能加载状态。
- Stars
- 0
- Language
- TypeScript
- Created
- Aug 14, 2026
- Updated
- Aug 14, 2026
Introduction
dsh-plugin-skill-panel
DeepSeek Harness(DSH) 的只读技能清单插件,在 Web GUI 中展示全局技能和当前会话可见的技能,并从会话日志推导技能加载状态。
功能
- 会话技能视图:在会话顶部视图栏增加“技能”页签,按“项目技能”和“全局技能”分组。
- 全局技能清单:在设置面板增加“技能”页面,只显示默认 Agent Preset 可见的非项目技能。
- 只读展示:没有加载、刷新、启停等操作按钮;清单每 15 秒自动更新一次。
- 技能详情对话框:点击任一技能行,在模态对话框中查看技能说明和入口正文,不再占用列表行内空间。
- 技能文件浏览器:对话框左侧以树形结构展示入口正文明确引用的本地资源,右侧按需读取并显示 UTF-8 文本文件内容。
- 安全读取边界:不枚举可变目录;仅允许读取安全清单中的文件,打开时限制在 backing
SKILL.md目录内且不跟随符号链接。单文件最大展示 1 MiB,文件树最多 1,000 项。 - 会话排序:会话页每个技能分组中的自定义技能固定排在该分组末尾。
- 状态推导:展示“可用 / 已加载 / 加载中 / 加载失败 / 仅手动 / 已禁用”。
- 来源标记:区分项目
.dsh、项目.agents、全局.dsh、全局.agents、内置、自定义和运行时来源。 - 静态 TypeScript 双端插件:Host 查询 DSH 技能注册表和会话事件,Client 只接收最小化 JSON 数据。
当前 DSH 没有可追加的通用右侧详情页签槽位;
details只服务于选中的 Tool call。插件因此使用官方的conversation.view加性槽位作为独立会话页面,不会替换详情栏或聊天界面。
状态含义
| 状态 | 含义 |
|---|---|
| 可用 | 当前会话目录可见,允许模型通过 skill 工具加载,但本会话尚无成功加载记录。 |
| 已加载 | 会话日志中存在成功的 skill 工具结果,或存在用户显式技能调用注入。 |
| 加载中 | 已记录 skill 工具调用,尚未记录配对结果。 |
| 加载失败 | 最近一次加载尝试失败,且本会话此前没有成功加载记录。 |
| 仅手动 | 不允许模型调用,但允许用户显式调用。 |
| 已禁用 | 模型和用户调用策略均关闭。 |
“已加载”不是 DSH Skill Registry 的原生字段,而是插件根据持久化的 tool/call、tool/result 和 skill-invocation 会话事件推导。
项目结构
src/
├── index.ts # Host 入口和只读 HTTP 端点
├── catalog.ts # 技能目录查询、作用域解析和加载状态折叠
├── services.ts # 插件使用的 Host 服务结构类型
├── types.ts # Host/Client 共享 JSON 类型
└── client/
├── index.tsx # Web Client 入口与槽位注册
├── api.ts # 同源技能目录请求
├── components.tsx # 会话及全局只读清单
└── styles.ts # 主题变量驱动的紧凑列表样式
构建输出:
lib/index.js:Host ESM;lib/client.js:DSH Web lazy-CJS Client bundle。
开发
pnpm install
pnpm typecheck
pnpm build
pnpm dev
pnpm dev 使用 tsdown --watch 持续重建 Host 和 Client bundle。Web profile 还需要启用 Cordis hmr 行,并将本仓库的 realpath 加入 hmr.config.root。Client bundle 由 DSH client-hmr 的轮询与 SSE 通道热替换;首次新增插件到 profile 后需要刷新一次页面,后续 Client 修改无需刷新。
安装到 Web profile
dsh plugin --profile web add "$PWD"
在 ~/.dsh/profiles/web/cordis.patch.yml 中加入:
- insert:
- id: skill-panel
name: dsh-plugin-skill-panel
- id: hmr
disabled: false
config:
root:
- .
- /absolute/real/path/to/dsh-plugin-skill-panel
HTTP API
| 请求 | 说明 |
|---|---|
GET /skill-panel/catalog.json | 默认 Agent Preset 可见的全局技能。 |
GET /skill-panel/catalog.json?sessionId=<id> | 指定已附着会话可见的项目/全局技能及加载状态。 |
GET /skill-panel/detail.json?name=<name> | 读取全局技能正文和声明资源文件树。 |
GET /skill-panel/detail.json?name=<name>&sessionId=<id> | 读取指定会话可见技能的正文和声明资源文件树。 |
GET /skill-panel/file.json?name=<name>&path=<relative-path> | 读取全局技能安全清单中的 UTF-8 文本文件。 |
GET /skill-panel/file.json?name=<name>&path=<relative-path>&sessionId=<id> | 读取指定会话技能安全清单中的文本文件。 |
所有响应使用 Cache-Control: no-store。API 不返回绝对路径;文件端点拒绝目录穿越、符号链接、非 UTF-8 文件和超过 1 MiB 的文件。