三个平台桥原本各自手写 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 全量通过;四平台重启后在线且无错误。
37 lines
1.6 KiB
Desktop File
37 lines
1.6 KiB
Desktop File
[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
|