Commit 7e5f1ccf3a03c94b420a6e3eac1c4edcf379ff65

Authored by yibo
1 parent 5f2240d5

fix: 加 unhandledRejection/uncaughtException 兜底防 node 崩溃

症状:宜创群授权后的 hermes 回复 run 跑到一半,node 进程自己退出,
keepalive 检测到重启,打断了正在进行的 run,回复没发出。

根因推断:Node 26 默认遇未捕获的 Promise rejection 就退出进程。
流式 callHermesRunStream + sendChain Promise 链路某处漏接 reject。

修复:入口加 process.on('unhandledRejection') / ('uncaughtException')
兜底,捕获后记日志([UNHANDLED REJECTION] / [UNCAUGHT EXCEPTION])
保持进程存活,不再被 keepalive 打断。下次复现能从日志看到真正的错误栈。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
server/services/wechat/auto-reply.js
... ... @@ -1100,6 +1100,16 @@ class AutoReplyBot {
1100 1100 // ═══════════════════════════════════════════════════════════════
1101 1101  
1102 1102 if (require.main === module) {
  1103 + // 全局兜底:Node 默认遇 unhandledRejection / uncaughtException 会退出进程,
  1104 + // 流式 + sendChain Promise 链路某处漏接 reject 会导致 node 崩 → keepalive 重启
  1105 + // → 打断正在跑的 hermes run。这里捕获并记日志,保持进程存活。
  1106 + process.on('unhandledRejection', (reason) => {
  1107 + log('[UNHANDLED REJECTION]', (reason && reason.stack) || String(reason));
  1108 + });
  1109 + process.on('uncaughtException', (err) => {
  1110 + log('[UNCAUGHT EXCEPTION]', (err && err.stack) || String(err));
  1111 + });
  1112 +
1103 1113 if (process.env.MY_WXID) CONFIG.myWxid = process.env.MY_WXID;
1104 1114 if (process.env.MY_NICKNAME) CONFIG.myNickname = process.env.MY_NICKNAME;
1105 1115  
... ...