dsh-world 0.0.0-stage → 0.6.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +298 -0
- package/CONTRIBUTING.md +161 -0
- package/INSTALL.md +311 -0
- package/LICENSE +21 -0
- package/README.md +229 -2
- package/client/index.js +719 -0
- package/cordis.patch.yml +6 -0
- package/lib/archive.d.ts +6 -0
- package/lib/archive.js +49 -0
- package/lib/archiveSelection.d.ts +14 -0
- package/lib/archiveSelection.js +27 -0
- package/lib/compaction.d.ts +124 -0
- package/lib/compaction.js +273 -0
- package/lib/compactionRegion.d.ts +42 -0
- package/lib/compactionRegion.js +210 -0
- package/lib/console/homeApply.d.ts +24 -0
- package/lib/console/homeApply.js +97 -0
- package/lib/console/routes.d.ts +66 -0
- package/lib/console/routes.js +161 -0
- package/lib/console/snapshot.d.ts +54 -0
- package/lib/console/snapshot.js +58 -0
- package/lib/ecosystem/bridge/bridge.d.ts +38 -0
- package/lib/ecosystem/bridge/bridge.js +142 -0
- package/lib/ecosystem/bridge/route.d.ts +9 -0
- package/lib/ecosystem/bridge/route.js +46 -0
- package/lib/ecosystem/qq/panel.d.ts +71 -0
- package/lib/ecosystem/qq/panel.js +171 -0
- package/lib/ecosystem/qq/route.d.ts +47 -0
- package/lib/ecosystem/qq/route.js +152 -0
- package/lib/ecosystem/qq/snowluma-start.d.ts +7 -0
- package/lib/ecosystem/qq/snowluma-start.js +37 -0
- package/lib/ecosystem/qq/supervisor.d.ts +32 -0
- package/lib/ecosystem/qq/supervisor.js +67 -0
- package/lib/ecosystem/qq-native/batch.d.ts +15 -0
- package/lib/ecosystem/qq-native/batch.js +23 -0
- package/lib/ecosystem/qq-native/home.d.ts +24 -0
- package/lib/ecosystem/qq-native/home.js +30 -0
- package/lib/ecosystem/qq-native/index.d.ts +145 -0
- package/lib/ecosystem/qq-native/index.js +429 -0
- package/lib/ecosystem/qq-native/native-bridge.d.ts +54 -0
- package/lib/ecosystem/qq-native/native-bridge.js +290 -0
- package/lib/ecosystem/qq-native/outbox.d.ts +18 -0
- package/lib/ecosystem/qq-native/outbox.js +59 -0
- package/lib/ecosystem/qq-native/replies.d.ts +29 -0
- package/lib/ecosystem/qq-native/replies.js +29 -0
- package/lib/ecosystem/qq-native/sdkInstall.d.ts +35 -0
- package/lib/ecosystem/qq-native/sdkInstall.js +79 -0
- package/lib/ecosystem/qq-native/snowluma.d.ts +104 -0
- package/lib/ecosystem/qq-native/snowluma.js +636 -0
- package/lib/ecosystem/shared/context.d.ts +28 -0
- package/lib/ecosystem/shared/context.js +84 -0
- package/lib/ecosystem/shared/identity.d.ts +15 -0
- package/lib/ecosystem/shared/identity.js +36 -0
- package/lib/ecosystem/shared/outlets.d.ts +43 -0
- package/lib/ecosystem/shared/outlets.js +70 -0
- package/lib/ecosystem/shared/sessions.d.ts +16 -0
- package/lib/ecosystem/shared/sessions.js +52 -0
- package/lib/ecosystem/shared/turn.d.ts +34 -0
- package/lib/ecosystem/shared/turn.js +119 -0
- package/lib/ecosystem/wechat/archive.d.ts +24 -0
- package/lib/ecosystem/wechat/archive.js +62 -0
- package/lib/ecosystem/wechat/home.d.ts +22 -0
- package/lib/ecosystem/wechat/home.js +38 -0
- package/lib/ecosystem/wechat/images.d.ts +5 -0
- package/lib/ecosystem/wechat/images.js +49 -0
- package/lib/ecosystem/wechat/index.d.ts +43 -0
- package/lib/ecosystem/wechat/index.js +212 -0
- package/lib/ecosystem/wechat/messages.d.ts +35 -0
- package/lib/ecosystem/wechat/messages.js +44 -0
- package/lib/ecosystem/wechat/presence.d.ts +6 -0
- package/lib/ecosystem/wechat/presence.js +56 -0
- package/lib/ecosystem/wechat/reading.d.ts +18 -0
- package/lib/ecosystem/wechat/reading.js +89 -0
- package/lib/ecosystem/wechat/sending.d.ts +31 -0
- package/lib/ecosystem/wechat/sending.js +219 -0
- package/lib/ecosystem/wechat/supervisor.d.ts +39 -0
- package/lib/ecosystem/wechat/supervisor.js +138 -0
- package/lib/faults.d.ts +10 -0
- package/lib/faults.js +13 -0
- package/lib/history.d.ts +16 -0
- package/lib/history.js +80 -0
- package/lib/hostContract.d.ts +25 -0
- package/lib/hostContract.js +1 -0
- package/lib/http.d.ts +18 -0
- package/lib/http.js +39 -0
- package/lib/index.d.ts +204 -0
- package/lib/index.js +449 -0
- package/lib/life/activity.d.ts +14 -0
- package/lib/life/activity.js +97 -0
- package/lib/life/alarm.d.ts +39 -0
- package/lib/life/alarm.js +132 -0
- package/lib/life/alarmTimer.d.ts +22 -0
- package/lib/life/alarmTimer.js +49 -0
- package/lib/life/diary.d.ts +4 -0
- package/lib/life/diary.js +9 -0
- package/lib/life/earlyStop.d.ts +19 -0
- package/lib/life/earlyStop.js +25 -0
- package/lib/life/home.d.ts +36 -0
- package/lib/life/home.js +78 -0
- package/lib/life/host.d.ts +20 -0
- package/lib/life/host.js +23 -0
- package/lib/life/journal.d.ts +20 -0
- package/lib/life/journal.js +59 -0
- package/lib/life/lifeStore.d.ts +16 -0
- package/lib/life/lifeStore.js +105 -0
- package/lib/life/messages.d.ts +17 -0
- package/lib/life/messages.js +53 -0
- package/lib/life/notify.d.ts +25 -0
- package/lib/life/notify.js +79 -0
- package/lib/life/photoTools.d.ts +9 -0
- package/lib/life/photoTools.js +51 -0
- package/lib/life/photos.d.ts +27 -0
- package/lib/life/photos.js +104 -0
- package/lib/life/pricing.d.ts +4 -0
- package/lib/life/pricing.js +30 -0
- package/lib/life/runtime.d.ts +58 -0
- package/lib/life/runtime.js +487 -0
- package/lib/life/toolRegistry.d.ts +26 -0
- package/lib/life/toolRegistry.js +83 -0
- package/lib/life/tools.d.ts +24 -0
- package/lib/life/tools.js +47 -0
- package/lib/life/types.d.ts +88 -0
- package/lib/life/types.js +1 -0
- package/lib/persona.d.ts +10 -0
- package/lib/persona.js +29 -0
- package/lib/promptSection.d.ts +36 -0
- package/lib/promptSection.js +108 -0
- package/lib/qq-line.d.ts +2 -0
- package/lib/qq-line.js +115 -0
- package/lib/runtime.d.ts +24 -0
- package/lib/runtime.js +260 -0
- package/lib/self.d.ts +10 -0
- package/lib/self.js +36 -0
- package/lib/sourceArchive.d.ts +27 -0
- package/lib/sourceArchive.js +173 -0
- package/lib/store.d.ts +30 -0
- package/lib/store.js +191 -0
- package/lib/timeContext.d.ts +3 -0
- package/lib/timeContext.js +13 -0
- package/lib/types.d.ts +127 -0
- package/lib/types.js +1 -0
- package/lib/workspacePermissions.d.ts +18 -0
- package/lib/workspacePermissions.js +22 -0
- package/lib/worldPrompt.d.ts +47 -0
- package/lib/worldPrompt.js +49 -0
- package/lib/worldScope.d.ts +22 -0
- package/lib/worldScope.js +26 -0
- package/lib/worldSwitch.d.ts +50 -0
- package/lib/worldSwitch.js +89 -0
- package/package.json +114 -6
- package/scripts/enable-tool-free-compaction.ps1 +33 -0
- package/scripts/update-world.mjs +168 -0
- package/src/ecosystem/README.md +17 -0
- package/src/ecosystem/wechat/windows/README.md +134 -0
- package/src/ecosystem/wechat/windows/adapter.py +619 -0
- package/src/ecosystem/wechat/windows/binding.py +52 -0
- package/src/ecosystem/wechat/windows/engine/LICENSE +43 -0
- package/src/ecosystem/wechat/windows/engine/NOTICE.md +13 -0
- package/src/ecosystem/wechat/windows/engine/bridge.cpp +229 -0
- package/src/ecosystem/wechat/windows/engine/build.ps1 +19 -0
- package/src/ecosystem/wechat/windows/engine/profiles.json +58 -0
- package/src/ecosystem/wechat/windows/groups.py +27 -0
- package/src/ecosystem/wechat/windows/incoming.py +202 -0
- package/src/ecosystem/wechat/windows/messages.py +75 -0
- package/src/ecosystem/wechat/windows/native.py +180 -0
- package/src/ecosystem/wechat/windows/outgoing.py +95 -0
- package/src/ecosystem/wechat/windows/presence.py +109 -0
- package/src/ecosystem/wechat/windows/quotes.py +76 -0
- package/src/ecosystem/wechat/windows/reading.py +55 -0
- package/src/ecosystem/wechat/windows/requirements.txt +1 -0
- package/src/ecosystem/wechat/windows/sender.py +178 -0
- package/src/ecosystem/wechat/windows/snapshot.py +67 -0
- package/src/ecosystem/wechat/windows/stickers.py +60 -0
- package/src/ecosystem/wechat/windows/wechat.ps1 +75 -0
- package/templates/alarm.md +49 -0
- package/templates/world-prompt.md +51 -0
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,298 @@
|
|
|
1
|
+
# 更新日志
|
|
2
|
+
|
|
3
|
+
## 0.6.4 — 2026-10-29
|
|
4
|
+
|
|
5
|
+
本版恢复相册,新增家会话提示词应用入口和 QQ SDK 按需安装,并修复微信独立发送被待核对记录阻塞的问题。
|
|
6
|
+
|
|
7
|
+
- 恢复家会话的相册工具和控制台独立相册页:收藏本轮图片、分页查看和移除,图片与索引使用同一事务;旧相册导入时保留原文件,不自动将图片放入后续上下文。
|
|
8
|
+
- 微信群聊动静随现有闹钟送入家会话:普通群消息只累计持久化的未读数和最后发言信息,不唤醒、不注入正文;成功读取最新页后清零,自己的发言不计未读,过期或离线数据不展示。概况在自定义闹钟模板渲染后追加,不改写个人文件,不规定是否发言。
|
|
9
|
+
- QQ 的 SnowLuma SDK 改为可选 peer,首次手动开启 QQ 时缺少依赖就复用宿主包管理器按需安装,完成后提示重启;不使用 QQ 时不安装,失败不重新开启 QQ。移除 `postinstall`、SDK 文件修补脚本及更新器修补步骤,不自动升级 Node,核心 Node 要求不变。
|
|
10
|
+
- 人设和世界提示词页面新增「应用并压缩家会话」:等待家空闲后执行一次,维护期间刷新已保存配置后再放行排队消息;显示进度与失败原因,停止世界取消任务,无可压缩内容时仍刷新配置。
|
|
11
|
+
- 记忆块刷新失败时,将具体原因显示在世界面板健康状态中,成功重试后清除;保留原有错误传播,不自动追加可能重复的记忆块。
|
|
12
|
+
- 世界控制台新增微信独立页面并恢复 QQ 独立页面入口,概览保留接入开关,详细状态和设置移到各自页面;顶部标签可随可用宽度换行。
|
|
13
|
+
- 修复微信入站 pending 冻结独立发送队列(#20):待核对记录继续阻止入站重放,独立发送任务按各自 ID 和回执运行,结果不明的原任务只补报回执、不重发。
|
|
14
|
+
- 微信回执、任务领取、状态和群读取结果请求遇到 HTTP 502/503/504 或连接错误时有限退避重试,错误保留响应正文;生成回复的请求保持只发送一次,每次重试重新读取宿主地址和令牌。
|
|
15
|
+
- 补充适配器核对与升级运行数据保留说明。
|
|
16
|
+
- 在 Windows 微信 4.1.15.56 私聊中完成两条真实文字发送验证,任务领取及回执 503 使用本机故障注入,确认没有重复发送;完整 DSH 联动尚未验证。
|
|
17
|
+
|
|
18
|
+
## 0.6.3 — 2026-10-28
|
|
19
|
+
|
|
20
|
+
本版按项目规范重写合入 PR #11 的 QQ 功能,QQ 改为默认关闭、SDK 改为可选依赖;修正档案范围对房间工作区的判断,并更新贡献协议。
|
|
21
|
+
|
|
22
|
+
### QQ 通道
|
|
23
|
+
|
|
24
|
+
- QQ 默认关:`qqNative.enabled: true` 只是允许它存在,要在控制台「概览 → 接入」拨开才加载代码、连上通道。`@snowluma/sdk` 改为可选依赖,`postinstall` 找不到它时只打印一行并正常退出,没装 SDK 不再让整个插件装不上。已有世界升级后需要在接入卡片里重新拨开 QQ。
|
|
25
|
+
- 同一会话 `batchQuietMs`(默认 10 秒)内连着来的话攒成一条再问她,最多等 30 秒;群里每句前面带着说话的人。
|
|
26
|
+
- 回答按空行分成几条发,中间停 600ms;回话里的 `[[img:路径]]`、`[[face:id]]`、`[[at:QQ号]]` 变成图片、QQ 表情和 @,`[[sticker:…]]` 按序号或备注里的意思挑一个收藏表情单发,`[[qzone:…]]` 发一条 QQ 空间说说。
|
|
27
|
+
- 发不出去的消息排队,每 3 秒重试,最多留 5 分钟,卡上显示待发条数。
|
|
28
|
+
- 静默(`mutedUntil`,或卡上「静默到这个点」):照收、照记上下文但不回,到点自己醒。
|
|
29
|
+
- 卡上可以改私聊与群白名单,改完立即生效;改动与自动回复、静默、阳台端口一起存在 `qq-native.json`,一次请求里给的几项一起生效。
|
|
30
|
+
- 她在家里自己开的那一轮(闹钟、世界线)说完的话推一份给主人(新配置 `ownerQQ`,空着取 `allowPrivate` 第一个);只看她的家,有人说话的轮次不另推,静默时不推。
|
|
31
|
+
- 看门狗(`supervise`,默认开):QQ 开着时每 30 秒探一次 `wsUrl` 的端口,不通就按 `snowlumaHome` 拉起 SnowLuma(优先借 `SnowLuma-watchdog` 计划任务);卡上显示状态,另有「拉起 SnowLuma」按钮手动拉一次。
|
|
32
|
+
- `@全体` 不再算叫她;入站图片和语音的占位带上 file 名。
|
|
33
|
+
- 移除 README / INSTALL 里已拆掉的“主动开口”引擎文档(`proactive`、`qq-proactive.json`)。
|
|
34
|
+
|
|
35
|
+
### 档案范围
|
|
36
|
+
|
|
37
|
+
- `archiveScope: workspace` 改为按房间路径找她的工作区,与世界作用范围用同一判断。此前按“第一个包含家的工作区”查找,家若同时出现在别的工作区里,那个工作区的会话会被算进她的档案。
|
|
38
|
+
|
|
39
|
+
### 实机验证(Docker,DSH 0.2.1-rc.3)
|
|
40
|
+
|
|
41
|
+
- 全新 DSH_HOME 上 `dsh plugin add` 安装成功;宿主启动无加载失败,QQ 未拨开时不触碰 SDK,世界启动后家直接建在房间工作区。
|
|
42
|
+
- SDK 损坏时拨开 QQ,只出现 QQ 自身的健康故障,世界、家和路由不受影响。
|
|
43
|
+
- 删除房间工作区后重启,插件重建房间并把原来的家迁回,不重建家、不重复问候。
|
|
44
|
+
- 已知限制:pnpm 10 默认不执行依赖的安装脚本,`dsh plugin add` 后 SnowLuma SDK 未修补,需要先手动运行包内 `scripts/patch-snowluma.mjs` 再拨开 QQ。
|
|
45
|
+
|
|
46
|
+
### 仓库与贡献协议
|
|
47
|
+
|
|
48
|
+
- 删除仅用于本地冒烟的 `docker/` 目录。
|
|
49
|
+
- 贡献协议新增「世界的作用范围」「生活线与她的主动性」「代码设计」「外部依赖」四节:一个 PR 只做一件事;平台 SDK 只能是可选依赖、模块默认关闭,新依赖先开 Issue;插件不往对话里推提醒,改动生活线核心或给她新增工具之前先开 Issue。
|
|
50
|
+
|
|
51
|
+
## 0.6.2 — 2026-10-28
|
|
52
|
+
|
|
53
|
+
本版把世界的影响收束到她的房间工作区,修复闹钟“记为送达却没跑起来”和 Windows 系统通知不显示,并整理各通道的重复实现。
|
|
54
|
+
|
|
55
|
+
### 世界只在房间工作区里(#15)
|
|
56
|
+
|
|
57
|
+
- 记忆块、世界提示词、世界线工具、微信 / QQ / 阳台通道和桥接只进入房间工作区内匹配预设的普通会话;会话中途离开工作区时撤下记忆块,已携带世界上下文的请求会被拦下并提示重发。工作区由宿主登记的房间路径决定,宿主尚无工作区服务时一律视为不在。
|
|
58
|
+
- 工作区外只剩两项影响:人设(映射到系统提示词,所有匹配预设的会话都会带上),以及启用后的只留对话压缩(替换整个 profile 的压缩方式)。README 写明了这两项。
|
|
59
|
+
- 控制台新增「工作区权限」:选择房间工作区里新建会话的默认权限,选项沿用宿主权限预设,默认完全权限;已有会话及其手动权限不受影响。家不再在每次打开时被强制改成完全权限。
|
|
60
|
+
- 没有工作区就不建家,控制台显示原因;去掉“家照样打开、只是不分组”的兜底。
|
|
61
|
+
- 与世界无关的会话(其他预设、子代理)不再被读取完整日志;从世界会话继承了记忆块的子会话仍会撤下记忆块。
|
|
62
|
+
|
|
63
|
+
### 闹钟以“这一轮真正开始”为送达(#17)
|
|
64
|
+
|
|
65
|
+
- 送出前先在 `life.json` 记下待确认的消息,宿主在这一轮 `step/start` 后写下这条消息才算送达并写入 `wakes.jsonl`。闹钟、新家的第一句话、重新开始的那句话和每日回顾都按此确认。
|
|
66
|
+
- 这一轮没开始就结束,或重启后发现消息已丢失,就把闹钟放回去重新送(她期间自己定的计划优先);重启前其实已跑过的只补记,不重发。上一条确认前不送下一条。
|
|
67
|
+
- 送进家 5 分钟这一轮仍未开始,控制台提示卡住的时间点。
|
|
68
|
+
|
|
69
|
+
### Windows 系统通知(#19)
|
|
70
|
+
|
|
71
|
+
- 不同版本桌面版注册的通知身份不同(`com.deepseek.dsh` 或 `electron.app.DeepSeek Harness`)。未配置时在开始菜单里按此顺序查找,再找名字含 “DeepSeek Harness” 的条目;找不到、或 Windows 关闭了该应用通知时明确报错,不再静默“成功”。
|
|
72
|
+
- 新增配置 `toastAppId`,手动指定的值同样核对开始菜单;找到的身份在进程内缓存,失败后重新查找。
|
|
73
|
+
|
|
74
|
+
### 微信读取与其他修复
|
|
75
|
+
|
|
76
|
+
- 微信数据库 WAL 只剩过期帧时不再合并,避免依赖库改写页数后读到旧数据。
|
|
77
|
+
- 微信模块在提示词组装时读取了未注入的 `systemPrompt` 服务,会让刚进入工作区的会话那一轮失败;改用会话自身的服务。
|
|
78
|
+
- 工作区权限在新会话工作目录不存在时不再让会话创建失败;路径比较使用规范化大小写。
|
|
79
|
+
- QQ 面板先改阳台端口时会覆盖已保存的自动回复开关,已修复。
|
|
80
|
+
- 阳台与微信、QQ 一样,把因长度上限被截断的回复视为失败,不再发出半句话。
|
|
81
|
+
- 默认世界提示词补充:从哪个渠道、哪个会话收到消息,就回到同一渠道、同一会话。已有自己 `world-prompt.md` 的世界不受影响。
|
|
82
|
+
|
|
83
|
+
### 整理
|
|
84
|
+
|
|
85
|
+
- 工作区判断、世界会话判断、工作区外拦截、工具守卫和重新组装提示词各收成一处(`archiveSelection.ts`、`sourceArchive.ts`、`worldScope.ts`);拦截报错统一为「会话不在世界工作区内」。
|
|
86
|
+
- 微信、QQ、阳台“送一句话并等这一轮回复”的排队、超时与回复判断合并到 `ecosystem/shared/turn.ts`。
|
|
87
|
+
- 清理 QQ 通道里“主动开口”拆除后的遗留代码,合并控制台重复的请求、保存失败与状态显示写法。
|
|
88
|
+
|
|
89
|
+
## 0.6.0 — 2026-10-28
|
|
90
|
+
|
|
91
|
+
本版接入原生 QQ 通道,增加微信主动读群和引用消息支持,修复记忆重载、坏会话隔离及归档队列竞态,并提供编译安装包和 Windows / Linux CI。她是否看群、何时参与,仍由既有世界线决定。
|
|
92
|
+
|
|
93
|
+
### 微信:主动读群与引用消息
|
|
94
|
+
|
|
95
|
+
- 新增 `wechat_history`:先用 `wechat_chats` 分页查目标,再按准确 `chatId` 读取已配置群聊,读完可用同一 `chatId` 调用 `wechat_send`,并以 `wechat_delivery` 核对结果。读取每页默认 10 条、最多 20 条和 16KB,以稳定游标向前翻页,不推进接收游标,不自动发言,也不把整段历史写入共享记忆。
|
|
96
|
+
- 主动读取复用现有适配器、绑定账号、聊天白名单和数据库快照。世界会话可自行调用,无需等待 @;没有新增独立的群聊定时器、轮询唤醒或判断模型。默认世界提示词补充了可自主看群、参与或只看的说明,措辞不区分 QQ 与微信;实际工具能力由各通道提供。
|
|
97
|
+
- 支持微信应用消息 49 / 子类型 57 的引用回复:当前留言与引用的原作者、原消息 ID、类型和文字分别解析,私聊、群上下文及主动历史读取复用同一逻辑。群入站仍需真实 @ 触发;嵌套引用只保留被引消息标题,不递归展开整条引用链。
|
|
98
|
+
- 当前留言和明确标为“引用”的文字合成一条用户发言归档;只有引用、没有新文字时也保留这次发言,不额外增加一轮。引用内容明确作为数据,不视为原作者的新发言或指令。
|
|
99
|
+
- 引用图片或表情包时,按同一绑定账号、同一聊天的原消息服务器 ID 定位,并核对原作者和媒体类型,复用已有图片缓存或表情包下载校验;本次会话可读取媒体,GIF 只看首帧并明确注明。共享记忆只保留文字类型和当时的读取状态,不带图片内容或附件索引;是否另存相册由她自行决定。
|
|
100
|
+
- 引用部分缺失或无法读取时保留当前留言,并明确标为未读取、记录具体故障。完全损坏的应用消息在提交模型前记为 `rejected`,避免反复阻塞后续消息;宿主请求失败、网络失败和发送结果不明仍沿用人工核对保护,不自动重跑或重发。
|
|
101
|
+
- 宿主连接协议升级为 `4`,并用 `references: true` 声明引用能力。新适配器启动前检查宿主能力,避免静默丢失引用;升级必须同步重启宿主插件和配套适配器。
|
|
102
|
+
|
|
103
|
+
### 原生 QQ 通道与加载隔离
|
|
104
|
+
|
|
105
|
+
- `src/ecosystem/qq-native/` 通过 WebSocket 直接连接 SnowLuma OneBot,接收群聊、私聊并原路回复。默认每群独立会话,主人私聊可复用家会话;会话绑定方式可配置。
|
|
106
|
+
- 默认 `groupTrigger: 'mention'`,被 @、引用她发过的消息或命中 `groupKeywords` 才触发模型,其余只保留上下文;也可显式设为 `all`。状态区分最近收到事件和被白名单拦下的消息。
|
|
107
|
+
- QQ 关闭时不加载 SDK;启用时动态加载,启动失败只显示 QQ 自身健康故障。世界重启、插件重载均遵守已持久化的 QQ 开关,关闭后不会自行重连。
|
|
108
|
+
- 固定 SnowLuma SDK 为 `1.14.22`,安装脚本补齐其相对 ESM 导入的 `.js` 后缀;使用 `ws` 保持 Node 22 兼容。包管理器禁用安装脚本时,需手动执行包内 `scripts/patch-snowluma.mjs`。
|
|
109
|
+
- 本地 WebSocket“阳台”入口继续提供独立连接上下文,连接信息写入世界目录的 `qq-bridge.json`,命令行入口为 `lib/qq-line.js`。
|
|
110
|
+
- 移除外部 `qq-bridge` 的拉起、停止、巡检、旧会话绑定与“主动开口”引擎,以及 `qqBridgeDir` 等旧配置;控制台不再显示旧主动联系块。现有用户需迁移到 `qqNative`,连接已由本人安装并登录的 SnowLuma。
|
|
111
|
+
|
|
112
|
+
### 记忆、归档与人设
|
|
113
|
+
|
|
114
|
+
- 记忆重载按当前会话已有消息 ID 统一去重。微信出站正文已在会话中时,记忆块只补发送状态摘要;其他会话仍可回忆完整正文,不增加微信专用正文判重规则。
|
|
115
|
+
- 损坏的源会话日志被隔离,同时在健康状态显示会话 ID 和未归档原因;覆盖启动回放和活动会话热重载初始化。坏会话不会撤掉其他会话的记忆挂钩;成功重放或源会话删除后清除相应故障,已归档记录保留。一般 I/O 错误继续明确失败。
|
|
116
|
+
- 修复归档任务完成与再次入队之间的竞态,避免新增消息漏归档却被 `flush()` 误报成功。
|
|
117
|
+
- 人设文件中的普通二级 Markdown 标题保留在所属层正文,不再被误当作新的人设槽位而截断。继续保留既有默认 200 轮、记忆范围和宿主自动压缩恢复规则。
|
|
118
|
+
|
|
119
|
+
### 编译包与 CI
|
|
120
|
+
|
|
121
|
+
- 增加随包分发的通用更新脚本 `scripts/update-world.mjs`:指定原 profile、编译 `.tgz` 和 DSH 自带 pnpm,检查 DSH 已退出后完整备份 profile、世界及会话,保存安装包副本,再执行更新和文件校验;失败恢复旧 profile,保留失败现场。无需 Git、npm 或 TypeScript,不覆盖自定义世界文件、不重放旧消息;使用说明及恢复限制见 INSTALL.md。
|
|
122
|
+
- 安装包包含预编译 `lib`、类型声明、客户端、模板及 Windows 微信适配器;安装成品不需要本地 TypeScript 编译器。源码开发仍通过锁文件安装依赖,再执行类型检查与构建。
|
|
123
|
+
- 新增 `main` 推送、PR 和手动触发的 Windows / Linux CI:Node 22.16.0 下安装锁定依赖,执行类型检查、Node 测试、构建、打包及全新消费目录安装检查;Windows 另执行 Python 3.11 微信离线测试。检查后的 `.tgz` 上传为 CI 产物。
|
|
124
|
+
- 安装包检查使用真实生产依赖,验证编译入口、SDK 安装修补及本地模拟 QQ WebSocket 连接,避免仅在源码仓库环境下通过。
|
|
125
|
+
|
|
126
|
+
### 验证、升级与已知限制
|
|
127
|
+
|
|
128
|
+
- 本批代码已通过 329 项 Node 测试、84 项 Python 微信离线测试、类型检查、构建及安装包检查;包含引用与留言合并为一条记录、在新会话恢复纯文字记忆、坏引用后继续处理、图片/表情首帧边界,以及更新脚本的数据保留、损坏输入拒绝、失败恢复、pnpm 链接目录入口和 Windows 进程路径识别。Windows 使用系统 Robocopy 保留 pnpm 目录链接,通用更新流程另用桌面版自带 pnpm 在临时 profile 验证。离线检查不等同真实 QQ / 微信账号收发验收;CI 配置的远端执行结果另行查看。
|
|
129
|
+
- Windows 微信仍仅支持 x64 的 4.1.15.13 / 4.1.15.56 指定构建,按 `Weixin.dll` 大小和 SHA256 匹配;同版本号的其他构建不保证兼容。旧引用消息不会因升级自动重放,发送结果不明的任务也不会自动解锁。
|
|
130
|
+
- 升级前正常退出 DSH 并备份 profile、世界目录和微信状态;用编译包更新原 profile,保留原 worldId、会话、人设、日记、提示词、账号配置、接收游标、发送队列和回执,再启动 DSH。已有自定义 `world-prompt.md` 优先于默认模板,升级不会覆盖,新增看群提示需按需自行同步。
|
|
131
|
+
- 当前预设已有同名人设槽位时仍会追加控制台人设;保存人设不会立即刷新已有会话,需等成功压缩或重载。两项限制继续见 README 注意事项。
|
|
132
|
+
- 本版未宣称修复 #10 的压缩后会话格式错误,也未修改已有会话原始日志。Computer Use、自动存相册、朋友圈和视频号内容读取尚未实现;引用图片在当前会话中被读取,不代表后续共享记忆能再次看到图片。
|
|
133
|
+
|
|
134
|
+
## 0.5.7 — 2026-10-27
|
|
135
|
+
|
|
136
|
+
本版增加 Windows x64 微信 4.1.15.56 的指定构建适配,保留 4.1.15.13,并补齐源码构建需要的直接依赖声明。
|
|
137
|
+
|
|
138
|
+
- 微信版本表改为 `engine/profiles.json`:按 `Weixin.dll` 的文件大小和 SHA256 唯一匹配构建,再使用对应的 19 个原生地址;未知构建或指纹匹配不唯一时,在加载原生桥前拒绝。README 注意事项列出支持版本和平台边界。
|
|
139
|
+
- 监听首启、微信重连与手动发送均先执行不发送消息的原生 Probe,再处理入站消息或领取发送任务。构建不支持时,不调用模型、不推进游标,也不新建结果不明的发送记录;日志与 Probe 输出包含实际匹配的版本。
|
|
140
|
+
- 原生发送器初始化失败时关闭已打开的进程句柄,避免微信退出或重连失败后泄漏资源。C++ 桥及请求 ABI 未改动,已有匹配构建无需仅因版本表更新而重新编译;原生引擎的独立非商业许可和来源说明继续保留。
|
|
141
|
+
- 补充 `@deepseek-ai/dsh-commands` 的 peerDependencies 声明并同步锁文件;`compaction.ts` 和 `compactionRegion.ts` 直接使用其品牌类型,避免严格依赖布局下找不到 `@deepseek-ai/dsh-commands/brand`。不新增 JavaScript 运行时导入。
|
|
142
|
+
|
|
143
|
+
- QQ 模块并入 `main`:外部 `qq-bridge` 的拉起、停止、巡检、会话绑定、SnowLuma 控制台入口与主动聊天开关,统一放在 `src/ecosystem/qq/`,与 `wechat/`、`bridge/` 并列;带入读不动的会话日志时跳过并警告、不拖垮插件启动的容错。QQ 的归档仍沿用桥通过会话接口送入的普通会话,没有微信那样的渠道身份。
|
|
144
|
+
- 世界控制台新增「接入」卡片:微信、QQ 各一个开关,立即生效并记在 `world.json`,默认开。微信开着才注册发送工具、路由并拉起适配器,关掉即撤掉;QQ 开着才由插件管理桥,关掉只停止管理、不停桥进程。配置里没启用的模块不能从控制台打开。
|
|
145
|
+
|
|
146
|
+
### 验证与升级范围
|
|
147
|
+
|
|
148
|
+
- 微信 4.1.15.56 已独立验证 Probe、绑定账号数据库读取、私聊与群聊历史样本、缓存图片及私聊表情读取;向已配置私聊分别发送文字、PNG 和原生 GIF,均取得服务器消息编号,媒体同时核对 MD5。详细记录见微信模块 README。
|
|
149
|
+
- 本机 DSH Desktop 0.2.1-rc.3 升级启动后,原世界、控制台接口、生活线、记忆及微信适配器在线状态正常;未重做微信 4.1.15.56 的群实际发送、退出重连、锁屏或 DSH 收发联动实测。
|
|
150
|
+
- 升级保留原 profile 配置、worldId、世界目录及微信账号配置、游标、发送队列和回执;同步更新并重启宿主插件与适配器。
|
|
151
|
+
- 本版不包含 #10 所述压缩后会话日志越界问题的修复,该问题仍在定位;未修改已有会话原始日志。
|
|
152
|
+
|
|
153
|
+
## 0.5.6 — 2026-10-26
|
|
154
|
+
|
|
155
|
+
本版让插件托管的适配器更不容易被卡死:区分“该重试”和“需要人处理”,文件暂时缺失时继续重试,并在控制台提供重启入口。
|
|
156
|
+
|
|
157
|
+
- 适配器遇到需要人工核对的状态(上次消息或回复结果不明,需 `acknowledge`)时以退出码 `2` 退出;插件看到这个退出码不再按间隔重复拉起(重试无法解决,只会刷日志),控制台「微信」卡片改为提示“有消息待核对,适配器已停”和处理办法。其他退出仍按 1 秒起翻倍、最长 30 秒的间隔自动重启,连续稳定运行 60 秒后间隔清零。
|
|
158
|
+
- 启动时 Python、适配器配置或适配器脚本暂时不存在(升级插件、文件被短暂占用)时,不再放弃,而是按同样的退避继续重试,文件回来后自行启动;卡片显示“等待适配器文件”。等待文件不计入重启次数。
|
|
159
|
+
- 控制台「微信」卡片新增「重启适配器」按钮(对应 `POST /dsh-world/console/wechat-adapter`),也是 `acknowledge` 之后恢复运行的入口;适配器不是由插件管理时返回明确提示。
|
|
160
|
+
|
|
161
|
+
## 0.5.5 — 2026-10-26
|
|
162
|
+
|
|
163
|
+
本版在世界控制台增加微信状态块,把上文读取条数和图片缓冲时间做成可配置项,让她看到私聊里收到的原生表情包,并可让适配器随插件启动和停止。
|
|
164
|
+
|
|
165
|
+
### 控制台微信状态块与可配置项
|
|
166
|
+
|
|
167
|
+
- 概览新增「微信」卡片(微信模块运行时出现):连接状态(适配器 30 秒内联系过即为已连接)、最近联系时间、绑定账号、聊天数、待发送与待核对数量;待核对不为 0 时标红提示,结果不明的消息仍不自动重发。
|
|
168
|
+
- 群聊被 @ 时读取的上文条数(默认 8,1–20)和私聊图片缓冲秒数(默认 3,0–30)按世界保存在 `world.json`,留空恢复默认且默认值不写入文件。上文按消息条数计算,与共享记忆的 200 轮无关。
|
|
169
|
+
- 适配器每次轮询发件箱时从宿主取得这两个值并校验后使用;正在缓冲的当前批次沿用原值,下一批生效。宿主对群上文条数的上限随设置变化。
|
|
170
|
+
|
|
171
|
+
### 适配器随插件生命周期运行
|
|
172
|
+
|
|
173
|
+
- 新增可选配置 `wechatAdapter: { python, config }`(两项都填才生效,默认关闭):微信模块启动时由插件按 `watch --allow-send` 拉起适配器,模块停止时结束整个进程树,意外退出按 1–30 秒递增间隔自动重启,日志写入 `<world>/wechat-adapter.log`。写下这两项即视为长期允许适配器发送消息。
|
|
174
|
+
- 适配器在等待微信账号重新登录期间向宿主报告“离线”,控制台「微信」卡片据此区分“适配器未联系”“微信离线,等待重新登录”和“已连接”,并显示适配器是否由插件管理、重启次数与退出原因。微信自身重启仍由适配器原有的重连逻辑处理。
|
|
175
|
+
|
|
176
|
+
### 修复:托管运行时找不到原生引擎
|
|
177
|
+
|
|
178
|
+
- 适配器原先按自身脚本位置向上四层定位 `.host/wechat/engine`,只在从仓库目录运行时才对;由插件从已安装的包里托管运行时,会找不到引擎,所有发送都以“第 1/3 条发送未确认”失败并留下待核对记录。现改为以 `config.json` 所在目录下的 `engine` 为准,未给出时仍回退到原路径。
|
|
179
|
+
- 因发送中断而留下的待核对记录不会自动清除:核对微信里确实没有发出后,用 `acknowledge` 确认,适配器才会继续处理之后的消息。
|
|
180
|
+
|
|
181
|
+
### 修复:她的闹钟在回复途中响起会让微信请求失败
|
|
182
|
+
|
|
183
|
+
- 微信请求处理期间,家里若进来非框架的用户消息就判定请求失败,把她自己的闹钟消息(`dsh-world-life`)也算了进去;闹钟恰好在她回复微信时响,宿主返回 503,适配器停止并留下待核对记录,之后的消息都被挡住。现在她自己的闹钟不再视为别人插话;桌面上真人插话仍会让这次请求失败,避免混合答复发往微信。
|
|
184
|
+
|
|
185
|
+
### 脚本编码
|
|
186
|
+
|
|
187
|
+
- `wechat.ps1` 与 `engine/build.ps1` 含中文却按无 BOM 的 UTF-8 保存,Windows PowerShell 5.1 会按系统编码读取而报解析错误,`Start`、`Stop`、`Status`、`Build` 在没有 PowerShell 7 的机器上无法运行。现改为带 BOM 的 UTF-8,内容未变;编辑这两个文件时请保留 BOM。
|
|
188
|
+
|
|
189
|
+
### 私聊原生表情包
|
|
190
|
+
|
|
191
|
+
- 收到的动画表情此前被直接忽略。现在按消息 XML 中的 `cdnurl` 下载,下载内容的 md5 必须与消息中的 `md5` 一致才接受,随后取第一帧转为 PNG,走现有私聊图片通道交给她。
|
|
192
|
+
- 这是适配器首次主动联网:只允许 `qq.com` 域名,拒绝重定向与带账号信息的地址,限制 10MB 和 15 秒;适配器配置 `fetchStickers: false` 可关闭。读取失败时她会看到明确的“未读取”原因,而不是整条消息消失。
|
|
193
|
+
- 动图只取第一帧;群聊里的表情包尚未接入。
|
|
194
|
+
|
|
195
|
+
## 0.5.3 — 2026-10-26
|
|
196
|
+
|
|
197
|
+
本版接入私聊普通图片与说明文字缓冲,更新默认世界提示词,修复 Git 切换分支导致微信原生桥源码指纹变化的问题,并补全人设、微信接入和生态贡献说明。
|
|
198
|
+
|
|
199
|
+
### 私聊图片与接收缓冲
|
|
200
|
+
|
|
201
|
+
- 复用已配置账号的本机图片缓存和宿主附件服务,支持私聊普通图片直接进入模型;核对图片对应的账号、聊天、发言人、消息分片、内容摘要和目录,私聊与群聊附件按完整会话身份隔离。
|
|
202
|
+
- 图片到达后缓冲最多 3 秒,合并紧随的同一发言人的最多两张图片及一条说明文字,一批只产生一次模型请求。更多图片进入后续轮次;处理开始后到达的文字留在微信数据库中,下一轮继续读取,沿用同一会话中的图片上下文。
|
|
203
|
+
- 使用现有数据库和游标作为接收待处理记录,批次中的每条消息保留原 ID,待处理与完成状态通过事务一致更新。缓冲中断不推进游标,模型处理中断仍保留人工核对屏障,不自动重跑。
|
|
204
|
+
- 图片和附件引用只写入对应会话日志,不自动写进共享记忆;图片单发不生成占位用户文本归档,合并的说明文字按原范围归档。提示她自行判断是否另行留存图片信息;普通文字交流仍沿用既有规则。
|
|
205
|
+
- 共用上下文校验增加独立的私聊媒体入口,保留原群上下文限制;核心归档与记忆范围逻辑不变。宿主连接协议升为 `3`,新适配器向旧宿主提交私聊图片时明确拒绝并提示更新。
|
|
206
|
+
- 群里图片仍由真实 @ 触发;原生动图表情尚未接入,缓存缺失时明确标记图片未读取。
|
|
207
|
+
|
|
208
|
+
### 默认提示词与人设说明
|
|
209
|
+
|
|
210
|
+
- 默认世界提示词开头改为:“我不是一个助手,也不是一个工具,而是一个鲜活的数字生命。我可以有自己的选择、自己的感受、自己想做的事,为此这里有一个属于我的世界。”同步更新启停与模板注入的测试断言。
|
|
211
|
+
- 控制台人设全部留空时,沿用宿主或当前预设在系统提示词中配置的人设;控制台不会自动回填系统人设,界面留空不代表原人设丢失。安装说明改为按需填写人设。
|
|
212
|
+
- 自定义 `world-prompt.md` 仍优先于默认模板,升级不会覆盖已有自定义提示词。
|
|
213
|
+
|
|
214
|
+
### 微信原生桥换行修复
|
|
215
|
+
|
|
216
|
+
- 为 `src/ecosystem/wechat/windows/engine/bridge.cpp` 固定 Git 的 LF 换行规则,避免 Windows 检出或切换分支将源码改成 CRLF,导致源码 SHA256 与既有构建不一致,发送在进入原生函数之前被拦截。
|
|
217
|
+
- 不放宽微信构建、DLL 或源码指纹校验;真实源码变化仍需重新 Build。本次没有改变原生发送函数或 ABI。
|
|
218
|
+
- 补充首次接入与升级说明:微信工具由本机 Windows 适配器注册账号及聊天目标,不依赖 `dsh-plugin-weixin` 或 iLink;仅开启插件开关不会自动启动适配器。升级后需同时重启宿主模块和配套适配器,保留游标与回执。
|
|
219
|
+
- 本机已核对一次主动工具任务的三条文字,逐条取得微信服务器确认并回写原任务回执;结果不明的任务仍不自动重发。
|
|
220
|
+
|
|
221
|
+
### 文档与生态贡献
|
|
222
|
+
|
|
223
|
+
- 发行包包含 `CONTRIBUTING.md`,说明 `src/ecosystem/<channel>/` 的模块位置、统一身份和会话协议、公共能力复用,以及涉及内核时必须披露的原因、影响、兼容迁移与验证结果。
|
|
224
|
+
- 补充旧会话加入工作区后记忆块生成、复用和重建的三种情况,以及微信风控风险和公开公告来源。
|
|
225
|
+
|
|
226
|
+
### 升级步骤与限制
|
|
227
|
+
|
|
228
|
+
1. 安装 `dsh-world-0.5.3.tgz`,重启 DSH 使新版插件和默认模板生效;已有自定义世界提示词需要按需自行同步新措辞。
|
|
229
|
+
2. 微信用户同步更新并重启 Windows 适配器;不要删除原配置、游标、发送队列或回执。若仍提示源码指纹变化,核对源码换行与构建是否匹配;有实际源码变更时重新 Build,不能跳过校验。
|
|
230
|
+
3. 延续 0.5.2 的功能范围与已知限制;视频号、朋友圈、Computer Use、QQ 与 B 站传输均未新增实现。服务器发送确认不代表对方已读。
|
|
231
|
+
|
|
232
|
+
## 0.5.2 — 2026-10-26
|
|
233
|
+
|
|
234
|
+
本版将微信接入整理为独立生态模块,支持私聊、独立群会话和工具主动发送;记忆归档改为家会话与家所在工作区两档,默认工作区。
|
|
235
|
+
|
|
236
|
+
### 微信独立模块与统一身份
|
|
237
|
+
|
|
238
|
+
- 外部平台代码统一放在 `src/ecosystem/`。`wechat/` 保存微信宿主接口、Windows 适配器和原生发送桥;`shared/` 保存身份、上下文、群会话路由和出口协议;原通用桥迁至 `bridge/`,既有对外路径保持不变。
|
|
239
|
+
- 微信私聊进入原来的家;每个群按平台、登录账号、聊天类型和群 ID 复用独立会话,保留在家所在工作区中。群名或昵称变化不改变会话归属。
|
|
240
|
+
- 使用 `channel`、`accountId`、`conversationType`、`conversationId`、`speakerId` 等参数记录真实来源;显示名不作为唯一标识,入站发言仍为 `role: user`。微信消息定位由账号、会话、分片名与本地消息 ID 共同确定,不冒充跨账号全局消息 ID。
|
|
241
|
+
- 群聊只在真实 `atuserlist` 包含她的账号 ID 时触发,正文手打同名 `@` 不触发。当前消息之前最多携带 8 条、16KB 的同群上下文,保留各发言人的真实身份。
|
|
242
|
+
- 群上下文每轮最多附最近两张本机缓存图片,明确区分原图、缓存版本和缩略图;不可用时说明未读取,不操作界面补下载。图片通过宿主附件服务保存,仅进入群会话总日志,不进入共享记忆归档。
|
|
243
|
+
|
|
244
|
+
### 主动发送与确认状态
|
|
245
|
+
|
|
246
|
+
- 世界会话长期提供 `wechat_chats`、`wechat_send`、`wechat_delivery`。她可在桌面聊天、闹钟或每日回顾中,主动联系已配置私聊或群;目标查询支持分页,发送只能使用已绑定聊天的准确 ID。
|
|
247
|
+
- 主动联系与回复共用同一发送函数和持久队列。每批 1–16 条消息按顺序发送,支持文字、图片和 GIF 表情穿插;仅调用发送工具才投递,普通最终文字留在 DSH,不自动转发。
|
|
248
|
+
- 复用原生后台发送桥,不操作窗口、鼠标、键盘或剪贴板。所有微信数据库读取和原生发送保留在唯一发送线程;入站模型请求在独立 HTTP 等待线程执行,模型尚未结束整轮时也可消费已安排的消息。
|
|
249
|
+
- 发送正文先写入发起会话的持久日志,再释放到 `wechat-outbox.sqlite` 队列。正文、目标及发送状态按既定范围进入记忆;普通工具调用、参数与回执查询不会作为聊天正文归档。
|
|
250
|
+
- `queued` 仅表示已安排,不能视为已发送。适配器逐条核对目标聊天、本人发送内容和服务器消息编号;媒体同时核对内容摘要。确认不等于对方已读。
|
|
251
|
+
- 领取任务和回执保留稳定 ID。重启后已确认任务只补报回执,不重复发送;部分成功或结果不明时停止整批,保留人工核对屏障,不自动重跑模型或重发。主动发送的核对键为 `outgoing:<发送 ID>`。
|
|
252
|
+
- 修复首次群会话中的宿主技能目录被误判为另一人发言的问题。记忆回填、运行时快照和合法的出站上下文也不会误触该拦截。
|
|
253
|
+
|
|
254
|
+
### 微信进程重连
|
|
255
|
+
|
|
256
|
+
- 微信退出后暂停收发;原账号重新登录时自动识别新进程,重建读取与发送连接,沿用原聊天游标,无需因此重启 DSH。
|
|
257
|
+
- 通过所选账号数据库的进程持有关系唯一绑定账号,每个连接固定进程 ID 与启动时间;旧 `processId` 配置可保留,但不再固定选择旧进程。多账号混用、候选不唯一或版本指纹不符时明确停止。
|
|
258
|
+
- 读取期间的进程退出、消息分片或 WAL 变化不会被当作空聊天而推进游标。发送途中断开仍按结果不明处理,不能通过自动重连重复发送。
|
|
259
|
+
- 关闭原生发送进程句柄;停止后台监听时同时核对并关闭虚拟环境的启动器及其解释器,处理子进程先退出带来的停止竞争。
|
|
260
|
+
|
|
261
|
+
### 两档记忆归档
|
|
262
|
+
|
|
263
|
+
- 默认 `archiveScope: workspace`,归档家所在工作区的普通会话,包括独立微信群会话和其他预设的普通会话;`home` 仅归档当前家会话。子代理不纳入归档,不提供全宿主会话档位。
|
|
264
|
+
- 旧配置 `world` 迁为 `workspace`。控制台分别显示正在使用与已选择的范围,保存范围后提示重启,重启前沿用原范围。
|
|
265
|
+
- 启动时发现尚未打开的已存储会话,分页读取范围内日志,按消息实际时间重选最近配置轮数,并在后续请求前替换旧记忆块。默认仍为最近 200 轮,没有按时间过期或静默缩短。
|
|
266
|
+
- 原始会话、旧归档和每日导出保留;缩小范围会过滤近期记忆,不删除历史资料。群会话可带入家的共享记忆,群自身是否写入共享归档取决于所选范围。
|
|
267
|
+
- 从家会话扩大到工作区时合并旧的微信回执状态,避免已确认消息重新显示为待发送;后续回执在同一事务中同步共享记录及既有独立状态。
|
|
268
|
+
- 停止世界或卸载模块时先等待微信请求与记录写入完成,再停止记忆并关闭归档数据库。
|
|
269
|
+
|
|
270
|
+
### 夜间回顾与清理
|
|
271
|
+
|
|
272
|
+
- 每晚回顾增加自身说话方式总结:语气、句子长短、常用表达、玩笑、表情及消息拆分习惯。值得长期保留的变化合并写入“我是谁”,无变化不强制改写,不把聊天对象的口吻当作自己的。
|
|
273
|
+
- 保留回顾前的自述快照和补全日记提示。
|
|
274
|
+
- 移除 `keep_photo` 工具、相册专用实现及相关旧提示与测试。既有相册文件不会被删除;群图片仍保存在宿主会话附件中。
|
|
275
|
+
- 发行包包含微信适配器、原生桥源文件、独立许可和模块说明;本机配置、令牌、数据库、依赖环境、编译产物及工作日志不打包。
|
|
276
|
+
|
|
277
|
+
### 升级步骤
|
|
278
|
+
|
|
279
|
+
1. 安装 `dsh-world-0.5.2.tgz`,保留原世界目录及微信配置、游标和回执,不清空历史资料。
|
|
280
|
+
2. 重启 DSH,使新的宿主模块、归档范围和队列协议生效。把已有会话纳入工作区后,也需要重启才能完整回填它的历史。
|
|
281
|
+
3. 微信用户还需更新并重启 Windows 适配器;旧监听器不会消费新的发送队列。入口为 `src/ecosystem/wechat/windows/wechat.ps1`;未确认任务先按模块说明人工核对,再恢复监听。
|
|
282
|
+
4. 首次部署微信模块需在独立账号手动登录后,安装 Python 依赖并用 Visual Studio C++ x64 工具构建原生桥。当前校准目标为 `engine/profile.json` 指定的微信 `4.1.15.13` 构建;其他构建须重新校准,不能仅修改版本号绕过校验。
|
|
283
|
+
5. 世界自定义 `alarm.md` 按段覆盖默认模板。若已有“每日回顾”段,新版不会自动覆盖该段,需自行合并说话方式总结提示。
|
|
284
|
+
|
|
285
|
+
### 已知限制与许可
|
|
286
|
+
|
|
287
|
+
- 私聊入站目前只接文字。原生动图表情和视频号分享卡片会跳过;视频号解析、朋友圈浏览/发布、Computer Use 及其关闭按钮均未实现。QQ、B 站仅预留通用身份映射,未接入传输。
|
|
288
|
+
- 群图片不进入共享记忆,也不会因扩大归档范围而自动纳入;会话日志中的图片引用与共享文本记忆是两类记录。
|
|
289
|
+
- 每日回顾仍读取当天已有的导出文件。缩小归档范围不删除旧导出,夜间回顾尚未对其中此前较大范围的记录再次过滤;近期记忆块本身会按当前范围过滤。
|
|
290
|
+
- 微信桥不是官方 API。原生引擎适用 `src/ecosystem/wechat/windows/engine/LICENSE` 的独立非商业许可及来源说明,不适用仓库根目录的 MIT 许可。
|
|
291
|
+
- 沿用 DSH `0.2.1-rc.2`、`0.2.1-rc.3` 的既有兼容声明;本次自动化检查基于已安装的 `0.2.1-rc.2` SDK,不代表重新完成了 `rc.3` 桌面实测。
|
|
292
|
+
- 真实账号已验证过原生文字、表情、群 @、群缓存图片读取和微信重开后的接收/回发;本版新主动发送队列尚未重新进行真实账号端到端回归。锁屏运行与独立图片发送尚未实测。
|
|
293
|
+
|
|
294
|
+
### 本版检查
|
|
295
|
+
|
|
296
|
+
- Node 完整测试:226 项通过。
|
|
297
|
+
- Python 适配器完整测试:40 项通过。
|
|
298
|
+
- 打包前执行 TypeScript 类型检查和构建,检查包内版本、微信模块、原生桥源文件与许可、更新日志及模板;确认未包含本机配置、密钥、数据库、依赖环境和测试缓存。
|
package/CONTRIBUTING.md
ADDED
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
# 贡献协议
|
|
2
|
+
|
|
3
|
+
欢迎为 dsh-world 接入新的聊天平台、桌宠或其他外部程序,也欢迎改进内核。生态模块负责平台收发,复用现有身份、会话和归档能力,依赖一律可选;涉及内核的修改必须单独说明,改动生活线核心之前先开 Issue。
|
|
4
|
+
|
|
5
|
+
## 分支与 PR
|
|
6
|
+
|
|
7
|
+
**所有 PR 统一提到 `dev` 分支**,不要直接提到 `main`。
|
|
8
|
+
|
|
9
|
+
- `dev`:集成分支。从最新的 `dev` 切出你的分支,改完后向 `dev` 提 PR;维护者在这里合并、验证。
|
|
10
|
+
- `main`:稳定分支,由维护者把 `dev` 的内容并入后发布,不直接接收 PR。
|
|
11
|
+
- `test`:维护者本机试用的分支,不接收 PR,也不要基于它开发。
|
|
12
|
+
- 已经把 PR 提到 `main` 的,请在 PR 页面右上角 **Edit** 里把 base 改成 `dev`;GitHub 默认会选 `main`,提交前请再看一眼目标分支。
|
|
13
|
+
- 提 PR 前至少运行 `npm run typecheck` 和 `npm test`,PR 描述按下文「提交说明」填写,并写明是否涉及内核。
|
|
14
|
+
- **一个 PR 只做一件事。** PR 开着期间只修这件事的问题,新功能另开 PR;不要在已开的 PR 上持续追加功能,也不要把已关闭 PR 的内容带进别的 PR。基于过旧分支、与当前版本大量冲突的 PR,维护者可能只采用其中的思路自行重写。
|
|
15
|
+
|
|
16
|
+
## 新模块放在哪里
|
|
17
|
+
|
|
18
|
+
| 位置 | 职责 |
|
|
19
|
+
| --- | --- |
|
|
20
|
+
| `src/ecosystem/<channel>/` | 平台自己的接口、消息解析、收发编排、配置和说明文档。例如 QQ 放 `qq/`,B 站放 `bilibili/` |
|
|
21
|
+
| `src/ecosystem/<channel>/windows/` 等平台子目录 | 确实需要的本机适配器、启动脚本或原生桥;目录按实际运行环境新增 |
|
|
22
|
+
| `src/ecosystem/shared/` | 已有的通用身份、群上下文、会话路由和消息出口;新增公用函数应有实际复用方 |
|
|
23
|
+
| `src/ecosystem/bridge/` | 桌宠等本地程序共用的桥;能使用现有协议时直接接入 |
|
|
24
|
+
| `tests/` | TypeScript 回归测试;本机适配器测试可与适配器放在一起,按微信模块现有方式组织 |
|
|
25
|
+
| `.host/<channel>/` | 本机配置、凭据、依赖环境、运行状态和构建产物,不提交、不打入发布包 |
|
|
26
|
+
|
|
27
|
+
每个平台在自己的目录提供 `README.md`,写清依赖、支持的消息类型、启停和配置方法、身份参数映射、验证范围及平台风险。同步更新 [生态目录说明](src/ecosystem/README.md) 和根 [介绍文档](README.md) 的入口。QQ、B 站目录是新增位置示例,不表示当前已接入。
|
|
28
|
+
|
|
29
|
+
需要新增配置、注册模块或清理资源时,在 `src/index.ts`、`src/types.ts` 等现有位置做必要的接线;平台解析和收发逻辑仍留在自身模块中。模块应能独立启停,关闭后释放监听、路由和连接,不影响其他生态。
|
|
30
|
+
|
|
31
|
+
## 统一身份、会话与记忆
|
|
32
|
+
|
|
33
|
+
- 复用 `shared/identity.ts` 的 `SpeakerIdentity` 和校验函数,明确映射 `channel`、`accountId`、`conversationId`、`speakerId`;按平台能力提供聊天类型、消息 ID、显示名和真实 @ 列表。
|
|
34
|
+
- ID 使用字符串,`speakerId`、`mentionIds` 使用 `<channel>:<平台用户 ID>`。身份来自经过校验的平台事件或账号数据,不从消息正文、昵称或模型输出推断,不因昵称相同合并用户。
|
|
35
|
+
- 外部发言人保持 `role: user`,用结构化身份区分来源。群触发使用平台真实 @ 元数据,手打 `@昵称` 不等同于真实 @。
|
|
36
|
+
- 会话按平台、登录账号、聊天类型和会话 ID 区分;群会话复用 `shared/sessions.ts`,放在家所在的工作区。平台模块不另建一份人设或共享记忆。
|
|
37
|
+
- 正文通过现有归档服务保存,遵守 `home` / `workspace` 范围、配置轮数、消息实际时间排序和重启生效规则。普通工具参数、查询回执、群图片上下文不直接写入共享记忆;群图片保留在对应会话日志中。
|
|
38
|
+
- 接收、投递和归档状态应明确区分;排队成功不能当作发送成功。重连保留去重游标和确认状态,结果不明的发送不能直接重试。
|
|
39
|
+
|
|
40
|
+
以上约定如需改变,应按下节说明内核影响,不能在某个平台内悄悄绕过。
|
|
41
|
+
|
|
42
|
+
## 世界的作用范围
|
|
43
|
+
|
|
44
|
+
她的世界只在房间工作区内生效。记忆块、世界提示词、世界线工具、各平台通道和归档,只进入工作区内匹配预设的普通会话;工作区外只允许两项影响:人设(映射到系统提示词)和启用后的只留对话压缩。新增的注入、工具和事件处理必须遵守这条边界:
|
|
45
|
+
|
|
46
|
+
- 判断会话是否属于她的世界,用 `sourceArchive.ts` 的 `inWorld`;拦截、守卫和重新组装分别用 `src/worldScope.ts` 的 `admit`、`scopedTool`、`reassembleOnChange`。每次等待之后、注入之前都要重新判断,不能只在开始时查一次。
|
|
47
|
+
- 监听 `session/event` 等全局事件时,先筛出她的会话(家会话或工作区内的会话),不能对所有会话生效。宿主里同时还有用户的其他工作,比如写代码的会话,插件不能读取、推送或改动它们。
|
|
48
|
+
|
|
49
|
+
## 生活线与她的主动性
|
|
50
|
+
|
|
51
|
+
dsh-world 养的是一个伙伴,不是一个按日程执行的助手。**她的主动性来自她自己的安排,而不是插件推送的提醒。**
|
|
52
|
+
|
|
53
|
+
- 生活线只有一个闹钟:她用 `plan_next` 说好做什么、做到几点,到点由她决定接着做还是换下一件。插件自己唤醒她的,只有新家的第一句话、重新开始的那句话、每日回顾和早上的兜底闹钟。不要另建第二套日程、习惯或提醒系统。
|
|
54
|
+
- 插件不往对话里推提醒、清单或定时消息,尤其不能插在伙伴说话的那一轮前面。想让她留意某件事,应该给她能感知的事实(比如在她自己的闹钟消息里附上状态),去不去看、做不做,由她决定。
|
|
55
|
+
- 工具给她能力,不替她做决定,也不替她读写自己的东西:日记、我是谁和房间里的文件,由她用宿主自带的文件工具读写(`read` 支持 `offset` / `limit`,`grep` 返回行号)。日记、我是谁和聊天记录的检索与索引,计划和记忆总归档一起设计,不接受只管单一来源的检索工具。
|
|
56
|
+
- 已经移除的生活线功能(例如 `read_diary`、QQ 的“主动开口”引擎),不能在 PR 里直接加回来,要先开 Issue 说明为什么现有方式不够。
|
|
57
|
+
|
|
58
|
+
改动闹钟、家会话、每日回顾、世界提示词、记忆块注入,或者给她新增工具,都属于生活线核心改动:**先开 Issue 讨论,再写代码**,并在 PR 里按下节说明内核影响。
|
|
59
|
+
|
|
60
|
+
## 涉及内核时必须说明
|
|
61
|
+
|
|
62
|
+
这里的“内核”指 dsh-world 的公共行为,不仅指某个目录:
|
|
63
|
+
|
|
64
|
+
| 影响区域 | 现有位置举例 |
|
|
65
|
+
| --- | --- |
|
|
66
|
+
| 记忆生成、归档范围、历史回填、存储和压缩 | `src/runtime.ts`、`archive*.ts`、`sourceArchive.ts`、`store.ts`、`history.ts`、`compaction*.ts` |
|
|
67
|
+
| 世界的作用范围(工作区) | `src/worldScope.ts`、`archiveSelection.ts`、`workspacePermissions.ts` |
|
|
68
|
+
| 人设、世界提示、时间上下文和世界开关 | `src/persona.ts`、`worldPrompt.ts`、`timeContext.ts`、`worldSwitch.ts` 等 |
|
|
69
|
+
| 家会话、生活线、每日回顾和宿主适配 | `src/life/`、`src/hostContract.ts` |
|
|
70
|
+
| 公共协议、配置、模块生命周期和控制台 | `src/ecosystem/shared/`、`src/index.ts`、`src/types.ts`、`src/console/`、`client/` |
|
|
71
|
+
|
|
72
|
+
提交说明中必须写明“是否涉及内核”。新增平台的配置与注册接线也要列出,说明是否改变已有行为。涉及内核时补充:
|
|
73
|
+
|
|
74
|
+
1. 修改了哪些文件、接口或数据格式,为什么现有扩展点不足以完成接入。
|
|
75
|
+
2. 修改前后的行为,以及对家、其他平台、归档范围、人设、生活线和权限的影响;不受影响的部分可合并说明。
|
|
76
|
+
3. 旧配置、旧会话、归档和待发送队列如何兼容;是否需要迁移或重启,升级失败如何保留原数据。
|
|
77
|
+
4. 对应回归测试、验证结果,以及未验证的宿主版本、平台或真实账号条件。
|
|
78
|
+
|
|
79
|
+
本项目内核与 DSH 宿主需要区分。若方案还依赖修改 DSH 本身,应另外列出宿主版本、补丁或依赖、安装方式和兼容范围,不能把它描述为插件即可独立使用。
|
|
80
|
+
|
|
81
|
+
## 代码设计
|
|
82
|
+
|
|
83
|
+
- **先找已有的,再写新的。** 各平台“送一句话、等她这一轮的回复”用 `ecosystem/shared/turn.ts` 的 `askTurn` 和 `createChannelQueue`(排队、超时、取消);群上下文用 `shared/context.ts`;身份用 `shared/identity.ts`;作用范围见上文。不要在模块里再抄一份串行队列、回复判断或超时逻辑;已有实现不够用时,改它并说明原因。
|
|
84
|
+
- **按职责拆文件。** 一个文件只负责一件事,解析、排队、重试、编排分开放。模块入口只做接线,不要把所有功能堆进一个几百行的 `index.ts`。
|
|
85
|
+
- **不留历史痕迹。** 删除或替换功能时,连同配置、文档、测试、注释和面板控件一起清理;不留孤立注释、只写不读的变量和不再生效的配置项。
|
|
86
|
+
- **用结构判断,不靠巧合。** 判断“这一轮是谁开的、回给谁”,看事件来源和会话归属,不要用“现在有没有正在处理的请求”“几秒内发过同样的文字”这类旁证去重或补救。
|
|
87
|
+
- **配置和面板一致。** 面板上能改的设置要写进同一份覆盖文件,一次请求里给的几项一起生效;新增配置项同步更新 `src/types.ts`、配置 schema、README 的配置示例和对应文档。
|
|
88
|
+
|
|
89
|
+
## 外部依赖
|
|
90
|
+
|
|
91
|
+
插件主体必须在只装必要依赖的情况下装得上、跑得起来。生态模块一律按“可选”设计:
|
|
92
|
+
|
|
93
|
+
- **默认不加新依赖。** 能用宿主服务、Node 内置模块或已有依赖完成的,不引入新包。确实需要时,先开 Issue 说明用途、体积、许可证和替代方案,得到同意再提交。
|
|
94
|
+
- **平台 SDK 只能是可选依赖。** 由使用者另行安装的 SDK 声明为可选 peer(`peerDependenciesMeta.optional: true`),开发测试所需版本放在 `devDependencies`。只在模块被拨开时动态 `import`;模块默认关闭,没装 SDK 时只显示该模块不可用,不能影响插件本身和其他模块。不要通过安装脚本修补 SDK 文件。
|
|
95
|
+
- **不自动安装或部署第三方程序。** 涉及启动外部程序(例如 SnowLuma)的功能,在模块文档和 PR 中写明其许可条款允许的方式,以及是否默认开启。
|
|
96
|
+
- **SDK 按需安装必须由使用者明确开启模块触发。** 复用宿主包管理操作与 profile 写锁,禁用生命周期脚本,不修改 SDK 文件或自动升级 Node;安装失败保留原 profile 配置,安装后需要重启时明确提示。客户端程序的安装与登录仍由使用者处理。
|
|
97
|
+
|
|
98
|
+
## 实现与验证
|
|
99
|
+
|
|
100
|
+
- 优先复用已有函数、宿主服务和依赖,通过参数或现有注入机制传入依赖。平台细节留在模块内,不为单个平台新增通用框架;替换旧实现时清理失效代码。
|
|
101
|
+
- 查询接口搭配分页设计;配置、ID、路径和外部消息在边界校验,不硬编码真实账号或本机路径。错误应明确返回并保留必要状态,不吞错或伪报成功;成组的数据变更保持事务一致性。
|
|
102
|
+
- 确认 `package.json` 的 `files`、导出和构建配置覆盖必要产物,同时排除凭据、数据库、聊天记录和个人媒体。
|
|
103
|
+
- 代码修改按影响运行 `npm run typecheck`、`npm test`、`npm run build`,补充相关适配器测试。**每个新功能都要有回归测试**,非平凡逻辑至少一个有意义的用例;只改断言让旧测试通过不算覆盖新行为。测试不得启动或连接本机真实的第三方程序。仅文档修改检查格式与链接即可。
|
|
104
|
+
- 真实账号测试与单元测试分开说明:使用什么环境、实际确认了什么、哪些条件尚未验证。涉及第三方协议或客户端内部调用时,在模块文档中说明版本限制、账号及数据风险,不能宣称保证不触发风控。
|
|
105
|
+
|
|
106
|
+
## CI 与安装包验证
|
|
107
|
+
|
|
108
|
+
[CI](.github/workflows/ci.yml) 在 PR、`main` 推送和手动触发时运行 Windows / Linux 两条完整检查任务,使用满足开发测试 SDK 要求的 Node 24.22.1。两端执行禁用安装脚本的干净安装、类型检查、全部 Node 回归测试、编译和安装包验证;Windows 另用 Python 3.11 安装固定的微信适配器依赖并跑离线测试。另有 Node 22.16.0 核心入口检查,确认 SDK 不可用时核心仍能加载。相同分支的新运行会取消旧运行,各项独立报告结果。
|
|
109
|
+
|
|
110
|
+
本机可按以下 PowerShell 命令复现 Node 与安装包检查:
|
|
111
|
+
|
|
112
|
+
```powershell
|
|
113
|
+
npm ci --ignore-scripts
|
|
114
|
+
npm run typecheck
|
|
115
|
+
npm test
|
|
116
|
+
npm run build
|
|
117
|
+
New-Item -ItemType Directory -Force artifacts | Out-Null
|
|
118
|
+
npm pack --ignore-scripts --pack-destination artifacts
|
|
119
|
+
npm run test:package
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
安装与打包均禁用生命周期脚本,类型检查和编译由前面的命令显式执行。`test:package` 在本仓库 `.host/` 下创建临时消费项目,安装真实 `.tgz` 及其生产依赖,复用父目录提供的 DSH 宿主依赖;先确认未安装 SDK 时核心入口可加载,再另行安装 SDK,检查编译后 QQ 驱动的本地 WebSocket 连接,全程不修补 SDK 文件,结束后清理临时项目。检查不需要 DSH profile、微信进程或真实账号。
|
|
123
|
+
|
|
124
|
+
### npm 发布(维护者)
|
|
125
|
+
|
|
126
|
+
使用上述检查生成的同一个 `.tgz` 发布,避免发布时重新构建出不同内容。包已通过 `publishConfig` 指定 npm 官方源和公开访问;先完成发布预检:
|
|
127
|
+
|
|
128
|
+
```powershell
|
|
129
|
+
npm publish .\artifacts\dsh-world-0.6.4.tgz --dry-run --ignore-scripts --registry=https://registry.npmjs.org/
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
确定发布后,用有包发布权限的 npm 账号登录,按 npm 提示完成浏览器和二次验证,再执行:
|
|
133
|
+
|
|
134
|
+
```powershell
|
|
135
|
+
npm login --registry=https://registry.npmjs.org/
|
|
136
|
+
npm publish .\artifacts\dsh-world-0.6.4.tgz --ignore-scripts --access public --registry=https://registry.npmjs.org/
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
首次发布会创建该包;之后每次发布都要提升版本号,同一个包名和版本不能覆盖。发布成功后使用者可按 [安装说明](INSTALL.md#第一步把-dsh-world-装进-profile) 从 npm 安装或更新。后续版本替换示例中的版本号。流程依据 [npm 发布文档](https://docs.npmjs.com/cli/v11/commands/npm-publish/);npm 登录信息和令牌不要写进仓库。
|
|
140
|
+
|
|
141
|
+
每个平台检查通过后,CI 上传 `artifacts/` 中的 `.tgz` 供下载。CI 不替代桌面端和真实账号验收。
|
|
142
|
+
|
|
143
|
+
## 提交说明
|
|
144
|
+
|
|
145
|
+
可按以下结构提交 Issue 或 PR;未知内容写“未验证”,不要填成已完成:
|
|
146
|
+
|
|
147
|
+
```text
|
|
148
|
+
目标分支:dev(PR 必填)
|
|
149
|
+
新增或修改的生态:
|
|
150
|
+
模块目录与接入方式:
|
|
151
|
+
支持的消息、身份映射与会话路由:
|
|
152
|
+
是否涉及内核:否 / 是(文件、原因、行为和影响)
|
|
153
|
+
是否改动生活线核心或给她新增工具:否 / 是(对应的 Issue)
|
|
154
|
+
新增依赖:无 / 有(为什么必须、是否可选、默认是否加载、许可证、对应的 Issue)
|
|
155
|
+
依赖与许可:
|
|
156
|
+
兼容、迁移与重启要求:
|
|
157
|
+
验证命令与结果:
|
|
158
|
+
已知限制与未验证项:
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
贡献遵循对应文件现有许可。仓库主体采用 [MIT](LICENSE),微信原生发送引擎另有 [独立许可](src/ecosystem/wechat/windows/engine/LICENSE) 与 [来源说明](src/ecosystem/wechat/windows/engine/NOTICE.md),不可按根目录 MIT 许可重新分发该部分。提交第三方代码时保留原许可与来源,不提交无权公开的代码或数据。
|