READMESource: main@05533978
Action Hub
给 DSH 加一个 Spotlight 式的 Action 收藏夹:常用提示词与流程,搜一下就插进输入框,不占上下文、不会被 Agent 自动调用。

为什么需要它
把常用提示词写成 Skill,会同时遇到两个问题:
- 常驻上下文:每个 Skill 的名称与描述都会进入系统提示,收藏越多,日常对话要付的 token 就越多。
- 被动触发:Agent 会自己判断要不要调用。像「git-svn 推送」这类流程,你只想在自己需要时执行,甚至不希望 Agent 碰它。
Action Hub 把「收藏」和「调用」分开:
- 零上下文占用:不注册 Agent Tool,不向 system prompt 写入任何内容。收藏夹再大,每轮请求都是 0 token。
- 只由你触发:
Alt + A(macOS 为⌥ + A)或输入框工具行的按钮打开面板;选中后以引用插入(对话里只显示 Action 名),按 Enter 才发送。 - 可整理、可分享:分类、标签、置顶、全文搜索、单条或按选择导出 ZIP/文件夹、整库导入导出。
界面
| 命令面板 | 管理库 |
|---|---|
![]() |
![]() |
| 搜索、分类、实时预览、参数输入,全键盘操作 | 左侧分类导航 + 搜索排序 + 紧凑列表 + 详情 |
| Action 详情 | 设置 |
|---|---|
![]() |
![]() |
| 完整正文、标签、使用次数、复制/编辑/删除 | 插入行为、快捷键、输入框按钮与数据位置 |
功能
| 能力 | 说明 |
|---|---|
| Spotlight 面板 | Alt + A(macOS ⌥ + A)或输入框工具行按钮;搜索、分类 Tab、实时预览、参数输入 |
| 键盘优先 | ↑↓ 选择、Enter 插入、Ctrl/⌘+Enter 插入并发送、Tab 切换分类、Esc 关闭 |
| 引用式插入 | 无参数时插入 Action 引用 chip:输入框和对话里都只显示 Action 名,正文由插件在发送时注入给模型;不注册任何 Skill |
| 快捷键可改 | 在 设置 → 通用设置 → 快捷键 中修改;默认 Alt + A(Web 注册器不接受单修饰键,未绑定时由插件直接响应,绑定后交给 DSH) |
| 光标处插入 | 使用宿主 inputActions.insertText(),作为一次可撤销编辑插入光标处,不覆盖已有草稿 |
| 置顶 | 星标常用 Action,面板与列表都排在最前 |
| 管理库 | 分类导航与计数、全文搜索(名称/描述/分类/标签/正文)、按最近使用/名称/创建时间排序 |
| 参数占位符 | {{args}} / $ARGUMENTS 由面板参数替换,{{date}} 替换为当天日期 |
| 资源文件 | 每条 Action 可附带代码、模板、说明等本地文件;调用时小文本内联,大文件给出本地路径按需读取 |
| 默认导入助手 | 内置一条「Action 导入助手」Action:把指定 Skill 目录或一段文本整理成可导入的 Action 包 |
| 导入 / 导出 | 导入单条/整库的文件夹或 ZIP;导出单条、按勾选导出或整库 ZIP |
| 分享 | 单条 Action 或整库导出为 ZIP / 文件夹;对方导入 ZIP、文件夹或 JSON 即可;每条 Action 都是一个自包含目录 |
| 快捷命令 | /action <名称> [参数] 直接运行;不带参数时列出全部 Action |
安装
Action Hub 是一个 DSH bundle(Host 半 + Web 半,无构建步骤、无运行时依赖)。
从插件市场安装(收录完成后):DSH → 插件市场 → 搜索 Action Hub → 安装 → 启用。
从 GitHub 源码安装:
dsh plugin --profile desktop add "github:AhaCrazy/dsh-action-hub#main"
从本地目录安装(开发/未上架时): DSH → 插件 → 添加插件 → 填入本目录的绝对路径 → 安装 → 启用 → 刷新页面。
安装后侧边栏出现 Actions 图标,会话输入框工具行最左侧出现 Action Hub 按钮。
使用
打开面板
- 快捷键:
Alt + A(macOS 为⌥ + A),可在 设置 → 通用设置 → 快捷键 中改为自己喜欢的组合 - 管理页快捷键:
Ctrl + Alt + A(macOS⌘ + ⌥ + A),同样可在通用设置的快捷键里重绑 - Action Hub 设置页会集中显示这两个快捷键的当前绑定;DSH 通用设置的快捷键分组是固定的,没有插件分组接口,因此条目会归在「应用操作」下,并带有
Action Hub:前缀 - 或点击输入框工具行最左侧的图标
- 面板里可以直接输入关键词搜索,
↑↓选择、Enter插入
插入与发送
Enter或点击「插入」:插入光标处,作为一次可撤销编辑;已有草稿保留。- 未填参数时以引用插入:输入框显示
@Action 名的 chip,对话里也只显示 Action 名;完整正文由插件在发送时注入给模型,不会刷屏。 - 填了参数时以完整正文插入:
{{args}}已替换为你的参数。 Ctrl/⌘ + Enter或点击「发送」:插入后立即发送当前草稿。
保存内容
- 默认导入助手:库里内置一条「Action 导入助手」。给它一个 Skill 目录,它会读取
SKILL.md和资源、按 Skill→Action 的差异转换;给它一段文本,它会整理成可复用的 Action。两者都会产出一个 Action 包目录,之后用下面的「导入」导入。 - Action 包导入:管理库 →「导入」→「Action 包」→ 选择包含
action.json的文件夹,或选择.zip。导入前会先预览每个 Action:可以逐项选择跳过、导入为新 Action、或更新本地副本;重复内容默认跳过,本地改过的副本默认保留。内容用指纹比对,因此重复导入同一个 ZIP 不会产生副本。 - 新建/编辑:管理库右上角「新建 Action」,或列表行的编辑按钮。
资源文件
- Action 目录里的
files/就是资源目录;代码、模板、文档直接放进文件浏览器里的这个目录即可,插件不提供上传/删除按钮。 - 编辑器里只只读展示
files/的目录树;新增/删除文件后刷新管理库即可看到。 - 新建 Action 默认是纯文本;需要附件时,保存后在
~/.dsh/dsh-action-hub/actions/<id>/files/里放文件。 - 调用 Action 时:小文本文件直接内联到
<action_content>;较大的或二进制文件只列出本地绝对路径和大小,模型按需读取。 - 资源只在调用时进入上下文;收藏夹本身依然不占上下文。
- 资源随 Action 一起导出/导入。
整理
- 分类是自由文本;左侧导航自动汇总并显示数量,「管理分类」可重命名/删除。删除分类会二次确认并显示该分类下还有多少 Action;删除后它们移到未分类,Action 本身保留。
- 星标置顶;搜索支持名称、描述、分类、标签和正文。
分享与备份
- 每条 Action 是一个自包含目录:
~/.dsh/dsh-action-hub/actions/<id>/ action.json 元数据、prompt、资源清单 files/... 资源文件 - Action 详情里可以导出 ZIP(单条 Action)。
- 管理库顶部的「导出」会打开选择列表:勾选要一起导出的 Action(默认全选),再下载所选 ZIP;只备份时直接备份
actions/即可。 - 导入 → 「Action 包」:选择文件夹(单个 Action 或整个库)或
.zip,先看预览再执行;可以逐项选择跳过/新建/更新。重复内容按内容指纹识别,不会因重复导入同一 ZIP 而增加副本。 - 旧版整库 JSON 仍可导入(导入 → 粘贴 JSON / 选择 JSON 文件)。
设计
- Host 半(
index.js+store.js+resources.js+bundle.js):每条 Action 一个目录(actions/<id>/action.json+files/),逐条原子写入;同源/api/dsh-action-hub路由;/action人类命令。命令通过sessionController.prompt(..., mode: 'queue')提交一条source.kind = 'user'的真实用户消息。 - 引用机制:输入框里显示 Action 名 chip,draft 的序列化文本仍是不透明的
/ah-…标记;参考源 codec 负责把 chip 写回标记。Host 在agent/pre-step把 direct user message 中的标记展开成一条<action_content>注入消息交给模型。不注册任何运行时 Skill,所以技能目录、/菜单、上下文面板的技能列表里都不会出现 Action;durable log 保留标记,对话里因此也只显示 Action 名。若 Action 带资源文件,同一注入消息里会附带<action_resources>:小文本内联,其余给路径。 - Client 半(
client.js):注册conversation.input.left工具行按钮、conversation.input.overlay会话桥、shell.overlay命令面板、main管理库、侧边栏图标与settings.section设置页。 - 明确不做:不注册
ctx.tools,不调用ctx.systemPrompt.section();Action 只在用户明确引用时通过agent/pre-step注入一条上下文消息,收藏夹大小与每轮上下文无关。
数据与隐私
- 数据保存在
~/.dsh/dsh-action-hub/actions/<id>/($DSH_HOME下):action.json是元数据/正文,files/是资源文件;写入采用临时文件 + 原子重命名。旧版actions.json会在首次启动时迁移,旧文件改名为.migrated-*保留;旧的~/.dsh/action-hub目录也会在首次启动时自动改名为dsh-action-hub。 - 设置页显示
~/.dsh/...而不是带用户名的绝对路径。 - 插件只与本机 DSH Host 通信(同源
/api/dsh-action-hub),不发起任何外部网络请求。 - ZIP/文件夹/JSON 导出都包含正文、分类、标签、置顶状态与资源文件;不包含使用次数等本机统计。分享前请检查正文和资源文件是否含内部信息。
兼容性
- 面向 DSH 桌面版 / Web UI
0.2.x(插件 API 仍处于预览期)。 - 管理库与面板需要 Host 的
webServer服务;/action命令额外需要commands与sessionController,缺失时安全降级。 - 更新插件文件后刷新页面即可加载新的
client.js;Host 改动需要重新加载 bundle。
开发
node --check index.js
node --check client.js
node --check store.js
npm test
tests/store.test.mjs:数据模型、占位符、置顶排序、导入合并、原子持久化。tests/client.test.mjs:捕获window.__ModuleLoader__注册、纯函数与语言字典完整性,并断言不注册 tool / prompt。tests/host.test.mjs:同源校验、导出裁剪、/action参数解析。
dsh-action-hub/
├── package.json # bundle 清单 + dsh.bundle / dsh.client
├── cordis.patch.yml # Loader 行(可配 seed / dataDir)
├── index.js # Host:路由 + /action 命令
├── store.js # 收藏库、数据模型、导入合并
├── client.js # Web:命令面板 / 管理库 / 设置 / 工具行按钮
├── locale/{zh,en}.json # 插件管理器展示名
├── assets/screenshots/ # 商店截图
├── screenshots.json # 商店截图清单
├── store/ # awesome-dsh-plugin 收录条目
├── tests/
└── CHANGELOG.md
License
MIT © 2026 AhaCrazy



No comments yet. Be the first to write one.