@acorex-platform/module-conversation-client 0.0.21 → 0.0.25

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"acorex-platform-module-conversation-client-contracts.mjs","sources":["../../../../libs/modules/conversation/contracts/src/comment-entity-data.ts","../../../../libs/modules/conversation/contracts/src/menu.keys.ts","../../../../libs/modules/conversation/contracts/src/permission.keys.ts","../../../../libs/modules/conversation/contracts/src/root-config.ts","../../../../libs/modules/conversation/contracts/src/entities/message/message.contracts.ts","../../../../libs/modules/conversation/contracts/src/entities/message/message.types.ts","../../../../libs/modules/conversation/contracts/src/entities/room/room.contracts.ts","../../../../libs/modules/conversation/contracts/src/entities/room/room.types.ts","../../../../libs/modules/conversation/contracts/src/assist/conversation-assist-stream.types.ts","../../../../libs/modules/conversation/contracts/src/assist/conversation-assist-metadata.util.ts","../../../../libs/modules/conversation/contracts/src/assist/conversation-assist-handler.port.ts","../../../../libs/modules/conversation/contracts/src/index.ts","../../../../libs/modules/conversation/contracts/src/acorex-platform-module-conversation-client-contracts.ts"],"sourcesContent":["//#region ---- Comment entity reference ----\n\nexport interface AXMCommentEntityData {\n entityId: string;\n entityTypeId: string;\n moduleName?: string;\n entityName?: string;\n}\n\n//#endregion\n","export const AXPConversationMenuKeys = {\n Conversations: 'Conversation:Menu:Conversations',\n} as const;\n\n","/**\n * Collaboration capabilities used by this module.\n * Domain capability keys for this module. Root groups live in `AXPCommonPermissionGroupKeys` (common contracts).\n */\nexport const AXPCollaborationPermissionKeys = {\n Access: 'Collaboration:Permission:Access',\n MaintainConversations: 'Collaboration:Permission:MaintainConversations',\n MaintainMeetings: 'Collaboration:Permission:MaintainMeetings',\n MaintainCalendars: 'Collaboration:Permission:MaintainCalendars',\n MaintainCommunications: 'Collaboration:Permission:MaintainCommunications',\n MaintainReservations: 'Collaboration:Permission:MaintainReservations',\n MaintainHelpDesk: 'Collaboration:Permission:MaintainHelpDesk',\n Setup: 'Collaboration:Permission:Setup',\n} as const;\n\n/**\n * @deprecated Prefer {@link AXPCollaborationPermissionKeys}.\n * Legacy nested shape kept so existing imports compile during migration.\n */\nexport const AXMPermissionsKeys = {\n Conversation: {\n Management: AXPCollaborationPermissionKeys.MaintainConversations,\n },\n} as const;\n","const config = {\n i18n: 'conversation',\n module: 'Conversation',\n route: 'chat',\n};\n\nexport const RootConfig = {\n config,\n module: {\n route: 'conversation',\n name: config.module,\n title: `@${config.i18n}:module.title`,\n icon: 'fa-light fa-comments',\n },\n entities: {\n room: {\n name: 'Room',\n title: `t(\"room.plural-title\", { scope: \"${config.i18n}\" })`,\n source: `${config.module}.Room`,\n icon: 'fa-light fa-comments',\n },\n message: {\n name: 'Message',\n title: `t(\"message.plural-title\", { scope: \"${config.i18n}\" })`,\n source: `${config.module}.Message`,\n icon: 'fa-light fa-message',\n },\n },\n} as const;\n","//#region ---- Media helpers ----\n\n/** Fields for one uploaded or remote media item. */\nexport interface AXMediaItemFields {\n /** HTTP(S) or other persistable URL; omit when only {@link mediaId} is stored. */\n url?: string;\n mediaId?: string;\n mimeType?: string;\n size?: number;\n metadata?: Record<string, unknown>;\n}\n\n//#endregion\n\n//#region ---- Text payload ----\n\nexport interface AXTextFormat {\n start: number;\n end: number;\n type: 'bold' | 'italic' | 'code' | 'strikethrough' | 'underline' | 'spoiler';\n}\n\nexport interface AXMention {\n start: number;\n end: number;\n userId: string;\n userName: string;\n}\n\nexport interface AXLink {\n start: number;\n end: number;\n url: string;\n preview?: AXLinkPreview;\n}\n\nexport interface AXLinkPreview {\n title?: string;\n description?: string;\n image?: string;\n siteName?: string;\n}\n\nexport interface AXTextPayload {\n type: 'text';\n text: string;\n formatting?: AXTextFormat[];\n mentions?: AXMention[];\n links?: AXLink[];\n}\n\n//#endregion\n\n//#region ---- Media payloads ----\n\nexport interface AXImageMediaItem extends AXMediaItemFields {\n thumbnailUrl?: string;\n width: number;\n height: number;\n blurhash?: string;\n}\n\nexport interface AXImagePayload {\n type: 'image';\n images: AXImageMediaItem[];\n caption?: string;\n}\n\nexport interface AXVideoMediaItem extends AXMediaItemFields {\n thumbnailUrl?: string;\n duration: number;\n width: number;\n height: number;\n}\n\nexport interface AXVideoPayload {\n type: 'video';\n videos: AXVideoMediaItem[];\n caption?: string;\n}\n\nexport interface AXAudioMediaItem extends AXMediaItemFields {\n duration: number;\n title?: string;\n artist?: string;\n coverUrl?: string;\n waveform?: number[];\n}\n\nexport interface AXAudioPayload {\n type: 'audio';\n audios: AXAudioMediaItem[];\n caption?: string;\n}\n\nexport interface AXVoicePayload extends AXMediaItemFields {\n type: 'voice';\n duration: number;\n waveform?: number[];\n played?: boolean;\n}\n\nexport interface AXFileMediaItem extends AXMediaItemFields {\n name: string;\n mimeType: string;\n thumbnailUrl?: string;\n extension?: string;\n}\n\nexport interface AXFilePayload {\n type: 'file';\n files: AXFileMediaItem[];\n caption?: string;\n}\n\nexport interface AXLocationPayload {\n type: 'location';\n latitude: number;\n longitude: number;\n name?: string;\n address?: string;\n mapImageUrl?: string;\n accuracy?: number;\n}\n\nexport interface AXStickerPayload extends AXMediaItemFields {\n type: 'sticker';\n id: string;\n packId: string;\n animated: boolean;\n width?: number;\n height?: number;\n emoji?: string;\n}\n\n//#endregion\n\n//#region ---- Poll & system payloads ----\n\nexport interface AXPollOption {\n id: string;\n text: string;\n votes: number;\n voters?: string[];\n}\n\nexport interface AXPollPayload {\n type: 'poll';\n question: string;\n options: AXPollOption[];\n multipleChoice: boolean;\n anonymous: boolean;\n expiresAt?: Date;\n totalVotes?: number;\n}\n\nexport type AXSystemEventType =\n | 'user_joined'\n | 'user_left'\n | 'title_changed'\n | 'avatar_changed'\n | 'call_declined'\n | 'call_missed'\n | 'call_cancelled'\n | 'custom';\n\nexport interface AXSystemPayload {\n type: 'system';\n eventType: AXSystemEventType;\n text: string;\n userIds?: string[];\n data?: Record<string, unknown>;\n}\n\n//#endregion\n\n//#region ---- Platform extensions ----\n\n/** Layout/node payload used by assist transcripts and dynamic UI messages. */\nexport interface AXNodePayload {\n type: 'node';\n content: unknown;\n}\n\n//#endregion\n\n//#region ---- Message core types ----\n\n/** Aligned with `@acorex/components/conversation` — node payloads use {@link AXNodePayload} at runtime with an explicit cast. */\nexport type AXMessagePayload =\n | AXTextPayload\n | AXImagePayload\n | AXVideoPayload\n | AXAudioPayload\n | AXVoicePayload\n | AXFilePayload\n | AXLocationPayload\n | AXStickerPayload\n | AXPollPayload\n | AXSystemPayload;\n\nexport type AXMessageStatus = 'sending' | 'sent' | 'delivered' | 'read' | 'failed';\n\nexport type AXMessageType =\n | 'text'\n | 'image'\n | 'video'\n | 'audio'\n | 'voice'\n | 'file'\n | 'location'\n | 'sticker'\n | 'poll'\n | 'system'\n | 'node'\n | 'assist-response'\n | string;\n\n/** Reaction on a message. */\nexport interface AXReaction {\n /** Emoji character */\n emoji: string;\n /** User ID who reacted */\n userId: string;\n /** Reaction timestamp */\n timestamp: Date;\n}\n\n//#endregion\n","//#region ---- Imports ----\n\nimport { AXPEntityModel } from '@acorex-platform/framework-shared/entity';\n\nimport type {\n AXMessagePayload,\n AXMessageStatus,\n AXMessageType,\n AXReaction,\n} from './message.contracts';\n\n//#endregion\n\n//#region ---- Re-exports ----\n\nexport type {\n AXAudioMediaItem,\n AXAudioPayload,\n AXFileMediaItem,\n AXFilePayload,\n AXImageMediaItem,\n AXImagePayload,\n AXLink,\n AXLinkPreview,\n AXMediaItemFields,\n AXMention,\n AXMessagePayload,\n AXMessageStatus,\n AXMessageType,\n AXNodePayload,\n AXPollOption,\n AXPollPayload,\n AXReaction,\n AXStickerPayload,\n AXSystemEventType,\n AXSystemPayload,\n AXTextFormat,\n AXTextPayload,\n AXVideoMediaItem,\n AXVideoPayload,\n AXVoicePayload,\n} from './message.contracts';\n\n//#endregion\n\n//#region ---- Constants ----\n\n/** Emoji used for comment \"like\" reactions (maps to {@link AXReaction.emoji}). */\nexport const AXM_COMMENT_LIKE_EMOJI = '👍';\n\n//#endregion\n\n//#region ---- Legacy aliases (comment feature) ----\n\n/** @deprecated Use emoji string with AXReaction instead. */\nexport type AXMReactionType = string;\n\n/** @deprecated Use AXReaction instead. */\nexport type AXMConversationReaction = AXReaction;\n\n//#endregion\n\n//#region ---- Entity model ----\n\n/**\n * Persisted message entity — conversation message shape plus platform entity base.\n */\nexport interface AXMConversationMessage extends AXPEntityModel<string> {\n /** Conversation (room) this message belongs to */\n conversationId: string;\n /** Sender user id */\n senderId: string;\n /** Message type */\n type: AXMessageType;\n /** File-type catalog name when this message uses a composer file type */\n fileType?: string;\n /** Message creation timestamp */\n timestamp: Date;\n /** Type-specific message payload */\n payload: AXMessagePayload;\n /** Message delivery/read status */\n status: AXMessageStatus;\n /** Replied message reference (for quote replies) */\n replyTo?: AXMConversationMessage;\n /** Whether this message was forwarded */\n forwarded?: boolean;\n /** Original sender information (if forwarded) */\n forwardedFrom?: {\n messageId: string;\n senderId: string;\n senderName?: string;\n conversationId: string;\n conversationTitle?: string;\n };\n /** Message reactions */\n reactions: AXReaction[];\n /** Whether message is pinned */\n pinned?: boolean;\n /** Edit timestamp (if edited) */\n editedAt?: Date;\n /** Whether message is deleted */\n deleted?: boolean;\n /** Deleted timestamp */\n deletedAt?: Date;\n /** Local-only flag (not synced to server yet) */\n isLocal?: boolean;\n /** Custom metadata */\n metadata?: Record<string, unknown>;\n /** Plain-text snippet for entity admin list column */\n title?: string;\n /** Programmatic name for entity admin */\n name?: string;\n}\n\n//#endregion\n","//#region ---- Participant ----\n\nexport type AXParticipantRole = 'admin' | 'moderator' | 'member';\n\nexport type AXParticipantStatus = 'online' | 'offline' | 'away';\n\n/** Extended profile fields shown in private-chat info panels. */\nexport interface AXUserProfile {\n bio?: string;\n phone?: string;\n email?: string;\n username?: string;\n location?: string;\n company?: string;\n title?: string;\n}\n\n/** Represents a user/member in a conversation. */\nexport interface AXParticipant {\n /** Unique identifier for the participant */\n id: string;\n /** Display name of the participant */\n name: string;\n /**\n * Short line shown under the name in lists (e.g. job title, status line).\n * Distinct from long-form bio in optional `profile.bio`.\n */\n description?: string;\n /** Optional extended profile details for private chats. */\n profile?: AXUserProfile;\n /** Avatar/profile image URL */\n avatar?: string;\n /**\n * Font Awesome icon class(es) used when `avatar` is not set (e.g. `'fa-light fa-user'`).\n */\n icon?: string;\n /** Role in the conversation (for groups/channels) */\n role?: AXParticipantRole;\n /** Current online status */\n status?: AXParticipantStatus;\n /** Last seen timestamp (when offline/away) */\n lastSeen?: Date;\n /** Custom metadata */\n metadata?: Record<string, unknown>;\n}\n\n//#endregion\n\n//#region ---- Conversation ----\n\nexport type AXConversationType = 'private' | 'group' | 'channel' | 'bot';\n\n/** Conversation status information. */\nexport interface AXConversationStatus {\n /** Whether someone is typing */\n isTyping: boolean;\n /** User IDs currently typing */\n typingUsers: string[];\n /** Online presence (for private chats) */\n presence?: 'online' | 'offline' | 'away';\n /** Last seen timestamp (for private chats when offline) */\n lastSeen?: Date;\n}\n\n/** Conversation settings. */\nexport interface AXConversationSettings {\n /** Muted until timestamp */\n mutedUntil?: Date;\n /** Show notifications */\n notifications: boolean;\n /** Custom notification sound */\n notificationSound?: string;\n /** Show message preview in notifications */\n showPreview: boolean;\n /** Custom settings */\n custom?: Record<string, unknown>;\n}\n\n/** Theme-specific CSS `background` values for the message list area. */\nexport interface AXConversationMessageListThemeBackground {\n light: string;\n dark: string;\n}\n\n/** Single CSS value (both themes) or per-theme `{ light, dark }` backgrounds. */\nexport type AXConversationMessageListBackground =\n | string\n | AXConversationMessageListThemeBackground;\n\n/**\n * Extensible map for app-specific conversation data.\n * Aligned with `@acorex/components/conversation` — UI-only keys such as\n * `messageListEmptyComponent` are stored as opaque values when persisted.\n */\nexport interface AXConversationMetadata extends Record<string, unknown> {\n /** Optional custom background CSS for message list (per light/dark theme). */\n messageListBackground?: AXConversationMessageListBackground;\n /**\n * When `false`, hides reaction UI for this conversation.\n * Defaults to `true` when omitted.\n */\n reactionsEnabled?: boolean;\n}\n\n//#endregion\n","//#region ---- Imports ----\n\nimport { AXPEntityModel } from '@acorex-platform/framework-shared/entity';\n\nimport { AXMCommentEntityData } from '../../index';\nimport { AXMConversationMessage } from '../message/message.types';\n\nimport type {\n AXConversationMetadata,\n AXConversationSettings,\n AXConversationStatus,\n AXConversationType,\n AXParticipant,\n} from './room.contracts';\n\n//#endregion\n\n//#region ---- Re-exports ----\n\nexport type {\n AXConversationMessageListBackground,\n AXConversationMessageListThemeBackground,\n AXConversationMetadata,\n AXConversationSettings,\n AXConversationStatus,\n AXConversationType,\n AXParticipant,\n AXParticipantRole,\n AXParticipantStatus,\n AXUserProfile,\n} from './room.contracts';\n\n//#endregion\n\n//#region ---- Domain enums ----\n\n/** Distinguishes chat inbox rooms from entity comment threads in the unified store. */\nexport type AXMConversationRoomKind = 'chat' | 'comment';\n\n//#endregion\n\n//#region ---- Entity model ----\n\n/**\n * Persisted room entity — conversation shape plus platform entity base.\n */\nexport interface AXMConversationRoom extends AXPEntityModel<string> {\n /** Chat vs comment thread discriminator */\n kind: AXMConversationRoomKind;\n /** Conversation type (private, group, channel, bot) */\n type: AXConversationType;\n /** User who created this conversation */\n creatorId?: string;\n /** Conversation title/name */\n title: string;\n /** Conversation avatar/image URL */\n avatar?: string;\n /** Font Awesome icon class(es) when no image avatar is used */\n icon?: string;\n /** Conversation description (for groups/channels) */\n description?: string;\n /** List of participants */\n participants: AXParticipant[];\n /** Last message in the conversation */\n lastMessage?: AXMConversationMessage;\n /** Timestamp of last message */\n lastMessageAt: Date;\n /** Number of unread messages */\n unreadCount: number;\n /** Number of unread mentions */\n unreadMentions?: number;\n /** Current status (typing, presence, etc.) */\n status: AXConversationStatus;\n /** User-specific settings */\n settings: AXConversationSettings;\n /** Pinned messages IDs */\n pinnedMessageIds?: string[];\n /** Conversation creation timestamp */\n createdAt: Date;\n /** Last update timestamp */\n updatedAt: Date;\n /** Whether conversation is blocked */\n blocked?: boolean;\n /** Whether conversation is pinned */\n pinned?: boolean;\n /** Whether conversation is archived */\n archived?: boolean;\n /** Draft message text */\n draft?: string;\n /** Custom metadata */\n metadata?: AXConversationMetadata;\n /** Programmatic name for entity admin */\n name?: string;\n /** Entity reference for comment threads */\n entityRef?: AXMCommentEntityData;\n /** Comment thread topic/subject */\n topic?: string;\n}\n\n//#endregion\n","//#region ---- Assist stream wire events (shared with server) ----\n\nimport type { AXMConversationMessage, AXMConversationRoom } from '@acorex-platform/module-conversation-contracts';\n\n/** Minimal tool-call shape for assist-stream frontend broker round-trips (mirrors AXPAiToolCall). */\nexport interface ConversationAssistFrontendToolCall {\n id: string;\n name: string;\n arguments?: unknown;\n}\n\nexport type ConversationAssistWireEvent =\n | {\n type: 'assist_started';\n conversationId: string;\n messageId: string;\n userMessageId: string;\n message: AXMConversationMessage;\n }\n | { type: 'message_patch'; message: AXMConversationMessage }\n | { type: 'conversation_patch'; room: AXMConversationRoom }\n | {\n type: 'assist_completed';\n conversationId: string;\n messageId: string;\n message: AXMConversationMessage;\n /** Present when an auto-generated title was applied at finalize time. */\n room?: AXMConversationRoom;\n }\n | { type: 'assist_failed'; conversationId: string; messageId: string; error: string; message: AXMConversationMessage }\n | {\n type: 'frontend_tool_call';\n runId: string;\n call: ConversationAssistFrontendToolCall;\n };\n\n//#endregion\n","//#region ---- Assist metadata helpers (shared) ----\n\nexport function axmExtractAssistIdFromMetadata(metadata: Record<string, unknown> | undefined): string | undefined {\n if (!metadata) {\n return undefined;\n }\n const direct = metadata['assistId'];\n if (typeof direct === 'string' && direct.trim()) {\n return direct.trim();\n }\n const nested = metadata['metadata'];\n if (nested && typeof nested === 'object' && nested !== null) {\n const inner = (nested as Record<string, unknown>)['assistId'];\n if (typeof inner === 'string' && inner.trim()) {\n return inner.trim();\n }\n }\n return undefined;\n}\n\nexport function axmExtractDirectAgentIdFromMetadata(\n metadata: Record<string, unknown> | undefined,\n): string | undefined {\n if (!metadata) {\n return undefined;\n }\n const direct = metadata['directAgentId'];\n if (typeof direct === 'string' && direct.trim()) {\n return direct.trim();\n }\n const nested = metadata['metadata'];\n if (nested && typeof nested === 'object' && nested !== null) {\n const inner = (nested as Record<string, unknown>)['directAgentId'];\n if (typeof inner === 'string' && inner.trim()) {\n return inner.trim();\n }\n }\n return undefined;\n}\n\nexport function axmConversationHasAiChat(metadata: Record<string, unknown> | undefined): boolean {\n return !!(axmExtractAssistIdFromMetadata(metadata) ?? axmExtractDirectAgentIdFromMetadata(metadata));\n}\n\nexport function axmChatAiPeerParticipantId(catalogId: string): string {\n return `assist-${catalogId.trim()}`;\n}\n\nexport function axmReadAssistResponseStatus(metadata: Record<string, unknown> | undefined): string | undefined {\n const status = metadata?.['assistResponseStatus'];\n return typeof status === 'string' ? status : undefined;\n}\n\nexport function axmReadReplyToUserMessageId(metadata: Record<string, unknown> | undefined): string | undefined {\n const replyTo = metadata?.['replyToUserMessageId'];\n return typeof replyTo === 'string' && replyTo.trim() ? replyTo.trim() : undefined;\n}\n\nexport function extractMessageTextFromPayload(payload: unknown): string {\n const record = payload as { type?: string; text?: string } | undefined;\n if (record?.type === 'text' && typeof record.text === 'string') {\n return record.text;\n }\n return '';\n}\n\nexport function axmNormalizeConversationTitle(raw: string): string {\n const normalized = raw\n .replace(/\\r?\\n+/g, ' ')\n .replace(/^[\"'`]+|[\"'`]+$/g, '')\n .replace(/\\s+/g, ' ')\n .trim();\n return normalized.slice(0, 90).trim();\n}\n\n/** System prompt for a lightweight title-only model call (first user message → sidebar title). */\nexport const AXM_ASSIST_CONVERSATION_TITLE_SYSTEM_PROMPT = `You generate short conversation titles for chat sidebars.\n\nGiven the user's first message, reply with ONLY a concise title (3–8 words, max 90 characters).\nUse the same language as the user's message (for example Persian if they wrote in Persian).\nDo not use quotes, colons, hashtags, or explanation. Output the title text only.`;\n\nexport function axmSanitizeAiGeneratedConversationTitle(raw: string): string | null {\n let text = raw.trim();\n if (!text) {\n return null;\n }\n text = text.replace(/^[\"'`«»\"\"]+|[\"'`«»\"\"]+$/g, '').trim();\n text = text.replace(/^(title|عنوان|topic|subject)\\s*[::\\-–—]\\s*/i, '').trim();\n text = text.replace(/^#+\\s*/, '').trim();\n const normalized = axmNormalizeConversationTitle(text);\n return normalized || null;\n}\n\n/** Fallback when the title model is unavailable (max 6 words, 90 chars). */\nexport function axmBuildHeuristicConversationTitleFallback(raw: string): string | null {\n const trimmed = raw.trim();\n if (!trimmed) {\n return null;\n }\n const normalized = axmNormalizeConversationTitle(trimmed.split(/\\s+/).slice(0, 6).join(' '));\n return normalized || null;\n}\n\nexport function axmCoerceMessageTimestampMs(value: unknown): number {\n if (value instanceof Date) {\n return value.getTime();\n }\n if (typeof value === 'string' || typeof value === 'number') {\n const ms = new Date(value).getTime();\n return Number.isFinite(ms) ? ms : 0;\n }\n return 0;\n}\n\n/** Assist rows must sort after the user turn they reply to (client/server clocks may differ). */\nexport function axmResolveAssistMessageTimestamp(options: {\n replyToUserMessageTimestamp?: unknown;\n serverNow?: Date;\n}): Date {\n const serverMs = options.serverNow?.getTime() ?? Date.now();\n const userMs = axmCoerceMessageTimestampMs(options.replyToUserMessageTimestamp);\n if (userMs > 0) {\n return new Date(Math.max(serverMs, userMs + 1));\n }\n return new Date(serverMs);\n}\n\nexport function axmEnsureAssistMessageSortsAfterReplyTarget<T extends { timestamp: unknown }>(\n message: T,\n replyTargetTimestamp: unknown,\n): T {\n const replyMs = axmCoerceMessageTimestampMs(replyTargetTimestamp);\n const assistMs = axmCoerceMessageTimestampMs(message.timestamp);\n if (replyMs > 0 && assistMs <= replyMs) {\n return { ...message, timestamp: new Date(replyMs + 1) };\n }\n return message;\n}\n\n/** Chronological sort with assist→user reply linkage when timestamps disagree across clocks. */\nexport function axmCompareMessagesChronologically(\n a: { id: string; timestamp: unknown; metadata?: Record<string, unknown> },\n b: { id: string; timestamp: unknown; metadata?: Record<string, unknown> },\n): number {\n const aReplyTo = axmReadReplyToUserMessageId(a.metadata);\n const bReplyTo = axmReadReplyToUserMessageId(b.metadata);\n if (aReplyTo === b.id) {\n const diff = axmCoerceMessageTimestampMs(a.timestamp) - axmCoerceMessageTimestampMs(b.timestamp);\n return diff > 0 ? diff : 1;\n }\n if (bReplyTo === a.id) {\n const diff = axmCoerceMessageTimestampMs(a.timestamp) - axmCoerceMessageTimestampMs(b.timestamp);\n return diff < 0 ? diff : -1;\n }\n const diff = axmCoerceMessageTimestampMs(a.timestamp) - axmCoerceMessageTimestampMs(b.timestamp);\n return diff !== 0 ? diff : a.id.localeCompare(b.id);\n}\n\n//#endregion\n","//#region ---- Assist message handler port (server) ----\n\nimport type { AXMConversationMessage } from '../entities/message/message.types';\n\nexport interface AXMConversationAssistMessageHandler {\n maybeStartAfterUserMessage(userMessage: AXMConversationMessage): Promise<void>;\n\n retryAssistResponse(\n conversationId: string,\n messageId: string,\n options?: { replyToUserMessageId?: string },\n ): Promise<AXMConversationMessage>;\n}\n\nexport const AXM_CONVERSATION_ASSIST_MESSAGE_HANDLER = Symbol('AXM_CONVERSATION_ASSIST_MESSAGE_HANDLER');\n\n//#endregion\n","//#region ---- Contracts barrel ----\n\nexport * from './comment-entity-data';\n\nexport * from './menu.keys';\nexport * from './permission.keys';\n\nexport * from './root-config';\n\n//#endregion\n\nexport * from './entities';\nexport * from './assist/conversation-assist-stream.types';\nexport * from './assist/conversation-assist-metadata.util';\nexport * from './assist/conversation-assist-handler.port';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"acorex-platform-module-conversation-client-contracts.mjs","sources":["../../../../libs/modules/conversation/contracts/src/comment-entity-data.ts","../../../../libs/modules/conversation/contracts/src/menu.keys.ts","../../../../libs/modules/conversation/contracts/src/permission.keys.ts","../../../../libs/modules/conversation/contracts/src/root-config.ts","../../../../libs/modules/conversation/contracts/src/entities/message/message.contracts.ts","../../../../libs/modules/conversation/contracts/src/entities/message/message.types.ts","../../../../libs/modules/conversation/contracts/src/entities/room/room.contracts.ts","../../../../libs/modules/conversation/contracts/src/entities/room/room.types.ts","../../../../libs/modules/conversation/contracts/src/assist/conversation-assist-stream.types.ts","../../../../libs/modules/conversation/contracts/src/assist/conversation-assist-metadata.util.ts","../../../../libs/modules/conversation/contracts/src/assist/conversation-assist-handler.port.ts","../../../../libs/modules/conversation/contracts/src/index.ts","../../../../libs/modules/conversation/contracts/src/acorex-platform-module-conversation-client-contracts.ts"],"sourcesContent":["//#region ---- Comment entity reference ----\n\nexport interface AXMCommentEntityData {\n entityId: string;\n entityTypeId: string;\n moduleName?: string;\n entityName?: string;\n}\n\n//#endregion\n","export const AXPConversationMenuKeys = {\n Conversations: 'Conversation:Menu:Conversations',\n} as const;\n\n","/**\n * Collaboration capabilities used by this module.\n * Domain capability keys for this module. Root groups live in `AXPCommonPermissionGroupKeys` (common contracts).\n */\nexport const AXPCollaborationPermissionKeys = {\n Access: 'Collaboration:Permission:Access',\n MaintainConversations: 'Collaboration:Permission:MaintainConversations',\n MaintainMeetings: 'Collaboration:Permission:MaintainMeetings',\n MaintainCalendars: 'Collaboration:Permission:MaintainCalendars',\n MaintainCommunications: 'Collaboration:Permission:MaintainCommunications',\n MaintainReservations: 'Collaboration:Permission:MaintainReservations',\n MaintainHelpDesk: 'Collaboration:Permission:MaintainHelpDesk',\n Setup: 'Collaboration:Permission:Setup',\n} as const;\n\n/**\n * @deprecated Prefer {@link AXPCollaborationPermissionKeys}.\n * Legacy nested shape kept so existing imports compile during migration.\n */\nexport const AXMPermissionsKeys = {\n Conversation: {\n Management: AXPCollaborationPermissionKeys.MaintainConversations,\n },\n} as const;\n","const config = {\n i18n: 'conversation',\n module: 'Conversation',\n route: 'chat',\n};\n\nexport const RootConfig = {\n config,\n module: {\n route: 'conversation',\n name: config.module,\n title: `@${config.i18n}:module.title`,\n icon: 'fa-light fa-comments',\n },\n entities: {\n room: {\n name: 'Room',\n title: `t(\"room.plural-title\", { scope: \"${config.i18n}\" })`,\n source: `${config.module}.Room`,\n icon: 'fa-light fa-comments',\n },\n message: {\n name: 'Message',\n title: `t(\"message.plural-title\", { scope: \"${config.i18n}\" })`,\n source: `${config.module}.Message`,\n icon: 'fa-light fa-message',\n },\n },\n} as const;\n","//#region ---- Media helpers ----\n\n/** Fields for one uploaded or remote media item. */\nexport interface AXMediaItemFields {\n /** HTTP(S) or other persistable URL; omit when only {@link mediaId} is stored. */\n url?: string;\n mediaId?: string;\n mimeType?: string;\n size?: number;\n metadata?: Record<string, unknown>;\n}\n\n//#endregion\n\n//#region ---- Text payload ----\n\nexport interface AXTextFormat {\n start: number;\n end: number;\n type: 'bold' | 'italic' | 'code' | 'strikethrough' | 'underline' | 'spoiler';\n}\n\nexport interface AXMention {\n start: number;\n end: number;\n userId: string;\n userName: string;\n}\n\nexport interface AXLink {\n start: number;\n end: number;\n url: string;\n preview?: AXLinkPreview;\n}\n\nexport interface AXLinkPreview {\n title?: string;\n description?: string;\n image?: string;\n siteName?: string;\n}\n\nexport interface AXTextPayload {\n type: 'text';\n text: string;\n formatting?: AXTextFormat[];\n mentions?: AXMention[];\n links?: AXLink[];\n}\n\n//#endregion\n\n//#region ---- Media payloads ----\n\nexport interface AXImageMediaItem extends AXMediaItemFields {\n thumbnailUrl?: string;\n width: number;\n height: number;\n blurhash?: string;\n}\n\nexport interface AXImagePayload {\n type: 'image';\n images: AXImageMediaItem[];\n caption?: string;\n}\n\nexport interface AXVideoMediaItem extends AXMediaItemFields {\n thumbnailUrl?: string;\n duration: number;\n width: number;\n height: number;\n}\n\nexport interface AXVideoPayload {\n type: 'video';\n videos: AXVideoMediaItem[];\n caption?: string;\n}\n\nexport interface AXAudioMediaItem extends AXMediaItemFields {\n duration: number;\n title?: string;\n artist?: string;\n coverUrl?: string;\n waveform?: number[];\n}\n\nexport interface AXAudioPayload {\n type: 'audio';\n audios: AXAudioMediaItem[];\n caption?: string;\n}\n\nexport interface AXVoicePayload extends AXMediaItemFields {\n type: 'voice';\n duration: number;\n waveform?: number[];\n played?: boolean;\n}\n\nexport interface AXFileMediaItem extends AXMediaItemFields {\n name: string;\n mimeType: string;\n thumbnailUrl?: string;\n extension?: string;\n}\n\nexport interface AXFilePayload {\n type: 'file';\n files: AXFileMediaItem[];\n caption?: string;\n}\n\nexport interface AXLocationPayload {\n type: 'location';\n latitude: number;\n longitude: number;\n name?: string;\n address?: string;\n mapImageUrl?: string;\n accuracy?: number;\n}\n\nexport interface AXStickerPayload extends AXMediaItemFields {\n type: 'sticker';\n id: string;\n packId: string;\n animated: boolean;\n width?: number;\n height?: number;\n emoji?: string;\n}\n\n//#endregion\n\n//#region ---- Poll & system payloads ----\n\nexport interface AXPollOption {\n id: string;\n text: string;\n votes: number;\n voters?: string[];\n}\n\nexport interface AXPollPayload {\n type: 'poll';\n question: string;\n options: AXPollOption[];\n multipleChoice: boolean;\n anonymous: boolean;\n expiresAt?: Date;\n totalVotes?: number;\n}\n\nexport type AXSystemEventType =\n | 'user_joined'\n | 'user_left'\n | 'title_changed'\n | 'avatar_changed'\n | 'call_declined'\n | 'call_missed'\n | 'call_cancelled'\n | 'custom';\n\nexport interface AXSystemPayload {\n type: 'system';\n eventType: AXSystemEventType;\n text: string;\n userIds?: string[];\n data?: Record<string, unknown>;\n}\n\n//#endregion\n\n//#region ---- Platform extensions ----\n\n/** Layout/node payload used by assist transcripts and dynamic UI messages. */\nexport interface AXNodePayload {\n type: 'node';\n content: unknown;\n}\n\n//#endregion\n\n//#region ---- Message core types ----\n\n/** Aligned with `@acorex/components/conversation` — node payloads use {@link AXNodePayload} at runtime with an explicit cast. */\nexport type AXMessagePayload =\n | AXTextPayload\n | AXImagePayload\n | AXVideoPayload\n | AXAudioPayload\n | AXVoicePayload\n | AXFilePayload\n | AXLocationPayload\n | AXStickerPayload\n | AXPollPayload\n | AXSystemPayload;\n\nexport type AXMessageStatus = 'sending' | 'sent' | 'delivered' | 'read' | 'failed';\n\nexport type AXMessageType =\n | 'text'\n | 'image'\n | 'video'\n | 'audio'\n | 'voice'\n | 'file'\n | 'location'\n | 'sticker'\n | 'poll'\n | 'system'\n | 'node'\n | 'assist-response'\n | string;\n\n/** Reaction on a message. */\nexport interface AXReaction {\n /** Emoji character */\n emoji: string;\n /** User ID who reacted */\n userId: string;\n /** Reaction timestamp */\n timestamp: Date;\n}\n\n//#endregion\n","//#region ---- Imports ----\n\nimport { AXPEntityModel } from '@acorex-platform/framework-shared/entity';\n\nimport type {\n AXMessagePayload,\n AXMessageStatus,\n AXMessageType,\n AXReaction,\n} from './message.contracts';\n\n//#endregion\n\n//#region ---- Re-exports ----\n\nexport type {\n AXAudioMediaItem,\n AXAudioPayload,\n AXFileMediaItem,\n AXFilePayload,\n AXImageMediaItem,\n AXImagePayload,\n AXLink,\n AXLinkPreview,\n AXMediaItemFields,\n AXMention,\n AXMessagePayload,\n AXMessageStatus,\n AXMessageType,\n AXNodePayload,\n AXPollOption,\n AXPollPayload,\n AXReaction,\n AXStickerPayload,\n AXSystemEventType,\n AXSystemPayload,\n AXTextFormat,\n AXTextPayload,\n AXVideoMediaItem,\n AXVideoPayload,\n AXVoicePayload,\n} from './message.contracts';\n\n//#endregion\n\n//#region ---- Constants ----\n\n/** Emoji used for comment \"like\" reactions (maps to {@link AXReaction.emoji}). */\nexport const AXM_COMMENT_LIKE_EMOJI = '👍';\n\n//#endregion\n\n//#region ---- Legacy aliases (comment feature) ----\n\n/** @deprecated Use emoji string with AXReaction instead. */\nexport type AXMReactionType = string;\n\n/** @deprecated Use AXReaction instead. */\nexport type AXMConversationReaction = AXReaction;\n\n//#endregion\n\n//#region ---- Entity model ----\n\n/**\n * Persisted message entity — conversation message shape plus platform entity base.\n */\nexport interface AXMConversationMessage extends AXPEntityModel<string> {\n /** Conversation (room) this message belongs to */\n conversationId: string;\n /** Sender user id */\n senderId: string;\n /** Message type */\n type: AXMessageType;\n /** File-type catalog name when this message uses a composer file type */\n fileType?: string;\n /** Message creation timestamp */\n timestamp: Date;\n /** Type-specific message payload */\n payload: AXMessagePayload;\n /** Message delivery/read status */\n status: AXMessageStatus;\n /** Replied message reference (for quote replies) */\n replyTo?: AXMConversationMessage;\n /** Whether this message was forwarded */\n forwarded?: boolean;\n /** Original sender information (if forwarded) */\n forwardedFrom?: {\n messageId: string;\n senderId: string;\n senderName?: string;\n conversationId: string;\n conversationTitle?: string;\n };\n /** Message reactions */\n reactions: AXReaction[];\n /** Whether message is pinned */\n pinned?: boolean;\n /** Edit timestamp (if edited) */\n editedAt?: Date;\n /** Whether message is deleted */\n deleted?: boolean;\n /** Deleted timestamp */\n deletedAt?: Date;\n /** Local-only flag (not synced to server yet) */\n isLocal?: boolean;\n /** Custom metadata */\n metadata?: Record<string, unknown>;\n /** Plain-text snippet for entity admin list column */\n title?: string;\n /** Programmatic name for entity admin */\n name?: string;\n}\n\n//#endregion\n","//#region ---- Participant ----\n\nexport type AXParticipantRole = 'admin' | 'moderator' | 'member';\n\nexport type AXParticipantStatus = 'online' | 'offline' | 'away';\n\n/** Extended profile fields shown in private-chat info panels. */\nexport interface AXUserProfile {\n bio?: string;\n phone?: string;\n email?: string;\n username?: string;\n location?: string;\n company?: string;\n title?: string;\n}\n\n/** Represents a user/member in a conversation. */\nexport interface AXParticipant {\n /** Unique identifier for the participant */\n id: string;\n /** Display name of the participant */\n name: string;\n /**\n * Short line shown under the name in lists (e.g. job title, status line).\n * Distinct from long-form bio in optional `profile.bio`.\n */\n description?: string;\n /** Optional extended profile details for private chats. */\n profile?: AXUserProfile;\n /** Avatar/profile image URL */\n avatar?: string;\n /**\n * Font Awesome icon class(es) used when `avatar` is not set (e.g. `'fa-light fa-user'`).\n */\n icon?: string;\n /** Role in the conversation (for groups/channels) */\n role?: AXParticipantRole;\n /** Current online status */\n status?: AXParticipantStatus;\n /** Last seen timestamp (when offline/away) */\n lastSeen?: Date;\n /** Custom metadata */\n metadata?: Record<string, unknown>;\n}\n\n//#endregion\n\n//#region ---- Conversation ----\n\nexport type AXConversationType = 'private' | 'group' | 'channel' | 'bot';\n\n/** Conversation status information. */\nexport interface AXConversationStatus {\n /** Whether someone is typing */\n isTyping: boolean;\n /** User IDs currently typing */\n typingUsers: string[];\n /** Online presence (for private chats) */\n presence?: 'online' | 'offline' | 'away';\n /** Last seen timestamp (for private chats when offline) */\n lastSeen?: Date;\n}\n\n/** Conversation settings. */\nexport interface AXConversationSettings {\n /** Muted until timestamp */\n mutedUntil?: Date;\n /** Show notifications */\n notifications: boolean;\n /** Custom notification sound */\n notificationSound?: string;\n /** Show message preview in notifications */\n showPreview: boolean;\n /** Custom settings */\n custom?: Record<string, unknown>;\n}\n\n/** Theme-specific CSS `background` values for the message list area. */\nexport interface AXConversationMessageListThemeBackground {\n light: string;\n dark: string;\n}\n\n/** Single CSS value (both themes) or per-theme `{ light, dark }` backgrounds. */\nexport type AXConversationMessageListBackground =\n | string\n | AXConversationMessageListThemeBackground;\n\n/**\n * Extensible map for app-specific conversation data.\n * Aligned with `@acorex/components/conversation` — UI-only keys such as\n * `messageListEmptyComponent` are stored as opaque values when persisted.\n */\nexport interface AXConversationMetadata extends Record<string, unknown> {\n /** Optional custom background CSS for message list (per light/dark theme). */\n messageListBackground?: AXConversationMessageListBackground;\n /**\n * When `false`, hides reaction UI for this conversation.\n * Defaults to `true` when omitted.\n */\n reactionsEnabled?: boolean;\n}\n\n//#endregion\n","//#region ---- Imports ----\n\nimport { AXPEntityModel } from '@acorex-platform/framework-shared/entity';\n\nimport { AXMCommentEntityData } from '../../index';\nimport { AXMConversationMessage } from '../message/message.types';\n\nimport type {\n AXConversationMetadata,\n AXConversationSettings,\n AXConversationStatus,\n AXConversationType,\n AXParticipant,\n} from './room.contracts';\n\n//#endregion\n\n//#region ---- Re-exports ----\n\nexport type {\n AXConversationMessageListBackground,\n AXConversationMessageListThemeBackground,\n AXConversationMetadata,\n AXConversationSettings,\n AXConversationStatus,\n AXConversationType,\n AXParticipant,\n AXParticipantRole,\n AXParticipantStatus,\n AXUserProfile,\n} from './room.contracts';\n\n//#endregion\n\n//#region ---- Domain enums ----\n\n/** Distinguishes chat inbox rooms from entity comment threads in the unified store. */\nexport type AXMConversationRoomKind = 'chat' | 'comment';\n\n//#endregion\n\n//#region ---- Entity model ----\n\n/**\n * Persisted room entity — conversation shape plus platform entity base.\n */\nexport interface AXMConversationRoom extends AXPEntityModel<string> {\n /** Chat vs comment thread discriminator */\n kind: AXMConversationRoomKind;\n /** Conversation type (private, group, channel, bot) */\n type: AXConversationType;\n /** User who created this conversation */\n creatorId?: string;\n /** Conversation title/name */\n title: string;\n /** Conversation avatar/image URL */\n avatar?: string;\n /** Font Awesome icon class(es) when no image avatar is used */\n icon?: string;\n /** Conversation description (for groups/channels) */\n description?: string;\n /** List of participants */\n participants: AXParticipant[];\n /** Last message in the conversation */\n lastMessage?: AXMConversationMessage;\n /** Timestamp of last message */\n lastMessageAt: Date;\n /** Number of unread messages */\n unreadCount: number;\n /** Number of unread mentions */\n unreadMentions?: number;\n /** Current status (typing, presence, etc.) */\n status: AXConversationStatus;\n /** User-specific settings */\n settings: AXConversationSettings;\n /** Pinned messages IDs */\n pinnedMessageIds?: string[];\n /** Conversation creation timestamp */\n createdAt: Date;\n /** Last update timestamp */\n updatedAt: Date;\n /** Whether conversation is blocked */\n blocked?: boolean;\n /** Whether conversation is pinned */\n pinned?: boolean;\n /** Whether conversation is archived */\n archived?: boolean;\n /** Draft message text */\n draft?: string;\n /** Custom metadata */\n metadata?: AXConversationMetadata;\n /** Programmatic name for entity admin */\n name?: string;\n /** Entity reference for comment threads */\n entityRef?: AXMCommentEntityData;\n /** Comment thread topic/subject */\n topic?: string;\n}\n\n//#endregion\n","//#region ---- Assist stream wire events (shared with server) ----\n\nimport type { AXMConversationMessage, AXMConversationRoom } from '@acorex-platform/module-conversation-client/contracts';\n\n/** Minimal tool-call shape for assist-stream frontend broker round-trips (mirrors AXPAiToolCall). */\nexport interface ConversationAssistFrontendToolCall {\n id: string;\n name: string;\n arguments?: unknown;\n}\n\nexport type ConversationAssistWireEvent =\n | {\n type: 'assist_started';\n conversationId: string;\n messageId: string;\n userMessageId: string;\n message: AXMConversationMessage;\n }\n | { type: 'message_patch'; message: AXMConversationMessage }\n | { type: 'conversation_patch'; room: AXMConversationRoom }\n | {\n type: 'assist_completed';\n conversationId: string;\n messageId: string;\n message: AXMConversationMessage;\n /** Present when an auto-generated title was applied at finalize time. */\n room?: AXMConversationRoom;\n }\n | { type: 'assist_failed'; conversationId: string; messageId: string; error: string; message: AXMConversationMessage }\n | {\n type: 'frontend_tool_call';\n runId: string;\n call: ConversationAssistFrontendToolCall;\n };\n\n//#endregion\n","//#region ---- Assist metadata helpers (shared) ----\n\nexport function axmExtractAssistIdFromMetadata(metadata: Record<string, unknown> | undefined): string | undefined {\n if (!metadata) {\n return undefined;\n }\n const direct = metadata['assistId'];\n if (typeof direct === 'string' && direct.trim()) {\n return direct.trim();\n }\n const nested = metadata['metadata'];\n if (nested && typeof nested === 'object' && nested !== null) {\n const inner = (nested as Record<string, unknown>)['assistId'];\n if (typeof inner === 'string' && inner.trim()) {\n return inner.trim();\n }\n }\n return undefined;\n}\n\nexport function axmExtractDirectAgentIdFromMetadata(\n metadata: Record<string, unknown> | undefined,\n): string | undefined {\n if (!metadata) {\n return undefined;\n }\n const direct = metadata['directAgentId'];\n if (typeof direct === 'string' && direct.trim()) {\n return direct.trim();\n }\n const nested = metadata['metadata'];\n if (nested && typeof nested === 'object' && nested !== null) {\n const inner = (nested as Record<string, unknown>)['directAgentId'];\n if (typeof inner === 'string' && inner.trim()) {\n return inner.trim();\n }\n }\n return undefined;\n}\n\nexport function axmConversationHasAiChat(metadata: Record<string, unknown> | undefined): boolean {\n return !!(axmExtractAssistIdFromMetadata(metadata) ?? axmExtractDirectAgentIdFromMetadata(metadata));\n}\n\nexport function axmChatAiPeerParticipantId(catalogId: string): string {\n return `assist-${catalogId.trim()}`;\n}\n\nexport function axmReadAssistResponseStatus(metadata: Record<string, unknown> | undefined): string | undefined {\n const status = metadata?.['assistResponseStatus'];\n return typeof status === 'string' ? status : undefined;\n}\n\nexport function axmReadReplyToUserMessageId(metadata: Record<string, unknown> | undefined): string | undefined {\n const replyTo = metadata?.['replyToUserMessageId'];\n return typeof replyTo === 'string' && replyTo.trim() ? replyTo.trim() : undefined;\n}\n\nexport function extractMessageTextFromPayload(payload: unknown): string {\n const record = payload as { type?: string; text?: string } | undefined;\n if (record?.type === 'text' && typeof record.text === 'string') {\n return record.text;\n }\n return '';\n}\n\nexport function axmNormalizeConversationTitle(raw: string): string {\n const normalized = raw\n .replace(/\\r?\\n+/g, ' ')\n .replace(/^[\"'`]+|[\"'`]+$/g, '')\n .replace(/\\s+/g, ' ')\n .trim();\n return normalized.slice(0, 90).trim();\n}\n\n/** System prompt for a lightweight title-only model call (first user message → sidebar title). */\nexport const AXM_ASSIST_CONVERSATION_TITLE_SYSTEM_PROMPT = `You generate short conversation titles for chat sidebars.\n\nGiven the user's first message, reply with ONLY a concise title (3–8 words, max 90 characters).\nUse the same language as the user's message (for example Persian if they wrote in Persian).\nDo not use quotes, colons, hashtags, or explanation. Output the title text only.`;\n\nexport function axmSanitizeAiGeneratedConversationTitle(raw: string): string | null {\n let text = raw.trim();\n if (!text) {\n return null;\n }\n text = text.replace(/^[\"'`«»\"\"]+|[\"'`«»\"\"]+$/g, '').trim();\n text = text.replace(/^(title|عنوان|topic|subject)\\s*[::\\-–—]\\s*/i, '').trim();\n text = text.replace(/^#+\\s*/, '').trim();\n const normalized = axmNormalizeConversationTitle(text);\n return normalized || null;\n}\n\n/** Fallback when the title model is unavailable (max 6 words, 90 chars). */\nexport function axmBuildHeuristicConversationTitleFallback(raw: string): string | null {\n const trimmed = raw.trim();\n if (!trimmed) {\n return null;\n }\n const normalized = axmNormalizeConversationTitle(trimmed.split(/\\s+/).slice(0, 6).join(' '));\n return normalized || null;\n}\n\nexport function axmCoerceMessageTimestampMs(value: unknown): number {\n if (value instanceof Date) {\n return value.getTime();\n }\n if (typeof value === 'string' || typeof value === 'number') {\n const ms = new Date(value).getTime();\n return Number.isFinite(ms) ? ms : 0;\n }\n return 0;\n}\n\n/** Assist rows must sort after the user turn they reply to (client/server clocks may differ). */\nexport function axmResolveAssistMessageTimestamp(options: {\n replyToUserMessageTimestamp?: unknown;\n serverNow?: Date;\n}): Date {\n const serverMs = options.serverNow?.getTime() ?? Date.now();\n const userMs = axmCoerceMessageTimestampMs(options.replyToUserMessageTimestamp);\n if (userMs > 0) {\n return new Date(Math.max(serverMs, userMs + 1));\n }\n return new Date(serverMs);\n}\n\nexport function axmEnsureAssistMessageSortsAfterReplyTarget<T extends { timestamp: unknown }>(\n message: T,\n replyTargetTimestamp: unknown,\n): T {\n const replyMs = axmCoerceMessageTimestampMs(replyTargetTimestamp);\n const assistMs = axmCoerceMessageTimestampMs(message.timestamp);\n if (replyMs > 0 && assistMs <= replyMs) {\n return { ...message, timestamp: new Date(replyMs + 1) };\n }\n return message;\n}\n\n/** Chronological sort with assist→user reply linkage when timestamps disagree across clocks. */\nexport function axmCompareMessagesChronologically(\n a: { id: string; timestamp: unknown; metadata?: Record<string, unknown> },\n b: { id: string; timestamp: unknown; metadata?: Record<string, unknown> },\n): number {\n const aReplyTo = axmReadReplyToUserMessageId(a.metadata);\n const bReplyTo = axmReadReplyToUserMessageId(b.metadata);\n if (aReplyTo === b.id) {\n const diff = axmCoerceMessageTimestampMs(a.timestamp) - axmCoerceMessageTimestampMs(b.timestamp);\n return diff > 0 ? diff : 1;\n }\n if (bReplyTo === a.id) {\n const diff = axmCoerceMessageTimestampMs(a.timestamp) - axmCoerceMessageTimestampMs(b.timestamp);\n return diff < 0 ? diff : -1;\n }\n const diff = axmCoerceMessageTimestampMs(a.timestamp) - axmCoerceMessageTimestampMs(b.timestamp);\n return diff !== 0 ? diff : a.id.localeCompare(b.id);\n}\n\n//#endregion\n","//#region ---- Assist message handler port (server) ----\n\nimport type { AXMConversationMessage } from '../entities/message/message.types';\n\nexport interface AXMConversationAssistMessageHandler {\n maybeStartAfterUserMessage(userMessage: AXMConversationMessage): Promise<void>;\n\n retryAssistResponse(\n conversationId: string,\n messageId: string,\n options?: { replyToUserMessageId?: string },\n ): Promise<AXMConversationMessage>;\n}\n\nexport const AXM_CONVERSATION_ASSIST_MESSAGE_HANDLER = Symbol('AXM_CONVERSATION_ASSIST_MESSAGE_HANDLER');\n\n//#endregion\n","//#region ---- Contracts barrel ----\n\nexport * from './comment-entity-data';\n\nexport * from './menu.keys';\nexport * from './permission.keys';\n\nexport * from './root-config';\n\n//#endregion\n\nexport * from './entities';\nexport * from './assist/conversation-assist-stream.types';\nexport * from './assist/conversation-assist-metadata.util';\nexport * from './assist/conversation-assist-handler.port';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,12 +1,13 @@
1
1
  {
2
2
  "name": "@acorex-platform/module-conversation-client",
3
- "version": "0.0.21",
3
+ "version": "0.0.25",
4
4
  "sideEffects": false,
5
5
  "peerDependencies": {
6
6
  "@angular/common": "^21.0.0",
7
7
  "@angular/core": "^21.0.0"
8
8
  },
9
9
  "dependencies": {
10
+ "@acorex-platform/extension-rtc-core-gateway": "0.0.25",
10
11
  "tslib": "^2.3.0"
11
12
  },
12
13
  "module": "fesm2022/acorex-platform-module-conversation-client.mjs",
@@ -1,5 +1,5 @@
1
1
  import { AXPEntityModel } from '@acorex-platform/framework-shared/entity';
2
- import { AXMConversationMessage as AXMConversationMessage$1, AXMConversationRoom as AXMConversationRoom$1 } from '@acorex-platform/module-conversation-contracts';
2
+ import { AXMConversationMessage as AXMConversationMessage$1, AXMConversationRoom as AXMConversationRoom$1 } from '@acorex-platform/module-conversation-client/contracts';
3
3
 
4
4
  interface AXMCommentEntityData {
5
5
  entityId: string;