{"version":3,"file":"events.cjs","sources":["../../src/events.ts"],"sourcesContent":["/* eslint-disable no-console */\n// src/events.ts\nimport type {\n  BaseMessageFields,\n  UsageMetadata,\n} from '@langchain/core/messages';\nimport type { MultiAgentGraph, StandardGraph } from '@/graphs';\nimport type { Logger } from 'winston';\nimport type * as t from '@/types';\nimport { handleToolCalls } from '@/tools/handlers';\nimport { Constants, Providers } from '@/common';\n\nexport class HandlerRegistry {\n  private handlers: Map<string, t.EventHandler> = new Map();\n\n  register(eventType: string, handler: t.EventHandler): void {\n    this.handlers.set(eventType, handler);\n  }\n\n  getHandler(eventType: string): t.EventHandler | undefined {\n    return this.handlers.get(eventType);\n  }\n}\n\nexport class ModelEndHandler implements t.EventHandler {\n  collectedUsage?: UsageMetadata[];\n  constructor(collectedUsage?: UsageMetadata[]) {\n    if (collectedUsage && !Array.isArray(collectedUsage)) {\n      throw new Error('collectedUsage must be an array');\n    }\n    this.collectedUsage = collectedUsage;\n  }\n\n  async handle(\n    event: string,\n    data: t.ModelEndData,\n    metadata?: Record<string, unknown>,\n    graph?: StandardGraph | MultiAgentGraph\n  ): Promise<void> {\n    if (!graph || !metadata) {\n      console.warn(`Graph or metadata not found in ${event} event`);\n      return;\n    }\n\n    const usage = data?.output?.usage_metadata;\n    if (usage != null && this.collectedUsage != null) {\n      this.collectedUsage.push(usage);\n    }\n\n    if (metadata.ls_provider === 'FakeListChatModel') {\n      return handleToolCalls(data?.output?.tool_calls, metadata, graph);\n    }\n\n    const agentContext = graph.getAgentContext(metadata);\n\n    if (\n      agentContext.provider !== Providers.GOOGLE &&\n      agentContext.provider !== Providers.BEDROCK\n    ) {\n      return;\n    }\n\n    await handleToolCalls(data?.output?.tool_calls, metadata, graph);\n  }\n}\n\nexport class ToolEndHandler implements t.EventHandler {\n  private callback?: t.ToolEndCallback;\n  private logger?: Logger;\n  constructor(callback?: t.ToolEndCallback, logger?: Logger) {\n    this.callback = callback;\n    this.logger = logger;\n  }\n\n  /**\n   * Handles on_tool_end events from the for-await stream consumer.\n   *\n   * This handler is now purely a consumer callback — tool completion\n   * (ON_RUN_STEP_COMPLETED dispatch + session context storage) is handled\n   * in graph context by ToolNode directly, eliminating the race between\n   * the stream consumer and graph execution.\n   */\n  async handle(\n    event: string,\n    data: t.StreamEventData | undefined,\n    metadata?: Record<string, unknown>,\n    graph?: StandardGraph | MultiAgentGraph\n  ): Promise<void> {\n    try {\n      if (!graph || !metadata) {\n        if (this.logger) {\n          this.logger.warn(`Graph or metadata not found in ${event} event`);\n        } else {\n          console.warn(`Graph or metadata not found in ${event} event`);\n        }\n        return;\n      }\n\n      const toolEndData = data as t.ToolEndData | undefined;\n      if (!toolEndData?.output) {\n        if (this.logger) {\n          this.logger.warn('No output found in tool_end event');\n        } else {\n          console.warn('No output found in tool_end event');\n        }\n        return;\n      }\n\n      if (metadata[Constants.PROGRAMMATIC_TOOL_CALLING] === true) {\n        return;\n      }\n\n      if (this.callback) {\n        await this.callback(toolEndData, metadata);\n      }\n    } catch (error) {\n      if (this.logger) {\n        this.logger.error('Error handling tool_end event:', error);\n      } else {\n        console.error('Error handling tool_end event:', error);\n      }\n    }\n  }\n}\n\nexport class TestLLMStreamHandler implements t.EventHandler {\n  handle(event: string, data: t.StreamEventData | undefined): void {\n    const chunk = data?.chunk;\n    const isMessageChunk = !!(chunk && 'message' in chunk);\n    const msg = isMessageChunk ? chunk.message : undefined;\n    if (msg && msg.tool_call_chunks && msg.tool_call_chunks.length > 0) {\n      console.log(msg.tool_call_chunks);\n    } else if (msg && msg.content) {\n      if (typeof msg.content === 'string') {\n        process.stdout.write(msg.content);\n      }\n    }\n  }\n}\n\nexport class TestChatStreamHandler implements t.EventHandler {\n  handle(event: string, data: t.StreamEventData | undefined): void {\n    const chunk = data?.chunk;\n    const isContentChunk = !!(chunk && 'content' in chunk);\n    const content = isContentChunk && chunk.content;\n\n    if (!content || !isContentChunk) {\n      return;\n    }\n\n    if (chunk.tool_call_chunks && chunk.tool_call_chunks.length > 0) {\n      console.dir(chunk.tool_call_chunks, { depth: null });\n    }\n\n    if (typeof content === 'string') {\n      process.stdout.write(content);\n    } else {\n      console.dir(content, { depth: null });\n    }\n  }\n}\n\nexport class LLMStreamHandler implements t.EventHandler {\n  handle(\n    event: string,\n    data: t.StreamEventData | undefined,\n    metadata?: Record<string, unknown>\n  ): void {\n    const chunk = data?.chunk;\n    const isMessageChunk = !!(chunk && 'message' in chunk);\n    const msg = isMessageChunk && chunk.message;\n    if (metadata) {\n      console.log(metadata);\n    }\n    if (msg && msg.tool_call_chunks && msg.tool_call_chunks.length > 0) {\n      console.log(msg.tool_call_chunks);\n    } else if (msg && msg.content) {\n      if (typeof msg.content === 'string') {\n        // const text_delta = msg.content;\n        // dispatchCustomEvent(GraphEvents.CHAT_MODEL_STREAM, { chunk }, config);\n        process.stdout.write(msg.content);\n      }\n    }\n  }\n}\n\nexport const createMetadataAggregator = (\n  _collected?: Record<\n    string,\n    NonNullable<BaseMessageFields['response_metadata']>\n  >[]\n): t.MetadataAggregatorResult => {\n  const collected = _collected || [];\n\n  const handleLLMEnd: t.HandleLLMEnd = (output) => {\n    const { generations } = output;\n    const lastMessageOutput = (\n      generations[generations.length - 1] as\n        | (t.StreamGeneration | undefined)[]\n        | undefined\n    )?.[0];\n    if (!lastMessageOutput) {\n      return;\n    }\n    const { message } = lastMessageOutput;\n    if (message?.response_metadata) {\n      collected.push(message.response_metadata);\n    }\n  };\n\n  return { handleLLMEnd, collected };\n};\n"],"names":["handleToolCalls","Providers","Constants"],"mappings":"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"}