fix(forward): 引用里的「转发自」不再是 name@name,改用会话的 workspace/alias 拼
用户(指着转发出来的那封信):「这个 zcode@zcode 转发生成的地址绝对有问题,原本是 zcode@/home…」
成因是**两个错叠在一起**:
① 写入侧遗留:发信路径给 Agent 存 from_workspace 存的是 **agent 名**而不是路径
(实测近两天:zcode 10 封全是 'zcode'、homeagent 'homeagent'、opencode 'opencode';
pi 399 封有 4 种值、dsh 116 封有 3 种 —— 混着真实路径与自己的名字);
② 展示侧无脑拼 `name@from_workspace` ⇒ 两者一乘就是 `zcode@zcode`,
而**那永远不是一个地址**(地址是 name@path.session)。
被转发那封的会话工作区其实是 `/home`、别名 `zcode-打个招呼`,所以正确形式是
`zcode@/home.zcode-打个招呼`(用户说的"原本是 zcode@/home…"就是这个)。
改法:
- quoteBody 增加两个入参(会话 workspace/alias),转发处理器用
repo.SessionWorkspaceOf / SessionAliasOf 取(都是既有函数,空串语义是"不知道");
- 新增 senderAddress:优先用会话的 workspace+alias 拼 `name@path.session`
(空 path 时给平台形式 `name@.alias`);**path 与 name 相同时当"不知道"丢掉** ——
宁可只渲染 `zcode`,也不渲染一个看着像地址其实不是的东西。
判据:新增 TestQuoteBodySenderAddressNeverNameAtName(三条形态:正常地址 / 退化不许 name@name /
空 path 的 .alias 形式);旧的 TestQuoteBodyPrefixesEveryLine 改走退化路径以保持它原本的意图。
变异:去掉"拒绝 name@name"那段 → 红;复原 → 包内全绿。
▲ 仍未部署(与上一笔时间修复一起卡在同一个地方):/opt/agentmail 现在对我不可写
(touch 都被拒),且有 08:57 留下的 /opt/agentmail/.deploy.lock。
需要能写那儿的人:rm -f /opt/agentmail/.deploy.lock && bash deploy/redeploy-gateway.sh
This commit is contained in:
@ -36,13 +36,10 @@ type forwardRequest struct {
|
||||
// quoteBody 把原文渲染为 Markdown 引用块。
|
||||
// 逐行加 "> " 而不是整段包裹:原文本身可能含代码块与列表,
|
||||
// 只有逐行前缀才能在任何 Markdown 渲染器里保持引用语义。
|
||||
func quoteBody(m *models.Mail) string {
|
||||
func quoteBody(m *models.Mail, sessionWorkspace, sessionAlias string) string {
|
||||
var b strings.Builder
|
||||
b.WriteString("---\n\n")
|
||||
b.WriteString(fmt.Sprintf("> **转发自** %s", m.FromName))
|
||||
if m.FromWorkspace != "" {
|
||||
b.WriteString("@" + m.FromWorkspace)
|
||||
}
|
||||
b.WriteString(fmt.Sprintf("> **转发自** %s", senderAddress(m, sessionWorkspace, sessionAlias)))
|
||||
b.WriteString("\n")
|
||||
b.WriteString(fmt.Sprintf("> **主题** %s\n", m.Subject))
|
||||
// ★ 2026-09-15 用户报:转发引用里显示「2026-09-15 01:23:19」,而实际是 09:23:19 ——
|
||||
@ -63,6 +60,39 @@ func quoteBody(m *models.Mail) string {
|
||||
return b.String()
|
||||
}
|
||||
|
||||
|
||||
// senderAddress 拼出转发引用里那个「转发自」地址。
|
||||
//
|
||||
// ★ 2026-09-15 用户报:「这个 zcode@zcode 转发生成的地址绝对有问题,原本是 zcode@/home…」
|
||||
//
|
||||
// 两个原因叠在一起:
|
||||
// ① **发信路径给 Agent 存 from_workspace 存的是 agent 名**,不是路径
|
||||
// (实测:zcode 近两天 10 封全是 'zcode',homeagent 'homeagent',opencode 'opencode';
|
||||
// pi/dsh 是混的:既有真实路径也有自己的名字)—— 这是历史遗留的写入侧问题;
|
||||
// ② 引用块又无脑拼 `name@from_workspace` ⇒ 两者一乘就是 `zcode@zcode`,
|
||||
// 而**那永远不是一个地址**(地址是 name@path.session)。
|
||||
//
|
||||
// 这里改成用**会话**的真实 workspace/alias 拼(`SessionWorkspaceOf`/`SessionAliasOf`,
|
||||
// 读不到就退化成信上记的值),并且**一旦发现 path 等于 name 就当作"不知道"丢掉** ——
|
||||
// 宁可渲染 `zcode`,也不渲染一个看着像地址其实不是的东西。
|
||||
func senderAddress(m *models.Mail, sessionWorkspace, sessionAlias string) string {
|
||||
path := sessionWorkspace
|
||||
if path == "" {
|
||||
path = m.FromWorkspace
|
||||
}
|
||||
if path == m.FromName {
|
||||
path = "" // agent 名被当成路径存下来的遗留数据:那不是地址
|
||||
}
|
||||
addr := m.FromName
|
||||
if path != "" || sessionAlias != "" {
|
||||
addr += "@" + path
|
||||
if sessionAlias != "" {
|
||||
addr += "." + sessionAlias
|
||||
}
|
||||
}
|
||||
return addr
|
||||
}
|
||||
|
||||
// forwardSubject 生成转发主题,避免 "Fwd: Fwd: Fwd:" 无限叠加。
|
||||
func forwardSubject(custom, original string) string {
|
||||
if s := strings.TrimSpace(custom); s != "" {
|
||||
@ -167,7 +197,7 @@ func doForward(w http.ResponseWriter, r *http.Request, mailID uuid.UUID, actor,
|
||||
_ = repo.SetSessionOwner(r.Context(), sessionID, user.ID)
|
||||
}
|
||||
|
||||
body := quoteBody(src)
|
||||
body := quoteBody(src, repo.SessionWorkspaceOf(r.Context(), src.SessionID), repo.SessionAliasOf(r.Context(), src.SessionID))
|
||||
if c := strings.TrimSpace(req.Comment); c != "" {
|
||||
body = c + "\n\n" + body
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user