MCPcopy
hub / github.com/codeaashu/claude-code / finalizeAgentTool

Function finalizeAgentTool

src/tools/AgentTool/agentToolUtils.ts:276–357  ·  view source on GitHub ↗
(
  agentMessages: MessageType[],
  agentId: string,
  metadata: {
    prompt: string
    resolvedAgentModel: string
    isBuiltInAgent: boolean
    startTime: number
    agentType: string
    isAsync: boolean
  },
)

Source from the content-addressed store, hash-verified

274}
275
276export function finalizeAgentTool(
277 agentMessages: MessageType[],
278 agentId: string,
279 metadata: {
280 prompt: string
281 resolvedAgentModel: string
282 isBuiltInAgent: boolean
283 startTime: number
284 agentType: string
285 isAsync: boolean
286 },
287): AgentToolResult {
288 const {
289 prompt,
290 resolvedAgentModel,
291 isBuiltInAgent,
292 startTime,
293 agentType,
294 isAsync,
295 } = metadata
296
297 const lastAssistantMessage = getLastAssistantMessage(agentMessages)
298 if (lastAssistantMessage === undefined) {
299 throw new Error('No assistant messages found')
300 }
301 // Extract text content from the agent's response. If the final assistant
302 // message is a pure tool_use block (loop exited mid-turn), fall back to
303 // the most recent assistant message that has text content.
304 let content = lastAssistantMessage.message.content.filter(
305 _ => _.type === 'text',
306 )
307 if (content.length === 0) {
308 for (let i = agentMessages.length - 1; i >= 0; i--) {
309 const m = agentMessages[i]!
310 if (m.type !== 'assistant') continue
311 const textBlocks = m.message.content.filter(_ => _.type === 'text')
312 if (textBlocks.length > 0) {
313 content = textBlocks
314 break
315 }
316 }
317 }
318
319 const totalTokens = getTokenCountFromUsage(lastAssistantMessage.message.usage)
320 const totalToolUseCount = countToolUses(agentMessages)
321
322 logEvent('tengu_agent_tool_completed', {
323 agent_type:
324 agentType as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
325 model:
326 resolvedAgentModel as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
327 prompt_char_count: prompt.length,
328 response_char_count: content.length,
329 assistant_message_count: agentMessages.length,
330 total_tool_uses: totalToolUseCount,
331 duration_ms: Date.now() - startTime,
332 total_tokens: totalTokens,
333 is_built_in_agent: isBuiltInAgent,

Callers 2

runAsyncAgentLifecycleFunction · 0.85
callFunction · 0.85

Calls 4

getLastAssistantMessageFunction · 0.85
getTokenCountFromUsageFunction · 0.85
logEventFunction · 0.85
countToolUsesFunction · 0.70

Tested by

no test coverage detected