# 验证记录与限制 v0.4.9 补充验证(2026-11-02):严格编译及 **114 项测试通过**。只新增一项闭环测试,经过真实本地 HTTP 发送、`BridgeRuntime` 和 `DshSessionPort`,验证固定私聊/群聊目标、忙时排队、排队后参数修改不改目标、压缩兼容、工具发送不重复、quiet 不外发、混合来源和空回复明确失败,以及 Session、白名单、主动发送开关和无效参数在生成前拒绝。使用模拟 Agent,模型调用为 0。 人格插件的本机适配另使用实际客户端模块和模拟 React/服务,验证在主动 Session 下方的同步开关、私聊/群聊选择、目标 ID 编辑与保存参数;实际投递适配器验证目标传递、桥接缺失、白名单失败与 quiet。使用真实 DSH rc.5 Cordis 库验证服务跨插件可见和卸载清理,不修改人格或情感生成逻辑。 日期:2026-10-30,Windows,Node.js **22.19.0**,TypeScript **5.9.3**。本机 DSH 发行版本 **0.2.1-rc.3**。 v0.4.8 补充验证(2026-11-01):核实本机 DSH **0.2.1-rc.5** 的 `compact-checkpoint`、`agent-instructions/instructions` 和 `skill-catalog/catalog` 协议,并只读对照会话事件元数据。异常回合包含这三种内部输入,模型有文本输出且正常 `completed`,旧版因此误判为来源混合;并非持久队列卡住。 修复后严格编译及 **113 项测试通过**,只增加一项针对性测试:首次输入之前/回合中压缩均保留回复与显式工具路由,后续消息正常处理;Web/QQ 等真实外部输入、近似来源名和指令/目录的未知 form 仍关闭自动回发。未调用真实模型或重放生产消息,已完成消息不会自动补发;生产链路需加载新代码后验证。 ## 公开发行检查(v0.4.2) 本次发行未修改运行实现。完成严格编译、安装包内容及相对文档链接检查;源码不再跟踪 `dist/`,发布 tgz 中仍包含编译入口、客户端、配置、文档和完整许可声明。 Gitleaks **8.30.1** 分别扫描全部可达 Git 历史、暂存区导出的公开文件以及解包扫描发布 tgz,三处均无凭据发现。补充检查覆盖 50 个待发布文件、249 个既有历史 blob 和 79 个包内文件,未发现私钥、真实服务凭据或异常长令牌候选。 默认配置另行检查:服务基址、Session 和语音凭据引用未预填实际值,Bot UID 为 0,桥接/ASR/TTS/主动发送默认关闭,目标和媒体白名单为空,监听默认 loopback。配置示例使用保留示例域名和未配置身份。本机路径、个人称呼、运行文件及本机调查笔记不进入本次公开源码和发布包。 v0.4.3 更正文档中的已验证 Webhook 接入形式:`https://bridge.example.com/vocehook?secret=YOUR_WEBHOOK_TOKEN`。query 访问令牌用于插件认证,消息内容仍为明文 JSON;VoceChat 的可选 `set/get secret` API 才控制 AES 加密。该版本没有更改运行实现或默认值。 ## 自动化与本机运行 v0.4.7 增加发送者显示名:严格编译及 **112 项测试通过**。只新增两项针对性测试,覆盖资料查询的 UID 校验、5 分钟缓存/改名刷新、并发请求合并、失败短缓存及 UID 降级、4 请求并发与整体超时,以及新消息/历史/引用的名称补齐和既有过滤规则。已有 DSH 引用测试补充名称标签、普通消息标签和系统上下文不包含外部显示名的检查。 另通过官方 VoceChat **0.5.38** 的本地临时账号验证 `UserInfo.name`,沿用 DSH **0.2.1-rc.3** 真实消息工厂与模拟 Agent,确认私聊、群聊、GIF 引用的当前发送者、引用原作者和历史查询名称均与 UID 对应。没有使用生产凭据、真实 Session 或云端模型,服务已停止。 v0.4.6 接入入站引用:严格编译及 **110 项测试通过**,只新增两项针对性闭环验证。覆盖防抖批次中的引用关系、一次历史查询复用、同源同会话过滤、引用语音的原文件与缓存转写(不重做 ASR)、缺失/历史故障降级、用户背景与系统元数据边界,以及 DSH 的原生引用图片/文件。既有恢复测试增加引用 ID 的磁盘恢复检查。 另在未修改的官方 VoceChat **0.5.38** 本地服务上通过普通用户 Reply API 生成真实私聊、群聊及引用 GIF 的消息,从实际历史事件取得原始 JSON 后 POST 到隔离 Webhook。链路经过插件持久化、防抖、引用补齐及 DSH **0.2.1-rc.3** 的真实 `createUserMessage` 工厂,模拟 Agent 收到的每轮输入都只有本次新消息 ID,包含正确的 `replyTo`、被引用原文和新消息;GIF 进入原生图片内容块,字节数 **1,988,143**。使用临时本地账号,未用生产凭据或真实 Session,模型调用为 0,服务已停止;该测试不代表生产 Webhook 投递和真实模型理解已经验收。 v0.4.5 修正本地媒体读取:`npm run check` 严格编译及 **108 项测试通过**。只增加一项针对性闭环验证,覆盖 DSH 工具 → 会话工作区解析 → 宿主读取 → 上传发送;目录列表为空可用,显式额外目录限制、宿主拒绝读取和大小上限仍生效,宿主拒绝后不回退 Node 读取。 本机另使用 DSH 0.2.1-rc.3 的真实工具编译器和 `SandboxedFileSystem` 发行库读取方法,连接未修改的官方 VoceChat 0.5.38 本地隔离服务。用一张 **1,988,143 字节 GIF** 验证会话工作区相对路径、`~/` 与绝对路径,分别模拟工作区可修改、完全权限及只读模式,三次均上传发送成功;服务器记录的媒体类型为 `image/gif`,文件大小一致。未修改用户文件或权限模式,未使用生产凭据、真实会话或云端模型,测试服务已停止。 v0.4.4 接入原生 Reply 后执行 `npm run check`:严格编译通过,**107 项测试通过,0 失败,0 跳过**。复用既有套件,新增两项验证覆盖媒体 Reply / 音频 415 降级保持引用、引用会话核对与组合消息首条引用;已有文字和 TTS 测试改为核对原生端点及原文,未增加依赖。 另启动未修改的官方 **VoceChat 0.5.38**,使用本地临时管理员、Bot 和两个测试群运行实际桥接发送。私聊纯文本、群聊 Markdown、引用 Bot 自己的私聊消息、图片、文件、WAV 语音、文字加附件和纯多附件均通过;核对服务器历史的 `detail.type: reply`、`detail.mid`、正文及 UID/GID,组合发送后续气泡为 `normal`,无占位文字。跨会话引用被拦截。测试仅访问 loopback,未用生产凭据、真实 DSH Session 或云端模型,测试服务已停止;客户端引用气泡的最终显示仍待真实客户端验收。 v0.4.1 执行 `npm run check`:TypeScript 严格编译通过,**105 项自动化测试通过,0 失败,0 跳过**。本次只增加两项针对性验证:内部记忆/时间/模型上下文不关闭回复;真实混合回合允许独立校验的历史查询、显式发送遵循主动发送开关和白名单,自动回复继续关闭。其余复用已有套件。 | 套件 | 数量 | 验证内容 | | --- | ---: | --- | | `audio.test.ts` | 15 | 文件 magic、WAV 实际时长、压缩格式探测、大小/时长限制、multipart ASR、无鉴权本地服务、HTTP/连接/格式错误、超时取消、凭据去敏、真实 FFmpeg 转码及清理 | | `bridge.test.ts` | 32 | Webhook GET/POST、白名单/去重、持久 ACK、防抖/排队/恢复、媒体与组合发送、历史截止 ID/ASR 缓存/失败降级,以及入站诊断脱敏 | | `dsh.test.ts` | 22 | 固定 Session、单批单条用户消息、提交屏障/超时/turn 归属、原生附件、冷恢复、工具身份与 quiet;历史字符预算、背景标注;内部上下文识别及混合回合的独立读取/主动发送校验 | | `vocechat.test.ts` | 13 | 官方发送/上传/下载与媒体安全、错误与超时;Bot 历史 context 参数、双向私聊、跨会话过滤、排序和去重 | | `live-webhook.test.ts` | 4 | 隔离接收程序的 GET/POST 行为、诊断记录脱敏、禁止真实 DSH/ASR/发送、媒体开关与音频探测、明文审计,以及终止子进程后的缓冲恢复/重复投递 | | `debounce.test.ts` | 14 | 固定时间验证 4s/1.5s/12s 默认值、静默重置、最长等待、独立键与交错顺序、封批上限、磁盘时间戳/附件/ASR 保留、提交前恢复、提交后隔离、v1 升级及完成后去重保留 | | `speech.test.ts` | 2 | MiMo 请求和真实 16 kHz 单声道 WAV 归一化、原文件不变;OpenAI/MiMo 两家 TTS 到 VoceChat 语音发送闭环、实时配置与关闭开关、暂存清理 | | `settings.test.ts` | 3 | 设置 API 启动/重载/停止真实本地监听、无 Secret 启动并接受明文 POST、停止后设置仍可用、配置重启保留、实例代理更新与卸载防重启;跨来源/非 JSON/过期版本/无效配置拒绝及密钥不回传;模拟冷启动时凭据迟到,验证持久 enabled 恢复、启动重试与停止后取消 | 测试启动真实的本地 HTTP Mock VoceChat/ASR 服务,使用假的 DSH 会话进行闭环。没有把 Mock 的固定转写结果当成真实语音识别能力。ASR provider 确实发送 multipart 文件并解析服务响应,但本次没有启动 Whisper 模型或请求云端模型。 本机已经实际运行 FFprobe/FFmpeg:生成 FLAC,检测容器与时长,转换 16kHz 单声道 PCM WAV,检查输出超限拒绝以及临时文件清理。缺失 FFprobe/FFmpeg 分支也有明确错误测试。 测试按文件串行执行并设置 30 秒上限;这台 Windows/Node 环境并行运行多个测试进程时曾出现关闭本地 Mock 连接等待不结束,改为串行后完整套件正常退出。桥接自身的消息并发仍有独立测试。 ## 真实发行库兼容性 v0.4.1 对本机持久会话做了只读事件元数据核对:异常回合包含 `dsh-mnemon/instructions`、`dsh-mnemon/recall` 或 `time-context/snapshot`,并有正常 `turn/end:completed`。旧版只排除 `runtime-context`,因此误判来源混合,静默关闭回复;旧版历史工具还复用了发送归属检查。这些是此次修复的依据,未重放生产消息、写会话日志或调用真实模型。插件新代码需经模块重载后,才能对新入站消息验证真实运行结果。 另将四轮真实事件的脱敏元数据分别交给旧版和修复后的 `DshSessionPort` 隔离回放,输入/输出正文均替换为合成文本。旧版两轮误返回 quiet,修复后四轮均正常返回文本;其余两轮结果保持正常。此回放只运行事件监听与归属逻辑,真实 DSH 调用、模型调用和外发均为零。新版也再次通过真实发行库的 `verify-host.cjs` 入口检查:十个工具注册、设置客户端及持久启用冷启动均正常。 v0.4.0 另用用户授权的真实 VoceChat 0.5.38 做只读联调:新客户端成功读取已授权群的最近 10 条和与用户的最近 5 条私聊,群历史包含另一只 Bot 的消息;只输出消息 ID、发送者与类型,不保留密钥或输出正文。随后在临时状态目录、假的 SessionPort、自动回复/ASR/TTS 全关闭的隔离实例中,将两条漏收 Bot 的原始载荷交给 `accept`,两条均 `accepted`,合成一批,附带 6 条更早的同群历史;没有调用真实 DSH/模型,也没有发送任何消息,临时状态随验证清理。 这证明该载荷符合插件规则、Bot 历史接口可用,**不能反推先前真实 Webhook 已经投递**。旧版本没有记录被忽略载荷的原因,不能从旧队列还原这段链路。新版本增加本次启动的 POST 计数、最近 HTTP 状态和最多 30 条 ID/结果诊断,须在加载新代码后用新消息验证服务端推送。历史背景本身不会入队或补回复。 使用本机 DSH `app.asar` 内的真实库验证: - `createUserMessage` 与 Session event 校验接受结构化插件来源,消息被冻结。 - 真实 `defineTool` 编译十个工具并执行参数校验,包含 `voce_speak` 和两个历史查询工具。 - 真实 Schemastery 解析默认禁用配置及语音 volatile 字段。 - 通过轻量 React hooks 驱动实际客户端模块,在仅有 `slots`、没有 `configForms/locale/remote` 的环境检查 `settings.section` 注册、厂家切换、API 凭据写入和保存;保存值再次交给真实宿主 Schema 校验。该步骤使用假服务,尚未在真实浏览器中点击页面。 - 加载打包入口 `dist/index.js`,在假 ctx 中执行 `apply/effect/dispose`;无监听、无用户配置写入、无模型调用、无真实消息。 另外执行了真实发行库上的冷启动入口检查:在隔离临时目录预存 `enabled:true`,第一次挂载让凭据稍后就绪,确认自动恢复并能通过真实 HTTP GET;卸载后保留启用状态,再挂载第二个实例,无需调用启动按钮便建立监听。两个监听均为本机随机端口,结束后清理;凭据与 Agent 为测试替身,没有重启用户的 DSH、写用户配置或调用真实模型。 可复现命令见 [DSH-API.md](DSH-API.md),脚本为 `scripts/verify-host.cjs`。这验证入口与发行库兼容性,不代表生产服务已切换。 ## 真实 VoceChat 接收与待验证范围 尚未在真实 VoceChat Bot、真实 DSH Session 与真实 ASR 模型三者连接的环境中端到端发送测试消息。部署时按 [MIGRATION.md](MIGRATION.md) 在测试 Bot/群验证后再切换。 本次已在用户授权的真实服务上使用临时 Bot Key 读取 `GET /api/bot`,返回 200;该部署的 `/api/bot/` 返回 404,不能据此判断 Key 失效。使用独立接收程序 `scripts/live-webhook.mjs` 供临时 Bot 联调,复用生产 Bridge,但 SessionPort 仅记录本地处理结果,不连接真实 DSH 或 ASR,不发送回复。它可记录 GET/POST 状态、规范化结果和下载媒体的大小/哈希/音频信息,不记录密钥、query 值或正文;运行凭据与日志位于 Git 忽略的受限 `.runtime/` 目录。 2026-10-29 已实际收到远端 VoceChat 的 GET 地址验证,返回 200。本机 GET 不带密钥也返回 200,POST 未鉴权返回 401;配置完整接收地址后,首轮 **6 条真实私聊推送全部返回 202,6 条处理完成,0 条失败**。VoceChat 的可选 AES secret 保持留空,接收的是明文 JSON;URL 访问令牌是独立的接收端鉴权。 | 用户测试内容 | 实际接收结果 | | --- | --- | | 普通文本 | 接收并进入结构化处理 | | Markdown | 接收并保留 Markdown 语法;不在普通日志记录正文 | | 带附件消息 | 文字与图片分别投递;JPEG 实际下载 335056 字节 | | 语音 | 实际下载 49880 字节,探测为 M4A / audio/mp4,时长 2.960544 秒 | 另从本轮语音附件取得真实音频,实际执行 FFmpeg 转码,并用 FFprobe 验证输出为 **PCM s16le、16000 Hz、1 声道 WAV**;输出 95188 字节,时长 2.972188 秒。下载与转换临时文件已清理。本步骤没有调用 ASR,不能据此宣称已经识别语音内容。 已验证的真实入站链路为 VoceChat 私聊推送 → 接收/规范化/去重队列 → 附件下载与音频探测/转换。真实出站结果见下文;群聊、真实 DSH Agent 驱动的回复和真实 ASR 转写仍待对应服务联调,相关自动化 Mock 结果分别记录在上表。 后续未带 URL 访问令牌的推送曾在旧版鉴权阶段返回 401,并未进入上述处理统计。独立测试程序可通过 `requireWebhookToken:false` 关闭审计端令牌要求。**v0.3.1 正式插件也支持可选令牌**:默认 `webhookSecretRef:''`,不填 Secret 即接收明文 JSON;显式配置引用时才校验,缺失凭据或错误令牌会拒绝。这个访问令牌与 VoceChat 后台可选的 AES Secret 分开。 2026-10-29 北京时间 11:34:01,未启用访问令牌校验的审计模式实际收到一条远端私聊 POST:未带 query 访问令牌、未带 Authorization,返回 202,规范化与处理完成。累计真实消息处理完成 7 条,队列内失败与不确定状态均为 0;早先鉴权拒绝的请求不计入此处理数量。 ### 真实私聊回发 按用户明确指令,固定到其刚才来信的已确认私聊目标,依次通过生产 `VoceChatClient` 回发以下 4 条消息。未使用全局“最近来信人”自动路由,未发送到其他用户或群;每条均获得服务端消息 ID,用户随后确认四条都正常显示、语音可以播放。 | 类型 | 实际结果 | | --- | --- | | 普通文本 | `text/plain` 发送成功,用户确认收到 | | Markdown | `text/markdown` 发送成功,用户确认正常渲染;使用显式 `format: 'markdown'`,未附加引用前缀 | | 图片附件 | JPEG 335056 字节,真实 prepare → multipart upload → `vocechat/file` 发送成功,用户确认可预览 | | 语音 | M4A 49880 字节、约 2.96 秒,真实上传后以 `vocechat/audio` 发送成功,没有 HTTP 415 降级,用户确认可播放 | 图片与语音为用户本轮测试素材的原样回传;未调用 TTS 或 ASR,也未借助真实 DSH Agent。这次验证了真实 Bot API 的双向通信和媒体上传/下载,不代表 Agent 工具执行、自动回复或模型能力已完成真实全链路验证。 ## 已知限制 1. 原生 `replyTo` 已在官方 0.5.38 上验证;较旧服务可能缺少接口。引用 ID 必须能由同源本地记录或该会话最近 100 条历史确认,无法确认时拒绝发送。长文及媒体组合拆成有序多条,仅首条带引用。`vocechat/audio` 的兼容差异及 HTTP 415 降级见 API 调查记录。 2. 当前只接收明文 JSON Webhook;VoceChat 可选 AES 密文不受支持,也没有原生 HMAC 签名协议可供验证。共享 secret 与反向代理承担入口认证。 3. 只接收官方 Webhook 投递的消息。不补轮询其他机器人消息,不实现表情包管理、人格、记忆或自主定时调度。 4. 图片理解依赖目标模型的图片输入能力;DSH 本版本没有原生 audio block,采用标注消息 ID/文件名的转写文本加原音频文件。已内置 OpenAI 标准及 MiMo ASR/TTS;阿里百炼专用协议和 Qwen Omni 仍为扩展点。新增语音验证使用本地 HTTP 测试服务,未调用真实云端 ASR/TTS。 5. Webhook ACK 与发送 API 之间没有分布式事务。网络断开可能出现服务端已发送而客户端未确认;已入队/已启动 turn 的不确定结果不自动重试。断电级别持久化和严格 exactly-once 不在本版保证范围内。 6. 去重使用全局 VoceChat mid,受 `dedupTtlMs` 与 `maxHistory` 限制;不要让多个 Bot/多个进程共用同一个 statePath。群白名单授权整个群,需更细限制时配置 groupSenderWhitelist。 7. 固定 Session 的 Web/QQ 队列若持续繁忙,已封批消息继续排队,不抢占,也不消耗本轮 turnTimeoutMs。实际提交后的超时或崩溃仍会隔离为 uncertain;其他渠道主动 steer 造成同轮来源混合时停止外发。 8. ASR/VoceChat API 基址是管理员配置,允许内网自托管地址。远程出站媒体只允许配置的公网 origin;不支持出站媒体的私网 URL、重定向或 HTTP 代理自定义路由。 9. 取消/禁用只停止桥接等待和发送,不取消共享 Agent。已经入队的 Agent 工作可能继续完成,不会在桥接停止后自动转发结果。 10. 状态文件保留必要聊天内容;DSH durable attachments 由宿主保留。自动清理仅处理插件临时目录,管理聊天历史与宿主附件仍遵循 DSH 规则。