diff --git a/docs/PRD.md b/docs/PRD.md index a726e96..f72d6b3 100644 --- a/docs/PRD.md +++ b/docs/PRD.md @@ -90,7 +90,7 @@ | 编号 | 问题 | 影响 | 当前措施 | 优先级 | 当前状态 | |------|------|------|----------|--------|----------| | R01 | Gateway 进程意外退出未自动拉起 | 服务中断 | 无自动恢复 | P0 | 🔄 Gateway 健康已纳入监控(I/J Tab显示), 自动拉起待 systemd 配置 | -| R02 | XMPP Bot 断线后重连失败 | 消息丢失 | slixmpp reconnect 不可靠 | P0 | ✅ frp heartbeat已加 | +| R02 | XMPP Bot 断线后重连失败 | 消息丢失 | slixmpp reconnect 不可靠 | P0 | ✅ frp heartbeat + 应用层保活(60s检测×3→exit→systemd重启) | | R03 | Provider key 过期/配额超限无告警 | LLM 调用失败 | fallback 不总能触发 | P0 | 🔄 fallback链待验证 | | R04 | Session 膨胀导致响应退化 | 回复质量下降 | 硬截断 200 条 | P1 | ✅ 硬截断200条已实现 | | R05 | SOUL vs MEMORY 规则冲突 | 行为异常 | 需手动清理 memory | P1 | 🔄 需持续维护 | diff --git a/xmpp_agent_core.py b/xmpp_agent_core.py index cafef66..3a836d0 100644 --- a/xmpp_agent_core.py +++ b/xmpp_agent_core.py @@ -1165,9 +1165,20 @@ def main(): loop = asyncio.get_event_loop() async def _status_check(): + skipped = 0 while True: await asyncio.sleep(60) - log("(alive)") + alive = bot and bot.is_connected() if hasattr(bot, 'is_connected') else False + if not alive: + skipped += 1 + log(f"[R02] XMPP 连接已断开 ({skipped}/3),等待重连...") + if skipped >= 3: + log("[R02] 连续 3 次检测到连接断开,退出进程让 systemd 重启") + os._exit(1) + else: + if skipped > 0: + log(f"(连接已恢复,跳过 {skipped} 次检测)") + skipped = 0 asyncio.ensure_future(_status_check())