@aintela/chat 0.2.26 → 0.2.27

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +0,0 @@
1
- {"version":3,"file":"httpArtifactService-DFlQzSgN.js","sources":["../src/services/storageService.ts","../src/services/eventBusService.ts","../src/services/interactionService.ts","../src/services/servers/AgentGatewayService.ts","../src/services/WebSocketConnection/WebSocketConnectionV2.ts","../src/services/servers/AgentGatewayWSAsync.ts","../src/services/httpArtifactService.ts"],"sourcesContent":["import type { ArtifactData, Section } from '../models/ArtifactData';\nimport { ArtifactType } from '../models/enums';\nimport type { Prompt } from '../models/Prompt';\n\nconst STORAGE_KEYS = {\n ARTIFACTS: 'envision-artifacts',\n SECTIONS: 'envision-sections',\n PROMPTS: 'envision-prompts'\n} as const;\n\n// Default sections that should always exist\nconst DEFAULT_SECTIONS: Section[] = [\n {\n id: 'dashboards',\n name: 'Dashboards',\n isDefault: true,\n created: new Date().toISOString(),\n iconType: 'dashboard'\n },\n {\n id: 'charts',\n name: 'Chart',\n isDefault: true,\n created: new Date().toISOString(),\n iconType: 'chart'\n },\n {\n id: 'data-analytics',\n name: 'Data Analytics',\n isDefault: true,\n created: new Date().toISOString(),\n iconType: 'folder'\n }\n];\n\n// Interface for storage operations\nexport interface IStorageService {\n initializeStorage(): void;\n getSections(): Section[];\n getArtifacts(): ArtifactData[];\n createSection(name: string, iconType?: 'dashboard' | 'chart' | 'folder'): Section;\n updateSection(sectionId: string, updates: Partial<Section>): void;\n deleteSection(sectionId: string): void;\n storeArtifact(artifact: ArtifactData): void;\n moveArtifact(artifactId: string, newSectionId: string): void;\n deleteArtifact(artifactId: string): void;\n updateArtifact(artifactId: string, updates: Partial<ArtifactData>): void;\n getArtifactsBySection(sectionId: string): ArtifactData[];\n getPrompts(): Prompt[];\n storePrompt(prompt: Prompt): void;\n deletePrompt(promptId: string): void;\n clearAllPrompts(): void;\n getItem(key: string): any;\n setItem(key: string, value: any): void;\n removeItem(key: string): void;\n}\n\n// Concrete implementation using localStorage\nexport class LocalStorageService implements IStorageService {\n getItem(key: string) {\n return localStorage.getItem(key);\n }\n setItem(key: string, value: any): void {\n localStorage.setItem(key, value);\n }\n removeItem(key: string): void {\n localStorage.removeItem(key);\n }\n onPromptCreated: (prompt: Prompt) => void = () => { };\n\n initializeStorage(): void {\n try {\n const existingSections = localStorage.getItem(STORAGE_KEYS.SECTIONS);\n if (!existingSections) {\n localStorage.setItem(STORAGE_KEYS.SECTIONS, JSON.stringify(DEFAULT_SECTIONS));\n } else {\n // Ensure default sections exist\n const sections = JSON.parse(existingSections) as Section[];\n const needsUpdate = DEFAULT_SECTIONS.some(defaultSection =>\n !sections.find(s => s.id === defaultSection.id)\n );\n\n if (needsUpdate) {\n const updatedSections = [...sections];\n DEFAULT_SECTIONS.forEach(defaultSection => {\n if (!sections.find(s => s.id === defaultSection.id)) {\n updatedSections.push(defaultSection);\n }\n });\n localStorage.setItem(STORAGE_KEYS.SECTIONS, JSON.stringify(updatedSections));\n }\n }\n\n // Migrate existing artifacts to have sectionId\n const existingArtifacts = localStorage.getItem(STORAGE_KEYS.ARTIFACTS);\n if (existingArtifacts) {\n const artifacts = JSON.parse(existingArtifacts) as ArtifactData[];\n let needsUpdate = false;\n\n const updatedArtifacts = artifacts.map(artifact => {\n if (!artifact.sectionId) {\n needsUpdate = true;\n let defaultSection = 'data-analytics'; // Default to Data Analytics\n if (artifact.type === ArtifactType.Dashboard) {\n defaultSection = 'dashboards';\n } else if (artifact.type === ArtifactType.Chart) {\n defaultSection = 'charts';\n }\n return {\n ...artifact,\n sectionId: defaultSection\n };\n }\n return artifact;\n });\n\n if (needsUpdate) {\n localStorage.setItem(STORAGE_KEYS.ARTIFACTS, JSON.stringify(updatedArtifacts));\n }\n }\n } catch (error) {\n console.error('Error initializing storage:', error);\n }\n }\n\n getSections(): Section[] {\n try {\n const stored = localStorage.getItem(STORAGE_KEYS.SECTIONS);\n if (stored) {\n return JSON.parse(stored) as Section[];\n }\n return DEFAULT_SECTIONS;\n } catch (error) {\n console.error('Error loading sections:', error);\n return DEFAULT_SECTIONS;\n }\n }\n\n getArtifacts(): ArtifactData[] {\n try {\n const stored = localStorage.getItem(STORAGE_KEYS.ARTIFACTS);\n if (stored) {\n return JSON.parse(stored) as ArtifactData[];\n }\n return [];\n } catch (error) {\n console.error('Error loading artifacts:', error);\n return [];\n }\n }\n\n createSection(name: string, iconType: 'dashboard' | 'chart' | 'folder' = 'folder'): Section {\n const newSection: Section = {\n id: crypto.randomUUID(),\n name,\n isDefault: false,\n created: new Date().toISOString(),\n iconType\n };\n\n const sections = this.getSections();\n sections.push(newSection);\n localStorage.setItem(STORAGE_KEYS.SECTIONS, JSON.stringify(sections));\n\n return newSection;\n }\n\n updateSection(sectionId: string, updates: Partial<Section>): void {\n const sections = this.getSections();\n const index = sections.findIndex(s => s.id === sectionId);\n\n if (index >= 0) {\n sections[index] = { ...sections[index], ...updates };\n localStorage.setItem(STORAGE_KEYS.SECTIONS, JSON.stringify(sections));\n }\n }\n\n deleteSection(sectionId: string): void {\n const sections = this.getSections();\n const section = sections.find(s => s.id === sectionId);\n\n if (section && !section.isDefault) {\n // Move artifacts from deleted section to default section\n const artifacts = this.getArtifacts();\n const defaultSection = section.iconType === 'dashboard' ? 'dashboards' :\n section.iconType === 'chart' ? 'charts' : 'data-analytics';\n\n const updatedArtifacts = artifacts.map(artifact => {\n if (artifact.sectionId === sectionId) {\n return { ...artifact, sectionId: defaultSection };\n }\n return artifact;\n });\n\n localStorage.setItem(STORAGE_KEYS.ARTIFACTS, JSON.stringify(updatedArtifacts));\n\n // Remove section\n const filteredSections = sections.filter(s => s.id !== sectionId);\n localStorage.setItem(STORAGE_KEYS.SECTIONS, JSON.stringify(filteredSections));\n }\n }\n\n storeArtifact(artifact: ArtifactData): void {\n try {\n const artifacts = this.getArtifacts();\n const existingIndex = artifacts.findIndex(a => a.id === artifact.id);\n\n if (existingIndex >= 0) {\n // Update existing artifact\n artifacts[existingIndex] = artifact;\n } else {\n // Add new artifact with default section if not specified\n let defaultSection = 'data-analytics'; // Default to Data Analytics\n if (artifact.type === ArtifactType.Dashboard) {\n defaultSection = 'dashboards';\n } else if (artifact.type === ArtifactType.Chart) {\n defaultSection = 'charts';\n }\n\n const artifactWithDefaults = {\n ...artifact,\n created: artifact.created || new Date().toISOString(),\n sectionId: artifact.sectionId || defaultSection\n };\n artifacts.push(artifactWithDefaults);\n }\n\n localStorage.setItem(STORAGE_KEYS.ARTIFACTS, JSON.stringify(artifacts));\n\n } catch (error) {\n console.error('Error storing artifact:', error);\n }\n }\n\n moveArtifact(artifactId: string, newSectionId: string): void {\n const artifacts = this.getArtifacts();\n const artifactIndex = artifacts.findIndex(a => a.id === artifactId);\n\n if (artifactIndex >= 0) {\n artifacts[artifactIndex] = { ...artifacts[artifactIndex], sectionId: newSectionId };\n localStorage.setItem(STORAGE_KEYS.ARTIFACTS, JSON.stringify(artifacts));\n }\n }\n\n deleteArtifact(artifactId: string): void {\n const artifacts = this.getArtifacts();\n const filteredArtifacts = artifacts.filter(a => a.id !== artifactId);\n localStorage.setItem(STORAGE_KEYS.ARTIFACTS, JSON.stringify(filteredArtifacts));\n }\n\n updateArtifact(artifactId: string, updates: Partial<ArtifactData>): void {\n const artifacts = this.getArtifacts();\n const index = artifacts.findIndex(a => a.id === artifactId);\n\n if (index >= 0) {\n artifacts[index] = { ...artifacts[index], ...updates };\n localStorage.setItem(STORAGE_KEYS.ARTIFACTS, JSON.stringify(artifacts));\n }\n }\n\n getArtifactsBySection(sectionId: string): ArtifactData[] {\n const artifacts = this.getArtifacts();\n return artifacts.filter(a => a.sectionId === sectionId);\n }\n\n // Prompt management methods\n getPrompts(): Prompt[] {\n try {\n const stored = localStorage.getItem(STORAGE_KEYS.PROMPTS);\n if (stored) {\n const prompts = JSON.parse(stored) as Prompt[];\n // Sort by created date, most recent first\n return prompts.sort((a, b) => new Date(b.created).getTime() - new Date(a.created).getTime());\n }\n return [];\n } catch (error) {\n console.error('Error loading prompts:', error);\n return [];\n }\n }\n\n storePrompt(prompt: Prompt): void {\n try {\n const prompts = this.getPrompts();\n\n if (prompts.length > 0) {\n if (prompts[0].promptText === prompt.promptText) {\n prompts[0].created = prompt.created;\n prompts[0].id = prompt.id;\n }\n }\n // Add new prompt at the beginning\n prompts.unshift(prompt);\n\n // Keep only the last 50 prompts to avoid storage bloat\n const limitedPrompts = prompts.slice(0, 50);\n\n localStorage.setItem(STORAGE_KEYS.PROMPTS, JSON.stringify(limitedPrompts));\n\n } catch (error) {\n console.error('Error storing prompt:', error);\n }\n }\n\n deletePrompt(promptId: string): void {\n try {\n const prompts = this.getPrompts();\n const filteredPrompts = prompts.filter(p => p.id !== promptId);\n localStorage.setItem(STORAGE_KEYS.PROMPTS, JSON.stringify(filteredPrompts));\n } catch (error) {\n console.error('Error deleting prompt:', error);\n }\n }\n\n clearAllPrompts(): void {\n try {\n localStorage.removeItem(STORAGE_KEYS.PROMPTS);\n } catch (error) {\n console.error('Error clearing prompts:', error);\n }\n }\n}\n\n// Mock implementation for testing\nexport class MockStorageService implements IStorageService {\n getItem(_key: string) {\n return \"mock\";\n }\n setItem(_key: string, _value: any): void {\n }\n removeItem(_key: string): void {\n }\n private artifacts: ArtifactData[] = [];\n private sections: Section[] = [...DEFAULT_SECTIONS];\n private prompts: Prompt[] = [];\n onPromptCreated: (prompt: Prompt) => void = () => { };\n\n // Mock data setters for testing\n setMockArtifacts(artifacts: ArtifactData[]): void {\n this.artifacts = [...artifacts];\n }\n\n setMockSections(sections: Section[]): void {\n this.sections = [...sections];\n }\n\n setMockPrompts(prompts: Prompt[]): void {\n this.prompts = [...prompts];\n }\n\n // Implementation methods\n initializeStorage(): void {\n // No-op for mock\n }\n\n getSections(): Section[] {\n return [...this.sections];\n }\n\n getArtifacts(): ArtifactData[] {\n return [...this.artifacts];\n }\n\n createSection(name: string, iconType?: 'dashboard' | 'chart' | 'folder'): Section {\n const newSection: Section = {\n id: crypto.randomUUID(),\n name,\n isDefault: false,\n created: new Date().toISOString(),\n iconType: iconType || 'folder'\n };\n this.sections.push(newSection);\n return newSection;\n }\n\n updateSection(sectionId: string, updates: Partial<Section>): void {\n const index = this.sections.findIndex(s => s.id === sectionId);\n if (index >= 0) {\n this.sections[index] = { ...this.sections[index], ...updates };\n }\n }\n\n deleteSection(sectionId: string): void {\n this.sections = this.sections.filter(s => s.id !== sectionId);\n }\n\n storeArtifact(artifact: ArtifactData): void {\n artifact.id += \"_mock\";\n this.artifacts.push(artifact);\n }\n\n moveArtifact(artifactId: string, newSectionId: string): void {\n const artifactIndex = this.artifacts.findIndex(a => a.id === artifactId);\n if (artifactIndex >= 0) {\n this.artifacts[artifactIndex] = { ...this.artifacts[artifactIndex], sectionId: newSectionId };\n }\n }\n\n deleteArtifact(artifactId: string): void {\n this.artifacts = this.artifacts.filter(a => a.id !== artifactId);\n }\n\n updateArtifact(artifactId: string, updates: Partial<ArtifactData>): void {\n const index = this.artifacts.findIndex(a => a.id === artifactId);\n if (index >= 0) {\n this.artifacts[index] = { ...this.artifacts[index], ...updates };\n }\n }\n\n getArtifactsBySection(sectionId: string): ArtifactData[] {\n return this.artifacts.filter(a => a.sectionId === sectionId);\n }\n\n getPrompts(): Prompt[] {\n return [...this.prompts];\n }\n\n storePrompt(prompt: Prompt): void {\n this.prompts.unshift(prompt);\n this.prompts = this.prompts.slice(0, 50);\n }\n\n deletePrompt(promptId: string): void {\n this.prompts = this.prompts.filter(p => p.id !== promptId);\n }\n\n clearAllPrompts(): void {\n this.prompts = [];\n }\n}\n\nexport const usePromptState = (storageService: IStorageService): { promptState: string } => {\n const prompts = storageService.getPrompts();\n const promptSize = prompts.length;\n if (promptSize > 0) {\n const firstPrompt = prompts[0].promptText;\n const lastPrompt = prompts[prompts.length - 1].promptText;\n const lastCreated = prompts[0].created;\n return { promptState: promptSize + \"_\" + firstPrompt + \"_\" + lastPrompt + \"_\" + lastCreated };\n }\n else {\n return { promptState: \"0\" };\n }\n};","\nimport { type EndMessageData } from \"@lib/models/EndMessageData\";\nimport type { ArtifactData } from \"../models/ArtifactData\";\nimport type { ChatSession } from \"../models/ChatSession\";\nimport type { Interaction, MergeResult } from \"../models/Interaction\";\nimport type { FunctionDetails } from \"../models/ServerEvent\";\nimport { type Artifact } from \"@lib/models/Artifact\";\nimport { ConnectionState } from \"@lib/models/connectionState\";\nimport { isServer } from \"@lib/utils/environmentUtils\";\nimport { type InteractionStatistics } from \"@lib/models/semanticKernelModel/models\";\n\nexport interface FirstTokenEventDetails {\n interactionId: string;\n callId?: string;\n}\n\nexport class EventTypes {\n public activityLost = \"activityLost\";\n public artifactGenerated = \"artifactGenerated\";\n public artifactSelected = \"artifactSelected\";\n public artifactDeleted = \"artifactDeleted\";\n public gatewayMessage = \"gatewayMessage\";\n public gatewayTurnComplete = \"gatewayTurnComplete\";\n public gatewayStreamError = \"gatewayStreamError\";\n public gatewayTurnOpen = \"gatewayTurnOpen\";\n public sessionCreated = \"sessionCreated\";\n public sessionUpdated = \"sessionUpdated\";\n public gatewayFunctionResponse = \"gatewayFunctionResponse\";\n public uiUnsavedPopoverToggle = \"uiUnsavedPopoverToggle\";\n public artifactsStorageUpdated = \"artifactsStorageUpdated\";\n public gatewayStreamEnded = \"gatewayStreamEnded\";\n public streamNewChunk = \"streamNewChunk\";\n public gatewayEndMessageData = \"gatewayEndMessageData\";\n public connectionStateChange = \"connectionStateChange\";\n public onMessageSent = \"onMessageSent\";\n public onMessageError = \"onMessageError\";\n public onToolEvent = \"onToolEvent\";\n public gatewayFirstToken = \"gatewayFirstToken\";\n}\n\nexport const allEventTypes = new EventTypes();\n\nexport class EventBusService {\n protected listeners: { [methodName: string]: ((...args: any) => Promise<void>)[] } = {};\n protected listenersCount: { [methodName: string]: number } = {};\n\n protected callListeners(eventName: string, ...args: any[]) {\n const listeners = this.listeners[eventName];\n this.listenersCount[eventName] = this.listenersCount[eventName] + 1;\n if (listeners) {\n const promisses = listeners.map(listener => listener(...args));\n Promise.all(promisses)\n .catch((error) => {\n console.error(`Lost error in one of the listeners of the event: ${eventName}, listeners: ${listeners.length}, error: ${error}`, listeners);\n });\n }\n }\n\n protected addListener(eventName: string, listener: (...args: any) => Promise<void>) {\n if (!this.listeners[eventName]) {\n this.listeners[eventName] = [];\n this.listenersCount[eventName] = 0;\n }\n this.listeners[eventName].push(listener);\n }\n\n public getEventState(eventName: string) {\n return this.listenersCount[eventName];\n }\n\n public activityOnLost(listener: (...args: any) => Promise<void>) {\n const myName = allEventTypes.activityLost;\n this.addListener(myName, listener);\n }\n\n public activityEmitLost() {\n this.callListeners(allEventTypes.activityLost);\n }\n\n /* typed artifact listeners */\n public artifactOnGenerated(listener: (artifact: Artifact) => Promise<void>) {\n const myName = allEventTypes.artifactGenerated;\n this.addListener(myName, listener);\n }\n\n public artifactEmitGenerated(artifact: Artifact) {\n this.callListeners(allEventTypes.artifactGenerated, artifact);\n }\n\n public artifactOffGenerated(listener: (artifact: Artifact) => Promise<void>) {\n const myName = allEventTypes.artifactGenerated;\n if (this.listeners[myName]) {\n this.listeners[myName] = this.listeners[myName].filter(l => l !== listener);\n }\n }\n\n public artifactOnSelected(listener: (artifact: Artifact | string) => Promise<void>) {\n const myName = allEventTypes.artifactSelected;\n this.addListener(myName, listener);\n }\n\n public artifactEmitSelected(artifact: Artifact | string) {\n this.callListeners(allEventTypes.artifactSelected, artifact);\n }\n\n public artifactOffSelected(listener: (artifact: Artifact | string) => Promise<void>) {\n const myName = allEventTypes.artifactSelected;\n if (this.listeners[myName]) {\n this.listeners[myName] = this.listeners[myName].filter(l => l !== listener);\n }\n }\n\n public artifactOnDeleted(listener: (artifact: Artifact) => Promise<void>) {\n const myName = allEventTypes.artifactDeleted;\n this.addListener(myName, listener);\n }\n\n public artifactEmitDeleted(artifact: ArtifactData) {\n this.callListeners(allEventTypes.artifactDeleted, artifact);\n }\n\n public artifactOffDeleted(listener: (artifact: ArtifactData) => Promise<void>) {\n const myName = allEventTypes.artifactDeleted;\n if (this.listeners[myName]) {\n this.listeners[myName] = this.listeners[myName].filter(l => l !== listener);\n }\n }\n\n public gatewayOnMessage(listener: (interaction: Interaction, messageDetails: MergeResult | null) => Promise<void>) {\n const myName = allEventTypes.gatewayMessage;\n this.addListener(myName, listener);\n }\n\n public gatewayOnTurnComplete(listener: (interactionId: string, interaction: Interaction) => Promise<void>) {\n const myName = allEventTypes.gatewayTurnComplete;\n this.addListener(myName, listener);\n }\n\n public gatewayOnTurnOpen(listener: (interactionId: string) => Promise<void>) {\n const myName = allEventTypes.gatewayTurnOpen;\n this.addListener(myName, listener);\n }\n\n public gatewayOnStreamError(listener: (...args: any[]) => Promise<void>) {\n const myName = allEventTypes.gatewayStreamError;\n this.addListener(myName, listener);\n }\n\n public gatewayOnStreamEnded(listener: (...args: any[]) => Promise<void>) {\n const myName = allEventTypes.gatewayStreamEnded;\n this.addListener(myName, listener);\n }\n\n public gatewayOffStreamEnded(listener: (...args: any[]) => Promise<void>) {\n const myName = allEventTypes.gatewayStreamEnded;\n if (this.listeners[myName]) {\n this.listeners[myName] = this.listeners[myName].filter(l => l !== listener);\n }\n }\n\n public gatewayEmitStreamEnded(interactionId: string, interaction: Interaction) {\n this.callListeners(allEventTypes.gatewayStreamEnded, interactionId, interaction);\n }\n\n public gatewayEmitMessage(agentInteraction: Interaction, messageDetails: MergeResult | null = null) {\n this.callListeners(allEventTypes.gatewayMessage, agentInteraction, messageDetails);\n }\n\n public gatewayEmitTurnComplete(interactionId: string, agentInteraction: Interaction) {\n this.callListeners(allEventTypes.gatewayTurnComplete, interactionId, agentInteraction);\n }\n\n public gatewayEmitStreamError(errorMessage: string) {\n this.callListeners(allEventTypes.gatewayStreamError, errorMessage);\n }\n\n public gatewayEmitTurnOpen(interactionId: string) {\n this.callListeners(allEventTypes.gatewayTurnOpen, interactionId);\n }\n\n public gatewayOffMessage(listener: (interaction: Interaction, messageDetails: MergeResult | null) => Promise<void>) {\n const myName = allEventTypes.gatewayMessage;\n if (this.listeners[myName]) {\n this.listeners[myName] = this.listeners[myName].filter(l => l !== listener);\n }\n }\n\n public gatewayOffTurnComplete(listener: (interactionId: string, interaction: Interaction) => Promise<void>) {\n const myName = allEventTypes.gatewayTurnComplete;\n if (this.listeners[myName]) {\n this.listeners[myName] = this.listeners[myName].filter(l => l !== listener);\n }\n }\n\n public gatewayOffTurnOpen(listener: (interactionId: string) => Promise<void>) {\n const myName = allEventTypes.gatewayTurnOpen;\n if (this.listeners[myName]) {\n this.listeners[myName] = this.listeners[myName].filter(l => l !== listener);\n }\n }\n\n public gatewayOffStreamError(listener: (...args: any[]) => Promise<void>) {\n const myName = allEventTypes.gatewayStreamError;\n if (this.listeners[myName]) {\n this.listeners[myName] = this.listeners[myName].filter(l => l !== listener);\n }\n }\n\n public sessionOnCreated(listener: (...args: any[]) => Promise<void>) {\n const myName = allEventTypes.sessionCreated;\n this.addListener(myName, listener);\n }\n\n public chatOnMessageSent(listener: (messate: string, interaction: Interaction) => Promise<void>) {\n const myName = allEventTypes.onMessageSent;\n this.addListener(myName, listener);\n }\n\n public chatOffMessageSent(listener: (...args: any[]) => Promise<void>) {\n const myName = allEventTypes.onMessageSent;\n if (this.listeners[myName]) {\n this.listeners[myName] = this.listeners[myName].filter(l => l !== listener);\n }\n }\n\n public ChatEmitMessageSent(message: string, interaction: Interaction) {\n this.callListeners(allEventTypes.onMessageSent, message, interaction);\n }\n\n public chatOnMessageError(listener: (error: string) => Promise<void>) {\n const myName = allEventTypes.onMessageError;\n this.addListener(myName, listener);\n }\n\n public chatOffMessageError(listener: (...args: any[]) => Promise<void>) {\n const myName = allEventTypes.onMessageError;\n if (this.listeners[myName]) {\n this.listeners[myName] = this.listeners[myName].filter(l => l !== listener);\n }\n }\n\n public ChatEmitMessageError(error: string) {\n this.callListeners(allEventTypes.onMessageError, error);\n }\n\n public sessionOnUpdated(listener: (...args: any[]) => Promise<void>) {\n const myName = allEventTypes.sessionUpdated;\n this.addListener(myName, listener);\n }\n\n public sessionEmitCreated(session: ChatSession) {\n this.callListeners(allEventTypes.sessionCreated, session);\n }\n\n public sessionEmitUpdated(session: ChatSession) {\n this.callListeners(allEventTypes.sessionUpdated, session);\n }\n\n public sessionOffCreated(listener: (...args: any[]) => Promise<void>) {\n const myName = allEventTypes.sessionCreated;\n if (this.listeners[myName]) {\n this.listeners[myName] = this.listeners[myName].filter(l => l !== listener);\n }\n }\n\n public sessionOffUpdated(listener: (...args: any[]) => Promise<void>) {\n const myName = allEventTypes.sessionUpdated;\n if (this.listeners[myName]) {\n this.listeners[myName] = this.listeners[myName].filter(l => l !== listener);\n }\n }\n\n public gatewayEmitFunctionResponse(functionDetails: FunctionDetails) {\n this.callListeners(allEventTypes.gatewayFunctionResponse, functionDetails);\n }\n\n public gatewayOffFunctionResponse(listener: (...args: any[]) => Promise<void>) {\n const myName = allEventTypes.gatewayFunctionResponse;\n if (this.listeners[myName]) {\n this.listeners[myName] = this.listeners[myName].filter(l => l !== listener);\n }\n }\n\n public gatewayOnFunctionResponse(listener: (...args: any[]) => Promise<void>) {\n const myName = allEventTypes.gatewayFunctionResponse;\n this.addListener(myName, listener);\n }\n\n // UI events\n public uiOnUnsavedPopoverToggle(listener: (anchorEl: HTMLElement | null) => Promise<void>) {\n const myName = allEventTypes.uiUnsavedPopoverToggle;\n this.addListener(myName, listener);\n }\n\n public uiEmitUnsavedPopoverToggle(anchorEl: HTMLElement | null) {\n this.callListeners(allEventTypes.uiUnsavedPopoverToggle, anchorEl);\n }\n\n public uiOffUnsavedPopoverToggle(listener: (anchorEl: HTMLElement | null) => Promise<void>) {\n const myName = allEventTypes.uiUnsavedPopoverToggle;\n if (this.listeners[myName]) {\n this.listeners[myName] = this.listeners[myName].filter(l => l !== listener);\n }\n }\n\n // Artifacts storage update events\n public artifactsOnStorageUpdated(listener: () => Promise<void>) {\n const myName = allEventTypes.artifactsStorageUpdated;\n this.addListener(myName, listener);\n }\n\n public artifactsEmitStorageUpdated() {\n this.callListeners(allEventTypes.artifactsStorageUpdated);\n }\n\n public artifactsOffStorageUpdated(listener: () => Promise<void>) {\n const myName = allEventTypes.artifactsStorageUpdated;\n if (this.listeners[myName]) {\n this.listeners[myName] = this.listeners[myName].filter(l => l !== listener);\n }\n }\n\n public streamOnNewChunk(listener: (stats: InteractionStatistics) => Promise<void>) {\n const myName = allEventTypes.streamNewChunk;\n this.addListener(myName, listener);\n }\n\n public streamEmitNewChunk(stats: InteractionStatistics) {\n this.callListeners(allEventTypes.streamNewChunk, stats);\n }\n\n public streamOffNewChunk(listener: (stats: InteractionStatistics) => Promise<void>) {\n const myName = allEventTypes.streamNewChunk;\n if (this.listeners[myName]) {\n this.listeners[myName] = this.listeners[myName].filter(l => l !== listener);\n }\n }\n\n public gatewayOnEndMessageData(listener: (data: EndMessageData) => Promise<void>) {\n const myName = allEventTypes.gatewayEndMessageData;\n this.addListener(myName, listener);\n }\n\n public gatewayEmitEndMessageData(data: EndMessageData) {\n this.callListeners(allEventTypes.gatewayEndMessageData, data);\n }\n\n public gatewayOffEndMessageData(listener: (data: EndMessageData) => Promise<void>) {\n const myName = allEventTypes.gatewayEndMessageData;\n if (this.listeners[myName]) {\n this.listeners[myName] = this.listeners[myName].filter(l => l !== listener);\n }\n }\n\n public gatewayOnConnectionStateChange(listener: (state: ConnectionState) => Promise<void>) {\n const myName = allEventTypes.connectionStateChange;\n this.addListener(myName, listener);\n }\n\n public gatewayEmitConnectionStateChange(state: ConnectionState) {\n this.callListeners(allEventTypes.connectionStateChange, state);\n }\n\n public gatewayOffConnectionStateChange(listener: (state: ConnectionState) => Promise<void>) {\n const myName = allEventTypes.connectionStateChange;\n if (this.listeners[myName]) {\n this.listeners[myName] = this.listeners[myName].filter(l => l !== listener);\n }\n }\n\n\n public gatewayOnToolEvent(listener: (eventName: string, eventData: string, sessionId?: string) => Promise<void>) {\n const myName = allEventTypes.onToolEvent;\n this.addListener(myName, listener);\n }\n\n public gatewayEmitToolEvent(eventName: string, eventData: string, sessionId?: string) {\n this.callListeners(allEventTypes.onToolEvent, eventName, eventData, sessionId);\n }\n\n public gatewayOffToolEvent(listener: (eventName: string, eventData: string, sessionId?: string) => Promise<void>) {\n const myName = allEventTypes.onToolEvent;\n if (this.listeners[myName]) {\n this.listeners[myName] = this.listeners[myName].filter(l => l !== listener);\n }\n }\n\n public gatewayOnFirstToken(listener: (details: FirstTokenEventDetails) => Promise<void>) {\n const myName = allEventTypes.gatewayFirstToken;\n this.addListener(myName, listener);\n }\n\n public gatewayEmitFirstToken(details: FirstTokenEventDetails) {\n this.callListeners(allEventTypes.gatewayFirstToken, details);\n }\n\n public gatewayOffFirstToken(listener: (details: FirstTokenEventDetails) => Promise<void>) {\n const myName = allEventTypes.gatewayFirstToken;\n if (this.listeners[myName]) {\n this.listeners[myName] = this.listeners[myName].filter(l => l !== listener);\n }\n }\n\n}\n\n\n\n\nexport class MockEventBusService extends EventBusService {\n constructor() {\n super();\n }\n\n override gatewayEmitConnectionStateChange(_state: ConnectionState): void {\n console.log(\"MockEventBusService.gatewayEmitConnectionStateChange\");\n }\n\n override gatewayEmitMessage(agentInteraction: Interaction, _messageDetails?: MergeResult): void {\n if (isServer())\n process.stdout.write(`M${agentInteraction.version}, `);\n else\n console.log(\"MockEventBusService.gatewayEmitMessage\",);\n }\n\n public gatewayEmitTurnComplete(_interactionId: string, _agentInteraction: Interaction): void {\n console.log(\"MockEventBusService.gatewayEmitTurnComplete\");\n\n }\n\n public gatewayEmitTurnOpen(_interactionId: string): void {\n console.log(\"MockEventBusService.gatewayEmitTurnOpen\");\n\n }\n\n public override gatewayEmitFunctionResponse(_functionDetails: FunctionDetails) {\n console.log(\"MockEventBusService.gatewayEmitFunctionResponse\");\n }\n\n public override gatewayOnFunctionResponse(listener: (...args: any[]) => Promise<void>) {\n console.log(\"MockEventBusService.gatewayOnFunctionResponse\", listener);\n }\n\n public override gatewayOffFunctionResponse(listener: (...args: any[]) => Promise<void>) {\n console.log(\"MockEventBusService.gatewayOffFunctionResponse\", listener);\n }\n\n}","import type { Artifact } from '@lib/models/Artifact';\nimport { type MergeResult, type Interaction } from \"../models/Interaction\";\nimport { type InteractionPart, InteractionPartUtils } from \"../models/InteractionPart\";\nimport { type ServerEvent } from \"../models/ServerEvent\";\nimport { EventType } from \"../models/enums\";\nimport { EventBusService } from \"./eventBusService\";\nimport { unified } from \"unified\";\nimport remarkParse from 'remark-parse';\nimport { toMarkdown } from 'mdast-util-to-markdown';\n\nexport type InteractionPartGroupType = 'inline' | 'block';\nexport const InteractionPartGroupType = {\n inline: 'inline',\n block: 'block'\n} as const;\n\nexport class InteractionPartGroup {\n parts: InteractionPart[] = [];\n isLastGroup: boolean = false;\n hasThoughts: boolean = false;\n lastWithThoughts: boolean = false;\n type: InteractionPartGroupType = InteractionPartGroupType.inline;\n}\n\nexport class InteractionService {\n interaction: Interaction;\n eventBusService: EventBusService;\n\n constructor(interaction: Interaction, eventBusService: EventBusService) {\n this.interaction = interaction;\n this.eventBusService = eventBusService;\n }\n\n public expandSubParts(text: string, parentPartId: string): InteractionPart[] {\n const subTextParts = this.parseTextIntoParts(text)\n\n const subParts: InteractionPart[] = []\n let index = 0;\n for (const partText of subTextParts) {\n const part = InteractionPartUtils.fromText(partText);\n part.id = index + \"_\" + parentPartId\n subParts.push(part);\n index++;\n }\n\n return subParts;\n }\n\n public groupPartsByDisplayType(parts: InteractionPart[], partial: boolean = true, showToolCalls: boolean = false): InteractionPartGroup[] {\n const groups: InteractionPartGroup[] = [];\n let currentInlineGroup: InteractionPartGroup = new InteractionPartGroup();\n\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i];\n\n // UI render tools (UI_ prefix → `uiTool` kind) are first-class\n // content, not tool chatter: never collapse them when the turn\n // completes, and render them as their own block (like text) rather\n // than inline with tool calls.\n const isUiTool = part.functionDetails?.isUi ?? false;\n\n // Treat thinking parts as block elements only if it is the last part and showLastThoughtOpen == true\n let shouldShowThisPartInLine = (\n !isUiTool &&\n part.eventType !== EventType.Text && part.eventType !== EventType.Thought && (\n ((part.eventType === EventType.FunctionCall || part.eventType === EventType.PartialFunctionCall || part.eventType === EventType.FunctionResponse) && i < parts.length - 1)\n ));\n\n // Honor the host's `showToolCalls` toggle: when set, keep completed\n // function call/response parts visible (matches MessageAgent's filter\n // contract — a non-UI tool result like run_python would otherwise be\n // dropped here even though MessageAgent kept it). Default collapses\n // them out of the closed turn as before.\n if (!partial && shouldShowThisPartInLine && !showToolCalls)\n continue; //Ignore functioncalls and responses from complete messages\n\n if (shouldShowThisPartInLine) {\n if (part.eventType == EventType.Thought) {\n currentInlineGroup.hasThoughts = true;\n }\n currentInlineGroup.parts.push(part);\n currentInlineGroup.isLastGroup = i === parts.length - 1;\n } else {\n // If we have inline parts accumulated, add them as a group first\n if (currentInlineGroup.parts.length > 0) {\n groups.push(currentInlineGroup);\n currentInlineGroup = new InteractionPartGroup();\n }\n // Add the non-inline part or thinking part\n groups.push({\n type: InteractionPartGroupType.block,\n parts: [part],\n isLastGroup: i === parts.length - 1,\n hasThoughts: false,\n lastWithThoughts: false\n });\n }\n }\n\n // Add any remaining inline parts\n if (currentInlineGroup.parts.length > 0) {\n groups.push(currentInlineGroup);\n }\n\n const groupsWithThoughts = groups.filter((g) => g.hasThoughts);\n if (groupsWithThoughts.length > 0) {\n groupsWithThoughts[groupsWithThoughts.length - 1].lastWithThoughts = true;\n }\n\n return groups;\n }\n\n public isFunctionCall(eventType: EventType): boolean {\n return eventType == EventType.FunctionCall || eventType == EventType.PartialFunctionCall;\n }\n\n public isFunctionResponse(eventType: EventType): boolean {\n return eventType == EventType.FunctionResponse;\n }\n\n private parseTextIntoParts = (text?: string) => {\n if (!text || text.trim().length == 0) return [];\n\n const ast = unified()\n .use(remarkParse)\n .parse(text);\n\n const subParts: string[] = [];\n let currentPart: string | null = null;\n for (const node of ast.children) {\n if (node.type === \"code\") {\n if (currentPart) {\n subParts.push(currentPart);\n currentPart = null;\n }\n\n if (node.lang === 'htmlCanvas') {\n subParts.push(`\\n\\`\\`\\`liveTsx\\n${node.value}\\n\\`\\`\\`\\n`)\n }\n }\n else {\n if (!currentPart)\n currentPart = \"\";\n\n currentPart += toMarkdown(node)\n }\n }\n\n if (currentPart) {\n subParts.push(currentPart)\n }\n\n return subParts;\n }\n\n\n // Computes the next interaction from a server event. Pure with respect to\n // `prev` — no part or array on the prior tree is mutated; modified entities\n // are cloned. The service field `this.interaction` is replaced with the\n // new tree as the last step, so snapshots already handed out to throttled\n // subscribers can't diverge from the live state.\n public merge(serverEvent: ServerEvent): MergeResult {\n const prev = this.interaction;\n const updatedParts: InteractionPart[] = [];\n const newArtifacts: Partial<Artifact>[] = [];\n\n const flattenedEventPart = InteractionPartUtils.FlatParts(serverEvent?.parts);\n const initialLastPart: InteractionPart | null = prev.parts[prev.parts.length - 1] ?? null;\n\n let shouldPush = false;\n if (flattenedEventPart) {\n shouldPush = (!initialLastPart ||\n (flattenedEventPart.mustPush || (flattenedEventPart.mustPush === false && (flattenedEventPart.eventType !== initialLastPart?.eventType || flattenedEventPart?.functionDetails?.id !== initialLastPart.functionDetails?.id)))\n );\n }\n\n // Copy-on-write scratch state.\n let nextParts: InteractionPart[] = prev.parts;\n let nextFunctionMap: Map<string, InteractionPart> = prev.functionMap ?? new Map<string, InteractionPart>();\n let functionMapCloned = !prev.functionMap; // already \"ours\" if we just created it\n const cloneFunctionMap = () => {\n if (!functionMapCloned) {\n nextFunctionMap = new Map(nextFunctionMap);\n functionMapCloned = true;\n }\n };\n const clonePartsIfShared = () => {\n if (nextParts === prev.parts) {\n nextParts = prev.parts.slice();\n }\n };\n\n // Stage 1 — push a new part, or fold a function response into its\n // existing call entry. Mirrors the legacy `mapFunction` decision\n // inlined here so we control the immutability boundary.\n let justPushedNew = false;\n\n // Prefill fold (issue #60): a StreamingClientOutputContent pushed WHILE an ask-user tool is parked.\n // Seed clientOutput onto the parked call by callId WITHOUT closing it (no status change) — never a\n // standalone part. Handled independently of `shouldPush` so it always folds.\n const isClientOutputFold = flattenedEventPart?.eventType === EventType.FunctionClientOutput\n && !!flattenedEventPart.functionDetails?.id;\n\n if (isClientOutputFold && flattenedEventPart) {\n const coCallId = flattenedEventPart.functionDetails!.id!;\n const co = flattenedEventPart.functionDetails!.clientOutput;\n const currentIdx = nextParts.findIndex(p => p.functionDetails?.id === coCallId);\n if (currentIdx > -1) {\n const current = nextParts[currentIdx];\n const merged: InteractionPart = {\n ...current,\n functionDetails: {\n ...current.functionDetails!,\n clientOutput: co ?? current.functionDetails!.clientOutput,\n },\n };\n clonePartsIfShared();\n nextParts[currentIdx] = merged;\n cloneFunctionMap();\n nextFunctionMap.set(coCallId, merged);\n updatedParts.push(merged);\n }\n else {\n // The prefill beat its call event (rare ordering race). Stash a silent placeholder so the\n // later call fold (isFn `existing` branch) finds it, seeds clientOutput, and renders normally.\n const placeholder: InteractionPart = {\n ...flattenedEventPart,\n id: (nextParts.length + 1) + \"-\" + prev.interactionId,\n functionDetails: { ...flattenedEventPart.functionDetails!, silent: true },\n };\n clonePartsIfShared();\n nextParts = nextParts === prev.parts ? prev.parts.slice() : nextParts;\n nextParts.push(placeholder);\n cloneFunctionMap();\n nextFunctionMap.set(coCallId, placeholder);\n }\n }\n else if (shouldPush && flattenedEventPart) {\n const isFn = this.isFunctionCall(flattenedEventPart.eventType) || this.isFunctionResponse(flattenedEventPart.eventType);\n const callId = isFn ? flattenedEventPart.functionDetails?.id : undefined;\n if (isFn && !callId) {\n console.error(\"Got isCall or isResponse without a callId\", flattenedEventPart);\n }\n const existing = callId ? nextFunctionMap.get(callId) : undefined;\n\n if (existing && callId && flattenedEventPart.functionDetails) {\n // Find the *current* state of this call in nextParts — Stage 2\n // accumulates text/textDetails into a new clone each tick, but\n // functionMap only remembers the version stored at push time.\n // Spread from `current` (live state) rather than `existing`\n // (push-time snapshot) so we preserve the computed part.id (the\n // \"N-interactionId\" stamp React keys on) and any state Stage 2\n // built up during partial-call streaming.\n const currentIdx = nextParts.findIndex(p => p.functionDetails?.id === callId);\n const current = currentIdx > -1 ? nextParts[currentIdx] : existing;\n\n const merged: InteractionPart = {\n ...current,\n eventType: flattenedEventPart.eventType,\n functionDetails: {\n id: current.functionDetails!.id,\n name: flattenedEventPart.functionDetails.name ?? current.functionDetails!.name,\n // Take the parsed args from the incoming event when\n // present (the full FunctionCall carries them), fall\n // back to what was already on the part. Previously\n // this was `current.functionDetails!.args`\n // unconditionally, which silently dropped the parsed\n // args off every full FunctionCall fold because the\n // PartialFunctionCall stream only accumulates raw\n // JSON in `.text` — `.args` stayed undefined.\n args: flattenedEventPart.functionDetails.args ?? current.functionDetails!.args,\n response: flattenedEventPart.functionDetails.response,\n status: flattenedEventPart.functionDetails.status ?? 'Composing',\n start: flattenedEventPart.functionDetails.start ?? current.functionDetails!.start,\n end: flattenedEventPart.functionDetails.end ?? current.functionDetails!.end,\n // true-wins: a UI call has multiple reps (streaming part with isUi, the\n // persisted FunctionCall, the result) and they interleave. `??` let a later\n // `false`/`undefined` rep clobber an earlier `true`; OR-ing keeps it sticky.\n isUi: flattenedEventPart.functionDetails.isUi === true || current.functionDetails!.isUi === true,\n // Keep the call's friendly args summary when the result event (which has none) folds in.\n argsDescription: flattenedEventPart.functionDetails.argsDescription ?? current.functionDetails!.argsDescription,\n // The tool's client-only payload rides the RESULT event; keep it sticky so a\n // later rep without one can't clobber it. This is what a uiTool renderer reads.\n clientOutput: flattenedEventPart.functionDetails.clientOutput ?? current.functionDetails!.clientOutput,\n },\n };\n\n cloneFunctionMap();\n nextFunctionMap.set(callId, merged);\n\n if (merged.eventType === EventType.FunctionResponse) {\n this.eventBusService.gatewayEmitFunctionResponse(merged.functionDetails!);\n }\n\n updatedParts.push(merged);\n if (currentIdx > -1) {\n clonePartsIfShared();\n nextParts[currentIdx] = merged;\n }\n }\n else {\n // Fresh part — function call seen for the first time, or any\n // non-function event.\n if (callId && flattenedEventPart.functionDetails && !existing) {\n cloneFunctionMap();\n nextFunctionMap.set(callId, flattenedEventPart);\n }\n\n // The previous last part, if text-appendable, gets flushed.\n // Clone before stamping the end time so prev's part stays\n // untouched.\n if (initialLastPart && initialLastPart.textAppendable) {\n const endedLast: InteractionPart = {\n ...initialLastPart,\n ended: new Date(),\n isStillWriting: false,\n };\n clonePartsIfShared();\n nextParts[nextParts.length - 1] = endedLast;\n updatedParts.push(endedLast);\n }\n\n const newPart: InteractionPart = {\n ...flattenedEventPart,\n id: (nextParts.length + 1) + \"-\" + prev.interactionId,\n isStillWriting: flattenedEventPart.textAppendable,\n partial: serverEvent.partial,\n };\n\n if (!newPart.functionDetails?.silent) {\n updatedParts.push(newPart);\n }\n\n nextParts = [...nextParts, newPart];\n justPushedNew = true;\n }\n }\n\n // Stage 2 — text append into the (possibly new) last part. `lastPart`\n // can still be null if `nextParts` started empty AND no new part was\n // pushed in stage 1 — typical on session resume when a metadata-only\n // event arrives before any text part has been hydrated.\n let lastPart: InteractionPart | null = nextParts[nextParts.length - 1] ?? null;\n if (lastPart && flattenedEventPart && flattenedEventPart.textAppendable) {\n const updatedLastPart: InteractionPart = {\n ...lastPart,\n partial: serverEvent.partial,\n textDetails: lastPart.textDetails ? { ...lastPart.textDetails } : { version: 0 },\n };\n\n let shouldAddUpdated = false;\n if (serverEvent.partial) {\n try {\n updatedLastPart.textDetails!.version++;\n // justPushedNew=true means the just-pushed part already\n // carries the incoming chunk in its `text`; re-appending\n // would double-count.\n if (!justPushedNew) {\n updatedLastPart.text = (lastPart.text ?? \"\") + (flattenedEventPart.text ?? \"\");\n }\n }\n catch (err: any) {\n console.error(\"Error here\", err.toString());\n }\n\n updatedLastPart.textLastChunk = flattenedEventPart.text ?? \"\";\n updatedLastPart.isStillWriting = true;\n shouldAddUpdated = true;\n\n if (flattenedEventPart.thoughtDetails && updatedLastPart.thoughtDetails) {\n if (flattenedEventPart.thoughtDetails.text !== updatedLastPart.thoughtDetails.text) {\n updatedLastPart.thoughtDetails = {\n ...updatedLastPart.thoughtDetails,\n text: updatedLastPart.thoughtDetails.text + flattenedEventPart.thoughtDetails.text,\n };\n updatedLastPart.thoughtLastChunk = flattenedEventPart.thoughtDetails.text;\n }\n }\n }\n else {\n updatedLastPart.isStillWriting = false;\n updatedLastPart.text = flattenedEventPart.text ?? \"\";\n updatedLastPart.textDetails!.version++;\n if (flattenedEventPart.thoughtDetails) {\n updatedLastPart.thoughtDetails = {\n ...flattenedEventPart.thoughtDetails,\n text: flattenedEventPart.thoughtDetails.text.trim(),\n };\n }\n shouldAddUpdated = !shouldPush;\n }\n\n clonePartsIfShared();\n nextParts[nextParts.length - 1] = updatedLastPart;\n lastPart = updatedLastPart;\n\n if (shouldAddUpdated) {\n updatedParts.push(updatedLastPart);\n }\n }\n\n // Stage 3 — merge artifacts onto a copy-on-write array.\n let nextArtifactData: Artifact[] = prev.artifactData ?? [];\n if (serverEvent.llmArtifacts && serverEvent.llmArtifacts.length > 0) {\n let artifactsCloned = false;\n for (const llmArtifact of serverEvent.llmArtifacts) {\n const artifact = llmArtifact.toArtifact();\n if (!artifactsCloned) {\n nextArtifactData = nextArtifactData.slice();\n artifactsCloned = true;\n }\n const index = nextArtifactData.findIndex(a => a.id === artifact.id);\n if (index === -1) {\n nextArtifactData.push(artifact);\n }\n else {\n nextArtifactData[index] = artifact;\n }\n }\n }\n\n const next: Interaction = {\n ...prev,\n version: prev.version + 1,\n parts: nextParts,\n artifactData: nextArtifactData,\n functionMap: nextFunctionMap,\n turn_complete: serverEvent.turn_complete,\n partial: serverEvent.partial,\n asyncFinalResponse: serverEvent.asyncFinalResponse,\n };\n\n // Atomic swap: the prior tree is left untouched. Snapshots already\n // handed out to throttled subscribers cannot diverge from live state\n // because there's no shared mutable reference path.\n this.interaction = next;\n\n return {\n updatedInteraction: next,\n updatedParts,\n newArtifacts,\n mainBranch: next,\n analyticsBranch: null,\n analyticsBranchPartsChanged: null,\n mainBranchPartsChanged: updatedParts,\n };\n }\n}\n","import { ServerEvent, type ToolEventDetails } from '../../models/ServerEvent';\nimport type { User } from '../../models/contexts';\nimport type { AgentContext } from '../../models/contexts';\nimport type { ClientMessage } from '../../models/ClientMessage';\nimport type { Interaction, MergeResult } from '../../models/Interaction';\nimport type { EventBusService } from \"../eventBusService\";\nimport { InteractionService } from \"../interactionService\";\nimport { RunMode } from '../../models/enums';\nimport { InteractionPartUtils, type InteractionPart } from '../../models/InteractionPart';\nimport type { StartStreamResponse, SendMessageResponse } from '../../models/SendMessageResponse'\nimport type { IArtifactService } from '../interfaces/artifactService';\nimport type { Artifact } from '@lib/models/Artifact';\nimport { format as formatDate } from 'date-fns';\nimport type { AiChatState, AiChatStore } from '@lib/components/AiChat/stateConfiguration';\nimport type { INotificationPort } from '@lib/interfaces/INotificationPort';\nimport type { EndMessageData } from '@lib/models/EndMessageData';\nimport _ from 'lodash';\nimport type { IStorageService } from '../storageService';\nimport { PromptUtils } from '@lib/models';\nimport type { FirstTokenEventDetails } from '../eventBusService';\nimport { agentBaseUrlOverride } from '../../utils/envOverrides';\n\nconst THRESHOLD_PING = 20 * 60 * 1000; // 20 minutes\n\nexport interface GatewaySendMessageOptions {\n callId?: string;\n}\n\nexport abstract class AgentGatewayService {\n base_production_url: string = agentBaseUrlOverride() ?? \"https://agent.tripapi.com.br\";\n base_url_local: string = \"http://localagent:8000\";\n base_url: string;\n\n isLocal: boolean = false;\n msg_order = 0;\n\n static SUSPENSION_MSG = 'SUSPEND';\n\n protected lastPing: Date = new Date();\n\n protected interactionsMap: Map<string, Interaction> = new Map();\n protected interactionsServiceMap: Map<string, InteractionService> = new Map();\n\n protected user: User;\n protected config: AgentContext;\n\n protected currentIS: InteractionService | null = null;\n\n protected server_session_id?: string | null;\n protected model_session_id?: string | null;\n protected runMode: RunMode;\n\n protected sessionState: AiChatState;\n protected storageService: IStorageService;\n protected notificationPort: INotificationPort\n protected interactionCallIds: Map<string, string> = new Map();\n\n protected rawJwt: string;\n protected sessionId?: string;\n isInited: boolean = false;\n\n //Define all SSEServer methods here, use from SSEServer.ts\n eventBusService: EventBusService;\n artifactService: IArtifactService;\n\n onTurnOpen = (listener: (...args: any[]) => Promise<void>): void => {\n this.eventBusService.gatewayOnTurnOpen(listener);\n }\n offTurnOpen = (listener: (...args: any[]) => Promise<void>): void => {\n this.eventBusService.gatewayOffTurnOpen(listener);\n }\n\n onTurnComplete = (listener: (...args: any[]) => Promise<void>): void => {\n this.eventBusService.gatewayOnTurnComplete(listener);\n }\n offTurnComplete = (listener: (...args: any[]) => Promise<void>): void => {\n this.eventBusService.gatewayOffTurnComplete(listener);\n }\n\n onStreamError = (listener: (...args: any[]) => Promise<void>): void => {\n this.eventBusService.gatewayOnStreamError(listener);\n }\n offStreamError = (listener: (...args: any[]) => Promise<void>): void => {\n this.eventBusService.gatewayOffStreamError(listener);\n }\n\n onStreamEnded = (listener: (...args: any[]) => Promise<void>): void => {\n this.eventBusService.gatewayOnStreamEnded(listener);\n }\n offStreamEnded = (listener: (...args: any[]) => Promise<void>): void => {\n this.eventBusService.gatewayOffStreamEnded(listener);\n }\n\n onMessage = (listener: (...args: any[]) => Promise<void>): void => {\n this.eventBusService.gatewayOnMessage(listener);\n }\n offMessage = (listener: (...args: any[]) => Promise<void>): void => {\n this.eventBusService.gatewayOffMessage(listener);\n }\n\n onFirstToken = (listener: (details: FirstTokenEventDetails) => Promise<void>): void => {\n this.eventBusService.gatewayOnFirstToken(listener);\n }\n\n offFirstToken = (listener: (details: FirstTokenEventDetails) => Promise<void>): void => {\n this.eventBusService.gatewayOffFirstToken(listener);\n }\n\n onEndMessageData(listener: (data: EndMessageData) => Promise<void>) {\n this.eventBusService.gatewayOnEndMessageData(listener);\n }\n\n offEndMessageData(listener: (data: EndMessageData) => Promise<void>) {\n this.eventBusService.gatewayOffEndMessageData(listener);\n }\n\n onFunctionResponse = (listener: (...args: any[]) => Promise<void>): void => {\n this.eventBusService.gatewayOnFunctionResponse(listener);\n }\n offFunctionResponse = (listener: (...args: any[]) => Promise<void>): void => {\n this.eventBusService.gatewayOffFunctionResponse(listener);\n }\n toolSessionId: string | null = null;\n\n /**\n * Send the user's answer to a parked `ask_user` tool call back to the agent.\n * Default no-op; the WebSocket gateway (AgentGatewayWSAsync) overrides it to emit\n * a ChatAction.AnswerHumanTool frame.\n */\n answerHumanTool(toolCallId: string, answer: string): void {\n console.warn('answerHumanTool: not supported by this gateway', toolCallId, answer);\n }\n\n constructor(user: User, eventBusService: EventBusService, artifactService: IArtifactService, baseUrl: string, config: AgentContext, sessionStore: AiChatStore, notificationPort: INotificationPort, storageService: IStorageService, sessionId?: string, runMode: RunMode = RunMode.Interactive) {\n this.user = user;\n this.config = config;\n this.rawJwt = user.access_token;\n this.base_url = baseUrl\n this.eventBusService = eventBusService;\n this.sessionId = sessionId;\n this.runMode = runMode;\n this.artifactService = artifactService\n\n this.sessionState = sessionStore.getState();\n this.notificationPort = notificationPort;\n this.storageService = storageService;\n\n sessionStore.subscribe((state, _prev) => {\n this.sessionState = state;\n })\n\n }\n\n public getAgentContext() {\n return this.config;\n }\n\n public getModel(): string | undefined {\n return this.config.model;\n }\n\n public setModel(modelId: string): void {\n this.config = { ...this.config, model: modelId };\n }\n\n /**\n * Live update for the agent / customer slice of the gateway's\n * config. Mirrors {@link setModel}'s in-place pattern so the\n * next outgoing message — `sendMessageInternal` reads\n * `this.config.agentConfig?.id` directly at send time, see\n * `AgentGatewayWSAsync.sendMessageInternal` — picks up the new\n * id without rebuilding the gateway or tearing down the\n * WebSocket. This is what the host calls from the agent picker\n * so switching agents preserves the current session's\n * connection, chat history, and any in-flight stream state\n * instead of remounting `AiChatProvider` and losing them.\n *\n * Callers should pass the FULL replacement context (the same\n * shape they originally constructed the gateway with). The\n * gateway preserves the `model` slice from its current config\n * if the incoming context omits it — the model is owned\n * separately by `setModel` and shouldn't get clobbered by an\n * agent-only change.\n */\n public setAgentContext(config: AgentContext): void {\n this.config = {\n ...config,\n model: config.model ?? this.config.model,\n };\n }\n\n public getSessionId() {\n return this.sessionId;\n }\n\n public getErrorEvent(errorMessage: string) {\n return {\n interaction_id: this.getCurrentInteractionId(),\n model_session_id: '',\n mime_type: 'text/plain',\n partial: false,\n serverError: errorMessage\n }\n }\n\n public setSession(sessionId: string, toolSessionId: string) {\n if (this.sessionId === undefined || this.sessionId != sessionId) {\n this.sessionId = sessionId;\n this.msg_order = this.sessionState.messages.length;\n }\n\n if (toolSessionId) {\n this.toolSessionId = toolSessionId;\n }\n }\n\n public startInteraction(interactionQuestion: string, wasSuspended?: boolean | undefined, idOverrideForTests?: string): Interaction {\n if (wasSuspended && this.currentIS) {\n this.currentIS.interaction.isSuspended = false;\n this.currentIS.interaction.interactionQuestion += \" + \" + interactionQuestion;\n return this.currentIS.interaction;\n }\n\n this.msg_order += 1;\n let newId = this.getNewInteractionId();\n if (idOverrideForTests)\n newId = idOverrideForTests;\n\n let interaction: Interaction = {\n created: new Date(),\n interactionId: newId,\n artifactData: [],\n partial: true,\n sessionId: this.sessionId,\n turn_complete: false,\n parts: [],\n version: 0,\n functionMap: new Map(),\n interactionQuestion: interactionQuestion\n }\n this.interactionsMap.set(interaction.interactionId, interaction);\n this.currentIS = new InteractionService(interaction, this.eventBusService);\n this.interactionsServiceMap.set(interaction.interactionId, this.currentIS);\n return interaction;\n }\n\n public getInteractions(): Interaction[] {\n return Array.from(this.interactionsMap.values());\n }\n\n public getRecentInteractions(filterMs: number = 1000 * 60): Interaction[] {\n return Array.from(this.interactionsMap.values()).filter(interaction => interaction.created.getTime() > Date.now() - filterMs);\n }\n\n protected updateMap(serverEvent: ServerEvent): MergeResult | undefined {\n let interService = this.interactionsServiceMap.get(serverEvent.interactionId);\n if (!interService) {\n // Event arrived for an interaction the client never started\n // locally — this happens on replay (no `sendMessage` was called)\n // or when the server initiates a turn out-of-band. Create the\n // interaction *with* the event's interactionId so every later\n // event in the same turn routes to the same merge target. The\n // previous behaviour auto-generated a fresh id each call, which\n // made N events spawn N orphan \"Unknown\" interactions that\n // blinked through the UI as each was briefly the most-recent.\n var newIter = this.startInteraction(\"Unknown\", false, serverEvent.interactionId);\n interService = this.interactionsServiceMap.get(newIter.interactionId);\n }\n\n return interService!.merge(serverEvent);\n }\n\n public getCurrentInteractionId(): string | null {\n if (this.currentIS)\n return this.currentIS.interaction.interactionId\n else\n return null;\n }\n\n public getCurrentInteraction(): Interaction | null {\n return this.currentIS?.interaction ?? null;\n }\n\n public getInteraction(interactionId: string): Interaction | undefined {\n return this.interactionsMap.get(interactionId);\n }\n\n public hasState(): boolean {\n return this.interactionsMap.size > 0;\n }\n\n protected buildAgentParams(): string {\n let params = `agent=${encodeURIComponent(this.config.agentConfig.name ?? 'unset')}`;\n\n if (this.config.customer) {\n params += `&customer_id=${encodeURIComponent(this.config.customer.dataSetId)}`;\n params += `&customer_name=${encodeURIComponent(this.config.customer.name)}`;\n }\n\n return params;\n }\n\n public abstract finalResponse(interactionId: string, agentInteraction: Interaction, author: string, subAgentId?: string): void;\n\n public openConnection(sessionId?: string): Promise<string> {\n throw \"Not implemented\"\n }\n\n public abstract closeConnection(closeTurn: boolean): Promise<SendMessageResponse | null>;\n\n protected async Error(errorMessage: string | undefined = undefined) {\n console.error(\"Stream error: \", errorMessage);\n await this.eventBusService.gatewayEmitStreamError(errorMessage ?? \"\");\n }\n\n private pendingCurrentMessage: Interaction | null = null;\n private lastCurrentMessageUpdate: number = 0;\n private static readonly CURRENT_MSG_THROTTLE_MS = 20;\n\n\n public hasServerSessionId(): boolean {\n return this.server_session_id != null && this.server_session_id != undefined;\n }\n\n runningRequests = new Map<string, Promise<Artifact | null>>();\n\n public async asyncLoadArtifact(artifactId: string): Promise<Artifact | null> {\n let response: Promise<Artifact | null> | null = null;\n const runningPromise = this.runningRequests.get(artifactId);\n if (runningPromise) {\n console.warn(\"GOT A running promise\", artifactId);\n response = runningPromise\n }\n else {\n response = this.artifactService.getArtifact(artifactId);\n\n this.runningRequests.set(artifactId, response)\n }\n\n try {\n const realResponse = await response;\n return realResponse;\n }\n catch (error: any) {\n console.error(\"Error awating on HTML promise\", error.toString())\n return null;\n }\n finally {\n this.runningRequests.delete(artifactId);\n }\n }\n\n protected processComands(serverEvent: ServerEvent) {\n switch (serverEvent.command) {\n case \"open_turn\":\n console.warn(\"[Stack:] author:\", serverEvent.author)\n this.localOpen(serverEvent.interactionId, serverEvent.author);\n break;\n case \"ignore\":\n return true;\n }\n\n return false;\n }\n\n lastToolInteraction: string = \"\"\n\n protected subAgentInteractions: Map<string, Interaction> = new Map();\n protected subAgentInteractionServices: Map<string, InteractionService> = new Map();\n\n protected getOrCreateSubAgentInteraction(subAgentId: string, interactionId: string, subAgentName?: string): { interaction: Interaction; service: InteractionService } {\n let interaction = this.subAgentInteractions.get(subAgentId);\n let service = this.subAgentInteractionServices.get(subAgentId);\n\n if (!interaction || !service) {\n interaction = {\n created: new Date(),\n interactionId: interactionId,\n artifactData: [],\n partial: true,\n turn_complete: false,\n parts: [],\n version: 0,\n functionMap: new Map(),\n interactionQuestion: subAgentName ?? subAgentId,\n };\n service = new InteractionService(interaction, this.eventBusService);\n this.subAgentInteractions.set(subAgentId, interaction);\n this.subAgentInteractionServices.set(subAgentId, service);\n\n }\n\n return { interaction, service };\n }\n\n protected handleSubAgentEvent(serverEvent: ServerEvent) {\n const subAgentId = serverEvent.subAgentId!;\n const { service } = this.getOrCreateSubAgentInteraction(subAgentId, serverEvent.interactionId, serverEvent.subAgentName);\n\n if (serverEvent.parts && serverEvent.parts.length > 0) {\n for (const part of serverEvent.parts) {\n if (part.toolDetails) {\n this.localEmitToolEvent({ ...part.toolDetails, subAgentId });\n continue;\n }\n }\n }\n\n const mergeResult = service.merge(serverEvent);\n if (!mergeResult) return;\n\n const isComplete = serverEvent.turn_complete ?? false;\n\n this.sessionState.setSubAgentMessage(subAgentId, mergeResult.updatedInteraction, serverEvent.subAgentName);\n\n if (isComplete) {\n this.sessionState.completeSubAgent(subAgentId);\n }\n }\n\n public async Message(event: MessageEvent | ServerEvent) {\n try {\n let serverEvent: ServerEvent;\n\n if (typeof (event) == \"object\" && Object.keys(event).includes(\"mimeType\")) {\n serverEvent = event as ServerEvent;\n }\n else {\n console.error(\"Uknown message type\", event)\n return;\n }\n\n if (serverEvent.subAgentId) {\n this.handleSubAgentEvent(serverEvent);\n return;\n }\n\n if (serverEvent.serverError) {\n console.error(\"Stream error: \", serverEvent.serverError);\n }\n\n if (serverEvent.endMessageData) {\n this.eventBusService.gatewayEmitEndMessageData(serverEvent.endMessageData);\n }\n\n if (serverEvent) {\n if (serverEvent.llmArtifacts && serverEvent.llmArtifacts.length > 0) {\n for (const llmArtifact of serverEvent.llmArtifacts) {\n const newArtifact = llmArtifact.toArtifact();\n this.artifactService.addToCache(newArtifact);\n this.eventBusService.artifactEmitGenerated(newArtifact);\n }\n }\n\n if (serverEvent.parts && serverEvent.parts.length > 0) {\n for (const part of serverEvent.parts) {\n if (part.toolDetails) {\n this.localEmitToolEvent(part.toolDetails);\n continue;\n }\n }\n }\n\n const mergedInteraction = this.updateMap(serverEvent);\n if (!mergedInteraction) {\n console.warn({\n message: \"No updated interaction\",\n type: \"warning\"\n })\n console.error(\"No updated interaction\");\n return;\n }\n\n this.localEmitMessage(mergedInteraction.updatedInteraction, mergedInteraction);\n\n if (serverEvent.turn_complete) {\n this.turnComplete(serverEvent.interactionId, mergedInteraction.updatedInteraction, serverEvent.author, serverEvent.subAgentId);\n }\n\n if (serverEvent.asyncFinalResponse) {\n serverEvent.turn_complete = true;\n mergedInteraction.updatedInteraction.turn_complete == true;\n this.finalResponse(serverEvent.interactionId, mergedInteraction.updatedInteraction, serverEvent.author, serverEvent.subAgentId);\n }\n\n const artifactsIds = serverEvent.artifactsDelta;\n if (artifactsIds) {\n artifactsIds.forEach((id) => {\n\n const artifactDatas = mergedInteraction.updatedInteraction.artifactData.filter((a) => a.id == id);\n let artifactData: Partial<Artifact> | null = null;\n if (artifactDatas && artifactDatas.length > 0) {\n artifactData = artifactDatas[0]\n artifactData.loadingPromise = this.asyncLoadArtifact(id)\n .then((a) => {\n if (a === null) {\n console.error(\"Error trying to load artifact id:\", artifactData?.id, \"Artifact is null\");\n }\n else {\n this.eventBusService.artifactEmitGenerated(a);\n }\n return a;\n })\n .catch((error: any) => {\n console.error(\"Error trying to load artifact id:\", artifactData?.id, error.toString())\n return null;\n })\n\n\n }\n });\n }\n }\n }\n catch (error: any) {\n if (this.getCurrentInteractionId()) {\n const errorEvent = ServerEvent.createErrorEvent(\"OnMessage error: \" + error.toString(), this.getCurrentInteractionId() ?? 'Empty Current')\n const updatedInteraction = this.updateMap(errorEvent);\n console.error(\"Error event: \", JSON.stringify(errorEvent, undefined, 4));\n if (!updatedInteraction) {\n console.error(\"Error event, could not update interaction: \", JSON.stringify(errorEvent, undefined, 4));\n return;\n }\n\n this.localEmitMessage(updatedInteraction.updatedInteraction);\n }\n }\n }\n\n public hasOneCompleteInteraction() {\n return this.interactionsMap.size > 0 && this.interactionsMap.values().next().value?.turn_complete === true;\n }\n\n protected localEmitToolEvent(toolDetails: ToolEventDetails) {\n\n this.sessionState.setLastToolEvent(toolDetails);\n this.eventBusService.gatewayEmitToolEvent(toolDetails.eventName, toolDetails.eventData, toolDetails.sessionId);\n }\n\n protected registerInteractionCallId(interactionId: string, options?: GatewaySendMessageOptions) {\n if (options?.callId) {\n this.interactionCallIds.set(interactionId, options.callId);\n }\n }\n\n protected localEmitFirstToken(interactionId: string) {\n this.eventBusService.gatewayEmitFirstToken({\n interactionId,\n callId: this.interactionCallIds.get(interactionId),\n });\n }\n\n private lastThorttledTimeout: NodeJS.Timeout | null = null;\n\n private doEmitMessage(message: Interaction, now: number, mergeResult?: MergeResult) {\n this.sessionState.setCurrentMessage(message);\n this.lastCurrentMessageUpdate = now;\n this.pendingCurrentMessage = null;\n this.eventBusService.gatewayEmitMessage(message, mergeResult);\n }\n protected localEmitMessage(message: Interaction, mergeResult?: MergeResult) {\n const now = new Date().getTime();\n const elapsed = now - this.lastCurrentMessageUpdate;\n\n // The throttle exists ONLY to coalesce the partial-streaming firehose\n // (text/reasoning deltas arrive dozens of times per second). Non-partial\n // events are rare and terminal-ish — a completed tool result, the final\n // consolidated text, the turn-complete signal — so emit them\n // immediately, never via the trailing setTimeout. Deferring a\n // non-partial emit is exactly what let a stale trailing fire land AFTER\n // the turn was committed and duplicate the message; it also dodges the\n // stale-mergeResult captured by the trailing closure. Each merged\n // Interaction is a cumulative snapshot, so flushing now (and dropping\n // any pending partial timer below) loses no content.\n const emitImmediately =\n message.partial === false ||\n elapsed >= AgentGatewayService.CURRENT_MSG_THROTTLE_MS;\n\n if (emitImmediately) {\n // Cancel any pending trailing emit before flushing immediately — otherwise a\n // stale closure scheduled by a previous throttled call can still fire and\n // re-emit using its captured (now-old) mergeResult, which any subscriber that\n // treats updatedParts as a delta would double-apply.\n if (this.lastThorttledTimeout) {\n clearTimeout(this.lastThorttledTimeout);\n this.lastThorttledTimeout = null;\n }\n this.doEmitMessage(message, now, mergeResult)\n this.pendingCurrentMessage = null;\n }\n else {\n this.pendingCurrentMessage = message;\n if (this.lastThorttledTimeout) {\n clearTimeout(this.lastThorttledTimeout);\n }\n this.lastThorttledTimeout = setTimeout(() => {\n // Strict `>` so we never re-emit a version that the immediate-emit path\n // already flushed (equal versions = same state already on subscribers).\n if (this.pendingCurrentMessage && (this.pendingCurrentMessage?.version ?? 0) > (this.sessionState.currentMessage?.version ?? 0)) {\n this.doEmitMessage(this.pendingCurrentMessage, now, mergeResult)\n this.lastThorttledTimeout = null;\n }\n }, AgentGatewayService.CURRENT_MSG_THROTTLE_MS * 2);\n }\n }\n\n protected localOpen(interactionId: string, _author: string): void {\n this.sessionState.setTurnOpen(true);\n this.eventBusService.gatewayEmitTurnOpen(interactionId ?? '');\n }\n\n /**\n * Drop any throttled `currentMessage` emit still queued by\n * `localEmitMessage`. The throttle's trailing edge is a `setTimeout` that\n * calls `setCurrentMessage(...)`; if it fires *after* the turn has been\n * committed (`setNewMessage` moved the interaction into `messages` and\n * nulled `currentMessage`), it re-publishes the now-committed interaction\n * as the live message — so the chat renders the turn twice: once in\n * history (`MessageAgent` with `onGoing=false`, which drops Thought parts)\n * and once as the live `currentMessage` (`onGoing=true`, which keeps them).\n * That is the duplicated-bubble bug (the two copies even look different —\n * only the live one shows the \"thought\" strip). Call this on turn commit.\n */\n private cancelPendingCurrentMessage(): void {\n if (this.lastThorttledTimeout) {\n clearTimeout(this.lastThorttledTimeout);\n this.lastThorttledTimeout = null;\n }\n this.pendingCurrentMessage = null;\n }\n\n protected async turnComplete(interactionId: string, agentInteraction: Interaction, _author: string, subAgentId?: string): Promise<void> {\n // Must run before setNewMessage: the trailing throttle timer would\n // otherwise re-set `currentMessage` to this just-committed interaction\n // and duplicate it on screen. See cancelPendingCurrentMessage.\n this.cancelPendingCurrentMessage();\n this.sessionState.setNewMessage(agentInteraction);\n this.eventBusService.gatewayEmitTurnComplete(interactionId, agentInteraction)\n this.interactionCallIds.delete(interactionId);\n\n this.sessionState.setLastToolEvent(null);\n this.localEmitToolEvent({\n eventName: 'todolistUpdated',\n eventData: '',\n subAgentId: subAgentId\n })\n\n this.sessionState.setTurnOpen(false);\n }\n\n protected lastPingStatus: boolean = false;\n protected async handlePing(): Promise<boolean> {\n if (Date.now() - this.lastPing.getTime() > THRESHOLD_PING) {\n\n const ping = await this.ping();\n if (!ping) {\n this.lastPingStatus = false;\n return false;\n }\n this.lastPing = new Date();\n this.lastPingStatus = true;\n return true;\n }\n this.lastPingStatus = true;\n return true;\n }\n\n public async sendMessage(message: ClientMessage, options?: GatewaySendMessageOptions): Promise<SendMessageResponse> {\n let messageNumber = this.getInteractions().length;\n let totalTimer = InteractionPartUtils.createWaiting(true, true, \"Overall\", new Date());\n this.sendStatusMessage(message.data, [totalTimer], messageNumber.toString() + \"1\");\n\n try {\n const { promptAsString, json } = this.sessionState.onRenderPrompt ? this.sessionState.onRenderPrompt(message.data) : { promptAsString: message.data, json: undefined };\n\n if (this.sessionState.onRenderPrompt) {\n message.data = json;\n message.friendlyMessage = promptAsString;\n }\n const sendResponse = await this.sendMessageInternal(message, options)\n\n const prompt = PromptUtils.createPrompt(promptAsString ?? '', json?.toString() ?? {});\n this.storageService.storePrompt(prompt);\n\n const startingPart = InteractionPartUtils.fromText(\"Planejando próximos passos\")\n this.sendStatusMessage(message.data, [totalTimer, startingPart], messageNumber.toString() + \"1\");\n\n if (!sendResponse?.success) {\n this.eventBusService.ChatEmitMessageError(sendResponse?.error ?? '');\n }\n else {\n this.eventBusService.ChatEmitMessageSent(message.data, sendResponse.interaction);\n }\n\n // this.sendStatusMessage(message.data, [totalTimer], messageNumber.toString() + \"2\");\n\n return sendResponse;\n }\n catch (error) {\n this.eventBusService.ChatEmitMessageError(error?.toString() ?? '');\n return {\n success: false,\n interaction: {\n artifactData: [],\n created: new Date(),\n interactionId: \"\",\n partial: false,\n parts: [InteractionPartUtils.fromError(error?.toString() ?? \"\")],\n version: 0\n }\n }\n }\n finally {\n this.clearStatus();\n }\n }\n\n public abstract startStream(sendStartMessage?: boolean): Promise<StartStreamResponse>;\n public abstract stopStream(): void;\n public abstract sendMessageInternal(message: ClientMessage, options?: GatewaySendMessageOptions): Promise<SendMessageResponse>;\n public abstract isSuspended(): boolean;\n public abstract suspend(): Promise<boolean>;\n abstract reset(user: User, config?: AgentContext): void;\n\n public async check(): Promise<boolean> {\n return true;\n }\n\n public startAndForget() {\n }\n\n\n public forceReceiveMessage(serverEvent: ServerEvent) {\n serverEvent.partial = true;\n serverEvent.turn_complete = false;\n serverEvent.asyncFinalResponse = false;\n serverEvent.interactionId = serverEvent.interactionId;\n this.eventBusService.gatewayEmitTurnOpen(serverEvent.interactionId);\n this.Message(serverEvent);\n }\n\n public sendStatusMessage(question: string, parts: InteractionPart[], interactionId: string) {\n let interactionStatus: Interaction;\n if (this.currentIS?.interaction?.turn_complete === false) {\n interactionStatus = _.cloneDeep(this.currentIS.interaction);\n interactionStatus.parts.push(...parts);\n }\n else {\n interactionStatus = {\n interactionId: \"tmp\" + interactionId,\n created: new Date(),\n partial: true,\n turn_complete: false,\n version: 0,\n parts: parts,\n interactionQuestion: question,\n artifactData: []\n }\n }\n\n this.localEmitMessage(interactionStatus);\n }\n\n public clearStatus() {\n // let interactionStatus: Interaction;\n // interactionStatus = {\n // interactionId: \"tmp1\",\n // created: new Date(),\n // partial: false,\n // turn_complete: true,\n // version: 0,\n // parts: [],\n // interactionQuestion: question,\n // artifactData: []\n // }\n // this.turnComplete(\"tmp1\", interactionStatus, \"main\")\n // this.sessionState.setCurrentMessage(null);\n }\n\n public async ping(): Promise<boolean> {\n try {\n const response = await fetch(this.base_url + \"/ping\");\n const json: any = await response.json();\n return response.ok == true && json?.debug?.id != undefined;\n }\n catch (error) {\n console.error(\"Error pinging server\", error);\n return false;\n }\n }\n\n protected getNewInteractionId(): string {\n const now = new Date()\n const date_formatted = formatDate(now, \"MMM_dd_HH_mm_ss\");\n return `${this.msg_order}_${date_formatted}`\n }\n\n}","import { ServerEvent } from \"@lib/models/ServerEvent\";\nimport { getRandomUUID } from \"@lib/utils/envUtils\";\nimport { TypedJSON } from \"typedjson\";\nimport { type InteractionStatistics, LlmEvent, PartType, StreamingFunctionCallUpdateContent, StreamingResponse, StreamingTextContent, StreamingReasoningContent, TextContent } from \"@lib/models/semanticKernelModel/models\";\nimport { createStreamingResponseSerializer } from \"@lib/models/semanticKernelModel/serializer\";\nimport { EventType, ChatAction } from \"@lib/models/enums\";\nimport { type IWebSocketConnection, type IMessage, type IMessageBase } from \"./webSocketConnection\";\n\nexport const APPLICATION_CLOSED_CODE = 4001;\n/**\n * The server uses this WS close code when rejecting a duplicate attachment for the\n * same sessionId (single-attach policy in InteractionRunRegistry). The user already\n * has another WS connected for this session — usually another browser tab — so\n * silently auto-reconnecting would just bounce the rejection forever. Surface the\n * close to the consumer instead.\n */\nexport const SESSION_ALREADY_ATTACHED_CODE = 4002;\n\nconst SLIDING_WINDOW_SIZE_SECONDS = 4;\nconst TOKEN_SIZE_AVG = 3;\n\n// Reconnect tuning. The server (Envision.AIBI.WSServer SocketController) supports\n// resuming an existing session when the same sessionId is passed back in the\n// `ws/connect/{sessionId}` URL plus `?lastSeq=N` to replay everything emitted\n// while we were offline, so a transient network blip becomes invisible to the\n// user provided we re-open quickly enough.\n//\n// Scope: this in-class loop is for SHORT, TRANSIENT drops only — a quick wifi\n// blip, a momentary upstream timeout. Long-running retries (server restart,\n// extended outage) are owned by SessionStateManagerService.processRetryLoop,\n// which has its own backoff and lifecycle policy. After RECONNECT_MAX_ATTEMPTS\n// we give up here and fire onClose so the outer state manager can take over,\n// rather than stacking two retry loops that race and leak WebSocket instances.\nconst RECONNECT_INITIAL_DELAY_MS = 500;\nconst RECONNECT_MAX_DELAY_MS = 30_000;\nconst RECONNECT_BACKOFF_FACTOR = 2;\n// ±20% jitter to avoid thundering-herd reconnects when many clients drop together.\nconst RECONNECT_JITTER = 0.2;\n// 5 attempts with the configured backoff sums to ~15.5s (0.5+1+2+4+8). After\n// that, hand off to SessionStateManagerService rather than continuing to retry\n// in here forever.\nconst RECONNECT_MAX_ATTEMPTS = 2;\n\nexport class WebSocketConnecionV2 implements IWebSocketConnection {\n ws: WebSocket | null = null;\n stats: InteractionStatistics;\n baseUrl: string;\n /**\n * Optional callback that returns the current JWT. We re-evaluate it on every connect/reconnect\n * so that a refreshed token is picked up automatically. Browsers can't set the Authorization\n * header on the WebSocket handshake, so we pass the JWT via the ?access_token= query string,\n * which the .NET JwtBearer events handler reads in Program.cs.\n */\n getToken?: () => string | undefined;\n\n onEvent?: (event: MessageEvent | ServerEvent) => Promise<void>;\n onError?: (error: string) => void;\n onOpen?: () => void;\n onFirstToken?: (interactionId: string) => void;\n onSuspended?: () => void;\n onPong?: (sessionId: string) => void;\n onClose?: (code: number, reason: string) => void;\n /** Fired when an unexpected close triggers a reconnect attempt. */\n onReconnecting?: (attempt: number, delayMs: number) => void;\n /** Fired the first time the socket reopens after an unexpected close. */\n onReconnected?: (sessionId: string) => void;\n /**\n * Fired when the server signals that we lost streaming events on resume — our\n * `lastSeq` fell off the end of the in-memory replay buffer. Consumers should\n * reset partial-streaming UI for this session and rely on persisted history.\n */\n onRewindLost?: (sessionId: string, resumingFromSeq: number) => void;\n sessionId?: string\n onNewPacket?: (stats: InteractionStatistics) => void;\n /**\n * Stats can fire dozens of times per second during streaming. We\n * coalesce to a fixed cadence so subscribers see steady,\n * digestible updates instead of a per-packet firehose — the\n * latter caused a \"Maximum update depth exceeded\" cascade in\n * heavy v2 surfaces (RunProgressPanelV2 + StreamStatistics +\n * ChatTranscript all subscribed to `statistics` and re-rendered\n * on every packet, with their useEffect-driven setStates pushing\n * React's nested-update counter past its threshold).\n */\n private statsFlushTimer: ReturnType<typeof setTimeout> | null = null;\n private statsLastFlushed: number = 0;\n private readonly STATS_FLUSH_MS = 120;\n monitorInterval: NodeJS.Timeout | null = null;\n streamingResponseSerializer: TypedJSON<StreamingResponse>;\n events: [number, number][];\n\n lastActivity: number;\n pingPongStack: number[];\n firstTokenInteractions: Set<string>;\n\n /** Last sessionId we successfully had — used to resume on reconnect. */\n private lastKnownSessionId?: string;\n /** True when the consumer called `disconnect()` — suppresses auto-reconnect. */\n private intentionalDisconnect: boolean = false;\n /** Number of reconnect attempts since the last clean open. */\n private reconnectAttempts: number = 0;\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n /** True while we are in the middle of an unexpected-close → reconnect cycle. */\n private isReconnecting: boolean = false;\n /** Internal flag set by `scheduleReconnect` so `connect()` does not reset the backoff state. */\n private _internalReconnect: boolean = false;\n /**\n * Highest server-assigned `seq` we have observed and processed. The next\n * reconnect appends `?lastSeq={lastSeq}` so the server can replay anything\n * we missed from the InteractionRun's in-memory buffer. -1 means \"haven't\n * seen any sequenced events yet\" (fresh connection).\n */\n private lastSeq: number = -1;\n /**\n * True once *any* socket on this instance has received at least one packet.\n * Used by `onclose` to distinguish a real mid-stream drop (we had a working\n * channel) from a connect attempt that never produced traffic (server down,\n * unreachable, etc.). The inner reconnect loop is only meant for the former\n * — fresh-connect failures should be handed straight to the outer\n * SessionStateManagerService.processRetryLoop instead of being retried\n * twice in here. Sticky for the lifetime of this connection instance so\n * that internal resume attempts keep their full inner-loop budget even\n * when a replacement socket fails before delivering its first message.\n * Cleared by `disconnect()`.\n */\n private hasEverReceivedPacket: boolean = false;\n\n constructor(baseUrl: string = 'ws://localhost:8000', getToken?: () => string | undefined) {\n this.baseUrl = baseUrl;\n this.getToken = getToken;\n\n this.pingPongStack = [];\n this.events = [];\n this.firstTokenInteractions = new Set();\n\n this.streamingResponseSerializer = createStreamingResponseSerializer();\n\n console.log(\"SOCKET INSTACE\", getRandomUUID())\n\n this.stats = {\n eventCount: 0,\n unknonwCount: 0,\n buffer: [],\n startTime: new Date(),\n elapsed: 0,\n unparsedCount: 0,\n totalTransfered: 0,\n tokensPerSecond: 0\n }\n\n this.lastActivity = new Date().getTime();\n }\n\n /**\n * Connect to the WebSocket endpoint\n */\n connect(sessionId?: string): Promise<string> {\n // Build WebSocket URL\n return new Promise<string>(async (resolve, reject) => {\n // Fresh user-initiated connect — clear any pending auto-reconnect state.\n // (`scheduleReconnect` sets `_internalReconnect` so we keep the\n // attempt counter and the `isReconnecting` flag for backoff/UX.)\n this.intentionalDisconnect = false;\n const isResumeAttempt = this._internalReconnect;\n if (!isResumeAttempt) {\n this.cancelPendingReconnect();\n this.isReconnecting = false;\n this.reconnectAttempts = 0;\n // Fresh user-initiated connect — discard any stale resume cursor\n // so we don't try to resume against an unrelated session.\n this.lastSeq = -1;\n }\n this._internalReconnect = false;\n\n const token = this.getToken?.();\n const queryParts: string[] = [];\n if (token) queryParts.push(`access_token=${encodeURIComponent(token)}`);\n // Only attach lastSeq when we are actually resuming a known session,\n // otherwise the server has nothing to replay from.\n if (sessionId && this.lastSeq >= 0) {\n queryParts.push(`lastSeq=${this.lastSeq}`);\n }\n const querySuffix = queryParts.length > 0 ? `?${queryParts.join('&')}` : '';\n // Hosts pass `baseUrl` as the HTTP origin of the backend\n // (`AgentGatewayService.ping()` calls fetch() against it). The\n // WebSocket constructor only accepts ws:// or wss://, so convert\n // here. Empty baseUrl leaves the relative URL alone — the browser\n // will resolve it against the current page (useful when a reverse\n // proxy fronts both schemes on the same origin).\n const wsBase = this.baseUrl\n .replace(/^http:\\/\\//, 'ws://')\n .replace(/^https:\\/\\//, 'wss://');\n const wsUrl = `${wsBase}/ws/connect/${sessionId ?? ''}${querySuffix}`;\n // Avoid logging the access_token query string.\n const safeUrl = `${wsBase}/ws/connect/${sessionId ?? ''}` +\n (isResumeAttempt && sessionId && this.lastSeq >= 0\n ? ` (resume lastSeq=${this.lastSeq})`\n : '');\n console.log(\"Connecting to \", safeUrl);\n // Tear down any lingering previous WS reference before allocating a\n // new one. Both the inner reconnect loop and external callers\n // (SessionStateManagerService) can race here; without this the\n // previous WebSocket leaks (handlers detached but the underlying\n // connection never closed).\n if (this.ws) {\n this.ws.onopen = null;\n this.ws.onmessage = null;\n this.ws.onerror = null;\n this.ws.onclose = null;\n try { this.ws.close(); } catch { /* already closing */ }\n this.ws = null;\n }\n this.ws = new WebSocket(wsUrl);\n\n console.log('[WebSocket] Connecting to:', `${wsBase}/ws/connect/${sessionId ?? ''}`);\n\n // Per-socket flag: did THIS socket ever deliver a message? Used in\n // onclose to gate `scheduleReconnect`. Captured in this closure so\n // each new WebSocket starts fresh even though reused connect() calls\n // overwrite `this.ws`.\n let socketReceivedMessage = false;\n\n this.ws.onopen = () => {\n console.log('[WebSocket] Connected');\n const wasReconnecting = this.isReconnecting;\n this.isReconnecting = false;\n this.reconnectAttempts = 0;\n this.pingPongStack.push(new Date().getTime())\n this.ping();\n this.monitor();\n if (this.onOpen)\n this.onOpen()\n if (wasReconnecting && this.onReconnected) {\n // sessionId may not be set yet (we get it back in the Pong),\n // so prefer the URL-supplied one we just resumed with.\n this.onReconnected(sessionId ?? this.lastKnownSessionId ?? '');\n }\n };\n\n this.ws.onmessage = (event) => {\n try {\n this.lastActivity = new Date().getTime();\n const streamingResponse = this.streamingResponseSerializer.parse(event.data);\n if (!streamingResponse)\n throw \"Error parsing event JSON\";\n\n const handleResult = this.handleMessage(streamingResponse, event.data);\n if (!socketReceivedMessage && handleResult?.timestamp) {\n socketReceivedMessage = true;\n this.hasEverReceivedPacket = true;\n }\n\n } catch (error) {\n console.error('[WebSocket] Error parsing message:', error);\n }\n };\n\n this.ws.onerror = (error) => {\n console.error('[WebSocket] Error:', error);\n // Do not reject here — `onclose` always fires after `onerror`\n // and is where we decide between reconnect and surfacing the\n // close to the consumer. Rejecting twice would be a no-op but\n // also blocks the reconnect path during initial connect.\n if (this.onError) this.onError('WebSocket error');\n };\n\n this.ws.onclose = (event) => {\n console.log('[WebSocket] Closed:', event.code, event.reason);\n // Stop the heartbeat for the dead socket — a new monitor will\n // be started by `onopen` on the replacement socket.\n if (this.monitorInterval) {\n clearInterval(this.monitorInterval);\n this.monitorInterval = null;\n }\n this.pingPongStack = [];\n\n const closedSessionId = this.sessionId ?? this.lastKnownSessionId;\n this.sessionId = undefined;\n\n // Only let the inner retry loop engage when we have evidence\n // of a real working connection — either THIS socket received a\n // packet (a true mid-stream drop) or some prior socket on this\n // instance did (an internal resume attempt that hasn't yet\n // re-delivered traffic). Without this gate, every failed\n // outer-manager retry triggers two extra inner attempts and\n // the two retry loops stack while the server is down.\n const eligibleForInnerRetry =\n socketReceivedMessage || this.hasEverReceivedPacket;\n\n if (eligibleForInnerRetry && this.shouldAttemptReconnect(event.code)) {\n this.scheduleReconnect(closedSessionId, event.code, event.reason);\n return;\n }\n\n // Make sure inner-loop bookkeeping does not leak across into\n // the outer manager's next attempt.\n this.isReconnecting = false;\n this.reconnectAttempts = 0;\n\n if (this.onClose)\n this.onClose(event.code, event.reason)\n };\n\n let attempts = 0;\n this.sessionId = undefined;\n while (!this.sessionId && attempts < 30) {\n console.log(\"Aguardando session Id\");\n await this.sleep(400);\n attempts++;\n }\n\n if (this.sessionId) {\n console.log(\"SUCCESS - GOT SESSION ID\", this.sessionId);\n this.lastKnownSessionId = this.sessionId;\n resolve(this.sessionId);\n }\n else {\n reject(\"After 12 seconds no session id was generated\");\n }\n\n });\n }\n\n /**\n * Returns true when the close code is something we believe a fresh connect\n * (with the same sessionId) can recover from. We deliberately do NOT retry\n * on:\n * - 1000 normal closure\n * - 1008 policy violation (auth rejected)\n * - 4001 our own intentional disconnect\n * - 4000-4099 reserved for app-level fatal codes from the server\n */\n private shouldAttemptReconnect(code: number): boolean {\n if (this.intentionalDisconnect) return false;\n if (code === APPLICATION_CLOSED_CODE) return false;\n if (code === SESSION_ALREADY_ATTACHED_CODE) return false;\n if (code === 1000) return false;\n if (code === 1008) return false;\n // 1006 (abnormal), 1011 (server error), 1012/1013 (restart/try again),\n // 1001 (going away) are all worth a retry.\n return true;\n }\n\n private cancelPendingReconnect(): void {\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n }\n\n private computeBackoffDelay(): number {\n const exponential = RECONNECT_INITIAL_DELAY_MS *\n Math.pow(RECONNECT_BACKOFF_FACTOR, this.reconnectAttempts);\n const capped = Math.min(exponential, RECONNECT_MAX_DELAY_MS);\n const jitter = capped * RECONNECT_JITTER * (Math.random() * 2 - 1);\n return Math.max(0, Math.round(capped + jitter));\n }\n\n private scheduleReconnect(sessionIdToResume: string | undefined, code: number, reason: string): void {\n if (this.intentionalDisconnect) return;\n\n // Inner loop is for short, transient drops. Once we've exhausted our\n // attempts, give up and surface onClose so the outer\n // SessionStateManagerService.processRetryLoop can take over with its\n // own (longer-running, lower-frequency) backoff. Without this cap the\n // two retry loops stack and race forever — that's the \"keeps trying\n // unsuccessfully after server restart\" symptom.\n if (this.reconnectAttempts >= RECONNECT_MAX_ATTEMPTS) {\n console.warn(\n `[WebSocket] Reconnect exhausted after ${this.reconnectAttempts} attempts ` +\n `(last code=${code}, reason=\"${reason}\"). Handing off to outer state manager.`\n );\n this.isReconnecting = false;\n this.reconnectAttempts = 0;\n this.cancelPendingReconnect();\n // Surface the close so AgentGatewayWSAsync flips connectionStatus\n // to Disconnected and SessionStateManagerService.processRetryLoop\n // picks up retry duty on its own cadence.\n this.onClose?.(code, reason);\n return;\n }\n\n this.isReconnecting = true;\n this.reconnectAttempts += 1;\n const delay = this.computeBackoffDelay();\n console.warn(\n `[WebSocket] Unexpected close (code=${code}, reason=\"${reason}\"). ` +\n `Reconnect attempt #${this.reconnectAttempts}/${RECONNECT_MAX_ATTEMPTS} in ${delay}ms ` +\n `(resume sessionId=${sessionIdToResume ?? 'none'}).`\n );\n this.onReconnecting?.(this.reconnectAttempts, delay);\n\n this.cancelPendingReconnect();\n this.reconnectTimer = setTimeout(async () => {\n this.reconnectTimer = null;\n if (this.intentionalDisconnect) return;\n try {\n // Detach handlers from the dead socket reference to be safe.\n if (this.ws) {\n this.ws.onopen = null;\n this.ws.onmessage = null;\n this.ws.onerror = null;\n this.ws.onclose = null;\n this.ws = null;\n }\n this._internalReconnect = true;\n await this.connect(sessionIdToResume);\n } catch (err) {\n console.error('[WebSocket] Reconnect attempt failed:', err);\n // `connect()` reset our reconnect counters at the top and the\n // socket it created has already fired its own onclose, which\n // will have re-scheduled another attempt via this same path.\n // Nothing more to do here.\n }\n }, delay);\n }\n\n async sleep(ms: number) {\n return new Promise(resolve => setTimeout(resolve, ms));\n }\n\n /**\n * Handle incoming messages from server\n */\n handleMessage(streamingResponse: StreamingResponse, rawData: string) {\n // Track the highest server-assigned sequence number we have processed.\n // The server populates `seq` on every event coming out of an InteractionRun;\n // we ship it back as `?lastSeq=N` on reconnect so missed events are replayed.\n if (typeof streamingResponse.seq === 'number' && streamingResponse.seq > this.lastSeq) {\n this.lastSeq = streamingResponse.seq;\n }\n\n switch (streamingResponse.type) {\n case 'Pong':\n this.sessionId = streamingResponse.sessionId;\n this.lastKnownSessionId = streamingResponse.sessionId ?? this.lastKnownSessionId;\n\n if (!streamingResponse.sessionId) {\n console.error(\"Pong response has no SESSION ID\")\n return;\n }\n\n // Server-side WS auto-refresh: when the WS upgrade rode an expired\n // (or near-expiry) JWT, the server mints a fresh one and piggybacks\n // it on the next few Pong frames. Mirror it into the stored user so\n // the global fetch interceptor at packages/dashboard-app/.../EnvisionAuthProvider.tsx\n // stops sending the stale token. The token is delivered N times for\n // listener-readiness redundancy, so dedupe on equality.\n if (streamingResponse.accessToken) {\n this.persistRefreshedAccessToken(streamingResponse.accessToken);\n }\n\n // Heartbeat response\n const stackPop = this.pingPongStack.pop();\n if (!stackPop) {\n console.warn(\"Ping pong order broke, on Pong receive\");\n }\n\n if (this.onPong) {\n this.onPong(streamingResponse.sessionId);\n }\n break;\n case 'Suspended':\n // Heartbeat response\n if (this.onSuspended)\n this.onSuspended()\n break;\n\n case 'Event':\n //Do nothing we always process the event data if available\n break;\n case 'RewindLost':\n // The server's in-memory replay buffer didn't reach back as far as\n // our `lastSeq`. Reset our cursor to the new starting seq the server\n // is about to deliver from, and let the consumer purge any partial\n // streaming UI for this session.\n console.warn(\n `[WebSocket] RewindLost: lost events on resume, resuming from seq=${streamingResponse.seq}`\n );\n if (typeof streamingResponse.seq === 'number') {\n // Reset to one BELOW the new starting seq so that as we receive\n // the next event (the one with seq === resumingFromSeq) it is\n // not skipped by our `> lastSeq` guard above.\n this.lastSeq = streamingResponse.seq - 1;\n }\n if (this.onRewindLost && streamingResponse.sessionId) {\n this.onRewindLost(streamingResponse.sessionId, streamingResponse.seq ?? -1);\n }\n break;\n default:\n console.warn('[WebSocket] Unknown message type:', streamingResponse.type);\n }\n\n if (streamingResponse.partialEvent) {\n const partialEvent = streamingResponse.partialEvent;\n this.emitFirstToken(partialEvent?.iteractionId);\n const event = new LlmEvent();\n event.author = \"main\";\n event.streamingParts = streamingResponse.partialEvent.streamingParts;\n if (streamingResponse.partialEvent.partialEventType) {\n event.eventType = streamingResponse.partialEvent.partialEventType;\n }\n else {\n event.eventType = partialEvent.functionName ?\n {\n fullName: PartType.StreamingFunctionCallUpdateContent,\n type: EventType.PartialFunctionCall\n }\n :\n partialEvent.partialReasoning ?\n {\n fullName: PartType.StreamingReasoningContent,\n type: EventType.Thought\n }\n :\n {\n fullName: PartType.StreamingTextContent,\n type: EventType.Text\n };\n }\n\n event.interactionId = partialEvent?.iteractionId ?? '';\n event.mimeType = \"text/plain\";\n event.partial = true;\n if (event.eventType.type == EventType.PartialFunctionCall) {\n var callPart = new StreamingFunctionCallUpdateContent();\n callPart.choiceIndex = 0;\n callPart.callId = partialEvent.functionCallId;\n callPart.arguments = partialEvent.partialText;\n callPart.name = partialEvent.functionName;\n event.content = {\n items: [callPart],\n role: {\n label: \"Assistant\"\n }\n }\n }\n else if (event.eventType.type == EventType.Text) {\n // Wire wrapper distinguishes streaming vs final text — both map\n // to EventType.Text in the domain (the `partial` boolean carries\n // the streaming distinction downstream).\n if (event.eventType.fullName == PartType.StreamingTextContent) {\n var streamTextPart = new StreamingTextContent();\n streamTextPart.text = partialEvent.partialText;\n event.content = {\n items: [streamTextPart],\n role: {\n label: \"Assistant\"\n }\n };\n }\n else {\n var textPart = new TextContent();\n textPart.text = partialEvent.partialText;\n event.content = {\n items: [textPart],\n role: {\n label: \"Assistant\"\n }\n };\n }\n }\n else if (event.eventType.type == EventType.Thought) {\n var thoughtPart = new StreamingReasoningContent();\n thoughtPart.text = partialEvent.partialReasoning;\n event.content = {\n items: [thoughtPart],\n role: {\n label: \"Assistant\"\n }\n };\n }\n else {\n streamingResponse.event = undefined;\n }\n event.role = {\n label: \"Assistant\"\n };\n event.timestamp = partialEvent?.timeStamp ?? new Date().getTime();\n event.turnComplete = false;\n\n streamingResponse.event = event;\n streamingResponse.partialEvent = undefined;\n }\n if (streamingResponse.event) {\n if (streamingResponse.subAgentId) {\n streamingResponse.event.subAgentId = streamingResponse.subAgentId;\n streamingResponse.event.subAgentName = streamingResponse.subAgentName;\n }\n if ((streamingResponse.event.content?.items?.length ?? 0) > 0 || (streamingResponse.event.streamingParts?.length ?? 0) > 0) {\n this.emitFirstToken(streamingResponse.event.interactionId);\n }\n\n this.handleEvent(streamingResponse.event, rawData);\n return streamingResponse.event;\n }\n return null;\n }\n\n protected emitFirstToken(interactionId?: string) {\n if (!interactionId || this.firstTokenInteractions.has(interactionId)) return;\n this.stats = {\n eventCount: 0,\n unknonwCount: 0,\n buffer: [],\n startTime: new Date(),\n elapsed: 0,\n unparsedCount: 0,\n totalTransfered: 0,\n tokensPerSecond: 0\n }\n\n this.firstTokenInteractions.add(interactionId);\n this.onFirstToken?.(interactionId);\n }\n\n /**\n * Mirror a server-side-refreshed JWT into the stored user record so the global\n * fetch interceptor (packages/dashboard-app/.../EnvisionAuthProvider.tsx) picks\n * it up on the next HTTP call. Idempotent — the same token is delivered on\n * multiple consecutive Pong frames for listener-readiness, and we only write\n * when it actually changed.\n *\n * Uses the same localStorage key the auth provider reads (`envision_user`).\n * Done here in the WS layer rather than via a callback so consumers don't need\n * to wire up token-handling boilerplate; React contexts that hold the user in\n * memory will pick up the new token on the next refresh/render or via their\n * own storage listeners.\n */\n private persistRefreshedAccessToken(newToken: string): void {\n const AUTH_STORAGE_KEY = 'envision_user';\n try {\n const raw = localStorage.getItem(AUTH_STORAGE_KEY);\n if (!raw) {\n console.warn('[WebSocket] WS-refreshed token received but no stored user — dropping');\n return;\n }\n const stored = JSON.parse(raw);\n if (stored?.access_token === newToken) return; // dedupe N-times redelivery\n\n stored.access_token = newToken;\n localStorage.setItem(AUTH_STORAGE_KEY, JSON.stringify(stored));\n console.info('[WebSocket] Mirrored WS-refreshed JWT into stored user');\n } catch (err) {\n console.error('[WebSocket] Failed to persist WS-refreshed token', err);\n }\n }\n\n closeStream() {\n this.disconnect();\n }\n\n suspendStream() {\n this.sendBaseMessage({\n Action: ChatAction.Suspend,\n AgentId: \"\",\n InteractionId: \"\",\n ModelId: \"\"\n })\n }\n\n /** Send the user's answer to a parked ask_user tool call (ChatAction.AnswerHumanTool). */\n answerHumanTool(toolCallId: string, answer: string) {\n this.sendBaseMessage({\n Action: ChatAction.AnswerHumanTool,\n AgentId: \"\",\n InteractionId: \"\",\n ToolCallId: toolCallId,\n Answer: answer,\n })\n }\n\n /**\n * Send a message to the agent\n */\n sendMessage(message: IMessage): void {\n this.sendBaseMessage(message);\n }\n\n sendBaseMessage(message: IMessageBase): void {\n this.lastActivity = new Date().getTime();\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {\n throw new Error('WebSocket is not connected');\n }\n\n this.ws.send(JSON.stringify(message));\n }\n\n sendSuspendMessage(message: IMessage): void {\n this.sendMessage(message)\n }\n\n monitor() {\n const wsService = this\n const pingPongStack = this.pingPongStack;\n const intervalTime = 30000;\n this.monitorInterval = setInterval(() => {\n try {\n const diffFromNow = new Date().getTime() - this.lastActivity;\n if (wsService.isConnected() && diffFromNow >= intervalTime - 200) {\n if (pingPongStack.length > 0) {\n console.warn(\"Ping pong stack broke here, on pinging\");\n }\n\n pingPongStack.push(new Date().getTime())\n wsService.ping();\n }\n }\n catch (error) {\n console.error(\"Error on monitor\", error);\n }\n }, intervalTime);\n }\n\n /**\n * Send a heartbeat ping\n */\n ping(): void {\n this.sendBaseMessage({\n Action: \"Ping\",\n AgentId: \"\",\n InteractionId: \"\",\n ModelId: \"\"\n });\n }\n\n /**\n * Disconnect the WebSocket\n */\n disconnect(): void {\n console.warn(\"Chamou DISCONNECT!!!\")\n // Mark this as user-initiated so the onclose handler does not schedule\n // an auto-reconnect, and tear down any backoff timer that may already\n // be in flight from a previous unexpected close.\n this.intentionalDisconnect = true;\n this.cancelPendingReconnect();\n this.isReconnecting = false;\n this.reconnectAttempts = 0;\n\n if (this.monitorInterval) {\n clearInterval(this.monitorInterval);\n this.monitorInterval = null;\n }\n\n this.pingPongStack = [];\n this.firstTokenInteractions.clear();\n this.lastKnownSessionId = undefined;\n // Reset the resume cursor — the next connect is a fresh session by definition.\n this.lastSeq = -1;\n // Next connect starts with no proven channel — it must earn the inner\n // retry budget by actually receiving a packet.\n this.hasEverReceivedPacket = false;\n if (this.ws) {\n this.ws.close(APPLICATION_CLOSED_CODE, 'Intentional disconnect');\n this.ws = null;\n }\n }\n\n /**\n * Check if connected\n */\n isConnected(): boolean {\n return this.ws !== null && this.ws.readyState === WebSocket.OPEN;\n }\n\n /**\n * Push the latest stats out to `onNewPacket`, but at most every\n * `STATS_FLUSH_MS` ms. Subsequent packets within the window\n * schedule a trailing flush so the UI eventually sees the final\n * value without each individual packet causing a re-render.\n */\n private flushStatsCoalesced() {\n if (!this.onNewPacket) return;\n const now = Date.now();\n const elapsed = now - this.statsLastFlushed;\n if (elapsed >= this.STATS_FLUSH_MS) {\n // Cancel any pending trailing flush — we're flushing now.\n if (this.statsFlushTimer) {\n clearTimeout(this.statsFlushTimer);\n this.statsFlushTimer = null;\n }\n this.statsLastFlushed = now;\n this.onNewPacket({ ...this.stats });\n return;\n }\n if (this.statsFlushTimer) return;\n this.statsFlushTimer = setTimeout(() => {\n this.statsFlushTimer = null;\n this.statsLastFlushed = Date.now();\n this.onNewPacket?.({ ...this.stats });\n }, this.STATS_FLUSH_MS - elapsed);\n }\n\n async handleEvent(llmEvent: LlmEvent, rawData: string): Promise<void> {\n try {\n const serverEvent = ServerEvent.parseFromTypedEvent(llmEvent)\n if (!serverEvent)\n throw \"Server event was null\";\n\n this.events.push([new Date().getTime(), llmEvent.text?.length ?? 0]);\n this.stats.eventCount += 1\n this.stats.totalTransfered += rawData.length;\n if (serverEvent.session_information && !serverEvent.subAgentId) {\n this.stats.sessionInformation = serverEvent.session_information\n }\n this.stats.elapsed = (Date.now() - this.stats.startTime.getTime()) / 1000 //In seconds\n const time_window_start_ms = Date.now() - (SLIDING_WINDOW_SIZE_SECONDS * 1000);\n const tokenCountForCalcRaw = this.events\n .filter(e => e[0] > time_window_start_ms)\n .reduce((p,c) => p+=c[1],0);\n const tokenCountForCalc = tokenCountForCalcRaw / TOKEN_SIZE_AVG;\n this.stats.tokensPerSecond = tokenCountForCalc / SLIDING_WINDOW_SIZE_SECONDS;\n this.flushStatsCoalesced();\n\n if (this.onEvent) {\n this.onEvent(serverEvent)\n .catch((error) => {\n console.error(\"Lost error on on-event\", error)\n })\n }\n }\n catch (error) {\n console.error(\"handleEvent error\", error)\n }\n }\n\n}\n","import type { User } from '../../models/contexts';\nimport { ClientMessage } from '../../models/ClientMessage';\nimport { InteractionPartUtils } from '../../models/InteractionPart';\nimport type { AgentContext } from '../../models/contexts';\nimport { AgentGatewayService } from \"./AgentGatewayService\";\nimport type { Interaction } from '../../models/Interaction';\nimport type { EventBusService } from \"../eventBusService\";\nimport type { SendMessageResponse, StartStreamResponse } from '../../models/SendMessageResponse';\nimport type { IArtifactService } from '../interfaces/artifactService';\nimport type { AxiosResponse } from 'axios';\nimport type { IHeartbeatPort } from '@lib/interfaces/IHeartbeatPort';\nimport type { INotificationPort } from '@lib/interfaces/INotificationPort';\nimport { ConnectionState } from '@lib/models/connectionState';\nimport { APPLICATION_CLOSED_CODE, WebSocketConnecionV2 } from '../WebSocketConnection/WebSocketConnectionV2';\nimport { ChatAction } from '@lib/models/enums';\nimport type { InteractionStatistics } from '@lib/models/semanticKernelModel/models';\nimport type { AiChatStore } from '@lib/components/AiChat/stateConfiguration';\nimport type { IWebSocketConnection } from '../WebSocketConnection/webSocketConnection';\nimport type { IStorageService } from '../storageService';\nimport type { GatewaySendMessageOptions } from './AgentGatewayService';\n\nconst SESSION_ID_KEY = 'envision_agent_sessionId';\n\nexport type Reader = (response: AxiosResponse, wasSuspended: boolean, onFirstRead?: () => void) => void;\n\nexport class AgentGatewayWSAsync extends AgentGatewayService {\n suspendState: boolean = false;\n\n reset(_user: User, _config?: AgentContext): void {\n throw new Error('Method not implemented.');\n }\n public startStream(_sendStartMessage?: boolean): Promise<StartStreamResponse> {\n throw new Error('Method not implemented.');\n }\n public isSuspended(): boolean {\n return this.suspendState;\n }\n\n protected wsService: IWebSocketConnection;\n\n protected root_url: string = \"\"\n\n protected hearBeatPort?: IHeartbeatPort;\n\n connectionAttempts: number = 0;\n\n constructor(user: User, eventBusService: EventBusService, artifactService: IArtifactService, baseUrl: string, config: AgentContext, sessionStore: AiChatStore, notificationPort: INotificationPort, ws: IWebSocketConnection, storageService: IStorageService, heartbeatPort?: IHeartbeatPort, sessionId?: string) {\n super(user, eventBusService, artifactService, baseUrl, config, sessionStore, notificationPort, storageService, sessionId);\n\n this.hearBeatPort = heartbeatPort;\n this.root_url = this.base_url;\n\n this.wsService = ws;\n //this.wsService = new WebSocketConnecion('ws://localhost:8000')\n // Set up event handlers\n this.wsService.onEvent = async (event) => {\n await super.Message(event);\n };\n\n this.wsService.onNewPacket = (stats: InteractionStatistics) => {\n this.sessionState.setStatistics(stats);\n this.eventBusService.streamEmitNewChunk(stats);\n }\n\n this.wsService.onPong = (sessionId: string) => {\n\n }\n\n this.wsService.onError = (error) => {\n this.streamOpened = false;\n const errorEvent = {\n data: this.getErrorEvent(error),\n lastEventId: new Date().getTime().toString(),\n origin: \"gatewayService\"\n } as MessageEvent;\n console.error('Stream error:', error);\n\n this.notificationPort.pushNotification({\n message: \"Stream error\" + error,\n type: 'warning',\n })\n\n super.Message(errorEvent);\n // Show error to user\n };\n\n this.wsService.onOpen = () => {\n\n // Without this, an inner-loop reconnect that succeeds (or any open at\n // all) leaves connectionStatus stuck at whatever the previous onClose\n // last set — typically Disconnected — and the SessionStateManagerService\n // retry loop keeps firing bindAndOpenLiveSession against an already\n // healthy socket.\n this.sessionState.setConnectionStatus(ConnectionState.Connected);\n };\n\n this.wsService.onReconnected = (_sessionId) => {\n // Quiet the outer state manager loop after the inner short-blip\n // reconnect succeeds.\n this.sessionState.setConnectionStatus(ConnectionState.Connected);\n };\n\n this.wsService.onFirstToken = (interactionId) => {\n this.localEmitFirstToken(interactionId);\n };\n\n this.wsService.onClose = (code, _reason) => {\n if (code != APPLICATION_CLOSED_CODE) { //Only change the connection state if the status is none of ours\n // Inner reconnect either gave up (RECONNECT_MAX_ATTEMPTS exhausted)\n // or this is the original disconnect. Either way, hand off to the\n // SessionStateManagerService.processRetryLoop by flipping to\n // Disconnected; that loop will call bindAndOpenLiveSession on its\n // own cadence (slower, with idle-timeout awareness).\n this.sessionState.setConnectionStatus(ConnectionState.Disconnected);\n }\n }\n\n\n }\n\n getStoredSessionId() {\n const sessionId = localStorage.getItem(SESSION_ID_KEY);\n if (sessionId) {\n return sessionId;\n }\n return undefined;\n }\n\n public isInteractionComplete(interactionId: string) {\n const interaction = this.interactionsMap.get(interactionId);\n return interaction?.turn_complete;\n }\n\n public isTurnCompleted(interactionId: string) {\n const interaction = this.interactionsMap.get(interactionId);\n return interaction?.turn_complete;\n }\n\n statuses: string[] = [\"CONNECTING\", \"OPEN\", \"CLOSED\", \"UNKNOWN\"];\n\n public override async finalResponse(interactionId: string, agentInteraction: Interaction, author: string): Promise<void> {\n super.turnComplete(interactionId, agentInteraction, author)\n }\n\n public stopStream(closeTurn: boolean = true): void {\n if (closeTurn)\n this.sessionState.setTurnOpen(false);\n\n if (this.wsService)\n this.wsService.closeStream();\n }\n\n public async suspend(): Promise<boolean> {\n const localWsService = this.wsService;\n const suspendPromisse: Promise<boolean> = new Promise(async (resolve, reject) => {\n let success = false;\n localWsService.onSuspended = () => {\n success = true;\n }\n localWsService.suspendStream();\n\n try {\n const sleepTime = 100;\n const timeOut = 5000;\n let elapsed = 0;\n\n while (!success && elapsed < timeOut) {\n await this.sleep(sleepTime);\n elapsed += sleepTime\n }\n\n if (success) {\n if (this.currentIS) {\n const interaction = this.currentIS.interaction;\n interaction.isSuspended = true;\n\n this.sessionState.setCurrentMessage(interaction);\n this.sessionState.setTurnOpen(false);\n\n\n resolve(true);\n }\n else {\n console.error(\"CurrentIS is null\");\n reject(\"CurrentIS is null\")\n }\n\n\n }\n else {\n reject(\"Timeout awaiting for suspension\");\n }\n }\n finally {\n this.suspendState = true;\n }\n });\n\n return suspendPromisse;\n }\n\n public answerHumanTool(toolCallId: string, answer: string): void {\n (this.wsService as WebSocketConnecionV2).answerHumanTool(toolCallId, answer);\n }\n\n public async cancelSuspend() {\n const interaction = this.currentIS?.interaction;\n if (!interaction) return;\n\n interaction.isSuspended = false;\n\n this.turnComplete(interaction.interactionId, interaction, \"Main\");\n }\n\n public async check() {\n // let on = false;\n // try {\n // await this.streamApi.get(getAgentServerBaseUrl() + '/health/')\n // on = true;\n // }\n // catch (error) {\n // on = false;\n // }\n\n return true;\n }\n\n lastConnectionPromise: Promise<string> | null = null\n socketState: ConnectionState = ConnectionState.Disconnected;\n public async openConnection(sessionId?: string): Promise<string> {\n if (this.lastConnectionPromise) {\n\n return this.lastConnectionPromise;\n }\n if (this.socketState == ConnectionState.Disconnected) {\n\n\n this.lastConnectionPromise = new Promise<string>((resolve, reject) => {\n\n\n this.wsService.connect(sessionId)\n .then((returnedSessionId) => {\n this.sessionId = returnedSessionId;\n resolve(returnedSessionId);\n })\n .catch((error) => {\n reject(error)\n })\n .finally(() => {\n this.lastConnectionPromise = null\n })\n })\n\n return this.lastConnectionPromise;\n\n }\n else {\n return Promise.resolve(this.sessionId!);\n }\n }\n\n public async closeConnection(closeTurn: boolean = true): Promise<SendMessageResponse | null> {\n try {\n this.stopStream(closeTurn)\n\n return {\n success: true,\n interaction: this.getCurrentInteraction()!\n }\n }\n catch (error) {\n\n return {\n success: false,\n interaction: this.getCurrentInteraction()!\n }\n }\n }\n\n public simulateDisconnect(code: number = 4500, reason: string = 'Debug simulated disconnect'): void {\n const wsV2 = this.wsService as WebSocketConnecionV2;\n if (wsV2?.ws) {\n wsV2.ws.close(code, reason);\n }\n }\n\n async sleep(ms: number) {\n return new Promise(resolve => setTimeout(resolve, ms));\n }\n\n streamOpened: boolean = false;\n\n // Send a message to the server via HTTP POST\n public async sendMessageInternal(message: ClientMessage, options?: GatewaySendMessageOptions, _openTurn?: boolean): Promise<SendMessageResponse> {\n const wasSuspended = this.suspendState;\n this.suspendState = false;\n const interaction = this.startInteraction(message.friendlyMessage ?? message.data, wasSuspended);\n this.registerInteractionCallId(interaction.interactionId, options);\n\n // Inject the user turn's UI representation as a part so the host component renders\n // immediately (live), identical to what ServerEvent reconstructs from the persisted\n // UserUiContent sibling on reload. The frame below carries the same {name,args} to the\n // server (stripped from the model request); Content stays the only model-facing text.\n if (message.userUi?.name)\n interaction.parts.push(InteractionPartUtils.fromUserUi(message.userUi.name, message.userUi.args));\n\n if (!this.wsService)\n throw \"no wsService created\";\n\n if (!this.sessionId)\n throw \"no session id set\";\n\n if (!this.config.agentConfig?.id) {\n throw \"Agent not selected\"\n }\n\n this.wsService.sendMessage({\n Content: message.data,\n SessionId: this.sessionId,\n Action: ChatAction.SendMessage,\n ModelId: this.config.model,\n InteractionId: interaction.interactionId,\n AgentId: this.config.agentConfig?.id,\n // Optional explicit C# class name on the server (e.g. \"LlmAgentSessionReplay\").\n // When set, AgentBootStrapService.GetAgent dispatches to that class directly\n // instead of looking up an Agent metadata row by AgentId. Plumbed through\n // `agentContext.agentConfig.agentImplementation` so a host can run a turn\n // against any registered LlmAgent variant without seeding a Mongo record.\n AgentImplementation: this.config.agentConfig?.agentImplementation,\n Parameters: {\n \"CustomerName\": this.config.customer?.name ?? '',\n \"DataSet\": this.config.customer?.dataSetId ?? ''\n },\n // Forward image attachments as a structured payload (PascalCase\n // keys to match the C# `Message.Images` / `MessageImage` model).\n Images: message.images?.length\n ? message.images.map((img) => ({ MimeType: img.mimeType, Data: img.data }))\n : undefined,\n // Client-only UI representation for this turn (PascalCase to match the C# `Message.UserUi`\n // model). The server persists it as a UserUiContent sibling and strips it from the model\n // request; Content remains the only model-facing text.\n UserUi: message.userUi?.name\n ? { Name: message.userUi.name, Args: message.userUi.args }\n : undefined,\n })\n\n this.localOpen(interaction.interactionId, \"system\");\n\n // interaction.parts = [InteractionPartUtils.fromText(\"Planejando próximos passos\", \"system\")]\n // this.localEmitMessage(interaction);\n\n return Promise.resolve({\n interaction: interaction,\n success: true,\n })\n }\n\n} ","import type { Artifact } from '../models/Artifact';\nimport type { IArtifactService } from './interfaces/artifactService';\n\n/**\n * Minimal IArtifactService for the replay demo. The replay path doesn't\n * generate artifacts — every persisted FunctionResultContent carries its\n * own payload — so most operations are in-memory pass-throughs. Hosts\n * that need full artifact handling supply their own implementation.\n */\nexport class HttpArtifactService implements IArtifactService {\n private cache = new Map<string, Artifact>();\n private serverBaseUrl: string;\n private accessToken: string;\n\n constructor(serverBaseUrl: string, accessToken: string) {\n this.serverBaseUrl = serverBaseUrl.replace(/\\/$/, '');\n this.accessToken = accessToken;\n }\n\n private get headers(): HeadersInit {\n return { Authorization: `Bearer ${this.accessToken}` };\n }\n\n async init(): Promise<void> { /* nothing to load up front */ }\n\n getArtifacts(): Artifact[] {\n return Array.from(this.cache.values());\n }\n\n async saveArtifact(artifact: Artifact): Promise<void> {\n this.cache.set(artifact.id, artifact);\n }\n\n saveArtifactToCache(artifact: Artifact): void {\n this.cache.set(artifact.id, artifact);\n }\n\n async deleteArtifact(artifactId: string): Promise<void> {\n this.cache.delete(artifactId);\n }\n\n addToCache(artifact: Artifact): void {\n this.cache.set(artifact.id, artifact);\n }\n\n getArtifactWithCache(artifactId: string): Artifact | null {\n return this.cache.get(artifactId) ?? null;\n }\n\n async getArtifact(artifactId: string, _useCache?: boolean): Promise<Artifact | null> {\n if (this.cache.has(artifactId)) return this.cache.get(artifactId) ?? null;\n try {\n const r = await fetch(`${this.serverBaseUrl}/AdminArtifact/${artifactId}`, {\n headers: this.headers,\n });\n if (!r.ok) return null;\n const a = (await r.json()) as Artifact;\n this.cache.set(a.id, a);\n return a;\n } catch {\n return null;\n }\n }\n\n async clearAllArtifacts(): Promise<void> {\n this.cache.clear();\n }\n\n async getFileContent(url: string): Promise<string | null> {\n try {\n const r = await fetch(url, { headers: this.headers });\n return r.ok ? await r.text() : null;\n } catch {\n return null;\n }\n }\n}\n"],"names":["STORAGE_KEYS","DEFAULT_SECTIONS","_LocalStorageService","__publicField","__name","key","value","existingSections","sections","defaultSection","s","updatedSections","existingArtifacts","artifacts","needsUpdate","updatedArtifacts","artifact","ArtifactType","error","stored","name","iconType","newSection","sectionId","updates","index","section","filteredSections","existingIndex","a","artifactWithDefaults","artifactId","newSectionId","artifactIndex","filteredArtifacts","b","prompt","prompts","limitedPrompts","promptId","filteredPrompts","p","LocalStorageService","usePromptState","storageService","promptSize","firstPrompt","lastPrompt","lastCreated","_EventTypes","EventTypes","allEventTypes","_EventBusService","eventName","args","listeners","promisses","listener","myName","l","interactionId","interaction","agentInteraction","messageDetails","errorMessage","message","session","functionDetails","anchorEl","stats","data","state","eventData","sessionId","details","EventBusService","_MockEventBusService","_state","_messageDetails","isServer","_interactionId","_agentInteraction","_functionDetails","MockEventBusService","InteractionPartGroupType","_InteractionPartGroup","InteractionPartGroup","_InteractionService","eventBusService","text","ast","unified","remarkParse","subParts","currentPart","node","toMarkdown","parentPartId","subTextParts","partText","part","InteractionPartUtils","parts","partial","showToolCalls","groups","currentInlineGroup","i","shouldShowThisPartInLine","_a","EventType","groupsWithThoughts","g","eventType","serverEvent","prev","updatedParts","newArtifacts","flattenedEventPart","initialLastPart","shouldPush","_b","nextParts","nextFunctionMap","functionMapCloned","cloneFunctionMap","clonePartsIfShared","justPushedNew","_c","coCallId","co","currentIdx","current","merged","placeholder","isFn","callId","_d","existing","endedLast","newPart","_e","lastPart","updatedLastPart","shouldAddUpdated","err","nextArtifactData","artifactsCloned","llmArtifact","next","InteractionService","THRESHOLD_PING","_AgentGatewayService","user","artifactService","baseUrl","config","sessionStore","notificationPort","runMode","RunMode","agentBaseUrlOverride","_prev","toolCallId","answer","modelId","toolSessionId","interactionQuestion","wasSuspended","idOverrideForTests","newId","filterMs","interService","newIter","params","response","runningPromise","subAgentId","subAgentName","service","mergeResult","isComplete","event","newArtifact","mergedInteraction","artifactsIds","id","artifactDatas","artifactData","errorEvent","ServerEvent","updatedInteraction","toolDetails","options","now","elapsed","_author","messageNumber","totalTimer","promptAsString","json","sendResponse","PromptUtils","startingPart","question","interactionStatus","_","date_formatted","formatDate","AgentGatewayService","APPLICATION_CLOSED_CODE","SESSION_ALREADY_ATTACHED_CODE","SLIDING_WINDOW_SIZE_SECONDS","TOKEN_SIZE_AVG","RECONNECT_INITIAL_DELAY_MS","RECONNECT_MAX_DELAY_MS","RECONNECT_BACKOFF_FACTOR","RECONNECT_JITTER","RECONNECT_MAX_ATTEMPTS","_WebSocketConnecionV2","getToken","createStreamingResponseSerializer","getRandomUUID","resolve","reject","isResumeAttempt","token","queryParts","querySuffix","wsBase","wsUrl","safeUrl","socketReceivedMessage","wasReconnecting","streamingResponse","handleResult","closedSessionId","attempts","code","exponential","capped","jitter","sessionIdToResume","reason","delay","ms","rawData","partialEvent","LlmEvent","PartType","callPart","StreamingFunctionCallUpdateContent","streamTextPart","StreamingTextContent","textPart","TextContent","thoughtPart","StreamingReasoningContent","newToken","AUTH_STORAGE_KEY","raw","ChatAction","wsService","pingPongStack","intervalTime","diffFromNow","llmEvent","time_window_start_ms","tokenCountForCalc","e","c","WebSocketConnecionV2","SESSION_ID_KEY","_AgentGatewayWSAsync","ws","heartbeatPort","ConnectionState","_sessionId","_reason","_user","_config","_sendStartMessage","author","closeTurn","localWsService","success","returnedSessionId","wsV2","_openTurn","_f","_g","img","_h","AgentGatewayWSAsync","_HttpArtifactService","serverBaseUrl","accessToken","_useCache","r","url","HttpArtifactService"],"mappings":"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"}