diff --git a/plugins/dsh-mail-bridge/src/index.ts b/plugins/dsh-mail-bridge/src/index.ts index be240c3..9135dd3 100644 --- a/plugins/dsh-mail-bridge/src/index.ts +++ b/plugins/dsh-mail-bridge/src/index.ts @@ -667,6 +667,23 @@ export function apply(ctx: any, config: PluginConfig): void { const live = ctx.agents.get(existing.dshSessionId); if (live) { return locked(existing.dshSessionId, async () => { + // 回信上下文必须刷成**这一封**。 + // + // 续谈分支原来不刷:mailContexts 只在 bindAdopted 与新开会话时写一次, + // 于是同一条会话的第二封邮件跑完后,自动转发用的还是**第一封**的 + // subject / mailID —— 回信主题与 parent_mail_id 都指向上一封。 + // 实测撞出过:回「全流程回归」那封的信,主题写的是上一封 + // 「platformID 归属验证」,parent 也挂在那封上。 + // + // 与 pi 桥的语义对齐:那边每封邮件都重建 mailContext(worker 一封一进程), + // 注释写的就是「一个会话里可能来过多封信,只留最近那封」。 + if (kind === 'mail' && mailSessionID) { + mailContexts.set(mailSessionID, { + replyTo: data.from_name || '', + subject: data.subject || '', + mailID: data.mail_id || '', + }); + } const promptText = kind === 'permission' ? `你之前发起的权限请求已有结论:${data.decision}(决策人:${data.decided_by || '用户'})。请据此继续后续工作。` : [ diff --git a/plugins/pi-mail-bridge/src/index.mjs b/plugins/pi-mail-bridge/src/index.mjs index 1d61f9b..9a962fa 100644 --- a/plugins/pi-mail-bridge/src/index.mjs +++ b/plugins/pi-mail-bridge/src/index.mjs @@ -39,7 +39,6 @@ import { join } from 'node:path'; import { ModelRuntime } from '@earendil-works/pi-coding-agent'; import { GatewayClient, readLocalKey, generateLocalKey, saveConfig } from './gateway.mjs'; -import { createMailTools } from './tools.mjs'; import { createWorkerPool } from './pool.mjs'; import { describeError } from './turn.mjs'; import { snapshotPiModels } from '../lib/model-scope.js'; @@ -282,19 +281,12 @@ async function main() { workerMaxMs: WORKER_MAX_MS, }); - // 主进程仍要一套邮件工具:它自己不跑模型,但 connect_to_server 的 - // onReconnect 语义要在这里闭环(worker 侧那套只负责回报给主进程)。 + // 主进程不跑模型,因此**不建**邮件工具:工具是给模型调的,而这里没有会话。 + // (工具 schema 的约束由 test/tool-schema.test.mjs 直接验证 createMailTools, + // 不需要在这里建一份没人用的副本。) // - // 这些工具不会被任何模型调用 —— 主进程没有会话。留着是因为 - // createMailTools 同时承担「校验工具 schema」的职责(test/tool-schema.test.mjs), - // 而工具总数是契约里核对过的数字。 - createMailTools({ - client, log, agentName: AGENT_NAME, - onReconnect: () => { - client.stopSSE(); - client.startSSE(handleSSEEvent, log); - }, - }); + // connect_to_server 换坐标的闭环在 pool 的 onReconfigure 里 —— 那个工具 + // 跑在 worker 里,worker 把新坐标回报给主进程,主进程据此重建 SSE。 try { await client.register(); // B-1.2