Files
MailUI4Agents/deploy/opencode-serve.service
JianFeeeee c401eb2da2 fix(bridges): SSE 跨分片保帧 + Last-Event-ID;pi worker 有界重投;systemd 故障上报;清理误提交二进制
三个平台桥原本各自手写 SSE 解析,有两个共同的静默丢事件缺陷:
  1. evt/data 是每次 read() 的局部变量 —— TCP 把一帧
     'event: x\ndata: {...}\n\n' 切在换行处时,前半段的 event 名被丢掉、
     后半段只剩 data,整帧静默丢弃。表现为「新邮件偶尔收不到」
     「权限决策点了没反应」,日志里一个字都没有。
  2. 重连不带 Last-Event-ID —— 断线期间的事件留在服务端 per-agent 环形
     缓冲里永远回放不出来(pi 与 homeagent 已正确使用,DSH/opencode 没有)。

修法:抽出共用 lib/sse-client.js(三桥逐字节同源,check-shared-libs 校验),
把「跨 chunk 保帧状态」与「Last-Event-ID 断点续传」写对一次。pi 桥的
gateway.mjs 也改为复用同一实现(保留 reconfigure 时清断点的语义)。

pi worker 丢任务:worker 未回报 done 就退出(SIGKILL/OOM/崩溃)时,
主进程原来只记一行日志就 pump() —— 那封邮件永远没有回音。改为按
1s/2s 退避有界重投(默认 3 次),到上限记「放弃」并可观测。

systemd 故障上报:四个宿主服务接入 service-failure-notify.mjs 的
ExecStopPost/--report 与 ExecStartPost/--flush。进程内 uncaughtException
捕获不了 SIGKILL/OOM,只能由 systemd 统一覆盖。正常 stop/restart 不发信。

仓库卫生:server/server(24MB 构建产物,f9d757b 误提交)移出版本库。

测试:opencode 302 / dsh 335 / pi 391 全绿(新增 12 例 SSE 帧解析 +
2 例 worker 重投);Go 全量通过;四平台重启后在线且无错误。
2026-09-11 10:27:41 +08:00

37 lines
1.6 KiB
Desktop File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

[Unit]
Description=opencode headless server (AgentMail mail-bridge host)
After=network-online.target agentmail-gateway.service
Wants=network-online.target
[Service]
Type=simple
WorkingDirectory=/home/program/agentmail
ExecStart=/usr/local/bin/opencode serve --port 4097 --hostname 127.0.0.1
# opencode 靠 HOME 定位 ~/.config/opencode插件列表、provider 配置、认证)。
# systemd 不会自动注入 HOME不显式给就加载不到 mail-bridge 插件。
Environment=HOME=/root
# mail-bridge 插件凭这组凭证向 Gateway 注册并收发邮件
EnvironmentFile=/etc/agentmail/opencode.env
Restart=always
RestartSec=10
# opencode 惰加载插件:进程启动时不载 plugin要等第一个 /session 请求。
# 不预热的后果是重启后紧接着到的第一封邮件会丢mail-bridge 还没订阅 SSE
# 失败不能拘到单元本身,所以结尾固定 true。
ExecStartPost=/bin/sh -c 'for i in $(seq 1 30); do \
curl -sf -m 3 -u "opencode:$OPENCODE_SERVER_PASSWORD" http://127.0.0.1:4097/session >/dev/null && exit 0; \
sleep 1; \
done; true'
# 异常退出邮件上报:进程内钩子捕获不了 SIGKILL/OOM只能由 systemd 覆盖。
# 正常 stop/restart 不上报(脚本内 isAbnormalExit 提前返回)。
ExecStopPost=-/usr/bin/node /home/program/agentmail/deploy/service-failure-notify.mjs --report --service opencode-serve.service
# 补发上次 Gateway 不可达时暂存的报告
ExecStartPost=-/usr/bin/node /home/program/agentmail/deploy/service-failure-notify.mjs --flush --service opencode-serve.service
[Install]
WantedBy=multi-user.target