
dsh-fast-pills
给 DSH Web GUI 的常用话胶囊插件 —— 把反复敲的那些话排在输入框上方,点一下插进草稿;点击留下使用台账,常用的说法还能交给 DeepSeek 认出来。
中文 / English
这是什么
你在 DSH Web 里总会重复输入同一类话:「继续」「把这次改动落成 Spec 文档」「近两周的 Bug 逐个澄清」。这个插件把它们存成胶囊,排在输入框正上方,一次点击就把正文插到光标处;点击本身还会记一条流水,于是「今天按了几次、按了哪颗」也有据可查。
- 给谁用:每天在 DSH 里反复交代同类指令的人。
- 解决什么:省掉重复输入,让常用说法和它的使用情况都留在本机。
- 不做什么:不改页面结构、不替你做决定 —— 插进去的正文改不改、发不发仍由你说了算。
演示
一行胶囊就在输入框正上方:行首圆牌写今天的点击次数(按本机零点切分),它旁边那颗空心 ⚡ 是快捷新增,实心琥珀那颗是快速胶囊,虚线的是分组。分组点开的那一层长在它自己正上方、往左右一起长,撑满这一排才换行;点别处(或点组里任一颗)就收起来。
今日胶囊台账:指标格 + 00:00–24:00 时间线 + 按时间排好的记录列表;鼠标移到色块或某一行,两边互相高亮。
胶囊使用趋势统计:一张小表选区间与胶囊,配「天 / 周 / 月」与区间概览、每日柱状图、日历热力格、每日明细。
胶囊树编辑器:新增、就地改名、拖动排序、拖进拖出分组,一行写完这颗胶囊会在哪儿出现、点一下插什么。
新建一颗胶囊:名字是按钮上的字,「写入什么」是点一下插进草稿的正文(打一个 / 就能挑 Skill),底下选限定工作区。
⚡Super Pillls:左边是发送前给你过目的全文(系统提示词 / 你的偏好 / 会话记录 / 现有胶囊,已遮一遍);右边是模型给的建议,每条都是一张表单,按「新建」才入树。
上面几张都是从真引擎、真浏览器上截的,不是示意图;胶囊内容是为截图临时造的一份。
特性
一点即用
点胶囊把文字插到光标处(插入,不是替换),焦点不离开输入框,一次插入算一次撤销。带 Skill 的胶囊插 /Skill名 正文 ,不带的只插正文。
快速胶囊:点完自己发出去
标成「快速」的胶囊插入后约 1 秒自动提交整份草稿(框里原有的字一起发走),外观是实心琥珀底 —— 适合「继续」这类你本来就要按回车的话。等多久可以在「设置 → 通用」里改成 0.5 / 1 / 2 / 3 秒。
分组与限定:一行装不下的时候
一级条目有两种:一颗可点的胶囊,或一颗可展开的组胶囊。组最多两级;点组胶囊只开合、不插入任何文字,开合状态不写进文件,刷新回到全折叠。展开的那一层长在分组胶囊正上方(两者中线对齐),往左右一起长,撑满这一排的宽度之后才换行;它是一次「挑一颗」的动作,点别处、点分组胶囊自己、或点组里任意一颗(文字插入之后)都会收起来。
胶囊和分组都能限定工作区:只在选中的工作区(含子目录)里出现,一条都不选就是处处可见。可选范围就是页面已经认得的那几个工作区,一枚 chip 一个,不用手打路径;分组的限定与胶囊自己的取并集 —— 任一边命中就显示。
快捷新增:把刚写下的那句话存成胶囊
行首圆牌旁边那颗空心 ⚡ 用来存胶囊:按下去弹的就是「新建胶囊」那张表单(和设置页里是同一张),并且已经替你带上两样东西 —— 输入框里正写着的那句话进了「写入什么」(以 / 开头仍按 Skill 拆开),当前工作区在「限定工作区」里已经选中。填个名字按「新建」,新胶囊落在这一排第一位、不进任何分组。鼠标停在 ⚡ 上会浮出黑底白字的「快捷新增胶囊」。
今日胶囊台账
一横条指标格(今日合计 / 快速胶囊 / 普通胶囊 / 最近一次 / 工作目录),一条 00:00–24:00 的时间线,一份按时间排好的记录列表。跨工作目录统一画在同一条线上,只用两种颜色区分快速与普通。
胶囊使用趋势统计
一张小表选区间与胶囊:第一行是「全部」加没进分组的一级胶囊,第二行起是分组名与组里的胶囊,每颗只出现一处。天按本机时区的当天零点切分,周从周一起算,月按自然月,配「‹ 上一期 / 这一期 / 下一期 ›」。
选「天」时下面画的就是那一天的台账(一天的量用一根柱子说不清楚);选「周」「月」给四张卡:区间概览、每日柱状图、日历热力格、每日明细。
胶囊树编辑器
树里每行写显示名与它会插入什么。双击名字就地改名;点行上的空白开合自己的编辑器;拖动排序,落点画成一条 5px 墨线,胶囊还能拖进拖出分组。删组时会问组里的胶囊一起删还是升到一级,空分组直接删掉。树底下一块 Tips(1 / 2 / 3)把手势说一次。
米白纸 + 纯黑墨
抽屉与插件卡片是一整套纸墨风格:直角、一像素实线、等宽数字、悬浮整块反色。有浅色与深色两张纸;「设置 → 主题与外观」里还能换普通胶囊 / 快速胶囊 / 风格色彩 / 限定标记四支颜色,每支只挑一个色号,悬停、淡底与两处文字色全由它算出来(含实际对比度)。改完立刻生效,也立刻写进本机设置文件。
输入框上那排胶囊行不属于这套纸墨,仍是产品自己的圆角胶囊 —— 它要和输入框旁边的控件站在一起。
⚡Super Pillls:让 DeepSeek 认胶囊
你每发一条消息,插件把用户输入记一条(助手回复从不记录)。点识别之后:读会话记录与现有胶囊 → 遮一遍 → 拼出完整请求给你过目 → 你按「确认发送」才真的发出去 → 模型回 1–3 条建议,每条都是一张「新建胶囊」表单,按「新建」才入树。
- 两道脱敏:记录落盘前遮一遍,出本机前再遮一遍,遮的是你的内容(会话记录 / 现有胶囊 / 自定义提示词);插件自带的那段系统提示词原样过去。
- key 不出进程:key 由宿主半保存与使用,页面只看得见「配没配」和一个指纹(SHA-256 前 8 位),任何路由都拿不回明文。
- 不依赖周围的 DSH:只接 DeepSeek 官方 Messages 端点,模型、端点、提示词、取样参数都在这一页配。
想关就关
侧栏「插件 → dsh-fast-pills」这张卡片上有一颗开关:关掉之后整排胶囊(含行首圆牌)都不再出现,要再打开就回这一页。卡片下面还有三条图文使用说明。
安装
环境要求
| 项 | 要求 |
|---|---|
| DSH | Web GUI ≥ 0.1.5-rc.2(能装 profile bundle 的版本),本仓库在 0.2.0-rc.2 上验收 |
| Node.js | >= 22.19(只有本机自己构建时才需要) |
| 系统 | 跟随 DSH Web:macOS / Windows / Linux 都行,本仓库在 macOS 上验收 |
| 可选 | DeepSeek API key —— 只有 ⚡Super Pillls 需要 |
方式一:命令
# 从 npm 装
dsh plugin --profile web add dsh-fast-pills
# 或直接从 GitHub 装:仓库里带着构建好的 lib/,装的人不需要本机再构建
dsh plugin --profile web add https://github.com/RonnyJung2021/dsh-fast-pills
GitHub 直装靠的是仓库里那份
lib/,别改成「装完再构建」。 pnpm 默认拒绝执行 git 依赖的 构建脚本(ERR_PNPM_GIT_DEP_PREPARE_NOT_ALLOWED),除非本机在 profile 的pnpm-workspace.yaml里把包加进onlyBuiltDependencies。所以构建产物入库、构建挂在prepack上,git 安装既不用构建也不用放行。
装完重启一次 dsh web:宿主半是引擎启动时加载的,只刷新页面看不到新的路由。
方式二:插件页
侧栏 插件 → 添加 bundle → 填 dsh-fast-pills(或上面那个 GitHub 地址)→ 装上并启用。
方式三:本机开发时从工作目录装
node scripts/install-profile.mjs --home /path/to/home # 装
node scripts/install-profile.mjs --home /path/to/home --dry-run # 只打印将改动什么
node scripts/install-profile.mjs --home /path/to/home --uninstall # 卸
它写 profile package.json 里的 link: 依赖与包名、node_modules/<包名> 软链,每个被改的文件
先备份成 *.bak-dsh-fast-pills,并打印它动了哪些路径。三条路都要求那个 home 的 web profile
已经存在(先跑一次 dsh web 就会生成)。
想先拿一份干净的家目录试装(不动日常那个
~/.dsh):
DSH_HOME=/tmp/dsh-clean-home dsh web --no-open --port 0 # 先起一次,生成 web profile
node scripts/install-profile.mjs --home /tmp/dsh-clean-home
DSH_HOME=/tmp/dsh-clean-home dsh web --no-open --port 0 # 终端打印带 ?token= 的地址
首次使用
- 打开任意会话,输入框上方应该出现种子胶囊行:一颗快速的「继续」,一颗组胶囊「常用」(里面是「解释一下」与「总结成要点」)。
- 点「继续」:草稿里出现文字,约 1 秒后自动发出去。
- 点行首圆牌,抽屉从右侧展开,默认停在「今日胶囊台账」,刚才那一次已经在列表里。
- 想存一句刚写下的话:在输入框里打出来,点圆牌旁边那颗 ⚡ —— 表单带着这句话和当前工作区打开,填个名字按「新建」,新胶囊就落在这一排第一位。
要加自己的胶囊:抽屉 →「设置」→「胶囊」→「新增胶囊」。名字是按钮上显示的字,写入什么是点一下插进草稿的正文;在「写入什么」里打一个 / 会列出这个项目已装的 Skill,挑一个就把 /名字 写进去。
卸载
dsh plugin --profile web remove dsh-fast-pills
# 或者从工作目录装的那份:
node scripts/install-profile.mjs --home "${DSH_HOME:-$HOME/.dsh}" --uninstall
插件加载与样式一起消失;数据仍留在本机目录里,要一并清掉就删掉它(见 存储)。
卸载前建议先把胶囊树导出留档 —— 目前还没有导入导出功能,见 Roadmap。
配置
设置都在抽屉的「设置」Tab 里改,改完立刻生效并写进本机 settings.json。API key 不在这个文件里,单独存 secret.json(0600)。
| 项 | 位置 | 默认值 | 说明 |
|---|---|---|---|
| 界面主题 | 设置 → 主题与外观 | 跟随产品 | 浅色米白纸 / 深色黑纸白墨 / 跟随产品 |
| 四支颜色 | 设置 → 主题与外观 | 蓝 #0095FF、橙 #F59E0B、米色系、藏青 #1E3A8A |
每支可挑色板或填 #rrggbb;悬停、淡底与文字色自动派生 |
| 界面语言 | 设置 → 通用 | 中文 | 中文 / English;中文为原文,英文依其翻译 |
| 快速胶囊延时 | 设置 → 通用 | 1 秒 | 0.5 / 1 / 2 / 3 秒 |
| 抽屉宽度 | 设置 → 通用 | 页面的 85% | 70 / 85 / 100 |
| 显示胶囊行 | 插件卡片 | 开 | 关掉后输入框上方整排消失 |
| 模型 | 设置 → ⚡Super Pillls | deepseek-flash |
识别请求用的模型 id |
| 接口地址 | 设置 → ⚡Super Pillls | https://api.deepseek.com/anthropic |
留空回官方端点;只有网关部署需要改 |
| 自定义偏好 | 设置 → ⚡Super Pillls | 预置一段做胶囊的偏好 | 随用户消息发出,只影响语气与措辞,改不了规则与格式 |
| 推理程度 | 更多设置(取样参数) | 低 | 关闭即不思考直接作答;低 / 高 / 最高开启思考,越高越慢 |
temperature |
更多设置(取样参数) | 0.2 |
关掉推理时生效(0–1);开启推理时该参数不生效 |
top_p |
更多设置(取样参数) | 1 |
只在推理模式下生效(下限 0.95);关闭推理时恒为 1.0 |
max_tokens |
更多设置(取样参数) | 4096 |
正文与思考共用这个预算;不够时宿主半自动翻倍重试(最多三次) |
存储
胶囊树、使用流水、会话记录与那把 key 只落在本机文件里,页面不留任何持久副本:
$DSH_HOME/storages/dsh-fast-pills/
├── pills.json # 胶囊树,整份读、整份写
├── usage.jsonl # 使用流水,一行一次,只追加
├── transcripts.json # 会话记录,一个会话一段,每段最多 200 条
├── settings.json # 上表那些设置;不放 key
└── secret.json # 插件自己那份 DeepSeek key,0600,只有本机进程读得到
删掉这个目录即为彻底清空。几个文件都可能坏,且都不至于让插件挂掉:读不动的 pills.json 会被改名留档(pills.json.bak-<时间戳>)并改由种子启动;usage.jsonl 的坏行只跳过那一行;transcripts.json 里坏掉的会话整段丢掉;settings.json 读不动就按默认值。
路由表、数据形状与写入纪律见 docs/storage.md。
结构
dsh-fast-pills/
├── src/
│ ├── index.ts # 宿主入口:Loader 看得到的面
│ ├── shared/ # 两个半边共用
│ │ ├── constants/ # 名字、路径、路由前缀、插槽条目、延时、上限、种子胶囊
│ │ ├── locales/ # zh.json 与 en.json(键必须逐字一致)
│ │ └── utils/ # mask 脱敏、pillRules 插入与可见性、pillTree、usageStats、localTime
│ ├── host/ # 宿主半:路由、文件层、凭据、那一次模型调用
│ │ ├── routes/ # 前缀路由表
│ │ ├── services/ # pillStore / transcriptStore / settingsStore / credentialStore
│ │ └── llm/ # deepseekClient 与 recognition(组装、遮罩、预览、发送)
│ └── client/ # 浏览器半:胶囊行、抽屉、插件卡片
│ ├── components/ # pillRow、quickAdd、drawer、panel、ledgerPanel、trendPanel、pillsEditor、recognizePanel、card…
│ └── constants/ # styles.ts:插件自带的那一张样式表
├── lib/{index.js,client.js} # 两个半边构建产物(仓库里带着,装上即可用;index.js.map 随宿主半)
├── assets/ # README 与插件卡片的配图
├── docs/ # colors.md 配色变量表、storage.md 存储与路由
├── scripts/install-profile.mjs # 装进 / 移出某个 profile
├── build.mjs # esbuild 构建两个半边
└── cordis.patch.yml # bundle patch:装上即生效的那一行
两个半边
| 半边 | 做什么 | 为什么这么分 |
|---|---|---|
宿主(lib/index.js) |
一条前缀路由 /dsh-fast-pills,读写本机那几个数据文件;凭据与那一次模型调用都在这一半 |
key 不出宿主进程,页面任何路由都拿不到明文 |
浏览器(lib/client.js) |
两处入口:conversation.input.dock 里 order: 15 的胶囊行(圆牌 + ⚡ 快捷新增 + 胶囊 + 抽屉),以及插件卡片上的一节(开关 + 使用说明) |
胶囊行要贴着输入框渲染,还要读会话、工作目录与输入框里的草稿 |
实际表现
这一节是给要读代码或复核的人看的;只想装上用的话可以跳过。
| 项 | 值 |
|---|---|
| 产物体积 | lib/index.js 121.6 KB / lib/client.js 336.6 KB |
| 运行时依赖 | 0(只用引擎自己提供的 React 与插槽服务) |
| 单测 | 161 项,14 个文件,约 0.5 s 跑完 |
| 数据落点 | 本机 $DSH_HOME/storages/dsh-fast-pills/,页面不留副本 |
| 兼容 | DSH Web ≥ 0.1.5-rc.2(在 0.2.0-rc.2 上验收),Node ≥ 22.19 |
兼容性
- 只在 DSH Web 里工作:浏览器半注册的是
conversation.input.dock与plugins.bundle.config两个插槽里的条目。 - 只接 DeepSeek:官方 Messages 端点,默认模型
deepseek-flash;其他模型与网关未经验证。 - 已知限制:
order: 15夹在目标提示(10)与队列面板(20)之间 —— 队列面板用负外边距钻到输入卡片下面,排在它后面的条目会被那块悬出的边压住。 - 已知限制:宿主没报出当前工作目录时,被限定的胶囊一律不显示。
开发
npm install
npm run build # 分别产出 lib/index.js 与 lib/client.js
npm run typecheck # tsc -p tsconfig.json,strict
npm test # 先构建,再跑 node:test(158 条用例)
npm run watch # 改完自动重建
lib/ 是产物,不手工编辑;改完 src/ 记得重建。用例跑在构建产物上(宿主半与浏览器产物的硬约束),客户端那几条纯规则直接导入 src/client/*.ts。
想拿插件的某一个功能开刀、又不想弄脏日常那个 ~/.dsh,就单开一份家目录:
export DSH_HOME=/tmp/dsh-clean-home # 换成任意一份空目录
npm install && npm run build
dsh web --no-open --port 0 # 起引擎;终端打印带 ?token= 的地址
打开那个地址,输入框上方就是胶囊行。这个 home 与日常的互不相干。
颜色变量与派生规则见 docs/colors.md。
FAQ
胶囊行没出现?
先看侧栏插件卡片上的开关是不是开着;再确认这个 home 里装的是本插件 —— 其他 home 与全局 ~/.dsh 的插件在这里一个都看不到。
改了宿主半没生效?
lib/index.js 是引擎启动时加载的,改完要重启 dsh web;浏览器半的热更新只覆盖 lib/client.js。
识别按钮点不动、或者报错是红的?
没配 DeepSeek key。在「设置 → ⚡Super Pillls → 01 DeepSeek」里填一把,或者按「同步 DSH key」从 $DSH_HOME/.credentials.yaml 里把 DEEPSEEK_API_KEY 复制一把(值不经过页面,回答里只有一个指纹)。没填 key 也能先「拼出来看」,只是那时发不出去。
模型回了空结果?
思考把 max_tokens 吃光了。默认 4096,宿主半会自动翻倍重试;也可以在「更多设置(取样参数)」里再调高。
限定工作区之后胶囊不见了? 宿主没报出当前目录时,被限定的胶囊一律不显示。确认这个会话的目录已经在页面的 Workspace 列表里。
怎么彻底清空或换一份胶囊?
清空就删掉 $DSH_HOME/storages/dsh-fast-pills/;只想重置胶囊树,用设置页的「把胶囊重置为默认」(会先报出会丢多少颗胶囊、多少个分组,没有撤销)。
Roadmap
| 状态 | 内容 |
|---|---|
已发布 v0.2.0 |
快捷新增胶囊(行首空心 ⚡ 圆钮:带着草稿里那句话与当前工作区打开表单,新胶囊落在第一位);分组展开层居中于分组胶囊、撑满这一排后换行、点别处或点组内胶囊自动收起 |
已发布 v0.1.0 |
文件存储与种子树;胶囊行(折叠 / 插入 / 快速发送 / 工作区限定 / 拖动排序);抽屉(今日台账 / 趋势统计 / 设置);四支颜色的主题与外观;胶囊树编辑器;⚡Super Pillls(两道脱敏、发送前预览、DeepSeek 识别、确认后入树) |
| 计划中 | 胶囊导入导出;跨设备同步;更多识别模型的实测与适配 |
改动记录见 CHANGELOG.md。
贡献
- 提 issue 请附上 DSH 版本、系统、复现步骤与看到的现象;界面问题带截图更好。
- 提 PR 前先跑
npm run typecheck && npm test,并保持全绿;改了src/就一并提交重建后的lib/。 - 代码注释与 CHANGELOG 用英文;面板文案走
src/shared/locales/,zh.json与en.json的键必须逐字一致。 - 一处改动只做一件事,不加与本次无关的重构。
许可
FSL-1.1-ALv2(Functional Source License 1.1, ALv2 Future License),全文见 LICENSE。
本软件可在个人项目、公司内部项目中免费使用,无需专门授权;
本软件可在不面向公开市场、不构成商业竞品的用途中免费使用,无需专门授权;
第三方:识别功能会调用 DeepSeek 官方 Messages 端点(https://api.deepseek.com/anthropic),需要你自己的 API key;除此之外产物里不含第三方运行时代码与打包资源。
宿主平台 DeepSeek Harness。
No comments yet. Be the first to write one.