Baleen 是一个 DSH(DeepSeek Harness 桌面版)插件:定时把信息源灌进本地库,用读正文/字幕而不是读标题的方式筛掉劣质内容,每轮自动出一份增量汇报。名字来自鲸须(滤食结构)。
设计文档:docs/superpowers/specs/2026-10-23-baleen-design.md
当前实现计划:docs/superpowers/plans/2026-10-24-baleen-m2-panel.md(M1 已完成,存档在 2026-10-23-baleen-m0m1-store-and-rss.md)
实测记录:docs/verification.md
- 零新增 npm 依赖为首选。目前只允许
yaml(纯 JS、无 install 脚本)。要加别的先停下来问。 - 绝不注册平台写操作。没有评论、私信、点赞、关注、发布。判断那一轮只给只读工具。这是产品红线,不是"以后再说"。
- 失败不推进游标。抓取失败的源必须保留旧游标,让下一轮能补缺口。
test/runner.test.js里有一条测试直接盯这件事,别让它变成摆设。 - 重试上限 1 次。超限就记
failed继续下一个源。禁止为了让某个源成功而写临时调试脚本——那是烧钱的思路。 body_state六值固定:fullsummary_onlysubtitletranscribedmissingburned_in。missing(没有语音)与burned_in(字在画面里读不到)是两种记录,合并它们等于对用户谎报覆盖面。- 三档词固定:
值得看可以看不值当。不许自创档位,不许写分数。 - 日志与诊断脱敏:不含用户名、不含家目录绝对路径、不含 token/cookie。测试里也不要出现真名,用
os.homedir()做比较。 - 两个粗调按钮只写
tuning,永远不改themes/follow/sources。 - 测试只用
node --test。不引入 jest / vitest。注意node --test test/在 Windows 上会把目录当模块解析而报错,一律写node --test "test/*.test.js"(npm test已经是这个形式)。 - 提交信息用中文;一个任务一次提交。
- 收藏只写本机 sqlite:
collect/folder三条路由只走面板 → 宿主,绝不注册成 agent 工具,也绝不碰平台的收藏/点赞接口(B 站恰好有个同名真动作)。默认夹可改名不可删(路由与 store 两层都拒);夹名超长是拒绝而不是截断;已收藏的条目豁免runner.js的过期再归档,但移出后下一轮照旧清理。 - 工具面恰好六个、save_verdicts 是唯一写工具:
baleen_query / read_item / candidates / run_status / subtitle / save_verdicts,名字与 spec §10.1 逐字对应(subtitle是 M4a 的视频字幕现取,只读,B 站通道);save_verdicts只写本插件的 items/digests 两表,tier 参数是三档枚举锁死;平台写动词(评论/私信/点赞/关注/发布/收藏到平台)永远不出现在工具面——test/tools.test.js的红线测试是事故报警器,红了先停下来想。
- 工作副本是 CRLF。多行锚点的脚本要匹配
\r?\n。 - 编辑工具可能静默删掉文件内容里的 Windows 绝对路径。写含路径的文件后要么用脚本拼接,要么读回验证。
- DSH 客户端
ctx是 Proxy:服务名没写进package.json的dsh.client.inject,ctx.get()和属性访问都会抛。try { ctx.get(x) } catch {}之后再去裸读ctx.x是炸启动的写法,不是安全降级。 - 侧栏入口
sidebar.panellist注册的id必须与main面板的 key 完全同名,否则宿主layout.selectPanel抛。 - 主题只消费宿主 token(
--dsw-alias-*),明暗双主题都是验收项,不写死颜色。本机实测存在的名字(清单见test/css.test.js的HOST_TOKENS,来源是已跑通的 dsh-study-desk):bg-base、bg-layer-1/2/3、border-l1..l4、label-primary/secondary/tertiary/dimmed、brand-primary、interactive-bg-hover/active、state-error-primary、state-success-primary。fill-tertiary、border-primary、link这些不存在——写错名字不是风格问题,是宿主取不到值。也不给var()加light-dark()兜底:那等于把硬编码颜色请回来,脱离宿主的样子由tools/preview.mjs的替身 token 表负责。 - 面板布局别留两侧大空白;网格用
auto-fill minmax(260px, 1fr)。 - link 挂载不等于热加载,宿主会重写 cordis.patch.yml:改完插件代码必须重启 DSH 才装配;宿主运行中重写 patch 会把 link 装配条目丢掉(package.json 依赖还在,patch 条目没了,重启后插件整个不加载)——重启前先
grep baleen cordis.patch.yml确认,没了就重新dsh plugin --profile desktop add link:D:/dsh-baleen。 - 当前宿主的工具/注入形态是
ctx.inject(2026-10 更新后):工具ctx.inject(['tools'], (toolsCtx) => toolsCtx.tools.register(t))、注入ctx.inject(['systemPrompt'], (promptCtx) => promptCtx.systemPrompt.context({ name, order, text: 每轮渲染回调 }))——study-desk 的ctx.on('system-prompt/assemble')是旧版事件,新宿主没有;ctx.get('tools')在 Proxy 上抛错会让 apply 整体静默中断(面板正常、无日志、无工具),工具注册段要包 try 并写 diagnostics 日志(tool_registered 探针)。 - 打包 node 的入口是
resources/runtime/bin/node.cmd,需要DSH_DESKTOP_NODE_EXECUTABLE指向DeepSeek Harness.exe(细节见docs/verification.md)。 - 宿主 API 实测形态(抄自本机 dsh-study-desk,别自己发明):取服务用
ctx.get('webServer') ?? ctx.webServer;注册路由用webServer.register({ kind:'prefix', path, handler })且必须包在ctx.effect(fn, label)里;注册服务用ctx.provide(ctx.set对未 provide 的服务会抛)。 - 桌面端 UI 跑在自定义协议上,只有
/api/*会被转发到宿主——路由前缀固定/api/dsh-baleen,改成别的名字面板就读不到数据。 - 定时器一律走
ctx.effect(() => { const h = start(); return () => stop(h) });测试里通过apply(ctx, { setInterval, clearInterval })注入替身,否则真 interval 会把node --test吊住不退出。 node:sqlite在本机可用(独立 node 24.15 与 DSH 打包 24.21 都实测通过),不要引第三方 DB。- 动 DSH profile 之前:备份
cordis.patch.yml和 profilepackage.json,一次只切换一个插件,永远不要点启动失败弹窗里"禁用第三方插件、备份 profile patch 并重启"那个按钮(它会重新序列化并清掉文件)。 - 装完插件先用
dsh --profile desktop --dump-config检查装配,别用重启试错。 client.js是生成产物,别手改:源在src/client/,改完跑node tools/build-client.mjs(npm run build:check只验证新旧)。test/build.test.js有两条守卫:产物逐字节比对、以及"src/client下每个.js都在PARTS里"——新加视图忘了登记PARTS,面板不会有任何变化,也不会报错。- 生成方式是把多个源文件内联进同一个 factory 作用域(只剥
import/export行),所以两个源文件里的同名const会直接SyntaxError。节点工厂统一用src/client/vnode.js的vnode(),别在视图里再造同名局部函数。 - 视图返回的是纯对象
{type, props, children},不是 React 元素;装配层用toElement()桥给createElement。测试桩的flattenText会调用函数组件(桩不 reconcile),所以面板断言看得见内容——但也因此看不见真 React 的键/形状问题,那一层只能在预览门和真机上看。
- 新建 UI 元素前先看有没有现成参照(
D:/dsh-study-desk是本机已验证的写法)。 - 面板属于 v1,不许在规划时把前端收窄掉。
- 定稿前给假数据 HTML 预览,明暗两版都能看。
- 拍板类问题给封闭选项,别让人打字。