@acorex/components 22.1.0-next.2 → 22.1.0-next.21

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 (60) hide show
  1. package/fesm2022/acorex-components-accordion.mjs +2 -2
  2. package/fesm2022/acorex-components-accordion.mjs.map +1 -1
  3. package/fesm2022/acorex-components-button.mjs +2 -2
  4. package/fesm2022/acorex-components-button.mjs.map +1 -1
  5. package/fesm2022/acorex-components-check-box.mjs +2 -2
  6. package/fesm2022/acorex-components-check-box.mjs.map +1 -1
  7. package/fesm2022/acorex-components-combo-box.mjs +114 -20
  8. package/fesm2022/acorex-components-combo-box.mjs.map +1 -1
  9. package/fesm2022/{acorex-components-conversation-open-composer-picker-for-files-BuNEjswI.mjs → acorex-components-conversation-open-composer-picker-for-files-DnSW908R.mjs} +6 -19
  10. package/fesm2022/acorex-components-conversation-open-composer-picker-for-files-DnSW908R.mjs.map +1 -0
  11. package/fesm2022/acorex-components-conversation.mjs +7299 -9510
  12. package/fesm2022/acorex-components-conversation.mjs.map +1 -1
  13. package/fesm2022/acorex-components-data-table.mjs +33 -18
  14. package/fesm2022/acorex-components-data-table.mjs.map +1 -1
  15. package/fesm2022/acorex-components-dropdown.mjs +2 -2
  16. package/fesm2022/acorex-components-dropdown.mjs.map +1 -1
  17. package/fesm2022/acorex-components-form.mjs +21 -5
  18. package/fesm2022/acorex-components-form.mjs.map +1 -1
  19. package/fesm2022/acorex-components-label.mjs +2 -2
  20. package/fesm2022/acorex-components-label.mjs.map +1 -1
  21. package/fesm2022/acorex-components-list.mjs +2 -2
  22. package/fesm2022/acorex-components-list.mjs.map +1 -1
  23. package/fesm2022/acorex-components-loading-dialog.mjs +59 -42
  24. package/fesm2022/acorex-components-loading-dialog.mjs.map +1 -1
  25. package/fesm2022/acorex-components-lookup.mjs +765 -98
  26. package/fesm2022/acorex-components-lookup.mjs.map +1 -1
  27. package/fesm2022/acorex-components-notification.mjs +4 -6
  28. package/fesm2022/acorex-components-notification.mjs.map +1 -1
  29. package/fesm2022/acorex-components-password-box.mjs +2 -2
  30. package/fesm2022/acorex-components-password-box.mjs.map +1 -1
  31. package/fesm2022/acorex-components-popover.mjs +22 -0
  32. package/fesm2022/acorex-components-popover.mjs.map +1 -1
  33. package/fesm2022/acorex-components-radio.mjs +2 -2
  34. package/fesm2022/acorex-components-radio.mjs.map +1 -1
  35. package/fesm2022/acorex-components-range-slider.mjs +2 -2
  36. package/fesm2022/acorex-components-range-slider.mjs.map +1 -1
  37. package/fesm2022/acorex-components-select-box.mjs +38 -11
  38. package/fesm2022/acorex-components-select-box.mjs.map +1 -1
  39. package/fesm2022/acorex-components-selection-list.mjs +2 -2
  40. package/fesm2022/acorex-components-selection-list.mjs.map +1 -1
  41. package/fesm2022/acorex-components-switch.mjs +2 -2
  42. package/fesm2022/acorex-components-switch.mjs.map +1 -1
  43. package/fesm2022/acorex-components-tabs.mjs +2 -2
  44. package/fesm2022/acorex-components-tabs.mjs.map +1 -1
  45. package/fesm2022/acorex-components-tag-box.mjs +2 -2
  46. package/fesm2022/acorex-components-tag-box.mjs.map +1 -1
  47. package/lookup/README.md +29 -7
  48. package/package.json +4 -7
  49. package/types/acorex-components-combo-box.d.ts +38 -8
  50. package/types/acorex-components-conversation.d.ts +543 -1019
  51. package/types/acorex-components-data-table.d.ts +3 -2
  52. package/types/acorex-components-loading-dialog.d.ts +12 -4
  53. package/types/acorex-components-lookup.d.ts +181 -21
  54. package/types/acorex-components-popover.d.ts +6 -0
  55. package/types/acorex-components-select-box.d.ts +11 -0
  56. package/fesm2022/acorex-components-conversation-open-composer-picker-for-files-BuNEjswI.mjs.map +0 -1
  57. package/fesm2022/acorex-components-selection-list-2.mjs +0 -168
  58. package/fesm2022/acorex-components-selection-list-2.mjs.map +0 -1
  59. package/selection-list-2/README.md +0 -3
  60. package/types/acorex-components-selection-list-2.d.ts +0 -52
@@ -1,18 +1,20 @@
1
1
  import * as _acorex_components_conversation from '@acorex/components/conversation';
2
2
  import * as _angular_core from '@angular/core';
3
- import { OnDestroy, ViewContainerRef, Type, InputSignal, WritableSignal, Signal, Provider, OnInit, EventEmitter, TemplateRef, InjectionToken, ModuleWithProviders } from '@angular/core';
4
- import { AXComponentCloseEvent, AXHtmlEvent, AXDataSource, AXPlacement, AXClosableComponent } from '@acorex/cdk/common';
3
+ import { OnDestroy, ViewContainerRef, Type, InputSignal, WritableSignal, Signal, Provider, OnInit, EventEmitter, TemplateRef, ElementRef, InjectionToken, ModuleWithProviders } from '@angular/core';
4
+ import { AXComponentCloseEvent, AXHtmlEvent, AXClickEvent, AXDataSource, AXPlacement } from '@acorex/cdk/common';
5
+ import * as _acorex_components_action_sheet from '@acorex/components/action-sheet';
6
+ import { AXActionSheetRef } from '@acorex/components/action-sheet';
5
7
  import * as _acorex_components_popup from '@acorex/components/popup';
6
8
  import { AXPopupService, AXPopupRef } from '@acorex/components/popup';
7
9
  import { AXFileUploadOptions, AXUploadResult, AXUploadReference, AXUploaderService, AXUploaderFileChangeEvent } from '@acorex/cdk/uploader';
8
10
  import { AXListComponent } from '@acorex/components/list';
9
11
  import * as rxjs from 'rxjs';
10
- import { Observable, BehaviorSubject, Subject } from 'rxjs';
12
+ import { Observable } from 'rxjs';
11
13
  import { AXDialogService } from '@acorex/components/dialog';
12
14
  import { AXContextMenuOpeningEvent, AXContextMenuItemsClickEvent } from '@acorex/components/menu';
13
15
  import { AXBasePageComponent } from '@acorex/components/page';
14
16
  import * as _acorex_core_file from '@acorex/core/file';
15
- import { AXFileTypeInfoProvider, AXFileType, AXFileService, AXFileTypeRegistryService, AXFileTypeExtensionHint, AXFileTypeOpenContext } from '@acorex/core/file';
17
+ import { AXFileTypeInfoProvider, AXFileType, AXFileTypeRegistryService, AXFileService, AXFileTypeExtensionHint, AXFileTypeOpenContext } from '@acorex/core/file';
16
18
  import { AXTranslationService } from '@acorex/core/translation';
17
19
  import { AXToastService } from '@acorex/components/toast';
18
20
  import { AXValidationRuleResult } from '@acorex/core/validation';
@@ -375,12 +377,31 @@ interface AXConversationDeleteMessageCommand {
375
377
  forEveryone?: boolean;
376
378
  }
377
379
 
380
+ /**
381
+ * Per-user preferences for a specific conversation (mute, notifications, etc.).
382
+ * Stored on the user account, keyed by conversation ID — not on the room entity.
383
+ */
384
+ interface AXConversationRoomPreferences {
385
+ /** Muted until timestamp */
386
+ mutedUntil?: Date;
387
+ /** Show notifications for this conversation */
388
+ notifications: boolean;
389
+ /** Custom notification sound */
390
+ notificationSound?: string;
391
+ /** Show message preview in notifications */
392
+ showPreview: boolean;
393
+ /** Custom settings */
394
+ custom?: Record<string, unknown>;
395
+ }
396
+ declare const AX_CONVERSATION_DEFAULT_ROOM_PREFERENCES: AXConversationRoomPreferences;
397
+ /** Map of conversation ID → user-specific room preferences. */
398
+ type AXConversationRoomPreferencesMap = Record<string, AXConversationRoomPreferences>;
399
+
378
400
  /**
379
401
  * Participant Model
380
- * Represents a user/member in a conversation
402
+ * Membership in a conversation (identity fields are snapshots; live presence is on the user store).
381
403
  */
382
- type AXConversationParticipantRole = 'admin' | 'moderator' | 'member';
383
- type AXConversationParticipantStatus = 'online' | 'offline' | 'away';
404
+ type AXConversationParticipantRole = 'owner' | 'admin' | 'moderator' | 'member' | 'guest';
384
405
  /** Extended profile fields shown in private-chat info panels. */
385
406
  interface AXConversationUserProfile {
386
407
  bio?: string;
@@ -391,6 +412,18 @@ interface AXConversationUserProfile {
391
412
  company?: string;
392
413
  title?: string;
393
414
  }
415
+ /** Authenticated user profile (includes per-room preferences). */
416
+ interface AXConversationUser {
417
+ id: string;
418
+ name: string;
419
+ description?: string;
420
+ profile?: AXConversationUserProfile;
421
+ avatar?: string;
422
+ icon?: string;
423
+ metadata?: Record<string, unknown>;
424
+ /** User-specific settings per conversation (key = conversationId). */
425
+ conversationPreferences?: AXConversationRoomPreferencesMap;
426
+ }
394
427
  interface AXConversationParticipant {
395
428
  /** Unique identifier for the participant */
396
429
  id: string;
@@ -411,10 +444,6 @@ interface AXConversationParticipant {
411
444
  icon?: string;
412
445
  /** Role in the conversation (for groups/channels) */
413
446
  role?: AXConversationParticipantRole;
414
- /** Current online status */
415
- status?: AXConversationParticipantStatus;
416
- /** Last seen timestamp (when offline/away) */
417
- lastSeen?: Date;
418
447
  /** Custom metadata */
419
448
  metadata?: Record<string, unknown>;
420
449
  }
@@ -425,34 +454,6 @@ interface AXConversationParticipant {
425
454
  */
426
455
 
427
456
  type AXConversationType = 'private' | 'group' | 'channel' | 'bot';
428
- /**
429
- * Conversation status information
430
- */
431
- interface AXConversationStatus {
432
- /** Whether someone is typing */
433
- isTyping: boolean;
434
- /** User IDs currently typing */
435
- typingUsers: string[];
436
- /** Online presence (for private chats) */
437
- presence?: 'online' | 'offline' | 'away';
438
- /** Last seen timestamp (for private chats when offline) */
439
- lastSeen?: Date;
440
- }
441
- /**
442
- * Conversation settings
443
- */
444
- interface AXConversationSettings {
445
- /** Muted until timestamp */
446
- mutedUntil?: Date;
447
- /** Show notifications */
448
- notifications: boolean;
449
- /** Custom notification sound */
450
- notificationSound?: string;
451
- /** Show message preview in notifications */
452
- showPreview: boolean;
453
- /** Custom settings */
454
- custom?: Record<string, unknown>;
455
- }
456
457
  /** Theme-specific CSS `background` values for the message list area. */
457
458
  interface AXConversationMessageListThemeBackground {
458
459
  light: string;
@@ -510,10 +511,6 @@ interface AXConversation {
510
511
  unreadCount: number;
511
512
  /** Number of unread mentions */
512
513
  unreadMentions?: number;
513
- /** Current status (typing, presence, etc.) */
514
- status: AXConversationStatus;
515
- /** User-specific settings */
516
- settings: AXConversationSettings;
517
514
  /** Pinned messages IDs */
518
515
  pinnedMessageIds?: string[];
519
516
  /** Conversation creation timestamp */
@@ -526,13 +523,11 @@ interface AXConversation {
526
523
  pinned?: boolean;
527
524
  /** Whether conversation is archived */
528
525
  archived?: boolean;
529
- /** Draft message text */
530
- draft?: string;
531
526
  /** Custom metadata */
532
527
  metadata?: AXConversationMetadata;
533
528
  }
534
529
  /**
535
- * Typing indicator
530
+ * Typing indicator (realtime event — ephemeral, not stored on the room entity).
536
531
  */
537
532
  interface AXConversationTypingIndicator {
538
533
  /** Conversation ID */
@@ -543,19 +538,8 @@ interface AXConversationTypingIndicator {
543
538
  userName?: string;
544
539
  /** Timestamp */
545
540
  timestamp: Date;
546
- }
547
- /**
548
- * Presence update
549
- */
550
- interface AXConversationPresenceUpdate {
551
- /** User ID */
552
- userId: string;
553
- /** Presence status */
554
- status: 'online' | 'offline' | 'away';
555
- /** Last seen timestamp */
556
- lastSeen?: Date;
557
- /** Custom status text */
558
- statusText?: string;
541
+ /** When false, user stopped typing */
542
+ isTyping?: boolean;
559
543
  }
560
544
  /**
561
545
  * Conversation filter options
@@ -595,6 +579,26 @@ declare const AX_CONVERSATION_MESSAGE_TYPE_FILE_TYPE: Partial<Record<AXConversat
595
579
  /** Resolves {@link AXConversationMessage.fileType} from command or message type. */
596
580
  declare function resolveConversationMessageFileType(type: AXConversationMessageType, fileType?: string): string | undefined;
597
581
 
582
+ /**
583
+ * User presence — global per-user live state (not room-scoped).
584
+ */
585
+ type AXConversationPresenceStatus = 'online' | 'offline' | 'away' | 'busy';
586
+ /** Live presence for a single user. */
587
+ interface AXConversationUserPresence {
588
+ userId: string;
589
+ status: AXConversationPresenceStatus;
590
+ lastSeen?: Date;
591
+ statusText?: string;
592
+ updatedAt?: Date;
593
+ }
594
+ /** Realtime / API presence event payload. */
595
+ interface AXConversationPresenceUpdate {
596
+ userId: string;
597
+ status: AXConversationPresenceStatus;
598
+ lastSeen?: Date;
599
+ statusText?: string;
600
+ }
601
+
598
602
  /**
599
603
  * Abstract Base Registry
600
604
  * Base class for all registries with common functionality
@@ -673,22 +677,17 @@ declare abstract class AXConversationBaseRegistry<T extends AXConversationRegist
673
677
  protected abstract getRegistryName(): string;
674
678
  }
675
679
 
676
- /**
677
- * Active component state in composer
678
- */
679
- interface AXConversationComposerActiveComponent {
680
- /** Action that triggered this component */
681
- action: AXConversationComposerAction;
682
- /** Component to render */
683
- component?: Type<unknown>;
684
- /** Lazy loader for the component */
685
- componentLoader?: () => Promise<Type<unknown>>;
686
- /** Component inputs */
687
- inputs?: Record<string, unknown>;
688
- }
680
+ /** Primary composer button mode (send / cancel / stopping / default action / locked). */
681
+ type AXConversationComposerPrimaryButtonMode = 'send' | 'cancel' | 'stopping' | 'default-action' | 'locked';
689
682
  declare class AXConversationComposerService {
690
683
  private readonly conversationService;
684
+ private readonly generationState;
691
685
  private readonly translation;
686
+ private readonly popupService;
687
+ private readonly actionSheetService;
688
+ private readonly platform;
689
+ private readonly config;
690
+ private readonly _activeActionOverlay;
692
691
  private get registry();
693
692
  private readonly _replyMessage;
694
693
  private readonly _editMessage;
@@ -696,15 +695,10 @@ declare class AXConversationComposerService {
696
695
  readonly editMessage: _angular_core.Signal<AXConversationMessage>;
697
696
  readonly activeConversation: _angular_core.Signal<_acorex_components_conversation.AXConversation>;
698
697
  readonly activeMessages: _angular_core.Signal<AXConversationMessage[]>;
699
- /** Active component being shown in composer (full-width mode) */
700
- private readonly _activeComponent;
701
- readonly activeComponent: _angular_core.Signal<AXConversationComposerActiveComponent>;
702
698
  /** Draft text */
703
699
  readonly draftText: _angular_core.WritableSignal<string>;
704
700
  /** Attachments */
705
701
  readonly attachments: _angular_core.WritableSignal<File[]>;
706
- /** Show typing indicator */
707
- readonly showTypingIndicator: _angular_core.WritableSignal<boolean>;
708
702
  /** Incremented to request focus on the composer text area (handled by AXConversationComposerComponent). */
709
703
  private readonly _focusRequest;
710
704
  readonly focusRequest: _angular_core.Signal<number>;
@@ -712,22 +706,31 @@ declare class AXConversationComposerService {
712
706
  readonly placeholder: _angular_core.Signal<string>;
713
707
  /** Number of input rows */
714
708
  readonly inputRows: _angular_core.Signal<number>;
715
- /** Can send message */
709
+ /** Can send message (draft has content; does not include generation state). */
716
710
  readonly canSend: _angular_core.Signal<boolean>;
711
+ /** Whether a background generation (e.g. AI response) is in progress. */
712
+ readonly isGenerating: _angular_core.Signal<boolean>;
713
+ /** Whether cancel cleanup is in progress (spinner on primary button). */
714
+ readonly isStopping: _angular_core.Signal<boolean>;
715
+ /** Primary end-button mode for send / cancel / stopping / voice / locked. */
716
+ readonly primaryButtonMode: _angular_core.Signal<AXConversationComposerPrimaryButtonMode>;
717
717
  /** Composer action context */
718
718
  readonly actionContext: _angular_core.Signal<AXConversationComposerActionContext>;
719
- /** Left actions from registry */
720
- readonly leftActions: _angular_core.Signal<AXConversationComposerAction[]>;
721
- /** Right actions from registry */
722
- readonly rightActions: _angular_core.Signal<AXConversationComposerAction[]>;
723
- /** Left inline actions (location = 'inline' or undefined) */
724
- readonly leftInlineActions: _angular_core.Signal<AXConversationComposerAction[]>;
725
- /** Left menu actions (location = 'menu') */
726
- readonly leftMenuActions: _angular_core.Signal<AXConversationComposerAction[]>;
727
- /** Right inline actions (location = 'inline' or undefined) */
728
- readonly rightInlineActions: _angular_core.Signal<AXConversationComposerAction[]>;
729
- /** Right menu actions (location = 'menu') */
730
- readonly rightMenuActions: _angular_core.Signal<AXConversationComposerAction[]>;
719
+ /** Start actions from registry */
720
+ readonly startActions: _angular_core.Signal<AXConversationComposerAction[]>;
721
+ /** End actions from registry */
722
+ readonly endActions: _angular_core.Signal<AXConversationComposerAction[]>;
723
+ /** Start inline actions (location = 'inline' or undefined) */
724
+ readonly startInlineActions: _angular_core.Signal<AXConversationComposerAction[]>;
725
+ /** Start menu actions shown in the attachment popup */
726
+ readonly startMenuActions: _angular_core.Signal<AXConversationComposerAction[]>;
727
+ /** End inline actions inside the input pill (excludes default action) */
728
+ readonly endInlineActions: _angular_core.Signal<AXConversationComposerAction[]>;
729
+ /** End menu actions (location = 'menu') */
730
+ readonly endMenuActions: _angular_core.Signal<AXConversationComposerAction[]>;
731
+ /** Default end action (voice/send morph button) */
732
+ readonly defaultAction: _angular_core.Signal<AXConversationComposerAction>;
733
+ cancelGeneration(): void;
731
734
  startReply(message: AXConversationMessage): void;
732
735
  startEdit(message: AXConversationMessage): void;
733
736
  /** Focus the composer text area when the composer component is mounted. */
@@ -744,21 +747,20 @@ declare class AXConversationComposerService {
744
747
  */
745
748
  clearComposerInput(conversationId?: string): void;
746
749
  /**
747
- * Show a component in the composer (full-width mode)
750
+ * Open a composer action component in a popup (desktop) or action sheet (mobile).
748
751
  */
749
- showComponent(action: AXConversationComposerAction, inputs?: Record<string, unknown>): void;
752
+ openActionComponent(action: AXConversationComposerAction, inputs?: Record<string, unknown>, options?: {
753
+ toggleable?: boolean;
754
+ initialFiles?: File[];
755
+ }): Promise<void>;
750
756
  /**
751
- * Hide the active component
757
+ * Hide the active action overlay.
752
758
  */
753
759
  hideComponent(): void;
754
- /**
755
- * Toggle component visibility
756
- */
757
- toggleComponent(action: AXConversationComposerAction, inputs?: Record<string, unknown>): void;
758
760
  /**
759
761
  * Get actions for the active conversation
760
762
  */
761
- getActionsForPosition(position: 'left' | 'right', context: AXConversationComposerActionContext): AXConversationComposerAction[];
763
+ getActionsForPosition(position: 'start' | 'end', context: AXConversationComposerActionContext): AXConversationComposerAction[];
762
764
  /**
763
765
  * Execute an action
764
766
  */
@@ -795,6 +797,10 @@ interface AXConversationComposerActionContext {
795
797
  isReplying: boolean;
796
798
  /** Message being replied to (if any) */
797
799
  replyingToMessageId?: string;
800
+ /** Whether a background generation (e.g. AI response) is in progress */
801
+ isGenerating?: boolean;
802
+ /** Whether cancel cleanup is in progress */
803
+ isStopping?: boolean;
798
804
  /** Custom context data */
799
805
  custom?: Record<string, unknown>;
800
806
  }
@@ -811,6 +817,15 @@ interface AXConversationComposerActionComponent {
811
817
  readonly initialFiles?: InputSignal<File[]>;
812
818
  /** Set by {@link AXPopupService} when the picker is shown in a popup. */
813
819
  readonly __popup__?: InputSignal<_acorex_components_popup.AXPopupRef | undefined>;
820
+ /** Set by {@link AXActionSheetService} when the picker is shown in an action sheet. */
821
+ readonly __actionSheet__?: InputSignal<_acorex_components_action_sheet.AXActionSheetRef | undefined>;
822
+ /**
823
+ * When true (from action {@link AXConversationComposerAction.autoRun}), runs {@link activate}
824
+ * once after the component is mounted.
825
+ */
826
+ readonly autoRun?: InputSignal<boolean>;
827
+ /** Primary action when opened from the composer (record, browse files, etc.). */
828
+ activate?(): void | Promise<void>;
814
829
  /** Cancel in-flight uploads when the picker is closed or replaced. */
815
830
  abortInProgressUploads?(): void;
816
831
  }
@@ -822,10 +837,15 @@ interface AXConversationComposerAction extends Omit<AXConversationRegistryItem,
822
837
  label: string;
823
838
  /** Icon name/class */
824
839
  icon: string;
825
- /** Position: left or right */
826
- position: 'left' | 'right';
827
- /** Location: inline (show as button) or menu (show in dropdown menu) */
840
+ /** Position: start or end of the composer */
841
+ position: 'start' | 'end';
842
+ /** Location: inline (show as button) or menu (show in attachment popup menu) */
828
843
  location?: 'inline' | 'menu';
844
+ /**
845
+ * Primary end action (e.g. voice record). Only one action may be default.
846
+ * Renders as the circular send-style button and morphs into send when the draft has content.
847
+ */
848
+ default?: boolean;
829
849
  /** Visibility condition */
830
850
  visible: (context: AXConversationComposerActionContext) => boolean;
831
851
  /** Enabled condition */
@@ -841,6 +861,11 @@ interface AXConversationComposerAction extends Omit<AXConversationRegistryItem,
841
861
  * Whether this action is toggleable (shows/hides component)
842
862
  */
843
863
  toggleable?: boolean;
864
+ /**
865
+ * When true, runs {@link AXConversationComposerActionComponent.activate} in
866
+ * {@link afterNextRender} after the upload panel is mounted.
867
+ */
868
+ autoRun?: boolean;
844
869
  /** Action handler (optional if component is provided) */
845
870
  handler?: (context: AXConversationComposerActionContext) => void | Promise<void>;
846
871
  /** Tooltip text */
@@ -869,18 +894,20 @@ declare class AXConversationComposerActionRegistry {
869
894
  constructor();
870
895
  /** All registered actions */
871
896
  readonly actions: _angular_core.Signal<AXConversationComposerAction[]>;
872
- /** Left-side actions sorted by priority */
873
- readonly leftActions: _angular_core.Signal<AXConversationComposerAction[]>;
874
- /** Right-side actions sorted by priority */
875
- readonly rightActions: _angular_core.Signal<AXConversationComposerAction[]>;
876
- /** Left-side inline actions (location = 'inline' or undefined) */
877
- readonly leftInlineActions: _angular_core.Signal<AXConversationComposerAction[]>;
878
- /** Left-side menu actions (location = 'menu') */
879
- readonly leftMenuActions: _angular_core.Signal<AXConversationComposerAction[]>;
880
- /** Right-side inline actions (location = 'inline' or undefined) */
881
- readonly rightInlineActions: _angular_core.Signal<AXConversationComposerAction[]>;
882
- /** Right-side menu actions (location = 'menu') */
883
- readonly rightMenuActions: _angular_core.Signal<AXConversationComposerAction[]>;
897
+ /** Start-side actions sorted by priority */
898
+ readonly startActions: _angular_core.Signal<AXConversationComposerAction[]>;
899
+ /** End-side actions sorted by priority */
900
+ readonly endActions: _angular_core.Signal<AXConversationComposerAction[]>;
901
+ /** Start-side inline actions (location = 'inline' or undefined) */
902
+ readonly startInlineActions: _angular_core.Signal<AXConversationComposerAction[]>;
903
+ /** Start-side menu actions (location = 'menu') — shown in the attachment popup */
904
+ readonly startMenuActions: _angular_core.Signal<AXConversationComposerAction[]>;
905
+ /** End-side inline actions inside the input pill (excludes default action) */
906
+ readonly endInlineActions: _angular_core.Signal<AXConversationComposerAction[]>;
907
+ /** End-side menu actions (location = 'menu') */
908
+ readonly endMenuActions: _angular_core.Signal<AXConversationComposerAction[]>;
909
+ /** The single default end action (voice/send morph button) */
910
+ readonly defaultAction: _angular_core.Signal<AXConversationComposerAction>;
884
911
  /**
885
912
  * Register a composer action
886
913
  */
@@ -895,11 +922,11 @@ declare class AXConversationComposerActionRegistry {
895
922
  /**
896
923
  * Get visible actions for a position
897
924
  */
898
- getVisibleActions(position: 'left' | 'right', context: AXConversationComposerActionContext): AXConversationComposerAction[];
925
+ getVisibleActions(position: 'start' | 'end', context: AXConversationComposerActionContext): AXConversationComposerAction[];
899
926
  /**
900
927
  * Get enabled actions for a position
901
928
  */
902
- getEnabledActions(position: 'left' | 'right', context: AXConversationComposerActionContext): AXConversationComposerAction[];
929
+ getEnabledActions(position: 'start' | 'end', context: AXConversationComposerActionContext): AXConversationComposerAction[];
903
930
  isActionEnabled(action: AXConversationComposerAction, context: AXConversationComposerActionContext): boolean;
904
931
  /**
905
932
  * Picker actions for a file catalog (by priority), when visible and enabled.
@@ -1317,10 +1344,6 @@ declare class AXConversationInfoBarService {
1317
1344
  * Reset info-bar overlays when the active conversation changes.
1318
1345
  */
1319
1346
  onConversationChanged(): void;
1320
- /**
1321
- * Open the Telegram-style conversation info panel for the active (or given) conversation.
1322
- */
1323
- openConversationInfoPanel(conversation?: AXConversation): Promise<void>;
1324
1347
  /**
1325
1348
  * Get actions for the active conversation
1326
1349
  */
@@ -1424,7 +1447,7 @@ interface AXConversationInfoBarAction extends AXConversationRegistryItem {
1424
1447
  /** Whether this is a divider */
1425
1448
  divider?: boolean;
1426
1449
  /** Display location: 'inline' for toolbar buttons, 'menu' for dropdown menu */
1427
- location?: 'inline' | 'menu';
1450
+ location?: 'inline' | 'menu' | ((context: AXConversationInfoBarActionContext) => 'inline' | 'menu');
1428
1451
  /**
1429
1452
  * Component to show when action is activated (for inline actions)
1430
1453
  * If provided, clicking the action will show this component in the info-bar
@@ -1474,6 +1497,10 @@ declare class AXConversationInfoBarActionRegistry extends AXConversationBaseRegi
1474
1497
  * Get actions for a specific conversation
1475
1498
  */
1476
1499
  getActionsForConversation(conversation: AXConversation, location?: 'inline' | 'menu'): AXConversationInfoBarAction[];
1500
+ /**
1501
+ * Resolve the display location for an action (supports dynamic location factories).
1502
+ */
1503
+ getActionLocation(action: AXConversationInfoBarAction, conversation: AXConversation): 'inline' | 'menu' | undefined;
1477
1504
  /**
1478
1505
  * Get inline actions (toolbar buttons)
1479
1506
  */
@@ -1598,7 +1625,7 @@ declare class AXConversationComposerComponent implements OnDestroy {
1598
1625
  private readonly config;
1599
1626
  private readonly translation;
1600
1627
  /** Access registry through conversation service */
1601
- private get registry();
1628
+ protected get composerActionRegistry(): _acorex_components_conversation.AXConversationComposerActionRegistry;
1602
1629
  /** Composer text area reference */
1603
1630
  private readonly textAreaRef;
1604
1631
  /** Draft text - use service */
@@ -1609,10 +1636,10 @@ declare class AXConversationComposerComponent implements OnDestroy {
1609
1636
  readonly editingMessage: _angular_core.WritableSignal<any>;
1610
1637
  /** Replying to message */
1611
1638
  readonly replyingToMessage: _angular_core.WritableSignal<AXConversationMessage>;
1612
- /** Show typing indicator - use service */
1613
- readonly showTypingIndicator: _angular_core.WritableSignal<boolean>;
1614
1639
  /** Message sent event */
1615
1640
  readonly messageSent: _angular_core.OutputEmitterRef<AXConversationSendMessageCommand>;
1641
+ /** Emitted when the user cancels an in-progress generation from the composer. */
1642
+ readonly generationCancelled: _angular_core.OutputEmitterRef<void>;
1616
1643
  /** Emoji clicked event */
1617
1644
  readonly emojiClick: _angular_core.OutputEmitterRef<void>;
1618
1645
  /** Attach clicked event */
@@ -1622,11 +1649,12 @@ declare class AXConversationComposerComponent implements OnDestroy {
1622
1649
  /** Active conversation */
1623
1650
  readonly activeConversation: _angular_core.Signal<_acorex_components_conversation.AXConversation>;
1624
1651
  readonly activeMessages: _angular_core.Signal<AXConversationMessage[]>;
1625
- /** Active component from service */
1626
- readonly activeComponent: _angular_core.Signal<_acorex_components_conversation.AXConversationComposerActiveComponent>;
1627
1652
  /** Emoji popover state */
1628
1653
  private readonly emojiPopoverRef;
1629
1654
  readonly emojiPopoverTarget: _angular_core.WritableSignal<HTMLElement>;
1655
+ /** Attachment menu popover state */
1656
+ private readonly attachPopoverRef;
1657
+ readonly attachPopoverTarget: _angular_core.WritableSignal<HTMLElement>;
1630
1658
  readonly composerPopupLoader: () => Promise<typeof _acorex_components_conversation.AXConversationComposerPopupComponent>;
1631
1659
  /** Input placeholder - use service */
1632
1660
  readonly placeholder: _angular_core.Signal<string>;
@@ -1638,30 +1666,40 @@ declare class AXConversationComposerComponent implements OnDestroy {
1638
1666
  readonly inputRows: _angular_core.Signal<number>;
1639
1667
  /** Can send message - use service */
1640
1668
  readonly canSend: _angular_core.Signal<boolean>;
1641
- /** Left actions from registry - use service */
1642
- readonly leftActions: _angular_core.Signal<AXConversationComposerAction[]>;
1643
- /** Right actions from registry - use service */
1644
- readonly rightActions: _angular_core.Signal<AXConversationComposerAction[]>;
1645
- /** Left inline actions (location = 'inline' or undefined) */
1646
- readonly leftInlineActions: _angular_core.Signal<AXConversationComposerAction[]>;
1647
- /** Left menu actions (location = 'menu') */
1648
- readonly leftMenuActions: _angular_core.Signal<AXConversationComposerAction[]>;
1649
- /** Right inline actions (location = 'inline' or undefined) */
1650
- readonly rightInlineActions: _angular_core.Signal<AXConversationComposerAction[]>;
1651
- /** Right menu actions (location = 'menu') */
1652
- readonly rightMenuActions: _angular_core.Signal<AXConversationComposerAction[]>;
1669
+ /** Whether AI/generation is in progress */
1670
+ readonly isGenerating: _angular_core.Signal<boolean>;
1671
+ /** Whether cancel cleanup is in progress */
1672
+ readonly isStopping: _angular_core.Signal<boolean>;
1673
+ /** Primary button mode */
1674
+ readonly primaryButtonMode: _angular_core.Signal<_acorex_components_conversation.AXConversationComposerPrimaryButtonMode>;
1675
+ /** Start actions from registry - use service */
1676
+ readonly startActions: _angular_core.Signal<AXConversationComposerAction[]>;
1677
+ /** End actions from registry - use service */
1678
+ readonly endActions: _angular_core.Signal<AXConversationComposerAction[]>;
1679
+ /** Start inline actions */
1680
+ readonly startInlineActions: _angular_core.Signal<AXConversationComposerAction[]>;
1681
+ /** Start menu actions (attachment popup) */
1682
+ readonly startMenuActions: _angular_core.Signal<AXConversationComposerAction[]>;
1683
+ /** End inline actions inside input pill */
1684
+ readonly endInlineActions: _angular_core.Signal<AXConversationComposerAction[]>;
1685
+ /** End menu actions */
1686
+ readonly endMenuActions: _angular_core.Signal<AXConversationComposerAction[]>;
1687
+ /** Default end action (voice/send morph) */
1688
+ readonly defaultAction: _angular_core.Signal<AXConversationComposerAction>;
1653
1689
  /** Handle key down */
1654
1690
  onKeyDown(event: AXHtmlEvent<KeyboardEvent>): void;
1655
1691
  /** Handle input */
1656
1692
  onInput(): void;
1657
1693
  /** Send typing indicator (throttled via RxJS) */
1658
1694
  private sendTypingIndicator;
1695
+ private stopTypingIndicator;
1696
+ private typingStopHandle?;
1659
1697
  /** Cleanup on destroy */
1660
1698
  ngOnDestroy(): void;
1661
1699
  /** Handle send click */
1662
1700
  onSendClick(): Promise<void>;
1663
1701
  /** Handle emoji click */
1664
- onEmojiClick(event?: MouseEvent): Promise<void>;
1702
+ onEmojiClick(event?: AXClickEvent | MouseEvent): Promise<void>;
1665
1703
  /** Handle emoji popover closed */
1666
1704
  onEmojiPopoverClosed(): void;
1667
1705
  /** Handle emoji/sticker selection from popup */
@@ -1670,8 +1708,21 @@ declare class AXConversationComposerComponent implements OnDestroy {
1670
1708
  private sendSticker;
1671
1709
  /** Get inputs for emoji popup component */
1672
1710
  getEmojiPopupInputs(): Record<string, unknown>;
1673
- /** Handle attach click */
1674
- onAttachClick(): void;
1711
+ /** Handle attach menu click */
1712
+ onAttachMenuClick(event: AXClickEvent): void;
1713
+ /** Handle attachment popover closed */
1714
+ onAttachPopoverClosed(): void;
1715
+ /** Handle attachment menu action selection */
1716
+ onAttachMenuAction(actionId: string): Promise<void>;
1717
+ /** Handle primary button click (send / cancel / stopping / voice / locked). */
1718
+ onPrimaryButtonClick(): Promise<void>;
1719
+ /** @deprecated Use onPrimaryButtonClick */
1720
+ onDefaultActionClick(): Promise<void>;
1721
+ getPrimaryButtonIcon(): string;
1722
+ getPrimaryButtonLabel(): string;
1723
+ isPrimaryButtonDisabled(): boolean;
1724
+ /** @deprecated Use getPrimaryButtonIcon */
1725
+ getDefaultActionIcon(): string;
1675
1726
  /** Handle voice click */
1676
1727
  onVoiceClick(): void;
1677
1728
  /** Remove attachment */
@@ -1684,8 +1735,9 @@ declare class AXConversationComposerComponent implements OnDestroy {
1684
1735
  startReply(message: AXConversationMessage): void;
1685
1736
  /** Focus the native textarea inside ax-text-area */
1686
1737
  private focusTextArea;
1738
+ private getClickTarget;
1687
1739
  /** Handle action click */
1688
- onActionClick(actionId: string, event?: MouseEvent): Promise<void>;
1740
+ onActionClick(actionId: string, event?: AXClickEvent | MouseEvent, initialFiles?: File[]): Promise<void>;
1689
1741
  /** Check if action is enabled */
1690
1742
  isActionEnabled(action: any): boolean;
1691
1743
  /** Get replying sender name */
@@ -1693,6 +1745,9 @@ declare class AXConversationComposerComponent implements OnDestroy {
1693
1745
  getActionLabel(action: {
1694
1746
  label: string;
1695
1747
  }): string;
1748
+ getActionButtonClass(action: {
1749
+ className?: string;
1750
+ }): string;
1696
1751
  /** Get replying message text */
1697
1752
  getReplyingMessageText(): string;
1698
1753
  /** Preview object for replying banner (type, icon, value) */
@@ -1713,13 +1768,11 @@ declare class AXConversationComposerComponent implements OnDestroy {
1713
1768
  }): string;
1714
1769
  /** Handle reply preview click - scroll to original message */
1715
1770
  onReplyPreviewClick(): void;
1716
- /** Inputs for picker / full-width composer components */
1771
+ /** Inputs for picker components opened in popup / action sheet */
1717
1772
  private buildPickerInputs;
1718
- /** Get inputs for dynamic component */
1719
- getComponentInputs(): Record<string, unknown>;
1720
1773
  onEnter(event: AXHtmlEvent<KeyboardEvent>): Promise<void>;
1721
1774
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXConversationComposerComponent, never>;
1722
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXConversationComposerComponent, "ax-conversation-composer", never, {}, { "messageSent": "messageSent"; "emojiClick": "emojiClick"; "attachClick": "attachClick"; "voiceClick": "voiceClick"; }, never, never, true, never>;
1775
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXConversationComposerComponent, "ax-conversation-composer", never, {}, { "messageSent": "messageSent"; "generationCancelled": "generationCancelled"; "emojiClick": "emojiClick"; "attachClick": "attachClick"; "voiceClick": "voiceClick"; }, never, never, true, never>;
1723
1776
  }
1724
1777
 
1725
1778
  declare class AXConversationContainerComponent {
@@ -1728,6 +1781,8 @@ declare class AXConversationContainerComponent {
1728
1781
  private readonly fileService;
1729
1782
  private readonly translation;
1730
1783
  private readonly toast;
1784
+ private readonly platform;
1785
+ private readonly actionSheetService;
1731
1786
  private readonly hostRef;
1732
1787
  private readonly platformId;
1733
1788
  protected readonly config: Required<_acorex_components_conversation.AXConversationConfig>;
@@ -1761,6 +1816,8 @@ declare class AXConversationContainerDirective {
1761
1816
  private readonly platformId;
1762
1817
  private readonly translation;
1763
1818
  private readonly toast;
1819
+ private readonly platform;
1820
+ private readonly actionSheetService;
1764
1821
  private readonly config;
1765
1822
  constructor();
1766
1823
  private get registry();
@@ -1788,59 +1845,51 @@ interface AXConversationDropdownMenuItem {
1788
1845
  declare class AXConversationInfoBarComponent {
1789
1846
  private readonly conversationService;
1790
1847
  private readonly infoBar;
1848
+ private readonly platform;
1849
+ private readonly destroyRef;
1850
+ private readonly customUserAvatarComponent;
1851
+ private readonly layoutTick;
1852
+ constructor();
1791
1853
  protected get registry(): _acorex_components_conversation.AXConversationRegistryService;
1792
- /** Active conversation */
1854
+ readonly hasCustomUserAvatar: _angular_core.Signal<boolean>;
1793
1855
  readonly activeConversation: _angular_core.Signal<AXConversation>;
1794
- /** Active component from service */
1795
1856
  readonly activeComponent: _angular_core.Signal<_acorex_components_conversation.AXConversationInfoBarActiveComponent>;
1796
- /** Active banner from service */
1797
1857
  readonly activeBanner: _angular_core.Signal<_acorex_components_conversation.AXConversationInfoBarActiveBanner>;
1798
- /** Members popover target element — retained for API compatibility */
1799
1858
  readonly membersPopoverTarget: _angular_core.WritableSignal<HTMLElement>;
1800
- /** Loading state for async actions */
1801
1859
  readonly actionLoading: _angular_core.WritableSignal<boolean>;
1802
- /** Info area clicked — opens conversation profile panel */
1803
1860
  readonly infoClick: _angular_core.OutputEmitterRef<void>;
1804
- /** @deprecated Use infoClick — kept for backward compatibility */
1805
- readonly avatarClick: _angular_core.OutputEmitterRef<void>;
1806
- /** Search clicked event */
1807
1861
  readonly searchClick: _angular_core.OutputEmitterRef<void>;
1808
- /** Search query changed event */
1809
1862
  readonly searchQuery: _angular_core.OutputEmitterRef<string>;
1810
- /** Menu item clicked event */
1811
1863
  readonly menuItemAction: _angular_core.OutputEmitterRef<string>;
1812
- /** Inline action buttons from registry */
1813
- readonly inlineActions: _angular_core.Signal<_acorex_components_conversation.AXConversationInfoBarAction[]>;
1814
- /** Dropdown menu items from registry */
1864
+ readonly inlineActions: _angular_core.Signal<AXConversationInfoBarAction[]>;
1815
1865
  readonly menuItems: _angular_core.Signal<AXConversationDropdownMenuItem[]>;
1816
- /** Get conversation status - delegate to utils */
1817
- getStatus(conversation: AXConversation): 'online' | 'offline' | 'away' | undefined;
1818
- /** Get subtitle text - delegate to utils */
1866
+ getStatus(conversation: AXConversation): _acorex_components_conversation.AXConversationPresenceStatus;
1819
1867
  getSubtitle(conversation: AXConversation): string;
1820
- /** Open conversation info panel when the left info area is clicked */
1821
1868
  onInfoLeftClick(): void;
1822
- /** Handle inline action click */
1823
1869
  onInlineActionClick(actionId: string): Promise<void>;
1824
- /** Get inputs for dynamic component */
1870
+ private activateAction;
1825
1871
  getComponentInputs(): Record<string, unknown>;
1826
1872
  getInlineComponentInputs(): Record<string, unknown>;
1827
1873
  isActiveComponentFullWidth(): boolean;
1828
- /** Handle close component */
1829
1874
  onCloseComponent(): void;
1830
1875
  getBannerInputs(): Record<string, unknown>;
1831
1876
  onCloseBanner(): void;
1832
- /** Handle menu item click */
1833
1877
  onMenuItemClick(item: AXConversationDropdownMenuItem): Promise<void>;
1834
1878
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXConversationInfoBarComponent, never>;
1835
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXConversationInfoBarComponent, "ax-conversation-info-bar", never, {}, { "infoClick": "infoClick"; "avatarClick": "avatarClick"; "searchClick": "searchClick"; "searchQuery": "searchQuery"; "menuItemAction": "menuItemAction"; }, never, ["ax-prefix"], true, never>;
1879
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXConversationInfoBarComponent, "ax-conversation-info-bar", never, {}, { "infoClick": "infoClick"; "searchClick": "searchClick"; "searchQuery": "searchQuery"; "menuItemAction": "menuItemAction"; }, never, ["ax-prefix"], true, never>;
1836
1880
  }
1837
1881
 
1838
1882
  /**
1883
+
1839
1884
  * Shared API Types
1885
+
1840
1886
  * Common types used across all API services
1887
+
1841
1888
  */
1842
1889
  /**
1890
+
1843
1891
  * Pagination parameters
1892
+
1844
1893
  */
1845
1894
  interface AXConversationPagination {
1846
1895
  /** Page number (0-based) */
@@ -1855,7 +1904,9 @@ interface AXConversationPagination {
1855
1904
  sortDirection?: 'asc' | 'desc';
1856
1905
  }
1857
1906
  /**
1907
+
1858
1908
  * Paginated response
1909
+
1859
1910
  */
1860
1911
  interface AXConversationPaginatedResult<T> {
1861
1912
  /** Result items */
@@ -1874,7 +1925,9 @@ interface AXConversationPaginatedResult<T> {
1874
1925
  totalPages?: number;
1875
1926
  }
1876
1927
  /**
1928
+
1877
1929
  * Pagination cursor state for a single list (conversations or messages).
1930
+
1878
1931
  */
1879
1932
  interface AXConversationPaginationState {
1880
1933
  page: number;
@@ -1882,11 +1935,15 @@ interface AXConversationPaginationState {
1882
1935
  nextCursor?: string;
1883
1936
  }
1884
1937
  /**
1938
+
1885
1939
  * Connection status
1940
+
1886
1941
  */
1887
1942
  type AXConversationConnectionStatus = 'disconnected' | 'connecting' | 'connected' | 'reconnecting' | 'error';
1888
1943
  /**
1944
+
1889
1945
  * API Error with details
1946
+
1890
1947
  */
1891
1948
  interface AXConversationApiError {
1892
1949
  /** Error code */
@@ -1900,14 +1957,6 @@ interface AXConversationApiError {
1900
1957
  /** Timestamp */
1901
1958
  timestamp?: Date;
1902
1959
  }
1903
- /**
1904
- * User presence status
1905
- */
1906
- type AXConversationPresenceStatus = 'online' | 'offline' | 'away' | 'busy' | 'invisible';
1907
- /**
1908
- * User role in conversation
1909
- */
1910
- type AXConversationUserRole = 'owner' | 'admin' | 'member' | 'guest';
1911
1960
 
1912
1961
  type AXConversationApiName = 'userApi' | 'conversationApi' | 'messageApi' | 'realtimeApi';
1913
1962
  interface AXConversationApiLogEntry {
@@ -1927,11 +1976,6 @@ declare class AXConversationApiLoggerService {
1927
1976
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<AXConversationApiLoggerService>;
1928
1977
  }
1929
1978
 
1930
- /**
1931
- * Abstract Conversation Management API
1932
- * Handle conversation CRUD operations, participants, and settings
1933
- */
1934
-
1935
1979
  /**
1936
1980
  * Conversation creation data
1937
1981
  */
@@ -1999,20 +2043,9 @@ interface AXConversationFilters {
1999
2043
  custom?: Record<string, unknown>;
2000
2044
  }
2001
2045
  /**
2002
- * Conversation settings update
2046
+ * @deprecated Use {@link AXConversationRoomPreferences} on the user API instead.
2003
2047
  */
2004
- interface AXConversationSettingsUpdate {
2005
- /** Muted until timestamp */
2006
- mutedUntil?: Date;
2007
- /** Show notifications */
2008
- notifications?: boolean;
2009
- /** Custom notification sound */
2010
- notificationSound?: string;
2011
- /** Show message preview in notifications */
2012
- showPreview?: boolean;
2013
- /** Custom settings */
2014
- custom?: Record<string, unknown>;
2015
- }
2048
+ type AXConversationSettingsUpdate = AXConversationRoomPreferences;
2016
2049
  /**
2017
2050
  * Participant update data
2018
2051
  */
@@ -2020,7 +2053,7 @@ interface AXConversationParticipantUpdate {
2020
2053
  /** User ID */
2021
2054
  userId: string;
2022
2055
  /** New role */
2023
- role?: AXConversationUserRole;
2056
+ role?: AXConversationParticipantRole;
2024
2057
  }
2025
2058
  /**
2026
2059
  * Abstract Conversation Management API
@@ -2121,13 +2154,6 @@ declare abstract class AXConversationApi {
2121
2154
  * @throws {AXConversationApiError} If marking fails
2122
2155
  */
2123
2156
  abstract markConversationAsRead(conversationId: string): Promise<void>;
2124
- /**
2125
- * Mark conversation as unread
2126
- *
2127
- * @param conversationId - Conversation ID
2128
- * @throws {AXConversationApiError} If marking fails
2129
- */
2130
- abstract markConversationAsUnread(conversationId: string): Promise<void>;
2131
2157
  /**
2132
2158
  * Search conversations
2133
2159
  *
@@ -2187,37 +2213,6 @@ declare abstract class AXConversationApi {
2187
2213
  * @throws {AXConversationApiError} If update fails
2188
2214
  */
2189
2215
  abstract updateParticipant(conversationId: string, update: AXConversationParticipantUpdate): Promise<AXConversation>;
2190
- /**
2191
- * Get conversation settings
2192
- *
2193
- * @param conversationId - Conversation ID
2194
- * @returns Conversation settings
2195
- * @throws {AXConversationApiError} If request fails
2196
- */
2197
- abstract getConversationSettings(conversationId: string): Promise<AXConversationSettingsUpdate>;
2198
- /**
2199
- * Update conversation settings
2200
- *
2201
- * @param conversationId - Conversation ID
2202
- * @param settings - Settings to update
2203
- * @throws {AXConversationApiError} If update fails
2204
- */
2205
- abstract updateConversationSettings(conversationId: string, settings: AXConversationSettingsUpdate): Promise<void>;
2206
- /**
2207
- * Mute conversation
2208
- *
2209
- * @param conversationId - Conversation ID
2210
- * @param duration - Mute duration in milliseconds (undefined = forever)
2211
- * @throws {AXConversationApiError} If muting fails
2212
- */
2213
- abstract muteConversation(conversationId: string, duration?: number): Promise<void>;
2214
- /**
2215
- * Unmute conversation
2216
- *
2217
- * @param conversationId - Conversation ID
2218
- * @throws {AXConversationApiError} If unmuting fails
2219
- */
2220
- abstract unmuteConversation(conversationId: string): Promise<void>;
2221
2216
  /**
2222
2217
  * Upload conversation avatar
2223
2218
  *
@@ -3016,7 +3011,7 @@ declare abstract class AXConversationUserApi {
3016
3011
  * @returns Current user information
3017
3012
  * @throws {AXConversationApiError} If user is not authenticated
3018
3013
  */
3019
- abstract getCurrentUser(): Promise<AXConversationParticipant>;
3014
+ abstract getCurrentUser(): Promise<AXConversationUser>;
3020
3015
  /**
3021
3016
  * Update current user profile
3022
3017
  *
@@ -3024,7 +3019,7 @@ declare abstract class AXConversationUserApi {
3024
3019
  * @returns Updated user information
3025
3020
  * @throws {AXConversationApiError} If update fails
3026
3021
  */
3027
- abstract updateProfile(updates: AXConversationUserProfileUpdate): Promise<AXConversationParticipant>;
3022
+ abstract updateProfile(updates: AXConversationUserProfileUpdate): Promise<AXConversationUser>;
3028
3023
  /**
3029
3024
  * Upload user avatar
3030
3025
  *
@@ -3074,6 +3069,10 @@ declare abstract class AXConversationUserApi {
3074
3069
  * @throws {AXConversationApiError} If request fails
3075
3070
  */
3076
3071
  abstract getUserPresence(userId: string): Promise<AXConversationPresenceUpdate>;
3072
+ /**
3073
+ * Get presence for multiple users (bulk hydration).
3074
+ */
3075
+ abstract getUsersPresence(userIds: string[]): Promise<AXConversationPresenceUpdate[]>;
3077
3076
  /**
3078
3077
  * Update current user presence
3079
3078
  *
@@ -3126,6 +3125,18 @@ declare abstract class AXConversationUserApi {
3126
3125
  * @throws {AXConversationApiError} If update fails
3127
3126
  */
3128
3127
  abstract updateUserSettings(settings: Record<string, unknown>): Promise<void>;
3128
+ /**
3129
+ * Get all conversation preferences for the current user.
3130
+ */
3131
+ abstract getConversationPreferences(): Promise<AXConversationRoomPreferencesMap>;
3132
+ /**
3133
+ * Get preferences for a single conversation.
3134
+ */
3135
+ abstract getConversationPreferencesForRoom(conversationId: string): Promise<AXConversationRoomPreferences>;
3136
+ /**
3137
+ * Update preferences for a conversation (current user's view).
3138
+ */
3139
+ abstract updateConversationPreferences(conversationId: string, preferences: Partial<AXConversationRoomPreferences>): Promise<AXConversationRoomPreferences>;
3129
3140
  /**
3130
3141
  * Create an API error
3131
3142
  * Helper method for consistent error creation
@@ -3139,6 +3150,27 @@ declare abstract class AXConversationUserApi {
3139
3150
  protected createError(code: string, message: string, statusCode?: number, details?: unknown): AXConversationApiError;
3140
3151
  }
3141
3152
 
3153
+ type AXConversationComposerGenerationPhase = 'idle' | 'generating' | 'stopping';
3154
+ declare class AXConversationComposerGenerationStateService {
3155
+ private readonly _phase;
3156
+ private readonly _cancelled$;
3157
+ /** Current generation lifecycle phase. */
3158
+ readonly phase: _angular_core.Signal<AXConversationComposerGenerationPhase>;
3159
+ /** Whether a background generation (e.g. AI response) is in progress. */
3160
+ readonly isGenerating: _angular_core.Signal<boolean>;
3161
+ /** Whether generation is being cancelled (spinner / locked until API finishes). */
3162
+ readonly isStopping: _angular_core.Signal<boolean>;
3163
+ /** Whether generation or stop-cleanup is in progress. */
3164
+ readonly isBusy: _angular_core.Signal<boolean>;
3165
+ /** Emits when the user presses the composer cancel/stop button. */
3166
+ readonly onCancelled: rxjs.Observable<void>;
3167
+ setGenerating(value: boolean): void;
3168
+ /** User requested cancel — enters `stopping` until {@link setGenerating}(false) is called. */
3169
+ cancel(): void;
3170
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXConversationComposerGenerationStateService, never>;
3171
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<AXConversationComposerGenerationStateService>;
3172
+ }
3173
+
3142
3174
  /**
3143
3175
  * Central Registry Service
3144
3176
  * Provides unified access to all registries
@@ -3205,9 +3237,17 @@ declare class AXConversationService {
3205
3237
  private readonly destroy$;
3206
3238
  /** Registry service - exposed for child services */
3207
3239
  readonly registry: AXConversationRegistryService;
3240
+ private readonly composerGenerationState;
3241
+ /** Whether the composer primary button is in cancel (generation) mode. */
3242
+ readonly isGenerating: _angular_core.Signal<boolean>;
3243
+ /** Whether cancel cleanup is in progress. */
3244
+ readonly isStopping: _angular_core.Signal<boolean>;
3245
+ /** Emits when the user cancels an in-progress generation from the composer. */
3246
+ readonly onGenerationCancelled: rxjs.Observable<void>;
3208
3247
  private readonly _activeConversationId;
3209
3248
  private readonly _loading;
3210
3249
  private readonly _loadingActiveMessages;
3250
+ private readonly _isForwardingMessage;
3211
3251
  private readonly _error;
3212
3252
  private readonly _conversationsPagination;
3213
3253
  private readonly _messagesPaginationByConversation;
@@ -3230,6 +3270,8 @@ declare class AXConversationService {
3230
3270
  readonly loading: _angular_core.Signal<boolean>;
3231
3271
  /** Loading state for the active conversation's message history */
3232
3272
  readonly loadingActiveMessages: _angular_core.Signal<boolean>;
3273
+ /** Whether a message forward operation is in progress. */
3274
+ readonly isForwardingMessage: _angular_core.Signal<boolean>;
3233
3275
  /** Sidebar conversation list pagination */
3234
3276
  readonly conversationsPagination: _angular_core.Signal<AXConversationPaginationState>;
3235
3277
  /** Active conversation message pagination */
@@ -3246,7 +3288,10 @@ declare class AXConversationService {
3246
3288
  readonly onTypingIndicator: rxjs.Observable<AXConversationTypingIndicator>;
3247
3289
  readonly onPresenceChange: rxjs.Observable<AXConversationPresenceUpdate>;
3248
3290
  private _currentUser;
3249
- readonly currentUser: _angular_core.Signal<_acorex_components_conversation.AXConversationParticipant>;
3291
+ readonly currentUser: _angular_core.Signal<AXConversationUser>;
3292
+ readonly userPresenceMap: _angular_core.Signal<Map<string, AXConversationUserPresence>>;
3293
+ readonly presenceTimeTick: _angular_core.Signal<Map<string, AXConversationUserPresence>>;
3294
+ readonly typingRevision: _angular_core.Signal<Map<string, Map<string, number>>>;
3250
3295
  /** One-time async initialization (connect, user, conversations, realtime). */
3251
3296
  private initPromise;
3252
3297
  /** Generation counter — stale page-0 loads are ignored after conversation switches. */
@@ -3256,6 +3301,10 @@ declare class AXConversationService {
3256
3301
  /** Batched read-receipt queue keyed by conversation ID. */
3257
3302
  private readonly readQueue;
3258
3303
  private readFlushHandle;
3304
+ private presenceTickHandle?;
3305
+ private typingPruneHandle?;
3306
+ private isTypingActiveForConversation;
3307
+ private typingStopHandle?;
3259
3308
  /** Session cache for available reaction emojis. */
3260
3309
  private availableReactionsCache;
3261
3310
  private availableReactionsPromise;
@@ -3279,6 +3328,13 @@ declare class AXConversationService {
3279
3328
  * All subscriptions include error handling to prevent stream termination
3280
3329
  */
3281
3330
  private subscribeToEvents;
3331
+ getUserPresence(userId: string): AXConversationUserPresence | undefined;
3332
+ getRoomPreferences(conversationId: string): AXConversationRoomPreferences;
3333
+ isAnyoneTyping(conversationId: string): boolean;
3334
+ getActiveTypingUserIds(conversationId: string): string[];
3335
+ getPeerPresence(conversation: AXConversation): AXConversationUserPresence | undefined;
3336
+ private hydrateUserPresence;
3337
+ private loadRoomPreferences;
3282
3338
  /**
3283
3339
  * Load conversations from server
3284
3340
  * Includes comprehensive error handling
@@ -3311,6 +3367,7 @@ declare class AXConversationService {
3311
3367
  * Resolve a media reference to a playback/download URL.
3312
3368
  */
3313
3369
  resolveMediaUrl(reference: AXConversationUploaderReference, signal?: AbortSignal): Promise<string>;
3370
+ private resolveReplyTo;
3314
3371
  /**
3315
3372
  * Send a message
3316
3373
  * Uses optimistic UI updates - message appears immediately
@@ -3361,11 +3418,21 @@ declare class AXConversationService {
3361
3418
  * Marks messages locally and syncs with server
3362
3419
  */
3363
3420
  markAsRead(conversationId: string): Promise<void>;
3421
+ /**
3422
+ * Set composer generation mode (shows cancel button instead of send/voice).
3423
+ * Call from message APIs while an AI or async response is in progress.
3424
+ */
3425
+ setGenerating(value: boolean): void;
3426
+ /**
3427
+ * Cancel an in-progress generation from the composer UI or programmatically.
3428
+ */
3429
+ cancelGeneration(): void;
3364
3430
  /**
3365
3431
  * Send typing indicator
3366
3432
  * Non-critical operation, doesn't throw on failure
3367
3433
  */
3368
3434
  sendTypingIndicator(conversationId: string): Promise<void>;
3435
+ stopTypingIndicator(conversationId: string): Promise<void>;
3369
3436
  /**
3370
3437
  * Search conversations
3371
3438
  * Returns empty array on failure
@@ -3401,11 +3468,17 @@ declare class AXConversationService {
3401
3468
  * Updates conversation metadata including unread count, last message, etc.
3402
3469
  */
3403
3470
  private handleConversationUpdate;
3471
+ private handleConversationCreated;
3472
+ private handleConversationDeleted;
3473
+ private handleReadReceipt;
3474
+ private handleMessageStatusChange;
3475
+ private handleRoomPreferencesChange;
3404
3476
  /**
3405
3477
  * Insert or refresh a conversation in the in-memory inbox.
3406
3478
  * @param promote When true, bumps activity so the chat sorts to the top (create / reopen).
3407
3479
  */
3408
3480
  private syncConversationToInbox;
3481
+ private finalizeSentMessage;
3409
3482
  /**
3410
3483
  * Update conversation's last message
3411
3484
  */
@@ -3421,7 +3494,7 @@ declare class AXConversationService {
3421
3494
  * @param conversationId - Conversation ID
3422
3495
  * @param settings - Partial settings to update
3423
3496
  */
3424
- updateConversationSettings(conversationId: string, settings: Partial<AXConversation['settings']>): Promise<void>;
3497
+ updateConversationSettings(conversationId: string, settings: Partial<AXConversationRoomPreferences>): Promise<void>;
3425
3498
  /**
3426
3499
  * Update conversation title
3427
3500
  * @param conversationId - Conversation ID
@@ -3564,6 +3637,10 @@ declare class AXConversationService {
3564
3637
  * @param caption - Optional caption
3565
3638
  */
3566
3639
  forwardMessage(messageId: string, conversationIds: string[], caption?: string): Promise<void>;
3640
+ /**
3641
+ * Runs a forward operation while locking all forward actions until it completes.
3642
+ */
3643
+ runWithForwardingLock<T>(task: () => Promise<T>): Promise<T>;
3567
3644
  /**
3568
3645
  * Search messages in conversation
3569
3646
  * @param conversationId - Conversation ID
@@ -3618,7 +3695,7 @@ declare class AXConversationService {
3618
3695
  * @param status - Presence status
3619
3696
  * @param statusText - Optional status text
3620
3697
  */
3621
- updatePresence(status: 'online' | 'offline' | 'away' | 'busy' | 'invisible', statusText?: string): Promise<void>;
3698
+ updatePresence(status: AXConversationPresenceStatus, statusText?: string): Promise<void>;
3622
3699
  /**
3623
3700
  * Validate message content before sending
3624
3701
  * Uses centralized validation utilities for consistency
@@ -3766,6 +3843,7 @@ declare class AXConversationForwardMessageDialogComponent implements OnInit {
3766
3843
  readonly forwardListEmptyTpl: _angular_core.Signal<TemplateRef<unknown>>;
3767
3844
  readonly forwardList: _angular_core.Signal<AXListComponent>;
3768
3845
  readonly forwardListDataSource: AXDataSource<unknown>;
3846
+ readonly isForwarding: _angular_core.Signal<boolean>;
3769
3847
  readonly canForward: _angular_core.Signal<boolean>;
3770
3848
  private readonly _syncPopupTitleEffect;
3771
3849
  ngOnInit(): void;
@@ -3800,6 +3878,7 @@ declare class AXConversationMessageListComponent implements OnDestroy {
3800
3878
  private readonly translation;
3801
3879
  private readonly document;
3802
3880
  private readonly platform;
3881
+ private readonly actionSheetService;
3803
3882
  protected readonly config: Required<_acorex_components_conversation.AXConversationConfig>;
3804
3883
  /**
3805
3884
  * Background for the message list scroll area from config, or the built-in soft wash when unset/empty.
@@ -3838,6 +3917,9 @@ declare class AXConversationMessageListComponent implements OnDestroy {
3838
3917
  readonly showScrollButton: _angular_core.WritableSignal<boolean>;
3839
3918
  /** Active conversation */
3840
3919
  readonly activeConversation: _angular_core.Signal<_acorex_components_conversation.AXConversation>;
3920
+ readonly isGroupConversation: _angular_core.Signal<boolean>;
3921
+ /** Placeholder indices for the initial message list skeleton. */
3922
+ protected readonly loadingSkeletonItems: readonly [0, 1, 2, 3, 4, 5];
3841
3923
  /** Whether the active conversation allows message reactions. */
3842
3924
  readonly reactionsEnabled: _angular_core.Signal<boolean>;
3843
3925
  /** Messages */
@@ -3848,7 +3930,7 @@ declare class AXConversationMessageListComponent implements OnDestroy {
3848
3930
  action: string;
3849
3931
  }>;
3850
3932
  /** Current user from service */
3851
- readonly currentUser: _angular_core.Signal<_acorex_components_conversation.AXConversationParticipant>;
3933
+ readonly currentUser: _angular_core.Signal<_acorex_components_conversation.AXConversationUser>;
3852
3934
  /** Message grouped by date - use service */
3853
3935
  readonly messageGroups: _angular_core.Signal<{
3854
3936
  date: string;
@@ -3885,6 +3967,7 @@ declare class AXConversationMessageListComponent implements OnDestroy {
3885
3967
  /** Resolve renderer component for message */
3886
3968
  getRendererComponent(message: AXConversationMessage): Type<_acorex_components_conversation.AXConversationMessageRendererComponent>;
3887
3969
  /** Resolve lazy renderer loader for message */
3970
+ private static readonly fallbackRendererLoader;
3888
3971
  getRendererComponentLoader(message: AXConversationMessage): (() => Promise<Type<_acorex_components_conversation.AXConversationMessageRendererComponent>>) | (() => Promise<typeof _acorex_components_conversation.AXConversationFallbackRendererComponent>);
3889
3972
  /** Provide inputs for the dynamic renderer */
3890
3973
  getRendererInputs(message: AXConversationMessage): {
@@ -3979,7 +4062,7 @@ declare class AXConversationMessageListComponent implements OnDestroy {
3979
4062
  handleMessageContextMenuItemClick(event: AXContextMenuItemsClickEvent, message: AXConversationMessage): void;
3980
4063
  /**
3981
4064
  * TrackBy function for message groups.
3982
- * Include the latest message id so new messages in the same date group re-render.
4065
+ * Track by date only new messages in the same day are handled by the inner message @for.
3983
4066
  */
3984
4067
  trackMessageGroup(index: number, group: {
3985
4068
  date: string;
@@ -3999,7 +4082,7 @@ declare class AXConversationMessageListService {
3999
4082
  private get registry();
4000
4083
  readonly activeConversation: _angular_core.Signal<_acorex_components_conversation.AXConversation>;
4001
4084
  readonly activeMessages: _angular_core.Signal<AXConversationMessage[]>;
4002
- readonly currentUser: _angular_core.Signal<_acorex_components_conversation.AXConversationParticipant>;
4085
+ readonly currentUser: _angular_core.Signal<_acorex_components_conversation.AXConversationUser>;
4003
4086
  /** Initial message history load (conversation switch) */
4004
4087
  readonly loading: _angular_core.Signal<boolean>;
4005
4088
  /** Loading older messages (scroll-up pagination) */
@@ -4049,6 +4132,104 @@ declare class AXConversationMessageListService {
4049
4132
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<AXConversationMessageListService>;
4050
4133
  }
4051
4134
 
4135
+ declare class AXConversationAvatarPickerComponent {
4136
+ readonly fileInput: _angular_core.Signal<ElementRef<HTMLInputElement>>;
4137
+ readonly showClearButton: _angular_core.InputSignal<boolean>;
4138
+ readonly avatarUrl: _angular_core.ModelSignal<string>;
4139
+ readonly onFileSelected: _angular_core.OutputEmitterRef<string>;
4140
+ triggerFileInput(): void;
4141
+ onFileInputChange(event: Event): Promise<void>;
4142
+ clearAvatar(): void;
4143
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXConversationAvatarPickerComponent, never>;
4144
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXConversationAvatarPickerComponent, "ax-conversation-avatar-picker", never, { "showClearButton": { "alias": "showClearButton"; "required": false; "isSignal": true; }; "avatarUrl": { "alias": "avatarUrl"; "required": false; "isSignal": true; }; }, { "avatarUrl": "avatarUrlChange"; "onFileSelected": "onFileSelected"; }, never, never, true, never>;
4145
+ }
4146
+
4147
+ /**
4148
+ * Pluggable avatar components for the conversation UI.
4149
+ * Register via `provideConversation({ avatarComponents: { user, conversation } })`.
4150
+ * When only `user` is registered, a built-in conversation avatar host is wired automatically.
4151
+ */
4152
+
4153
+ /** Custom user avatar (e.g. platform `axp-user-avatar`). */
4154
+ interface AXConversationUserAvatarComponent {
4155
+ readonly userId: InputSignal<string>;
4156
+ readonly size: InputSignal<number>;
4157
+ /** Optional resolved display name (e.g. bot/assist peer title). */
4158
+ readonly displayName?: InputSignal<string | undefined>;
4159
+ /** Optional resolved avatar URL when `userId` is not a platform user row. */
4160
+ readonly displayAvatar?: InputSignal<string | undefined>;
4161
+ /** Optional icon class when no avatar image is available. */
4162
+ readonly displayIcon?: InputSignal<string | undefined>;
4163
+ }
4164
+ /** Optional custom group/channel conversation avatar. */
4165
+ interface AXConversationConversationAvatarComponent {
4166
+ readonly conversationId: InputSignal<string>;
4167
+ readonly size: InputSignal<number>;
4168
+ /** Optional resolved display name for the conversation. */
4169
+ readonly displayName?: InputSignal<string | undefined>;
4170
+ /** Optional resolved avatar URL when no platform conversation row exists. */
4171
+ readonly displayAvatar?: InputSignal<string | undefined>;
4172
+ /** Optional icon class when no avatar image is available. */
4173
+ readonly displayIcon?: InputSignal<string | undefined>;
4174
+ }
4175
+ type AXConversationAvatarKind = 'user' | 'conversation' | 'auto';
4176
+ declare const AX_CONVERSATION_USER_AVATAR_COMPONENT: InjectionToken<Type<AXConversationUserAvatarComponent>>;
4177
+ declare const AX_CONVERSATION_CONVERSATION_AVATAR_COMPONENT: InjectionToken<Type<AXConversationConversationAvatarComponent>>;
4178
+ interface AXConversationAvatarComponents {
4179
+ user?: Type<AXConversationUserAvatarComponent>;
4180
+ conversation?: Type<AXConversationConversationAvatarComponent>;
4181
+ }
4182
+
4183
+ declare class AXConversationAvatarComponent {
4184
+ private readonly conversationService;
4185
+ private readonly userAvatarComponent;
4186
+ private readonly conversationAvatarComponent;
4187
+ readonly kind: _angular_core.InputSignal<AXConversationAvatarKind>;
4188
+ readonly userId: _angular_core.InputSignal<string>;
4189
+ readonly conversation: _angular_core.InputSignal<AXConversation>;
4190
+ readonly message: _angular_core.InputSignal<AXConversationMessage>;
4191
+ readonly size: _angular_core.InputSignal<number>;
4192
+ readonly showStatus: _angular_core.InputSignal<boolean>;
4193
+ readonly name: _angular_core.InputSignal<string>;
4194
+ readonly avatar: _angular_core.InputSignal<string>;
4195
+ readonly icon: _angular_core.InputSignal<string>;
4196
+ private readonly currentUserId;
4197
+ readonly resolvedKind: _angular_core.Signal<"user" | "conversation">;
4198
+ readonly resolvedUserId: _angular_core.Signal<string>;
4199
+ readonly customComponent: _angular_core.Signal<Type<unknown>>;
4200
+ readonly customInputs: _angular_core.Signal<Record<string, unknown>>;
4201
+ readonly filteredCustomInputs: _angular_core.Signal<Record<string, unknown>>;
4202
+ readonly fallbackDisplay: _angular_core.Signal<{
4203
+ name: string;
4204
+ avatar: string;
4205
+ icon: string;
4206
+ }>;
4207
+ readonly fallbackInitials: _angular_core.Signal<string>;
4208
+ readonly resolvedStatus: _angular_core.Signal<_acorex_components_conversation.AXConversationPresenceStatus>;
4209
+ readonly statusBadgePresence: _angular_core.Signal<"online" | "offline" | "away" | "busy">;
4210
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXConversationAvatarComponent, never>;
4211
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXConversationAvatarComponent, "ax-conversation-avatar", never, { "kind": { "alias": "kind"; "required": false; "isSignal": true; }; "userId": { "alias": "userId"; "required": false; "isSignal": true; }; "conversation": { "alias": "conversation"; "required": false; "isSignal": true; }; "message": { "alias": "message"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "showStatus": { "alias": "showStatus"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "avatar": { "alias": "avatar"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
4212
+ }
4213
+
4214
+ interface AXConversationRegistryComponentRef {
4215
+ component?: Type<unknown>;
4216
+ componentLoader?: () => Promise<Type<unknown>>;
4217
+ }
4218
+ declare class AXConversationRegistryComponentOutletComponent {
4219
+ readonly component: _angular_core.InputSignal<Type<unknown>>;
4220
+ readonly componentLoader: _angular_core.InputSignal<() => Promise<Type<unknown>>>;
4221
+ readonly inputs: _angular_core.InputSignal<Record<string, unknown>>;
4222
+ readonly resolvedComponent: _angular_core.WritableSignal<Type<unknown>>;
4223
+ readonly loading: _angular_core.WritableSignal<boolean>;
4224
+ /** Avoid re-loading when the parent re-binds the same lazy loader reference. */
4225
+ private activeLoader;
4226
+ constructor();
4227
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXConversationRegistryComponentOutletComponent, never>;
4228
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXConversationRegistryComponentOutletComponent, "ax-conversation-registry-component-outlet", never, { "component": { "alias": "component"; "required": false; "isSignal": true; }; "componentLoader": { "alias": "componentLoader"; "required": false; "isSignal": true; }; "inputs": { "alias": "inputs"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
4229
+ }
4230
+ /** Resolve a registry component reference, preferring lazy loaders when provided. */
4231
+ declare function hasRegistryComponent(ref?: AXConversationRegistryComponentRef): boolean;
4232
+
4052
4233
  declare class AXConversationSidebarService {
4053
4234
  private readonly conversationService;
4054
4235
  constructor();
@@ -4233,8 +4414,10 @@ interface AXConversationConfig {
4233
4414
  infiniteScrollThreshold?: number;
4234
4415
  /** Typing indicator timeout in milliseconds */
4235
4416
  typingIndicatorTimeout?: number;
4236
- /** Typing indicator throttle in milliseconds (for rate limiting) */
4417
+ /** Typing indicator emit throttle in milliseconds while composing (default: 3000) */
4237
4418
  typingIndicatorThrottle?: number;
4419
+ /** How long to show received typing indicators in the UI (default: 4000) */
4420
+ typingDisplayDuration?: number;
4238
4421
  /** Message highlight duration in milliseconds */
4239
4422
  messageHighlightDuration?: number;
4240
4423
  /** Search debounce delay in milliseconds */
@@ -4283,31 +4466,20 @@ interface AXConversationConfig {
4283
4466
  }
4284
4467
 
4285
4468
  /**
4286
-
4287
4469
  * Default Configuration Values
4288
-
4289
4470
  * Centralized defaults to avoid magic numbers throughout the codebase
4290
-
4291
4471
  */
4292
4472
 
4293
4473
  /**
4294
-
4295
4474
  * Default conversation configuration
4296
-
4297
4475
  * All values are explicitly defined here for easy maintenance and documentation
4298
-
4299
4476
  */
4300
4477
  declare const AX_DEFAULT_CONVERSATION_CONFIG: Required<AXConversationConfig>;
4301
4478
  /**
4302
-
4303
4479
  * Helper function to merge user config with defaults
4304
-
4305
4480
  * Properly handles array merging to avoid reference issues
4306
-
4307
4481
  * @param userConfig - User-provided configuration
4308
-
4309
4482
  * @returns Merged configuration with all required fields
4310
-
4311
4483
  */
4312
4484
  declare function mergeWithDefaults(userConfig?: Partial<AXConversationConfig>): Required<AXConversationConfig>;
4313
4485
 
@@ -4327,38 +4499,8 @@ declare const AX_CONVERSATION_CONFIG: InjectionToken<Required<AXConversationConf
4327
4499
  declare const AX_CONVERSATION_ERROR_HANDLER_CONFIG: InjectionToken<Partial<AXConversationErrorHandlerConfig>>;
4328
4500
 
4329
4501
  /**
4330
- * Pluggable avatar components for the conversation UI.
4331
- * Register via `provideConversation({ avatarComponents: { user, conversation } })`.
4332
- * When only `user` is registered, a built-in conversation avatar host is wired automatically.
4333
- */
4334
-
4335
- /** Custom user avatar (e.g. platform `axp-user-avatar`). */
4336
- interface AXConversationUserAvatarComponent {
4337
- readonly userId: InputSignal<string>;
4338
- readonly size: InputSignal<number>;
4339
- /** Optional resolved display name (e.g. bot/assist peer title). */
4340
- readonly displayName?: InputSignal<string | undefined>;
4341
- /** Optional resolved avatar URL when `userId` is not a platform user row. */
4342
- readonly displayAvatar?: InputSignal<string | undefined>;
4343
- /** Optional icon class when no avatar image is available. */
4344
- readonly displayIcon?: InputSignal<string | undefined>;
4345
- }
4346
- /** Optional custom group/channel conversation avatar. */
4347
- interface AXConversationConversationAvatarComponent {
4348
- readonly conversationId: InputSignal<string>;
4349
- readonly size: InputSignal<number>;
4350
- }
4351
- type AXConversationAvatarKind = 'user' | 'conversation' | 'auto';
4352
- declare const AX_CONVERSATION_USER_AVATAR_COMPONENT: InjectionToken<Type<AXConversationUserAvatarComponent>>;
4353
- declare const AX_CONVERSATION_CONVERSATION_AVATAR_COMPONENT: InjectionToken<Type<AXConversationConversationAvatarComponent>>;
4354
- interface AXConversationAvatarComponents {
4355
- user?: Type<AXConversationUserAvatarComponent>;
4356
- conversation?: Type<AXConversationConversationAvatarComponent>;
4357
- }
4358
-
4359
- /**
4360
- * Registry Configuration Tokens
4361
- * Injection tokens for configuring default registry values
4502
+ * Registry Configuration Tokens
4503
+ * Injection tokens for configuring default registry values
4362
4504
  */
4363
4505
 
4364
4506
  /**
@@ -4425,472 +4567,6 @@ interface AXConversationRegistryConfiguration {
4425
4567
  */
4426
4568
  declare const AX_CONVERSATION_REGISTRY_CONFIG: InjectionToken<AXConversationRegistryConfiguration>;
4427
4569
 
4428
- /**
4429
- * IndexedDB Storage Wrapper
4430
- * Provides persistent storage for conversation data
4431
- */
4432
-
4433
- declare const AXConversationIndexedDbStores: {
4434
- readonly PARTICIPANTS: "participants";
4435
- readonly CONVERSATIONS: "conversations";
4436
- readonly MESSAGES: "messages";
4437
- readonly MEDIA: "media";
4438
- readonly SETTINGS: "settings";
4439
- };
4440
- /** Blob stored for demo multimedia uploads */
4441
- interface AXConversationIndexedDbMediaRecord {
4442
- id: string;
4443
- conversationId: string;
4444
- mimeType: string;
4445
- size: number;
4446
- fileName?: string;
4447
- blob: Blob;
4448
- createdAt: string;
4449
- }
4450
- declare class AXConversationIndexedDbStorage {
4451
- private db;
4452
- private initPromise;
4453
- /**
4454
- * Initialize IndexedDB
4455
- */
4456
- init(): Promise<void>;
4457
- /**
4458
- * Get a value from a store
4459
- */
4460
- get<T>(storeName: string, key: string): Promise<T | undefined>;
4461
- /**
4462
- * Get all values from a store
4463
- */
4464
- getAll<T>(storeName: string): Promise<T[]>;
4465
- /**
4466
- * Get values by index
4467
- */
4468
- getAllByIndex<T>(storeName: string, indexName: string, query: IDBValidKey): Promise<T[]>;
4469
- /**
4470
- * Put a value into a store
4471
- */
4472
- put<T>(storeName: string, value: T): Promise<void>;
4473
- /**
4474
- * Delete a value from a store
4475
- */
4476
- delete(storeName: string, key: string): Promise<void>;
4477
- /**
4478
- * Clear all data from a store
4479
- */
4480
- clear(storeName: string): Promise<void>;
4481
- getParticipant(id: string): Promise<AXConversationParticipant | undefined>;
4482
- getAllParticipants(): Promise<AXConversationParticipant[]>;
4483
- putParticipant(participant: AXConversationParticipant): Promise<void>;
4484
- getConversation(id: string): Promise<AXConversation | undefined>;
4485
- getAllConversations(): Promise<AXConversation[]>;
4486
- putConversation(conversation: AXConversation): Promise<void>;
4487
- deleteConversation(id: string): Promise<void>;
4488
- getMessage(id: string): Promise<AXConversationMessage | undefined>;
4489
- getAllMessages(): Promise<AXConversationMessage[]>;
4490
- getMessagesByConversation(conversationId: string): Promise<AXConversationMessage[]>;
4491
- putMessage(message: AXConversationMessage): Promise<void>;
4492
- deleteMessage(id: string): Promise<void>;
4493
- getSetting(key: string): Promise<unknown>;
4494
- putSetting(key: string, value: unknown): Promise<void>;
4495
- getMedia(id: string): Promise<AXConversationIndexedDbMediaRecord | undefined>;
4496
- putMedia(record: AXConversationIndexedDbMediaRecord): Promise<void>;
4497
- deleteMedia(id: string): Promise<void>;
4498
- }
4499
- declare const axConversationIndexedDbStorage: AXConversationIndexedDbStorage;
4500
-
4501
- /**
4502
- * Shared In-Memory Storage
4503
- * Internal storage shared between all IndexedDB API implementations
4504
- * This is NOT a service - just a shared data structure
4505
- */
4506
-
4507
- declare class AXConversationSharedStorage {
4508
- readonly connectionStatus$: BehaviorSubject<AXConversationConnectionStatus>;
4509
- readonly participants: Map<string, AXConversationParticipant>;
4510
- readonly conversations: Map<string, AXConversation>;
4511
- readonly messages: Map<string, AXConversationMessage>;
4512
- readonly messagesByConversation: Map<string, string[]>;
4513
- readonly messageStream$: Subject<AXConversationMessage>;
4514
- readonly messageUpdates$: Subject<AXConversationMessage>;
4515
- readonly messageDeletions$: Subject<string>;
4516
- readonly typingIndicators$: Subject<AXConversationTypingIndicator>;
4517
- readonly presenceUpdates$: Subject<AXConversationPresenceUpdate>;
4518
- readonly conversationUpdates$: Subject<AXConversation>;
4519
- readonly currentUserId = "current-user";
4520
- private isSeeded;
4521
- private presenceInterval?;
4522
- private messageSimulationInterval?;
4523
- private isLoadedFromDB;
4524
- /**
4525
- * Load data from IndexedDB
4526
- */
4527
- loadFromIndexedDB(): Promise<void>;
4528
- /**
4529
- * Seed initial data if not already seeded
4530
- */
4531
- seedIfEmpty(): Promise<void>;
4532
- /** Wipe in-memory and persisted demo data (used when seed version changes). */
4533
- private clearAllData;
4534
- /** @internal Used by demo seed module */
4535
- markSeeded(): void;
4536
- /** @internal Starts demo presence and message simulations */
4537
- startDemoSimulations(): void;
4538
- /**
4539
- * Simulate user presence changes (online/offline/away)
4540
- */
4541
- private startPresenceSimulation;
4542
- /**
4543
- * Simulate random messages from users
4544
- */
4545
- private startMessageSimulation;
4546
- /**
4547
- * Stop presence simulation
4548
- */
4549
- stopPresenceSimulation(): void;
4550
- /**
4551
- * Stop message simulation
4552
- */
4553
- stopMessageSimulation(): void;
4554
- }
4555
- declare const axConversationSharedStorage: AXConversationSharedStorage;
4556
-
4557
- declare const AX_CONVERSATION_DEMO_CONVERSATION_IDS: {
4558
- readonly private: "conv-demo-private";
4559
- readonly group: "conv-demo-group";
4560
- readonly channel: "conv-demo-channel";
4561
- };
4562
- declare function seedSharedStorageInitialData(storage: AXConversationSharedStorage): Promise<void>;
4563
-
4564
- /**
4565
- * Chat-oriented pagination helpers for IndexedDB demo APIs.
4566
- *
4567
- * Convention (matches {@link AXConversationService}):
4568
- * - Page 0: newest items (sidebar: recent chats; messages: latest history window).
4569
- * - Page 1+ or `cursor`: older items before the previous window.
4570
- * - `hasMore`: true when older items remain.
4571
- * - `nextCursor`: id of the oldest item in the current page (use as `pagination.cursor` for the next request).
4572
- */
4573
-
4574
- declare const AX_CONVERSATION_MESSAGE_CURSOR_PREFIX = "msg:";
4575
- declare const AX_CONVERSATION_CURSOR_PREFIX = "conv:";
4576
- type AXConversationChatCursorKind = 'message' | 'conversation';
4577
- interface AXConversationParsedChatCursor {
4578
- kind: AXConversationChatCursorKind;
4579
- id: string;
4580
- }
4581
- declare function encodeMessageCursor(messageId: string): string;
4582
- declare function encodeConversationCursor(conversationId: string): string;
4583
- /** Decode cursor from API pagination (supports prefixed or legacy raw message id). */
4584
- declare function parseChatCursor(cursor?: string): AXConversationParsedChatCursor | null;
4585
- /**
4586
- * Paginate a list sorted newest-first (chats, message history windows).
4587
- */
4588
- declare function paginateChatNewestFirst<T extends {
4589
- id: string;
4590
- }>(sortedNewestFirst: T[], pagination: AXConversationPagination, cursorKind: AXConversationChatCursorKind): AXConversationPaginatedResult<T>;
4591
- /**
4592
- * Paginate a list sorted oldest-first (replies, forward history).
4593
- */
4594
- declare function paginateChatOldestFirst<T extends {
4595
- id: string;
4596
- }>(sortedOldestFirst: T[], pagination: AXConversationPagination): AXConversationPaginatedResult<T>;
4597
-
4598
- /**
4599
- * Pagination demo data — disabled for the minimal 3-chat showcase seed.
4600
- * Kept as a no-op so existing imports remain valid.
4601
- */
4602
- /** @deprecated Pagination demo chat removed from default seed. */
4603
- declare const AX_MESSAGE_PAGINATION_CONVERSATION_ID = "conv-pag-msgs";
4604
- /** No-op: showcase uses a fixed 3-conversation seed (private, group, channel). */
4605
- declare function ensurePaginationDemoData(): Promise<void>;
4606
-
4607
- /**
4608
- * Shared read/write helpers for IndexedDB chat storage (in-memory + persistence).
4609
- */
4610
-
4611
- declare function getConversationLastActivity(conv: AXConversation): number;
4612
- /** Messages for a conversation, newest first (API / pagination order). */
4613
- declare function getConversationMessagesNewestFirst(conversationId: string): AXConversationMessage[];
4614
- /** Keep per-conversation id list sorted ascending by timestamp (store order). */
4615
- declare function sortConversationMessageIds(conversationId: string): void;
4616
- /** Register a message in maps and keep the conversation index sorted. */
4617
- declare function registerChatMessage(message: AXConversationMessage): void;
4618
- /** Remove a message from conversation index and global map. */
4619
- declare function unregisterChatMessage(messageId: string, conversationId: string): void;
4620
- declare function applyConversationFilters(conversations: AXConversation[], filters?: AXConversationFilters): AXConversation[];
4621
- /** Sidebar list order: pinned first, then by last activity (newest first). */
4622
- declare function getSortedConversationsForInbox(filters?: AXConversationFilters): AXConversation[];
4623
- /** Sort all loaded conversation message indexes (after IndexedDB hydration). */
4624
- declare function normalizeAllConversationMessageIndexes(): void;
4625
-
4626
- declare class AXConversationIndexedDbUserApi extends AXConversationUserApi {
4627
- private readonly API_DELAY_MS;
4628
- getCurrentUser(): Promise<AXConversationParticipant>;
4629
- updateProfile(updates: AXConversationUserProfileUpdate): Promise<AXConversationParticipant>;
4630
- uploadAvatar(file: File): Promise<string>;
4631
- getUsers(pagination?: AXConversationPagination, filters?: AXConversationUserSearchFilters): Promise<AXConversationPaginatedResult<AXConversationParticipant>>;
4632
- searchUsers(query: string): Promise<AXConversationParticipant[]>;
4633
- getUserById(userId: string): Promise<AXConversationParticipant>;
4634
- getUsersByIds(userIds: string[]): Promise<AXConversationParticipant[]>;
4635
- getUserPresence(userId: string): Promise<AXConversationPresenceUpdate>;
4636
- updatePresence(_status: AXConversationPresenceStatus, _statusText?: string): Promise<void>;
4637
- blockUser(_userId: string, _reason?: AXConversationBlockReportReason): Promise<void>;
4638
- unblockUser(_userId: string): Promise<void>;
4639
- getBlockedUsers(): Promise<string[]>;
4640
- reportUser(_userId: string, _reason: AXConversationBlockReportReason): Promise<void>;
4641
- getUserSettings(): Promise<Record<string, unknown>>;
4642
- updateUserSettings(_settings: Record<string, unknown>): Promise<void>;
4643
- private getCurrentUserWithoutDelay;
4644
- private fetchUsers;
4645
- private delay;
4646
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXConversationIndexedDbUserApi, never>;
4647
- static ɵprov: _angular_core.ɵɵInjectableDeclaration<AXConversationIndexedDbUserApi>;
4648
- }
4649
-
4650
- declare class AXConversationIndexedDbConversationApi extends AXConversationApi {
4651
- createConversation(data: AXConversationCreateData): Promise<AXConversation>;
4652
- getConversation(conversationId: string): Promise<AXConversation>;
4653
- /**
4654
- * Inbox page (pinned + recent activity, newest first).
4655
- * Page 0 / cursor align with {@link AXConversationService.loadConversations} and sidebar infinite scroll.
4656
- */
4657
- getConversations(pagination: AXConversationPagination, filters?: AXConversationFilters): Promise<AXConversationPaginatedResult<AXConversation>>;
4658
- updateConversation(conversationId: string, updates: AXConversationUpdateData): Promise<AXConversation>;
4659
- deleteConversation(conversationId: string): Promise<boolean>;
4660
- archiveConversation(conversationId: string): Promise<void>;
4661
- unarchiveConversation(conversationId: string): Promise<void>;
4662
- pinConversation(conversationId: string): Promise<void>;
4663
- unpinConversation(conversationId: string): Promise<void>;
4664
- markConversationAsRead(conversationId: string): Promise<void>;
4665
- markConversationAsUnread(conversationId: string): Promise<void>;
4666
- searchConversations(query: string): Promise<AXConversation[]>;
4667
- filterConversations(filters: AXConversationFilters, pagination?: AXConversationPagination): Promise<AXConversationPaginatedResult<AXConversation>>;
4668
- getParticipants(conversationId: string): Promise<AXConversationParticipant[]>;
4669
- addParticipants(_conversationId: string, _userIds: string[]): Promise<AXConversation>;
4670
- removeParticipant(conversationId: string, _userId: string): Promise<AXConversation>;
4671
- leaveConversation(_conversationId: string): Promise<void>;
4672
- updateParticipant(conversationId: string, _update: AXConversationParticipantUpdate): Promise<AXConversation>;
4673
- getConversationSettings(conversationId: string): Promise<AXConversationSettingsUpdate>;
4674
- updateConversationSettings(conversationId: string, settings: AXConversationSettingsUpdate): Promise<void>;
4675
- muteConversation(conversationId: string, duration?: number): Promise<void>;
4676
- unmuteConversation(conversationId: string): Promise<void>;
4677
- uploadConversationAvatar(_conversationId: string, file: File): Promise<string>;
4678
- getConversationMedia(conversationId: string, pagination?: AXConversationPagination): Promise<AXConversationPaginatedResult<unknown>>;
4679
- addConversationTags(conversationId: string, tags: string[]): Promise<void>;
4680
- removeConversationTags(conversationId: string, tags: string[]): Promise<void>;
4681
- getConversationTags(conversationId: string): Promise<string[]>;
4682
- saveDraft(conversationId: string, draft: string): Promise<void>;
4683
- getDraft(conversationId: string): Promise<string | null>;
4684
- clearDraft(conversationId: string): Promise<void>;
4685
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXConversationIndexedDbConversationApi, never>;
4686
- static ɵprov: _angular_core.ɵɵInjectableDeclaration<AXConversationIndexedDbConversationApi>;
4687
- }
4688
-
4689
- declare class AXConversationIndexedDbMessageApi extends AXConversationMessageApi {
4690
- sendMessage(command: AXConversationSendMessageCommand): Promise<AXConversationMessage>;
4691
- getMessage(messageId: string): Promise<AXConversationMessage>;
4692
- /**
4693
- * Message history for a chat (newest-first pages).
4694
- * - Page 0: latest `pageSize` messages.
4695
- * - Page 1+ or `pagination.cursor`: older messages before the previous window.
4696
- */
4697
- getMessages(conversationId: string, pagination: AXConversationPagination): Promise<AXConversationPaginatedResult<AXConversationMessage>>;
4698
- editMessage(messageId: string, payload: AXConversationMessagePayload): Promise<AXConversationMessage>;
4699
- deleteMessage(messageId: string, _forEveryone?: boolean): Promise<void>;
4700
- deleteMessages(messageIds: string[], forEveryone?: boolean): Promise<void>;
4701
- searchMessages(conversationId: string, filters: AXConversationMessageSearchFilters, pagination?: AXConversationPagination): Promise<AXConversationPaginatedResult<AXConversationMessage>>;
4702
- searchAllMessages(filters: AXConversationMessageSearchFilters, pagination?: AXConversationPagination): Promise<AXConversationPaginatedResult<AXConversationMessage>>;
4703
- addReaction(messageId: string, emoji: string): Promise<void>;
4704
- removeReaction(messageId: string, emoji: string): Promise<void>;
4705
- getAvailableReactions(): Promise<string[]>;
4706
- markAsRead(conversationId: string, messageIds: string[]): Promise<void>;
4707
- markAsUnread(conversationId: string): Promise<void>;
4708
- getReadReceipts(_messageId: string): Promise<AXConversationReadReceipt[]>;
4709
- forwardMessage(_data: AXConversationMessageForwardData): Promise<AXConversationMessage[]>;
4710
- pinMessage(_conversationId: string, _messageId: string): Promise<void>;
4711
- unpinMessage(_conversationId: string, _messageId: string): Promise<void>;
4712
- getPinnedMessages(_conversationId: string): Promise<AXConversationPinnedMessage[]>;
4713
- getMessageReplies(messageId: string, pagination?: AXConversationPagination): Promise<AXConversationPaginatedResult<AXConversationMessage>>;
4714
- getReplyCount(messageId: string): Promise<number>;
4715
- getForwardCount(messageId: string): Promise<number>;
4716
- sendTypingIndicator(conversationId: string): Promise<void>;
4717
- stopTypingIndicator(conversationId: string): Promise<void>;
4718
- updateMessageMetadata(messageId: string, metadata: Record<string, unknown>): Promise<void>;
4719
- getMessageMetadata(messageId: string): Promise<Record<string, unknown>>;
4720
- updateMessageStatus(messageId: string, status: 'sending' | 'sent' | 'delivered' | 'read' | 'failed'): Promise<void>;
4721
- getMessageDeliveryStatus(_messageId: string): Promise<{
4722
- delivered: number;
4723
- read: number;
4724
- total: number;
4725
- }>;
4726
- markMessagesAsRead(messageIds: string[]): Promise<void>;
4727
- bulkDeleteMessages(conversationId: string, messageIds: string[], forEveryone?: boolean): Promise<void>;
4728
- exportMessages(conversationId: string, _format: 'json' | 'csv' | 'txt'): Promise<string | Blob>;
4729
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXConversationIndexedDbMessageApi, never>;
4730
- static ɵprov: _angular_core.ɵɵInjectableDeclaration<AXConversationIndexedDbMessageApi>;
4731
- }
4732
-
4733
- declare class AXConversationIndexedDbRealtimeApi extends AXConversationRealtimeApi {
4734
- readonly connectionStatus$: Observable<AXConversationConnectionStatus>;
4735
- connect(_options?: AXConversationConnectionOptions): Promise<void>;
4736
- disconnect(): Promise<void>;
4737
- isConnected(): boolean;
4738
- reconnect(): Promise<void>;
4739
- subscribeToConnectionEvents(): Observable<AXConversationConnectionEvent>;
4740
- subscribeToMessages(conversationId: string): Observable<AXConversationMessage>;
4741
- subscribeToMessageUpdates(_conversationId?: string): Observable<AXConversationMessage>;
4742
- subscribeToMessageDeletions(_conversationId?: string): Observable<string>;
4743
- subscribeToMessageReactions(_conversationId?: string): Observable<AXConversationMessage>;
4744
- subscribeToConversationUpdates(): Observable<AXConversation>;
4745
- subscribeToConversationCreated(): Observable<AXConversation>;
4746
- subscribeToConversationDeleted(): Observable<string>;
4747
- subscribeToTypingIndicators(conversationId: string): Observable<AXConversationTypingIndicator>;
4748
- subscribeToPresenceUpdates(_userIds?: string[]): Observable<AXConversationPresenceUpdate>;
4749
- subscribeToReadReceipts(_conversationId?: string): Observable<{
4750
- messageId: string;
4751
- userId: string;
4752
- readAt: Date;
4753
- }>;
4754
- subscribeToNotifications(): Observable<AXConversationNotificationEvent>;
4755
- subscribeToCallEvents(): Observable<AXConversationCallEvent>;
4756
- subscribeToUserBlockEvents(): Observable<{
4757
- userId: string;
4758
- blocked: boolean;
4759
- }>;
4760
- subscribeToParticipantEvents(_conversationId?: string): Observable<{
4761
- conversationId: string;
4762
- userId: string;
4763
- action: 'added' | 'removed';
4764
- }>;
4765
- subscribeToSystemEvents(): Observable<{
4766
- type: string;
4767
- message: string;
4768
- data?: any;
4769
- }>;
4770
- subscribeToMessageStatusChanges(_conversationId?: string): Observable<{
4771
- messageId: string;
4772
- status: 'sending' | 'sent' | 'delivered' | 'read' | 'failed';
4773
- timestamp: Date;
4774
- }>;
4775
- subscribeToConversationSettingsChanges(_conversationId?: string): Observable<{
4776
- conversationId: string;
4777
- settings: Record<string, unknown>;
4778
- }>;
4779
- subscribeToDraftChanges(_conversationId?: string): Observable<{
4780
- conversationId: string;
4781
- draft: string | null;
4782
- }>;
4783
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXConversationIndexedDbRealtimeApi, never>;
4784
- static ɵprov: _angular_core.ɵɵInjectableDeclaration<AXConversationIndexedDbRealtimeApi>;
4785
- }
4786
-
4787
- /**
4788
- * AI Responder Service
4789
- * Provides AI-powered automatic responses using Google Gemini API
4790
- *
4791
- * @security API key should be provided via injection token in production
4792
- * @example
4793
- * ```typescript
4794
- * export const AX_CONVERSATION_AI_API_KEY = new InjectionToken<string>('AX_CONVERSATION_AI_API_KEY');
4795
- *
4796
- * providers: [
4797
- * { provide: AX_CONVERSATION_AI_API_KEY, useValue: environment.geminiApiKey }
4798
- * ]
4799
- * ```
4800
- */
4801
-
4802
- /**
4803
- * Injection token for AI API key
4804
- * Provide this in your app config to avoid hardcoding the API key
4805
- */
4806
- declare const AX_CONVERSATION_AI_API_KEY: InjectionToken<string>;
4807
- /**
4808
- * Configuration for AI Responder
4809
- */
4810
- interface AXConversationAiResponderConfig {
4811
- /** Maximum retry attempts for failed requests */
4812
- maxRetries?: number;
4813
- /** Timeout for API requests in milliseconds */
4814
- timeout?: number;
4815
- /** Enable fallback to random replies on error */
4816
- useFallbackReplies?: boolean;
4817
- }
4818
- declare class AXConversationAiResponderService {
4819
- private readonly injectedApiKey;
4820
- private readonly config;
4821
- /**
4822
- * Get API key from injection token
4823
- * Returns undefined if not configured - service will use fallback responses
4824
- */
4825
- private getApiKey;
4826
- /**
4827
- * Get AI-powered response for a given prompt
4828
- * @param prompt - The user's message to respond to
4829
- * @param retryCount - Current retry attempt (internal use)
4830
- * @returns AI-generated response or fallback message
4831
- */
4832
- getAIResponse(prompt: string, retryCount?: number): Promise<string>;
4833
- /**
4834
- * Fetch with timeout
4835
- */
4836
- private fetchWithTimeout;
4837
- /**
4838
- * Delay helper for retry logic
4839
- */
4840
- private delay;
4841
- /**
4842
- * Get a random fallback reply when AI is unavailable
4843
- */
4844
- private getFallbackReply;
4845
- /**
4846
- * Check if AI service is available
4847
- * @returns true if API key is configured
4848
- */
4849
- isAvailable(): boolean;
4850
- /**
4851
- * Update configuration
4852
- */
4853
- configure(config: Partial<AXConversationAiResponderConfig>): void;
4854
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXConversationAiResponderService, never>;
4855
- static ɵprov: _angular_core.ɵɵInjectableDeclaration<AXConversationAiResponderService>;
4856
- }
4857
-
4858
- declare class AXConversationIndexedDbMessageAiApi extends AXConversationIndexedDbMessageApi {
4859
- private readonly aiResponder;
4860
- private readonly AI_TYPING_INDICATOR_DELAY;
4861
- private readonly AI_RESPONSE_DELAY;
4862
- /**
4863
- * Override sendMessage to trigger AI auto-response
4864
- */
4865
- sendMessage(command: AXConversationSendMessageCommand): Promise<AXConversationMessage>;
4866
- /**
4867
- * Extract context from different message types for AI processing
4868
- */
4869
- private extractMessageContext;
4870
- /**
4871
- * Generate AI response to user message
4872
- */
4873
- private generateAIResponse;
4874
- /**
4875
- * Get conversation for AI response
4876
- */
4877
- private getConversationForAI;
4878
- /**
4879
- * Get conversation history (last N messages)
4880
- */
4881
- private getConversationHistory;
4882
- /**
4883
- * Create AI message directly in storage
4884
- */
4885
- private createAIMessage;
4886
- /**
4887
- * Delay helper
4888
- */
4889
- private delay;
4890
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXConversationIndexedDbMessageAiApi, never>;
4891
- static ɵprov: _angular_core.ɵɵInjectableDeclaration<AXConversationIndexedDbMessageAiApi>;
4892
- }
4893
-
4894
4570
  declare const AX_CONVERSATION_AUDIO_PRESENTATION: {
4895
4571
  readonly icon: "fa-light fa-music text-amber-500";
4896
4572
  readonly title: "Audio";
@@ -4963,16 +4639,14 @@ declare function notifyPickerValidationErrors(toast: AXToastService, translation
4963
4639
  file: File;
4964
4640
  errors: AXValidationRuleResult[];
4965
4641
  }[]): void;
4966
- /** Load files dropped onto the message list after the picker is mounted in a popup. */
4967
- declare function seedPickerInitialFiles(initialFiles: InputSignal<File[]>, handleFiles: (files: File[]) => void | Promise<void>): void;
4968
- /** Close inline composer shell or popup host after send/cancel. */
4969
- declare function dismissComposerPickerHost(composerService: AXConversationComposerService, popupRef?: AXPopupRef | null): void;
4642
+ /** Close popup/action-sheet host or inline composer shell after send/cancel. */
4643
+ declare function dismissComposerPickerHost(composerService: AXConversationComposerService, popupRef?: AXPopupRef | null, actionSheetRef?: AXActionSheetRef | null): void;
4970
4644
 
4971
4645
  interface AXConversationAudioFile extends AXConversationComposerPickerUploadItem {
4972
4646
  duration?: number;
4973
4647
  dataUrl?: string;
4974
4648
  }
4975
- declare class AXConversationAudioPickerComponent implements OnDestroy {
4649
+ declare class AXConversationAudioPickerComponent implements OnDestroy, AXConversationComposerActionComponent {
4976
4650
  private uploadsDismissed;
4977
4651
  private retainUploadedOnDismiss;
4978
4652
  readonly service: _angular_core.InputSignal<AXConversationComposerService>;
@@ -4987,7 +4661,9 @@ declare class AXConversationAudioPickerComponent implements OnDestroy {
4987
4661
  readonly conversation: _angular_core.InputSignal<AXConversation>;
4988
4662
  readonly maxFiles: _angular_core.InputSignal<number>;
4989
4663
  readonly initialFiles: _angular_core.InputSignal<File[]>;
4664
+ readonly autoRun: _angular_core.InputSignal<boolean>;
4990
4665
  readonly __popup__: _angular_core.InputSignal<AXPopupRef<any>>;
4666
+ readonly __actionSheet__: _angular_core.InputSignal<AXActionSheetRef<unknown>>;
4991
4667
  readonly catalogFileType: "conversation-audio";
4992
4668
  readonly audioFiles: _angular_core.WritableSignal<AXConversationAudioFile[]>;
4993
4669
  readonly isDragging: _angular_core.WritableSignal<boolean>;
@@ -4997,6 +4673,7 @@ declare class AXConversationAudioPickerComponent implements OnDestroy {
4997
4673
  caption: string;
4998
4674
  readonly allowMultiple: _angular_core.Signal<boolean>;
4999
4675
  constructor();
4676
+ activate(): Promise<void>;
5000
4677
  private createUtilityContext;
5001
4678
  private getCatalogFileTypeDef;
5002
4679
  private runUtility;
@@ -5018,7 +4695,7 @@ declare class AXConversationAudioPickerComponent implements OnDestroy {
5018
4695
  getSelectedCountText(): string;
5019
4696
  getSendText(): string;
5020
4697
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXConversationAudioPickerComponent, never>;
5021
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXConversationAudioPickerComponent, "ax-conversation-audio-picker", never, { "service": { "alias": "service"; "required": false; "isSignal": true; }; "conversation": { "alias": "conversation"; "required": true; "isSignal": true; }; "maxFiles": { "alias": "maxFiles"; "required": false; "isSignal": true; }; "initialFiles": { "alias": "initialFiles"; "required": false; "isSignal": true; }; "__popup__": { "alias": "__popup__"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
4698
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXConversationAudioPickerComponent, "ax-conversation-audio-picker", never, { "service": { "alias": "service"; "required": false; "isSignal": true; }; "conversation": { "alias": "conversation"; "required": true; "isSignal": true; }; "maxFiles": { "alias": "maxFiles"; "required": false; "isSignal": true; }; "initialFiles": { "alias": "initialFiles"; "required": false; "isSignal": true; }; "autoRun": { "alias": "autoRun"; "required": false; "isSignal": true; }; "__popup__": { "alias": "__popup__"; "required": false; "isSignal": true; }; "__actionSheet__": { "alias": "__actionSheet__"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
5022
4699
  }
5023
4700
 
5024
4701
  declare const AX_CONVERSATION_COMPOSER_EMOJI_TAB: AXConversationComposerTab;
@@ -5093,7 +4770,7 @@ interface AXConversationAttachedFile {
5093
4770
  error?: string;
5094
4771
  abortController?: AbortController;
5095
4772
  }
5096
- declare class AXConversationFilePickerComponent implements OnDestroy {
4773
+ declare class AXConversationFilePickerComponent implements OnDestroy, AXConversationComposerActionComponent {
5097
4774
  private uploadsDismissed;
5098
4775
  private retainUploadedOnDismiss;
5099
4776
  private readonly uploader;
@@ -5108,7 +4785,9 @@ declare class AXConversationFilePickerComponent implements OnDestroy {
5108
4785
  readonly conversation: _angular_core.InputSignal<AXConversation>;
5109
4786
  readonly maxFiles: _angular_core.InputSignal<number>;
5110
4787
  readonly initialFiles: _angular_core.InputSignal<File[]>;
4788
+ readonly autoRun: _angular_core.InputSignal<boolean>;
5111
4789
  readonly __popup__: _angular_core.InputSignal<AXPopupRef<any>>;
4790
+ readonly __actionSheet__: _angular_core.InputSignal<AXActionSheetRef<unknown>>;
5112
4791
  readonly catalogFileType: "conversation-file";
5113
4792
  readonly allowMultiple: _angular_core.Signal<boolean>;
5114
4793
  readonly files: _angular_core.WritableSignal<AXConversationAttachedFile[]>;
@@ -5118,6 +4797,7 @@ declare class AXConversationFilePickerComponent implements OnDestroy {
5118
4797
  private catalogFileTypeDef?;
5119
4798
  caption: string;
5120
4799
  constructor();
4800
+ activate(): Promise<void>;
5121
4801
  private createUtilityContext;
5122
4802
  private getCatalogFileTypeDef;
5123
4803
  private pickerKind;
@@ -5139,7 +4819,7 @@ declare class AXConversationFilePickerComponent implements OnDestroy {
5139
4819
  getSelectedCountText(): string;
5140
4820
  getUploadingLabel(progress: number): string;
5141
4821
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXConversationFilePickerComponent, never>;
5142
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXConversationFilePickerComponent, "ax-conversation-file-picker", never, { "service": { "alias": "service"; "required": false; "isSignal": true; }; "conversation": { "alias": "conversation"; "required": true; "isSignal": true; }; "maxFiles": { "alias": "maxFiles"; "required": false; "isSignal": true; }; "initialFiles": { "alias": "initialFiles"; "required": false; "isSignal": true; }; "__popup__": { "alias": "__popup__"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
4822
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXConversationFilePickerComponent, "ax-conversation-file-picker", never, { "service": { "alias": "service"; "required": false; "isSignal": true; }; "conversation": { "alias": "conversation"; "required": true; "isSignal": true; }; "maxFiles": { "alias": "maxFiles"; "required": false; "isSignal": true; }; "initialFiles": { "alias": "initialFiles"; "required": false; "isSignal": true; }; "autoRun": { "alias": "autoRun"; "required": false; "isSignal": true; }; "__popup__": { "alias": "__popup__"; "required": false; "isSignal": true; }; "__actionSheet__": { "alias": "__actionSheet__"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
5143
4823
  }
5144
4824
 
5145
4825
  declare const AX_CONVERSATION_IMAGE_PRESENTATION: {
@@ -5159,7 +4839,7 @@ declare class AXConversationImageFileTypeProvider extends AXFileTypeInfoProvider
5159
4839
  interface AXConversationImageFile extends AXConversationComposerPickerUploadItem {
5160
4840
  preview: string;
5161
4841
  }
5162
- declare class AXConversationImagePickerComponent implements OnDestroy {
4842
+ declare class AXConversationImagePickerComponent implements OnDestroy, AXConversationComposerActionComponent {
5163
4843
  private uploadsDismissed;
5164
4844
  /** Uploaded blobs are referenced by the sent message — do not delete on dismiss. */
5165
4845
  private retainUploadedOnDismiss;
@@ -5176,7 +4856,9 @@ declare class AXConversationImagePickerComponent implements OnDestroy {
5176
4856
  readonly conversation: _angular_core.InputSignal<AXConversation>;
5177
4857
  readonly maxFiles: _angular_core.InputSignal<number>;
5178
4858
  readonly initialFiles: _angular_core.InputSignal<File[]>;
4859
+ readonly autoRun: _angular_core.InputSignal<boolean>;
5179
4860
  readonly __popup__: _angular_core.InputSignal<AXPopupRef<any>>;
4861
+ readonly __actionSheet__: _angular_core.InputSignal<AXActionSheetRef<unknown>>;
5180
4862
  readonly images: _angular_core.WritableSignal<AXConversationImageFile[]>;
5181
4863
  readonly isDragging: _angular_core.WritableSignal<boolean>;
5182
4864
  readonly emptyIconClass: _angular_core.Signal<"fa-light fa-image text-purple-500" | "fa-light fa-cloud-arrow-up">;
@@ -5184,6 +4866,7 @@ declare class AXConversationImagePickerComponent implements OnDestroy {
5184
4866
  readonly allowMultiple: _angular_core.Signal<boolean>;
5185
4867
  private imageFileType?;
5186
4868
  constructor();
4869
+ activate(): Promise<void>;
5187
4870
  private createUtilityContext;
5188
4871
  private loadImageFileType;
5189
4872
  handleFiles(files: File[]): Promise<void>;
@@ -5202,20 +4885,23 @@ declare class AXConversationImagePickerComponent implements OnDestroy {
5202
4885
  getSelectedCountText(): string;
5203
4886
  getSendText(): string;
5204
4887
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXConversationImagePickerComponent, never>;
5205
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXConversationImagePickerComponent, "ax-conversation-image-picker", never, { "service": { "alias": "service"; "required": false; "isSignal": true; }; "conversation": { "alias": "conversation"; "required": true; "isSignal": true; }; "maxFiles": { "alias": "maxFiles"; "required": false; "isSignal": true; }; "initialFiles": { "alias": "initialFiles"; "required": false; "isSignal": true; }; "__popup__": { "alias": "__popup__"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
4888
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXConversationImagePickerComponent, "ax-conversation-image-picker", never, { "service": { "alias": "service"; "required": false; "isSignal": true; }; "conversation": { "alias": "conversation"; "required": true; "isSignal": true; }; "maxFiles": { "alias": "maxFiles"; "required": false; "isSignal": true; }; "initialFiles": { "alias": "initialFiles"; "required": false; "isSignal": true; }; "autoRun": { "alias": "autoRun"; "required": false; "isSignal": true; }; "__popup__": { "alias": "__popup__"; "required": false; "isSignal": true; }; "__actionSheet__": { "alias": "__actionSheet__"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
5206
4889
  }
5207
4890
 
5208
4891
  declare class AXConversationLocationPickerComponent {
5209
- private readonly composerService;
5210
- private readonly conversationService;
4892
+ readonly service: _angular_core.InputSignal<AXConversationComposerService>;
4893
+ private readonly composerServiceFromInjector;
4894
+ private get composerService();
5211
4895
  readonly translation: AXTranslationService;
5212
4896
  readonly conversation: _angular_core.InputSignal<AXConversation>;
4897
+ readonly __popup__: _angular_core.InputSignal<AXPopupRef<any>>;
4898
+ readonly __actionSheet__: _angular_core.InputSignal<AXActionSheetRef<unknown>>;
5213
4899
  readonly currentLocation: _angular_core.WritableSignal<AXConversationLocationPayload>;
5214
4900
  onMarkerAdded(event: AXMapMarker): void;
5215
4901
  sendLocation(): Promise<void>;
5216
4902
  cancel(): void;
5217
4903
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXConversationLocationPickerComponent, never>;
5218
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXConversationLocationPickerComponent, "ax-conversation-location-picker", never, { "conversation": { "alias": "conversation"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
4904
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXConversationLocationPickerComponent, "ax-conversation-location-picker", never, { "service": { "alias": "service"; "required": false; "isSignal": true; }; "conversation": { "alias": "conversation"; "required": true; "isSignal": true; }; "__popup__": { "alias": "__popup__"; "required": false; "isSignal": true; }; "__actionSheet__": { "alias": "__actionSheet__"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
5219
4905
  }
5220
4906
 
5221
4907
  declare class AXConversationPickerFooterComponent {
@@ -5279,12 +4965,15 @@ declare class AXConversationPickerEmptyComponent {
5279
4965
  declare class AXConversationPickerShellComponent {
5280
4966
  private readonly toast;
5281
4967
  private readonly translation;
4968
+ private readonly zone;
5282
4969
  readonly fileType: _angular_core.InputSignal<string>;
5283
4970
  readonly multiple: _angular_core.InputSignal<boolean>;
5284
4971
  readonly filesSelected: _angular_core.OutputEmitterRef<File[]>;
5285
4972
  readonly dragEnter: _angular_core.OutputEmitterRef<DragEvent>;
5286
4973
  readonly dragLeave: _angular_core.OutputEmitterRef<DragEvent>;
5287
4974
  readonly dragOver: _angular_core.OutputEmitterRef<DragEvent>;
4975
+ /** Open the OS file picker for this shell's catalog. */
4976
+ browse(): Promise<void>;
5288
4977
  protected onZoneFileChange(event: AXUploaderFileChangeEvent): void;
5289
4978
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXConversationPickerShellComponent, never>;
5290
4979
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXConversationPickerShellComponent, "ax-conversation-picker-shell", never, { "fileType": { "alias": "fileType"; "required": true; "isSignal": true; }; "multiple": { "alias": "multiple"; "required": false; "isSignal": true; }; }, { "filesSelected": "filesSelected"; "dragEnter": "dragEnter"; "dragLeave": "dragLeave"; "dragOver": "dragOver"; }, never, ["*"], true, never>;
@@ -5354,7 +5043,7 @@ interface AXConversationVideoFile extends AXConversationComposerPickerUploadItem
5354
5043
  preview?: string;
5355
5044
  duration?: number;
5356
5045
  }
5357
- declare class AXConversationVideoPickerComponent implements OnDestroy {
5046
+ declare class AXConversationVideoPickerComponent implements OnDestroy, AXConversationComposerActionComponent {
5358
5047
  private uploadsDismissed;
5359
5048
  private retainUploadedOnDismiss;
5360
5049
  readonly service: _angular_core.InputSignal<AXConversationComposerService>;
@@ -5369,7 +5058,9 @@ declare class AXConversationVideoPickerComponent implements OnDestroy {
5369
5058
  readonly conversation: _angular_core.InputSignal<AXConversation>;
5370
5059
  readonly maxFiles: _angular_core.InputSignal<number>;
5371
5060
  readonly initialFiles: _angular_core.InputSignal<File[]>;
5061
+ readonly autoRun: _angular_core.InputSignal<boolean>;
5372
5062
  readonly __popup__: _angular_core.InputSignal<AXPopupRef<any>>;
5063
+ readonly __actionSheet__: _angular_core.InputSignal<AXActionSheetRef<unknown>>;
5373
5064
  readonly catalogFileType: "conversation-video";
5374
5065
  readonly videos: _angular_core.WritableSignal<AXConversationVideoFile[]>;
5375
5066
  readonly isDragging: _angular_core.WritableSignal<boolean>;
@@ -5379,6 +5070,7 @@ declare class AXConversationVideoPickerComponent implements OnDestroy {
5379
5070
  readonly emptyIconClass: _angular_core.Signal<"fa-light fa-video ax-text-blue-500" | "fa-light fa-cloud-arrow-up">;
5380
5071
  private catalogFileTypeDef?;
5381
5072
  constructor();
5073
+ activate(): Promise<void>;
5382
5074
  private createUtilityContext;
5383
5075
  private getCatalogFileTypeDef;
5384
5076
  private runUtility;
@@ -5400,7 +5092,7 @@ declare class AXConversationVideoPickerComponent implements OnDestroy {
5400
5092
  getSelectedCountText(): string;
5401
5093
  getSendText(): string;
5402
5094
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXConversationVideoPickerComponent, never>;
5403
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXConversationVideoPickerComponent, "ax-conversation-video-picker", never, { "service": { "alias": "service"; "required": false; "isSignal": true; }; "conversation": { "alias": "conversation"; "required": true; "isSignal": true; }; "maxFiles": { "alias": "maxFiles"; "required": false; "isSignal": true; }; "initialFiles": { "alias": "initialFiles"; "required": false; "isSignal": true; }; "__popup__": { "alias": "__popup__"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
5095
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXConversationVideoPickerComponent, "ax-conversation-video-picker", never, { "service": { "alias": "service"; "required": false; "isSignal": true; }; "conversation": { "alias": "conversation"; "required": true; "isSignal": true; }; "maxFiles": { "alias": "maxFiles"; "required": false; "isSignal": true; }; "initialFiles": { "alias": "initialFiles"; "required": false; "isSignal": true; }; "autoRun": { "alias": "autoRun"; "required": false; "isSignal": true; }; "__popup__": { "alias": "__popup__"; "required": false; "isSignal": true; }; "__actionSheet__": { "alias": "__actionSheet__"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
5404
5096
  }
5405
5097
 
5406
5098
  declare const AX_CONVERSATION_VOICE_PRESENTATION: {
@@ -5420,14 +5112,21 @@ declare class AXConversationVoiceFileTypeProvider extends AXFileTypeInfoProvider
5420
5112
  declare function mergeVoiceUploadResult(payload: AXConversationMessagePayload, result: AXUploadResult): AXConversationMessagePayload;
5421
5113
  declare function applyVoiceLocalPreview(payload: AXConversationMessagePayload, localUrl: string): AXConversationMessagePayload;
5422
5114
 
5423
- declare class AXConversationVoiceRecorderComponent {
5115
+ declare class AXConversationVoiceRecorderComponent implements AXConversationComposerActionComponent {
5424
5116
  private readonly platformId;
5425
5117
  private readonly destroyRef;
5426
- private readonly composerService;
5118
+ readonly service: _angular_core.InputSignal<AXConversationComposerService>;
5119
+ private readonly composerServiceFromInjector;
5120
+ private get composerService();
5427
5121
  private readonly uploader;
5122
+ private readonly fileTypeRegistry;
5428
5123
  private readonly toast;
5429
5124
  readonly translation: AXTranslationService;
5430
5125
  readonly conversation: _angular_core.InputSignal<AXConversation>;
5126
+ readonly initialFiles: _angular_core.InputSignal<File[]>;
5127
+ readonly autoRun: _angular_core.InputSignal<boolean>;
5128
+ readonly __popup__: _angular_core.InputSignal<AXPopupRef<any>>;
5129
+ readonly __actionSheet__: _angular_core.InputSignal<AXActionSheetRef<unknown>>;
5431
5130
  readonly recordingComplete: _angular_core.OutputEmitterRef<Blob>;
5432
5131
  readonly recordingCancelled: _angular_core.OutputEmitterRef<void>;
5433
5132
  readonly isRecording: _angular_core.WritableSignal<boolean>;
@@ -5443,7 +5142,9 @@ declare class AXConversationVoiceRecorderComponent {
5443
5142
  private uploadAbortController?;
5444
5143
  readonly formattedTime: _angular_core.Signal<string>;
5445
5144
  constructor();
5145
+ activate(): Promise<void>;
5446
5146
  startRecording(): Promise<void>;
5147
+ private dismissHost;
5447
5148
  /** Stop recording and send */
5448
5149
  stopRecording(): void;
5449
5150
  cancelRecording(): void;
@@ -5457,7 +5158,7 @@ declare class AXConversationVoiceRecorderComponent {
5457
5158
  private sendVoiceMessage;
5458
5159
  private stopAndCleanup;
5459
5160
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXConversationVoiceRecorderComponent, never>;
5460
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXConversationVoiceRecorderComponent, "ax-conversation-voice-recorder", never, { "conversation": { "alias": "conversation"; "required": false; "isSignal": true; }; }, { "recordingComplete": "recordingComplete"; "recordingCancelled": "recordingCancelled"; }, never, never, true, never>;
5161
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXConversationVoiceRecorderComponent, "ax-conversation-voice-recorder", never, { "service": { "alias": "service"; "required": false; "isSignal": true; }; "conversation": { "alias": "conversation"; "required": true; "isSignal": true; }; "initialFiles": { "alias": "initialFiles"; "required": false; "isSignal": true; }; "autoRun": { "alias": "autoRun"; "required": false; "isSignal": true; }; "__popup__": { "alias": "__popup__"; "required": false; "isSignal": true; }; "__actionSheet__": { "alias": "__actionSheet__"; "required": false; "isSignal": true; }; }, { "recordingComplete": "recordingComplete"; "recordingCancelled": "recordingCancelled"; }, never, never, true, never>;
5461
5162
  }
5462
5163
 
5463
5164
  declare const AX_CONVERSATION_COMPOSER_EMOJI_ACTION: AXConversationComposerAction;
@@ -5479,6 +5180,8 @@ declare const AX_CONVERSATION_FILE_TYPES_READY: InjectionToken<boolean>;
5479
5180
  /** Registers validation rules and lazy conversation file-type catalogs for composer actions. */
5480
5181
  declare function provideConversationComposerFileTypes(): Provider[];
5481
5182
 
5183
+ /** Ensure a built-in conversation catalog is registered before pre-overlay file selection. */
5184
+ declare function ensureConversationFileCatalogRegistered(registry: AXFileTypeRegistryService, catalogName: string): Promise<void>;
5482
5185
  /**
5483
5186
  * Lazy-loads conversation file catalogs for the root file-type registry.
5484
5187
  * Must not inject {@link AXConversationComposerActionRegistry} — that registry
@@ -5499,170 +5202,6 @@ declare function createLocalPreviewUrl(fileService: AXFileService, platformId: o
5499
5202
 
5500
5203
  declare function resolveComposerMaxFiles(action: Pick<AXConversationComposerAction, 'maxFiles'> | undefined, config: Pick<Required<AXConversationConfig>, 'maxFilesPerMessage'>): number;
5501
5204
 
5502
- interface AXConversationInfoProfileField {
5503
- id: string;
5504
- labelKey: string;
5505
- value: string;
5506
- icon: string;
5507
- }
5508
- type AXConversationMediaCategoryId = 'image' | 'video' | 'file' | 'audio' | 'voice' | 'sticker' | 'location' | 'link';
5509
- interface AXConversationMediaCategory {
5510
- id: AXConversationMediaCategoryId;
5511
- labelKey: string;
5512
- countLabelKey: string;
5513
- icon: string;
5514
- count: number;
5515
- }
5516
- declare function messageContainsLink(message: AXConversationMessage): boolean;
5517
- declare function getPrivatePeerParticipant(conversation: AXConversation, currentUserId?: string): AXConversationParticipant | undefined;
5518
- declare function getConversationProfileFields(conversation: AXConversation, currentUserId?: string): AXConversationInfoProfileField[];
5519
- declare function getConversationMediaCategories(messages: AXConversationMessage[]): AXConversationMediaCategory[];
5520
- declare function filterMessagesByMediaCategory(messages: AXConversationMessage[], categoryId: AXConversationMediaCategoryId): AXConversationMessage[];
5521
- declare function isGridMediaCategory(categoryId: AXConversationMediaCategoryId): boolean;
5522
- declare function isAttachmentListCategory(categoryId: AXConversationMediaCategoryId): boolean;
5523
- interface AXConversationMediaGalleryTile {
5524
- key: string;
5525
- message: AXConversationMessage;
5526
- kind: 'image' | 'video' | 'sticker';
5527
- image?: AXConversationImageMediaItem;
5528
- video?: AXConversationVideoMediaItem;
5529
- stickerUrl?: string;
5530
- stickerAlt?: string;
5531
- }
5532
- declare function buildMediaGalleryTiles(messages: AXConversationMessage[], categoryId: AXConversationMediaCategoryId): AXConversationMediaGalleryTile[];
5533
- declare function resolveVideoThumbnailUrl(video: AXConversationVideoMediaItem): string | undefined;
5534
- declare function resolveGalleryImageUrl(image: AXConversationImageMediaItem): string | undefined;
5535
- declare function getMessageVideoItems(message: AXConversationMessage): AXConversationVideoMediaItem[];
5536
- declare function getMessageAudioItems(message: AXConversationMessage): AXConversationAudioMediaItem[];
5537
- interface AXConversationMediaPageResult {
5538
- items: AXConversationMessage[];
5539
- hasMore: boolean;
5540
- nextCursor?: string;
5541
- page: number;
5542
- }
5543
- declare function fetchConversationMediaPage(conversationApi: AXConversationApi, conversationId: string, page: number, pageSize?: number, cursor?: string): Promise<AXConversationMediaPageResult>;
5544
- /** @deprecated Use {@link fetchConversationMediaPage} — loads only the first page. */
5545
- declare function fetchConversationMediaMessages(conversationApi: AXConversationApi, conversationId: string, pageSize: number): Promise<AXConversationMessage[]>;
5546
- /** Merge media API results with in-memory messages needed for link/sticker/voice/location tabs. */
5547
- declare function mergeInfoPanelMessages(mediaMessages: AXConversationMessage[], supplemental: AXConversationMessage[]): AXConversationMessage[];
5548
- declare function filterSupplementalInfoPanelMessages(messages: AXConversationMessage[]): AXConversationMessage[];
5549
-
5550
- interface AXInfoPanelQuickAction {
5551
- id: string;
5552
- labelKey: string;
5553
- icon: string;
5554
- danger?: boolean;
5555
- }
5556
- declare class AXConversationInfoPanelComponent extends AXClosableComponent implements OnInit, OnDestroy {
5557
- private readonly toastService;
5558
- readonly translation: AXTranslationService;
5559
- private readonly platform;
5560
- private readonly injectedConversationService;
5561
- readonly onClosed: _angular_core.OutputEmitterRef<AXComponentCloseEvent>;
5562
- conversation: AXConversation;
5563
- conversationService: AXConversationService;
5564
- readonly activeTab: _angular_core.WritableSignal<"profile" | "manage">;
5565
- readonly showMemberSearch: _angular_core.WritableSignal<boolean>;
5566
- readonly panelView: _angular_core.WritableSignal<"main" | "media">;
5567
- readonly selectedMediaCategory: _angular_core.WritableSignal<AXConversationMediaCategory>;
5568
- readonly mediaViewLoader: () => Promise<typeof _acorex_components_conversation.AXConversationInfoMediaViewComponent>;
5569
- readonly conversationMessages: _angular_core.WritableSignal<AXConversationMessage[]>;
5570
- readonly loadingMessages: _angular_core.WritableSignal<boolean>;
5571
- readonly loadingMoreMedia: _angular_core.WritableSignal<boolean>;
5572
- readonly mediaHasMore: _angular_core.WritableSignal<boolean>;
5573
- private mediaNextPage;
5574
- private mediaNextCursor;
5575
- readonly memberSearchQuery: _angular_core.WritableSignal<string>;
5576
- archived: boolean;
5577
- private initialNotifications;
5578
- private initialArchived;
5579
- editTitle: string;
5580
- editAvatar: string;
5581
- private groupTitleSaveTimer;
5582
- private groupDetailsSaveInFlight;
5583
- readonly backgroundPresets: {
5584
- label: string;
5585
- id: string;
5586
- value: AXConversationMessageListThemeBackground;
5587
- }[];
5588
- readonly heroSubtitle: _angular_core.Signal<string>;
5589
- readonly liveConversation: _angular_core.Signal<AXConversation>;
5590
- readonly isConversationMuted: _angular_core.Signal<boolean>;
5591
- readonly profileFields: _angular_core.Signal<_acorex_components_conversation.AXConversationInfoProfileField[]>;
5592
- readonly mediaCategories: _angular_core.Signal<AXConversationMediaCategory[]>;
5593
- readonly quickActions: _angular_core.Signal<AXInfoPanelQuickAction[]>;
5594
- readonly filteredMembers: _angular_core.Signal<AXConversationParticipant[]>;
5595
- ngOnInit(): void;
5596
- private loadConversationMessages;
5597
- loadMoreMedia(): Promise<void>;
5598
- isPrivateConversation(): boolean;
5599
- isGroupConversation(): boolean;
5600
- membersSectionTitle(): string;
5601
- getMemberRoleLabel(participant: AXConversationParticipant): string | null;
5602
- onMemberSearchChange(value: string | null | undefined): void;
5603
- setActiveTab(tab: 'profile' | 'manage'): void;
5604
- toggleMemberSearch(): void;
5605
- openMediaCategory(category: AXConversationMediaCategory): void;
5606
- closeMediaView(): void;
5607
- getMediaViewInputs(category: AXConversationMediaCategory): Record<string, unknown>;
5608
- getMediaRowLabel(category: AXConversationMediaCategory): string;
5609
- getMemberSubtitle(participant: AXConversationParticipant): string;
5610
- onQuickAction(actionId: string): void;
5611
- toggleConversationMute(): Promise<void>;
5612
- onNotificationsChange(value: boolean): Promise<void>;
5613
- onArchivedChange(value: boolean): Promise<void>;
5614
- close(data?: unknown): void;
5615
- closeAll(): void;
5616
- onLeave(): Promise<void>;
5617
- onGroupTitleChange(value: string): void;
5618
- onGroupAvatarChange(value: string): void;
5619
- private persistGroupDetails;
5620
- isBackgroundSelected(preset: {
5621
- id: string;
5622
- value: AXConversationMessageListThemeBackground;
5623
- }): boolean;
5624
- presetBackgroundPreview(preset: AXConversationMessageListThemeBackground): string;
5625
- applyMessageListBackground(value: AXConversationMessageListBackground): Promise<void>;
5626
- getBackgroundAriaLabel(label: string): string;
5627
- private translateBackgroundPresetLabel;
5628
- ngOnDestroy(): void;
5629
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXConversationInfoPanelComponent, never>;
5630
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXConversationInfoPanelComponent, "ax-conversation-info-panel", never, {}, { "onClosed": "onClosed"; }, never, never, true, never>;
5631
- }
5632
-
5633
- declare class AXConversationInfoMediaViewComponent {
5634
- private readonly translation;
5635
- private readonly parentInjector;
5636
- readonly category: _angular_core.InputSignal<AXConversationMediaCategory>;
5637
- readonly messages: _angular_core.InputSignal<AXConversationMessage[]>;
5638
- readonly conversation: _angular_core.InputSignal<AXConversation>;
5639
- readonly conversationServiceInput: _angular_core.InputSignal<AXConversationService>;
5640
- readonly hasMoreMedia: _angular_core.InputSignal<boolean>;
5641
- readonly loadingMoreMedia: _angular_core.InputSignal<boolean>;
5642
- readonly onLoadMoreMedia: _angular_core.InputSignal<() => void | Promise<void>>;
5643
- /** Callback for lazy outlet wiring (alternative to the `back` output). */
5644
- readonly onBack: _angular_core.InputSignal<() => void>;
5645
- readonly back: _angular_core.OutputEmitterRef<void>;
5646
- readonly items: _angular_core.Signal<AXConversationMessage[]>;
5647
- readonly isGrid: _angular_core.Signal<boolean>;
5648
- readonly isAttachmentList: _angular_core.Signal<boolean>;
5649
- readonly galleryTiles: _angular_core.Signal<_acorex_components_conversation.AXConversationMediaGalleryTile[]>;
5650
- readonly rendererInjector: _angular_core.Signal<_angular_core.DestroyableInjector>;
5651
- readonly titleLabel: _angular_core.Signal<string>;
5652
- readonly getMessageVideoItems: typeof getMessageVideoItems;
5653
- readonly getMessageAudioItems: typeof getMessageAudioItems;
5654
- getRendererComponent(message: AXConversationMessage): _angular_core.Type<_acorex_components_conversation.AXConversationMessageRendererComponent>;
5655
- getRendererComponentLoader(message: AXConversationMessage): (() => Promise<_angular_core.Type<_acorex_components_conversation.AXConversationMessageRendererComponent>>) | (() => Promise<typeof _acorex_components_conversation.AXConversationFallbackRendererComponent>);
5656
- getRendererInputs(message: AXConversationMessage): {
5657
- message: AXConversationMessage;
5658
- };
5659
- formatTimestamp(message: AXConversationMessage): string;
5660
- handleBack(): void;
5661
- onScrollThreshold(edge: 'top' | 'bottom'): void;
5662
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXConversationInfoMediaViewComponent, never>;
5663
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<AXConversationInfoMediaViewComponent, "ax-conversation-info-media-view", never, { "category": { "alias": "category"; "required": true; "isSignal": true; }; "messages": { "alias": "messages"; "required": true; "isSignal": true; }; "conversation": { "alias": "conversation"; "required": true; "isSignal": true; }; "conversationServiceInput": { "alias": "conversationService"; "required": true; "isSignal": true; }; "hasMoreMedia": { "alias": "hasMoreMedia"; "required": false; "isSignal": true; }; "loadingMoreMedia": { "alias": "loadingMoreMedia"; "required": false; "isSignal": true; }; "onLoadMoreMedia": { "alias": "onLoadMoreMedia"; "required": false; "isSignal": true; }; "onBack": { "alias": "onBack"; "required": false; "isSignal": true; }; }, { "back": "back"; }, never, never, true, never>;
5664
- }
5665
-
5666
5205
  declare class AXConversationInfoBarSearchComponent {
5667
5206
  private readonly platformId;
5668
5207
  private readonly destroyRef;
@@ -5705,7 +5244,7 @@ declare class AXConversationInfoBarSearchComponent {
5705
5244
  */
5706
5245
 
5707
5246
  /**
5708
- * Search in conversation action (inline)
5247
+ * Search in conversation action (inline on desktop, menu on mobile)
5709
5248
  */
5710
5249
  declare const AX_CONVERSATION_INFO_BAR_SEARCH_ACTION: AXConversationInfoBarAction;
5711
5250
  /**
@@ -6180,14 +5719,6 @@ declare const AX_CONVERSATION_MESSAGE_DELETE_ACTION: AXConversationMessageAction
6180
5719
  */
6181
5720
  declare const AX_CONVERSATION_MESSAGE_FORWARD_ACTION: AXConversationMessageAction;
6182
5721
 
6183
- /** Normalize payload; loads media normalizers on demand. */
6184
- declare function normalizeMessagePayloadAsync(payload: AXConversationMessagePayload): Promise<AXConversationMessagePayload>;
6185
- /**
6186
- * Sync normalize — uses cached normalizers when available.
6187
- * Media payloads pass through until a normalizer chunk has loaded (renderers normalize on display).
6188
- */
6189
- declare function normalizeMessagePayload(payload: AXConversationMessagePayload): AXConversationMessagePayload;
6190
-
6191
5722
  declare const AX_CONVERSATION_TEXT_RENDERER: AXConversationMessageRenderer;
6192
5723
 
6193
5724
  declare const AX_CONVERSATION_IMAGE_RENDERER: AXConversationMessageRenderer;
@@ -6269,6 +5800,7 @@ declare class AXConversationDefaultConversationAvatarComponent {
6269
5800
  displayAvatar: string;
6270
5801
  displayIcon: string;
6271
5802
  }>;
5803
+ readonly filteredUserAvatarInputs: _angular_core.Signal<Record<string, unknown>>;
6272
5804
  readonly fallbackDisplay: _angular_core.Signal<_acorex_components_conversation.AXConversationAvatarDisplay>;
6273
5805
  readonly fallbackInitials: _angular_core.Signal<string>;
6274
5806
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXConversationDefaultConversationAvatarComponent, never>;
@@ -6433,92 +5965,38 @@ declare class AXConversationDateUtilsService {
6433
5965
  static formatTime(date: Date): string;
6434
5966
  }
6435
5967
 
5968
+ /**
5969
+ * Message Utilities Service
5970
+ * Helper functions for message formatting and display
5971
+ */
5972
+
6436
5973
  declare class AXConversationMessageUtilsService {
6437
- /**
6438
- * Normalize optional avatar/icon values so empty or whitespace-only strings
6439
- * are treated as missing data.
6440
- */
6441
- private static normalizeOptionalMediaValue;
6442
- /**
6443
- * Get conversation avatar image URL.
6444
- */
6445
- static getConversationAvatar(conversation: AXConversation): string | undefined;
6446
- /**
6447
- * Font Awesome icon class(es) for a conversation when there is no avatar image.
6448
- */
6449
- static getConversationAvatarIcon(conversation: AXConversation): string | undefined;
6450
- /**
6451
- * Font Awesome icon for a participant when there is no avatar image.
6452
- */
6453
- static getParticipantAvatarIcon(participant?: {
6454
- avatar?: string;
6455
- icon?: string;
6456
- }): string | undefined;
6457
- /**
6458
- * Get sender name from message
6459
- */
6460
- static getSenderName(message: AXConversationMessage, conversation: AXConversation): string;
6461
- /**
6462
- * Get sender avatar image URL (takes precedence over {@link getSenderAvatarIcon}).
6463
- */
6464
- static getSenderAvatar(message: AXConversationMessage, conversation: AXConversation): string | undefined;
6465
- /**
6466
- * Font Awesome icon class(es) for the sender when there is no avatar image:
6467
- * participant `icon` first, then conversation-level `icon`.
6468
- */
6469
- static getSenderAvatarIcon(message: AXConversationMessage, conversation: AXConversation): string | undefined;
6470
- /**
6471
- * Get initials from name
6472
- */
6473
5974
  static getInitials(name: string): string;
6474
- /**
6475
- * Type guard for text payload
6476
- */
6477
- static isTextPayload(payload: AXConversationMessagePayload): payload is AXConversationTextPayload;
6478
- /**
6479
- * Get message text content
6480
- */
6481
5975
  static getMessageText(message: AXConversationMessage): string;
6482
- /**
6483
- * Format message preview text
6484
- */
6485
5976
  static getPreviewText(message: AXConversationMessage, maxLength?: number): {
6486
5977
  value: string;
6487
5978
  type: string;
6488
5979
  icon: string;
6489
5980
  };
6490
- /**
6491
- * Check if message is from current user
6492
- */
6493
5981
  static isOwnMessage(message: AXConversationMessage, currentUserId: string): boolean;
6494
- /**
6495
- * Get message status icon class (Font Awesome)
6496
- */
5982
+ static getSenderName(message: AXConversationMessage, conversation: AXConversation): string;
5983
+ static getSenderAvatar(message: AXConversationMessage, conversation: AXConversation): string | undefined;
5984
+ static getSenderAvatarIcon(message: AXConversationMessage, conversation: AXConversation): string | undefined;
5985
+ static getConversationAvatar(conversation: AXConversation): string | undefined;
5986
+ static getConversationAvatarIcon(conversation: AXConversation): string | undefined;
6497
5987
  static getStatusIcon(message: AXConversationMessage): string;
6498
- /**
6499
- * Check if message should show avatar
6500
- */
6501
- static shouldShowAvatar(message: AXConversationMessage, previousMessage: AXConversationMessage | undefined, conversation: AXConversation): boolean;
6502
- /**
6503
- * Group messages by sender for consecutive messages
6504
- */
6505
- static shouldGroupWithPrevious(message: AXConversationMessage, previousMessage: AXConversationMessage | undefined): boolean;
6506
- /**
6507
- * Get conversation status for avatar (private conversations only)
6508
- */
6509
- static getConversationStatus(conversation: AXConversation): 'online' | 'offline' | 'away' | undefined;
6510
- /**
6511
- * Get typing indicator text for conversation
6512
- */
6513
- static getTypingText(conversation: AXConversation): string;
6514
- /**
6515
- * Format last seen time
6516
- */
5988
+ static getConversationStatus(conversation: AXConversation, presence?: AXConversationUserPresence): AXConversationPresenceStatus | undefined;
5989
+ static getDeliveryStatusIcon(status: AXConversationMessage['status']): string;
5990
+ static shouldGroupMessages(message: AXConversationMessage, previousMessage?: AXConversationMessage): boolean;
5991
+ static getUserPresenceStatus(presence?: AXConversationUserPresence): AXConversationPresenceStatus | undefined;
5992
+ static getTypingText(conversation: AXConversation, typingUserIds: string[]): string;
6517
5993
  static formatLastSeen(date: Date): string;
6518
- /**
6519
- * Get conversation subtitle (status or member count)
6520
- */
6521
- static getConversationSubtitle(conversation: AXConversation): string;
5994
+ static getPrivateChatSubtitle(conversation: AXConversation, presence?: AXConversationUserPresence, currentUserId?: string): string;
5995
+ static getConversationSubtitle(conversation: AXConversation, options?: {
5996
+ typingUserIds?: string[];
5997
+ peerPresence?: AXConversationUserPresence;
5998
+ currentUserId?: string;
5999
+ }): string;
6522
6000
  }
6523
6001
 
6524
6002
  /**
@@ -6616,6 +6094,52 @@ declare function copyWithFileTypeFallback(message: AXConversationMessage, regist
6616
6094
  /** Use file-type `open` on the message when `message.fileType` is set. */
6617
6095
  declare function openWithFileType(message: AXConversationMessage, registry: AXFileTypeRegistryService, ctx: AXFileTypeOpenContext): Promise<boolean>;
6618
6096
 
6097
+ interface AXConversationInfoProfileField {
6098
+ id: string;
6099
+ labelKey: string;
6100
+ value: string;
6101
+ icon: string;
6102
+ }
6103
+ type AXConversationMediaCategoryId = 'image' | 'video' | 'file' | 'audio' | 'voice' | 'sticker' | 'location' | 'link';
6104
+ interface AXConversationMediaCategory {
6105
+ id: AXConversationMediaCategoryId;
6106
+ labelKey: string;
6107
+ countLabelKey: string;
6108
+ icon: string;
6109
+ count: number;
6110
+ }
6111
+ declare function messageContainsLink(message: AXConversationMessage): boolean;
6112
+ declare function getPrivatePeerParticipant(conversation: AXConversation, currentUserId?: string): AXConversationParticipant | undefined;
6113
+ declare function getConversationProfileFields(conversation: AXConversation, currentUserId?: string): AXConversationInfoProfileField[];
6114
+ declare function getConversationMediaCategories(messages: AXConversationMessage[]): AXConversationMediaCategory[];
6115
+ declare function filterMessagesByMediaCategory(messages: AXConversationMessage[], categoryId: AXConversationMediaCategoryId): AXConversationMessage[];
6116
+ declare function isGridMediaCategory(categoryId: AXConversationMediaCategoryId): boolean;
6117
+ declare function isAttachmentListCategory(categoryId: AXConversationMediaCategoryId): boolean;
6118
+ interface AXConversationMediaGalleryTile {
6119
+ key: string;
6120
+ message: AXConversationMessage;
6121
+ kind: 'image' | 'video' | 'sticker';
6122
+ image?: AXConversationImageMediaItem;
6123
+ video?: AXConversationVideoMediaItem;
6124
+ stickerUrl?: string;
6125
+ stickerAlt?: string;
6126
+ }
6127
+ declare function buildMediaGalleryTiles(messages: AXConversationMessage[], categoryId: AXConversationMediaCategoryId): AXConversationMediaGalleryTile[];
6128
+ declare function resolveVideoThumbnailUrl(video: AXConversationVideoMediaItem): string | undefined;
6129
+ declare function resolveGalleryImageUrl(image: AXConversationImageMediaItem): string | undefined;
6130
+ declare function getMessageVideoItems(message: AXConversationMessage): AXConversationVideoMediaItem[];
6131
+ declare function getMessageAudioItems(message: AXConversationMessage): AXConversationAudioMediaItem[];
6132
+ interface AXConversationMediaPageResult {
6133
+ items: AXConversationMessage[];
6134
+ hasMore: boolean;
6135
+ nextCursor?: string;
6136
+ page: number;
6137
+ }
6138
+ declare function fetchConversationMediaPage(conversationApi: AXConversationApi, conversationId: string, page: number, pageSize?: number, cursor?: string): Promise<AXConversationMediaPageResult>;
6139
+ /** Merge media API results with in-memory messages needed for link/sticker/voice/location tabs. */
6140
+ declare function mergeInfoPanelMessages(mediaMessages: AXConversationMessage[], supplemental: AXConversationMessage[]): AXConversationMessage[];
6141
+ declare function filterSupplementalInfoPanelMessages(messages: AXConversationMessage[]): AXConversationMessage[];
6142
+
6619
6143
  /**
6620
6144
  * Error Message Constants
6621
6145
  * Centralized error messages with i18n support structure
@@ -7008,5 +6532,5 @@ declare function getErrorMessage(code: string, params?: Record<string, string |
7008
6532
  */
7009
6533
  type AXConversationErrorCode = typeof AX_CONVERSATION_MESSAGE_ERRORS[keyof typeof AX_CONVERSATION_MESSAGE_ERRORS]['code'] | typeof AX_CONVERSATION_FILE_ERRORS[keyof typeof AX_CONVERSATION_FILE_ERRORS]['code'] | typeof AX_CONVERSATION_USER_ERRORS[keyof typeof AX_CONVERSATION_USER_ERRORS]['code'] | typeof AX_CONVERSATION_ERRORS[keyof typeof AX_CONVERSATION_ERRORS]['code'] | typeof AX_CONVERSATION_CONNECTION_ERRORS[keyof typeof AX_CONVERSATION_CONNECTION_ERRORS]['code'] | typeof AX_CONVERSATION_LOCATION_ERRORS[keyof typeof AX_CONVERSATION_LOCATION_ERRORS]['code'] | typeof AX_CONVERSATION_URL_ERRORS[keyof typeof AX_CONVERSATION_URL_ERRORS]['code'];
7010
6534
 
7011
- export { AXConversationAiResponderService, AXConversationApi, AXConversationApiLoggerService, AXConversationAudioAttachmentComponent, AXConversationAudioFileTypeProvider, AXConversationAudioPickerComponent, AXConversationAudioRendererComponent, AXConversationBaseRegistry, AXConversationComposerActionRegistry, AXConversationComposerComponent, AXConversationComposerFileTypesProvider, AXConversationComposerPopupComponent, AXConversationComposerService, AXConversationComposerTabRegistry, AXConversationContainerComponent, AXConversationContainerDirective, AXConversationDateUtilsService, AXConversationEmojiTabComponent, AXConversationErrorHandlerService, AXConversationFallbackRendererComponent, AXConversationFileAttachmentComponent, AXConversationFileFileTypeProvider, AXConversationFilePickerComponent, AXConversationFileRendererComponent, AXConversationForwardMessageDialogComponent, AXConversationImageAttachmentComponent, AXConversationImageFileTypeProvider, AXConversationImagePickerComponent, AXConversationImageRendererComponent, AXConversationIndexedDbConversationApi, AXConversationIndexedDbMessageAiApi, AXConversationIndexedDbMessageApi, AXConversationIndexedDbRealtimeApi, AXConversationIndexedDbStorage, AXConversationIndexedDbStores, AXConversationIndexedDbUserApi, AXConversationInfiniteScrollDirective, AXConversationInfoBarActionRegistry, AXConversationInfoBarComponent, AXConversationInfoBarSearchComponent, AXConversationInfoBarService, AXConversationInfoMediaViewComponent, AXConversationInfoPanelComponent, AXConversationItemActionRegistry, AXConversationLocationPickerComponent, AXConversationLocationRendererComponent, AXConversationMediaPlaybackInfoBarBannerComponent, AXConversationMessageActionRegistry, AXConversationMessageApi, AXConversationMessageListComponent, AXConversationMessageListNoActiveDefaultComponent, AXConversationMessageListService, AXConversationMessageRendererCopyHostComponent, AXConversationMessageRendererRegistry, AXConversationMessageRendererStateComponent, AXConversationMessageUtilsService, AXConversationModule, AXConversationNewDialogComponent, AXConversationPickerCaptionComponent, AXConversationPickerEmptyComponent, AXConversationPickerFooterComponent, AXConversationPickerHeaderComponent, AXConversationPickerShellComponent, AXConversationPickerToolbarComponent, AXConversationRealtimeApi, AXConversationRegistryService, AXConversationService, AXConversationSharedStorage, AXConversationSidebarComponent, AXConversationSidebarService, AXConversationStickerRendererComponent, AXConversationStickerTabComponent, AXConversationSystemRendererComponent, AXConversationTabRegistry, AXConversationTextRendererComponent, AXConversationUserApi, AXConversationVideoAttachmentComponent, AXConversationVideoFileTypeProvider, AXConversationVideoPickerComponent, AXConversationVideoRendererComponent, AXConversationVoiceFileTypeProvider, AXConversationVoiceRecorderComponent, AXConversationVoiceRendererComponent, AX_CONVERSATION_AI_API_KEY, AX_CONVERSATION_AUDIO_CATALOG, AX_CONVERSATION_AUDIO_PRESENTATION, AX_CONVERSATION_AUDIO_RENDERER, AX_CONVERSATION_BUILTIN_COMPOSER_TABS, AX_CONVERSATION_COMPOSER_AUDIO_ACTION, AX_CONVERSATION_COMPOSER_EMOJI_ACTION, AX_CONVERSATION_COMPOSER_EMOJI_TAB, AX_CONVERSATION_COMPOSER_FILE_ACTION, AX_CONVERSATION_COMPOSER_IMAGE_ACTION, AX_CONVERSATION_COMPOSER_LOCATION_ACTION, AX_CONVERSATION_COMPOSER_STICKER_TAB, AX_CONVERSATION_COMPOSER_VIDEO_ACTION, AX_CONVERSATION_COMPOSER_VOICE_RECORDING_ACTION, AX_CONVERSATION_CONFIG, AX_CONVERSATION_CONNECTION_ERRORS, AX_CONVERSATION_CONVERSATION_AVATAR_COMPONENT, AX_CONVERSATION_CURSOR_PREFIX, AX_CONVERSATION_DEFAULT_COMPOSER_ACTIONS, AX_CONVERSATION_DEFAULT_COMPOSER_TABS, AX_CONVERSATION_DEFAULT_CONVERSATION_ITEM_ACTIONS, AX_CONVERSATION_DEFAULT_CONVERSATION_TABS, AX_CONVERSATION_DEFAULT_GROUP_ICON, AX_CONVERSATION_DEFAULT_INFO_BAR_ACTIONS, AX_CONVERSATION_DEFAULT_MESSAGE_ACTIONS, AX_CONVERSATION_DEFAULT_MESSAGE_LIST_BACKGROUND, AX_CONVERSATION_DEFAULT_MESSAGE_LIST_BACKGROUND_PRESET_ID, AX_CONVERSATION_DEFAULT_MESSAGE_LIST_THEME_BACKGROUND, AX_CONVERSATION_DEFAULT_MESSAGE_RENDERERS, AX_CONVERSATION_DEFAULT_USER_ICON, AX_CONVERSATION_DEMO_CONVERSATION_IDS, AX_CONVERSATION_ERRORS, AX_CONVERSATION_ERROR_HANDLER_CONFIG, AX_CONVERSATION_ERROR_MESSAGES, AX_CONVERSATION_FALLBACK_RENDERER, AX_CONVERSATION_FILE_CATALOG, AX_CONVERSATION_FILE_ERRORS, AX_CONVERSATION_FILE_PRESENTATION, AX_CONVERSATION_FILE_RENDERER, AX_CONVERSATION_FILE_TYPES_READY, AX_CONVERSATION_IMAGE_CATALOG, AX_CONVERSATION_IMAGE_PRESENTATION, AX_CONVERSATION_IMAGE_RENDERER, AX_CONVERSATION_INFO_BAR_ARCHIVE_ACTION, AX_CONVERSATION_INFO_BAR_BLOCK_ACTION, AX_CONVERSATION_INFO_BAR_DELETE_ACTION, AX_CONVERSATION_INFO_BAR_DIVIDER, AX_CONVERSATION_INFO_BAR_MUTE_ACTION, AX_CONVERSATION_INFO_BAR_SEARCH_ACTION, AX_CONVERSATION_ITEM_BLOCK_ACTION, AX_CONVERSATION_ITEM_DELETE_ACTION, AX_CONVERSATION_ITEM_DIVIDER, AX_CONVERSATION_ITEM_MARK_READ_ACTION, AX_CONVERSATION_ITEM_MUTE_ACTION, AX_CONVERSATION_ITEM_PIN_ACTION, AX_CONVERSATION_LOCATION_ERRORS, AX_CONVERSATION_LOCATION_RENDERER, AX_CONVERSATION_MESSAGE_CURSOR_PREFIX, AX_CONVERSATION_MESSAGE_DELETE_ACTION, AX_CONVERSATION_MESSAGE_EDIT_ACTION, AX_CONVERSATION_MESSAGE_ERRORS, AX_CONVERSATION_MESSAGE_FORWARD_ACTION, AX_CONVERSATION_MESSAGE_LIST_BACKGROUND_PRESETS, AX_CONVERSATION_MESSAGE_REPLY_ACTION, AX_CONVERSATION_MESSAGE_TYPE_FILE_TYPE, AX_CONVERSATION_PEER_AVATAR_TYPES, AX_CONVERSATION_REGISTRY_CONFIG, AX_CONVERSATION_STICKER_API_KEY, AX_CONVERSATION_STICKER_RENDERER, AX_CONVERSATION_SYSTEM_RENDERER, AX_CONVERSATION_TAB_ALL, AX_CONVERSATION_TAB_ARCHIVED, AX_CONVERSATION_TAB_BOT, AX_CONVERSATION_TAB_CHANNELS, AX_CONVERSATION_TAB_GROUPS, AX_CONVERSATION_TAB_PRIVATE, AX_CONVERSATION_TAB_UNREAD, AX_CONVERSATION_TEXT_RENDERER, AX_CONVERSATION_URL_ERRORS, AX_CONVERSATION_USER_AVATAR_COMPONENT, AX_CONVERSATION_USER_ERRORS, AX_CONVERSATION_VIDEO_CATALOG, AX_CONVERSATION_VIDEO_PRESENTATION, AX_CONVERSATION_VIDEO_RENDERER, AX_CONVERSATION_VOICE_CATALOG, AX_CONVERSATION_VOICE_PRESENTATION, AX_CONVERSATION_VOICE_RENDERER, AX_DEFAULT_CONVERSATION_CONFIG, AX_MESSAGE_PAGINATION_CONVERSATION_ID, abortPickerUploads, applyAudioLocalPreview, applyConversationFilters, applyFileLocalPreview, applyLocalPreview, applyVideoLocalPreview, applyVoiceLocalPreview, audioItemFromUpload, axConversationIndexedDbStorage, axConversationSharedStorage, bindMediaRendererContentState, buildMediaGalleryTiles, canShowRendererContentError, cleanupPickerUploads, conversationAudioUtilities, conversationFileUtilities, conversationImageUtilities, conversationVideoUtilities, conversationVoiceUtilities, copyWithFileTypeFallback, createConversationAudioFileType, createConversationFileFileType, createConversationImageFileType, createConversationVideoFileType, createConversationVoiceFileType, createLocalPreviewUrl, createObjectUrl, createPickerDragHandlers, createResolvedMediaUrlSignal, deleteUploadedPickerMedia, dismissComposerPickerHost, encodeConversationCursor, encodeMessageCursor, ensurePaginationDemoData, fetchConversationMediaMessages, fetchConversationMediaPage, fileItemFromUpload, filterMessagesByMediaCategory, filterSupplementalInfoPanelMessages, findExistingPrivateConversation, formatDuration, formatErrorMessage, formatFileByteSize, formatFileSize, formatMediaDuration, formatPickerValidationMessage, getConversationLastActivity, getConversationMediaCategories, getConversationMessagesNewestFirst, getConversationProfileFields, getErrorMessage, getMessageAudioItems, getMessageVideoItems, getPickerCancelUploadLabel, getPrivatePeerParticipant, getSortedConversationsForInbox, inferFileExtensionHintFromMessage, isAttachmentListCategory, isComposerTabEnabled, isConversationReactionsEnabled, isGenericPrivateConversationTitle, isGridMediaCategory, isMessageDeliveryPending, isMessageListThemeBackground, isNonPersistableMediaUrl, isPickerItemReadyToSend, isSameMessageListBackground, isUploadAborted, limitFilesToCapacity, mediaCopyText, mergeAudioUploadResult, mergeFileUploadResult, mergeInfoPanelMessages, mergeUploadResult, mergeVideoUploadResult, mergeVoiceUploadResult, mergeWithDefaults, messageContainsLink, normalizeAllConversationMessageIndexes, normalizeAudioPayload, normalizeFilePayload, normalizeImagePayload, normalizeMessageListBackgroundValue, normalizeMessagePayload, normalizeMessagePayloadAsync, normalizeVideoPayload, notifyMaxFilesCapacityExceeded, notifyPickerValidationErrors, openWithFileType, paginateChatNewestFirst, paginateChatOldestFirst, parseChatCursor, pickDisplayMediaUrl, pickerItemToMediaReference, pickerItemToUploadResult, provideConversation, provideConversationComposerFileTypes, provideConversationFileCatalog, registerChatMessage, reportMediaLoadError, resolveComposerMaxFiles, resolveConversationAvatarDisplay, resolveConversationComposerTabs, resolveConversationForViewer, resolveConversationMessageFileType, resolveConversationPeerParticipant, resolveConversationPeerUserId, resolveConversationTitleForViewer, resolveGalleryImageUrl, resolveImageDisplayUrl, resolveMessageListBackgroundRaw, resolveMessageListBackgroundStyle, resolveParticipantProfile, resolvePersistableMediaUrl, resolvePersistedThumbnailUrl, resolvePrivatePeerParticipant, resolvePrivatePeerUserId, resolveUserAvatarDisplay, resolveVideoThumbnailUrl, revokeObjectUrl, revokePickerBlobPreviews, sanitizeInput, seedPickerInitialFiles, seedSharedStorageInitialData, shouldUseUserAvatarForConversation, sortConversationMessageIds, syncPlaybackInfoBarBanner, toUploaderReference as toMediaItemUploaderReference, toUploaderReference$1 as toUploaderReference, unregisterChatMessage, uploadPickerFile, validateConversationId, validateEmail, validateLatitude, validateLongitude, validateMessagePayload, validateMessageText, validateMessageType, validateUrl, validateUserId, validateUserIds, videoItemFromUpload };
7012
- export type { AXConversation, AXConversationAiResponderConfig, AXConversationApiError, AXConversationApiLogEntry, AXConversationApiName, AXConversationAudioMediaItem, AXConversationAudioPayload, AXConversationAvatarComponents, AXConversationAvatarDisplay, AXConversationAvatarKind, AXConversationBlockReportReason, AXConversationCallEvent, AXConversationChatCursorKind, AXConversationCleanupPickerUploadsOptions, AXConversationComposerAction, AXConversationComposerActionComponent, AXConversationComposerActionContext, AXConversationComposerActiveComponent, AXConversationComposerPickerUploadItem, AXConversationComposerTab, AXConversationComposerTabFeature, AXConversationConfig, AXConversationConnectionEvent, AXConversationConnectionOptions, AXConversationConnectionStatus, AXConversationConversationAvatarComponent, AXConversationCreateData, AXConversationDeleteMessageCommand, AXConversationDropdownMenuItem, AXConversationEditMessageCommand, AXConversationError, AXConversationErrorCode, AXConversationErrorHandlerConfig, AXConversationErrorMessage, AXConversationErrorSeverity, AXConversationFeatures, AXConversationFileMediaItem, AXConversationFilePayload, AXConversationFilter, AXConversationFilters, AXConversationGroupedReaction, AXConversationImageMediaItem, AXConversationImagePayload, AXConversationIndexedDbMediaRecord, AXConversationInfoBarAction, AXConversationInfoBarActionComponent, AXConversationInfoBarActionContext, AXConversationInfoBarActiveBanner, AXConversationInfoBarActiveComponent, AXConversationInfoProfileField, AXConversationItemAction, AXConversationItemActionContext, AXConversationLink, AXConversationLinkPreview, AXConversationLoadMessagesResult, AXConversationLocationPayload, AXConversationMediaCategory, AXConversationMediaCategoryId, AXConversationMediaGalleryTile, AXConversationMediaItemFields, AXConversationMediaPageResult, AXConversationMention, AXConversationMessage, AXConversationMessageAction, AXConversationMessageActionContext, AXConversationMessageForwardData, AXConversationMessageInfoBarBannerComponent, AXConversationMessageListBackground, AXConversationMessageListBackgroundPreset, AXConversationMessageListEmptyComponent, AXConversationMessageListThemeBackground, AXConversationMessagePayload, AXConversationMessageRenderer, AXConversationMessageRendererCapabilities, AXConversationMessageRendererComponent, AXConversationMessageRendererContentState, AXConversationMessageRendererState, AXConversationMessageSearchFilters, AXConversationMessageStatus, AXConversationMessageType, AXConversationMetadata, AXConversationNotificationEvent, AXConversationOptions, AXConversationPaginatedResult, AXConversationPagination, AXConversationPaginationState, AXConversationParsedChatCursor, AXConversationParticipant, AXConversationParticipantRole, AXConversationParticipantStatus, AXConversationParticipantUpdate, AXConversationPinnedMessage, AXConversationPlaybackBannerInputs, AXConversationPollOption, AXConversationPollPayload, AXConversationPresenceStatus, AXConversationPresenceUpdate, AXConversationReaction, AXConversationReadReceipt, AXConversationRegistryConfiguration, AXConversationRegistryItem, AXConversationSendMessageCommand, AXConversationSendMessageOptions, AXConversationSendMessageUploadSource, AXConversationSettings, AXConversationSettingsUpdate, AXConversationSort, AXConversationStatus, AXConversationStickerPayload, AXConversationSystemPayload, AXConversationTab, AXConversationTextFormat, AXConversationTextPayload, AXConversationType, AXConversationTypingIndicator, AXConversationUpdateData, AXConversationUploadOptions, AXConversationUploaderFilePreview, AXConversationUploaderReference, AXConversationUploaderResult, AXConversationUserAvatarComponent, AXConversationUserProfile, AXConversationUserProfileUpdate, AXConversationUserRole, AXConversationUserSearchFilters, AXConversationValidationResult, AXConversationVideoMediaItem, AXConversationVideoPayload, AXConversationVoicePayload };
6535
+ export { AXConversationApi, AXConversationApiLoggerService, AXConversationAudioAttachmentComponent, AXConversationAudioFileTypeProvider, AXConversationAudioPickerComponent, AXConversationAudioRendererComponent, AXConversationAvatarComponent, AXConversationAvatarPickerComponent, AXConversationBaseRegistry, AXConversationComposerActionRegistry, AXConversationComposerComponent, AXConversationComposerFileTypesProvider, AXConversationComposerGenerationStateService, AXConversationComposerPopupComponent, AXConversationComposerService, AXConversationComposerTabRegistry, AXConversationContainerComponent, AXConversationContainerDirective, AXConversationDateUtilsService, AXConversationEmojiTabComponent, AXConversationErrorHandlerService, AXConversationFallbackRendererComponent, AXConversationFileAttachmentComponent, AXConversationFileFileTypeProvider, AXConversationFilePickerComponent, AXConversationFileRendererComponent, AXConversationForwardMessageDialogComponent, AXConversationImageAttachmentComponent, AXConversationImageFileTypeProvider, AXConversationImagePickerComponent, AXConversationImageRendererComponent, AXConversationInfiniteScrollDirective, AXConversationInfoBarActionRegistry, AXConversationInfoBarComponent, AXConversationInfoBarSearchComponent, AXConversationInfoBarService, AXConversationItemActionRegistry, AXConversationLocationPickerComponent, AXConversationLocationRendererComponent, AXConversationMediaPlaybackInfoBarBannerComponent, AXConversationMessageActionRegistry, AXConversationMessageApi, AXConversationMessageListComponent, AXConversationMessageListNoActiveDefaultComponent, AXConversationMessageListService, AXConversationMessageRendererCopyHostComponent, AXConversationMessageRendererRegistry, AXConversationMessageRendererStateComponent, AXConversationMessageUtilsService, AXConversationModule, AXConversationNewDialogComponent, AXConversationPickerCaptionComponent, AXConversationPickerEmptyComponent, AXConversationPickerFooterComponent, AXConversationPickerHeaderComponent, AXConversationPickerShellComponent, AXConversationPickerToolbarComponent, AXConversationRealtimeApi, AXConversationRegistryComponentOutletComponent, AXConversationRegistryService, AXConversationService, AXConversationSidebarComponent, AXConversationSidebarService, AXConversationStickerRendererComponent, AXConversationStickerTabComponent, AXConversationSystemRendererComponent, AXConversationTabRegistry, AXConversationTextRendererComponent, AXConversationUserApi, AXConversationVideoAttachmentComponent, AXConversationVideoFileTypeProvider, AXConversationVideoPickerComponent, AXConversationVideoRendererComponent, AXConversationVoiceFileTypeProvider, AXConversationVoiceRecorderComponent, AXConversationVoiceRendererComponent, AX_CONVERSATION_AUDIO_CATALOG, AX_CONVERSATION_AUDIO_PRESENTATION, AX_CONVERSATION_AUDIO_RENDERER, AX_CONVERSATION_BUILTIN_COMPOSER_TABS, AX_CONVERSATION_COMPOSER_AUDIO_ACTION, AX_CONVERSATION_COMPOSER_EMOJI_ACTION, AX_CONVERSATION_COMPOSER_EMOJI_TAB, AX_CONVERSATION_COMPOSER_FILE_ACTION, AX_CONVERSATION_COMPOSER_IMAGE_ACTION, AX_CONVERSATION_COMPOSER_LOCATION_ACTION, AX_CONVERSATION_COMPOSER_STICKER_TAB, AX_CONVERSATION_COMPOSER_VIDEO_ACTION, AX_CONVERSATION_COMPOSER_VOICE_RECORDING_ACTION, AX_CONVERSATION_CONFIG, AX_CONVERSATION_CONNECTION_ERRORS, AX_CONVERSATION_CONVERSATION_AVATAR_COMPONENT, AX_CONVERSATION_DEFAULT_COMPOSER_ACTIONS, AX_CONVERSATION_DEFAULT_COMPOSER_TABS, AX_CONVERSATION_DEFAULT_CONVERSATION_ITEM_ACTIONS, AX_CONVERSATION_DEFAULT_CONVERSATION_TABS, AX_CONVERSATION_DEFAULT_GROUP_ICON, AX_CONVERSATION_DEFAULT_INFO_BAR_ACTIONS, AX_CONVERSATION_DEFAULT_MESSAGE_ACTIONS, AX_CONVERSATION_DEFAULT_MESSAGE_LIST_BACKGROUND, AX_CONVERSATION_DEFAULT_MESSAGE_LIST_BACKGROUND_PRESET_ID, AX_CONVERSATION_DEFAULT_MESSAGE_LIST_THEME_BACKGROUND, AX_CONVERSATION_DEFAULT_MESSAGE_RENDERERS, AX_CONVERSATION_DEFAULT_ROOM_PREFERENCES, AX_CONVERSATION_DEFAULT_USER_ICON, AX_CONVERSATION_ERRORS, AX_CONVERSATION_ERROR_HANDLER_CONFIG, AX_CONVERSATION_ERROR_MESSAGES, AX_CONVERSATION_FALLBACK_RENDERER, AX_CONVERSATION_FILE_CATALOG, AX_CONVERSATION_FILE_ERRORS, AX_CONVERSATION_FILE_PRESENTATION, AX_CONVERSATION_FILE_RENDERER, AX_CONVERSATION_FILE_TYPES_READY, AX_CONVERSATION_IMAGE_CATALOG, AX_CONVERSATION_IMAGE_PRESENTATION, AX_CONVERSATION_IMAGE_RENDERER, AX_CONVERSATION_INFO_BAR_ARCHIVE_ACTION, AX_CONVERSATION_INFO_BAR_BLOCK_ACTION, AX_CONVERSATION_INFO_BAR_DELETE_ACTION, AX_CONVERSATION_INFO_BAR_DIVIDER, AX_CONVERSATION_INFO_BAR_MUTE_ACTION, AX_CONVERSATION_INFO_BAR_SEARCH_ACTION, AX_CONVERSATION_ITEM_BLOCK_ACTION, AX_CONVERSATION_ITEM_DELETE_ACTION, AX_CONVERSATION_ITEM_DIVIDER, AX_CONVERSATION_ITEM_MARK_READ_ACTION, AX_CONVERSATION_ITEM_MUTE_ACTION, AX_CONVERSATION_ITEM_PIN_ACTION, AX_CONVERSATION_LOCATION_ERRORS, AX_CONVERSATION_LOCATION_RENDERER, AX_CONVERSATION_MESSAGE_DELETE_ACTION, AX_CONVERSATION_MESSAGE_EDIT_ACTION, AX_CONVERSATION_MESSAGE_ERRORS, AX_CONVERSATION_MESSAGE_FORWARD_ACTION, AX_CONVERSATION_MESSAGE_LIST_BACKGROUND_PRESETS, AX_CONVERSATION_MESSAGE_REPLY_ACTION, AX_CONVERSATION_MESSAGE_TYPE_FILE_TYPE, AX_CONVERSATION_PEER_AVATAR_TYPES, AX_CONVERSATION_REGISTRY_CONFIG, AX_CONVERSATION_STICKER_API_KEY, AX_CONVERSATION_STICKER_RENDERER, AX_CONVERSATION_SYSTEM_RENDERER, AX_CONVERSATION_TAB_ALL, AX_CONVERSATION_TAB_ARCHIVED, AX_CONVERSATION_TAB_BOT, AX_CONVERSATION_TAB_CHANNELS, AX_CONVERSATION_TAB_GROUPS, AX_CONVERSATION_TAB_PRIVATE, AX_CONVERSATION_TAB_UNREAD, AX_CONVERSATION_TEXT_RENDERER, AX_CONVERSATION_URL_ERRORS, AX_CONVERSATION_USER_AVATAR_COMPONENT, AX_CONVERSATION_USER_ERRORS, AX_CONVERSATION_VIDEO_CATALOG, AX_CONVERSATION_VIDEO_PRESENTATION, AX_CONVERSATION_VIDEO_RENDERER, AX_CONVERSATION_VOICE_CATALOG, AX_CONVERSATION_VOICE_PRESENTATION, AX_CONVERSATION_VOICE_RENDERER, AX_DEFAULT_CONVERSATION_CONFIG, abortPickerUploads, applyAudioLocalPreview, applyFileLocalPreview, applyLocalPreview, applyVideoLocalPreview, applyVoiceLocalPreview, audioItemFromUpload, bindMediaRendererContentState, buildMediaGalleryTiles, canShowRendererContentError, cleanupPickerUploads, conversationAudioUtilities, conversationFileUtilities, conversationImageUtilities, conversationVideoUtilities, conversationVoiceUtilities, copyWithFileTypeFallback, createConversationAudioFileType, createConversationFileFileType, createConversationImageFileType, createConversationVideoFileType, createConversationVoiceFileType, createLocalPreviewUrl, createObjectUrl, createPickerDragHandlers, createResolvedMediaUrlSignal, deleteUploadedPickerMedia, dismissComposerPickerHost, ensureConversationFileCatalogRegistered, fetchConversationMediaPage, fileItemFromUpload, filterMessagesByMediaCategory, filterSupplementalInfoPanelMessages, findExistingPrivateConversation, formatDuration, formatErrorMessage, formatFileByteSize, formatFileSize, formatMediaDuration, formatPickerValidationMessage, getConversationMediaCategories, getConversationProfileFields, getErrorMessage, getMessageAudioItems, getMessageVideoItems, getPickerCancelUploadLabel, getPrivatePeerParticipant, hasRegistryComponent, inferFileExtensionHintFromMessage, isAttachmentListCategory, isComposerTabEnabled, isConversationReactionsEnabled, isGenericPrivateConversationTitle, isGridMediaCategory, isMessageDeliveryPending, isMessageListThemeBackground, isNonPersistableMediaUrl, isPickerItemReadyToSend, isSameMessageListBackground, isUploadAborted, limitFilesToCapacity, mediaCopyText, mergeAudioUploadResult, mergeFileUploadResult, mergeInfoPanelMessages, mergeUploadResult, mergeVideoUploadResult, mergeVoiceUploadResult, mergeWithDefaults, messageContainsLink, normalizeAudioPayload, normalizeFilePayload, normalizeImagePayload, normalizeMessageListBackgroundValue, normalizeVideoPayload, notifyMaxFilesCapacityExceeded, notifyPickerValidationErrors, openWithFileType, pickDisplayMediaUrl, pickerItemToMediaReference, pickerItemToUploadResult, provideConversation, provideConversationComposerFileTypes, provideConversationFileCatalog, reportMediaLoadError, resolveComposerMaxFiles, resolveConversationAvatarDisplay, resolveConversationComposerTabs, resolveConversationForViewer, resolveConversationMessageFileType, resolveConversationPeerParticipant, resolveConversationPeerUserId, resolveConversationTitleForViewer, resolveGalleryImageUrl, resolveImageDisplayUrl, resolveMessageListBackgroundRaw, resolveMessageListBackgroundStyle, resolveParticipantProfile, resolvePersistableMediaUrl, resolvePersistedThumbnailUrl, resolvePrivatePeerParticipant, resolvePrivatePeerUserId, resolveUserAvatarDisplay, resolveVideoThumbnailUrl, revokeObjectUrl, revokePickerBlobPreviews, sanitizeInput, shouldUseUserAvatarForConversation, syncPlaybackInfoBarBanner, toUploaderReference as toMediaItemUploaderReference, toUploaderReference$1 as toUploaderReference, uploadPickerFile, validateConversationId, validateEmail, validateLatitude, validateLongitude, validateMessagePayload, validateMessageText, validateMessageType, validateUrl, validateUserId, validateUserIds, videoItemFromUpload };
6536
+ export type { AXConversation, AXConversationApiError, AXConversationApiLogEntry, AXConversationApiName, AXConversationAudioMediaItem, AXConversationAudioPayload, AXConversationAvatarComponents, AXConversationAvatarDisplay, AXConversationAvatarKind, AXConversationBlockReportReason, AXConversationCallEvent, AXConversationCleanupPickerUploadsOptions, AXConversationComposerAction, AXConversationComposerActionComponent, AXConversationComposerActionContext, AXConversationComposerGenerationPhase, AXConversationComposerPickerUploadItem, AXConversationComposerPrimaryButtonMode, AXConversationComposerTab, AXConversationComposerTabFeature, AXConversationConfig, AXConversationConnectionEvent, AXConversationConnectionOptions, AXConversationConnectionStatus, AXConversationConversationAvatarComponent, AXConversationCreateData, AXConversationDeleteMessageCommand, AXConversationDropdownMenuItem, AXConversationEditMessageCommand, AXConversationError, AXConversationErrorCode, AXConversationErrorHandlerConfig, AXConversationErrorMessage, AXConversationErrorSeverity, AXConversationFeatures, AXConversationFileMediaItem, AXConversationFilePayload, AXConversationFilter, AXConversationFilters, AXConversationGroupedReaction, AXConversationImageMediaItem, AXConversationImagePayload, AXConversationInfoBarAction, AXConversationInfoBarActionComponent, AXConversationInfoBarActionContext, AXConversationInfoBarActiveBanner, AXConversationInfoBarActiveComponent, AXConversationInfoProfileField, AXConversationItemAction, AXConversationItemActionContext, AXConversationLink, AXConversationLinkPreview, AXConversationLoadMessagesResult, AXConversationLocationPayload, AXConversationMediaCategory, AXConversationMediaCategoryId, AXConversationMediaGalleryTile, AXConversationMediaItemFields, AXConversationMediaPageResult, AXConversationMention, AXConversationMessage, AXConversationMessageAction, AXConversationMessageActionContext, AXConversationMessageForwardData, AXConversationMessageInfoBarBannerComponent, AXConversationMessageListBackground, AXConversationMessageListBackgroundPreset, AXConversationMessageListEmptyComponent, AXConversationMessageListThemeBackground, AXConversationMessagePayload, AXConversationMessageRenderer, AXConversationMessageRendererCapabilities, AXConversationMessageRendererComponent, AXConversationMessageRendererContentState, AXConversationMessageRendererState, AXConversationMessageSearchFilters, AXConversationMessageStatus, AXConversationMessageType, AXConversationMetadata, AXConversationNotificationEvent, AXConversationOptions, AXConversationPaginatedResult, AXConversationPagination, AXConversationPaginationState, AXConversationParticipant, AXConversationParticipantRole, AXConversationParticipantUpdate, AXConversationPinnedMessage, AXConversationPlaybackBannerInputs, AXConversationPollOption, AXConversationPollPayload, AXConversationPresenceStatus, AXConversationPresenceUpdate, AXConversationReaction, AXConversationReadReceipt, AXConversationRegistryComponentRef, AXConversationRegistryConfiguration, AXConversationRegistryItem, AXConversationRoomPreferences, AXConversationRoomPreferencesMap, AXConversationSendMessageCommand, AXConversationSendMessageOptions, AXConversationSendMessageUploadSource, AXConversationSettingsUpdate, AXConversationSort, AXConversationStickerPayload, AXConversationSystemPayload, AXConversationTab, AXConversationTextFormat, AXConversationTextPayload, AXConversationType, AXConversationTypingIndicator, AXConversationUpdateData, AXConversationUploadOptions, AXConversationUploaderFilePreview, AXConversationUploaderReference, AXConversationUploaderResult, AXConversationUser, AXConversationUserAvatarComponent, AXConversationUserPresence, AXConversationUserProfile, AXConversationUserProfileUpdate, AXConversationUserSearchFilters, AXConversationValidationResult, AXConversationVideoMediaItem, AXConversationVideoPayload, AXConversationVoicePayload };