refactor(agent): improve completeness of tool result cloning and hook processing
Extend cloneToolResult to properly copy ArtifactTags and Messages fields, ensuring deep copies of all ToolResult data. Consolidate event emission and user message handling to match the normal tool execution flow.
This commit is contained in:
parent
e4b7bc60f2
commit
160b29a839
2 changed files with 26 additions and 15 deletions
|
|
@ -800,6 +800,13 @@ func cloneToolResult(result *tools.ToolResult) *tools.ToolResult {
|
||||||
if len(result.Media) > 0 {
|
if len(result.Media) > 0 {
|
||||||
cloned.Media = append([]string(nil), result.Media...)
|
cloned.Media = append([]string(nil), result.Media...)
|
||||||
}
|
}
|
||||||
|
if len(result.ArtifactTags) > 0 {
|
||||||
|
cloned.ArtifactTags = append([]string(nil), result.ArtifactTags...)
|
||||||
|
}
|
||||||
|
if len(result.Messages) > 0 {
|
||||||
|
cloned.Messages = make([]providers.Message, len(result.Messages))
|
||||||
|
copy(cloned.Messages, result.Messages)
|
||||||
|
}
|
||||||
return &cloned
|
return &cloned
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -2389,22 +2389,12 @@ turnLoop:
|
||||||
|
|
||||||
toolDuration := time.Duration(0) // Hook execution time unknown
|
toolDuration := time.Duration(0) // Hook execution time unknown
|
||||||
|
|
||||||
// Emit ToolExecEnd event
|
|
||||||
al.emitEvent(
|
|
||||||
EventKindToolExecEnd,
|
|
||||||
ts.eventMeta("runTurn", "turn.tool.end"),
|
|
||||||
ToolExecEndPayload{
|
|
||||||
Tool: toolName,
|
|
||||||
Duration: toolDuration,
|
|
||||||
ForLLMLen: len(hookResult.ContentForLLM()),
|
|
||||||
ForUserLen: len(hookResult.ForUser),
|
|
||||||
IsError: hookResult.IsError,
|
|
||||||
Async: hookResult.Async,
|
|
||||||
},
|
|
||||||
)
|
|
||||||
|
|
||||||
// Send ForUser content to user
|
// Send ForUser content to user
|
||||||
if !hookResult.Silent && hookResult.ForUser != "" && ts.opts.SendResponse {
|
// For ResponseHandled results, send regardless of SendResponse setting,
|
||||||
|
// same as normal tool execution path.
|
||||||
|
shouldSendForUser := !hookResult.Silent && hookResult.ForUser != "" &&
|
||||||
|
(ts.opts.SendResponse || hookResult.ResponseHandled)
|
||||||
|
if shouldSendForUser {
|
||||||
al.bus.PublishOutbound(ctx, bus.OutboundMessage{
|
al.bus.PublishOutbound(ctx, bus.OutboundMessage{
|
||||||
Channel: ts.channel,
|
Channel: ts.channel,
|
||||||
ChatID: ts.chatID,
|
ChatID: ts.chatID,
|
||||||
|
|
@ -2476,6 +2466,20 @@ turnLoop:
|
||||||
toolResultMsg.Media = append(toolResultMsg.Media, hookResult.Media...)
|
toolResultMsg.Media = append(toolResultMsg.Media, hookResult.Media...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Emit ToolExecEnd event (after filtering, same as normal tool execution)
|
||||||
|
al.emitEvent(
|
||||||
|
EventKindToolExecEnd,
|
||||||
|
ts.eventMeta("runTurn", "turn.tool.end"),
|
||||||
|
ToolExecEndPayload{
|
||||||
|
Tool: toolName,
|
||||||
|
Duration: toolDuration,
|
||||||
|
ForLLMLen: len(contentForLLM),
|
||||||
|
ForUserLen: len(hookResult.ForUser),
|
||||||
|
IsError: hookResult.IsError,
|
||||||
|
Async: hookResult.Async,
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
messages = append(messages, toolResultMsg)
|
messages = append(messages, toolResultMsg)
|
||||||
if !ts.opts.NoHistory {
|
if !ts.opts.NoHistory {
|
||||||
ts.agent.Sessions.AddFullMessage(ts.sessionKey, toolResultMsg)
|
ts.agent.Sessions.AddFullMessage(ts.sessionKey, toolResultMsg)
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue