From 2d86ee5b6e8da19f759271a1057cebfada28a447 Mon Sep 17 00:00:00 2001 From: Max Date: Mon, 16 Feb 2026 19:00:33 +0800 Subject: [PATCH] Implement metadata merging in context for sub-agent hooks - Add a new `MergeMetadata` function in the `Context` struct to allow merging of caller-provided metadata into the context, enabling sub-agent hooks to access this information. - Update the `Stream` method in the `Assistant` to utilize the new metadata merging functionality, enhancing the context management for sub-agents. --- agent/assistant/agent.go | 3 +++ agent/context/context.go | 16 ++++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/agent/assistant/agent.go b/agent/assistant/agent.go index 9c448c0b..5d9f070d 100644 --- a/agent/assistant/agent.go +++ b/agent/assistant/agent.go @@ -55,6 +55,9 @@ func (ast *Assistant) Stream(ctx *context.Context, inputMessages []context.Messa opts = &context.Options{} } + // Merge caller-provided metadata into ctx so sub-agent hooks can read it via ctx.metadata + ctx.MergeMetadata(opts.Metadata) + // Initialize stack and auto-handle completion/failure/restore _, _, done := context.EnterStack(ctx, ast.ID, opts) defer done() diff --git a/agent/context/context.go b/agent/context/context.go index 75f27c0b..b419cf49 100644 --- a/agent/context/context.go +++ b/agent/context/context.go @@ -541,3 +541,19 @@ func (ctx *Context) IsA2ACall() bool { func (ctx *Context) IsForkedA2ACall() bool { return ctx.Referer == RefererAgentFork } + +// MergeMetadata merges the given metadata into ctx.Metadata. +// Existing keys are overwritten by incoming values. +// This enables A2A callers to pass custom metadata (e.g. oneshot, async) +// to sub-agent hooks via ctx.metadata in JavaScript. +func (ctx *Context) MergeMetadata(metadata map[string]interface{}) { + if len(metadata) == 0 { + return + } + if ctx.Metadata == nil { + ctx.Metadata = make(map[string]interface{}, len(metadata)) + } + for k, v := range metadata { + ctx.Metadata[k] = v + } +}