{"version":3,"file":"medha-analytics-datachat-ai.mjs","sources":["../../../projects/datachat-ai/src/lib/datachat-ai.config.ts","../../../projects/datachat-ai/src/lib/datachat-ai.module.ts","../../../projects/datachat-ai/src/lib/models/chat.model.ts","../../../projects/datachat-ai/src/lib/models/animated-text.model.ts","../../../projects/datachat-ai/src/lib/services/animated-dots.service.ts","../../../projects/datachat-ai/src/lib/pipes/animated-text.pipe.ts","../../../projects/datachat-ai/src/lib/services/svg-registry.service.ts","../../../projects/datachat-ai/src/lib/components/svg-icon/svg-icon.component.ts","../../../projects/datachat-ai/src/lib/components/charts/charts.component.ts","../../../projects/datachat-ai/src/lib/components/charts/charts.component.html","../../../projects/datachat-ai/src/lib/components/data-table/data-table.component.ts","../../../projects/datachat-ai/src/lib/components/data-table/data-table.component.html","../../../projects/datachat-ai/src/lib/components/dashboard-results/dashboard-results.component.ts","../../../projects/datachat-ai/src/lib/components/dashboard-results/dashboard-results.component.html","../../../projects/datachat-ai/src/lib/components/insights/insights.component.ts","../../../projects/datachat-ai/src/lib/components/insights/insights.component.html","../../../projects/datachat-ai/src/lib/components/animated-text.component.ts","../../../projects/datachat-ai/src/lib/components/step-progress.component.ts","../../../projects/datachat-ai/src/lib/components/execution-timeline/execution-timeline.component.ts","../../../projects/datachat-ai/src/lib/components/execution-timeline/execution-timeline.component.html","../../../projects/datachat-ai/src/lib/components/execution-debug/execution-debug.component.ts","../../../projects/datachat-ai/src/lib/components/execution-debug/execution-debug.component.html","../../../projects/datachat-ai/src/lib/components/dimension-clarification/dimension-clarification.component.ts","../../../projects/datachat-ai/src/lib/components/dimension-clarification/dimension-clarification.component.html","../../../projects/datachat-ai/src/lib/components/feedback/feedback.component.ts","../../../projects/datachat-ai/src/lib/components/chat-message/chat-message.component.ts","../../../projects/datachat-ai/src/lib/components/chat-message/chat-message.component.html","../../../projects/datachat-ai/src/lib/components/chat-messages-container/chat-messages-container.component.ts","../../../projects/datachat-ai/src/lib/components/chat-messages-container/chat-messages-container.component.html","../../../projects/datachat-ai/src/lib/components/suggested-questions/suggested-questions.component.ts","../../../projects/datachat-ai/src/lib/components/suggested-questions/suggested-questions.component.html","../../../projects/datachat-ai/src/lib/services/environment.service.ts","../../../projects/datachat-ai/src/lib/services/streaming-analytics.service.ts","../../../projects/datachat-ai/src/lib/services/chat-history.service.ts","../../../projects/datachat-ai/src/lib/components/session-sidebar/session-sidebar.component.ts","../../../projects/datachat-ai/src/lib/components/session-sidebar/session-sidebar.component.html","../../../projects/datachat-ai/src/lib/services/analytics.service.ts","../../../projects/datachat-ai/src/lib/components/home/home.component.ts","../../../projects/datachat-ai/src/lib/components/home/home.component.html","../../../projects/datachat-ai/src/public-api.ts","../../../projects/datachat-ai/src/medha-analytics-datachat-ai.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\r\n\r\n/**\r\n * Configuration interface for DataChat AI\r\n */\r\nexport interface DataChatAIConfig {\r\n  /**\r\n   * Backend API URL for DataChat AI\r\n   */\r\n  backendUrl: string;\r\n\r\n  /**\r\n   * Optional: WebSocket URL (defaults to backendUrl if not provided)\r\n   */\r\n  websocketUrl?: string;\r\n\r\n  /**\r\n   * Optional: Default user ID for API requests\r\n   */\r\n  userId?: string;\r\n}\r\n\r\n/**\r\n * Injection token for DataChat AI configuration\r\n */\r\nexport const DATACHAT_AI_CONFIG = new InjectionToken<DataChatAIConfig>('DATACHAT_AI_CONFIG');\r\n\r\n/**\r\n * Default configuration (fallback)\r\n * Note: userId should be provided by the consuming application\r\n */\r\nexport const DEFAULT_DATACHAT_AI_CONFIG: DataChatAIConfig = {\r\n  backendUrl: 'http://localhost:8000',\r\n  websocketUrl: 'ws://localhost:8000',\r\n  userId: ''\r\n};\r\n","import { NgModule, ModuleWithProviders, Provider } from '@angular/core';\r\n\r\n// Configuration\r\nimport { DATACHAT_AI_CONFIG, DataChatAIConfig, DEFAULT_DATACHAT_AI_CONFIG } from './datachat-ai.config';\r\n\r\n@NgModule({})\r\nexport class DatachatAiModule {\r\n  /**\r\n   * Configure the DataChat AI module with backend URL\r\n   *\r\n   * @param config Configuration object with backendUrl and optional websocketUrl\r\n   * @returns Module with providers\r\n   *\r\n   * @example\r\n   * ```typescript\r\n   * // In app.config.ts or main module\r\n   * import { DatachatAiModule } from '@medha-analytics/datachat-ai';\r\n   *\r\n   * DatachatAiModule.forRoot({\r\n   *   backendUrl: 'https://api.example.com',\r\n   *   websocketUrl: 'wss://api.example.com'\r\n   * })\r\n   * ```\r\n   */\r\n  static forRoot(config?: DataChatAIConfig): ModuleWithProviders<DatachatAiModule> {\r\n    return {\r\n      ngModule: DatachatAiModule,\r\n      providers: [\r\n        {\r\n          provide: DATACHAT_AI_CONFIG,\r\n          useValue: config || DEFAULT_DATACHAT_AI_CONFIG\r\n        }\r\n      ]\r\n    };\r\n  }\r\n\r\n  /**\r\n   * Get providers for standalone components\r\n   */\r\n  static getProviders(config?: DataChatAIConfig): Provider[] {\r\n    return [\r\n      {\r\n        provide: DATACHAT_AI_CONFIG,\r\n        useValue: config || DEFAULT_DATACHAT_AI_CONFIG\r\n      }\r\n    ];\r\n  }\r\n}\r\n","import { DashboardData } from './dashboard.model';\r\nimport { PhaseUpdate, StepProgress } from '../services/streaming-analytics.service';\r\nimport { StreamingDebugLog } from '../components/execution-debug/execution-debug.component';\r\n\r\n// Debug logs structure matching backend JSONB format\r\nexport interface DebugLogs {\r\n  query_rewriting?: {\r\n    original_question: string;\r\n    rewritten_question: string;\r\n    rewriting_errors?: string[];\r\n    timestamp: number;\r\n  };\r\n  execution_plan?: Array<{\r\n    step_id: number;\r\n    step_type: string;\r\n    description: string;\r\n    dependencies: number[];\r\n  }>;\r\n  steps?: Array<{\r\n    step_id: number;\r\n    step_type: 'FETCH' | 'FETCH_DEPENDENT' | 'EVALUATE' | 'INFER';\r\n    step_description: string;\r\n    events?: Array<{\r\n      event_type: string;\r\n      data: any;\r\n      timestamp: number;\r\n    }>;\r\n    cube_input?: any;\r\n    sql_query?: string;\r\n    dataframe_info?: {\r\n      shape: [number, number];\r\n      columns: string[];\r\n      dtypes: { [key: string]: string };\r\n      memory_usage: number;\r\n      null_counts?: { [key: string]: number };\r\n      sample_data?: any[];\r\n    };\r\n    code_snippet?: string;\r\n    pandas_operations?: string[];\r\n    llm_prompt?: string;\r\n    llm_response?: string;\r\n    execution_time?: number;\r\n    first_seen: number;\r\n    last_updated: number;\r\n  }>;\r\n  errors?: Array<{\r\n    error_id: string;\r\n    step_id?: number;\r\n    error_type: string;\r\n    severity: 'warning' | 'error' | 'critical';\r\n    message: string;\r\n    details?: any;\r\n    timestamp: number;\r\n    captured_at: number;\r\n  }>;\r\n  error_summary?: {\r\n    total_errors: number;\r\n    warnings: number;\r\n    errors: number;\r\n    critical: number;\r\n    by_step?: { [stepId: string]: number };\r\n    by_type?: { [errorType: string]: number };\r\n  };\r\n  execution_summary?: {\r\n    start_time: number;\r\n    total_steps: number;\r\n    completed_steps: number;\r\n    failed_steps: number;\r\n    plan_id: string;\r\n    completed_at: number;\r\n  };\r\n  unknown_events?: Array<{\r\n    event_type: string;\r\n    data: any;\r\n    timestamp: number;\r\n  }>;\r\n}\r\n\r\nexport interface ChatMessage {\r\n  id: string;\r\n  type: 'user' | 'assistant' | 'system';\r\n  content: string;\r\n  timestamp: Date;\r\n  isLoading?: boolean;\r\n  dashboardData?: DashboardData | null;\r\n  hasError?: boolean;\r\n  errorMessage?: string;\r\n  // Backend integration fields\r\n  session_id?: string;\r\n  message_order?: number;\r\n  execution_metadata?: any;\r\n  debug_logs?: DebugLogs; // Raw debug logs from database with proper typing\r\n  // User feedback fields\r\n  user_feedback?: 'positive' | 'negative' | null;\r\n  feedback_comment?: string;\r\n  // Step progress fields for persistent timeline display\r\n  stepProgress?: StepProgress[];\r\n  phaseUpdates?: PhaseUpdate[];\r\n  executionCompleted?: boolean;\r\n  isCancelled?: boolean;\r\n  stoppedByFeedback?: boolean; // Flag indicating execution was stopped due to negative feedback\r\n  // Streaming-only debug logs (not persisted to database)\r\n  streamingDebugLogs?: StreamingDebugLog;\r\n  // Rewritten query fields\r\n  isRewrittenQuery?: boolean;\r\n  originalQuery?: string;\r\n  rewrittenQuery?: string;\r\n  // Clarification request fields\r\n  clarificationRequest?: {\r\n    clarification_type: string;\r\n    message: string;\r\n    available_options: Array<{\r\n      dimension_name: string;\r\n      display_name: string;\r\n      values: string[];\r\n    }>;\r\n    suggested_rephrase?: string;\r\n    value_count?: number;\r\n    dimension_matched?: string;\r\n    sample_values?: string[];\r\n    user_question?: string;\r\n    metric_focus?: string;\r\n    user_message_id?: string;  // ID of the original user message that triggered this clarification\r\n    filter_value?: string;  // The ambiguous filter value that needs clarification (e.g., \"NHIC Clinics\")\r\n    filter_type?: string;  // Type of filter: 'included' or 'excluded'\r\n  };\r\n  needsClarification?: boolean;\r\n}\r\n\r\nexport interface ChatConversation {\r\n  id: string;\r\n  messages: ChatMessage[];\r\n  createdAt: Date;\r\n  lastUpdatedAt: Date;\r\n}\r\n\r\n// ==========================================================================\r\n// BACKEND SESSION MANAGEMENT MODELS\r\n// ==========================================================================\r\n\r\nexport interface ChatSession {\r\n  id: string;\r\n  user_id?: string;\r\n  session_name?: string;\r\n  created_at: string;\r\n  updated_at: string;\r\n  is_active: boolean;\r\n  metadata?: Record<string, any>;\r\n  message_count?: number;\r\n  query_count?: number;\r\n}\r\n\r\nexport interface CreateSessionRequest {\r\n  user_id?: string;\r\n  session_name?: string;\r\n  metadata?: Record<string, any>;\r\n}\r\n\r\nexport interface UpdateSessionRequest {\r\n  session_name?: string;\r\n  is_active?: boolean;\r\n  metadata?: Record<string, any>;\r\n}\r\n\r\nexport interface CreateMessageRequest {\r\n  message_type: 'user' | 'assistant' | 'system';\r\n  content: string;\r\n  dashboard_data?: DashboardData;\r\n  execution_metadata?: Record<string, any>;\r\n  has_error?: boolean;\r\n  error_message?: string;\r\n}\r\n\r\nexport interface UpdateMessageRequest {\r\n  content?: string;\r\n  dashboard_data?: DashboardData;\r\n  has_error?: boolean;\r\n  error_message?: string;\r\n  user_feedback?: 'positive' | 'negative' | null;\r\n  feedback_comment?: string;\r\n}\r\n\r\nexport interface SessionResponse {\r\n  id: string;\r\n  user_id?: string;\r\n  session_name?: string;\r\n  created_at: string;\r\n  updated_at: string;\r\n  is_active: boolean;\r\n  metadata?: Record<string, any>;\r\n}\r\n\r\nexport interface MessageResponse {\r\n  id: string;\r\n  session_id: string;\r\n  message_type: 'user' | 'assistant' | 'system';\r\n  content: string;\r\n  timestamp: string;\r\n  dashboard_data?: DashboardData;\r\n  execution_metadata?: Record<string, any>;\r\n  debug_logs?: DebugLogs; // Debug logs from database with proper typing\r\n  has_error: boolean;\r\n  error_message?: string;\r\n  message_order: number;\r\n  user_feedback?: string;\r\n  feedback_comment?: string;\r\n}\r\n\r\nexport interface QueryExecutionResponse {\r\n  id: string;\r\n  session_id: string;\r\n  message_id: string;\r\n  plan_id: string;\r\n  user_question: string;\r\n  execution_status?: string;\r\n  execution_time_seconds?: number;\r\n  step_results?: Record<string, any>;\r\n  created_at: string;\r\n  completed_at?: string;\r\n  error_details?: Record<string, any>;\r\n}\r\n\r\nexport interface SessionStatsResponse {\r\n  session_id: string;\r\n  created_at: string;\r\n  last_activity_at: string;\r\n  is_active: boolean;\r\n  total_messages: number;\r\n  total_queries: number;\r\n  message_types: Record<string, number>;\r\n  execution_status_counts: Record<string, number>;\r\n  average_execution_times: Record<string, number>;\r\n}\r\n\r\nexport enum MessageType {\r\n  USER = 'user',\r\n  ASSISTANT = 'assistant',\r\n  SYSTEM = 'system'\r\n}\r\n\r\nexport enum MessageStatus {\r\n  SENDING = 'sending',\r\n  SENT = 'sent',\r\n  PROCESSING = 'processing',\r\n  COMPLETED = 'completed',\r\n  ERROR = 'error'\r\n}","export interface AnimatedTextStyle {\r\n  fontSize?: string;\r\n  fontWeight?: string | number;\r\n  fontFamily?: string;\r\n  color?: string;\r\n  fontStyle?: 'normal' | 'italic';\r\n  textTransform?: 'none' | 'uppercase' | 'lowercase' | 'capitalize';\r\n  letterSpacing?: string;\r\n  lineHeight?: string | number;\r\n  textAlign?: 'left' | 'center' | 'right' | 'justify';\r\n}\r\n\r\nexport interface AnimationConfig {\r\n  enabled: boolean;\r\n  speed: number; // milliseconds between dot additions\r\n  maxDots: number; // maximum number of dots before cycling\r\n  pauseOnHover?: boolean;\r\n  respectMotionPreference?: boolean;\r\n}\r\n\r\nexport interface AnimatedTextOptions {\r\n  baseText: string;\r\n  style?: AnimatedTextStyle;\r\n  animation?: Partial<AnimationConfig>;\r\n}\r\n\r\nexport const DEFAULT_ANIMATION_CONFIG: AnimationConfig = {\r\n  enabled: true,\r\n  speed: 500,\r\n  maxDots: 3,\r\n  pauseOnHover: true,\r\n  respectMotionPreference: true\r\n};\r\n\r\nexport const DEFAULT_TEXT_STYLE: AnimatedTextStyle = {\r\n  fontSize: '14px',\r\n  fontWeight: 'normal',\r\n  color: 'inherit',\r\n  fontStyle: 'normal',\r\n  textTransform: 'none'\r\n};\r\n\r\n// Predefined style presets for common use cases\r\nexport const TEXT_STYLE_PRESETS = {\r\n  phase: {\r\n    fontSize: '14px',\r\n    fontWeight: '500',\r\n    color: 'inherit' // Changed to inherit to respect parent color (dark mode compatible)\r\n  },\r\n  button: {\r\n    fontSize: '14px',\r\n    fontWeight: 'bold'\r\n  },\r\n  step: {\r\n    fontSize: '12px',\r\n    fontWeight: 'normal',\r\n    color: 'inherit' // Changed to inherit to respect parent color (dark mode compatible)\r\n  },\r\n  loading: {\r\n    fontSize: '16px',\r\n    fontWeight: '500',\r\n    textAlign: 'center' as const\r\n  },\r\n  title: {\r\n    fontSize: '18px',\r\n    fontWeight: 'bold',\r\n    textTransform: 'uppercase' as const\r\n  }\r\n} as const;","import { Injectable, OnDestroy } from '@angular/core';\r\nimport { Observable, BehaviorSubject, interval, combineLatest, NEVER } from 'rxjs';\r\nimport { map, takeWhile, startWith, switchMap, distinctUntilChanged } from 'rxjs/operators';\r\nimport { AnimationConfig, DEFAULT_ANIMATION_CONFIG } from '../models/animated-text.model';\r\n\r\n@Injectable({\r\n  providedIn: 'root'\r\n})\r\nexport class AnimatedDotsService implements OnDestroy {\r\n  private readonly motionPreference$ = new BehaviorSubject<boolean>(true);\r\n  private readonly globalConfig$ = new BehaviorSubject<AnimationConfig>(DEFAULT_ANIMATION_CONFIG);\r\n\r\n  constructor() {\r\n    // Check user's motion preference\r\n    this.checkMotionPreference();\r\n    \r\n    // Listen for changes in motion preference\r\n    if (typeof window !== 'undefined' && window.matchMedia) {\r\n      const mediaQuery = window.matchMedia('(prefers-reduced-motion: reduce)');\r\n      mediaQuery.addListener(() => this.checkMotionPreference());\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Creates an observable that emits animated text with incremental dots\r\n   */\r\n  createAnimatedText(\r\n    baseText: string, \r\n    enabled$: Observable<boolean>, \r\n    customConfig?: Partial<AnimationConfig>\r\n  ): Observable<string> {\r\n    const config = { ...DEFAULT_ANIMATION_CONFIG, ...customConfig };\r\n    \r\n    return combineLatest([\r\n      enabled$,\r\n      this.motionPreference$,\r\n      this.globalConfig$\r\n    ]).pipe(\r\n      switchMap(([enabled, respectsMotion, globalConfig]) => {\r\n        // Determine if animation should run\r\n        const shouldAnimate = enabled && \r\n          (config.respectMotionPreference === false || respectsMotion) && \r\n          globalConfig.enabled;\r\n\r\n        if (!shouldAnimate) {\r\n          return new BehaviorSubject(baseText).asObservable();\r\n        }\r\n\r\n        // Create the animation interval\r\n        const speed = customConfig?.speed || globalConfig.speed;\r\n        const maxDots = customConfig?.maxDots || globalConfig.maxDots;\r\n\r\n        return interval(speed).pipe(\r\n          startWith(0),\r\n          map(tick => {\r\n            const dotCount = tick % (maxDots + 1);\r\n            const dots = '.'.repeat(dotCount);\r\n            return `${baseText}${dots}`;\r\n          }),\r\n          takeWhile(() => shouldAnimate, true), // Include the final emission\r\n          distinctUntilChanged()\r\n        );\r\n      }),\r\n      distinctUntilChanged()\r\n    );\r\n  }\r\n\r\n  /**\r\n   * Creates a simple animated text observable for inline usage\r\n   */\r\n  animateText(baseText: string, enabled: boolean, config?: Partial<AnimationConfig>): Observable<string> {\r\n    return this.createAnimatedText(\r\n      baseText,\r\n      new BehaviorSubject(enabled),\r\n      config\r\n    );\r\n  }\r\n\r\n  /**\r\n   * Updates the global animation configuration\r\n   */\r\n  updateGlobalConfig(config: Partial<AnimationConfig>): void {\r\n    const currentConfig = this.globalConfig$.value;\r\n    this.globalConfig$.next({ ...currentConfig, ...config });\r\n  }\r\n\r\n  /**\r\n   * Gets the current global configuration\r\n   */\r\n  getGlobalConfig(): AnimationConfig {\r\n    return this.globalConfig$.value;\r\n  }\r\n\r\n  /**\r\n   * Enables or disables all animations globally\r\n   */\r\n  setAnimationsEnabled(enabled: boolean): void {\r\n    this.updateGlobalConfig({ enabled });\r\n  }\r\n\r\n  /**\r\n   * Gets the current global configuration as an observable\r\n   */\r\n  getGlobalConfig$(): Observable<AnimationConfig> {\r\n    return this.globalConfig$.asObservable();\r\n  }\r\n\r\n  /**\r\n   * Checks if the user prefers reduced motion\r\n   */\r\n  private checkMotionPreference(): void {\r\n    if (typeof window !== 'undefined' && window.matchMedia) {\r\n      const prefersReducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches;\r\n      this.motionPreference$.next(!prefersReducedMotion);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Gets the motion preference observable\r\n   */\r\n  getMotionPreference$(): Observable<boolean> {\r\n    return this.motionPreference$.asObservable();\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    this.globalConfig$.complete();\r\n    this.motionPreference$.complete();\r\n  }\r\n}","import { Pipe, PipeTransform, OnDestroy, ChangeDetectorRef, NgZone } from '@angular/core';\r\nimport { Observable, BehaviorSubject, Subscription } from 'rxjs';\r\nimport { AnimatedDotsService } from '../services/animated-dots.service';\r\nimport { AnimationConfig, AnimatedTextStyle } from '../models/animated-text.model';\r\n\r\n@Pipe({\r\n  name: 'animatedText',\r\n  pure: false,\r\n  standalone: true\r\n})\r\nexport class AnimatedTextPipe implements PipeTransform, OnDestroy {\r\n  private lastValue: string = '';\r\n  private lastEnabled: boolean = false;\r\n  private lastConfig: Partial<AnimationConfig> | undefined;\r\n  private subscription?: Subscription;\r\n  private enabled$ = new BehaviorSubject<boolean>(false);\r\n\r\n  constructor(\r\n    private animatedDotsService: AnimatedDotsService,\r\n    private cdr: ChangeDetectorRef,\r\n    private ngZone: NgZone\r\n  ) {}\r\n\r\n  transform(\r\n    baseText: string, \r\n    enabled: boolean = true, \r\n    config?: Partial<AnimationConfig>\r\n  ): string {\r\n    // Check if inputs have changed\r\n    const hasChanged = \r\n      baseText !== this.lastValue ||\r\n      enabled !== this.lastEnabled ||\r\n      JSON.stringify(config) !== JSON.stringify(this.lastConfig);\r\n\r\n    if (hasChanged) {\r\n      this.cleanup();\r\n      this.setupAnimation(baseText, enabled, config);\r\n      \r\n      // Update cached values\r\n      this.lastValue = baseText;\r\n      this.lastEnabled = enabled;\r\n      this.lastConfig = config;\r\n    }\r\n\r\n    return this.lastValue;\r\n  }\r\n\r\n  private setupAnimation(\r\n    baseText: string, \r\n    enabled: boolean, \r\n    config?: Partial<AnimationConfig>\r\n  ): void {\r\n    if (!enabled) {\r\n      this.lastValue = baseText;\r\n      return;\r\n    }\r\n\r\n    this.enabled$.next(enabled);\r\n\r\n    // Run animation outside Angular zone for performance\r\n    this.ngZone.runOutsideAngular(() => {\r\n      this.subscription = this.animatedDotsService.createAnimatedText(\r\n        baseText,\r\n        this.enabled$.asObservable(),\r\n        config\r\n      ).subscribe(animatedText => {\r\n        // Update in Angular zone to trigger change detection\r\n        this.ngZone.run(() => {\r\n          this.lastValue = animatedText;\r\n          this.cdr.markForCheck();\r\n        });\r\n      });\r\n    });\r\n  }\r\n\r\n  private cleanup(): void {\r\n    if (this.subscription) {\r\n      this.subscription.unsubscribe();\r\n      this.subscription = undefined;\r\n    }\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    this.cleanup();\r\n    this.enabled$.complete();\r\n  }\r\n}\r\n\r\n// Additional pipe for style application\r\n@Pipe({\r\n  name: 'applyTextStyle',\r\n  pure: true,\r\n  standalone: true\r\n})\r\nexport class ApplyTextStylePipe implements PipeTransform {\r\n  transform(baseStyle: AnimatedTextStyle, additionalStyle?: AnimatedTextStyle): AnimatedTextStyle {\r\n    return {\r\n      ...baseStyle,\r\n      ...additionalStyle\r\n    };\r\n  }\r\n}","import { Injectable, inject, PLATFORM_ID } from '@angular/core';\r\nimport { HttpClient } from '@angular/common/http';\r\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\r\nimport { Observable, of } from 'rxjs';\r\nimport { catchError, map, shareReplay } from 'rxjs/operators';\r\nimport { isPlatformBrowser } from '@angular/common';\r\n\r\n@Injectable({\r\n  providedIn: 'root'\r\n})\r\nexport class SvgRegistryService {\r\n  private svgCache: { [key: string]: Observable<SafeHtml> } = {};\r\n  private http = inject(HttpClient);\r\n  private sanitizer = inject(DomSanitizer);\r\n  private platformId = inject(PLATFORM_ID);\r\n\r\n  loadSvg(name: string, url: string): Observable<SafeHtml> {\r\n    if (!this.svgCache[name]) {\r\n      this.svgCache[name] = this.http.get(url, { responseType: 'text' }).pipe(\r\n        map(svgContent => {\r\n          if (isPlatformBrowser(this.platformId)) {\r\n            // Browser-specific code\r\n            const div = document.createElement('div');\r\n            div.innerHTML = svgContent;\r\n            const svgElement = div.querySelector('svg');\r\n\r\n            if (svgElement) {\r\n              // Remove any width and height attributes\r\n              svgElement.removeAttribute('width');\r\n              svgElement.removeAttribute('height');\r\n\r\n              // Ensure the viewBox is set\r\n              if (!svgElement.getAttribute('viewBox')) {\r\n                const width = svgElement.getAttribute('width') || '24';\r\n                const height = svgElement.getAttribute('height') || '24';\r\n                svgElement.setAttribute('viewBox', `0 0 ${width} ${height}`);\r\n              }\r\n\r\n              return this.sanitizer.bypassSecurityTrustHtml(svgElement.outerHTML);\r\n            }\r\n          }\r\n          // For non-browser environments or if SVG manipulation fails, return the original content\r\n          return this.sanitizer.bypassSecurityTrustHtml(svgContent);\r\n        }),\r\n        catchError(error => {\r\n          console.error(`Error loading SVG ${name}:`, error);\r\n          return of(this.sanitizer.bypassSecurityTrustHtml('')); // Return empty SafeHtml on error\r\n        }),\r\n        shareReplay(1)\r\n      );\r\n    }\r\n    return this.svgCache[name];\r\n  }\r\n}","import { Component, Input, OnInit, ElementRef, Renderer2, inject } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { HttpClientModule } from '@angular/common/http';\r\nimport { DomSanitizer } from '@angular/platform-browser';\r\nimport { SvgRegistryService } from '../../services/svg-registry.service';\r\n\r\n@Component({\r\n  selector: 'app-svg-icon',\r\n  standalone: true,\r\n  imports: [CommonModule, HttpClientModule],\r\n  template: '',\r\n  styles: [`:host { display: inline-block; }`]\r\n})\r\nexport class SvgIconComponent implements OnInit {\r\n  @Input() name!: string;\r\n  @Input() size: string = '24px';\r\n  @Input() width?: string;\r\n  @Input() height?: string;\r\n  @Input() gif?: string;\r\n\r\n  private elementRef = inject(ElementRef);\r\n  private renderer = inject(Renderer2);\r\n  private sanitizer = inject(DomSanitizer);\r\n  private svgRegistry = inject(SvgRegistryService);\r\n\r\n  ngOnInit() {\r\n    this.loadIcon();\r\n    this.setSize();\r\n  }\r\n\r\n  private loadIcon() {\r\n    if (this.gif) {\r\n      this.loadGif();\r\n    } else {\r\n      this.loadSvg();\r\n    }\r\n  }\r\n\r\n  private loadGif() {\r\n    const url = `app/assets/icons/gifs/${this.gif}.gif`;\r\n    const img = this.renderer.createElement('img');\r\n    this.renderer.setAttribute(img, 'src', url);\r\n    this.renderer.setStyle(img, 'width', '100%');\r\n    this.renderer.setStyle(img, 'height', '100%');\r\n    this.renderer.setStyle(img, 'object-fit', 'contain');\r\n    \r\n    // Clear existing content and append the GIF\r\n    this.renderer.setProperty(this.elementRef.nativeElement, 'innerHTML', '');\r\n    this.renderer.appendChild(this.elementRef.nativeElement, img);\r\n  }\r\n\r\n  private loadSvg() {\r\n    const url = `app/assets/icons/svgs/${this.name}.svg`;\r\n    this.svgRegistry.loadSvg(this.name, url).subscribe(svgContent => {\r\n      if (svgContent) {\r\n        const div = this.renderer.createElement('div');\r\n        div.innerHTML = svgContent;\r\n        \r\n        const svgElement = div.querySelector('svg');\r\n        if (svgElement) {\r\n          // Get original viewBox or fallback to width and height\r\n          let viewBox = svgElement.getAttribute('viewBox');\r\n          if (!viewBox) {\r\n            const svgWidth = svgElement.getAttribute('width') || '24';\r\n            const svgHeight = svgElement.getAttribute('height') || '24';\r\n            viewBox = `0 0 ${svgWidth} ${svgHeight}`;\r\n          }\r\n          \r\n          // Remove width and height attributes\r\n          svgElement.removeAttribute('width');\r\n          svgElement.removeAttribute('height');\r\n          \r\n          // Set viewBox\r\n          svgElement.setAttribute('viewBox', viewBox);\r\n          \r\n          // Set width and height to 100%\r\n          this.renderer.setAttribute(svgElement, 'width', this.width || '100%');\r\n          this.renderer.setAttribute(svgElement, 'height', '100%');\r\n          \r\n          // Clear existing content and append the adjusted SVG\r\n          this.renderer.setProperty(this.elementRef.nativeElement, 'innerHTML', '');\r\n          this.renderer.appendChild(this.elementRef.nativeElement, svgElement);\r\n        }\r\n      }\r\n    });\r\n  }\r\n\r\n  private setSize() {\r\n    const size = this.width || this.height || this.size;\r\n    this.renderer.setStyle(this.elementRef.nativeElement, 'width', size);\r\n    this.renderer.setStyle(this.elementRef.nativeElement, 'height', size);\r\n\r\n    this.renderer.setStyle(this.elementRef.nativeElement, 'display', 'flex');\r\n    this.renderer.setStyle(this.elementRef.nativeElement, 'align-items', 'center');\r\n    this.renderer.setStyle(this.elementRef.nativeElement, 'justify-content', 'center');\r\n  }\r\n}","import { Component, Input, ViewChildren, QueryList, ElementRef, AfterViewInit } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { NgxEchartsModule } from 'ngx-echarts';\r\nimport { EChartsOption } from 'echarts';\r\nimport { SvgIconComponent } from '../svg-icon/svg-icon.component';\r\nimport FileSaver from 'file-saver';\r\n\r\n@Component({\r\n  selector: 'app-charts',\r\n  standalone: true,\r\n  imports: [\r\n    CommonModule,\r\n    NgxEchartsModule, \r\n    SvgIconComponent\r\n  ],\r\n  templateUrl: './charts.component.html',\r\n  styleUrl: './charts.component.scss'\r\n})\r\nexport class ChartsComponent implements AfterViewInit {\r\n  @Input() chartConfigs: { [key: string]: any } = {};\r\n  @ViewChildren('chartElement') chartElements!: QueryList<ElementRef>;\r\n  \r\n  private chartInstances: Map<string, any> = new Map();\r\n\r\n  // Chart types configuration\r\n  chartTypes = [\r\n    { key: 'bar_chart', title: 'Bar Chart' },\r\n    { key: 'pie_chart', title: 'Pie Chart' },\r\n    { key: 'line_chart', title: 'Line Chart' },\r\n    { key: 'scatter_plot', title: 'Scatter Plot' },\r\n    { key: 'multi_trend_chart', title: 'Multi-Trend Analysis' }\r\n  ];\r\n\r\n  ngAfterViewInit() {\r\n    // Chart instances will be stored when charts are initialized\r\n    setTimeout(() => {\r\n      this.initializeChartReferences();\r\n    }, 1000);\r\n  }\r\n\r\n  hasCharts(): boolean {\r\n    return Boolean(this.chartConfigs && Object.keys(this.chartConfigs).length > 0);\r\n  }\r\n\r\n  /**\r\n   * Get chart types that have available data\r\n   */\r\n  getAvailableCharts() {\r\n    return this.chartTypes.filter(chartType => this.chartConfigs[chartType.key]);\r\n  }\r\n\r\n  /**\r\n   * Get chart title by key (for backwards compatibility with copyChartAsImage)\r\n   */\r\n  getChartTitle(chartKey: string): string {\r\n    const chartType = this.chartTypes.find(type => type.key === chartKey);\r\n    return chartType ? chartType.title : chartKey;\r\n  }\r\n\r\n  /**\r\n   * Check if chart is a horizontal bar chart with many categories\r\n   */\r\n  isHorizontalBarChart(chartKey: string): boolean {\r\n    if (chartKey !== 'bar_chart' || !this.chartConfigs[chartKey]) {\r\n      return false;\r\n    }\r\n    \r\n    const config = this.chartConfigs[chartKey];\r\n    // Check if it's horizontal by looking at axis configuration\r\n    return config.yAxis?.type === 'category' && config.xAxis?.type === 'value';\r\n  }\r\n\r\n  /**\r\n   * Get dynamic height for horizontal bar charts (aligned with existing bar-visual.service.ts)\r\n   */\r\n  getChartHeight(chartKey: string): string {\r\n    if (!this.isHorizontalBarChart(chartKey)) {\r\n      return '250px'; // Default height for other charts\r\n    }\r\n\r\n    const config = this.chartConfigs[chartKey];\r\n    const categoryCount = config.yAxis?.data?.length || 0;\r\n    \r\n    // Use same formula as existing bar-visual.service.ts: 40px per category\r\n    const calculatedHeight = categoryCount * 35; // Match existing system\r\n    \r\n    return `${calculatedHeight}px`;\r\n  }\r\n\r\n  /**\r\n   * Check if chart needs scrollbar (simplified to match existing system)\r\n   */\r\n  needsScrollbar(chartKey: string): boolean {\r\n    if (!this.isHorizontalBarChart(chartKey)) {\r\n      return false;\r\n    }\r\n\r\n    const config = this.chartConfigs[chartKey];\r\n    const categoryCount = config.yAxis?.data?.length || 0;\r\n    \r\n    // Show scrollbar when height would exceed reasonable container size\r\n    const calculatedHeight = categoryCount * 40; // Same as getChartHeight()\r\n    \r\n    return calculatedHeight > 500; // Reasonable max height before scrolling\r\n  }\r\n\r\n  /**\r\n   * Get CSS classes for chart-card element\r\n   */\r\n  getChartCardClasses(chartKey: string): string {\r\n    const classes: string[] = [];\r\n    \r\n    if (this.needsScrollbar(chartKey)) {\r\n      classes.push('scrollable');\r\n    }\r\n    \r\n    return classes.join(' ');\r\n  }\r\n\r\n\r\n  private initializeChartReferences() {\r\n    // This method will be called after charts are rendered\r\n    // In ngx-echarts, we need to access the chart instances differently\r\n  }\r\n\r\n  async downloadVisualAsImage(chartType: string) {\r\n    try {\r\n      // Find the chart element by traversing DOM\r\n      const chartElements = document.querySelectorAll('.mini-chart canvas');\r\n      let targetCanvas: HTMLCanvasElement | null = null;\r\n      \r\n      // Get the chart container based on chart type\r\n      const chartContainers: any = document.querySelectorAll('.chart-card');\r\n      const chartTypeMap = {\r\n        'bar_chart': 'Bar Chart',\r\n        'pie_chart': 'Pie Chart',\r\n        'line_chart': 'Line Chart',\r\n        'scatter_plot': 'Scatter Plot',\r\n        'multi_trend_chart': 'Multi-Trend Analysis'\r\n      };\r\n      \r\n      for (const container of chartContainers) {\r\n        const titleElement = container.querySelector('h4');\r\n        if (titleElement?.textContent === chartTypeMap[chartType as keyof typeof chartTypeMap]) {\r\n          targetCanvas = container.querySelector('canvas');\r\n          break;\r\n        }\r\n      }\r\n\r\n      if (!targetCanvas) {\r\n        console.error('Chart canvas not found for:', chartType);\r\n        return;\r\n      }\r\n\r\n      // Generate filename with timestamp\r\n      const timestamp = new Date().toISOString().replace(/[:.]/g, '-').slice(0, -5);\r\n      const filename = `${chartType}_chart_${timestamp}.png`;\r\n\r\n      // Convert canvas to blob and download\r\n      targetCanvas.toBlob((blob) => {\r\n        if (!blob) {\r\n          console.error('Failed to create blob from canvas');\r\n          return;\r\n        }\r\n\r\n        // Download the image using FileSaver\r\n        FileSaver.saveAs(blob, filename);\r\n        console.log('Chart downloaded successfully:', filename);\r\n      }, 'image/png');\r\n\r\n    } catch (error) {\r\n      console.error('Error downloading chart as image:', error);\r\n    }\r\n  }\r\n\r\n  async copyChartAsImage(chartType: string): Promise<void> {\r\n    try {\r\n      // Find the chart element by traversing DOM\r\n      const chartElements = document.querySelectorAll('.mini-chart canvas');\r\n      let targetCanvas: HTMLCanvasElement | null = null;\r\n      \r\n      // Get the chart container based on chart type\r\n      const chartContainers :any= document.querySelectorAll('.chart-card');\r\n      const chartTypeMap = {\r\n        'bar_chart': 'Bar Chart',\r\n        'pie_chart': 'Pie Chart',\r\n        'line_chart': 'Line Chart',\r\n        'scatter_plot': 'Scatter Plot',\r\n        'multi_trend_chart': 'Multi-Trend Analysis'\r\n      };\r\n      \r\n      for (const container of chartContainers) {\r\n        const titleElement = container.querySelector('h4');\r\n        if (titleElement?.textContent === chartTypeMap[chartType as keyof typeof chartTypeMap]) {\r\n          targetCanvas = container.querySelector('canvas');\r\n          break;\r\n        }\r\n      }\r\n\r\n      if (!targetCanvas) {\r\n        console.error('Chart canvas not found for:', chartType);\r\n        return;\r\n      }\r\n\r\n      // Convert canvas to blob\r\n      targetCanvas.toBlob(async (blob) => {\r\n        if (!blob) {\r\n          console.error('Failed to create blob from canvas');\r\n          return;\r\n        }\r\n\r\n        try {\r\n          // Copy to clipboard using Clipboard API\r\n          const item = new ClipboardItem({ 'image/png': blob });\r\n          await navigator.clipboard.write([item]);\r\n          console.log('Chart copied to clipboard successfully');\r\n          \r\n          // Optional: Show user feedback\r\n          this.showCopyFeedback();\r\n        } catch (clipboardError) {\r\n          console.error('Failed to copy to clipboard:', clipboardError);\r\n          // Fallback: Download the image\r\n          this.downloadImage(blob, `${chartType}_chart.png`);\r\n        }\r\n      }, 'image/png');\r\n\r\n    } catch (error) {\r\n      console.error('Error copying chart as image:', error);\r\n    }\r\n  }\r\n\r\n  private showCopyFeedback() {\r\n    // Simple feedback - could be enhanced with a toast notification\r\n    console.log('Chart copied to clipboard!');\r\n  }\r\n\r\n  private downloadImage(blob: Blob, filename: string) {\r\n    // Fallback: download the image if clipboard fails\r\n    const url = URL.createObjectURL(blob);\r\n    const link = document.createElement('a');\r\n    link.href = url;\r\n    link.download = filename;\r\n    document.body.appendChild(link);\r\n    link.click();\r\n    document.body.removeChild(link);\r\n    URL.revokeObjectURL(url);\r\n  }\r\n}","<div *ngIf=\"hasCharts()\" class=\"charts-section\">\r\n  <!-- Dynamic Chart Rendering -->\r\n  <div *ngFor=\"let chartType of getAvailableCharts()\" \r\n       class=\"chart-card\"\r\n       [ngClass]=\"getChartCardClasses(chartType.key)\">\r\n    <div class=\"chart-header\">\r\n      <h4>{{ chartType.title }}</h4>\r\n      <div class=\"chart-actions\">\r\n        <button class=\"chart-action-button share-button\" \r\n                title=\"Share Chart\" \r\n                (click)=\"downloadVisualAsImage(chartType.key)\">\r\n          <app-svg-icon name=\"share-visual\" size=\"16px\"></app-svg-icon>\r\n          <span>Share</span>\r\n        </button>\r\n        <button class=\"chart-action-button copy-button\" \r\n                title=\"Copy as Image\" \r\n                (click)=\"copyChartAsImage(chartType.key)\">\r\n          <app-svg-icon name=\"copy-visual\" size=\"16px\"></app-svg-icon>\r\n          <span>Copy as Image</span>\r\n        </button>\r\n      </div>\r\n    </div>\r\n    <!-- Unified chart rendering (simplified like existing bar-visual.service.ts) -->\r\n    <div echarts \r\n         [options]=\"chartConfigs[chartType.key]\" \r\n         [class]=\"isHorizontalBarChart(chartType.key) ? 'horizontal-bar-chart' : 'mini-chart'\"\r\n         [style.height]=\"getChartHeight(chartType.key)\">\r\n    </div>\r\n  </div>\r\n</div>","import { Component, Input } from '@angular/core';\r\nimport { CommonModule, TitleCasePipe } from '@angular/common';\r\n\r\n@Component({\r\n  selector: 'app-data-table',\r\n  standalone: true,\r\n  imports: [\r\n    CommonModule,\r\n    TitleCasePipe\r\n  ],\r\n  templateUrl: './data-table.component.html',\r\n  styleUrl: './data-table.component.scss'\r\n})\r\nexport class DataTableComponent {\r\n  @Input() data: any[] = [];\r\n  @Input() dataFields: string[] = [];\r\n\r\n  // Show more functionality\r\n  showAllRows: boolean = false;\r\n  initialRowsToShow: number = 5;\r\n\r\n  formatCellValue(value: any): string {\r\n    if (typeof value === 'number') {\r\n      return value.toLocaleString();\r\n    }\r\n    return value?.toString() || '';\r\n  }\r\n\r\n  hasData(): boolean {\r\n    return this.data && this.data.length > 0;\r\n  }\r\n\r\n  getDisplayedData(): any[] {\r\n    if (!this.data || this.data.length === 0) {\r\n      return [];\r\n    }\r\n    \r\n    if (this.showAllRows || this.data.length <= this.initialRowsToShow) {\r\n      return this.data;\r\n    }\r\n    \r\n    return this.data.slice(0, this.initialRowsToShow);\r\n  }\r\n\r\n  shouldShowToggle(): boolean {\r\n    return this.data && this.data.length > this.initialRowsToShow;\r\n  }\r\n\r\n  toggleShowMore(): void {\r\n    this.showAllRows = !this.showAllRows;\r\n  }\r\n\r\n  getRemainingRowsCount(): number {\r\n    return Math.max(0, this.data.length - this.initialRowsToShow);\r\n  }\r\n\r\n  getRowCountText(): string {\r\n    if (!this.data || this.data.length === 0) {\r\n      return '';\r\n    }\r\n    \r\n    if (this.data.length <= this.initialRowsToShow) {\r\n      return `${this.data.length} row${this.data.length !== 1 ? 's' : ''}`;\r\n    }\r\n    \r\n    if (this.showAllRows) {\r\n      return `Showing all ${this.data.length} rows`;\r\n    }\r\n    \r\n    return `Showing ${this.initialRowsToShow} of ${this.data.length} rows`;\r\n  }\r\n}","<div *ngIf=\"hasData()\" class=\"data-table\">\r\n  <div class=\"table-header\">\r\n    <h4>Data Table</h4>\r\n    <div class=\"row-count\" *ngIf=\"getRowCountText()\">{{ getRowCountText() }}</div>\r\n  </div>\r\n  \r\n  <table class=\"mini-table\">\r\n    <thead>\r\n      <tr>\r\n        <th *ngFor=\"let column of dataFields\">{{ column | titlecase }}</th>\r\n      </tr>\r\n    </thead>\r\n    <tbody>\r\n      <tr *ngFor=\"let row of getDisplayedData()\">\r\n        <td *ngFor=\"let column of dataFields\">\r\n          {{ formatCellValue(row[column]) }}\r\n        </td>\r\n      </tr>\r\n    </tbody>\r\n  </table>\r\n  \r\n  <div class=\"table-actions\" *ngIf=\"shouldShowToggle()\">\r\n    <button \r\n      class=\"show-more-btn\" \r\n      (click)=\"toggleShowMore()\"\r\n      type=\"button\">\r\n      <span *ngIf=\"!showAllRows\">\r\n        Show More ({{ getRemainingRowsCount() }} remaining)\r\n      </span>\r\n      <span *ngIf=\"showAllRows\">\r\n        Show Less\r\n      </span>\r\n    </button>\r\n  </div>\r\n</div>","import { Component, Input } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { DashboardData } from '../../models/dashboard.model';\r\nimport { ChartsComponent } from '../charts/charts.component';\r\nimport { DataTableComponent } from '../data-table/data-table.component';\r\nimport { InsightsComponent } from '../insights/insights.component';\r\n\r\n@Component({\r\n  selector: 'app-dashboard-results',\r\n  standalone: true,\r\n  imports: [\r\n    CommonModule,\r\n    ChartsComponent,\r\n    DataTableComponent,\r\n  ],\r\n  templateUrl: './dashboard-results.component.html',\r\n  styleUrl: './dashboard-results.component.scss'\r\n})\r\nexport class DashboardResultsComponent {\r\n  @Input() dashboardData!: DashboardData;\r\n\r\n  hasCharts(dashboardData?: DashboardData): boolean {\r\n    const data = dashboardData || this.dashboardData;\r\n    return Boolean(data?.chart_configs && \r\n           Object.keys(data.chart_configs).length > 0);\r\n  }\r\n}","<div class=\"dashboard-results\">\r\n  \r\n  <!-- Charts Section -->\r\n  <app-charts \r\n    *ngIf=\"hasCharts(dashboardData)\" \r\n    [chartConfigs]=\"dashboardData.chart_configs\">\r\n  </app-charts>\r\n\r\n  <!-- Data Table -->\r\n  <app-data-table \r\n    *ngIf=\"dashboardData.data && dashboardData.data.length > 0\"\r\n    [data]=\"dashboardData.data\" \r\n    [dataFields]=\"dashboardData.data_fields\">\r\n  </app-data-table>\r\n</div>","import { Component, Input } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\n@Component({\r\n  selector: 'app-insights',\r\n  standalone: true,\r\n  imports: [\r\n    CommonModule\r\n  ],\r\n  templateUrl: './insights.component.html',\r\n  styleUrl: './insights.component.scss'\r\n})\r\nexport class InsightsComponent {\r\n  @Input() insights: string[] = [];\r\n\r\n  hasInsights(): boolean {\r\n    return this.insights && this.insights.length > 0;\r\n  }\r\n}","<div *ngIf=\"hasInsights()\" class=\"insights-section\">\r\n  <h4>💡 Key Insights</h4>\r\n  <ul>\r\n    <li *ngFor=\"let insight of insights\">{{ insight }}</li>\r\n  </ul>\r\n</div>","import { Component, Input, OnInit, OnDestroy, ChangeDetectionStrategy, OnChanges, SimpleChanges } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { Observable, BehaviorSubject, combineLatest } from 'rxjs';\r\nimport { map, startWith, switchMap } from 'rxjs/operators';\r\nimport { AnimatedDotsService } from '../services/animated-dots.service';\r\nimport { \r\n  AnimatedTextStyle, \r\n  AnimationConfig, \r\n  DEFAULT_TEXT_STYLE,\r\n  TEXT_STYLE_PRESETS \r\n} from '../models/animated-text.model';\r\n\r\n@Component({\r\n  selector: 'app-animated-text',\r\n  standalone: true,\r\n  imports: [CommonModule],\r\n  changeDetection: ChangeDetectionStrategy.OnPush,\r\n  template: `\r\n    <span \r\n      class=\"animated-text\"\r\n      [ngStyle]=\"computedStyle$ | async\"\r\n      [class.paused]=\"isPaused\"\r\n      (mouseenter)=\"onMouseEnter()\"\r\n      (mouseleave)=\"onMouseLeave()\">\r\n      {{ animatedText$ | async }}\r\n    </span>\r\n  `,\r\n  styles: [`\r\n    .animated-text {\r\n      transition: all 0.2s ease-in-out;\r\n      display: inline-block;\r\n    }\r\n    \r\n    .animated-text.paused {\r\n      animation-play-state: paused;\r\n    }\r\n    \r\n    /* Smooth dot animation */\r\n    .animated-text::after {\r\n      content: '';\r\n      animation: fadeIn 0.2s ease-in-out;\r\n    }\r\n    \r\n    @keyframes fadeIn {\r\n      from { opacity: 0; }\r\n      to { opacity: 1; }\r\n    }\r\n    \r\n    /* High contrast mode support */\r\n    @media (prefers-contrast: high) {\r\n      .animated-text {\r\n        font-weight: bold;\r\n      }\r\n    }\r\n    \r\n    /* Reduced motion support */\r\n    @media (prefers-reduced-motion: reduce) {\r\n      .animated-text {\r\n        animation: none !important;\r\n        transition: none !important;\r\n      }\r\n    }\r\n  `]\r\n})\r\nexport class AnimatedTextComponent implements OnInit, OnDestroy, OnChanges {\r\n  @Input() baseText: string = '';\r\n  @Input() enabled: boolean = true;\r\n  @Input() style: AnimatedTextStyle = {};\r\n  @Input() preset: keyof typeof TEXT_STYLE_PRESETS | null = null;\r\n  @Input() animationConfig: Partial<AnimationConfig> = {};\r\n  @Input() pauseOnHover: boolean = true;\r\n\r\n  private enabled$ = new BehaviorSubject<boolean>(true);\r\n  private style$ = new BehaviorSubject<AnimatedTextStyle>({});\r\n  private isPausedSubject$ = new BehaviorSubject<boolean>(false);\r\n\r\n  animatedText$!: Observable<string>;\r\n  computedStyle$!: Observable<AnimatedTextStyle>;\r\n  isPaused = false;\r\n\r\n  constructor(private animatedDotsService: AnimatedDotsService) {}\r\n\r\n  ngOnInit(): void {\r\n    this.initializeObservables();\r\n  }\r\n\r\n  ngOnChanges(changes: SimpleChanges): void {\r\n    if (changes['enabled']) {\r\n      this.enabled$.next(this.enabled);\r\n    }\r\n    \r\n    if (changes['style'] || changes['preset']) {\r\n      this.updateStyle();\r\n    }\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    this.enabled$.complete();\r\n    this.style$.complete();\r\n    this.isPausedSubject$.complete();\r\n  }\r\n\r\n  private initializeObservables(): void {\r\n    // Initialize style\r\n    this.updateStyle();\r\n\r\n    // Create animated text observable\r\n    this.animatedText$ = combineLatest([\r\n      this.enabled$,\r\n      this.isPausedSubject$\r\n    ]).pipe(\r\n      map(([enabled, paused]) => enabled && !paused),\r\n      switchMap(shouldAnimate => \r\n        this.animatedDotsService.createAnimatedText(\r\n          this.baseText,\r\n          new BehaviorSubject(shouldAnimate),\r\n          this.animationConfig\r\n        )\r\n      )\r\n    );\r\n\r\n    // Create computed style observable\r\n    this.computedStyle$ = this.style$.asObservable().pipe(\r\n      startWith(this.computeCurrentStyle())\r\n    );\r\n  }\r\n\r\n  private updateStyle(): void {\r\n    const computedStyle = this.computeCurrentStyle();\r\n    this.style$.next(computedStyle);\r\n  }\r\n\r\n  private computeCurrentStyle(): AnimatedTextStyle {\r\n    const baseStyle = { ...DEFAULT_TEXT_STYLE };\r\n    const presetStyle = this.preset ? TEXT_STYLE_PRESETS[this.preset] : {};\r\n    const customStyle = this.style || {};\r\n    \r\n    return {\r\n      ...baseStyle,\r\n      ...presetStyle,\r\n      ...customStyle\r\n    };\r\n  }\r\n\r\n  onMouseEnter(): void {\r\n    if (this.pauseOnHover && this.animationConfig.pauseOnHover !== false) {\r\n      this.isPaused = true;\r\n      this.isPausedSubject$.next(true);\r\n    }\r\n  }\r\n\r\n  onMouseLeave(): void {\r\n    if (this.pauseOnHover && this.animationConfig.pauseOnHover !== false) {\r\n      this.isPaused = false;\r\n      this.isPausedSubject$.next(false);\r\n    }\r\n  }\r\n}","import { Component, Input, OnInit, OnChanges } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\r\nimport { MatChipsModule } from '@angular/material/chips';\r\nimport { StepProgress } from '../services/streaming-analytics.service';\r\nimport { AnimatedTextComponent } from './animated-text.component';\r\nimport { AnimatedTextPipe } from '../pipes/animated-text.pipe';\r\n\r\n@Component({\r\n  selector: 'app-step-progress',\r\n  standalone: true,\r\n  imports: [\r\n    CommonModule,\r\n    MatIconModule,\r\n    MatProgressBarModule,\r\n    MatChipsModule,\r\n    AnimatedTextComponent,\r\n  ],\r\n  template: `\r\n    <div class=\"timeline-step\" [class]=\"'step-' + step.status\">\r\n      <!-- Timeline Indicator (Circle) -->\r\n      <div class=\"step-number-circle\">\r\n        <p class=\"step-number-text\">\r\n          {{ step.step_id + 1 }}\r\n        </p>\r\n      </div>\r\n\r\n      <!-- Step Content -->\r\n      <div class=\"timeline-content\">\r\n        <!-- Step Meta Information -->\r\n        <div class=\"step-meta\">\r\n          <p class=\"step-type\" style=\"text-transform: capitalize;\">\r\n            {{ step.step_type }}\r\n          </p>\r\n          <!-- <span class=\"step-number\">Step {{ step.step_id + 1 }}</span>\r\n          <span class=\"step-progress\" *ngIf=\"step.status !== 'started'\">{{\r\n            step.progress\r\n          }}</span>\r\n          <span class=\"step-progress\" *ngIf=\"step.status === 'started'\">\r\n            {{\r\n              step.progress | animatedText : true : { speed: 600, maxDots: 2 }\r\n            }}\r\n          </span> -->\r\n        </div>\r\n\r\n        <!-- Step Title and Description -->\r\n        <div class=\"step-header\">\r\n          <p class=\"step-title\">\r\n            <app-animated-text\r\n              [baseText]=\"step.step_description\"\r\n              [enabled]=\"step.status === 'started'\"\r\n              preset=\"step\"\r\n              [animationConfig]=\"{ speed: 800, maxDots: 3, pauseOnHover: true }\"\r\n            >\r\n            </app-animated-text>\r\n          </p>\r\n        </div>\r\n\r\n        <!-- Execution Time -->\r\n        <!-- <div class=\"step-time\" *ngIf=\"step.execution_time\">\r\n          <mat-icon>schedule</mat-icon>\r\n          <span>{{step.execution_time | number:'1.2-2'}}s</span>\r\n        </div> -->\r\n\r\n        <!-- Progress Bar for Active Steps -->\r\n        <!-- <div class=\"step-progress-bar\" *ngIf=\"step.status === 'started'\">\r\n          <mat-progress-bar\r\n            mode=\"indeterminate\"\r\n            color=\"primary\"\r\n          ></mat-progress-bar>\r\n        </div> -->\r\n\r\n        <!-- Error Message -->\r\n        <div class=\"error-details\" *ngIf=\"step.status === 'failed'\">\r\n          <mat-icon>error_outline</mat-icon>\r\n          <span>{{ getErrorMessage() }}</span>\r\n        </div>\r\n      </div>\r\n\r\n      <!-- Step Status Badge -->\r\n      <div class=\"status-chip flex py-1 px-2\" [class]=\"'status-' + step.status\">\r\n        <div class=\"flex items-center\">\r\n          <div class=\"timeline-indicator\">\r\n            <div class=\"indicator-circle\" [class]=\"getIndicatorClass()\">\r\n              <mat-icon *ngIf=\"step.status === 'completed'\">check</mat-icon>\r\n              <mat-icon *ngIf=\"step.status === 'failed'\">close</mat-icon>\r\n              <div\r\n                *ngIf=\"step.status === 'started'\"\r\n                class=\"loading-spinner\"\r\n              ></div>\r\n            </div>\r\n          </div>\r\n          {{ getStatusText() }}\r\n        </div>\r\n      </div>\r\n    </div>\r\n  `,\r\n  styles: [\r\n    `\r\n      /* Timeline step styling */\r\n      .timeline-step {\r\n        display: flex;\r\n        align-items: flex-start;\r\n        position: relative;\r\n        padding: 4px 8px;\r\n        margin-bottom: 24px;\r\n      }\r\n\r\n      .timeline-step:last-child {\r\n        margin-bottom: 0;\r\n      }\r\n\r\n      .mat-mdc-standard-chip {\r\n        padding: 4px 8px !important;\r\n      }\r\n\r\n      /* Step number circle (left side) */\r\n      .step-number-circle {\r\n        height: 20px;\r\n        width: 20px;\r\n        border-radius: 50%;\r\n        border: 1px solid #D0D0D0;\r\n        display: flex;\r\n        align-items: center;\r\n        justify-content: center;\r\n        margin-right: 12px;\r\n        flex-shrink: 0;\r\n      }\r\n\r\n      .step-number-text {\r\n        color: #818181;\r\n        font-size: 12px;\r\n        font-weight: 600;\r\n        margin: 0;\r\n      }\r\n      /* Timeline indicator (left side) */\r\n      .timeline-indicator {\r\n        display: flex;\r\n        flex-direction: column;\r\n        align-items: center;\r\n        margin-right: 5px;\r\n        z-index: 2;\r\n      }\r\n\r\n      /* Circular step indicators */\r\n      .indicator-circle {\r\n        width: 16px;\r\n        height: 16px;\r\n        border-radius: 50%;\r\n        display: flex;\r\n        align-items: center;\r\n        justify-content: center;\r\n        position: relative;\r\n        transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\r\n      }\r\n\r\n      .indicator-circle mat-icon {\r\n        font-size: 16px;\r\n        width: 16px;\r\n        height: 16px;\r\n      }\r\n\r\n      .indicator-circle .loading-spinner {\r\n        width: 16px;\r\n        height: 16px;\r\n        border: 2px solid #ED4B6B;\r\n        border-top: 2px solid white;\r\n        border-radius: 50%;\r\n        animation: spin 1s linear infinite;\r\n      }\r\n\r\n      /* Status-based indicator styling */\r\n      .step-completed .indicator-circle {\r\n        background: #cce5c8;\r\n      }\r\n\r\n      .step-completed .indicator-circle mat-icon {\r\n        color: #4caf50;\r\n      }\r\n\r\n      .step-failed .indicator-circle {\r\n        background: linear-gradient(135deg, #f44336 0%, #e53935 100%);\r\n        box-shadow: 0 4px 12px rgba(244, 67, 54, 0.3);\r\n        border: 2px solid #ffcdd2;\r\n      }\r\n\r\n      .step-started .indicator-circle {\r\n        animation: pulse-glow 2s infinite;\r\n      }\r\n\r\n      .step-pending .indicator-circle {\r\n        background: #e0e0e0;\r\n        border: 2px solid #bdbdbd;\r\n      }\r\n\r\n      .step-pending .indicator-circle::after {\r\n        content: '';\r\n        width: 8px;\r\n        height: 8px;\r\n        background: #9e9e9e;\r\n        border-radius: 50%;\r\n      }\r\n\r\n      /* Timeline content (right side) */\r\n      .timeline-content {\r\n        flex: 1;\r\n        min-width: 0;\r\n      }\r\n\r\n      /* Step header */\r\n      .step-header {\r\n        display: flex;\r\n        justify-content: space-between;\r\n        align-items: flex-start;\r\n      }\r\n\r\n      .step-title {\r\n        margin: 0;\r\n        font-size: 16px;\r\n        font-weight: 600;\r\n        color: #263238;\r\n        line-height: 1.3;\r\n        flex: 1;\r\n        margin-right: 12px;\r\n      }\r\n\r\n      /* Status chip */\r\n      .status-chip {\r\n        height: 24px;\r\n        font-size: 11px;\r\n        font-weight: 600;\r\n        border-radius: 6px;\r\n        padding: 0 8px;\r\n        min-height: auto;\r\n      }\r\n\r\n      .status-chip.status-completed {\r\n        background: #cce5c8;\r\n        color: #414141;\r\n      }\r\n\r\n      .status-chip.status-completed mat-icon {\r\n        color: #4caf50;\r\n      }\r\n\r\n      .status-chip.status-failed {\r\n        background: rgba(244, 67, 54, 0.1);\r\n        color: #c62828;\r\n      }\r\n\r\n      .status-chip.status-started {\r\n        background: #fff;\r\n        color: #414141;\r\n        border: 1px solid #D0D0D0;\r\n      }\r\n\r\n      .status-chip.status-pending {\r\n        background: rgba(158, 158, 158, 0.1);\r\n        color: #616161;\r\n      }\r\n\r\n      /* Step metadata */\r\n      .step-meta {\r\n        display: flex;\r\n        gap: 16px;\r\n        align-items: center;\r\n        font-size: 12px;\r\n        color: #666;\r\n      }\r\n\r\n      .step-meta .step-type {\r\n        font-weight: 500;\r\n        color: #37474f;\r\n      }\r\n\r\n      .step-meta .step-number {\r\n        background: rgba(33, 150, 243, 0.1);\r\n        color: #1565c0;\r\n        padding: 2px 6px;\r\n        border-radius: 4px;\r\n        font-weight: 500;\r\n      }\r\n\r\n      .step-meta .step-progress {\r\n        color: #546e7a;\r\n      }\r\n\r\n      /* Execution time */\r\n      .step-time {\r\n        display: flex;\r\n        align-items: center;\r\n        gap: 4px;\r\n        margin-bottom: 8px;\r\n        font-size: 12px;\r\n        color: #666;\r\n      }\r\n\r\n      .step-time mat-icon {\r\n        font-size: 16px;\r\n        width: 16px;\r\n        height: 16px;\r\n        color: #909090;\r\n      }\r\n\r\n      /* Progress bar for active steps */\r\n      .step-progress-bar {\r\n        margin-top: 12px;\r\n      }\r\n\r\n      .step-progress-bar ::ng-deep .mat-mdc-progress-bar {\r\n        height: 4px !important;\r\n        border-radius: 2px;\r\n      }\r\n\r\n      .step-progress-bar ::ng-deep .mat-mdc-progress-bar .mdc-linear-progress__bar-inner {\r\n        border-radius: 2px;\r\n      }\r\n\r\n      /* Error details */\r\n      .error-details {\r\n        display: flex;\r\n        align-items: flex-start;\r\n        gap: 8px;\r\n        margin-top: 12px;\r\n        padding: 12px;\r\n        background: rgba(244, 67, 54, 0.05);\r\n        border-left: 4px solid #f44336;\r\n        border-radius: 4px;\r\n        color: #c62828;\r\n        font-size: 13px;\r\n        line-height: 1.4;\r\n      }\r\n\r\n      .error-details mat-icon {\r\n        font-size: 18px;\r\n        width: 18px;\r\n        height: 18px;\r\n        margin-top: 1px;\r\n        flex-shrink: 0;\r\n      }\r\n\r\n      /* Animations */\r\n      @keyframes spin {\r\n        0% {\r\n          transform: rotate(0deg);\r\n        }\r\n        100% {\r\n          transform: rotate(360deg);\r\n        }\r\n      }\r\n\r\n      @keyframes pulse-glow {\r\n        0% {\r\n          box-shadow: 0 4px 12px rgba(33, 150, 243, 0.3);\r\n          transform: scale(1);\r\n        }\r\n        50% {\r\n          box-shadow: 0 6px 16px rgba(33, 150, 243, 0.5);\r\n          transform: scale(1.05);\r\n        }\r\n        100% {\r\n          box-shadow: 0 4px 12px rgba(33, 150, 243, 0.3);\r\n          transform: scale(1);\r\n        }\r\n      }\r\n\r\n      /* Dark mode specific styles */\r\n      :host-context([data-theme=\"dark\"]) .step-number-circle,\r\n      :host-context(body.dark-theme) .step-number-circle {\r\n        border-color: #363636 !important;\r\n      }\r\n\r\n      :host-context([data-theme=\"dark\"]) .step-number-text,\r\n      :host-context(body.dark-theme) .step-number-text {\r\n        color: #909090 !important;\r\n      }\r\n\r\n      :host-context([data-theme=\"dark\"]) .timeline-step p,\r\n      :host-context(body.dark-theme) .timeline-step p {\r\n        color: #E6EDF3 !important;\r\n      }\r\n\r\n      :host-context([data-theme=\"dark\"]) .step-title,\r\n      :host-context(body.dark-theme) .step-title {\r\n        color: #E6EDF3 !important;\r\n      }\r\n\r\n      :host-context([data-theme=\"dark\"]) .step-meta,\r\n      :host-context(body.dark-theme) .step-meta {\r\n        color: #909090;\r\n      }\r\n\r\n      :host-context([data-theme=\"dark\"]) .step-meta .step-type,\r\n      :host-context(body.dark-theme) .step-meta .step-type {\r\n        color: #E6EDF3;\r\n      }\r\n\r\n      :host-context([data-theme=\"dark\"]) .step-meta .step-progress,\r\n      :host-context(body.dark-theme) .step-meta .step-progress {\r\n        color: #909090;\r\n      }\r\n\r\n      :host-context([data-theme=\"dark\"]) .step-time,\r\n      :host-context(body.dark-theme) .step-time {\r\n        color: #909090;\r\n      }\r\n\r\n      :host-context([data-theme=\"dark\"]) .status-chip.status-completed,\r\n      :host-context(body.dark-theme) .status-chip.status-completed {\r\n        background: #20C997 !important;\r\n        color: #FFFFFF !important;\r\n      }\r\n\r\n      :host-context([data-theme=\"dark\"]) .status-chip.status-completed mat-icon,\r\n      :host-context(body.dark-theme) .status-chip.status-completed mat-icon {\r\n        color: #FFFFFF !important;\r\n      }\r\n\r\n      :host-context([data-theme=\"dark\"]) .status-chip.status-started,\r\n      :host-context(body.dark-theme) .status-chip.status-started {\r\n        background: rgb(18, 18, 18) !important;\r\n        color: #E6EDF3 !important;\r\n        border-color: #363636 !important;\r\n      }\r\n\r\n      :host-context([data-theme=\"dark\"]) .status-chip.status-pending,\r\n      :host-context(body.dark-theme) .status-chip.status-pending {\r\n        background: rgba(158, 158, 158, 0.2) !important;\r\n        color: #909090 !important;\r\n      }\r\n\r\n      :host-context([data-theme=\"dark\"]) .indicator-circle,\r\n      :host-context(body.dark-theme) .indicator-circle {\r\n        border-color: #363636;\r\n      }\r\n\r\n      :host-context([data-theme=\"dark\"]) .indicator-circle mat-icon,\r\n      :host-context(body.dark-theme) .indicator-circle mat-icon {\r\n        color: #E6EDF3 !important;\r\n      }\r\n\r\n      :host-context([data-theme=\"dark\"]) .step-completed .indicator-circle,\r\n      :host-context(body.dark-theme) .step-completed .indicator-circle {\r\n        background: #20C997 !important;\r\n      }\r\n\r\n      :host-context([data-theme=\"dark\"]) .step-completed .indicator-circle mat-icon,\r\n      :host-context(body.dark-theme) .step-completed .indicator-circle mat-icon {\r\n        color: #FFFFFF !important;\r\n      }\r\n\r\n      :host-context([data-theme=\"dark\"]) .step-pending .indicator-circle,\r\n      :host-context(body.dark-theme) .step-pending .indicator-circle {\r\n        background: #363636;\r\n        border-color: #555555;\r\n      }\r\n\r\n      :host-context([data-theme=\"dark\"]) .step-pending .indicator-circle::after,\r\n      :host-context(body.dark-theme) .step-pending .indicator-circle::after {\r\n        background: #666666;\r\n      }\r\n\r\n      :host-context([data-theme=\"dark\"]) .error-details,\r\n      :host-context(body.dark-theme) .error-details {\r\n        background: rgba(244, 67, 54, 0.15);\r\n        border-left-color: #ff5a5f;\r\n        color: #ff8a80;\r\n      }\r\n    `,\r\n  ],\r\n})\r\nexport class StepProgressComponent implements OnInit, OnChanges {\r\n  @Input() step!: StepProgress;\r\n\r\n  ngOnInit() {\r\n    console.log(\r\n      '🔍 DEBUG STEP-PROGRESS: Component initialized with step:',\r\n      this.step\r\n    );\r\n    console.log(\r\n      '🔍 DEBUG STEP-PROGRESS: Step description:',\r\n      this.step?.step_description\r\n    );\r\n    console.log('🔍 DEBUG STEP-PROGRESS: Step status:', this.step?.status);\r\n    this.validateAndSanitizeStep();\r\n  }\r\n\r\n  ngOnChanges() {\r\n    console.log('🔍 DEBUG STEP-PROGRESS: Step data changed:', this.step);\r\n    console.log(\r\n      '🔍 DEBUG STEP-PROGRESS: Current step description:',\r\n      this.step?.step_description\r\n    );\r\n    console.log(\r\n      '🔍 DEBUG STEP-PROGRESS: Current step status:',\r\n      this.step?.status\r\n    );\r\n    this.validateAndSanitizeStep();\r\n  }\r\n\r\n  private validateAndSanitizeStep() {\r\n    if (!this.step) {\r\n      return;\r\n    }\r\n\r\n    // Ensure step has valid description\r\n    if (\r\n      !this.step.step_description ||\r\n      this.step.step_description.trim().length === 0\r\n    ) {\r\n      this.step.step_description = this.getDefaultStepDescription();\r\n      console.warn(\r\n        'Step missing description, using fallback:',\r\n        this.step.step_description\r\n      );\r\n    }\r\n\r\n    // Ensure step has valid progress\r\n    if (!this.step.progress) {\r\n      this.step.progress = this.getDefaultProgress();\r\n    }\r\n\r\n    // Ensure timestamp exists\r\n    if (!this.step.timestamp) {\r\n      this.step.timestamp = Date.now();\r\n    }\r\n  }\r\n\r\n  private getDefaultStepDescription(): string {\r\n    const stepTypeDescriptions: { [key: string]: string } = {\r\n      FETCH: 'Fetching data from database',\r\n      FETCH_DEPENDENT: 'Processing dependent data query',\r\n      EVALUATE: 'Evaluating query results',\r\n      INFER: 'Generating insights and conclusions',\r\n      initialization: 'Initializing process',\r\n    };\r\n\r\n    const typeDescription =\r\n      stepTypeDescriptions[this.step.step_type] || 'Processing step';\r\n    return `${typeDescription} (Step ${this.step.step_id + 1})`;\r\n  }\r\n\r\n  private getDefaultProgress(): string {\r\n    switch (this.step.status) {\r\n      case 'started':\r\n        return 'In Progress...';\r\n      case 'completed':\r\n        return 'Completed';\r\n      case 'failed':\r\n        return 'Failed';\r\n      default:\r\n        return 'Pending';\r\n    }\r\n  }\r\n\r\n  debugRender() {\r\n    console.log(\r\n      '🔍 DEBUG STEP-PROGRESS: Rendering with step_description:',\r\n      this.step?.step_description\r\n    );\r\n    return this.step?.step_description || 'NO DESCRIPTION';\r\n  }\r\n\r\n  getStepIcon(): string {\r\n    switch (this.step.status) {\r\n      case 'completed':\r\n        return 'check_circle';\r\n      case 'failed':\r\n        return 'error';\r\n      case 'started':\r\n        return 'hourglass_empty';\r\n      default:\r\n        return 'radio_button_unchecked';\r\n    }\r\n  }\r\n\r\n  getStepIconClass(): string {\r\n    return `step-icon ${this.step.status}`;\r\n  }\r\n\r\n  getStatusColor(): string {\r\n    switch (this.step.status) {\r\n      case 'completed':\r\n        return 'primary';\r\n      case 'failed':\r\n        return 'warn';\r\n      case 'started':\r\n        return 'accent';\r\n      default:\r\n        return '';\r\n    }\r\n  }\r\n\r\n  getStatusText(): string {\r\n    switch (this.step.status) {\r\n      case 'completed':\r\n        return 'Completed';\r\n      case 'failed':\r\n        return 'Failed';\r\n      case 'started':\r\n        return 'Running';\r\n      default:\r\n        return 'Pending';\r\n    }\r\n  }\r\n\r\n  getErrorMessage(): string {\r\n    if (this.step.status === 'failed' && this.step.error_message) {\r\n      return this.step.error_message;\r\n    }\r\n    return this.step.status === 'failed' ? 'Step execution failed' : '';\r\n  }\r\n\r\n  getIndicatorClass(): string {\r\n    return `indicator-circle ${this.step.status}`;\r\n  }\r\n}\r\n","import { Component, Input, OnChanges, SimpleChanges } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\r\nimport { MatCardModule } from '@angular/material/card';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { StepProgress, PhaseUpdate } from '../../services/streaming-analytics.service';\r\nimport { StepProgressComponent } from '../step-progress.component';\r\nimport { AnimatedTextComponent } from '../animated-text.component';\r\nimport { AnimatedTextPipe } from '../../pipes/animated-text.pipe';\r\nimport { SvgIconComponent } from \"../svg-icon/svg-icon.component\";\r\n\r\n@Component({\r\n  selector: 'app-execution-timeline',\r\n  standalone: true,\r\n  imports: [\r\n    CommonModule,\r\n    MatIconModule,\r\n    MatProgressBarModule,\r\n    MatCardModule,\r\n    MatButtonModule,\r\n    StepProgressComponent,\r\n    AnimatedTextComponent,\r\n    SvgIconComponent\r\n],\r\n  templateUrl: './execution-timeline.component.html',\r\n  styleUrls: ['./execution-timeline.component.scss']\r\n})\r\nexport class ExecutionTimelineComponent implements OnChanges {\r\n  @Input() currentPhase: PhaseUpdate | null = null;\r\n  @Input() steps: StepProgress[] = [];\r\n  @Input() isProcessing = false;\r\n  @Input() isCompleted = false;\r\n  \r\n  // Collapse/expand state\r\n  isCollapsed = false;\r\n  \r\n  // Timeline animation state\r\n  isTimelineExtending = false;\r\n  private previousStepCount = 0;\r\n  \r\n  get totalSteps(): number {\r\n    return this.steps.length;\r\n  }\r\n  \r\n  get completedSteps(): number {\r\n    return this.steps.filter(step => step.status === 'completed').length;\r\n  }\r\n  \r\n  get failedSteps(): number {\r\n    return this.steps.filter(step => step.status === 'failed').length;\r\n  }\r\n  \r\n  getProgressPercentage(): number {\r\n    if (this.totalSteps === 0) return 0;\r\n    return Math.round((this.completedSteps / this.totalSteps) * 100);\r\n  }\r\n  \r\n  getTotalExecutionTime(): string {\r\n    const total = this.steps\r\n      .filter(step => step.execution_time)\r\n      .reduce((sum, step) => sum + (step.execution_time || 0), 0);\r\n    return total.toFixed(2);\r\n  }\r\n  \r\n  trackByStepId(index: number, step: StepProgress): number {\r\n    return step.step_id;\r\n  }\r\n  \r\n  ngOnChanges(changes: SimpleChanges): void {\r\n    // Auto-collapse when processing completes\r\n    if (changes['isCompleted'] && changes['isCompleted'].currentValue === true && !changes['isCompleted'].previousValue) {\r\n      // Delay collapse slightly to let users see the completion\r\n      setTimeout(() => {\r\n        this.isCollapsed = true;\r\n      }, 1000);\r\n    }\r\n    \r\n    // Reset collapse state when new processing starts\r\n    if (changes['isProcessing'] && changes['isProcessing'].currentValue === true) {\r\n      this.isCollapsed = false;\r\n    }\r\n    \r\n    // For historical data (isCompleted = true initially), start collapsed\r\n    if (changes['isCompleted'] && changes['isCompleted'].currentValue === true && changes['isCompleted'].previousValue === undefined) {\r\n      this.isCollapsed = true;\r\n    }\r\n    \r\n    // For historical steps loaded from database, start collapsed\r\n    if (changes['steps'] && changes['steps'].currentValue && changes['steps'].currentValue.length > 0 && this.isCompleted && !this.isProcessing) {\r\n      this.isCollapsed = true;\r\n    }\r\n    \r\n    // Trigger timeline extending animation when new steps are added\r\n    if (changes['steps'] && changes['steps'].currentValue) {\r\n      const currentStepCount = changes['steps'].currentValue.length;\r\n      if (currentStepCount > this.previousStepCount && this.previousStepCount > 0) {\r\n        this.triggerTimelineExtendingAnimation();\r\n      }\r\n      this.previousStepCount = currentStepCount;\r\n    }\r\n  }\r\n  \r\n  toggleCollapse(): void {\r\n    this.isCollapsed = !this.isCollapsed;\r\n  }\r\n  \r\n  private triggerTimelineExtendingAnimation(): void {\r\n    this.isTimelineExtending = true;\r\n    setTimeout(() => {\r\n      this.isTimelineExtending = false;\r\n    }, 800); // Match animation duration\r\n  }\r\n  \r\n  getPhaseIcon(phase: string): string {\r\n    switch (phase) {\r\n      case 'planning':\r\n        return 'lightbulb';\r\n      case 'analyzing_dependencies':\r\n        return 'account_tree';\r\n      case 'optimizing':\r\n        return 'tune';\r\n      case 'executing':\r\n        return 'play_arrow';\r\n      case 'visualizing':\r\n        return 'bar_chart';\r\n      default:\r\n        return 'hourglass_empty';\r\n    }\r\n  }\r\n  \r\n  getPhaseTitle(phase: string): string {\r\n    switch (phase) {\r\n      case 'planning':\r\n        return 'Planning Execution';\r\n      case 'analyzing_dependencies':\r\n        return 'Analyzing Dependencies';\r\n      case 'optimizing':\r\n        return 'Optimizing Execution';\r\n      case 'executing':\r\n        return 'Executing Steps';\r\n      case 'visualizing':\r\n        return 'Generating Visualizations';\r\n      default:\r\n        return 'Processing';\r\n    }\r\n  }\r\n}","<mat-card class=\"timeline-card\" [class.collapsed]=\"isCollapsed\">\r\n  <mat-card-header (click)=\"toggleCollapse()\" class=\"cursor-pointer\">\r\n    <mat-card-title>\r\n      <app-svg-icon name=\"logo\" size=\"20px\"></app-svg-icon>\r\n      Execution Timeline\r\n    </mat-card-title>\r\n    <div class=\"timeline-actions\">\r\n      <button\r\n        [title]=\"isCollapsed ? 'Expand timeline' : 'Collapse timeline'\"\r\n        class=\"collapse-button\"\r\n      >\r\n        <mat-icon [class.rotated]=\"!isCollapsed\">expand_more</mat-icon>\r\n      </button>\r\n    </div>\r\n  </mat-card-header>\r\n\r\n  <mat-card-content\r\n    [ngStyle]=\"{\r\n      display: isCollapsed ? 'none' : 'flex'\r\n    }\"\r\n  >\r\n    <div class=\"timeline-content\" [class.collapsed]=\"isCollapsed\">\r\n      <!-- Current Phase -->\r\n      <div class=\"current-phase\" *ngIf=\"currentPhase\">\r\n        <div class=\"phase-header\">\r\n          <mat-icon class=\"phase-icon\">{{\r\n            getPhaseIcon(currentPhase.phase)\r\n          }}</mat-icon>\r\n          <div class=\"phase-details\">\r\n            <h3>{{ getPhaseTitle(currentPhase.phase) }}</h3>\r\n            <p>\r\n              <app-animated-text\r\n                [baseText]=\"currentPhase.message\"\r\n                [enabled]=\"isProcessing\"\r\n                preset=\"phase\"\r\n                [animationConfig]=\"{ speed: 600, maxDots: 3 }\"\r\n              >\r\n              </app-animated-text>\r\n            </p>\r\n          </div>\r\n        </div>\r\n      </div>\r\n\r\n      <!-- Overall Progress -->\r\n      <!-- <div class=\"overall-progress\" *ngIf=\"totalSteps > 0\">\r\n        <div class=\"progress-header\">\r\n          <span>Overall Progress: {{completedSteps}}/{{totalSteps}} steps</span>\r\n          <span class=\"progress-percentage\">{{getProgressPercentage()}}%</span>\r\n        </div>\r\n        <mat-progress-bar \r\n          mode=\"determinate\" \r\n          [value]=\"getProgressPercentage()\"\r\n          color=\"primary\">\r\n        </mat-progress-bar>\r\n      </div> -->\r\n\r\n      <!-- Step Progress List -->\r\n      <div class=\"steps-timeline\">\r\n        <!-- <h4 *ngIf=\"steps.length > 0\">Step Details:</h4> -->\r\n        <div\r\n          class=\"steps-container\"\r\n          [class.timeline-extending]=\"isTimelineExtending\"\r\n        >\r\n          <app-step-progress\r\n            *ngFor=\"let step of steps; trackBy: trackByStepId\"\r\n            [step]=\"step\"\r\n            [class]=\"'step-' + step.status\"\r\n          >\r\n          </app-step-progress>\r\n        </div>\r\n\r\n        <!-- Empty state -->\r\n        <div class=\"empty-state\" *ngIf=\"steps.length === 0 && !isProcessing\">\r\n          <mat-icon>hourglass_empty</mat-icon>\r\n          <p>No execution steps yet</p>\r\n        </div>\r\n      </div>\r\n\r\n      <!-- Execution Summary -->\r\n      <!-- <div class=\"execution-summary\" *ngIf=\"isCompleted\">\r\n        <div class=\"summary-stats\">\r\n          <div class=\"stat-item\">\r\n            <mat-icon color=\"primary\">check_circle</mat-icon>\r\n            <span>{{completedSteps}} completed</span>\r\n          </div>\r\n          <div class=\"stat-item\" *ngIf=\"failedSteps > 0\">\r\n            <mat-icon color=\"warn\">error</mat-icon>\r\n            <span>{{failedSteps}} failed</span>\r\n          </div>\r\n          <div class=\"stat-item\">\r\n            <mat-icon>schedule</mat-icon>\r\n            <span>{{getTotalExecutionTime()}}s total</span>\r\n          </div>\r\n        </div>\r\n      </div> -->\r\n    </div>\r\n  </mat-card-content>\r\n</mat-card>","import { Component, Input, OnChanges, SimpleChanges, OnDestroy, ChangeDetectionStrategy, ChangeDetectorRef } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatCardModule } from '@angular/material/card';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatTabsModule } from '@angular/material/tabs';\r\nimport { MatExpansionModule } from '@angular/material/expansion';\r\nimport { MatChipsModule } from '@angular/material/chips';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { SvgIconComponent } from \"../svg-icon/svg-icon.component\";\r\n\r\nexport interface StreamingDebugLog {\r\n  query_rewriting?: QueryDebugInfo;\r\n  execution_plan?: any;\r\n  steps: StepDebugInfo[];\r\n  errors: ErrorDebugInfo[];\r\n  error_summary?: ErrorSummary;\r\n  timestamp?: number;\r\n}\r\n\r\nexport interface QueryDebugInfo {\r\n  original_question: string;\r\n  rewritten_question: string;\r\n  rewriting_errors?: string[];\r\n  timestamp: number;\r\n}\r\n\r\nexport interface StepDebugInfo {\r\n  step_id: number;\r\n  step_type: 'FETCH' | 'FETCH_DEPENDENT' | 'EVALUATE' | 'INFER';\r\n  step_description?: string;\r\n  \r\n  // FETCH step debug info\r\n  cube_input?: any;\r\n  sql_query?: string;\r\n  dataframe_info?: {\r\n    shape: [number, number];\r\n    columns: string[];\r\n    dtypes: { [key: string]: string };\r\n    memory_usage: number;\r\n    null_counts?: { [key: string]: number };\r\n    sample_data?: any[];\r\n  };\r\n  \r\n  // EVALUATE step debug info\r\n  code_snippet?: string;\r\n  pandas_operations?: string[];\r\n  \r\n  // INFER step debug info\r\n  llm_prompt?: string;\r\n  llm_response?: string;\r\n  llm_operations?: string[];\r\n  reasoning_steps?: string[];\r\n  \r\n  // Common fields\r\n  execution_time?: number;\r\n  timestamp: number;\r\n  errors?: ErrorDebugInfo[];\r\n}\r\n\r\nexport interface ErrorDebugInfo {\r\n  error_id: string;\r\n  step_id?: number;\r\n  error_type: 'query_rewriting' | 'planning' | 'fetch' | 'evaluate' | 'infer' | 'system';\r\n  severity: 'warning' | 'error' | 'critical';\r\n  message: string;\r\n  stack_trace?: string;\r\n  context?: any;\r\n  timestamp: number;\r\n  retry_suggested?: boolean;\r\n}\r\n\r\nexport interface ErrorSummary {\r\n  total_errors: number;\r\n  warnings: number;\r\n  errors: number;\r\n  critical: number;\r\n  by_step?: { [stepId: number]: number };\r\n  by_type?: { [errorType: string]: number };\r\n}\r\n\r\n@Component({\r\n  selector: 'app-execution-debug',\r\n  standalone: true,\r\n  imports: [\r\n    CommonModule,\r\n    MatIconModule,\r\n    MatCardModule,\r\n    MatButtonModule,\r\n    MatTabsModule,\r\n    MatExpansionModule,\r\n    MatChipsModule,\r\n    MatFormFieldModule,\r\n    MatInputModule,\r\n    FormsModule,\r\n    SvgIconComponent\r\n  ],\r\n  templateUrl: './execution-debug.component.html',\r\n  styleUrls: ['./execution-debug.component.scss'],\r\n  changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class ExecutionDebugComponent implements OnChanges, OnDestroy {\r\n  @Input() streamingDebugLogs?: StreamingDebugLog;\r\n  @Input() isProcessing = false;\r\n  @Input() isCompleted = false;\r\n  \r\n  // Collapse/expand state - default to collapsed\r\n  isCollapsed = true;\r\n  \r\n  // Filter states\r\n  showOnlyErrors = false;\r\n  searchFilter = '';\r\n  selectedStepFilter: 'all' | 'FETCH' | 'FETCH_DEPENDENT' | 'EVALUATE' | 'INFER' = 'all';\r\n  selectedSeverityFilter: 'all' | 'warning' | 'error' | 'critical' = 'all';\r\n  \r\n  // Filtered data\r\n  filteredSteps: StepDebugInfo[] = [];\r\n  filteredErrors: ErrorDebugInfo[] = [];\r\n  \r\n  // Expansion states for accordions\r\n  expandedPanels: Set<string> = new Set();\r\n  \r\n  constructor(private cdr: ChangeDetectorRef) {}\r\n  \r\n  ngOnChanges(changes: SimpleChanges): void {\r\n    let shouldUpdateUI = false;\r\n\r\n    if (changes['streamingDebugLogs']) {\r\n      console.log('🔍 ExecutionDebugComponent: streamingDebugLogs changed');\r\n      console.log('🔍 ExecutionDebugComponent: Current logs:', this.streamingDebugLogs);\r\n      shouldUpdateUI = true;\r\n      \r\n      if (this.streamingDebugLogs?.steps) {\r\n        console.log('🔍 ExecutionDebugComponent: Steps count:', this.streamingDebugLogs.steps.length);\r\n        console.log('🔍 ExecutionDebugComponent: Steps data:', this.streamingDebugLogs.steps);\r\n        \r\n        // Log each step's properties for debugging\r\n        this.streamingDebugLogs.steps.forEach((step, index) => {\r\n          console.log(`🔍 ExecutionDebugComponent: Step ${index} (ID: ${step.step_id}):`, {\r\n            step_type: step.step_type,\r\n            step_description: step.step_description,\r\n            cube_input: !!step.cube_input,\r\n            sql_query: !!step.sql_query,\r\n            dataframe_info: !!step.dataframe_info,\r\n            code_snippet: !!step.code_snippet,\r\n            pandas_operations: !!step.pandas_operations,\r\n            allProperties: Object.keys(step)\r\n          });\r\n          \r\n          // Special logging for EVALUATE steps\r\n          if (step.step_type === 'EVALUATE') {\r\n            console.log(`🔍 ExecutionDebugComponent: EVALUATE STEP ${index} DETAILS:`, {\r\n              step_id: step.step_id,\r\n              has_code_snippet: !!step.code_snippet,\r\n              code_snippet_preview: step.code_snippet ? step.code_snippet.substring(0, 100) + '...' : 'None',\r\n              has_pandas_operations: !!step.pandas_operations,\r\n              pandas_operations_count: step.pandas_operations ? step.pandas_operations.length : 0,\r\n              pandas_operations_preview: step.pandas_operations ? step.pandas_operations.slice(0, 3) : 'None'\r\n            });\r\n          }\r\n        });\r\n      }\r\n    }\r\n    \r\n    if (changes['isCompleted'] || changes['isProcessing']) {\r\n      shouldUpdateUI = true;\r\n    }\r\n    \r\n    if (shouldUpdateUI) {\r\n      this.filterLogs();\r\n      // Force change detection to ensure UI updates\r\n      this.cdr.markForCheck();\r\n      this.cdr.detectChanges();\r\n      \r\n      // Auto-collapse when processing completes\r\n      if (changes['isCompleted'] && changes['isCompleted'].currentValue === true && !changes['isCompleted'].previousValue) {\r\n        setTimeout(() => {\r\n          this.isCollapsed = true;\r\n          this.cdr.markForCheck();\r\n        }, 1000);\r\n      }\r\n      \r\n      // Keep collapsed by default when processing starts\r\n      // Users can manually expand if they want to see debug info\r\n      if (changes['isProcessing'] && changes['isProcessing'].currentValue === true) {\r\n        // Don't auto-expand, let user choose to expand manually\r\n        this.cdr.markForCheck();\r\n      }\r\n    }\r\n  }\r\n  \r\n  ngOnDestroy(): void {\r\n    // Clear any temporary data\r\n    this.expandedPanels.clear();\r\n  }\r\n  \r\n  toggleCollapse(): void {\r\n    this.isCollapsed = !this.isCollapsed;\r\n    // Force change detection when toggling to ensure fresh data\r\n    this.filterLogs();\r\n    this.cdr.markForCheck();\r\n    this.cdr.detectChanges();\r\n  }\r\n  \r\n  filterLogs(): void {\r\n    if (!this.streamingDebugLogs) {\r\n      this.filteredSteps = [];\r\n      this.filteredErrors = [];\r\n      return;\r\n    }\r\n    \r\n    // Filter steps\r\n    let steps = this.streamingDebugLogs.steps || [];\r\n    \r\n    // Apply step type filter\r\n    if (this.selectedStepFilter !== 'all') {\r\n      steps = steps.filter(step => step.step_type === this.selectedStepFilter);\r\n    }\r\n    \r\n    // Apply search filter\r\n    if (this.searchFilter) {\r\n      const searchLower = this.searchFilter.toLowerCase();\r\n      steps = steps.filter(step => {\r\n        const searchableContent = [\r\n          step.step_description,\r\n          step.sql_query,\r\n          step.code_snippet,\r\n          step.llm_prompt,\r\n          step.llm_response,\r\n          JSON.stringify(step.cube_input),\r\n          JSON.stringify(step.dataframe_info)\r\n        ].filter(Boolean).join(' ').toLowerCase();\r\n        \r\n        return searchableContent.includes(searchLower);\r\n      });\r\n    }\r\n    \r\n    this.filteredSteps = steps;\r\n    \r\n    // Filter errors\r\n    let errors = this.streamingDebugLogs.errors || [];\r\n    \r\n    // Apply severity filter\r\n    if (this.selectedSeverityFilter !== 'all') {\r\n      errors = errors.filter(error => error.severity === this.selectedSeverityFilter);\r\n    }\r\n    \r\n    // Apply error-only filter\r\n    if (this.showOnlyErrors) {\r\n      this.filteredSteps = this.filteredSteps.filter(step => \r\n        step.errors && step.errors.length > 0\r\n      );\r\n    }\r\n    \r\n    this.filteredErrors = errors;\r\n  }\r\n  \r\n  copyToClipboard(content: string): void {\r\n    navigator.clipboard.writeText(content).then(() => {\r\n      // Show a temporary success indicator (could add a snackbar here)\r\n      console.log('Copied to clipboard');\r\n    }).catch(err => {\r\n      console.error('Failed to copy: ', err);\r\n    });\r\n  }\r\n  \r\n  formatJson(obj: any): string {\r\n    if (!obj) return '';\r\n    try {\r\n      return JSON.stringify(obj, null, 2);\r\n    } catch {\r\n      return String(obj);\r\n    }\r\n  }\r\n  \r\n  formatSql(sql: string): string {\r\n    if (!sql) return '';\r\n    // Basic SQL formatting - could be enhanced with a proper SQL formatter\r\n    return sql\r\n      .replace(/SELECT/gi, 'SELECT\\n  ')\r\n      .replace(/FROM/gi, '\\nFROM')\r\n      .replace(/WHERE/gi, '\\nWHERE')\r\n      .replace(/GROUP BY/gi, '\\nGROUP BY')\r\n      .replace(/ORDER BY/gi, '\\nORDER BY')\r\n      .replace(/LIMIT/gi, '\\nLIMIT')\r\n      .replace(/,/g, ',\\n  ');\r\n  }\r\n  \r\n  getStepIcon(stepType: string): string {\r\n    switch (stepType) {\r\n      case 'FETCH':\r\n        return 'storage';\r\n      case 'FETCH_DEPENDENT':\r\n        return 'account_tree';\r\n      case 'EVALUATE':\r\n        return 'functions';\r\n      case 'INFER':\r\n        return 'psychology';\r\n      default:\r\n        return 'help_outline';\r\n    }\r\n  }\r\n  \r\n  getSeverityIcon(severity: string): string {\r\n    switch (severity) {\r\n      case 'warning':\r\n        return 'warning';\r\n      case 'error':\r\n        return 'error';\r\n      case 'critical':\r\n        return 'error_outline';\r\n      default:\r\n        return 'info';\r\n    }\r\n  }\r\n  \r\n  getSeverityColor(severity: string): string {\r\n    switch (severity) {\r\n      case 'warning':\r\n        return 'warn';\r\n      case 'error':\r\n        return 'error';\r\n      case 'critical':\r\n        return 'critical';\r\n      default:\r\n        return 'info';\r\n    }\r\n  }\r\n  \r\n  togglePanel(panelId: string): void {\r\n    if (this.expandedPanels.has(panelId)) {\r\n      this.expandedPanels.delete(panelId);\r\n    } else {\r\n      this.expandedPanels.add(panelId);\r\n    }\r\n  }\r\n  \r\n  isPanelExpanded(panelId: string): boolean {\r\n    return this.expandedPanels.has(panelId);\r\n  }\r\n  \r\n  hasDebugData(): boolean {\r\n    const hasData = !!(this.streamingDebugLogs && \r\n             (this.streamingDebugLogs.steps?.length > 0 || \r\n              this.streamingDebugLogs.errors?.length > 0 ||\r\n              this.streamingDebugLogs.query_rewriting ||\r\n              this.streamingDebugLogs.execution_plan));\r\n    \r\n    console.log('🔍 ExecutionDebugComponent: hasDebugData check:', {\r\n      streamingDebugLogs: !!this.streamingDebugLogs,\r\n      stepsCount: this.streamingDebugLogs?.steps?.length || 0,\r\n      errorsCount: this.streamingDebugLogs?.errors?.length || 0,\r\n      hasQueryRewriting: !!this.streamingDebugLogs?.query_rewriting,\r\n      hasExecutionPlan: !!this.streamingDebugLogs?.execution_plan,\r\n      result: hasData\r\n    });\r\n    \r\n    return hasData;\r\n  }\r\n  \r\n  getErrorCount(): number {\r\n    return this.streamingDebugLogs?.error_summary?.total_errors || 0;\r\n  }\r\n  \r\n  getWarningCount(): number {\r\n    return this.streamingDebugLogs?.error_summary?.warnings || 0;\r\n  }\r\n  \r\n  getCriticalCount(): number {\r\n    return this.streamingDebugLogs?.error_summary?.critical || 0;\r\n  }\r\n}","<mat-card class=\"debug-card\" [class.collapsed]=\"isCollapsed\" style=\"padding-left: 0px;\">\r\n  <mat-card-header (click)=\"toggleCollapse()\" class=\"cursor-pointer\" style=\"padding-left: 0px;\">\r\n    <mat-card-title style=\"display: flex; align-items: center;gap:8px;\">\r\n      <app-svg-icon name=\"logo\" size=\"20px\"></app-svg-icon>\r\n      Execution Debug\r\n      <span class=\"error-badge\" *ngIf=\"getErrorCount() > 0\">\r\n        <mat-icon class=\"error-icon\">error</mat-icon>\r\n        {{ getErrorCount() }}\r\n      </span>\r\n    </mat-card-title>\r\n    <div class=\"debug-actions\">\r\n      <button\r\n        [title]=\"isCollapsed ? 'Expand debug logs' : 'Collapse debug logs'\"\r\n        class=\"collapse-button\"\r\n      >\r\n        <mat-icon [class.rotated]=\"!isCollapsed\">expand_more</mat-icon>\r\n      </button>\r\n    </div>\r\n  </mat-card-header>\r\n\r\n  <mat-card-content\r\n    [ngStyle]=\"{\r\n      display: isCollapsed ? 'none' : 'block'\r\n    }\"\r\n  >\r\n    <div class=\"debug-content\" [class.collapsed]=\"isCollapsed\">\r\n      <!-- No debug data message for historical messages -->\r\n      <div *ngIf=\"!hasDebugData() && !isProcessing\" class=\"no-debug-data\">\r\n        <mat-icon>code_off</mat-icon>\r\n        <p>No debug data available</p>\r\n        <span class=\"hint\">Debug logs are only shown during active execution</span>\r\n      </div>\r\n\r\n      <!-- Debug data available -->\r\n      <div *ngIf=\"hasDebugData()\" class=\"debug-sections\">\r\n        \r\n\r\n        <!-- Error Summary -->\r\n        <div class=\"error-summary\" *ngIf=\"getErrorCount() > 0\">\r\n          <div class=\"summary-item warning\" *ngIf=\"getWarningCount() > 0\">\r\n            <mat-icon>warning</mat-icon>\r\n            <span>{{ getWarningCount() }} Warnings</span>\r\n          </div>\r\n          <div class=\"summary-item error\" *ngIf=\"(streamingDebugLogs?.error_summary?.errors ?? 0) > 0\">\r\n            <mat-icon>error</mat-icon>\r\n            <span>{{ streamingDebugLogs?.error_summary?.errors }} Errors</span>\r\n          </div>\r\n          <div class=\"summary-item critical\" *ngIf=\"getCriticalCount() > 0\">\r\n            <mat-icon>error_outline</mat-icon>\r\n            <span>{{ getCriticalCount() }} Critical</span>\r\n          </div>\r\n        </div>\r\n\r\n        <!-- Query Rewriting Section -->\r\n        <mat-expansion-panel *ngIf=\"streamingDebugLogs?.query_rewriting\" \r\n                            [expanded]=\"isPanelExpanded('query-rewriting')\"\r\n                            (opened)=\"togglePanel('query-rewriting')\"\r\n                            (closed)=\"togglePanel('query-rewriting')\">\r\n          <mat-expansion-panel-header>\r\n            <mat-panel-title>\r\n              <mat-icon>edit_note</mat-icon>\r\n              Query Rewriting\r\n            </mat-panel-title>\r\n            <mat-panel-description>\r\n              {{ streamingDebugLogs?.query_rewriting?.rewritten_question ? 'Context Applied' : 'No Context' }}\r\n            </mat-panel-description>\r\n          </mat-expansion-panel-header>\r\n          \r\n          <div class=\"panel-content\">\r\n            <div class=\"query-comparison\">\r\n              <div class=\"original-query\">\r\n                <h4>Original Question:</h4>\r\n                <pre>{{ streamingDebugLogs?.query_rewriting?.original_question }}</pre>\r\n              </div>\r\n              <div class=\"rewritten-query\" *ngIf=\"streamingDebugLogs?.query_rewriting?.rewritten_question\">\r\n                <h4>Rewritten Question:</h4>\r\n                <pre>{{ streamingDebugLogs?.query_rewriting?.rewritten_question }}</pre>\r\n              </div>\r\n            </div>\r\n          </div>\r\n        </mat-expansion-panel>\r\n\r\n        <!-- Execution Plan Section -->\r\n        <mat-expansion-panel *ngIf=\"streamingDebugLogs?.execution_plan\"\r\n                            [expanded]=\"isPanelExpanded('execution-plan')\"\r\n                            (opened)=\"togglePanel('execution-plan')\"\r\n                            (closed)=\"togglePanel('execution-plan')\">\r\n          <mat-expansion-panel-header>\r\n            <mat-panel-title>\r\n              <mat-icon>account_tree</mat-icon>\r\n              Execution Plan\r\n            </mat-panel-title>\r\n            <mat-panel-description>\r\n              {{ streamingDebugLogs?.execution_plan?.length || 0 }} steps\r\n            </mat-panel-description>\r\n          </mat-expansion-panel-header>\r\n          \r\n          <div class=\"panel-content\">\r\n            <div class=\"code-block json-block\">\r\n              <div class=\"code-header\">\r\n                <span>JSON</span>\r\n                <button mat-icon-button (click)=\"copyToClipboard(formatJson(streamingDebugLogs?.execution_plan))\" title=\"Copy JSON\">\r\n                  <mat-icon>content_copy</mat-icon>\r\n                </button>\r\n              </div>\r\n              <pre class=\"code-content\">{{ formatJson(streamingDebugLogs?.execution_plan) }}</pre>\r\n            </div>\r\n          </div>\r\n        </mat-expansion-panel>\r\n\r\n        <!-- Step Debug Logs -->\r\n        <div class=\"step-logs\" *ngIf=\"filteredSteps.length > 0\">\r\n          <h3>Step Execution Logs</h3>\r\n          \r\n          <mat-expansion-panel *ngFor=\"let step of filteredSteps\"\r\n                              [expanded]=\"isPanelExpanded('step-' + step.step_id)\"\r\n                              (opened)=\"togglePanel('step-' + step.step_id)\"\r\n                              (closed)=\"togglePanel('step-' + step.step_id)\"\r\n                              [class.has-error]=\"step.errors && step.errors.length > 0\">\r\n            <mat-expansion-panel-header>\r\n              <mat-panel-title>\r\n                <mat-icon>{{ getStepIcon(step.step_type) }}</mat-icon>\r\n                Step {{ step.step_id }}: {{ step.step_type }}\r\n                <mat-icon class=\"error-indicator\" *ngIf=\"step.errors && step.errors.length > 0\" color=\"warn\">\r\n                  error\r\n                </mat-icon>\r\n              </mat-panel-title>\r\n              <mat-panel-description>\r\n                {{ step.step_description || 'No description' }}\r\n                <span class=\"execution-time\" *ngIf=\"step.execution_time\">\r\n                  ({{ step.execution_time.toFixed(2) }}s)\r\n                </span>\r\n              </mat-panel-description>\r\n            </mat-expansion-panel-header>\r\n            \r\n            <div class=\"panel-content step-content\">\r\n              <!-- FETCH Step Debug Info -->\r\n              <ng-container *ngIf=\"step.step_type === 'FETCH' || step.step_type === 'FETCH_DEPENDENT'\">\r\n                \r\n                <!-- Cube Input -->\r\n                <div class=\"debug-section\" *ngIf=\"step.cube_input\">\r\n                  <h4>Cube Query Input:</h4>\r\n                  <div class=\"code-block json-block\">\r\n                    <div class=\"code-header\">\r\n                      <span>JSON</span>\r\n                      <button mat-icon-button (click)=\"copyToClipboard(formatJson(step.cube_input))\" title=\"Copy Cube Query\">\r\n                        <mat-icon>content_copy</mat-icon>\r\n                      </button>\r\n                    </div>\r\n                    <pre class=\"code-content\">{{ formatJson(step.cube_input) }}</pre>\r\n                  </div>\r\n                </div>\r\n                \r\n                <!-- SQL Query -->\r\n                <div class=\"debug-section\" *ngIf=\"step.sql_query\">\r\n                  <h4>Generated SQL Query:</h4>\r\n                  <div class=\"code-block sql-block\">\r\n                    <div class=\"code-header\">\r\n                      <span>SQL</span>\r\n                      <button mat-icon-button (click)=\"copyToClipboard(step.sql_query)\" title=\"Copy SQL\">\r\n                        <mat-icon>content_copy</mat-icon>\r\n                      </button>\r\n                    </div>\r\n                    <pre class=\"code-content\">{{ formatSql(step.sql_query) }}</pre>\r\n                  </div>\r\n                </div>\r\n                \r\n                <!-- DataFrame Info -->\r\n                <div class=\"debug-section\" *ngIf=\"step.dataframe_info\">\r\n                  <h4>DataFrame Info:</h4>\r\n                  <div class=\"dataframe-info\">\r\n                    <div class=\"info-grid\">\r\n                      <div class=\"info-item\">\r\n                        <strong>Shape:</strong> {{ step.dataframe_info.shape[0] }} rows × {{ step.dataframe_info.shape[1] }} columns\r\n                      </div>\r\n                      <div class=\"info-item\">\r\n                        <strong>Memory Usage:</strong> {{ (step.dataframe_info.memory_usage / 1024).toFixed(2) }} KB\r\n                      </div>\r\n                    </div>\r\n                    \r\n                    <div class=\"columns-info\" *ngIf=\"step.dataframe_info.columns\">\r\n                      <h5>Columns ({{ step.dataframe_info.columns.length }}):</h5>\r\n                      <div class=\"column-list\">\r\n                        <div class=\"column-item\" *ngFor=\"let col of step.dataframe_info.columns\">\r\n                          <span class=\"column-name\">{{ col }}</span>\r\n                          <span class=\"column-dtype\" *ngIf=\"step.dataframe_info.dtypes\">\r\n                            {{ step.dataframe_info.dtypes[col] }}\r\n                          </span>\r\n                        </div>\r\n                      </div>\r\n                    </div>\r\n                    \r\n                    <div class=\"sample-data\" *ngIf=\"step.dataframe_info.sample_data && step.dataframe_info.sample_data.length > 0\">\r\n                      <h5>Sample Data (first 3 rows):</h5>\r\n                      <div class=\"code-block\">\r\n                        <pre class=\"code-content\">{{ formatJson(step.dataframe_info.sample_data) }}</pre>\r\n                      </div>\r\n                    </div>\r\n                  </div>\r\n                </div>\r\n              </ng-container>\r\n              \r\n              <!-- EVALUATE Step Debug Info -->\r\n              <ng-container *ngIf=\"step.step_type === 'EVALUATE'\">\r\n                <div class=\"debug-section\" *ngIf=\"step.code_snippet\">\r\n                  <h4>Code Snippet:</h4>\r\n                  <div class=\"code-block python-block\">\r\n                    <div class=\"code-header\">\r\n                      <span>Python</span>\r\n                      <button mat-icon-button (click)=\"copyToClipboard(step.code_snippet)\" title=\"Copy Code\">\r\n                        <mat-icon>content_copy</mat-icon>\r\n                      </button>\r\n                    </div>\r\n                    <pre class=\"code-content\">{{ step.code_snippet }}</pre>\r\n                  </div>\r\n                </div>\r\n                \r\n                <div class=\"debug-section\" *ngIf=\"step.pandas_operations && step.pandas_operations.length > 0\">\r\n                  <h4>Pandas Operations:</h4>\r\n                  <ul class=\"operations-list\">\r\n                    <li *ngFor=\"let op of step.pandas_operations\">{{ op }}</li>\r\n                  </ul>\r\n                </div>\r\n              </ng-container>\r\n              \r\n              <!-- INFER Step Debug Info -->\r\n              <ng-container *ngIf=\"step.step_type === 'INFER'\">\r\n                <div class=\"debug-section\" *ngIf=\"step.llm_prompt\">\r\n                  <h4>LLM Prompt:</h4>\r\n                  <div class=\"code-block\">\r\n                    <pre class=\"code-content\">{{ step.llm_prompt }}</pre>\r\n                  </div>\r\n                </div>\r\n                \r\n                <div class=\"debug-section\" *ngIf=\"step.llm_response\">\r\n                  <h4>LLM Response:</h4>\r\n                  <div class=\"code-block\">\r\n                    <pre class=\"code-content\">{{ step.llm_response }}</pre>\r\n                  </div>\r\n                </div>\r\n\r\n                <div class=\"debug-section\" *ngIf=\"step.llm_operations && step.llm_operations.length > 0\">\r\n                  <h4>LLM Operations:</h4>\r\n                  <ul class=\"operations-list\">\r\n                    <li *ngFor=\"let op of step.llm_operations\">{{ op }}</li>\r\n                  </ul>\r\n                </div>\r\n\r\n                <div class=\"debug-section\" *ngIf=\"step.reasoning_steps && step.reasoning_steps.length > 0\">\r\n                  <h4>Reasoning Steps:</h4>\r\n                  <ol class=\"reasoning-list\">\r\n                    <li *ngFor=\"let reason of step.reasoning_steps\">{{ reason }}</li>\r\n                  </ol>\r\n                </div>\r\n              </ng-container>\r\n              \r\n              <!-- Step Errors -->\r\n              <div class=\"step-errors\" *ngIf=\"step.errors && step.errors.length > 0\">\r\n                <h4 class=\"error-header\">\r\n                  <mat-icon color=\"warn\">error</mat-icon>\r\n                  Errors ({{ step.errors.length }})\r\n                </h4>\r\n                <div class=\"error-item\" *ngFor=\"let error of step.errors\" [class]=\"'severity-' + error.severity\">\r\n                  <div class=\"error-header\">\r\n                    <mat-icon [color]=\"getSeverityColor(error.severity)\">\r\n                      {{ getSeverityIcon(error.severity) }}\r\n                    </mat-icon>\r\n                    <span class=\"error-type\">{{ error.error_type }}</span>\r\n                    <span class=\"error-severity\">{{ error.severity }}</span>\r\n                  </div>\r\n                  <div class=\"error-message\">{{ error.message }}</div>\r\n                  <div class=\"error-stack\" *ngIf=\"error.stack_trace\">\r\n                    <details>\r\n                      <summary>Stack Trace</summary>\r\n                      <pre>{{ error.stack_trace }}</pre>\r\n                    </details>\r\n                  </div>\r\n                </div>\r\n              </div>\r\n            </div>\r\n          </mat-expansion-panel>\r\n        </div>\r\n\r\n        <!-- Global Errors Section -->\r\n        <div class=\"global-errors\" *ngIf=\"filteredErrors.length > 0\">\r\n          <h3>All Errors</h3>\r\n          <div class=\"error-list\">\r\n            <div class=\"error-item\" *ngFor=\"let error of filteredErrors\" [class]=\"'severity-' + error.severity\">\r\n              <div class=\"error-header\">\r\n                <mat-icon [color]=\"getSeverityColor(error.severity)\">\r\n                  {{ getSeverityIcon(error.severity) }}\r\n                </mat-icon>\r\n                <span class=\"error-type\">{{ error.error_type }}</span>\r\n                <span class=\"error-step\" *ngIf=\"error.step_id !== undefined\">Step {{ error.step_id }}</span>\r\n              </div>\r\n              <div class=\"error-message\">{{ error.message }}</div>\r\n              <div class=\"error-context\" *ngIf=\"error.context\">\r\n                <details>\r\n                  <summary>Context</summary>\r\n                  <pre>{{ formatJson(error.context) }}</pre>\r\n                </details>\r\n              </div>\r\n            </div>\r\n          </div>\r\n        </div>\r\n      </div>\r\n    </div>\r\n  </mat-card-content>\r\n</mat-card>","import { Component, Input, Output, EventEmitter } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\n\r\nexport interface DimensionSelection {\r\n  dimension_name: string;\r\n  display_name: string;\r\n  values: string[];\r\n}\r\n\r\n@Component({\r\n  selector: 'app-dimension-clarification',\r\n  standalone: true,\r\n  imports: [CommonModule, FormsModule],\r\n  templateUrl: './dimension-clarification.component.html',\r\n  styleUrl: './dimension-clarification.component.scss'\r\n})\r\nexport class DimensionClarificationComponent {\r\n  @Input() clarificationRequest?: {\r\n    clarification_type: string;\r\n    message: string;\r\n    available_options: Array<{\r\n      dimension_name: string;\r\n      display_name: string;\r\n      values: string[];\r\n    }>;\r\n    suggested_rephrase?: string;\r\n    value_count?: number;\r\n    dimension_matched?: string;\r\n    sample_values?: string[];\r\n    user_question?: string;\r\n    metric_focus?: string;\r\n  };\r\n\r\n  @Output() clarificationSubmitted = new EventEmitter<DimensionSelection[]>();\r\n  @Output() clarificationCancelled = new EventEmitter<void>();\r\n\r\n  selectedOptions: { [dimensionName: string]: string[] } = {};\r\n\r\n  constructor() {}\r\n\r\n  ngOnInit() {\r\n    // Initialize selected options\r\n    if (this.clarificationRequest?.available_options) {\r\n      for (const dimension of this.clarificationRequest.available_options) {\r\n        this.selectedOptions[dimension.dimension_name] = [];\r\n      }\r\n    }\r\n  }\r\n\r\n  onOptionToggle(dimensionName: string, value: string, event: Event) {\r\n    const target = event.target as HTMLInputElement;\r\n    const isChecked = target.checked;\r\n\r\n    if (!this.selectedOptions[dimensionName]) {\r\n      this.selectedOptions[dimensionName] = [];\r\n    }\r\n\r\n    if (isChecked) {\r\n      if (!this.selectedOptions[dimensionName].includes(value)) {\r\n        this.selectedOptions[dimensionName].push(value);\r\n      }\r\n    } else {\r\n      const index = this.selectedOptions[dimensionName].indexOf(value);\r\n      if (index > -1) {\r\n        this.selectedOptions[dimensionName].splice(index, 1);\r\n      }\r\n    }\r\n  }\r\n\r\n  isValueSelected(dimensionName: string, value: string): boolean {\r\n    return this.selectedOptions[dimensionName]?.includes(value) || false;\r\n  }\r\n\r\n  hasSelections(): boolean {\r\n    return Object.values(this.selectedOptions).some(values => values.length > 0);\r\n  }\r\n\r\n  getSelectedCount(dimensionName: string): number {\r\n    return this.selectedOptions[dimensionName]?.length || 0;\r\n  }\r\n\r\n  onSubmit() {\r\n    if (!this.hasSelections()) {\r\n      return;\r\n    }\r\n\r\n    const selections: DimensionSelection[] = [];\r\n\r\n    for (const [dimensionName, values] of Object.entries(this.selectedOptions)) {\r\n      if (values.length > 0) {\r\n        // Find the display_name from available_options\r\n        const dimensionData = this.findDimensionByName(dimensionName);\r\n        const displayName = dimensionData?.display_name || dimensionName;\r\n\r\n        selections.push({\r\n          dimension_name: dimensionName,\r\n          display_name: displayName,\r\n          values: values\r\n        });\r\n      }\r\n    }\r\n\r\n    this.clarificationSubmitted.emit(selections);\r\n  }\r\n\r\n  onCancel() {\r\n    this.clarificationCancelled.emit();\r\n  }\r\n\r\n  formatDimensionName(dimensionName: string): string {\r\n    return dimensionName\r\n      .replace(/_/g, ' ')\r\n      .replace(/\\b\\w/g, l => l.toUpperCase());\r\n  }\r\n\r\n  // Helper method to find dimension by name in the array\r\n  private findDimensionByName(dimensionName: string) {\r\n    return this.clarificationRequest?.available_options?.find(\r\n      dim => dim.dimension_name === dimensionName\r\n    );\r\n  }\r\n\r\n  getDimensionDescription(dimensionName: string): string {\r\n    // First try to get display_name from the clarification request\r\n    const dimensionData = this.findDimensionByName(dimensionName);\r\n    if (dimensionData?.display_name) {\r\n      return dimensionData.display_name;\r\n    }\r\n\r\n    // Fallback to hardcoded descriptions\r\n    const descriptions: { [key: string]: string } = {\r\n      'department_l1': 'Main Department Categories',\r\n      'department_l2': 'Department Subcategories',\r\n      'department_l3': 'Specific Department Units',\r\n      'region': 'Geographic Regions',\r\n      'state_name': 'State/Province',\r\n      'unit_short_name': 'Hospital/Medical Center',\r\n      'sponsor_name': 'Insurance/Sponsor Organizations'\r\n    };\r\n\r\n    return descriptions[dimensionName] || this.formatDimensionName(dimensionName);\r\n  }\r\n\r\n  selectAll(dimensionName: string) {\r\n    const dimensionData = this.findDimensionByName(dimensionName);\r\n    if (dimensionData?.values) {\r\n      this.selectedOptions[dimensionName] = [...dimensionData.values];\r\n    }\r\n  }\r\n\r\n  clearAll(dimensionName: string) {\r\n    this.selectedOptions[dimensionName] = [];\r\n  }\r\n\r\n  isAllSelected(dimensionName: string): boolean {\r\n    const dimensionData = this.findDimensionByName(dimensionName);\r\n    const availableOptions = dimensionData?.values || [];\r\n    const selectedOptions = this.selectedOptions[dimensionName] || [];\r\n    return availableOptions.length > 0 && selectedOptions.length === availableOptions.length;\r\n  }\r\n\r\n  trackByValue(index: number, value: string): string {\r\n    return value;\r\n  }\r\n\r\n  trackByDimension(index: number, dimension: any): string {\r\n    return dimension.dimension_name;\r\n  }\r\n\r\n  getTotalSelectedCount(): number {\r\n    let total = 0;\r\n    for (const values of Object.values(this.selectedOptions)) {\r\n      total += values.length;\r\n    }\r\n    return total;\r\n  }\r\n\r\n  getSelectionButtonText(): string {\r\n    if (!this.hasSelections()) {\r\n      return '';\r\n    }\r\n    const count = this.getTotalSelectedCount();\r\n    return ` (${count})`;\r\n  }\r\n}","<div class=\"clarification-container\" *ngIf=\"clarificationRequest\">\r\n  <!-- Header -->\r\n  <div class=\"clarification-header\">\r\n    <div class=\"icon\">❓</div>\r\n    <div class=\"title\">Clarification Required</div>\r\n  </div>\r\n\r\n  <!-- Message -->\r\n  <div class=\"clarification-message\">\r\n    <p>{{ clarificationRequest.message }}</p>\r\n\r\n    <div class=\"question-context\" *ngIf=\"clarificationRequest.user_question\">\r\n      <strong>Your question:</strong> \"{{ clarificationRequest.user_question }}\"\r\n    </div>\r\n\r\n    <div class=\"suggestion\" *ngIf=\"clarificationRequest.suggested_rephrase\">\r\n      <strong>Suggestion:</strong> {{ clarificationRequest.suggested_rephrase }}\r\n    </div>\r\n  </div>\r\n\r\n  <!-- Dimension Selection -->\r\n  <div class=\"dimension-selection\">\r\n    <div class=\"dimension-group\" *ngFor=\"let dimension of clarificationRequest.available_options; trackBy: trackByDimension\">\r\n      <div class=\"dimension-header\">\r\n        <div class=\"dimension-title\">\r\n          <span class=\"dimension-name\">{{ getDimensionDescription(dimension.dimension_name) }}</span>\r\n          <span class=\"dimension-count\" *ngIf=\"getSelectedCount(dimension.dimension_name) > 0\">\r\n            ({{ getSelectedCount(dimension.dimension_name) }} selected)\r\n          </span>\r\n        </div>\r\n\r\n        <div class=\"dimension-actions\">\r\n          <button\r\n            type=\"button\"\r\n            class=\"action-btn select-all\"\r\n            (click)=\"selectAll(dimension.dimension_name)\"\r\n            [disabled]=\"isAllSelected(dimension.dimension_name)\">\r\n            Select All\r\n          </button>\r\n          <button\r\n            type=\"button\"\r\n            class=\"action-btn clear-all\"\r\n            (click)=\"clearAll(dimension.dimension_name)\"\r\n            [disabled]=\"getSelectedCount(dimension.dimension_name) === 0\">\r\n            Clear\r\n          </button>\r\n        </div>\r\n      </div>\r\n\r\n      <div class=\"options-grid\">\r\n        <div\r\n          class=\"option-item\"\r\n          *ngFor=\"let value of dimension.values; trackBy: trackByValue\"\r\n          [class.selected]=\"isValueSelected(dimension.dimension_name, value)\">\r\n          <label class=\"option-label\">\r\n            <input\r\n              type=\"checkbox\"\r\n              [checked]=\"isValueSelected(dimension.dimension_name, value)\"\r\n              (change)=\"onOptionToggle(dimension.dimension_name, value, $event)\"\r\n              class=\"option-checkbox\">\r\n            <span class=\"option-text\">{{ value }}</span>\r\n          </label>\r\n        </div>\r\n      </div>\r\n    </div>\r\n  </div>\r\n\r\n  <!-- Too Many Values Warning -->\r\n  <div class=\"too-many-values\" *ngIf=\"clarificationRequest.value_count && clarificationRequest.value_count > 15\">\r\n    <div class=\"warning-icon\">⚠️</div>\r\n    <div class=\"warning-content\">\r\n      <p><strong>{{ clarificationRequest.value_count }} values found for \"{{ clarificationRequest.dimension_matched }}\"</strong></p>\r\n      <p>Showing the first few options. Consider being more specific in your query.</p>\r\n    </div>\r\n  </div>\r\n\r\n  <!-- Action Buttons -->\r\n  <div class=\"clarification-actions\">\r\n    <button\r\n      type=\"button\"\r\n      class=\"btn btn-secondary\"\r\n      (click)=\"onCancel()\">\r\n      Cancel\r\n    </button>\r\n\r\n    <button\r\n      type=\"button\"\r\n      class=\"btn btn-primary\"\r\n      [disabled]=\"!hasSelections()\"\r\n      (click)=\"onSubmit()\">\r\n      Apply Selection{{ getSelectionButtonText() }}\r\n    </button>\r\n  </div>\r\n</div>","import { Component, Input, Output, EventEmitter, Inject, ChangeDetectorRef, OnChanges, SimpleChanges, AfterViewInit } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { MatDialog, MatDialogModule, MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { ChatMessage } from '../../models/chat.model';\r\n\r\n@Component({\r\n  selector: 'app-message-feedback',\r\n  standalone: true,\r\n  imports: [\r\n    CommonModule,\r\n    MatIconModule,\r\n    MatButtonModule,\r\n    MatTooltipModule\r\n  ],\r\n  template: `\r\n    <div class=\"feedback-container\">\r\n      <div class=\"feedback-buttons\">\r\n        <button mat-icon-button\r\n                [class.selected]=\"isSelected('positive')\"\r\n                [class.positive]=\"isSelected('positive')\"\r\n                [disabled]=\"isSubmitting\"\r\n                (click)=\"onFeedbackClick('positive')\"\r\n                matTooltip=\"This response was helpful\"\r\n                aria-label=\"Thumbs up - This response was helpful\">\r\n          <mat-icon>thumb_up</mat-icon>\r\n        </button>\r\n\r\n        <button mat-icon-button\r\n                [class.selected]=\"isSelected('negative')\"\r\n                [class.negative]=\"isSelected('negative')\"\r\n                [disabled]=\"isSubmitting\"\r\n                (click)=\"onFeedbackClick('negative')\"\r\n                matTooltip=\"This response needs improvement\"\r\n                aria-label=\"Thumbs down - This response needs improvement\">\r\n          <mat-icon>thumb_down</mat-icon>\r\n        </button>\r\n      </div>\r\n\r\n      <span class=\"feedback-label\" *ngIf=\"message.user_feedback\">\r\n        Thanks for your feedback!\r\n      </span>\r\n\r\n      <span class=\"feedback-label loading\" *ngIf=\"isSubmitting\">\r\n        Submitting feedback...\r\n      </span>\r\n    </div>\r\n  `,\r\n  styleUrls: ['./feedback.component.scss']\r\n})\r\nexport class MessageFeedbackComponent implements OnChanges, AfterViewInit {\r\n  @Input() message!: ChatMessage;\r\n  @Output() feedbackSubmitted = new EventEmitter<{feedback: 'positive' | 'negative', comment?: string}>();\r\n\r\n  isSubmitting = false;\r\n  currentFeedback: 'positive' | 'negative' | null = null; // Local state for immediate UI updates\r\n\r\n  constructor(\r\n    private dialog: MatDialog,\r\n    private cdr: ChangeDetectorRef\r\n  ) {}\r\n\r\n  ngAfterViewInit() {\r\n    // Initialize local feedback state from message on component init\r\n    this.currentFeedback = this.message?.user_feedback || null;\r\n  }\r\n\r\n  ngOnChanges(changes: SimpleChanges): void {\r\n    // Sync local feedback state with message input\r\n    if (changes['message'] && changes['message'].currentValue) {\r\n      const newFeedback = changes['message'].currentValue?.user_feedback;\r\n      console.log('🎯 Message feedback changed:', {\r\n        current: newFeedback,\r\n        previous: changes['message'].previousValue?.user_feedback,\r\n        localState: this.currentFeedback\r\n      });\r\n\r\n      // Update local feedback state to match the message\r\n      this.currentFeedback = newFeedback || null;\r\n      this.cdr.detectChanges();\r\n    }\r\n  }\r\n\r\n  onFeedbackClick(feedback: 'positive' | 'negative') {\r\n    // Open comment dialog\r\n    const dialogRef = this.dialog.open(FeedbackCommentDialogComponent, {\r\n      width: '300px',\r\n      maxWidth: '90vw',\r\n      panelClass: 'feedback-dialog-panel',\r\n      data: {\r\n        feedback,\r\n        currentComment: this.message.feedback_comment\r\n      }\r\n    });\r\n\r\n    dialogRef.afterClosed().subscribe(result => {\r\n      if (result !== undefined) {\r\n        this.submitFeedback(feedback, result.comment);\r\n      }\r\n    });\r\n  }\r\n\r\n  private submitFeedback(feedback: 'positive' | 'negative', comment?: string) {\r\n    this.isSubmitting = true;\r\n\r\n    // Immediately update local feedback state for instant UI response\r\n    this.currentFeedback = feedback;\r\n    console.log('🎯 Immediately updating local feedback state to:', feedback);\r\n    this.cdr.detectChanges();\r\n\r\n    this.feedbackSubmitted.emit({ feedback, comment });\r\n\r\n    // Reset loading state after a shorter delay\r\n    setTimeout(() => {\r\n      this.isSubmitting = false;\r\n      this.cdr.detectChanges();\r\n    }, 1500);\r\n  }\r\n\r\n  isSelected(type: 'positive' | 'negative'): boolean {\r\n    // Use local state for immediate UI updates, fall back to message state\r\n    const feedbackToCheck = this.currentFeedback !== null ? this.currentFeedback : this.message.user_feedback;\r\n    return feedbackToCheck === type;\r\n  }\r\n}\r\n\r\n@Component({\r\n  selector: 'app-feedback-comment-dialog',\r\n  standalone: true,\r\n  imports: [\r\n    CommonModule,\r\n    MatDialogModule,\r\n    MatButtonModule,\r\n    MatFormFieldModule,\r\n    MatInputModule,\r\n    MatIconModule,\r\n    FormsModule\r\n  ],\r\n  template: `\r\n    <div mat-dialog-content class=\"simple-feedback-dialog\">\r\n      <mat-form-field appearance=\"outline\" class=\"full-width\">\r\n        <textarea matInput\r\n                  [(ngModel)]=\"comment\"\r\n                  rows=\"3\"\r\n                  maxlength=\"500\"\r\n                  placeholder=\"Please provide comment\"\r\n                  cdkTextareaAutosize\r\n                  cdkAutosizeMinRows=\"3\"\r\n                  cdkAutosizeMaxRows=\"5\">\r\n        </textarea>\r\n        <mat-hint align=\"end\">{{ comment.length || 0 }}/500</mat-hint>\r\n      </mat-form-field>\r\n    </div>\r\n\r\n    <div mat-dialog-actions class=\"simple-dialog-actions\">\r\n      <button mat-button (click)=\"onCancel()\">Cancel</button>\r\n      <button mat-raised-button color=\"primary\" (click)=\"onSubmit()\">Submit</button>\r\n    </div>\r\n  `,\r\n  styleUrls: ['./feedback.component.scss']\r\n})\r\nexport class FeedbackCommentDialogComponent {\r\n  comment: string = '';\r\n\r\n  constructor(\r\n    public dialogRef: MatDialogRef<FeedbackCommentDialogComponent>,\r\n    @Inject(MAT_DIALOG_DATA) public data: {\r\n      feedback: 'positive' | 'negative',\r\n      currentComment?: string\r\n    }\r\n  ) {\r\n    this.comment = data.currentComment || '';\r\n  }\r\n\r\n  onCancel() {\r\n    this.dialogRef.close();\r\n  }\r\n\r\n  onSubmit() {\r\n    this.dialogRef.close({ comment: this.comment.trim() || undefined });\r\n  }\r\n}","import { Component, Input, Output, EventEmitter } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport { ChatMessage, MessageType } from '../../models/chat.model';\r\nimport { PhaseUpdate } from '../../services/streaming-analytics.service';\r\nimport { AnimatedTextPipe } from '../../pipes/animated-text.pipe';\r\nimport { DashboardResultsComponent } from '../dashboard-results/dashboard-results.component';\r\nimport { InsightsComponent } from '../insights/insights.component';\r\nimport { ExecutionTimelineComponent } from '../execution-timeline/execution-timeline.component';\r\nimport { ExecutionDebugComponent } from '../execution-debug/execution-debug.component';\r\nimport { DimensionClarificationComponent, DimensionSelection } from '../dimension-clarification/dimension-clarification.component';\r\nimport { MessageFeedbackComponent } from '../feedback/feedback.component';\r\n\r\n@Component({\r\n  selector: 'app-chat-message',\r\n  standalone: true,\r\n  imports: [\r\n    CommonModule,\r\n    FormsModule,\r\n    AnimatedTextPipe,\r\n    DashboardResultsComponent,\r\n    InsightsComponent,\r\n    ExecutionTimelineComponent,\r\n    ExecutionDebugComponent,\r\n    DimensionClarificationComponent,\r\n    MessageFeedbackComponent\r\n  ],\r\n  templateUrl: './chat-message.component.html',\r\n  styleUrl: './chat-message.component.scss'\r\n})\r\nexport class ChatMessageComponent {\r\n  @Input() message!: ChatMessage;\r\n  @Output() refreshRequested = new EventEmitter<ChatMessage>();\r\n  @Output() clarificationSubmitted = new EventEmitter<{message: ChatMessage, selections: DimensionSelection[]}>();\r\n  @Output() clarificationCancelled = new EventEmitter<ChatMessage>();\r\n  @Output() feedbackSubmitted = new EventEmitter<{message: ChatMessage, feedback: 'positive' | 'negative', comment?: string}>();\r\n  @Output() stopStreamingRequested = new EventEmitter<ChatMessage>();\r\n\r\n  // Expose MessageType enum to template\r\n  MessageType = MessageType;\r\n\r\n  // Track if negative feedback was given on clarification (to disable/hide clarification UI)\r\n  clarificationCancelledByFeedback = false;\r\n\r\n  constructor(\r\n    private dialog: MatDialog\r\n  ) {}\r\n\r\n  shouldShowTimeline(): boolean {\r\n    return this.message.type === MessageType.ASSISTANT && \r\n           !!this.message.stepProgress && \r\n           this.message.stepProgress.length > 0;\r\n  }\r\n\r\n  isTimelineProcessing(): boolean {\r\n    return this.message.isLoading === true;\r\n  }\r\n\r\n  isTimelineCompleted(): boolean {\r\n    return this.message.executionCompleted === true;\r\n  }\r\n  \r\n  shouldShowDebug(): boolean {\r\n    // Show debug component if we have streaming debug logs from either real-time or historical data\r\n    return this.message.type === MessageType.ASSISTANT &&\r\n           !!this.message.streamingDebugLogs &&\r\n           Object.keys(this.message.streamingDebugLogs).length > 0;\r\n  }\r\n\r\n  isHistoricalDebug(): boolean {\r\n    // Historical debug logs come from database and have debug_logs populated\r\n    // but are displayed via streamingDebugLogs after conversion\r\n    return !!this.message.debug_logs && !this.message.isLoading;\r\n  }\r\n\r\n  formatTime(timestamp: Date): string {\r\n    return timestamp.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' });\r\n  }\r\n\r\n  formatTimestamp(timestamp: Date): string {\r\n    const now = new Date();\r\n    const messageDate = new Date(timestamp);\r\n    \r\n    const options: Intl.DateTimeFormatOptions = {\r\n      day: '2-digit',\r\n      month: 'short',\r\n      year: 'numeric',\r\n      hour: '2-digit',\r\n      minute: '2-digit',\r\n      hour12: true\r\n    };\r\n    \r\n    return messageDate.toLocaleDateString('en-US', options).replace(',', ',');\r\n  }\r\n\r\n  getResponseTime(): string {\r\n    // In a real app, you'd calculate this based on request/response timestamps\r\n    // For now, returning a mock value like in the Figma design\r\n    return '4.7 Sec';\r\n  }\r\n\r\n  onRefresh(): void {\r\n    this.refreshRequested.emit(this.message);\r\n  }\r\n\r\n  getLoadingMessage(): string {\r\n    // Get the latest phase update from this message's phaseUpdates\r\n    const latestPhase = this.message.phaseUpdates && this.message.phaseUpdates.length > 0\r\n      ? this.message.phaseUpdates[this.message.phaseUpdates.length - 1]\r\n      : null;\r\n\r\n    if (latestPhase && latestPhase.message) {\r\n      // Return the actual phase message if available\r\n      return latestPhase.message;\r\n    }\r\n\r\n    // Fallback messages based on phase type\r\n    if (latestPhase) {\r\n      switch (latestPhase.phase) {\r\n        case 'planning':\r\n          return 'Creating execution plan for your query';\r\n        case 'analyzing_dependencies':\r\n          return 'Analyzing data dependencies';\r\n        case 'optimizing':\r\n          return 'Optimizing query execution';\r\n        case 'executing':\r\n          return 'Executing analysis steps';\r\n        case 'visualizing':\r\n          return 'Generating visualizations and insights';\r\n        default:\r\n          return 'Processing your request';\r\n      }\r\n    }\r\n\r\n    // Default fallback message\r\n    return 'Analyzing your question';\r\n  }\r\n\r\n  onClarificationSubmitted(selections: DimensionSelection[]): void {\r\n    this.clarificationSubmitted.emit({\r\n      message: this.message,\r\n      selections: selections\r\n    });\r\n  }\r\n\r\n  onClarificationCancelled(): void {\r\n    this.clarificationCancelled.emit(this.message);\r\n  }\r\n\r\n  shouldShowClarification(): boolean {\r\n    // Don't show clarification if it was cancelled by negative feedback\r\n    if (this.clarificationCancelledByFeedback) {\r\n      return false;\r\n    }\r\n\r\n    return this.message.type === MessageType.ASSISTANT &&\r\n           !!this.message.clarificationRequest &&\r\n           !!this.message.needsClarification;\r\n  }\r\n\r\n  shouldShowFeedback(): boolean {\r\n    // Show feedback for assistant messages in the following cases:\r\n    // 1. During streaming (even if isLoading=true) - for real-time feedback\r\n    // 2. For completed messages with results (executionCompleted or dashboardData)\r\n    // 3. For historical messages (loaded from database)\r\n    // 4. Even for error messages (allow feedback on failures)\r\n    // 5. Even during clarification requests (allow feedback on confusing clarifications)\r\n\r\n    if (this.message.type !== MessageType.ASSISTANT) {\r\n      return false;\r\n    }\r\n\r\n    // Show feedback if:\r\n    // - Message is streaming (has stepProgress or phaseUpdates)\r\n    // - Message is completed (executionCompleted or has dashboard data)\r\n    // - Message has error (allow feedback on errors)\r\n    // - Message is from history (has message_order or session_id)\r\n    const isStreaming = this.message.isLoading &&\r\n                       (!!this.message.stepProgress?.length || !!this.message.phaseUpdates?.length);\r\n    const isCompleted = this.message.executionCompleted === true || !!this.message.dashboardData;\r\n    const hasError = this.message.hasError;\r\n    const isHistorical = !!this.message.message_order || !!this.message.session_id;\r\n\r\n    return isStreaming || isCompleted || hasError || isHistorical;\r\n  }\r\n\r\n  onFeedbackSubmitted(event: {feedback: 'positive' | 'negative', comment?: string}) {\r\n    console.log('🎯 ChatMessageComponent: Emitting feedback event to parent for message:', this.message.id, event);\r\n\r\n    // Check if this is negative feedback during clarification - cancel clarification and stop\r\n    // Check message properties directly (not shouldShowClarification which depends on the flag we're about to set)\r\n    const isClarification = this.message.type === MessageType.ASSISTANT &&\r\n                           !!this.message.clarificationRequest &&\r\n                           !!this.message.needsClarification &&\r\n                           !this.clarificationCancelledByFeedback;\r\n\r\n    if (event.feedback === 'negative' && isClarification) {\r\n      console.log('🛑 ChatMessageComponent: Negative feedback on clarification - cancelling clarification and stopping');\r\n\r\n      // Hide clarification UI immediately\r\n      this.clarificationCancelledByFeedback = true;\r\n\r\n      // Emit cancellation event to parent\r\n      this.clarificationCancelled.emit(this.message);\r\n\r\n      // Don't emit stop streaming since clarification isn't a streaming state\r\n      // The parent will handle cancellation appropriately\r\n    }\r\n\r\n    // Check if this is negative feedback during streaming - trigger stop\r\n    const isStreaming = this.message.isLoading &&\r\n                       (!!this.message.stepProgress?.length || !!this.message.phaseUpdates?.length);\r\n\r\n    if (event.feedback === 'negative' && isStreaming) {\r\n      console.log('🛑 ChatMessageComponent: Negative feedback during streaming - requesting stop');\r\n      this.stopStreamingRequested.emit(this.message);\r\n    }\r\n\r\n    // Emit to parent component for normal feedback handling\r\n    this.feedbackSubmitted.emit({\r\n      message: this.message,\r\n      feedback: event.feedback,\r\n      comment: event.comment\r\n    });\r\n  }\r\n\r\n}","<div class=\"message-container\"\r\n     [class.user-message]=\"message.type === MessageType.USER\"\r\n     [class.assistant-message]=\"message.type === MessageType.ASSISTANT\"\r\n     [class.system-message]=\"message.type === MessageType.SYSTEM\">\r\n  \r\n  <!-- User Message - Question Header -->\r\n  <div *ngIf=\"message.type === MessageType.USER\" class=\"question-header\">\r\n    <h3 class=\"question-title\">{{ message.content }}</h3>\r\n  </div>\r\n\r\n  <!-- Assistant Message - Response Content -->\r\n  <div *ngIf=\"message.type === MessageType.ASSISTANT\" class=\"response-content\">\r\n    <!-- Loading state -->\r\n    <div *ngIf=\"message.isLoading\" class=\"loading-state\">\r\n      <div class=\"assistant-info\">\r\n        <div class=\"loading-text\">\r\n          <div class=\"spinner small\"></div>\r\n          <span>{{ getLoadingMessage() | animatedText:true:{speed: 500, maxDots: 3} }}</span>\r\n        </div>\r\n      </div>\r\n    </div>\r\n\r\n    <!-- Error state -->\r\n    <div *ngIf=\"message.hasError\" class=\"error-state\">\r\n      <div class=\"assistant-info\">\r\n        <div class=\"error-message\">\r\n          <span class=\"error-icon\">⚠</span>\r\n          <span>{{ message.errorMessage || 'Something went wrong. Please try again.' }}</span>\r\n        </div>\r\n      </div>\r\n    </div>\r\n\r\n    <!-- Execution Timeline for this message -->\r\n    <app-execution-timeline \r\n      *ngIf=\"shouldShowTimeline()\"\r\n      [steps]=\"message.stepProgress!\"\r\n      [isProcessing]=\"isTimelineProcessing()\"\r\n      [isCompleted]=\"isTimelineCompleted()\"\r\n      class=\"message-timeline\">\r\n    </app-execution-timeline>\r\n    \r\n    <!-- Execution Debug (Works for both real-time and historical data) -->\r\n    <app-execution-debug\r\n      *ngIf=\"shouldShowDebug()\"\r\n      [streamingDebugLogs]=\"message.streamingDebugLogs\"\r\n      [isProcessing]=\"isTimelineProcessing()\"\r\n      [isCompleted]=\"isTimelineCompleted()\"\r\n      class=\"message-debug\">\r\n    </app-execution-debug>\r\n\r\n    <!-- Clarification Request -->\r\n    <div *ngIf=\"shouldShowClarification()\" class=\"clarification-content\">\r\n      <app-dimension-clarification\r\n        [clarificationRequest]=\"message.clarificationRequest\"\r\n        (clarificationSubmitted)=\"onClarificationSubmitted($event)\"\r\n        (clarificationCancelled)=\"onClarificationCancelled()\">\r\n      </app-dimension-clarification>\r\n    </div>\r\n\r\n    <!-- Normal content -->\r\n    <div *ngIf=\"!message.isLoading && !message.hasError && !shouldShowClarification()\" class=\"response-body\">\r\n      <!-- Assistant Info with Logo -->\r\n      <div class=\"assistant-info\">\r\n        <div class=\"assistant-description\">\r\n          <p>{{ message.content || \"Created a hospital performance leaderboard template with data to show you the concept. This will demonstrate the structure and visualisations you could use with data\" }}</p>\r\n        </div>\r\n      </div>\r\n\r\n      <!-- Dashboard Results Container -->\r\n      <div *ngIf=\"message.dashboardData\" class=\"results-container\">\r\n        <!-- Chart/Dashboard Content -->\r\n        <div class=\"chart-content\">\r\n          <app-dashboard-results [dashboardData]=\"message.dashboardData\"></app-dashboard-results>\r\n        </div>\r\n      </div>\r\n\r\n      <!-- Key Insights Outside Container -->\r\n      <div *ngIf=\"message.dashboardData?.insights && (message.dashboardData?.insights?.length || 0) > 0\" class=\"insights-section\">\r\n        <app-insights [insights]=\"message.dashboardData!.insights!\"></app-insights>\r\n      </div>\r\n    </div>\r\n\r\n    <!-- Message Feedback (for streaming, completed, error, and historical messages) -->\r\n    <div *ngIf=\"shouldShowFeedback()\" class=\"feedback-section\">\r\n      <app-message-feedback\r\n        [message]=\"message\"\r\n        (feedbackSubmitted)=\"onFeedbackSubmitted($event)\">\r\n      </app-message-feedback>\r\n    </div>\r\n  </div>\r\n\r\n  <!-- System Message -->\r\n  <div *ngIf=\"message.type === MessageType.SYSTEM\" class=\"system-message\">\r\n    <div class=\"system-content\">{{ message.content }}</div>\r\n  </div>\r\n</div>","import { Component, Input, Output, EventEmitter, ViewChild, ElementRef, AfterViewChecked } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ChatMessage } from '../../models/chat.model';\r\nimport { ChatMessageComponent } from '../chat-message/chat-message.component';\r\nimport { DimensionSelection } from '../dimension-clarification/dimension-clarification.component';\r\n\r\n@Component({\r\n  selector: 'app-chat-messages-container',\r\n  standalone: true,\r\n  imports: [\r\n    CommonModule,\r\n    ChatMessageComponent\r\n  ],\r\n  templateUrl: './chat-messages-container.component.html',\r\n  styleUrl: './chat-messages-container.component.scss'\r\n})\r\nexport class ChatMessagesContainerComponent implements AfterViewChecked {\r\n  @ViewChild('messagesContainer') private messagesContainer!: ElementRef;\r\n  \r\n  @Input() chatMessages: ChatMessage[] = [];\r\n  @Output() refreshRequested = new EventEmitter<ChatMessage>();\r\n  @Output() clarificationSubmitted = new EventEmitter<{message: ChatMessage, selections: DimensionSelection[]}>();\r\n  @Output() clarificationCancelled = new EventEmitter<ChatMessage>();\r\n  @Output() feedbackSubmitted = new EventEmitter<{message: ChatMessage, feedback: 'positive' | 'negative', comment?: string}>();\r\n  @Output() stopStreamingRequested = new EventEmitter<ChatMessage>();\r\n\r\n  private shouldScrollToBottom = false;\r\n\r\n  ngAfterViewChecked() {\r\n    if (this.shouldScrollToBottom) {\r\n      this.scrollToBottom();\r\n    }\r\n  }\r\n\r\n\r\n  trackMessage(index: number, message: ChatMessage): string {\r\n    return message.id;\r\n  }\r\n\r\n  public requestScroll(): void {\r\n    this.shouldScrollToBottom = true;\r\n  }\r\n\r\n  private scrollToBottom(): void {\r\n    try {\r\n      const container = this.messagesContainer?.nativeElement;\r\n      if (container) {\r\n        container.scrollTop = container.scrollHeight;\r\n        this.shouldScrollToBottom = false;\r\n      }\r\n    } catch (err) {\r\n      console.error('Error scrolling to bottom:', err);\r\n    }\r\n  }\r\n\r\n  onRefreshRequested(message: ChatMessage): void {\r\n    this.refreshRequested.emit(message);\r\n  }\r\n\r\n  onClarificationSubmitted(event: {message: ChatMessage, selections: DimensionSelection[]}): void {\r\n    this.clarificationSubmitted.emit(event);\r\n  }\r\n\r\n  onClarificationCancelled(message: ChatMessage): void {\r\n    this.clarificationCancelled.emit(message);\r\n  }\r\n\r\n  onFeedbackSubmitted(event: {message: ChatMessage, feedback: 'positive' | 'negative', comment?: string | undefined}): void {\r\n    this.feedbackSubmitted.emit(event);\r\n  }\r\n\r\n  onStopStreamingRequested(message: ChatMessage): void {\r\n    this.stopStreamingRequested.emit(message);\r\n  }\r\n\r\n}","<div class=\"chat-messages-container\" #messagesContainer>\r\n\r\n  <!-- Chat Messages -->\r\n  <div class=\"chat-messages\">\r\n    <app-chat-message\r\n      *ngFor=\"let message of chatMessages; trackBy: trackMessage\"\r\n      [message]=\"message\"\r\n      (refreshRequested)=\"onRefreshRequested($event)\"\r\n      (clarificationSubmitted)=\"onClarificationSubmitted($event)\"\r\n      (clarificationCancelled)=\"onClarificationCancelled($event)\"\r\n      (feedbackSubmitted)=\"onFeedbackSubmitted($event)\"\r\n      (stopStreamingRequested)=\"onStopStreamingRequested($event)\">\r\n    </app-chat-message>\r\n  </div>\r\n\r\n</div>","import { Component, Input, Output, EventEmitter, ViewChild, ElementRef, AfterViewInit, OnDestroy, OnChanges, SimpleChanges } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\n@Component({\r\n  selector: 'app-suggested-questions',\r\n  standalone: true,\r\n  imports: [\r\n    CommonModule\r\n  ],\r\n  templateUrl: './suggested-questions.component.html',\r\n  styleUrl: './suggested-questions.component.scss'\r\n})\r\nexport class SuggestedQuestionsComponent implements AfterViewInit, OnDestroy, OnChanges {\r\n  @Input() suggestedQuestions: string[] = [];\r\n  @Output() questionSelected = new EventEmitter<string>();\r\n\r\n  @ViewChild('scrollContainer', { static: false }) scrollContainer!: ElementRef<HTMLDivElement>;\r\n  \r\n  canScrollLeft = false;\r\n  canScrollRight = false;\r\n  \r\n  private resizeObserver?: ResizeObserver;\r\n\r\n  ngAfterViewInit() {\r\n    // Initial check for scrollability\r\n    setTimeout(() => {\r\n      this.checkScrollability();\r\n    }, 0);\r\n    \r\n    // Set up resize observer to detect when content changes\r\n    this.setupResizeObserver();\r\n  }\r\n\r\n  ngOnChanges(changes: SimpleChanges) {\r\n    // When suggested questions change, recheck scrollability\r\n    if (changes['suggestedQuestions'] && this.scrollContainer) {\r\n      setTimeout(() => {\r\n        this.checkScrollability();\r\n      }, 0);\r\n    }\r\n  }\r\n\r\n  ngOnDestroy() {\r\n    if (this.resizeObserver) {\r\n      this.resizeObserver.disconnect();\r\n    }\r\n  }\r\n\r\n  onQuestionSelect(question: string): void {\r\n    this.questionSelected.emit(question);\r\n  }\r\n\r\n  hasSuggestions(): boolean {\r\n    return this.suggestedQuestions && this.suggestedQuestions.length > 0;\r\n  }\r\n\r\n  onScroll(): void {\r\n    this.updateScrollIndicators();\r\n  }\r\n\r\n  private checkScrollability(): void {\r\n    if (!this.scrollContainer) return;\r\n    \r\n    const element = this.scrollContainer.nativeElement;\r\n    const hasOverflow = element.scrollWidth > element.clientWidth;\r\n    \r\n    if (hasOverflow) {\r\n      this.updateScrollIndicators();\r\n    } else {\r\n      this.canScrollLeft = false;\r\n      this.canScrollRight = false;\r\n    }\r\n  }\r\n\r\n  private updateScrollIndicators(): void {\r\n    if (!this.scrollContainer) return;\r\n    \r\n    const element = this.scrollContainer.nativeElement;\r\n    \r\n    // Check if can scroll left (not at the beginning)\r\n    this.canScrollLeft = element.scrollLeft > 0;\r\n    \r\n    // Check if can scroll right (not at the end)\r\n    // Add small tolerance (1px) to account for rounding issues\r\n    this.canScrollRight = element.scrollLeft < (element.scrollWidth - element.clientWidth - 1);\r\n  }\r\n\r\n  private setupResizeObserver(): void {\r\n    if (!this.scrollContainer || typeof ResizeObserver === 'undefined') return;\r\n    \r\n    this.resizeObserver = new ResizeObserver(() => {\r\n      this.checkScrollability();\r\n    });\r\n    \r\n    this.resizeObserver.observe(this.scrollContainer.nativeElement);\r\n  }\r\n}","<div *ngIf=\"hasSuggestions()\" class=\"suggested-questions-container\">\r\n  <div class=\"suggested-questions-wrapper\">\r\n    <!-- <div class=\"suggested-questions-label\">\r\n      <span class=\"icon\">psychology</span>\r\n      <span>Suggested questions:</span>\r\n    </div> -->\r\n    <div class=\"suggested-questions\">\r\n      <div class=\"scroll-indicator left\" [class.visible]=\"canScrollLeft\"></div>\r\n        <div class=\"suggested-chips\" #scrollContainer (scroll)=\"onScroll()\">\r\n          <div class=\"chip suggested-question-chip\" \r\n            *ngFor=\"let question of suggestedQuestions\" \r\n            (click)=\"onQuestionSelect(question)\">\r\n            {{ question }}\r\n          </div>\r\n        </div>\r\n      <div class=\"scroll-indicator right\" [class.visible]=\"canScrollRight\"></div>\r\n    </div>\r\n  </div>\r\n</div>","import { Injectable, Inject, Optional } from '@angular/core';\r\nimport { DATACHAT_AI_CONFIG, DataChatAIConfig, DEFAULT_DATACHAT_AI_CONFIG } from '../datachat-ai.config';\r\n\r\n/**\r\n * Environment service that provides backend URLs from configuration\r\n */\r\n@Injectable({\r\n  providedIn: 'root'\r\n})\r\nexport class EnvironmentService {\r\n  public backendUrl: string;\r\n  public websocketBackendUrl: string;\r\n  public userId: string;\r\n\r\n  constructor(@Optional() @Inject(DATACHAT_AI_CONFIG) private config?: DataChatAIConfig) {\r\n    this.backendUrl = this.config?.backendUrl || DEFAULT_DATACHAT_AI_CONFIG.backendUrl;\r\n    this.websocketBackendUrl = this.config?.websocketUrl || this.config?.backendUrl || DEFAULT_DATACHAT_AI_CONFIG.websocketUrl || this.backendUrl;\r\n    this.userId = this.config?.userId || DEFAULT_DATACHAT_AI_CONFIG.userId || '';\r\n  }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { Observable, Subject, BehaviorSubject } from 'rxjs';\r\nimport { EnvironmentService } from '../services/environment.service';\r\n\r\nexport interface StreamingEvent {\r\n  eventType: string;\r\n  data: any;\r\n  timestamp?: number;\r\n}\r\n\r\nexport interface StepProgress {\r\n  step_id: number;\r\n  step_type: string;\r\n  step_description: string;\r\n  status: 'started' | 'completed' | 'failed';\r\n  execution_time?: number;\r\n  progress: string;\r\n  error_message?: string;\r\n  timestamp: number;\r\n}\r\n\r\nexport interface PhaseUpdate {\r\n  phase: string;\r\n  message: string;\r\n  timestamp: number;\r\n  steps_count?: number;\r\n  total_steps?: number;\r\n  execution_groups?: number;\r\n}\r\n\r\nexport interface QueryRewritten {\r\n  original_query: string;\r\n  rewritten_query: string;\r\n  success: boolean;\r\n  timestamp: number;\r\n}\r\n\r\n@Injectable({\r\n  providedIn: 'root'\r\n})\r\nexport class StreamingAnalyticsService {\r\n  private webSocket: WebSocket | null = null;\r\n  private serverUrl = '';\r\n  private reconnectAttempts = 0;\r\n  private maxReconnectAttempts = 5;\r\n  private reconnectInterval = 3000; // 3 seconds\r\n  \r\n  // Observables for different event types\r\n  private connectionStatus$ = new BehaviorSubject<boolean>(false);\r\n  private phaseUpdates$ = new Subject<PhaseUpdate>();\r\n  private stepProgress$ = new Subject<StepProgress>();\r\n  private finalResult$ = new Subject<any>();\r\n  private errors$ = new Subject<string>();\r\n  private queryStarted$ = new Subject<{question: string, status: string, session_id?: string, message_id?: string}>();\r\n  private sessionCreated$ = new Subject<{session_id: string, message: string}>();\r\n  private sessionConnected$ = new Subject<{session_id: string, message: string}>();\r\n  private queryRewritten$ = new Subject<QueryRewritten>();\r\n  private queryCancelled$ = new Subject<any>();\r\n  // New streaming-only debug observables\r\n  private debugUpdates$ = new Subject<any>();\r\n  private errorUpdates$ = new Subject<any>();\r\n  private stepDebugInfo$ = new Subject<any>();\r\n  private debugExecutionComplete$ = new Subject<void>();\r\n  // Clarification observables\r\n  private clarificationRequest$ = new Subject<any>();\r\n  // Feedback observables\r\n  private feedbackSubmitted$ = new Subject<any>();\r\n  // Simple message ID mapping for feedback fix\r\n  private messageIdMapping = new Map<string, string>(); // temp_id -> real_uuid\r\n  private currentLoadingMessageId: string | null = null; // Track current loading message for mapping\r\n\r\n  constructor(private EnvironmentService:EnvironmentService) {\r\n    this.serverUrl = this.EnvironmentService.websocketBackendUrl+'/ws/submit_query'\r\n    this.initializeConnection();\r\n  }\r\n\r\n  private initializeConnection(): void {\r\n    try {\r\n      this.webSocket = new WebSocket(this.serverUrl);\r\n      \r\n      // Connection opened\r\n      this.webSocket.onopen = () => {\r\n        console.log('Connected to streaming analytics service');\r\n        this.connectionStatus$.next(true);\r\n        this.reconnectAttempts = 0; // Reset reconnect attempts on successful connection\r\n      };\r\n\r\n      // Connection closed\r\n      this.webSocket.onclose = (event) => {\r\n        console.log('Disconnected from streaming analytics service', event);\r\n        this.connectionStatus$.next(false);\r\n        this.handleReconnection();\r\n      };\r\n\r\n      // Connection error\r\n      this.webSocket.onerror = (error) => {\r\n        console.error('WebSocket error:', error);\r\n        this.errors$.next('WebSocket connection error');\r\n      };\r\n\r\n      // Message received\r\n      this.webSocket.onmessage = (event) => {\r\n        try {\r\n          const message = JSON.parse(event.data);\r\n          \r\n          // Validate message structure\r\n          if (!message || typeof message !== 'object') {\r\n            console.error('Invalid message structure:', message);\r\n            this.errors$.next('Received invalid message from server');\r\n            return;\r\n          }\r\n          \r\n          if (!message.event) {\r\n            console.error('Message missing event type:', message);\r\n            this.errors$.next('Received malformed message from server');\r\n            return;\r\n          }\r\n          \r\n          this.handleMessage(message);\r\n        } catch (error) {\r\n          console.error('Error parsing WebSocket message:', error, 'Raw data:', event.data);\r\n          this.errors$.next('Failed to parse server message');\r\n        }\r\n      };\r\n\r\n    } catch (error) {\r\n      console.error('Failed to create WebSocket connection:', error);\r\n      this.errors$.next('Failed to create WebSocket connection');\r\n    }\r\n  }\r\n\r\n  private handleMessage(message: any): void {\r\n    const { event, data } = message;\r\n    \r\n    console.log('🔥 FRONTEND RECEIVED WebSocket message:', event, data);\r\n    console.log('📋 Message structure:', JSON.stringify(message, null, 2));\r\n\r\n    switch (event) {\r\n      case 'connected':\r\n        console.log('🔗 Server confirmed connection:', data);\r\n        break;\r\n        \r\n      case 'query_started':\r\n        console.log('🚀 Query started:', data);\r\n        console.log('📤 Emitting to queryStarted$ observable');\r\n        this.queryStarted$.next(data);\r\n        console.log('✅ Successfully emitted query_started event');\r\n\r\n        // Map temporary message ID to real UUID for feedback operations\r\n        if (data.message_id && this.currentLoadingMessageId) {\r\n          this.messageIdMapping.set(this.currentLoadingMessageId, data.message_id);\r\n          console.log(`🗺️ Mapped loading message: ${this.currentLoadingMessageId} → ${data.message_id}`);\r\n\r\n          // Clear the current loading message ID after mapping\r\n          this.currentLoadingMessageId = null;\r\n        }\r\n        break;\r\n\r\n      case 'query_rewritten':\r\n        console.log('✏️ Query rewritten:', data);\r\n        console.log('📤 Emitting to queryRewritten$ observable');\r\n        this.queryRewritten$.next(data);\r\n        console.log('✅ Successfully emitted query_rewritten event');\r\n        break;\r\n\r\n      case 'query_cancelled':\r\n        console.log('🛑 QUERY CANCELLED CONFIRMED BY BACKEND 🛑');\r\n        console.log('📋 Cancellation data:', data);\r\n        console.log('⏰ Response time:', new Date().toISOString());\r\n        console.log('📤 Emitting to queryCancelled$ observable');\r\n        this.queryCancelled$.next(data);\r\n        console.log('✅ Successfully emitted query_cancelled event');\r\n        break;\r\n\r\n      case 'phase_update':\r\n        console.log('🏁 Phase update:', data);\r\n        console.log('📤 Emitting to phaseUpdates$ observable');\r\n        this.phaseUpdates$.next(data);\r\n        console.log('✅ Successfully emitted phase_update event');\r\n        break;\r\n        \r\n      case 'step_started':\r\n        console.log('▶️ Step started:', data);\r\n        console.log('🔍 DEBUG: Frontend step_started - step_description:', data.step_description);\r\n        console.log('📤 Emitting to stepProgress$ observable (started)');\r\n        \r\n        // Validate step data before emitting\r\n        const startedStep = this.validateStepData({...data, status: 'started'});\r\n        this.stepProgress$.next(startedStep);\r\n        console.log('✅ Successfully emitted step_started event');\r\n        break;\r\n        \r\n      case 'step_completed':\r\n        console.log('✅ Step completed:', data);\r\n        console.log('🔍 DEBUG: Frontend step_completed - step_description:', data.step_description);\r\n        console.log('📤 Emitting to stepProgress$ observable (completed)');\r\n        \r\n        // Validate step data before emitting\r\n        const completedStep = this.validateStepData({...data, status: 'completed'});\r\n        this.stepProgress$.next(completedStep);\r\n        console.log('✅ Successfully emitted step_completed event');\r\n        break;\r\n        \r\n      case 'step_failed':\r\n        console.log('❌ Step failed:', data);\r\n        console.log('📤 Emitting to stepProgress$ observable (failed)');\r\n        \r\n        // Validate step data before emitting\r\n        const failedStep = this.validateStepData({...data, status: 'failed'});\r\n        this.stepProgress$.next(failedStep);\r\n        console.log('✅ Successfully emitted step_failed event');\r\n        break;\r\n        \r\n      case 'query_completed':\r\n        console.log('🏆 Query completed:', data);\r\n        console.log('📤 Emitting to finalResult$ observable');\r\n        this.finalResult$.next(data);\r\n        console.log('✅ Successfully emitted query_completed event');\r\n        break;\r\n        \r\n      case 'error':\r\n        console.error('💥 Streaming error:', data);\r\n        console.log('📤 Emitting to errors$ observable');\r\n        this.errors$.next(data.message || 'Unknown streaming error');\r\n        console.log('✅ Successfully emitted error event');\r\n        break;\r\n        \r\n      case 'progress_update':\r\n        console.log('📈 Progress update:', data);\r\n        \r\n        // Check if this is a debug event based on event_type field\r\n        if (data.event_type) {\r\n          console.log('🔍 Debug event detected in progress_update:', data.event_type);\r\n          \r\n          switch (data.event_type) {\r\n            case 'debug_query_rewritten':\r\n              console.log('🔍 Debug: Query rewritten:', data);\r\n              this.debugUpdates$.next(data);\r\n              break;\r\n              \r\n            case 'debug_plan_generated':\r\n              console.log('🔍 Debug: Plan generated:', data);\r\n              this.debugUpdates$.next(data);\r\n              break;\r\n              \r\n            case 'debug_step_fetch_started':\r\n            case 'debug_step_cube_input':\r\n            case 'debug_step_sql':\r\n            case 'debug_step_dataframe':\r\n            case 'debug_step_code':\r\n            case 'debug_step_llm':\r\n              console.log(`🔍 Debug: Step info (${data.event_type}):`, data);\r\n              this.stepDebugInfo$.next(data);\r\n              break;\r\n              \r\n            case 'error_occurred':\r\n              console.log('🔍 Debug: Error occurred:', data);\r\n              this.errorUpdates$.next(data);\r\n              break;\r\n              \r\n            case 'debug_execution_complete':\r\n              console.log('🔍 Debug: Execution complete');\r\n              this.debugExecutionComplete$.next();\r\n              break;\r\n              \r\n            default:\r\n              console.log('📈 Generic progress update:', data);\r\n              break;\r\n          }\r\n        } else {\r\n          // Handle generic progress updates if needed\r\n          console.log('📈 Generic progress update (no event_type):', data);\r\n        }\r\n        break;\r\n\r\n      case 'session_created':\r\n        console.log('🆕 Session created by backend:', data);\r\n        console.log('📤 Emitting to sessionCreated$ observable');\r\n        this.sessionCreated$.next({\r\n          session_id: data.session_id,\r\n          message: data.message || 'Session created'\r\n        });\r\n        console.log('✅ Successfully emitted session_created event');\r\n        break;\r\n\r\n      case 'session_connected':\r\n        console.log('🔗 Connected to existing session:', data);\r\n        console.log('📤 Emitting to sessionConnected$ observable');\r\n        this.sessionConnected$.next({\r\n          session_id: data.session_id,\r\n          message: data.message || 'Session connected'\r\n        });\r\n        console.log('✅ Successfully emitted session_connected event');\r\n        break;\r\n        \r\n      // Debug event handling\r\n      case 'debug_query_rewritten':\r\n        console.log('🔍 Debug: Query rewritten:', data);\r\n        this.debugUpdates$.next(data);\r\n        break;\r\n        \r\n      case 'debug_plan_generated':\r\n        console.log('🔍 Debug: Plan generated:', data);\r\n        this.debugUpdates$.next(data);\r\n        break;\r\n        \r\n      case 'debug_step_fetch_started':\r\n      case 'debug_step_cube_input':\r\n      case 'debug_step_sql':\r\n      case 'debug_step_dataframe':\r\n      case 'debug_step_code':\r\n      case 'debug_step_llm':\r\n        console.log(`🔍 Debug: Step info (${event}):`, data);\r\n        this.stepDebugInfo$.next(data);\r\n        break;\r\n        \r\n      case 'error_occurred':\r\n        console.log('🔍 Debug: Error occurred:', data);\r\n        this.errorUpdates$.next(data);\r\n        break;\r\n        \r\n      case 'debug_execution_complete':\r\n        console.log('🔍 Debug: Execution complete');\r\n        this.debugExecutionComplete$.next();\r\n        break;\r\n\r\n      case 'clarification_request':\r\n        console.log('🎯 FRONTEND SERVICE: Clarification request received!');\r\n        console.log('📋 FRONTEND SERVICE: Clarification data:', data);\r\n        console.log('🔍 FRONTEND SERVICE: Available options:', data.available_options);\r\n        console.log('📤 FRONTEND SERVICE: Emitting to clarificationRequest$ observable');\r\n        this.clarificationRequest$.next(data);\r\n        console.log('✅ FRONTEND SERVICE: Successfully emitted clarification_request event');\r\n        break;\r\n\r\n      case 'feedback_submitted':\r\n        console.log('👍 FRONTEND SERVICE: Feedback submitted successfully!');\r\n        console.log('📋 FRONTEND SERVICE: Feedback data:', data);\r\n        console.log('📤 FRONTEND SERVICE: Emitting to feedbackSubmitted$ observable');\r\n        this.feedbackSubmitted$.next(data);\r\n        console.log('✅ FRONTEND SERVICE: Successfully emitted feedback_submitted event');\r\n        break;\r\n\r\n      default:\r\n        console.warn('⚠️ Unknown event type:', event, data);\r\n        console.log('🗃️ Available event types: connected, query_started, query_cancelled, phase_update, step_started, step_completed, step_failed, query_completed, error, session_created, session_connected, debug_query_rewritten, debug_plan_generated, debug_step_*, error_occurred, debug_execution_complete');\r\n    }\r\n    \r\n    console.log('📊 Current observable states:');\r\n    console.log('  - connectionStatus$:', this.connectionStatus$.value);\r\n    console.log('  - Subscriptions active for all observables');\r\n  }\r\n\r\n  private handleReconnection(): void {\r\n    if (this.reconnectAttempts < this.maxReconnectAttempts) {\r\n      this.reconnectAttempts++;\r\n      console.log(`Attempting to reconnect... (${this.reconnectAttempts}/${this.maxReconnectAttempts})`);\r\n\r\n      setTimeout(() => {\r\n        this.initializeConnection();\r\n      }, this.reconnectInterval);\r\n    } else {\r\n      console.error('Maximum reconnection attempts reached');\r\n      this.errors$.next('Connection lost. Please refresh the page.');\r\n    }\r\n  }\r\n\r\n  // Public methods\r\n  connect(): void {\r\n    if (!this.webSocket || this.webSocket.readyState === WebSocket.CLOSED) {\r\n      this.initializeConnection();\r\n    }\r\n  }\r\n\r\n  disconnect(): void {\r\n    if (this.webSocket) {\r\n      this.webSocket.close();\r\n      this.webSocket = null;\r\n    }\r\n  }\r\n\r\n  submitStreamingQuery(question: string, sessionId?: string, userId?: string): void {\r\n    console.log('🚀 FRONTEND: Attempting to submit streaming query:', question);\r\n    console.log('📋 Session context - sessionId:', sessionId, 'userId:', userId);\r\n    console.log('🔌 WebSocket readyState:', this.webSocket?.readyState);\r\n    console.log('🔌 WebSocket.OPEN constant:', WebSocket.OPEN);\r\n    \r\n    if (this.webSocket && this.webSocket.readyState === WebSocket.OPEN) {\r\n      console.log('✅ WebSocket is open, sending query...');\r\n      const message = {\r\n        event: 'submit_query',\r\n        data: { \r\n          question,\r\n          user_id: userId,\r\n          session_id: sessionId\r\n        }\r\n      };\r\n      console.log('📦 Sending message:', JSON.stringify(message, null, 2));\r\n      this.webSocket.send(JSON.stringify(message));\r\n      console.log('✅ Message sent successfully!');\r\n    } else {\r\n      console.error('❌ WebSocket not connected. Cannot submit query.');\r\n      console.log('🔌 Current WebSocket state:', this.webSocket?.readyState);\r\n      console.log('🔌 Expected state (OPEN):', WebSocket.OPEN);\r\n      this.errors$.next('Not connected to streaming service');\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Create a new session via WebSocket\r\n   */\r\n  createSession(userId?: string, sessionName?: string, metadata?: any): void {\r\n    if (this.webSocket && this.webSocket.readyState === WebSocket.OPEN) {\r\n      const message = {\r\n        event: 'create_session',\r\n        data: {\r\n          user_id: userId,\r\n          session_name: sessionName,\r\n          metadata: metadata\r\n        }\r\n      };\r\n      console.log('📦 Creating session:', JSON.stringify(message, null, 2));\r\n      this.webSocket.send(JSON.stringify(message));\r\n    } else {\r\n      console.error('❌ WebSocket not connected. Cannot create session.');\r\n      this.errors$.next('Not connected to streaming service');\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Connect to an existing session via WebSocket\r\n   */\r\n  connectToSession(sessionId: string): void {\r\n    if (this.webSocket && this.webSocket.readyState === WebSocket.OPEN) {\r\n      const message = {\r\n        event: 'connect_session',\r\n        data: {\r\n          session_id: sessionId\r\n        }\r\n      };\r\n      console.log('📦 Connecting to session:', JSON.stringify(message, null, 2));\r\n      this.webSocket.send(JSON.stringify(message));\r\n    } else {\r\n      console.error('❌ WebSocket not connected. Cannot connect to session.');\r\n      this.errors$.next('Not connected to streaming service');\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Submit clarification response with user's dimension selections\r\n   */\r\n  submitClarificationResponse(\r\n    sessionId: string,\r\n    userId: string,\r\n    originalQuestion: string,\r\n    selectedDimensions: any[],\r\n    userMessageId?: string,\r\n    filterValue?: string,\r\n    filterType?: string\r\n  ): void {\r\n    console.log('📤 FRONTEND: Submitting clarification response for session:', sessionId);\r\n    console.log('📋 Selected dimensions:', selectedDimensions);\r\n    console.log('📝 Original question:', originalQuestion);\r\n    console.log('🆔 User message ID:', userMessageId);\r\n    console.log('🔍 Filter value:', filterValue);\r\n    console.log('📌 Filter type:', filterType);\r\n\r\n    if (this.webSocket && this.webSocket.readyState === WebSocket.OPEN) {\r\n      const message = {\r\n        event: 'clarification_response',\r\n        data: {\r\n          session_id: sessionId,\r\n          user_id: userId,\r\n          original_question: originalQuestion,\r\n          selected_dimensions: selectedDimensions,\r\n          user_message_id: userMessageId,  // Include the original user message ID\r\n          filter_value: filterValue,  // Include the ambiguous filter value for programmatic rewriting\r\n          filter_type: filterType  // Include the filter type (included/excluded)\r\n        }\r\n      };\r\n\r\n      console.log('📦 Sending clarification response:', JSON.stringify(message, null, 2));\r\n      this.webSocket.send(JSON.stringify(message));\r\n      console.log('✅ Clarification response sent successfully!');\r\n    } else {\r\n      console.error('❌ WebSocket not connected. Cannot submit clarification response.');\r\n      this.errors$.next('Not connected to streaming service');\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Cancel query execution for a specific session with immediate priority and retry mechanism\r\n   */\r\n  cancelQuery(sessionId: string): void {\r\n    console.log('🛑 FRONTEND: Requesting URGENT query cancellation for session:', sessionId);\r\n    console.log('⏰ Timestamp:', new Date().toISOString());\r\n\r\n    if (this.webSocket && this.webSocket.readyState === WebSocket.OPEN) {\r\n      const message = {\r\n        event: 'cancel_query',\r\n        data: {\r\n          session_id: sessionId,\r\n          priority: 'URGENT',\r\n          timestamp: Date.now()\r\n        }\r\n      };\r\n\r\n      // Send cancellation multiple times with slight delays to ensure delivery\r\n      const sendCancellation = () => {\r\n        if (this.webSocket && this.webSocket.readyState === WebSocket.OPEN) {\r\n          console.log('📦 URGENT: Sending cancel message:', JSON.stringify(message, null, 2));\r\n          this.webSocket.send(JSON.stringify(message));\r\n          return true;\r\n        }\r\n        return false;\r\n      };\r\n\r\n      // Send immediately\r\n      if (sendCancellation()) {\r\n        console.log('✅ Immediate cancel request sent successfully');\r\n\r\n        // Send retry attempts with exponential backoff for reliability\r\n        setTimeout(() => {\r\n          if (sendCancellation()) {\r\n            console.log('✅ Retry #1 cancel request sent');\r\n          }\r\n        }, 100);  // 100ms retry\r\n\r\n        setTimeout(() => {\r\n          if (sendCancellation()) {\r\n            console.log('✅ Retry #2 cancel request sent');\r\n          }\r\n        }, 500);  // 500ms retry\r\n\r\n        setTimeout(() => {\r\n          if (sendCancellation()) {\r\n            console.log('✅ Retry #3 cancel request sent');\r\n          }\r\n        }, 1000); // 1s retry\r\n      }\r\n    } else {\r\n      console.error('❌ WebSocket not connected. Cannot cancel query.');\r\n      this.errors$.next('Not connected to streaming service');\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Submit user feedback for a message via WebSocket\r\n   */\r\n  submitMessageFeedback(messageId: string, feedback: 'positive' | 'negative', comment?: string): void {\r\n    console.log('👍 FRONTEND: Submitting message feedback via WebSocket');\r\n    console.log('📋 Message ID:', messageId);\r\n    console.log('📋 Feedback:', feedback);\r\n    console.log('📋 Comment:', comment);\r\n\r\n    if (this.webSocket && this.webSocket.readyState === WebSocket.OPEN) {\r\n      const message = {\r\n        event: 'submit_feedback',\r\n        data: {\r\n          message_id: messageId,\r\n          feedback: feedback,\r\n          comment: comment\r\n        }\r\n      };\r\n\r\n      console.log('📦 Sending feedback message:', JSON.stringify(message, null, 2));\r\n      this.webSocket.send(JSON.stringify(message));\r\n      console.log('✅ Feedback message sent successfully!');\r\n    } else {\r\n      console.error('❌ WebSocket not connected. Cannot submit feedback.');\r\n      this.errors$.next('Not connected to streaming service');\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Get real message UUID for feedback operations (simple fix)\r\n   */\r\n  getRealMessageId(messageId: string): string {\r\n    // Check mapping first\r\n    const realId = this.messageIdMapping.get(messageId);\r\n    if (realId) {\r\n      console.log(`🗺️ Mapped temporary ID ${messageId} → real UUID ${realId}`);\r\n      return realId;\r\n    }\r\n\r\n    // Fallback to original ID (for historical messages that already have proper UUIDs)\r\n    return messageId;\r\n  }\r\n\r\n  /**\r\n   * Set the current loading message ID to be mapped when WebSocket response arrives\r\n   */\r\n  setCurrentLoadingMessageId(messageId: string): void {\r\n    this.currentLoadingMessageId = messageId;\r\n    console.log(`📍 Set current loading message ID: ${messageId}`);\r\n  }\r\n\r\n  // Observable getters\r\n  get connectionStatus(): Observable<boolean> {\r\n    return this.connectionStatus$.asObservable();\r\n  }\r\n\r\n  get queryStarted(): Observable<{question: string, status: string, session_id?: string, message_id?: string}> {\r\n    return this.queryStarted$.asObservable();\r\n  }\r\n\r\n  get phaseUpdates(): Observable<PhaseUpdate> {\r\n    return this.phaseUpdates$.asObservable();\r\n  }\r\n\r\n  get stepProgress(): Observable<StepProgress> {\r\n    return this.stepProgress$.asObservable();\r\n  }\r\n\r\n  get finalResult(): Observable<any> {\r\n    return this.finalResult$.asObservable();\r\n  }\r\n\r\n  get errors(): Observable<string> {\r\n    return this.errors$.asObservable();\r\n  }\r\n  \r\n  // New debug observable getters\r\n  get debugUpdates(): Observable<any> {\r\n    return this.debugUpdates$.asObservable();\r\n  }\r\n  \r\n  get errorUpdates(): Observable<any> {\r\n    return this.errorUpdates$.asObservable();\r\n  }\r\n  \r\n  get stepDebugInfo(): Observable<any> {\r\n    return this.stepDebugInfo$.asObservable();\r\n  }\r\n  \r\n  get debugExecutionComplete(): Observable<void> {\r\n    return this.debugExecutionComplete$.asObservable();\r\n  }\r\n\r\n  get sessionCreated(): Observable<{session_id: string, message: string}> {\r\n    return this.sessionCreated$.asObservable();\r\n  }\r\n\r\n  get sessionConnected(): Observable<{session_id: string, message: string}> {\r\n    return this.sessionConnected$.asObservable();\r\n  }\r\n\r\n  get queryRewritten(): Observable<QueryRewritten> {\r\n    return this.queryRewritten$.asObservable();\r\n  }\r\n\r\n  get queryCancelled(): Observable<any> {\r\n    return this.queryCancelled$.asObservable();\r\n  }\r\n\r\n  get clarificationRequest(): Observable<any> {\r\n    return this.clarificationRequest$.asObservable();\r\n  }\r\n\r\n  get feedbackSubmitted(): Observable<any> {\r\n    return this.feedbackSubmitted$.asObservable();\r\n  }\r\n\r\n  // Utility methods\r\n  isConnected(): boolean {\r\n    return this.webSocket?.readyState === WebSocket.OPEN;\r\n  }\r\n\r\n  private validateStepData(step: any): StepProgress {\r\n    // Ensure all required fields are present with fallbacks\r\n    const validatedStep: StepProgress = {\r\n      step_id: typeof step.step_id === 'number' ? step.step_id : 0,\r\n      step_type: step.step_type || 'unknown',\r\n      step_description: step.step_description || this.getDefaultStepDescription(step.step_type, step.step_id),\r\n      status: step.status || 'started',\r\n      execution_time: step.execution_time,\r\n      progress: step.progress || this.getDefaultProgress(step.status),\r\n      error_message: step.error_message,\r\n      timestamp: step.timestamp || Date.now()\r\n    };\r\n\r\n    // Log validation warnings if needed\r\n    if (!step.step_description) {\r\n      console.warn(`Step ${step.step_id} missing description, using fallback: ${validatedStep.step_description}`);\r\n    }\r\n\r\n    return validatedStep;\r\n  }\r\n\r\n  private getDefaultStepDescription(stepType: string, stepId: number): string {\r\n    const stepTypeDescriptions: { [key: string]: string } = {\r\n      'FETCH': 'Fetching data from database',\r\n      'FETCH_DEPENDENT': 'Processing dependent data query',\r\n      'EVALUATE': 'Evaluating query results',\r\n      'INFER': 'Generating insights and conclusions',\r\n      'initialization': 'Initializing process'\r\n    };\r\n\r\n    const typeDescription = stepTypeDescriptions[stepType] || 'Processing step';\r\n    return `${typeDescription} (Step ${stepId + 1})`;\r\n  }\r\n\r\n  private getDefaultProgress(status: string): string {\r\n    switch (status) {\r\n      case 'started':\r\n        return 'In Progress...';\r\n      case 'completed':\r\n        return 'Completed';\r\n      case 'failed':\r\n        return 'Failed';\r\n      default:\r\n        return 'Pending';\r\n    }\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    this.disconnect();\r\n  }\r\n}","import { Injectable } from '@angular/core';\r\nimport { HttpClient, HttpErrorResponse } from '@angular/common/http';\r\nimport { Observable, throwError, BehaviorSubject, Subject } from 'rxjs';\r\nimport { catchError, tap, map, take } from 'rxjs/operators';\r\nimport { StreamingAnalyticsService } from './streaming-analytics.service';\r\nimport {\r\n  ChatSession,\r\n  CreateSessionRequest,\r\n  UpdateSessionRequest,\r\n  SessionResponse,\r\n  MessageResponse,\r\n  CreateMessageRequest,\r\n  UpdateMessageRequest,\r\n  QueryExecutionResponse,\r\n  SessionStatsResponse,\r\n  ChatMessage,\r\n  DebugLogs\r\n} from '../models/chat.model';\r\nimport { DashboardData, StepResult } from '../models/dashboard.model';\r\nimport { StepProgress } from './streaming-analytics.service';\r\nimport { StreamingDebugLog, StepDebugInfo, ErrorDebugInfo } from '../components/execution-debug/execution-debug.component';\r\nimport { EnvironmentService } from '../services/environment.service';\r\n\r\n@Injectable({\r\n  providedIn: 'root'\r\n})\r\nexport class ChatHistoryService {\r\n  private baseUrl = '';\r\n  \r\n  // Reactive state management\r\n  private currentSessionSubject = new BehaviorSubject<ChatSession | null>(null);\r\n  private sessionsSubject = new BehaviorSubject<ChatSession[]>([]);\r\n  private sessionMessagesSubject = new BehaviorSubject<ChatMessage[]>([]);\r\n  private loadingSubject = new BehaviorSubject<boolean>(false);\r\n  private messagesLoadingSubject = new BehaviorSubject<boolean>(false); // Separate loading for messages\r\n  private errorSubject = new Subject<string>();\r\n\r\n  // Public observables\r\n  public currentSession$ = this.currentSessionSubject.asObservable();\r\n  public sessions$ = this.sessionsSubject.asObservable();\r\n  public sessionMessages$ = this.sessionMessagesSubject.asObservable();\r\n  public loading$ = this.loadingSubject.asObservable();\r\n  public messagesLoading$ = this.messagesLoadingSubject.asObservable(); // Separate observable for messages\r\n  public error$ = this.errorSubject.asObservable();\r\n\r\n  constructor(\r\n    private http: HttpClient,\r\n    private EnvironmentService: EnvironmentService,\r\n    private streamingService: StreamingAnalyticsService\r\n  ) {\r\n    this.baseUrl= this.EnvironmentService.backendUrl+'/api/chat'\r\n  }\r\n\r\n  // ==========================================================================\r\n  // SESSION MANAGEMENT\r\n  // ==========================================================================\r\n\r\n  /**\r\n   * Create a new chat session\r\n   */\r\n  createSession(request: CreateSessionRequest): Observable<ChatSession> {\r\n    this.setLoading(true);\r\n    return this.http.post<SessionResponse>(`${this.baseUrl}/sessions`, request)\r\n      .pipe(\r\n        map(response => this.mapSessionResponse(response)),\r\n        tap(session => {\r\n          this.currentSessionSubject.next(session);\r\n          this.addSessionToList(session);\r\n          console.log('Created new session:', session);\r\n        }),\r\n        catchError(this.handleError.bind(this)),\r\n        tap(() => this.setLoading(false))\r\n      );\r\n  }\r\n\r\n  /**\r\n   * Get all sessions for a user\r\n   */\r\n  getUserSessions(userId?: string, limit: number = 50, offset: number = 0, activeOnly: boolean = true): Observable<ChatSession[]> {\r\n    this.setLoading(true);\r\n    let params: any = { limit: limit.toString(), offset: offset.toString(), active_only: activeOnly.toString() };\r\n    if (userId) {\r\n      params.user_id = userId;\r\n    }\r\n\r\n    return this.http.get<SessionResponse[]>(`${this.baseUrl}/sessions`, { params })\r\n      .pipe(\r\n        map(responses => responses.map(response => this.mapSessionResponse(response))),\r\n        tap(sessions => {\r\n          this.sessionsSubject.next(sessions);\r\n          console.log('Loaded sessions:', sessions);\r\n          \r\n          // Auto-select the most recent session if no current session is set\r\n          // This prevents session duplication after page refresh\r\n          if (sessions.length > 0 && !this.currentSessionSubject.value) {\r\n            const mostRecentSession = sessions[0]; // Sessions are ordered by last activity (most recent first)\r\n            console.log('Auto-selecting most recent session after refresh:', mostRecentSession.id);\r\n            this.setCurrentSession(mostRecentSession);\r\n          }\r\n        }),\r\n        catchError(this.handleError.bind(this)),\r\n        tap(() => this.setLoading(false))\r\n      );\r\n  }\r\n\r\n  /**\r\n   * Get a specific session by ID\r\n   */\r\n  getSession(sessionId: string): Observable<ChatSession> {\r\n    // this.setLoading(true);\r\n    return this.http.get<SessionResponse>(`${this.baseUrl}/sessions/${sessionId}`)\r\n      .pipe(\r\n        map(response => this.mapSessionResponse(response)),\r\n        tap(session => {\r\n          this.currentSessionSubject.next(session);\r\n          console.log('Loaded session:', session);\r\n        }),\r\n        catchError(this.handleError.bind(this)),\r\n        tap(() => this.setLoading(false))\r\n      );\r\n  }\r\n\r\n  /**\r\n   * Update a session\r\n   */\r\n  updateSession(sessionId: string, updates: UpdateSessionRequest): Observable<ChatSession> {\r\n    this.setLoading(true);\r\n    return this.http.put<SessionResponse>(`${this.baseUrl}/sessions/${sessionId}`, updates)\r\n      .pipe(\r\n        map(response => this.mapSessionResponse(response)),\r\n        tap(session => {\r\n          this.currentSessionSubject.next(session);\r\n          this.updateSessionInList(session);\r\n          console.log('Updated session:', session);\r\n        }),\r\n        catchError(this.handleError.bind(this)),\r\n        tap(() => this.setLoading(false))\r\n      );\r\n  }\r\n\r\n  /**\r\n   * Delete a session\r\n   */\r\n  deleteSession(sessionId: string): Observable<boolean> {\r\n    this.setLoading(true);\r\n    return this.http.delete<{success: boolean, message: string}>(`${this.baseUrl}/sessions/${sessionId}`)\r\n      .pipe(\r\n        map(response => response.success),\r\n        tap(success => {\r\n          if (success) {\r\n            this.removeSessionFromList(sessionId);\r\n            if (this.currentSessionSubject.value?.id === sessionId) {\r\n              this.currentSessionSubject.next(null);\r\n              this.sessionMessagesSubject.next([]);\r\n            }\r\n            console.log('Deleted session:', sessionId);\r\n          }\r\n        }),\r\n        catchError(this.handleError.bind(this)),\r\n        tap(() => this.setLoading(false))\r\n      );\r\n  }\r\n\r\n  // ==========================================================================\r\n  // MESSAGE MANAGEMENT\r\n  // ==========================================================================\r\n\r\n  /**\r\n   * Get messages for a session\r\n   */\r\n  getSessionMessages(sessionId: string, limit: number = 100, offset: number = 0): Observable<ChatMessage[]> {\r\n    this.setMessagesLoading(true);\r\n    const params = { limit: limit.toString(), offset: offset.toString() };\r\n\r\n    return this.http.get<MessageResponse[]>(`${this.baseUrl}/sessions/${sessionId}/messages`, { params })\r\n      .pipe(\r\n        map(responses => responses.map(response => this.mapMessageResponse(response))),\r\n        tap(messages => {\r\n          this.sessionMessagesSubject.next(messages);\r\n          console.log('Loaded session messages:', messages);\r\n        }),\r\n        catchError(this.handleError.bind(this)),\r\n        tap(() => this.setMessagesLoading(false))\r\n      );\r\n  }\r\n\r\n  /**\r\n   * Add a message to a session\r\n   */\r\n  addMessage(sessionId: string, message: CreateMessageRequest): Observable<ChatMessage> {\r\n    return this.http.post<MessageResponse>(`${this.baseUrl}/sessions/${sessionId}/messages`, message)\r\n      .pipe(\r\n        map(response => this.mapMessageResponse(response)),\r\n        tap(newMessage => {\r\n          const currentMessages = this.sessionMessagesSubject.value;\r\n          this.sessionMessagesSubject.next([...currentMessages, newMessage]);\r\n          console.log('Added message:', newMessage);\r\n        }),\r\n        catchError(this.handleError.bind(this))\r\n      );\r\n  }\r\n\r\n  /**\r\n   * Update a message\r\n   */\r\n  updateMessage(messageId: string, updates: UpdateMessageRequest): Observable<ChatMessage> {\r\n    return this.http.put<MessageResponse>(`${this.baseUrl}/messages/${messageId}`, updates)\r\n      .pipe(\r\n        map(response => this.mapMessageResponse(response)),\r\n        tap(updatedMessage => {\r\n          const currentMessages = this.sessionMessagesSubject.value;\r\n          const messageIndex = currentMessages.findIndex(m => m.id === messageId);\r\n          if (messageIndex >= 0) {\r\n            const updatedMessages = [...currentMessages];\r\n            updatedMessages[messageIndex] = updatedMessage;\r\n            this.sessionMessagesSubject.next(updatedMessages);\r\n          }\r\n          console.log('Updated message:', updatedMessage);\r\n        }),\r\n        catchError(this.handleError.bind(this))\r\n      );\r\n  }\r\n\r\n  /**\r\n   * Submit user feedback for a message via WebSocket\r\n   */\r\n  submitMessageFeedback(messageId: string, feedback: 'positive' | 'negative', comment?: string): Observable<ChatMessage> {\r\n    console.log(`🎯 Submitting feedback via WebSocket for message ${messageId}:`, feedback, comment || '(no comment)');\r\n\r\n    // Get the real UUID for the message (handles temporary ID mapping)\r\n    const realMessageId = this.streamingService.getRealMessageId(messageId) || messageId;\r\n    console.log(`🎯 Using real message ID: ${realMessageId} (original: ${messageId})`);\r\n\r\n    // Submit feedback via WebSocket using the real UUID\r\n    this.streamingService.submitMessageFeedback(realMessageId, feedback, comment);\r\n\r\n    // Return an observable that listens for the feedback submission response\r\n    return this.streamingService.feedbackSubmitted.pipe(\r\n      take(1), // Take only the first response\r\n      tap((response: any) => {\r\n        console.log('👍 Feedback submission response received:', response);\r\n\r\n        // Update the local message state with the new feedback\r\n        const currentMessages = this.sessionMessagesSubject.value;\r\n        const updatedMessages = currentMessages.map(message => {\r\n          if (message.id === messageId) {\r\n            return {\r\n              ...message,\r\n              user_feedback: response.feedback,\r\n              feedback_comment: response.comment\r\n            };\r\n          }\r\n          return message;\r\n        });\r\n\r\n        // Update the local state\r\n        this.sessionMessagesSubject.next(updatedMessages);\r\n        console.log(`📝 Local state updated for message ${messageId} with feedback:`, response.feedback);\r\n      }),\r\n      map((response: any) => {\r\n        // Convert response to ChatMessage format\r\n        const currentMessages = this.sessionMessagesSubject.value;\r\n        const updatedMessage = currentMessages.find(m => m.id === messageId);\r\n        return updatedMessage || {} as ChatMessage;\r\n      }),\r\n      catchError(error => {\r\n        console.error('❌ Error submitting feedback via WebSocket:', error);\r\n        this.errorSubject.next('Failed to submit feedback: ' + (error?.message || 'Unknown error'));\r\n        return throwError(error);\r\n      })\r\n    );\r\n  }\r\n\r\n  /**\r\n   * Delete a message\r\n   */\r\n  deleteMessage(messageId: string): Observable<boolean> {\r\n    return this.http.delete<{success: boolean, message: string}>(`${this.baseUrl}/messages/${messageId}`)\r\n      .pipe(\r\n        map(response => response.success),\r\n        tap(success => {\r\n          if (success) {\r\n            const currentMessages = this.sessionMessagesSubject.value;\r\n            const filteredMessages = currentMessages.filter(m => m.id !== messageId);\r\n            this.sessionMessagesSubject.next(filteredMessages);\r\n            console.log('Deleted message:', messageId);\r\n          }\r\n        }),\r\n        catchError(this.handleError.bind(this))\r\n      );\r\n  }\r\n\r\n  // ==========================================================================\r\n  // QUERY EXECUTION MANAGEMENT\r\n  // ==========================================================================\r\n\r\n  /**\r\n   * Get query executions for a session\r\n   */\r\n  getSessionExecutions(sessionId: string, limit: number = 50): Observable<QueryExecutionResponse[]> {\r\n    const params = { limit: limit.toString() };\r\n    \r\n    return this.http.get<QueryExecutionResponse[]>(`${this.baseUrl}/sessions/${sessionId}/executions`, { params })\r\n      .pipe(\r\n        tap(executions => console.log('Loaded session executions:', executions)),\r\n        catchError(this.handleError.bind(this))\r\n      );\r\n  }\r\n\r\n  /**\r\n   * Get session statistics\r\n   */\r\n  getSessionStats(sessionId: string): Observable<SessionStatsResponse> {\r\n    return this.http.get<SessionStatsResponse>(`${this.baseUrl}/sessions/${sessionId}/stats`)\r\n      .pipe(\r\n        tap(stats => console.log('Loaded session stats:', stats)),\r\n        catchError(this.handleError.bind(this))\r\n      );\r\n  }\r\n\r\n  // ==========================================================================\r\n  // UTILITY METHODS\r\n  // ==========================================================================\r\n\r\n  /**\r\n   * Set the current active session\r\n   */\r\n  setCurrentSession(session: ChatSession | null): void {\r\n    this.currentSessionSubject.next(session);\r\n    if (session) {\r\n      // Load messages for the session\r\n      this.getSessionMessages(session.id).subscribe();\r\n    } else {\r\n      this.sessionMessagesSubject.next([]);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Get current session without subscribing\r\n   */\r\n  getCurrentSession(): ChatSession | null {\r\n    return this.currentSessionSubject.value;\r\n  }\r\n\r\n  /**\r\n   * Get current session messages without subscribing\r\n   */\r\n  getCurrentMessages(): ChatMessage[] {\r\n    return this.sessionMessagesSubject.value;\r\n  }\r\n\r\n  /**\r\n   * Create a session automatically for anonymous users\r\n   */\r\n  createDefaultSession(firstQuestion?: string, userId?: string): Observable<ChatSession> {\r\n    const sessionName = firstQuestion \r\n      ? `${firstQuestion.substring(0, 50)}${firstQuestion.length > 50 ? '...' : ''}`\r\n      : 'New Chat Session';\r\n\r\n    return this.createSession({\r\n      user_id: userId, // Now properly set the user_id\r\n      session_name: sessionName,\r\n      metadata: { \r\n        source: 'web-client',\r\n        auto_created: true,\r\n        created_with_question: !!firstQuestion,\r\n        user_id: userId // Also store in metadata for reference\r\n      }\r\n    });\r\n  }\r\n\r\n  /**\r\n   * Helper method to convert frontend ChatMessage to backend CreateMessageRequest\r\n   */\r\n  messageToCreateRequest(message: ChatMessage): CreateMessageRequest {\r\n    return {\r\n      message_type: message.type as 'user' | 'assistant' | 'system',\r\n      content: message.content,\r\n      dashboard_data: message.dashboardData || undefined,\r\n      execution_metadata: message.execution_metadata,\r\n      has_error: message.hasError || false,\r\n      error_message: message.errorMessage\r\n    };\r\n  }\r\n\r\n  // ==========================================================================\r\n  // PRIVATE HELPER METHODS\r\n  // ==========================================================================\r\n\r\n  private mapSessionResponse(response: SessionResponse): ChatSession {\r\n    return {\r\n      id: response.id,\r\n      user_id: response.user_id,\r\n      session_name: response.session_name,\r\n      created_at: response.created_at,\r\n      updated_at: response.updated_at,\r\n      is_active: response.is_active,\r\n      metadata: response.metadata\r\n    };\r\n  }\r\n\r\n  /**\r\n   * Convert StepResult[] from dashboard_data to StepProgress[] format for timeline component\r\n   */\r\n  private convertStepResultsToStepProgress(stepResults: StepResult[]): StepProgress[] {\r\n    return stepResults.map(stepResult => {\r\n      const stepProgress: StepProgress = {\r\n        step_id: stepResult.step_id,\r\n        step_type: stepResult.step_type,\r\n        step_description: stepResult.description || this.getDefaultStepDescription(stepResult.step_type, stepResult.step_id),\r\n        status: this.mapStepStatus(stepResult.status),\r\n        execution_time: stepResult.execution_time,\r\n        progress: this.getProgressText(stepResult.status),\r\n        error_message: stepResult.status === 'failed' ? 'Step failed during execution' : undefined,\r\n        timestamp: Date.now() // Historical steps don't have individual timestamps\r\n      };\r\n\r\n      return stepProgress;\r\n    });\r\n  }\r\n\r\n  /**\r\n   * Map dashboard step status to streaming step status\r\n   */\r\n  private mapStepStatus(status: string): 'started' | 'completed' | 'failed' {\r\n    switch (status?.toLowerCase()) {\r\n      case 'completed':\r\n        return 'completed';\r\n      case 'failed':\r\n        return 'failed';\r\n      case 'started':\r\n      case 'in_progress':\r\n        return 'started';\r\n      default:\r\n        return 'completed'; // Default to completed for historical data\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Get default step description based on step type and ID\r\n   */\r\n  private getDefaultStepDescription(stepType: string, stepId: number): string {\r\n    const stepTypeDescriptions: { [key: string]: string } = {\r\n      'FETCH': 'Fetching data from database',\r\n      'FETCH_DEPENDENT': 'Processing dependent data query',\r\n      'EVALUATE': 'Evaluating and processing query results',\r\n      'INFER': 'Generating insights and conclusions'\r\n    };\r\n\r\n    const typeDescription = stepTypeDescriptions[stepType] || 'Processing step';\r\n    return `${typeDescription} (Step ${stepId + 1})`;\r\n  }\r\n\r\n  /**\r\n   * Get progress text based on status\r\n   */\r\n  private getProgressText(status: string): string {\r\n    switch (status?.toLowerCase()) {\r\n      case 'completed':\r\n        return 'Completed';\r\n      case 'failed':\r\n        return 'Failed';\r\n      case 'started':\r\n      case 'in_progress':\r\n        return 'In Progress...';\r\n      default:\r\n        return 'Completed';\r\n    }\r\n  }\r\n\r\n  private mapMessageResponse(response: MessageResponse): ChatMessage {\r\n    const message: ChatMessage = {\r\n      id: response.id,\r\n      type: response.message_type as 'user' | 'assistant' | 'system',\r\n      content: response.content,\r\n      timestamp: new Date(response.timestamp),\r\n      dashboardData: response.dashboard_data,\r\n      hasError: response.has_error,\r\n      errorMessage: response.error_message,\r\n      session_id: response.session_id,\r\n      message_order: response.message_order,\r\n      execution_metadata: response.execution_metadata,\r\n      debug_logs: response.debug_logs,\r\n      user_feedback: response.user_feedback as 'positive' | 'negative' | null,\r\n      feedback_comment: response.feedback_comment\r\n    };\r\n\r\n    // Extract timeline data from dashboard_data.step_results for assistant messages\r\n    if (response.message_type === 'assistant' && response.dashboard_data?.step_results) {\r\n      message.stepProgress = this.convertStepResultsToStepProgress(response.dashboard_data.step_results);\r\n      message.executionCompleted = true;\r\n    }\r\n\r\n    // Convert debug_logs to streamingDebugLogs format for ExecutionDebugComponent\r\n    if (response.debug_logs) {\r\n      message.streamingDebugLogs = this.convertDebugLogsToStreamingFormat(response.debug_logs);\r\n      console.log('🔍 Converted historical debug logs for message:', message.id);\r\n      console.log('🔍 StreamingDebugLogs:', message.streamingDebugLogs);\r\n    }\r\n\r\n    return message;\r\n  }\r\n\r\n  /**\r\n   * Convert raw debug_logs from database to StreamingDebugLog format\r\n   * This ensures historical debug logs display identically to real-time debug logs\r\n   */\r\n  private convertDebugLogsToStreamingFormat(debugLogs: DebugLogs | undefined): StreamingDebugLog | undefined {\r\n    if (!debugLogs) return undefined;\r\n\r\n    try {\r\n      // Convert steps - add timestamp field from first_seen or last_updated\r\n      const convertedSteps: StepDebugInfo[] = (debugLogs.steps || []).map(step => ({\r\n        ...step,\r\n        timestamp: step.first_seen || step.last_updated || Date.now()\r\n      }));\r\n\r\n      // Post-process steps to extract missing code data from unknown_events\r\n      this.enhanceStepsWithUnknownEvents(convertedSteps, debugLogs.unknown_events || []);\r\n\r\n      // Convert errors - map error_type string to specific enum values\r\n      const convertedErrors: ErrorDebugInfo[] = (debugLogs.errors || []).map(error => ({\r\n        ...error,\r\n        error_type: this.mapErrorType(error.error_type),\r\n        stack_trace: error.details?.stack_trace,\r\n        context: error.details,\r\n        retry_suggested: false\r\n      }));\r\n\r\n      const streamingDebugLog: StreamingDebugLog = {\r\n        steps: convertedSteps,\r\n        errors: convertedErrors\r\n      };\r\n\r\n      // Add query rewriting info if available\r\n      if (debugLogs.query_rewriting) {\r\n        streamingDebugLog.query_rewriting = {\r\n          original_question: debugLogs.query_rewriting.original_question || '',\r\n          rewritten_question: debugLogs.query_rewriting.rewritten_question || '',\r\n          rewriting_errors: debugLogs.query_rewriting.rewriting_errors || [],\r\n          timestamp: debugLogs.query_rewriting.timestamp || Date.now()\r\n        };\r\n      }\r\n\r\n      // Add execution plan if available\r\n      if (debugLogs.execution_plan) {\r\n        streamingDebugLog.execution_plan = debugLogs.execution_plan;\r\n      }\r\n\r\n      // Add error summary if available\r\n      if (debugLogs.error_summary) {\r\n        streamingDebugLog.error_summary = debugLogs.error_summary;\r\n      }\r\n\r\n      // Add timestamp from execution summary\r\n      if (debugLogs.execution_summary?.completed_at) {\r\n        streamingDebugLog.timestamp = debugLogs.execution_summary.completed_at;\r\n      }\r\n\r\n      console.log('🔍 Converted debug logs:', {\r\n        stepsCount: streamingDebugLog.steps?.length || 0,\r\n        errorsCount: streamingDebugLog.errors?.length || 0,\r\n        hasQueryRewriting: !!streamingDebugLog.query_rewriting,\r\n        hasExecutionPlan: !!streamingDebugLog.execution_plan\r\n      });\r\n\r\n      return streamingDebugLog;\r\n\r\n    } catch (error) {\r\n      console.error('❌ Error converting debug logs to streaming format:', error);\r\n      return undefined;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Enhance steps with missing data from unknown_events\r\n   * This fixes historical debug logs where code snippets are in unknown_events\r\n   */\r\n  private enhanceStepsWithUnknownEvents(steps: StepDebugInfo[], unknownEvents: any[]): void {\r\n    // Extract debug_step_code events from unknown_events\r\n    const codeEvents = unknownEvents.filter(event => event.event_type === 'debug_step_code');\r\n\r\n    codeEvents.forEach(event => {\r\n      const data = event.data || {};\r\n      const stepId = data.step_id;\r\n\r\n      if (stepId !== undefined) {\r\n        // Find the corresponding step\r\n        const step = steps.find(s => s.step_id === stepId);\r\n\r\n        if (step) {\r\n          // Add missing code data to the step\r\n          if (data.code_snippet && !step.code_snippet) {\r\n            step.code_snippet = data.code_snippet;\r\n            console.log(`🔧 Enhanced step ${stepId} with code snippet from unknown_events`);\r\n          }\r\n\r\n          if (data.pandas_operations && !step.pandas_operations) {\r\n            step.pandas_operations = data.pandas_operations;\r\n            console.log(`🔧 Enhanced step ${stepId} with pandas operations from unknown_events`);\r\n          }\r\n\r\n          if (data.llm_operations && !step.llm_operations) {\r\n            step.llm_operations = data.llm_operations;\r\n            console.log(`🔧 Enhanced step ${stepId} with llm operations from unknown_events`);\r\n          }\r\n\r\n          if (data.llm_prompt && !step.llm_prompt) {\r\n            step.llm_prompt = data.llm_prompt;\r\n          }\r\n\r\n          if (data.llm_response && !step.llm_response) {\r\n            step.llm_response = data.llm_response;\r\n          }\r\n        }\r\n      }\r\n    });\r\n  }\r\n\r\n  /**\r\n   * Map backend error type strings to frontend ErrorDebugInfo error_type enum\r\n   */\r\n  private mapErrorType(errorType: string): 'query_rewriting' | 'planning' | 'fetch' | 'evaluate' | 'infer' | 'system' {\r\n    const lowerType = errorType?.toLowerCase() || '';\r\n\r\n    if (lowerType.includes('rewriting') || lowerType.includes('query')) {\r\n      return 'query_rewriting';\r\n    } else if (lowerType.includes('planning') || lowerType.includes('plan')) {\r\n      return 'planning';\r\n    } else if (lowerType.includes('fetch')) {\r\n      return 'fetch';\r\n    } else if (lowerType.includes('evaluate') || lowerType.includes('eval')) {\r\n      return 'evaluate';\r\n    } else if (lowerType.includes('infer') || lowerType.includes('llm')) {\r\n      return 'infer';\r\n    } else {\r\n      return 'system';\r\n    }\r\n  }\r\n\r\n  addSessionToList(session: ChatSession): void {\r\n    const currentSessions = this.sessionsSubject.value;\r\n    const exists = currentSessions.find(s => s.id === session.id);\r\n    if (!exists) {\r\n      this.sessionsSubject.next([session, ...currentSessions]);\r\n    }\r\n  }\r\n\r\n  private updateSessionInList(session: ChatSession): void {\r\n    const currentSessions = this.sessionsSubject.value;\r\n    const sessionIndex = currentSessions.findIndex(s => s.id === session.id);\r\n    if (sessionIndex >= 0) {\r\n      const updatedSessions = [...currentSessions];\r\n      updatedSessions[sessionIndex] = session;\r\n      this.sessionsSubject.next(updatedSessions);\r\n    }\r\n  }\r\n\r\n  private removeSessionFromList(sessionId: string): void {\r\n    const currentSessions = this.sessionsSubject.value;\r\n    const filteredSessions = currentSessions.filter(s => s.id !== sessionId);\r\n    this.sessionsSubject.next(filteredSessions);\r\n  }\r\n\r\n  private setLoading(loading: boolean): void {\r\n    this.loadingSubject.next(loading);\r\n  }\r\n\r\n  private setMessagesLoading(loading: boolean): void {\r\n    this.messagesLoadingSubject.next(loading);\r\n  }\r\n\r\n  private handleError(error: HttpErrorResponse): Observable<never> {\r\n    let errorMessage = 'An unexpected error occurred';\r\n    \r\n    if (error.error instanceof ErrorEvent) {\r\n      // Client-side error\r\n      errorMessage = `Client Error: ${error.error.message}`;\r\n    } else {\r\n      // Server-side error\r\n      if (error.status === 0) {\r\n        errorMessage = 'Unable to connect to the server. Please check your connection.';\r\n      } else if (error.status >= 400 && error.status < 500) {\r\n        errorMessage = error.error?.message || `Client error (${error.status})`;\r\n      } else if (error.status >= 500) {\r\n        errorMessage = error.error?.message || `Server error (${error.status})`;\r\n      }\r\n    }\r\n\r\n    console.error('ChatHistoryService Error:', error);\r\n    this.errorSubject.next(errorMessage);\r\n    \r\n    return throwError(() => new Error(errorMessage));\r\n  }\r\n\r\n  /**\r\n   * Clear all state (useful for logout/reset)\r\n   */\r\n  clearState(): void {\r\n    this.currentSessionSubject.next(null);\r\n    this.sessionsSubject.next([]);\r\n    this.sessionMessagesSubject.next([]);\r\n    this.setLoading(false);\r\n  }\r\n}","import { Component, OnInit, OnDestroy, Input, Output, EventEmitter } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { Subscription } from 'rxjs';\r\nimport { ChatHistoryService } from '../../services/chat-history.service';\r\nimport { ChatSession } from '../../models/chat.model';\r\nimport { SvgIconComponent } from '../svg-icon/svg-icon.component';\r\n\r\n@Component({\r\n  selector: 'app-session-sidebar',\r\n  standalone: true,\r\n  imports: [CommonModule, FormsModule, SvgIconComponent],\r\n  templateUrl: './session-sidebar.component.html',\r\n  styleUrl: './session-sidebar.component.scss'\r\n})\r\nexport class SessionSidebarComponent implements OnInit, OnDestroy {\r\n  @Input() isCollapsed = false;\r\n  @Input() currentUserId?: string;\r\n  @Output() sessionSelected = new EventEmitter<ChatSession>();\r\n  @Output() newSessionRequested = new EventEmitter<void>();\r\n  @Output() sidebarToggled = new EventEmitter<boolean>();\r\n\r\n  sessions: ChatSession[] = [];\r\n  currentSession: ChatSession | null = null;\r\n  loading = false;\r\n  error: string | null = null;\r\n\r\n  // Edit session state\r\n  editingSessionId: string | null = null;\r\n  editingSessionName = '';\r\n\r\n  // Tooltip state\r\n  showTooltipForSession: string | null = null;\r\n\r\n  private subscriptions: Subscription[] = [];\r\n\r\n  constructor(private chatHistoryService: ChatHistoryService) {}\r\n\r\n  ngOnInit(): void {\r\n    // Subscribe to service observables\r\n    this.subscriptions.push(\r\n      this.chatHistoryService.sessions$.subscribe(sessions => {\r\n        this.sessions = sessions;\r\n      }),\r\n\r\n      this.chatHistoryService.currentSession$.subscribe(session => {\r\n        this.currentSession = session;\r\n      }),\r\n\r\n      this.chatHistoryService.loading$.subscribe(loading => {\r\n        this.loading = loading;\r\n      }),\r\n\r\n      this.chatHistoryService.error$.subscribe(error => {\r\n        this.error = error;\r\n      })\r\n    );\r\n\r\n    // Load sessions if we have a user ID\r\n    if (this.currentUserId) {\r\n      this.loadSessions();\r\n    }\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    this.subscriptions.forEach(sub => sub.unsubscribe());\r\n  }\r\n\r\n  /**\r\n   * Load sessions from the backend\r\n   */\r\n  loadSessions(): void {\r\n    this.chatHistoryService.getUserSessions(this.currentUserId, 50, 0, true).subscribe({\r\n      error: (error) => {\r\n        console.error('Failed to load sessions:', error);\r\n      }\r\n    });\r\n  }\r\n\r\n  /**\r\n   * Select a session\r\n   */\r\n  selectSession(session: ChatSession): void {\r\n    if (this.currentSession?.id === session.id) {\r\n      return; // Already selected\r\n    }\r\n\r\n    this.chatHistoryService.setCurrentSession(session);\r\n    this.sessionSelected.emit(session);\r\n    \r\n    // On mobile, collapse sidebar after selection\r\n    if (window.innerWidth <= 768) {\r\n      this.toggleSidebar();\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Create a new session\r\n   */\r\n  createNewSession(): void {\r\n    this.newSessionRequested.emit();\r\n    \r\n    // On mobile, collapse sidebar after creating\r\n    if (window.innerWidth <= 768) {\r\n      this.toggleSidebar();\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Start editing a session name\r\n   */\r\n  startEditingSession(session: ChatSession, event: Event): void {\r\n    event.stopPropagation(); // Prevent session selection\r\n    this.editingSessionId = session.id;\r\n    this.editingSessionName = session.session_name || 'Untitled Session';\r\n  }\r\n\r\n  /**\r\n   * Save session name edit\r\n   */\r\n  saveSessionEdit(): void {\r\n    if (!this.editingSessionId || !this.editingSessionName.trim()) {\r\n      this.cancelSessionEdit();\r\n      return;\r\n    }\r\n\r\n    const trimmedName = this.editingSessionName.trim();\r\n    this.chatHistoryService.updateSession(this.editingSessionId, {\r\n      session_name: trimmedName\r\n    }).subscribe({\r\n      next: () => {\r\n        this.editingSessionId = null;\r\n        this.editingSessionName = '';\r\n      },\r\n      error: (error) => {\r\n        console.error('Failed to update session name:', error);\r\n        // Keep editing mode open on error\r\n      }\r\n    });\r\n  }\r\n\r\n  /**\r\n   * Cancel session name edit\r\n   */\r\n  cancelSessionEdit(): void {\r\n    this.editingSessionId = null;\r\n    this.editingSessionName = '';\r\n  }\r\n\r\n  /**\r\n   * Handle keypress in edit mode\r\n   */\r\n  onEditKeyPress(event: KeyboardEvent): void {\r\n    if (event.key === 'Enter') {\r\n      this.saveSessionEdit();\r\n    } else if (event.key === 'Escape') {\r\n      this.cancelSessionEdit();\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Delete a session\r\n   */\r\n  deleteSession(session: ChatSession, event: Event): void {\r\n    event.stopPropagation(); // Prevent session selection\r\n\r\n    if (confirm(`Are you sure you want to delete \"${session.session_name || 'Untitled Session'}\"? This action cannot be undone.`)) {\r\n      this.chatHistoryService.deleteSession(session.id).subscribe({\r\n        next: (success) => {\r\n          if (success) {\r\n            console.log('Session deleted successfully');\r\n          }\r\n        },\r\n        error: (error) => {\r\n          console.error('Failed to delete session:', error);\r\n        }\r\n      });\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Toggle sidebar collapsed state\r\n   */\r\n  toggleSidebar(): void {\r\n    this.isCollapsed = !this.isCollapsed;\r\n    this.sidebarToggled.emit(this.isCollapsed);\r\n  }\r\n\r\n  /**\r\n   * Format date for display\r\n   */\r\n  formatDate(dateString: string): string {\r\n    const date = new Date(dateString);\r\n    const now = new Date();\r\n    const diffInHours = (now.getTime() - date.getTime()) / (1000 * 60 * 60);\r\n\r\n    if (diffInHours < 24) {\r\n      // Less than 24 hours ago - show time\r\n      return date.toLocaleTimeString('en-US', { \r\n        hour: 'numeric', \r\n        minute: '2-digit',\r\n        hour12: true \r\n      });\r\n    } else if (diffInHours < 24 * 7) {\r\n      // Less than a week ago - show day name\r\n      return date.toLocaleDateString('en-US', { weekday: 'short' });\r\n    } else {\r\n      // More than a week ago - show date\r\n      return date.toLocaleDateString('en-US', { \r\n        month: 'short', \r\n        day: 'numeric' \r\n      });\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Get session preview text\r\n   */\r\n  getSessionPreview(session: ChatSession): string {\r\n    if (session.session_name && session.session_name.trim()) {\r\n      return session.session_name;\r\n    }\r\n    return 'Untitled Session';\r\n  }\r\n\r\n  /**\r\n   * Track sessions for ngFor performance\r\n   */\r\n  trackSession(index: number, session: ChatSession): string {\r\n    return session.id;\r\n  }\r\n\r\n  /**\r\n   * Refresh sessions list\r\n   */\r\n  refreshSessions(): void {\r\n    this.loadSessions();\r\n  }\r\n\r\n  /**\r\n   * Check if session is currently selected\r\n   */\r\n  isSelected(session: ChatSession): boolean {\r\n    return this.currentSession?.id === session.id;\r\n  }\r\n\r\n  /**\r\n   * Check if session is being edited\r\n   */\r\n  isEditing(session: ChatSession): boolean {\r\n    return this.editingSessionId === session.id;\r\n  }\r\n\r\n  /**\r\n   * Toggle tooltip visibility for a session\r\n   */\r\n  toggleSessionTooltip(session: ChatSession, event: Event): void {\r\n    event.stopPropagation(); // Prevent session selection\r\n    \r\n    if (this.showTooltipForSession === session.id) {\r\n      this.showTooltipForSession = null;\r\n    } else {\r\n      this.showTooltipForSession = session.id;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Check if tooltip is visible for session\r\n   */\r\n  isTooltipVisible(session: ChatSession): boolean {\r\n    return this.showTooltipForSession === session.id;\r\n  }\r\n\r\n  /**\r\n   * Close tooltip when clicking outside\r\n   */\r\n  closeTooltip(): void {\r\n    this.showTooltipForSession = null;\r\n  }\r\n\r\n  /**\r\n   * Start editing session from tooltip\r\n   */\r\n  startEditingFromTooltip(session: ChatSession, event: Event): void {\r\n    event.stopPropagation();\r\n    this.closeTooltip();\r\n    this.startEditingSession(session, event);\r\n  }\r\n\r\n  /**\r\n   * Delete session from tooltip\r\n   */\r\n  deleteSessionFromTooltip(session: ChatSession, event: Event): void {\r\n    event.stopPropagation();\r\n    this.closeTooltip();\r\n    this.deleteSession(session, event);\r\n  }\r\n}","<div class=\"session-sidebar\" [class.collapsed]=\"isCollapsed\" (click)=\"closeTooltip()\">\r\n  \r\n  <div class=\"h-[60px]\">\r\n    <div class=\"sidebar-header\" *ngIf=\"!isCollapsed\">\r\n      <img src=\"../../../assets/svgs/history.svg\" alt=\"Datachat AI\" class=\"app-logo\" />\r\n      <div class=\"app-subtitle\">History</div>\r\n    </div>\r\n  </div>\r\n\r\n  <!-- New Session Button -->\r\n  <div class=\"sidebar-actions\" *ngIf=\"!isCollapsed\">\r\n    <button \r\n      class=\"new-session-btn\" \r\n      (click)=\"createNewSession()\"\r\n      [disabled]=\"loading\">\r\n      <app-svg-icon name=\"new-chat\" size=\"20px\" />\r\n      <span>New Chat</span>\r\n    </button>\r\n    <!-- <button \r\n      class=\"toggle-button\" \r\n      (click)=\"toggleSidebar()\"\r\n      [title]=\"isCollapsed ? 'Expand sidebar' : 'Collapse sidebar'\">\r\n      <span class=\"toggle-icon\" [class.collapsed]=\"isCollapsed\">‹</span>\r\n    </button> -->\r\n  </div>\r\n\r\n  <!-- New Session Button (Collapsed) -->\r\n  <div class=\"sidebar-actions-collapsed\" *ngIf=\"isCollapsed\">\r\n    <button \r\n      class=\"new-session-btn-collapsed\" \r\n      (click)=\"createNewSession()\"\r\n      [disabled]=\"loading\"\r\n      title=\"New Chat\">\r\n      <span class=\"plus-icon\">+</span>\r\n    </button>\r\n    <button \r\n      class=\"toggle-button\" \r\n      (click)=\"toggleSidebar()\"\r\n      [title]=\"isCollapsed ? 'Expand sidebar' : 'Collapse sidebar'\">\r\n      <span class=\"toggle-icon\" [class.collapsed]=\"isCollapsed\">‹</span>\r\n    </button>\r\n  </div>\r\n\r\n  <!-- Loading State -->\r\n  <div class=\"loading-container\" *ngIf=\"loading && !isCollapsed\">\r\n    <div class=\"loading-text\">Loading sessions...</div>\r\n  </div>\r\n\r\n  <!-- Error State -->\r\n  <div class=\"error-container\" *ngIf=\"error && !isCollapsed\">\r\n    <div class=\"error-text\">{{ error }}</div>\r\n    <button class=\"retry-btn\" (click)=\"refreshSessions()\">Retry</button>\r\n  </div>\r\n\r\n  <!-- Sessions List -->\r\n  <div class=\"sessions-list\" [ngStyle]=\"{'scrollbar-width': isCollapsed ? 'none' : 'thin'}\" *ngIf=\"!loading && !error\">\r\n    <!-- Empty State -->\r\n    <div class=\"empty-state\" *ngIf=\"sessions.length === 0 && !isCollapsed\">\r\n      <div class=\"empty-icon\">💬</div>\r\n      <div class=\"empty-text\">No conversations yet</div>\r\n      <div class=\"empty-subtext\">Start a new chat to begin</div>\r\n    </div>\r\n\r\n    <!-- Session Items -->\r\n    <div \r\n      class=\"session-item\" \r\n      *ngFor=\"let session of sessions; trackBy: trackSession\"\r\n      [class.selected]=\"isSelected(session)\"\r\n      [class.collapsed]=\"isCollapsed\"\r\n      (click)=\"selectSession(session)\">\r\n      \r\n      <!-- Session Content (Expanded) -->\r\n      <div class=\"session-content flex items-center gap-1\" *ngIf=\"!isCollapsed\">\r\n        <!-- Edit Mode -->\r\n        <div class=\"session-edit\" *ngIf=\"isEditing(session)\">\r\n          <input \r\n            type=\"text\" \r\n            class=\"session-name-input\"\r\n            [(ngModel)]=\"editingSessionName\"\r\n            (keypress)=\"onEditKeyPress($event)\"\r\n            (blur)=\"saveSessionEdit()\"\r\n            #editInput\r\n            maxlength=\"100\">\r\n          <div class=\"edit-actions\">\r\n            <button class=\"save-btn\" (click)=\"saveSessionEdit()\" title=\"Save\">✓</button>\r\n            <button class=\"cancel-btn\" (click)=\"cancelSessionEdit()\" title=\"Cancel\">✕</button>\r\n          </div>\r\n        </div>\r\n\r\n        <!-- View Mode -->\r\n        <div class=\"session-view\" *ngIf=\"!isEditing(session)\">\r\n          <div class=\"session-header\">\r\n            <div class=\"session-name\">{{ getSessionPreview(session) }}</div>\r\n            <!-- <div class=\"session-date\">{{ formatDate(session.updated_at || session.created_at) }}</div> -->\r\n          </div>\r\n          <div class=\"session-meta\" *ngIf=\"session.message_count || session.query_count\">\r\n            <span class=\"message-count\" *ngIf=\"session.message_count\">\r\n              {{ session.message_count }} messages\r\n            </span>\r\n            <span class=\"query-count\" *ngIf=\"session.query_count\">\r\n              {{ session.query_count }} queries\r\n            </span>\r\n          </div>\r\n        </div>\r\n\r\n        <!-- Three Dot Menu -->\r\n        <div class=\"session-actions\" *ngIf=\"!isEditing(session)\">\r\n          <button \r\n            class=\"three-dot-menu\"\r\n            (click)=\"toggleSessionTooltip(session, $event)\"\r\n            title=\"More actions\">\r\n            ⋯\r\n          </button>\r\n          \r\n          <!-- Session Tooltip -->\r\n          <div class=\"session-tooltip\" *ngIf=\"isTooltipVisible(session)\" (click)=\"$event.stopPropagation()\">\r\n            <button \r\n              class=\"tooltip-option rename-option\"\r\n              (click)=\"startEditingFromTooltip(session, $event)\">\r\n              <img class=\"option-icon\" src=\"../../../assets/svgs/edit.svg\" alt=\"Rename\" />\r\n              <span class=\"option-text\">Rename</span>\r\n            </button>\r\n            <button \r\n              class=\"tooltip-option delete-option\"\r\n              (click)=\"deleteSessionFromTooltip(session, $event)\">\r\n              <img class=\"option-icon\" src=\"../../../assets/svgs/deleteIcon.svg\" alt=\"Delete\" />\r\n              <span class=\"option-text\">Delete</span>\r\n            </button>\r\n          </div>\r\n        </div>\r\n      </div>\r\n\r\n      <!-- Session Content (Collapsed) -->\r\n      <div class=\"session-content-collapsed\" *ngIf=\"isCollapsed\">\r\n        <div class=\"session-indicator\" [class.selected]=\"isSelected(session)\">\r\n          💬\r\n        </div>\r\n      </div>\r\n    </div>\r\n  </div>\r\n\r\n  <!-- Refresh Button (Bottom) -->\r\n  <!-- <div class=\"sidebar-footer\" *ngIf=\"!isCollapsed && !loading\">\r\n    <button class=\"refresh-btn\" (click)=\"refreshSessions()\" title=\"Refresh sessions\">\r\n      <span class=\"refresh-icon\">↻</span>\r\n      <span>Refresh</span>\r\n    </button>\r\n  </div> -->\r\n</div>","import { Injectable } from '@angular/core';\r\nimport { HttpClient, HttpErrorResponse } from '@angular/common/http';\r\nimport { Observable, throwError } from 'rxjs';\r\nimport { catchError } from 'rxjs/operators';\r\nimport { DashboardResponse } from '../models/dashboard.model';\r\nimport { EnvironmentService } from './environment.service';\r\n\r\n@Injectable({\r\n  providedIn: 'root'\r\n})\r\nexport class AnalyticsService {\r\n  private apiUrl = '';\r\n\r\n  constructor(private http: HttpClient, private environmentService: EnvironmentService) {\r\n    this.apiUrl = this.environmentService.backendUrl + '/api';\r\n  }\r\n\r\n  /**\r\n   * Generate dashboard visualization from analytics result\r\n   */\r\n  generateDashboard(analyticsResult: any): Observable<DashboardResponse> {\r\n    return this.http.post<DashboardResponse>(`${this.apiUrl}/visualize`, analyticsResult)\r\n      .pipe(\r\n        catchError(this.handleError)\r\n      );\r\n  }\r\n\r\n  /**\r\n   * Test the visualization with sample data\r\n   */\r\n  testVisualization(): Observable<DashboardResponse> {\r\n    return this.http.get<DashboardResponse>(`${this.apiUrl}/test-visualization`)\r\n      .pipe(\r\n        catchError(this.handleError)\r\n      );\r\n  }\r\n\r\n  /**\r\n   * Process user chat query\r\n   */\r\n  chatQuery(question: string): Observable<DashboardResponse> {\r\n    return this.http.post<DashboardResponse>(`${this.apiUrl}/chat`, { question })\r\n      .pipe(\r\n        catchError(this.handleError)\r\n      );\r\n  }\r\n\r\n  /**\r\n   * Health check\r\n   */\r\n  healthCheck(): Observable<any> {\r\n    return this.http.get(`${this.apiUrl}/health`)\r\n      .pipe(\r\n        catchError(this.handleError)\r\n      );\r\n  }\r\n\r\n  private handleError(error: HttpErrorResponse) {\r\n    let errorMessage = 'An unknown error occurred';\r\n    \r\n    if (error.error instanceof ErrorEvent) {\r\n      // Client-side error\r\n      errorMessage = `Error: ${error.error.message}`;\r\n    } else {\r\n      // Server-side error\r\n      errorMessage = `Error Code: ${error.status}\\nMessage: ${error.message}`;\r\n      if (error.error && error.error.error) {\r\n        errorMessage = error.error.error;\r\n      }\r\n    }\r\n    \r\n    console.error('Analytics Service Error:', errorMessage);\r\n    return throwError(() => new Error(errorMessage));\r\n  }\r\n}","import { Component, OnInit, OnDestroy, AfterViewInit, ViewChild, ElementRef, HostListener, Input, Output, EventEmitter, ChangeDetectorRef } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { MatDialog } from '@angular/material/dialog';\r\nimport { Router } from '@angular/router';\r\nimport { Subscription } from 'rxjs';\r\n\r\nimport { AnalyticsService } from '../../services/analytics.service';\r\nimport { StreamingAnalyticsService, StepProgress, PhaseUpdate } from '../../services/streaming-analytics.service';\r\nimport { ChatHistoryService } from '../../services/chat-history.service';\r\nimport { EnvironmentService } from '../../services/environment.service';\r\nimport { DashboardData } from '../../models/dashboard.model';\r\nimport { ChatMessage, ChatConversation, MessageType, ChatSession } from '../../models/chat.model';\r\n\r\n// Import all the new components\r\nimport { ChatMessagesContainerComponent } from '../chat-messages-container/chat-messages-container.component';\r\nimport { SuggestedQuestionsComponent } from '../suggested-questions/suggested-questions.component';\r\nimport { ChatInputComponent } from '../chat-input/chat-input.component';\r\nimport { SessionSidebarComponent } from '../session-sidebar/session-sidebar.component';\r\nimport { jwtDecode } from 'jwt-decode';\r\nimport { TokenPayload } from '../../shared/interface/home';\r\nimport { DimensionSelection } from '../dimension-clarification/dimension-clarification.component';\r\n\r\n@Component({\r\n  selector: 'app-home',\r\n  standalone: true,\r\n  imports: [\r\n    CommonModule,\r\n    FormsModule,\r\n    ChatMessagesContainerComponent,\r\n    SuggestedQuestionsComponent,\r\n    SessionSidebarComponent\r\n  ],\r\n  templateUrl: './home.component.html',\r\n  styleUrl: './home.component.scss'\r\n})\r\nexport class HomeComponent implements OnInit, OnDestroy, AfterViewInit {\r\n  @ViewChild('messagesContainer') private messagesContainer!: ChatMessagesContainerComponent;\r\n  @ViewChild('chatInput') private chatInput!: ElementRef<HTMLInputElement>;\r\n\r\n  // Output event to close the Datachat AI modal\r\n  @Output() closeDataChatEvent = new EventEmitter<void>();\r\n\r\n  // Dashboard and loading state\r\n  dashboardData: DashboardData | null = null;\r\n  loading = false;\r\n  chatLoading = false;\r\n  error: string | null = null;\r\n  userQuestion = '';\r\n  currentQuestion = '';\r\n\r\n  // Chat properties\r\n  chatMessages: ChatMessage[] = [];\r\n  currentConversation: ChatConversation | null = null;\r\n\r\n  // Session management properties\r\n  currentSession: ChatSession | null = null;\r\n  sessions: ChatSession[] = [];\r\n  sidebarCollapsed = false;\r\n  showMobileSidebar = false;\r\n  currentUserId: string = ''; // TODO: Replace with actual user authentication\r\n\r\n  // Suggested questions from latest query response\r\n  suggestedQuestions: string[] = [];\r\n\r\n  // Streaming properties\r\n  streamingEnabled = true; // Enable streaming by default\r\n  isStreamingActive = false;\r\n  streamingCompleted = false;\r\n  currentPhase: PhaseUpdate | null = null;\r\n  streamingSteps: StepProgress[] = []; // Keep for compatibility, but will be per-message\r\n  isConnected = false;\r\n\r\n  // Cancellation properties\r\n  canCancelExecution = false;\r\n  isExecutionRunning = false;\r\n  currentSessionIdForCancellation: string | null = null;\r\n\r\n  // Current processing message reference\r\n  private currentProcessingMessage: ChatMessage | null = null;\r\n\r\n  // Animation settings\r\n  showSettings = false;\r\n  showTest = false;\r\n\r\n\r\n  constructor(\r\n    private analyticsService: AnalyticsService,\r\n    private dialog: MatDialog,\r\n    private streamingService: StreamingAnalyticsService,\r\n    private chatHistoryService: ChatHistoryService,\r\n    private cdr: ChangeDetectorRef,\r\n    private environmentService: EnvironmentService,\r\n    private router: Router\r\n  ) {}\r\n\r\n  ngOnInit() {\r\n\r\n    this.currentUserId = this.environmentService.userId;\r\n\r\n    // Initialize session management\r\n    this.initializeSessionManagement();\r\n    \r\n    // Initialize conversation\r\n    this.initializeConversation();\r\n    \r\n    // Initialize streaming if enabled\r\n    if (this.streamingEnabled) {\r\n      this.initializeStreaming();\r\n    }\r\n\r\n  }\r\n\r\n  ngOnDestroy() {\r\n    // Cleanup handled by services\r\n  }\r\n\r\n  ngAfterViewInit() {\r\n    // Focus the input when component loads\r\n    this.focusInput();\r\n  }\r\n\r\n  focusInput(): void {\r\n    if (this.chatInput?.nativeElement) {\r\n      setTimeout(() => {\r\n        this.chatInput.nativeElement.focus();\r\n      }, 100);\r\n    }\r\n  }\r\n\r\n  private initializeConversation() {\r\n    this.currentConversation = {\r\n      id: this.generateId(),\r\n      messages: [],\r\n      createdAt: new Date(),\r\n      lastUpdatedAt: new Date()\r\n    };\r\n    this.chatMessages = [];\r\n  }\r\n\r\n  private generateId(): string {\r\n    return Math.random().toString(36).substr(2, 9);\r\n  }\r\n\r\n  private updateStepInGlobalArray(step: StepProgress): void {\r\n    // Update or add step to the global list with proper merging (for compatibility)\r\n    const existingIndex = this.streamingSteps.findIndex(s => s.step_id === step.step_id);\r\n    if (existingIndex >= 0) {\r\n      // Merge with existing step to preserve data\r\n      this.streamingSteps[existingIndex] = {\r\n        ...this.streamingSteps[existingIndex],\r\n        ...step,\r\n        step_description: step.step_description || this.streamingSteps[existingIndex].step_description || `Step ${step.step_id + 1}`,\r\n        timestamp: step.timestamp || Date.now()\r\n      };\r\n    } else {\r\n      // Add new step with fallback description\r\n      const newStep = {\r\n        ...step,\r\n        step_description: step.step_description || `Step ${step.step_id + 1}`,\r\n        timestamp: step.timestamp || Date.now()\r\n      };\r\n      this.streamingSteps.push(newStep);\r\n    }\r\n    \r\n    // Sort by step_id to maintain order\r\n    this.streamingSteps.sort((a, b) => a.step_id - b.step_id);\r\n  }\r\n\r\n  private updateStepInCurrentMessage(step: StepProgress): void {\r\n    if (!this.currentProcessingMessage) {\r\n      return;\r\n    }\r\n\r\n    if (!this.currentProcessingMessage.stepProgress) {\r\n      this.currentProcessingMessage.stepProgress = [];\r\n    }\r\n\r\n    // Update or add step to the current message\r\n    const existingIndex = this.currentProcessingMessage.stepProgress.findIndex(s => s.step_id === step.step_id);\r\n    if (existingIndex >= 0) {\r\n      // Merge with existing step\r\n      this.currentProcessingMessage.stepProgress[existingIndex] = {\r\n        ...this.currentProcessingMessage.stepProgress[existingIndex],\r\n        ...step,\r\n        step_description: step.step_description || this.currentProcessingMessage.stepProgress[existingIndex].step_description || `Step ${step.step_id + 1}`,\r\n        timestamp: step.timestamp || Date.now()\r\n      };\r\n    } else {\r\n      // Add new step\r\n      const newStep = {\r\n        ...step,\r\n        step_description: step.step_description || `Step ${step.step_id + 1}`,\r\n        timestamp: step.timestamp || Date.now()\r\n      };\r\n      this.currentProcessingMessage.stepProgress.push(newStep);\r\n    }\r\n    \r\n    // Sort by step_id to maintain order\r\n    this.currentProcessingMessage.stepProgress.sort((a, b) => a.step_id - b.step_id);\r\n    \r\n    console.log(`Updated step ${step.step_id} in message ${this.currentProcessingMessage.id}`);\r\n  }\r\n\r\n  private initializeSessionManagement(): void {\r\n    console.log('🔍 DEBUG: Initializing session management...');\r\n    \r\n    // Subscribe to session management observables\r\n    this.chatHistoryService.currentSession$.subscribe(session => {\r\n      console.log('🔍 DEBUG: Current session changed from', this.currentSession?.id, 'to', session?.id);\r\n      this.currentSession = session;\r\n      \r\n      if (session) {\r\n        console.log('✅ Session set as current:', {\r\n          id: session.id,\r\n          name: session.session_name,\r\n          messageCount: session.message_count\r\n        });\r\n      } else {\r\n        console.log('❌ Current session cleared');\r\n      }\r\n    });\r\n\r\n    this.chatHistoryService.sessions$.subscribe(sessions => {\r\n      console.log('🔍 DEBUG: Sessions list updated. Count:', sessions.length);\r\n      this.sessions = sessions;\r\n      \r\n      if (sessions.length > 0) {\r\n        console.log('📋 Available sessions:', sessions.map(s => ({ id: s.id, name: s.session_name })));\r\n      }\r\n    });\r\n\r\n    this.chatHistoryService.sessionMessages$.subscribe(messages => {\r\n      console.log('🔍 DEBUG: Session messages updated. Count:', messages.length);\r\n      console.log('📋 Messages for current session:', messages.map(m => ({ \r\n        id: m.id, \r\n        type: m.type, \r\n        content: m.content.substring(0, 50) + '...' \r\n      })));\r\n      \r\n      // Process messages to populate step progress from execution_metadata and dashboard_data\r\n      const processedMessages = messages.map(message => {\r\n        // Only process execution_metadata if stepProgress is not already set by ChatHistoryService\r\n        // (ChatHistoryService now extracts timeline from dashboard_data.step_results)\r\n        if (message.execution_metadata && !message.stepProgress) {\r\n          // Extract step progress from execution_metadata (legacy/fallback)\r\n          if (message.execution_metadata.step_progress) {\r\n            message.stepProgress = message.execution_metadata.step_progress.map((step: any) => ({\r\n              step_id: step.step_id,\r\n              step_name: step.step_name,\r\n              step_description: step.step_description,\r\n              status: step.status,\r\n              timestamp: step.timestamp,\r\n              error_message: step.error_message\r\n            }));\r\n          }\r\n          \r\n          // Set execution completed status for execution_metadata derived timelines\r\n          if (message.stepProgress && message.stepProgress.length > 0) {\r\n            const allCompleted = message.stepProgress.every(step => step.status === 'completed' || step.status === 'failed');\r\n            message.executionCompleted = allCompleted;\r\n          }\r\n        }\r\n        \r\n        // Extract phase updates from execution_metadata (both dashboard_data and execution_metadata sources)\r\n        if (message.execution_metadata && message.execution_metadata.phase_updates) {\r\n          message.phaseUpdates = message.execution_metadata.phase_updates.map((phase: any) => ({\r\n            phase: phase.phase,\r\n            message: phase.message,\r\n            timestamp: phase.timestamp,\r\n            status: phase.status\r\n          }));\r\n        }\r\n        \r\n        return message;\r\n      });\r\n      \r\n      this.chatMessages = processedMessages;\r\n\r\n      // Extract suggested questions from the most recent assistant message with dashboard_data\r\n      this.extractSuggestedQuestionsFromMessages(processedMessages);\r\n      \r\n      // Update conversation for backward compatibility\r\n      if (this.currentConversation) {\r\n        this.currentConversation.messages = processedMessages;\r\n        this.currentConversation.lastUpdatedAt = new Date();\r\n      }\r\n\r\n      // Trigger scroll to bottom after messages update\r\n      if (this.messagesContainer) {\r\n        setTimeout(() => this.messagesContainer.requestScroll(), 100);\r\n      }\r\n    });\r\n\r\n    // Load user sessions on initialization\r\n    this.loadUserSessions();\r\n    console.log('✅ Session management initialized');\r\n  }\r\n\r\n  private loadUserSessions(): void {\r\n    this.chatHistoryService.getUserSessions(this.currentUserId).subscribe({\r\n      error: (error) => {\r\n        console.error('Failed to load user sessions:', error);\r\n        // Continue without sessions - user can still chat\r\n      }\r\n    });\r\n  }\r\n\r\n  private isValidStep(step: StepProgress): boolean {\r\n    // Validate required fields\r\n    return step && \r\n           typeof step.step_id === 'number' && \r\n           step.step_id >= 0 &&\r\n           typeof step.step_type === 'string' &&\r\n           step.step_type.trim().length > 0 &&\r\n           typeof step.status === 'string' &&\r\n           ['started', 'completed', 'failed'].includes(step.status);\r\n  }\r\n\r\n  private initializeStreaming() {\r\n    // Connect to streaming service\r\n    this.streamingService.connect();\r\n    \r\n    // Subscribe to connection status\r\n    this.streamingService.connectionStatus.subscribe(connected => {\r\n      this.isConnected = connected;\r\n      console.log('Streaming connection status:', connected);\r\n      \r\n      // Show user feedback about connection status\r\n      if (!connected) {\r\n        console.warn('Streaming service disconnected. Only streaming mode is enabled.');\r\n      } else {\r\n        console.log('Streaming service connected and ready.');\r\n      }\r\n    });\r\n    \r\n    // // Subscribe to session events\r\n    this.streamingService.sessionCreated.subscribe(async (event) => {\r\n      console.log('🆕 WebSocket session created:', event.session_id);\r\n      await this.handleWebSocketSessionCreated(event.session_id);\r\n    });\r\n\r\n    // this.streamingService.sessionConnected.subscribe(async (event) => {\r\n    //   console.log('🔗 WebSocket session connected:', event.session_id);\r\n    //   await this.handleWebSocketSessionConnected(event.session_id);\r\n    // });\r\n\r\n    // Subscribe to streaming events\r\n    this.streamingService.queryStarted.subscribe(data => {\r\n      console.log('Query started:', data);\r\n      this.isStreamingActive = true;\r\n      this.streamingCompleted = false;\r\n      // Clear previous streaming state completely\r\n      this.streamingSteps = [];\r\n      this.currentPhase = null;\r\n      this.error = null;\r\n\r\n      // Enable cancellation\r\n      this.isExecutionRunning = true;\r\n      this.canCancelExecution = true;\r\n      console.log('🚀 Execution started, enabling cancel button');\r\n\r\n      // Update session ID for cancellation (important for new sessions where currentSession is null)\r\n      if (data.session_id) {\r\n        this.currentSessionIdForCancellation = data.session_id;\r\n        console.log('🎯 Updated session ID for cancellation:', data.session_id);\r\n      }\r\n\r\n      // Set the current processing message (should be the last assistant message that's loading)\r\n      this.currentProcessingMessage = this.chatMessages.find(m => m.type === MessageType.ASSISTANT && m.isLoading) || null;\r\n      if (this.currentProcessingMessage) {\r\n        // Initialize step arrays for this message\r\n        this.currentProcessingMessage.stepProgress = [];\r\n        this.currentProcessingMessage.phaseUpdates = [];\r\n        this.currentProcessingMessage.executionCompleted = false;\r\n        // Initialize streaming debug logs\r\n        this.currentProcessingMessage.streamingDebugLogs = {\r\n          steps: [],\r\n          errors: []\r\n        };\r\n        console.log('Set current processing message:', this.currentProcessingMessage.id);\r\n      }\r\n      \r\n      console.log('Streaming state reset for new query');\r\n    });\r\n\r\n    this.streamingService.queryRewritten.subscribe(data => {\r\n      console.log('Query rewritten:', data);\r\n      // Backend handles persistence and context building\r\n      // No UI display needed - users don't need to see rewritten queries\r\n    });\r\n    \r\n    this.streamingService.phaseUpdates.subscribe(phase => {\r\n      console.log('Phase update:', phase);\r\n      this.currentPhase = phase;\r\n      \r\n      // Store phase update in current processing message\r\n      if (this.currentProcessingMessage && phase) {\r\n        if (!this.currentProcessingMessage.phaseUpdates) {\r\n          this.currentProcessingMessage.phaseUpdates = [];\r\n        }\r\n        this.currentProcessingMessage.phaseUpdates.push(phase);\r\n      }\r\n    });\r\n    \r\n    this.streamingService.stepProgress.subscribe(step => {\r\n      console.log('Step progress:', step);\r\n      \r\n      // Validate step data before processing\r\n      if (!this.isValidStep(step)) {\r\n        console.warn('Invalid step data received:', step);\r\n        return;\r\n      }\r\n      \r\n      // Store in both global array (for compatibility) and current message\r\n      this.updateStepInGlobalArray(step);\r\n      this.updateStepInCurrentMessage(step);\r\n    });\r\n    \r\n    this.streamingService.finalResult.subscribe(async result => {\r\n      console.log('Final result:', result);\r\n      this.isStreamingActive = false;\r\n      this.streamingCompleted = true;\r\n      this.currentPhase = null;\r\n\r\n      // Disable cancellation\r\n      this.isExecutionRunning = false;\r\n      this.canCancelExecution = false;\r\n      console.log('🏆 Execution completed, disabling cancel button');\r\n\r\n      // Mark current processing message as completed\r\n      if (this.currentProcessingMessage) {\r\n        this.currentProcessingMessage.executionCompleted = true;\r\n        console.log('Marked message execution as completed:', this.currentProcessingMessage.id);\r\n      }\r\n      \r\n      // Find the loading assistant message and update it\r\n      const loadingMessage = this.chatMessages.find(m => m.type === MessageType.ASSISTANT && m.isLoading);\r\n      if (loadingMessage) {\r\n        if (result.success && result.dashboard_data) {\r\n          await this.updateAssistantMessage(loadingMessage.id, 'Here are the analytics results for your query:', result.dashboard_data);\r\n        } else {\r\n          await this.updateAssistantMessageError(loadingMessage.id, result.message || 'Failed to process your question');\r\n        }\r\n      }\r\n    });\r\n    \r\n    this.streamingService.errors.subscribe(async error => {\r\n      console.error('Streaming error:', error);\r\n      this.isStreamingActive = false;\r\n      this.streamingCompleted = true;\r\n      this.currentPhase = null;\r\n\r\n      // Update cancellation state\r\n      this.isExecutionRunning = false;\r\n      this.canCancelExecution = false;\r\n\r\n      // Find the loading assistant message and update it with error\r\n      const loadingMessage = this.chatMessages.find(m => m.type === MessageType.ASSISTANT && m.isLoading);\r\n      if (loadingMessage) {\r\n        await this.updateAssistantMessageError(loadingMessage.id, error);\r\n      }\r\n    });\r\n\r\n    this.streamingService.queryCancelled.subscribe(async data => {\r\n      console.log('🛑 Query cancelled:', data);\r\n      this.isStreamingActive = false;\r\n      this.streamingCompleted = true;\r\n      this.currentPhase = null;\r\n\r\n      // Update cancellation state\r\n      this.isExecutionRunning = false;\r\n      this.canCancelExecution = false;\r\n\r\n      // Mark current processing message as completed with cancellation\r\n      if (this.currentProcessingMessage) {\r\n        this.currentProcessingMessage.executionCompleted = true;\r\n        this.currentProcessingMessage.isCancelled = true;\r\n        console.log('Marked message execution as cancelled:', this.currentProcessingMessage.id);\r\n      }\r\n\r\n      // Find the loading assistant message and update it\r\n      const loadingMessage = this.chatMessages.find(m => m.type === MessageType.ASSISTANT && m.isLoading);\r\n      if (loadingMessage) {\r\n        // Check if this was stopped due to negative feedback\r\n        let cancellationMessage: string;\r\n        if (loadingMessage.stoppedByFeedback) {\r\n          cancellationMessage = `Execution stopped due to negative feedback. ${data.completed_steps ? `(${data.completed_steps}/${data.total_steps} steps completed)` : ''}`.trim();\r\n        } else {\r\n          cancellationMessage = `Query execution was stopped. ${data.message || ''} ${data.completed_steps ? `(${data.completed_steps}/${data.total_steps} steps completed)` : ''}`.trim();\r\n        }\r\n        await this.updateAssistantMessageError(loadingMessage.id, cancellationMessage);\r\n      }\r\n    });\r\n\r\n    // Subscribe to debug events to populate streamingDebugLogs\r\n    this.streamingService.debugUpdates.subscribe(debugData => {\r\n      if (this.currentProcessingMessage) {\r\n        if (!this.currentProcessingMessage.streamingDebugLogs) {\r\n          this.currentProcessingMessage.streamingDebugLogs = {\r\n            steps: [],\r\n            errors: []\r\n          };\r\n        }\r\n        \r\n        // Handle different debug event types - using immutable updates\r\n        if (debugData.original_question && debugData.rewritten_question) {\r\n          // Query rewriting debug - create new object reference\r\n          this.currentProcessingMessage.streamingDebugLogs = {\r\n            ...this.currentProcessingMessage.streamingDebugLogs,\r\n            query_rewriting: {\r\n              original_question: debugData.original_question,\r\n              rewritten_question: debugData.rewritten_question,\r\n              timestamp: debugData.timestamp || Date.now()\r\n            }\r\n          };\r\n        } else if (debugData.execution_plan) {\r\n          // Execution plan debug - create new object reference\r\n          this.currentProcessingMessage.streamingDebugLogs = {\r\n            ...this.currentProcessingMessage.streamingDebugLogs,\r\n            execution_plan: debugData.execution_plan\r\n          };\r\n        }\r\n      }\r\n    });\r\n\r\n    this.streamingService.stepDebugInfo.subscribe(stepDebugData => {\r\n      // Special handling for EVALUATE debug events\r\n      if (this.currentProcessingMessage && this.currentProcessingMessage.streamingDebugLogs) {\r\n\r\n        // Add or update step debug information\r\n        const existingStepIndex = this.currentProcessingMessage.streamingDebugLogs.steps.findIndex(\r\n          s => s.step_id === stepDebugData.step_id\r\n        );\r\n\r\n        if (existingStepIndex >= 0) {\r\n          // Smart merge existing step data - create new array with updated step\r\n          const existingStep = this.currentProcessingMessage.streamingDebugLogs.steps[existingStepIndex];\r\n          const mergedStep = this.mergeStepDebugData(existingStep, stepDebugData);\r\n          \r\n          // Create new steps array with merged step - immutable update\r\n          const newSteps = [...this.currentProcessingMessage.streamingDebugLogs.steps];\r\n          newSteps[existingStepIndex] = mergedStep;\r\n          this.currentProcessingMessage.streamingDebugLogs = {\r\n            ...this.currentProcessingMessage.streamingDebugLogs,\r\n            steps: newSteps\r\n          };\r\n          \r\n        } else {\r\n          // Add new step - create new array with added step\r\n          console.log('🔍 Adding new step to debug logs');\r\n          this.currentProcessingMessage.streamingDebugLogs = {\r\n            ...this.currentProcessingMessage.streamingDebugLogs,\r\n            steps: [...this.currentProcessingMessage.streamingDebugLogs.steps, stepDebugData]\r\n          };\r\n          console.log('🔍 Steps count after adding:', this.currentProcessingMessage.streamingDebugLogs.steps.length);\r\n        }\r\n        \r\n        console.log('🔍 Final streamingDebugLogs.steps:', this.currentProcessingMessage.streamingDebugLogs.steps);\r\n        \r\n        // Trigger change detection to update UI\r\n        this.cdr.detectChanges();\r\n      } else {\r\n        console.warn('🔍 No current processing message or streamingDebugLogs available');\r\n        if (stepDebugData.step_type === 'EVALUATE') {\r\n          console.error('🔍 EVALUATE debug event received but no processing message available!');\r\n        }\r\n      }\r\n    });\r\n\r\n    this.streamingService.errorUpdates.subscribe(errorData => {\r\n      console.log('🔍 Error debug info received:', errorData);\r\n      if (this.currentProcessingMessage && this.currentProcessingMessage.streamingDebugLogs) {\r\n        // Create new error summary if it doesn't exist\r\n        const currentErrorSummary = this.currentProcessingMessage.streamingDebugLogs.error_summary || {\r\n          total_errors: 0,\r\n          errors: 0,\r\n          warnings: 0,\r\n          critical: 0\r\n        };\r\n\r\n        // Create new error summary with updated counts\r\n        const updatedErrorSummary = { ...currentErrorSummary };\r\n        updatedErrorSummary.total_errors++;\r\n        if (errorData.severity === 'high') {\r\n          updatedErrorSummary.errors++;\r\n        } else if (errorData.severity === 'medium') {\r\n          updatedErrorSummary.warnings++;\r\n        } else if (errorData.severity === 'critical') {\r\n          updatedErrorSummary.critical++;\r\n        }\r\n\r\n        // Add error to debug logs - immutable update\r\n        this.currentProcessingMessage.streamingDebugLogs = {\r\n          ...this.currentProcessingMessage.streamingDebugLogs,\r\n          errors: [...this.currentProcessingMessage.streamingDebugLogs.errors, errorData],\r\n          error_summary: updatedErrorSummary\r\n        };\r\n      }\r\n    });\r\n\r\n    // Subscribe to clarification requests\r\n    this.streamingService.clarificationRequest.subscribe(data => {\r\n      console.log('🎯 HOME COMPONENT: Clarification request received!');\r\n      console.log('📋 HOME COMPONENT: Clarification data:', data);\r\n      console.log('📊 HOME COMPONENT: Current chat messages:', this.chatMessages.length);\r\n\r\n      // Find the loading assistant message and update it with clarification request\r\n      console.log('🔍 HOME COMPONENT: Looking for loading message...');\r\n      const loadingMessage = this.chatMessages.find(m => m.type === MessageType.ASSISTANT && m.isLoading);\r\n      console.log('📝 HOME COMPONENT: Loading message found:', !!loadingMessage);\r\n\r\n      if (loadingMessage) {\r\n        console.log('✅ HOME COMPONENT: Updating loading message with clarification request');\r\n        loadingMessage.isLoading = false;\r\n        loadingMessage.needsClarification = true;\r\n        loadingMessage.clarificationRequest = {\r\n          clarification_type: data.clarification_type || 'dimension_selection',\r\n          message: data.message || 'Please select from the available options',\r\n          available_options: data.available_options || [],\r\n          suggested_rephrase: data.suggested_rephrase,\r\n          value_count: data.value_count,\r\n          dimension_matched: data.dimension_matched,\r\n          sample_values: data.sample_values || [],\r\n          user_question: data.user_question,\r\n          metric_focus: data.metric_focus,\r\n          user_message_id: data.user_message_id,  // Store the original user message ID\r\n          filter_value: data.filter_value,  // Ambiguous filter value for programmatic rewriting (e.g., \"NHIC Clinics\")\r\n          filter_type: data.filter_type  // Type of filter: 'included' or 'excluded'\r\n        };\r\n\r\n        console.log('🎯 HOME COMPONENT: Updated message with clarification request!');\r\n        console.log('🔧 HOME COMPONENT: Message state:', {\r\n          isLoading: loadingMessage.isLoading,\r\n          needsClarification: loadingMessage.needsClarification,\r\n          hasRequest: !!loadingMessage.clarificationRequest\r\n        });\r\n\r\n        // Trigger scroll to show the clarification UI\r\n        if (this.messagesContainer) {\r\n          console.log('📜 HOME COMPONENT: Triggering scroll to show clarification UI');\r\n          setTimeout(() => this.messagesContainer.requestScroll(), 100);\r\n        }\r\n      } else {\r\n        console.warn('⚠️ HOME COMPONENT: No loading message found for clarification request');\r\n        console.log('📊 HOME COMPONENT: Current messages state:');\r\n        this.chatMessages.forEach((msg, i) => {\r\n          console.log(`  ${i}: ${msg.type} - loading: ${msg.isLoading}, hasError: ${msg.hasError}`);\r\n        });\r\n      }\r\n    });\r\n  }\r\n\r\n  async submitQuestion() {\r\n    if (!this.userQuestion.trim()) {\r\n      return;\r\n    }\r\n\r\n    const question = this.userQuestion.trim();\r\n    this.userQuestion = ''; // Clear input immediately\r\n    this.focusInput(); // Keep input focused after submission\r\n\r\n\r\n    try {\r\n      // Add user message to chat (async)\r\n      await this.addUserMessage(question);\r\n\r\n      // Add loading assistant message (async)\r\n      const loadingMessage = await this.addAssistantMessage('', true);\r\n\r\n      // Track loading message ID for WebSocket response mapping\r\n      this.streamingService.setCurrentLoadingMessageId(loadingMessage.id);\r\n\r\n      this.currentQuestion = question;\r\n      this.error = null;\r\n\r\n      console.log('Submitting question:', this.currentQuestion);\r\n\r\n      if (this.streamingEnabled && this.isConnected) {\r\n        // Use streaming approach\r\n        console.log('Using streaming service');\r\n        // Track session for cancellation\r\n        this.currentSessionIdForCancellation = this.currentSession?.id || null;\r\n        this.streamingService.submitStreamingQuery(\r\n          this.currentQuestion,\r\n          this.currentSession?.id,\r\n          this.currentUserId\r\n        );\r\n      } else {\r\n        // Streaming only - show error if not connected\r\n        console.error('Streaming service not connected');\r\n        await this.updateAssistantMessageError(\r\n          loadingMessage.id,\r\n          'Connection to streaming service failed. Please refresh the page and try again.'\r\n        );\r\n      }\r\n    } catch (error) {\r\n      console.error('Error in submitQuestion:', error);\r\n      this.error = 'Failed to process your question. Please try again.';\r\n    }\r\n  }\r\n\r\n  cancelExecution(): void {\r\n    if (this.canCancelExecution && this.currentSessionIdForCancellation) {\r\n      console.log('🛑 User requesting cancellation for session:', this.currentSessionIdForCancellation);\r\n      this.streamingService.cancelQuery(this.currentSessionIdForCancellation);\r\n      this.canCancelExecution = false; // Disable button immediately to prevent multiple cancel requests\r\n    }\r\n  }\r\n\r\n  // Chat message management methods\r\n  private async addUserMessage(content: string): Promise<ChatMessage> {\r\n    console.log('💬 MESSAGE LIFECYCLE: addUserMessage START - UI-only mode');\r\n    console.log('💬 MESSAGE LIFECYCLE: Content length:', content.length);\r\n    \r\n    // Create UI-only message (backend will create database message via WebSocket)\r\n    const message: ChatMessage = {\r\n      id: this.generateId(),\r\n      type: MessageType.USER,\r\n      content,\r\n      timestamp: new Date()\r\n    };\r\n    \r\n    this.chatMessages.push(message);\r\n    this.requestScroll();\r\n    \r\n    console.log('💬 MESSAGE LIFECYCLE: ✅ UI message created with ID:', message.id);\r\n    return message;\r\n  }\r\n\r\n  private async addAssistantMessage(content: string, isLoading: boolean = false, dashboardData?: DashboardData): Promise<ChatMessage> {\r\n    console.log('💬 MESSAGE LIFECYCLE: addAssistantMessage START - UI-only mode');\r\n    console.log('💬 MESSAGE LIFECYCLE: isLoading:', isLoading);\r\n    \r\n    // Create UI-only message (backend will create database message via WebSocket)\r\n    const message: ChatMessage = {\r\n      id: this.generateId(),\r\n      type: MessageType.ASSISTANT,\r\n      content,\r\n      timestamp: new Date(),\r\n      isLoading,\r\n      dashboardData: dashboardData || null\r\n    };\r\n    \r\n    this.chatMessages.push(message);\r\n    this.requestScroll();\r\n    \r\n    console.log('💬 MESSAGE LIFECYCLE: ✅ UI assistant message created with ID:', message.id);\r\n    return message;\r\n  }\r\n\r\n  private async addRewrittenQueryMessage(originalQuery: string, rewrittenQuery: string): Promise<void> {\r\n    console.log('💬 MESSAGE LIFECYCLE: addRewrittenQueryMessage START');\r\n    console.log('💬 MESSAGE LIFECYCLE: Original:', originalQuery);\r\n    console.log('💬 MESSAGE LIFECYCLE: Rewritten:', rewrittenQuery);\r\n    \r\n    // Create a system message to show the rewritten query\r\n    const message: ChatMessage = {\r\n      id: this.generateId(),\r\n      type: MessageType.SYSTEM, // Use SYSTEM type or create new type for rewritten queries\r\n      content: `I understood: \"${rewrittenQuery}\"`,\r\n      timestamp: new Date(),\r\n      isRewrittenQuery: true,\r\n      originalQuery: originalQuery,\r\n      rewrittenQuery: rewrittenQuery\r\n    };\r\n    \r\n    this.chatMessages.push(message);\r\n    this.requestScroll();\r\n    \r\n    console.log('💬 MESSAGE LIFECYCLE: ✅ Rewritten query message added with ID:', message.id);\r\n  }\r\n\r\n  private async updateAssistantMessage(messageId: string, content: string, dashboardData?: DashboardData): Promise<void> {\r\n    console.log('💬 MESSAGE LIFECYCLE: updateAssistantMessage START');\r\n    console.log('💬 MESSAGE LIFECYCLE: messageId:', messageId);\r\n    console.log('💬 MESSAGE LIFECYCLE: Current session:', this.currentSession?.id);\r\n    console.log('💬 MESSAGE LIFECYCLE: Content length:', content.length);\r\n    console.log('💬 MESSAGE LIFECYCLE: Has dashboard data:', !!dashboardData);\r\n\r\n    const messageIndex = this.chatMessages.findIndex(m => m.id === messageId);\r\n    console.log('💬 MESSAGE LIFECYCLE: Message found in local array at index:', messageIndex);\r\n    \r\n    if (messageIndex >= 0) {\r\n      // First update the local message for immediate UI response\r\n      this.chatMessages[messageIndex] = {\r\n        ...this.chatMessages[messageIndex],\r\n        content,\r\n        isLoading: false,\r\n        dashboardData: dashboardData || null,\r\n        hasError: false,\r\n        errorMessage: undefined\r\n      };\r\n      \r\n      // Extract suggested questions from dashboard data\r\n      if (dashboardData && dashboardData.suggested_questions) {\r\n        this.suggestedQuestions = dashboardData.suggested_questions;\r\n      }\r\n      \r\n      // Update in conversation as well\r\n      const conversationMessageIndex = this.currentConversation!.messages.findIndex(m => m.id === messageId);\r\n      if (conversationMessageIndex >= 0) {\r\n        this.currentConversation!.messages[conversationMessageIndex] = this.chatMessages[messageIndex];\r\n      }\r\n      \r\n      this.requestScroll();\r\n\r\n      // COMMENTED OUT: Redundant API call - Backend WebSocket handler already updates the message with final results\r\n      // The backend updates the message with the same content, dashboard_data, has_error, and error_message\r\n      // This frontend API call is unnecessary and creates duplicate database updates\r\n      /*\r\n      if (this.currentSession) {\r\n        console.log('💬 MESSAGE LIFECYCLE: Saving assistant response to backend for session:', this.currentSession.id);\r\n        try {\r\n          const updateRequest = {\r\n            content: content,\r\n            dashboard_data: dashboardData,\r\n            has_error: false,\r\n            error_message: undefined\r\n          };\r\n\r\n          console.log('💬 MESSAGE LIFECYCLE: Calling ChatHistoryService.updateMessage with:', updateRequest);\r\n          // Use the ChatHistoryService to update the message in the backend\r\n          const { firstValueFrom } = await import('rxjs');\r\n          await firstValueFrom(this.chatHistoryService.updateMessage(messageId, updateRequest));\r\n          \r\n          console.log('💬 MESSAGE LIFECYCLE: ✅ Assistant message saved to backend successfully');\r\n        } catch (error) {\r\n          console.error('💬 MESSAGE LIFECYCLE: ❌ Failed to save assistant message to backend:', error);\r\n          // Don't show error to user as the message is already displayed\r\n          // This is a background operation that failed\r\n        }\r\n      } else {\r\n        console.warn('💬 MESSAGE LIFECYCLE: ⚠️ No current session - assistant message not saved to backend');\r\n      }\r\n      */\r\n    } else {\r\n      console.error('💬 MESSAGE LIFECYCLE: ❌ Message not found for update:', messageId);\r\n    }\r\n    \r\n    console.log('💬 MESSAGE LIFECYCLE: updateAssistantMessage COMPLETED for messageId:', messageId);\r\n  }\r\n\r\n  private async updateAssistantMessageError(messageId: string, errorMessage: string): Promise<void> {\r\n    console.log('💬 MESSAGE LIFECYCLE: updateAssistantMessageError START');\r\n    console.log('💬 MESSAGE LIFECYCLE: messageId:', messageId);\r\n    console.log('💬 MESSAGE LIFECYCLE: Current session:', this.currentSession?.id);\r\n    console.log('💬 MESSAGE LIFECYCLE: Error message:', errorMessage);\r\n\r\n    const messageIndex = this.chatMessages.findIndex(m => m.id === messageId);\r\n    console.log('💬 MESSAGE LIFECYCLE: Message found in local array at index:', messageIndex);\r\n    \r\n    if (messageIndex >= 0) {\r\n      // First update the local message for immediate UI response\r\n      this.chatMessages[messageIndex] = {\r\n        ...this.chatMessages[messageIndex],\r\n        isLoading: false,\r\n        hasError: true,\r\n        errorMessage\r\n      };\r\n      \r\n      // Update in conversation as well\r\n      const conversationMessageIndex = this.currentConversation!.messages.findIndex(m => m.id === messageId);\r\n      if (conversationMessageIndex >= 0) {\r\n        this.currentConversation!.messages[conversationMessageIndex] = this.chatMessages[messageIndex];\r\n      }\r\n      \r\n      this.requestScroll();\r\n\r\n      // COMMENTED OUT: Redundant API call - Backend WebSocket handler already updates the message with error state\r\n      // The backend updates the message with the same has_error: true and error_message values\r\n      // This frontend API call is unnecessary and creates duplicate database updates\r\n      /*\r\n      if (this.currentSession) {\r\n        console.log('💬 MESSAGE LIFECYCLE: Saving assistant error to backend for session:', this.currentSession.id);\r\n        try {\r\n          const updateRequest = {\r\n            has_error: true,\r\n            error_message: errorMessage\r\n          };\r\n\r\n          console.log('💬 MESSAGE LIFECYCLE: Calling ChatHistoryService.updateMessage with error:', updateRequest);\r\n          // Use the ChatHistoryService to update the message in the backend\r\n          const { firstValueFrom } = await import('rxjs');\r\n          await firstValueFrom(this.chatHistoryService.updateMessage(messageId, updateRequest));\r\n          \r\n          console.log('💬 MESSAGE LIFECYCLE: ✅ Assistant error saved to backend successfully');\r\n        } catch (error) {\r\n          console.error('💬 MESSAGE LIFECYCLE: ❌ Failed to save assistant error to backend:', error);\r\n          // Don't show additional error to user as the error message is already displayed\r\n        }\r\n      } else {\r\n        console.warn('💬 MESSAGE LIFECYCLE: ⚠️ No current session - assistant error not saved to backend');\r\n      }\r\n      */\r\n    } else {\r\n      console.error('💬 MESSAGE LIFECYCLE: ❌ Message not found for error update:', messageId);\r\n    }\r\n    \r\n    console.log('💬 MESSAGE LIFECYCLE: updateAssistantMessageError COMPLETED for messageId:', messageId);\r\n  }\r\n\r\n  private requestScroll(): void {\r\n    if (this.messagesContainer) {\r\n      this.messagesContainer.requestScroll();\r\n    }\r\n  }\r\n\r\n\r\n  askSuggestedQuestion(question: string): void {\r\n    this.userQuestion = question;\r\n    this.submitQuestion();\r\n  }\r\n\r\n  clearChat(): void {\r\n    this.chatMessages = [];\r\n    this.suggestedQuestions = [];\r\n    this.initializeConversation();\r\n    this.dashboardData = null;\r\n    this.error = null;\r\n  }\r\n\r\n  toggleSettings(): void {\r\n    this.showSettings = !this.showSettings;\r\n    if (this.showSettings) {\r\n      this.showTest = false; // Close test when opening settings\r\n    }\r\n  }\r\n\r\n  toggleTest(): void {\r\n    this.showTest = !this.showTest;\r\n    if (this.showTest) {\r\n      this.showSettings = false; // Close settings when opening test\r\n    }\r\n  }\r\n\r\n  // Test visualization disabled - streaming only mode\r\n  // async loadTestVisualization(): Promise<void> {\r\n  //   console.warn('Test visualization not available in streaming-only mode');\r\n  // }\r\n\r\n\r\n  handleRefreshMessage(message: ChatMessage): void {\r\n    // Find the user message that corresponds to this assistant response\r\n    const messageIndex = this.chatMessages.findIndex(m => m.id === message.id);\r\n    if (messageIndex > 0) {\r\n      const userMessage = this.chatMessages[messageIndex - 1];\r\n      if (userMessage && userMessage.type === MessageType.USER) {\r\n        // Re-submit the user's question\r\n        this.currentQuestion = userMessage.content;\r\n        \r\n        // Update the assistant message to loading state\r\n        this.chatMessages[messageIndex] = {\r\n          ...message,\r\n          isLoading: true,\r\n          hasError: false,\r\n          errorMessage: undefined,\r\n          dashboardData: null\r\n        };\r\n\r\n        // Re-run the query using streaming only\r\n        if (this.streamingEnabled && this.isConnected) {\r\n          this.streamingService.submitStreamingQuery(\r\n            this.currentQuestion, \r\n            this.currentSession?.id, \r\n            this.currentUserId\r\n          );\r\n        } else {\r\n          this.updateAssistantMessageError(\r\n            message.id, \r\n            'Connection to streaming service failed. Please refresh the page and try again.'\r\n          );\r\n        }\r\n      }\r\n    }\r\n  }\r\n\r\n  handleClarificationSubmitted(event: {message: ChatMessage, selections: DimensionSelection[]}): void {\r\n    console.log('📤 Clarification submitted:', event.selections);\r\n    const message = event.message;\r\n    const selections = event.selections;\r\n\r\n    // Update the message to show processing clarification\r\n    const messageIndex = this.chatMessages.findIndex(m => m.id === message.id);\r\n    if (messageIndex >= 0) {\r\n      this.chatMessages[messageIndex] = {\r\n        ...message,\r\n        isLoading: true,\r\n        needsClarification: false,\r\n        clarificationRequest: undefined,\r\n        content: 'Processing your clarification...'\r\n      };\r\n\r\n      console.log('✅ Updated message to processing state');\r\n    }\r\n\r\n    // Get the original question from the clarification request\r\n    const originalQuestion = message.clarificationRequest?.user_question || 'Unknown question';\r\n\r\n    // Send clarification response via WebSocket\r\n    if (this.streamingEnabled && this.isConnected && this.currentSession) {\r\n      // Get the user_message_id, filter_value, and filter_type from the clarification request\r\n      const userMessageId = message.clarificationRequest?.user_message_id;\r\n      const filterValue = message.clarificationRequest?.filter_value;\r\n      const filterType = message.clarificationRequest?.filter_type;\r\n\r\n      this.streamingService.submitClarificationResponse(\r\n        this.currentSession.id,\r\n        this.currentUserId,\r\n        originalQuestion,\r\n        selections,\r\n        userMessageId,\r\n        filterValue,\r\n        filterType\r\n      );\r\n    } else {\r\n      console.error('Cannot submit clarification: not connected or no session');\r\n      this.updateAssistantMessageError(\r\n        message.id,\r\n        'Connection to streaming service failed. Please refresh the page and try again.'\r\n      );\r\n    }\r\n  }\r\n\r\n  handleClarificationCancelled(message: ChatMessage): void {\r\n    console.log('❌ Clarification cancelled');\r\n\r\n    // Check if this is due to negative feedback\r\n    const cancelledByFeedback = message.user_feedback === 'negative';\r\n    const errorMessage = cancelledByFeedback\r\n      ? 'Clarification cancelled due to negative feedback'\r\n      : 'Query cancelled by user';\r\n\r\n    console.log(cancelledByFeedback ? '👎 Cancelled by negative feedback' : '🚫 Cancelled manually');\r\n\r\n    // Update the message to show cancellation\r\n    const messageIndex = this.chatMessages.findIndex(m => m.id === message.id);\r\n    if (messageIndex >= 0) {\r\n      this.chatMessages[messageIndex] = {\r\n        ...message,\r\n        isLoading: false,\r\n        hasError: true,\r\n        errorMessage: errorMessage,\r\n        needsClarification: false,\r\n        clarificationRequest: undefined\r\n      };\r\n\r\n      console.log('✅ Updated message to cancelled state');\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Handle feedback submission from chat messages\r\n   */\r\n  handleFeedbackSubmitted(event: {message: ChatMessage, feedback: 'positive' | 'negative', comment?: string}): void {\r\n    console.log('🎯 HomeComponent: Handling feedback submission for message:', event.message.id, event);\r\n\r\n    // Get the real UUID for the message\r\n    const realMessageId = this.streamingService.getRealMessageId(event.message.id);\r\n    console.log(`🎯 Using real message ID: ${realMessageId} (original: ${event.message.id})`);\r\n\r\n    // Submit feedback via WebSocket using the real UUID\r\n    this.streamingService.submitMessageFeedback(realMessageId, event.feedback, event.comment);\r\n\r\n    // Update local chatMessages array immediately for responsive UI\r\n    const messageIndex = this.chatMessages.findIndex(m => m.id === event.message.id);\r\n    if (messageIndex >= 0) {\r\n      this.chatMessages[messageIndex] = {\r\n        ...this.chatMessages[messageIndex],\r\n        user_feedback: event.feedback,\r\n        feedback_comment: event.comment\r\n      };\r\n      console.log(`📝 HomeComponent: Updated local message ${event.message.id} with feedback:`, event.feedback);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Handle stop streaming request triggered by negative feedback\r\n   */\r\n  handleStopStreamingRequested(message: ChatMessage): void {\r\n    console.log('🛑 HomeComponent: Stop streaming requested for message:', message.id);\r\n    console.log('🛑 User gave negative feedback during streaming - stopping execution');\r\n\r\n    // Mark the message as stopped by feedback\r\n    const messageIndex = this.chatMessages.findIndex(m => m.id === message.id);\r\n    if (messageIndex >= 0) {\r\n      this.chatMessages[messageIndex] = {\r\n        ...this.chatMessages[messageIndex],\r\n        stoppedByFeedback: true\r\n      };\r\n    }\r\n\r\n    // Cancel the execution using existing infrastructure\r\n    if (this.canCancelExecution && this.currentSessionIdForCancellation) {\r\n      console.log('🛑 Cancelling execution for session:', this.currentSessionIdForCancellation);\r\n      this.streamingService.cancelQuery(this.currentSessionIdForCancellation);\r\n      this.canCancelExecution = false;\r\n\r\n      // Update the message to show it was stopped due to feedback\r\n      if (this.currentProcessingMessage) {\r\n        this.currentProcessingMessage.stoppedByFeedback = true;\r\n        console.log('✅ Marked current processing message as stopped by feedback');\r\n      }\r\n    }\r\n  }\r\n\r\n  // ==========================================================================\r\n  // SESSION MANAGEMENT METHODS\r\n  // ==========================================================================\r\n\r\n  /**\r\n   * Create a default session for the user\r\n   */\r\n  private async createDefaultSession(firstQuestion?: string): Promise<void> {\r\n    console.log('💬 SESSION: Creating default session with question:', firstQuestion);\r\n    console.log('💬 SESSION: Using user ID:', this.currentUserId);\r\n    try {\r\n      // Use firstValueFrom instead of deprecated toPromise()\r\n      const { firstValueFrom } = await import('rxjs');\r\n      const session = await firstValueFrom(this.chatHistoryService.createDefaultSession(firstQuestion, this.currentUserId));\r\n      console.log('💬 SESSION: ✅ Created default session with user_id:', session.user_id, 'session_id:', session.id);\r\n    } catch (error) {\r\n      console.error('💬 SESSION: ❌ Failed to create default session:', error);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Handle session selection from sidebar\r\n   */\r\n  onSessionSelected(session: ChatSession): void {\r\n    console.log('🔍 DEBUG: Session selected from sidebar:', session);\r\n    console.log('🔍 DEBUG: Previous current session:', this.currentSession);\r\n\r\n    // Set the selected session as current\r\n    this.chatHistoryService.setCurrentSession(session);\r\n\r\n    // Clear UI state but NOT the session state\r\n    this.clearCurrentConversationStateForSessionSwitch();\r\n\r\n    // Close mobile sidebar if open\r\n    if (this.showMobileSidebar) {\r\n      this.showMobileSidebar = false;\r\n    }\r\n\r\n    console.log('✅ Session selection completed. New current session should be:', session.id);\r\n  }\r\n\r\n  /**\r\n   * Handle new session request from sidebar or header\r\n   */\r\n  onNewSessionRequested(): void {\r\n    console.log('New session requested');\r\n\r\n    // Clear current session and messages\r\n    this.chatHistoryService.setCurrentSession(null);\r\n    this.clearCurrentConversationState();\r\n\r\n    // Reset UI state\r\n    this.userQuestion = '';\r\n    this.currentQuestion = '';\r\n    this.error = null;\r\n    this.dashboardData = null;\r\n    this.suggestedQuestions = [];\r\n\r\n    // Close mobile sidebar if open\r\n    if (this.showMobileSidebar) {\r\n      this.showMobileSidebar = false;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Handle back button click - different behavior based on chat state\r\n   */\r\n  onBackButtonClick(): void {\r\n    console.log('Back button clicked');\r\n\r\n    // If no messages (empty chat), close the Datachat AI modal\r\n    if (this.chatMessages.length === 0) {\r\n      console.log('No messages - closing Datachat AI modal');\r\n      this.closeDataChatEvent.emit();\r\n    } else {\r\n      // If messages exist, clear them and start new session\r\n      console.log('Messages exist - starting new session');\r\n      this.onNewSessionRequested();\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Handle WebSocket session creation event\r\n   */\r\n  private async handleWebSocketSessionCreated(sessionId: string): Promise<void> {\r\n    try {\r\n      console.log('📥 Fetching newly created session from WebSocket:', sessionId);\r\n      \r\n      // Fetch the new session details via REST API\r\n      const { firstValueFrom } = await import('rxjs');\r\n      const session = await firstValueFrom(this.chatHistoryService.getSession(sessionId));\r\n      \r\n      console.log('✅ New session fetched and set as current:', session.id);\r\n      console.log('📋 Session name:', session.session_name);\r\n      \r\n      // Refresh sessions list to include the new session in left panel\r\n      if (this.currentUserId) {\r\n        console.log('🔄 Refreshing sessions list to include new session');\r\n        this.chatHistoryService.addSessionToList(session);\r\n      }\r\n    } catch (error) {\r\n      console.error('❌ Failed to fetch WebSocket-created session:', error);\r\n    }\r\n  }\r\n\r\n  // /**\r\n  //  * Handle WebSocket session connection event\r\n  //  */\r\n  // private async handleWebSocketSessionConnected(sessionId: string): Promise<void> {\r\n  //   try {\r\n  //     console.log('🔗 Connecting to existing WebSocket session:', sessionId);\r\n      \r\n  //     // Fetch session details if not already current\r\n  //     if (!this.currentSession || this.currentSession.id !== sessionId) {\r\n  //       console.log('📥 Fetching session details for connection:', sessionId);\r\n  //       const { firstValueFrom } = await import('rxjs');\r\n  //       const session = await firstValueFrom(this.chatHistoryService.getSession(sessionId));\r\n  //       console.log('✅ Connected to existing session:', session.id);\r\n  //     } else {\r\n  //       console.log('✅ Already connected to session:', sessionId);\r\n  //     }\r\n  //   } catch (error) {\r\n  //     console.error('❌ Failed to connect to WebSocket session:', error);\r\n  //   }\r\n  // }\r\n\r\n  /**\r\n   * Handle sidebar toggle\r\n   */\r\n  onSidebarToggled(collapsed: boolean): void {\r\n    this.sidebarCollapsed = collapsed;\r\n  }\r\n\r\n  /**\r\n   * Toggle mobile sidebar visibility\r\n   */\r\n  toggleMobileSidebar(): void {\r\n    this.showMobileSidebar = !this.showMobileSidebar;\r\n\r\n    // On mobile, when opening sidebar, ensure it's expanded (not collapsed)\r\n    // When closing, we can leave sidebarCollapsed as is\r\n    if (this.showMobileSidebar) {\r\n      this.sidebarCollapsed = false;\r\n    }\r\n\r\n    console.log('Mobile Sidebar Open:', this.showMobileSidebar, 'Sidebar Collapsed:', this.sidebarCollapsed);\r\n    console.log('Sessions available:', this.sessions.length);\r\n    console.log('Current Session:', this.currentSession);\r\n  }\r\n\r\n  /**\r\n   * Clear current conversation state\r\n   */\r\n  private clearCurrentConversationState(): void {\r\n    // Reset streaming state\r\n    this.isStreamingActive = false;\r\n    this.streamingCompleted = false;\r\n    this.currentPhase = null;\r\n    this.streamingSteps = [];\r\n    \r\n    // Reset loading states\r\n    this.loading = false;\r\n    this.chatLoading = false;\r\n    \r\n    // Keep current conversation structure for backward compatibility\r\n    this.initializeConversation();\r\n  }\r\n\r\n  /**\r\n   * Clear UI state when switching sessions (but preserve session context)\r\n   */\r\n  private clearCurrentConversationStateForSessionSwitch(): void {\r\n    // Reset streaming state\r\n    this.isStreamingActive = false;\r\n    this.streamingCompleted = false;\r\n    this.currentPhase = null;\r\n    this.streamingSteps = [];\r\n    \r\n    // Reset loading states\r\n    this.loading = false;\r\n    this.chatLoading = false;\r\n    \r\n    // Clear input field\r\n    this.userQuestion = '';\r\n    this.currentQuestion = '';\r\n    this.error = null;\r\n    this.suggestedQuestions = [];\r\n    \r\n    // Don't call initializeConversation() as it will interfere with session management\r\n    // The messages will be loaded by the ChatHistoryService\r\n    console.log('🔍 DEBUG: UI state cleared for session switch');\r\n  }\r\n\r\n\r\n  /**\r\n   * Extract suggested questions from the most recent assistant message with dashboard_data\r\n   */\r\n  private extractSuggestedQuestionsFromMessages(messages: ChatMessage[]): void {\r\n    // Clear existing suggested questions first\r\n    this.suggestedQuestions = [];\r\n    \r\n    // Find the most recent assistant message with dashboard_data\r\n    for (let i = messages.length - 1; i >= 0; i--) {\r\n      const message = messages[i];\r\n      if (message.type === MessageType.ASSISTANT && \r\n          message.dashboardData?.suggested_questions && \r\n          message.dashboardData.suggested_questions.length > 0) {\r\n        \r\n        this.suggestedQuestions = [...message.dashboardData.suggested_questions];\r\n        console.log('🔍 DEBUG: Extracted suggested questions from historical message:', this.suggestedQuestions.length, 'questions');\r\n        break; // Use the most recent one\r\n      }\r\n    }\r\n  }\r\n\r\n\r\n  /**\r\n   * Smart merge function for step debug data\r\n   * Properly merges arrays and preserves existing data\r\n   */\r\n  private mergeStepDebugData(existingStep: any, newStepData: any): any {\r\n    const merged = { ...existingStep };\r\n\r\n    // Merge each property from new data\r\n    Object.keys(newStepData).forEach(key => {\r\n      const newValue = newStepData[key];\r\n      const existingValue = merged[key];\r\n\r\n      if (Array.isArray(newValue) && Array.isArray(existingValue)) {\r\n        // Merge arrays by combining unique items\r\n        const combinedArray = [...existingValue];\r\n        newValue.forEach(item => {\r\n          if (!combinedArray.some(existing => JSON.stringify(existing) === JSON.stringify(item))) {\r\n            combinedArray.push(item);\r\n          }\r\n        });\r\n        merged[key] = combinedArray;\r\n      } else if (key === 'timestamp') {\r\n        // Keep the latest timestamp\r\n        merged[key] = Math.max(existingValue || 0, newValue || 0);\r\n      } else if (newValue !== undefined && newValue !== null) {\r\n        // For other properties, use the new value if it's not null/undefined\r\n        merged[key] = newValue;\r\n      }\r\n      // If newValue is null/undefined, keep the existing value (don't overwrite)\r\n    });\r\n\r\n    return merged;\r\n  }\r\n\r\n  // @HostListener('document:click', ['$event'])\r\n  // onDocumentClick(event: Event): void {\r\n  //   if (this.showDataChat && !this.elementRef.nativeElement.contains(event.target as Node)) {\r\n  //     this.closeDataChatEvent.emit();\r\n  //   }\r\n  // }\r\n}","<div class=\"datachat-app\">\r\n  <!-- Mobile Header (visible only on mobile) -->\r\n  <div class=\"mobile-chat-header\">\r\n    <button class=\"mobile-header-btn\" (click)=\"toggleMobileSidebar()\" title=\"Show previous chats\">\r\n      <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"#000\" xmlns=\"http://www.w3.org/2000/svg\">\r\n        <path d=\"M3 12H21M3 6H21M3 18H21\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"/>\r\n      </svg>\r\n    </button>\r\n    <h1 class=\"mobile-header-title\">Datachat AI</h1>\r\n    <button class=\"mobile-header-btn\" (click)=\"onNewSessionRequested()\" title=\"New chat\">\r\n<svg width=\"16\" height=\"16\" viewBox=\"0 0 19 19\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n<path d=\"M3.16732 3.16615H5.01254C5.36749 3.16615 5.66801 2.91633 5.69647 2.596C5.71503 2.41297 5.65566 2.23858 5.53446 2.10501C5.41449 1.97144 5.24259 1.896 5.06572 1.896H3.16608C1.42103 1.896 0 3.31703 0 5.06207V15.8267C0 17.5718 1.42103 18.9928 3.16608 18.9928H13.9307C15.6758 18.9928 17.0968 17.5718 17.0968 15.8267V13.9815C17.0968 13.6266 16.847 13.326 16.5267 13.2976C16.3436 13.279 16.1717 13.3359 16.0357 13.4596C15.9021 13.5796 15.8267 13.7515 15.8267 13.9283V15.828C15.8267 16.8755 14.9745 17.7276 13.927 17.7276L3.16742 17.7264C2.11989 17.7264 1.26777 16.8743 1.26777 15.8267V5.06208C1.26777 4.01455 2.11989 3.16243 3.16742 3.16243L3.16732 3.16615Z\" fill=\"#000\"/>\r\n<path d=\"M14.5653 0C14.0582 0 13.5808 0.196642 13.2234 0.557768L6.27419 7.50699C5.49505 8.28613 5.06836 9.31761 5.06836 10.4171V12.0323C5.06836 13.0798 5.92048 13.9319 6.96801 13.9319H8.58321C9.68146 13.9319 10.7166 13.504 11.4933 12.7261L18.4425 5.77686C18.7999 5.41944 19.0003 4.94082 19.0003 4.43498C19.0003 1.99115 17.0116 0.00246927 14.5678 0.00246927L14.5653 0ZM17.7314 4.69466L10.5953 11.8307C10.0574 12.3687 9.3413 12.6667 8.58191 12.6667H6.96671C6.61793 12.6667 6.33349 12.3823 6.33349 12.0335V10.4183C6.33349 9.65894 6.63155 8.94284 7.16953 8.40486L14.3055 1.26884H14.5677C16.3128 1.26884 17.7338 2.68987 17.7338 4.43491V4.69711L17.7314 4.69466Z\" fill=\"#000\"/>\r\n</svg>\r\n\r\n    </button>\r\n  </div>\r\n\r\n  <!-- App Layout with Sidebar -->\r\n  <div class=\"app-layout\">\r\n    <!-- Mobile Sidebar Backdrop -->\r\n    <div class=\"mobile-sidebar-backdrop\"\r\n         *ngIf=\"showMobileSidebar\"\r\n         (click)=\"toggleMobileSidebar()\">\r\n    </div>\r\n\r\n    <!-- Session Sidebar -->\r\n    <app-session-sidebar\r\n      [class.mobile-sidebar-open]=\"showMobileSidebar\"\r\n      [isCollapsed]=\"sidebarCollapsed\"\r\n      [currentUserId]=\"currentUserId\"\r\n      (sessionSelected)=\"onSessionSelected($event)\"\r\n      (newSessionRequested)=\"onNewSessionRequested()\"\r\n      (sidebarToggled)=\"onSidebarToggled($event)\">\r\n    </app-session-sidebar>\r\n\r\n    <!-- Main Content Wrapper -->\r\n    <div class=\"main-content-wrapper\" [class.sidebar-collapsed]=\"sidebarCollapsed\">\r\n\r\n      <!-- Main Content Area -->\r\n      <div class=\"main-content\">\r\n      <!-- Chat Messages Container -->\r\n      <app-chat-messages-container\r\n        [chatMessages]=\"chatMessages\"\r\n        (refreshRequested)=\"handleRefreshMessage($event)\"\r\n        (clarificationSubmitted)=\"handleClarificationSubmitted($event)\"\r\n        (clarificationCancelled)=\"handleClarificationCancelled($event)\"\r\n        (feedbackSubmitted)=\"handleFeedbackSubmitted($event)\"\r\n        (stopStreamingRequested)=\"handleStopStreamingRequested($event)\"\r\n        #messagesContainer>\r\n      </app-chat-messages-container>\r\n\r\n      <!-- Single Input Container (positioned based on chat state) -->\r\n      <div class=\"input-container-wrapper\" [class.centered]=\"chatMessages.length === 0\" [class.bottom]=\"chatMessages.length > 0\">\r\n        <!-- Welcome Content (only shown when no messages) -->\r\n        <div *ngIf=\"chatMessages.length === 0\" class=\"welcome-content\">\r\n          <!-- Title -->\r\n          <div class=\"main-title\">\r\n            Ask Datachat AI\r\n          </div>\r\n          \r\n          <!-- Suggested Questions -->\r\n          <div class=\"suggested-questions\">\r\n            <div class=\"suggestion-item\" (click)=\"askSuggestedQuestion('Can we get performance leaderboard of top 10 hospitals based on revenue for current month')\">\r\n              Can we get performance leaderboard of top 10 hospitals based on revenue for current month\r\n            </div>\r\n            <div class=\"suggestion-item\" (click)=\"askSuggestedQuestion('Could you provide the monthly revenue performance rankings for hospitals?')\">\r\n              Could you provide the monthly revenue performance rankings for hospitals?\r\n            </div>\r\n            <div class=\"suggestion-item\" (click)=\"askSuggestedQuestion('Can you share the latest monthly revenue rankings for healthcare facilities?')\">\r\n              Can you share the latest monthly revenue rankings for healthcare facilities?\r\n            </div>\r\n          </div>\r\n        </div>\r\n        <!-- Dynamic Suggested Questions (appears above bottom input when available from API) - Desktop -->\r\n        <app-suggested-questions\r\n          *ngIf=\"suggestedQuestions.length > 0\"\r\n          class=\"desktop-suggestions\"\r\n          [suggestedQuestions]=\"suggestedQuestions\"\r\n          (questionSelected)=\"askSuggestedQuestion($event)\">\r\n        </app-suggested-questions>\r\n\r\n        <div class=\"input-container\">\r\n          <!-- Input field wrapper with back button and suggested questions -->\r\n          <div class=\"input-field-wrapper\">\r\n            <!-- Dynamic Suggested Questions - Mobile (inside wrapper for bottom positioning) -->\r\n            <app-suggested-questions\r\n              *ngIf=\"suggestedQuestions.length > 0\"\r\n              class=\"mobile-suggestions\"\r\n              [suggestedQuestions]=\"suggestedQuestions\"\r\n              (questionSelected)=\"askSuggestedQuestion($event)\">\r\n            </app-suggested-questions>\r\n\r\n            <!-- Suggested Questions inside wrapper for mobile bottom positioning -->\r\n            <div class=\"suggested-questions\" *ngIf=\"chatMessages.length === 0\">\r\n              <div class=\"suggestion-item\" (click)=\"askSuggestedQuestion('Can we get performance leaderboard of top 10 hospitals based on revenue for current month')\">\r\n                Can we get performance leaderboard of top 10 hospitals based on revenue for current month\r\n              </div>\r\n              <div class=\"suggestion-item\" (click)=\"askSuggestedQuestion('Could you provide the monthly revenue performance rankings for hospitals?')\">\r\n                Could you provide the monthly revenue performance rankings for hospitals?\r\n              </div>\r\n              <div class=\"suggestion-item\" (click)=\"askSuggestedQuestion('Can you share the latest monthly revenue rankings for healthcare facilities?')\">\r\n                Can you share the latest monthly revenue rankings for healthcare facilities?\r\n              </div>\r\n            </div>\r\n\r\n                      <!-- Back button (mobile only) - positioned outside and to the right of search container -->\r\n          <button class=\"back-button-right\"\r\n                  (click)=\"onBackButtonClick()\"\r\n                  title=\"Back to home\">\r\n            <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n              <path d=\"M19 12H5M12 19L5 12L12 5\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n            </svg>\r\n          </button>\r\n\r\n            <div class=\"chat-input-field\">\r\n              <div class=\"input-wrapper\">\r\n                <input\r\n                  type=\"text\"\r\n                  [(ngModel)]=\"userQuestion\"\r\n                  (keyup.enter)=\"submitQuestion()\"\r\n                  [disabled]=\"isStreamingActive || chatLoading\"\r\n                  placeholder=\"Ask for any insights\"\r\n                  class=\"text-input\"\r\n                  #chatInput>\r\n              </div>\r\n\r\n              <div class=\"input-actions\">\r\n              <button\r\n                class=\"send-button\"\r\n                (click)=\"submitQuestion()\"\r\n                [disabled]=\"isStreamingActive || chatLoading\"\r\n                *ngIf=\"!isExecutionRunning\">\r\n                <svg width=\"36\" height=\"36\" viewBox=\"0 0 36 36\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n<rect width=\"36\" height=\"36\" rx=\"12\" fill=\"#D9307E\"/>\r\n<path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M17.793 11.793C17.7001 11.8858 17.6263 11.996 17.576 12.1173C17.5257 12.2387 17.4998 12.3687 17.4998 12.5C17.4998 12.6314 17.5257 12.7614 17.576 12.8827C17.6263 13.0041 17.7001 13.1143 17.793 13.207L21.586 17H12C11.7348 17 11.4804 17.1054 11.2929 17.2929C11.1054 17.4805 11 17.7348 11 18C11 18.2653 11.1054 18.5196 11.2929 18.7071C11.4804 18.8947 11.7348 19 12 19H21.586L17.793 22.793C17.7001 22.8858 17.6263 22.996 17.576 23.1173C17.5257 23.2387 17.4998 23.3687 17.4998 23.5C17.4998 23.6314 17.5257 23.7614 17.576 23.8827C17.6263 24.004 17.7001 24.1143 17.793 24.207C18.183 24.597 18.817 24.597 19.208 24.207L24.707 18.707C24.8881 18.5266 24.993 18.2836 25 18.028V17.971C24.9928 17.7158 24.888 17.4731 24.707 17.293L19.208 11.793C19.1151 11.7001 19.0048 11.6263 18.8834 11.576C18.762 11.5257 18.6319 11.4998 18.5005 11.4998C18.3691 11.4998 18.239 11.5257 18.1176 11.576C17.9962 11.6263 17.8859 11.7001 17.793 11.793Z\" fill=\"white\"/>\r\n</svg>\r\n              </button>\r\n\r\n              <!-- Stop button for running executions -->\r\n              <button\r\n                class=\"stop-button\"\r\n                (click)=\"cancelExecution()\"\r\n                [disabled]=\"!canCancelExecution\"\r\n                *ngIf=\"isExecutionRunning\"\r\n                title=\"Stop query execution\">\r\n                <svg width=\"36\" height=\"36\" viewBox=\"0 0 36 36\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n                  <rect width=\"36\" height=\"36\" rx=\"12\" fill=\"#FF6B6B\"/>\r\n                  <rect x=\"12\" y=\"12\" width=\"12\" height=\"12\" rx=\"2\" fill=\"white\"/>\r\n                </svg>\r\n              </button>\r\n            </div>\r\n          </div>\r\n\r\n\r\n        </div>\r\n        </div>\r\n      </div>\r\n    </div>\r\n  </div>\r\n</div>\r\n\r\n","/*\r\n * Public API Surface of @medha-analytics/datachat-ai\r\n */\r\n\r\n// Module and Configuration\r\nexport * from './lib/datachat-ai.module';\r\nexport * from './lib/datachat-ai.config';\r\n\r\n// Main Components\r\nexport * from './lib/components/home/home.component';\r\n\r\n// Models\r\nexport * from './lib/models/chat.model';\r\nexport * from './lib/models/dashboard.model';\r\nexport * from './lib/models/animated-text.model';\r\n\r\n// Services (for advanced usage)\r\nexport * from './lib/services/analytics.service';\r\nexport * from './lib/services/streaming-analytics.service';\r\nexport * from './lib/services/chat-history.service';\r\nexport * from './lib/services/environment.service';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.AnimatedDotsService","i2","i1","i3","i5","i1.EnvironmentService","i2.EnvironmentService","i3.StreamingAnalyticsService","i1.ChatHistoryService","i1.AnalyticsService","i4.ChatHistoryService","i5.EnvironmentService","i6","i7","i8"],"mappings":"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"}