@acorex-platform/module-conversation-client 0.0.38 → 0.0.46
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.
- package/fesm2022/{acorex-platform-module-conversation-client-acorex-platform-module-conversation-client-XTzQQhii.mjs → acorex-platform-module-conversation-client-acorex-platform-module-conversation-client-DUR2oyfP.mjs} +9727 -8104
- package/fesm2022/acorex-platform-module-conversation-client-acorex-platform-module-conversation-client-DUR2oyfP.mjs.map +1 -0
- package/fesm2022/{acorex-platform-module-conversation-client-after-message-sent.command-BMGagKtP.mjs → acorex-platform-module-conversation-client-after-message-sent.command-qTWATpgC.mjs} +2 -2
- package/fesm2022/{acorex-platform-module-conversation-client-after-message-sent.command-BMGagKtP.mjs.map → acorex-platform-module-conversation-client-after-message-sent.command-qTWATpgC.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-conversation-client-assist-delegated-agent-detail-popup.component-D1SDsHvl.mjs → acorex-platform-module-conversation-client-assist-delegated-agent-detail-popup.component-DQWhOmBE.mjs} +8 -7
- package/fesm2022/{acorex-platform-module-conversation-client-assist-delegated-agent-detail-popup.component-D1SDsHvl.mjs.map → acorex-platform-module-conversation-client-assist-delegated-agent-detail-popup.component-DQWhOmBE.mjs.map} +1 -1
- package/fesm2022/acorex-platform-module-conversation-client-assist-message-renderer.component-DyVepuaW.mjs +1756 -0
- package/fesm2022/acorex-platform-module-conversation-client-assist-message-renderer.component-DyVepuaW.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-conversation-client-assist-tool-detail-popup.component-D8na_1QJ.mjs +120 -0
- package/fesm2022/{acorex-platform-module-conversation-client-assist-tool-detail-popup.component-BV1YH96m.mjs.map → acorex-platform-module-conversation-client-assist-tool-detail-popup.component-D8na_1QJ.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-conversation-client-chat-call-session-page.component-nE7xP4bF.mjs → acorex-platform-module-conversation-client-chat-call-session-page.component-BeS4Duip.mjs} +747 -25
- package/fesm2022/acorex-platform-module-conversation-client-chat-call-session-page.component-BeS4Duip.mjs.map +1 -0
- package/fesm2022/{acorex-platform-module-conversation-client-chat-call-start-popup.component-DXkqkS50.mjs → acorex-platform-module-conversation-client-chat-call-start-popup.component-BbEhkLLh.mjs} +4 -4
- package/fesm2022/{acorex-platform-module-conversation-client-chat-call-start-popup.component-DXkqkS50.mjs.map → acorex-platform-module-conversation-client-chat-call-start-popup.component-BbEhkLLh.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-conversation-client-chat-conversation-info-media-view.component-SYCtAqcV.mjs → acorex-platform-module-conversation-client-chat-conversation-info-media-view.component-Bnbj0e6M.mjs} +3 -3
- package/fesm2022/{acorex-platform-module-conversation-client-chat-conversation-info-media-view.component-SYCtAqcV.mjs.map → acorex-platform-module-conversation-client-chat-conversation-info-media-view.component-Bnbj0e6M.mjs.map} +1 -1
- package/fesm2022/acorex-platform-module-conversation-client-chat-conversation-info-panel.component-bwT1-lAn.mjs +497 -0
- package/fesm2022/acorex-platform-module-conversation-client-chat-conversation-info-panel.component-bwT1-lAn.mjs.map +1 -0
- package/fesm2022/{acorex-platform-module-conversation-client-comments-page.component-Dv_x3ztZ.mjs → acorex-platform-module-conversation-client-comments-page.component-BxUz9jTX.mjs} +2 -2
- package/fesm2022/{acorex-platform-module-conversation-client-comments-page.component-Dv_x3ztZ.mjs.map → acorex-platform-module-conversation-client-comments-page.component-BxUz9jTX.mjs.map} +1 -1
- package/fesm2022/acorex-platform-module-conversation-client-contracts-entities-channel-audience.mjs +277 -0
- package/fesm2022/acorex-platform-module-conversation-client-contracts-entities-channel-audience.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-conversation-client-contracts-entities-channel-post.mjs +530 -0
- package/fesm2022/acorex-platform-module-conversation-client-contracts-entities-channel-post.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-conversation-client-contracts-entities-channel-receipt.mjs +206 -0
- package/fesm2022/acorex-platform-module-conversation-client-contracts-entities-channel-receipt.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-conversation-client-contracts-entities-message.mjs +65 -17
- package/fesm2022/acorex-platform-module-conversation-client-contracts-entities-message.mjs.map +1 -1
- package/fesm2022/acorex-platform-module-conversation-client-contracts-entities-room.mjs +231 -59
- package/fesm2022/acorex-platform-module-conversation-client-contracts-entities-room.mjs.map +1 -1
- package/fesm2022/acorex-platform-module-conversation-client-contracts-entity-catalog-acorex-platform-module-conversation-client-contracts-entity-catalog-CV_sCYGf.mjs +87 -0
- package/fesm2022/acorex-platform-module-conversation-client-contracts-entity-catalog-acorex-platform-module-conversation-client-contracts-entity-catalog-CV_sCYGf.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-conversation-client-contracts-entity-catalog-channel-audience.entity-DyaUcESJ.mjs +213 -0
- package/fesm2022/acorex-platform-module-conversation-client-contracts-entity-catalog-channel-audience.entity-DyaUcESJ.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-conversation-client-contracts-entity-catalog-channel-post.entity-CbBcChEt.mjs +466 -0
- package/fesm2022/acorex-platform-module-conversation-client-contracts-entity-catalog-channel-post.entity-CbBcChEt.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-conversation-client-contracts-entity-catalog-channel-receipt.entity-DtRFj8zV.mjs +142 -0
- package/fesm2022/acorex-platform-module-conversation-client-contracts-entity-catalog-channel-receipt.entity-DtRFj8zV.mjs.map +1 -0
- package/fesm2022/{acorex-platform-module-conversation-client-contracts-entity-catalog-message.entity-Dz7cO1P4.mjs → acorex-platform-module-conversation-client-contracts-entity-catalog-message.entity-CJk1wEvA.mjs} +35 -19
- package/fesm2022/acorex-platform-module-conversation-client-contracts-entity-catalog-message.entity-CJk1wEvA.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-conversation-client-contracts-entity-catalog-room.entity-Ctt7qzfF.mjs +403 -0
- package/fesm2022/acorex-platform-module-conversation-client-contracts-entity-catalog-room.entity-Ctt7qzfF.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-conversation-client-contracts-entity-catalog.mjs +1 -1
- package/fesm2022/acorex-platform-module-conversation-client-contracts.mjs +846 -4
- package/fesm2022/acorex-platform-module-conversation-client-contracts.mjs.map +1 -1
- package/fesm2022/acorex-platform-module-conversation-client-local-entities.mjs +3 -0
- package/fesm2022/acorex-platform-module-conversation-client-local-entities.mjs.map +1 -1
- package/fesm2022/{acorex-platform-module-conversation-client-mark-conversation-unread.command-8NoSuUwe.mjs → acorex-platform-module-conversation-client-mark-conversation-unread.command-juoWxu7I.mjs} +2 -2
- package/fesm2022/{acorex-platform-module-conversation-client-mark-conversation-unread.command-8NoSuUwe.mjs.map → acorex-platform-module-conversation-client-mark-conversation-unread.command-juoWxu7I.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-conversation-client-open-chat.command-BgJ0Z36e.mjs → acorex-platform-module-conversation-client-open-chat.command-ridcdmj7.mjs} +2 -2
- package/fesm2022/{acorex-platform-module-conversation-client-open-chat.command-BgJ0Z36e.mjs.map → acorex-platform-module-conversation-client-open-chat.command-ridcdmj7.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-conversation-client-retry-assist-response.command-lcNz4Hpu.mjs → acorex-platform-module-conversation-client-retry-assist-response.command-BsYxaH3g.mjs} +2 -2
- package/fesm2022/{acorex-platform-module-conversation-client-retry-assist-response.command-lcNz4Hpu.mjs.map → acorex-platform-module-conversation-client-retry-assist-response.command-BsYxaH3g.mjs.map} +1 -1
- package/fesm2022/{acorex-platform-module-conversation-client-sync-read-state.command-DxccFsD9.mjs → acorex-platform-module-conversation-client-sync-read-state.command-DsCyIdEk.mjs} +7 -2
- package/fesm2022/acorex-platform-module-conversation-client-sync-read-state.command-DsCyIdEk.mjs.map +1 -0
- package/fesm2022/acorex-platform-module-conversation-client.mjs +1 -1
- package/package.json +14 -2
- package/types/acorex-platform-module-conversation-client-contracts-entities-channel-audience.d.ts +5 -0
- package/types/acorex-platform-module-conversation-client-contracts-entities-channel-post.d.ts +5 -0
- package/types/acorex-platform-module-conversation-client-contracts-entities-channel-receipt.d.ts +5 -0
- package/types/acorex-platform-module-conversation-client-contracts.d.ts +432 -2
- package/types/acorex-platform-module-conversation-client.d.ts +676 -161
- package/fesm2022/acorex-platform-module-conversation-client-acorex-platform-module-conversation-client-XTzQQhii.mjs.map +0 -1
- package/fesm2022/acorex-platform-module-conversation-client-assist-tool-detail-popup.component-BV1YH96m.mjs +0 -120
- package/fesm2022/acorex-platform-module-conversation-client-chat-call-session-page.component-nE7xP4bF.mjs.map +0 -1
- package/fesm2022/acorex-platform-module-conversation-client-chat-conversation-info-panel.component-51PtojIM.mjs +0 -482
- package/fesm2022/acorex-platform-module-conversation-client-chat-conversation-info-panel.component-51PtojIM.mjs.map +0 -1
- package/fesm2022/acorex-platform-module-conversation-client-contracts-entity-catalog-acorex-platform-module-conversation-client-contracts-entity-catalog-Cy3LwYMZ.mjs +0 -52
- package/fesm2022/acorex-platform-module-conversation-client-contracts-entity-catalog-acorex-platform-module-conversation-client-contracts-entity-catalog-Cy3LwYMZ.mjs.map +0 -1
- package/fesm2022/acorex-platform-module-conversation-client-contracts-entity-catalog-message.entity-Dz7cO1P4.mjs.map +0 -1
- package/fesm2022/acorex-platform-module-conversation-client-contracts-entity-catalog-room.entity-B9txvc3y.mjs +0 -263
- package/fesm2022/acorex-platform-module-conversation-client-contracts-entity-catalog-room.entity-B9txvc3y.mjs.map +0 -1
- package/fesm2022/acorex-platform-module-conversation-client-sync-read-state.command-DxccFsD9.mjs.map +0 -1
|
@@ -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 | 'call_completed'\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 | 'call-log'\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 = 'owner' | 'admin' | 'moderator' | 'member' | 'guest';\n\n/** @deprecated Presence lives on the user store, not the participant snapshot. */\nexport type AXParticipantStatus = 'online' | 'offline' | 'away' | 'busy';\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 (identity snapshot; live presence is per-user). */\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 /** 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/**\n * @deprecated Typing and presence are ephemeral (service + realtime), not stored on the room.\n */\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' | 'busy';\n /** Last seen timestamp (for private chats when offline) */\n lastSeen?: Date;\n}\n\n/**\n * @deprecated Mute/notifications are per-user room preferences (`AXConversationRoomPreferences`), not room fields.\n */\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 /** Optional composer draft for REST backends (not a canonical room field). */\n draft?: string;\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 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 /** 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 /**\n * Composer draft persisted on the room for REST backends.\n * Not part of the `@acorex/components/conversation` room model.\n */\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) ----\r\n\r\nexport function axmExtractAssistIdFromMetadata(metadata: Record<string, unknown> | undefined): string | undefined {\r\n if (!metadata) {\r\n return undefined;\r\n }\r\n const direct = metadata['assistId'];\r\n if (typeof direct === 'string' && direct.trim()) {\r\n return direct.trim();\r\n }\r\n const nested = metadata['metadata'];\r\n if (nested && typeof nested === 'object' && nested !== null) {\r\n const inner = (nested as Record<string, unknown>)['assistId'];\r\n if (typeof inner === 'string' && inner.trim()) {\r\n return inner.trim();\r\n }\r\n }\r\n return undefined;\r\n}\r\n\r\n/**\r\n * Legacy detector for unsupported agent-as-chat rooms. Not an engine targeting API.\r\n */\r\nexport function axmExtractDirectAgentIdFromMetadata(\r\n metadata: Record<string, unknown> | undefined,\r\n): string | undefined {\r\n if (!metadata) {\r\n return undefined;\r\n }\r\n const direct = metadata['directAgentId'];\r\n if (typeof direct === 'string' && direct.trim()) {\r\n return direct.trim();\r\n }\r\n const nested = metadata['metadata'];\r\n if (nested && typeof nested === 'object' && nested !== null) {\r\n const inner = (nested as Record<string, unknown>)['directAgentId'];\r\n if (typeof inner === 'string' && inner.trim()) {\r\n return inner.trim();\r\n }\r\n }\r\n return undefined;\r\n}\r\n\r\nfunction axmExtractConversationKindFromMetadata(\r\n metadata: Record<string, unknown> | undefined,\r\n): string | undefined {\r\n if (!metadata) {\r\n return undefined;\r\n }\r\n const kind = metadata['kind'];\r\n if (typeof kind === 'string' && kind.trim()) {\r\n return kind.trim();\r\n }\r\n const nested = metadata['metadata'];\r\n if (nested && typeof nested === 'object' && nested !== null) {\r\n const inner = (nested as Record<string, unknown>)['kind'];\r\n if (typeof inner === 'string' && inner.trim()) {\r\n return inner.trim();\r\n }\r\n }\r\n return undefined;\r\n}\r\n\r\n/**\r\n * True when the room is a leftover agent-as-chat conversation with no Assist id.\r\n * Callers must fail explicitly; do not map these rooms onto the default Assist.\r\n */\r\nexport function axmIsUnsupportedLegacyAgentAssistConversation(\r\n metadata: Record<string, unknown> | undefined,\r\n): boolean {\r\n if (axmExtractAssistIdFromMetadata(metadata)) {\r\n return false;\r\n }\r\n return (\r\n !!axmExtractDirectAgentIdFromMetadata(metadata) ||\r\n axmExtractConversationKindFromMetadata(metadata) === 'agent-assist'\r\n );\r\n}\r\n\r\nexport function axmConversationHasAiChat(metadata: Record<string, unknown> | undefined): boolean {\r\n return !!(\r\n axmExtractAssistIdFromMetadata(metadata) ??\r\n axmExtractDirectAgentIdFromMetadata(metadata) ??\r\n (axmExtractConversationKindFromMetadata(metadata) === 'agent-assist' ? 'agent-assist' : undefined)\r\n );\r\n}\r\n\r\nexport function axmChatAiPeerParticipantId(catalogId: string): string {\r\n return `assist-${catalogId.trim()}`;\r\n}\r\n\r\nexport function axmReadAssistResponseStatus(metadata: Record<string, unknown> | undefined): string | undefined {\r\n const status = metadata?.['assistResponseStatus'];\r\n return typeof status === 'string' ? status : undefined;\r\n}\r\n\r\nexport function axmReadReplyToUserMessageId(metadata: Record<string, unknown> | undefined): string | undefined {\r\n const replyTo = metadata?.['replyToUserMessageId'];\r\n return typeof replyTo === 'string' && replyTo.trim() ? replyTo.trim() : undefined;\r\n}\r\n\r\nexport function extractMessageTextFromPayload(payload: unknown): string {\r\n const record = payload as { type?: string; text?: string } | undefined;\r\n if (record?.type === 'text' && typeof record.text === 'string') {\r\n return record.text;\r\n }\r\n return '';\r\n}\r\n\r\nexport function axmNormalizeConversationTitle(raw: string): string {\r\n const normalized = raw\r\n .replace(/\\r?\\n+/g, ' ')\r\n .replace(/^[\"'`]+|[\"'`]+$/g, '')\r\n .replace(/\\s+/g, ' ')\r\n .trim();\r\n return normalized.slice(0, 90).trim();\r\n}\r\n\r\n/** System prompt for a lightweight title-only model call (first user message → sidebar title). */\r\nexport const AXM_ASSIST_CONVERSATION_TITLE_SYSTEM_PROMPT = `You generate short conversation titles for chat sidebars.\r\n\r\nGiven the user's first message, reply with ONLY a concise title (3–8 words, max 90 characters).\r\nUse the same language as the user's message (for example Persian if they wrote in Persian).\r\nDo not use quotes, colons, hashtags, or explanation. Output the title text only.`;\r\n\r\nexport function axmSanitizeAiGeneratedConversationTitle(raw: string): string | null {\r\n let text = raw.trim();\r\n if (!text) {\r\n return null;\r\n }\r\n text = text.replace(/^[\"'`«»\"\"]+|[\"'`«»\"\"]+$/g, '').trim();\r\n text = text.replace(/^(title|عنوان|topic|subject)\\s*[::\\-–—]\\s*/i, '').trim();\r\n text = text.replace(/^#+\\s*/, '').trim();\r\n const normalized = axmNormalizeConversationTitle(text);\r\n return normalized || null;\r\n}\r\n\r\n/** Fallback when the title model is unavailable (max 6 words, 90 chars). */\r\nexport function axmBuildHeuristicConversationTitleFallback(raw: string): string | null {\r\n const trimmed = raw.trim();\r\n if (!trimmed) {\r\n return null;\r\n }\r\n const normalized = axmNormalizeConversationTitle(trimmed.split(/\\s+/).slice(0, 6).join(' '));\r\n return normalized || null;\r\n}\r\n\r\nexport function axmCoerceMessageTimestampMs(value: unknown): number {\r\n if (value instanceof Date) {\r\n return value.getTime();\r\n }\r\n if (typeof value === 'string' || typeof value === 'number') {\r\n const ms = new Date(value).getTime();\r\n return Number.isFinite(ms) ? ms : 0;\r\n }\r\n return 0;\r\n}\r\n\r\n/** Assist rows must sort after the user turn they reply to (client/server clocks may differ). */\r\nexport function axmResolveAssistMessageTimestamp(options: {\r\n replyToUserMessageTimestamp?: unknown;\r\n serverNow?: Date;\r\n}): Date {\r\n const serverMs = options.serverNow?.getTime() ?? Date.now();\r\n const userMs = axmCoerceMessageTimestampMs(options.replyToUserMessageTimestamp);\r\n if (userMs > 0) {\r\n return new Date(Math.max(serverMs, userMs + 1));\r\n }\r\n return new Date(serverMs);\r\n}\r\n\r\nexport function axmEnsureAssistMessageSortsAfterReplyTarget<T extends { timestamp: unknown }>(\r\n message: T,\r\n replyTargetTimestamp: unknown,\r\n): T {\r\n const replyMs = axmCoerceMessageTimestampMs(replyTargetTimestamp);\r\n const assistMs = axmCoerceMessageTimestampMs(message.timestamp);\r\n if (replyMs > 0 && assistMs <= replyMs) {\r\n return { ...message, timestamp: new Date(replyMs + 1) };\r\n }\r\n return message;\r\n}\r\n\r\n/** Chronological sort with assist→user reply linkage when timestamps disagree across clocks. */\r\nexport function axmCompareMessagesChronologically(\r\n a: { id: string; timestamp: unknown; metadata?: Record<string, unknown> },\r\n b: { id: string; timestamp: unknown; metadata?: Record<string, unknown> },\r\n): number {\r\n const aReplyTo = axmReadReplyToUserMessageId(a.metadata);\r\n const bReplyTo = axmReadReplyToUserMessageId(b.metadata);\r\n if (aReplyTo === b.id) {\r\n const diff = axmCoerceMessageTimestampMs(a.timestamp) - axmCoerceMessageTimestampMs(b.timestamp);\r\n return diff > 0 ? diff : 1;\r\n }\r\n if (bReplyTo === a.id) {\r\n const diff = axmCoerceMessageTimestampMs(a.timestamp) - axmCoerceMessageTimestampMs(b.timestamp);\r\n return diff < 0 ? diff : -1;\r\n }\r\n const diff = axmCoerceMessageTimestampMs(a.timestamp) - axmCoerceMessageTimestampMs(b.timestamp);\r\n return diff !== 0 ? diff : a.id.localeCompare(b.id);\r\n}\r\n\r\n//#endregion\r\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/manifest.ts","../../../../libs/modules/conversation/contracts/src/error.codes.ts","../../../../libs/modules/conversation/contracts/src/runtime.keys.ts","../../../../libs/modules/conversation/contracts/src/feed.types.ts","../../../../libs/modules/conversation/contracts/src/channel-feed-item.util.ts","../../../../libs/modules/conversation/contracts/src/distribution.types.ts","../../../../libs/modules/conversation/contracts/src/channel-audience-match.util.ts","../../../../libs/modules/conversation/contracts/src/channel-audience-target.util.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/entities/channel-post/channel-post.types.ts","../../../../libs/modules/conversation/contracts/src/entities/channel-audience/channel-audience.types.ts","../../../../libs/modules/conversation/contracts/src/entities/channel-receipt/channel-receipt.types.ts","../../../../libs/modules/conversation/contracts/src/announcement-channel.util.ts","../../../../libs/modules/conversation/contracts/src/conversation-message-scope.util.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-follow-up-locale.util.ts","../../../../libs/modules/conversation/contracts/src/assist/conversation-assist-handler.port.ts","../../../../libs/modules/conversation/contracts/src/assist/conversation-contextual-assist.types.ts","../../../../libs/modules/conversation/contracts/src/assist/conversation-contextual-assist.util.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 Channels: 'Conversation:Menu:Channels',\n Feed: 'Conversation:Menu:ChannelFeed',\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 ViewBulletins: 'Collaboration:Permission:ViewBulletins',\n MaintainBulletins: 'Collaboration:Permission:MaintainBulletins',\n PublishBulletins: 'Collaboration:Permission:PublishBulletins',\n ModerateBulletinDiscussions: 'Collaboration:Permission:ModerateBulletinDiscussions',\n Setup: 'Collaboration:Permission:Setup',\n} as const;\n\nconst viewBulletins = AXPCollaborationPermissionKeys.ViewBulletins;\nconst maintainBulletins = AXPCollaborationPermissionKeys.MaintainBulletins;\nconst publishBulletins = AXPCollaborationPermissionKeys.PublishBulletins;\n\nfunction channelPostCrud() {\n return {\n Management: maintainBulletins,\n View: viewBulletins,\n Edit: maintainBulletins,\n Delete: maintainBulletins,\n Create: maintainBulletins,\n Publish: publishBulletins,\n } as const;\n}\n\nfunction channelChildCrud() {\n return {\n Management: maintainBulletins,\n View: viewBulletins,\n Edit: maintainBulletins,\n Delete: maintainBulletins,\n Create: maintainBulletins,\n } as const;\n}\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 ChannelPosts: channelPostCrud(),\n ChannelAudiences: channelChildCrud(),\n ChannelReceipts: channelChildCrud(),\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 channelPost: {\n name: 'ChannelPost',\n source: `${config.module}.ChannelPost`,\n title: `@${config.i18n}:entities.channel-post.title`,\n titlePlural: `@${config.i18n}:entities.channel-post.plural`,\n icon: 'fa-light fa-bullhorn',\n },\n channelAudience: {\n name: 'ChannelAudience',\n source: `${config.module}.ChannelAudience`,\n title: `@${config.i18n}:entities.channel-audience.title`,\n titlePlural: `@${config.i18n}:entities.channel-audience.plural`,\n icon: 'fa-light fa-users',\n },\n channelReceipt: {\n name: 'ChannelReceipt',\n source: `${config.module}.ChannelReceipt`,\n title: `@${config.i18n}:entities.channel-receipt.title`,\n titlePlural: `@${config.i18n}:entities.channel-receipt.plural`,\n icon: 'fa-light fa-envelope-open',\n },\n },\n pages: {\n feed: {\n path: 'announcements',\n title: `@${config.i18n}:pages.feed.title`,\n description: `@${config.i18n}:pages.feed.description`,\n icon: 'fa-light fa-bullhorn',\n },\n },\n} as const;\n\nexport const CHANNEL_POST_ENTITY_NAME = RootConfig.entities.channelPost.source;\nexport const CHANNEL_AUDIENCE_ENTITY_NAME = RootConfig.entities.channelAudience.source;\nexport const CHANNEL_RECEIPT_ENTITY_NAME = RootConfig.entities.channelReceipt.source;\n","//#region ---- Imports ----\n\nimport { AXPModuleManifest } from '@acorex-platform/framework-shared/core';\nimport { RootConfig } from './root-config';\n\n//#endregion\n\n//#region ---- Manifest Definition ----\n\n/**\n * Conversation Module Manifest.\n * Defines module metadata, features, and provider references.\n */\nexport const ConversationManifest: AXPModuleManifest = {\n name: RootConfig.module.name,\n version: '1.0.0',\n title: RootConfig.module.title,\n icon: RootConfig.module.icon,\n i18n: RootConfig.config.i18n,\n\n type: 'domain',\n domain: 'communication',\n // Module dependencies\n dependencies: ['CommunicationManagement'],\n};\n\n//#endregion\n\n","export const AXMChannelErrorCodes = {\n InvalidTransition: 'CHANNEL_INVALID_TRANSITION',\n ScheduleRequiresFuturePublishAt: 'CHANNEL_SCHEDULE_REQUIRES_FUTURE_PUBLISH_AT',\n NotAddressed: 'CHANNEL_NOT_ADDRESSED',\n} as const;\n","//#region ----- Conversation channel runtime keys -----\n\nexport const AXPConversationQueryKeys = {\n ChannelFeed: {\n Get: 'Conversation:ChannelFeed:Get',\n GetUnreadCount: 'Conversation:ChannelFeed:GetUnreadCount',\n },\n} as const;\n\nexport const AXPConversationCommandKeys = {\n ChannelFeed: {\n MarkRead: 'Conversation:ChannelFeed:MarkRead',\n },\n} as const;\n\n//#endregion\n","//#region ----- Imports -----\n\nimport type { AXPFileListItem, AXPMultiLanguageString } from '@acorex-platform/framework-shared/core';\nimport type { AXMChannelPostKind } from './entities/channel-post/channel-post.types';\n\n//#endregion\n\n//#region ----- Types -----\n\nexport interface AXMChannelFeedQueryInput {\n skip?: number;\n take?: number;\n roomId?: string;\n}\n\nexport interface AXMChannelFeedItem {\n id: string;\n roomId: string;\n title: AXPMultiLanguageString;\n body: AXPMultiLanguageString;\n kind: AXMChannelPostKind;\n authorUserId: string;\n publishedAt?: string;\n eventStartsAt?: string;\n eventEndsAt?: string;\n eventLocation?: AXPMultiLanguageString;\n isPinned: boolean;\n allowReactions: boolean;\n allowComments: boolean;\n /** Total comments in the post thread, including replies. Omitted on older chat metadata. */\n commentCount?: number;\n isRead: boolean;\n gallery: AXPFileListItem[];\n attachments: AXPFileListItem[];\n tags: AXPMultiLanguageString[];\n}\n\nexport interface AXMChannelMarkReadCommandInput {\n postId?: string;\n roomId?: string;\n}\n\nexport interface AXMChannelUnreadCount {\n count: number;\n byRoomId?: Record<string, number>;\n}\n\n//#endregion\n","//#region ----- Imports -----\n\nimport type { AXPFileListItem, AXPMultiLanguageString } from '@acorex-platform/framework-shared/core';\nimport { isLocaleStringMap } from '@acorex-platform/framework-shared/core';\n\nimport type { AXMChannelFeedItem } from './feed.types';\nimport type { AXMChannelPostEntityModel } from './entities/channel-post/channel-post.types';\n\n//#endregion\n\n//#region ----- Mapping -----\n\n/** Projects a channel post onto the chat/feed card shape stored on Message metadata. */\nexport function toChannelFeedItem(\n post: AXMChannelPostEntityModel,\n isRead: boolean,\n isPinned: boolean,\n commentCount = 0,\n): AXMChannelFeedItem {\n return {\n id: post.id,\n roomId: post.roomId,\n title: post.title,\n body: post.body,\n kind: post.kind,\n authorUserId: post.authorUserId,\n publishedAt: toIso(post.publishedAt),\n eventStartsAt: toIso(post.eventStartsAt),\n eventEndsAt: toIso(post.eventEndsAt),\n eventLocation: post.eventLocation,\n isPinned,\n allowReactions: post.allowReactions,\n allowComments: post.allowComments,\n commentCount,\n isRead,\n gallery: asFileList(post.gallery),\n attachments: asFileList(post.attachments),\n tags: asTags(post.tags),\n };\n}\n\n/** Plain-text title for chat message payload (MLS or string). */\nexport function channelPostTitleText(title: unknown): string {\n if (typeof title === 'string') {\n return title;\n }\n if (title == null) {\n return '';\n }\n try {\n return JSON.stringify(title);\n } catch {\n return '';\n }\n}\n\nexport function channelPostMessageName(postId: string): string {\n return `channel-post:${postId}`;\n}\n\n//#endregion\n\n//#region ----- Helpers -----\n\nfunction toIso(value: Date | string | undefined): string | undefined {\n if (!value) {\n return undefined;\n }\n const date = value instanceof Date ? value : new Date(value);\n return Number.isNaN(date.getTime()) ? undefined : date.toISOString();\n}\n\nfunction asTags(value: unknown): AXPMultiLanguageString[] {\n if (value == null) {\n return [];\n }\n if (typeof value === 'string') {\n const trimmed = value.trim();\n if (!trimmed) {\n return [];\n }\n try {\n return asTags(JSON.parse(trimmed));\n } catch {\n return [trimmed];\n }\n }\n if (!Array.isArray(value)) {\n return [];\n }\n return value\n .map((item) => normalizeTag(item))\n .filter((item): item is AXPMultiLanguageString => item != null);\n}\n\nfunction normalizeTag(value: unknown): AXPMultiLanguageString | null {\n if (typeof value === 'string') {\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : null;\n }\n if (isLocaleStringMap(value)) {\n const hasContent = Object.values(value).some((entry) => typeof entry === 'string' && entry.trim().length > 0);\n return hasContent ? value : null;\n }\n return null;\n}\n\nfunction asFileList(value: unknown): AXPFileListItem[] {\n if (value == null) {\n return [];\n }\n if (typeof value === 'string') {\n const trimmed = value.trim();\n if (!trimmed) {\n return [];\n }\n try {\n return asFileList(JSON.parse(trimmed));\n } catch {\n return [];\n }\n }\n if (!Array.isArray(value)) {\n return [];\n }\n return value.filter(\n (item): item is AXPFileListItem =>\n item != null && typeof item === 'object' && typeof (item as AXPFileListItem).name === 'string',\n );\n}\n\n//#endregion\n","//#region ----- Imports -----\n\nimport type { AXMChannelPostKind } from './entities/channel-post/channel-post.types';\n\n//#endregion\n\n//#region ----- Distribution & notification contracts -----\n\nexport const CHANNEL_POST_PUBLISHED_EVENT_NAME = 'Conversation.ChannelPostPublished' as const;\n\nexport interface AXMChannelPublishedEvent {\n eventName: typeof CHANNEL_POST_PUBLISHED_EVENT_NAME;\n tenantId: string;\n roomId: string;\n postId: string;\n publicationVersion: number;\n title: string;\n kind: AXMChannelPostKind;\n canonicalUrl: string;\n audienceSummary: string;\n idempotencyKey: string;\n}\n\nexport interface AXMChannelDistributionSelection {\n distributorKey: string;\n destinationIds: readonly string[];\n}\n\nexport interface AXMChannelDistributionResult {\n distributorKey: string;\n destinationId: string;\n externalReference?: string;\n}\n\nexport type AXMChannelDistributionOutcome =\n | ({ status: 'fulfilled' } & AXMChannelDistributionResult)\n | { status: 'skipped'; distributorKey: string; destinationId: string }\n | { status: 'failed'; distributorKey: string; destinationId: string };\n\nexport interface AXMChannelDistributor {\n readonly key: string;\n distribute(event: AXMChannelPublishedEvent, destinationId: string): Promise<AXMChannelDistributionResult>;\n}\n\nexport const CHANNEL_DISTRIBUTOR = Symbol('CHANNEL_DISTRIBUTOR');\n\nexport interface AXMChannelNotificationPort {\n notify(event: AXMChannelPublishedEvent, recipientUserIds: readonly string[]): Promise<void>;\n}\n\nexport const CHANNEL_NOTIFICATION_PORT = Symbol('CHANNEL_NOTIFICATION_PORT');\n\n//#endregion\n","//#region ----- Imports -----\n\nimport type {\n AXMChannelAudienceEntityModel,\n AXMChannelAudienceMembership,\n AXMChannelAudienceTargetType,\n} from './entities/channel-audience/channel-audience.types';\n\n//#endregion\n\n//#region ----- Constants -----\n\nconst TARGET_MEMBERSHIP_KEY: Record<\n Exclude<AXMChannelAudienceTargetType, 'organization'>,\n keyof AXMChannelAudienceMembership\n> = {\n user: 'userId',\n role: 'roleIds',\n team: 'teamIds',\n businessUnit: 'businessUnitIds',\n position: 'positionIds',\n jobDefinition: 'jobDefinitionIds',\n};\n\n//#endregion\n\n//#region ----- Audience matching -----\n\nexport function axmChannelAudienceRuleMatches(\n rule: AXMChannelAudienceEntityModel,\n member: AXMChannelAudienceMembership,\n): boolean {\n if (rule.targetType === 'organization') {\n return true;\n }\n const key = TARGET_MEMBERSHIP_KEY[rule.targetType];\n const value = member[key];\n return Array.isArray(value) ? value.includes(rule.targetId ?? '') : value === rule.targetId;\n}\n\nexport function axmChannelAudienceIsVisible(\n rules: readonly AXMChannelAudienceEntityModel[],\n member: AXMChannelAudienceMembership,\n): boolean {\n if (rules.length === 0) {\n return true;\n }\n const included = rules.some((rule) => rule.mode !== 'exclude' && axmChannelAudienceRuleMatches(rule, member));\n const excluded = rules.some((rule) => rule.mode === 'exclude' && axmChannelAudienceRuleMatches(rule, member));\n return included && !excluded;\n}\n\nexport function axmResolveChannelAudienceUserIds(\n rules: readonly AXMChannelAudienceEntityModel[],\n members: readonly AXMChannelAudienceMembership[],\n): string[] {\n return members.filter((member) => axmChannelAudienceIsVisible(rules, member)).map((member) => member.userId);\n}\n\n//#endregion\n","//#region ----- Imports -----\n\nimport type {\n AXMChannelAudienceEntityModel,\n AXMChannelAudienceMode,\n AXMChannelAudienceTargetType,\n} from './entities/channel-audience/channel-audience.types';\n\n//#endregion\n\n//#region ----- Target entity map -----\n\n/** Lookup entity for each audience target type. `organization` has no row lookup. */\nexport const AXM_CHANNEL_AUDIENCE_TARGET_ENTITY: Record<\n AXMChannelAudienceTargetType,\n string | null\n> = {\n organization: null,\n user: 'SecurityManagement.User',\n role: 'SecurityManagement.Role',\n team: 'OrganizationManagement.Team',\n businessUnit: 'OrganizationManagement.BusinessUnit',\n position: 'OrganizationManagement.Position',\n jobDefinition: 'OrganizationManagement.JobDefinition',\n};\n\nexport function axmChannelAudienceTargetEntity(\n targetType: string | null | undefined,\n): string | null {\n if (!targetType) {\n return null;\n }\n return AXM_CHANNEL_AUDIENCE_TARGET_ENTITY[targetType as AXMChannelAudienceTargetType] ?? null;\n}\n\nexport function axmRoomAudienceRule(room: {\n id?: string | null;\n audienceTargetType?: string | null;\n audienceTargetId?: string | null;\n audienceMode?: string | null;\n}): AXMChannelAudienceEntityModel | null {\n const roomId = room.id?.trim();\n const targetType = room.audienceTargetType?.trim() as AXMChannelAudienceTargetType | undefined;\n if (!roomId || !targetType) {\n return null;\n }\n return {\n id: `room-audience:${roomId}`,\n roomId,\n targetType,\n targetId: room.audienceTargetId?.trim() || undefined,\n mode: (room.audienceMode?.trim() as AXMChannelAudienceMode | undefined) ?? 'include',\n };\n}\n\n//#endregion\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 | 'call_completed'\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 | 'call-log'\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 = 'owner' | 'admin' | 'moderator' | 'member' | 'guest';\n\n/** @deprecated Presence lives on the user store, not the participant snapshot. */\nexport type AXParticipantStatus = 'online' | 'offline' | 'away' | 'busy';\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 (identity snapshot; live presence is per-user). */\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 /** 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/**\n * @deprecated Typing and presence are ephemeral (service + realtime), not stored on the room.\n */\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' | 'busy';\n /** Last seen timestamp (for private chats when offline) */\n lastSeen?: Date;\n}\n\n/**\n * @deprecated Mute/notifications are per-user room preferences (`AXConversationRoomPreferences`), not room fields.\n */\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/** Composer file/paste UI: overlay popup vs banner above the composer. */\nexport type AXConversationComposerAttachmentPresentation = 'overlay' | 'banner';\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 * Composer attachment UI. Bot rooms default to `banner` when omitted;\n * private/group/channel default to `overlay`.\n */\n composerAttachmentPresentation?: AXConversationComposerAttachmentPresentation;\n /** Optional composer draft for REST backends (not a canonical room field). */\n draft?: string;\n}\n\n//#endregion\n","//#region ---- Imports ----\n\nimport { AXPEntityModel } from '@acorex-platform/framework-shared/entity';\n\nimport { AXMCommentEntityData } from '../../index';\nimport type {\n AXMChannelAudienceMode,\n AXMChannelAudienceTargetType,\n} from '../channel-audience/channel-audience.types';\nimport { AXMConversationMessage } from '../message/message.types';\n\nimport type {\n AXConversationMetadata,\n AXConversationType,\n AXParticipant,\n} from './room.contracts';\n\n//#endregion\n\n//#region ---- Re-exports ----\n\nexport type {\n AXConversationComposerAttachmentPresentation,\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 /** 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 /**\n * Composer draft persisted on the room for REST backends.\n * Not part of the `@acorex/components/conversation` room model.\n */\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 /** Single channel audience rule: target kind. */\n audienceTargetType?: AXMChannelAudienceTargetType;\n /** Single channel audience rule: selected target id. */\n audienceTargetId?: string;\n /** Single channel audience rule: include or exclude. */\n audienceMode?: AXMChannelAudienceMode;\n /** Lookup entity name derived from {@link audienceTargetType}. */\n audienceTargetEntity?: string;\n}\n\n//#endregion\n","//#region ----- Imports -----\n\nimport type { AXPFileListItem, AXPMultiLanguageString } from '@acorex-platform/framework-shared/core';\nimport { AXPEntityModel } from '@acorex-platform/framework-shared/entity';\n\n//#endregion\n\n//#region ----- Types -----\n\nexport type AXMChannelPostKind = 'announcement' | 'news' | 'event' | 'urgent';\nexport type AXMChannelPostStatus = 'draft' | 'scheduled' | 'published' | 'cancelled' | 'archived';\nexport type AXMChannelNotificationPolicy = 'in-app' | 'selected-channels' | 'urgent-override';\nexport type AXMChannelLifecycleAction = 'schedule' | 'publish' | 'cancel' | 'archive' | 'restore';\n\nexport interface AXMChannelPostEntityModel extends AXPEntityModel<string> {\n roomId: string;\n title: AXPMultiLanguageString;\n body: AXPMultiLanguageString;\n kind: AXMChannelPostKind;\n status: AXMChannelPostStatus;\n authorUserId: string;\n publishAt?: Date | string;\n publishedAt?: Date | string;\n expiresAt?: Date | string;\n eventStartsAt?: Date | string;\n eventEndsAt?: Date | string;\n eventLocation?: AXPMultiLanguageString;\n isPinned: boolean;\n pinRank?: number;\n pinnedUntil?: Date | string;\n allowReactions: boolean;\n allowComments: boolean;\n notificationPolicy?: AXMChannelNotificationPolicy;\n publicationVersion: number;\n gallery?: AXPFileListItem[];\n attachments?: AXPFileListItem[];\n tags?: AXPMultiLanguageString[];\n}\n\n//#endregion\n","//#region ----- Imports -----\n\nimport { AXPEntityModel } from '@acorex-platform/framework-shared/entity';\n\n//#endregion\n\n//#region ----- Types -----\n\nexport type AXMChannelAudienceTargetType =\n | 'organization'\n | 'user'\n | 'role'\n | 'team'\n | 'businessUnit'\n | 'position'\n | 'jobDefinition';\n\nexport type AXMChannelAudienceMode = 'include' | 'exclude';\n\nexport interface AXMChannelAudienceEntityModel extends AXPEntityModel<string> {\n /** Channel-level audience when set (Conversation.Room id). */\n roomId?: string;\n /** Post-level audience when set (Conversation.ChannelPost id). */\n postId?: string;\n targetType: AXMChannelAudienceTargetType;\n targetId?: string;\n mode?: AXMChannelAudienceMode;\n resolvedAt?: Date | string;\n resolvedCount?: number;\n}\n\nexport interface AXMChannelAudienceMembership {\n userId: string;\n roleIds?: readonly string[];\n teamIds?: readonly string[];\n businessUnitIds?: readonly string[];\n positionIds?: readonly string[];\n jobDefinitionIds?: readonly string[];\n}\n\n//#endregion\n","//#region ----- Imports -----\n\nimport { AXPEntityModel } from '@acorex-platform/framework-shared/entity';\n\n//#endregion\n\n//#region ----- Types -----\n\nexport interface AXMChannelReceiptEntityModel extends AXPEntityModel<string> {\n postId: string;\n userId: string;\n firstSeenAt?: Date | string;\n readAt?: Date | string;\n dismissedAt?: Date | string;\n}\n\n//#endregion\n","//#region ----- Constants -----\n\n/** Persisted `Room.name` for the tenant-wide announcements channel (unique per tenant scope). */\nexport const AXM_CONVERSATION_ANNOUNCEMENT_CHANNEL_NAME = 'system.tenant-announcements';\n\n/** `metadata.systemChannel` value for the tenant-wide announcements channel. */\nexport const AXM_CONVERSATION_ANNOUNCEMENT_CHANNEL_KEY = 'announcements';\n\n/** Custom conversation message type rendered by the channel feed-item plugin. */\nexport const AXM_CONVERSATION_ANNOUNCEMENT_MESSAGE_TYPE = 'channel-feed-item';\n\n/** Message metadata key that stores the `AXMChannelFeedItem` projection. */\nexport const AXM_CONVERSATION_ANNOUNCEMENT_FEED_ITEM_META_KEY = 'channelFeedItem';\n\n/** Message metadata key that stores the source ChannelPost id. */\nexport const AXM_CONVERSATION_CHANNEL_POST_ID_META_KEY = 'channelPostId';\n\n//#endregion\n\n//#region ----- Detection -----\n\ntype AnnouncementChannelRef = {\n name?: string | null;\n metadata?: Record<string, unknown> | null;\n};\n\n/** True when the room is the tenant announcements channel. */\nexport function axmIsAnnouncementChannel(\n value: AnnouncementChannelRef | null | undefined,\n): boolean {\n if (!value) {\n return false;\n }\n if (value.name === AXM_CONVERSATION_ANNOUNCEMENT_CHANNEL_NAME) {\n return true;\n }\n return value.metadata?.['systemChannel'] === AXM_CONVERSATION_ANNOUNCEMENT_CHANNEL_KEY;\n}\n\nexport function axmAnnouncementChannelMetadata(): Record<string, unknown> {\n return {\n systemChannel: AXM_CONVERSATION_ANNOUNCEMENT_CHANNEL_KEY,\n reactionsEnabled: false,\n };\n}\n\ntype ChannelRoomRef = {\n kind?: string | null;\n type?: string | null;\n name?: string | null;\n metadata?: Record<string, unknown> | null;\n};\n\n/** True when the room is an entity comment thread (not a chat inbox conversation). */\nexport function axmIsCommentRoom(value: { kind?: string | null } | null | undefined): boolean {\n return value?.kind === 'comment';\n}\n\n/** True when the room is a chat channel (broadcast posts, no composer). */\nexport function axmIsChannelRoom(value: ChannelRoomRef | null | undefined): boolean {\n if (!value) {\n return false;\n }\n if (axmIsAnnouncementChannel(value)) {\n return true;\n }\n return value.type === 'channel';\n}\n\nexport function axmChannelPostIdFromMessage(message: {\n name?: string | null;\n metadata?: Record<string, unknown> | null;\n} | null | undefined): string | null {\n if (!message) {\n return null;\n }\n const meta = message.metadata ?? {};\n const fromMeta = meta[AXM_CONVERSATION_CHANNEL_POST_ID_META_KEY];\n if (typeof fromMeta === 'string' && fromMeta.trim()) {\n return fromMeta.trim();\n }\n const prefix = 'channel-post:';\n const name = message.name?.trim() ?? '';\n if (name.startsWith(prefix)) {\n const id = name.slice(prefix.length).trim();\n if (id) {\n return id;\n }\n }\n const feed = meta[AXM_CONVERSATION_ANNOUNCEMENT_FEED_ITEM_META_KEY];\n if (feed && typeof feed === 'object' && typeof (feed as { id?: unknown }).id === 'string') {\n const id = (feed as { id: string }).id.trim();\n return id || null;\n }\n return null;\n}\n\n//#endregion\n","//#region ---- Conversation message scope ----\n\n/**\n * Resolves tenant/application scope for a new {@link Conversation.Message} row.\n * Prefer the parent room's stamped scope so call logs match sibling messages on read.\n */\nexport function axmResolveConversationMessageScopeInfo(\n room: Record<string, unknown>,\n session: { tenantId?: string; applicationId?: string },\n): Record<string, unknown> | undefined {\n const fromRoom = readScopeInfo(room['scopeInfo']);\n if (fromRoom?.['tenantId']) {\n return fromRoom;\n }\n\n const tenantId = session.tenantId?.trim();\n if (!tenantId) {\n return undefined;\n }\n\n const scope: Record<string, unknown> = { tenantId };\n const applicationId = session.applicationId?.trim();\n if (applicationId) {\n scope['applicationId'] = applicationId;\n }\n return scope;\n}\n\nexport function axmScopeInfoNeedsTenantStamp(\n scopeInfo: Record<string, unknown> | undefined,\n expectedTenantId: string,\n): boolean {\n const tenantId =\n typeof scopeInfo?.['tenantId'] === 'string' ? scopeInfo['tenantId'].trim() : '';\n return tenantId !== expectedTenantId.trim();\n}\n\nfunction readScopeInfo(value: unknown): Record<string, unknown> | undefined {\n if (!value || typeof value !== 'object') {\n return undefined;\n }\n const record = value as Record<string, unknown>;\n const tenantId = typeof record['tenantId'] === 'string' ? record['tenantId'].trim() : '';\n if (!tenantId) {\n return undefined;\n }\n const scope: Record<string, unknown> = { tenantId };\n const applicationId = typeof record['applicationId'] === 'string' ? record['applicationId'].trim() : '';\n if (applicationId) {\n scope['applicationId'] = applicationId;\n }\n return scope;\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) ----\r\n\r\n/** UI flags persisted on every AI (bot) room. */\r\nexport function axmAiChatConversationUiMetadata(): {\r\n reactionsEnabled: false;\r\n composerAttachmentPresentation: 'banner';\r\n} {\r\n return {\r\n reactionsEnabled: false,\r\n composerAttachmentPresentation: 'banner',\r\n };\r\n}\r\n\r\nexport function axmExtractAssistIdFromMetadata(metadata: Record<string, unknown> | undefined): string | undefined {\r\n if (!metadata) {\r\n return undefined;\r\n }\r\n const direct = metadata['assistId'];\r\n if (typeof direct === 'string' && direct.trim()) {\r\n return direct.trim();\r\n }\r\n const nested = metadata['metadata'];\r\n if (nested && typeof nested === 'object' && nested !== null) {\r\n const inner = (nested as Record<string, unknown>)['assistId'];\r\n if (typeof inner === 'string' && inner.trim()) {\r\n return inner.trim();\r\n }\r\n }\r\n return undefined;\r\n}\r\n\r\n/**\r\n * Legacy detector for unsupported agent-as-chat rooms. Not an engine targeting API.\r\n */\r\nexport function axmExtractDirectAgentIdFromMetadata(\r\n metadata: Record<string, unknown> | undefined,\r\n): string | undefined {\r\n if (!metadata) {\r\n return undefined;\r\n }\r\n const direct = metadata['directAgentId'];\r\n if (typeof direct === 'string' && direct.trim()) {\r\n return direct.trim();\r\n }\r\n const nested = metadata['metadata'];\r\n if (nested && typeof nested === 'object' && nested !== null) {\r\n const inner = (nested as Record<string, unknown>)['directAgentId'];\r\n if (typeof inner === 'string' && inner.trim()) {\r\n return inner.trim();\r\n }\r\n }\r\n return undefined;\r\n}\r\n\r\nfunction axmExtractConversationKindFromMetadata(\r\n metadata: Record<string, unknown> | undefined,\r\n): string | undefined {\r\n if (!metadata) {\r\n return undefined;\r\n }\r\n const kind = metadata['kind'];\r\n if (typeof kind === 'string' && kind.trim()) {\r\n return kind.trim();\r\n }\r\n const nested = metadata['metadata'];\r\n if (nested && typeof nested === 'object' && nested !== null) {\r\n const inner = (nested as Record<string, unknown>)['kind'];\r\n if (typeof inner === 'string' && inner.trim()) {\r\n return inner.trim();\r\n }\r\n }\r\n return undefined;\r\n}\r\n\r\n/**\r\n * True when the room is a leftover agent-as-chat conversation with no Assist id.\r\n * Callers must fail explicitly; do not map these rooms onto the default Assist.\r\n */\r\nexport function axmIsUnsupportedLegacyAgentAssistConversation(\r\n metadata: Record<string, unknown> | undefined,\r\n): boolean {\r\n if (axmExtractAssistIdFromMetadata(metadata)) {\r\n return false;\r\n }\r\n return (\r\n !!axmExtractDirectAgentIdFromMetadata(metadata) ||\r\n axmExtractConversationKindFromMetadata(metadata) === 'agent-assist'\r\n );\r\n}\r\n\r\nexport function axmConversationHasAiChat(metadata: Record<string, unknown> | undefined): boolean {\r\n return !!(\r\n axmExtractAssistIdFromMetadata(metadata) ??\r\n axmExtractDirectAgentIdFromMetadata(metadata) ??\r\n (axmExtractConversationKindFromMetadata(metadata) === 'agent-assist' ? 'agent-assist' : undefined)\r\n );\r\n}\r\n\r\nexport function axmChatAiPeerParticipantId(catalogId: string): string {\r\n return `assist-${catalogId.trim()}`;\r\n}\r\n\r\nexport function axmReadAssistResponseStatus(metadata: Record<string, unknown> | undefined): string | undefined {\r\n const status = metadata?.['assistResponseStatus'];\r\n return typeof status === 'string' ? status : undefined;\r\n}\r\n\r\nexport type AxmAssistFollowUpStatus = 'preparing' | 'ready' | 'skipped';\r\n\r\nexport function axmReadAssistFollowUpStatus(\r\n metadata: Record<string, unknown> | undefined,\r\n): AxmAssistFollowUpStatus | undefined {\r\n const status = metadata?.['followUpStatus'];\r\n if (status === 'preparing' || status === 'ready' || status === 'skipped') {\r\n return status;\r\n }\r\n return undefined;\r\n}\r\n\r\nexport function axmReadReplyToUserMessageId(metadata: Record<string, unknown> | undefined): string | undefined {\r\n const replyTo = metadata?.['replyToUserMessageId'];\r\n return typeof replyTo === 'string' && replyTo.trim() ? replyTo.trim() : undefined;\r\n}\r\n\r\nexport function extractMessageTextFromPayload(payload: unknown): string {\r\n if (!payload || typeof payload !== 'object') {\r\n return '';\r\n }\r\n const record = payload as { type?: string; text?: string };\r\n if (typeof record.text !== 'string') {\r\n return '';\r\n }\r\n if (record.type && record.type !== 'text') {\r\n return '';\r\n }\r\n return record.text;\r\n}\r\n\r\nexport function axmNormalizeConversationTitle(raw: string): string {\r\n const normalized = raw\r\n .replace(/\\r?\\n+/g, ' ')\r\n .replace(/^[\"'`]+|[\"'`]+$/g, '')\r\n .replace(/\\s+/g, ' ')\r\n .trim();\r\n return normalized.slice(0, 90).trim();\r\n}\r\n\r\n/** System prompt for a lightweight follow-up-chip model call after the Assist answer. */\r\nexport const AXM_ASSIST_CONVERSATION_FOLLOW_UP_SYSTEM_PROMPT = `You generate short follow-up suggestion chips for a chat assistant.\r\n\r\nGiven the latest user message, assistant reply, optional this-turn tool evidence, optional earlier turns from **this same conversation**, and optional assist capabilities, reply with ONLY one JSON object:\r\n{\"type\":\"followUp\",\"content\":[{\"text\":\"chip label\",\"command\":{\"name\":\"Conversation:SendAssistChatMessage\",\"options\":{}}}]}\r\n\r\nRules:\r\n- Always propose 2–5 short, actionable next steps as Conversation:SendAssistChatMessage chips. Never return an empty content array.\r\n- Navigation chips (Entity:OpenList / Entity:OpenDetails) are extra and never replace send-message chips. Always include at least two send-message chips.\r\n- Default chips send the label as the next chat message via Conversation:SendAssistChatMessage.\r\n- **Priority:** ground every chip in the latest user message and the latest assistant reply. Earlier turns in this conversation may only inspire wording. Ignore any other conversation, tenant, or leftover memory.\r\n- Chip labels must continue **this exchange**. After a list or query (including an empty result), suggest the next obvious question or filter — a different date, range, person, or related view — in the user's language. After a create/update, offer the next step on that record.\r\n- Empty results still need concrete next steps (for example a different day, this week, or who is away), not generic filler.\r\n- Example: user asked who is on leave today and the assistant found none → chips such as \"leave tomorrow\", \"this week's leave\", \"who is away next week\" in the user's language.\r\n- Never emit generic filler such as \"Ask another question\", \"What else can you do?\", \"Ask me anything\", or their translations.\r\n- Navigation chips only when **this turn** created, updated, queried, opened a specific entity, or answered a how-to using PlatformManagement:ListPlatformNavigationForAi with a single Module.Entity. Never on greeting, thanks, goodbye, or orientation. Chip **text** must be in the same language as the user (never English when the user wrote Persian).\r\n - List: {\"text\":\"<Open List or List {menu title} in the user's language>\",\"command\":{\"name\":\"Entity:OpenList\",\"options\":{\"entity\":\"Module.Entity\"}}}\r\n - How-to / menu answers: Open List only (no Details unless a record id exists). Prefer a named chip such as \"List Users\" when the menu title is known.\r\n - Details (only when this turn has a record id and the row was not just deleted): {\"text\":\"<Open Details in the user's language>\",\"command\":{\"name\":\"Entity:OpenDetails\",\"options\":{\"entity\":\"Module.Entity\",\"data\":{\"id\":\"<record-id>\"}}}}\r\n- Other chips remain send-message requests in the user's language.\r\n- Do not invent platform facts, IDs, or screens that were not mentioned and are not listed in assist capabilities.\r\n- When the exchange is orientation (greeting, thanks, goodbye, or no specific task yet), suggest what this assist can help with. Prefer the provided assist capabilities, rewritten as short chip labels in the user's language.\r\n- Use the same language as the user.\r\n- Do not repeat the assistant's full answer. Chip labels only.\r\n- No markdown fences, commentary, or extra keys.`;\r\n\r\nexport function axmBuildAssistConversationFollowUpUserPrompt(input: {\r\n userMessageText: string;\r\n assistantMessageText: string;\r\n assistGrounding?: string;\r\n turnGrounding?: string;\r\n threadInspiration?: string;\r\n}): string {\r\n const parts = [\r\n `Latest user message (authoritative):\\n${input.userMessageText.trim()}`,\r\n `Latest assistant reply (authoritative):\\n${input.assistantMessageText.trim()}`,\r\n ];\r\n const turn = input.turnGrounding?.trim();\r\n if (turn) {\r\n parts.push(turn);\r\n }\r\n const thread = input.threadInspiration?.trim();\r\n if (thread) {\r\n parts.push(\r\n `Earlier turns in this conversation only (optional inspiration; do not override the latest exchange; ignore any other chat):\\n${thread}`,\r\n );\r\n }\r\n const grounding = input.assistGrounding?.trim();\r\n if (grounding) {\r\n parts.push(grounding);\r\n }\r\n return parts.join('\\n\\n');\r\n}\r\n\r\n/** System prompt for a lightweight title-only model call (first user message → sidebar title). */\r\nexport const AXM_ASSIST_CONVERSATION_TITLE_SYSTEM_PROMPT = `You generate short conversation titles for chat sidebars.\r\n\r\nGiven the user's first message, reply with ONLY a concise title (3–8 words, max 90 characters).\r\nUse the same language as the user's message (for example Persian if they wrote in Persian).\r\nDo not use quotes, colons, hashtags, or explanation. Output the title text only.`;\r\n\r\nexport function axmSanitizeAiGeneratedConversationTitle(raw: string): string | null {\r\n let text = raw.trim();\r\n if (!text) {\r\n return null;\r\n }\r\n text = text.replace(/^[\"'`«»\"\"]+|[\"'`«»\"\"]+$/g, '').trim();\r\n text = text.replace(/^(title|عنوان|topic|subject)\\s*[::\\-–—]\\s*/i, '').trim();\r\n text = text.replace(/^#+\\s*/, '').trim();\r\n const normalized = axmNormalizeConversationTitle(text);\r\n return normalized || null;\r\n}\r\n\r\n/** Fallback when the title model is unavailable (max 6 words, 90 chars). */\r\nexport function axmBuildHeuristicConversationTitleFallback(raw: string): string | null {\r\n const trimmed = raw.trim();\r\n if (!trimmed) {\r\n return null;\r\n }\r\n const normalized = axmNormalizeConversationTitle(trimmed.split(/\\s+/).slice(0, 6).join(' '));\r\n return normalized || null;\r\n}\r\n\r\nexport function axmCoerceMessageTimestampMs(value: unknown): number {\r\n if (value instanceof Date) {\r\n return value.getTime();\r\n }\r\n if (typeof value === 'string' || typeof value === 'number') {\r\n const ms = new Date(value).getTime();\r\n return Number.isFinite(ms) ? ms : 0;\r\n }\r\n return 0;\r\n}\r\n\r\n/** Assist rows must sort after the user turn they reply to (client/server clocks may differ). */\r\nexport function axmResolveAssistMessageTimestamp(options: {\r\n replyToUserMessageTimestamp?: unknown;\r\n serverNow?: Date;\r\n}): Date {\r\n const serverMs = options.serverNow?.getTime() ?? Date.now();\r\n const userMs = axmCoerceMessageTimestampMs(options.replyToUserMessageTimestamp);\r\n if (userMs > 0) {\r\n return new Date(Math.max(serverMs, userMs + 1));\r\n }\r\n return new Date(serverMs);\r\n}\r\n\r\nexport function axmEnsureAssistMessageSortsAfterReplyTarget<T extends { timestamp: unknown }>(\r\n message: T,\r\n replyTargetTimestamp: unknown,\r\n): T {\r\n const replyMs = axmCoerceMessageTimestampMs(replyTargetTimestamp);\r\n const assistMs = axmCoerceMessageTimestampMs(message.timestamp);\r\n if (replyMs > 0 && assistMs <= replyMs) {\r\n return { ...message, timestamp: new Date(replyMs + 1) };\r\n }\r\n return message;\r\n}\r\n\r\n/** Chronological sort with assist→user reply linkage when timestamps disagree across clocks. */\r\nexport function axmCompareMessagesChronologically(\r\n a: { id: string; timestamp: unknown; metadata?: Record<string, unknown> },\r\n b: { id: string; timestamp: unknown; metadata?: Record<string, unknown> },\r\n): number {\r\n const aReplyTo = axmReadReplyToUserMessageId(a.metadata);\r\n const bReplyTo = axmReadReplyToUserMessageId(b.metadata);\r\n if (aReplyTo === b.id) {\r\n const diff = axmCoerceMessageTimestampMs(a.timestamp) - axmCoerceMessageTimestampMs(b.timestamp);\r\n return diff > 0 ? diff : 1;\r\n }\r\n if (bReplyTo === a.id) {\r\n const diff = axmCoerceMessageTimestampMs(a.timestamp) - axmCoerceMessageTimestampMs(b.timestamp);\r\n return diff < 0 ? diff : -1;\r\n }\r\n const diff = axmCoerceMessageTimestampMs(a.timestamp) - axmCoerceMessageTimestampMs(b.timestamp);\r\n return diff !== 0 ? diff : a.id.localeCompare(b.id);\r\n}\r\n\r\nexport type AXMChronologicalMessage = {\r\n id: string;\r\n timestamp: unknown;\r\n metadata?: Record<string, unknown>;\r\n deleted?: boolean;\r\n};\r\n\r\n/** Messages that sort after {@link messageId} in conversation order (deleted rows excluded). */\r\nexport function axmMessagesAfterId<T extends AXMChronologicalMessage>(\r\n messages: readonly T[],\r\n messageId: string,\r\n): T[] {\r\n const scoped = messageId.trim();\r\n if (!scoped) {\r\n return [];\r\n }\r\n const sorted = [...messages].sort((a, b) => axmCompareMessagesChronologically(a, b));\r\n const idx = sorted.findIndex((message) => message.id === scoped);\r\n if (idx < 0) {\r\n return [];\r\n }\r\n return sorted.slice(idx + 1).filter((message) => message.deleted !== true);\r\n}\r\n\r\n//#endregion\r\n","//#region ---- Follow-up nav chip locale ----\n\nimport type { AXPMultiLanguageString } from '@acorex-platform/framework-shared/core';\nimport { resolveMultiLanguageString } from '@acorex-platform/framework-shared/core';\n\n/** Must match `conversation.json` → `chat.assist-renderer.follow-up.open-entity-list`. */\nconst AXM_FOLLOW_UP_OPEN_LIST_LABELS: AXPMultiLanguageString = {\n 'en-US': 'Open List',\n 'en-AU': 'Open List',\n 'fa-IR': 'باز کردن لیست',\n};\n\n/** Must match `conversation.json` → `chat.assist-renderer.follow-up.open-entity-list-named`. */\nconst AXM_FOLLOW_UP_OPEN_LIST_NAMED_LABELS: AXPMultiLanguageString = {\n 'en-US': 'List {{name}}',\n 'en-AU': 'List {{name}}',\n 'fa-IR': 'لیست {{name}}',\n};\n\n/** Must match `conversation.json` → `chat.assist-renderer.follow-up.open-entity-details`. */\nconst AXM_FOLLOW_UP_OPEN_DETAILS_LABELS: AXPMultiLanguageString = {\n 'en-US': 'Open Details',\n 'en-AU': 'Open Details',\n 'fa-IR': 'باز کردن جزئیات',\n};\n\nconst FOLLOW_UP_CHIP_LOCALES = ['en-US', 'en-AU', 'fa-IR'] as const;\nconst PERSIAN_OR_ARABIC_SCRIPT = /[\\u0600-\\u06FF]/;\n\nexport interface AxmFollowUpNavChipLabels {\n list: string;\n details: string;\n}\n\nfunction normalizeChipLocale(raw: string | undefined): string {\n const locale = raw?.trim() || 'en-US';\n return locale;\n}\n\nfunction isKnownChipLocale(locale: string): locale is (typeof FOLLOW_UP_CHIP_LOCALES)[number] {\n return (FOLLOW_UP_CHIP_LOCALES as readonly string[]).includes(locale);\n}\n\n/**\n * Spoken language from the latest user text when that locale exists in the product;\n * otherwise the system UI locale.\n */\nexport function axmInferFollowUpChipLocale(spokenText: string, systemLocale?: string): string {\n const system = normalizeChipLocale(systemLocale);\n const text = spokenText.trim();\n let spoken: string | undefined;\n if (PERSIAN_OR_ARABIC_SCRIPT.test(text)) {\n spoken = 'fa-IR';\n } else if (/[A-Za-z]/.test(text)) {\n spoken = system.toLowerCase().startsWith('en') ? system : 'en-US';\n }\n if (spoken && isKnownChipLocale(spoken)) {\n return spoken;\n }\n if (isKnownChipLocale(system)) {\n return system;\n }\n return 'en-US';\n}\n\n/** Resolved Open List / Open Details labels — plain text, never i18n keys. */\nexport function axmResolveFollowUpNavChipLabels(\n spokenText: string,\n systemLocale?: string,\n options?: { listEntityTitle?: string },\n): AxmFollowUpNavChipLabels {\n const locale = axmInferFollowUpChipLocale(spokenText, systemLocale);\n const namedTitle = options?.listEntityTitle?.trim();\n const listTemplate = namedTitle\n ? resolveMultiLanguageString(AXM_FOLLOW_UP_OPEN_LIST_NAMED_LABELS, locale)\n : resolveMultiLanguageString(AXM_FOLLOW_UP_OPEN_LIST_LABELS, locale);\n return {\n list: namedTitle ? listTemplate.replace(/\\{\\{\\s*name\\s*\\}\\}/g, namedTitle) : listTemplate,\n details: resolveMultiLanguageString(AXM_FOLLOW_UP_OPEN_DETAILS_LABELS, locale),\n };\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 /**\n * After a user edits an earlier turn: drop later messages, abort any live stream,\n * and start a new Assist reply from the edited message.\n */\n maybeRegenerateAfterUserMessageEdit(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 ----- Types -----\n\n/** Metadata key on a Conversation room for contextual assist launch payload. */\nexport const AXM_ASSIST_LAUNCH_CONTEXT_METADATA_KEY = 'assistLaunchContext';\n\n/** v1 entity-row launch kind. Later callers may pass other kind strings (e.g. document). */\nexport const AXM_CONTEXTUAL_ASSIST_KIND_ENTITY_RECORD = 'entity-record';\n\n/** v1 entity-row action name passed into the launcher. */\nexport const AXM_CONTEXTUAL_ASSIST_ACTION_ENTITY_RECORD = 'entity.record.assist';\n\n/** Generic bag the contextual-assist launcher accepts from any host (entity, later document). */\nexport interface AXMContextualAssistContext {\n kind: string;\n actionName: string;\n title?: string;\n payload: Record<string, unknown>;\n}\n\n/** Column snapshot for an entity-record launch. */\nexport interface AXMContextualAssistColumnValue {\n name: string;\n title: string;\n value: unknown;\n}\n\n/** Payload for {@link AXM_CONTEXTUAL_ASSIST_KIND_ENTITY_RECORD}. */\nexport interface AXMEntityRecordAssistPayload {\n moduleName: string;\n entityName: string;\n entityTitle?: string;\n recordId: string;\n columns: AXMContextualAssistColumnValue[];\n}\n\n/**\n * Payload key for a live designer/document JSON string.\n * Sanitizer keeps this field much larger than ordinary string values.\n */\nexport const AXM_CONTEXTUAL_ASSIST_LAYOUT_JSON_KEY = 'layoutJson';\n\n/** Compact widget pointer for designer assist (selected node / current page). */\nexport interface AXMFormTemplateDesignerAssistWidgetRef {\n type?: string;\n name?: string;\n path?: string;\n childCount?: number;\n}\n\n/** Local list summary (not row data) for designer assist. */\nexport interface AXMFormTemplateDesignerAssistDataSourceRef {\n id: string;\n name: string;\n itemCount: number;\n columnNames: string[];\n}\n\n/**\n * Payload for form-template designer assist.\n * Optional {@link layoutJson} is the live canvas (same shape as File → Download JSON).\n * Prefer designer outline/patch commands over shipping the full tree.\n */\nexport interface AXMFormTemplateDesignerAssistPayload extends AXMEntityRecordAssistPayload {\n scenario: string;\n entityType: string;\n surface: 'layout-designer';\n layoutJson?: string;\n layoutJsonTruncated?: boolean;\n unsavedChanges?: boolean;\n pageCount?: number;\n currentPageIndex?: number;\n currentPage?: AXMFormTemplateDesignerAssistWidgetRef;\n selectedWidget?: AXMFormTemplateDesignerAssistWidgetRef | null;\n dataSources?: AXMFormTemplateDesignerAssistDataSourceRef[];\n widgetCounts?: Record<string, number>;\n surfaceId?: string;\n documentKind?: string;\n rootWidget?: string;\n}\n\n//#endregion\n","//#region ----- Imports -----\n\nimport {\n AXM_ASSIST_LAUNCH_CONTEXT_METADATA_KEY,\n AXM_CONTEXTUAL_ASSIST_LAYOUT_JSON_KEY,\n type AXMContextualAssistContext,\n} from './conversation-contextual-assist.types';\n\n//#endregion\n\n//#region ----- Constants -----\n\nconst STARTER_MAX_CHIPS = 3;\nconst MAX_STRING_CHARS = 400;\nconst MAX_JSON_CHARS = 800;\n/** Live designer JSON must survive sanitize so the specialist can edit the canvas. */\nexport const AXM_CONTEXTUAL_ASSIST_MAX_LAYOUT_JSON_CHARS = 100_000;\nconst LARGE_CONTEXT_STRING_KEYS = new Set([\n AXM_CONTEXTUAL_ASSIST_LAYOUT_JSON_KEY,\n 'documentJson',\n 'formJson',\n]);\nconst SECRET_NAME_PATTERN = /password|secret|token|apikey|api_key|credential|privatekey|private_key/i;\n\nexport const AXM_CONTEXTUAL_ASSIST_STARTER_SYSTEM_PROMPT = `You generate short suggested starter questions for a chat assistant.\n\nThe user has not sent a message yet. They opened assist from a product surface (for example one entity record).\n\nReply with ONLY one JSON object:\n{\"items\":[{\"text\":\"short question\"}]}\n\nRules:\n- Return at most 3 items. Each text is one short suggested question or request the user could send.\n- Ground every chip only in the provided launch context. Do not invent ids, fields, or facts that are not in the context.\n- Use the same language as the locale (and any user-facing titles in the context).\n- Do not claim data was saved or that you already changed the record.\n- No markdown fences, commentary, or extra keys.`;\n\n//#endregion\n\n//#region ----- Metadata -----\n\n/**\n * Reads {@link AXM_ASSIST_LAUNCH_CONTEXT_METADATA_KEY} from conversation metadata\n * (including the nested `metadata.metadata` shape used by the conversation UI).\n */\nexport function axmIsFormTemplateDesignerAssistLaunch(\n metadata: Record<string, unknown> | undefined,\n): boolean {\n const ctx = axmExtractAssistLaunchContextFromMetadata(metadata);\n if (!ctx) {\n return false;\n }\n return ctx.kind === 'form-template-designer' || ctx.payload['scenario'] === 'form-template-designer';\n}\n\nexport function axmExtractAssistLaunchContextFromMetadata(\n metadata: Record<string, unknown> | undefined,\n): AXMContextualAssistContext | undefined {\n if (!metadata) {\n return undefined;\n }\n const direct = readLaunchContext(metadata[AXM_ASSIST_LAUNCH_CONTEXT_METADATA_KEY]);\n if (direct) {\n return direct;\n }\n const nested = metadata['metadata'];\n if (nested && typeof nested === 'object' && !Array.isArray(nested)) {\n return readLaunchContext((nested as Record<string, unknown>)[AXM_ASSIST_LAUNCH_CONTEXT_METADATA_KEY]);\n }\n return undefined;\n}\n\nfunction readLaunchContext(raw: unknown): AXMContextualAssistContext | undefined {\n if (!raw || typeof raw !== 'object' || Array.isArray(raw)) {\n return undefined;\n }\n const row = raw as Record<string, unknown>;\n const kind = typeof row['kind'] === 'string' ? row['kind'].trim() : '';\n const actionName = typeof row['actionName'] === 'string' ? row['actionName'].trim() : '';\n const payload = row['payload'];\n if (!kind || !actionName || !payload || typeof payload !== 'object' || Array.isArray(payload)) {\n return undefined;\n }\n const title = typeof row['title'] === 'string' ? row['title'].trim() : undefined;\n return {\n kind,\n actionName,\n ...(title ? { title } : {}),\n payload: payload as Record<string, unknown>,\n };\n}\n\n//#endregion\n\n//#region ----- Sanitize -----\n\nexport function axmSanitizeContextualAssistContext(\n context: AXMContextualAssistContext,\n): AXMContextualAssistContext {\n const title = context.title?.trim();\n return {\n kind: context.kind.trim(),\n actionName: context.actionName.trim(),\n ...(title ? { title } : {}),\n payload: sanitizeRecord(context.payload, 0),\n };\n}\n\nfunction sanitizeRecord(value: Record<string, unknown>, depth: number): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n for (const [key, raw] of Object.entries(value)) {\n if (shouldSkipKey(key)) {\n continue;\n }\n const next = sanitizeUnknown(raw, depth + 1, key);\n if (next !== undefined) {\n out[key] = next;\n }\n }\n return out;\n}\n\nexport function axmSanitizeContextualAssistValue(value: unknown): unknown {\n return sanitizeUnknown(value, 0);\n}\n\nfunction sanitizeUnknown(value: unknown, depth: number, key?: string): unknown {\n if (value == null) {\n return value;\n }\n if (typeof value === 'string') {\n const trimmed = value.trim();\n const maxChars =\n key && LARGE_CONTEXT_STRING_KEYS.has(key) ? AXM_CONTEXTUAL_ASSIST_MAX_LAYOUT_JSON_CHARS : MAX_STRING_CHARS;\n return trimmed.length > maxChars ? `${trimmed.slice(0, maxChars)}…` : trimmed;\n }\n if (typeof value === 'number' || typeof value === 'boolean') {\n return value;\n }\n if (value instanceof Date) {\n return value.toISOString();\n }\n if (typeof value === 'function' || typeof value === 'bigint' || typeof value === 'symbol') {\n return undefined;\n }\n if (Array.isArray(value)) {\n if (depth > 2) {\n return summarizeJson(value);\n }\n return value\n .slice(0, 12)\n .map((item) => sanitizeUnknown(item, depth + 1))\n .filter((item) => item !== undefined);\n }\n if (typeof value === 'object') {\n if (depth > 2) {\n return summarizeJson(value);\n }\n return sanitizeRecord(value as Record<string, unknown>, depth);\n }\n return undefined;\n}\n\nexport function axmShouldSkipContextualAssistKey(key: string): boolean {\n return shouldSkipKey(key);\n}\n\nfunction shouldSkipKey(key: string): boolean {\n const trimmed = key.trim();\n if (!trimmed || trimmed.startsWith('_') || trimmed.startsWith('$')) {\n return true;\n }\n return SECRET_NAME_PATTERN.test(trimmed);\n}\n\nfunction summarizeJson(value: unknown): string | undefined {\n try {\n const text = JSON.stringify(value);\n if (!text || text === '{}' || text === '[]') {\n return undefined;\n }\n return text.length > MAX_JSON_CHARS ? `${text.slice(0, MAX_JSON_CHARS)}…` : text;\n } catch {\n return undefined;\n }\n}\n\n//#endregion\n\n//#region ----- Prompts -----\n\nexport function axmBuildContextualAssistStarterUserPrompt(\n context: AXMContextualAssistContext,\n locale: string,\n): string {\n const sanitized = axmSanitizeContextualAssistContext(context);\n const localeLabel = locale.trim() || 'en-US';\n return [\n `Locale: ${localeLabel}`,\n `Action: ${sanitized.actionName}`,\n `Kind: ${sanitized.kind}`,\n sanitized.title ? `Surface title: ${sanitized.title}` : '',\n 'Launch context (JSON):',\n JSON.stringify(sanitized.payload, null, 2),\n ]\n .filter(Boolean)\n .join('\\n');\n}\n\n/** System/user-visible injection prepended on every assist run for a launched room. */\nexport function axmFormatContextualAssistLaunchInjection(context: AXMContextualAssistContext): string {\n const sanitized = axmSanitizeContextualAssistContext(context);\n return [\n 'The user opened assist from a product surface. Use this launch context for the whole conversation.',\n 'Do not invent persisted ids or claim data was saved.',\n `Action: ${sanitized.actionName}`,\n `Kind: ${sanitized.kind}`,\n sanitized.title ? `Surface title: ${sanitized.title}` : '',\n sanitized.kind === 'form-template-designer' ||\n sanitized.payload['scenario'] === 'form-template-designer' ||\n typeof sanitized.payload[AXM_CONTEXTUAL_ASSIST_LAYOUT_JSON_KEY] === 'string'\n ? [\n 'The Form Template designer canvas is open.',\n 'Follow the edit-layout-designer Skill: Page:GetContext then Page:RunAction with add-widget / update-widget / remove-widget / move-widget from snapshot.actions.',\n 'Calculated fields, show/hide, and cascades use write-platform-expression: patch node.triggers and node.visible (not options.hint).',\n 'Read snapshot.outline for widget name/type/path. Do not rewrite or apply the full layout JSON for a single field. Do not emit a widget tree in chat.',\n 'The user-visible chat reply is one or two short sentences only.',\n ].join(' ')\n : '',\n 'Context (JSON):',\n JSON.stringify(sanitized.payload, null, 2),\n ]\n .filter(Boolean)\n .join('\\n');\n}\n\n//#endregion\n\n//#region ----- Parse starters -----\n\nexport function axmParseContextualAssistStarterItems(rawText: string): string[] {\n const parsed = parseJsonPayload(rawText);\n const labels: string[] = [];\n for (const candidate of collectStarterCandidates(parsed)) {\n const text = candidate.trim();\n if (!text) {\n continue;\n }\n labels.push(text);\n if (labels.length >= STARTER_MAX_CHIPS) {\n break;\n }\n }\n return labels;\n}\n\nfunction collectStarterCandidates(parsed: unknown): string[] {\n if (Array.isArray(parsed)) {\n return parsed.map(labelFromUnknown).filter(Boolean);\n }\n if (!parsed || typeof parsed !== 'object') {\n return [];\n }\n const row = parsed as Record<string, unknown>;\n const items = row['items'] ?? row['content'];\n if (!Array.isArray(items)) {\n return [];\n }\n return items.map(labelFromUnknown).filter(Boolean);\n}\n\nfunction labelFromUnknown(value: unknown): string {\n if (typeof value === 'string') {\n return value.trim();\n }\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n const text = (value as Record<string, unknown>)['text'];\n if (typeof text === 'string') {\n return text.trim();\n }\n }\n return '';\n}\n\nfunction parseJsonPayload(rawText: string): unknown {\n let text = rawText.trim();\n if (!text) {\n return null;\n }\n text = text.replace(/^```(?:json)?\\s*/i, '').replace(/\\s*```$/u, '').trim();\n try {\n return JSON.parse(text) as unknown;\n } catch {\n const objectStart = text.indexOf('{');\n const arrayStart = text.indexOf('[');\n const startCandidates = [objectStart, arrayStart].filter((index) => index >= 0);\n if (startCandidates.length === 0) {\n return null;\n }\n const start = Math.min(...startCandidates);\n const end = text.lastIndexOf(start === objectStart ? '}' : ']');\n if (end <= start) {\n return null;\n }\n try {\n return JSON.parse(text.slice(start, end + 1)) as unknown;\n } catch {\n return null;\n }\n }\n}\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';\nexport * from './manifest';\n\nexport * from './error.codes';\nexport * from './runtime.keys';\nexport * from './feed.types';\nexport * from './channel-feed-item.util';\nexport * from './distribution.types';\nexport * from './channel-audience-match.util';\nexport * from './channel-audience-target.util';\n\n//#endregion\n\nexport * from './entities';\nexport * from './announcement-channel.util';\nexport * from './conversation-message-scope.util';\nexport * from './assist/conversation-assist-stream.types';\nexport * from './assist/conversation-assist-metadata.util';\nexport * from './assist/conversation-assist-follow-up-locale.util';\nexport * from './assist/conversation-assist-handler.port';\nexport * from './assist/conversation-contextual-assist.types';\nexport * from './assist/conversation-contextual-assist.util';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -17,6 +17,9 @@ function provideConversationLocalEntities() {
|
|
|
17
17
|
loaders: {
|
|
18
18
|
[RootConfig.entities.message.name]: () => import('@acorex-platform/module-conversation-client/contracts/entities/message').then((m) => m.messageFactory()),
|
|
19
19
|
[RootConfig.entities.room.name]: () => import('@acorex-platform/module-conversation-client/contracts/entities/room').then((m) => m.roomFactory()),
|
|
20
|
+
[RootConfig.entities.channelPost.name]: () => import('@acorex-platform/module-conversation-client/contracts/entities/channel-post').then((m) => m.channelPostFactory()),
|
|
21
|
+
[RootConfig.entities.channelAudience.name]: () => import('@acorex-platform/module-conversation-client/contracts/entities/channel-audience').then((m) => m.channelAudienceFactory()),
|
|
22
|
+
[RootConfig.entities.channelReceipt.name]: () => import('@acorex-platform/module-conversation-client/contracts/entities/channel-receipt').then((m) => m.channelReceiptFactory()),
|
|
20
23
|
},
|
|
21
24
|
});
|
|
22
25
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"acorex-platform-module-conversation-client-local-entities.mjs","sources":["../../../../libs/modules/conversation/client/src/lib/provide-local-entities.ts","../../../../libs/modules/conversation/client/src/lib/acorex-platform-module-conversation-client-local-entities.ts"],"sourcesContent":["//#region ----- Imports -----\n\nimport { provideLocalEntityCatalog } from '@acorex-platform/framework-client/layout/entity';\nimport { RootConfig } from '@acorex-platform/module-conversation-client/contracts';\n\n//#endregion\n\n//#region ----- Provide local entities -----\n\n/**\n * Registers conversation layouts on the client from packaged factories.\n * Each `import()` targets a secondary entry so unused entities stay out of the\n * bundle. Do not add this to the demo app; demo continues to load layouts via\n * `Domain:GetEntityLayout`.\n */\nexport function provideConversationLocalEntities() {\n return provideLocalEntityCatalog({\n moduleName: RootConfig.module.name,\n loaders: {\n [RootConfig.entities.message.name]: () =>\n import('@acorex-platform/module-conversation-client/contracts/entities/message').then((m) => m.messageFactory()),\n [RootConfig.entities.room.name]: () =>\n import('@acorex-platform/module-conversation-client/contracts/entities/room').then((m) => m.roomFactory()),\n },\n });\n}\n\nexport { conversationLocalEntityCatalog } from '@acorex-platform/module-conversation-client/contracts/entity-catalog';\n\n//#endregion\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './provide-local-entities';\n"],"names":[],"mappings":";;;;AAAA;AAKA;AAEA;AAEA;;;;;AAKG;SACa,gCAAgC,GAAA;AAC9C,IAAA,OAAO,yBAAyB,CAAC;AAC/B,QAAA,UAAU,EAAE,UAAU,CAAC,MAAM,CAAC,IAAI;AAClC,QAAA,OAAO,EAAE;AACP,YAAA,CAAC,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,GAAG,MAClC,OAAO,wEAAwE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,cAAc,EAAE,CAAC;AAClH,YAAA,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,GAAG,MAC/B,OAAO,qEAAqE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"acorex-platform-module-conversation-client-local-entities.mjs","sources":["../../../../libs/modules/conversation/client/src/lib/provide-local-entities.ts","../../../../libs/modules/conversation/client/src/lib/acorex-platform-module-conversation-client-local-entities.ts"],"sourcesContent":["//#region ----- Imports -----\n\nimport { provideLocalEntityCatalog } from '@acorex-platform/framework-client/layout/entity';\nimport { RootConfig } from '@acorex-platform/module-conversation-client/contracts';\n\n//#endregion\n\n//#region ----- Provide local entities -----\n\n/**\n * Registers conversation layouts on the client from packaged factories.\n * Each `import()` targets a secondary entry so unused entities stay out of the\n * bundle. Do not add this to the demo app; demo continues to load layouts via\n * `Domain:GetEntityLayout`.\n */\nexport function provideConversationLocalEntities() {\n return provideLocalEntityCatalog({\n moduleName: RootConfig.module.name,\n loaders: {\n [RootConfig.entities.message.name]: () =>\n import('@acorex-platform/module-conversation-client/contracts/entities/message').then((m) => m.messageFactory()),\n [RootConfig.entities.room.name]: () =>\n import('@acorex-platform/module-conversation-client/contracts/entities/room').then((m) => m.roomFactory()),\n [RootConfig.entities.channelPost.name]: () =>\n import('@acorex-platform/module-conversation-client/contracts/entities/channel-post').then(\n (m) => m.channelPostFactory(),\n ),\n [RootConfig.entities.channelAudience.name]: () =>\n import('@acorex-platform/module-conversation-client/contracts/entities/channel-audience').then(\n (m) => m.channelAudienceFactory(),\n ),\n [RootConfig.entities.channelReceipt.name]: () =>\n import('@acorex-platform/module-conversation-client/contracts/entities/channel-receipt').then(\n (m) => m.channelReceiptFactory(),\n ),\n },\n });\n}\n\nexport { conversationLocalEntityCatalog } from '@acorex-platform/module-conversation-client/contracts/entity-catalog';\n\n//#endregion\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './provide-local-entities';\n"],"names":[],"mappings":";;;;AAAA;AAKA;AAEA;AAEA;;;;;AAKG;SACa,gCAAgC,GAAA;AAC9C,IAAA,OAAO,yBAAyB,CAAC;AAC/B,QAAA,UAAU,EAAE,UAAU,CAAC,MAAM,CAAC,IAAI;AAClC,QAAA,OAAO,EAAE;AACP,YAAA,CAAC,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,GAAG,MAClC,OAAO,wEAAwE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,cAAc,EAAE,CAAC;AAClH,YAAA,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,GAAG,MAC/B,OAAO,qEAAqE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;AAC5G,YAAA,CAAC,UAAU,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,GAAG,MACtC,OAAO,6EAA6E,CAAC,CAAC,IAAI,CACxF,CAAC,CAAC,KAAK,CAAC,CAAC,kBAAkB,EAAE,CAC9B;AACH,YAAA,CAAC,UAAU,CAAC,QAAQ,CAAC,eAAe,CAAC,IAAI,GAAG,MAC1C,OAAO,iFAAiF,CAAC,CAAC,IAAI,CAC5F,CAAC,CAAC,KAAK,CAAC,CAAC,sBAAsB,EAAE,CAClC;AACH,YAAA,CAAC,UAAU,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,GAAG,MACzC,OAAO,gFAAgF,CAAC,CAAC,IAAI,CAC3F,CAAC,CAAC,KAAK,CAAC,CAAC,qBAAqB,EAAE,CACjC;AACJ,SAAA;AACF,KAAA,CAAC;AACJ;AAIA;;ACzCA;;AAEG;;"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
2
|
import { inject, Injectable } from '@angular/core';
|
|
3
|
-
import { A as AXMConversationEntityStoreService } from './acorex-platform-module-conversation-client-acorex-platform-module-conversation-client-
|
|
3
|
+
import { A as AXMConversationEntityStoreService } from './acorex-platform-module-conversation-client-acorex-platform-module-conversation-client-DUR2oyfP.mjs';
|
|
4
4
|
|
|
5
5
|
//#endregion
|
|
6
6
|
//#region ---- Command ----
|
|
@@ -27,4 +27,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
27
27
|
}] });
|
|
28
28
|
|
|
29
29
|
export { AXMConversationMarkConversationUnreadCommand };
|
|
30
|
-
//# sourceMappingURL=acorex-platform-module-conversation-client-mark-conversation-unread.command-
|
|
30
|
+
//# sourceMappingURL=acorex-platform-module-conversation-client-mark-conversation-unread.command-juoWxu7I.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"acorex-platform-module-conversation-client-mark-conversation-unread.command-
|
|
1
|
+
{"version":3,"file":"acorex-platform-module-conversation-client-mark-conversation-unread.command-juoWxu7I.mjs","sources":["../../../../libs/modules/conversation/client/src/lib/features/commands/mark-conversation-unread.command.ts"],"sourcesContent":["//#region ---- Imports ----\n\nimport { AXPCommand, type AXPCommandExecuteResultPromise } from '@acorex-platform/framework-shared/runtime';\nimport { AXPRuntimeCommandResult } from '@acorex-platform/framework-shared/core';\n\nimport { inject, Injectable } from '@angular/core';\n\nimport { AXMConversationEntityStoreService } from '../chat/services/conversation-entity-store.service';\n\n//#endregion\n\n//#region ---- Types ----\n\nexport interface AXMMarkConversationUnreadOptions {\n conversationId: string;\n}\n\n//#endregion\n\n//#region ---- Command ----\n\n@Injectable({ providedIn: 'root' })\nexport class AXMConversationMarkConversationUnreadCommand implements AXPCommand<AXMMarkConversationUnreadOptions, void> {\n private readonly store = inject(AXMConversationEntityStoreService);\n\n async execute(input: AXMMarkConversationUnreadOptions | unknown): AXPCommandExecuteResultPromise<void> {\n const options = input as AXMMarkConversationUnreadOptions;\n const conversation = await this.store.getConversation(options.conversationId);\n if (!conversation) {\n return { success: false };\n }\n const unreadCount = Math.max(1, conversation.unreadCount ?? 0);\n await this.store.setUnreadCount(options.conversationId, unreadCount);\n return { success: true, kind: 'object', data: undefined };\n }\n}\n\n//#endregion\n"],"names":[],"mappings":";;;;AAiBA;AAEA;MAGa,4CAA4C,CAAA;AADzD,IAAA,WAAA,GAAA;AAEmB,QAAA,IAAA,CAAA,KAAK,GAAG,MAAM,CAAC,iCAAiC,CAAC;AAYnE,IAAA;IAVC,MAAM,OAAO,CAAC,KAAiD,EAAA;QAC7D,MAAM,OAAO,GAAG,KAAyC;AACzD,QAAA,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,OAAO,CAAC,cAAc,CAAC;QAC7E,IAAI,CAAC,YAAY,EAAE;AACjB,YAAA,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE;QAC3B;AACA,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,YAAY,CAAC,WAAW,IAAI,CAAC,CAAC;AAC9D,QAAA,MAAM,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,cAAc,EAAE,WAAW,CAAC;AACpE,QAAA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE;IAC3D;8GAZW,4CAA4C,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAA5C,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,4CAA4C,cAD/B,MAAM,EAAA,CAAA,CAAA;;2FACnB,4CAA4C,EAAA,UAAA,EAAA,CAAA;kBADxD,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;"}
|
|
@@ -4,7 +4,7 @@ import { AXPInAppInboxConnectorService } from '@acorex-platform/module-communica
|
|
|
4
4
|
import * as i0 from '@angular/core';
|
|
5
5
|
import { inject, Injectable } from '@angular/core';
|
|
6
6
|
import { Router } from '@angular/router';
|
|
7
|
-
import { g as buildConversationChatInAppCorrelationPrefix } from './acorex-platform-module-conversation-client-acorex-platform-module-conversation-client-
|
|
7
|
+
import { g as buildConversationChatInAppCorrelationPrefix } from './acorex-platform-module-conversation-client-acorex-platform-module-conversation-client-DUR2oyfP.mjs';
|
|
8
8
|
|
|
9
9
|
//#endregion
|
|
10
10
|
//#region ----- Command -----
|
|
@@ -54,4 +54,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
54
54
|
}] });
|
|
55
55
|
|
|
56
56
|
export { AXMConversationOpenChatCommand };
|
|
57
|
-
//# sourceMappingURL=acorex-platform-module-conversation-client-open-chat.command-
|
|
57
|
+
//# sourceMappingURL=acorex-platform-module-conversation-client-open-chat.command-ridcdmj7.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"acorex-platform-module-conversation-client-open-chat.command-
|
|
1
|
+
{"version":3,"file":"acorex-platform-module-conversation-client-open-chat.command-ridcdmj7.mjs","sources":["../../../../libs/modules/conversation/client/src/lib/features/commands/open-chat.command.ts"],"sourcesContent":["import { AXConversationService } from '@acorex/components/conversation';\nimport { AXPSessionService } from '@acorex-platform/framework-client/auth';\nimport { AXPCommand, type AXPCommandExecuteResultPromise } from '@acorex-platform/framework-shared/runtime';\nimport { AXPInAppInboxConnectorService } from '@acorex-platform/module-communication-management-client';\nimport { inject, Injectable } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { buildConversationChatInAppCorrelationPrefix } from '../chat/services/conversation-chat-notification.util';\n\n//#region ----- Types -----\n\nexport interface AXMOpenChatOptions {\n conversationId?: string;\n}\n\n//#endregion\n\n//#region ----- Command -----\n\n/** Opens an existing conversation in the chat app. */\n@Injectable({ providedIn: 'root' })\nexport class AXMConversationOpenChatCommand implements AXPCommand<AXMOpenChatOptions, { conversationId: string }> {\n //#region ----- Services & Dependencies -----\n\n private readonly conversationService = inject(AXConversationService);\n private readonly sessionService = inject(AXPSessionService);\n private readonly router = inject(Router);\n private readonly inboxConnector = inject(AXPInAppInboxConnectorService, { optional: true });\n\n //#endregion\n\n async execute(input: AXMOpenChatOptions | unknown): AXPCommandExecuteResultPromise<{ conversationId: string }> {\n const conversationId =\n typeof (input as AXMOpenChatOptions)?.conversationId === 'string'\n ? (input as AXMOpenChatOptions).conversationId!.trim()\n : '';\n\n if (!conversationId) {\n return { success: false, message: { text: '@conversation:chat.route.conversation-not-found' } };\n }\n\n await this.markConversationInAppNotificationRead(conversationId);\n\n await this.conversationService.selectConversation(conversationId);\n await this.router.navigate([this.applicationRouteSegment(), 'chat', conversationId]);\n return { success: true, kind: 'object', data: { conversationId } };\n }\n\n //#region ----- Private -----\n\n private async markConversationInAppNotificationRead(conversationId: string): Promise<void> {\n if (!this.inboxConnector) {\n return;\n }\n try {\n await this.inboxConnector.markReadByCorrelationIdPrefix(\n buildConversationChatInAppCorrelationPrefix(conversationId),\n );\n } catch {\n // Best-effort — navigation should still proceed.\n }\n }\n\n private applicationRouteSegment(): string {\n return this.sessionService.application?.name?.trim() || 'platform';\n }\n\n //#endregion\n}\n\n//#endregion\n"],"names":[],"mappings":";;;;;;;;AAcA;AAEA;AAEA;MAEa,8BAA8B,CAAA;AAD3C,IAAA,WAAA,GAAA;;AAImB,QAAA,IAAA,CAAA,mBAAmB,GAAG,MAAM,CAAC,qBAAqB,CAAC;AACnD,QAAA,IAAA,CAAA,cAAc,GAAG,MAAM,CAAC,iBAAiB,CAAC;AAC1C,QAAA,IAAA,CAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QACvB,IAAA,CAAA,cAAc,GAAG,MAAM,CAAC,6BAA6B,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAyC5F,IAAA;;IArCC,MAAM,OAAO,CAAC,KAAmC,EAAA;AAC/C,QAAA,MAAM,cAAc,GAClB,OAAQ,KAA4B,EAAE,cAAc,KAAK;AACvD,cAAG,KAA4B,CAAC,cAAe,CAAC,IAAI;cAClD,EAAE;QAER,IAAI,CAAC,cAAc,EAAE;AACnB,YAAA,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,iDAAiD,EAAE,EAAE;QACjG;AAEA,QAAA,MAAM,IAAI,CAAC,qCAAqC,CAAC,cAAc,CAAC;QAEhE,MAAM,IAAI,CAAC,mBAAmB,CAAC,kBAAkB,CAAC,cAAc,CAAC;AACjE,QAAA,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,uBAAuB,EAAE,EAAE,MAAM,EAAE,cAAc,CAAC,CAAC;AACpF,QAAA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,cAAc,EAAE,EAAE;IACpE;;IAIQ,MAAM,qCAAqC,CAAC,cAAsB,EAAA;AACxE,QAAA,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;YACxB;QACF;AACA,QAAA,IAAI;YACF,MAAM,IAAI,CAAC,cAAc,CAAC,6BAA6B,CACrD,2CAA2C,CAAC,cAAc,CAAC,CAC5D;QACH;AAAE,QAAA,MAAM;;QAER;IACF;IAEQ,uBAAuB,GAAA;AAC7B,QAAA,OAAO,IAAI,CAAC,cAAc,CAAC,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,UAAU;IACpE;8GA5CW,8BAA8B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAA9B,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,8BAA8B,cADjB,MAAM,EAAA,CAAA,CAAA;;2FACnB,8BAA8B,EAAA,UAAA,EAAA,CAAA;kBAD1C,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
2
|
import { inject, Injectable } from '@angular/core';
|
|
3
|
-
import { a as AXM_CONVERSATION_ASSIST_RESPONSE_PORT } from './acorex-platform-module-conversation-client-acorex-platform-module-conversation-client-
|
|
3
|
+
import { a as AXM_CONVERSATION_ASSIST_RESPONSE_PORT } from './acorex-platform-module-conversation-client-acorex-platform-module-conversation-client-DUR2oyfP.mjs';
|
|
4
4
|
|
|
5
5
|
//#endregion
|
|
6
6
|
//#region ---- Command ----
|
|
@@ -31,4 +31,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
31
31
|
}] });
|
|
32
32
|
|
|
33
33
|
export { AXMConversationRetryAssistResponseCommand };
|
|
34
|
-
//# sourceMappingURL=acorex-platform-module-conversation-client-retry-assist-response.command-
|
|
34
|
+
//# sourceMappingURL=acorex-platform-module-conversation-client-retry-assist-response.command-BsYxaH3g.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"acorex-platform-module-conversation-client-retry-assist-response.command-
|
|
1
|
+
{"version":3,"file":"acorex-platform-module-conversation-client-retry-assist-response.command-BsYxaH3g.mjs","sources":["../../../../libs/modules/conversation/client/src/lib/features/commands/retry-assist-response.command.ts"],"sourcesContent":["//#region ---- Imports ----\n\nimport { AXPCommand, type AXPCommandExecuteResultPromise } from '@acorex-platform/framework-shared/runtime';\nimport type { AXConversationMessage } from '@acorex/components/conversation';\nimport { AXPRuntimeCommandResult } from '@acorex-platform/framework-shared/core';\n\nimport { Injectable, inject } from '@angular/core';\n\nimport { AXM_CONVERSATION_ASSIST_RESPONSE_PORT } from '../chat/services/conversation-assist-response.port';\n\n//#endregion\n\n//#region ---- Types ----\n\nexport interface AXMRetryAssistResponseOptions {\n conversationId: string;\n messageId: string;\n}\n\nexport interface AXMRetryAssistResponseResult {\n message: AXConversationMessage;\n}\n\n//#endregion\n\n//#region ---- Command ----\n\n@Injectable({ providedIn: 'root' })\nexport class AXMConversationRetryAssistResponseCommand\n implements AXPCommand<AXMRetryAssistResponseOptions, AXMRetryAssistResponseResult>\n{\n private readonly assistResponse = inject(AXM_CONVERSATION_ASSIST_RESPONSE_PORT, { optional: true });\n\n async execute(input: AXMRetryAssistResponseOptions | unknown): AXPCommandExecuteResultPromise<AXMRetryAssistResponseResult> {\n const options = input as AXMRetryAssistResponseOptions;\n if (!this.assistResponse) {\n return { success: false, message: { text: 'Assist response service is not available.' } };\n }\n\n try {\n const message = await this.assistResponse.retryAssistResponse(options.conversationId, options.messageId);\n return { success: true, kind: 'object', data: { message } };\n } catch (error: unknown) {\n console.error('[Conversation:RetryAssistResponse] Failed:', error);\n return { success: false };\n }\n }\n}\n\n//#endregion\n"],"names":[],"mappings":";;;;AAuBA;AAEA;MAGa,yCAAyC,CAAA;AADtD,IAAA,WAAA,GAAA;QAImB,IAAA,CAAA,cAAc,GAAG,MAAM,CAAC,qCAAqC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAgBpG,IAAA;IAdC,MAAM,OAAO,CAAC,KAA8C,EAAA;QAC1D,MAAM,OAAO,GAAG,KAAsC;AACtD,QAAA,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;AACxB,YAAA,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,2CAA2C,EAAE,EAAE;QAC3F;AAEA,QAAA,IAAI;AACF,YAAA,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,mBAAmB,CAAC,OAAO,CAAC,cAAc,EAAE,OAAO,CAAC,SAAS,CAAC;AACxG,YAAA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,EAAE;QAC7D;QAAE,OAAO,KAAc,EAAE;AACvB,YAAA,OAAO,CAAC,KAAK,CAAC,4CAA4C,EAAE,KAAK,CAAC;AAClE,YAAA,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE;QAC3B;IACF;8GAlBW,yCAAyC,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAzC,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,yCAAyC,cAD5B,MAAM,EAAA,CAAA,CAAA;;2FACnB,yCAAyC,EAAA,UAAA,EAAA,CAAA;kBADrD,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
2
|
import { inject, Injectable } from '@angular/core';
|
|
3
|
-
import { A as AXMConversationEntityStoreService, d as AXMConversationFocusService, e as AXMConversationInAppNotificationSyncService, f as axmMessageCountsTowardUnread } from './acorex-platform-module-conversation-client-acorex-platform-module-conversation-client-
|
|
3
|
+
import { A as AXMConversationEntityStoreService, d as AXMConversationFocusService, e as AXMConversationInAppNotificationSyncService, f as axmMessageCountsTowardUnread } from './acorex-platform-module-conversation-client-acorex-platform-module-conversation-client-DUR2oyfP.mjs';
|
|
4
|
+
import { axmIsChannelRoom } from '@acorex-platform/module-conversation-client/contracts';
|
|
4
5
|
|
|
5
6
|
//#endregion
|
|
6
7
|
//#region ---- Command ----
|
|
@@ -16,6 +17,10 @@ class AXMConversationSyncReadStateCommand {
|
|
|
16
17
|
if (!conversationId) {
|
|
17
18
|
return { success: true, kind: 'object', data: undefined };
|
|
18
19
|
}
|
|
20
|
+
const channelConversation = this.store.getCachedConversation(conversationId) ?? (await this.store.getConversation(conversationId));
|
|
21
|
+
if (axmIsChannelRoom(channelConversation)) {
|
|
22
|
+
return { success: true, kind: 'object', data: undefined };
|
|
23
|
+
}
|
|
19
24
|
const allowWithoutFocus = Boolean(options.force || options.fromInbox);
|
|
20
25
|
if (!allowWithoutFocus && !this.focus.isFocused(conversationId)) {
|
|
21
26
|
return { success: true, kind: 'object', data: undefined };
|
|
@@ -60,4 +65,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
60
65
|
}] });
|
|
61
66
|
|
|
62
67
|
export { AXMConversationSyncReadStateCommand };
|
|
63
|
-
//# sourceMappingURL=acorex-platform-module-conversation-client-sync-read-state.command-
|
|
68
|
+
//# sourceMappingURL=acorex-platform-module-conversation-client-sync-read-state.command-DsCyIdEk.mjs.map
|
package/fesm2022/acorex-platform-module-conversation-client-sync-read-state.command-DsCyIdEk.mjs.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"acorex-platform-module-conversation-client-sync-read-state.command-DsCyIdEk.mjs","sources":["../../../../libs/modules/conversation/client/src/lib/features/commands/sync-read-state.command.ts"],"sourcesContent":["//#region ---- Imports ----\n\nimport { AXPCommand, type AXPCommandExecuteResultPromise } from '@acorex-platform/framework-shared/runtime';\n\nimport { inject, Injectable } from '@angular/core';\n\nimport { AXMConversationInAppNotificationSyncService } from '../chat/services/conversation-in-app-notification-sync.service';\nimport { AXMConversationEntityStoreService } from '../chat/services/conversation-entity-store.service';\nimport { AXMConversationFocusService } from '../chat/services/conversation-focus.service';\nimport { axmMessageCountsTowardUnread } from '../chat/plugins/utils/conversation-unread.util';\nimport { axmIsChannelRoom } from '@acorex-platform/module-conversation-client/contracts';\n\n//#endregion\n\n//#region ---- Types ----\n\nexport interface AXMSyncReadStateOptions {\n conversationId: string;\n messageIds?: string[];\n currentUserId: string;\n /** Explicit user action (sidebar Mark as Read). Skips the “must be viewing” guard. */\n force?: boolean;\n /** Inbox row was marked read — do not treat as a chat-page focus requirement. */\n fromInbox?: boolean;\n}\n\n//#endregion\n\n//#region ---- Command ----\n\n@Injectable({ providedIn: 'root' })\nexport class AXMConversationSyncReadStateCommand implements AXPCommand<AXMSyncReadStateOptions, void> {\n private readonly store = inject(AXMConversationEntityStoreService);\n private readonly focus = inject(AXMConversationFocusService);\n private readonly inAppSync = inject(AXMConversationInAppNotificationSyncService);\n\n async execute(input: AXMSyncReadStateOptions | unknown): AXPCommandExecuteResultPromise<void> {\n const options = input as AXMSyncReadStateOptions;\n const conversationId = options.conversationId?.trim();\n if (!conversationId) {\n return { success: true, kind: 'object', data: undefined };\n }\n\n const channelConversation =\n this.store.getCachedConversation(conversationId) ?? (await this.store.getConversation(conversationId));\n if (axmIsChannelRoom(channelConversation)) {\n return { success: true, kind: 'object', data: undefined };\n }\n\n const allowWithoutFocus = Boolean(options.force || options.fromInbox);\n if (!allowWithoutFocus && !this.focus.isFocused(conversationId)) {\n return { success: true, kind: 'object', data: undefined };\n }\n\n const currentUserId = options.currentUserId?.trim();\n const messageIds = options.messageIds?.filter((id) => id?.trim()) ?? [];\n const idsToMark =\n messageIds.length > 0\n ? messageIds\n : currentUserId\n ? await this.collectUnreadMessageIds(conversationId, currentUserId)\n : [];\n\n if (idsToMark.length > 0 && currentUserId) {\n await this.focus.markMessagesRead(conversationId, idsToMark, currentUserId);\n } else {\n const cachedConversation = this.store.getCachedConversation(conversationId);\n if ((cachedConversation?.unreadCount ?? 0) !== 0) {\n await this.store.setUnreadCount(conversationId, 0);\n }\n }\n\n if (currentUserId) {\n await this.inAppSync.markConversationInAppNotificationRead(conversationId, currentUserId, {\n force: true,\n });\n }\n return { success: true, kind: 'object', data: undefined };\n }\n\n private async collectUnreadMessageIds(conversationId: string, currentUserId: string): Promise<string[]> {\n const cached = this.store.getCachedMessageList(conversationId);\n const messages = cached ?? (await this.store.loadConversationMessages(conversationId));\n return messages\n .filter((message) => axmMessageCountsTowardUnread(message, currentUserId))\n .map((message) => message.id)\n .filter((id): id is string => Boolean(id?.trim()));\n }\n}\n\n//#endregion\n"],"names":[],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export { a4 as AXMAddReactionCommand, G as AXMAssistSuggestionChipsComponent, a5 as AXMChannelFeedItemComponent, a6 as AXMChannelFeedPage, a7 as AXMChatAnnouncementChannelService, a8 as AXMChatComponent, a9 as AXMChatComposerAssistPickerComponent, T as AXMChatComposerEnsureAssistConversationDirective, W as AXMChatConversationApi, aa as AXMChatEmptyAssistSessionService, V as AXMChatEntityConversationApi, ab as AXMChatEntityConversationFocusHandler, ac as AXMChatEntityConversationRoomQueryService, ad as AXMChatEntityMessageApi, ae as AXMChatEntityRealtimeApi, af as AXMChatEntityUserApi, o as AXMChatMessageApi, ag as AXMChatRealtimeApi, U as AXMChatUserApi, h as AXMCommentComponent, ah as AXMCommentManagementService, ai as AXMCommentPopupComponent, aj as AXMCommentRealtimeService, ak as AXMCommentRealtimeServiceImpl, al as AXMCommentService, am as AXMCommentServiceImpl, an as AXMCommentWidgetViewComponent, ao as AXMConversationAssistBackgroundOperationHandler, A as AXMConversationEntityStoreService, d as AXMConversationFocusService, ap as AXMConversationModule, Z as AXMConversationRealtimeBus, aq as AXMEntityChatService, ar as AXMMiniChatComponent, as as AXMMiniChatFooterDockComponent, at as AXMMiniChatHeaderSlotComponent, au as AXMMiniChatHistoryComponent, av as AXMMiniChatInboxHistoryComponent, aw as AXMMiniChatLauncherComponent, ax as AXMMiniChatPageActionComponent, ay as AXMMiniChatPanelComponent, az as AXMMiniChatPanelService, aA as AXMMiniChatPopupWindowComponent, aB as AXMShowCommentPopupCommand, q as AXM_AI_MANAGEMENT_AGENT_ENTITY_NAME, aC as AXM_AI_MANAGEMENT_ASSIST_ENTITY_NAME, p as AXM_AI_MANAGEMENT_MODULE_NAME, aD as AXM_ASSIST_DEFAULT_RESOLVER_PORT, aE as AXM_ASSIST_TRANSCRIPT_LINE_PAYLOAD_TYPE, aF as AXM_CHAT_ASSIST_CATALOG_PORT, aG as AXM_CHAT_EMPTY_STATE_COMPONENT, aH as AXM_CHAT_SIDEBAR_ACTION_PROVIDER, aI as AXM_CONVERSATION_ASSIST_BACKGROUND_OPERATION_HANDLERS, aJ as AXM_CONVERSATION_ASSIST_BACKGROUND_OPERATION_KEY, a as AXM_CONVERSATION_ASSIST_RESPONSE_PORT, aK as AXM_CONVERSATION_CHAT_ATTACHMENT_CATEGORY, aL as AXM_CONVERSATION_CHAT_ATTACHMENT_REF_TYPE, b as AXM_CONVERSATION_REGULAR_AUTO_REPLY_PORT, aM as AXM_CONVERSATION_TAB_BOT, aN as AXM_ENTITY_LIST_CHAT_ID, aO as AXM_MINI_CHAT_INBOX_CONVERSATION_FILTER, aP as AXM_MINI_CHAT_INBOX_SESSION_KEY, aQ as AXM_MINI_CHAT_POPUP_DOCK, aR as AXM_MINI_CHAT_SCOPE_ENTITY, aS as AXM_MINI_CHAT_SCOPE_METADATA_KEY, aT as AXPCommentWidget, aU as COMMENTS_PAGE_COMPONENT_KEY, aV as CONVERSATION_AFTER_MESSAGE_SENT_COMMAND, aW as CONVERSATION_EMIT_TYPING_INDICATOR_COMMAND, aX as CONVERSATION_MARK_CONVERSATION_UNREAD_COMMAND, aY as CONVERSATION_OPEN_CHAT_COMMAND, aZ as CONVERSATION_RETRY_ASSIST_RESPONSE_COMMAND, a_ as CONVERSATION_SEND_ASSIST_CHAT_MESSAGE_COMMAND, a$ as CONVERSATION_START_ASSIST_CHAT_COMMAND, b0 as CONVERSATION_START_DIRECT_CHAT_COMMAND, b1 as CONVERSATION_SYNC_READ_STATE_COMMAND, b2 as axmApplyAnswerTextToAssistPayloadLine, b3 as axmAssistFollowUpItemsFromUnknown, z as axmAssistHasFinalizeMetadata, b4 as axmAssistLastTranscriptLine, b5 as axmAssistNormalizeFollowUpItemForConversation, b6 as axmAssistNormalizeFollowUpItemsForConversation, b7 as axmAssistPersistedMessageLooksComplete, b8 as axmAssistResolveFollowUpCommandName, b9 as axmAssistStarterPromptChipItems, ba as axmAssistSuggestionIconForLabel, x as axmAssistUserFacingPayloadLine, C as axmAssistUserVisibleItemsForLine, bb as axmAssistWidgetNodeDedupeKey, a3 as axmAssistWidgetNodeFromUnknown, bc as axmBuildAiChatConversationMetadata, bd as axmBuildAssistPeerParticipantFromCreateData, be as axmBuildAssistPeerParticipantFromId, bf as axmBuildAssistTranscriptLinePayload, bg as axmBuildAutoTitleFromUserText, bh as axmBuildEntityChatConversationMetadata, bi as axmBuildEntityChatRoomEntityRef, bj as axmChatAiPeerParticipantId, bk as axmChatAiTargetAvatarUrl, bl as axmChatAiTargetDisplayDescription, bm as axmChatAiTargetDisplayName, bn as axmChatAiTargetShortcutDescriptionKey, k as axmChatRenderableAssistWidgetNode, bo as axmCoerceDate, bp as axmCoerceTimestampMs, bq as axmComputeConversationUnreadCount, c as axmConversationHasAiChat, br as axmConversationIsEntityChat, bs as axmConversationMatchesEntity, bt as axmEntityRefFromLaunchContext, bu as axmExcludeEntityChatConversations, bv as axmExtractAssistIdFromMetadata, bw as axmExtractAssistSnapshotFromMetadata, bx as axmExtractDirectAgentIdFromMetadata, by as axmExtractEntityRefFromMetadata, bz as axmExtractModelEntityIdFromMetadata, bA as axmExtractTextFromPayload, bB as axmFilterChatAiTargets, bC as axmFlattenConversationCreateMetadata, bD as axmHydrateRealtimeConversationMessage, bE as axmInboxConversationTab, bF as axmIsAssistBotConversation, bG as axmIsAssistPeerParticipant, bH as axmIsAssistResponseMessage, s as axmIsAssistRetryableStatus, bI as axmIsAssistStreamingMessage, y as axmIsAssistStreamingStatus, bJ as axmIsAssistTerminalStatus, bK as axmIsUnsupportedLegacyAgentAssistConversation, bL as axmLoadChatAiTargets, f as axmMessageCountsTowardUnread, bM as axmMessageEntityToMessage, bN as axmNormalizeAssistTranscriptForChatUi, bO as axmNormalizeAssistTranscriptLineResponses, v as axmParseAssistTranscriptLinePayload, m as axmParseAssistTranscriptTextEnvelope, l as axmPartitionAssistAnswerText, bP as axmPreferLocalUnreadCount, u as axmReadAssistAiTranscript, w as axmReadAssistAiTranscriptRaw, D as axmReadAssistFollowUpStatus, t as axmReadAssistResponseError, r as axmReadAssistResponseStatus, E as axmReadPlainTextMessagePayload, bQ as axmReadReplyToUserMessageId, bR as axmRemoveMiniChatHistoryItem, bS as axmResolveAssistFinalAnswerText, bT as axmResolveChatAiTargetText, bU as axmRoomEntityToConversation, bV as axmRoomIsEntityChat, bW as axmRoomMatchesEntity, bX as axmRoomWithAssistPeerDisplayName, B as axmSanitizeAssistUserAnswerText, bY as axmShouldPreferPersistedAssistOverLiveCache, bZ as axmShowCommentPopupCommandDefinition, b_ as axmSortMessagesNewestFirst, b$ as axmSyncAssistPeerDisplayName, j as axmSyntheticEmbedMessage, c0 as axmUpsertMiniChatHistoryItem, c1 as axmUserRowToParticipant, c2 as channelFeedPageRoutes, c3 as commentsPlugin, c4 as createConversationServiceSessionAdapter, c5 as persistChatAttachment } from './acorex-platform-module-conversation-client-acorex-platform-module-conversation-client-DUR2oyfP.mjs';
|
|
2
2
|
//# sourceMappingURL=acorex-platform-module-conversation-client.mjs.map
|