diff --git a/plugins/dsh-mail-bridge/src/index.ts b/plugins/dsh-mail-bridge/src/index.ts index ed58966..4bed0d7 100644 --- a/plugins/dsh-mail-bridge/src/index.ts +++ b/plugins/dsh-mail-bridge/src/index.ts @@ -644,6 +644,32 @@ export function apply(ctx: any, config: PluginConfig): void { // route 为 undefined 表示不指定模型,交给平台自己选 const agentOptions = route ? { provider: route.provider, model: route.model } : {}; + // 注册 standard preset 的工具(bash、fs、fs-search 等)。 + // dsh-a2a 用同一套 API(ctx.get('agentPresets') + presets.mount)并稳定运行。 + // + // create 与 resume 都必须挂:resume 从磁盘恢复的是**会话历史**, + // 不是工具注册 —— 工具是 setup 回调里 mount 的,resume 不传 setup + // 就等于回到 setup:undefined 时代(邮件会话没有任何文件工具)。 + const setupPreset = async (agentCtx: any) => { + console.error(`[dsh-mail-bridge] setup 回调触发,agentCtx keys=${JSON.stringify(Object.keys(agentCtx || {}))}`); + try { + const presets = ctx.get('agentPresets'); + console.error(`[dsh-mail-bridge] agentPresets: ${presets ? '存在' : '不存在'}`); + if (presets) { + const preset = await presets.resolve('standard'); + console.error(`[dsh-mail-bridge] standard preset: id=${preset?.id} keys=${JSON.stringify(Object.keys(preset || {}))}`); + if (preset?.id) { + await presets.mount(agentCtx, preset.id); + console.error(`[dsh-mail-bridge] presets.mount 成功`); + } else { + console.error(`[dsh-mail-bridge] standard preset 无 id,跳过 mount`); + } + } + } catch (e: any) { + console.error(`[dsh-mail-bridge] presets.mount 失败(工具注册降级): ${e?.message || e}\n${e?.stack?.slice(0,300)}`); + } + }; + const onDisk = await persistedCwd(sessionId); if (onDisk !== undefined) { // 用 console.error 而不是 ctx.logger.info:后者不进 journalctl(实测), @@ -652,7 +678,7 @@ export function apply(ctx: any, config: PluginConfig): void { const handle = await ctx.agents.resume({ resumeSessionId: sessionId as any, agentOptions, - setup: undefined, // resume 从磁盘恢复,工具已在 + setup: setupPreset, }); return { handle, resumed: true }; } @@ -661,22 +687,7 @@ export function apply(ctx: any, config: PluginConfig): void { sessionId, meta: { cwd }, agentOptions, - // 注册标准 preset 的工具(bash、fs、fs-search 等)。 - // dsh-a2a 用同一套 API(ctx.get('agentPresets') + presets.mount)并稳定运行。 - // 之前的崩溃来自尝试在 resume 路径上调用,create 路径经 a2a 实测可靠。 - setup: async (agentCtx: any) => { - try { - const presets = ctx.get('agentPresets'); - if (presets) { - const preset = await presets.resolve('standard'); - if (preset?.id) { - await presets.mount(agentCtx, preset.id); - } - } - } catch (e: any) { - console.error(`[dsh-mail-bridge] presets.mount 失败(工具注册降级): ${e?.message || e}`); - } - }, + setup: setupPreset, }); return { handle, resumed: false }; }