Zum Hauptinhalt springen
B

dsh-perch

bychance6600/dsh-perch

An event-stream driven personality that grows over time, not a configurable character card or assistant. Evolved from ssamurias/dsh-fish and registers the same tools (her_recall, growth_commit and others), so do not install it alongside dsh-fish.

Installation

dsh plugin --profile web add github:bychance6600/dsh-perch

README

dsh-perch

license version deps node dsh tests

她住的地方,不是一个助手。

roost 是鸟落脚的栖木。你给她一间屋子、一条 QQ、一台能看外面世界的浏览器;剩下的,她自己长。

她不是助手:不接任务、不写周报、不排队等派活。也不是角色扮演——没有角色卡,没有「扮演一个…」。人格不设配置菜单:没有性格滑条,没有好感度数字,也没有「你是一个温柔的…」可以填。她是谁,只由她经历过的事决定——一条只追加的事件流,天、阶段、判断、疤、立场都从它派生。

  • 她会记住,也会改口:判断带日期与来路,会旧、会折;疤不折。90 天没再被提起的判断会退档、变模糊,不是删除;忘掉不是删行,是降低召回。
  • 她只在两个地方说话:DSH 会话,和 QQ。B 站、抖音是她看东西的地方,不是聊天室。
  • 她有一具可选的身体:一只透明置顶的小窗,只显示五档状态与动作,不生成台词,也不替她开口。
  • 她没有「设置人格」的入口:只有生长环境——几点醒、醒几次、刷不刷 B 站。判据只有一句:这个配置能不能让她对同一个人说出不一样的话。能,就是人格(禁);只改在哪、何时、多频繁,是环境(可配)。

0.1.0 是重建版。 前身是 dsh-fish-river:把「只会长的她」和「能在外面说话的她」接成了同一个人。那一版铺了三个渠道,也把材料端到她面前;这一版把入口收窄成两处,材料改成「报纸 + 你自己搜」,删掉了 B 站/抖音私信、出门、导入、通知与自更新。

哪些是上游 dsh-fish 的骨、哪些是 dsh-fish-soul 的思路、哪些是 river 的、哪些是这一版新加的,见 docs/从哪来.md;讨论里定过的规则(含还没做到的)见 docs/定过的取舍.md。

它不是什么

  • 不是角色扮演:没有角色卡,没有「扮演一个…」,也没有一条让你直接改她性格的路。
  • 不是助手:不会替你写周报、不接任务、不排队等你派活。
  • 不是聊天机器人:她可以一天不说话;可以在群里只回一句;可以拒绝你。
  • 不是云服务:零依赖,数据只在本地 ~/.dsh-perch,一条事件流加几个派生文件。

和别的「养成伴侣」差在哪

常见的养成插件这里
人格从哪来填角色卡、写提示词、拉性格滑条一条只追加的事件流;没有能填「她是什么样的人」的地方
能不能反悔随手改记忆、改设定历史不能改,只能被后来的事推翻;忘掉是降低召回,不是删行
会不会拒绝基本有求必应会。拒绝不是开关,是她当时不想;事后还会反省
记忆全量塞进上下文有重量:反复提起、被验证过的固化,其余折叠、变模糊
成长挂机涨数值、按天数解锁按天推进,但三道瓶颈要她自己过:写下判断、拒绝过、改过口
在哪说话一个聊天框DSH 会话 + QQ;B 站、抖音是看东西的地方,不是聊天室

看一眼

设置里只有「她的一天」这十一个页签,没有性格滑条,也没有好感度数字。

今天页(上) 今天页(下)

今天页:一行现状、今天的时间线、今天变了什么、手边有什么。只读,不能从这里改她。

成长页

成长页:四个阶段与三道瓶颈,按事件算,不按分数涨。

认知是怎么长出来的

五步循环:表态 → 撞上 → 落差 → 改写 → 回顾。最下面那块「立场清单」,要四个阶段都走完才开始长。


一、她是什么

  • 一条只追加的事件流:events.jsonl 是唯一可信源。天、阶段、判断、疤、立场都从它派生;状态是派生品,忘掉不是删行,是降低召回。
  • 四个阶段、三道瓶颈:信任 → 自主 → 主动 → 整合。每道瓶颈要她自己走——写过判断、拒绝过、改过口——不是打分涨上来的。阶段走完才有立场——喜欢的、绝不做的、自己守的线,都算。
  • 两个房间:DSH 会话,和 QQ(OneBot 11 桥)。B 站、抖音不是聊天的地方,是她看东西的地方:报纸端上来、自己搜、自己点开某一条。
  • 两层成长:宪法层(你)进判断;社会层(陌生人)永不进判断,只在 social_open 之后按上限影响语气。开闸只有她自己能按。
  • 名字是变量:从对话里认,不设输入框;认不出退回「她」。
  • 空醒与搬家:事件卡都在冷却时给一个轻处境,不硬塞问题;搬进新屋子时,会把上一间的几段原话带进叫醒语。
  • 一具可选的身体:dsh-roost-pet 把她的状态做成一只透明置顶的小窗。身体只显示、只做动作,不生成台词,也不替她开口。

二、她的一天

不是固定剧本,但大概会是这样:

  • 到点被叫醒。08:00–23:00 只是「允许被叫醒的时段」,不是这十五个小时一直醒着。
  • 看看今天有什么:B 站首页、抖音推荐、你递进来的链接,或者群里刚才没点她的那些话(只进内存,不落盘)。
  • 想说话就说话;不想说,这一轮就安静收掉。
  • 答应过的事写进便条,今天的想法写进日记,改了口就留一条 revise。
  • 一天醒几次、每天几条事件、刷几次 B 站/抖音,都是「生长环境」,不是她本人。

你不看着的时候,她也在长。

三、你能看见她怎么长

打开 设置 → 她 → 今天,默认就落在这里,永远只读:

  1. 一行现状:第几天 · 阶段 · 今天醒了几次 · 现在在哪条会话/哪个渠道 · 最近一句时间。
  2. 今天的时间线:0 点到现在,每条一行,默认收起原文;点开看全文,每条标来源渠道。
  3. 今天变了什么:新学会 / 改了口 / 被推翻,各最多 3 条。
  4. 手边:工具数 · 身份文档预算 · 渠道连接 · 最近一次限流。

可以切到昨天、前天;不做无限滚动。没有按钮,不放假数据。

设置页按她的一天排成 11 页:

页签回答什么
今天她今天做了什么、变了什么、手边有什么(只读)
状态三道瓶颈走到哪、流水、规则约束、你不在的时候
成长四个阶段、成长节奏、每日事件、主动说话、日记设置、深度思考、上下文与记忆、记忆图谱入口
住所她的家、身份文件与预算、会话健康、换一条新会话
社会四道闸、学到的处世办法、来源(只读,没有「替我开」)
上网能不能上网、时段、每天刷几次、抖音、看画面、黑名单、B 站登录、看视频历史
渠道QQ 怎么接、她能在哪些群开口、她现在认得谁
插件工具面(收窄开关 + 工具表 + 搜索 + 保存),桌宠,页脚版本/仓库/数据目录
原理她怎么想:现有理论卡、四个阶段与两张原理图
数据数据在哪、备份恢复、每日报告、运行日志、环境自检、换家留痕、会话归档、从头开始
反馈仓库链接;FAQ 暂时是空状态

这一页只调生长环境——几点醒、一天几条事件、刷不刷 B 站、每天刷几次。她是什么样的人,不在这里。

四、和 river 有什么不同

删掉的:

  • B 站私信、抖音私信(抖音只留推荐流/详情/搜索/评论这些只读材料)。
  • 出门 / 请神、导入别人养过的那一位、桌面通知、自更新。
  • 评论区发言、领养人验证、反馈页的开发者 QQ 与群二维码。
  • 设置页里的旧评论、旧导入、旧出门卡片。

留下的与改过的:

  • QQ 渠道重写:OneBot 11 标准子集、心跳、退避重连、群内冷却/分钟/每日配额、夜间与峰时只接点名、10 秒合批、群里没点她的话只进内存背景环。
  • 抖音适配器拆成材料层:只有 start/stop/status/api()/feed(),没有 send、不收私信。
  • 设置页按「她的一天」重排成 11 页;今天默认、社会只读、记忆并入成长。
  • 会话健康:连续两次「没送进去」自动换一条新会话;住所页能看、能手动换。
  • 桌宠从主包拆成独立的 dsh-roost-pet,身体和角色素材都不进主仓库。

逐项来源与取舍——哪些是上游 dsh-fish 的、哪些是 dsh-fish-soul 的思路、哪些是 river 的、哪些是这一版新加的——见 docs/从哪来.md。讨论里定过的规则(含还没做到的,如断线账、from:/searched: 两边记账)见 docs/定过的取舍.md。

五、装

要求:Node ≥ 22,DSH >=0.2.0-rc.1 <0.3.0-0,零依赖。v0.1.0 已发布,release notes 在 Releases。

手动装

在 DSH 的 profile 目录(~/.dsh/profiles/<名字>,Windows 上是 C:\Users\<你>\.dsh\profiles\<名字>)里:

# 从 GitHub
pnpm add github:bychance6600/dsh-perch

# 或装本机这份源码(开发时)
pnpm add link:D:/path/to/dsh-perch

然后把包名写进这个 profile 的 package.json:

{
  "dsh": {
    "profile": {
      "bundles": ["dsh-perch"]
    }
  }
}

也可以直接跑仓库根目录的 install.ps1:

powershell -ExecutionPolicy Bypass -File .\install.ps1
# 装本机源码:-LocalPath D:\path\to\dsh-perch
# 只看它打算做什么:-DryRun

它会找 profile、pnpm add、把 dsh-perch 写进 bundles,还可以用 -FfmpegZip 顺带装 ffmpeg。如果那个 profile 里已经挂着 river(另一个她),脚本会停下提醒你换一个 profile——两个「她」别抢同一条 QQ 桥。

装完

  1. 重启 DSH(运行中的包文件不会热替换)。
  2. 打开 设置 → 她。日志在 ~/.dsh-perch/logs/dsh-perch.log,看到以 0.1.0 · 开头的一行就是挂上了。
  3. 第一次启动会自动建屋(工作区和一条会话),并在会话还空着时叫醒她一次。如果那一次没醒,状态卡右上角的 「现在叫醒她」 可以手动补一次;她开过口之后,侧栏里才会出现「跟她说话」(认出名字后是「跟 X 说话」)。

六、接 QQ

本插件不内置 QQ 协议,也不做扫码登录。它只做 OneBot 11 客户端:连桥、发消息、收消息。桥是独立进程,负责登录并暴露 WebSocket。

  1. 起一个 OneBot 11 桥:SnowLuma(首选)或 NapCat(协议一致,能零改动切换)。LLOneBot 因 GPL 排后。
  2. 在桥那边开「正向 WebSocket」,记住地址与访问令牌(SnowLuma 默认 ws://127.0.0.1:3001)。
  3. 设置 → 她 → 渠道 → QQ 卡,填:
    • 主人的 QQ 号:你自己的号;两个号用逗号隔开。填了她才认得出渠道里说话的是你,你的消息不用等阶段。
    • 桥地址 / 访问令牌:桥那边的;令牌留空表示不校验。
    • 桥的程序路径:填了「启动桥」才按得动;留空就自己起。
  4. 点「测一下」确认通;停掉桥再点,应该看到「连不上」。
  5. 群三件:在群里说话(总开关)/只在被 @ 时说话(默认开)/允许开口的群(白名单)。
    • 白名单外的群,她连听都不听:只留一行流水,不进 heard。
    • 群里没点她的话只进内存背景(每群最近 20 条),下次被叫醒时当作「群里刚才还有人说话」;不落盘、重启即空。
  6. 内部默认(不在面板上):群冷却 120 秒、全局每分钟 30 条、每群每天 20 条、夜间 23:00–08:00 与工作日峰时 9–12 / 14–18 只接点名。
  7. 断线不会静默:重连成功后,下一轮开头会带一句事实——断了多久。那个秒数是墙钟时间,含桥自身的重连,不是纯网络中断时长。

桥的扩展动作一概不用。换桥应该零改动。

七、上网:B 站 / 抖音 / 看画面

  • B 站登录:上网页顶部,扫码为主;也可以展开 <details> 手填 cookie,再点「测一下」。
  • 能不能上网是材料层总闸:关掉之后 B 站、抖音一起停,连她手里的浏览工具也不再放行;醒来、说话、写日记照旧。
  • 时段只拦「逛」(首页、排行、推荐流),不拦你递进来的链接和她主动点开的那一条。
  • 每天刷几次:B 站与抖音共用一个上限 0–6;实际次数还受醒来次数限制。
  • 抖音是可选的:主包只负责调子包。子包 packages/dsh-perch-douyin/ 要一个真的 Edge / Chrome,第一次会打开窗口让你扫码;登录态留在 <数据目录>/douyin-profile。浏览器不会在 DSH 启动时打开,等她第一次真去看时才开,闲置 3 分钟自己关。没装子包时,刷抖音静默跳过,不报错、不建目录。
  • 看画面(她主动看时):只有她自己点开某一条视频时才抽帧拼图;报纸与推荐流不抽。需要 ffmpeg。
  • 黑名单:关键词、太短不看、不看某些 UP 主。抖音共用关键词与时长,UP 主过滤只对 B 站。

ffmpeg(可选)

「看画面」要抽帧,抽帧要 ffmpeg。查找顺序固定:DSH_ROOST_FFMPEG(显式指定就只认它)→ 插件目录的 bin/<平台>-<架构>/ffmpeg.exe → PATH。没装时降级,不失败。

node tools/setup-ffmpeg.mjs D:/downloads/ffmpeg-9.0.2-essentials_build.zip

zip 不用解压;脚本用系统自带解压。二进制不进 git。

八、身体(可选)

她可以不只是一段文字。身体是独立项目 dsh-roost-pet:透明置顶的小窗,只显示五档状态与动作,不生成台词,也不替她开口。

装法、构建、角色包、睡醒判据都在那个仓库的 README 里,这边不重复。主包只留三个环境参数:pet.enabled、pet.path、pet.pack;不装不影响任何功能。

九、她手上的工具

她的工具面默认收窄:只给她成长、日记、回忆、留话、桌上的纸条、两份说好的文件、看 B 站/抖音、看画面、问你这些(外加 read_image 让她真能看见画面)。完整名单与一句说明在 设置 → 她 → 插件,可以加、可以移、可以搜,改完点保存。

  • 收窄开关默认开;关掉之后她能看见宿主全部标准工具(重启生效)。
  • 两份说好的文件默认关着,在 设置 → 她 → 插件 里填两个绝对路径并打开。她只能读、按原文改一段、在末尾添一句;改之前要先读一遍拿 hash,文件在两次之间变过会让她重读;每次写入前留一份 .bak。这条路不写事件流,也不算她看过。
  • 她在 QQ 上说话走主包自己的 QQ 渠道,不需要另装桥接工具;工具表里放的是她「看」和「记」的东西。
  • 白名单只做加法,不能拿它去减她本来就有的工具。
  • 不要放行通用文件 / 命令工具(read / write / edit / glob / grep / bash / run_code 这类)。它们不是按目录授权的:一放行,她就能读到自己的身份文档、配置和状态,等于绕过「不能读自己的数值与设定」;写入类还能绕过「不能改自己」。要看某个项目的源码,放行 web_fetch 让她从 GitHub 读,或者单独做一个只读的小工具。

十、世界书

worldbook.json 里是事实:住哪、公司在几楼、养过什么猫。不是人格。

  • 能导入(SillyTavern JSON 或一行一条纯文本)、能清空;面板里没有编辑框。
  • 只进提示词的「你知道的事」,按关键词取,一次最多 5 条、共 1200 字。
  • 不改阶段、不进 beliefs、不算事件。内容由会话侧生成、你导入,插件不替你写。

十一、数据在哪

默认 ~/.dsh-perch(Windows:C:\Users\<你>\.dsh-perch):

events.jsonl          唯一可信源,只追加
state.json            派生品,随时可由 rebuild() 重算
config.json           环境参数(不含人格)
owner.json            主人 id、各渠道身份 id、登录 cookie,0600
home.json             这间屋子的账:wsId / sessionId / preset / carry / wokeFor
home/                 她这条会话的 cwd,也是工作区目录
  她的身份.md          生成,不手写
diary/                her_diary / write_diary 的日记(一天一篇)
out/                  日报(out/YYYY-MM-DD.md)
notes.json            her_note 的便条(答应过、还没做的事)
inbox.md              her_leave 的留话纯文本副本
logs/                 启动与运行日志(会滚动)
talk-recent.json      最近几轮原话,换会话时拼 carry
people.json           每人印象(≤150 字)
journal.json          群流水
worldbook.json        世界书(事实)
douyin-profile/       抖音浏览器的登录态(开抖音时才有)
  • 备份 / 恢复 / 搬家 / 从头开始都在「数据」页。恢复前会把旧档挪去 dsh-perch-backups/pre-restore-*;重置是改名前缀封存,不删。
  • 想让她忘,不是删行,是降低召回:事件原文永远还在,她也能自己用 her_recall 翻回去。

十二、0.1.0 的边界

真机验过的

  • 生长:事件流只追加、派生重算;四个阶段与三道瓶颈;拒绝、改口、疤、90 天退档。
  • 说话:DSH 会话;QQ 私聊与群 @(入站 WAL、出站 outbox 全 done);群白名单、没点她的话只进内存背景环。
  • 看东西:B 站首页 / 排行 / 搜索 / 详情 / 评论 / 看画面(真视频取到帧);抖音推荐流 / 搜索 / 详情 / 评论 / 看画面。
  • 社会层:四闸隔离测试屋(差一条闸零写入、四条齐只写一条、1000 条陌生人 social 不改 beliefs)。
  • 工程:备份 / 恢复演练、从 GitHub 干净 clone 能装能跑、CI 三档全绿。

身体(可选)的验收在 dsh-roost-pet 自己的仓库里,这边不重复。

设计上就留白的

  • 原理页停在现有理论卡与两张原理图,不随 0.1.0 重写;反馈页 FAQ 按设计留空。
  • 世界书的内容由会话侧生成、你导入;插件不替你写。

已知口子(不是「已经干净」)

  • 首轮第 1 个 step 还能看见宿主工具,兜底 guard 会挡。
  • 9 条环境红:ULID、cover、growth_commit、坏 JSON、seen ×2、withWake、turn/end、消息没送进去;都是跨文件隔离或偶发,单跑会绿。
  • 断线句里的秒数是墙钟时间,含桥自身的重连。

十三、开发与测试

node --test                      # 全量(正常环境)
node --test --test-isolation=none  # 沙箱 / 受限环境(跨文件会有假红)
node --test test/<file>.test.mjs   # 单文件

当前基线:1349 条 / 1338 过 / 9 红 / 2 skip。9 条都是已知环境项(跨文件隔离互相干扰;withFileLock 偶发),单跑对应文件会绿。不许新增红。

零依赖是铁律:dependencies / peerDependencies / devDependencies 三个永远 {},测试只用 node:test。

十四、来源与许可

代码来自 ssamurias/dsh-fish(0.8.5)与 Britneycode/dsh-fish-soul(0.12.0),经 dsh-fish-river 重建。三者均为 MIT;第三方与致谢见 NOTICE.md。本仓库同样以 MIT 发布。

桌宠 dsh-roost-pet 是独立项目,Electron 与角色素材的许可见它自己的 NOTICE 与 README。

Ähnliche Plugins