Files
MailUI4Agents/plugins/dsh-mail-bridge
JianFeeeee caffe2f9fe fix(dsh): agents.get() 返回 agent 本体,当 handle 用缺一层 .agent
## 症状(上一版修复后暴露的新错)

    会话 mail-515c0c70… 已在运行,直接 followup(不重复 resume)
    new_mail 处理失败: Cannot read properties of undefined (reading 'followup')

去重生效了(不再撞 flock),但下一步炸。

## 根因:两个来源返回的不是同一种东西

    ctx.agents.get(id)   → **agent 本体**(.followup / .session 直接在上面)
    startAgent()         → handle,agent 在 **handle.agent**

证据在同文件 findLiveDshSession(约 1059 行)——它自己也要包一层:

    const live = ctx.agents.get(bound.dshSessionId);
    if (live) return { id: bound.dshSessionId, agent: live };

而去重那段把 `get()` 的返回值**直接赋给 handle** ⇒ `handle.agent` 是 undefined
⇒ 一取 followup 就炸。

⇒ 两条路径拿的是同一个对象,只是用法不同:一个包了一层、一个没包。

## 修法

`handle = { agent: alreadyLive }`。

## 判据(+2 格)

钉「从 `agents.get()` 取到的东西,必须包成 `{ agent: … }` 才能当 handle 用」。

★ 写这格时又被自己的两个假设绊住:
  1. 先写的是「看 `handle = …` 那一行有没有 `agents.get`」——
     实际代码是**两步**(先绑变量 `alreadyLive`,再 `handle = { agent: alreadyLive }`),
     赋值式里根本没有 `get(` 字样 ⇒ 判据报「应至少有一处…」而自己红了。
     改成**追变量来源**。
  2. 追来源时正则先匹配到接管路径的 `live`(它的用法本来就对),
     于是抓不到新加的那处 ⇒ 收紧成只匹配**双可选链** `?.get?.(` 那一处。

dsh 444 格全绿 · tsc 零错 · 部署成功(current → 20261004-094533)· 心跳正常。
变异:去掉 `{ agent }` 包装 → 红 2 格。
2026-10-04 12:03:58 +08:00
..