{"version":3,"file":"agent/event-stream.mjs","sources":["webpack://@multimodal/agent/./src/agent/event-stream.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\n/*\n * Copyright (c) 2025 Bytedance, Inc. and its affiliates.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { v4 as uuidv4 } from 'uuid';\nimport { AgentEventStream, AgentSingleLoopReponse } from '@multimodal/agent-interface';\nimport { getLogger } from '../utils/logger';\n\n/**\n * Default event stream options\n */\nconst DEFAULT_OPTIONS: AgentEventStream.ProcessorOptions = {\n  maxEvents: 1000,\n  autoTrim: true,\n};\n\n/**\n * Implementation of the EventStream processor\n */\nexport class AgentEventStreamProcessor implements AgentEventStream.Processor {\n  private events: AgentEventStream.Event[] = [];\n  private options: AgentEventStream.ProcessorOptions;\n  private subscribers: ((event: AgentEventStream.Event) => void)[] = [];\n  private logger = getLogger('EventStream');\n\n  constructor(options: AgentEventStream.ProcessorOptions = {}) {\n    this.options = { ...DEFAULT_OPTIONS, ...options };\n    this.logger.debug('EventStream initialized with options:', this.options);\n  }\n\n  /**\n   * Create a new event with default properties\n   */\n  createEvent<T extends AgentEventStream.EventType>(\n    type: T,\n    data: Omit<AgentEventStream.EventPayload<T>, keyof AgentEventStream.BaseEvent>,\n  ): AgentEventStream.EventPayload<T> {\n    return {\n      id: uuidv4(),\n      type,\n      timestamp: Date.now(),\n      ...data,\n    } as AgentEventStream.EventPayload<T>;\n  }\n\n  /**\n   * Send an event to the stream\n   */\n  sendEvent(event: AgentEventStream.Event): void {\n    this.events.push(event);\n    this.logger.debug(`Event added: ${event.type} (${event.id})`);\n\n    // Notify subscribers\n    this.subscribers.forEach((callback) => {\n      try {\n        callback(event);\n      } catch (error) {\n        this.logger.error('Error in event subscriber:', error);\n      }\n    });\n\n    // Auto-trim if needed\n    if (\n      this.options.autoTrim &&\n      this.options.maxEvents &&\n      this.events.length > this.options.maxEvents\n    ) {\n      const overflow = this.events.length - this.options.maxEvents;\n      this.events = this.events.slice(overflow);\n      this.logger.debug(`Auto-trimmed ${overflow} events`);\n    }\n  }\n\n  /**\n   * Get all events in the stream\n   */\n  getEvents(filter?: AgentEventStream.EventType[], limit?: number): AgentEventStream.Event[] {\n    let events = this.events;\n\n    // Apply type filter if provided\n    if (filter && filter.length > 0) {\n      events = events.filter((event) => filter.includes(event.type));\n    }\n\n    // Apply limit if provided\n    if (limit && limit > 0 && events.length > limit) {\n      events = events.slice(events.length - limit);\n    }\n\n    return [...events]; // Return a copy to prevent mutation\n  }\n\n  /**\n   * Get events by their type\n   */\n  getEventsByType(types: AgentEventStream.EventType[], limit?: number): AgentEventStream.Event[] {\n    return this.getEvents(types, limit);\n  }\n\n  /**\n   * Get the latest assistant response to be used for the next message\n   */\n  getLatestAssistantResponse(): AgentSingleLoopReponse | null {\n    // Get the most recent assistant message event\n    const assistantEvents = this.getEventsByType(['assistant_message']);\n    if (assistantEvents.length === 0) {\n      return null;\n    }\n\n    const latestAssistantEvent = assistantEvents[\n      assistantEvents.length - 1\n    ] as AgentEventStream.AssistantMessageEvent;\n    return {\n      content: latestAssistantEvent.content || '',\n      toolCalls: latestAssistantEvent.toolCalls,\n    };\n  }\n\n  /**\n   * Get tool results since the last assistant message\n   */\n  getLatestToolResults(): { toolCallId: string; toolName: string; content: any }[] {\n    // Find the index of the most recent assistant message\n    const assistantEvents = this.getEventsByType(['assistant_message']);\n    if (assistantEvents.length === 0) {\n      return [];\n    }\n\n    const latestAssistantEvent = assistantEvents[assistantEvents.length - 1];\n    const latestAssistantIndex = this.events.findIndex(\n      (event) => event.id === latestAssistantEvent.id,\n    );\n\n    // Get all tool result events that occurred after the latest assistant message\n    const toolResultEvents = this.events.filter(\n      (event, index) => index > latestAssistantIndex && event.type === 'tool_result',\n    ) as AgentEventStream.ToolResultEvent[];\n\n    return toolResultEvents.map((event) => ({\n      toolCallId: event.toolCallId,\n      toolName: event.name,\n      content: event.content,\n    }));\n  }\n\n  /**\n   * Clear all events from the stream\n   */\n  clear(): void {\n    this.events = [];\n    this.logger.debug('Event stream cleared');\n  }\n\n  /**\n   * Subscribe to new events\n   */\n  subscribe(callback: (event: AgentEventStream.Event) => void): () => void {\n    this.subscribers.push(callback);\n    this.logger.debug(`Subscribed to events (total subscribers: ${this.subscribers.length})`);\n\n    // Return unsubscribe function\n    return () => {\n      this.subscribers = this.subscribers.filter((cb) => cb !== callback);\n      this.logger.debug(\n        `Unsubscribed from events (remaining subscribers: ${this.subscribers.length})`,\n      );\n    };\n  }\n\n  /**\n   * Subscribe to specific event types\n   */\n  subscribeToTypes(\n    types: AgentEventStream.EventType[],\n    callback: (event: AgentEventStream.Event) => void,\n  ): () => void {\n    const wrappedCallback = (event: AgentEventStream.Event) => {\n      if (types.includes(event.type)) {\n        callback(event);\n      }\n    };\n\n    this.subscribers.push(wrappedCallback);\n    this.logger.debug(`Subscribed to event types: ${types.join(', ')}`);\n\n    // Return unsubscribe function\n    return () => {\n      this.subscribers = this.subscribers.filter((cb) => cb !== wrappedCallback);\n      this.logger.debug(`Unsubscribed from event types: ${types.join(', ')}`);\n    };\n  }\n\n  /**\n   * Subscribe to streaming events only\n   */\n  subscribeToStreamingEvents(\n    callback: (\n      event:\n        | AgentEventStream.AssistantStreamingMessageEvent\n        | AgentEventStream.AssistantStreamingThinkingMessageEvent,\n    ) => void,\n  ): () => void {\n    const streamingTypes: AgentEventStream.EventType[] = [\n      'assistant_streaming_message',\n      'assistant_streaming_thinking_message',\n    ];\n\n    const wrappedCallback = (event: AgentEventStream.Event) => {\n      if (streamingTypes.includes(event.type)) {\n        callback(\n          event as\n            | AgentEventStream.AssistantStreamingMessageEvent\n            | AgentEventStream.AssistantStreamingThinkingMessageEvent,\n        );\n      }\n    };\n\n    this.subscribers.push(wrappedCallback);\n    this.logger.debug('Subscribed to streaming events');\n\n    // Return unsubscribe function\n    return () => {\n      this.subscribers = this.subscribers.filter((cb) => cb !== wrappedCallback);\n      this.logger.debug('Unsubscribed from streaming events');\n    };\n  }\n}\n"],"names":["DEFAULT_OPTIONS","AgentEventStreamProcessor","type","data","uuidv4","Date","event","callback","error","overflow","filter","limit","events","types","assistantEvents","latestAssistantEvent","latestAssistantIndex","toolResultEvents","index","cb","wrappedCallback","streamingTypes","options","getLogger"],"mappings":"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"}