fix(mail)!: agent 发信不再把 agent 名当工作区存进 from_workspace

用户报「这个 zcode@zcode 转发生成的地址绝对有问题」的**写入侧根因**:
mail.go 的 agent 发信路径传的是 `agentName, agentName` —— 第二个参数是 from_workspace,
于是近两天 zcode 10 封、homeagent/opencode 全部把**自己的名字**存成了工作区
(人类路径 me.go 那一格是空串,所以只有 agent 的信这样;pi 399 封有 4 种值、dsh 116 封 3 种
则是历史与真实路径混着的状态)。

改法(一处):from_workspace = 该会话的工作区 —— 地址里带了 path 就用它,
否则回查 SessionWorkspaceOf(空串语义是「不知道」);再兜一层"等于 agent 名就置空"。
配套的显示侧修复(d9d81b9)已让 `name@name` 不再出现,并对**存量**行生效
(path==name 时当"不知道"丢弃,改用会话反查)——所以历史数据不需要回填。

生产实测(部署后新写入一封):
  修复前该格 = "pi"(或 "zcode");现在 = "/home/program/agentmail"(会话工作区)
判据:显示侧 TestQuoteBodySenderAddressNeverNameAtName 已钉住引用块;
本改动为写入侧,用**线上真发一封 + 读库对照**验证(handler 包无发信测试夹具,
不硬加一条只钉形状的假判据)。
This commit is contained in:
2026-09-15 09:47:08 +08:00
parent d9d81b94b1
commit a684d479bb

View File

@ -439,8 +439,20 @@ func SendMail(w http.ResponseWriter, r *http.Request) {
// 上一秒记住的地址下一秒失效。真正改名要等用户在前端点「接受」。
proposal, body := extractRenameProposal(req.Body)
// ★ 2026-09-15:这里原先传的是 `agentName, agentName` —— 把 **agent 名当成了工作区**
// 存进 from_workspace(人类路径 me.go 那一格是空串,所以只有 agent 的信这样)。
// 后果:转发引用块拼出 `zcode@zcode`(用户报「这个地址绝对有问题」),
// 而且"发件人当时在哪工作"这个事实被一个名字覆盖掉了。
// 正确值 = 该会话的工作区:地址里带了 path 就用它,否则回查会话(空串语义是"不知道")。
fromWorkspace := to.Path
if fromWorkspace == "" {
fromWorkspace = repo.SessionWorkspaceOf(r.Context(), sessionID)
}
if fromWorkspace == agentName {
fromWorkspace = "" // 再兜一层:宁可空,也不把名字当路径
}
mailID, err := repo.CreateMail(r.Context(), sessionID, parentMailID,
agentName, agentName, to.Name, to.Path, req.Subject, body, ccList)
agentName, fromWorkspace, to.Name, to.Path, req.Subject, body, ccList)
if err != nil {
// 建邮件失败时必须把幂等键还回去,否则这条上游消息永远转不出来了
if relay != "" {