Skip to content

Releases

dsh-plugin-tlnotify v0.1.0

Choose a tag to compare

@ltl0312 ltl0312 released this 01 Oct 13:30

首个版本,按仓库内 doc/tlnotify-设计方案.md 完整实现。

这是什么

把所有 DSH 会话的事件通知聚合到一个 IM 通道里:哪个项目的哪个对话触发了中断、结束、报错或等待你操作,一眼能看出来;该给按钮的地方给按钮;你还能直接在那个通道里回复,消息会被定向注入回对应的会话。

零公网依赖——QQ 与飞书都走长连接,不需要公网 IP,也不需要内网穿透。

本版包含

通道

  • QQ 单聊机器人:WebSocket 长连接、keyboard 按钮、长按引用回复;被动回复窗口用尽后自动降级为主动推送
  • 飞书自建应用:长连接 + 交互卡片,SDK 按需动态加载
  • 统一的 start / stop / send / update 四方法接口,单通道启动失败不影响插件装载

事件(9 类)

任务完成、执行错误、执行被阻塞、手动中止、Token 达到上限、异常中断、等待我回答、权限请求、等待计划确认。默认只通知主会话,子 Agent 静默且可开关。

可操作性

  • 权限请求与用户提问通过 approval/request、user-questions/request 两个 waterfall 认领并结算
  • 按钮 value 结构化,点击后把回答回注到对应会话
  • 计划确认(exit_plan_mode)同样支持按钮批准

回复路由(三层,顺序不可反)

  1. 按钮 —— value 自带 sessionId,零歧义
  2. 长按引用回复 —— 维护 byMessage / byRefIdx / byThread / byContent 四张反查表
  3. 显式短 id 前缀 —— 例如 519cc141 继续

兜底发最新一条通知,其次退到最近一次需要人介入的会话,并回显「已发给 X」。路由表带 7 天 TTL 且落盘,重启不丢。

两种运行模式

  • 全局模式:一行精简提示,不刷屏;对某个会话回复 detail 可临时升到详细
  • 单会话模式:只推绑定会话,带完整上下文与前 N 轮摘要
  • 切换途径:config.json、IM 命令 /mode、回复 detail

其余

  • 完成门控(等 Agent 真正 idle 再发)、按 会话:seq 去重、正文实时聚合
  • 长文本按通道上限分片,按钮只挂首片
  • 配置与状态落 $DSH_HOME/tlnotify/{config.json,state.json,plugin.log},日志 1 MiB 轮转
  • 123 个单元测试覆盖聚合、渲染、路由、去重与模式切换

安装

dsh plugin --profile web add dsh-plugin-tlnotify

或手工在 profile 里 pnpm add dsh-plugin-tlnotify,并把包加进 dsh.profile.bundles。

飞书通道需要额外自行安装官方 SDK(约 30 MB,故意不做成自动依赖):

pnpm add @larksuiteoapi/node-sdk

已知限制

  • QQ 用户可在客户端关闭「允许主动发送」,关闭后主动消息一律失败(被动回复不受影响)
  • QQ 被动回复有硬上限(单聊 4 片、群聊 5 片),超出平台会静默丢弃,本插件会自动切到主动推送
  • 未安装飞书 SDK 时只有飞书通道启动失败,QQ 通道与插件装载不受影响

校验

  • pnpm install --frozen-lockfile 通过
  • pnpm --filter dsh-plugin-tlnotify typecheck 零错误
  • pnpm --filter dsh-plugin-tlnotify test —— 123 passed
  • pnpm --filter dsh-plugin-tlnotify build —— 产出 CJS + ESM + .d.ts

npm:https://www.npmjs.com/package/dsh-plugin-tlnotify