Repository navigation
Releases: Britneycode/dsh-fish-soul
Releases · Britneycode/dsh-fish-soul
Release list
v0.13.6(「正在聊的也马上换」开关记住选择)——2026-11-03 发。
v0.13.6(「正在聊的也马上换」开关记住选择)——2026-11-03 发。
- 设置页「人格 → 正在聊的也马上换」原来只是组件里的临时 state(初值写死开):切走再回来开关就弹回开,看起来"关不掉";而且既然每次都是"开",顺手点保存就会带着
fresh: true把正在聊的会话清掉(#44)。现在选择存在服务端 kv(persona.freshDefault),GET /persona/state带回、切开关即POST /persona/fresh持久化,关掉就一直是关;没存过的老用户默认关——宁可沿用旧会话,不误清。
v0.13.5(想聊 / 待办可删除)——2026-11-03 发。
v0.13.5(想聊 / 待办可删除)——2026-11-03 发。
- 设置页「记忆检视 → 待办」「习惯 → 日记 → 想聊」每条加删除按钮(#42):做完了的事不再一直挂着。待办走已有的
POST /inspector/forget(targetType: pending,删 = 标dropped),想聊新增POST /diary/topic-remove路由,按人 + 话题删单条;删完的话题第二天不再进聊天上下文。
v0.13.4(长期记忆记得住 + 屎山清理)——2026-11-03 发。
v0.13.4(长期记忆记得住 + 屎山清理)——2026-11-03 发。
- 遗忘半衰期 7 天 → 30 天:
decayFactor里重要度 <3 的记忆原来 7 天就淡一半,一个月后基本搜索不到了——「住四楼」「阿岑会修收音机」这类日常事实全是 importance 2,聊过两周就答不上来。改 30 天后 45 天仍保留约 35%,与「认识半年的朋友记得住基本情况」的预期一致。重要度 ≥3 依旧不淡,被想起过的照常延长,改口/纠错逻辑不变。 - 提取时保留时间和条件限定词:
ChatDigester的 prompt 补一条——「那周上午十点前别催我」不许压成「上午十点前别催我」。以前模型做摘要时爱丢「那周」「暂时」「等演出结束后」这类限定,时间约定题全挂。 - 大肥鱼记忆评测基线(公开示例卷 108 题,非正式私有卷):改前 87/108(80.6%),改后 96/108(88.9%);45 天档 16/27 → 22/27;「忘记」类错误 16 → 7。评测脚本与报告在
.benchmark/(gitignore,不入包)。 - 首轮屎山清理:删
sharpSource()死函数、去掉 20 个无外部调用方的 export、收敛重复 helper(jaccard / maskKey / sniffImage / pad2 / personId 各留一份,bilibili 公钥 env fallback 移进函数体——test/smoke.mjs:83依赖它换测试公钥)。net -55 行。 - 测试临时目录不再泄漏:16 个测试文件
mkdtempSync后从不清理,配合 Alma 子进程 TMPDIR 会把磁盘撑到 16G / 3300+ 目录。新增test/_tmp.mjs(退出逐文件删 + 启动补删 >5min 的同前缀老目录),16 个测试与test/eval/下 3 个脚本换用。连跑两轮临时目录 140 个 → 2 个。 - 人格卡改 per-agent 注入:
setup(agentCtx)里挂,不再注册全局systemPrompt段——#40 那类「技术问答会话被塞鱼的人格」的问题从根上收掉。
v0.13.3(B站三个小修 + 分支保护 + 测试 CI)——2026-11-03 发。
v0.13.3(B站三个小修 + 分支保护 + 测试 CI)——2026-11-03 发。
- 表情包随机抽取(#41 拆分):工作区
_stickers/超过 40 张时随机抽 40 进提示词。以前固定取前 40 个,后面加的表情永远进不了提示词。 - 站内搜索提词不重复(#41 拆分):词表留空让她自己提搜索词时,把最近搜过的(最多 5 个)告诉模型、要求换方向,避免一直搜同一个方向。
bili.search.recent持久化,词表选中的也记。 - @ 读视频每轮上限(#41 拆分):
bili.comments.atReadVideo开着时,一轮轮询最多读 3 个视频(每条 2 次接口调用),防止把每小时上限拉满时一口气打 2N 次;剩下的下一轮再读,回复照常。B站 评论type(1 = 视频 / 11 = 动态)补了常量。 - 分支保护 + 测试 CI:新增
.github/workflows/test.yml——push / PR 到 main 都跑npm test(ubuntu + Node 22)。repo rulesetprotect-main:删 main / force push 被拦,PR 必须过npm-test才能合(admin 可绕过、不强制 review,单人项目不自锁)。 - 新测试
test/followups.mjs(进npm test):上面三块的回归保护。
v0.13.2(人格不再污染宿主所有会话)——2026-11-03 发。
v0.13.2(人格不再污染宿主所有会话)——2026-11-03 发。
- #40 装了插件后,DSH 里新开的任何对话都被注入「鱼」的人格和此刻状态:
registerAgentHooks用插件全局ctx注册systemPrompt,宿主级生效——技术问答的会话里也会冒出「[记住你是谁] 你是贪吃鱼…」「[此刻状态]…」,回复语气全被带偏,整个 DSH 没法正常当技术助手用。 - 修法(不动注册点、不碰 agent 生命周期):注入前判断会话归属——网关会话(QQ / B站 / 抖音)和 DSH 里认得出 QQ 身份的会话照常注入;匿名 DSH 会话(跟鱼无关的对话)静态人格段返回空串、瞬态块整块不给。宿主没给会话 id 时按鱼的会话处理,主动开口不受影响。
- 测试:陌生 DSH 会话
section.text()/context.text()都是空串;鱼的 QQ 群会话照常;无会话 id 时照常注入。
v0.13.1(B站:站内搜索来源 + @ 她时先读视频)——2026-11-03 发。
v0.13.1(B站:站内搜索来源 + @ 她时先读视频)——2026-11-03 发。
- 站内搜索当作刷视频的又一个来源(#38,默认关、只读):
bili.browse.search开了以后,每轮刷视频先按关键词搜一下;关键词要么用设置页填的词表(searchKeywords,随机挑一个),词表留空就让她自己按最近看过的视频提一个(一次小模型调用,只输出 2-8 字);一天最多searchPerDay(默认 2)次,额度用完连提词都不叫。搜索最多占一轮名额的一半,推荐 / 关注照常有;它们都失败时搜索结果补位,不会空跑(审查修正:第一版会把推荐全部挤掉)。 - 别人评论区 @ 她时可选先读一下视频(#39,默认关、只读):
bili.comments.atReadVideo开了以后,被 @ 的回复发出前先把那个视频的标题、简介和字幕节选(≤800 字)塞进提示词,多两次 B站 接口调用;读失败不影响回复照常发。要在「回评论」+「别人评论区 @ 她也回」都开着的前提下才有这个选项。 - 新测试
test/search-source.mjs、test/at-reads-video.mjs(都进npm test)。
v0.13.0(聊天会话工具放行档位 + 抖音图文配 BGM)——2026-11-02 发。
v0.13.0(聊天会话工具放行档位 + 抖音图文配 BGM)——2026-11-02 发。
- #37 聊天会话只放行三个记忆工具,自己装的插件工具全被拦:以前
setupAgent的restrict加上全局tools.guard双重锁死,设置页也没有开关。新增tools.sessionAllow三档:memory(默认,现状不变)/master(只放开主人的私聊会话,其他人照旧)/all(所有聊天会话都放开)。设置页在「模型 → 上网查 → 聊天会话能用哪些工具」里切。改档位后已开着的会话要重开一次才生效(工具是在建会话时收窄的)。 run_code无论哪档都不放行:PTC 模式下它能跑任意程序,等于绕过所有限制,这是刻意留的红线。- 抖音图文发布前让模型挑「心情」和一首 BGM:心情映射成卡片配色(暖 / 丧 / 梦 / 清新 / 甜),BGM 从常青热门歌池里选;模型答不出来就退回随机配色、不配歌,绝不拦发布。
- 图文编辑页配 BGM:找「选择音乐」入口 → 搜歌名 → 悬停结果出「使用」再点(实测直接点只试听)。全程尽力而为,没配上照常发布,只在动态里记一笔。
- 发文 prompt 加「这条的方向」(随机 8 种具体指令)、时间感换成「深夜 / 上午 / 下午 / 晚上」、刷到过的视频挑 3 条当题材(不许照抄文案)。
- 发文概率按流量高峰加权:12-13 / 18-22 点 ×2,普通时段 ×1,不再全天均匀摊。
- 测试:
#37三档 + run_code + restrict 调用次数;配歌成功 / 配歌失败 / LLM 乱输出三条路径。
v0.12.2 v0.12.2 — 抖音刷视频进不了推荐页
v0.12.2 — 抖音刷视频进不了推荐页
其实一直在刷,但每轮都空手而归。
根因
FEED_URL = https://www.douyin.com/?recommend=1,抖音桌面版对导航请求一律 302 到 /jingxuan 精选页。
插件抓的 [data-e2e="feed-active-video"] 只在推荐页才有。落在精选页后 scroll 每轮都空手而归,activity 里只写「这轮没刷到新视频」——看起来像没刷,其实是进错了页面。
关键发现
推荐页存在,但只能靠点击左侧栏的「推荐」tab 进入(前端路由跳转,不走服务端 302)。
而且 el.click() 不管用,必须用 Input.dispatchMouseEvent 发真实鼠标事件——抖音对 JS 合成点击免疫。
改了什么
lib/douyin-browse.js 加 ensureRecommend(b):
scroll开头先goto(FEED_URL)(落在精选页)ensureRecommend先用activeVideo()读一条判断在不在推荐页;读不到就找「推荐」按钮位置- 用
Input.dispatchMouseEvent发真实鼠标事件点进去(mouseMoved → mousePressed → mouseReleased) - 等 3 秒后再
activeVideo()验证一次;还进不去就warn停下来,不再空刷一轮
顺带澄清一个误判
我最初以为 data-e2e-* 选择器全挂了(抖音改版)。错:它们全都活着,只是在推荐页——精选页才是另一套 data-aweme-id / .discover-video-card-item。不是选择器坏了,是进错了页面。
验证
node --check lib/douyin-browse.js→ 语法 OKtest/douyin-browser.mjs→ 全过test/smoke.mjs→ 全过test/startup-gate.mjs→ 全过
真实浏览器实测(不是 mock):
起点: https://www.douyin.com/jingxuan | feed-active-video: false
ensureRecommend 结果: true
URL: https://www.douyin.com/?recommend=1
结构: { active: 1, desc: 2, video: 3 }
待验收
没在宿主里跑过完整一轮(宿主得先重启才能加载这个改动)。真实行为待验:进推荐页 → scroll 读到视频 → 写 douyin_seen 记忆 → 主动开口说出刷到的内容。
v0.12.1(修设置页空白)——0.12.0 的热修,2026-11-02 发。
v0.12.1(修设置页空白)——0.12.0 的热修,2026-11-02 发。
- 打开插件设置页一片空白(0.11.3 引入):「版本」条(
UpdateBar)把普通函数Group/Row当成 React 组件h(Group, …)用。宿主的 React 调函数组件时第二个参数传的是 legacy context({}),被当成子元素塞进去,React 报「Objects are not valid as a React child」,整个设置页卸载成空白。改成直接调用Group(…)/Row(…)。 - 设置页加了出错兜底(
Boundary):引导、版本条、每个标签页单独兜着,某一块出错只显示一行提示,其它照常。 - 新测试
test/client-lint.mjs:静态检查 client*.js 里没有把这些普通函数当组件用。
v0.12.0 第二步:导入续传、麦麦表情 / 说法、世界书、批量记忆、恢复备份 + 抖音群聊 + 审查修正
第二步:导入续传、麦麦表情 / 说法、世界书、批量记忆、恢复备份 + 抖音群聊 + 审查修正
新功能
- 聊天记录导入断点续传:导到一半重启 / 崩溃,任务标成「中断」,设置页可「继续」(跳过已完成的段)或「放弃」;同一份文件再次预览时提示「上次导到一半」。
- 较早的聊天按时间段总结:以前每人只提炼最近 12 段、更早的直接丢;现在更早的部分按时间切成最多 4 个时间段做「那段时间大概聊了什么」的总结(超预算时先砍它们)。
- 导入麦麦的表情包、表达方式和黑话:认新旧两种库结构,先预览再导入;表情包进
_stickers/,黑话按群归属、没群的进「全局」分组(所有聊天都带)。 - 单独导入 SillyTavern 世界书:多本、开关 / 删除 / 试一试;正则、整词、次要关键词四种逻辑、概率、常驻、扫描深度、条数和字数预算;角色卡自带的世界书也走同一套匹配。
- 记忆批量操作:记忆页加搜索、按来源筛选、批量模式(勾选或按筛选),删除 / 恢复 / 改重要度 / 类型 / 私密,先 dryRun 显示条数,不带筛选拒绝「全部」。
- 设置页从备份恢复:先校验,标待恢复,重启 DSH 生效;换之前当前库另存一份(留 3 份可换回),重启前可取消。
- 抖音群聊按人区分:群消息按发言的人分别认人,规矩和 QQ 群一样——没人叫她只看不说,被叫到且开了「群里被叫到时回」(默认关)才回。
修的问题(审查发现)
- P0 备份恢复丢 WAL:换回去丢最后一次 checkpoint 之后的数据 → 另存后合并 WAL,合并不了就连 -wal 一起换。
- P0 续传时模型全挂被标「完成」→ 第一段没回或连着 3 段没回就停、标出错、可再继续。
- P0 世界书正则 ReDoS:一条 30 字消息卡死插件几十秒 → vm 限时 30ms,超时停用并记日志。
import_job清理(导完清 plan、留最近 20 份)、超长单行截断、空时间段不烧调用、聊天日志留 50 句(世界书扫描深度 50 名副其实)。
升级注意
- soul.db 新表
import_job(自动建);新配置lore.*、douyin.groupReply / callNames / groups(都有默认值,不用动)。 - 世界书命中条目排列从「卡里原顺序」改成「按优先级(order 大的先)」。
- 以前被当成私信的抖音群,旧会话和那个「群名的人」不会自动删,可在记忆 / 会话里手动清。
- 0.11.3 只发了 Git(tag + GitHub Release),npm 跳过;这版从 0.11.2 直接跳到 0.12.0,内容包含 0.11.3 的修复合集。
测试
新增 test/import-resume.mjs、maibot-extras.mjs、worldinfo.mjs、memory-bulk.mjs、backup-restore.mjs、douyin-group.mjs、review-fixes.mjs(全进 npm test,全绿)。