一个零权限、零上传、纯本地合成声音的 Chrome 扩展专治「AI卡那等你授权你却在忙别的」的老毛病。一、先说清楚这个痛点用 DeepSeek Harness 这类 AI 编程跑任务时它经常会在下面这些地方停下来等你审批请求要不要继续执行、允不允许某个操作它停下来等你点同意 / 拒绝用户提问代码看不懂、方案拿不准它直接抛问题回来等你回答方案选择给你几个候选方案等你拍板。而这些问题出现的时候你多半不在那个页面——要么切到别的窗口在写代码要么出去接杯水、开个会甚至人已经离开工位。结果就是代理一直卡在那儿干等你浑然不知等你再切回来看才发现它已经等了你十分钟。反过来就算这一轮已经跑完了你不切回来也照样不知道白白浪费时间。最难受的是为了不漏掉这些时刻你只能每隔几分钟就手动切回浏览器瞄一眼——这恰恰是最低效的工作方式。二、这个插件怎么解决DeepSeek Harness Sound AlertsDeepSeek Harness 声音提醒就是把这些「沉默的等待」变成「清晰的声音」该你处理了 → 响五声短促提示音880 Hz提醒你回去看本轮跑完了 → 响一段上行五音铃声C5–E5–G5–B5–C6跟审批提示音完全区分开一听就知道是「完成了」而不是「要处理」。这样你就能放心去忙别的不用每隔一会儿就切回来瞄一眼——需要你的时候它会叫你。三、三种状态对应什么声音DeepSeek Harness 状态声音含义等待审批五声 880 Hz 提示音AI在等你同意 / 拒绝用户提问 / 方案选择 / 计划评审五声 880 Hz 提示音AI在等你回答或选择本轮执行完成上行五音铃声这次运行已经结束只是加载历史、没有活动运行不响完成铃声避免旧记录误报四、4 步装好装完即用到 Release 下载deepseek-harness-sound-alerts-v1.2.3.zip先解压Chrome 没法直接加载 ZIP打开chrome://extensions/右上角开启开发者模式点加载已解压的扩展程序选中解压后那个包含manifest.json的文件夹打开或刷新http://127.0.0.1:3080的 Harness 页面在页面里点一下鼠标或按一次键盘浏览器要求先有一次真实操作才允许出声。搞定。以后出现审批、提问、方案选择或本轮完成时插件会自动响对应的声音不用开 Console、不用跑命令、不用登录。五、它是怎么实现的代码层面整个插件就是一个 MV3 的 content script核心思路特别简单用MutationObserver监听页面 DOM命中关键节点就触发 Web Audio 合成声音。全程没有音频文件、没有后台脚本、没有网络请求。5.1 识别「要处理」的节点审批、提问、方案选择分别对应这几个属性命中了就响五声提示音jsconst APPROVAL_SELECTOR [data-approval-key]; const QUESTION_SELECTOR [data-question-key], [data-plan-review-key];声音用 Web Audio 现场合成880 Hz 方波、带软包络避免爆音jsconst now ctx.currentTime 0.02; const freq 880; // A5 const beepLen 0.12; const gap 0.09; for (let i 0; i BEEP_COUNT; i) { beep(ctx, freq, now i * (beepLen gap), beepLen); }5.2 识别「跑完了」完成铃声是一段上行五音跟审批声彻底区分jscompletionNote(ctx, 523.25, now, 0.72, 0.42); // C5 completionNote(ctx, 659.25, now 0.34, 0.78, 0.46); // E5 completionNote(ctx, 783.99, now 0.70, 1.08, 0.50); // G5 completionNote(ctx, 987.77, now 1.12, 0.82, 0.53); // B5 completionNote(ctx, 1046.50, now 1.52, 1.10, 0.57); // C65.3 两个关键细节值得聊聊① 去重避免 React 重渲染反复响同一个面板在 React 重渲染时可能反复触发插件用Map按「属性 key」去重同一个 key 只响一次元素消失后自动清理jsconst key ${attribute}:${rawKey}; const existing seen.get(key); if (existing?.isConnected) continue; // 已经响过跳过 seen.set(key, c);② 完成铃声要「真实运行」才响历史记录不误报加载历史会话时DOM 里也会有data-turn-tail完成尾节点如果只看它旧记录就会乱响。所以插件只在「确实观察到运行中控件」比如aria-labelStop generating/停止生成这类按钮出现过的轮次上才允许完成铃声触发。历史节点即使延迟加载也不会仅因时间间隔被误判成完成。5.4 声音解锁浏览器禁止在用户操作前出声所以插件在pointerdown/keydown时创建并resumeAudioContext之后才真正放行声音——这也是为什么装完后要在页面里点一下。六、隐私与安全零权限、零上传写这类「监听页面」的插件最怕就是顺手要一堆权限、后台传数据。这个插件在这块做得非常克制permissions是空数组一个权限都不申请主机访问只限http://127.0.0.1:3080/*和http://localhost:3080/*碰不到你别的网站没有后台 Service Worker、不读存储、不读 Cookie、不埋点、不追踪、不加载任何远程代码没有任何网络请求声音全在浏览器本地合成不上传任何会话内容交互 key 只存在内存里用来去重。发布前仓库和 Release 里的代码都做了多轮敏感信息扫描确保没有泄露任何凭据。七、源码与 Release仓库https://github.com/sl92983/deepseek-harness-sound-alertsRelease v1.2.3https://github.com/sl92983/deepseek-harness-sound-alerts/releases/tag/v1.2.3中英双语文档、MIT 开源欢迎 Star、提 Issue 或一起完善。项目是非官方社区作品与 DeepSeek 官方无关。八、写在最后AI 越用越多「AI在等你、你却不知道」这种时间损耗会越来越频繁。与其手动反复切屏不如让它自己开口叫你。如果你也在用 DeepSeek Harness装一下试试如果帮你省了时间点个 Star、转给同样在用的朋友让更多被同样问题困扰的人看到。