From 0fd918ea80d2fbd9bb59d4c774decd41e8eb1890 Mon Sep 17 00:00:00 2001 From: YeonGyu-Kim Date: Mon, 11 May 2026 13:08:50 +0900 Subject: [PATCH] fix(delegate-task): preserve native task metadata --- src/plugin/tool-execute-after.test.ts | 30 +++++++++++++++++++++++++++ src/plugin/tool-execute-after.ts | 3 ++- 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/src/plugin/tool-execute-after.test.ts b/src/plugin/tool-execute-after.test.ts index 7c8e9d87c..f6b55eea2 100644 --- a/src/plugin/tool-execute-after.test.ts +++ b/src/plugin/tool-execute-after.test.ts @@ -92,4 +92,34 @@ describe("createToolExecuteAfterHandler", () => { expect(output.title).toBe("stored title") expect(output.metadata).toEqual({ sessionId: "ses_native", agent: "hephaestus" }) }) + + it("#given native session linkage without model #when stored metadata exists #then required task metadata is preserved", async () => { + // given + const model = { providerID: "openai", modelID: "gpt-5.5" } + storeToolMetadata("ses_parent", "call_model", { + title: "stored title", + metadata: { sessionId: "ses_stored", agent: "oracle", model }, + }) + + const handler = createToolExecuteAfterHandler({ + ctx: {} as never, + hooks: {} as never, + }) + + const output = { + title: "result", + output: "original output", + metadata: { sessionId: "ses_native", agent: "hephaestus" }, + } + + // when + await handler( + { tool: "task", sessionID: "ses_parent", callID: "call_model" }, + output + ) + + // then + expect(output.title).toBe("stored title") + expect(output.metadata).toEqual({ sessionId: "ses_native", agent: "hephaestus", model }) + }) }) diff --git a/src/plugin/tool-execute-after.ts b/src/plugin/tool-execute-after.ts index 1fc78f5f7..7cfeb65b4 100644 --- a/src/plugin/tool-execute-after.ts +++ b/src/plugin/tool-execute-after.ts @@ -59,12 +59,13 @@ export function createToolExecuteAfterHandler(args: { } if (stored.metadata) { if (nativeSessionId) { - log("[tool-execute-after] Native output metadata already includes session linkage; skipping stored metadata overwrite", { + log("[tool-execute-after] Native output metadata already includes session linkage; preserving native metadata precedence", { tool: input.tool, sessionID: input.sessionID, callID: input.callID ?? input.callId ?? input.call_id, nativeSessionId, }) + output.metadata = { ...stored.metadata, ...output.metadata } } else { output.metadata = { ...output.metadata, ...stored.metadata } }