# 路线图 > 状态:P0 已完成(2026-10-18);P1「@ 直通」已真机验收;P1.5 基础配置页已落地(2026-10-19); > **P2.1/P2.2 消息闸门骨架与收尾已落地、P2.3 jev 分类器已接(OpenRouter `typesafe/jev-1.14`); > P3 `qq_send` 主动推送与 QQ 侧审批已落地(2026-10-19)**。 > **P4 聊天记录与消息拼接**:`.qq-relay/` 隐藏目录 + 群项目目录 + prompt 拼接, > v0.8.0 已实现(2026-10-19;真机验收待用户重启 GUI 后确认),见 [chat-context.md](./chat-context.md)。 > **P4.1 入向媒体落盘**:图片 / 表情下载进 `.qq-relay/media/` 并写进聊天记录与 prompt, > v0.9.0 已实现(2026-10-19),见 [media.md](./media.md)。 > **P5 QQ 侧命令层**:`/new` / `/stop` / `/status` / `/help`,v0.11.0 已实现(2026-10-19), > 见 [commands.md](./commands.md)。 > **P6 回复体验**:引用触发消息 / 处理中占位 / 直通连发合并,v0.11.1 已实现(2026-10-19), > 见 [reply.md](./reply.md)。 > **P4.3 聊天记录清理**:保留天数 UI + 立即清理,v0.13.0 已实现(2026-10-19),见 [chat-context.md](./chat-context.md) §7。 > **P7 client 面板增强**:闸门每群状态 / 最近消息 / 映射管理,v0.14.0 已实现(2026-10-19),见 [client.md](./client.md)。 > **P8 戳一戳识别与回戳**:被戳接话 / 互戳记录 / `qq_poke` 工具,v0.15.0 已实现并真机验收(2026-10-19),见 [poke.md](./poke.md)。 > **P9 入向群文件**:`group_upload` → 下载落盘 → 可选直通,v0.16.0 已实现(2026-10-19),见 [media.md](./media.md) §5.2。 > **P10** 已落地(v0.17.0);**P11** 已完成(v0.18.0);**P13.1 角色预设** 已落地(v0.19.0), > 预设管理 + 模型 / 思考层级 / 权限已落地(v0.20.0);**P14 画图能力(ComfyUI 探测 + 动态 skill)** > 已落地(v0.21.0,v0.21.1 修 `qq_send` 出向图片 / 文件转发),见 [comfy.md](./comfy.md); > **P15 视频生成(MiniMax H3 + comfy-video skill + qq_send videos)** 已落地(v0.22.0), > 见 [comfy.md](./comfy.md) §8。 > **P12 环境一键安装** 已落地基础版(v0.23.0,2026-10-20:7 步诊断 + 白名单动作 + 一键修复 + > 动作日志;v0.25.0 起「一键修复」改为逐步补全,见 [env.md](./env.md));**P13.2–P13.3 表情包** 是 2026-10-19 用户确认的后续重点, > 状态:**规划中**。 > 上级 AGENTS.md §0 已按用户要求**仅对 `dsh-qq-relay` 解除**(2026-10-19)。 > 设计见 [architecture.md](./architecture.md)、[onebot-channel.md](./onebot-channel.md)、 > [gate.md](./gate.md)。 ## P0 文档(已完成) - 落地方案文档:架构、OneBot 通道、消息闸门、路线图。 - README / AGENTS 同步:用途、目录结构、文档索引、版本历史。 - 不写任何功能代码。 - 协议端实测(2026-10-19):NapCat 跑在 Docker(Colima,linux/arm64),OneBot 11 正向 WS 连通;@ / 普通消息 / 引用回复 / `send_group_msg` / 历史查询均验证通过。记录见 [onebot-channel.md §9](./onebot-channel.md)。 ## P1 最小闭环:@ 直通 目标:在测试群里 @ 机器人,DSH 跑完把结果回发群聊。 ### 进度(2026-10-19) - ✅ 连接层 / 事件层 / 直通判定 / 会话映射 / 投递 / 出向回发 / 单实例锁已实现(含单测)。 - ⏳ 待真机验收:重启 dwdev GUI 后在测试群逐项跑验收清单。 ### 范围 - **部署前提**:NapCat 跑在 Docker(Colima)里,bot 小号已登录;OneBot 11 正向 WS `ws://127.0.0.1:3001` + token(详见 [onebot-channel.md §3](./onebot-channel.md))。 - **目标 profile**:`dwdev`(已清空为只装本插件;装完需重启该 profile 的 GUI)。 - **工作目录**:默认 `~/dsh/qq-relay-ws`;P1 先固定配置,后续做成插件设置。 - **配置项**:见 [architecture.md §2.1](./architecture.md)。 - 连接层:WS 客户端(鉴权、重连退避、心跳、echo、self_id 校验、单实例锁)。 - 事件:group message、忽略 message_sent、message_id 去重、群白名单。 - 直通判定:message 段含 at self_id / 引用回复 / 命令前缀。 - 会话映射:一群一会话,自动创建(workspace + 标题);映射持久化。 - 投递:sessionController.prompt(或 agents.followup),关联 messageId → turn。 - 出向:turn/end 收集本轮文本,send_group_msg 回复;长文本切分;发送失败重试。 - 闸门:本阶段不做 jev,@ 消息全部直通。 - 运行保障:日志、配置校验;服务缺失时静默不崩溃。 ### 验收 ### 验收状态(2026-10-19) - ✅ 真机已验证:@ → 回复(约 4 秒);NapCat 重启后 WS 自动重连、重连后消息正常;重连后复用原会话不重建。 - ✅ 单测覆盖:重复事件只回一次、非白名单 / `message_sent` 忽略、长文本切分、退避重连。 - ✅ DSH 单轮超过 5 分钟(实测 6 分 04 秒)结果仍能发出。 - ✅ 重启 dwdev GUI 后:锁被新进程接管、映射复用原会话,重启后首条消息正常回复。 - 测试群 @ 机器人「你好」→ 收到 DSH 回复。 - **DSH 单轮超过 5 分钟 → 结果仍能发出**(真实 QQ 号无回复窗口)。 - 同一条消息重复事件 → 只回复一次。 - 重启 GUI 后映射与会话仍在,不重复建会话。 - WS 断线自动重连,断线期间不崩溃;重连后不重复回复。 - 非白名单群 / 机器人自己的 message_sent 被忽略。 - 长回复按长度切分,不超 QQ 实际限制。 - `pnpm check` 全绿(语法 + 类型 + 文档配对)。 ## P1.5 基础配置页(已完成,2026-10-19) 目标:不重启 GUI 就能看状态、改配置。 ### 范围 - 设置 →「QQ 机器人」页面(`settings.section`):状态 / 配置表单 / 群映射只读。 - host 三条同源 HTTP 路由(status / config / reconnect),统一 JSON 信封。 - 配置覆盖落盘 `~/.dsh/storages/dsh-qq-relay/settings.json`;保存后立即重建连接(锁不重入)。 - token 只写不读;非法配置 400 且不落盘。 ### 验收(2026-10-19) - ✅ 单测:设置覆盖 / 脱敏 / 原子读写、路由面、`apply()` 集成(51 个全过)。 - ✅ `pnpm check` 全绿(语法 + 类型 + 文档配对)。 - ✅ 真机验收(2026-10-19,用户确认):刷新 dwdev 页面后「设置 → QQ 机器人」可见;状态行、配置保存、重新连接、映射表均正常。 ## P2 消息闸门(P2.1 骨架已落地,2026-10-19) 目标:群内普通消息按 gate.md 运行,控制发言频率与成本。 ### 进度(2026-10-19) - ✅ 聊天日志 JSONL 落盘 / 读取;P2.2 起按保留期(7 天)每天清理一次(v0.8.0 起改为默认永久保留,见 [chat-context.md](./chat-context.md) §7)。 - ✅ 每群状态按群分文件 `state/.json`:seen / pending / lastBotSpeakAt / lastReplyAt / cooldownUntil / evaluating / dshBusy;旧 `state.json` 一次性迁移;重启恢复 pending 与冷却,不立即发言。 - ✅ 快路:bot 最近 10 分钟发过言 → 5 秒去抖合并,一批只调一次分类器。 - ✅ 最小发言间隔 45 秒:间隔内的批次延后(消息不丢)。 - ✅ 慢路:2 小时定时器到点评估累积消息,只取最近 2 小时(更早丢弃);无消息 no-op。 - ✅ 分类器以接口注入:超时 / 报错 / 输出不合规一律 fail closed;决策落 `gate/*.jsonl`(不含正文), 保留 7 天,便于调阈值 / 回放。 - ✅ DSH 忙(dshBusy)时延后评估,避免同群并发起两个 turn。 - ✅ 发送队列:断线或发送失败排队,重连后按序补发;风控限流退避、明确失败不重试;上限 50 条 / 30 分钟。 - ✅ 群成员昵称 / 角色:直接取事件自带的 `sender.card || sender.nickname` / `sender.role`, 不额外调 `get_group_member_info`(事件缺字段时才需要补查)。 - ✅ **jev 分类器接模型(P2.3)**:OpenRouter Decisions API + `typesafe/jev-1.14`(Noul 概率 → 阈值 0.7 判定),key 走 `OPENROUTER_API_KEY` 环境变量;超时 / 网络 / 格式错误一律 fail closed。 **v0.25.6 起模型 id / 分类器地址可在「行为」页改**(保存即热切换分类器,不重建 relay)。 见 [gate.md §4](./gate.md)。 - ✅ **闸门参数进设置页(v0.10.0)**:`debounce` / `fastMinReplyInterval` / `jevThreshold` 可在 设置 →「QQ 机器人」→「闸门」里改,保存即重建闸门(无需重启);阈值动态读取。 - ⏳ 真机验证:`gate.enabled: true` + key 就绪后按下面验收清单跑(快路合并 / 慢路定时 / 冷却 / 频控)。 - ⏳ 阈值调优:先用 0.7,按 `gate/*.jsonl` 决策日志再调。 ### 范围 - 聊天日志 JSONL:落盘、保留 7 天、给 jev 与 DSH 提供上下文。 - jev 分类器:契约、超时、fail closed、决策日志。 - 快路:10 分钟窗口 + 5 秒去抖 + 45 秒最小发言间隔。 - 慢路:2 小时定时器 + 最近 2 小时批量评估。 - 状态持久化:lastBotSpeakAt / cooldownUntil / pending / seenMessageIds;重启恢复。 - 发送队列与 retcode 退避;断线期间排队。 - 群成员昵称 / 角色(get_group_member_info)用于 prompt 前缀。 ### 验收 - 快路连续三条消息只产生一次 jev 调用与一次回复。 - 慢路 2 小时到点只评估最近 2 小时消息;无消息 no-op。 - 冷却期内 @ 直通仍然生效。 - 重启后冷却状态恢复,不立即发言。 - 发送频率被 QQ 风控时退避且不刷错误日志。 - WS 断线重连后不重复回复、队列不丢。 ## P3 扩展 - ✅ 审批:文本命令(同意 / 拒绝),超时按拒绝(2026-10-19 已实现,见 [approval.md](./approval.md); 真机验证待用户重启 dwdev 后在 QQ 群里触发需要审批的操作确认)。 - 私聊(private):与群共享映射体系还是独立会话,待定。 - 媒体:入向图片 / 表情(v0.9.0)与视频 / 语音、出向图片 / 文件(v0.12.0)已落地, 见 [media.md](./media.md);仍缺入向群文件、入向转 DSH 附件。 - ✅ DSH → QQ 主动推送工具 `qq_send`(2026-10-19 已实现,契约见 [tools.md](./tools.md); 真机验证待用户重启 dwdev 后在任意会话调用确认)。 - ✅ client 半身面板增强:映射管理、闸门状态、最近消息(P7,v0.14.0 已交付,见 [client.md](./client.md))。 - 多群资源控制:并发上限、队列、每群配额。 ## P4 聊天记录与消息拼接(v0.8.0 已实现,2026-10-19) 目标:聊天记录落在「群绑定的项目」隐藏目录 `.qq-relay/` 里,agent 可直接读; 发给 DSH 的 prompt 带上群名 / 时间 / @ 与引用标记 / 历史指针。完整规格见 [chat-context.md](./chat-context.md)。 ### 范围(v0.8.0) - 群项目目录:`groupWorkspaces`(每群可配,设置页可编辑),会话 cwd 与聊天目录同源。 - 隐藏目录 `.qq-relay/`:`chat/<群号>/<日期>.jsonl` + 自忽略 `.gitignore`。 - prompt 拼接:群名 / 群号 / 时间 / 条数 / `@你`、`引用 ` 标记 / 历史相对路径指针。 - 旧全局聊天日志一次性迁移(幂等)。 - 已映射群改项目后「重新绑定」按钮(rebind 路由)。 - 保留策略:默认不自动删除(`chatRetentionDays: 0`);清理 UI 已随 v0.13.0 交付(见 P4.3)。 ### 验收状态(2026-10-19) - ✅ 单测:项目解析 / 聊天日志按项目路由 / prompt 拼接 / 迁移幂等 / 配置与 rebind 路由, 共 144 个全过;`pnpm check` 全绿(v0.8.1 补了日志元信息 / 空文本修正)。 - ⏳ 真机验收:需要用户重启 dwdev GUI + 刷新页面后逐项确认。 ### 验收 - 设置页为某群配置项目 → 该群聊天记录出现在 `/.qq-relay/chat/<群号>/` 下。 - 普通消息触发的 prompt 含群名、时间、条数、历史指针;@ 直通的 prompt 含 `@你` 语义。 - `git status` 在该项目里保持干净(聊天记录被自我忽略)。 - 重启 GUI 后历史记录仍在;旧全局日志迁移后不重复迁移。 - `pnpm check` / `pnpm test` 全绿。 ## P4.1 入向媒体落盘(v0.9.0 已实现,2026-10-19) 目标:图片 / 表情下载到群项目本地,聊天记录与 prompt 引用对应路径。规格与实现记录见 [media.md](./media.md)。 ### 范围 - `/.qq-relay/media/<群号>/<日期>/-<序号>.`。 - 聊天记录新增 `media` 数组(`kind` / `status` / `path` / `bytes` / `contentType` / `reason`)。 - prompt 追加媒体标记;纯媒体消息也能生成 prompt(@ 带图可转给 DSH)。 - 只收 http(s)、10 秒超时、单文件 20 MiB、单消息最多 10 个;失败不阻断消息流。 - `chatRetentionDays > 0` 时按日期目录清理媒体。 ### 验收状态(2026-10-19) - ✅ 单测:计划解析 / 下载 / 失败分类 / 归一化 / 清理 / prompt 标记, 共 158 个全过(v0.9.1 补了按 magic bytes 定扩展名);`pnpm check` 全绿。 - ⏳ 真机验收:重启 dwdev GUI 后发图确认文件与路径。 ### 验收 - 群里发图 → `/.qq-relay/media/<群号>/<日期>/` 出现文件,聊天记录 `media[0].path` 指向它。 - @ 带图(无文字)→ DSH prompt 里出现 `[图片:.qq-relay/media/...]`。 - 图片下载失败 → 聊天记录 `status: "failed"`,prompt 显示 `[媒体下载失败]`,消息不丢。 - 单测与 `pnpm check` 全绿。 ## P4.2 媒体双向(v0.12.0 已实现,2026-10-19) 目标:把媒体能力补成双向——群里发的视频 / 语音也能落盘给 agent,agent 生成的图片 / 文件也能发回群。 规格见 [media.md](./media.md) §5.1。 ### 范围(v0.12.0) - 入向:视频(mp4 / avi / webm / flv)与语音(amr / silk / mp3 / ogg / wav)落盘,扩展名按 magic bytes; 聊天记录 `media[].kind` 增加 `video` / `voice`,prompt 标记 `[视频:…]` / `[语音:…]`。 - 出向:`qq_send` 新增 `images`(≤4 张,本地绝对路径或 URL)与 `file` / `fileName`(群文件上传); 本地文件读成 base64 经 NapCat 发送(NapCat 在 Docker 里看不到宿主路径)。 - 校验与语义:图片 ≤10 MiB 且必须是支持的格式、文件 ≤30 MiB;离线时出向媒体直接报错不排队。 ### 验收状态(2026-10-19) - ✅ 单测:media 视频 / 语音解析与落盘、prompt 标记、relay 出向媒体、`qq_send` 媒体参数,共 201 个全过。 - ⏳ 真机验收:重启 dwdev GUI 后按下面清单确认。 ### 验收 - 群里发一段视频 / 语音 → `.qq-relay/media/<群号>/<日期>/` 出现文件,聊天记录与 prompt 引用路径。 - 工作区放一张图片 → `qq_send({ images: ['/abs/a.png'] })` → 群里收到图片。 - 工作区放一个 pdf → `qq_send({ file: '/abs/a.pdf', fileName: '报告.pdf' })` → 群文件里出现「报告.pdf」。 - 发一个非图片文件当 images → 工具返回「不是支持的图片格式」,不会发出。 - 离线时发图 / 发文件 → 工具返回离线错误(不是 queued)。 - 单测与 `pnpm check` 全绿;重启 profile GUI 后生效。 ## P4.3 聊天记录清理 UI(v0.13.0 已实现,2026-10-19) 目标:把「默认永不删除」的保留策略做成可操作项——能设自动清理天数,也能手动清一次。 规格见 [chat-context.md](./chat-context.md) §7 / §8,页面契约见 [client.md](./client.md)。 ### 范围(v0.13.0) - 设置页「QQ 机器人」新增「聊天记录清理」区块:保留天数输入(0 = 永不自动删除;7..3650 自动清理, 保存后落 `chatRetentionDays`)+「立即清理」按钮(用当前输入的天数,1..3650,二次确认)。 - 立即清理与自动清理共用 `lib/model/cleanup.js` 的 `pruneChatAndMedia`:同时删聊天日文件 `chat/<群号>/YYYY-MM-DD.jsonl` 与媒体日期目录 `media/<群号>/<日期>/`;不动映射 / 会话 / 配置。 - 新路由 `POST /dsh-qq-relay/api/cleanup`,body `{ days }`,返回删除计数 + 最新状态; 错误码 `CLEANUP_DAYS_INVALID`(400)/ `CLEANUP_NOT_CONFIGURED`(409)。 ### 验收状态(2026-10-19) - ✅ 单测:保留天数校验、聊天 + 媒体清理、路由面(成功 / 400 / 409 / 501 / 405 / 413)、 `apply()` 集成,共 206 个全过;`pnpm check` 全绿。 - ⏳ 真机验收:重启 dwdev GUI + 刷新页面后按下面清单确认。 ### 验收 - 设置页「聊天记录清理」能看到当前保留天数;改成 7 保存后重载仍是 7。 - 保留天数填 0 / 3 / 3651 保存 → 返回校验错误,不落盘(0 合法,3 与 3651 非法;立即清理可填 1..3650)。 - 群里产生聊天记录后点「立即清理」并确认 → 返回删除计数,超过天数的聊天文件与媒体目录消失,近期数据保留。 - 保留天数 0 时点「立即清理」→ 提示需要 1..3650,不发请求、不删文件。 - 立即清理只删文件:群映射 / 会话 / 配置不变,状态行仍正常。 - 单测与 `pnpm check` 全绿;host + client 半身改动,需重启 profile GUI + 刷新页面生效。 ## P5 QQ 侧命令层(v0.11.0 已实现,2026-10-19) 目标:不离开 QQ 就能操作会话——换会话、停长任务、看状态。触发点:真机在群里发 `/new` 被当成普通消息转给了 agent(2026-10-19)。完整规格见 [commands.md](./commands.md)。 ### 范围(v0.11.0) - 命令层置于入向链路最前(审批拦截器之后、直通与闸门之前),命中即执行、不派发 prompt。 - `/new [标题]`:新建会话 + 重绑映射(复用首次建会话逻辑),旧会话保留在 GUI。 - `/stop`:`sessionController.cancel` 中断当前轮次。 - `/status`:会话 / 项目 / 闸门参数 / 待评估 / 最近发言 / 队列。 - `/help`:命令清单。 - 前缀式(`/dsh new`)与裸写式(`/new`)都支持;只认白名单命令名,其余保持原直通行为。 - 仅群主 / 管理员可执行(`commands.roles`),非授权静默忽略;命令回复不刷新闸门发言窗口。 ### 验收状态(2026-10-19) - ✅ 单测:命令解析 / 前缀边界 / 别名 / 角色 / 文案(10 个)+ relay 集成(8 个),共 178 个全过。 - ⏳ 真机验收:重启 dwdev GUI 后在群里跑下面清单。 ### 验收 - 群里发 `/new` → 回「已新建会话:…」,GUI 侧栏出现新会话;再 @ 机器人 → 回复来自新会话。 - `/new 自定义标题` → 新会话标题就是「自定义标题」。 - `/stop`(先起一个长任务)→ 回「已请求中断当前轮次」,任务停止,部分文本仍回发。 - `/status` → 会话 / 闸门参数 / 待评估与真实状态一致;发完后闸门窗口不被刷新(普通消息仍按原节奏)。 - `/dsh 帮我看看这段代码`(未知命令名)→ 仍按直通转给 DSH,行为与 v0.10.1 一致。 - 非管理员发 `/new` → 不响应、不建会话。 - 真机命令生效需重启 profile GUI(host 半身改动)。 ## P6 回复体验(v0.11.1 已实现,2026-10-19) 目标:让群里的回复「看得出在回谁、看得出还在跑、连发不碎」。规格见 [reply.md](./reply.md)。 ### 范围(v0.11.1) - 引用回复:结果首条引用触发消息(直通取触发 / 批次取最后一条),引用失败自动退回普通发送。 - 处理中占位:turn 超过 `ackDelayMs`(默认 8s)先回「收到,处理中…」,不算接话、不刷新闸门; 已发占位但本轮无文本时补收尾。 - 直通连发合并:400ms 窗口内 @ / 引用 / 命令前缀消息合并成一个 prompt。 - 新增 `reply` 配置段(`quote` / `ackDelayMs` / `mergeWindowMs`,patch 只读)。 ### 验收状态(2026-10-19) - ✅ 单测:reply 配置校验 1 个 + relay 回复体验集成 8 个,共 187 个全过。 - ⏳ 真机验收:重启 dwdev GUI 后按下面清单确认。 ### 验收 - @ 机器人提问 → 回复以引用形式出现;长回复只有第一条带引用。 - 起一个要跑十几秒的任务 → 约 8 秒后先收到「收到,处理中…」,结束后收到正式结果。 - 快速连发两条 @ → 只触发一轮回复,prompt 里两条都在。 - 撤回被引用的消息后再触发 → 引用失败但回复照常发出。 - `/status` 等命令回复仍不带引用、不产生占位。 - 真机生效需重启 profile GUI(host 半身改动)。 ## P7 client 面板增强(v0.14.0 已实现,2026-10-19) 目标:把「只能配、不能看」的设置页补成面板——能看闸门实时状态、翻最近消息、管群映射。 页面契约见 [client.md](./client.md) §2 / §4。 ### 范围(v0.14.0) - 闸门状态:状态快照的 `gate` 增加全局计数(待评估消息 / 群、活动定时器、派发队列、发送队列) 与每群一行(待评估条数 / 最近发言 / 最近回复 / 冷却 / 评估中 / DSH 忙);页面每 5 秒随状态轮询刷新。 relay 暴露只读 `snapshot()`,runtime.status 透传。 - 最近消息:新路由 `GET /dsh-qq-relay/api/messages?groupId=&limit=`,读该群最近 24 小时聊天记录 (默认 20、上限 100 条),转成只读视图(时间 / 显示名 / @ 与引用标记 / 媒体标记); 新增 `lib/model/panel.js` 做查询校验与字段收敛。 - 映射管理:行内「解除绑定」+ 表头「清空全部映射」,路由 `POST /api/mapping/delete`、`POST /api/mapping/clear`;只删本机映射、重建 relay 清缓存, GUI 里的旧会话保留,下条消息按当前项目目录重新建会话。 ### 验收状态(2026-10-19) - ✅ 单测:面板纯逻辑 3 个、路由 4 个、`apply()` 集成 2 个,共 215 个全过;`pnpm check` 全绿。 - ⏳ 真机验收:重启 dwdev GUI + 刷新页面后按下面清单确认。 ### 验收 - 设置页「闸门」区块出现每群状态表;群里有待评估消息 / 发言后数字与「最近发言」随之变化。 - 群项目目录行点「消息」→ 显示最近 24 小时消息(含 @ 与引用标记);「刷新」能拿到新消息。 - 行内「解除绑定」确认后映射消失、GUI 里旧会话仍在;再在群里发消息 → 新建会话。 - 表头「清空全部映射」确认后映射表清空;状态行 / 配置不受影响。 - 单测与 `pnpm check` 全绿;host + client 半身改动,需重启 profile GUI + 刷新页面生效。 ## P8 戳一戳识别与回戳(v0.15.0 已实现并真机验收,2026-10-19) 目标:识别 QQ 群「戳一戳」——被戳时 agent 能回应,群友互戳进入聊天上下文;agent 可选择回戳。 规格与事件契约见 [poke.md](./poke.md)。 ### 范围(v0.15.0) - codec 识别 `notice.notify.poke`(`user_id` 戳者 / `target_id` 被戳者 / `group_id`), 合成去重键 `poke: