@memberjunction/ng-conversations 5.35.0 → 5.37.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/dist/lib/components/conversation/conversation-chat-area.component.d.ts +62 -2
  2. package/dist/lib/components/conversation/conversation-chat-area.component.d.ts.map +1 -1
  3. package/dist/lib/components/conversation/conversation-chat-area.component.js +300 -24
  4. package/dist/lib/components/conversation/conversation-chat-area.component.js.map +1 -1
  5. package/dist/lib/components/dialogs/rating-dialog.component.d.ts +31 -0
  6. package/dist/lib/components/dialogs/rating-dialog.component.d.ts.map +1 -0
  7. package/dist/lib/components/dialogs/rating-dialog.component.js +290 -0
  8. package/dist/lib/components/dialogs/rating-dialog.component.js.map +1 -0
  9. package/dist/lib/components/mention/mention-editor.component.d.ts +1 -1
  10. package/dist/lib/components/mention/mention-editor.component.d.ts.map +1 -1
  11. package/dist/lib/components/mention/mention-editor.component.js +1 -0
  12. package/dist/lib/components/mention/mention-editor.component.js.map +1 -1
  13. package/dist/lib/components/message/conversation-message-rating.component.d.ts +43 -18
  14. package/dist/lib/components/message/conversation-message-rating.component.d.ts.map +1 -1
  15. package/dist/lib/components/message/conversation-message-rating.component.js +235 -193
  16. package/dist/lib/components/message/conversation-message-rating.component.js.map +1 -1
  17. package/dist/lib/components/message/message-input-box.component.d.ts +1 -1
  18. package/dist/lib/components/message/message-input-box.component.d.ts.map +1 -1
  19. package/dist/lib/components/message/message-input-box.component.js +1 -1
  20. package/dist/lib/components/message/message-input-box.component.js.map +1 -1
  21. package/dist/lib/components/message/message-input.component.d.ts +7 -1
  22. package/dist/lib/components/message/message-input.component.d.ts.map +1 -1
  23. package/dist/lib/components/message/message-input.component.js +28 -3
  24. package/dist/lib/components/message/message-input.component.js.map +1 -1
  25. package/dist/lib/components/message/message-item.component.js +20 -20
  26. package/dist/lib/components/message/message-item.component.js.map +1 -1
  27. package/dist/lib/components/overlay/chat-overlay.component.d.ts +73 -5
  28. package/dist/lib/components/overlay/chat-overlay.component.d.ts.map +1 -1
  29. package/dist/lib/components/overlay/chat-overlay.component.js +202 -37
  30. package/dist/lib/components/overlay/chat-overlay.component.js.map +1 -1
  31. package/dist/lib/conversations.module.d.ts +24 -23
  32. package/dist/lib/conversations.module.d.ts.map +1 -1
  33. package/dist/lib/conversations.module.js +4 -0
  34. package/dist/lib/conversations.module.js.map +1 -1
  35. package/dist/lib/services/data-cache.service.d.ts.map +1 -1
  36. package/dist/lib/services/data-cache.service.js +0 -1
  37. package/dist/lib/services/data-cache.service.js.map +1 -1
  38. package/dist/lib/services/dialog.service.d.ts +24 -0
  39. package/dist/lib/services/dialog.service.d.ts.map +1 -1
  40. package/dist/lib/services/dialog.service.js +45 -0
  41. package/dist/lib/services/dialog.service.js.map +1 -1
  42. package/package.json +22 -22
@@ -1 +1 @@
1
- {"version":3,"file":"mention-editor.component.js","sourceRoot":"","sources":["../../../../src/lib/components/mention/mention-editor.component.ts","../../../../src/lib/components/mention/mention-editor.component.html"],"names":[],"mappings":"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","sourcesContent":["import {\n Component,\n Input,\n Output,\n EventEmitter,\n ViewChild,\n ElementRef,\n AfterViewInit,\n forwardRef,\n OnInit,\n ViewEncapsulation,\n ChangeDetectorRef\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { MentionAutocompleteService, MentionSuggestion } from '../../services/mention-autocomplete.service';\nimport { UserInfo } from '@memberjunction/core';\nimport { AIEngineBase } from '@memberjunction/ai-engine-base';\nimport { MJAIAgentConfigurationEntity } from '@memberjunction/core-entities';\nimport { ChatMessageContentBlock } from '@memberjunction/ai';\nimport { UUIDsEqual } from '@memberjunction/global';\n\n/**\n * Represents a pending attachment that hasn't been uploaded yet\n */\nexport interface PendingAttachment {\n /** Local ID for tracking */\n id: string;\n /** Original File object (null for artifact references) */\n file: File | null;\n /** Base64 data URL for display */\n dataUrl: string;\n /** MIME type */\n mimeType: string;\n /** Original filename */\n fileName: string;\n /** File size in bytes */\n sizeBytes: number;\n /** Width in pixels (for images) */\n width?: number;\n /** Height in pixels (for images) */\n height?: number;\n /** Small thumbnail URL for preview */\n thumbnailUrl?: string;\n /** MJStorage File ID (for artifact references, mutually exclusive with inline data) */\n fileID?: string;\n /** Source of the attachment */\n source?: 'upload' | 'artifact';\n /** Artifact Version ID (for artifact references, used to create ConversationDetailArtifact) */\n artifactVersionId?: string;\n}\n\n/**\n * ContentEditable-based mention editor with visual chips/pills\n * Provides Slack/Teams-style mention UX with immutable mention tokens\n */\n@Component({\n standalone: false,\n selector: 'mj-mention-editor',\n templateUrl: './mention-editor.component.html',\n styleUrls: ['./mention-editor.component.css'],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => MentionEditorComponent),\n multi: true\n }\n ]\n})\nexport class MentionEditorComponent implements OnInit, AfterViewInit, ControlValueAccessor {\n @ViewChild('editor', { static: false }) editorRef!: ElementRef<HTMLDivElement>;\n\n @Input() placeholder: string = 'Type @ to mention agents or users...';\n @Input() disabled: boolean = false;\n @Input() currentUser?: UserInfo;\n @Input() enableMentions: boolean = true;\n\n // Attachment settings\n @Input() enableAttachments: boolean = true;\n @Input() maxAttachments: number = 10;\n @Input() maxAttachmentSizeBytes: number = 20 * 1024 * 1024; // 20MB default\n @Input() acceptedFileTypes: string = 'image/*'; // MIME types to accept\n\n @Output() valueChange = new EventEmitter<string>();\n @Output() mentionSelected = new EventEmitter<MentionSuggestion>();\n @Output() enterPressed = new EventEmitter<string>();\n @Output() attachmentsChanged = new EventEmitter<PendingAttachment[]>();\n @Output() attachmentError = new EventEmitter<string>();\n @Output() attachmentClicked = new EventEmitter<PendingAttachment>();\n\n // Pending attachments state\n public pendingAttachments: PendingAttachment[] = [];\n public isDragOver: boolean = false;\n\n // Mention dropdown state\n public showMentionDropdown: boolean = false;\n public mentionSuggestions: MentionSuggestion[] = [];\n public mentionDropdownPosition: { top: number; left: number } = { top: 0, left: 0 };\n public mentionDropdownShowAbove: boolean = false;\n\n private mentionStartIndex: number = -1;\n private mentionQuery: string = '';\n private onChange: (value: string) => void = () => {};\n public onTouched: () => void = () => {};\n\n constructor(\n private mentionAutocomplete: MentionAutocompleteService,\n private cdr: ChangeDetectorRef\n ) {}\n\n async ngOnInit(): Promise<void> {\n if (this.enableMentions && this.currentUser) {\n await this.mentionAutocomplete.initialize(this.currentUser);\n }\n }\n\n ngAfterViewInit(): void {\n // Auto-focus the editor\n setTimeout(() => {\n this.editorRef?.nativeElement?.focus();\n }, 100);\n }\n\n /**\n * Handle clicks on the container - focus the editor if clicking outside the contentEditable\n */\n onContainerClick(event: MouseEvent): void {\n const target = event.target as HTMLElement;\n const editor = this.editorRef?.nativeElement;\n\n // Don't handle clicks on the dropdown or its children\n if (target.closest('mj-mention-dropdown')) {\n return;\n }\n\n // If clicking on container or any element that's not the editor itself, focus the editor\n if (target !== editor && !editor?.contains(target)) {\n editor?.focus();\n\n // Move cursor to end of content\n const selection = window.getSelection();\n const range = document.createRange();\n\n if (editor && selection) {\n range.selectNodeContents(editor);\n range.collapse(false); // Collapse to end\n selection.removeAllRanges();\n selection.addRange(range);\n }\n }\n }\n\n /**\n * Handle input changes in contentEditable\n */\n onInput(): void {\n const plainText = this.getPlainText();\n this.onChange(plainText);\n this.valueChange.emit(plainText);\n\n // Handle @mention autocomplete\n if (this.enableMentions && this.currentUser) {\n this.handleMentionInput();\n }\n }\n\n /**\n * Handle blur event - close dropdown when editor loses focus\n */\n onBlur(): void {\n // Call form control touched callback\n this.onTouched();\n\n // Close dropdown when editor loses focus\n // Use setTimeout to allow mousedown events on dropdown to fire first\n setTimeout(() => {\n if (this.showMentionDropdown) {\n this.closeMentionDropdown();\n }\n }, 200);\n }\n\n /**\n * Handle paste event - images or plain text\n */\n onPaste(event: ClipboardEvent): void {\n // Check for image data in clipboard\n if (this.enableAttachments && event.clipboardData?.items) {\n const items = Array.from(event.clipboardData.items);\n const imageItems = items.filter(item => item.type.startsWith('image/'));\n\n if (imageItems.length > 0) {\n event.preventDefault();\n\n // Process each image\n for (const item of imageItems) {\n const file = item.getAsFile();\n if (file) {\n this.processFile(file);\n }\n }\n return;\n }\n }\n\n // No images - handle as plain text\n event.preventDefault();\n\n // Get plain text from clipboard\n const text = event.clipboardData?.getData('text/plain') || '';\n\n if (!text) return;\n\n // Insert plain text at cursor position\n const selection = window.getSelection();\n if (!selection || selection.rangeCount === 0) return;\n\n const range = selection.getRangeAt(0);\n range.deleteContents();\n\n // Insert text as text node (not HTML)\n const textNode = document.createTextNode(text);\n range.insertNode(textNode);\n\n // Move cursor to end of inserted text\n range.setStartAfter(textNode);\n range.collapse(true);\n selection.removeAllRanges();\n selection.addRange(range);\n\n // Trigger input event to update model\n this.onInput();\n }\n\n /**\n * Handle keydown events\n */\n onKeyDown(event: KeyboardEvent): void {\n // Enter alone: Send message (if dropdown not showing)\n if (event.key === 'Enter' && !event.shiftKey && !this.showMentionDropdown) {\n event.preventDefault();\n const plainText = this.getPlainText();\n this.enterPressed.emit(plainText);\n return;\n }\n\n // Backspace: Check if deleting a mention chip\n if (event.key === 'Backspace') {\n this.handleBackspace(event);\n }\n\n // Handle mention dropdown navigation\n if (this.showMentionDropdown) {\n // Let the dropdown handle arrow keys, enter, escape\n // (We'll pass these through to mention-dropdown component)\n }\n }\n\n /**\n * Handle @mention input detection\n */\n private handleMentionInput(): void {\n const selection = window.getSelection();\n if (!selection || selection.rangeCount === 0) return;\n\n const range = selection.getRangeAt(0);\n const textBeforeCursor = this.getTextBeforeCursor(range);\n\n // Find the last @ before cursor\n const lastAtIndex = textBeforeCursor.lastIndexOf('@');\n\n if (lastAtIndex === -1) {\n this.closeMentionDropdown();\n return;\n }\n\n // Check if there's a space between @ and cursor (means mention was completed)\n const textAfterAt = textBeforeCursor.substring(lastAtIndex + 1);\n if (textAfterAt.includes(' ')) {\n this.closeMentionDropdown();\n return;\n }\n\n // Extract query\n this.mentionQuery = textAfterAt;\n this.mentionStartIndex = lastAtIndex;\n\n // Get suggestions\n this.mentionSuggestions = this.mentionAutocomplete.getSuggestions(this.mentionQuery, !!this.currentUser);\n\n if (this.mentionSuggestions.length > 0) {\n this.showMentionDropdown = true;\n this.positionMentionDropdown();\n } else {\n this.closeMentionDropdown();\n }\n }\n\n /**\n * Get text before cursor position\n */\n private getTextBeforeCursor(range: Range): string {\n const tempRange = range.cloneRange();\n tempRange.selectNodeContents(this.editorRef.nativeElement);\n tempRange.setEnd(range.startContainer, range.startOffset);\n return tempRange.toString();\n }\n\n /**\n * Position the mention dropdown\n */\n private positionMentionDropdown(): void {\n const editor = this.editorRef?.nativeElement;\n if (!editor) return;\n\n // Get the parent container (message-input-box-container) for alignment\n const container = editor.closest('.message-input-box-container');\n const containerRect = container?.getBoundingClientRect();\n\n const selection = window.getSelection();\n if (!selection || selection.rangeCount === 0) return;\n\n const range = selection.getRangeAt(0);\n const cursorRect = range.getBoundingClientRect();\n\n // Check space below vs above\n const spaceBelow = window.innerHeight - cursorRect.bottom;\n const spaceAbove = cursorRect.top;\n const dropdownHeight = Math.min(this.mentionSuggestions.length * 56, 300);\n\n this.mentionDropdownShowAbove = spaceBelow < dropdownHeight && spaceAbove > spaceBelow;\n\n if (this.mentionDropdownShowAbove) {\n // Position above, aligning with container top if possible\n this.mentionDropdownPosition = {\n top: containerRect ? containerRect.top + window.scrollY : cursorRect.top + window.scrollY - 4,\n left: cursorRect.left + window.scrollX\n };\n } else {\n // Position below cursor, but align bottom edge with container top\n this.mentionDropdownPosition = {\n top: containerRect ? containerRect.top + window.scrollY : cursorRect.bottom + window.scrollY + 4,\n left: cursorRect.left + window.scrollX\n };\n }\n }\n\n /**\n * Handle mention selection from dropdown\n */\n onMentionSelected(suggestion: MentionSuggestion): void {\n this.insertMentionChip(suggestion);\n this.closeMentionDropdown();\n this.mentionSelected.emit(suggestion);\n\n // Refocus the editor after selection\n setTimeout(() => {\n this.editorRef?.nativeElement?.focus();\n }, 50);\n }\n\n /**\n * Insert a mention chip at the current cursor position\n */\n private insertMentionChip(suggestion: MentionSuggestion): void {\n const selection = window.getSelection();\n if (!selection || selection.rangeCount === 0) return;\n\n const range = selection.getRangeAt(0);\n\n // Delete the @query text\n const textBeforeCursor = this.getTextBeforeCursor(range);\n const lastAtIndex = textBeforeCursor.lastIndexOf('@');\n const deleteLength = textBeforeCursor.length - lastAtIndex;\n\n range.setStart(range.startContainer, range.startOffset - deleteLength);\n range.deleteContents();\n\n // Create mention chip element\n const chip = this.createMentionChip(suggestion);\n\n // Insert chip\n range.insertNode(chip);\n\n // Add space after chip\n const space = document.createTextNode(' ');\n range.collapse(false);\n range.insertNode(space);\n\n // Move cursor after the space\n range.setStartAfter(space);\n range.collapse(true);\n selection.removeAllRanges();\n selection.addRange(range);\n\n // Trigger change detection\n this.onInput();\n }\n\n /**\n * Create a mention chip DOM element\n */\n private createMentionChip(suggestion: MentionSuggestion): HTMLSpanElement {\n const chip = document.createElement('span');\n chip.className = 'mention-chip';\n chip.contentEditable = 'false'; // Make chip non-editable\n chip.setAttribute('data-mention-id', suggestion.id);\n chip.setAttribute('data-mention-type', suggestion.type);\n chip.setAttribute('data-mention-name', suggestion.name);\n\n // For agents, get configuration presets (AIEngine.Config() already called during app init)\n let presets: MJAIAgentConfigurationEntity[] = [];\n if (suggestion.type === 'agent') {\n presets = AIEngineBase.Instance.GetAgentConfigurationPresets(suggestion.id, true);\n\n // Store default preset\n // IMPORTANT: Store the AIAgentConfiguration.ID (preset ID), not AIConfigurationID\n // The backend mapping will convert preset ID -> AIConfigurationID\n const defaultPreset = presets.find(p => p.IsDefault) || presets[0];\n if (defaultPreset) {\n chip.setAttribute('data-preset-id', defaultPreset.ID || '');\n chip.setAttribute('data-preset-name', defaultPreset.Name || '');\n }\n }\n\n // Apply inline styles directly\n const isUser = suggestion.type === 'user';\n chip.style.cssText = `\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 4px 12px;\n margin: 0 3px;\n border-radius: 16px;\n font-size: 13px;\n font-weight: 600;\n cursor: default;\n user-select: none;\n vertical-align: middle;\n white-space: nowrap;\n pointer-events: all;\n background: ${isUser ? 'linear-gradient(135deg, #f093fb 0%, #f5576c 100%)' : 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)'};\n color: white;\n border: 2px solid ${isUser ? 'rgba(240, 147, 251, 0.4)' : 'rgba(102, 126, 234, 0.4)'};\n box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2), 0 1px 2px rgba(0, 0, 0, 0.1);\n `;\n\n // Add icon or image\n if (suggestion.type === 'agent' && suggestion.imageUrl) {\n // Use image if available (LogoURL from agent)\n const img = document.createElement('img');\n img.src = suggestion.imageUrl;\n img.alt = suggestion.displayName;\n img.style.cssText = 'width: 16px; height: 16px; border-radius: 50%; object-fit: cover;';\n chip.appendChild(img);\n } else if (suggestion.type === 'agent' && suggestion.icon === 'mj-icon-skip') {\n // Special handling for mj-icon-skip: use the SVG data URI as an image\n const img = document.createElement('img');\n img.src = \"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 101.89918457031249 96.83947368421053'%3E%3Cg transform='translate(-0.1288232421875,-0.0)'%3E%3Cpath d='M93.85,41.56c-.84,0-1.62.2-2.37.55-3-4.35-7.49-8.12-13.04-11.04l.04-7.18v-14.44h-10.24v17.6c-1.52-.43-3.07-.8-4.67-1.11V0h-10.24v24.72s-.09,0-.14,0h-4.38s-.1,0-.14,0V7.3h-10.24v18.62c-1.6.32-3.15.69-4.67,1.11v-11.67h-10.24v6.09l.04,9.6c-5.55,2.92-10.04,6.7-13.04,11.04-.75-.35-1.53-.55-2.37-.55-4.5,0-8.14,5.61-8.14,12.51s3.64,12.53,8.14,12.53c.58,0,1.14-.12,1.67-.29,4.1,6.62,11.54,12.06,20.98,15.28l.79.13v7.05c0,2.97,1.45,5.58,3.87,6.99,1.18.69,2.5,1.04,3.85,1.03,1.4,0,2.83-.37,4.15-1.12l7.54-4.29,7.56,4.3c1.31.74,2.73,1.12,4.13,1.12s2.67-.35,3.85-1.04c2.42-1.41,3.86-4.02,3.86-6.98v-7.05l.79-.13c9.44-3.22,16.89-8.66,20.98-15.28.54.17,1.09.29,1.68.29,4.5,0,8.14-5.61,8.14-12.53s-3.63-12.51-8.14-12.51' fill='%23AAAAAA'/%3E%3Cpath d='M86.69,50.87c0-12.22-13.6-19.1-28.94-20.66-4.48-.47-9.19-.54-13.52,0-15.34,1.53-28.93,8.41-28.93,20.66,0,8.55,5.7,15.55,12.68,15.55h7.94c3.05,2.5,6.93,4.1,11.08,4.71,2.65.4,5.44.46,8.01,0,4.15-.6,8.05-2.2,11.1-4.71h7.92c6.97,0,12.68-7,12.68-15.55' fill='white' opacity='0.9'/%3E%3Cpath d='M57.83,55.82c-1.19,2.58-3.8,4.35-6.84,4.35s-5.65-1.77-6.84-4.35h13.68Z' fill='%23AAAAAA'/%3E%3Cpath d='M32.52,41.14c1.74,0,3.18,2.13,3.18,4.76s-1.44,4.74-3.18,4.74-3.16-2.13-3.16-4.74,1.41-4.76,3.16-4.76' fill='%23AAAAAA'/%3E%3Cpath d='M69.46,41.14c1.74,0,3.16,2.13,3.16,4.76s-1.41,4.74-3.16,4.74-3.18-2.13-3.18-4.74,1.41-4.76,3.18-4.76' fill='%23AAAAAA'/%3E%3Cpath d='M63.91,76.15c-.82-.48-1.84-.43-2.8.12l-10.13,5.75-10.11-5.75c-.96-.55-1.98-.59-2.8-.12-.82.47-1.29,1.38-1.29,2.49v10.12c0,1.11.47,2.02,1.28,2.49.38.22.8.33,1.24.33.51,0,1.05-.15,1.57-.44l10.12-5.75,10.11,5.75c.52.29,1.05.44,1.56.44.44,0,.86-.11,1.24-.33.81-.48,1.28-1.38,1.28-2.49v-10.12c0-1.11-.47-2.02-1.28-2.49' fill='white' opacity='0.9'/%3E%3C/g%3E%3C/svg%3E\";\n img.alt = suggestion.displayName;\n img.style.cssText = 'width: 16px; height: 16px; border-radius: 50%; object-fit: cover;';\n chip.appendChild(img);\n } else {\n // Use icon for users or agents without images\n const icon = document.createElement('i');\n icon.style.cssText = 'font-size: 12px; opacity: 0.95;';\n if (suggestion.type === 'agent' && suggestion.icon) {\n icon.className = this.getIconClasses(suggestion.icon);\n } else if (suggestion.type === 'user') {\n icon.className = 'fa-solid fa-user';\n } else {\n icon.className = 'fa-solid fa-robot';\n }\n chip.appendChild(icon);\n }\n\n // Add space between icon/image and text\n const space = document.createTextNode(' ');\n chip.appendChild(space);\n\n // Add text\n const text = document.createTextNode(suggestion.displayName);\n chip.appendChild(text);\n\n // Add dropdown if 2+ presets for agents\n if (suggestion.type === 'agent' && presets.length >= 2) {\n this.addConfigurationDropdown(chip, presets);\n }\n\n return chip;\n }\n\n /**\n * Add configuration preset dropdown to agent chip\n */\n private addConfigurationDropdown(chip: HTMLSpanElement, presets: MJAIAgentConfigurationEntity[]): void {\n // Store default preset for comparison\n const defaultPreset = presets.find(p => p.IsDefault) || presets[0];\n\n // Add preset indicator text (only shown when non-default selected)\n const presetIndicator = document.createElement('span');\n presetIndicator.className = 'preset-indicator';\n presetIndicator.style.cssText = `\n display: none;\n font-size: 10px;\n font-weight: 600;\n font-family: 'SF Mono', 'Monaco', 'Inconsolata', 'Roboto Mono', 'Courier New', monospace;\n background: rgba(255, 255, 255, 0.25);\n padding: 2px 6px;\n border-radius: 4px;\n margin-left: 4px;\n letter-spacing: 0.3px;\n text-transform: uppercase;\n border: 1px solid rgba(255, 255, 255, 0.15);\n `;\n chip.appendChild(presetIndicator);\n\n // Add dropdown chevron button\n const chevron = document.createElement('i');\n chevron.className = 'fa-solid fa-chevron-down';\n chevron.style.cssText = `\n font-size: 10px;\n opacity: 0.9;\n cursor: pointer;\n padding: 2px;\n `;\n chip.appendChild(chevron);\n\n // Create dropdown menu (initially hidden) - append to body for global positioning\n const dropdown = document.createElement('div');\n dropdown.className = 'preset-dropdown';\n dropdown.style.cssText = `\n display: none;\n position: fixed;\n background: white;\n border: 1px solid #ddd;\n border-radius: 8px;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n min-width: 200px;\n max-width: 300px;\n z-index: 10000;\n overflow: hidden;\n `;\n\n // Add preset options to dropdown\n presets.forEach(preset => {\n const option = document.createElement('div');\n option.className = 'preset-option';\n option.style.cssText = `\n padding: 10px 12px;\n cursor: pointer;\n display: flex;\n align-items: center;\n gap: 8px;\n transition: background 0.2s;\n `;\n\n // Check if this is the selected preset\n const currentPresetId = chip.getAttribute('data-preset-id');\n const isSelected = UUIDsEqual(preset.ID, currentPresetId);\n\n // Add checkmark for selected option\n const checkmark = document.createElement('i');\n checkmark.className = 'fa-solid fa-check';\n checkmark.style.cssText = `\n font-size: 12px;\n color: #667eea;\n opacity: ${isSelected ? '1' : '0'};\n width: 14px;\n `;\n option.appendChild(checkmark);\n\n // Add preset text content\n const textContainer = document.createElement('div');\n textContainer.style.cssText = 'flex: 1;';\n\n const displayName = document.createElement('div');\n displayName.textContent = preset.DisplayName || preset.Name;\n displayName.style.cssText = `\n font-weight: 600;\n color: #333;\n font-size: 13px;\n `;\n textContainer.appendChild(displayName);\n\n if (preset.Description) {\n const description = document.createElement('div');\n description.textContent = preset.Description;\n description.style.cssText = `\n font-size: 11px;\n color: #666;\n margin-top: 2px;\n `;\n textContainer.appendChild(description);\n }\n\n option.appendChild(textContainer);\n\n // Hover effects\n option.addEventListener('mouseenter', () => {\n option.style.background = '#f5f5f5';\n });\n option.addEventListener('mouseleave', () => {\n option.style.background = 'white';\n });\n\n // Click handler to select preset\n option.addEventListener('click', (e) => {\n e.stopPropagation();\n\n // Update chip data attributes\n // IMPORTANT: Store preset.ID (AIAgentConfiguration.ID), not AIConfigurationID\n chip.setAttribute('data-preset-id', preset.ID || '');\n chip.setAttribute('data-preset-name', preset.Name || '');\n\n // Update preset indicator visibility and text\n const isDefault = UUIDsEqual(preset.ID, defaultPreset.ID);\n if (isDefault) {\n presetIndicator.style.display = 'none';\n } else {\n presetIndicator.style.display = 'inline';\n presetIndicator.textContent = preset.DisplayName || preset.Name;\n }\n\n // Update checkmarks\n dropdown.querySelectorAll('.preset-option').forEach((opt, idx) => {\n const check = opt.querySelector('i.fa-check') as HTMLElement;\n if (check) {\n check.style.opacity = idx === presets.indexOf(preset) ? '1' : '0';\n }\n });\n\n // Close dropdown\n dropdown.style.display = 'none';\n });\n\n dropdown.appendChild(option);\n });\n\n // Append dropdown to document body for global positioning\n document.body.appendChild(dropdown);\n\n // Helper function to position dropdown relative to chip\n const positionDropdown = () => {\n const chipRect = chip.getBoundingClientRect();\n const viewportHeight = window.innerHeight;\n const spaceBelow = viewportHeight - chipRect.bottom;\n\n // Set left position (same for both above/below)\n dropdown.style.left = `${chipRect.left}px`;\n\n // First, show dropdown to measure its actual height\n const wasHidden = dropdown.style.display === 'none';\n if (wasHidden) {\n dropdown.style.visibility = 'hidden';\n dropdown.style.display = 'block';\n }\n\n const dropdownHeight = dropdown.offsetHeight;\n const spaceAbove = chipRect.top;\n\n // Position dropdown above chip if not enough space below\n if (spaceBelow < dropdownHeight && spaceAbove > spaceBelow) {\n // Show above - position so bottom of dropdown is 4px above top of chip\n dropdown.style.top = `${chipRect.top - dropdownHeight - 4}px`;\n } else {\n // Show below (default) - position 4px below bottom of chip\n dropdown.style.top = `${chipRect.bottom + 4}px`;\n }\n\n // Restore visibility\n if (wasHidden) {\n dropdown.style.visibility = 'visible';\n }\n };\n\n // Toggle dropdown on chevron click\n chevron.addEventListener('click', (e) => {\n e.stopPropagation();\n const isVisible = dropdown.style.display === 'block';\n\n if (isVisible) {\n dropdown.style.display = 'none';\n } else {\n positionDropdown();\n dropdown.style.display = 'block';\n }\n });\n\n // Close dropdown when clicking outside\n const closeDropdown = (e: MouseEvent) => {\n if (!dropdown.contains(e.target as Node) && !chip.contains(e.target as Node)) {\n dropdown.style.display = 'none';\n }\n };\n document.addEventListener('click', closeDropdown);\n\n // Cleanup: remove dropdown from body and event listeners when chip is removed\n const observer = new MutationObserver((mutations) => {\n mutations.forEach((mutation) => {\n mutation.removedNodes.forEach((node) => {\n if (node === chip) {\n document.removeEventListener('click', closeDropdown);\n if (dropdown.parentNode) {\n dropdown.parentNode.removeChild(dropdown);\n }\n observer.disconnect();\n }\n });\n });\n });\n if (chip.parentNode) {\n observer.observe(chip.parentNode, { childList: true });\n }\n }\n\n /**\n * Get icon classes with proper FA prefix\n */\n private getIconClasses(iconClass: string): string {\n if (!iconClass) return 'fa-solid fa-robot';\n if (iconClass.includes('fa-')) {\n if (iconClass.match(/\\b(fa-solid|fa-regular|fa-light|fa-brands)\\b/)) {\n return iconClass;\n }\n return `fa-solid ${iconClass}`;\n }\n return iconClass;\n }\n\n /**\n * Handle backspace key - delete entire chip if cursor is right after one\n */\n private handleBackspace(event: KeyboardEvent): void {\n const selection = window.getSelection();\n if (!selection || selection.rangeCount === 0) return;\n\n const range = selection.getRangeAt(0);\n\n // Check if cursor is right after a mention chip\n if (range.collapsed && range.startOffset > 0) {\n const prevNode = range.startContainer.childNodes[range.startOffset - 1];\n\n if (prevNode && (prevNode as HTMLElement).classList?.contains('mention-chip')) {\n event.preventDefault();\n prevNode.remove();\n this.onInput();\n }\n }\n }\n\n /**\n * Close mention dropdown\n */\n closeMentionDropdown(): void {\n this.showMentionDropdown = false;\n this.mentionSuggestions = [];\n this.mentionStartIndex = -1;\n this.mentionQuery = '';\n }\n\n /**\n * Convert editor HTML to plain text with @mentions\n */\n private getPlainText(): string {\n const editor = this.editorRef?.nativeElement;\n if (!editor) return '';\n\n let text = '';\n const nodes = editor.childNodes;\n\n for (let i = 0; i < nodes.length; i++) {\n const node = nodes[i];\n\n if (node.nodeType === Node.TEXT_NODE) {\n text += node.textContent || '';\n } else if (node.nodeType === Node.ELEMENT_NODE) {\n const element = node as HTMLElement;\n\n if (element.classList.contains('mention-chip')) {\n const name = element.getAttribute('data-mention-name') || '';\n // Use quoted format if name has spaces\n text += name.includes(' ') ? `@\"${name}\"` : `@${name}`;\n } else if (element.tagName === 'BR') {\n text += '\\n';\n } else if (element.tagName === 'DIV') {\n // Handle line breaks from contentEditable\n if (i > 0) text += '\\n';\n text += this.getNodeText(element);\n } else {\n text += element.textContent || '';\n }\n }\n }\n\n return text;\n }\n\n /**\n * Get text from a node recursively\n */\n private getNodeText(node: Node): string {\n let text = '';\n const children = node.childNodes;\n\n for (let i = 0; i < children.length; i++) {\n const child = children[i];\n\n if (child.nodeType === Node.TEXT_NODE) {\n text += child.textContent || '';\n } else if (child.nodeType === Node.ELEMENT_NODE) {\n const element = child as HTMLElement;\n\n if (element.classList.contains('mention-chip')) {\n const name = element.getAttribute('data-mention-name') || '';\n text += name.includes(' ') ? `@\"${name}\"` : `@${name}`;\n } else {\n text += this.getNodeText(element);\n }\n }\n }\n\n return text;\n }\n\n /**\n * Set editor content from plain text (for programmatic updates)\n */\n private setEditorContent(text: string): void {\n const editor = this.editorRef?.nativeElement;\n if (!editor) return;\n\n // For now, just set as plain text\n // TODO: Parse @mentions and render as chips\n editor.textContent = text;\n }\n\n // ControlValueAccessor implementation\n writeValue(value: string): void {\n if (value) {\n this.setEditorContent(value);\n } else if (this.editorRef?.nativeElement) {\n this.editorRef.nativeElement.textContent = '';\n }\n }\n\n registerOnChange(fn: (value: string) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.disabled = isDisabled;\n if (this.editorRef?.nativeElement) {\n this.editorRef.nativeElement.contentEditable = (!isDisabled).toString();\n }\n }\n\n /**\n * Focus the editor\n */\n public focus(): void {\n this.editorRef?.nativeElement?.focus();\n }\n\n /**\n * Clear the editor content and pending attachments\n */\n public clear(): void {\n if (this.editorRef?.nativeElement) {\n this.editorRef.nativeElement.textContent = '';\n this.onInput();\n }\n this.clearPendingAttachments();\n }\n\n /**\n * Extract mention chips with their configuration data\n * Returns array of objects containing mention info and preset configuration\n */\n public getMentionChipsData(): Array<{ id: string; type: string; name: string; presetId?: string; presetName?: string }> {\n const editor = this.editorRef?.nativeElement;\n if (!editor) return [];\n\n const chips: Array<{ id: string; type: string; name: string; presetId?: string; presetName?: string }> = [];\n const mentionElements = editor.querySelectorAll('.mention-chip');\n\n mentionElements.forEach(chip => {\n const element = chip as HTMLElement;\n const id = element.getAttribute('data-mention-id') || '';\n const type = element.getAttribute('data-mention-type') || '';\n const name = element.getAttribute('data-mention-name') || '';\n const presetId = element.getAttribute('data-preset-id') || undefined;\n const presetName = element.getAttribute('data-preset-name') || undefined;\n\n chips.push({\n id,\n type,\n name,\n ...(presetId ? { presetId } : {}),\n ...(presetName ? { presetName } : {})\n });\n });\n\n return chips;\n }\n\n /**\n * Get the plain text value with mentions encoded as JSON\n * This format preserves configuration information when messages are saved\n * Format: @{type:\"agent\",id:\"uuid\",name:\"Agent Name\",configId:\"uuid\",config:\"High\"}\n */\n public getPlainTextWithJsonMentions(): string {\n const editor = this.editorRef?.nativeElement;\n if (!editor) return '';\n\n let plainText = '';\n const childNodes = Array.from(editor.childNodes);\n\n for (const node of childNodes) {\n if (node.nodeType === Node.TEXT_NODE) {\n // Regular text node\n plainText += node.textContent || '';\n } else if (node.nodeType === Node.ELEMENT_NODE) {\n const element = node as HTMLElement;\n\n if (element.classList.contains('mention-chip')) {\n // Extract mention data attributes\n const type = element.getAttribute('data-mention-type') || '';\n const id = element.getAttribute('data-mention-id') || '';\n const name = element.getAttribute('data-mention-name') || '';\n const presetId = element.getAttribute('data-preset-id');\n const presetName = element.getAttribute('data-preset-name');\n\n // Build JSON mention object (compact format - no spaces)\n const mentionObj: Record<string, string> = {\n type,\n id,\n name\n };\n\n // Add configuration fields if present (for agents with non-default presets)\n if (presetId) {\n mentionObj.configId = presetId;\n }\n if (presetName) {\n mentionObj.config = presetName;\n }\n\n // Encode as JSON mention\n // Don't remove spaces from the JSON string - spaces in values (like agent names) need to be preserved\n plainText += `@${JSON.stringify(mentionObj)}`;\n } else {\n // Other HTML element (e.g., <br>)\n if (element.tagName === 'BR') {\n plainText += '\\n';\n } else {\n plainText += element.textContent || '';\n }\n }\n }\n }\n\n return plainText;\n }\n\n // ==================== Attachment Handling Methods ====================\n\n /**\n * Handle drag over event\n */\n onDragOver(event: DragEvent): void {\n if (!this.enableAttachments) return;\n\n event.preventDefault();\n event.stopPropagation();\n this.isDragOver = true;\n }\n\n /**\n * Handle drag leave event\n */\n onDragLeave(event: DragEvent): void {\n event.preventDefault();\n event.stopPropagation();\n this.isDragOver = false;\n }\n\n /**\n * Handle drop event\n */\n onDrop(event: DragEvent): void {\n if (!this.enableAttachments) return;\n\n event.preventDefault();\n event.stopPropagation();\n this.isDragOver = false;\n\n if (event.dataTransfer?.files) {\n const files = Array.from(event.dataTransfer.files);\n for (const file of files) {\n if (this.isAcceptedFile(file)) {\n this.processFile(file);\n }\n }\n }\n }\n\n /**\n * Handle file input change (from file picker)\n */\n onFileSelected(event: Event): void {\n const input = event.target as HTMLInputElement;\n if (input.files) {\n const files = Array.from(input.files);\n for (const file of files) {\n this.processFile(file);\n }\n // Reset input so same file can be selected again\n input.value = '';\n }\n }\n\n /**\n * Process a file for attachment\n */\n private async processFile(file: File): Promise<void> {\n // Validate file\n const validation = this.validateFile(file);\n if (!validation.valid) {\n this.attachmentError.emit(validation.error!);\n return;\n }\n\n // Read file as data URL\n const dataUrl = await this.readFileAsDataUrl(file);\n if (!dataUrl) {\n this.attachmentError.emit('Failed to read file');\n return;\n }\n\n // Get image dimensions if applicable\n let width: number | undefined;\n let height: number | undefined;\n\n if (file.type.startsWith('image/')) {\n const dimensions = await this.getImageDimensions(dataUrl);\n width = dimensions.width;\n height = dimensions.height;\n }\n\n // Create pending attachment\n const attachment: PendingAttachment = {\n id: this.generateAttachmentId(),\n file,\n dataUrl,\n mimeType: file.type,\n fileName: file.name,\n sizeBytes: file.size,\n width,\n height,\n thumbnailUrl: file.type.startsWith('image/') ? dataUrl : undefined\n };\n\n // Add to pending attachments\n this.pendingAttachments.push(attachment);\n this.attachmentsChanged.emit([...this.pendingAttachments]);\n this.cdr.detectChanges();\n }\n\n /**\n * Validate a file against settings\n */\n private validateFile(file: File): { valid: boolean; error?: string } {\n // Check count limit\n if (this.pendingAttachments.length >= this.maxAttachments) {\n return {\n valid: false,\n error: `Maximum ${this.maxAttachments} attachments allowed`\n };\n }\n\n // Check size limit\n if (file.size > this.maxAttachmentSizeBytes) {\n const maxMB = (this.maxAttachmentSizeBytes / (1024 * 1024)).toFixed(1);\n const fileMB = (file.size / (1024 * 1024)).toFixed(1);\n return {\n valid: false,\n error: `File size (${fileMB}MB) exceeds maximum (${maxMB}MB)`\n };\n }\n\n // Check file type\n if (!this.isAcceptedFile(file)) {\n return {\n valid: false,\n error: `File type ${file.type || 'unknown'} not accepted`\n };\n }\n\n return { valid: true };\n }\n\n /**\n * Check if file type is accepted\n */\n private isAcceptedFile(file: File): boolean {\n if (this.acceptedFileTypes === '*' || this.acceptedFileTypes === '*/*') {\n return true;\n }\n\n const acceptedTypes = this.acceptedFileTypes.split(',').map(t => t.trim());\n\n for (const accepted of acceptedTypes) {\n // Handle universal wildcard */* anywhere in the list\n if (accepted === '*/*') {\n return true;\n }\n // Handle wildcard MIME types like \"image/*\"\n if (accepted.endsWith('/*')) {\n const category = accepted.slice(0, -2);\n if (file.type.startsWith(category + '/')) {\n return true;\n }\n } else if (accepted.startsWith('.')) {\n // Handle file extensions like \".png\"\n if (file.name.toLowerCase().endsWith(accepted.toLowerCase())) {\n return true;\n }\n } else if (file.type === accepted) {\n // Exact MIME type match\n return true;\n }\n }\n\n return false;\n }\n\n /**\n * Read file as data URL\n */\n private readFileAsDataUrl(file: File): Promise<string | null> {\n return new Promise((resolve) => {\n const reader = new FileReader();\n reader.onload = () => resolve(reader.result as string);\n reader.onerror = () => resolve(null);\n reader.readAsDataURL(file);\n });\n }\n\n /**\n * Get image dimensions\n */\n private getImageDimensions(dataUrl: string): Promise<{ width: number; height: number }> {\n return new Promise((resolve) => {\n const img = new Image();\n img.onload = () => {\n resolve({ width: img.naturalWidth, height: img.naturalHeight });\n };\n img.onerror = () => {\n resolve({ width: 0, height: 0 });\n };\n img.src = dataUrl;\n });\n }\n\n /**\n * Generate unique attachment ID\n */\n private generateAttachmentId(): string {\n return `att_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n }\n\n /**\n * Remove a pending attachment by ID\n */\n public removeAttachment(id: string): void {\n const index = this.pendingAttachments.findIndex(a => a.id === id);\n if (index !== -1) {\n this.pendingAttachments.splice(index, 1);\n this.attachmentsChanged.emit([...this.pendingAttachments]);\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Get all pending attachments\n */\n public getPendingAttachments(): PendingAttachment[] {\n return [...this.pendingAttachments];\n }\n\n /**\n * Add an artifact as a pending attachment programmatically.\n * Used by the artifact picker to attach artifacts as conversation inputs.\n */\n public AddArtifactAttachment(artifact: {\n fileID: string; fileName: string; mimeType: string;\n sizeBytes: number; artifactVersionId?: string;\n }): void {\n const attachment: PendingAttachment = {\n id: crypto.randomUUID(),\n file: null,\n dataUrl: '',\n mimeType: artifact.mimeType,\n fileName: artifact.fileName,\n sizeBytes: artifact.sizeBytes,\n fileID: artifact.fileID,\n source: 'artifact',\n artifactVersionId: artifact.artifactVersionId\n };\n this.pendingAttachments.push(attachment);\n this.attachmentsChanged.emit([...this.pendingAttachments]);\n }\n\n /**\n * Clear all pending attachments\n */\n public clearPendingAttachments(): void {\n this.pendingAttachments = [];\n this.attachmentsChanged.emit([]);\n this.cdr.detectChanges();\n }\n\n /**\n * Handle click on an attachment thumbnail\n */\n public onAttachmentClick(attachment: PendingAttachment): void {\n this.attachmentClicked.emit(attachment);\n }\n\n /**\n * Check if there are any pending attachments\n */\n public hasAttachments(): boolean {\n return this.pendingAttachments.length > 0;\n }\n\n /**\n * Trigger file picker programmatically\n */\n public openFilePicker(): void {\n const input = document.createElement('input');\n input.type = 'file';\n // If */* is in the list, accept all files (some browsers don't handle */* correctly)\n input.accept = this.acceptedFileTypes.includes('*/*') ? '' : this.acceptedFileTypes;\n input.multiple = true;\n input.onchange = (e) => this.onFileSelected(e);\n input.click();\n }\n}\n","<div class=\"mention-editor-container\"\n [class.drag-over]=\"isDragOver\"\n (click)=\"onContainerClick($event)\"\n (dragover)=\"onDragOver($event)\"\n (dragleave)=\"onDragLeave($event)\"\n (drop)=\"onDrop($event)\">\n\n <!-- Pending Attachments Preview -->\n @if (pendingAttachments.length > 0) {\n <div class=\"pending-attachments\">\n @for (attachment of pendingAttachments; track attachment) {\n <div class=\"attachment-thumbnail\"\n (click)=\"onAttachmentClick(attachment)\">\n @if (attachment.thumbnailUrl) {\n <img\n [src]=\"attachment.thumbnailUrl\"\n [alt]=\"attachment.fileName\"\n class=\"thumbnail-image\">\n }\n @if (!attachment.thumbnailUrl) {\n <div class=\"thumbnail-placeholder\">\n <i class=\"fa-solid fa-file\"></i>\n <span class=\"file-name\">{{ attachment.fileName }}</span>\n </div>\n }\n <button class=\"remove-attachment\"\n (click)=\"removeAttachment(attachment.id); $event.stopPropagation()\"\n title=\"Remove attachment\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n }\n </div>\n }\n\n <div\n #editor\n class=\"mention-editor\"\n contenteditable=\"true\"\n [attr.contenteditable]=\"!disabled\"\n [attr.data-placeholder]=\"placeholder\"\n (input)=\"onInput()\"\n (keydown)=\"onKeyDown($event)\"\n (blur)=\"onBlur()\"\n (paste)=\"onPaste($event)\"\n ></div>\n\n <!-- Drag & Drop Overlay -->\n @if (isDragOver) {\n <div class=\"drop-overlay\">\n <div class=\"drop-message\">\n <i class=\"fa-solid fa-cloud-arrow-up\"></i>\n <span>Drop files here</span>\n </div>\n </div>\n }\n\n <!-- Mention Dropdown -->\n @if (showMentionDropdown && enableMentions) {\n <mj-mention-dropdown\n [suggestions]=\"mentionSuggestions\"\n [position]=\"mentionDropdownPosition\"\n [showAbove]=\"mentionDropdownShowAbove\"\n [useFixedPositioning]=\"true\"\n [visible]=\"true\"\n (suggestionSelected)=\"onMentionSelected($event)\"\n (closed)=\"closeMentionDropdown()\">\n </mj-mention-dropdown>\n }\n</div>\n"]}
1
+ {"version":3,"file":"mention-editor.component.js","sourceRoot":"","sources":["../../../../src/lib/components/mention/mention-editor.component.ts","../../../../src/lib/components/mention/mention-editor.component.html"],"names":[],"mappings":"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","sourcesContent":["import {\n Component,\n Input,\n Output,\n EventEmitter,\n ViewChild,\n ElementRef,\n AfterViewInit,\n forwardRef,\n OnInit,\n ViewEncapsulation,\n ChangeDetectorRef\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { MentionAutocompleteService, MentionSuggestion } from '../../services/mention-autocomplete.service';\nimport { UserInfo } from '@memberjunction/core';\nimport { AIEngineBase } from '@memberjunction/ai-engine-base';\nimport { MJAIAgentConfigurationEntity } from '@memberjunction/core-entities';\nimport { ChatMessageContentBlock } from '@memberjunction/ai';\nimport { UUIDsEqual } from '@memberjunction/global';\n\n/**\n * Represents a pending attachment that hasn't been uploaded yet\n */\nexport interface PendingAttachment {\n /** Local ID for tracking */\n id: string;\n /** Original File object (null for artifact references) */\n file: File | null;\n /** Base64 data URL for display */\n dataUrl: string;\n /** MIME type */\n mimeType: string;\n /** Original filename */\n fileName: string;\n /** File size in bytes */\n sizeBytes: number;\n /** Width in pixels (for images) */\n width?: number;\n /** Height in pixels (for images) */\n height?: number;\n /** Small thumbnail URL for preview */\n thumbnailUrl?: string;\n /** MJStorage File ID (for artifact references, mutually exclusive with inline data) */\n fileID?: string;\n /** Source of the attachment */\n source?: 'upload' | 'artifact';\n /** Artifact Version ID (for artifact references, used to create ConversationDetailArtifact) */\n artifactVersionId?: string;\n}\n\n/**\n * ContentEditable-based mention editor with visual chips/pills\n * Provides Slack/Teams-style mention UX with immutable mention tokens\n */\n@Component({\n standalone: false,\n selector: 'mj-mention-editor',\n templateUrl: './mention-editor.component.html',\n styleUrls: ['./mention-editor.component.css'],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => MentionEditorComponent),\n multi: true\n }\n ]\n})\nexport class MentionEditorComponent implements OnInit, AfterViewInit, ControlValueAccessor {\n @ViewChild('editor', { static: false }) editorRef!: ElementRef<HTMLDivElement>;\n\n @Input() placeholder: string = 'Type @ to mention agents or users...';\n @Input() disabled: boolean = false;\n @Input() currentUser?: UserInfo;\n @Input() enableMentions: boolean = true;\n\n // Attachment settings\n @Input() enableAttachments: boolean = true;\n @Input() maxAttachments: number = 10;\n @Input() maxAttachmentSizeBytes: number = 20 * 1024 * 1024; // 20MB default\n @Input() acceptedFileTypes: string = 'image/*'; // MIME types to accept\n\n @Output() valueChange = new EventEmitter<string>();\n @Output() mentionSelected = new EventEmitter<MentionSuggestion>();\n @Output() enterPressed = new EventEmitter<string>();\n @Output() attachmentsChanged = new EventEmitter<PendingAttachment[]>();\n @Output() attachmentError = new EventEmitter<string>();\n @Output() attachmentClicked = new EventEmitter<PendingAttachment>();\n\n // Pending attachments state\n public pendingAttachments: PendingAttachment[] = [];\n public isDragOver: boolean = false;\n\n // Mention dropdown state\n public showMentionDropdown: boolean = false;\n public mentionSuggestions: MentionSuggestion[] = [];\n public mentionDropdownPosition: { top: number; left: number } = { top: 0, left: 0 };\n public mentionDropdownShowAbove: boolean = false;\n\n private mentionStartIndex: number = -1;\n private mentionQuery: string = '';\n private onChange: (value: string) => void = () => {};\n public onTouched: () => void = () => {};\n\n constructor(\n private mentionAutocomplete: MentionAutocompleteService,\n private cdr: ChangeDetectorRef\n ) {}\n\n async ngOnInit(): Promise<void> {\n if (this.enableMentions && this.currentUser) {\n await this.mentionAutocomplete.initialize(this.currentUser);\n }\n }\n\n ngAfterViewInit(): void {\n // Auto-focus the editor\n setTimeout(() => {\n this.editorRef?.nativeElement?.focus();\n }, 100);\n }\n\n /**\n * Handle clicks on the container - focus the editor if clicking outside the contentEditable\n */\n onContainerClick(event: MouseEvent): void {\n const target = event.target as HTMLElement;\n const editor = this.editorRef?.nativeElement;\n\n // Don't handle clicks on the dropdown or its children\n if (target.closest('mj-mention-dropdown')) {\n return;\n }\n\n // If clicking on container or any element that's not the editor itself, focus the editor\n if (target !== editor && !editor?.contains(target)) {\n editor?.focus();\n\n // Move cursor to end of content\n const selection = window.getSelection();\n const range = document.createRange();\n\n if (editor && selection) {\n range.selectNodeContents(editor);\n range.collapse(false); // Collapse to end\n selection.removeAllRanges();\n selection.addRange(range);\n }\n }\n }\n\n /**\n * Handle input changes in contentEditable\n */\n onInput(): void {\n const plainText = this.getPlainText();\n this.onChange(plainText);\n this.valueChange.emit(plainText);\n\n // Handle @mention autocomplete\n if (this.enableMentions && this.currentUser) {\n this.handleMentionInput();\n }\n }\n\n /**\n * Handle blur event - close dropdown when editor loses focus\n */\n onBlur(): void {\n // Call form control touched callback\n this.onTouched();\n\n // Close dropdown when editor loses focus\n // Use setTimeout to allow mousedown events on dropdown to fire first\n setTimeout(() => {\n if (this.showMentionDropdown) {\n this.closeMentionDropdown();\n }\n }, 200);\n }\n\n /**\n * Handle paste event - images or plain text\n */\n onPaste(event: ClipboardEvent): void {\n // Check for image data in clipboard\n if (this.enableAttachments && event.clipboardData?.items) {\n const items = Array.from(event.clipboardData.items);\n const imageItems = items.filter(item => item.type.startsWith('image/'));\n\n if (imageItems.length > 0) {\n event.preventDefault();\n\n // Process each image\n for (const item of imageItems) {\n const file = item.getAsFile();\n if (file) {\n this.processFile(file);\n }\n }\n return;\n }\n }\n\n // No images - handle as plain text\n event.preventDefault();\n\n // Get plain text from clipboard\n const text = event.clipboardData?.getData('text/plain') || '';\n\n if (!text) return;\n\n // Insert plain text at cursor position\n const selection = window.getSelection();\n if (!selection || selection.rangeCount === 0) return;\n\n const range = selection.getRangeAt(0);\n range.deleteContents();\n\n // Insert text as text node (not HTML)\n const textNode = document.createTextNode(text);\n range.insertNode(textNode);\n\n // Move cursor to end of inserted text\n range.setStartAfter(textNode);\n range.collapse(true);\n selection.removeAllRanges();\n selection.addRange(range);\n\n // Trigger input event to update model\n this.onInput();\n }\n\n /**\n * Handle keydown events\n */\n onKeyDown(event: KeyboardEvent): void {\n // Enter alone: Send message (if dropdown not showing)\n if (event.key === 'Enter' && !event.shiftKey && !this.showMentionDropdown) {\n event.preventDefault();\n const plainText = this.getPlainText();\n this.enterPressed.emit(plainText);\n return;\n }\n\n // Backspace: Check if deleting a mention chip\n if (event.key === 'Backspace') {\n this.handleBackspace(event);\n }\n\n // Handle mention dropdown navigation\n if (this.showMentionDropdown) {\n // Let the dropdown handle arrow keys, enter, escape\n // (We'll pass these through to mention-dropdown component)\n }\n }\n\n /**\n * Handle @mention input detection\n */\n private handleMentionInput(): void {\n const selection = window.getSelection();\n if (!selection || selection.rangeCount === 0) return;\n\n const range = selection.getRangeAt(0);\n const textBeforeCursor = this.getTextBeforeCursor(range);\n\n // Find the last @ before cursor\n const lastAtIndex = textBeforeCursor.lastIndexOf('@');\n\n if (lastAtIndex === -1) {\n this.closeMentionDropdown();\n return;\n }\n\n // Check if there's a space between @ and cursor (means mention was completed)\n const textAfterAt = textBeforeCursor.substring(lastAtIndex + 1);\n if (textAfterAt.includes(' ')) {\n this.closeMentionDropdown();\n return;\n }\n\n // Extract query\n this.mentionQuery = textAfterAt;\n this.mentionStartIndex = lastAtIndex;\n\n // Get suggestions\n this.mentionSuggestions = this.mentionAutocomplete.getSuggestions(this.mentionQuery, !!this.currentUser);\n\n if (this.mentionSuggestions.length > 0) {\n this.showMentionDropdown = true;\n this.positionMentionDropdown();\n } else {\n this.closeMentionDropdown();\n }\n }\n\n /**\n * Get text before cursor position\n */\n private getTextBeforeCursor(range: Range): string {\n const tempRange = range.cloneRange();\n tempRange.selectNodeContents(this.editorRef.nativeElement);\n tempRange.setEnd(range.startContainer, range.startOffset);\n return tempRange.toString();\n }\n\n /**\n * Position the mention dropdown\n */\n private positionMentionDropdown(): void {\n const editor = this.editorRef?.nativeElement;\n if (!editor) return;\n\n // Get the parent container (message-input-box-container) for alignment\n const container = editor.closest('.message-input-box-container');\n const containerRect = container?.getBoundingClientRect();\n\n const selection = window.getSelection();\n if (!selection || selection.rangeCount === 0) return;\n\n const range = selection.getRangeAt(0);\n const cursorRect = range.getBoundingClientRect();\n\n // Check space below vs above\n const spaceBelow = window.innerHeight - cursorRect.bottom;\n const spaceAbove = cursorRect.top;\n const dropdownHeight = Math.min(this.mentionSuggestions.length * 56, 300);\n\n this.mentionDropdownShowAbove = spaceBelow < dropdownHeight && spaceAbove > spaceBelow;\n\n if (this.mentionDropdownShowAbove) {\n // Position above, aligning with container top if possible\n this.mentionDropdownPosition = {\n top: containerRect ? containerRect.top + window.scrollY : cursorRect.top + window.scrollY - 4,\n left: cursorRect.left + window.scrollX\n };\n } else {\n // Position below cursor, but align bottom edge with container top\n this.mentionDropdownPosition = {\n top: containerRect ? containerRect.top + window.scrollY : cursorRect.bottom + window.scrollY + 4,\n left: cursorRect.left + window.scrollX\n };\n }\n }\n\n /**\n * Handle mention selection from dropdown\n */\n onMentionSelected(suggestion: MentionSuggestion): void {\n this.insertMentionChip(suggestion);\n this.closeMentionDropdown();\n this.mentionSelected.emit(suggestion);\n\n // Refocus the editor after selection\n setTimeout(() => {\n this.editorRef?.nativeElement?.focus();\n }, 50);\n }\n\n /**\n * Insert a mention chip at the current cursor position\n */\n private insertMentionChip(suggestion: MentionSuggestion): void {\n const selection = window.getSelection();\n if (!selection || selection.rangeCount === 0) return;\n\n const range = selection.getRangeAt(0);\n\n // Delete the @query text\n const textBeforeCursor = this.getTextBeforeCursor(range);\n const lastAtIndex = textBeforeCursor.lastIndexOf('@');\n const deleteLength = textBeforeCursor.length - lastAtIndex;\n\n range.setStart(range.startContainer, range.startOffset - deleteLength);\n range.deleteContents();\n\n // Create mention chip element\n const chip = this.createMentionChip(suggestion);\n\n // Insert chip\n range.insertNode(chip);\n\n // Add space after chip\n const space = document.createTextNode(' ');\n range.collapse(false);\n range.insertNode(space);\n\n // Move cursor after the space\n range.setStartAfter(space);\n range.collapse(true);\n selection.removeAllRanges();\n selection.addRange(range);\n\n // Trigger change detection\n this.onInput();\n }\n\n /**\n * Create a mention chip DOM element\n */\n private createMentionChip(suggestion: MentionSuggestion): HTMLSpanElement {\n const chip = document.createElement('span');\n chip.className = 'mention-chip';\n chip.contentEditable = 'false'; // Make chip non-editable\n chip.setAttribute('data-mention-id', suggestion.id);\n chip.setAttribute('data-mention-type', suggestion.type);\n chip.setAttribute('data-mention-name', suggestion.name);\n\n // For agents, get configuration presets (AIEngine.Config() already called during app init)\n let presets: MJAIAgentConfigurationEntity[] = [];\n if (suggestion.type === 'agent') {\n presets = AIEngineBase.Instance.GetAgentConfigurationPresets(suggestion.id, true);\n\n // Store default preset\n // IMPORTANT: Store the AIAgentConfiguration.ID (preset ID), not AIConfigurationID\n // The backend mapping will convert preset ID -> AIConfigurationID\n const defaultPreset = presets.find(p => p.IsDefault) || presets[0];\n if (defaultPreset) {\n chip.setAttribute('data-preset-id', defaultPreset.ID || '');\n chip.setAttribute('data-preset-name', defaultPreset.Name || '');\n }\n }\n\n // Apply inline styles directly\n const isUser = suggestion.type === 'user';\n chip.style.cssText = `\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 4px 12px;\n margin: 0 3px;\n border-radius: 16px;\n font-size: 13px;\n font-weight: 600;\n cursor: default;\n user-select: none;\n vertical-align: middle;\n white-space: nowrap;\n pointer-events: all;\n background: ${isUser ? 'linear-gradient(135deg, #f093fb 0%, #f5576c 100%)' : 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)'};\n color: white;\n border: 2px solid ${isUser ? 'rgba(240, 147, 251, 0.4)' : 'rgba(102, 126, 234, 0.4)'};\n box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2), 0 1px 2px rgba(0, 0, 0, 0.1);\n `;\n\n // Add icon or image\n if (suggestion.type === 'agent' && suggestion.imageUrl) {\n // Use image if available (LogoURL from agent)\n const img = document.createElement('img');\n img.src = suggestion.imageUrl;\n img.alt = suggestion.displayName;\n img.style.cssText = 'width: 16px; height: 16px; border-radius: 50%; object-fit: cover;';\n chip.appendChild(img);\n } else if (suggestion.type === 'agent' && suggestion.icon === 'mj-icon-skip') {\n // Special handling for mj-icon-skip: use the SVG data URI as an image\n const img = document.createElement('img');\n img.src = \"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 101.89918457031249 96.83947368421053'%3E%3Cg transform='translate(-0.1288232421875,-0.0)'%3E%3Cpath d='M93.85,41.56c-.84,0-1.62.2-2.37.55-3-4.35-7.49-8.12-13.04-11.04l.04-7.18v-14.44h-10.24v17.6c-1.52-.43-3.07-.8-4.67-1.11V0h-10.24v24.72s-.09,0-.14,0h-4.38s-.1,0-.14,0V7.3h-10.24v18.62c-1.6.32-3.15.69-4.67,1.11v-11.67h-10.24v6.09l.04,9.6c-5.55,2.92-10.04,6.7-13.04,11.04-.75-.35-1.53-.55-2.37-.55-4.5,0-8.14,5.61-8.14,12.51s3.64,12.53,8.14,12.53c.58,0,1.14-.12,1.67-.29,4.1,6.62,11.54,12.06,20.98,15.28l.79.13v7.05c0,2.97,1.45,5.58,3.87,6.99,1.18.69,2.5,1.04,3.85,1.03,1.4,0,2.83-.37,4.15-1.12l7.54-4.29,7.56,4.3c1.31.74,2.73,1.12,4.13,1.12s2.67-.35,3.85-1.04c2.42-1.41,3.86-4.02,3.86-6.98v-7.05l.79-.13c9.44-3.22,16.89-8.66,20.98-15.28.54.17,1.09.29,1.68.29,4.5,0,8.14-5.61,8.14-12.53s-3.63-12.51-8.14-12.51' fill='%23AAAAAA'/%3E%3Cpath d='M86.69,50.87c0-12.22-13.6-19.1-28.94-20.66-4.48-.47-9.19-.54-13.52,0-15.34,1.53-28.93,8.41-28.93,20.66,0,8.55,5.7,15.55,12.68,15.55h7.94c3.05,2.5,6.93,4.1,11.08,4.71,2.65.4,5.44.46,8.01,0,4.15-.6,8.05-2.2,11.1-4.71h7.92c6.97,0,12.68-7,12.68-15.55' fill='white' opacity='0.9'/%3E%3Cpath d='M57.83,55.82c-1.19,2.58-3.8,4.35-6.84,4.35s-5.65-1.77-6.84-4.35h13.68Z' fill='%23AAAAAA'/%3E%3Cpath d='M32.52,41.14c1.74,0,3.18,2.13,3.18,4.76s-1.44,4.74-3.18,4.74-3.16-2.13-3.16-4.74,1.41-4.76,3.16-4.76' fill='%23AAAAAA'/%3E%3Cpath d='M69.46,41.14c1.74,0,3.16,2.13,3.16,4.76s-1.41,4.74-3.16,4.74-3.18-2.13-3.18-4.74,1.41-4.76,3.18-4.76' fill='%23AAAAAA'/%3E%3Cpath d='M63.91,76.15c-.82-.48-1.84-.43-2.8.12l-10.13,5.75-10.11-5.75c-.96-.55-1.98-.59-2.8-.12-.82.47-1.29,1.38-1.29,2.49v10.12c0,1.11.47,2.02,1.28,2.49.38.22.8.33,1.24.33.51,0,1.05-.15,1.57-.44l10.12-5.75,10.11,5.75c.52.29,1.05.44,1.56.44.44,0,.86-.11,1.24-.33.81-.48,1.28-1.38,1.28-2.49v-10.12c0-1.11-.47-2.02-1.28-2.49' fill='white' opacity='0.9'/%3E%3C/g%3E%3C/svg%3E\";\n img.alt = suggestion.displayName;\n img.style.cssText = 'width: 16px; height: 16px; border-radius: 50%; object-fit: cover;';\n chip.appendChild(img);\n } else {\n // Use icon for users or agents without images\n const icon = document.createElement('i');\n icon.style.cssText = 'font-size: 12px; opacity: 0.95;';\n if (suggestion.type === 'agent' && suggestion.icon) {\n icon.className = this.getIconClasses(suggestion.icon);\n } else if (suggestion.type === 'user') {\n icon.className = 'fa-solid fa-user';\n } else {\n icon.className = 'fa-solid fa-robot';\n }\n chip.appendChild(icon);\n }\n\n // Add space between icon/image and text\n const space = document.createTextNode(' ');\n chip.appendChild(space);\n\n // Add text\n const text = document.createTextNode(suggestion.displayName);\n chip.appendChild(text);\n\n // Add dropdown if 2+ presets for agents\n if (suggestion.type === 'agent' && presets.length >= 2) {\n this.addConfigurationDropdown(chip, presets);\n }\n\n return chip;\n }\n\n /**\n * Add configuration preset dropdown to agent chip\n */\n private addConfigurationDropdown(chip: HTMLSpanElement, presets: MJAIAgentConfigurationEntity[]): void {\n // Store default preset for comparison\n const defaultPreset = presets.find(p => p.IsDefault) || presets[0];\n\n // Add preset indicator text (only shown when non-default selected)\n const presetIndicator = document.createElement('span');\n presetIndicator.className = 'preset-indicator';\n presetIndicator.style.cssText = `\n display: none;\n font-size: 10px;\n font-weight: 600;\n font-family: 'SF Mono', 'Monaco', 'Inconsolata', 'Roboto Mono', 'Courier New', monospace;\n background: rgba(255, 255, 255, 0.25);\n padding: 2px 6px;\n border-radius: 4px;\n margin-left: 4px;\n letter-spacing: 0.3px;\n text-transform: uppercase;\n border: 1px solid rgba(255, 255, 255, 0.15);\n `;\n chip.appendChild(presetIndicator);\n\n // Add dropdown chevron button\n const chevron = document.createElement('i');\n chevron.className = 'fa-solid fa-chevron-down';\n chevron.style.cssText = `\n font-size: 10px;\n opacity: 0.9;\n cursor: pointer;\n padding: 2px;\n `;\n chip.appendChild(chevron);\n\n // Create dropdown menu (initially hidden) - append to body for global positioning\n const dropdown = document.createElement('div');\n dropdown.className = 'preset-dropdown';\n dropdown.style.cssText = `\n display: none;\n position: fixed;\n background: white;\n border: 1px solid #ddd;\n border-radius: 8px;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n min-width: 200px;\n max-width: 300px;\n z-index: 10000;\n overflow: hidden;\n `;\n\n // Add preset options to dropdown\n presets.forEach(preset => {\n const option = document.createElement('div');\n option.className = 'preset-option';\n option.style.cssText = `\n padding: 10px 12px;\n cursor: pointer;\n display: flex;\n align-items: center;\n gap: 8px;\n transition: background 0.2s;\n `;\n\n // Check if this is the selected preset\n const currentPresetId = chip.getAttribute('data-preset-id');\n const isSelected = UUIDsEqual(preset.ID, currentPresetId);\n\n // Add checkmark for selected option\n const checkmark = document.createElement('i');\n checkmark.className = 'fa-solid fa-check';\n checkmark.style.cssText = `\n font-size: 12px;\n color: #667eea;\n opacity: ${isSelected ? '1' : '0'};\n width: 14px;\n `;\n option.appendChild(checkmark);\n\n // Add preset text content\n const textContainer = document.createElement('div');\n textContainer.style.cssText = 'flex: 1;';\n\n const displayName = document.createElement('div');\n displayName.textContent = preset.DisplayName || preset.Name;\n displayName.style.cssText = `\n font-weight: 600;\n color: #333;\n font-size: 13px;\n `;\n textContainer.appendChild(displayName);\n\n if (preset.Description) {\n const description = document.createElement('div');\n description.textContent = preset.Description;\n description.style.cssText = `\n font-size: 11px;\n color: #666;\n margin-top: 2px;\n `;\n textContainer.appendChild(description);\n }\n\n option.appendChild(textContainer);\n\n // Hover effects\n option.addEventListener('mouseenter', () => {\n option.style.background = '#f5f5f5';\n });\n option.addEventListener('mouseleave', () => {\n option.style.background = 'white';\n });\n\n // Click handler to select preset\n option.addEventListener('click', (e) => {\n e.stopPropagation();\n\n // Update chip data attributes\n // IMPORTANT: Store preset.ID (AIAgentConfiguration.ID), not AIConfigurationID\n chip.setAttribute('data-preset-id', preset.ID || '');\n chip.setAttribute('data-preset-name', preset.Name || '');\n\n // Update preset indicator visibility and text\n const isDefault = UUIDsEqual(preset.ID, defaultPreset.ID);\n if (isDefault) {\n presetIndicator.style.display = 'none';\n } else {\n presetIndicator.style.display = 'inline';\n presetIndicator.textContent = preset.DisplayName || preset.Name;\n }\n\n // Update checkmarks\n dropdown.querySelectorAll('.preset-option').forEach((opt, idx) => {\n const check = opt.querySelector('i.fa-check') as HTMLElement;\n if (check) {\n check.style.opacity = idx === presets.indexOf(preset) ? '1' : '0';\n }\n });\n\n // Close dropdown\n dropdown.style.display = 'none';\n });\n\n dropdown.appendChild(option);\n });\n\n // Append dropdown to document body for global positioning\n document.body.appendChild(dropdown);\n\n // Helper function to position dropdown relative to chip\n const positionDropdown = () => {\n const chipRect = chip.getBoundingClientRect();\n const viewportHeight = window.innerHeight;\n const spaceBelow = viewportHeight - chipRect.bottom;\n\n // Set left position (same for both above/below)\n dropdown.style.left = `${chipRect.left}px`;\n\n // First, show dropdown to measure its actual height\n const wasHidden = dropdown.style.display === 'none';\n if (wasHidden) {\n dropdown.style.visibility = 'hidden';\n dropdown.style.display = 'block';\n }\n\n const dropdownHeight = dropdown.offsetHeight;\n const spaceAbove = chipRect.top;\n\n // Position dropdown above chip if not enough space below\n if (spaceBelow < dropdownHeight && spaceAbove > spaceBelow) {\n // Show above - position so bottom of dropdown is 4px above top of chip\n dropdown.style.top = `${chipRect.top - dropdownHeight - 4}px`;\n } else {\n // Show below (default) - position 4px below bottom of chip\n dropdown.style.top = `${chipRect.bottom + 4}px`;\n }\n\n // Restore visibility\n if (wasHidden) {\n dropdown.style.visibility = 'visible';\n }\n };\n\n // Toggle dropdown on chevron click\n chevron.addEventListener('click', (e) => {\n e.stopPropagation();\n const isVisible = dropdown.style.display === 'block';\n\n if (isVisible) {\n dropdown.style.display = 'none';\n } else {\n positionDropdown();\n dropdown.style.display = 'block';\n }\n });\n\n // Close dropdown when clicking outside\n const closeDropdown = (e: MouseEvent) => {\n if (!dropdown.contains(e.target as Node) && !chip.contains(e.target as Node)) {\n dropdown.style.display = 'none';\n }\n };\n document.addEventListener('click', closeDropdown);\n\n // Cleanup: remove dropdown from body and event listeners when chip is removed\n const observer = new MutationObserver((mutations) => {\n mutations.forEach((mutation) => {\n mutation.removedNodes.forEach((node) => {\n if (node === chip) {\n document.removeEventListener('click', closeDropdown);\n if (dropdown.parentNode) {\n dropdown.parentNode.removeChild(dropdown);\n }\n observer.disconnect();\n }\n });\n });\n });\n if (chip.parentNode) {\n observer.observe(chip.parentNode, { childList: true });\n }\n }\n\n /**\n * Get icon classes with proper FA prefix\n */\n private getIconClasses(iconClass: string): string {\n if (!iconClass) return 'fa-solid fa-robot';\n if (iconClass.includes('fa-')) {\n if (iconClass.match(/\\b(fa-solid|fa-regular|fa-light|fa-brands)\\b/)) {\n return iconClass;\n }\n return `fa-solid ${iconClass}`;\n }\n return iconClass;\n }\n\n /**\n * Handle backspace key - delete entire chip if cursor is right after one\n */\n private handleBackspace(event: KeyboardEvent): void {\n const selection = window.getSelection();\n if (!selection || selection.rangeCount === 0) return;\n\n const range = selection.getRangeAt(0);\n\n // Check if cursor is right after a mention chip\n if (range.collapsed && range.startOffset > 0) {\n const prevNode = range.startContainer.childNodes[range.startOffset - 1];\n\n if (prevNode && (prevNode as HTMLElement).classList?.contains('mention-chip')) {\n event.preventDefault();\n prevNode.remove();\n this.onInput();\n }\n }\n }\n\n /**\n * Close mention dropdown\n */\n closeMentionDropdown(): void {\n this.showMentionDropdown = false;\n this.mentionSuggestions = [];\n this.mentionStartIndex = -1;\n this.mentionQuery = '';\n }\n\n /**\n * Convert editor HTML to plain text with @mentions\n */\n private getPlainText(): string {\n const editor = this.editorRef?.nativeElement;\n if (!editor) return '';\n\n let text = '';\n const nodes = editor.childNodes;\n\n for (let i = 0; i < nodes.length; i++) {\n const node = nodes[i];\n\n if (node.nodeType === Node.TEXT_NODE) {\n text += node.textContent || '';\n } else if (node.nodeType === Node.ELEMENT_NODE) {\n const element = node as HTMLElement;\n\n if (element.classList.contains('mention-chip')) {\n const name = element.getAttribute('data-mention-name') || '';\n // Use quoted format if name has spaces\n text += name.includes(' ') ? `@\"${name}\"` : `@${name}`;\n } else if (element.tagName === 'BR') {\n text += '\\n';\n } else if (element.tagName === 'DIV') {\n // Handle line breaks from contentEditable\n if (i > 0) text += '\\n';\n text += this.getNodeText(element);\n } else {\n text += element.textContent || '';\n }\n }\n }\n\n return text;\n }\n\n /**\n * Get text from a node recursively\n */\n private getNodeText(node: Node): string {\n let text = '';\n const children = node.childNodes;\n\n for (let i = 0; i < children.length; i++) {\n const child = children[i];\n\n if (child.nodeType === Node.TEXT_NODE) {\n text += child.textContent || '';\n } else if (child.nodeType === Node.ELEMENT_NODE) {\n const element = child as HTMLElement;\n\n if (element.classList.contains('mention-chip')) {\n const name = element.getAttribute('data-mention-name') || '';\n text += name.includes(' ') ? `@\"${name}\"` : `@${name}`;\n } else {\n text += this.getNodeText(element);\n }\n }\n }\n\n return text;\n }\n\n /**\n * Set editor content from plain text (for programmatic updates)\n */\n private setEditorContent(text: string): void {\n const editor = this.editorRef?.nativeElement;\n if (!editor) return;\n\n // For now, just set as plain text\n // TODO: Parse @mentions and render as chips\n editor.textContent = text;\n }\n\n // ControlValueAccessor implementation\n writeValue(value: string): void {\n if (value) {\n this.setEditorContent(value);\n } else if (this.editorRef?.nativeElement) {\n this.editorRef.nativeElement.textContent = '';\n }\n }\n\n registerOnChange(fn: (value: string) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.disabled = isDisabled;\n if (this.editorRef?.nativeElement) {\n this.editorRef.nativeElement.contentEditable = (!isDisabled).toString();\n }\n }\n\n /**\n * Focus the editor\n */\n public focus(): void {\n this.editorRef?.nativeElement?.focus();\n }\n\n /**\n * Clear the editor content and pending attachments\n */\n public clear(): void {\n if (this.editorRef?.nativeElement) {\n this.editorRef.nativeElement.textContent = '';\n this.onInput();\n }\n this.clearPendingAttachments();\n }\n\n /**\n * Extract mention chips with their configuration data\n * Returns array of objects containing mention info and preset configuration\n */\n public getMentionChipsData(): Array<{ id: string; type: string; name: string; presetId?: string; presetName?: string }> {\n const editor = this.editorRef?.nativeElement;\n if (!editor) return [];\n\n const chips: Array<{ id: string; type: string; name: string; presetId?: string; presetName?: string }> = [];\n const mentionElements = editor.querySelectorAll('.mention-chip');\n\n mentionElements.forEach(chip => {\n const element = chip as HTMLElement;\n const id = element.getAttribute('data-mention-id') || '';\n const type = element.getAttribute('data-mention-type') || '';\n const name = element.getAttribute('data-mention-name') || '';\n const presetId = element.getAttribute('data-preset-id') || undefined;\n const presetName = element.getAttribute('data-preset-name') || undefined;\n\n chips.push({\n id,\n type,\n name,\n ...(presetId ? { presetId } : {}),\n ...(presetName ? { presetName } : {})\n });\n });\n\n return chips;\n }\n\n /**\n * Get the plain text value with mentions encoded as JSON\n * This format preserves configuration information when messages are saved\n * Format: @{type:\"agent\",id:\"uuid\",name:\"Agent Name\",configId:\"uuid\",config:\"High\"}\n */\n public getPlainTextWithJsonMentions(): string {\n const editor = this.editorRef?.nativeElement;\n if (!editor) return '';\n\n let plainText = '';\n const childNodes = Array.from(editor.childNodes);\n\n for (const node of childNodes) {\n if (node.nodeType === Node.TEXT_NODE) {\n // Regular text node\n plainText += node.textContent || '';\n } else if (node.nodeType === Node.ELEMENT_NODE) {\n const element = node as HTMLElement;\n\n if (element.classList.contains('mention-chip')) {\n // Extract mention data attributes\n const type = element.getAttribute('data-mention-type') || '';\n const id = element.getAttribute('data-mention-id') || '';\n const name = element.getAttribute('data-mention-name') || '';\n const presetId = element.getAttribute('data-preset-id');\n const presetName = element.getAttribute('data-preset-name');\n\n // Build JSON mention object (compact format - no spaces)\n const mentionObj: Record<string, string> = {\n type,\n id,\n name\n };\n\n // Add configuration fields if present (for agents with non-default presets)\n if (presetId) {\n mentionObj.configId = presetId;\n }\n if (presetName) {\n mentionObj.config = presetName;\n }\n\n // Encode as JSON mention\n // Don't remove spaces from the JSON string - spaces in values (like agent names) need to be preserved\n plainText += `@${JSON.stringify(mentionObj)}`;\n } else {\n // Other HTML element (e.g., <br>)\n if (element.tagName === 'BR') {\n plainText += '\\n';\n } else {\n plainText += element.textContent || '';\n }\n }\n }\n }\n\n return plainText;\n }\n\n // ==================== Attachment Handling Methods ====================\n\n /**\n * Handle drag over event\n */\n onDragOver(event: DragEvent): void {\n if (!this.enableAttachments) return;\n\n event.preventDefault();\n event.stopPropagation();\n this.isDragOver = true;\n }\n\n /**\n * Handle drag leave event\n */\n onDragLeave(event: DragEvent): void {\n event.preventDefault();\n event.stopPropagation();\n this.isDragOver = false;\n }\n\n /**\n * Handle drop event\n */\n onDrop(event: DragEvent): void {\n if (!this.enableAttachments) return;\n\n event.preventDefault();\n event.stopPropagation();\n this.isDragOver = false;\n\n if (event.dataTransfer?.files) {\n const files = Array.from(event.dataTransfer.files);\n for (const file of files) {\n if (this.isAcceptedFile(file)) {\n this.processFile(file);\n }\n }\n }\n }\n\n /**\n * Handle file input change (from file picker)\n */\n onFileSelected(event: Event): void {\n const input = event.target as HTMLInputElement;\n if (input.files) {\n const files = Array.from(input.files);\n for (const file of files) {\n this.processFile(file);\n }\n // Reset input so same file can be selected again\n input.value = '';\n }\n }\n\n /**\n * Process a file for attachment\n */\n private async processFile(file: File): Promise<void> {\n // Validate file\n const validation = this.validateFile(file);\n if (!validation.valid) {\n this.attachmentError.emit(validation.error!);\n return;\n }\n\n // Read file as data URL\n const dataUrl = await this.readFileAsDataUrl(file);\n if (!dataUrl) {\n this.attachmentError.emit('Failed to read file');\n return;\n }\n\n // Get image dimensions if applicable\n let width: number | undefined;\n let height: number | undefined;\n\n if (file.type.startsWith('image/')) {\n const dimensions = await this.getImageDimensions(dataUrl);\n width = dimensions.width;\n height = dimensions.height;\n }\n\n // Create pending attachment\n const attachment: PendingAttachment = {\n id: this.generateAttachmentId(),\n file,\n dataUrl,\n mimeType: file.type,\n fileName: file.name,\n sizeBytes: file.size,\n width,\n height,\n thumbnailUrl: file.type.startsWith('image/') ? dataUrl : undefined\n };\n\n // Add to pending attachments\n this.pendingAttachments.push(attachment);\n this.attachmentsChanged.emit([...this.pendingAttachments]);\n this.cdr.detectChanges();\n }\n\n /**\n * Validate a file against settings\n */\n private validateFile(file: File): { valid: boolean; error?: string } {\n // Check count limit\n if (this.pendingAttachments.length >= this.maxAttachments) {\n return {\n valid: false,\n error: `Maximum ${this.maxAttachments} attachments allowed`\n };\n }\n\n // Check size limit\n if (file.size > this.maxAttachmentSizeBytes) {\n const maxMB = (this.maxAttachmentSizeBytes / (1024 * 1024)).toFixed(1);\n const fileMB = (file.size / (1024 * 1024)).toFixed(1);\n return {\n valid: false,\n error: `File size (${fileMB}MB) exceeds maximum (${maxMB}MB)`\n };\n }\n\n // Check file type\n if (!this.isAcceptedFile(file)) {\n return {\n valid: false,\n error: `File type ${file.type || 'unknown'} not accepted`\n };\n }\n\n return { valid: true };\n }\n\n /**\n * Check if file type is accepted\n */\n private isAcceptedFile(file: File): boolean {\n if (this.acceptedFileTypes === '*' || this.acceptedFileTypes === '*/*') {\n return true;\n }\n\n const acceptedTypes = this.acceptedFileTypes.split(',').map(t => t.trim());\n\n for (const accepted of acceptedTypes) {\n // Handle universal wildcard */* anywhere in the list\n if (accepted === '*/*') {\n return true;\n }\n // Handle wildcard MIME types like \"image/*\"\n if (accepted.endsWith('/*')) {\n const category = accepted.slice(0, -2);\n if (file.type.startsWith(category + '/')) {\n return true;\n }\n } else if (accepted.startsWith('.')) {\n // Handle file extensions like \".png\"\n if (file.name.toLowerCase().endsWith(accepted.toLowerCase())) {\n return true;\n }\n } else if (file.type === accepted) {\n // Exact MIME type match\n return true;\n }\n }\n\n return false;\n }\n\n /**\n * Read file as data URL\n */\n private readFileAsDataUrl(file: File): Promise<string | null> {\n return new Promise((resolve) => {\n const reader = new FileReader();\n reader.onload = () => resolve(reader.result as string);\n reader.onerror = () => resolve(null);\n reader.readAsDataURL(file);\n });\n }\n\n /**\n * Get image dimensions\n */\n private getImageDimensions(dataUrl: string): Promise<{ width: number; height: number }> {\n return new Promise((resolve) => {\n const img = new Image();\n img.onload = () => {\n resolve({ width: img.naturalWidth, height: img.naturalHeight });\n };\n img.onerror = () => {\n resolve({ width: 0, height: 0 });\n };\n img.src = dataUrl;\n });\n }\n\n /**\n * Generate unique attachment ID\n */\n private generateAttachmentId(): string {\n return `att_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n }\n\n /**\n * Remove a pending attachment by ID\n */\n public removeAttachment(id: string): void {\n const index = this.pendingAttachments.findIndex(a => a.id === id);\n if (index !== -1) {\n this.pendingAttachments.splice(index, 1);\n this.attachmentsChanged.emit([...this.pendingAttachments]);\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Get all pending attachments\n */\n public getPendingAttachments(): PendingAttachment[] {\n return [...this.pendingAttachments];\n }\n\n /**\n * Add an artifact as a pending attachment programmatically.\n * Used by the artifact picker to attach artifacts as conversation inputs.\n */\n public AddArtifactAttachment(artifact: {\n fileID: string; fileName: string; mimeType: string;\n sizeBytes: number; artifactVersionId?: string;\n }): PendingAttachment {\n const attachment: PendingAttachment = {\n id: crypto.randomUUID(),\n file: null,\n dataUrl: '',\n mimeType: artifact.mimeType,\n fileName: artifact.fileName,\n sizeBytes: artifact.sizeBytes,\n fileID: artifact.fileID,\n source: 'artifact',\n artifactVersionId: artifact.artifactVersionId\n };\n this.pendingAttachments.push(attachment);\n this.attachmentsChanged.emit([...this.pendingAttachments]);\n return attachment;\n }\n\n /**\n * Clear all pending attachments\n */\n public clearPendingAttachments(): void {\n this.pendingAttachments = [];\n this.attachmentsChanged.emit([]);\n this.cdr.detectChanges();\n }\n\n /**\n * Handle click on an attachment thumbnail\n */\n public onAttachmentClick(attachment: PendingAttachment): void {\n this.attachmentClicked.emit(attachment);\n }\n\n /**\n * Check if there are any pending attachments\n */\n public hasAttachments(): boolean {\n return this.pendingAttachments.length > 0;\n }\n\n /**\n * Trigger file picker programmatically\n */\n public openFilePicker(): void {\n const input = document.createElement('input');\n input.type = 'file';\n // If */* is in the list, accept all files (some browsers don't handle */* correctly)\n input.accept = this.acceptedFileTypes.includes('*/*') ? '' : this.acceptedFileTypes;\n input.multiple = true;\n input.onchange = (e) => this.onFileSelected(e);\n input.click();\n }\n}\n","<div class=\"mention-editor-container\"\n [class.drag-over]=\"isDragOver\"\n (click)=\"onContainerClick($event)\"\n (dragover)=\"onDragOver($event)\"\n (dragleave)=\"onDragLeave($event)\"\n (drop)=\"onDrop($event)\">\n\n <!-- Pending Attachments Preview -->\n @if (pendingAttachments.length > 0) {\n <div class=\"pending-attachments\">\n @for (attachment of pendingAttachments; track attachment) {\n <div class=\"attachment-thumbnail\"\n (click)=\"onAttachmentClick(attachment)\">\n @if (attachment.thumbnailUrl) {\n <img\n [src]=\"attachment.thumbnailUrl\"\n [alt]=\"attachment.fileName\"\n class=\"thumbnail-image\">\n }\n @if (!attachment.thumbnailUrl) {\n <div class=\"thumbnail-placeholder\">\n <i class=\"fa-solid fa-file\"></i>\n <span class=\"file-name\">{{ attachment.fileName }}</span>\n </div>\n }\n <button class=\"remove-attachment\"\n (click)=\"removeAttachment(attachment.id); $event.stopPropagation()\"\n title=\"Remove attachment\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n }\n </div>\n }\n\n <div\n #editor\n class=\"mention-editor\"\n contenteditable=\"true\"\n [attr.contenteditable]=\"!disabled\"\n [attr.data-placeholder]=\"placeholder\"\n (input)=\"onInput()\"\n (keydown)=\"onKeyDown($event)\"\n (blur)=\"onBlur()\"\n (paste)=\"onPaste($event)\"\n ></div>\n\n <!-- Drag & Drop Overlay -->\n @if (isDragOver) {\n <div class=\"drop-overlay\">\n <div class=\"drop-message\">\n <i class=\"fa-solid fa-cloud-arrow-up\"></i>\n <span>Drop files here</span>\n </div>\n </div>\n }\n\n <!-- Mention Dropdown -->\n @if (showMentionDropdown && enableMentions) {\n <mj-mention-dropdown\n [suggestions]=\"mentionSuggestions\"\n [position]=\"mentionDropdownPosition\"\n [showAbove]=\"mentionDropdownShowAbove\"\n [useFixedPositioning]=\"true\"\n [visible]=\"true\"\n (suggestionSelected)=\"onMentionSelected($event)\"\n (closed)=\"closeMentionDropdown()\">\n </mj-mention-dropdown>\n }\n</div>\n"]}
@@ -2,36 +2,61 @@ import { OnInit, ChangeDetectorRef } from '@angular/core';
2
2
  import { BaseAngularComponent } from '@memberjunction/ng-base-types';
3
3
  import { UserInfo } from '@memberjunction/core';
4
4
  import { RatingJSON } from '@memberjunction/core-entities';
5
+ import { DialogService } from '../../services/dialog.service';
5
6
  import * as i0 from "@angular/core";
6
7
  /**
7
- * Component for displaying and managing multi-user ratings on conversation messages.
8
- * Shows aggregate ratings and allows users to provide their own rating.
9
- * Uses optimistic updates UI reflects the change immediately while DB saves in background.
8
+ * Single-rating-per-message rating UI for an AI conversation response.
9
+ *
10
+ * Storage model: the rating + free-form comment live directly on the
11
+ * ConversationDetail row, in `UserRating` (1-10, nullable) and `UserFeedback`
12
+ * (nvarchar(max), nullable). This matches MJ's own pattern on
13
+ * `__mj.ConversationDetail` and Skip's matching columns on
14
+ * `Skip.ConversationDetail`. The host app picks the entity via @Input.
10
15
  */
11
16
  export declare class ConversationMessageRatingComponent extends BaseAngularComponent implements OnInit {
12
17
  private cdr;
18
+ private dialogService;
13
19
  conversationDetailId: string;
14
20
  currentUser: UserInfo;
21
+ /**
22
+ * When false, the rating UI renders as a read-only badge instead of an editable
23
+ * button. Set by the parent (MessageItemComponent) to `false` when the current
24
+ * user is not the conversation owner — the rating storage is a single field on
25
+ * the ConversationDetail row, so only the owner is allowed to mutate it.
26
+ */
27
+ canEdit: boolean;
28
+ /**
29
+ * Entity name to load/update for the rating. Defaults to MJ's
30
+ * `MJ: Conversation Details` (which has `UserRating`/`UserFeedback`).
31
+ * Skip-Brain hosts pass `'Conversation Details__Skip'`.
32
+ */
33
+ ratingEntityName: string;
34
+ /** Column on the entity that stores the 1-10 rating. */
35
+ ratingField: string;
36
+ /** Column on the entity that stores the free-form feedback. */
37
+ ratingCommentField: string;
38
+ /**
39
+ * Optional: legacy pre-loaded ratings array (no longer used by storage; kept
40
+ * to preserve the input shape used by existing call sites like
41
+ * MessageItemComponent).
42
+ */
15
43
  ratingsData?: RatingJSON[];
16
- thumbsUpCount: number;
17
- thumbsDownCount: number;
18
- totalRatings: number;
19
44
  currentUserRating: number | null;
45
+ currentUserComments: string;
20
46
  isSaving: boolean;
21
- private allRatings;
22
- private currentUserRatingId;
23
- private get currentUserId();
24
- constructor(cdr: ChangeDetectorRef);
47
+ constructor(cdr: ChangeDetectorRef, dialogService: DialogService);
25
48
  ngOnInit(): Promise<void>;
26
- private processRatings;
27
- getRatingsTooltip(): string;
28
- RateThumbsUp(): Promise<void>;
29
- RateThumbsDown(): Promise<void>;
30
- private loadRatings;
31
- private applyOptimisticUpdate;
49
+ OpenRatingDialog(): Promise<void>;
50
+ /**
51
+ * Grants the Integrations and Developer roles View access to the parent
52
+ * Conversation via `MJ: Resource Permissions`. Idempotent — existing
53
+ * permissions for the same role are not duplicated. Best-effort; any error
54
+ * is logged but does not roll back the rating itself.
55
+ */
56
+ private grantConversationAccess;
57
+ private loadRating;
32
58
  private saveRating;
33
- private persistRating;
34
59
  static ɵfac: i0.ɵɵFactoryDeclaration<ConversationMessageRatingComponent, never>;
35
- static ɵcmp: i0.ɵɵComponentDeclaration<ConversationMessageRatingComponent, "mj-conversation-message-rating", never, { "conversationDetailId": { "alias": "conversationDetailId"; "required": false; }; "currentUser": { "alias": "currentUser"; "required": false; }; "ratingsData": { "alias": "ratingsData"; "required": false; }; }, {}, never, never, false, never>;
60
+ static ɵcmp: i0.ɵɵComponentDeclaration<ConversationMessageRatingComponent, "mj-conversation-message-rating", never, { "conversationDetailId": { "alias": "conversationDetailId"; "required": false; }; "currentUser": { "alias": "currentUser"; "required": false; }; "canEdit": { "alias": "canEdit"; "required": false; }; "ratingEntityName": { "alias": "ratingEntityName"; "required": false; }; "ratingField": { "alias": "ratingField"; "required": false; }; "ratingCommentField": { "alias": "ratingCommentField"; "required": false; }; "ratingsData": { "alias": "ratingsData"; "required": false; }; }, {}, never, never, false, never>;
36
61
  }
37
62
  //# sourceMappingURL=conversation-message-rating.component.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"conversation-message-rating.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/message/conversation-message-rating.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,MAAM,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAC5E,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,EAAqB,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACnE,OAAO,EAAoC,UAAU,EAAE,MAAM,+BAA+B,CAAC;;AAG7F;;;;GAIG;AACH,qBA+Ha,kCAAmC,SAAQ,oBAAqB,YAAW,MAAM;IAkB9E,OAAO,CAAC,GAAG;IAjBd,oBAAoB,EAAG,MAAM,CAAC;IAC9B,WAAW,EAAG,QAAQ,CAAC;IACvB,WAAW,CAAC,EAAE,UAAU,EAAE,CAAC;IAEpC,aAAa,SAAK;IAClB,eAAe,SAAK;IACpB,YAAY,SAAK;IACjB,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAQ;IACxC,QAAQ,UAAS;IAEjB,OAAO,CAAC,UAAU,CAAoB;IACtC,OAAO,CAAC,mBAAmB,CAAuB;IAElD,OAAO,KAAK,aAAa,GAExB;gBAEmB,GAAG,EAAE,iBAAiB;IAGpC,QAAQ;IAQd,OAAO,CAAC,cAAc;IAWtB,iBAAiB,IAAI,MAAM;IAmBrB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAI7B,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;YAIvB,WAAW;IAiBzB,OAAO,CAAC,qBAAqB;YAcf,UAAU;YAmCV,aAAa;yCArIlB,kCAAkC;2CAAlC,kCAAkC;CA0J9C"}
1
+ {"version":3,"file":"conversation-message-rating.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/message/conversation-message-rating.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,MAAM,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAC5E,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,EAAqC,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACnF,OAAO,EAAE,UAAU,EAAkB,MAAM,+BAA+B,CAAC;AAC3E,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;;AAiB9D;;;;;;;;GAQG;AACH,qBA+Fa,kCAAmC,SAAQ,oBAAqB,YAAW,MAAM;IAqC1F,OAAO,CAAC,GAAG;IACX,OAAO,CAAC,aAAa;IArCd,oBAAoB,EAAG,MAAM,CAAC;IAC9B,WAAW,EAAG,QAAQ,CAAC;IAEhC;;;;;OAKG;IACM,OAAO,EAAE,OAAO,CAAQ;IAEjC;;;;OAIG;IACM,gBAAgB,EAAE,MAAM,CAA8B;IAE/D,wDAAwD;IAC/C,WAAW,EAAE,MAAM,CAAgB;IAE5C,+DAA+D;IACtD,kBAAkB,EAAE,MAAM,CAAkB;IAErD;;;;OAIG;IACM,WAAW,CAAC,EAAE,UAAU,EAAE,CAAC;IAEpC,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAQ;IACxC,mBAAmB,EAAE,MAAM,CAAM;IACjC,QAAQ,UAAS;gBAGP,GAAG,EAAE,iBAAiB,EACtB,aAAa,EAAE,aAAa;IAKhC,QAAQ;IAIR,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC;IA6CvC;;;;;OAKG;YACW,uBAAuB;YAoCvB,UAAU;YAkBV,UAAU;yCAxJb,kCAAkC;2CAAlC,kCAAkC;CA+L9C"}