Repository navigation
Releases
v0.23.0
点下图标到页面出现之间的那几秒钟,以前图标只是停在红色「关闭」态一动不动 —— 看不出点击有没有被接收到,也不知道服务是在启动还是卡住了。这一版把它补上,并且失败时留下明确的记号。
启动中:白色滑块在开关里左右往复
点下图标立刻进入「启动中」动画:
- 0~0.3 秒「通电」:绿色从左端扫满胶囊(前缘带一道柔光)。动画第一帧与「关闭」图标逐像素一致,所以点下去不会跳。
- 此后胶囊保持绿色,白滑块在整只胶囊里左 ↔ 右往复(余弦,两端速度为零,所以每次折返都是"软"的);一个来回 1.1 秒。
- 服务就绪时,滑块从当前位置平滑滑到右端停住(0.25 秒)—— 落定那一帧与「运行 · 空闲」图标逐像素一致,无缝接管。
- 右键菜单关掉动画时,退化为一张静止的「通电 + 滑块居中」图标,不会与「空闲」(滑块在右)混淆。
启动失败:绿色退去,圆钮上留下红色 ✕
未找到 dsh / dsh web 起不来 / 120 秒端口无响应时:
- 入场 0.55 秒:绿色从右端退去(电没通上)→ 滑块滑回左端 → 红 ✕ 带回弹地弹入;之后静止(不再逐帧重绘,省电)。
- 入场是从"启动中当时那一帧"接过来的(实测 35 个抽样点与启动中同刻逐像素一致),失败也是一次过渡而不是硬切。
- 菜单栏小图标同步换成「滑块挖空 ✕」,状态行显示「启动失败」,菜单 / 右键菜单变为「重新启动 DSH 服务」。
- 红 ✕ 会一直保留到你再次点击(重新启动)或服务被别的途径拉起 —— 它是"这件事没成"的常驻标记,而不是一闪而过的提示。
修复:在别处启动的服务现在能被识别
serviceRunning 此前只在 startService() 里置位 —— 服务若在别处(终端 / 别的 App)被拉起,图标不会跟上,这会让新加的红 ✕ 一直挂着。现在监测每拍以实测对齐,且该对齐放在 zstd 检查之前(没装 zstd 也生效)。
一并发布:API keys 通用入口(0.22.0,此前未发布)
0.22.0 的改动此前只存在于源码、从未打包发布,本次一并带上:
- 右键菜单 / 菜单栏新增 「编辑 API keys…」:直接打开 dsh 自己的用户级环境文件
$DSH_HOME/.env(缺省~/.dsh/.env;不存在时按0600写入带注释的模板,绝不覆盖已有内容)。dsh 启动时读取它并注入所有插件与工具进程 —— 以后接入任何新 API 只需加一行KEY=VALUE,本 App 不需要跟着改版。保存后需重启服务生效(弹窗里可直接点「重启 DSH 服务」)。 - 凭据注入改为不认名字的通用管线:按
KEY/TOKEN/SECRET/PASSWORD/CREDENTIAL词根识别(含*_ACCESS_KEY_ID),并排除*_PATH/*_FILE/*_DIR/*_URL这类"名字像 key 其实是路径"的项;含$VAR/$(cmd)/ 反引号的值一律丢弃(宁可漏,也不注入错值)。 - 环境自检改为通用凭据报告:列出已配置的凭据名(进程环境 /
.env/ shell 三处合并去重),只显示名字,绝不显示值。
安装
sh -c "$(curl -fsSL https://raw.githubusercontent.com/wjingshan/dsh-dock-launcher/main/install.sh)"或下载下方 .dmg(打开后把 App 拖进「应用程序」)/ .zip(解压后拖入)。本 App 未使用付费证书签名/公证,首次打开若提示"无法验证开发者":右键 App → 打开,或执行 xattr -dr com.apple.quarantine "/Applications/DeepSeek Harness 开关.app"。
校验(SHA256)
71f33af5b74a1559e9f6cecad35365f3dd2cb5f946bee3db61e09046c9e82dda DeepSeek-Harness-Switch-v0.23.0-macOS-universal.zip
75f926dc78d37941e44777c00e89144ebf1c97e631a507450492542b1e6dbcca DeepSeek-Harness-Switch-v0.23.0-macOS-universal.dmg
通用二进制(Apple Silicon + Intel),macOS 14+。全部改动的来龙去脉与量测/端到端验证数据见 CHANGELOG.md 的 0.22.0 / 0.23.0 条目。
v0.21.6
一次权限审计的收尾:把两个系统权限都改成「按需、可关、文案如实」。
修正自动化授权的说明文案
NSAppleEventsUsageDescription 原来写的是「请允许它控制网页浏览器与**「系统事件」」——但全项目从未使用** System Events(keystroke / key code 也一次都没出现)。用户在授权弹窗里看到"控制系统事件",很容易以为这个 App 要接管整个系统,从而在该授权时反而点了拒绝,而它实际只碰浏览器。
现改为如实说明:只访问浏览器、读活动标签页地址用于判断你是否已回到 127.0.0.1:3080 页面、并切回已打开的标签;不允许也不影响基本使用(会退化为「浏览器在前台即视为已回到界面」)。
通知改为按需申请,并且可以关掉
原本 applicationDidFinishLaunching 一进来就申请通知授权——不需要横幅的人也会被弹权限框,而菜单里没有开关可关。现在:
- 右键菜单新增**「系统通知」开关**(与「关闭动画」并列);关掉后连授权框都不会弹
- 授权申请推迟到首次真正需要:① 用户主动打开该开关 ② 首次真的要投递通知
- 首次投递会等授权回调返回后再投这一条,避免「最重要的首次提醒因为授权尚未就绪而被丢掉」
- 4 种语言(简体中文 / English / 日本語 / 한국어)同步
权限现状(README 新增专节)
提醒共有四条通道:Dock 图标动画、程序坞弹跳、提示音、系统通知——通知只是其中一条,可以关掉。
| 权限 | 必要性 | 不授权会怎样 |
|---|---|---|
| 系统通知 | 可选 | 其余三条照常工作 |
| 自动化(AppleEvents) | 可选 | 退化为「浏览器在前台即算回到界面」;点击图标改为激活浏览器 + 打开地址(可能多开一个标签) |
从未申请也未使用:辅助功能、输入监控、屏幕录制、完全磁盘访问、文件与文件夹(桌面 / 文稿 / 下载)、麦克风、摄像头、定位、通讯录、日历、照片、登录项。其中「鼠标移到程序坞就停提示音」用的是定时轮询鼠标位置(NSEvent.mouseLocation),不是全局事件监听,所以确实不需要辅助功能或输入监控权限。
安装
sh -c "$(curl -fsSL https://raw.githubusercontent.com/wjingshan/dsh-dock-launcher/main/install.sh)"也可直接下载下方 …-macOS-universal.zip 或 .dmg;SHA256SUMS 为对应校验值。
完整改动见 CHANGELOG.md。
v0.21.5
修掉一个会溢出图标轮廓的渲染缺陷。
「任务完成」的边缘发光溢出图标轮廓
drawInnerEdgeGlow 与 drawEdgeStream 用 squirclePath(in: rect).addClip() 裁剪,而 addClip() 会把裁剪路径按像素网格向外取整 —— 于是沿底板轮廓描的那圈发光,把底板最外圈本该半透明的像素覆盖成了不透明:底板量出来从 106px 变成 108px(每边大 1px),光实际画到了图标轮廓之外。
影响面不只是尺寸:
- README 上这张状态图因此比其余六张大一圈(逐帧统计 69 帧全部为 108×(106~108))
- Dock 里表现为「任务完成」的绿光在图标边缘糊出一圈毛边
修法:两处裁剪都改为 squirclePath(in: rect.insetBy(dx: 1, dy: 1)),让最外圈保持底板自身的抗锯齿。
复核
七张状态图的底板尺寸现已全部为 106×106(修复前 complete 为 108,其余为 106),逐帧核对 60 / 69 / 60 / 72 帧全部一致。
安装
sh -c "$(curl -fsSL https://raw.githubusercontent.com/wjingshan/dsh-dock-launcher/main/install.sh)"也可直接下载下方 …-macOS-universal.zip 或 .dmg;SHA256SUMS 为对应校验值。
完整改动见 CHANGELOG.md。
v0.21.4
本轮把 Dock 图标的视觉一致性收干净:胶囊尺寸、投影、README 状态图三处全部对齐。
胶囊尺寸统一
按真实显示几何逐像素量,发现「任务完成」态的胶囊会随呼吸缩放(capScale = 1 ± 0.04),宽度在 66–72 px 之间来回变化,而关闭 / 空闲 / 进行中恒为 68.0 px —— 同一枚图标在不同状态下药丸会自己变大又变小。现在胶囊尺寸完全固定,呼吸只保留在边缘发光上。
补齐动画两态缺失的投影
静态两态(关闭 / 运行空闲)在画胶囊时套了一层 NSShadow,而「任务进行中 / 任务完成」漏掉了 —— 同一枚药丸,静态态下方有暗影、动画态没有。现按同一组参数补齐。过程中踩到两个坑,都记在 CHANGELOG 里:
- 投影必须在
addClip()之前画:极光渐变是在胶囊裁剪区内绘制的,裁剪会把投影一并裁掉。 - 填充色必须不透明:
NSShadow按被绘制内容的 alpha 生成投影,用半透明打底只能得到一半强度(实测 +0.034,而静态态是 +0.114)。
实测量化
四态胶囊均为 68.0 × 34.0 px、宽高比 2.000、偏差 0.0%。对照实验确认这条缝确实存在:若静态图标不做 83.2% 内缩,它会变成 82.0 × 42.0(+20.6%)。
投影的 CPU 代价测不出来:离屏基准显示 busy 单帧 0.146 → 0.197 ms,但离屏 8-bit 上下文本就会低估真实 f16 渲染,所以没有采信;真机 30 秒 A/B 为 6.83%(含投影)vs 7.27%(临时关掉投影) —— 关掉反而略高,差异完全落在测量噪声内。
README 状态图统一
七张图的画布都是 128×128,但内容占比不一致:三张 PNG 占满 100%,四张动图只占 ~83%(8.4% 内缩)。所以主页上静态三态明显比动图大一圈 —— 正是 0.21.2 在 App 内修过的同一个 83.2% 问题,这次出在文档素材上。现三张 PNG 改为按内缩后的尺寸 1:1 绘制,并并回同一个文档渲染器产出,此后不会再各自漂移。
文档
README 状态表里「需要确认」与「等你选择 · 单选」合并为一列 —— 两者动画本来就是同一份文件(MD5 相同),排成两列会让人误以为是两种视觉。App 内仍是两种提醒(提示音与通知文案不同)。
安装
sh -c "$(curl -fsSL https://raw.githubusercontent.com/wjingshan/dsh-dock-launcher/main/install.sh)"也可直接下载下方 …-macOS-universal.zip 或 .dmg;SHA256SUMS 为对应校验值。
完整改动见 CHANGELOG.md。
v0.21.3
本轮做的是性能优化:用 sample 采样把稳态 CPU 从 17–20% 降到 5.4–7.3%(单核百分比,约 −65%),常驻内存从 137 MB 降到约 40 MB,而动画逐像素不变。
关键发现
采样纠正了一个错误假设:原以为瓶颈是会话日志解压,实测它只占 ~3.6%;真正的开销是 60 fps 全量重绘 Dock 图标(≈13%)。
改动
- 会话监测改为字节游标 — 原来每拍把 7 MB 会话日志全量
zstd -d解压后再split成行,一次造出 3.7 万个 String,其中约 75% 的时间花在Collection.split与String的 ASCII 判定上。现在只对新增字节切分、只为新行建String;文件未变化(mtime + size 相同)时直接跳过。 - 稳态动画抽帧到 15 fps — busy 色带 / 呼吸 / 脉冲都是周期 1 秒以上的软渐变循环,抽帧后看不出台阶;而变形入场(0.9 s)与反向收尾(0.42 s)是快速过渡,仍保持满帧 60 fps。所有相位都用真实时间戳计算,所以动画速度分毫不变,只是采样率降低。帧率由
steadyFrameStride一个常量控制(1=60 fps、2=30 fps、3=20 fps、4=15 fps)。 - 目录枚举降频到每 2 秒 —
FileManager.enumerator要open+getattrlistbulk递归遍历整棵会话树、并为每个条目创建NSURL,独占监测线程 1/3 的时间。已跟踪文件的 mtime 检查仍是每拍,信号响应速度不变,只有「新会话首次出现」最多晚 2 秒被看到。
验证
- 信号识别回归全部通过:含
approval/decided、turn/start、tool/result以及多选callId的配对判定。 - 动画视觉零差异:120/120 帧与优化前逐像素一致(用本地渲染基准工具对比 golden PNG)。
- 实测:稳态 17–20% → 5.4–7.3%,内存 137 MB → 约 40 MB。
一次失败的尝试(已回滚)
试过把逐像素不变的底板 / 品牌字 / 滑块缓存成静态 CGLayer,每帧只做合成。实测单帧反而从 0.160 ms 涨到 0.280 ms,且 golden 对比出现 44% 像素差异(最大通道差 375/1020)。判定为「更慢且改变画面」,已回滚,结论记在 CHANGELOG 里以免重踩。
其他
- 移除
SoundCenter中用于定位「重复 N 次却只响 1 次」的临时[sound]诊断日志(该问题已在 0.21.2 修复并验证通过)。
安装
sh -c "$(curl -fsSL https://raw.githubusercontent.com/wjingshan/dsh-dock-launcher/main/install.sh)"也可直接下载下方 …-macOS-universal.zip 或 .dmg;SHA256SUMS 为对应校验值。
完整改动见 CHANGELOG.md。
v0.21.2
本轮修掉 4 个静默失效类真 bug(都不报错、不易察觉),并完成多选动画与图标的一轮打磨。
修复
- 所有提醒/监测静默失效(最严重) — dsh 换用 v3 会话格式
session.v3.jsonl.zstd,而TaskMonitor硬编码只认session.jsonl.zstd,导致需确认 / 等你选择 / 任务完成提醒、以及全部 Dock 动画都不触发,且不报任何错。现改为匹配session*.jsonl.zstd并只取每个会话目录最新一份。 - 提示音「重复 N 次」实际只响 1 次 —
NSSoundDelegate回调签名写成soundDidFinishPlaying(_:)(协议要求sound(_:didFinishPlaying:)),签名不匹配 ⇒ 回调永不触发 ⇒ 设 2/3/5 次都只响一次。「一直重复」模式走loops不受影响,所以一直没暴露。 - 「任务进行中」蓝绿渐变消失 —
.truncatingRemainder(dividingBy:)被误写进注释,位移达 880 亿,色带被推出画布几万像素,只剩底板色 + 一道白光。 - Dock 动画图标比系统/其他 App 大 ~20% — 动画走
dockTile.contentView,拿不到 macOS 施加在 app 图标上的边距(实测系统内容占比 83.2%)。四个动画视图现统一内缩 8.4%。
改进
- 多选动画:循环阶段改为「淡化叠加」—— 画一笔 → 从起点逐渐褪掉 → 旧笔迹还剩 55% 时新一笔从起点重画,两笔同框;周期 3.2s。
- 多选背景:白色圆形 → 圆角正方形(边长 48%,圆角 24%),光晕/外环/扩散环同步。
- busy 渐变:更饱和的蓝绿、每秒 1 个循环、循环接缝平滑(0.5× 最大帧间差)。
- 右键菜单:去掉与系统重复的「退出」、「关于 DeepSeek Harness 开关」简化为「关于…」、「停止服务…」明确为「停止 DSH 服务…」(4 语言同步)。
- App 图标默认样子 = 关闭态:红胶囊 + 白点在左。
安装
curl -fsSL https://raw.githubusercontent.com/wjingshan/dsh-dock-launcher/main/install.sh | bashv0.21.1
「任务进行中」蓝绿流动动画重调
原来"更像静态蓝绿渐变、缺少流动感、两色也太接近",根因是色带宽度:
- 一个颜色循环从 4 倍胶囊宽缩到 1.3 倍,渐变总跨度 16 倍 → 3.9 倍。胶囊以前只截到整条渐变的 1/16,局部近乎纯色,所以看不出在动。
- 色彩拉开:蓝更饱和、青更纯、绿更鲜;把几乎与蓝同色相的紫换成深蓝,蓝端更干净。
- 流速与色带同倍数(每秒正好 1 个颜色循环),柔光掠过每 2 秒正好 1 次,使动画在 2 秒整倍数处严格回接。
实测:单帧内胶囊左/右色相 206° ↔ 147°;同一点 0.2 秒颜色差 0.690;逐帧变化平均 0.942,循环接缝 1.174 —— 接缝小于最大帧间变化(1.241),循环点不比普通帧更跳,肉眼不可辨。
一并说明一项未采纳的优化
评估过"尾部帧解压":实现后信号回归 10/10 通过,但 App 侧只从 0.26s 降到约 0.08s(其中约 75ms 是 zstd 进程启动开销),端到端仅改善约 0.2 秒,因为大头 2.34 秒是 dsh 写会话日志的延迟,App 改不到。故回滚、不做。
安装:curl -fsSL https://raw.githubusercontent.com/wjingshan/dsh-dock-launcher/main/install.sh | bash
v0.21.0
v0.21.0
新增
- 多选问题改用「对勾」动画:
ask_user_question的多选问题(questions[].multi_select == true)沿用同一套变形动画,但圆圈里换成蓝色几何对勾,并且是**"书写"式画出**——按笔画从左往右逐段写出,反向收尾时倒着收回;时间轴、蓝光呼吸、反向收尾全部复用。单选/普通提问仍是问号。 - 监测新增多选识别:解析
tool/call的arguments,检查questions[].multi_select(兼容multiSelect)。
验证
- 多选识别:
multi_select=true → true✅ /false → false✅ / 无该字段 →false✅ - 分阶段渲染确认"书写"过程:0.45s 只写出左半笔、0.60s 接近完成、0.75s 收笔(
preview/check-stages.png)
另含
- 反向收尾"跳一下"的修复(白圆与图标自带圆点交叉淡化)。
安装
sh -c "$(curl -fsSL https://raw.githubusercontent.com/wjingshan/dsh-dock-launcher/main/install.sh)"SHA-256:
d5f488d113c97d203df0ab612bf786280e1161f32d1bb27c3ace3a7a59f48afe DeepSeek-Harness-Switch-v0.21.0-macOS-universal.dmg
c71f9fb20bb160c66019f59aa9f1e658eb407b84ef063cb0207c8f54126293bc DeepSeek-Harness-Switch-v0.21.0-macOS-universal.zip
v0.20.6
v0.20.6
修复
- 修掉屏幕/菜单栏"闪几下":v0.20.5 把轮询压到 0.4s 后,每次扫描发现变化都会在主线程调用
refreshUI(),而它会重建菜单栏图标与整份菜单;dsh 运行时会话日志几乎每 0.4 秒都在变,于是菜单栏被每秒重建数次,表现为快速闪烁。现在refreshUI()增加状态签名比对(显示状态与提醒态都没变就直接返回),只有确实需要重绘的地方才显式refreshUI(force: true)。
改进
- App 日志改为毫秒精度(
yyyy-MM-dd HH:mm:ss.SSS):此前只有秒级,无法精确测量提醒动画的触发延迟(只能给出 1~2 秒区间)。
安装
sh -c "$(curl -fsSL https://raw.githubusercontent.com/wjingshan/dsh-dock-launcher/main/install.sh)"SHA-256:
2c0b82895783ce2c8aa4fe926b173996d49ea69d842d931940c377ebf5a17c75 DeepSeek-Harness-Switch-v0.20.6-macOS-universal.dmg
a5b583abb945b45205b373fe4381ea26405c39c9731442dafef432d37749642b DeepSeek-Harness-Switch-v0.20.6-macOS-universal.zip
v0.20.5
v0.20.5
改进
- 提醒动画触发"慢半拍":监测轮询间隔原为 1 秒,且每次扫描都要把整份会话日志(实测 14MB)全量解压并扫描(约 0.26 秒),加上日志写入延迟,体感约 2 秒才触发动画。现在:
- 轮询间隔 1.0s → 0.4s;
- 文件未变化则整次跳过(比对 size + mtime,空闲时几乎零开销——这也是缩短间隔的前提);
- 候选会话只跟最近 3 个,多会话并行时开销不成倍放大。
- 备注:会话日志实测为多帧 zstd(14MB 内含 37016 个帧,每个事件一帧),后续可进一步改成"只解压尾部若干帧",把单次扫描从 0.26s 降到毫秒级。
安装
sh -c "$(curl -fsSL https://raw.githubusercontent.com/wjingshan/dsh-dock-launcher/main/install.sh)"SHA-256:
93120d9d7ad6d842195829f41e179c60ba7f1f355fe9b51aa52fffd65a6181a2 DeepSeek-Harness-Switch-v0.20.5-macOS-universal.dmg
af3379102530acd8dcbe3dce2c0acbdfb01bc3992580ea557be3adb9d133e4ba DeepSeek-Harness-Switch-v0.20.5-macOS-universal.zip