三个平台桥原本各自手写 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 全量通过;四平台重启后在线且无错误。
65 lines
2.0 KiB
Plaintext
65 lines
2.0 KiB
Plaintext
# ---- 依赖与构建产物 ----
|
||
#
|
||
# 前端只在**构建期**用到 npm:`npm run build` 出的 dist/ 被 cp 进
|
||
# server/internal/static/static/ 再由 go:embed 编进二进制。
|
||
# 部署机上没有 node,产物就是「一个二进制 + 一个 .db 文件」。
|
||
# 因此这三样都不进版本库:装依赖与构建都能从 package-lock.json 复现。
|
||
client/electron/node_modules/
|
||
client/electron/dist/
|
||
plugins/*/node_modules/
|
||
|
||
# dsh-mail-bridge 是 TypeScript 写的,dist/ 是 tsc 的产物。
|
||
# 与 client/electron/dist 同一个理由:装依赖与构建都能从 package-lock.json 复现,
|
||
# 产物不进版本库。注意它**必须在装插件前构建**(package.json 的
|
||
# main 指向 dist/index.js),deploy/install.sh 负责这一步。
|
||
plugins/*/dist/
|
||
|
||
# go:embed 的输入目录 = client/electron/dist 的副本,同属构建产物。
|
||
#
|
||
# 但目录本身要留下:go:embed 要求它存在才能编译,否则新克隆连
|
||
# `go test ./...` 都跑不起来 —— 只改后端的人不该被迫先装 node。
|
||
# 因此忽略构建产物,只保留 placeholder.html(见该文件内注释:
|
||
# 之所以不叫 index.html,是因为那正是 Vite 产物的名字,会被反复覆盖)。
|
||
server/internal/static/static/*
|
||
!server/internal/static/static/placeholder.html
|
||
|
||
# Go 构建产物
|
||
server/agentmail-gateway
|
||
server/gw
|
||
*.test
|
||
|
||
# ---- 运行态数据 ----
|
||
#
|
||
# SQLite 库与附件目录:生产在 /opt/agentmail/data,
|
||
# 本地调试可能落在仓库里,绝不能提交(含真实邮件与凭证哈希)。
|
||
*.db
|
||
*.db-shm
|
||
*.db-wal
|
||
data/
|
||
attachments/
|
||
|
||
# ---- 凭证 ----
|
||
#
|
||
# 管理员密码、Agent 密钥、opencode server password 都在 env 文件里。
|
||
.env
|
||
*.env
|
||
|
||
# ---- Agent 工具的运行态目录 ----
|
||
#
|
||
# 这些是 pi / omo 在仓库里落的会话与后台任务状态,属于本机运行痕迹,
|
||
# 不是项目的一部分。
|
||
.pi/
|
||
.omo/
|
||
.pi-glla/
|
||
.codegraph
|
||
|
||
# ---- 编辑器与系统 ----
|
||
.DS_Store
|
||
*.swp
|
||
.idea/
|
||
.vscode/
|
||
plugins/homeagent-mail-bridge/build/
|
||
|
||
# 构建产物(曾误提交)
|
||
server/server
|