@acorex-platform/module-conversation-client 0.0.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/fesm2022/acorex-platform-module-conversation-client-acorex-platform-module-conversation-client-DsjrXRZ6.mjs +12766 -0
  2. package/fesm2022/acorex-platform-module-conversation-client-acorex-platform-module-conversation-client-DsjrXRZ6.mjs.map +1 -0
  3. package/fesm2022/acorex-platform-module-conversation-client-after-message-sent.command-D-DZ9ylV.mjs +35 -0
  4. package/fesm2022/acorex-platform-module-conversation-client-after-message-sent.command-D-DZ9ylV.mjs.map +1 -0
  5. package/fesm2022/acorex-platform-module-conversation-client-assist-delegated-agent-detail-popup.component-BfjJCQ-e.mjs +492 -0
  6. package/fesm2022/acorex-platform-module-conversation-client-assist-delegated-agent-detail-popup.component-BfjJCQ-e.mjs.map +1 -0
  7. package/fesm2022/acorex-platform-module-conversation-client-assist-tool-detail-popup.component-GC58B_n0.mjs +120 -0
  8. package/fesm2022/acorex-platform-module-conversation-client-assist-tool-detail-popup.component-GC58B_n0.mjs.map +1 -0
  9. package/fesm2022/acorex-platform-module-conversation-client-chat-call-session-page.component-DkX4JSbN.mjs +871 -0
  10. package/fesm2022/acorex-platform-module-conversation-client-chat-call-session-page.component-DkX4JSbN.mjs.map +1 -0
  11. package/fesm2022/acorex-platform-module-conversation-client-chat-call-start-popup.component-D4go5xbr.mjs +89 -0
  12. package/fesm2022/acorex-platform-module-conversation-client-chat-call-start-popup.component-D4go5xbr.mjs.map +1 -0
  13. package/fesm2022/acorex-platform-module-conversation-client-chat-conversation-info-media-view.component-BVJdVPke.mjs +108 -0
  14. package/fesm2022/acorex-platform-module-conversation-client-chat-conversation-info-media-view.component-BVJdVPke.mjs.map +1 -0
  15. package/fesm2022/acorex-platform-module-conversation-client-comments-page.component-Bq4SdK0_.mjs +83 -0
  16. package/fesm2022/acorex-platform-module-conversation-client-comments-page.component-Bq4SdK0_.mjs.map +1 -0
  17. package/fesm2022/acorex-platform-module-conversation-client-contracts.mjs +225 -0
  18. package/fesm2022/acorex-platform-module-conversation-client-contracts.mjs.map +1 -0
  19. package/fesm2022/acorex-platform-module-conversation-client-emit-typing-indicator.command-BzsN1_ns.mjs +29 -0
  20. package/fesm2022/acorex-platform-module-conversation-client-emit-typing-indicator.command-BzsN1_ns.mjs.map +1 -0
  21. package/fesm2022/acorex-platform-module-conversation-client-mark-conversation-unread.command-BlYDwGVe.mjs +30 -0
  22. package/fesm2022/acorex-platform-module-conversation-client-mark-conversation-unread.command-BlYDwGVe.mjs.map +1 -0
  23. package/fesm2022/acorex-platform-module-conversation-client-open-chat.command-B03q60Qx.mjs +42 -0
  24. package/fesm2022/acorex-platform-module-conversation-client-open-chat.command-B03q60Qx.mjs.map +1 -0
  25. package/fesm2022/acorex-platform-module-conversation-client-retry-assist-response.command-BQLK6F69.mjs +34 -0
  26. package/fesm2022/acorex-platform-module-conversation-client-retry-assist-response.command-BQLK6F69.mjs.map +1 -0
  27. package/fesm2022/acorex-platform-module-conversation-client-start-direct-chat.command-CfSIVHDu.mjs +80 -0
  28. package/fesm2022/acorex-platform-module-conversation-client-start-direct-chat.command-CfSIVHDu.mjs.map +1 -0
  29. package/fesm2022/acorex-platform-module-conversation-client-sync-read-state.command-B1Z_gZ6O.mjs +142 -0
  30. package/fesm2022/acorex-platform-module-conversation-client-sync-read-state.command-B1Z_gZ6O.mjs.map +1 -0
  31. package/fesm2022/acorex-platform-module-conversation-client.mjs +2 -0
  32. package/fesm2022/acorex-platform-module-conversation-client.mjs.map +1 -0
  33. package/package.json +28 -0
  34. package/types/acorex-platform-module-conversation-client-contracts.d.ts +497 -0
  35. package/types/acorex-platform-module-conversation-client.d.ts +1614 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"acorex-platform-module-conversation-client-acorex-platform-module-conversation-client-DsjrXRZ6.mjs","sources":["../../../../libs/modules/conversation/client/src/lib/features/commands/conversation-command.keys.ts","../../../../libs/modules/conversation/client/src/lib/features/user-card/conversation-user-card-items.hook.ts","../../../../libs/modules/conversation/client/src/lib/manifest.ts","../../../../libs/modules/conversation/client/src/lib/badge.provider.ts","../../../../libs/modules/conversation/client/src/lib/menu.provider.ts","../../../../libs/modules/conversation/client/src/lib/permission-definition.provider.ts","../../../../libs/modules/conversation/client/src/lib/features/background-operation/conversation-assist-background-operation.keys.ts","../../../../libs/modules/conversation/client/src/lib/features/background-operation/conversation-assist-background-operation.handler.ts","../../../../libs/modules/conversation/client/src/lib/features/chat/plugins/services/chat-conversation-apis.abstract.ts","../../../../libs/modules/conversation/client/src/lib/features/chat/plugins/composer/chat-voice-recorder.component.ts","../../../../libs/modules/conversation/client/src/lib/features/chat/plugins/composer/chat-voice-recording-composer.action.ts","../../../../libs/modules/conversation/client/src/lib/features/chat/plugins/actions/assist-chat-debug-mode.service.ts","../../../../libs/modules/conversation/client/src/lib/features/chat/services/chat-assist-catalog.port.ts","../../../../libs/modules/conversation/client/src/lib/features/chat/plugins/utils/ai-management.constants.ts","../../../../libs/modules/conversation/client/src/lib/features/chat/plugins/utils/chat-ai-target.util.ts","../../../../libs/modules/conversation/client/src/lib/features/chat/plugins/ports/assist-default-resolver.port.ts","../../../../libs/modules/conversation/client/src/lib/features/mini-chat/entity-chat.util.ts","../../../../libs/modules/conversation/client/src/lib/features/mini-chat/entity-chat.service.ts","../../../../libs/modules/conversation/client/src/lib/features/chat/plugins/utils/assist-starter-prompt-send.util.ts","../../../../libs/modules/conversation/client/src/lib/features/chat/plugins/utils/assist-suggestion-chips.util.ts","../../../../libs/modules/conversation/client/src/lib/features/chat/plugins/shared/assist-suggestion-chips.component.ts","../../../../libs/modules/conversation/client/src/lib/features/chat/plugins/utils/assist-bot-transcript.util.ts","../../../../libs/modules/conversation/client/src/lib/features/chat/plugins/utils/assist-delegated-agent-detail.dialog.ts","../../../../libs/modules/conversation/client/src/lib/features/chat/plugins/utils/assist-tool-detail.dialog.ts","../../../../libs/modules/conversation/client/src/lib/features/chat/plugins/utils/assist-response-status.util.ts","../../../../libs/modules/conversation/client/src/lib/features/chat/plugins/utils/assist-segment-direction.util.ts","../../../../libs/modules/conversation/client/src/lib/features/chat/plugins/utils/chat-avatar.util.ts","../../../../libs/modules/conversation/client/src/lib/features/chat/plugins/utils/assist-metadata.util.ts","../../../../libs/modules/conversation/client/src/lib/features/chat/plugins/utils/assist-peer-participant.util.ts","../../../../libs/modules/conversation/client/src/lib/features/chat/plugins/utils/assist-conversation-title.util.ts","../../../../libs/modules/conversation/client/src/lib/features/chat/plugins/utils/conversation-time.util.ts","../../../../libs/modules/conversation/client/src/lib/features/chat/plugins/services/entity/chat-entity-mapper.util.ts","../../../../libs/modules/conversation/client/src/lib/features/chat/plugins/utils/conversation-unread.util.ts","../../../../libs/modules/conversation/client/src/lib/features/chat/services/conversation-realtime.bus.ts","../../../../libs/modules/conversation/client/src/lib/features/chat/services/conversation-entity-store.service.ts","../../../../libs/modules/conversation/client/src/lib/features/chat/services/conversation-focus.service.ts","../../../../libs/modules/conversation/client/src/lib/features/chat/plugins/message-renderers/assist-bot-audio-line.component.ts","../../../../libs/modules/conversation/client/src/lib/features/chat/plugins/message-renderers/assist-bot-image-line.component.ts","../../../../libs/modules/conversation/client/src/lib/features/chat/plugins/message-renderers/assist-bot-file-line.component.ts","../../../../libs/modules/conversation/client/src/lib/features/chat/plugins/message-renderers/node-message-renderer.component.ts","../../../../libs/modules/conversation/client/src/lib/features/chat/plugins/message-renderers/assist-message-renderer.component.ts","../../../../libs/modules/conversation/client/src/lib/features/chat/plugins/message-renderers/assist-message-renderer.component.html","../../../../libs/modules/conversation/client/src/lib/features/chat/plugins/message-renderers/assist-message-renderer.plugin.ts","../../../../libs/modules/conversation/client/src/lib/features/chat/plugins/call/chat-call-log.util.ts","../../../../libs/modules/conversation/client/src/lib/features/chat/plugins/message-renderers/chat-call-log-message-renderer.component.ts","../../../../libs/modules/conversation/client/src/lib/features/chat/plugins/message-renderers/chat-call-log-message-renderer.plugin.ts","../../../../libs/modules/conversation/client/src/lib/features/chat/plugins/message-renderers/node-message-renderer.plugin.ts","../../../../libs/modules/conversation/client/src/lib/features/chat/plugins/utils/conversation-list-sort.util.ts","../../../../libs/modules/conversation/client/src/lib/features/chat/plugins/utils/conversation-participant.util.ts","../../../../libs/modules/conversation/client/src/lib/features/chat/utils/pagination.utils.ts","../../../../libs/modules/conversation/client/src/lib/features/chat/plugins/services/entity/chat-entity-user.api.ts","../../../../libs/modules/conversation/client/src/lib/features/chat/services/conversation-assist-response.port.ts","../../../../libs/modules/conversation/client/src/lib/features/chat/plugins/services/entity/chat-entity-conversation-focus.handler.ts","../../../../libs/modules/conversation/client/src/lib/features/chat/plugins/services/entity/chat-entity-conversation-room-query.service.ts","../../../../libs/modules/conversation/client/src/lib/features/chat/plugins/services/entity/chat-entity-conversation.api.ts","../../../../libs/modules/conversation/client/src/lib/features/chat/plugins/services/entity/chat-entity-message.api.ts","../../../../libs/modules/conversation/client/src/lib/features/chat/plugins/services/entity/chat-entity-realtime.api.ts","../../../../libs/modules/conversation/client/src/lib/features/chat/plugins/tabs/chat-conversation-tabs.ts","../../../../libs/modules/conversation/client/src/lib/features/chat/services/conversation-service-session.adapter.ts","../../../../libs/modules/conversation/client/src/lib/features/chat/services/conversation-session-sync.service.ts","../../../../libs/modules/conversation/client/src/lib/features/chat/services/conversation-typing-sync.service.ts","../../../../libs/modules/conversation/client/src/lib/features/chat/plugins/call/chat-call-rtc-ready.util.ts","../../../../libs/modules/conversation/client/src/lib/features/chat/plugins/call/chat-call-popup-theme.util.ts","../../../../libs/modules/conversation/client/src/lib/features/chat/plugins/call/open-chat-call-start.dialog.ts","../../../../libs/modules/conversation/client/src/lib/features/chat/plugins/info-bar-actions/chat-info-bar-assist-model-action.component.ts","../../../../libs/modules/conversation/client/src/lib/features/chat/plugins/info-bar-actions/chat-info-bar-debug-switch.component.ts","../../../../libs/modules/conversation/client/src/lib/features/chat/plugins/info-bar-actions/chat-info-bar-actions.ts","../../../../libs/modules/conversation/client/src/lib/features/chat/chat-conversation.providers.ts","../../../../libs/modules/conversation/client/src/lib/features/mini-chat/mini-chat-history.component.ts","../../../../libs/modules/conversation/client/src/lib/features/mini-chat/mini-chat-inbox-filter.provider.ts","../../../../libs/modules/conversation/client/src/lib/features/mini-chat/mini-chat-inbox-history.component.ts","../../../../libs/modules/conversation/client/src/lib/features/chat/plugins/utils/assist-initial-messages-lite.util.ts","../../../../libs/modules/conversation/client/src/lib/features/chat/plugins/empty-state/chat-message-list-empty-fallback.component.ts","../../../../libs/modules/conversation/client/src/lib/features/chat/plugins/composer/chat-assist-composer-starter-prompts.component.ts","../../../../libs/modules/conversation/client/src/lib/features/chat/plugins/empty-state/chat-empty-state.provider.ts","../../../../libs/modules/conversation/client/src/lib/features/chat/plugins/empty-state/chat-empty-state-fallback.component.ts","../../../../libs/modules/conversation/client/src/lib/features/chat/plugins/empty-state/chat-empty-state-host.component.ts","../../../../libs/modules/conversation/client/src/lib/features/mini-chat/mini-chat.component.ts","../../../../libs/modules/conversation/client/src/lib/features/mini-chat/mini-chat.component.html","../../../../libs/modules/conversation/client/src/lib/features/mini-chat/mini-chat-panel.component.ts","../../../../libs/modules/conversation/client/src/lib/features/mini-chat/mini-chat-panel.component.html","../../../../libs/modules/conversation/client/src/lib/features/mini-chat/mini-chat-inbox-panel-host.component.ts","../../../../libs/modules/conversation/client/src/lib/features/mini-chat/mini-chat-panel.types.ts","../../../../libs/modules/conversation/client/src/lib/features/mini-chat/mini-chat-panel.service.ts","../../../../libs/modules/conversation/client/src/lib/features/chat/plugins/info-bar/chat-conversation-info-panel.component.ts","../../../../libs/modules/conversation/client/src/lib/features/chat/plugins/info-bar/chat-conversation-info-panel.component.html","../../../../libs/modules/conversation/client/src/lib/features/chat/plugins/side-bar/chat-sidebar-action.provider.ts","../../../../libs/modules/conversation/client/src/lib/features/chat/plugins/side-bar/chat-sidebar-new-actions.component.ts","../../../../libs/modules/conversation/client/src/lib/features/chat/chat.component.ts","../../../../libs/modules/conversation/client/src/lib/features/chat/chat.component.html","../../../../libs/modules/conversation/client/src/lib/features/chat/plugins/services/chat-attachment-persist.ts","../../../../libs/modules/conversation/client/src/lib/features/chat/services/conversation-regular-auto-reply.port.ts","../../../../libs/modules/conversation/client/src/lib/features/comment/comment-payload.util.ts","../../../../libs/modules/conversation/client/src/lib/features/comment/comment.service.ts","../../../../libs/modules/conversation/client/src/lib/features/comment/comment-realtime.service.ts","../../../../libs/modules/conversation/client/src/lib/features/comment/comment-management.service.ts","../../../../libs/modules/conversation/client/src/lib/features/comment/comment-notification.helper.ts","../../../../libs/modules/conversation/client/src/lib/features/comment/comment.component.ts","../../../../libs/modules/conversation/client/src/lib/features/comment/comment.component.html","../../../../libs/modules/conversation/client/src/lib/features/comment/comments.plugin.ts","../../../../libs/modules/conversation/client/src/lib/features/comment/commands/add-reaction.command.ts","../../../../libs/modules/conversation/client/src/lib/features/comment/commands/show-comment-popup.command.ts","../../../../libs/modules/conversation/client/src/lib/features/comment/commands/show-comment-popup.command.definition.ts","../../../../libs/modules/conversation/client/src/lib/features/comment/popup/comment-popup.component.ts","../../../../libs/modules/conversation/client/src/lib/features/comment/popup/comment-popup.component.html","../../../../libs/modules/conversation/client/src/lib/features/comment/widget/comment-widget-view.component.ts","../../../../libs/modules/conversation/client/src/lib/features/comment/widget/comment-widget.config.ts","../../../../libs/modules/conversation/client/src/lib/features/mini-chat/mini-chat-header-slot.component.ts","../../../../libs/modules/conversation/client/src/lib/features/mini-chat/mini-chat-header-slot.component.html","../../../../libs/modules/conversation/client/src/lib/features/mini-chat/mini-chat-launcher.component.ts","../../../../libs/modules/conversation/client/src/lib/features/chat/plugins/call/chat-call-rtc-connect.util.ts","../../../../libs/modules/conversation/client/src/lib/features/chat/plugins/call/chat-call-room.names.ts","../../../../libs/modules/conversation/client/src/lib/features/chat/plugins/call/chat-call-rtc.service.ts","../../../../libs/modules/conversation/client/src/lib/features/chat/services/conversation-realtime-handlers.providers.ts","../../../../libs/modules/conversation/client/src/lib/features/chat/services/conversation-chat-notification.util.ts","../../../../libs/modules/conversation/client/src/lib/features/chat/services/conversation-chat-notification-realtime.providers.ts","../../../../libs/modules/conversation/client/src/lib/features/chat/services/conversation-realtime-connection.providers.ts","../../../../libs/modules/conversation/client/src/lib/features/chat/plugins/call/chat-call-events.service.ts","../../../../libs/modules/conversation/client/src/lib/features/chat/plugins/call/chat-call-rtc-signal.types.ts","../../../../libs/modules/conversation/client/src/lib/features/chat/plugins/call/open-chat-call-session.dialog.ts","../../../../libs/modules/conversation/client/src/lib/features/chat/plugins/call/chat-call-rtc-signal-inbox.service.ts","../../../../libs/modules/conversation/client/src/lib/features/chat/services/conversation-call-realtime.providers.ts","../../../../libs/modules/conversation/client/src/lib/features/comment/comments-page/comments-page-component.provider.ts","../../../../libs/modules/conversation/client/src/lib/widget-definition.provider.ts","../../../../libs/modules/conversation/client/src/lib/features/chat/plugins/services/uploader/chat-uploader.util.ts","../../../../libs/modules/conversation/client/src/lib/features/chat/plugins/services/uploader/chat-uploader.service.ts","../../../../libs/modules/conversation/client/src/lib/conversation.module.ts","../../../../libs/modules/conversation/client/src/acorex-platform-module-conversation-client.ts"],"sourcesContent":["/** Fired after a user message is persisted — triggers assist, auto-reply, and realtime side effects. */\nexport const CONVERSATION_AFTER_MESSAGE_SENT_COMMAND = 'Conversation:AfterMessageSent';\n\n/** Re-runs AI generation for a failed/incomplete assist placeholder. */\nexport const CONVERSATION_RETRY_ASSIST_RESPONSE_COMMAND = 'Conversation:RetryAssistResponse';\n\n/** Marks conversation messages read and syncs chat notifications. */\nexport const CONVERSATION_SYNC_READ_STATE_COMMAND = 'Conversation:SyncReadState';\n\n/** Marks a conversation as having unread messages. */\nexport const CONVERSATION_MARK_CONVERSATION_UNREAD_COMMAND = 'Conversation:MarkConversationUnread';\n\n/** Sends or clears a typing indicator for the current user. */\nexport const CONVERSATION_EMIT_TYPING_INDICATOR_COMMAND = 'Conversation:EmitTypingIndicator';\n\n/** Starts a new bot conversation with the given AI assist model. */\nexport const CONVERSATION_START_ASSIST_CHAT_COMMAND = 'Conversation:StartAssistChat';\n\n/** Sends a user text message in the active assist chat, or starts a chat when {@code assistId} is provided. */\nexport const CONVERSATION_SEND_ASSIST_CHAT_MESSAGE_COMMAND = 'Conversation:SendAssistChatMessage';\n\n/** Starts or reuses a private chat with another user and navigates to the conversation. */\nexport const CONVERSATION_START_DIRECT_CHAT_COMMAND = 'Conversation:StartDirectChat';\n\n/** Opens an existing conversation in the chat app. */\nexport const CONVERSATION_OPEN_CHAT_COMMAND = 'Conversation:OpenChat';\n","import { AXPSessionService } from '@acorex-platform/framework-client/auth';\nimport { AXPDistributedEventListenerProvider } from '@acorex-platform/framework-client/core';\nimport {\n USER_CARD_ITEMS_HOOK,\n type AXPUserCardItemsPayload,\n} from '@acorex-platform/framework-client/layout/components';\nimport { inject } from '@angular/core';\n\nimport { CONVERSATION_START_DIRECT_CHAT_COMMAND } from '../commands/conversation-command.keys';\n\n//#region ----- Conversation user-card items -----\n\n/** Contributes a Message CTA that starts a private chat with the card's user. */\nexport const ConversationUserCardItemsHookProvider: AXPDistributedEventListenerProvider<\n AXPUserCardItemsPayload,\n AXPUserCardItemsPayload\n> = {\n key: USER_CARD_ITEMS_HOOK,\n priority: 10,\n execute: (payload) => {\n const userId = payload.userId?.trim();\n if (!userId) {\n return payload;\n }\n\n const sessionService = inject(AXPSessionService);\n // Hide Message on the signed-in user's own card — there is no self-chat.\n if (sessionService.user?.id === userId) {\n return payload;\n }\n\n return {\n ...payload,\n actions: [\n ...payload.actions,\n {\n name: 'conversation.start-direct-chat',\n title: '@conversation:chat.user-card.message',\n icon: 'fa-light fa-message',\n priority: 10,\n command: {\n name: CONVERSATION_START_DIRECT_CHAT_COMMAND,\n options: { userId },\n },\n },\n ],\n };\n },\n};\n\n//#endregion\n","//#region ---- Imports ----\n\nimport { AXPModuleManifest } from '@acorex-platform/framework-client/core';\nimport { RootConfig } from '@acorex-platform/module-conversation-client/contracts';\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","//#region ----- Imports -----\n\nimport { AXConversationService } from '@acorex/components/conversation';\nimport { AXPTaskBadgeProvider } from '@acorex-platform/framework-client/layout/components';\nimport { computed, inject, Injectable } from '@angular/core';\n\n//#endregion\n\n//#region ----- Constants -----\n\n/** Menu `badgeKey` for Conversations unread count. */\nexport const AXM_CHAT_BADGE_KEY = 'badge-chat';\n\n//#endregion\n\n//#region ----- Task badge provider -----\n\n/**\n * Live unread chat count for the side menu and the mobile chat back control.\n * Sums `unreadCount` across loaded conversations (Telegram-style total, not chat count).\n */\n@Injectable()\nexport class AXMChatBadgeProvider extends AXPTaskBadgeProvider {\n //#region ----- Services & Dependencies -----\n\n private readonly conversationService = inject(AXConversationService);\n\n //#endregion\n\n //#region ----- Signals & Properties -----\n\n readonly key = AXM_CHAT_BADGE_KEY;\n\n readonly count = computed(() =>\n this.conversationService\n .conversations()\n .reduce((sum, conversation) => sum + Math.max(0, conversation.unreadCount ?? 0), 0),\n );\n\n //#endregion\n}\n\n//#endregion\n","import { AXPSessionService } from '@acorex-platform/framework-client/auth';\nimport { AXPMenuProvider, AXPMenuProviderContext } from '@acorex-platform/framework-client/common';\nimport { Injectable, inject } from '@angular/core';\nimport {\n RootConfig,\n AXPCollaborationPermissionKeys,\n AXPConversationMenuKeys,\n} from '@acorex-platform/module-conversation-client/contracts';\nimport { AXM_CHAT_BADGE_KEY } from './badge.provider';\n\n\n@Injectable()\nexport class AXMMenuProvider implements AXPMenuProvider {\n private sessionService = inject(AXPSessionService);\n\n async provide(context: AXPMenuProviderContext): Promise<void> {\n const module = RootConfig;\n const scope = RootConfig.config.i18n;\n\n context.addItems([\n {\n name: AXPConversationMenuKeys.Conversations,\n text: `@conversation:module.menus.conversations.title`,\n path: `${this.sessionService.application?.name}/${module.config.route}`,\n priority: 2,\n icon: RootConfig.entities.room.icon,\n badgeKey: AXM_CHAT_BADGE_KEY,\n policy: {\n features: [module.module.name],\n permissions: [AXPCollaborationPermissionKeys.MaintainConversations],\n },\n },\n ]);\n }\n}\n","//#region ----- Imports -----\n\nimport {\n AXPPermissionDefinitionProvider,\n AXPPermissionDefinitionProviderContext,\n} from '@acorex-platform/framework-client/auth';\nimport {\n AXPCommonPermissionGroupKeys\n} from '@acorex-platform/module-common-client/contracts';\nimport {\n AXPCollaborationPermissionKeys\n} from '@acorex-platform/module-conversation-client/contracts';\n\nimport { Injectable } from '@angular/core';\n\n//#endregion\n\n//#region ----- Permission Definition Provider -----\n\n/**\n * Registers Collaboration capabilities owned by conversation.\n */\n@Injectable()\nexport class AXMPermissionDefinitionProvider implements AXPPermissionDefinitionProvider {\n async define(context: AXPPermissionDefinitionProviderContext): Promise<void> {\n const keys = AXPCollaborationPermissionKeys;\n const groups = AXPCommonPermissionGroupKeys;\n const P = '@common:collaboration.permissions';\n const G = '@common:permission-groups';\n\n context.addGroup(groups.Collaboration.Root, `${G}.collaboration.title`, `${G}.collaboration.description`, { order: 80 });\n\n context\n .addGroup(\n groups.Collaboration.Conversations,\n `${G}.collaboration-conversations.title`,\n `${G}.collaboration-conversations.description`,\n { parent: groups.Collaboration.Root, order: 10 },\n )\n .addPermission(keys.Access, `${P}.access.title`, `${P}.access.description`)\n .endPermission()\n .addPermission(\n keys.MaintainConversations,\n `${P}.maintain-conversations.title`,\n `${P}.maintain-conversations.description`,\n )\n .endPermission()\n .addPermission(keys.Setup, `${P}.setup.title`, `${P}.setup.description`)\n .endPermission()\n .endGroup();\n }\n}\n\n//#endregion\n","//#region ---- Keys ----\n\nexport const AXM_CONVERSATION_ASSIST_BACKGROUND_OPERATION_KEY = 'conversation-ai-assist';\n\n//#endregion\n","//#region ---- Imports ----\n\nimport { AXConversationService } from '@acorex/components/conversation';\nimport {\n AXP_BACKGROUND_OPERATION_HANDLERS,\n AXPBackgroundOperationHandler,\n type AXPBackgroundOperation,\n} from '@acorex-platform/framework-client/common';\nimport { AXPExecuteCommand } from '@acorex-platform/framework-shared/core';\nimport { AXPSessionService } from '@acorex-platform/framework-client/auth';\nimport { Injectable, Provider, inject } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { get } from 'lodash';\nimport { AXM_CONVERSATION_ASSIST_BACKGROUND_OPERATION_KEY } from './conversation-assist-background-operation.keys';\n\n//#endregion\n\n//#region ---- Handler ----\n\n@Injectable()\nexport class AXMConversationAssistBackgroundOperationHandler extends AXPBackgroundOperationHandler {\n readonly providerKey = AXM_CONVERSATION_ASSIST_BACKGROUND_OPERATION_KEY;\n\n private readonly router = inject(Router);\n private readonly chatService = inject(AXConversationService);\n private readonly sessionService = inject(AXPSessionService);\n private readonly activatedRoute = inject(ActivatedRoute);\n\n async execute(command: AXPExecuteCommand, operation: AXPBackgroundOperation): Promise<void> {\n const conversationId = get(operation.data, 'conversationId');\n if (typeof conversationId !== 'string' || !conversationId.trim()) {\n console.error('conversationId is missing from assist background operation data.');\n return;\n }\n\n const app =\n this.activatedRoute.snapshot.firstChild?.paramMap.get('app') ||\n this.sessionService.application?.name ||\n 'platform';\n\n switch (command.name) {\n case 'click':\n await this.chatService.markAsRead(conversationId);\n await this.router.navigate([app, 'chat', conversationId]);\n break;\n default:\n break;\n }\n }\n}\n\n//#endregion\n\n//#region ---- Providers ----\n\nexport const AXM_CONVERSATION_ASSIST_BACKGROUND_OPERATION_HANDLERS: Provider[] = [\n {\n provide: AXP_BACKGROUND_OPERATION_HANDLERS,\n useExisting: AXMConversationAssistBackgroundOperationHandler,\n multi: true,\n },\n AXMConversationAssistBackgroundOperationHandler,\n];\n\n//#endregion\n","//#region ---- Imports ----\n\nimport {\n AXConversation,\n AXConversationApi,\n AXConversationMessage,\n AXConversationMessageApi,\n AXConversationRealtimeApi,\n AXConversationUserApi,\n} from '@acorex/components/conversation';\nimport { Injectable } from '@angular/core';\n\n//#endregion\n\n//#region ---- Chat API tokens (mock or production implementations) ----\n\n/** User profile, discovery, and presence for conversation chat. */\n@Injectable()\nexport abstract class AXMChatUserApi extends AXConversationUserApi {}\n\n/** Conversation CRUD, participants, and inbox for conversation chat. */\n@Injectable()\nexport abstract class AXMChatConversationApi extends AXConversationApi {\n /** Reports which conversation thread is open in chat UI (mock uses this for notifications). */\n reportFocusedConversation(_conversationId: string | null): void {\n // Production connectivity: no-op unless overridden.\n }\n\n /**\n * Returns every conversation bound to the given entity reference (entity-scoped mini chats).\n * Bypasses the regular inbox filtering so entity chats remain discoverable per entity.\n */\n abstract findEntityConversations(entityType: string, entityId: string): Promise<AXConversation[]>;\n}\n\n/** Message CRUD, reactions, and assist replies for conversation chat. */\n@Injectable()\nexport abstract class AXMChatMessageApi extends AXConversationMessageApi {\n /**\n * Re-runs AI generation for an incomplete or failed assist placeholder.\n * Reuses the same message id so the conversation timeline stays ordered.\n */\n abstract retryAssistResponse(conversationId: string, messageId: string): Promise<AXConversationMessage>;\n}\n\n/** Realtime streams (messages, typing, presence) for conversation chat. */\n@Injectable()\nexport abstract class AXMChatRealtimeApi extends AXConversationRealtimeApi {}\n\n//#endregion\n","//#region ---- Imports ----\n\nimport { AXButtonModule } from '@acorex/components/button';\nimport {\n AXConversationComposerService,\n AXConversationService,\n type AXConversationComposerActionComponent,\n type AXConversation,\n} from '@acorex/components/conversation';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { AXLabelModule } from '@acorex/components/label';\nimport { AXLoadingModule } from '@acorex/components/loading';\nimport { AXToastService } from '@acorex/components/toast';\nimport { AXTranslationModule, AXTranslationService } from '@acorex/core/translation';\nimport {\n AIMANAGEMENT_CHAT_TRANSCRIBE_SPEECH_COMMAND_KEY,\n AIMANAGEMENT_STRUCTURED_TEXT_COMPLETION_COMMAND_KEY,\n AXPAiChatToolRunContextService,\n AXPAiManagerService,\n AXPAiPlatformRuntimeContextBuilder,\n axpAiChatTextMessage,\n persistAiChatAttachmentImage,\n type AXPAiPlatformRuntimeContext,\n} from '@acorex-platform/module-ai-management-client';\nimport { AXPFileStorageService } from '@acorex-platform/framework-client/common';\nimport { AXPCommandService } from '@acorex-platform/framework-client/runtime';\nimport { runtimeCommandPayloadData } from '@acorex-platform/framework-shared/core';\nimport { CommonModule, isPlatformBrowser } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n Injector,\n PLATFORM_ID,\n computed,\n inject,\n input,\n output,\n signal,\n} from '@angular/core';\n\n//#endregion\n\n//#region ---- Constants ----\n\n/** Platform AiAgent catalog id for the speech-to-text specialist (see connectivity agent mock seed). */\nconst AXM_SPEECH_TO_TEXT_AGENT_ID = 'c0000001-0000-4000-8000-000000000006';\n\n//#endregion\n\n//#region ---- Component ----\n\n@Component({\n selector: 'axm-chat-voice-recorder',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [CommonModule, AXButtonModule, AXDecoratorModule, AXLabelModule, AXLoadingModule, AXTranslationModule],\n template: `\n <div class=\"voice-recorder\">\n <div class=\"recorder-header\">\n <h3 class=\"recorder-title\">{{ '@acorex:chat.voice-recorder.title' | translate | async }}</h3>\n <button\n type=\"button\"\n class=\"close-button\"\n (click)=\"cancel()\"\n [attr.aria-label]=\"'@acorex:chat.actions.close' | translate | async\"\n >\n <i class=\"fa-light fa-xmark\"></i>\n </button>\n </div>\n\n <div class=\"recorder-content\">\n @if (isTranscribing()) {\n <div class=\"recorder-transcribing\">\n <ax-loading></ax-loading>\n <span class=\"recorder-transcribing-text\">{{\n '@acorex:chat.voice-recorder.transcribing' | translate | async\n }}</span>\n </div>\n } @else if (!isRecording()) {\n <div class=\"recorder-idle\">\n <button type=\"button\" class=\"record-button\" (click)=\"startRecording()\">\n <i class=\"fa-light fa-microphone\"></i>\n </button>\n <!-- <button\n type=\"button\"\n class=\"speech-to-text-button\"\n [disabled]=\"isTranscribing()\"\n (click)=\"applySpeechToText()\"\n [attr.aria-label]=\"'@conversation:chat.speech-to-text.action' | translate | async\"\n >\n <i class=\"fa-light fa-waveform-lines\"></i>\n </button> -->\n <span class=\"recorder-hint\">{{ '@acorex:chat.voice-recorder.tap-to-start' | translate | async }}</span>\n </div>\n } @else {\n <div class=\"recorder-active\">\n <div class=\"recorder-info\">\n <div class=\"recording-indicator\">\n <span class=\"pulse-dot\"></span>\n <span class=\"recording-text\">{{ '@acorex:chat.voice-recorder.recording' | translate | async }}</span>\n </div>\n <div class=\"recording-time\">{{ formattedTime() }}</div>\n </div>\n\n <div class=\"recorder-actions\">\n <ax-button\n [text]=\"translation.translateSync('@acorex:chat.actions.cancel')\"\n [look]=\"'ghost'\"\n (onClick)=\"cancelRecording()\"\n >\n <ax-prefix>\n <ax-icon><i class=\"fa-light fa-xmark\"></i></ax-icon>\n </ax-prefix>\n </ax-button>\n\n <ax-button\n [text]=\"translation.translateSync('@acorex:chat.actions.send')\"\n color=\"'primary'\"\n (onClick)=\"stopRecording()\"\n >\n <ax-prefix>\n <ax-icon><i class=\"fa-light fa-paper-plane\"></i></ax-icon>\n </ax-prefix>\n </ax-button>\n\n <ax-button\n [text]=\"translation.translateSync('@acorex:chat.actions.speach-to-text')\"\n color=\"secondary\"\n [disabled]=\"isTranscribing()\"\n (onClick)=\"applySpeechToText()\"\n >\n <ax-prefix>\n <ax-icon><i class=\"fa-light fa-paper-plane\"></i></ax-icon>\n </ax-prefix>\n </ax-button>\n </div>\n </div>\n }\n </div>\n </div>\n `,\n styles: [\n `\n :host {\n display: block;\n width: 100%;\n }\n\n .voice-recorder {\n display: flex;\n flex-direction: column;\n width: 100%;\n background: rgb(var(--ax-sys-color-lightest-surface));\n }\n\n .recorder-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0.75rem 1rem;\n border-bottom: 1px solid rgb(var(--ax-sys-color-border-light-surface));\n }\n\n .recorder-title {\n margin: 0;\n font-size: 0.875rem;\n font-weight: 600;\n }\n\n .close-button {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border: none;\n background: transparent;\n border-radius: 50%;\n font-size: 1rem;\n cursor: pointer;\n transition: all 0.2s;\n opacity: 0.7;\n }\n\n .close-button:hover {\n background: rgb(var(--ax-sys-color-light-surface));\n opacity: 1;\n }\n\n .recorder-content {\n display: flex;\n align-items: center;\n width: 100%;\n padding: 1rem;\n }\n\n .recorder-idle {\n display: flex;\n align-items: center;\n gap: 1rem;\n width: 100%;\n }\n\n .record-button,\n .speech-to-text-button {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 56px;\n height: 56px;\n border: none;\n border-radius: 50%;\n font-size: 1.5rem;\n cursor: pointer;\n transition: all 0.2s;\n }\n\n .record-button {\n background: rgb(var(--ax-sys-color-primary-500));\n color: rgb(var(--ax-sys-color-on-primary-surface));\n box-shadow: 0 2px 8px rgba(var(--ax-sys-color-primary-500), 0.3);\n }\n\n .record-button:hover {\n background: rgb(var(--ax-sys-color-primary-600));\n }\n\n .speech-to-text-button {\n background: rgb(var(--ax-sys-color-secondary-surface));\n color: rgb(var(--ax-sys-color-on-secondary-surface));\n box-shadow: 0 2px 8px rgba(var(--ax-sys-color-secondary-500), 0.2);\n }\n\n .speech-to-text-button:hover:not(:disabled) {\n background: rgb(var(--ax-sys-color-secondary-600));\n }\n\n .speech-to-text-button:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n }\n\n .recorder-hint {\n font-size: 0.875rem;\n opacity: 0.7;\n }\n\n .recorder-transcribing {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 0.75rem;\n width: 100%;\n padding: 0.5rem 0;\n }\n\n .recorder-transcribing-text {\n font-size: 0.875rem;\n font-weight: 500;\n color: rgb(var(--ax-sys-color-on-light-surface));\n }\n\n .recorder-active {\n display: flex;\n align-items: center;\n justify-content: space-between;\n width: 100%;\n gap: 1rem;\n }\n\n .recorder-info {\n display: flex;\n align-items: center;\n gap: 1.5rem;\n flex: 1;\n }\n\n .recording-indicator {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n }\n\n .pulse-dot {\n width: 12px;\n height: 12px;\n background: rgb(var(--ax-sys-color-danger-500));\n border-radius: 50%;\n animation: pulse 1.5s ease-in-out infinite;\n }\n\n @keyframes pulse {\n 0%,\n 100% {\n opacity: 1;\n }\n 50% {\n opacity: 0.5;\n }\n }\n\n .recording-text {\n font-size: 0.875rem;\n font-weight: 600;\n color: rgb(var(--ax-sys-color-danger-500));\n }\n\n .recording-time {\n font-size: 1.25rem;\n font-weight: 600;\n font-variant-numeric: tabular-nums;\n min-width: 80px;\n }\n\n .recorder-actions {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n }\n\n @media (max-width: 768px) {\n .voice-recorder {\n padding: 0.75rem;\n }\n\n .record-button,\n .speech-to-text-button {\n width: 48px;\n height: 48px;\n font-size: 1.25rem;\n }\n\n .recorder-info {\n gap: 1rem;\n }\n\n .recording-time {\n font-size: 1.125rem;\n font-variant-numeric: tabular-nums;\n }\n\n .recorder-actions {\n gap: 0.5rem;\n }\n }\n\n @media (max-width: 480px) {\n .recorder-hint {\n font-size: 0.8125rem;\n }\n\n .recording-text {\n display: none;\n }\n\n .recording-time {\n font-size: 1rem;\n min-width: 60px;\n font-variant-numeric: tabular-nums;\n }\n }\n `,\n ],\n})\nexport class AXMChatVoiceRecorderComponent implements AXConversationComposerActionComponent {\n //#region ---- Services & Dependencies ----\n\n private readonly platformId = inject(PLATFORM_ID);\n private readonly destroyRef = inject(DestroyRef);\n private readonly composerService = inject(AXConversationComposerService);\n private readonly conversationService = inject(AXConversationService);\n private readonly commandService = inject(AXPCommandService);\n private readonly chatToolRunContext = inject(AXPAiChatToolRunContextService);\n private readonly injector = inject(Injector);\n private readonly runtimeContextBuilder = inject(AXPAiPlatformRuntimeContextBuilder);\n private readonly fileStorage = inject(AXPFileStorageService);\n private readonly toastService = inject(AXToastService);\n readonly translation = inject(AXTranslationService);\n\n //#endregion\n\n //#region ---- Lazy dependencies ----\n\n private get aiManager(): AXPAiManagerService | null {\n return this.injector.get(AXPAiManagerService, null, { optional: true });\n }\n\n //#endregion\n\n //#region ---- Inputs & Outputs ----\n\n readonly conversation = input.required<AXConversation>();\n readonly service = input<AXConversationComposerService>();\n readonly recordingComplete = output<Blob>();\n readonly recordingCancelled = output<void>();\n\n //#endregion\n\n //#region ---- State ----\n\n readonly isRecording = signal(false);\n readonly isTranscribing = signal(false);\n readonly recordingDuration = signal(0);\n\n private recordingStartTime = 0;\n private timerInterval?: number;\n private mediaRecorder?: MediaRecorder;\n private audioChunks: Blob[] = [];\n private activeStream?: MediaStream;\n private cancelled = false;\n private suppressVoiceMessageSend = false;\n private pendingBlobResolve?: (blob: Blob | null) => void;\n\n //#endregion\n\n //#region ---- Computed ----\n\n readonly formattedTime = computed(() => {\n const duration = this.recordingDuration();\n const minutes = Math.floor(duration / 60);\n const seconds = duration % 60;\n return `${minutes}:${seconds.toString().padStart(2, '0')}`;\n });\n\n //#endregion\n\n //#region ---- Lifecycle ----\n\n constructor() {\n this.destroyRef.onDestroy(() => this.stopAndCleanup());\n }\n\n //#endregion\n\n //#region ---- UI Handlers ----\n\n async applySpeechToText(): Promise<void> {\n if (this.isTranscribing() || !this.isRecording()) {\n return;\n }\n\n try {\n const audioBlob = await this.waitForRecordingBlob();\n if (!audioBlob) {\n return;\n }\n\n this.isTranscribing.set(true);\n const text = await this.transcribeVoiceBlob(audioBlob);\n if (!text) {\n return;\n }\n\n this.composerService.draftText.set(text);\n this.composerService.hideComponent();\n setTimeout(() => {\n (document.querySelector('.composer-input-wrapper textarea') as HTMLTextAreaElement)?.focus();\n }, 100);\n } catch (error) {\n this.composerService.hideComponent();\n const errTitle = await this.translation.translateAsync('@general:messages.error.title');\n const fallback = await this.translation.translateAsync(\n '@conversation:chat.speech-to-text.errors.transcription-failed',\n );\n const raw = error instanceof Error ? error.message.trim() : '';\n const content = raw.startsWith('@') ? await this.translation.translateAsync(raw) : fallback;\n await this.toastService.show({ color: 'danger', title: errTitle, content });\n } finally {\n this.isTranscribing.set(false);\n }\n }\n\n async startRecording(): Promise<void> {\n if (!isPlatformBrowser(this.platformId)) {\n return;\n }\n\n try {\n const stream = await navigator.mediaDevices.getUserMedia({ audio: true });\n this.activeStream = stream;\n this.mediaRecorder = new MediaRecorder(stream);\n this.audioChunks = [];\n this.cancelled = false;\n\n this.mediaRecorder.ondataavailable = (event) => {\n if (event.data.size > 0) {\n this.audioChunks.push(event.data);\n }\n };\n\n this.mediaRecorder.onstop = async () => {\n stream.getTracks().forEach((track) => track.stop());\n this.activeStream = undefined;\n\n const pendingResolve = this.pendingBlobResolve;\n this.pendingBlobResolve = undefined;\n\n if (this.cancelled) {\n this.cancelled = false;\n pendingResolve?.(null);\n return;\n }\n\n const audioBlob = new Blob(this.audioChunks, {\n type: this.mediaRecorder?.mimeType?.trim() || this.audioChunks[0]?.type?.trim() || 'audio/webm',\n });\n pendingResolve?.(audioBlob.size > 0 ? audioBlob : null);\n\n if (this.suppressVoiceMessageSend) {\n this.suppressVoiceMessageSend = false;\n return;\n }\n\n this.recordingComplete.emit(audioBlob);\n\n const conv = this.conversation();\n if (conv && this.audioChunks.length > 0) {\n await this.sendVoiceMessage(audioBlob, conv);\n }\n };\n\n this.mediaRecorder.start(250);\n this.isRecording.set(true);\n this.recordingStartTime = Date.now();\n this.recordingDuration.set(0);\n\n this.timerInterval = window.setInterval(() => {\n const elapsed = Math.floor((Date.now() - this.recordingStartTime) / 1000);\n this.recordingDuration.set(elapsed);\n }, 1000);\n } catch (error) {\n console.error('Failed to start recording:', error);\n }\n }\n\n stopRecording(): void {\n if (this.mediaRecorder && this.isRecording()) {\n this.mediaRecorder.stop();\n this.isRecording.set(false);\n this.clearTimer();\n this.composerService.hideComponent();\n }\n }\n\n cancelRecording(): void {\n if (this.mediaRecorder && this.isRecording()) {\n this.cancelled = true;\n this.mediaRecorder.stop();\n this.isRecording.set(false);\n this.clearTimer();\n this.audioChunks = [];\n this.recordingCancelled.emit();\n this.composerService.hideComponent();\n }\n }\n\n cancel(): void {\n if (this.isRecording()) {\n this.cancelRecording();\n } else {\n this.composerService.hideComponent();\n }\n }\n\n //#endregion\n\n //#region ---- Utility Methods ----\n\n private clearTimer(): void {\n if (this.timerInterval) {\n clearInterval(this.timerInterval);\n this.timerInterval = undefined;\n }\n }\n\n private waitForRecordingBlob(): Promise<Blob | null> {\n if (!this.mediaRecorder || !this.isRecording()) {\n return Promise.resolve(null);\n }\n\n return new Promise((resolve) => {\n this.pendingBlobResolve = resolve;\n this.suppressVoiceMessageSend = true;\n if (this.mediaRecorder!.state === 'recording') {\n this.mediaRecorder!.requestData();\n }\n this.mediaRecorder!.stop();\n this.isRecording.set(false);\n this.clearTimer();\n });\n }\n\n private extractAssistIdFromConversation(conversation: AXConversation): string | undefined {\n const raw = conversation.metadata?.['assistId'];\n if (typeof raw === 'string' && raw.trim()) {\n return raw.trim();\n }\n\n for (const participant of conversation.participants ?? []) {\n const participantAssistId = participant.metadata?.['assistId'];\n if (typeof participantAssistId === 'string' && participantAssistId.trim()) {\n return participantAssistId.trim();\n }\n }\n\n return undefined;\n }\n\n private async resolveAssistIdForTranscription(): Promise<string> {\n if (!this.aiManager) {\n throw new Error('AI manager service is not available.');\n }\n\n const conversationAssistId = this.extractAssistIdFromConversation(this.conversation());\n const assist = await this.aiManager.getAssistForChat(conversationAssistId);\n const assistId = assist.id?.trim();\n if (!assistId) {\n throw new Error('No AI assist is configured for speech transcription.');\n }\n\n return assistId;\n }\n\n private buildTranscriptCorrectionPrompt(\n rawText: string,\n platformRuntimeContext: AXPAiPlatformRuntimeContext,\n ): string {\n const localeRaw = platformRuntimeContext['locale'];\n const locale =\n typeof localeRaw === 'string' && localeRaw.trim()\n ? localeRaw.trim()\n : 'the UI locale from platform context';\n return [\n 'Correct obvious misrecognized words and minor lexical or spelling errors in the transcript below.',\n `Keep the language aligned with UI locale (${locale}) and preserve the speaker's meaning.`,\n 'Return ONLY the corrected plain text — no markdown, labels, quotes, or commentary.',\n '',\n rawText,\n ].join('\\n');\n }\n\n private localeToTranscriptionLanguage(locale: string | undefined): string | undefined {\n const trimmed = locale?.trim();\n if (!trimmed) {\n return undefined;\n }\n const primary = trimmed.split('-')[0]?.toLowerCase();\n return primary || undefined;\n }\n\n private async correctTranscriptText(\n assistId: string,\n rawText: string,\n platformRuntimeContext: AXPAiPlatformRuntimeContext,\n ): Promise<string> {\n const result = await this.commandService.execute(AIMANAGEMENT_STRUCTURED_TEXT_COMPLETION_COMMAND_KEY, {\n assistId,\n messages: [axpAiChatTextMessage('user', this.buildTranscriptCorrectionPrompt(rawText, platformRuntimeContext))],\n maxTokens: 2048,\n temperature: 0.2,\n });\n\n const data = runtimeCommandPayloadData(result) as { text?: string } | undefined;\n if (typeof data?.text === 'string' && data.text.trim()) {\n return data.text.trim();\n }\n\n return rawText;\n }\n\n private async persistVoiceRecordingForAi(\n audioBlob: Blob,\n conversationId: string,\n ): Promise<{ fileId: string; mimeType: string; name: string }> {\n const mimeType = audioBlob.type?.trim() || 'audio/webm';\n const fileName = `voice-${Date.now()}.webm`;\n const file = new File([audioBlob], fileName, { type: mimeType });\n const refId = conversationId.trim() || globalThis.crypto.randomUUID();\n const { fileId } = await persistAiChatAttachmentImage(this.fileStorage, file, refId);\n return { fileId, mimeType, name: fileName };\n }\n\n private async transcribeVoiceBlob(audioBlob: Blob): Promise<string> {\n const aiManager = this.aiManager;\n if (!aiManager) {\n throw new Error('AI manager service is not available.');\n }\n\n const assistId = await this.resolveAssistIdForTranscription();\n const chatTransport = (await aiManager.getAssistPrimaryChatTransport(assistId)) ?? 'openai';\n const platformRuntimeContext = await this.runtimeContextBuilder.build();\n const conversationId = this.conversation().id;\n const attachment = await this.persistVoiceRecordingForAi(audioBlob, conversationId);\n const localeForSpeech = platformRuntimeContext['locale'];\n const language = this.localeToTranscriptionLanguage(\n typeof localeForSpeech === 'string' ? localeForSpeech : undefined,\n );\n\n this.chatToolRunContext.setContext({\n assistId,\n chatTransport,\n agentId: AXM_SPEECH_TO_TEXT_AGENT_ID,\n });\n\n try {\n const result = await this.commandService.execute(AIMANAGEMENT_CHAT_TRANSCRIBE_SPEECH_COMMAND_KEY, {\n fileId: attachment.fileId,\n assistId,\n agentId: AXM_SPEECH_TO_TEXT_AGENT_ID,\n ...(language ? { language } : {}),\n });\n\n const data = runtimeCommandPayloadData(result) as { text?: string } | undefined;\n if (result == null || !result.success || typeof data?.text !== 'string' || !data.text.trim()) {\n const detail =\n result != null && typeof result.message?.text === 'string' && result.message.text.trim().startsWith('@')\n ? result.message.text.trim()\n : '@conversation:chat.speech-to-text.errors.transcription-failed';\n throw new Error(detail);\n }\n\n const rawText = data.text.trim();\n // Demisco speech-to-text is final; do not call agent chat (`/core/agent/chat/`, needs agent_uuid).\n if (chatTransport === 'demis') {\n return rawText;\n }\n\n return this.correctTranscriptText(assistId, rawText, platformRuntimeContext);\n } finally {\n this.chatToolRunContext.setContext(null);\n }\n }\n\n private async sendVoiceMessage(audioBlob: Blob, conversation: AXConversation): Promise<void> {\n try {\n const audioFile = new File([audioBlob], `voice-${Date.now()}.webm`, { type: 'audio/webm' });\n\n await this.conversationService.sendMessage(\n {\n conversationId: conversation.id,\n type: 'voice',\n payload: {\n type: 'voice',\n url: '',\n duration: this.recordingDuration(),\n },\n },\n {\n media: {\n source: audioFile,\n fileName: audioFile.name,\n mimeType: audioFile.type,\n },\n },\n );\n } catch (error) {\n console.error('Failed to send voice message:', error);\n }\n }\n\n private stopAndCleanup(): void {\n this.clearTimer();\n if (this.mediaRecorder?.state === 'recording') {\n this.cancelled = true;\n this.mediaRecorder.stop();\n }\n this.activeStream?.getTracks().forEach((track) => track.stop());\n this.activeStream = undefined;\n }\n\n //#endregion\n}\n\n//#endregion\n","//#region ---- Imports ----\n\nimport type { AXConversationComposerAction } from '@acorex/components/conversation';\nimport { AXMChatVoiceRecorderComponent } from './chat-voice-recorder.component';\n\n//#endregion\n\n//#region ---- Action ----\n\nexport const AXM_CHAT_COMPOSER_VOICE_RECORDING_ACTION: AXConversationComposerAction = {\n id: 'voice-recording',\n label: '@acorex:chat.voice',\n icon: 'fa-light fa-microphone',\n position: 'end',\n priority: 30,\n component: AXMChatVoiceRecorderComponent,\n toggleable: true,\n visible: (context) => {\n return !context.draftText?.trim() && !context.isEditing;\n },\n tooltip: '@acorex:chat.tooltips.record-voice-message',\n};\n\n//#endregion\n","//#region ---- Imports ----\n\nimport { AXPCommonSettings, AXPSettingsService } from '@acorex-platform/framework-client/common';\nimport { AXPPlatformScope } from '@acorex-platform/framework-shared/core';\nimport { inject, Injectable, signal } from '@angular/core';\n\n//#endregion\n\n//#region ---- Module cache (sync reads for action visibility) ----\n\n/** Updated by {@link AXMAssistChatDebugModeService}; read from action `visible` without injection context. */\nexport const axmAssistChatDebugModeState = {\n /** Tenant debug mode from settings. */\n systemEnabled: false,\n /** In-memory session toggle; defaults to true when system debug is on. */\n sessionEnabled: true,\n resolved: false,\n};\n\n/** Effective assist debug UI: tenant setting and session toggle both on. */\nexport function axmIsAssistChatDebugModeActive(): boolean {\n return (\n axmAssistChatDebugModeState.resolved &&\n axmAssistChatDebugModeState.systemEnabled &&\n axmAssistChatDebugModeState.sessionEnabled\n );\n}\n\n/** Tenant debug setting only — used to show the header debug switch. */\nexport function axmIsAssistChatSystemDebugEnabled(): boolean {\n return axmAssistChatDebugModeState.resolved && axmAssistChatDebugModeState.systemEnabled;\n}\n\n//#endregion\n\n//#region ---- Service ----\n\n/**\n * Resolves tenant debug mode once and mirrors it to {@link axmAssistChatDebugModeState}\n * so conversation action `visible` callbacks can stay synchronous.\n *\n * Session toggle ({@link setSessionEnabled}) is in-memory only and does not persist.\n */\n@Injectable({ providedIn: 'root' })\nexport class AXMAssistChatDebugModeService {\n //#region ---- Services & Dependencies ----\n\n private readonly settingsService = inject(AXPSettingsService);\n\n //#endregion\n\n //#region ---- State Signals ----\n\n /** Effective debug UI (tenant setting AND session toggle). */\n readonly active = signal(false);\n\n /** Tenant debug setting resolved from settings. */\n readonly systemEnabled = signal(false);\n\n /** In-memory session toggle; defaults true when system debug is on. */\n readonly sessionEnabled = signal(true);\n\n /** False until tenant debug setting has been read. */\n readonly resolved = signal(false);\n\n //#endregion\n\n //#region ---- Lifecycle ----\n\n constructor() {\n void this.refresh();\n }\n\n //#endregion\n\n //#region ---- API ----\n\n /** Re-reads tenant debug mode and updates the module cache. */\n async refresh(): Promise<void> {\n try {\n const debugMode = await this.settingsService\n .scope(AXPPlatformScope.Tenant)\n .get<boolean>(AXPCommonSettings.DebugMode);\n axmAssistChatDebugModeState.systemEnabled = !!debugMode;\n } catch {\n axmAssistChatDebugModeState.systemEnabled = false;\n } finally {\n axmAssistChatDebugModeState.resolved = true;\n this.syncSignals();\n }\n }\n\n isSystemDebugEnabled(): boolean {\n return axmIsAssistChatSystemDebugEnabled();\n }\n\n isDebugModeActive(): boolean {\n return axmIsAssistChatDebugModeActive();\n }\n\n setSessionEnabled(enabled: boolean): void {\n axmAssistChatDebugModeState.sessionEnabled = enabled;\n this.syncSignals();\n }\n\n //#endregion\n\n //#region ---- Private Helpers ----\n\n private syncSignals(): void {\n this.resolved.set(axmAssistChatDebugModeState.resolved);\n this.systemEnabled.set(axmAssistChatDebugModeState.systemEnabled);\n this.sessionEnabled.set(axmAssistChatDebugModeState.sessionEnabled);\n this.active.set(axmIsAssistChatDebugModeActive());\n }\n\n //#endregion\n}\n\n//#endregion\n","//#region ---- Imports ----\n\nimport { InjectionToken } from '@angular/core';\nimport type { AXMChatAiTargetRow } from '../plugins/utils/chat-ai-target.util';\nimport type {\n AXMAssistConversationSnapshotLite,\n AXPAiEffectiveAssistRowLite,\n} from '../plugins/utils/ai-chat-lite.types';\n\n//#endregion\n\n//#region ---- Port ----\n\nexport interface AXMChatAssistCatalogPort {\n loadCatalogTargets(force?: boolean): Promise<AXMChatAiTargetRow[]>;\n\n getCachedAssist(assistId: string): AXPAiEffectiveAssistRowLite | null;\n\n getAssist(assistId: string): Promise<AXPAiEffectiveAssistRowLite | null>;\n\n primeAssist(row: AXPAiEffectiveAssistRowLite): void;\n\n toSnapshot(row: AXPAiEffectiveAssistRowLite): AXMAssistConversationSnapshotLite;\n}\n\nexport const AXM_CHAT_ASSIST_CATALOG_PORT = new InjectionToken<AXMChatAssistCatalogPort>(\n 'AXM_CHAT_ASSIST_CATALOG_PORT',\n);\n\n//#endregion\n","/**\n * Temporary AI module identifiers used by conversation while AI-specific UI\n * is being extracted to the conversation AI extension.\n */\nexport const AXM_AI_MANAGEMENT_MODULE_NAME = 'AiManagement';\nexport const AXM_AI_MANAGEMENT_ASSIST_ENTITY_NAME = 'Assist';\nexport const AXM_AI_MANAGEMENT_AGENT_ENTITY_NAME = 'AiAgent';\n","//#region ---- Imports ----\n\nimport type { AXPMultiLanguageString } from '@acorex-platform/framework-shared/core';\nimport type { AXPEntityDefinitionRegistryService } from '@acorex-platform/framework-client/layout/entity';\nimport type { AXMAssistConversationSnapshotLite } from './ai-chat-lite.types';\nimport { AXM_AI_MANAGEMENT_ASSIST_ENTITY_NAME, AXM_AI_MANAGEMENT_MODULE_NAME } from './ai-management.constants';\n\n//#endregion\n\n//#region ---- Types ----\n\n/** Row shown in Conversation “Chat with AI” pickers (catalog assist). */\nexport interface AXMChatAiTargetRow {\n id: string;\n name: string;\n title: AXPMultiLanguageString | string;\n description?: AXPMultiLanguageString | string;\n professionImageUrl?: string;\n}\n\n//#endregion\n\n//#region ---- Participant & metadata ----\n\n/** Synthetic bot participant id for assist chats. */\nexport function axmChatAiPeerParticipantId(catalogId: string): string {\n return `assist-${catalogId.trim()}`;\n}\n\n/** Conversation metadata for starting an AI chat from a picker row. */\nexport function axmBuildAiChatConversationMetadata(\n row: AXMChatAiTargetRow,\n assistSnapshot?: AXMAssistConversationSnapshotLite,\n): Record<string, unknown> {\n const metadata: Record<string, unknown> = { assistId: row.id };\n if (assistSnapshot) {\n metadata['assistSnapshot'] = assistSnapshot;\n const modelId = assistSnapshot.modelId?.trim();\n if (modelId) {\n metadata['modelEntityId'] = modelId;\n }\n }\n return metadata;\n}\n\n/** True when conversation metadata targets an assist row. */\nexport function axmConversationHasAiChat(\n conversation: { metadata?: Record<string, unknown> } | null | undefined,\n): boolean {\n const metadata = conversation?.metadata as Record<string, unknown> | undefined;\n const direct = metadata?.['assistId'];\n if (typeof direct === 'string' && direct.trim().length > 0) {\n return true;\n }\n const nested = metadata?.['metadata'];\n if (nested && typeof nested === 'object' && nested !== null) {\n const inner = (nested as Record<string, unknown>)['assistId'];\n return typeof inner === 'string' && inner.trim().length > 0;\n }\n return false;\n}\n\n//#endregion\n\n//#region ---- Catalog load ----\n\ntype EntityListExecute = (req: {\n skip?: number;\n take?: number;\n sort?: { name: string; dir: string }[];\n}) => Promise<{ items: Record<string, unknown>[]; total: number }>;\n\n/** Loads assist rows for Conversation AI chat pickers. */\nexport async function axmLoadChatAiTargets(\n entityRegistry: AXPEntityDefinitionRegistryService,\n): Promise<AXMChatAiTargetRow[]> {\n const assists = await axmQueryEntityList(entityRegistry, AXM_AI_MANAGEMENT_ASSIST_ENTITY_NAME);\n\n return assists\n .map((raw) => ({\n id: String(raw['id'] ?? ''),\n name: String(raw['name'] ?? ''),\n title: raw['title'] as AXPMultiLanguageString | string,\n description: raw['description'] as AXPMultiLanguageString | string | undefined,\n professionImageUrl: typeof raw['professionImageUrl'] === 'string' ? raw['professionImageUrl'] : undefined,\n }))\n .filter((row) => row.id.trim().length > 0)\n .sort((a, b) => a.name.localeCompare(b.name, undefined, { sensitivity: 'base' }));\n}\n\n//#endregion\n\n//#region ---- Display & filter (dialog + global search) ----\n\n/** Resolves ML or plain string for search/display. */\nexport function axmResolveChatAiTargetText(\n resolveMl: (value: AXPMultiLanguageString) => string | undefined,\n value: AXPMultiLanguageString | string | undefined,\n): string {\n if (!value) {\n return '';\n }\n if (typeof value === 'string') {\n return value;\n }\n return resolveMl(value) ?? '';\n}\n\nexport function axmChatAiTargetDisplayName(\n resolveMl: (value: AXPMultiLanguageString) => string | undefined,\n row: AXMChatAiTargetRow,\n): string {\n return axmResolveChatAiTargetText(resolveMl, row.title).trim() || row.name.trim() || row.id;\n}\n\nexport function axmChatAiTargetDisplayDescription(\n resolveMl: (value: AXPMultiLanguageString) => string | undefined,\n row: AXMChatAiTargetRow,\n): string | undefined {\n if (!row.description) {\n return undefined;\n }\n const text = axmResolveChatAiTargetText(resolveMl, row.description).trim();\n return text || undefined;\n}\n\nexport function axmChatAiTargetAvatarUrl(row: AXMChatAiTargetRow): string | null {\n const url = row.professionImageUrl?.trim();\n return url ? url : null;\n}\n\n/** Fallback i18n key for rows with no catalog description. */\nexport function axmChatAiTargetShortcutDescriptionKey(): string {\n return '@conversation:search.assist.shortcut-description';\n}\n\n/** Same filter as {@link AXMChatWithAssistDialogComponent} target list search. */\nexport function axmFilterChatAiTargets(\n resolveMl: (value: AXPMultiLanguageString) => string | undefined,\n rows: AXMChatAiTargetRow[],\n query: string,\n): AXMChatAiTargetRow[] {\n const q = query.trim().toLowerCase();\n if (!q) {\n return rows;\n }\n return rows.filter((r) => {\n const titleText = axmResolveChatAiTargetText(resolveMl, r.title).toLowerCase();\n return (\n r.name.toLowerCase().includes(q) ||\n titleText.includes(q) ||\n axmResolveChatAiTargetText(resolveMl, r.description).toLowerCase().includes(q)\n );\n });\n}\n\n//#endregion\n\n//#region ---- Entity list query ----\n\nasync function axmQueryEntityList(\n entityRegistry: AXPEntityDefinitionRegistryService,\n entityName: string,\n): Promise<Record<string, unknown>[]> {\n const entity = await entityRegistry.resolve(AXM_AI_MANAGEMENT_MODULE_NAME, entityName);\n const execute = entity.queries?.list?.execute as EntityListExecute | undefined;\n if (!execute) {\n throw new Error(`${entityName} entity has no list query.`);\n }\n const res = await execute({\n skip: 0,\n take: 500,\n sort: [{ name: 'name', dir: 'asc' }],\n });\n return res.items ?? [];\n}\n\n//#endregion\n","import { InjectionToken } from '@angular/core';\n\nexport interface AXMAssistDefaultResolverPort {\n getDefaultAssistId(): Promise<string | undefined>;\n}\n\nexport const AXM_ASSIST_DEFAULT_RESOLVER_PORT = new InjectionToken<AXMAssistDefaultResolverPort>(\n 'AXM_ASSIST_DEFAULT_RESOLVER_PORT',\n);\n","//#region ---- Imports ----\n\nimport { isNil, isString } from 'lodash';\n\n//#endregion\n\n//#region ---- Types ----\n\n/** Entity reference an entity-scoped chat is bound to (stored in conversation metadata). */\nexport interface AXMEntityChatRef {\n entityId: string;\n entityType: string;\n}\n\n//#endregion\n\n//#region ---- Metadata builder ----\n\n/**\n * Conversation metadata for an entity-scoped assist chat.\n * Keeps `assistId` so the existing assist reply pipeline still answers in entity chats.\n */\nexport function axmBuildEntityChatConversationMetadata(args: {\n entityId: string;\n entityType: string;\n assistId: string;\n}): Record<string, unknown> {\n return {\n assistId: args.assistId.trim(),\n entityId: args.entityId.trim(),\n entityType: args.entityType.trim(),\n };\n}\n\n//#endregion\n\n//#region ---- Metadata extractors ----\n\n/**\n * Resolves the entity reference from conversation metadata.\n * `AXConversationService.createConversation` may nest the UI object, so values\n * are also probed at `metadata.metadata.*`.\n */\nexport function axmExtractEntityRefFromMetadata(\n metadata: Record<string, unknown> | undefined,\n): AXMEntityChatRef | undefined {\n if (isNil(metadata)) {\n return undefined;\n }\n\n const entityId = readMetadataString(metadata, 'entityId');\n const entityType = readMetadataString(metadata, 'entityType');\n if (!entityId || !entityType) {\n return undefined;\n }\n\n return { entityId, entityType };\n}\n\n/** True when the conversation is bound to an entity (has both entity id and type). */\nexport function axmConversationIsEntityChat(metadata: Record<string, unknown> | undefined): boolean {\n return !isNil(axmExtractEntityRefFromMetadata(metadata));\n}\n\n/** True when conversation metadata targets the given entity reference. */\nexport function axmConversationMatchesEntity(\n metadata: Record<string, unknown> | undefined,\n ref: AXMEntityChatRef,\n): boolean {\n const resolved = axmExtractEntityRefFromMetadata(metadata);\n if (!resolved) {\n return false;\n }\n return resolved.entityId === ref.entityId.trim() && resolved.entityType === ref.entityType.trim();\n}\n\n//#endregion\n\n//#region ---- Helpers ----\n\nfunction readMetadataString(metadata: Record<string, unknown>, key: string): string | undefined {\n const direct = metadata[key];\n if (isString(direct) && direct.trim()) {\n return direct.trim();\n }\n\n const nested = metadata['metadata'];\n if (!isNil(nested) && typeof nested === 'object') {\n const inner = (nested as Record<string, unknown>)[key];\n if (isString(inner) && inner.trim()) {\n return inner.trim();\n }\n }\n\n return undefined;\n}\n\n//#endregion\n","//#region ---- Imports ----\n\nimport { type AXConversation, AXConversationService } from '@acorex/components/conversation';\nimport { AXTranslationService } from '@acorex/core/translation';\nimport { AXPEntityDefinitionRegistryService } from '@acorex-platform/framework-client/layout/entity';\nimport { inject, Injectable, Injector } from '@angular/core';\nimport {\n axmChatAiPeerParticipantId,\n axmChatAiTargetAvatarUrl,\n axmLoadChatAiTargets,\n type AXMChatAiTargetRow,\n} from '../chat/plugins/utils/chat-ai-target.util';\nimport { AXMChatConversationApi } from '../chat/plugins/services/chat-conversation-apis.abstract';\nimport { AXM_ASSIST_DEFAULT_RESOLVER_PORT } from '../chat/plugins/ports/assist-default-resolver.port';\nimport { axmBuildEntityChatConversationMetadata, type AXMEntityChatRef } from './entity-chat.util';\nimport { AXPMultiLanguageString } from '@acorex-platform/framework-shared/core';\n\n//#endregion\n\n//#region ---- Types ----\n\n/** Arguments accepted by `AXConversationService.createConversation`, prebuilt for an entity chat. */\nexport interface AXMEntityChatCreateData {\n participantIds: string[];\n type: 'bot';\n options: {\n title: string;\n avatar?: string;\n icon: string;\n metadata: Record<string, unknown>;\n };\n}\n\n//#endregion\n\n//#region ---- Service ----\n\n/**\n * Backing service for the entity-scoped mini chat: finds the conversations bound to an entity\n * (an entity may have several) and prepares the create payload for a new entity assist chat.\n *\n * Conversation creation/selection is performed by the caller using its own\n * {@link AXConversationService} instance so the mini chat keeps its active-selection state\n * isolated from the main chat page.\n */\n@Injectable({ providedIn: 'root' })\nexport class AXMEntityChatService {\n //#region ---- Services & Dependencies ----\n\n private readonly injector = inject(Injector);\n private readonly conversationService = inject(AXConversationService);\n private readonly entityRegistry = inject(AXPEntityDefinitionRegistryService);\n private readonly translationService = inject(AXTranslationService);\n private readonly defaultAssistResolver = inject(AXM_ASSIST_DEFAULT_RESOLVER_PORT, { optional: true });\n\n //#endregion\n\n //#region ---- Lazy dependencies ----\n\n /**\n * Resolved lazily: this service is `providedIn: 'root'` but depends on module-scoped chat APIs\n * and optional AI services that must not be requested during the same hydration pass as chat UI.\n */\n private get conversationApi(): AXMChatConversationApi {\n return this.injector.get(AXMChatConversationApi);\n }\n\n //#endregion\n\n //#region ---- Public Methods ----\n\n /** Returns every conversation bound to the given entity reference. */\n findEntityConversations(ref: AXMEntityChatRef): Promise<AXConversation[]> {\n return this.conversationApi.findEntityConversations(ref.entityType.trim(), ref.entityId.trim());\n }\n\n /** Creates a new entity-scoped assist conversation and selects it as the active conversation. */\n async createEntityChat(ref: AXMEntityChatRef, assistId?: string): Promise<AXConversation> {\n const createData = await this.buildEntityChatCreateData(ref, assistId);\n const conversation = await this.conversationService.createConversation(\n createData.participantIds,\n createData.type,\n createData.options,\n );\n await this.conversationService.selectConversation(conversation.id);\n this.conversationApi.reportFocusedConversation(conversation.id);\n return conversation;\n }\n\n /**\n * Builds the `createConversation` payload for a new entity assist chat.\n * Uses `assistId` when provided, otherwise the tenant default assist.\n */\n async buildEntityChatCreateData(ref: AXMEntityChatRef, assistId?: string): Promise<AXMEntityChatCreateData> {\n const row = await this.resolveAssistRow(assistId);\n const avatar = axmChatAiTargetAvatarUrl(row);\n\n return {\n participantIds: [axmChatAiPeerParticipantId(row.id)],\n type: 'bot',\n options: {\n title: this.resolveTitle(row),\n ...(avatar ? { avatar } : {}),\n icon: 'fa-solid fa-robot',\n metadata: axmBuildEntityChatConversationMetadata({\n entityId: ref.entityId,\n entityType: ref.entityType,\n assistId: row.id,\n }),\n },\n };\n }\n\n //#endregion\n\n //#region ---- Utility Methods ----\n\n /** Resolves the assist catalog row to chat with (explicit id → tenant default → first row). */\n private async resolveAssistRow(assistId?: string): Promise<AXMChatAiTargetRow> {\n const rows = await axmLoadChatAiTargets(this.entityRegistry);\n if (!rows.length) {\n throw new Error('No assist targets are available to start an entity chat.');\n }\n\n const requestedId = assistId?.trim() || (await this.resolveDefaultAssistId());\n const match = requestedId ? rows.find((row) => row.id === requestedId) : undefined;\n return match ?? rows[0];\n }\n\n private async resolveDefaultAssistId(): Promise<string | undefined> {\n if (!this.defaultAssistResolver) {\n return undefined;\n }\n try {\n return await this.defaultAssistResolver.getDefaultAssistId();\n } catch (error: unknown) {\n console.warn('Failed to resolve default assist for entity mini chat:', error);\n return undefined;\n }\n }\n\n private resolveTitle(row: AXMChatAiTargetRow): string {\n return this.translationService.resolve(row.title as AXPMultiLanguageString) ?? row.name;\n }\n\n //#endregion\n}\n\n//#endregion\n","//#region ---- Imports ----\n\nimport {\n AXConversationService,\n type AXConversation,\n type AXConversationMessagePayload,\n} from '@acorex/components/conversation';\nimport { AXTranslationService } from '@acorex/core/translation';\nimport { AXPMultiLanguageString } from '@acorex-platform/framework-shared/core';\nimport { AXMEntityChatService } from '../../../mini-chat/entity-chat.service';\nimport { AXMChatConversationApi } from '../services/chat-conversation-apis.abstract';\nimport type { AXMChatAssistCatalogPort } from '../../services/chat-assist-catalog.port';\nimport {\n axmBuildAiChatConversationMetadata,\n axmChatAiPeerParticipantId,\n axmChatAiTargetAvatarUrl,\n type AXMChatAiTargetRow,\n} from './chat-ai-target.util';\nimport type { AXMSendAssistChatMessageOptions } from './assist-send-options.types';\n\n//#endregion\n\n//#region ---- Types ----\n\nexport interface AXMAssistStarterPromptSendDeps {\n conversationService: AXConversationService;\n conversationApi: AXMChatConversationApi;\n entityChatService: AXMEntityChatService;\n assistCatalog: AXMChatAssistCatalogPort;\n translationService: AXTranslationService;\n}\n\n//#endregion\n\n//#region ---- Send ----\n\n/**\n * Sends a starter-prompt chip message using the caller's {@link AXConversationService} instance\n * (e.g. inbox mini chat overlay) without routing to the full chat page.\n */\nexport async function axmSendAssistStarterPromptInPlace(\n deps: AXMAssistStarterPromptSendDeps,\n text: string,\n options: Partial<AXMSendAssistChatMessageOptions>,\n): Promise<{ conversationId: string } | null> {\n const trimmedText = text.trim();\n if (!trimmedText) {\n return null;\n }\n\n let conversationId =\n (typeof options.conversationId === 'string' ? options.conversationId.trim() : '') ||\n deps.conversationService.activeConversationId()?.trim() ||\n '';\n\n if (!conversationId) {\n const assistId =\n (typeof options.assistId === 'string' ? options.assistId.trim() : '') ||\n (typeof options.targetId === 'string' ? options.targetId.trim() : '');\n if (!assistId) {\n return null;\n }\n\n const entityId = typeof options.entityId === 'string' ? options.entityId.trim() : '';\n const entityType = typeof options.entityType === 'string' ? options.entityType.trim() : '';\n\n const conversation =\n entityId && entityType\n ? await createEntityConversation(deps, { entityId, entityType }, assistId)\n : await createAssistConversation(deps, assistId);\n\n if (!conversation?.id) {\n return null;\n }\n\n conversationId = conversation.id;\n await deps.conversationService.selectConversation(conversationId);\n deps.conversationApi.reportFocusedConversation(conversationId);\n }\n\n const payload: AXConversationMessagePayload = { type: 'text', text: trimmedText };\n await deps.conversationService.sendMessage({\n conversationId,\n type: 'text',\n payload,\n });\n\n return { conversationId };\n}\n\n//#endregion\n\n//#region ---- Conversation creation ----\n\nasync function createEntityConversation(\n deps: AXMAssistStarterPromptSendDeps,\n ref: { entityId: string; entityType: string },\n assistId: string,\n): Promise<AXConversation> {\n const createData = await deps.entityChatService.buildEntityChatCreateData(ref, assistId);\n return deps.conversationService.createConversation(\n createData.participantIds,\n createData.type,\n createData.options,\n );\n}\n\nasync function createAssistConversation(\n deps: AXMAssistStarterPromptSendDeps,\n assistId: string,\n): Promise<AXConversation | null> {\n const rows = await deps.assistCatalog.loadCatalogTargets();\n const row = rows.find((item) => item.id === assistId);\n if (!row) {\n return null;\n }\n\n const participantId = axmChatAiPeerParticipantId(row.id);\n const avatar = axmChatAiTargetAvatarUrl(row);\n const assistRow =\n deps.assistCatalog.getCachedAssist(row.id) ?? (await deps.assistCatalog.getAssist(row.id));\n const assistSnapshot = assistRow ? deps.assistCatalog.toSnapshot(assistRow) : undefined;\n\n return deps.conversationService.createConversation([participantId], 'bot', {\n title: resolveAssistTitle(deps.translationService, row),\n ...(avatar ? { avatar } : {}),\n icon: 'fa-solid fa-robot',\n metadata: axmBuildAiChatConversationMetadata(row, assistSnapshot),\n });\n}\n\nfunction resolveAssistTitle(translationService: AXTranslationService, row: AXMChatAiTargetRow): string {\n return translationService.resolve(row.title as AXPMultiLanguageString) ?? row.name;\n}\n\n//#endregion\n","//#region ---- Imports ----\n\nimport type { AXPAiChatFollowUpItemLite, AXPAiEffectiveAssistRowLite } from './ai-chat-lite.types';\nimport { CONVERSATION_SEND_ASSIST_CHAT_MESSAGE_COMMAND } from '../../../commands/conversation-command.keys';\n\n//#endregion\n\n//#region ---- Types ----\n\ntype AssistStarterPromptsSource =\n | { starterPrompts?: Array<{ text?: string | Record<string, string> | null }> | null }\n | Pick<AXPAiEffectiveAssistRowLite, 'starterPrompts'>\n | null\n | undefined;\n\nexport interface AXMAssistStarterPromptChipOptions {\n assistId?: string;\n conversationId?: string;\n /** When `false`, the chip command sends the message without routing to the chat app (e.g. mini chat). */\n navigate?: boolean;\n /** Entity reference so a chip-created conversation stays bound to its entity (mini chat). */\n entityId?: string;\n entityType?: string;\n}\n\n//#endregion\n\n//#region ---- Command resolution ----\n\n/**\n * Resolves a follow-up chip command for Conversation assist.\n * AI follow-up output may use invalid `Registry:*` placeholders; those map to\n * {@link CONVERSATION_SEND_ASSIST_CHAT_MESSAGE_COMMAND} so the chip text is sent as the next user message.\n */\nexport function axmAssistResolveFollowUpCommandName(\n rawName: string,\n commandExists: (name: string) => boolean,\n): string {\n const name = rawName.trim();\n if (name && commandExists(name)) {\n return name;\n }\n\n const withoutRegistryPrefix = name.startsWith('Registry:') ? name.slice('Registry:'.length).trim() : '';\n if (withoutRegistryPrefix && commandExists(withoutRegistryPrefix)) {\n return withoutRegistryPrefix;\n }\n\n return CONVERSATION_SEND_ASSIST_CHAT_MESSAGE_COMMAND;\n}\n\n/** Rewrites invalid follow-up commands (e.g. hallucinated `Registry:*` keys) before rendering chips. */\nexport function axmAssistNormalizeFollowUpItemForConversation(item: AXPAiChatFollowUpItemLite): AXPAiChatFollowUpItemLite {\n const name = item.command.name.trim();\n if (!name || name.startsWith('Registry:')) {\n return {\n ...item,\n command: {\n name: CONVERSATION_SEND_ASSIST_CHAT_MESSAGE_COMMAND,\n options: item.command.options,\n },\n };\n }\n return item;\n}\n\nexport function axmAssistNormalizeFollowUpItemsForConversation(\n items: AXPAiChatFollowUpItemLite[],\n): AXPAiChatFollowUpItemLite[] {\n return items.map(axmAssistNormalizeFollowUpItemForConversation);\n}\n\n//#endregion\n\n//#region ---- Mapping ----\n\n/**\n * Maps assist starter prompts to follow-up chip items that run {@link CONVERSATION_SEND_ASSIST_CHAT_MESSAGE_COMMAND}.\n */\nexport function axmAssistStarterPromptChipItems(\n source: AssistStarterPromptsSource,\n options?: AXMAssistStarterPromptChipOptions,\n): AXPAiChatFollowUpItemLite[] {\n return getAssistStarterPromptLabels(source).map((text) => ({\n text,\n command: {\n name: CONVERSATION_SEND_ASSIST_CHAT_MESSAGE_COMMAND,\n options: {\n ...(options?.assistId ? { assistId: options.assistId } : {}),\n ...(options?.conversationId ? { conversationId: options.conversationId } : {}),\n ...(options?.navigate === false ? { navigate: false } : {}),\n ...(options?.entityId ? { entityId: options.entityId } : {}),\n ...(options?.entityType ? { entityType: options.entityType } : {}),\n },\n },\n }));\n}\n\nfunction getAssistStarterPromptLabels(source: AssistStarterPromptsSource): Array<string | Record<string, string>> {\n const items = source?.starterPrompts;\n if (!Array.isArray(items) || items.length === 0) {\n return [];\n }\n\n const labels: Array<string | Record<string, string>> = [];\n for (const item of items) {\n const text = item?.text;\n if (!isNonEmptyPromptLabel(text)) {\n continue;\n }\n labels.push(text);\n }\n return labels;\n}\n\nfunction isNonEmptyPromptLabel(text: string | Record<string, string> | null | undefined): text is string | Record<string, string> {\n if (text == null) {\n return false;\n }\n if (typeof text === 'string') {\n return text.trim().length > 0;\n }\n return Object.values(text).some((value) => typeof value === 'string' && value.trim().length > 0);\n}\n\n//#endregion\n","//#region ---- Imports ----\n\nimport { AXPCommandService } from '@acorex-platform/framework-client/runtime';\nimport { AXPLayoutThemeService } from '@acorex-platform/framework-client/themes/shared';\nimport { AXM_CHAT_ASSIST_CATALOG_PORT, type AXMChatAssistCatalogPort } from '../../services/chat-assist-catalog.port';\nimport { AXButtonModule } from '@acorex/components/button';\nimport { AXConversationService } from '@acorex/components/conversation';\nimport { AXTranslationModule, AXTranslationService } from '@acorex/core/translation';\nimport { AsyncPipe } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, inject, input, output, signal } from '@angular/core';\nimport { CONVERSATION_SEND_ASSIST_CHAT_MESSAGE_COMMAND } from '../../../commands/conversation-command.keys';\nimport { AXMEntityChatService } from '../../../mini-chat/entity-chat.service';\nimport { AXMChatConversationApi } from '../services/chat-conversation-apis.abstract';\nimport type { AXPAiChatFollowUpItemLite } from '../utils/ai-chat-lite.types';\nimport type { AXMSendAssistChatMessageOptions } from '../utils/assist-send-options.types';\nimport { axmSendAssistStarterPromptInPlace } from '../utils/assist-starter-prompt-send.util';\nimport { axmAssistNormalizeFollowUpItemsForConversation, axmAssistResolveFollowUpCommandName } from '../utils/assist-suggestion-chips.util';\n\n//#endregion\n\n//#region ---- Component ----\n\n/**\n * Assist suggestion chips (starter prompts and engine {@code followUp} segments).\n * Each item runs its platform command via {@link AXPCommandService}.\n */\n@Component({\n selector: 'axm-assist-suggestion-chips',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'axm-assist-suggestion-chips-host',\n '[class.axm-assist-suggestion-chips-host--compact]': 'compact()',\n },\n imports: [AsyncPipe, AXButtonModule, AXTranslationModule],\n template: `\n @if (normalizedItems().length > 0) {\n <div class=\"axm-assist-suggestion-chips\" role=\"list\" [attr.aria-label]=\"('@conversation:chat.starter-prompts.list-aria' | translate | async) ?? ''\">\n @for (item of normalizedItems(); track $index) {\n <ax-button class=\"axm-assist-suggestion-chips__chip rounded-full\" [class.text-sm]=\"compact()\" [look]=\"'twotone'\" [text]=\"resolveChipLabel(item)\" [disabled]=\"isInteractionBlocked()\" (onClick)=\"onChipClick(item)\"></ax-button>\n }\n </div>\n }\n `,\n styles: `\n :host {\n display: block;\n width: 100%;\n }\n\n .axm-assist-suggestion-chips {\n display: flex;\n flex-wrap: wrap;\n justify-content: center;\n gap: 0.75rem;\n padding: 2rem;\n }\n\n :host(.axm-assist-suggestion-chips-host--compact) .axm-assist-suggestion-chips {\n flex-direction: column;\n align-items: stretch;\n gap: 0.375rem;\n padding: 0.625rem 0 0;\n }\n\n :host(.axm-assist-suggestion-chips-host--compact) .axm-assist-suggestion-chips__chip {\n width: 100%;\n justify-content: flex-start;\n text-align: start;\n }\n `,\n})\nexport class AXMAssistSuggestionChipsComponent {\n readonly items = input<AXPAiChatFollowUpItemLite[]>([]);\n\n /** Tighter chip layout for mini-chat and other narrow panels. */\n readonly compact = input(false);\n\n /** When true, sends starter prompts via the local {@link AXConversationService} instead of routing to chat. */\n readonly sendInPlace = input(false);\n\n /** Disables all chips (e.g. parent composer is loading or sending). */\n readonly disabled = input(false);\n\n /** Emits when an in-place send creates a new conversation (mini chat empty state). */\n readonly conversationCreated = output<string>();\n\n protected readonly normalizedItems = computed(() => axmAssistNormalizeFollowUpItemsForConversation(this.items()));\n\n private readonly busy = signal(false);\n protected readonly isInteractionBlocked = computed(() => this.disabled() || this.busy());\n\n private readonly commandService = inject(AXPCommandService);\n private readonly conversationService = inject(AXConversationService);\n private readonly conversationApi = inject(AXMChatConversationApi);\n private readonly entityChatService = inject(AXMEntityChatService);\n private readonly assistCatalog = inject(AXM_CHAT_ASSIST_CATALOG_PORT, { optional: true });\n private readonly translationService = inject(AXTranslationService);\n private readonly layoutTheme = inject(AXPLayoutThemeService);\n\n protected async onChipClick(item: AXPAiChatFollowUpItemLite): Promise<void> {\n if (this.isInteractionBlocked()) {\n return;\n }\n\n const text = this.resolveItemText(item);\n if (!text) {\n return;\n }\n\n this.busy.set(true);\n this.layoutTheme.setOverlayLoading(true);\n try {\n if (this.sendInPlace() && this.isSendAssistChatMessageCommand(item)) {\n const catalog = this.assistCatalog;\n if (!catalog) {\n return;\n }\n const hadConversation = Boolean(this.conversationService.activeConversationId()?.trim());\n const result = await axmSendAssistStarterPromptInPlace(\n {\n conversationService: this.conversationService,\n conversationApi: this.conversationApi,\n entityChatService: this.entityChatService,\n assistCatalog: catalog,\n translationService: this.translationService,\n },\n text,\n (item.command.options ?? {}) as Partial<AXMSendAssistChatMessageOptions>,\n );\n\n if (result && !hadConversation) {\n this.conversationCreated.emit(result.conversationId);\n }\n return;\n }\n\n const rawName = item.command.name.trim();\n if (!rawName) {\n return;\n }\n\n const name = axmAssistResolveFollowUpCommandName(rawName, (key) => this.commandService.exists(key));\n if (!this.commandService.exists(name)) {\n console.warn('[AXMAssistSuggestionChips] Command is not registered:', rawName);\n return;\n }\n\n await this.commandService.execute(name, {\n ...(item.command.options ?? {}),\n text,\n });\n } finally {\n this.busy.set(false);\n this.layoutTheme.setOverlayLoading(false);\n }\n }\n\n protected resolveChipLabel(item: AXPAiChatFollowUpItemLite): string {\n return this.resolveItemText(item);\n }\n\n private isSendAssistChatMessageCommand(item: AXPAiChatFollowUpItemLite): boolean {\n const rawName = item.command.name.trim();\n if (!rawName) {\n return false;\n }\n\n const resolved = axmAssistResolveFollowUpCommandName(rawName, (key) => this.commandService.exists(key));\n return resolved === CONVERSATION_SEND_ASSIST_CHAT_MESSAGE_COMMAND;\n }\n\n private resolveItemText(item: AXPAiChatFollowUpItemLite): string {\n const label = item.text;\n if (typeof label === 'string') {\n const trimmed = label.trim();\n if (trimmed.startsWith('@')) {\n return (this.translationService.resolve(trimmed) ?? trimmed).trim();\n }\n return trimmed;\n }\n return (this.translationService.resolve(label) ?? '').trim();\n }\n}\n\n//#endregion\n","//#region ---- Imports ----\n\nimport type { AXPWidgetNode } from '@acorex-platform/framework-shared/core';\nimport type { AXConversationMessage } from '@acorex/components/conversation';\nimport {\n axpAiChatMessageIsDelegatedReflectionExcluded,\n axpAiDelegatedAgentResultSegments,\n type AXPAiChatFollowUpItem,\n type AXPAiChatMessage,\n type AXPAiChatResponse,\n type AXPAiDelegatedAgentResultSegment,\n} from '@acorex-platform/module-ai-management-client';\nimport { axmAssistNormalizeFollowUpItemsForConversation } from './assist-suggestion-chips.util';\n\n//#endregion\n\n//#region ---- Transcript read ----\n\n/**\n * Reorders assist transcript for debug UI: think first, tool/agent + tool results, then text blocks.\n */\nexport function axmNormalizeAssistTranscriptForChatUi(input: AXPAiChatMessage[]): AXPAiChatMessage[] {\n if (input.length === 0) {\n return input;\n }\n\n const thinkParts: string[] = [];\n const textParts: string[] = [];\n const middle: AXPAiChatMessage[] = [];\n\n for (const m of input) {\n if (m.role === 'tool' || m.role === 'user' || m.role === 'system') {\n middle.push(m);\n continue;\n }\n if (m.role !== 'assistant') {\n middle.push(m);\n continue;\n }\n for (const r of m.responses) {\n if (r.type === 'think') {\n thinkParts.push(r.content);\n } else if (r.type === 'text') {\n textParts.push(r.content);\n } else {\n middle.push({ role: 'assistant', responses: [r] } as AXPAiChatMessage);\n }\n }\n }\n\n const out: AXPAiChatMessage[] = [];\n if (thinkParts.length > 0) {\n out.push({\n role: 'assistant',\n responses: [{ type: 'think', content: thinkParts.join('\\n\\n') }],\n });\n }\n out.push(...middle);\n if (textParts.length > 0) {\n out.push({\n role: 'assistant',\n responses: [{ type: 'text', content: textParts.join('\\n\\n') }],\n });\n }\n return out;\n}\n\n/** Debug transcript from {@code metadata.transcripts} or streaming {@code metadata.transcriptDraft}. */\nexport function axmReadAssistAiTranscript(metadata: unknown): AXPAiChatMessage[] | null {\n if (typeof metadata !== 'object' || metadata == null) {\n return null;\n }\n const m = metadata as Record<string, unknown>;\n const final = m['transcripts'];\n const draft = m['transcriptDraft'];\n if (Array.isArray(final) && final.length > 0) {\n return axmNormalizeAssistTranscriptForChatUi(final as AXPAiChatMessage[]);\n }\n if (Array.isArray(draft) && draft.length > 0) {\n return axmNormalizeAssistTranscriptForChatUi(draft as AXPAiChatMessage[]);\n }\n return null;\n}\n\n/** Raw engine transcript (chronological), without debug UI reordering. */\nexport function axmReadAssistAiTranscriptRaw(metadata: unknown): AXPAiChatMessage[] {\n if (typeof metadata !== 'object' || metadata == null) {\n return [];\n }\n const m = metadata as Record<string, unknown>;\n const final = m['transcripts'];\n const draft = m['transcriptDraft'];\n if (Array.isArray(final) && final.length > 0) {\n return final as AXPAiChatMessage[];\n }\n if (Array.isArray(draft) && draft.length > 0) {\n return draft as AXPAiChatMessage[];\n }\n return [];\n}\n\n//#endregion\n\n//#region ---- Layout / synthetic helpers ----\n\nconst AXM_ASSIST_TRANSCRIPT_NON_WIDGET_TYPES = new Set<string>([\n 'text',\n 'think',\n 'image',\n 'audio',\n 'file',\n 'followUp',\n 'tool',\n 'agent',\n 'tool_result',\n 'agent_result',\n]);\n\nconst AXM_ASSIST_NODE_ENVELOPE_UNWRAP_MAX_DEPTH = 6;\n\n/** Chart Generator shorthand `type` values → registered dashboard widget ids. */\nconst AXM_ASSIST_CHART_WIDGET_TYPE_ALIASES: ReadonlyMap<string, string> = new Map([\n ['bar', 'DashboardManagement:Widget:Dashboard:BarChart'],\n ['bar-chart', 'DashboardManagement:Widget:Dashboard:BarChart'],\n ['barchart', 'DashboardManagement:Widget:Dashboard:BarChart'],\n ['donut', 'DashboardManagement:Widget:Dashboard:DonutChart'],\n ['donut-chart', 'DashboardManagement:Widget:Dashboard:DonutChart'],\n ['line', 'DashboardManagement:Widget:Dashboard:LineChart'],\n ['line-chart', 'DashboardManagement:Widget:Dashboard:LineChart'],\n ['funnel', 'DashboardManagement:Widget:Dashboard:FunnelChart'],\n ['funnel-chart', 'DashboardManagement:Widget:Dashboard:FunnelChart'],\n ['gauge', 'DashboardManagement:Widget:Dashboard:GaugeChart'],\n ['gauge-chart', 'DashboardManagement:Widget:Dashboard:GaugeChart'],\n ['heatmap', 'DashboardManagement:Widget:Dashboard:HeatmapChart'],\n ['heatmap-chart', 'DashboardManagement:Widget:Dashboard:HeatmapChart'],\n]);\n\nfunction axmResolveAssistChartWidgetType(type: string): string | undefined {\n const trimmed = type.trim();\n if (!trimmed) {\n return undefined;\n }\n if (trimmed.includes('Widget:')) {\n return trimmed;\n }\n return AXM_ASSIST_CHART_WIDGET_TYPE_ALIASES.get(trimmed.toLowerCase());\n}\n\nfunction axmIsAssistChartWidgetType(type: string): boolean {\n return axmResolveAssistChartWidgetType(type) != null;\n}\n\nfunction axmNormalizeChartWidgetOptions(options: Record<string, unknown>): void {\n if (Array.isArray(options['data']) && options['dataSource'] == null && options['items'] == null) {\n options['dataSource'] = options['data'];\n delete options['data'];\n }\n}\n\n/**\n * Normalizes AI-emitted widget nodes into layout-compatible {@link AXPWidgetNode} shape.\n * Chart row shapes are expanded at render time via {@link expandAiChartWidgetOptions} in dashboard chart loaders.\n */\nfunction axmNormalizeAssistWidgetNode(node: AXPWidgetNode): AXPWidgetNode {\n const rec = node as AXPWidgetNode & Record<string, unknown>;\n const resolvedType =\n typeof rec['type'] === 'string' ? axmResolveAssistChartWidgetType(rec['type']) : undefined;\n const props = rec['props'];\n const options: Record<string, unknown> = {\n ...((node.options ?? {}) as Record<string, unknown>),\n };\n\n if (props != null && typeof props === 'object' && !Array.isArray(props)) {\n Object.assign(options, props as Record<string, unknown>);\n }\n\n axmNormalizeChartWidgetOptions(options);\n\n const { props: _props, ...rest } = rec;\n return {\n ...rest,\n ...(resolvedType ? { type: resolvedType } : {}),\n options,\n } as AXPWidgetNode;\n}\n\nexport function axmAssistWidgetNodeFromUnknown(content: unknown, depth = 0): AXPWidgetNode | null {\n if (depth > AXM_ASSIST_NODE_ENVELOPE_UNWRAP_MAX_DEPTH) {\n return null;\n }\n if (content == null || typeof content !== 'object' || Array.isArray(content)) {\n return null;\n }\n const rec = content as Record<string, unknown>;\n const t = rec['type'];\n if (typeof t !== 'string') {\n return null;\n }\n if (t === 'node' && 'content' in rec) {\n return axmAssistWidgetNodeFromUnknown(rec['content'], depth + 1);\n }\n if (AXM_ASSIST_TRANSCRIPT_NON_WIDGET_TYPES.has(t)) {\n return null;\n }\n return axmNormalizeAssistWidgetNode(content as AXPWidgetNode);\n}\n\n/** Stable identity for widget nodes so embedded JSON vs structured `node` segments dedupe despite key order. */\nexport function axmAssistWidgetNodeDedupeKey(content: unknown): string {\n const node = axmAssistWidgetNodeFromUnknown(content);\n if (!node) {\n return `raw:${axmStableJsonStringify(content)}`;\n }\n const type = typeof node.type === 'string' ? node.type.trim() : '';\n const name = typeof node.name === 'string' ? node.name.trim() : '';\n if (type && name) {\n return `widget:${type}::${name}`;\n }\n return `widget:${axmStableJsonStringify(node)}`;\n}\n\nfunction axmStableJsonStringify(value: unknown): string {\n try {\n return JSON.stringify(value, (_key, nested) => {\n if (nested != null && typeof nested === 'object' && !Array.isArray(nested)) {\n const sorted: Record<string, unknown> = {};\n for (const key of Object.keys(nested as Record<string, unknown>).sort()) {\n sorted[key] = (nested as Record<string, unknown>)[key];\n }\n return sorted;\n }\n return nested;\n });\n } catch {\n return String(value);\n }\n}\n\nexport function axmSyntheticEmbedMessage(\n parent: AXConversationMessage,\n suffix: string,\n partial: Pick<AXConversationMessage, 'type' | 'payload'>,\n): AXConversationMessage {\n return {\n ...parent,\n id: `${parent.id}::${suffix}`,\n type: partial.type,\n payload: partial.payload,\n metadata: {\n ...(typeof parent.metadata === 'object' && parent.metadata != null ? parent.metadata : {}),\n assistEmbed: true,\n },\n replyTo: undefined,\n };\n}\n\n//#endregion\n\n//#region ---- Payload (last transcript line) ----\n\nexport const AXM_ASSIST_TRANSCRIPT_LINE_PAYLOAD_TYPE = 'assist-transcript-line' as const;\n\nexport interface AxmAssistTranscriptLinePayload {\n type: typeof AXM_ASSIST_TRANSCRIPT_LINE_PAYLOAD_TYPE;\n line: AXPAiChatMessage;\n}\n\nexport function axmNormalizeAssistTranscriptLineResponses(line: AXPAiChatMessage): AXPAiChatMessage {\n return line;\n}\n\n/** Last {@link AXPAiChatMessage} in the engine turn (index {@code length - 1}). */\nexport function axmAssistLastTranscriptLine(transcript: AXPAiChatMessage[]): AXPAiChatMessage | null {\n if (transcript.length === 0) {\n return null;\n }\n return axmNormalizeAssistTranscriptLineResponses(transcript[transcript.length - 1]!);\n}\n\nconst AXM_ASSIST_NON_MARKDOWN_JSON_TYPES = new Set(['node', 'followUp', 'tool', 'agent', 'file', 'error']);\n\n/**\n * Specialist / structured JSON relayed as {@code text} — not end-user markdown\n * ({@code node}, {@code followUp}, aggregates, widget layout, etc.).\n */\nfunction axmIsAssistInternalAgentJsonText(raw: string): boolean {\n const body = axmParseAssistTranscriptTextEnvelope(raw).body.trim();\n if (!body.startsWith('{') && !body.startsWith('[')) {\n return false;\n }\n try {\n const parsed = JSON.parse(body) as unknown;\n if (parsed == null) {\n return false;\n }\n if (Array.isArray(parsed)) {\n return true;\n }\n if (typeof parsed !== 'object') {\n return false;\n }\n const rec = parsed as Record<string, unknown>;\n if (typeof rec['resultType'] === 'string') {\n return true;\n }\n if (typeof rec['entityFullName'] === 'string' && ('data' in rec || 'aggregateRows' in rec)) {\n return true;\n }\n const type = rec['type'];\n if (typeof type === 'string') {\n if (\n AXM_ASSIST_NON_MARKDOWN_JSON_TYPES.has(type) ||\n type.includes('Widget:') ||\n axmIsAssistChartWidgetType(type)\n ) {\n return true;\n }\n }\n return false;\n } catch {\n return axmLooksLikeInternalAssistJsonPrefix(body);\n }\n}\n\nfunction axmLooksLikeInternalAssistJsonPrefix(raw: string): boolean {\n const trimmed = raw.trimStart();\n if (!trimmed.startsWith('{')) {\n return false;\n }\n return (\n /^\\{\\s*\"type\"\\s*:\\s*\"(?:node|followUp|tool|agent|file|error)\"/.test(trimmed) ||\n /^\\{\\s*\"resultType\"\\s*:/.test(trimmed) ||\n /^\\{\\s*\"type\"\\s*:\\s*\"[^\"]*Widget:/.test(trimmed) ||\n /^\\{\\s*\"type\"\\s*:\\s*\"(?:bar|donut|line|funnel|gauge|heatmap)(?:-chart)?\"/i.test(trimmed)\n );\n}\n\nfunction axmTryExtractJsonObjectAt(source: string, start: number): { json: string; end: number } | null {\n if (source[start] !== '{') {\n return null;\n }\n let depth = 0;\n let inString = false;\n let escape = false;\n for (let i = start; i < source.length; i++) {\n const ch = source[i];\n if (inString) {\n if (escape) {\n escape = false;\n } else if (ch === '\\\\') {\n escape = true;\n } else if (ch === '\"') {\n inString = false;\n }\n continue;\n }\n if (ch === '\"') {\n inString = true;\n continue;\n }\n if (ch === '{') {\n depth++;\n } else if (ch === '}') {\n depth--;\n if (depth === 0) {\n return { json: source.slice(start, i + 1), end: i + 1 };\n }\n }\n }\n return null;\n}\n\nfunction axmParseAssistRenderableResponseFromInternalJson(json: string): AXPAiChatResponse | null {\n if (!axmIsAssistInternalAgentJsonText(json)) {\n return null;\n }\n try {\n const parsed = JSON.parse(axmParseAssistTranscriptTextEnvelope(json).body.trim()) as unknown;\n if (parsed == null || typeof parsed !== 'object' || Array.isArray(parsed)) {\n return null;\n }\n const rec = parsed as Record<string, unknown>;\n const type = rec['type'];\n if (type === 'node' && 'content' in rec && axmAssistWidgetNodeFromUnknown(rec) != null) {\n return { type: 'node', content: rec['content'] };\n }\n if (typeof type === 'string' && axmAssistWidgetNodeFromUnknown(rec) != null) {\n return { type: 'node', content: rec };\n }\n if (type === 'followUp' && Array.isArray(rec['content'])) {\n const items = axmAssistNormalizeFollowUpItemsForConversation(rec['content'] as AXPAiChatFollowUpItem[]);\n return items.length > 0 ? { type: 'followUp', content: items } : null;\n }\n if (type === 'file' && rec['content'] != null && typeof rec['content'] === 'object' && !Array.isArray(rec['content'])) {\n const fileContent = rec['content'] as { fileId?: unknown; isDownloadable?: unknown };\n const fileId = typeof fileContent.fileId === 'string' ? fileContent.fileId.trim() : '';\n if (fileId) {\n return {\n type: 'file',\n content: {\n fileId,\n ...(fileContent.isDownloadable ? { isDownloadable: true } : {}),\n },\n };\n }\n }\n } catch {\n return null;\n }\n return null;\n}\n\nexport interface AxmAssistPartitionedAnswerText {\n markdown: string;\n renderable: AXPAiChatResponse[];\n}\n\n/**\n * Splits user-facing markdown from embedded {@code node}/{@code followUp} JSON so widgets render after text.\n */\nexport function axmPartitionAssistAnswerText(raw: string): AxmAssistPartitionedAnswerText {\n if (!raw) {\n return { markdown: '', renderable: [] };\n }\n const textParts: string[] = [];\n const renderable: AXPAiChatResponse[] = [];\n let i = 0;\n while (i < raw.length) {\n const braceAt = raw.indexOf('{', i);\n if (braceAt < 0) {\n textParts.push(raw.slice(i));\n break;\n }\n if (braceAt > i) {\n textParts.push(raw.slice(i, braceAt));\n }\n const extracted = axmTryExtractJsonObjectAt(raw, braceAt);\n if (extracted) {\n const structured = axmParseAssistRenderableResponseFromInternalJson(extracted.json);\n if (structured) {\n renderable.push(structured);\n } else if (!axmIsAssistInternalAgentJsonText(extracted.json)) {\n textParts.push(extracted.json);\n }\n i = extracted.end;\n continue;\n }\n if (axmLooksLikeInternalAssistJsonPrefix(raw.slice(braceAt))) {\n break;\n }\n textParts.push(raw[braceAt] ?? '');\n i = braceAt + 1;\n }\n return {\n markdown: textParts\n .join('')\n .replace(/\\n{3,}/g, '\\n\\n')\n .trim(),\n renderable,\n };\n}\n\n/** Removes embedded {@code node}/{@code followUp}/aggregate JSON from answer markdown (stream + finalize). */\nexport function axmSanitizeAssistUserAnswerText(raw: string): string {\n return axmPartitionAssistAnswerText(raw).markdown;\n}\n\n/** End-user markdown from the supervisor — excludes empty fences and internal JSON blobs. */\nfunction axmIsUserVisibleAssistTextContent(raw: string): boolean {\n const body = axmParseAssistTranscriptTextEnvelope(raw).body.trim();\n if (!body || body === '```' || body === '```json') {\n return false;\n }\n return !axmIsAssistInternalAgentJsonText(raw);\n}\n\nfunction axmAssistTextSegmentHasUserVisibleContent(raw: string): boolean {\n const partitioned = axmPartitionAssistAnswerText(axmParseAssistTranscriptTextEnvelope(raw).body);\n if (partitioned.renderable.length > 0) {\n return true;\n }\n if (partitioned.markdown.trim()) {\n return true;\n }\n return axmIsUserVisibleAssistTextContent(raw);\n}\n\nfunction axmPushPartitionedAssistAnswerItems(\n out: AxmAssistUserVisibleItem[],\n raw: string,\n nodeKeys?: Set<string>,\n): void {\n const partitioned = axmPartitionAssistAnswerText(axmParseAssistTranscriptTextEnvelope(raw).body);\n if (partitioned.markdown.trim()) {\n out.push({ kind: 'text', content: partitioned.markdown });\n }\n for (const response of partitioned.renderable) {\n if (response.type === 'node') {\n if (nodeKeys) {\n const key = axmAssistWidgetNodeDedupeKey(response.content);\n if (nodeKeys.has(key)) {\n continue;\n }\n nodeKeys.add(key);\n }\n out.push({ kind: 'node', content: response.content });\n }\n }\n if (partitioned.markdown.trim() === '' && partitioned.renderable.length === 0 && axmIsUserVisibleAssistTextContent(raw)) {\n out.push({ kind: 'text', content: raw });\n }\n}\n\n/**\n * Merges streamed answer markdown with transcript-derived text so finalize does not drop interim narration.\n */\nexport function axmResolveAssistFinalAnswerText(streamDraft: string, transcriptAnswer: string): string {\n const stream = axmSanitizeAssistUserAnswerText(streamDraft);\n const transcript = axmSanitizeAssistUserAnswerText(transcriptAnswer);\n if (!stream) {\n return transcript;\n }\n if (!transcript) {\n return stream;\n }\n if (stream.includes(transcript)) {\n return stream;\n }\n if (transcript.includes(stream)) {\n return transcript;\n }\n return axmSanitizeAssistUserAnswerText(`${stream}\\n\\n${transcript}`);\n}\n\nfunction axmMergeAssistPayloadResponses(\n line: AXPAiChatMessage,\n partitioned: AxmAssistPartitionedAnswerText,\n): AXPAiChatMessage {\n const nodeKeys = new Set<string>();\n const fileIds = new Set<string>();\n const attachments: AXPAiChatResponse[] = [];\n let followUp: Extract<AXPAiChatResponse, { type: 'followUp' }> | null = null;\n\n const tryPush = (seg: AXPAiChatResponse): void => {\n if (seg.type === 'node') {\n const key = axmAssistWidgetNodeDedupeKey(seg.content);\n if (nodeKeys.has(key)) {\n return;\n }\n nodeKeys.add(key);\n attachments.push(seg);\n return;\n }\n if (seg.type === 'file') {\n const fileId = seg.content.fileId?.trim() ?? '';\n if (fileId && fileIds.has(fileId)) {\n return;\n }\n if (fileId) {\n fileIds.add(fileId);\n }\n attachments.push(seg);\n return;\n }\n if (seg.type === 'followUp' && followUp == null && seg.content.length > 0) {\n followUp = seg;\n }\n };\n\n for (const seg of line.responses) {\n if (seg.type === 'node' || seg.type === 'file') {\n tryPush(seg);\n } else if (seg.type === 'followUp') {\n tryPush(seg);\n }\n }\n for (const seg of partitioned.renderable) {\n tryPush(seg);\n }\n\n const responses: AXPAiChatResponse[] = [];\n if (partitioned.markdown) {\n responses.push({ type: 'text', content: partitioned.markdown });\n }\n responses.push(...attachments);\n if (followUp) {\n responses.push(followUp);\n }\n if (responses.length === 0) {\n return line;\n }\n return axmNormalizeAssistTranscriptLineResponses({ role: 'assistant', responses });\n}\n\n/** Replaces the payload line's text segment with the finalized answer markdown. */\nexport function axmApplyAnswerTextToAssistPayloadLine(line: AXPAiChatMessage, answerText: string): AXPAiChatMessage {\n const partitioned = axmPartitionAssistAnswerText(answerText);\n if (!partitioned.markdown && partitioned.renderable.length === 0) {\n return line;\n }\n return axmMergeAssistPayloadResponses(line, partitioned);\n}\n\n/**\n * User-facing payload line for the assist bubble: supervisor markdown narration for the turn, plus\n * {@code node}/{@code file}/{@code followUp} from the turn (including specialist {@code agent_result}).\n */\nexport function axmAssistUserFacingPayloadLine(transcript: AXPAiChatMessage[]): AXPAiChatMessage | null {\n if (transcript.length === 0) {\n return null;\n }\n\n let lastUserIdx = -1;\n for (let i = transcript.length - 1; i >= 0; i--) {\n if (transcript[i].role === 'user') {\n lastUserIdx = i;\n break;\n }\n }\n const tail = lastUserIdx >= 0 ? transcript.slice(lastUserIdx) : transcript;\n\n const attachmentResponses: AXPAiChatResponse[] = [];\n const rawTextBodies: string[] = [];\n let followUpItems: AXPAiChatFollowUpItem[] | null = null;\n const nodeKeys = new Set<string>();\n const fileIds = new Set<string>();\n\n const tryPushAttachment = (seg: AXPAiChatResponse): void => {\n if (seg.type === 'node') {\n const key = axmAssistWidgetNodeDedupeKey(seg.content);\n if (nodeKeys.has(key)) {\n return;\n }\n nodeKeys.add(key);\n } else if (seg.type === 'file') {\n const fileId = seg.content.fileId?.trim() ?? '';\n if (fileId && fileIds.has(fileId)) {\n return;\n }\n if (fileId) {\n fileIds.add(fileId);\n }\n } else {\n return;\n }\n attachmentResponses.push(seg);\n };\n\n for (const m of tail) {\n if (m.role === 'assistant' && !axpAiChatMessageIsDelegatedReflectionExcluded(m)) {\n for (const r of m.responses) {\n if (r.type === 'text') {\n const body = axmParseAssistTranscriptTextEnvelope(r.content).body.trim();\n if (body) {\n rawTextBodies.push(body);\n }\n } else if (r.type === 'node' || r.type === 'file') {\n tryPushAttachment(r);\n } else if (r.type === 'followUp') {\n followUpItems = r.content;\n }\n }\n continue;\n }\n if (m.role !== 'tool') {\n continue;\n }\n for (const r of m.responses) {\n if (r.type !== 'agent_result') {\n continue;\n }\n const payload = r.content;\n if (payload.success !== true || payload.data?.responses == null) {\n continue;\n }\n for (const seg of payload.data.responses) {\n if (seg.type === 'followUp' && followUpItems == null) {\n followUpItems = seg.content;\n } else if (seg.type === 'node' || seg.type === 'file') {\n tryPushAttachment(seg);\n }\n }\n }\n }\n\n const partitioned = axmPartitionAssistAnswerText(\n rawTextBodies\n .map((body) => body.trim())\n .filter((body) => body.length > 0)\n .join('\\n\\n'),\n );\n for (const seg of partitioned.renderable) {\n if (seg.type === 'node' || seg.type === 'file') {\n tryPushAttachment(seg);\n } else if (seg.type === 'followUp' && followUpItems == null) {\n followUpItems = seg.content;\n }\n }\n\n const responses: AXPAiChatResponse[] = [];\n if (partitioned.markdown) {\n responses.push({ type: 'text', content: partitioned.markdown });\n }\n responses.push(...attachmentResponses);\n if (followUpItems != null && followUpItems.length > 0) {\n responses.push({ type: 'followUp', content: followUpItems });\n }\n if (responses.length === 0) {\n return null;\n }\n return axmNormalizeAssistTranscriptLineResponses({ role: 'assistant', responses });\n}\n\nexport function axmBuildAssistTranscriptLinePayload(line: AXPAiChatMessage): AxmAssistTranscriptLinePayload {\n return {\n type: AXM_ASSIST_TRANSCRIPT_LINE_PAYLOAD_TYPE,\n line: axmNormalizeAssistTranscriptLineResponses(line),\n };\n}\n\nexport function axmParseAssistTranscriptLinePayload(payload: unknown): AXPAiChatMessage | null {\n if (payload == null || typeof payload !== 'object' || Array.isArray(payload)) {\n return null;\n }\n const rec = payload as Record<string, unknown>;\n if (rec['type'] !== AXM_ASSIST_TRANSCRIPT_LINE_PAYLOAD_TYPE) {\n return null;\n }\n const line = rec['line'];\n if (line == null || typeof line !== 'object' || Array.isArray(line)) {\n return null;\n }\n const lm = line as AXPAiChatMessage;\n if (!Array.isArray(lm.responses)) {\n return null;\n }\n return axmNormalizeAssistTranscriptLineResponses(lm);\n}\n\n//#endregion\n\n//#region ---- Text envelope ----\n\n/** Reads finalized `{ type: 'text' }` assist payloads for markdown rendering. */\nexport function axmReadPlainTextMessagePayload(payload: unknown): string {\n if (!payload || typeof payload !== 'object') {\n return '';\n }\n const record = payload as Record<string, unknown>;\n if (record['type'] !== 'text') {\n return '';\n }\n const text = record['text'];\n return typeof text === 'string' ? text : '';\n}\n\nexport function axmParseAssistTranscriptTextEnvelope(raw: string): { thinking: string | null; body: string } {\n if (!raw) {\n return { thinking: null, body: '' };\n }\n\n const normalized = raw.replace(/&lt;(\\/?redacted_thinking)&gt;/gi, '<$1>');\n const parts: string[] = [];\n const body = normalized\n .replace(/<think>([\\s\\S]*?)<\\/redacted_thinking>/gi, (_m, inner: string) => {\n const t = inner.trim();\n if (t) {\n parts.push(t);\n }\n return '';\n })\n .trim();\n\n return { thinking: parts.length ? parts.join('\\n\\n') : null, body };\n}\n\n//#endregion\n\n//#region ---- User-mode visible segments (non-debug bubble) ----\n\nfunction axmUserVisibleDelegatedSegment(seg: AXPAiDelegatedAgentResultSegment): boolean {\n if (seg.type === 'think') {\n return false;\n }\n if (seg.type === 'node') {\n return axmAssistWidgetNodeFromUnknown(seg.content) != null;\n }\n if (seg.type === 'file') {\n return true;\n }\n if (seg.type === 'text') {\n return axmAssistTextSegmentHasUserVisibleContent(seg.content);\n }\n if (seg.type === 'followUp') {\n return seg.content.length > 0;\n }\n return false;\n}\n\nfunction axmUserVisibleChatResponse(line: AXPAiChatMessage, seg: AXPAiChatResponse): boolean {\n if (line.role === 'assistant') {\n if (seg.type === 'think') {\n return false;\n }\n if (seg.type === 'node') {\n return axmAssistWidgetNodeFromUnknown(seg.content) != null;\n }\n if (seg.type === 'file') {\n return true;\n }\n if (seg.type === 'text') {\n return axmAssistTextSegmentHasUserVisibleContent(seg.content);\n }\n if (seg.type === 'followUp') {\n return seg.content.length > 0;\n }\n return false;\n }\n if (line.role === 'tool' && seg.type === 'agent_result') {\n const c = seg.content as { success?: unknown; data?: unknown };\n if (c.success !== true || c.data == null || typeof c.data !== 'object' || Array.isArray(c.data)) {\n return false;\n }\n const responses = (c.data as Record<string, unknown>)['responses'];\n return axpAiDelegatedAgentResultSegments({\n success: true,\n data: { responses: responses as AXPAiDelegatedAgentResultSegment[] },\n }).some(axmUserVisibleDelegatedSegment);\n }\n return false;\n}\n\n/** Flattened user-visible items for one transcript line (payload bubble). */\nexport type AxmAssistUserVisibleItem =\n | { kind: 'text'; content: string }\n | { kind: 'node'; content: unknown }\n | { kind: 'file'; fileId: string; isDownloadable?: boolean }\n | { kind: 'followUp'; items: AXPAiChatFollowUpItem[] };\n\nexport function axmAssistUserVisibleItemsForLine(line: AXPAiChatMessage): AxmAssistUserVisibleItem[] {\n const out: AxmAssistUserVisibleItem[] = [];\n let followUpPushed = false;\n const nodeKeys = new Set<string>();\n\n const tryPushNode = (content: unknown): void => {\n const key = axmAssistWidgetNodeDedupeKey(content);\n if (nodeKeys.has(key)) {\n return;\n }\n nodeKeys.add(key);\n out.push({ kind: 'node', content });\n };\n\n for (const seg of line.responses) {\n if (line.role === 'assistant') {\n if (seg.type === 'text' && axmUserVisibleChatResponse(line, seg)) {\n axmPushPartitionedAssistAnswerItems(out, seg.content, nodeKeys);\n } else if (seg.type === 'node' && axmUserVisibleChatResponse(line, seg)) {\n tryPushNode(seg.content);\n } else if (seg.type === 'file') {\n out.push({\n kind: 'file',\n fileId: seg.content.fileId,\n ...(seg.content.isDownloadable ? { isDownloadable: true } : {}),\n });\n } else if (seg.type === 'followUp' && !followUpPushed && axmUserVisibleChatResponse(line, seg)) {\n out.push({ kind: 'followUp', items: seg.content });\n followUpPushed = true;\n }\n continue;\n }\n if (line.role === 'tool' && seg.type === 'agent_result') {\n const c = seg.content as { success?: unknown; data?: unknown };\n if (c.success !== true || c.data == null || typeof c.data !== 'object' || Array.isArray(c.data)) {\n continue;\n }\n const responses = (c.data as Record<string, unknown>)['responses'];\n for (const ds of axpAiDelegatedAgentResultSegments({\n success: true,\n data: { responses: responses as AXPAiDelegatedAgentResultSegment[] },\n })) {\n if (!axmUserVisibleDelegatedSegment(ds)) {\n continue;\n }\n if (ds.type === 'text' && axmAssistTextSegmentHasUserVisibleContent(ds.content)) {\n axmPushPartitionedAssistAnswerItems(out, ds.content, nodeKeys);\n } else if (ds.type === 'node') {\n tryPushNode(ds.content);\n } else if (ds.type === 'file') {\n out.push({\n kind: 'file',\n fileId: ds.content.fileId,\n ...(ds.content.isDownloadable ? { isDownloadable: true } : {}),\n });\n } else if (ds.type === 'followUp' && !followUpPushed) {\n out.push({ kind: 'followUp', items: ds.content });\n followUpPushed = true;\n }\n }\n }\n }\n\n return out;\n}\n\n/** Parses a raw {@code followUp} segment for UI (normalizes chip commands). */\nexport function axmAssistFollowUpItemsFromUnknown(raw: unknown): AXPAiChatFollowUpItem[] {\n if (!raw || typeof raw !== 'object' || Array.isArray(raw)) {\n return [];\n }\n const rec = raw as Record<string, unknown>;\n if (rec['type'] !== 'followUp') {\n return [];\n }\n const content = rec['content'];\n if (!Array.isArray(content)) {\n return [];\n }\n return axmAssistNormalizeFollowUpItemsForConversation(content as AXPAiChatFollowUpItem[]);\n}\n\n//#endregion\n\n","//#region ---- Imports ----\n\nimport { AXPopupService } from '@acorex/components/popup';\nimport { AXTranslationService } from '@acorex/core/translation';\nimport {\n axpAiParseSupervisorAgentToolName,\n type AXPAiDelegatedAgentTranscriptEntry,\n} from '@acorex-platform/module-ai-management-client';\nimport type { AXMAssistDelegatedAgentDetailPopupData } from '../message-renderers/assist-delegated-agent-detail-popup.component';\n\n//#endregion\n\n//#region ---- Types ----\n\nexport interface AXMOpenAssistDelegatedAgentDetailOptions {\n callId: string;\n toolName: string;\n delegatedTranscriptsByCallId: Record<string, AXPAiDelegatedAgentTranscriptEntry>;\n resolvedAgentLabel?: string;\n resolveCatalogTitle?: (agentCatalogId: string) => string | undefined;\n agentTitleById?: Record<string, string>;\n translationService: AXTranslationService;\n popupService: AXPopupService;\n}\n\n//#endregion\n\n//#region ---- Dialog ----\n\n/**\n * Opens a read-only specialist sub-run transcript for one delegated {@code agent:*} tool call.\n * Renders {@link AXPAiChatMessage} lines (role + responses[]) in conversation-owned UI.\n */\nexport async function axmOpenAssistDelegatedAgentDetailDialog(\n options: AXMOpenAssistDelegatedAgentDetailOptions,\n): Promise<void> {\n const callId = options.callId?.trim() ?? '';\n if (!callId) {\n return;\n }\n\n const entry = options.delegatedTranscriptsByCallId[callId];\n const catalogId = axpAiParseSupervisorAgentToolName(options.toolName);\n const catalogTitle =\n catalogId != null ? options.resolveCatalogTitle?.(catalogId)?.trim() : undefined;\n const titleBase =\n options.resolvedAgentLabel?.trim() ||\n entry?.agentName?.trim() ||\n catalogTitle ||\n options.toolName.trim() ||\n callId;\n\n const [titleSuffix, missingHint] = await Promise.all([\n options.translationService.translateAsync(\n '@conversation:chat.assist-renderer.delegated-agent.dialog-title-suffix',\n ),\n options.translationService.translateAsync(\n '@conversation:chat.assist-renderer.delegated-agent.transcript-missing',\n ),\n ]);\n\n const comp = (await import('../message-renderers/assist-delegated-agent-detail-popup.component'))\n .AXMAssistDelegatedAgentDetailPopupComponent;\n\n const data: AXMAssistDelegatedAgentDetailPopupData = {\n delegationCallId: callId,\n messages: entry?.messages ?? [],\n runInput: entry?.runInput,\n agentName: entry?.agentName?.trim() || titleBase,\n emptyHint: entry?.messages?.length ? undefined : missingHint,\n agentTitleById: options.agentTitleById ?? (catalogId && catalogTitle ? { [catalogId]: catalogTitle } : {}),\n };\n\n await options.popupService.open(comp, {\n title: `${titleBase} — ${titleSuffix ?? 'Full Specialist Run'}`,\n size: 'lg',\n data,\n });\n}\n\n//#endregion\n","//#region ---- Imports -----\n\nimport { AXPopupService } from '@acorex/components/popup';\nimport type { AXMAssistToolDetailPopupData } from '../message-renderers/assist-tool-detail-popup.component';\n\n//#endregion\n\n//#region ---- Dialog -----\n\nexport interface AXMOpenAssistToolDetailOptions {\n toolTitle: string;\n inputJson: string;\n outputJson?: string;\n popupService: AXPopupService;\n}\n\nexport async function axmOpenAssistToolDetailDialog(options: AXMOpenAssistToolDetailOptions): Promise<void> {\n const comp = (await import('../message-renderers/assist-tool-detail-popup.component'))\n .AXMAssistToolDetailPopupComponent;\n\n const data: AXMAssistToolDetailPopupData = {\n toolTitle: options.toolTitle.trim() || 'Tool',\n inputJson: options.inputJson,\n outputJson: options.outputJson,\n };\n\n await options.popupService.open(comp, {\n title: data.toolTitle,\n size: 'md',\n data,\n });\n}\n\n//#endregion\n","//#region ---- Types ----\n\n/** Persisted on assist message metadata (`assistResponseStatus`). */\nexport type AxmAssistResponseStatus = 'streaming' | 'complete' | 'incomplete' | 'failed';\n\n//#endregion\n\n//#region ---- Readers ----\n\n/**\n * Resolves assist response lifecycle from message metadata.\n * Falls back to legacy `isStreaming` when `assistResponseStatus` is absent.\n */\nexport function axmReadAssistResponseStatus(metadata: unknown): AxmAssistResponseStatus {\n const meta = metadata as Record<string, unknown> | undefined;\n if (!meta) {\n return 'complete';\n }\n\n const status = meta['assistResponseStatus'];\n if (\n status === 'streaming' ||\n status === 'complete' ||\n status === 'incomplete' ||\n status === 'failed'\n ) {\n return status;\n }\n\n if (meta['isStreaming'] === true) {\n return 'streaming';\n }\n\n return 'complete';\n}\n\n/** User-facing error stored when generation fails (`assistResponseError`). */\nexport function axmReadReplyToUserMessageId(metadata: unknown): string | undefined {\n const meta = metadata as Record<string, unknown> | undefined;\n const replyTo = meta?.['replyToUserMessageId'];\n return typeof replyTo === 'string' && replyTo.trim() ? replyTo.trim() : undefined;\n}\n\nexport function axmReadAssistResponseError(metadata: unknown): string | undefined {\n const meta = metadata as Record<string, unknown> | undefined;\n if (!meta) {\n return undefined;\n }\n const err = meta['assistResponseError'];\n return typeof err === 'string' && err.trim() ? err.trim() : undefined;\n}\n\nexport function axmIsAssistRetryableStatus(status: AxmAssistResponseStatus): boolean {\n return status === 'incomplete' || status === 'failed';\n}\n\nexport function axmIsAssistStreamingStatus(status: AxmAssistResponseStatus): boolean {\n return status === 'streaming';\n}\n\nexport function axmIsAssistTerminalStatus(status: AxmAssistResponseStatus): boolean {\n return status === 'complete' || status === 'failed' || status === 'incomplete';\n}\n\n/** Finalize metadata persisted when a run completes (even if status lags). */\nexport function axmAssistHasFinalizeMetadata(metadata: unknown): boolean {\n const meta = metadata as Record<string, unknown> | undefined;\n if (!meta) {\n return false;\n }\n return meta['assistRunDurationMs'] != null || meta['assistRunUsageTotals'] != null;\n}\n\n/** Persisted terminal assist state should win over stale in-memory streaming cache. */\nexport function axmShouldPreferPersistedAssistOverLiveCache(persisted: { metadata?: unknown }, live: { metadata?: unknown }): boolean {\n const persistedStatus = axmReadAssistResponseStatus(persisted.metadata);\n const liveStatus = axmReadAssistResponseStatus(live.metadata);\n if (liveStatus !== 'streaming') {\n return false;\n }\n return persistedStatus === 'failed' || persistedStatus === 'complete' || persistedStatus === 'incomplete';\n}\n\n/**\n * True when a row is still marked `streaming` but already contains a finished assist reply\n * (e.g. finalize persisted payload but not status, or the page reloaded before terminal persist).\n *\n * Do not treat live `streamDraftText` (or draft mirrored into `payload.text` for display) as complete.\n */\nexport function axmAssistPersistedMessageLooksComplete(message: {\n payload?: unknown;\n metadata?: unknown;\n}): boolean {\n const meta = message.metadata as Record<string, unknown> | undefined;\n if (meta?.['assistRunDurationMs'] != null || meta?.['assistRunUsageTotals'] != null) {\n return true;\n }\n\n const transcripts = meta?.['transcripts'];\n if (Array.isArray(transcripts) && transcripts.length > 0) {\n return true;\n }\n\n // Mid-stream drafts are not a finished reply — even if UI mirrored them into payload.text.\n if (axmReadAssistResponseStatus(meta) === 'streaming') {\n const streamDraft =\n typeof meta?.['streamDraftText'] === 'string' ? meta['streamDraftText'].trim() : '';\n if (streamDraft.length > 0 || meta?.['isStreaming'] === true) {\n return false;\n }\n }\n\n const payload = message.payload as Record<string, unknown> | undefined;\n if (payload?.['type'] === 'text' && typeof payload['text'] === 'string' && payload['text'].trim().length > 0) {\n return true;\n }\n if (payload?.['type'] === 'assist-transcript-line' && payload['line'] != null) {\n return true;\n }\n\n return false;\n}\n\n//#endregion\n","/**\n * Detects strong RTL scripts (Arabic / Persian / Hebrew and related blocks) in a string\n * so each assist transcript segment can set `dir` independently of the app locale.\n */\nconst ASSIST_SEGMENT_STRONG_RTL =\n /[\\u0591-\\u08FF\\uFB1D-\\uFDFF\\uFE70-\\uFEFC]/u;\n\n/**\n * Returns `rtl` when the segment contains any character from RTL scripts (e.g. Persian/Farsi),\n * otherwise `ltr`. Empty or whitespace-only strings are `ltr`.\n */\nexport function axmAssistSegmentDirection(text: string | null | undefined): 'rtl' | 'ltr' {\n if (text == null) return 'ltr';\n const s = String(text);\n if (!s.trim()) return 'ltr';\n return ASSIST_SEGMENT_STRONG_RTL.test(s) ? 'rtl' : 'ltr';\n}\n","//#region ---- Imports ----\n\nimport type { AXConversation } from '@acorex/components/conversation';\nimport { AXMConversationRoom } from '@acorex-platform/module-conversation-client/contracts';\nimport { coerceUnknownToTrimmedString } from '@acorex-platform/framework-shared/core';\nimport { isEmpty, trim } from 'lodash';\n\n//#endregion\n\n//#region ---- Normalization ----\n\n/** Treats empty or whitespace-only avatar/icon strings as absent. */\nexport function axmNormalizeChatMediaValue(\n value: string | undefined,\n): string | undefined {\n const normalized = trim(value ?? '');\n return normalized.length > 0 ? normalized : undefined;\n}\n\n\nfunction axmResolvePrivatePeerParticipant(\n room: AXMConversationRoom,\n currentUserId?: string,\n): (typeof room.participants)[number] | undefined {\n if (room.type !== 'private') {\n return undefined;\n }\n\n const scopedUserId = coerceUnknownToTrimmedString(currentUserId);\n if (!scopedUserId) {\n return undefined;\n }\n\n return room.participants.find(\n (participant) => participant.id !== scopedUserId,\n );\n}\n\n//#endregion\n\n//#region ---- Conversation avatar resolution ----\n\n/**\n * Enriches private 1v1 rooms with viewer-scoped title/avatar/icon from the peer participant.\n */\nexport function axmEnrichRoomAvatar(\n room: AXMConversationRoom,\n currentUserId?: string,\n): AXMConversationRoom {\n if (room.type !== 'private') {\n return room;\n }\n\n const peer = axmResolvePrivatePeerParticipant(room, currentUserId);\n if (!peer) {\n return room;\n }\n\n const avatar = axmNormalizeChatMediaValue(room.avatar) ?? axmNormalizeChatMediaValue(peer.avatar);\n const icon = axmNormalizeChatMediaValue(room.icon) ?? axmNormalizeChatMediaValue(peer.icon);\n const title = peer.name || room.title;\n\n if (\n avatar === axmNormalizeChatMediaValue(room.avatar) &&\n icon === axmNormalizeChatMediaValue(room.icon) &&\n title === room.title\n ) {\n return room;\n }\n\n return {\n ...room,\n title,\n avatar,\n icon,\n };\n}\n\n/** Resolves display avatar/icon/title for compact conversation list rows. */\nexport function axmResolveConversationListAvatar(\n conversation: AXConversation,\n): {\n title: string;\n avatar?: string;\n icon?: string;\n} {\n return {\n title: conversation.title,\n avatar: axmNormalizeChatMediaValue(conversation.avatar),\n icon: axmNormalizeChatMediaValue(conversation.icon),\n };\n}\n\n/** True when the conversation row should render an image avatar. */\nexport function axmConversationHasAvatarImage(\n conversation: AXConversation,\n): boolean {\n return !isEmpty(axmNormalizeChatMediaValue(conversation.avatar));\n}\n\n//#endregion\n","//#region ---- Imports ----\n\nimport type { AXMAssistConversationSnapshotLite } from './ai-chat-lite.types';\n\n//#endregion\n\n//#region ---- Assist metadata ----\n\n/**\n * Resolves assist id from conversation metadata.\n */\nexport function axmExtractAssistIdFromMetadata(metadata: Record<string, unknown> | undefined): string | undefined {\n if (!metadata) {\n return undefined;\n }\n const direct = metadata['assistId'];\n if (typeof direct === 'string' && direct.trim()) {\n return direct.trim();\n }\n const nested = metadata['metadata'];\n if (nested && typeof nested === 'object' && nested !== null) {\n const inner = (nested as Record<string, unknown>)['assistId'];\n if (typeof inner === 'string' && inner.trim()) {\n return inner.trim();\n }\n }\n return undefined;\n}\n\n/**\n * Resolves direct agent id from conversation metadata (agent-as-assist chat).\n */\nexport function axmExtractDirectAgentIdFromMetadata(\n metadata: Record<string, unknown> | undefined,\n): string | undefined {\n if (!metadata) {\n return undefined;\n }\n const direct = metadata['directAgentId'];\n if (typeof direct === 'string' && direct.trim()) {\n return direct.trim();\n }\n const nested = metadata['metadata'];\n if (nested && typeof nested === 'object' && nested !== null) {\n const inner = (nested as Record<string, unknown>)['directAgentId'];\n if (typeof inner === 'string' && inner.trim()) {\n return inner.trim();\n }\n }\n return undefined;\n}\n\n/** True when the conversation targets an assist catalog row or a direct agent-as-assist chat. */\nexport function axmConversationHasAiChat(metadata: Record<string, unknown> | undefined): boolean {\n return !!(axmExtractAssistIdFromMetadata(metadata) ?? axmExtractDirectAgentIdFromMetadata(metadata));\n}\n\nfunction isAssistSnapshot(value: unknown): value is AXMAssistConversationSnapshotLite {\n return value != null && typeof value === 'object';\n}\n\n/** Reads embedded assist welcome/model fields stamped at conversation create. */\nexport function axmExtractAssistSnapshotFromMetadata(\n metadata: Record<string, unknown> | undefined,\n): AXMAssistConversationSnapshotLite | null {\n if (!metadata) {\n return null;\n }\n const direct = metadata['assistSnapshot'];\n if (isAssistSnapshot(direct)) {\n return direct;\n }\n const nested = metadata['metadata'];\n if (nested && typeof nested === 'object' && nested !== null) {\n const inner = (nested as Record<string, unknown>)['assistSnapshot'];\n if (isAssistSnapshot(inner)) {\n return inner;\n }\n }\n return null;\n}\n\n/** Resolves model entity id from conversation metadata (snapshot or persisted patch). */\nexport function axmExtractModelEntityIdFromMetadata(\n metadata: Record<string, unknown> | undefined,\n): string | undefined {\n if (!metadata) {\n return undefined;\n }\n const direct = metadata['modelEntityId'];\n if (typeof direct === 'string' && direct.trim()) {\n return direct.trim();\n }\n const snapshot = axmExtractAssistSnapshotFromMetadata(metadata);\n const fromSnapshot = snapshot?.modelId;\n if (typeof fromSnapshot === 'string' && fromSnapshot.trim()) {\n return fromSnapshot.trim();\n }\n return undefined;\n}\n\n//#endregion\n","import type { AXConversationCreateData, AXConversationParticipant } from '@acorex/components/conversation';\n\nimport {\n axmExtractAssistIdFromMetadata,\n axmExtractDirectAgentIdFromMetadata,\n} from './assist-metadata.util';\nimport { axmChatAiPeerParticipantId } from './chat-ai-target.util';\n\n/**\n * True when the participant is an AI Assist peer (synthetic `assist-*` id or assist metadata).\n * Such entries should not appear in human-only pickers (e.g. regular \"New chat\").\n */\nexport function axmIsAssistPeerParticipant(participant: AXConversationParticipant): boolean {\n if (typeof participant.id === 'string' && participant.id.startsWith('assist-')) {\n return true;\n }\n const meta = participant.metadata as Record<string, unknown> | undefined;\n if (!meta) {\n return false;\n }\n if (meta['kind'] === 'assist') {\n return true;\n }\n const assistId = meta['assistId'];\n return typeof assistId === 'string' && assistId.trim().length > 0;\n}\n\n/**\n * Builds a synthetic assist peer for entity-backed room creation when the id is not a security user.\n */\nexport function axmBuildAssistPeerParticipantFromCreateData(\n participantId: string,\n data: AXConversationCreateData,\n): AXConversationParticipant | null {\n const meta = (data.metadata ?? {}) as Record<string, unknown>;\n const assistId = axmExtractAssistIdFromMetadata(meta);\n const directAgentId = axmExtractDirectAgentIdFromMetadata(meta);\n const catalogPeerId = directAgentId ?? assistId;\n if (!catalogPeerId || (data.type !== 'private' && data.type !== 'bot')) {\n return null;\n }\n const expectedId = axmChatAiPeerParticipantId(catalogPeerId);\n if (participantId !== expectedId) {\n return null;\n }\n const name = typeof data.title === 'string' && data.title.trim() ? data.title.trim() : 'AI Assistant';\n return {\n id: participantId,\n name,\n avatar: data.avatar,\n icon: data.icon,\n status: 'online',\n role: 'member',\n metadata: directAgentId\n ? { directAgentId, kind: 'agent-assist' }\n : { assistId: catalogPeerId, kind: 'assist' },\n };\n}\n\n/**\n * Minimal assist peer for lookups by synthetic `assist-*` participant id.\n */\nexport function axmBuildAssistPeerParticipantFromId(participantId: string): AXConversationParticipant | null {\n if (!participantId.startsWith('assist-')) {\n return null;\n }\n const catalogPeerId = participantId.slice('assist-'.length).trim();\n if (!catalogPeerId) {\n return null;\n }\n return {\n id: participantId,\n name: 'AI Assistant',\n status: 'online',\n role: 'member',\n metadata: { assistId: catalogPeerId, kind: 'assist' },\n };\n}\n","//#region ---- Imports ----\n\nimport type { AXConversation } from '@acorex/components/conversation';\nimport { axmBuildHeuristicConversationTitleFallback } from '@acorex-platform/module-conversation-contracts';\nimport type { AXMConversationRoom } from '@acorex-platform/module-conversation-client/contracts';\n\nimport { axmIsAssistPeerParticipant } from './assist-peer-participant.util';\n\n//#endregion\n\n//#region ---- Auto title helpers ----\n\n/** Builds a sidebar/header title from the first user message (heuristic fallback). */\nexport function axmBuildAutoTitleFromUserText(raw: string): string | null {\n return axmBuildHeuristicConversationTitleFallback(raw);\n}\n\n/** Bot/assist list rows often show the assist peer `name` — keep it in sync with room title. */\nexport function axmSyncAssistPeerDisplayName<T extends Pick<AXConversation, 'title' | 'participants'>>(\n conversation: T,\n): T {\n const title = conversation.title?.trim();\n if (!title || !conversation.participants?.length) {\n return conversation;\n }\n\n let changed = false;\n const participants = conversation.participants.map((participant) => {\n if (!axmIsAssistPeerParticipant(participant)) {\n return participant;\n }\n if (participant.name?.trim() === title) {\n return participant;\n }\n changed = true;\n return { ...participant, name: title };\n });\n\n return changed ? { ...conversation, participants } : conversation;\n}\n\nexport function axmRoomWithAssistPeerDisplayName(room: AXMConversationRoom): AXMConversationRoom {\n const title = room.title?.trim();\n if (!title) {\n return room;\n }\n\n let changed = false;\n const participants = room.participants.map((participant) => {\n const id = participant.id?.trim() ?? '';\n const meta = participant.metadata as Record<string, unknown> | undefined;\n const isAssistPeer =\n id.startsWith('assist-') || meta?.['kind'] === 'assist' || meta?.['kind'] === 'agent-assist';\n if (!isAssistPeer || participant.name?.trim() === title) {\n return participant;\n }\n changed = true;\n return { ...participant, name: title };\n });\n\n return changed ? { ...room, participants } : room;\n}\n\n//#endregion\n","//#region ---- Timestamp coercion ----\n\nimport type { AXConversationMessage } from '@acorex/components/conversation';\n\nexport function axmCoerceTimestampMs(value: unknown): number {\n if (value instanceof Date) {\n return value.getTime();\n }\n if (typeof value === 'string' || typeof value === 'number') {\n const ms = new Date(value).getTime();\n return Number.isFinite(ms) ? ms : 0;\n }\n return 0;\n}\n\n/** Coerces entity / IndexedDB values to {@link Date} for conversation UI sorting. */\nexport function axmCoerceDate(value: unknown): Date {\n if (value instanceof Date) {\n return value;\n }\n if (typeof value === 'string' || typeof value === 'number') {\n const ms = new Date(value).getTime();\n return Number.isFinite(ms) ? new Date(ms) : new Date(0);\n }\n return new Date(0);\n}\n\nexport function axmSortMessagesNewestFirst(messages: AXConversationMessage[]): AXConversationMessage[] {\n return [...messages].sort((a, b) => axmCoerceTimestampMs(b.timestamp) - axmCoerceTimestampMs(a.timestamp));\n}\n\n//#endregion\n","//#region ---- Imports ----\n\nimport type {\n AXConversation,\n AXConversationMessage,\n AXConversationMessagePayload,\n AXConversationParticipant,\n} from '@acorex/components/conversation';\nimport {\n AXMConversationMessage,\n AXMConversationRoom,\n} from '@acorex-platform/module-conversation-client/contracts';\nimport { coerceUnknownToTrimmedString } from '@acorex-platform/framework-shared/core';\nimport { axmEnrichRoomAvatar } from '../../utils/chat-avatar.util';\nimport { axmRoomWithAssistPeerDisplayName } from '../../utils/assist-conversation-title.util';\nimport { axmCoerceDate } from '../../utils/conversation-time.util';\n\n//#endregion\n\n//#region ---- Room mapping ----\n\nfunction axmNormalizeRoomParticipants(\n room: AXMConversationRoom,\n): AXMConversationRoom {\n return {\n ...room,\n participants: room.participants.map((participant) => ({\n ...participant,\n id: coerceUnknownToTrimmedString(participant.id) || participant.id,\n })),\n };\n}\n\n/**\n * Maps a persisted room entity to the conversation {@link AXConversation} contract.\n */\nexport function axmRoomEntityToConversation(\n room: AXMConversationRoom,\n currentUserId?: string,\n): AXConversation {\n const normalizedRoom = axmNormalizeRoomParticipants(room);\n const scopedUserId =\n coerceUnknownToTrimmedString(currentUserId) || currentUserId;\n const enrichedRoom = axmEnrichRoomAvatar(normalizedRoom, scopedUserId);\n const displayRoom = axmRoomWithAssistPeerDisplayName(enrichedRoom);\n return {\n id: displayRoom.id,\n type: displayRoom.type,\n creatorId: displayRoom.creatorId,\n title: displayRoom.title,\n avatar: displayRoom.avatar,\n icon: displayRoom.icon,\n description: displayRoom.description,\n participants: displayRoom.participants,\n lastMessage: displayRoom.lastMessage\n ? axmMessageEntityToMessage(displayRoom.lastMessage)\n : undefined,\n lastMessageAt: axmCoerceDate(displayRoom.lastMessageAt),\n unreadCount: displayRoom.unreadCount,\n unreadMentions: displayRoom.unreadMentions,\n status: displayRoom.status,\n settings: displayRoom.settings,\n pinnedMessageIds: displayRoom.pinnedMessageIds,\n createdAt: axmCoerceDate(displayRoom.createdAt),\n updatedAt: axmCoerceDate(displayRoom.updatedAt),\n blocked: displayRoom.blocked,\n pinned: displayRoom.pinned ?? false,\n archived: displayRoom.archived ?? false,\n draft: displayRoom.draft,\n metadata: displayRoom.metadata,\n };\n}\n\n//#endregion\n\n//#region ---- Message mapping ----\n\n/**\n * Maps a persisted message entity to the conversation {@link AXConversationMessage} contract.\n */\nexport function axmMessageEntityToMessage(\n message: AXMConversationMessage,\n): AXConversationMessage {\n return {\n id: message.id,\n conversationId: message.conversationId,\n senderId: message.senderId,\n type: message.type,\n fileType: message.fileType,\n timestamp: axmCoerceDate(message.timestamp),\n payload: message.payload as AXConversationMessagePayload,\n status: message.status,\n replyTo: message.replyTo\n ? axmMessageEntityToMessage(message.replyTo)\n : undefined,\n forwarded: message.forwarded,\n forwardedFrom: message.forwardedFrom,\n reactions: message.reactions ?? [],\n pinned: message.pinned,\n editedAt: message.editedAt ? axmCoerceDate(message.editedAt) : undefined,\n deleted: message.deleted,\n deletedAt: message.deletedAt ? axmCoerceDate(message.deletedAt) : undefined,\n isLocal: message.isLocal,\n metadata: message.metadata,\n };\n}\n\n//#endregion\n\n//#region ---- User mapping ----\n\n/**\n * Maps a security-management user row to {@link AXConversationParticipant}.\n */\nexport function axmUserRowToParticipant(user: {\n id: string;\n displayName?: string;\n username?: string;\n}): AXConversationParticipant {\n return {\n id: user.id,\n name: user.displayName ?? user.username ?? user.id,\n role: 'member',\n status: 'offline',\n };\n}\n\n//#endregion\n","//#region ---- Imports ----\n\nimport type { AXConversationMessage } from '@acorex/components/conversation';\nimport { axmReadAssistResponseStatus } from './assist-response-status.util';\n\n//#endregion\n\n//#region ---- Unread rules ----\n\n/**\n * True while an assist placeholder is still generating (not yet a deliverable reply).\n */\nexport function axmIsAssistStreamingMessage(message: AXConversationMessage): boolean {\n const meta = message.metadata as Record<string, unknown> | undefined;\n if (meta?.['isAssistResponse'] !== true && message.type !== 'assist-response') {\n return false;\n }\n const status = axmReadAssistResponseStatus(message.metadata);\n if (status === 'streaming') {\n return true;\n }\n return meta?.['isStreaming'] === true;\n}\n\n/**\n * Whether an incoming message should increase the conversation unread counter.\n */\nexport function axmMessageCountsTowardUnread(message: AXConversationMessage, currentUserId: string): boolean {\n if (message.senderId === currentUserId) {\n return false;\n }\n if (message.status === 'read') {\n return false;\n }\n if (axmIsAssistStreamingMessage(message)) {\n return false;\n }\n return true;\n}\n\n/** Recomputes unread badge count from persisted messages. */\nexport function axmComputeConversationUnreadCount(messages: AXConversationMessage[], currentUserId: string): number {\n return messages.filter((message) => axmMessageCountsTowardUnread(message, currentUserId)).length;\n}\n\n//#endregion\n","//#region ---- Imports ----\n\nimport type {\n AXConversationConnectionStatus,\n AXConversation,\n AXConversationMessage,\n AXConversationPresenceUpdate,\n AXConversationTypingIndicator,\n} from '@acorex/components/conversation';\nimport { Injectable } from '@angular/core';\nimport { BehaviorSubject, filter, map, merge, Observable, pairwise, Subject } from 'rxjs';\n\n//#endregion\n\n//#region ---- Service ----\n\n/**\n * In-memory event bus for entity-backed chat realtime updates.\n * Replaces {@link conversationSharedStorage} streams for the conversation module.\n */\n@Injectable({ providedIn: 'root' })\nexport class AXMConversationRealtimeBus {\n //#region ---- Connection state ----\n\n private readonly connectionStatusSubject = new BehaviorSubject<AXConversationConnectionStatus>('connected');\n\n readonly connectionStatus$ = this.connectionStatusSubject.asObservable();\n\n //#endregion\n\n //#region ---- Message streams ----\n\n private readonly messageStreamSubject = new Subject<AXConversationMessage>();\n private readonly messageUpdateSubject = new Subject<AXConversationMessage>();\n private readonly messageDeletionSubject = new Subject<string>();\n\n readonly messageStream$ = this.messageStreamSubject.asObservable();\n readonly messageUpdates$ = this.messageUpdateSubject.asObservable();\n readonly messageDeletions$ = this.messageDeletionSubject.asObservable();\n\n //#endregion\n\n //#region ---- Conversation streams ----\n\n private readonly conversationUpdateSubject = new Subject<AXConversation>();\n private readonly conversationCreatedSubject = new Subject<AXConversation>();\n\n readonly conversationUpdates$ = this.conversationUpdateSubject.asObservable();\n readonly conversationCreated$ = this.conversationCreatedSubject.asObservable();\n\n //#endregion\n\n //#region ---- Presence & typing ----\n\n private readonly typingIndicatorSubject = new Subject<AXConversationTypingIndicator>();\n private readonly presenceUpdateSubject = new Subject<AXConversationPresenceUpdate>();\n\n readonly typingIndicators$ = this.typingIndicatorSubject.asObservable();\n readonly presenceUpdates$ = this.presenceUpdateSubject.asObservable();\n\n //#endregion\n\n //#region ---- Publishers ----\n\n setConnectionStatus(status: AXConversationConnectionStatus): void {\n this.connectionStatusSubject.next(status);\n }\n\n publishMessage(message: AXConversationMessage): void {\n this.messageStreamSubject.next(message);\n }\n\n publishMessageUpdate(message: AXConversationMessage): void {\n this.messageUpdateSubject.next(message);\n }\n\n publishMessageDeletion(messageId: string): void {\n this.messageDeletionSubject.next(messageId);\n }\n\n /** Suppresses redundant room GetById after a client-originated publish (entity-mutation echo). */\n private readonly recentLocalRoomMutations = new Map<string, number>();\n\n private static readonly LOCAL_ROOM_MUTATION_SUPPRESS_MS = 8000;\n\n markLocalRoomMutation(conversationId: string): void {\n const scoped = conversationId?.trim();\n if (!scoped) {\n return;\n }\n this.recentLocalRoomMutations.set(scoped, Date.now());\n }\n\n shouldSuppressRemoteRoomRefetch(conversationId: string): boolean {\n const scoped = conversationId?.trim();\n if (!scoped) {\n return false;\n }\n const stamped = this.recentLocalRoomMutations.get(scoped);\n if (!stamped) {\n return false;\n }\n if (Date.now() - stamped > AXMConversationRealtimeBus.LOCAL_ROOM_MUTATION_SUPPRESS_MS) {\n this.recentLocalRoomMutations.delete(scoped);\n return false;\n }\n return true;\n }\n\n publishConversationUpdate(conversation: AXConversation): void {\n this.markLocalRoomMutation(conversation.id);\n this.conversationUpdateSubject.next(conversation);\n }\n\n publishConversationCreated(conversation: AXConversation): void {\n this.markLocalRoomMutation(conversation.id);\n this.conversationCreatedSubject.next(conversation);\n this.conversationUpdateSubject.next(conversation);\n }\n\n publishTypingIndicator(indicator: AXConversationTypingIndicator): void {\n this.typingIndicatorSubject.next(indicator);\n }\n\n publishPresenceUpdate(update: AXConversationPresenceUpdate): void {\n this.presenceUpdateSubject.next(update);\n }\n\n //#endregion\n\n //#region ---- Scoped observables ----\n\n messagesForConversation(conversationId: string): Observable<AXConversationMessage> {\n const scoped = conversationId?.trim();\n if (!scoped) {\n return this.messageStream$;\n }\n return this.messageStream$.pipe(filter((msg) => msg.conversationId === scoped));\n }\n\n messageUpdatesForConversation(conversationId?: string): Observable<AXConversationMessage> {\n if (!conversationId?.trim()) {\n return this.messageUpdates$;\n }\n return this.messageUpdates$.pipe(filter((msg) => msg.conversationId === conversationId));\n }\n\n typingIndicatorsForConversation(conversationId: string): Observable<AXConversationTypingIndicator> {\n const scoped = conversationId?.trim();\n if (!scoped) {\n return this.typingIndicators$;\n }\n return this.typingIndicators$.pipe(filter((ind) => ind.conversationId === scoped));\n }\n\n messageStatusChanges(conversationId?: string): Observable<{\n messageId: string;\n status: AXConversationMessage['status'];\n timestamp: Date;\n }> {\n const scoped = conversationId?.trim();\n const belongs = (messageId: string): boolean => {\n if (!scoped) {\n return true;\n }\n // Status events carry messageId only; callers filter by conversation when needed.\n void messageId;\n return true;\n };\n\n const fromStream$ = this.messageStream$.pipe(\n filter((message) => !scoped || message.conversationId === scoped),\n map((message) => ({\n messageId: message.id,\n status: message.status,\n timestamp: message.timestamp instanceof Date ? message.timestamp : new Date(message.timestamp),\n })),\n filter((event) => belongs(event.messageId)),\n );\n\n const fromUpdates$ = this.messageUpdates$.pipe(\n pairwise(),\n filter(([previous, current]) => previous.id === current.id && previous.status !== current.status),\n filter(([, current]) => !scoped || current.conversationId === scoped),\n map(([, current]) => ({\n messageId: current.id,\n status: current.status,\n timestamp: current.timestamp instanceof Date ? current.timestamp : new Date(current.timestamp),\n })),\n );\n\n return merge(fromStream$, fromUpdates$);\n }\n\n //#endregion\n}\n\n//#endregion\n","//#region ---- Imports ----\n\nimport { AXPFilterOperatorMiddlewareService } from '@acorex-platform/framework-client/common';\nimport { AXPEntityService } from '@acorex-platform/framework-client/layout/entity';\nimport type { AXConversation, AXConversationMessage, AXConversationMessageType, AXConversationSendMessageCommand } from '@acorex/components/conversation';\nimport { inject, Injectable } from '@angular/core';\n\nimport { AXMConversationMessage, AXMConversationRoom, RootConfig } from '@acorex-platform/module-conversation-client/contracts';\nimport { axmCompareMessagesChronologically } from '@acorex-platform/module-conversation-contracts';\nimport { axmMessageEntityToMessage, axmRoomEntityToConversation } from '../plugins/services/entity/chat-entity-mapper.util';\nimport { axmComputeConversationUnreadCount } from '../plugins/utils/conversation-unread.util';\nimport { AXMConversationRealtimeBus } from './conversation-realtime.bus';\n\n//#endregion\n\n//#region ---- Service ----\n\n/**\n * Entity-backed read/write facade for chat rooms and messages.\n * Publishes mutations to {@link AXMConversationRealtimeBus}.\n */\n@Injectable({ providedIn: 'root' })\nexport class AXMConversationEntityStoreService {\n //#region ---- Services & Dependencies ----\n\n private readonly entityService = inject(AXPEntityService);\n private readonly filterService = inject(AXPFilterOperatorMiddlewareService);\n private readonly bus = inject(AXMConversationRealtimeBus);\n\n private readonly messageData = this.entityService.withEntity(RootConfig.module.name, RootConfig.entities.message.name).data<string, AXMConversationMessage>();\n private readonly roomData = this.entityService.withEntity(RootConfig.module.name, RootConfig.entities.room.name).data<string, AXMConversationRoom>();\n\n /** Serializes entity writes per message id so streaming deltas persist in order. */\n private readonly persistChains = new Map<string, Promise<void>>();\n\n /** Avoids GET-by-id existence probes for assist rows already written in this session. */\n private readonly persistedMessageIds = new Set<string>();\n\n /** In-memory snapshots to avoid redundant GetById after local writes. */\n private readonly conversationCache = new Map<string, AXConversation>();\n private readonly messageCache = new Map<string, AXConversationMessage>();\n private readonly messageListCache = new Map<string, AXConversationMessage[]>();\n\n /** Dedupes concurrent room GetById for the same conversation. */\n private readonly conversationFetchChains = new Map<string, Promise<AXConversation | null>>();\n\n /** Dedupes concurrent message list queries (page 0). */\n private readonly messageListFetchChains = new Map<string, Promise<AXConversationMessage[]>>();\n\n //#endregion\n\n //#region ---- Conversation reads ----\n\n getCachedConversation(conversationId: string): AXConversation | null {\n return this.conversationCache.get(conversationId?.trim()) ?? null;\n }\n\n getCachedMessageList(conversationId: string): AXConversationMessage[] | null {\n const scoped = conversationId?.trim();\n if (!scoped) {\n return null;\n }\n return this.messageListCache.get(scoped) ?? null;\n }\n\n cacheConversation(conversation: AXConversation): void {\n const scoped = conversation.id?.trim();\n if (!scoped) {\n return;\n }\n this.conversationCache.set(scoped, conversation);\n }\n\n cacheConversationFromRoom(room: AXMConversationRoom, currentUserId?: string): AXConversation {\n const conversation = axmRoomEntityToConversation(room, currentUserId);\n this.cacheConversation(conversation);\n return conversation;\n }\n\n async getConversation(conversationId: string, options?: { force?: boolean }): Promise<AXConversation | null> {\n const scoped = conversationId?.trim();\n if (!scoped) {\n return null;\n }\n const cached = this.conversationCache.get(scoped);\n if (cached) {\n return cached;\n }\n const inflight = this.conversationFetchChains.get(scoped);\n if (inflight) {\n return inflight;\n }\n const task = this.fetchConversationFromEntity(scoped);\n this.conversationFetchChains.set(scoped, task);\n try {\n return await task;\n } finally {\n if (this.conversationFetchChains.get(scoped) === task) {\n this.conversationFetchChains.delete(scoped);\n }\n }\n }\n\n private async fetchConversationFromEntity(conversationId: string): Promise<AXConversation | null> {\n const room = await this.roomData.byKey(conversationId);\n if (!room) {\n this.conversationCache.delete(conversationId);\n return null;\n }\n const conversation = axmRoomEntityToConversation(room);\n this.cacheConversation(conversation);\n return conversation;\n }\n\n /** Persists auto-generated title after assist completes (never during streaming). */\n async persistAssistTitlePatch(room: AXMConversationRoom): Promise<void> {\n const scopedId = room.id?.trim();\n if (!scopedId) {\n return;\n }\n\n this.bus.markLocalRoomMutation(scopedId);\n await this.roomData.update(scopedId, {\n title: room.title,\n metadata: room.metadata,\n participants: room.participants,\n updatedAt: room.updatedAt ?? new Date(),\n });\n\n const cached = this.getCachedConversation(scopedId);\n if (cached) {\n const updated: AXConversation = {\n ...cached,\n title: room.title ?? cached.title,\n metadata: room.metadata ?? cached.metadata,\n participants: room.participants ?? cached.participants,\n updatedAt: room.updatedAt ?? new Date(),\n };\n this.publishConversationUpdate(updated);\n }\n }\n\n //#endregion\n\n //#region ---- Message reads ----\n\n async getMessage(messageId: string): Promise<AXConversationMessage | null> {\n const cached = this.messageCache.get(messageId);\n if (cached) {\n return cached;\n }\n try {\n const message = await this.messageData.byKey(messageId);\n if (!message) {\n return null;\n }\n const mapped = axmMessageEntityToMessage(message);\n this.messageCache.set(messageId, mapped);\n return mapped;\n } catch {\n return null;\n }\n }\n\n cacheMessage(message: AXConversationMessage): void {\n if (message.id) {\n this.messageCache.set(message.id, message);\n }\n }\n\n getCachedMessage(messageId: string): AXConversationMessage | null {\n return this.messageCache.get(messageId?.trim()) ?? null;\n }\n\n invalidateMessageListCache(conversationId: string): void {\n const scoped = conversationId?.trim();\n if (scoped) {\n this.messageListCache.delete(scoped);\n }\n }\n\n cacheEmptyMessageList(conversationId: string): void {\n const scoped = conversationId?.trim();\n if (scoped) {\n this.messageListCache.set(scoped, []);\n }\n }\n\n private patchMessageListCache(conversationId: string, message: AXConversationMessage): void {\n const scoped = conversationId?.trim();\n if (!scoped || message.deleted) {\n return;\n }\n const list = this.messageListCache.get(scoped);\n if (!list) {\n return;\n }\n const index = list.findIndex((entry) => entry.id === message.id);\n if (index >= 0) {\n list[index] = message;\n } else {\n list.push(message);\n }\n list.sort((a, b) => axmCompareMessagesChronologically(a, b));\n }\n\n private appendToMessageListCache(conversationId: string, message: AXConversationMessage): void {\n const scoped = conversationId?.trim();\n if (!scoped || message.deleted) {\n return;\n }\n const list = this.messageListCache.get(scoped);\n if (!list || list.some((entry) => entry.id === message.id)) {\n return;\n }\n list.push(message);\n list.sort((a, b) => axmCompareMessagesChronologically(a, b));\n }\n\n async loadConversationMessages(\n conversationId: string,\n options?: { skip?: number; take?: number; force?: boolean },\n ): Promise<AXConversationMessage[]> {\n const scoped = conversationId?.trim();\n if (!scoped) {\n return [];\n }\n\n const skip = options?.skip ?? 0;\n const take = options?.take ?? 1000;\n\n if (!options?.force && skip === 0) {\n const cached = this.messageListCache.get(scoped);\n if (cached) {\n return cached.slice(skip, skip + take);\n }\n }\n\n if (skip === 0 && !options?.force) {\n const inflight = this.messageListFetchChains.get(scoped);\n if (inflight) {\n const rows = await inflight;\n return rows.slice(skip, skip + take);\n }\n }\n\n const task = this.queryConversationMessages(scoped, skip, take);\n if (skip === 0 && !options?.force) {\n this.messageListFetchChains.set(scoped, task);\n }\n try {\n return await task;\n } finally {\n if (skip === 0 && this.messageListFetchChains.get(scoped) === task) {\n this.messageListFetchChains.delete(scoped);\n }\n }\n }\n\n private async queryConversationMessages(\n conversationId: string,\n skip: number,\n take: number,\n ): Promise<AXConversationMessage[]> {\n const { items } = await this.messageData.query({\n skip,\n take,\n sort: [{ field: 'timestamp', dir: 'asc' } as never],\n filter: {\n field: 'conversationId',\n value: conversationId,\n operator: this.filterService.getOperator('equal') as never,\n },\n });\n for (const item of items) {\n if (item.id) {\n this.persistedMessageIds.add(item.id);\n }\n }\n const mapped = items\n .filter((m) => !m.deleted)\n .map((m) => axmMessageEntityToMessage(m))\n .sort((a, b) => axmCompareMessagesChronologically(a, b));\n\n if (skip === 0) {\n this.messageListCache.set(conversationId, mapped);\n for (const message of mapped) {\n this.cacheMessage(message);\n }\n }\n\n return mapped;\n }\n\n /** Assist placeholders still marked `streaming` in entity storage (e.g. after page reload). */\n async loadStreamingAssistPlaceholderMessages(conversationId?: string): Promise<AXConversationMessage[]> {\n const scoped = conversationId?.trim();\n const filters: Record<string, unknown>[] = [\n {\n field: 'metadata.assistResponseStatus',\n value: 'streaming',\n operator: this.filterService.getOperator('equal') as never,\n },\n ];\n if (scoped) {\n filters.unshift({\n field: 'conversationId',\n value: scoped,\n operator: this.filterService.getOperator('equal') as never,\n });\n }\n\n const { items } = await this.messageData.query({\n skip: 0,\n take: scoped ? 100 : 500,\n filter:\n filters.length === 1\n ? filters[0]\n : {\n logic: 'and',\n filters,\n },\n });\n return items\n .filter((message) => !message.deleted && this.isAssistResponseEntity(message))\n .map((message) => {\n if (message.id) {\n this.persistedMessageIds.add(message.id);\n }\n return axmMessageEntityToMessage(message);\n });\n }\n\n //#endregion\n\n //#region ---- Message writes ----\n\n async createMessageFromAxMessage(message: AXConversationMessage): Promise<AXConversationMessage> {\n const entity: Omit<AXMConversationMessage, 'id'> = {\n conversationId: message.conversationId,\n senderId: message.senderId,\n type: message.type,\n fileType: message.fileType,\n timestamp: message.timestamp instanceof Date ? message.timestamp : new Date(message.timestamp),\n payload: message.payload,\n status: message.status,\n reactions: message.reactions ?? [],\n forwarded: message.forwarded,\n forwardedFrom: message.forwardedFrom,\n metadata: message.metadata,\n isLocal: message.isLocal ?? false,\n ...(message.replyTo ? { replyTo: { id: message.replyTo.id } as AXMConversationMessage } : {}),\n ...(message.pinned != null ? { pinned: message.pinned } : {}),\n ...(message.editedAt ? { editedAt: message.editedAt } : {}),\n ...(message.deleted != null ? { deleted: message.deleted } : {}),\n ...(message.deletedAt ? { deletedAt: message.deletedAt } : {}),\n };\n\n const messageId = await this.messageData.create(entity);\n this.persistedMessageIds.add(messageId);\n const mapped: AXConversationMessage = { ...message, id: messageId, isLocal: false };\n this.cacheMessage(mapped);\n this.appendToMessageListCache(message.conversationId, mapped);\n this.bus.publishMessage(mapped);\n return mapped;\n }\n\n async createMessageWithId(message: AXConversationMessage): Promise<AXConversationMessage> {\n const entity: AXMConversationMessage = {\n id: message.id,\n conversationId: message.conversationId,\n senderId: message.senderId,\n type: message.type,\n fileType: message.fileType,\n timestamp: message.timestamp instanceof Date ? message.timestamp : new Date(message.timestamp),\n payload: message.payload,\n status: message.status,\n reactions: message.reactions ?? [],\n forwarded: message.forwarded,\n forwardedFrom: message.forwardedFrom,\n metadata: message.metadata,\n isLocal: message.isLocal ?? false,\n ...(message.replyTo ? { replyTo: { id: message.replyTo.id } as AXMConversationMessage } : {}),\n ...(message.pinned != null ? { pinned: message.pinned } : {}),\n };\n\n const messageId = await this.messageData.create(entity);\n this.persistedMessageIds.add(messageId);\n const mapped: AXConversationMessage = { ...message, id: messageId, isLocal: false };\n this.cacheMessage(mapped);\n this.appendToMessageListCache(message.conversationId, mapped);\n this.bus.publishMessage(mapped);\n return mapped;\n }\n\n async updateMessage(message: AXConversationMessage, options?: { publish?: boolean }): Promise<AXConversationMessage> {\n await this.messageData.update(message.id, {\n payload: message.payload,\n status: message.status,\n metadata: message.metadata,\n type: message.type,\n reactions: message.reactions ?? [],\n editedAt: message.editedAt,\n deleted: message.deleted,\n deletedAt: message.deletedAt,\n pinned: message.pinned,\n });\n this.persistedMessageIds.add(message.id);\n this.cacheMessage(message);\n if (options?.publish !== false) {\n this.publishMessageUpdate(message);\n }\n return message;\n }\n\n /**\n * Persists a message to entity storage without publishing realtime events.\n * Matches mock `putMessage` fire-and-forget used during assist streaming.\n */\n persistMessage(message: AXConversationMessage): Promise<void> {\n const previous = this.persistChains.get(message.id) ?? Promise.resolve();\n const next = previous.then(() => this.persistMessageInternal(message));\n this.persistChains.set(message.id, next);\n return next;\n }\n\n private async persistMessageInternal(message: AXConversationMessage): Promise<void> {\n const fields = this.messageToEntityFields(message);\n if (this.persistedMessageIds.has(message.id)) {\n await this.messageData.update(message.id, fields);\n return;\n }\n\n try {\n await this.messageData.create({\n id: message.id,\n ...fields,\n } as AXMConversationMessage);\n this.persistedMessageIds.add(message.id);\n return;\n } catch (createError: unknown) {\n try {\n await this.messageData.update(message.id, fields);\n this.persistedMessageIds.add(message.id);\n return;\n } catch {\n console.error('Failed to persist assist message:', message.id, createError);\n throw createError;\n }\n }\n }\n\n async deleteMessage(messageId: string): Promise<void> {\n const cached = this.messageCache.get(messageId);\n await this.messageData.update(messageId, {\n deleted: true,\n deletedAt: new Date(),\n });\n this.persistedMessageIds.delete(messageId);\n this.messageCache.delete(messageId);\n if (cached) {\n this.invalidateMessageListCache(cached.conversationId);\n }\n this.bus.publishMessageDeletion(messageId);\n }\n\n async touchLastMessage(conversationId: string, message: AXConversationMessage): Promise<void> {\n const entity = this.messageToEntityFields(message);\n const lastMessageEntity = {\n id: message.id,\n ...entity,\n } as AXMConversationMessage;\n const now = new Date();\n\n this.bus.markLocalRoomMutation(conversationId);\n await this.roomData.update(conversationId, {\n lastMessage: lastMessageEntity,\n lastMessageAt: lastMessageEntity.timestamp,\n updatedAt: now,\n });\n\n const cached = this.getCachedConversation(conversationId);\n if (cached) {\n const updated: AXConversation = {\n ...cached,\n lastMessage: message,\n lastMessageAt: message.timestamp instanceof Date ? message.timestamp : new Date(message.timestamp),\n updatedAt: now,\n };\n this.publishConversationUpdate(updated);\n }\n }\n\n //#endregion\n\n //#region ---- Conversation writes ----\n\n async updateConversation(conversation: AXConversation): Promise<AXConversation> {\n const isPrivate = conversation.type === 'private';\n const now = new Date();\n this.bus.markLocalRoomMutation(conversation.id);\n await this.roomData.update(conversation.id, {\n ...(isPrivate\n ? {}\n : {\n title: conversation.title,\n avatar: conversation.avatar,\n icon: conversation.icon,\n }),\n description: conversation.description,\n participants: conversation.participants,\n unreadCount: conversation.unreadCount,\n unreadMentions: conversation.unreadMentions,\n status: conversation.status,\n settings: conversation.settings,\n pinnedMessageIds: conversation.pinnedMessageIds,\n blocked: conversation.blocked,\n pinned: conversation.pinned,\n archived: conversation.archived,\n draft: conversation.draft,\n metadata: conversation.metadata,\n updatedAt: now,\n });\n const updated: AXConversation = { ...conversation, updatedAt: now };\n this.publishConversationUpdate(updated);\n return updated;\n }\n\n async updateConversationMetadata(conversationId: string, metadata: Record<string, unknown>): Promise<void> {\n const cached = this.getCachedConversation(conversationId);\n if (!cached) {\n const loaded = await this.getConversation(conversationId);\n if (!loaded) {\n return;\n }\n }\n\n const base = this.getCachedConversation(conversationId);\n if (!base) {\n return;\n }\n\n const now = new Date();\n this.bus.markLocalRoomMutation(conversationId);\n await this.roomData.update(conversationId, {\n metadata: { ...base.metadata, ...metadata },\n updatedAt: now,\n });\n this.publishConversationUpdate({\n ...base,\n metadata: { ...base.metadata, ...metadata },\n updatedAt: now,\n });\n }\n\n async setUnreadCount(conversationId: string, unreadCount: number): Promise<void> {\n const cached = this.getCachedConversation(conversationId);\n if (cached && cached.unreadCount === unreadCount) {\n return;\n }\n\n const now = new Date();\n this.bus.markLocalRoomMutation(conversationId);\n await this.roomData.update(conversationId, {\n unreadCount,\n updatedAt: now,\n });\n\n if (cached) {\n this.publishConversationUpdate({ ...cached, unreadCount, updatedAt: now });\n return;\n }\n\n const conversation = await this.getConversation(conversationId);\n if (conversation) {\n this.publishConversationUpdate({ ...conversation, unreadCount, updatedAt: now });\n }\n }\n\n async syncConversationUnreadCount(conversationId: string, currentUserId: string): Promise<void> {\n const messages = await this.loadConversationMessages(conversationId);\n const unread = axmComputeConversationUnreadCount(messages, currentUserId);\n await this.setUnreadCount(conversationId, unread);\n }\n\n //#endregion\n\n //#region ---- Helpers ----\n\n private isAssistResponseEntity(message: AXMConversationMessage): boolean {\n const meta = message.metadata as Record<string, unknown> | undefined;\n return meta?.['isAssistResponse'] === true || message.type === 'assist-response';\n }\n\n messageToEntityFields(message: AXConversationMessage): Partial<AXMConversationMessage> {\n return {\n conversationId: message.conversationId,\n senderId: message.senderId,\n type: message.type,\n fileType: message.fileType,\n timestamp: message.timestamp instanceof Date ? message.timestamp : new Date(message.timestamp),\n payload: message.payload,\n status: message.status,\n reactions: message.reactions ?? [],\n metadata: message.metadata,\n forwarded: message.forwarded,\n forwardedFrom: message.forwardedFrom,\n pinned: message.pinned,\n editedAt: message.editedAt,\n deleted: message.deleted,\n deletedAt: message.deletedAt,\n isLocal: message.isLocal,\n };\n }\n\n axMessageFromCommand(command: AXConversationSendMessageCommand, senderId: string): AXConversationMessage {\n return {\n id: `msg-${Date.now()}-${Math.floor(Math.random() * 10000)}`,\n conversationId: command.conversationId,\n senderId,\n type: command.type as AXConversationMessageType,\n fileType: command.fileType,\n timestamp: new Date(),\n payload: command.payload,\n status: 'sent',\n reactions: [],\n forwarded: command.forwarded,\n forwardedFrom: command.forwardedFrom,\n metadata: command.metadata,\n isLocal: false,\n ...(command.replyToId ? { replyTo: { id: command.replyToId } as AXConversationMessage } : {}),\n };\n }\n\n publishNewMessage(message: AXConversationMessage): void {\n this.cacheMessage(message);\n this.appendToMessageListCache(message.conversationId, message);\n this.bus.publishMessage(message);\n }\n\n publishMessageUpdate(message: AXConversationMessage): void {\n this.cacheMessage(message);\n this.patchMessageListCache(message.conversationId, message);\n this.bus.publishMessageUpdate(message);\n }\n\n publishConversationUpdate(conversation: AXConversation): void {\n this.cacheConversation(conversation);\n this.bus.publishConversationUpdate(conversation);\n }\n\n publishConversationCreated(conversation: AXConversation): void {\n this.cacheConversation(conversation);\n this.bus.publishConversationCreated(conversation);\n }\n\n publishTypingIndicator(indicator: import('@acorex/components/conversation').AXConversationTypingIndicator): void {\n this.bus.publishTypingIndicator(indicator);\n }\n\n publishPresenceUpdate(update: import('@acorex/components/conversation').AXConversationPresenceUpdate): void {\n this.bus.publishPresenceUpdate(update);\n }\n\n //#endregion\n}\n\n//#endregion\n","//#region ---- Imports ----\n\nimport type { AXConversationMessage } from '@acorex/components/conversation';\nimport { inject, Injectable, signal } from '@angular/core';\n\nimport { AXMConversationEntityStoreService } from './conversation-entity-store.service';\nimport { axmIsAssistStreamingMessage } from '../plugins/utils/conversation-unread.util';\n\n//#endregion\n\n//#region ---- Service ----\n\n/**\n * Tracks which conversation is focused in the chat UI and applies read-state updates.\n */\n@Injectable({ providedIn: 'root' })\nexport class AXMConversationFocusService {\n private readonly store = inject(AXMConversationEntityStoreService);\n\n private focusedConversationId: string | null = null;\n\n /** Reactive focus id for computed UI (retry screen, etc.). */\n readonly focusedConversationIdSignal = signal<string | null>(null);\n\n setFocusedConversation(conversationId: string | null): void {\n const next = conversationId?.trim() || null;\n this.focusedConversationId = next;\n this.focusedConversationIdSignal.set(next);\n }\n\n isFocused(conversationId: string): boolean {\n return this.focusedConversationId === conversationId;\n }\n\n getFocusedConversationId(): string | null {\n return this.focusedConversationId;\n }\n\n /**\n * Marks incoming messages as read when the conversation is focused.\n * Returns ids that were transitioned to `read`.\n */\n async markMessagesRead(conversationId: string, messageIds: readonly string[], currentUserId: string): Promise<string[]> {\n const marked = (\n await Promise.all(\n messageIds.map(async (messageId) => {\n const message = await this.store.getMessage(messageId);\n if (!message || message.conversationId !== conversationId) {\n return null;\n }\n if (message.senderId === currentUserId) {\n return null;\n }\n if (message.status === 'read') {\n return null;\n }\n if (axmIsAssistStreamingMessage(message)) {\n return null;\n }\n const readMessage: AXConversationMessage = { ...message, status: 'read' };\n await this.store.updateMessage(readMessage, { publish: false });\n return { messageId, readMessage };\n }),\n )\n ).filter((entry): entry is { messageId: string; readMessage: AXConversationMessage } => entry !== null);\n\n if (marked.length === 0) {\n return [];\n }\n\n for (const entry of marked) {\n this.store.publishMessageUpdate(entry.readMessage);\n }\n\n const conversation = this.store.getCachedConversation(conversationId);\n const lastEntry = conversation?.lastMessage?.id\n ? marked.find((entry) => entry.messageId === conversation.lastMessage!.id)\n : undefined;\n if (conversation && lastEntry) {\n await this.store.updateConversation({ ...conversation, lastMessage: lastEntry.readMessage });\n }\n\n await this.store.setUnreadCount(conversationId, 0);\n return marked.map((entry) => entry.messageId);\n }\n}\n\n//#endregion\n","//#region ---- Imports ----\n\nimport type { AXConversationMessage } from '@acorex/components/conversation';\nimport { AXConversationVoiceRendererComponent } from '@acorex/components/conversation';\nimport { AXTranslationModule } from '@acorex/core/translation';\nimport { AXPFileStorageService } from '@acorex-platform/framework-client/common';\nimport { AsyncPipe } from '@angular/common';\n\nimport { ChangeDetectionStrategy, Component, computed, effect, inject, input, signal } from '@angular/core';\n\nimport { axmSyntheticEmbedMessage } from '../utils/assist-bot-transcript.util';\n\n//#endregion\n\n//#region ---- Component ----\n\n/**\n * Renders an assist {@code fileId} via {@link AXConversationVoiceRendererComponent} using {@code mediaId} so\n * {@link AXUploaderService} resolves a playback URL (conversation rejects persisted {@code data:} URLs).\n */\n@Component({\n selector: 'axm-assist-bot-audio-line',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [AXConversationVoiceRendererComponent, AXTranslationModule, AsyncPipe],\n template: `\n @if (syntheticMessage(); as sm) {\n <ax-conversation-voice-renderer [message]=\"sm\" />\n } @else if (errorText()) {\n <p class=\"axm-assist-bot-audio-line__err\">{{ (errorText() ?? '' | translate | async) ?? '' }}</p>\n }\n `,\n styles: [\n `\n :host {\n display: block;\n max-inline-size: min(100%, 28rem);\n }\n\n .axm-assist-bot-audio-line__err {\n margin: 0;\n font-size: 0.8125rem;\n color: rgb(var(--ax-sys-color-danger-600, 220 38 38));\n }\n `,\n ],\n})\nexport class AXMAssistBotAudioLineComponent {\n //#region ---- Inputs ----\n\n readonly parentMessage = input.required<AXConversationMessage>();\n readonly fileId = input.required<string>();\n readonly mimeType = input<string>('audio/mpeg');\n\n //#endregion\n\n //#region ---- Services ----\n\n private readonly fileStorage = inject(AXPFileStorageService);\n\n //#endregion\n\n //#region ---- State ----\n\n private readonly fileReady = signal(false);\n private readonly resolvedMimeType = signal<string>('audio/mpeg');\n readonly errorText = signal<string | null>(null);\n private loadGeneration = 0;\n\n //#endregion\n\n //#region ---- Synthetic message ----\n\n readonly syntheticMessage = computed(() => {\n const fileId = this.fileId()?.trim() ?? '';\n const parent = this.parentMessage();\n if (!this.fileReady() || !fileId) {\n return null;\n }\n return axmSyntheticEmbedMessage(parent, `voice-${fileId}`, {\n type: 'voice',\n payload: {\n type: 'voice',\n url: '',\n mediaId: fileId,\n duration: 0,\n },\n });\n });\n\n //#endregion\n\n //#region ---- Lifecycle ----\n\n constructor() {\n effect(() => {\n const id = this.fileId()?.trim() ?? '';\n const gen = ++this.loadGeneration;\n this.fileReady.set(false);\n this.errorText.set(null);\n if (!id) {\n return;\n }\n\n void this.fileStorage\n .getInfo(id)\n .then((info) => {\n if (gen !== this.loadGeneration) {\n return;\n }\n const storedMime = info.mimeType?.trim();\n const fallbackMime = this.mimeType().trim();\n const mimeType =\n storedMime && storedMime.startsWith('audio/')\n ? storedMime\n : fallbackMime.startsWith('audio/')\n ? fallbackMime\n : 'audio/mpeg';\n this.resolvedMimeType.set(mimeType);\n this.fileReady.set(true);\n })\n .catch(() => {\n if (gen !== this.loadGeneration) {\n return;\n }\n this.errorText.set('@conversation:chat.assist-renderer.errors.audio-load');\n });\n });\n }\n\n //#endregion\n}\n\n//#endregion\n","//#region ---- Imports ----\n\nimport type { AXConversationMessage } from '@acorex/components/conversation';\nimport { AXConversationImageRendererComponent } from '@acorex/components/conversation';\nimport { AXTranslationModule } from '@acorex/core/translation';\nimport { AXPFileStorageService } from '@acorex-platform/framework-client/common';\nimport { AsyncPipe } from '@angular/common';\n\nimport { ChangeDetectionStrategy, Component, computed, effect, inject, input, signal } from '@angular/core';\n\nimport { axmSyntheticEmbedMessage } from '../utils/assist-bot-transcript.util';\n\n//#endregion\n\n//#region ---- Component ----\n\n/**\n * Renders an assist {@code fileId} via {@link AXConversationImageRendererComponent} using {@code mediaId} so\n * {@link AXUploaderService} resolves a display URL (conversation rejects persisted {@code data:} URLs).\n */\n@Component({\n selector: 'axm-assist-bot-image-line',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [AXConversationImageRendererComponent, AXTranslationModule, AsyncPipe],\n template: `\n @if (syntheticMessage(); as sm) {\n <ax-conversation-image-renderer [message]=\"sm\" />\n } @else if (errorText()) {\n <p class=\"axm-assist-bot-image-line__err\">{{ (errorText() ?? '' | translate | async) ?? '' }}</p>\n }\n `,\n styles: [\n `\n :host {\n display: block;\n max-inline-size: min(100%, 40rem);\n }\n\n .axm-assist-bot-image-line__err {\n margin: 0;\n font-size: 0.8125rem;\n color: rgb(var(--ax-sys-color-danger-600, 220 38 38));\n }\n `,\n ],\n})\nexport class AXMAssistBotImageLineComponent {\n //#region ---- Inputs ----\n\n readonly parentMessage = input.required<AXConversationMessage>();\n readonly fileId = input.required<string>();\n readonly mimeType = input<string>('application/octet-stream');\n readonly name = input<string | undefined>(undefined);\n\n //#endregion\n\n //#region ---- Services ----\n\n private readonly fileStorage = inject(AXPFileStorageService);\n\n //#endregion\n\n //#region ---- State ----\n\n private readonly fileReady = signal(false);\n private readonly resolvedMimeType = signal<string>('image/png');\n readonly errorText = signal<string | null>(null);\n private loadGeneration = 0;\n\n //#endregion\n\n //#region ---- Synthetic message ----\n\n readonly syntheticMessage = computed(() => {\n const fileId = this.fileId()?.trim() ?? '';\n const parent = this.parentMessage();\n if (!this.fileReady() || !fileId) {\n return null;\n }\n return axmSyntheticEmbedMessage(parent, `img-${fileId}`, {\n type: 'image',\n payload: {\n type: 'image',\n images: [\n {\n mediaId: fileId,\n url: '',\n thumbnailUrl: '',\n width: 400,\n height: 300,\n mimeType: this.resolvedMimeType(),\n },\n ],\n caption: undefined,\n },\n });\n });\n\n //#endregion\n\n //#region ---- Lifecycle ----\n\n constructor() {\n effect(() => {\n const id = this.fileId()?.trim() ?? '';\n const gen = ++this.loadGeneration;\n this.fileReady.set(false);\n this.errorText.set(null);\n if (!id) {\n return;\n }\n\n void this.fileStorage\n .getInfo(id)\n .then((info) => {\n if (gen !== this.loadGeneration) {\n return;\n }\n const storedMime = info.mimeType?.trim();\n const fallbackMime = this.mimeType().trim();\n const mimeType =\n storedMime && storedMime.startsWith('image/')\n ? storedMime\n : fallbackMime.startsWith('image/')\n ? fallbackMime\n : 'image/png';\n this.resolvedMimeType.set(mimeType);\n this.fileReady.set(true);\n })\n .catch(() => {\n if (gen !== this.loadGeneration) {\n return;\n }\n this.errorText.set('@conversation:chat.assist-renderer.errors.image-load');\n });\n });\n }\n\n //#endregion\n}\n\n//#endregion\n","//#region ---- Imports ----\n\nimport { AI_CHAT_GENERATED_IMAGE_REF_TYPE, AI_CHAT_GENERATED_SPEECH_REF_TYPE } from '@acorex-platform/module-ai-management-client';\nimport { AXPFileStorageService } from '@acorex-platform/framework-client/common';\nimport type { AXConversationMessage } from '@acorex/components/conversation';\nimport { AXTranslationModule } from '@acorex/core/translation';\nimport { AsyncPipe } from '@angular/common';\n\nimport { ChangeDetectionStrategy, Component, effect, inject, input, signal } from '@angular/core';\n\nimport { AXMAssistBotAudioLineComponent } from './assist-bot-audio-line.component';\nimport { AXMAssistBotImageLineComponent } from './assist-bot-image-line.component';\n\n//#endregion\n\n//#region ---- Types ----\n\ntype AssistBotFileMediaKind = 'image' | 'audio' | 'unknown';\n\n//#endregion\n\n//#region ---- Component ----\n\n/** Routes assist {@code fileId} segments to image or voice renderers based on stored file metadata. */\n@Component({\n selector: 'axm-assist-bot-file-line',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [AXMAssistBotAudioLineComponent, AXMAssistBotImageLineComponent, AXTranslationModule, AsyncPipe],\n template: `\n @switch (mediaKind()) {\n @case ('image') {\n <axm-assist-bot-image-line [parentMessage]=\"parentMessage()\" [fileId]=\"fileId()\" />\n }\n @case ('audio') {\n <axm-assist-bot-audio-line [parentMessage]=\"parentMessage()\" [fileId]=\"fileId()\" />\n }\n @default {\n @if (errorText()) {\n <p class=\"axm-assist-bot-file-line__err\">{{ (errorText() ?? '' | translate | async) ?? '' }}</p>\n }\n }\n }\n `,\n styles: [\n `\n :host {\n display: block;\n }\n\n .axm-assist-bot-file-line__err {\n margin: 0;\n font-size: 0.8125rem;\n color: rgb(var(--ax-sys-color-danger-600, 220 38 38));\n }\n `,\n ],\n})\nexport class AXMAssistBotFileLineComponent {\n //#region ---- Inputs ----\n\n readonly parentMessage = input.required<AXConversationMessage>();\n readonly fileId = input.required<string>();\n\n //#endregion\n\n //#region ---- Services ----\n\n private readonly fileStorage = inject(AXPFileStorageService);\n\n //#endregion\n\n //#region ---- State ----\n\n readonly mediaKind = signal<AssistBotFileMediaKind>('unknown');\n readonly errorText = signal<string | null>(null);\n private loadGeneration = 0;\n\n //#endregion\n\n //#region ---- Lifecycle ----\n\n constructor() {\n effect(() => {\n const id = this.fileId()?.trim() ?? '';\n const gen = ++this.loadGeneration;\n this.mediaKind.set('unknown');\n this.errorText.set(null);\n if (!id) {\n return;\n }\n\n void this.fileStorage\n .getInfo(id)\n .then((info) => {\n if (gen !== this.loadGeneration) {\n return;\n }\n this.mediaKind.set(resolveAssistBotFileMediaKind(info.mimeType, info.category, info.refType));\n if (this.mediaKind() === 'unknown') {\n this.errorText.set('@conversation:chat.assist-renderer.errors.file-load');\n }\n })\n .catch(() => {\n if (gen !== this.loadGeneration) {\n return;\n }\n this.errorText.set('@conversation:chat.assist-renderer.errors.file-load');\n });\n });\n }\n\n //#endregion\n}\n\n//#region ---- Helpers ----\n\nfunction resolveAssistBotFileMediaKind(\n mimeType: string | undefined,\n category: string | undefined,\n refType: string | undefined,\n): AssistBotFileMediaKind {\n const mime = mimeType?.trim().toLowerCase() ?? '';\n if (mime.startsWith('audio/') || category === 'ai-generated-speech' || refType === AI_CHAT_GENERATED_SPEECH_REF_TYPE) {\n return 'audio';\n }\n if (mime.startsWith('image/') || category === 'ai-generated-image' || refType === AI_CHAT_GENERATED_IMAGE_REF_TYPE) {\n return 'image';\n }\n return 'unknown';\n}\n\n//#endregion\n","import { AXPContextChangeEvent, type AXPWidgetNode } from '@acorex-platform/framework-shared/core';\nimport { AXButtonModule } from '@acorex/components/button';\nimport type { AXConversationMessage, AXConversationMessagePayload, AXConversationMessageRendererComponent, AXConversationMessageRendererContentState, AXConversationMessageRendererState } from '@acorex/components/conversation';\nimport { AXTranslationModule } from '@acorex/core/translation';\n\nimport { AXPLayoutRendererComponent } from '@acorex-platform/framework-client/layout/builder';\nimport { AXPWidgetCoreModule } from '@acorex-platform/framework-client/layout/widget-core';\nimport { AsyncPipe } from '@angular/common';\n\nimport { ChangeDetectionStrategy, Component, computed, inject, input, output, signal } from '@angular/core';\n\nimport { AXMChatMessageApi } from '../services/chat-conversation-apis.abstract';\n\nimport { axmAssistWidgetNodeFromUnknown } from '../utils/assist-bot-transcript.util';\n\ninterface AXMUserFormPayload {\n type: 'user-form';\n node: AXPWidgetNode;\n value?: Record<string, unknown>;\n}\n\ninterface AXMUserFormMessageMetadata {\n submitted?: boolean;\n context?: Record<string, unknown>;\n}\n\n@Component({\n selector: 'axm-chat-user-form-renderer',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [AXPWidgetCoreModule, AXButtonModule, AXTranslationModule, AXPLayoutRendererComponent, AsyncPipe],\n template: `\n <div class=\"axm-user-form-renderer\" [class.axm-user-form-renderer--assist-embed]=\"isAssistEmbed()\">\n @if (isAssistEmbed()) {\n <axp-layout-renderer [layout]=\"resolvedNode()\" mode=\"view\" [context]=\"{}\" />\n } @else if (!isSubmitted()) {\n <axp-widgets-container class=\"flex flex-col gap-3\" [context]=\"formContext()\" (onContextChanged)=\"onContextChanged($event)\">\n <ng-container axp-widget-renderer [node]=\"resolvedNode()\" [mode]=\"resolvedNode().mode ?? 'edit'\"></ng-container>\n </axp-widgets-container>\n\n <div class=\"flex justify-end mt-2\">\n <ax-button [text]=\"('@conversation:chat.user-form.actions.submit' | translate | async) ?? ''\" (onClick)=\"submit()\"></ax-button>\n </div>\n } @else {\n <div class=\"mt-1 rounded-xl border border-success-500/25 bg-success-500/10 px-3 py-2 shadow-sm\">\n <div class=\"text-[0.7rem] font-bold uppercase tracking-wide text-success-700\">\n {{ '@conversation:chat.user-form.states.submitted' | translate | async }}\n </div>\n <div class=\"mt-1 text-sm font-medium text-on-surface\">\n {{ (submittedMessage() | translate | async) ?? '' }}\n </div>\n </div>\n }\n </div>\n `,\n styles: [\n `\n :host {\n display: block;\n inline-size: min(100%, 28rem);\n }\n\n :host:has(.axm-user-form-renderer--assist-embed) {\n inline-size: 100%;\n max-inline-size: none;\n }\n\n :host:has(.axm-user-form-renderer--assist-embed) .axm-user-form-renderer--assist-embed,\n :host:has(.axm-user-form-renderer--assist-embed) ::ng-deep axp-layout-renderer {\n inline-size: 100%;\n max-inline-size: 100%;\n }\n\n :host:has(.axm-user-form-renderer--assist-embed) ::ng-deep .axp-chart-widget-host {\n min-block-size: 16rem;\n }\n\n :host:has(.axm-user-form-renderer--assist-embed) ::ng-deep .axp-chart-widget-host:has(.axp-chart-widget-host__chart--heatmap) {\n inline-size: 100%;\n max-inline-size: 100%;\n min-block-size: 0;\n block-size: auto;\n overflow: visible;\n }\n\n :host:has(.axm-user-form-renderer--assist-embed) ::ng-deep .axp-chart-widget-host__chart--funnel {\n block-size: 18rem;\n max-block-size: 25rem;\n min-block-size: 16rem;\n }\n\n :host:has(.axm-user-form-renderer--assist-embed) ::ng-deep .axp-chart-widget-host__chart--heatmap {\n inline-size: 100%;\n max-inline-size: 100%;\n block-size: auto;\n max-block-size: none;\n overflow: visible;\n }\n\n :host:has(.axm-user-form-renderer--assist-embed) ::ng-deep .axp-chart-widget-host__chart--radial {\n inline-size: min(100%, 18rem);\n block-size: auto;\n min-block-size: 12rem;\n margin-inline: auto;\n }\n `,\n ],\n})\nexport class AXMNodeMessageRendererComponent implements AXConversationMessageRendererComponent {\n private readonly messageApi = inject(AXMChatMessageApi);\n //#region ---- Inputs & Outputs ----\n\n readonly message = input.required<AXConversationMessage>();\n readonly node = input<AXPWidgetNode | undefined>(undefined);\n readonly formSubmitted = output<Record<string, unknown>>();\n\n //#endregion\n\n //#region ---- State ----\n\n private readonly contentState = signal<AXConversationMessageRendererContentState>('none');\n readonly formContext = signal<Record<string, unknown>>({});\n readonly isSubmitted = computed(() => this.readSubmittedState(this.message()));\n readonly isAssistEmbed = computed(() => this.readAssistEmbedFlag(this.message().metadata));\n\n readonly rendererState = computed<AXConversationMessageRendererState>(() => ({\n deliveryStatus: this.message().status,\n contentState: this.contentState(),\n }));\n\n readonly resolvedNode = computed<AXPWidgetNode>(() => {\n const message = this.message();\n const payload = message.payload as unknown;\n\n if (this.isUserFormPayload(payload)) {\n return payload.node;\n }\n\n // Only treat `{ type: 'node', content }` when the chat message itself is a `node` message.\n if (message.type === 'node' && this.isNodeContentPayload(payload)) {\n const parsed = axmAssistWidgetNodeFromUnknown(payload.content);\n if (parsed) {\n return parsed;\n }\n if (this.readAssistEmbedFlag(message.metadata)) {\n // Assist embed: do not fall back to a synthetic name field (avoids a duplicate/spurious form).\n return {\n type: 'flex-layout',\n name: 'assist-node-empty',\n visible: false,\n children: [],\n };\n }\n }\n\n return this.node() ?? this.createFallbackNode();\n });\n\n readonly submittedMessage = computed(() => {\n return '@conversation:chat.user-form.states.submitted-success';\n });\n\n //#endregion\n\n //#region ---- Handlers ----\n\n onContextChanged(event: AXPContextChangeEvent): void {\n this.formContext.set((event.data ?? {}) as Record<string, unknown>);\n }\n\n submit(): void {\n const context = this.formContext();\n this.formSubmitted.emit(context);\n void this.persistSubmittedState(context);\n }\n\n //#endregion\n\n //#region ---- Utilities ----\n\n private isUserFormPayload(payload: unknown): payload is AXMUserFormPayload {\n return typeof payload === 'object' && payload != null && 'type' in payload && payload.type === 'user-form' && 'node' in payload;\n }\n\n private isNodeContentPayload(payload: unknown): payload is { type: 'node'; content: unknown } {\n return typeof payload === 'object' && payload != null && 'type' in payload && (payload as { type: unknown }).type === 'node' && 'content' in payload;\n }\n\n private readAssistEmbedFlag(metadata: unknown): boolean {\n if (typeof metadata !== 'object' || metadata == null) {\n return false;\n }\n return (metadata as Record<string, unknown>)['assistEmbed'] === true;\n }\n\n private createFallbackNode(): AXPWidgetNode {\n return {\n type: 'text-editor',\n path: 'form.name',\n name: 'name',\n options: {\n placeholder: '@conversation:chat.user-form.fields.name.placeholder',\n },\n };\n }\n\n private readSubmittedState(message: AXConversationMessage): boolean {\n const metadata = this.readUserFormMetadata(message.metadata);\n return metadata?.submitted === true;\n }\n\n private readPersistedContext(message: AXConversationMessage): Record<string, unknown> | null {\n const metadata = this.readUserFormMetadata(message.metadata);\n if (!metadata?.context || typeof metadata.context !== 'object') {\n return null;\n }\n return metadata.context;\n }\n\n private readUserFormMetadata(metadata: unknown): AXMUserFormMessageMetadata | null {\n if (typeof metadata !== 'object' || metadata == null) {\n return null;\n }\n const candidate = (metadata as Record<string, unknown>)['userForm'];\n if (typeof candidate !== 'object' || candidate == null) {\n return null;\n }\n return candidate as AXMUserFormMessageMetadata;\n }\n\n private async persistSubmittedState(context: Record<string, unknown>): Promise<void> {\n const message = this.message();\n const payload = this.message().payload as unknown;\n const payloadWithValue = this.isUserFormPayload(payload) ? ({ ...payload, value: context } as unknown as AXConversationMessagePayload) : (this.message().payload as AXConversationMessagePayload);\n\n const updatedMessage: AXConversationMessage = {\n ...message,\n payload: payloadWithValue,\n metadata: {\n ...(message.metadata ?? {}),\n userForm: {\n submitted: true,\n context,\n },\n },\n };\n\n await this.messageApi.editMessage(message.id, payloadWithValue);\n await this.messageApi.updateMessageMetadata(message.id, {\n ...(message.metadata ?? {}),\n userForm: {\n submitted: true,\n context,\n },\n });\n }\n\n //#endregion\n}\n","//#region ---- Imports ----\n\nimport { AXPMarkdownTemplateDirective, AXPMarkdownViewerComponent } from '@acorex-platform/framework-client/layout/components';\nimport { AXPEntityService } from '@acorex-platform/framework-client/layout/entity';\nimport type { AXPAiChatMessage, AXPAiChatResponse, AXPAiDelegatedAgentResultSegment, AXPAiDelegatedAgentTranscriptEntry, AXPAiEngineUsageTotals } from '@acorex-platform/module-ai-management-client';\nimport {\n AXPAiAssistChatModelCatalogService,\n axpAiChatMessageGetText,\n axpAiChatMessageIsDelegatedReflectionExcluded,\n axpAiChatToolOrAgentResultBodyJson,\n axpAiDelegatedAgentOutcomeResponsesPlainText,\n axpAiDelegatedAgentPromptPreview,\n axpAiDelegatedAgentResultSegments,\n axpAiParseSupervisorAgentToolName,\n} from '@acorex-platform/module-ai-management-client';\nimport { AXAccordionCdkModule } from '@acorex/cdk/accordion';\nimport { AXAlertModule } from '@acorex/components/alert';\nimport { AXButtonModule } from '@acorex/components/button';\nimport { AXCodeEditorDefaultLanguage, AXCodeEditorModule } from '@acorex/components/code-editor';\nimport type { AXConversationMessage, AXConversationMessagePayload, AXConversationMessageRendererComponent, AXConversationMessageRendererContentState, AXConversationMessageRendererState } from '@acorex/components/conversation';\nimport { AXConversationTextRendererComponent } from '@acorex/components/conversation';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { AXPopupService } from '@acorex/components/popup';\nimport { AXTranslationModule, AXTranslationService } from '@acorex/core/translation';\n\nimport { AsyncPipe, DecimalPipe, NgTemplateOutlet } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, effect, inject, input, signal, ViewEncapsulation, type Signal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\n\nimport { AXPMultiLanguageString } from '@acorex-platform/framework-shared/core';\nimport { AXMAssistChatDebugModeService } from '../actions/assist-chat-debug-mode.service';\nimport { AXMChatMessageApi } from '../services/chat-conversation-apis.abstract';\nimport { AXMAssistSuggestionChipsComponent } from '../shared/assist-suggestion-chips.component';\nimport { AXM_AI_MANAGEMENT_AGENT_ENTITY_NAME, AXM_AI_MANAGEMENT_MODULE_NAME } from '../utils/ai-management.constants';\nimport {\n axmAssistUserFacingPayloadLine,\n axmAssistUserVisibleItemsForLine,\n axmAssistWidgetNodeFromUnknown,\n axmPartitionAssistAnswerText,\n axmParseAssistTranscriptLinePayload,\n axmParseAssistTranscriptTextEnvelope,\n axmReadAssistAiTranscript,\n axmReadAssistAiTranscriptRaw,\n axmReadPlainTextMessagePayload,\n axmSanitizeAssistUserAnswerText,\n axmSyntheticEmbedMessage,\n type AxmAssistUserVisibleItem,\n} from '../utils/assist-bot-transcript.util';\nimport { axmOpenAssistDelegatedAgentDetailDialog } from '../utils/assist-delegated-agent-detail.dialog';\nimport { axmOpenAssistToolDetailDialog } from '../utils/assist-tool-detail.dialog';\nimport { axmAssistHasFinalizeMetadata, axmIsAssistRetryableStatus, axmIsAssistStreamingStatus, axmReadAssistResponseError, axmReadAssistResponseStatus, type AxmAssistResponseStatus } from '../utils/assist-response-status.util';\nimport { axmAssistSegmentDirection } from '../utils/assist-segment-direction.util';\nimport { AXMConversationFocusService } from '../../services/conversation-focus.service';\nimport { AXMAssistBotFileLineComponent } from './assist-bot-file-line.component';\nimport { AXMNodeMessageRendererComponent } from './node-message-renderer.component';\n\n//#endregion\n\n//#region ---- Types ----\n\n/** Shape of a single tool call stored in message metadata (legacy). */\ninterface AssistToolCallEntry {\n id: string;\n name: string;\n arguments: unknown;\n output?: string;\n state: 'running' | 'done';\n /** Streamed specialist text during a delegated agent sub-run (conversation placeholder metadata). */\n nestedStreamText?: string;\n nestedTools?: AssistToolCallEntry[];\n /** Provider API model id for delegated agent sub-runs (e.g. gpt-5). */\n modelLabel?: string;\n}\n\n/** User toggles for assist accordions (thinking, agent, tool); persisted on the message. */\ninterface AssistMessageUiMetadata {\n openByKey?: Record<string, boolean>;\n}\n\n/** Parsed thinking + body from assistant content (legacy). */\ntype ParsedAssistContent = ReturnType<typeof axmParseAssistTranscriptTextEnvelope>;\n\ninterface AXMAiAgentLookupRow {\n id: string;\n title?: string;\n name?: string;\n}\n\n/** Debug strip: persisted assist run metadata (see mock {@code assistRun*} keys). */\ninterface AssistRunDebugView {\n usage?: AXPAiEngineUsageTotals;\n durationMs?: number;\n modelEntityId?: string;\n modelTitle?: string;\n}\n\n//#endregion\n\n//#region ---- Component ----\n\n@Component({\n selector: 'axm-assist-message-renderer',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n AXConversationTextRendererComponent,\n AXMNodeMessageRendererComponent,\n AXMAssistBotFileLineComponent,\n AXMAssistSuggestionChipsComponent,\n AXAccordionCdkModule,\n AXAlertModule,\n AXButtonModule,\n AXDecoratorModule,\n AXCodeEditorModule,\n AXPMarkdownViewerComponent,\n AXPMarkdownTemplateDirective,\n FormsModule,\n AXTranslationModule,\n AsyncPipe,\n DecimalPipe,\n NgTemplateOutlet,\n ],\n templateUrl: './assist-message-renderer.component.html',\n styleUrls: ['./assist-message-renderer.component.css'],\n})\nexport class AXMAssistMessageRendererComponent implements AXConversationMessageRendererComponent {\n //#region ---- Inputs ----\n\n readonly message = input.required<AXConversationMessage>();\n\n //#endregion\n\n //#region ---- Template helpers (exposed for template) ----\n\n protected readonly axpAiChatMessageGetText = axpAiChatMessageGetText;\n\n protected readonly axmAssistWidgetNodeFromUnknown = axmAssistWidgetNodeFromUnknown;\n\n protected readonly partitionAnswerText = axmPartitionAssistAnswerText;\n\n protected readonly parseAssistLineText = axmParseAssistTranscriptTextEnvelope;\n\n protected readonly segmentDir = axmAssistSegmentDirection;\n\n /**\n * Assistant text shown in the transcript: hides delegated sub-run reflection lines from the main markdown stream\n * unless debug mode is on.\n */\n protected assistTranscriptAssistantTextBodyForDisplay(line: AXPAiChatMessage, body: string): string {\n if (this.assistHideTranscriptAnswerSegments()) {\n return '';\n }\n if (axpAiChatMessageIsDelegatedReflectionExcluded(line) && !this.showDebugUi()) {\n return '';\n }\n return body ?? '';\n }\n\n //#endregion\n\n //#region ---- State ----\n\n private readonly entityService = inject(AXPEntityService);\n private readonly assistDebugMode = inject(AXMAssistChatDebugModeService);\n private readonly translation = inject(AXTranslationService);\n private readonly popupService = inject(AXPopupService);\n private readonly messageApi = inject(AXMChatMessageApi);\n private readonly focus = inject(AXMConversationFocusService);\n private readonly modelCatalog = inject(AXPAiAssistChatModelCatalogService);\n private readonly agentData = this.entityService.withEntity(AXM_AI_MANAGEMENT_MODULE_NAME, AXM_AI_MANAGEMENT_AGENT_ENTITY_NAME).data<string, AXMAiAgentLookupRow, AXMAiAgentLookupRow, AXMAiAgentLookupRow, AXMAiAgentLookupRow>();\n\n private readonly loadingAgentIds = new Set<string>();\n private readonly loadingModelIds = new Set<string>();\n\n private readonly agentTitleById = signal<Record<string, string>>({});\n private readonly modelTitleById = signal<Record<string, string>>({});\n\n private readonly contentState = signal<AXConversationMessageRendererContentState>('ready');\n readonly isRetrying = signal(false);\n\n /** Debug transcript/tools UI — only after settings resolve and debug is on. */\n readonly showDebugUi = computed(() => this.assistDebugMode.resolved() && this.assistDebugMode.active());\n\n /** User-facing UI (no tools/thinking accordions); used while unresolved and when debug is off. */\n readonly showNonDebugUi = computed(() => !this.showDebugUi());\n\n /** Persisted assist run metadata (mock writes {@code assistRun*} keys on finalize). */\n readonly assistRunDebug = computed((): AssistRunDebugView | null => {\n const meta = this.message().metadata as Record<string, unknown> | undefined;\n if (!meta) {\n return null;\n }\n const usage = meta['assistRunUsageTotals'] as AXPAiEngineUsageTotals | undefined;\n const durationRaw = meta['assistRunDurationMs'];\n const modelEntityId = meta['assistRunModelEntityId'];\n const modelTitle = meta['assistRunModelTitle'];\n const durationMs = typeof durationRaw === 'number' && Number.isFinite(durationRaw) ? durationRaw : undefined;\n const id = typeof modelEntityId === 'string' && modelEntityId.trim() ? modelEntityId.trim() : undefined;\n const storedTitle = typeof modelTitle === 'string' && modelTitle.trim() ? modelTitle.trim() : undefined;\n const resolvedTitle = id ? this.modelTitleById()[id] : undefined;\n const title = storedTitle || resolvedTitle;\n if (!usage && durationMs == null && !id && !title) {\n return null;\n }\n return { usage, durationMs, modelEntityId: id, modelTitle: title };\n });\n\n private readonly ensureRunModelTitleLoaded = effect(() => {\n if (!this.showDebugUi()) {\n return;\n }\n const meta = this.message().metadata as Record<string, unknown> | undefined;\n if (!meta) {\n return;\n }\n const storedTitle =\n typeof meta['assistRunModelTitle'] === 'string' ? meta['assistRunModelTitle'].trim() : '';\n if (storedTitle) {\n return;\n }\n const modelEntityId =\n typeof meta['assistRunModelEntityId'] === 'string' ? meta['assistRunModelEntityId'].trim() : '';\n if (!modelEntityId) {\n return;\n }\n this.ensureModelTitleLoaded(modelEntityId);\n });\n\n readonly assistResponseStatus = computed((): AxmAssistResponseStatus => axmReadAssistResponseStatus(this.message().metadata));\n\n readonly showRetryScreen = computed(() => {\n const message = this.message();\n if (this.focus.focusedConversationIdSignal() !== message.conversationId) {\n return false;\n }\n return axmIsAssistRetryableStatus(this.assistResponseStatus()) && !this.isRetrying();\n });\n\n readonly assistResponseError = computed(() => axmReadAssistResponseError(this.message().metadata));\n\n readonly assistRetryTitleKey = computed(() => (this.assistResponseStatus() === 'failed' ? '@conversation:chat.assist-renderer.retry.failed.title' : '@conversation:chat.assist-renderer.retry.incomplete.title'));\n\n readonly assistRetryDescriptionKey = computed(() => (this.assistResponseStatus() === 'failed' ? '@conversation:chat.assist-renderer.retry.failed.description' : '@conversation:chat.assist-renderer.retry.incomplete.description'));\n\n readonly assistRetryAlertIcon = computed(() => (this.assistResponseStatus() === 'failed' ? 'fa-light fa-circle-exclamation' : 'fa-light fa-circle-pause'));\n\n readonly rendererState: Signal<AXConversationMessageRendererState> = computed(() => ({\n deliveryStatus: this.message().status,\n contentState: this.showRetryScreen() ? 'error' : this.contentState(),\n }));\n\n //#endregion\n\n //#region ---- Transcript UI ----\n\n readonly transcriptLines = computed((): AXPAiChatMessage[] => {\n return axmReadAssistAiTranscript(this.message().metadata) ?? [];\n });\n\n readonly delegatedTranscriptsByCallId = computed((): Record<string, AXPAiDelegatedAgentTranscriptEntry> => {\n const meta = this.message().metadata;\n if (typeof meta !== 'object' || meta == null) {\n return {};\n }\n const delegated = (meta as Record<string, unknown>)['assistRunDelegatedTranscriptsByCallId'];\n if (typeof delegated !== 'object' || delegated == null || Array.isArray(delegated)) {\n return {};\n }\n return delegated as Record<string, AXPAiDelegatedAgentTranscriptEntry>;\n });\n\n readonly toolResultByCallId = computed(() => {\n const map = new Map<string, AXPAiChatMessage>();\n for (const line of this.transcriptLines()) {\n if (line.role !== 'tool') {\n continue;\n }\n for (const seg of line.responses) {\n if (seg.type === 'tool_result' || seg.type === 'agent_result') {\n const callId = seg.callId;\n if (typeof callId === 'string' && callId.trim()) {\n map.set(callId.trim(), line);\n }\n }\n }\n }\n return map;\n });\n\n readonly useTranscriptUi = computed(() => this.transcriptLines().length > 0);\n\n /** Last transcript line for the non-debug bubble ({@link axmParseAssistTranscriptLinePayload} or engine transcript). */\n readonly assistPayloadLine = computed((): AXPAiChatMessage | null => {\n const fromPayload = axmParseAssistTranscriptLinePayload(this.message().payload);\n if (fromPayload) {\n return fromPayload;\n }\n const raw = axmReadAssistAiTranscriptRaw(this.message().metadata);\n if (raw.length > 0) {\n return axmAssistUserFacingPayloadLine(raw);\n }\n return null;\n });\n\n /**\n * Debug transcript hides user-facing answer segments when the unified payload bubble is shown.\n */\n readonly assistHideTranscriptAnswerSegments = computed(() => !this.isStreaming() && this.assistPayloadLine() != null);\n\n /**\n * Transcript lines that render at least one visible segment. Skips e.g. {@code tool} role lines\n * whose results are merged into assistant tool UI (would otherwise produce empty {@code axm-assist-bot__line}).\n */\n readonly visibleTranscriptLines = computed((): { line: AXPAiChatMessage; lineIndex: number }[] => {\n const lines = this.transcriptLines();\n const out: { line: AXPAiChatMessage; lineIndex: number }[] = [];\n for (let lineIndex = 0; lineIndex < lines.length; lineIndex++) {\n const line = lines[lineIndex];\n if (this.transcriptLineHasVisibleUi(line)) {\n out.push({ line, lineIndex });\n }\n }\n return out;\n });\n\n private transcriptLineHasVisibleUi(line: AXPAiChatMessage): boolean {\n const debug = this.showDebugUi();\n for (const seg of line.responses) {\n if (this.transcriptSegmentHasVisibleUi(line, seg, debug)) {\n return true;\n }\n }\n return false;\n }\n\n private transcriptSegmentHasVisibleUi(line: AXPAiChatMessage, seg: AXPAiChatResponse, debug: boolean): boolean {\n if (line.role === 'user' && seg.type === 'file') {\n return true;\n }\n if (line.role === 'user' && seg.type === 'text') {\n return true;\n }\n if (line.role === 'assistant' && seg.type === 'think' && debug) {\n return true;\n }\n if (line.role === 'assistant' && seg.type === 'text') {\n const parsed = this.parseAssistLineText(seg.content);\n if (debug && parsed.thinking) {\n return true;\n }\n if (debug && this.assistHideTranscriptAnswerSegments()) {\n return false;\n }\n return parsed.body.trim().length > 0;\n }\n if (line.role === 'assistant' && (seg.type === 'agent' || seg.type === 'tool') && this.isDelegatedAgentCommand(seg.content.command)) {\n if (debug) {\n return true;\n }\n const res = this.toolResultForCallId(seg.callId);\n const outcomeSegs = this.delegatedAgentOutcomeSegmentsForCall(res);\n const hasRenderableOutcome = outcomeSegs.some((s) => {\n if (s.type === 'file' || s.type === 'node') {\n return true;\n }\n if (s.type === 'text' || s.type === 'think') {\n return s.content.trim().length > 0;\n }\n if (s.type === 'followUp') {\n return s.content.length > 0;\n }\n return false;\n });\n if (hasRenderableOutcome) {\n return true;\n }\n return this.delegatedAgentAnswerForCall(res).trim().length > 0;\n }\n if (line.role === 'assistant' && seg.type === 'tool' && debug) {\n return true;\n }\n if (line.role === 'assistant' && seg.type === 'node') {\n if (debug && this.assistHideTranscriptAnswerSegments()) {\n return false;\n }\n return axmAssistWidgetNodeFromUnknown(seg.content) != null;\n }\n if (line.role === 'assistant' && seg.type === 'file') {\n if (debug && this.assistHideTranscriptAnswerSegments()) {\n return false;\n }\n return true;\n }\n if (line.role === 'assistant' && seg.type === 'followUp') {\n if (debug) {\n return false;\n }\n return seg.content.length > 0;\n }\n if (line.role === 'tool' && (seg.type === 'tool_result' || seg.type === 'agent_result')) {\n return false;\n }\n if (line.role === 'system' && seg.type === 'text' && debug) {\n return true;\n }\n return debug || line.role !== 'assistant';\n }\n\n private readonly syncAgentTitles = effect(() => {\n const ids = new Set<string>();\n\n for (const line of this.transcriptLines()) {\n if (line.role !== 'assistant') {\n continue;\n }\n for (const seg of line.responses) {\n if (seg.type !== 'tool' && seg.type !== 'agent') {\n continue;\n }\n const agentId = this.extractAgentIdFromCommand(seg.content.command);\n if (agentId) {\n ids.add(agentId);\n }\n }\n }\n\n for (const tc of this.toolCalls()) {\n const agentId = this.extractAgentIdFromCommand(tc.name);\n if (agentId) {\n ids.add(agentId);\n }\n }\n\n for (const id of ids) {\n this.ensureAgentTitleLoaded(id);\n }\n });\n\n syntheticTextMessage(lineIndex: number, segIndex: number, text: string): AXConversationMessage {\n return axmSyntheticEmbedMessage(this.message(), `ut-${lineIndex}-${segIndex}`, {\n type: 'text',\n payload: { type: 'text', text },\n });\n }\n\n syntheticNodeEmbedMessage(lineIndex: number, segIndex: number, content: unknown): AXConversationMessage {\n return axmSyntheticEmbedMessage(this.message(), `node-${lineIndex}-${segIndex}`, {\n type: 'node',\n payload: { type: 'node', content } as unknown as AXConversationMessagePayload,\n });\n }\n\n syntheticAppendNodeMessage(itemIndex: number, content: unknown): AXConversationMessage {\n return axmSyntheticEmbedMessage(this.message(), `append-node-${itemIndex}`, {\n type: 'node',\n payload: { type: 'node', content } as unknown as AXConversationMessagePayload,\n });\n }\n\n protected markdownCodeLanguage(segment: unknown): AXCodeEditorDefaultLanguage {\n if (this.isMarkdownCodeSegment(segment) && segment.language.trim()) {\n return segment.language as AXCodeEditorDefaultLanguage;\n }\n return 'javascript';\n }\n\n protected markdownCodeValue(segment: unknown): string {\n if (this.isMarkdownCodeSegment(segment)) {\n return segment.code;\n }\n return '';\n }\n\n resolveToolDisplayTitle(command: string): string {\n const agentId = this.extractAgentIdFromCommand(command);\n if (!agentId) {\n return command?.trim() || 'Tool';\n }\n const title = this.agentTitleById()[agentId];\n if (title) {\n return title;\n }\n return agentId;\n }\n\n /** Faint label for the provider model used by a delegated agent (or tool call metadata). */\n resolveToolModelLabel(command: string, callId?: string): string | undefined {\n const fromCall = this.toolCallEntryFor(callId)?.modelLabel?.trim();\n if (fromCall) {\n return fromCall;\n }\n const scopedCallId = callId?.trim();\n if (scopedCallId) {\n const fromTranscript = this.delegatedTranscriptsByCallId()[scopedCallId]?.modelLabel?.trim();\n if (fromTranscript) {\n return fromTranscript;\n }\n }\n return undefined;\n }\n\n resolveToolBadge(command: string, fallback: string): string {\n return this.extractAgentIdFromCommand(command) ? '@conversation:chat.assist-renderer.badges.agent' : fallback;\n }\n\n toolResultForCallId(callId: string | undefined): AXPAiChatMessage | null {\n if (!callId || !callId.trim()) {\n return null;\n }\n return this.toolResultByCallId().get(callId.trim()) ?? null;\n }\n\n protected toolCallEntryFor(callId: string | undefined): AssistToolCallEntry | undefined {\n if (!callId?.trim()) {\n return undefined;\n }\n return this.toolCalls().find((t) => t.id === callId.trim());\n }\n\n protected delegatedPromptPreview(argumentsValue: unknown): string {\n return axpAiDelegatedAgentPromptPreview(argumentsValue);\n }\n\n protected isDelegatedAgentCommand(command: string): boolean {\n return axpAiParseSupervisorAgentToolName(command) != null;\n }\n\n protected delegatedAgentOutcomeSegmentsForCall(res: AXPAiChatMessage | null): AXPAiDelegatedAgentResultSegment[] {\n if (!res) {\n return [];\n }\n const raw = axpAiChatToolOrAgentResultBodyJson(res);\n if (!raw.trim()) {\n return [];\n }\n try {\n const o = JSON.parse(raw) as Record<string, unknown>;\n if (o['success'] === false) {\n return [];\n }\n return axpAiDelegatedAgentResultSegments(o as { success?: boolean; data?: { responses?: AXPAiDelegatedAgentResultSegment[] } });\n } catch {\n return [];\n }\n }\n\n protected delegatedAnswerFromToolResult(resultLine: AXPAiChatMessage | null): string {\n if (!resultLine) {\n return '';\n }\n const raw = axpAiChatToolOrAgentResultBodyJson(resultLine);\n try {\n const o = JSON.parse(raw) as Record<string, unknown>;\n if (o['success'] === false) {\n const err = o['error'];\n return typeof err === 'string' && err.trim() ? err.trim() : 'Request failed.';\n }\n const segs = axpAiDelegatedAgentResultSegments(o as { success?: boolean; data?: { responses?: AXPAiDelegatedAgentResultSegment[] } });\n return axpAiDelegatedAgentOutcomeResponsesPlainText(segs);\n } catch {\n return raw.trim();\n }\n }\n\n private isMarkdownCodeSegment(segment: unknown): segment is { type: 'code'; language: string; code: string } {\n if (!segment || typeof segment !== 'object') {\n return false;\n }\n\n const candidate = segment as { type?: unknown; language?: unknown; code?: unknown };\n return candidate.type === 'code' && typeof candidate.language === 'string' && typeof candidate.code === 'string';\n }\n\n /**\n * Parses the same agent JSON body shape as {@link delegatedAnswerFromToolResult} from raw tool `output` stored in metadata.\n */\n protected delegatedAnswerFromToolOutputString(output: string | undefined): string {\n if (!output?.trim()) {\n return '';\n }\n const raw = output.trim();\n try {\n const o = JSON.parse(raw) as Record<string, unknown>;\n if (o['success'] === false) {\n const err = o['error'];\n return typeof err === 'string' && err.trim() ? err.trim() : 'Request failed.';\n }\n const segs = axpAiDelegatedAgentResultSegments(o as { success?: boolean; data?: { responses?: AXPAiDelegatedAgentResultSegment[] } });\n return axpAiDelegatedAgentOutcomeResponsesPlainText(segs);\n } catch {\n return raw;\n }\n }\n\n protected delegatedAgentAnswerForCall(res: AXPAiChatMessage | null): string {\n return this.delegatedAnswerFromToolResult(res);\n }\n\n protected delegatedAgentLabelForCall(callId: string | undefined): string | undefined {\n const resultLine = this.toolResultForCallId(callId);\n if (!resultLine) {\n return undefined;\n }\n return this.parseDelegatedAgentToolResult(axpAiChatToolOrAgentResultBodyJson(resultLine)).agentName;\n }\n\n protected async openDelegatedAgentTranscriptDialog(callId: string | undefined, toolName: string, resolvedAgentLabel?: string): Promise<void> {\n await axmOpenAssistDelegatedAgentDetailDialog({\n callId: callId ?? '',\n toolName,\n delegatedTranscriptsByCallId: this.delegatedTranscriptsByCallId(),\n resolvedAgentLabel: resolvedAgentLabel ?? this.delegatedAgentLabelForCall(callId),\n resolveCatalogTitle: (agentId) => this.agentTitleById()[agentId],\n agentTitleById: this.agentTitleById(),\n popupService: this.popupService,\n translationService: this.translation,\n });\n }\n\n protected async openAssistToolDetailDialog(options: {\n toolTitle: string;\n argumentsValue: unknown;\n output?: string;\n resultLine?: AXPAiChatMessage | null;\n }): Promise<void> {\n const outputJson =\n options.output?.trim() ||\n (options.resultLine ? this.formatToolResultBody(options.resultLine) : '');\n await axmOpenAssistToolDetailDialog({\n toolTitle: options.toolTitle,\n inputJson: this.formatArgs(options.argumentsValue),\n outputJson: outputJson.trim() || undefined,\n popupService: this.popupService,\n });\n }\n\n protected async openTranscriptToolDetail(\n callId: string | undefined,\n command: string,\n argumentsValue: unknown,\n resolvedAgentLabel?: string,\n ): Promise<void> {\n if (this.isDelegatedAgentCommand(command)) {\n await this.openDelegatedAgentTranscriptDialog(callId, command, resolvedAgentLabel);\n return;\n }\n await this.openAssistToolDetailDialog({\n toolTitle: this.resolveToolDisplayTitle(command),\n argumentsValue,\n resultLine: this.toolResultForCallId(callId),\n });\n }\n\n protected async openLegacyToolDetail(tc: AssistToolCallEntry): Promise<void> {\n if (this.isDelegatedAgentCommand(tc.name)) {\n await this.openDelegatedAgentTranscriptDialog(tc.id, tc.name, this.delegatedAgentLabelForCall(tc.id));\n return;\n }\n await this.openAssistToolDetailDialog({\n toolTitle: this.resolveToolDisplayTitle(tc.name),\n argumentsValue: tc.arguments,\n output: tc.output,\n });\n }\n\n private parseDelegatedAgentToolResult(content: string): { agentName?: string } {\n const trimmed = content?.trim() ?? '';\n if (!trimmed) {\n return {};\n }\n try {\n const o = JSON.parse(trimmed) as Record<string, unknown>;\n if (o['success'] === false || o['success'] !== true) {\n return {};\n }\n const data = o['data'];\n if (data == null || typeof data !== 'object' || Array.isArray(data)) {\n return {};\n }\n const agentName = (data as Record<string, unknown>)['agentName'];\n return typeof agentName === 'string' && agentName.trim() ? { agentName: agentName.trim() } : {};\n } catch {\n return {};\n }\n }\n\n /**\n * Human-readable wall time for the assist API run (mock stores {@code assistRunDurationMs}).\n */\n formatAssistRunDuration(ms: number): string {\n if (!Number.isFinite(ms) || ms < 0) {\n return '—';\n }\n if (ms < 1000) {\n return `${Math.round(ms)} ms`;\n }\n return `${(ms / 1000).toFixed(1)} s`;\n }\n\n formatFallbackSegment(seg: AXPAiChatMessage['responses'][number]): string {\n try {\n return JSON.stringify(seg, null, 2);\n } catch {\n return String(seg);\n }\n }\n\n formatToolResultBody(line: AXPAiChatMessage): string {\n return this.formatJson(axpAiChatToolOrAgentResultBodyJson(line));\n }\n\n protected assistThinkKey(lineIndex: number, segIndex: number): string {\n return `think:${lineIndex}-${segIndex}`;\n }\n\n protected assistThinkStreamKey(): string {\n return 'think:stream';\n }\n\n protected assistThinkFinalKey(): string {\n return 'think:final';\n }\n\n protected assistRunMetaKey(): string {\n return 'run-meta';\n }\n\n protected assistAgentKey(callId: string | undefined): string {\n return `agent:${(callId ?? '').trim() || 'unknown'}`;\n }\n\n protected assistToolKey(callId: string | undefined): string {\n return `tool:${(callId ?? '').trim() || 'unknown'}`;\n }\n\n protected assistLegacyToolAccordionKey(tc: AssistToolCallEntry): string {\n return this.isDelegatedAgentCommand(tc.name) ? this.assistAgentKey(tc.id) : this.assistToolKey(tc.id);\n }\n\n protected onAssistLegacyAccordionClick(event: unknown, tc: AssistToolCallEntry): void {\n this.onAssistAccordionClick(event, this.assistLegacyToolAccordionKey(tc));\n }\n\n /**\n * Accordion is collapsed by default; open only when the user has persisted `open: true` for this key.\n */\n protected assistSectionIsCollapsed(key: string): boolean {\n return !this.isAssistSectionOpen(key);\n }\n\n private isAssistSectionOpen(key: string): boolean {\n const m = this.message().metadata;\n if (typeof m !== 'object' || m == null) {\n return false;\n }\n const assistUi = (m as Record<string, unknown>)['assistUi'] as AssistMessageUiMetadata | undefined;\n return assistUi?.openByKey?.[key] === true;\n }\n\n protected onAssistAccordionClick(event: unknown, key: string): void {\n const c = (event as { component?: { isCollapsed: () => boolean } } | null)?.component;\n if (!c) {\n return;\n }\n const open = !c.isCollapsed();\n void this.persistAssistUiOpenKey(key, open);\n }\n\n private async persistAssistUiOpenKey(key: string, open: boolean): Promise<void> {\n const message = this.message();\n const prev = (message.metadata ?? {}) as Record<string, unknown>;\n const prevUi = (prev['assistUi'] as AssistMessageUiMetadata | undefined) ?? {};\n const openByKey: Record<string, boolean> = { ...(prevUi.openByKey ?? {}) };\n if (open) {\n openByKey[key] = true;\n } else {\n delete openByKey[key];\n }\n const nextMeta: Record<string, unknown> = { ...prev, assistUi: { ...prevUi, openByKey } };\n const updated: AXConversationMessage = { ...message, metadata: nextMeta };\n await this.messageApi.updateMessageMetadata(message.id, nextMeta);\n }\n\n //#endregion\n\n //#region ---- Legacy computed ----\n\n readonly isStreaming = computed(() => {\n const status = this.assistResponseStatus();\n if (!axmIsAssistStreamingStatus(status)) {\n return false;\n }\n const meta = this.message().metadata;\n if (axmAssistHasFinalizeMetadata(meta)) {\n return false;\n }\n const transcripts = (meta as Record<string, unknown> | undefined)?.['transcripts'];\n return !(Array.isArray(transcripts) && transcripts.length > 0);\n });\n\n /** Phase label for the streaming activity strip (translation key suffix via {@link assistActivityMessageKey}). */\n readonly assistStreamingPhase = computed((): 'starting' | 'planning' | 'using-tools' | 'responding' => {\n if (!this.isStreaming()) {\n return 'starting';\n }\n const tools = this.toolCalls();\n if (tools.some((t) => t.state === 'running')) {\n return 'using-tools';\n }\n const think = this.streamThink().trim();\n const text = this.streamText().trim();\n if (think && !text) {\n return 'planning';\n }\n if (text) {\n return 'responding';\n }\n return 'starting';\n });\n\n readonly assistActivityMessageKey = computed(() => {\n const phase = this.assistStreamingPhase();\n return `@conversation:chat.assist-renderer.activity.${phase}`;\n });\n\n readonly streamThink = computed(() => {\n const v = this.readMeta('streamDraftThink');\n return typeof v === 'string' ? v : '';\n });\n\n readonly streamText = computed(() => {\n const d = this.readMeta('streamDraftText');\n return typeof d === 'string' ? d : '';\n });\n\n /** Answer markdown while streaming (draft) or after finalize (payload); shared by debug and non-debug. */\n readonly assistAnswerMarkdown = computed(() => {\n const live = axmSanitizeAssistUserAnswerText(this.streamText());\n if (this.isStreaming()) {\n return live;\n }\n return axmSanitizeAssistUserAnswerText(this.parsed().body.trim() || live);\n });\n\n /** Non-text payload segments shown below the answer after finalize. */\n readonly assistPayloadAppendItems = computed((): AxmAssistUserVisibleItem[] => {\n if (this.isStreaming()) {\n return [];\n }\n const line = this.assistPayloadLine();\n if (!line) {\n return [];\n }\n return axmAssistUserVisibleItemsForLine(line)\n .filter((item) => item.kind !== 'text')\n .sort((a, b) => {\n if (a.kind === 'followUp') {\n return 1;\n }\n if (b.kind === 'followUp') {\n return -1;\n }\n return 0;\n });\n });\n\n /**\n * Non-debug stream panel: skip the empty wrapper when there is no answer, append content, or live stream.\n */\n readonly showNonDebugStreamPanel = computed(() => this.isStreaming() || this.assistAnswerMarkdown().trim().length > 0 || this.assistPayloadAppendItems().length > 0);\n\n readonly toolCalls = computed<AssistToolCallEntry[]>(() => {\n const raw = this.readMeta('toolCalls');\n return Array.isArray(raw) ? raw : [];\n });\n\n readonly parsed = computed<ParsedAssistContent>(() => {\n if (this.isStreaming()) {\n return { thinking: null, body: '' };\n }\n const line = this.assistPayloadLine();\n if (line) {\n const textParts = axmAssistUserVisibleItemsForLine(line)\n .filter((i): i is { kind: 'text'; content: string } => i.kind === 'text')\n .map((i) => axmParseAssistTranscriptTextEnvelope(i.content).body.trim())\n .filter((t) => t.length > 0);\n return { thinking: null, body: axmSanitizeAssistUserAnswerText(textParts.join('\\n\\n')) };\n }\n const plainText = axmReadPlainTextMessagePayload(this.message().payload);\n if (plainText.trim()) {\n const envelope = axmParseAssistTranscriptTextEnvelope(plainText);\n return {\n thinking: envelope.thinking,\n body: axmSanitizeAssistUserAnswerText(envelope.body.trim()),\n };\n }\n return { thinking: null, body: '' };\n });\n\n //#endregion\n\n //#region ---- Retry ----\n\n protected async onRetryAssistResponse(): Promise<void> {\n if (this.isRetrying() || !this.showRetryScreen()) {\n return;\n }\n\n const message = this.message();\n this.isRetrying.set(true);\n try {\n await this.messageApi.retryAssistResponse(message.conversationId, message.id);\n } catch (error) {\n console.error('Failed to retry assist response:', error);\n } finally {\n this.isRetrying.set(false);\n }\n }\n\n //#endregion\n\n //#region ---- Formatters ----\n\n formatArgs(args: unknown): string {\n if (args == null) return '';\n if (typeof args === 'string') return this.tryPrettyJson(args);\n try {\n return JSON.stringify(args, null, 2);\n } catch {\n return String(args);\n }\n }\n\n formatJson(raw: string): string {\n return this.tryPrettyJson(raw);\n }\n\n //#endregion\n\n //#region ---- Utilities ----\n\n private readMeta(key: string): unknown {\n const meta = this.message().metadata;\n if (typeof meta !== 'object' || meta == null) return undefined;\n return (meta as Record<string, unknown>)[key];\n }\n\n private tryPrettyJson(raw: string): string {\n const trimmed = raw.trim();\n if (!trimmed) return '';\n try {\n return JSON.stringify(JSON.parse(trimmed), null, 2);\n } catch {\n return raw;\n }\n }\n\n private extractAgentIdFromCommand(command: unknown): string | null {\n if (typeof command !== 'string') {\n return null;\n }\n const [prefix, id] = command.split(':');\n if (prefix?.trim().toLowerCase() !== 'agent') {\n return null;\n }\n const resolvedId = id?.trim();\n return resolvedId ? resolvedId : null;\n }\n\n private ensureAgentTitleLoaded(agentId: string): void {\n if (!agentId || this.agentTitleById()[agentId] || this.loadingAgentIds.has(agentId)) {\n return;\n }\n this.loadingAgentIds.add(agentId);\n void this.agentData\n .byKey(agentId)\n .then((agent) => {\n const title = (this.translation.resolve(agent?.title as AXPMultiLanguageString)?.trim() || agent?.name?.trim() || agent?.id || agentId).trim();\n this.agentTitleById.update((current) => ({ ...current, [agentId]: title }));\n })\n .catch(() => {\n this.agentTitleById.update((current) => ({ ...current, [agentId]: agentId }));\n })\n .finally(() => {\n this.loadingAgentIds.delete(agentId);\n });\n }\n\n private ensureModelTitleLoaded(modelEntityId: string): void {\n if (!modelEntityId || this.modelTitleById()[modelEntityId] || this.loadingModelIds.has(modelEntityId)) {\n return;\n }\n this.loadingModelIds.add(modelEntityId);\n void this.modelCatalog\n .listModels()\n .then((rows) => {\n const match = rows.find((row) => row.id === modelEntityId);\n const title = match?.title?.trim() || match?.name?.trim() || modelEntityId;\n this.modelTitleById.update((current) => ({ ...current, [modelEntityId]: title }));\n })\n .catch(() => {\n this.modelTitleById.update((current) => ({ ...current, [modelEntityId]: modelEntityId }));\n })\n .finally(() => {\n this.loadingModelIds.delete(modelEntityId);\n });\n }\n\n //#endregion\n}\n\n//#endregion\n","<div class=\"axm-assist-renderer\">\n @if (showDebugUi() && useTranscriptUi() && !isStreaming()) {\n <div class=\"axm-assist-bot\" role=\"region\" [attr.aria-label]=\"('@conversation:chat.assist-renderer.aria.assistant-response' | translate | async) ?? ''\">\n @for (item of visibleTranscriptLines(); track item.lineIndex) {\n @let line = item.line;\n @let lineIndex = item.lineIndex;\n <div class=\"axm-assist-bot__line\" [class.axm-assist-bot__line--user]=\"line.role === 'user'\" [class.axm-assist-bot__line--tool-role]=\"line.role === 'tool'\">\n @for (seg of line.responses; track segIndex; let segIndex = $index) {\n @if (line.role === 'user' && seg.type === 'file') {\n <axm-assist-bot-file-line [parentMessage]=\"message()\" [fileId]=\"seg.content.fileId\" />\n } @else if (line.role === 'user' && seg.type === 'text') {\n <div class=\"axm-assist-bot__segment\" [attr.dir]=\"segmentDir(seg.content)\">\n <ax-conversation-text-renderer [message]=\"syntheticTextMessage(lineIndex, segIndex, seg.content)\" />\n </div>\n } @else if (line.role === 'assistant' && seg.type === 'think' && showDebugUi()) {\n <div class=\"axm-assist-renderer__accordion-group\" axAccordionGroup [accordion]=\"false\">\n <div\n class=\"axm-assist-renderer__thinking-accordion axm-assist-renderer__collapse-shell mb-0!\"\n axAccordionItem\n #thinkAcc=\"axAccordionItem\"\n [isCollapsed]=\"assistSectionIsCollapsed(assistThinkKey(lineIndex, segIndex))\"\n (onClick)=\"onAssistAccordionClick($event, assistThinkKey(lineIndex, segIndex))\"\n >\n <div class=\"axm-assist-renderer__accordion-header\" axAccordionItemHeader role=\"button\" [attr.aria-expanded]=\"!thinkAcc.isCollapsed()\">\n <div class=\"axm-assist-renderer__accordion-header-main\">\n <span class=\"axm-assist-renderer__accordion-header-title\">\n <i class=\"fa-light fa-chevron-down axm-assist-renderer__thinking-chevron\" [class.axm-assist-renderer__thinking-chevron--expanded]=\"!thinkAcc.isCollapsed()\" aria-hidden=\"true\"></i>\n <i class=\"fa-light fa-brain axm-assist-renderer__tool-title-icon\" aria-hidden=\"true\"></i>\n {{ '@conversation:chat.assist-renderer.sections.thinking' | translate | async }}\n </span>\n </div>\n </div>\n <div axAccordionItemContent>\n <div class=\"axm-assist-renderer__collapse-body\">\n <div class=\"axm-assist-renderer__thinking-body axm-assist-bot__segment axm-assist-renderer__markdown\" [attr.dir]=\"segmentDir(seg.content)\">\n <axp-markdown-viewer [markdown]=\"seg.content\">\n <ng-template axpMarkdownTemplate=\"code\" let-segment>\n <div class=\"axm-assist-renderer__tool-editor-wrap\" style=\"direction: ltr\">\n <ax-code-editor [ngModel]=\"markdownCodeValue(segment)\" [readonly]=\"true\" [language]=\"markdownCodeLanguage(segment)\" [lineNumbers]=\"true\" class=\"axm-assist-renderer__tool-editor\"></ax-code-editor>\n </div>\n </ng-template>\n </axp-markdown-viewer>\n </div>\n </div>\n </div>\n </div>\n </div>\n } @else if (line.role === 'assistant' && seg.type === 'text') {\n @let parsedLine = parseAssistLineText(seg.content);\n @let displayBody = assistTranscriptAssistantTextBodyForDisplay(line, parsedLine.body);\n @let partitionedLine = partitionAnswerText(displayBody);\n @if (showDebugUi() && parsedLine.thinking) {\n <div class=\"axm-assist-renderer__accordion-group\" axAccordionGroup [accordion]=\"false\">\n <div\n class=\"axm-assist-renderer__thinking-accordion axm-assist-renderer__collapse-shell mb-0!\"\n axAccordionItem\n #thinkAcc=\"axAccordionItem\"\n [isCollapsed]=\"assistSectionIsCollapsed(assistThinkKey(lineIndex, segIndex))\"\n (onClick)=\"onAssistAccordionClick($event, assistThinkKey(lineIndex, segIndex))\"\n >\n <div class=\"axm-assist-renderer__accordion-header\" axAccordionItemHeader role=\"button\" [attr.aria-expanded]=\"!thinkAcc.isCollapsed()\">\n <div class=\"axm-assist-renderer__accordion-header-main\">\n <span class=\"axm-assist-renderer__accordion-header-title\">\n <i class=\"fa-light fa-chevron-down axm-assist-renderer__thinking-chevron\" [class.axm-assist-renderer__thinking-chevron--expanded]=\"!thinkAcc.isCollapsed()\" aria-hidden=\"true\"></i>\n <i class=\"fa-light fa-brain axm-assist-renderer__tool-title-icon\" aria-hidden=\"true\"></i>\n {{ '@conversation:chat.assist-renderer.sections.thinking' | translate | async }}\n </span>\n </div>\n </div>\n <div axAccordionItemContent>\n <div class=\"axm-assist-renderer__collapse-body\">\n <div class=\"axm-assist-renderer__thinking-body axm-assist-bot__segment axm-assist-renderer__markdown\" [attr.dir]=\"segmentDir(parsedLine.thinking)\">\n <axp-markdown-viewer [markdown]=\"parsedLine.thinking ?? ''\">\n <ng-template axpMarkdownTemplate=\"code\" let-segment>\n <div class=\"axm-assist-renderer__tool-editor-wrap\" style=\"direction: ltr\">\n <ax-code-editor [ngModel]=\"markdownCodeValue(segment)\" [readonly]=\"true\" [language]=\"markdownCodeLanguage(segment)\" [lineNumbers]=\"true\" class=\"axm-assist-renderer__tool-editor\"></ax-code-editor>\n </div>\n </ng-template>\n </axp-markdown-viewer>\n </div>\n </div>\n </div>\n </div>\n </div>\n }\n @if (partitionedLine.markdown.trim()) {\n <div class=\"axm-assist-bot__segment axm-assist-renderer__markdown\" [attr.dir]=\"segmentDir(partitionedLine.markdown)\">\n <axp-markdown-viewer [markdown]=\"partitionedLine.markdown\">\n <ng-template axpMarkdownTemplate=\"code\" let-segment>\n <div class=\"axm-assist-renderer__tool-editor-wrap\" style=\"direction: ltr\">\n <ax-code-editor [ngModel]=\"markdownCodeValue(segment)\" [readonly]=\"true\" [language]=\"markdownCodeLanguage(segment)\" [lineNumbers]=\"true\" class=\"axm-assist-renderer__tool-editor\"></ax-code-editor>\n </div>\n </ng-template>\n </axp-markdown-viewer>\n </div>\n }\n @for (renderable of partitionedLine.renderable; track $index) {\n @if (renderable.type === 'node' && axmAssistWidgetNodeFromUnknown(renderable.content)) {\n <div class=\"axm-assist-bot__segment\" dir=\"auto\">\n <axm-chat-user-form-renderer [message]=\"syntheticNodeEmbedMessage(lineIndex, segIndex * 100 + $index, renderable.content)\" />\n </div>\n }\n }\n } @else if (line.role === 'assistant' && (seg.type === 'agent' || seg.type === 'tool') && isDelegatedAgentCommand(seg.content.command)) {\n @if (showDebugUi()) {\n <div class=\"axm-assist-renderer__tool-row\">\n <div class=\"axm-assist-renderer__tool-row-main\">\n <i class=\"fa-light fa-people-group axm-assist-renderer__tool-title-icon\" aria-hidden=\"true\"></i>\n <span class=\"axm-assist-renderer__tool-row-title\">{{ resolveToolDisplayTitle(seg.content.command) }}</span>\n @if (resolveToolModelLabel(seg.content.command, seg.callId); as modelLabel) {\n <span class=\"axm-assist-renderer__tool-model-label\">{{ modelLabel }}</span>\n }\n </div>\n <ax-button\n look=\"outline\"\n color=\"primary\"\n class=\"ax-xs\"\n [text]=\"('@conversation:chat.assist-renderer.delegated-agent.detail' | translate | async) ?? ''\"\n [attr.aria-label]=\"('@conversation:chat.assist-renderer.delegated-agent.detail-aria' | translate | async) ?? ''\"\n (onClick)=\"openTranscriptToolDetail(seg.callId, seg.content.command, seg.content.arguments, delegatedAgentLabelForCall(seg.callId))\"\n ></ax-button>\n </div>\n } @else {\n <div class=\"axm-assist-renderer__tool-row\">\n <div class=\"axm-assist-renderer__tool-row-main\">\n <i class=\"fa-light fa-people-group axm-assist-renderer__tool-title-icon\" aria-hidden=\"true\"></i>\n <span class=\"axm-assist-renderer__tool-row-title\">{{ resolveToolDisplayTitle(seg.content.command) }}</span>\n @if (resolveToolModelLabel(seg.content.command, seg.callId); as modelLabel) {\n <span class=\"axm-assist-renderer__tool-model-label\">{{ modelLabel }}</span>\n }\n </div>\n <ax-button\n look=\"outline\"\n color=\"primary\"\n class=\"ax-xs\"\n [text]=\"('@conversation:chat.assist-renderer.delegated-agent.detail' | translate | async) ?? ''\"\n [attr.aria-label]=\"('@conversation:chat.assist-renderer.delegated-agent.detail-aria' | translate | async) ?? ''\"\n (onClick)=\"openTranscriptToolDetail(seg.callId, seg.content.command, seg.content.arguments, delegatedAgentLabelForCall(seg.callId))\"\n ></ax-button>\n </div>\n @let res = toolResultForCallId(seg.callId);\n @let outcomeSegs = delegatedAgentOutcomeSegmentsForCall(res);\n @if (outcomeSegs.length > 0) {\n @for (outSeg of outcomeSegs; track outSegIndex; let outSegIndex = $index) {\n @switch (outSeg.type) {\n @case ('text') {\n @let parsedOut = parseAssistLineText(outSeg.content);\n @let partitionedOut = partitionAnswerText(parsedOut.body);\n @if (partitionedOut.markdown.trim()) {\n <div class=\"axm-assist-bot__segment axm-assist-renderer__markdown\" [attr.dir]=\"segmentDir(partitionedOut.markdown)\">\n <axp-markdown-viewer [markdown]=\"partitionedOut.markdown\">\n <ng-template axpMarkdownTemplate=\"code\" let-segment>\n <div class=\"axm-assist-renderer__tool-editor-wrap\" style=\"direction: ltr\">\n <ax-code-editor [ngModel]=\"markdownCodeValue(segment)\" [readonly]=\"true\" [language]=\"markdownCodeLanguage(segment)\" [lineNumbers]=\"true\" class=\"axm-assist-renderer__tool-editor\"></ax-code-editor>\n </div>\n </ng-template>\n </axp-markdown-viewer>\n </div>\n }\n @for (renderable of partitionedOut.renderable; track renderableIndex; let renderableIndex = $index) {\n @if (renderable.type === 'node' && axmAssistWidgetNodeFromUnknown(renderable.content)) {\n <div class=\"axm-assist-bot__segment\" dir=\"auto\">\n <axm-chat-user-form-renderer [message]=\"syntheticNodeEmbedMessage(lineIndex, segIndex * 1000 + outSegIndex * 10 + renderableIndex, renderable.content)\" />\n </div>\n }\n }\n }\n @case ('think') {\n @if (showDebugUi()) {\n <div class=\"axm-assist-bot__segment\" [attr.dir]=\"segmentDir(outSeg.content)\">\n {{ outSeg.content }}\n </div>\n }\n }\n @case ('file') {\n <axm-assist-bot-file-line [parentMessage]=\"message()\" [fileId]=\"outSeg.content.fileId\" />\n }\n @case ('node') {\n @let assistNodeWidget = axmAssistWidgetNodeFromUnknown(outSeg.content);\n @if (assistNodeWidget) {\n <div class=\"axm-assist-bot__segment\" dir=\"auto\">\n <axm-chat-user-form-renderer [message]=\"syntheticNodeEmbedMessage(lineIndex, segIndex * 1000 + outSegIndex, outSeg.content)\" />\n </div>\n }\n }\n }\n }\n } @else if (delegatedAgentAnswerForCall(res).trim()) {\n @let agentFallbackText = delegatedAgentAnswerForCall(res);\n <div class=\"axm-assist-bot__segment axm-assist-renderer__markdown\" [attr.dir]=\"segmentDir(agentFallbackText)\">\n <axp-markdown-viewer [markdown]=\"agentFallbackText\">\n <ng-template axpMarkdownTemplate=\"code\" let-segment>\n <div class=\"axm-assist-renderer__tool-editor-wrap\" style=\"direction: ltr\">\n <ax-code-editor [ngModel]=\"markdownCodeValue(segment)\" [readonly]=\"true\" [language]=\"markdownCodeLanguage(segment)\" [lineNumbers]=\"true\" class=\"axm-assist-renderer__tool-editor\"></ax-code-editor>\n </div>\n </ng-template>\n </axp-markdown-viewer>\n </div>\n }\n }\n } @else if (line.role === 'assistant' && seg.type === 'tool' && showDebugUi()) {\n <div class=\"axm-assist-renderer__tool-row\">\n <div class=\"axm-assist-renderer__tool-row-main\">\n <i class=\"fa-light fa-screwdriver-wrench axm-assist-renderer__tool-title-icon\" aria-hidden=\"true\"></i>\n <span class=\"axm-assist-renderer__tool-row-title\">{{ resolveToolDisplayTitle(seg.content.command) }}</span>\n </div>\n <ax-button\n look=\"outline\"\n color=\"primary\"\n class=\"ax-xs\"\n [text]=\"('@conversation:chat.assist-renderer.delegated-agent.detail' | translate | async) ?? ''\"\n [attr.aria-label]=\"('@conversation:chat.assist-renderer.delegated-agent.detail-aria' | translate | async) ?? ''\"\n (onClick)=\"openTranscriptToolDetail(seg.callId, seg.content.command, seg.content.arguments)\"\n ></ax-button>\n </div>\n } @else if (line.role === 'assistant' && seg.type === 'node') {\n @let assistNodeWidget = axmAssistWidgetNodeFromUnknown(seg.content);\n @if (assistNodeWidget) {\n <div class=\"axm-assist-bot__segment\" dir=\"auto\">\n <axm-chat-user-form-renderer [message]=\"syntheticNodeEmbedMessage(lineIndex, segIndex, seg.content)\" />\n </div>\n }\n } @else if (line.role === 'assistant' && seg.type === 'file' && !assistHideTranscriptAnswerSegments()) {\n <axm-assist-bot-file-line [parentMessage]=\"message()\" [fileId]=\"seg.content.fileId\" />\n } @else if (line.role === 'tool' && (seg.type === 'tool_result' || seg.type === 'agent_result')) {\n <!-- merged into the corresponding tool/agent accordion -->\n } @else if (line.role === 'system' && seg.type === 'text' && showDebugUi()) {\n <div class=\"axm-assist-bot__segment\" [attr.dir]=\"segmentDir(seg.content)\">\n <ax-conversation-text-renderer [message]=\"syntheticTextMessage(lineIndex, segIndex, seg.content)\" />\n </div>\n } @else {\n @if (showDebugUi() || line.role !== 'assistant') {\n <div class=\"axm-assist-bot__fallback axm-assist-bot__segment\" [attr.dir]=\"segmentDir(formatFallbackSegment(seg))\">\n {{ formatFallbackSegment(seg) }}\n </div>\n }\n }\n }\n </div>\n }\n </div>\n <ng-container *ngTemplateOutlet=\"assistUnifiedAnswerBlock\" />\n } @else if (!showDebugUi() && showNonDebugStreamPanel()) {\n <div class=\"axm-assist-renderer__stream-content axm-assist-renderer__stream-content--non-debug\" role=\"region\" [attr.aria-label]=\"('@conversation:chat.assist-renderer.aria.assistant-response' | translate | async) ?? ''\">\n @if (isStreaming()) {\n <div class=\"axm-assist-renderer__streaming-activity\" role=\"status\" aria-live=\"polite\">\n <span class=\"axm-assist-renderer__activity-spin inline-block w-3 h-3 rounded-full border-2 border-primary-500 border-t-transparent fa-spin shrink-0\" aria-hidden=\"true\"></span>\n <span class=\"axm-assist-renderer__activity-label text-xs text-muted italic\">{{ assistActivityMessageKey() | translate | async }}</span>\n </div>\n }\n <ng-container *ngTemplateOutlet=\"assistUnifiedAnswerBlock\" />\n @if (isStreaming() && !assistAnswerMarkdown()) {\n <div class=\"axm-assist-renderer__waiting\">\n <span class=\"axm-assist-renderer__dot\"></span>\n <span class=\"axm-assist-renderer__dot\"></span>\n <span class=\"axm-assist-renderer__dot\"></span>\n </div>\n }\n </div>\n } @else if (showDebugUi()) {\n @if (isStreaming()) {\n <div class=\"axm-assist-renderer__stream-content\">\n <div class=\"axm-assist-renderer__streaming-activity\" role=\"status\" aria-live=\"polite\">\n <span class=\"axm-assist-renderer__activity-spin inline-block w-3 h-3 rounded-full border-2 border-primary-500 border-t-transparent fa-spin shrink-0\" aria-hidden=\"true\"></span>\n <span class=\"axm-assist-renderer__activity-label text-xs text-muted italic\">{{ assistActivityMessageKey() | translate | async }}</span>\n </div>\n @if (streamThink().trim()) {\n <div class=\"axm-assist-renderer__accordion-group\" axAccordionGroup [accordion]=\"false\">\n <div\n class=\"axm-assist-renderer__thinking-accordion axm-assist-renderer__collapse-shell mb-0!\"\n axAccordionItem\n #thinkAcc=\"axAccordionItem\"\n [isCollapsed]=\"assistSectionIsCollapsed(assistThinkStreamKey())\"\n (onClick)=\"onAssistAccordionClick($event, assistThinkStreamKey())\"\n >\n <div class=\"axm-assist-renderer__accordion-header\" axAccordionItemHeader role=\"button\" [attr.aria-expanded]=\"!thinkAcc.isCollapsed()\">\n <div class=\"axm-assist-renderer__accordion-header-main\">\n <span class=\"axm-assist-renderer__accordion-header-title\">\n <i class=\"fa-light fa-chevron-down axm-assist-renderer__thinking-chevron\" [class.axm-assist-renderer__thinking-chevron--expanded]=\"!thinkAcc.isCollapsed()\" aria-hidden=\"true\"></i>\n <i class=\"fa-light fa-brain axm-assist-renderer__tool-title-icon\" aria-hidden=\"true\"></i>\n {{ '@conversation:chat.assist-renderer.sections.thinking' | translate | async }}\n </span>\n </div>\n </div>\n <div axAccordionItemContent>\n <div class=\"axm-assist-renderer__collapse-body\">\n <div class=\"axm-assist-renderer__thinking-body axm-assist-bot__segment axm-assist-renderer__markdown\" [attr.dir]=\"segmentDir(streamThink())\">\n <axp-markdown-viewer [markdown]=\"streamThink()\">\n <ng-template axpMarkdownTemplate=\"code\" let-segment>\n <div class=\"axm-assist-renderer__tool-editor-wrap\" style=\"direction: ltr\">\n <ax-code-editor [ngModel]=\"markdownCodeValue(segment)\" [readonly]=\"true\" [language]=\"markdownCodeLanguage(segment)\" [lineNumbers]=\"true\" class=\"axm-assist-renderer__tool-editor\"></ax-code-editor>\n </div>\n </ng-template>\n </axp-markdown-viewer>\n </div>\n </div>\n </div>\n </div>\n </div>\n }\n <ng-container *ngTemplateOutlet=\"assistUnifiedAnswerBlock\" />\n @if (toolCalls().length) {\n <div class=\"axm-assist-renderer__tools\">\n @for (tc of toolCalls(); track tc.id) {\n @if (isDelegatedAgentCommand(tc.name)) {\n <div class=\"axm-assist-renderer__tool-row\">\n <div class=\"axm-assist-renderer__tool-row-main\">\n @if (tc.state === 'running') {\n <span class=\"axm-assist-renderer__agent-live-spin inline-block w-3 h-3 rounded-full border-2 border-primary-500 border-t-transparent fa-spin shrink-0\" aria-hidden=\"true\"></span>\n } @else {\n <span class=\"inline-block w-3 h-3 rounded-full bg-success-500 shrink-0\" aria-hidden=\"true\"></span>\n }\n <i class=\"fa-light fa-people-group axm-assist-renderer__tool-title-icon\" aria-hidden=\"true\"></i>\n <span class=\"axm-assist-renderer__tool-row-title\">{{ resolveToolDisplayTitle(tc.name) }}</span>\n @if (resolveToolModelLabel(tc.name, tc.id); as modelLabel) {\n <span class=\"axm-assist-renderer__tool-model-label\">{{ modelLabel }}</span>\n }\n </div>\n <ax-button\n look=\"outline\"\n color=\"primary\"\n class=\"ax-xs\"\n [disabled]=\"tc.state === 'running'\"\n [text]=\"('@conversation:chat.assist-renderer.delegated-agent.detail' | translate | async) ?? ''\"\n [attr.aria-label]=\"('@conversation:chat.assist-renderer.delegated-agent.detail-aria' | translate | async) ?? ''\"\n (onClick)=\"openLegacyToolDetail(tc)\"\n ></ax-button>\n </div>\n @if (tc.nestedStreamText?.trim()) {\n <div class=\"axm-assist-renderer__agent-live-stream\" [attr.dir]=\"segmentDir(tc.nestedStreamText ?? '')\">\n {{ tc.nestedStreamText }}\n </div>\n }\n } @else {\n <div class=\"axm-assist-renderer__tool-row\">\n <div class=\"axm-assist-renderer__tool-row-main\">\n @if (tc.state === 'running') {\n <span class=\"axm-assist-renderer__agent-live-spin inline-block w-3 h-3 rounded-full border-2 border-primary-500 border-t-transparent fa-spin shrink-0\" aria-hidden=\"true\"></span>\n } @else {\n <span class=\"inline-block w-3 h-3 rounded-full bg-success-500 shrink-0\" aria-hidden=\"true\"></span>\n }\n <i class=\"fa-light fa-screwdriver-wrench axm-assist-renderer__tool-title-icon\" aria-hidden=\"true\"></i>\n <span class=\"axm-assist-renderer__tool-row-title\">{{ resolveToolDisplayTitle(tc.name) }}</span>\n </div>\n <ax-button\n look=\"outline\"\n color=\"primary\"\n class=\"ax-xs\"\n [disabled]=\"tc.state === 'running'\"\n [text]=\"('@conversation:chat.assist-renderer.delegated-agent.detail' | translate | async) ?? ''\"\n [attr.aria-label]=\"('@conversation:chat.assist-renderer.delegated-agent.detail-aria' | translate | async) ?? ''\"\n (onClick)=\"openLegacyToolDetail(tc)\"\n ></ax-button>\n </div>\n }\n }\n </div>\n }\n @if (isStreaming() && !assistAnswerMarkdown() && !streamThink().trim() && !toolCalls().length) {\n <div class=\"axm-assist-renderer__waiting\">\n <span class=\"axm-assist-renderer__dot\"></span>\n <span class=\"axm-assist-renderer__dot\"></span>\n <span class=\"axm-assist-renderer__dot\"></span>\n </div>\n }\n </div>\n } @else if (!useTranscriptUi()) {\n @if (parsed().thinking) {\n <div class=\"axm-assist-renderer__accordion-group\" axAccordionGroup [accordion]=\"false\">\n <div\n class=\"axm-assist-renderer__thinking-accordion axm-assist-renderer__collapse-shell mb-0!\"\n axAccordionItem\n #thinkAcc=\"axAccordionItem\"\n [isCollapsed]=\"assistSectionIsCollapsed(assistThinkFinalKey())\"\n (onClick)=\"onAssistAccordionClick($event, assistThinkFinalKey())\"\n >\n <div class=\"axm-assist-renderer__accordion-header\" axAccordionItemHeader role=\"button\" [attr.aria-expanded]=\"!thinkAcc.isCollapsed()\">\n <div class=\"axm-assist-renderer__accordion-header-main\">\n <span class=\"axm-assist-renderer__accordion-header-title\">\n <i class=\"fa-light fa-chevron-down axm-assist-renderer__thinking-chevron\" [class.axm-assist-renderer__thinking-chevron--expanded]=\"!thinkAcc.isCollapsed()\" aria-hidden=\"true\"></i>\n <i class=\"fa-light fa-brain axm-assist-renderer__tool-title-icon\" aria-hidden=\"true\"></i>\n {{ '@conversation:chat.assist-renderer.sections.thinking' | translate | async }}\n </span>\n </div>\n </div>\n <div axAccordionItemContent>\n <div class=\"axm-assist-renderer__collapse-body\">\n <div class=\"axm-assist-renderer__thinking-body axm-assist-bot__segment axm-assist-renderer__markdown\" [attr.dir]=\"segmentDir(parsed().thinking)\">\n <axp-markdown-viewer [markdown]=\"parsed().thinking ?? ''\">\n <ng-template axpMarkdownTemplate=\"code\" let-segment>\n <div class=\"axm-assist-renderer__tool-editor-wrap\" style=\"direction: ltr\">\n <ax-code-editor [ngModel]=\"markdownCodeValue(segment)\" [readonly]=\"true\" [language]=\"markdownCodeLanguage(segment)\" [lineNumbers]=\"true\" class=\"axm-assist-renderer__tool-editor\"></ax-code-editor>\n </div>\n </ng-template>\n </axp-markdown-viewer>\n </div>\n </div>\n </div>\n </div>\n </div>\n }\n @if (toolCalls().length) {\n <div class=\"axm-assist-renderer__tools\">\n @for (tc of toolCalls(); track tc.id) {\n <div class=\"axm-assist-renderer__tool-row\">\n <div class=\"axm-assist-renderer__tool-row-main\">\n <i class=\"fa-light axm-assist-renderer__tool-title-icon\" [class.fa-people-group]=\"isDelegatedAgentCommand(tc.name)\" [class.fa-screwdriver-wrench]=\"!isDelegatedAgentCommand(tc.name)\" aria-hidden=\"true\"></i>\n <span class=\"axm-assist-renderer__tool-row-title\">{{ resolveToolDisplayTitle(tc.name) }}</span>\n @if (isDelegatedAgentCommand(tc.name) && resolveToolModelLabel(tc.name, tc.id); as modelLabel) {\n <span class=\"axm-assist-renderer__tool-model-label\">{{ modelLabel }}</span>\n }\n </div>\n <ax-button\n look=\"outline\"\n color=\"primary\"\n class=\"ax-xs\"\n [text]=\"('@conversation:chat.assist-renderer.delegated-agent.detail' | translate | async) ?? ''\"\n [attr.aria-label]=\"('@conversation:chat.assist-renderer.delegated-agent.detail-aria' | translate | async) ?? ''\"\n (onClick)=\"openLegacyToolDetail(tc)\"\n ></ax-button>\n </div>\n }\n </div>\n }\n <ng-container *ngTemplateOutlet=\"assistUnifiedAnswerBlock\" />\n }\n }\n @if (showDebugUi() && assistRunDebug(); as dbg) {\n <footer class=\"axm-assist-renderer__run-meta-wrap\" role=\"region\" [attr.aria-label]=\"('@conversation:chat.assist-renderer.aria.run-usage' | translate | async) ?? ''\">\n <div class=\"axm-assist-renderer__accordion-group\" axAccordionGroup [accordion]=\"false\">\n <div\n class=\"axm-assist-renderer__thinking-accordion axm-assist-renderer__collapse-shell axm-assist-renderer__run-meta-accordion mb-0!\"\n axAccordionItem\n #runMetaAcc=\"axAccordionItem\"\n [isCollapsed]=\"assistSectionIsCollapsed(assistRunMetaKey())\"\n (onClick)=\"onAssistAccordionClick($event, assistRunMetaKey())\"\n >\n <div class=\"axm-assist-renderer__accordion-header\" axAccordionItemHeader role=\"button\" [attr.aria-expanded]=\"!runMetaAcc.isCollapsed()\">\n <div class=\"axm-assist-renderer__accordion-header-main\">\n <span class=\"axm-assist-renderer__accordion-header-title\">\n <i class=\"fa-light fa-chevron-down axm-assist-renderer__thinking-chevron\" [class.axm-assist-renderer__thinking-chevron--expanded]=\"!runMetaAcc.isCollapsed()\" aria-hidden=\"true\"></i>\n <i class=\"fa-light fa-chart-line axm-assist-renderer__tool-title-icon\" aria-hidden=\"true\"></i>\n {{ '@conversation:chat.assist-renderer.run-meta.title' | translate | async }}\n </span>\n <!-- @if (dbg.modelTitle || dbg.modelEntityId) {\n <span class=\"axm-assist-renderer__run-meta-header-sub\">{{ dbg.modelTitle || dbg.modelEntityId }}</span>\n } -->\n </div>\n </div>\n <div axAccordionItemContent>\n <div class=\"axm-assist-renderer__collapse-body\">\n <div class=\"axm-assist-renderer__run-meta axm-assist-renderer__run-meta--panel\">\n <div class=\"axm-assist-renderer__run-meta-grid\">\n @if (dbg.modelTitle || dbg.modelEntityId) {\n <div class=\"axm-assist-renderer__meta-tile axm-assist-renderer__meta-tile--wide\">\n <div class=\"axm-assist-renderer__meta-tile-label\">\n {{ '@conversation:chat.assist-renderer.run-meta.model' | translate | async }}\n </div>\n <div class=\"axm-assist-renderer__meta-tile-value\">{{ dbg.modelTitle || dbg.modelEntityId }}</div>\n <!-- @if (dbg.modelTitle && dbg.modelEntityId) {\n <div class=\"axm-assist-renderer__meta-tile-sub\">{{ dbg.modelEntityId }}</div>\n } -->\n </div>\n }\n @if (dbg.durationMs != null) {\n <div class=\"axm-assist-renderer__meta-tile\">\n <div class=\"axm-assist-renderer__meta-tile-label\">\n {{ '@conversation:chat.assist-renderer.run-meta.duration' | translate | async }}\n </div>\n <div class=\"axm-assist-renderer__meta-tile-value axm-assist-renderer__meta-tile-value--mono\">\n {{ formatAssistRunDuration(dbg.durationMs) }}\n </div>\n </div>\n }\n @if (dbg.usage; as totals) {\n <div class=\"axm-assist-renderer__meta-tile\">\n <div class=\"axm-assist-renderer__meta-tile-label\">\n {{ '@ai-management:chat.usage-prompt' | translate | async }}\n </div>\n <div class=\"axm-assist-renderer__meta-tile-value axm-assist-renderer__meta-tile-value--mono\">\n {{ totals.promptTokens | number }}\n @if (totals.cachedPromptTokens) {\n <span class=\"axm-assist-renderer__meta-tile-note\">(+{{ totals.cachedPromptTokens | number }} {{ '@ai-management:chat.usage-cached' | translate | async }})</span>\n }\n </div>\n </div>\n <div class=\"axm-assist-renderer__meta-tile\">\n <div class=\"axm-assist-renderer__meta-tile-label\">\n {{ '@ai-management:chat.usage-completion' | translate | async }}\n </div>\n <div class=\"axm-assist-renderer__meta-tile-value axm-assist-renderer__meta-tile-value--mono\">\n {{ totals.completionTokens | number }}\n </div>\n </div>\n <div class=\"axm-assist-renderer__meta-tile axm-assist-renderer__meta-tile--accent\">\n <div class=\"axm-assist-renderer__meta-tile-label\">\n {{ '@conversation:chat.assist-renderer.run-meta.total-tokens' | translate | async }}\n </div>\n <div class=\"axm-assist-renderer__meta-tile-value axm-assist-renderer__meta-tile-value--mono\">\n {{ totals.totalTokens | number }}\n </div>\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </footer>\n }\n\n <ng-template #assistUnifiedAnswerBlock>\n @if (assistAnswerMarkdown()) {\n <div class=\"axm-assist-renderer__text axm-assist-bot__segment axm-assist-renderer__markdown\" [attr.dir]=\"segmentDir(assistAnswerMarkdown())\">\n <axp-markdown-viewer [markdown]=\"assistAnswerMarkdown()\">\n <ng-template axpMarkdownTemplate=\"code\" let-segment>\n <div class=\"axm-assist-renderer__tool-editor-wrap\" style=\"direction: ltr\">\n <ax-code-editor [ngModel]=\"markdownCodeValue(segment)\" [readonly]=\"true\" [language]=\"markdownCodeLanguage(segment)\" [lineNumbers]=\"true\" class=\"axm-assist-renderer__tool-editor\"></ax-code-editor>\n </div>\n </ng-template>\n </axp-markdown-viewer>\n </div>\n <!-- @if (isStreaming()) {\n <span class=\"axm-assist-renderer__cursor\"></span>\n } -->\n }\n @if (!isStreaming()) {\n @for (item of assistPayloadAppendItems(); track $index; let itemIndex = $index) {\n @switch (item.kind) {\n @case ('node') {\n @if (axmAssistWidgetNodeFromUnknown(item.content)) {\n <div class=\"axm-assist-bot__segment\" dir=\"auto\">\n <axm-chat-user-form-renderer [message]=\"syntheticAppendNodeMessage(itemIndex, item.content)\" />\n </div>\n }\n }\n @case ('file') {\n <axm-assist-bot-file-line [parentMessage]=\"message()\" [fileId]=\"item.fileId\" />\n }\n @case ('followUp') {\n <div class=\"axm-assist-bot__segment\" dir=\"auto\">\n <axm-assist-suggestion-chips [items]=\"item.items\" />\n </div>\n }\n }\n }\n }\n </ng-template>\n\n @if (showRetryScreen()) {\n <ax-alert class=\"axm-assist-renderer__retry-alert\" color=\"danger\" role=\"alert\" [attr.aria-label]=\"('@conversation:chat.assist-renderer.retry.aria.panel' | translate | async) ?? ''\">\n <ax-icon><i [class]=\"assistRetryAlertIcon()\"></i></ax-icon>\n <ax-title>{{ assistRetryTitleKey() | translate | async }}</ax-title>\n <ax-content>\n <div class=\"axm-assist-renderer__retry-alert-body\">\n <div class=\"axm-assist-renderer__retry-alert-text\">\n <p class=\"axm-assist-renderer__retry-description\">\n {{ assistRetryDescriptionKey() | translate | async }}\n </p>\n @if (assistResponseError()) {\n <p class=\"axm-assist-renderer__retry-error-detail\">\n {{ assistResponseError() }}\n </p>\n }\n </div>\n\n <ax-button class=\"axm-assist-renderer__retry-action ax-sm\" color=\"danger\" look=\"solid\" [disabled]=\"isRetrying()\" [text]=\"('@conversation:chat.assist-renderer.retry.action' | translate | async) ?? ''\" (onClick)=\"onRetryAssistResponse()\">\n <i class=\"fa-light fa-arrows-rotate\" prefix></i>\n </ax-button>\n </div>\n </ax-content>\n </ax-alert>\n }\n</div>\n","import type { AXConversationMessageRenderer } from '@acorex/components/conversation';\nimport { AXMAssistMessageRendererComponent } from './assist-message-renderer.component';\n\n/**\n * Renderer for AI assist (bot) responses.\n *\n * When `metadata.transcripts` / `metadata.transcriptDraft` contains\n * `AXPAiChatMessage` lines, the UI maps each line by `role` and\n * segment `type` inside `responses` to the same building blocks as the AI chat page (text,\n * image, tool cards, tool results, layout nodes). Otherwise it falls back\n * to the legacy assist layout (streaming dots, `toolCalls` metadata).\n * Text segments set `dir=\"rtl\"` per block when the content includes Arabic script (e.g. Persian).\n */\nexport const AXM_CONVERSATION_BOT_RENDERER: AXConversationMessageRenderer = {\n type: 'assist-response',\n component: AXMAssistMessageRendererComponent,\n canHandle: (message) =>\n message.type === 'assist-response' || !!(message.metadata as Record<string, unknown>)?.['isAssistResponse'],\n capabilities: {\n supportsReactions: false,\n supportsReplies: false,\n supportsEdit: false,\n supportsForward: false,\n supportsSelection: true,\n },\n displayName: 'AI Assist (transcript)',\n icon: 'fa-light fa-sparkles',\n};\n","//#region ----- Imports -----\n\nimport type { AXConversationMessage } from '@acorex/components/conversation';\nimport type { AXSystemEventType, AXSystemPayload } from '@acorex-platform/module-conversation-contracts';\n\nimport type { AXMChatCallMediaType } from './chat-call-session.types';\n\n//#endregion\n\n//#region ----- Types -----\n\nexport type AXMChatCallLogOutcome = 'declined' | 'missed' | 'cancelled';\n\nexport interface AXMChatCallLogInfo {\n callId: string;\n outcome: AXMChatCallLogOutcome;\n media: AXMChatCallMediaType;\n eventType: AXSystemEventType;\n}\n\n//#endregion\n\n//#region ----- Call log helpers -----\n\nconst EVENT_TO_OUTCOME: Partial<Record<AXSystemEventType, AXMChatCallLogOutcome>> = {\n call_declined: 'declined',\n call_missed: 'missed',\n call_cancelled: 'cancelled',\n};\n\nexport function axmIsChatCallLogEventType(eventType: string | undefined): eventType is AXSystemEventType {\n return eventType === 'call_declined' || eventType === 'call_missed' || eventType === 'call_cancelled';\n}\n\nexport function axmReadChatCallLog(message: AXConversationMessage | null | undefined): AXMChatCallLogInfo | null {\n if (!message || message.type !== 'system') {\n return null;\n }\n\n const payload = message.payload as AXSystemPayload | undefined;\n const eventType = payload?.type === 'system' ? payload.eventType : undefined;\n if (!axmIsChatCallLogEventType(eventType)) {\n return null;\n }\n\n const metadata = (message.metadata ?? {}) as Record<string, unknown>;\n const data = (payload?.data ?? {}) as Record<string, unknown>;\n const callId =\n (typeof metadata['callId'] === 'string' && metadata['callId'].trim()) ||\n (typeof data['callId'] === 'string' && data['callId'].trim()) ||\n '';\n if (!callId) {\n return null;\n }\n\n const media = metadata['media'] === 'video' || data['media'] === 'video' ? 'video' : 'voice';\n return {\n callId,\n outcome: EVENT_TO_OUTCOME[eventType] ?? 'missed',\n media,\n eventType,\n };\n}\n\nexport function axmChatCallLogTitleKey(info: AXMChatCallLogInfo): string {\n if (info.media === 'video') {\n return `@conversation:chat.call.log.${info.outcome}-video`;\n }\n return `@conversation:chat.call.log.${info.outcome}`;\n}\n\n//#endregion\n","//#region ----- Imports -----\n\nimport type {\n AXConversationMessage,\n AXConversationMessageRendererComponent,\n AXConversationMessageRendererContentState,\n AXConversationMessageRendererState,\n} from '@acorex/components/conversation';\nimport { AXTranslationModule } from '@acorex/core/translation';\nimport { AsyncPipe } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, input, signal } from '@angular/core';\n\nimport { axmChatCallLogTitleKey, axmReadChatCallLog } from '../call/chat-call-log.util';\n\n//#endregion\n\n//#region ----- Component -----\n\n@Component({\n selector: 'axm-chat-call-log-message-renderer',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [AXTranslationModule, AsyncPipe],\n template: `\n <div class=\"axm-chat-call-log\" [class.axm-chat-call-log--video]=\"isVideo()\">\n <i [class]=\"'fa-light ' + iconClass()\"></i>\n <span>{{ titleKey() | translate | async }}</span>\n </div>\n `,\n styles: [\n `\n :host {\n display: flex;\n justify-content: center;\n width: 100%;\n }\n\n .axm-chat-call-log {\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0.35rem 0.75rem;\n border-radius: 9999px;\n background: color-mix(in srgb, var(--ax-sys-color-surface) 88%, transparent);\n color: color-mix(in srgb, var(--ax-sys-color-on-surface) 72%, transparent);\n font-size: 0.8125rem;\n }\n\n .axm-chat-call-log i {\n font-size: 0.875rem;\n }\n `,\n ],\n})\nexport class AXMChatCallLogMessageRendererComponent implements AXConversationMessageRendererComponent {\n readonly message = input.required<AXConversationMessage>();\n\n private readonly contentState = signal<AXConversationMessageRendererContentState>('ready');\n\n readonly rendererState = computed<AXConversationMessageRendererState>(() => ({\n deliveryStatus: this.message().status,\n contentState: this.contentState(),\n }));\n\n protected readonly log = computed(() => axmReadChatCallLog(this.message()));\n\n protected readonly isVideo = computed(() => this.log()?.media === 'video');\n\n protected readonly titleKey = computed(() => {\n const info = this.log();\n return info ? axmChatCallLogTitleKey(info) : '@conversation:chat.call.log.missed';\n });\n\n protected readonly iconClass = computed(() =>\n this.isVideo() ? 'fa-video-slash' : 'fa-phone-missed',\n );\n}\n\n//#endregion\n","import type { AXConversationMessageRenderer } from '@acorex/components/conversation';\n\nimport { axmReadChatCallLog } from '../call/chat-call-log.util';\nimport { AXMChatCallLogMessageRendererComponent } from './chat-call-log-message-renderer.component';\n\nexport const AXM_CONVERSATION_CALL_LOG_RENDERER: AXConversationMessageRenderer = {\n type: 'system',\n component: AXMChatCallLogMessageRendererComponent,\n canHandle: (message) => axmReadChatCallLog(message) !== null,\n capabilities: {\n supportsReactions: false,\n supportsReplies: false,\n supportsEdit: false,\n supportsForward: false,\n supportsSelection: false,\n },\n displayName: 'Call Log',\n icon: 'fa-light fa-phone',\n};\n","import type { AXConversationMessageRenderer } from '@acorex/components/conversation';\nimport { AXMNodeMessageRendererComponent } from './node-message-renderer.component';\n\n// const AXM_USER_FORM_NODE: AXPWidgetNode = {\n// type: 'flex-layout',\n// name: 'node-layout',\n// options: {\n// gap: '12px',\n// flexWrap: 'wrap',\n// justifyContent: 'start',\n// alignItems: 'start',\n// },\n// children: [\n// {\n// type: 'flex-item-layout',\n// name: 'name-field-layout',\n// children: [\n// {\n// type: 'text-editor',\n// name: 'name',\n// path: 'form.name',\n// options: { placeholder: 'Name', readonly: false, disabled: false },\n// },\n// ],\n// },\n// {\n// type: 'flex-item-layout',\n// name: 'family-field-layout',\n// children: [\n// {\n// type: 'text-editor',\n// name: 'family',\n// path: 'form.family',\n// options: { placeholder: 'Family', readonly: false, disabled: false },\n// },\n// ],\n// },\n// ],\n// };\n\n// export const AXM_CONVERSATION_COMPOSER_USER_FORM_ACTION: AXConversationComposerAction = {\n// id: 'node',\n// label: 'User Form',\n// icon: 'fa-light fa-rectangle-list',\n// position: 'right',\n// location: 'menu',\n// priority: 35,\n// visible: (context) => !context.isEditing,\n// handler: async (context) => {\n// if (!context.conversationService || !context.conversationId) {\n// return;\n// }\n// const payload: AXMUserFormPayload = {\n// type: 'node',\n// node: AXM_USER_FORM_NODE,\n// value: { form: { name: '', family: '' } },\n// };\n// await context.conversationService.sendMessage({\n// conversationId: context.conversationId,\n// type: 'node',\n// payload: payload as unknown as AXConversationMessagePayload,\n// });\n// },\n// tooltip: 'Send user form',\n// };\n\nexport const AXM_CONVERSATION_NODE_RENDERER: AXConversationMessageRenderer = {\n type: 'node',\n component: AXMNodeMessageRendererComponent,\n canHandle: (message) => message.type === 'node',\n capabilities: {\n supportsReactions: false,\n supportsReplies: true,\n supportsEdit: false,\n supportsForward: false,\n supportsSelection: true,\n },\n displayName: 'User Form',\n icon: 'fa-light fa-rectangle-list',\n};\n","//#region ---- Conversation list sort ----\n\nimport { axmCoerceTimestampMs } from './conversation-time.util';\n\ntype ConversationSortRow = {\n pinned?: boolean;\n metadata?: Record<string, unknown>;\n lastMessage?: { timestamp?: Date | string | number };\n lastMessageAt?: Date | string | number;\n};\n\n/** Pinned flag on room or legacy mock metadata (`metadata.isPinned`). */\nexport function axmIsConversationPinned(conversation: ConversationSortRow): boolean {\n return Boolean(conversation.pinned) || conversation.metadata?.['isPinned'] === true;\n}\n\n/** Latest activity time from embedded last message or `lastMessageAt`. */\nexport function axmConversationLastMessageMs(conversation: ConversationSortRow): number {\n const ts = conversation.lastMessage?.timestamp ?? conversation.lastMessageAt;\n return axmCoerceTimestampMs(ts);\n}\n\n/** Pinned conversations first, then most recent `lastMessageAt` (mock inbox parity). */\nexport function axmSortConversationsByPinAndRecency<T extends ConversationSortRow>(conversations: T[]): T[] {\n return [...conversations].sort((a, b) => {\n const aPinned = axmIsConversationPinned(a);\n const bPinned = axmIsConversationPinned(b);\n if (aPinned !== bPinned) {\n return aPinned ? -1 : 1;\n }\n return axmConversationLastMessageMs(b) - axmConversationLastMessageMs(a);\n });\n}\n\n//#endregion\n","//#region ---- Types ----\n\ntype ConversationParticipantRef = {\n id?: string;\n};\n\n//#endregion\n\n//#region ---- Participant checks ----\n\n/** True when `userId` is present in the conversation participant list (by trimmed id). */\nexport function axmIsConversationParticipant(\n participants: ConversationParticipantRef[] | undefined | null,\n userId: string | undefined | null,\n): boolean {\n const normalizedUserId = userId?.trim();\n if (!normalizedUserId) {\n return false;\n }\n return (participants ?? []).some((participant) => participant.id?.trim() === normalizedUserId);\n}\n\n//#endregion\n","//#region ----- Imports -----\n\nimport type {\n AXConversationPaginatedResult,\n AXConversationPagination,\n} from '@acorex/components/conversation';\n\n//#endregion\n\n//#region ----- Pagination -----\n\n/**\n * Paginates items in their existing order (oldest-first when the caller has sorted that way).\n */\nexport function paginateChatOldestFirst<T>(\n items: T[],\n pagination: AXConversationPagination,\n): AXConversationPaginatedResult<T> {\n const start = pagination.page * pagination.pageSize;\n const end = start + pagination.pageSize;\n\n return {\n items: items.slice(start, end),\n total: items.length,\n hasMore: end < items.length,\n page: pagination.page,\n totalPages: Math.ceil(items.length / pagination.pageSize) || 0,\n };\n}\n\n//#endregion\n","//#region ---- Imports ----\n\nimport type {\n AXConversationBlockReportReason,\n AXConversationPaginatedResult,\n AXConversationPagination,\n AXConversationParticipant,\n AXConversationPresenceStatus,\n AXConversationPresenceUpdate,\n AXConversationUserProfileUpdate,\n AXConversationUserSearchFilters,\n} from '@acorex/components/conversation';\nimport { paginateChatOldestFirst } from '../../../utils/pagination.utils';\nimport { AXPFilterOperatorMiddlewareService } from '@acorex-platform/framework-client/common';\nimport { AXPSessionService } from '@acorex-platform/framework-client/auth';\nimport { AXPEntityService } from '@acorex-platform/framework-client/layout/entity';\nimport { inject, Injectable } from '@angular/core';\nimport { get, trim } from 'lodash';\n\nimport {\n AXPUserPresenceService,\n isWatchablePresenceUserId,\n} from '@acorex-platform/framework-client/realtime';\nimport { AXMChatUserApi } from '../chat-conversation-apis.abstract';\nimport { axmBuildAssistPeerParticipantFromId } from '../../utils/assist-peer-participant.util';\nimport { axmUserRowToParticipant } from './chat-entity-mapper.util';\n\n//#endregion\n\n//#region ---- Helpers ----\n\nfunction toConversationPresence(\n status: string | undefined,\n): 'online' | 'offline' | 'away' {\n if (status === 'online' || status === 'away') {\n return status;\n }\n if (status === 'busy') {\n return 'away';\n }\n return 'offline';\n}\n\n//#endregion\n\n//#region ---- Service ----\n\n/**\n * Entity-backed implementation of {@link AXMChatUserApi} using SecurityManagement.User.\n */\n@Injectable()\nexport class AXMChatEntityUserApi extends AXMChatUserApi {\n //#region ---- Services & Dependencies ----\n\n private readonly sessionService = inject(AXPSessionService);\n private readonly filterService = inject(AXPFilterOperatorMiddlewareService);\n private readonly entityService = inject(AXPEntityService);\n private readonly usersData = this.entityService\n .withEntity('SecurityManagement', 'User')\n .data<string, { id: string; displayName?: string; username?: string }>();\n private readonly presence = inject(AXPUserPresenceService, { optional: true });\n\n //#endregion\n\n //#region ---- User Profile ----\n\n async getCurrentUser(): Promise<AXConversationParticipant> {\n const user = this.sessionService.user;\n if (!user) {\n throw this.createError('USER_NOT_FOUND', 'Current user not found', 401);\n }\n return {\n id: user.id,\n name: user.title ?? user.name ?? user.id,\n avatar: user.avatar?.trim() || undefined,\n role: 'admin',\n status: toConversationPresence(this.presence?.get(user.id)?.status),\n };\n }\n\n async updateProfile(\n updates: AXConversationUserProfileUpdate,\n ): Promise<AXConversationParticipant> {\n const current = await this.getCurrentUser();\n return { ...current, ...updates };\n }\n\n async uploadAvatar(_file: File): Promise<string> {\n // TODO Conversation:010: upload avatar via user entity / file service\n throw this.createError(\n 'NOT_IMPLEMENTED',\n 'Avatar upload is not implemented',\n 501,\n );\n }\n\n //#endregion\n\n //#region ---- User Discovery ----\n\n async getUsers(\n pagination: AXConversationPagination = { page: 0, pageSize: 50 },\n filters?: AXConversationUserSearchFilters,\n ): Promise<AXConversationPaginatedResult<AXConversationParticipant>> {\n const { items } = await this.usersData.query({\n skip: 0,\n take: filters?.limit ?? 1000,\n });\n const currentId = this.sessionService.user?.id;\n let users = items\n .filter((u) => u.id !== currentId)\n .map((u) => axmUserRowToParticipant(u));\n\n const query = trim(filters?.query)?.toLowerCase();\n if (query) {\n users = users.filter((u) => {\n const name = u.name.toLowerCase();\n const description = String(get(u, 'description', '')).toLowerCase();\n return name.includes(query) || description.includes(query);\n });\n }\n\n users.sort((a, b) => a.name.localeCompare(b.name));\n return paginateChatOldestFirst(users, pagination);\n }\n\n async searchUsers(query: string): Promise<AXConversationParticipant[]> {\n const result = await this.getUsers({ page: 0, pageSize: 1000 }, { query });\n return result.items;\n }\n\n async getUserById(userId: string): Promise<AXConversationParticipant> {\n const assistPeer = axmBuildAssistPeerParticipantFromId(userId);\n if (assistPeer) {\n return assistPeer;\n }\n\n const user = await this.usersData.byKey(userId);\n if (!user) {\n throw this.createError('USER_NOT_FOUND', `User ${userId} not found`, 404);\n }\n return axmUserRowToParticipant(user);\n }\n\n async getUsersByIds(userIds: string[]): Promise<AXConversationParticipant[]> {\n const results: AXConversationParticipant[] = [];\n const securityUserIds: string[] = [];\n\n for (const id of userIds) {\n const assistPeer = axmBuildAssistPeerParticipantFromId(id);\n if (assistPeer) {\n results.push(assistPeer);\n continue;\n }\n securityUserIds.push(id);\n }\n\n if (securityUserIds.length === 0) {\n return results;\n }\n\n const { items } = await this.usersData.query({\n skip: 0,\n take: securityUserIds.length,\n filter: {\n field: 'id',\n value: securityUserIds,\n operator: this.filterService.getOperator('in') as never,\n },\n });\n\n const byId = new Map(items.map((user) => [user.id, axmUserRowToParticipant(user)]));\n for (const id of securityUserIds) {\n const participant = byId.get(id);\n if (participant) {\n results.push(participant);\n }\n }\n\n return results;\n }\n\n //#endregion\n\n //#region ---- Presence Management ----\n\n async getUserPresence(userId: string): Promise<AXConversationPresenceUpdate> {\n if (!isWatchablePresenceUserId(userId)) {\n return { userId, status: 'online' };\n }\n\n this.presence?.ensureWatch(userId);\n const current = this.presence?.get(userId);\n return {\n userId,\n status: toConversationPresence(current?.status),\n lastSeen: current?.lastSeen ? new Date(current.lastSeen) : undefined,\n };\n }\n\n async updatePresence(\n status: AXConversationPresenceStatus,\n _statusText?: string,\n ): Promise<void> {\n if (status === 'offline' || status === 'invisible') {\n return;\n }\n if (status === 'busy') {\n await this.presence?.setAvailability('busy', 'manual');\n return;\n }\n await this.presence?.setAvailability(status === 'away' ? 'away' : 'online', 'manual');\n }\n\n //#endregion\n\n //#region ---- User Blocking & Reporting ----\n\n async blockUser(\n _userId: string,\n _reason?: AXConversationBlockReportReason,\n ): Promise<void> {\n // TODO Conversation:013: block user\n }\n\n async unblockUser(_userId: string): Promise<void> {\n // TODO Conversation:014: unblock user\n }\n\n async getBlockedUsers(): Promise<string[]> {\n // TODO Conversation:015: list blocked users\n return [];\n }\n\n async reportUser(\n _userId: string,\n _reason: AXConversationBlockReportReason,\n ): Promise<void> {\n // TODO Conversation:016: report user\n }\n\n //#endregion\n\n //#region ---- User Settings ----\n\n async getUserSettings(): Promise<Record<string, unknown>> {\n // TODO Conversation:017: load user chat settings\n return {};\n }\n\n async updateUserSettings(_settings: Record<string, unknown>): Promise<void> {\n // TODO Conversation:018: persist user chat settings\n }\n\n //#endregion\n}\n\n//#endregion\n","//#region ---- Imports ----\n\nimport type { AXConversationMessage, AXConversationSendMessageCommand } from '@acorex/components/conversation';\nimport { InjectionToken } from '@angular/core';\n\n//#endregion\n\n//#region ---- Port ----\n\nexport interface AXMConversationAssistResponsePort {\n handleAfterUserMessage(conversationId: string, userMessageId: string, command: AXConversationSendMessageCommand, currentUserId: string): Promise<void>;\n\n retryAssistResponse(conversationId: string, messageId: string): Promise<AXConversationMessage>;\n\n reconcileStaleAssistPlaceholders(conversationId?: string): Promise<void>;\n\n /** True when the conversation has assist rows still marked streaming (cache or entity). */\n hasStreamingAssistPlaceholders(conversationId: string): Promise<boolean>;\n\n /** Latest in-memory assist row (streaming cache wins over entity reads). */\n getLiveMessage(messageId: string): AXConversationMessage | null;\n\n /** Merges assist in-memory cache over persisted messages (mock `conversationSharedStorage.messages` parity). */\n mergeLiveConversationMessages(conversationId: string, persisted: AXConversationMessage[]): AXConversationMessage[];\n\n /** Aligns composer Stop / spinner with assist streaming for the focused conversation. */\n syncComposerGenerationForFocus(conversationId: string | null): Promise<void>;\n\n /** Cancels in-flight assist generation (composer Stop). Aborts server AI + SSE stream updates. */\n cancelAssistGeneration(conversationId: string): Promise<void>;\n}\n\nexport const AXM_CONVERSATION_ASSIST_RESPONSE_PORT = new InjectionToken<AXMConversationAssistResponsePort>('AXM_CONVERSATION_ASSIST_RESPONSE_PORT');\n\n//#endregion\n","//#region ---- Imports ----\n\nimport { AXPCommandService } from '@acorex-platform/framework-client/runtime';\nimport { AXPRealtimeConnectionService } from '@acorex-platform/framework-client/realtime';\nimport { inject, Injectable } from '@angular/core';\n\nimport { CONVERSATION_SYNC_READ_STATE_COMMAND } from '../../../../commands/conversation-command.keys';\nimport { AXM_CONVERSATION_ASSIST_RESPONSE_PORT } from '../../../services/conversation-assist-response.port';\nimport { AXMConversationFocusService } from '../../../services/conversation-focus.service';\nimport { AXMChatEntityUserApi } from './chat-entity-user.api';\n\n//#endregion\n\n//#region ---- Handler ----\n\n/**\n * Focus subscription, realtime room subscribe, and read-state sync for the active conversation.\n */\n@Injectable()\nexport class AXMChatEntityConversationFocusHandler {\n //#region ---- Services & Dependencies -----\n\n private readonly userApi = inject(AXMChatEntityUserApi);\n private readonly commandService = inject(AXPCommandService);\n private readonly focusService = inject(AXMConversationFocusService);\n private readonly assistResponse = inject(AXM_CONVERSATION_ASSIST_RESPONSE_PORT, { optional: true });\n private readonly realtimeConnection = inject(AXPRealtimeConnectionService, { optional: true });\n\n //#endregion\n\n //#region ---- State Signals -----\n\n private subscribedConversationId: string | null = null;\n private focusSyncTimer: ReturnType<typeof setTimeout> | null = null;\n private pendingFocusConversationId: string | null = null;\n\n //#endregion\n\n //#region ---- Focus tracking ----\n\n reportFocusedConversation(conversationId: string | null): void {\n this.focusService.setFocusedConversation(conversationId);\n const scoped = conversationId?.trim() || null;\n\n if (!scoped) {\n void this.assistResponse?.syncComposerGenerationForFocus(null);\n }\n\n if (this.subscribedConversationId && this.subscribedConversationId !== scoped) {\n this.realtimeConnection?.unsubscribeConversation(this.subscribedConversationId);\n this.subscribedConversationId = null;\n }\n if (scoped && this.subscribedConversationId !== scoped) {\n this.realtimeConnection?.subscribeConversation(scoped);\n this.subscribedConversationId = scoped;\n }\n\n if (!scoped) {\n this.pendingFocusConversationId = null;\n if (this.focusSyncTimer) {\n clearTimeout(this.focusSyncTimer);\n this.focusSyncTimer = null;\n }\n return;\n }\n\n this.pendingFocusConversationId = scoped;\n if (this.focusSyncTimer) {\n clearTimeout(this.focusSyncTimer);\n }\n this.focusSyncTimer = setTimeout(() => {\n this.focusSyncTimer = null;\n const focusId = this.pendingFocusConversationId;\n if (!focusId) {\n return;\n }\n void this.runFocusedConversationSync(focusId);\n }, 200);\n }\n\n private async runFocusedConversationSync(conversationId: string): Promise<void> {\n const hasStreaming = await this.assistResponse?.hasStreamingAssistPlaceholders(conversationId);\n if (hasStreaming) {\n await this.assistResponse?.reconcileStaleAssistPlaceholders(conversationId);\n }\n await this.assistResponse?.syncComposerGenerationForFocus(conversationId);\n\n const user = await this.userApi.getCurrentUser().catch(() => null);\n if (!user?.id) {\n return;\n }\n await this.commandService.execute(CONVERSATION_SYNC_READ_STATE_COMMAND, {\n conversationId,\n currentUserId: user.id,\n });\n }\n\n //#endregion\n}\n\n//#endregion\n","//#region ---- Imports ----\n\nimport { AXPFilterOperatorMiddlewareService } from '@acorex-platform/framework-client/common';\nimport { AXPEntityService } from '@acorex-platform/framework-client/layout/entity';\nimport type {\n AXConversation,\n AXConversationPaginatedResult,\n AXConversationPagination,\n} from '@acorex/components/conversation';\nimport { inject, Injectable } from '@angular/core';\n\nimport { AXMConversationMessage, AXMConversationRoom, RootConfig } from '@acorex-platform/module-conversation-client/contracts';\nimport { axmIsConversationParticipant } from '../../utils/conversation-participant.util';\nimport { axmRoomEntityToConversation } from './chat-entity-mapper.util';\nimport { AXMChatEntityUserApi } from './chat-entity-user.api';\n\n//#endregion\n\n//#region ---- Service ----\n\n/**\n * Room list loading and conversation mapping helpers for the entity conversation API.\n */\n@Injectable()\nexport class AXMChatEntityConversationRoomQueryService {\n //#region ---- Services & Dependencies -----\n\n private readonly entityService = inject(AXPEntityService);\n private readonly filterService = inject(AXPFilterOperatorMiddlewareService);\n private readonly userApi = inject(AXMChatEntityUserApi);\n private readonly roomData = this.entityService.withEntity(RootConfig.module.name, RootConfig.entities.room.name).data<string, AXMConversationRoom>();\n private readonly messageData = this.entityService.withEntity(RootConfig.module.name, RootConfig.entities.message.name).data<string, AXMConversationMessage>();\n\n //#endregion\n\n //#region ---- Room queries ----\n\n async loadChatRooms(): Promise<AXMConversationRoom[]> {\n const currentUser = await this.userApi.getCurrentUser().catch(() => null);\n const currentUserId = currentUser?.id?.trim();\n const { items } = await this.roomData.query({\n skip: 0,\n take: 500,\n filter: {\n field: 'kind',\n value: 'chat',\n operator: this.filterService.getOperator('equal') as never,\n },\n });\n if (!currentUserId) {\n return [];\n }\n return items.filter((room) => axmIsConversationParticipant(room.participants, currentUserId));\n }\n\n async enrichRoom(\n room: AXMConversationRoom,\n options?: { probeLastMessage?: boolean; currentUserId?: string },\n ): Promise<AXConversation> {\n const currentUserId =\n options?.currentUserId ?? (await this.userApi.getCurrentUser().catch(() => null))?.id;\n\n if (options?.probeLastMessage && !room.lastMessage) {\n const { items } = await this.messageData.query({\n skip: 0,\n take: 1,\n sort: [{ field: 'timestamp', dir: 'desc' } as never],\n filter: {\n logic: 'and',\n filters: [\n {\n field: 'conversationId',\n value: room.id,\n operator: this.filterService.getOperator('equal') as never,\n },\n ],\n },\n });\n if (items[0]) {\n room = {\n ...room,\n lastMessage: items[0],\n lastMessageAt: items[0].timestamp,\n };\n }\n }\n return axmRoomEntityToConversation(room, currentUserId);\n }\n\n paginate<T>(items: T[], pagination: AXConversationPagination): AXConversationPaginatedResult<T> {\n const start = pagination.page * pagination.pageSize;\n const end = start + pagination.pageSize;\n return {\n items: items.slice(start, end),\n total: items.length,\n hasMore: end < items.length,\n page: pagination.page,\n totalPages: Math.ceil(items.length / pagination.pageSize),\n };\n }\n\n //#endregion\n}\n\n//#endregion\n","//#region ---- Imports ----\n\nimport { AXPFilterOperatorMiddlewareService } from '@acorex-platform/framework-client/common';\nimport { AXPEntityService } from '@acorex-platform/framework-client/layout/entity';\nimport type {\n AXConversation,\n AXConversationCreateData,\n AXConversationFilters,\n AXConversationPaginatedResult,\n AXConversationPagination,\n AXConversationParticipant,\n AXConversationParticipantRole,\n AXConversationParticipantUpdate,\n AXConversationSettingsUpdate,\n AXConversationUpdateData,\n} from '@acorex/components/conversation';\nimport { inject, Injectable } from '@angular/core';\n\nimport { AXMConversationRoom, RootConfig } from '@acorex-platform/module-conversation-client/contracts';\nimport { AXMConversationEntityStoreService } from '../../../services/conversation-entity-store.service';\nimport { axmBuildAssistPeerParticipantFromCreateData } from '../../utils/assist-peer-participant.util';\nimport { axmSortConversationsByPinAndRecency } from '../../utils/conversation-list-sort.util';\nimport { axmIsConversationParticipant } from '../../utils/conversation-participant.util';\nimport { AXMChatConversationApi } from '../chat-conversation-apis.abstract';\nimport { AXMChatEntityUserApi } from './chat-entity-user.api';\nimport { AXMConversationRealtimeBus } from '../../../services/conversation-realtime.bus';\nimport { AXMChatEntityConversationFocusHandler } from './chat-entity-conversation-focus.handler';\nimport { AXMChatEntityConversationRoomQueryService } from './chat-entity-conversation-room-query.service';\n\n//#endregion\n\n//#region ---- Service ----\n\n/**\n * Entity-backed implementation of {@link AXMChatConversationApi} using Conversation.room.\n */\n@Injectable()\nexport class AXMChatEntityConversationApi extends AXMChatConversationApi {\n //#region ---- Services & Dependencies ----\n\n private readonly entityService = inject(AXPEntityService);\n private readonly filterService = inject(AXPFilterOperatorMiddlewareService);\n private readonly userApi = inject(AXMChatEntityUserApi);\n private readonly conversationStore = inject(AXMConversationEntityStoreService);\n private readonly realtimeBus = inject(AXMConversationRealtimeBus);\n private readonly focusHandler = inject(AXMChatEntityConversationFocusHandler);\n private readonly roomQuery = inject(AXMChatEntityConversationRoomQueryService);\n private readonly roomData = this.entityService.withEntity(RootConfig.module.name, RootConfig.entities.room.name).data<string, AXMConversationRoom>();\n\n //#region ---- Focus tracking ----\n\n override reportFocusedConversation(conversationId: string | null): void {\n this.focusHandler.reportFocusedConversation(conversationId);\n }\n\n //#endregion\n\n //#region ---- Query helpers ----\n\n private publishConversationPatch(\n conversationId: string,\n patch: Partial<AXConversation>,\n base?: AXConversation | null,\n ): void {\n const cached = base ?? this.conversationStore.getCachedConversation(conversationId);\n if (!cached) {\n return;\n }\n this.conversationStore.publishConversationUpdate({\n ...cached,\n ...patch,\n updatedAt: patch.updatedAt ?? new Date(),\n });\n }\n\n private async resolveParticipantsForCreate(data: AXConversationCreateData, currentUser: AXConversationParticipant): Promise<AXConversationParticipant[]> {\n const resolved: AXConversationParticipant[] = [\n {\n ...currentUser,\n role: 'admin',\n },\n ];\n const seen = new Set<string>([currentUser.id]);\n\n for (const participantId of data.participantIds) {\n if (seen.has(participantId)) {\n continue;\n }\n\n const [user] = await this.userApi.getUsersByIds([participantId]);\n if (user) {\n resolved.push({\n ...user,\n role: user.role ?? 'member',\n });\n seen.add(participantId);\n continue;\n }\n\n const assistPeer = axmBuildAssistPeerParticipantFromCreateData(participantId, data);\n if (assistPeer) {\n resolved.push(assistPeer);\n seen.add(participantId);\n continue;\n }\n\n throw this.createError('PARTICIPANT_NOT_FOUND', `Participant ${participantId} not found`, 404);\n }\n\n return resolved;\n }\n\n private toParticipantRole(role?: AXConversationParticipantUpdate['role']): AXConversationParticipantRole | undefined {\n if (!role) {\n return undefined;\n }\n if (role === 'admin' || role === 'owner') {\n return 'admin';\n }\n return 'member';\n }\n\n //#endregion\n\n //#region ---- Conversation CRUD ----\n\n async createConversation(data: AXConversationCreateData): Promise<AXConversation> {\n const currentUser = await this.userApi.getCurrentUser();\n const participants = await this.resolveParticipantsForCreate(data, currentUser);\n const now = new Date();\n const isPrivate = data.type === 'private';\n const room: Omit<AXMConversationRoom, 'id'> = {\n kind: 'chat',\n type: data.type,\n creatorId: currentUser.id,\n title: isPrivate ? 'New Chat' : (data.title ?? 'New Conversation'),\n avatar: isPrivate ? undefined : data.avatar,\n icon: isPrivate ? undefined : data.icon,\n description: data.description,\n participants,\n lastMessageAt: now,\n unreadCount: 0,\n status: { isTyping: false, typingUsers: [] },\n settings: { notifications: true, showPreview: true },\n pinned: false,\n archived: false,\n createdAt: now,\n updatedAt: now,\n metadata: isPrivate ? undefined : data.metadata,\n };\n const id = await this.roomData.create(room);\n this.realtimeBus.markLocalRoomMutation(id);\n const created: AXMConversationRoom = { ...room, id };\n const conversation = await this.roomQuery.enrichRoom(created, {\n probeLastMessage: false,\n currentUserId: currentUser.id,\n });\n this.conversationStore.cacheConversation(conversation);\n this.conversationStore.cacheEmptyMessageList(id);\n this.conversationStore.publishConversationCreated(conversation);\n return conversation;\n }\n\n async getConversation(conversationId: string): Promise<AXConversation> {\n const cached = this.conversationStore.getCachedConversation(conversationId);\n if (cached) {\n return cached;\n }\n const conversation = await this.conversationStore.getConversation(conversationId);\n if (!conversation) {\n throw this.createError('CONVERSATION_NOT_FOUND', 'Conversation not found', 404);\n }\n const currentUser = await this.userApi.getCurrentUser().catch(() => null);\n const currentUserId = currentUser?.id?.trim();\n if (!currentUserId || !axmIsConversationParticipant(conversation.participants, currentUserId)) {\n throw this.createError('CONVERSATION_NOT_FOUND', 'Conversation not found', 404);\n }\n return conversation;\n }\n\n async getConversations(pagination: AXConversationPagination, filters?: AXConversationFilters): Promise<AXConversationPaginatedResult<AXConversation>> {\n const currentUser = await this.userApi.getCurrentUser().catch(() => null);\n const currentUserId = currentUser?.id?.trim();\n let rooms = await this.roomQuery.loadChatRooms();\n\n if (filters?.archived !== undefined) {\n rooms = rooms.filter((r) => Boolean(r.archived) === filters.archived);\n }\n if (filters?.pinned !== undefined) {\n rooms = rooms.filter((r) => Boolean(r.pinned) === filters.pinned);\n }\n if (filters?.type) {\n rooms = rooms.filter((r) => r.type === filters.type);\n }\n if (filters?.searchQuery) {\n const q = filters.searchQuery.toLowerCase();\n rooms = rooms.filter((r) => {\n if (r.title.toLowerCase().includes(q)) {\n return true;\n }\n return r.participants.some((participant) => participant.name?.toLowerCase().includes(q));\n });\n }\n\n const enriched = await Promise.all(\n rooms.map((r) =>\n this.roomQuery.enrichRoom(r, {\n probeLastMessage: false,\n currentUserId,\n }),\n ),\n );\n for (const conversation of enriched) {\n this.conversationStore.cacheConversation(conversation);\n }\n const sorted = axmSortConversationsByPinAndRecency(enriched);\n return this.roomQuery.paginate(sorted, pagination);\n }\n\n async updateConversation(conversationId: string, updates: AXConversationUpdateData): Promise<AXConversation> {\n const now = new Date();\n this.realtimeBus.markLocalRoomMutation(conversationId);\n await this.roomData.update(conversationId, {\n ...updates,\n updatedAt: now,\n });\n const cached = this.conversationStore.getCachedConversation(conversationId);\n const conversation: AXConversation = {\n ...(cached ?? { id: conversationId, type: 'private', creatorId: '', title: '', participants: [] }),\n ...updates,\n updatedAt: now,\n } as AXConversation;\n this.conversationStore.publishConversationUpdate(conversation);\n return conversation;\n }\n\n async deleteConversation(conversationId: string): Promise<boolean> {\n await this.roomData.delete(conversationId);\n return true;\n }\n\n //#endregion\n\n //#region ---- Conversation state ----\n\n private async publishConversationById(conversationId: string, patch: Partial<AXConversation>): Promise<void> {\n this.publishConversationPatch(conversationId, patch);\n }\n\n async archiveConversation(conversationId: string): Promise<void> {\n this.realtimeBus.markLocalRoomMutation(conversationId);\n await this.roomData.update(conversationId, {\n archived: true,\n updatedAt: new Date(),\n });\n await this.publishConversationById(conversationId, { archived: true });\n }\n\n async unarchiveConversation(conversationId: string): Promise<void> {\n this.realtimeBus.markLocalRoomMutation(conversationId);\n await this.roomData.update(conversationId, {\n archived: false,\n updatedAt: new Date(),\n });\n await this.publishConversationById(conversationId, { archived: false });\n }\n\n async pinConversation(conversationId: string): Promise<void> {\n this.realtimeBus.markLocalRoomMutation(conversationId);\n await this.roomData.update(conversationId, {\n pinned: true,\n updatedAt: new Date(),\n });\n await this.publishConversationById(conversationId, { pinned: true });\n }\n\n async unpinConversation(conversationId: string): Promise<void> {\n this.realtimeBus.markLocalRoomMutation(conversationId);\n await this.roomData.update(conversationId, {\n pinned: false,\n updatedAt: new Date(),\n });\n await this.publishConversationById(conversationId, { pinned: false });\n }\n\n async markConversationAsRead(conversationId: string): Promise<void> {\n const cached = this.conversationStore.getCachedConversation(conversationId);\n if (cached?.unreadCount === 0) {\n return;\n }\n const now = new Date();\n this.realtimeBus.markLocalRoomMutation(conversationId);\n await this.roomData.update(conversationId, {\n unreadCount: 0,\n updatedAt: now,\n });\n await this.publishConversationById(conversationId, { unreadCount: 0, updatedAt: now });\n }\n\n async markConversationAsUnread(conversationId: string): Promise<void> {\n const now = new Date();\n this.realtimeBus.markLocalRoomMutation(conversationId);\n await this.roomData.update(conversationId, {\n unreadCount: 1,\n updatedAt: now,\n });\n await this.publishConversationById(conversationId, { unreadCount: 1, updatedAt: now });\n }\n\n async searchConversations(query: string): Promise<AXConversation[]> {\n const result = await this.getConversations({ page: 0, pageSize: 50 }, { searchQuery: query });\n return result.items;\n }\n\n async filterConversations(filters: AXConversationFilters, pagination?: AXConversationPagination): Promise<AXConversationPaginatedResult<AXConversation>> {\n return this.getConversations(pagination ?? { page: 0, pageSize: 20 }, filters);\n }\n\n //#endregion\n\n //#region ---- Entity-scoped conversations ----\n\n async findEntityConversations(entityType: string, entityId: string): Promise<AXConversation[]> {\n const { items } = await this.roomData.query({\n skip: 0,\n take: 100,\n filter: {\n logic: 'and',\n filters: [\n {\n field: 'kind',\n value: 'chat',\n operator: this.filterService.getOperator('equal') as never,\n },\n {\n field: 'entityRef.entityTypeId',\n value: entityType,\n operator: this.filterService.getOperator('equal') as never,\n },\n {\n field: 'entityRef.entityId',\n value: entityId,\n operator: this.filterService.getOperator('equal') as never,\n },\n ],\n },\n });\n const currentUser = await this.userApi.getCurrentUser().catch(() => null);\n const currentUserId = currentUser?.id?.trim();\n const enriched = await Promise.all(\n items.map((r) =>\n this.roomQuery.enrichRoom(r, {\n probeLastMessage: false,\n currentUserId,\n }),\n ),\n );\n const visible = currentUserId ? enriched.filter((conversation) => axmIsConversationParticipant(conversation.participants, currentUserId)) : [];\n return axmSortConversationsByPinAndRecency(visible);\n }\n\n //#endregion\n\n //#region ---- Participants ----\n\n async getParticipants(conversationId: string): Promise<AXConversationParticipant[]> {\n const cached = this.conversationStore.getCachedConversation(conversationId);\n if (cached?.participants?.length) {\n return cached.participants;\n }\n const room = await this.roomData.byKey(conversationId);\n return room?.participants ?? [];\n }\n\n async addParticipants(conversationId: string, userIds: string[]): Promise<AXConversation> {\n const room = await this.roomData.byKey(conversationId);\n if (!room) {\n throw this.createError('CONVERSATION_NOT_FOUND', 'Conversation not found', 404);\n }\n const newParticipants = await this.userApi.getUsersByIds(userIds);\n const existingIds = new Set(room.participants.map((p) => p.id));\n const merged = [...room.participants, ...newParticipants.filter((p) => !existingIds.has(p.id))];\n await this.roomData.update(conversationId, {\n participants: merged,\n updatedAt: new Date(),\n });\n return this.getConversation(conversationId);\n }\n\n async removeParticipant(conversationId: string, userId: string): Promise<AXConversation> {\n const room = await this.roomData.byKey(conversationId);\n if (!room) {\n throw this.createError('CONVERSATION_NOT_FOUND', 'Conversation not found', 404);\n }\n const participants = room.participants.filter((p) => p.id !== userId);\n await this.roomData.update(conversationId, {\n participants,\n updatedAt: new Date(),\n });\n return this.getConversation(conversationId);\n }\n\n async leaveConversation(conversationId: string): Promise<void> {\n const currentUser = await this.userApi.getCurrentUser();\n await this.removeParticipant(conversationId, currentUser.id);\n }\n\n async updateParticipant(conversationId: string, update: AXConversationParticipantUpdate): Promise<AXConversation> {\n const room = await this.roomData.byKey(conversationId);\n if (!room) {\n throw this.createError('CONVERSATION_NOT_FOUND', 'Conversation not found', 404);\n }\n const participants: AXConversationParticipant[] = room.participants.map((p) => (p.id === update.userId ? { ...p, role: this.toParticipantRole(update.role) ?? p.role } : p));\n await this.roomData.update(conversationId, {\n participants,\n updatedAt: new Date(),\n });\n return this.getConversation(conversationId);\n }\n\n //#endregion\n\n //#region ---- Settings ----\n\n async getConversationSettings(conversationId: string): Promise<AXConversationSettingsUpdate> {\n const room = await this.roomData.byKey(conversationId);\n if (!room) {\n throw this.createError('CONVERSATION_NOT_FOUND', 'Conversation not found', 404);\n }\n return {\n mutedUntil: room.settings.mutedUntil,\n notifications: room.settings.notifications,\n notificationSound: room.settings.notificationSound,\n showPreview: room.settings.showPreview,\n custom: room.settings.custom,\n };\n }\n\n async updateConversationSettings(conversationId: string, settings: AXConversationSettingsUpdate): Promise<void> {\n const room = await this.roomData.byKey(conversationId);\n if (!room) {\n throw this.createError('CONVERSATION_NOT_FOUND', 'Conversation not found', 404);\n }\n await this.roomData.update(conversationId, {\n settings: { ...room.settings, ...settings },\n updatedAt: new Date(),\n });\n }\n\n async muteConversation(conversationId: string, duration?: number): Promise<void> {\n const mutedUntil = duration ? new Date(Date.now() + duration) : new Date(Date.now() + 86400000);\n await this.updateConversationSettings(conversationId, { mutedUntil });\n }\n\n async unmuteConversation(conversationId: string): Promise<void> {\n await this.updateConversationSettings(conversationId, {\n mutedUntil: undefined,\n });\n }\n\n //#endregion\n\n //#region ---- Stubs ----\n\n async uploadConversationAvatar(_conversationId: string, _file: File): Promise<string> {\n // TODO Conversation:021: upload conversation avatar\n throw this.createError('NOT_IMPLEMENTED', 'Avatar upload is not implemented', 501);\n }\n\n async getConversationMedia(_conversationId: string, pagination?: AXConversationPagination): Promise<AXConversationPaginatedResult<unknown>> {\n // TODO Conversation:022: list conversation media\n return { items: [], hasMore: false, page: pagination?.page ?? 0 };\n }\n\n async addConversationTags(_conversationId: string, _tags: string[]): Promise<void> {\n // TODO Conversation:023: add conversation tags\n }\n\n async removeConversationTags(_conversationId: string, _tags: string[]): Promise<void> {\n // TODO Conversation:024: remove conversation tags\n }\n\n async getConversationTags(_conversationId: string): Promise<string[]> {\n // TODO Conversation:025: get conversation tags\n return [];\n }\n\n async saveDraft(conversationId: string, draft: string): Promise<void> {\n await this.roomData.update(conversationId, {\n draft,\n updatedAt: new Date(),\n });\n }\n\n async getDraft(conversationId: string): Promise<string | null> {\n const room = await this.roomData.byKey(conversationId);\n return room?.draft ?? null;\n }\n\n async clearDraft(conversationId: string): Promise<void> {\n await this.roomData.update(conversationId, {\n draft: undefined,\n updatedAt: new Date(),\n });\n }\n\n //#endregion\n}\n\n//#endregion\n","import { runtimeCommandPayloadData } from '@acorex-platform/framework-shared/core';\n//#region ---- Imports ----\n\nimport type {\n AXConversationMessage,\n AXConversationMessageForwardData,\n AXConversationMessagePayload,\n AXConversationMessageSearchFilters,\n AXConversationPaginatedResult,\n AXConversationPagination,\n AXConversationPinnedMessage,\n AXConversationReadReceipt,\n AXConversationSendMessageCommand,\n} from '@acorex/components/conversation';\nimport { AXPFilterOperatorMiddlewareService } from '@acorex-platform/framework-client/common';\nimport { AXPEntityService } from '@acorex-platform/framework-client/layout/entity';\nimport { AXPRealtimeConnectionPort } from '@acorex-platform/framework-client/realtime';\nimport { AXPCommandService } from '@acorex-platform/framework-client/runtime';\nimport { inject, Injectable } from '@angular/core';\nimport { orderBy } from 'lodash';\n\nimport { RootConfig } from '@acorex-platform/module-conversation-client/contracts';\nimport { AXMConversationMessage, AXMConversationRoom } from '@acorex-platform/module-conversation-client/contracts';\nimport {\n CONVERSATION_AFTER_MESSAGE_SENT_COMMAND,\n CONVERSATION_MARK_CONVERSATION_UNREAD_COMMAND,\n CONVERSATION_RETRY_ASSIST_RESPONSE_COMMAND,\n CONVERSATION_SYNC_READ_STATE_COMMAND,\n} from '../../../../commands/conversation-command.keys';\nimport { AXMConversationEntityStoreService } from '../../../services/conversation-entity-store.service';\nimport { AXM_CONVERSATION_ASSIST_RESPONSE_PORT } from '../../../services/conversation-assist-response.port';\nimport { AXMChatMessageApi } from '../chat-conversation-apis.abstract';\nimport { AXMChatEntityUserApi } from './chat-entity-user.api';\nimport { axmMessageEntityToMessage } from './chat-entity-mapper.util';\nimport { axmReadAssistResponseStatus } from '../../utils/assist-response-status.util';\nimport { axmIsConversationParticipant } from '../../utils/conversation-participant.util';\nimport { axmSortMessagesNewestFirst } from '../../utils/conversation-time.util';\n\n//#endregion\n\n//#region ---- Service ----\n\n/**\n * Entity-backed implementation of {@link AXMChatMessageApi} using Conversation.message.\n */\n@Injectable()\nexport class AXMChatEntityMessageApi extends AXMChatMessageApi {\n private static readonly MESSAGE_QUERY_MAX = 1000;\n\n //#region ---- Services & Dependencies ----\n\n private readonly entityService = inject(AXPEntityService);\n private readonly filterService = inject(AXPFilterOperatorMiddlewareService);\n private readonly userApi = inject(AXMChatEntityUserApi);\n private readonly commandService = inject(AXPCommandService);\n private readonly assistResponse = inject(AXM_CONVERSATION_ASSIST_RESPONSE_PORT, { optional: true });\n private readonly conversationStore = inject(AXMConversationEntityStoreService);\n private readonly realtime = inject(AXPRealtimeConnectionPort, { optional: true });\n private readonly typingStopTimers = new Map<string, ReturnType<typeof setTimeout>>();\n private readonly messageData = this.entityService\n .withEntity(RootConfig.module.name, RootConfig.entities.message.name)\n .data<string, AXMConversationMessage>();\n private readonly roomData = this.entityService\n .withEntity(RootConfig.module.name, RootConfig.entities.room.name)\n .data<string, AXMConversationRoom>();\n\n //#endregion\n\n //#region ---- Access helpers ----\n\n private async requireConversationParticipant(conversationId: string): Promise<AXMConversationRoom> {\n const currentUser = await this.userApi.getCurrentUser();\n const cached = this.conversationStore.getCachedConversation(conversationId);\n if (\n cached &&\n axmIsConversationParticipant(cached.participants, currentUser.id)\n ) {\n return {\n id: conversationId,\n kind: 'chat',\n type: cached.type,\n creatorId: cached.creatorId,\n title: cached.title ?? '',\n participants: cached.participants,\n lastMessageAt: cached.lastMessageAt ?? new Date(),\n unreadCount: cached.unreadCount ?? 0,\n status: cached.status ?? { isTyping: false, typingUsers: [] },\n settings: cached.settings ?? { notifications: true, showPreview: true },\n pinned: cached.pinned ?? false,\n archived: cached.archived ?? false,\n createdAt: cached.createdAt ?? new Date(),\n updatedAt: cached.updatedAt ?? new Date(),\n };\n }\n const room = await this.roomData.byKey(conversationId).catch(() => null);\n if (\n !room ||\n room.kind !== 'chat' ||\n !axmIsConversationParticipant(room.participants, currentUser.id)\n ) {\n throw this.createError('CONVERSATION_NOT_FOUND', 'Conversation not found', 404);\n }\n this.conversationStore.cacheConversationFromRoom(room, currentUser.id);\n return room;\n }\n\n //#endregion\n\n //#region ---- Query helpers ----\n\n private async loadConversationMessages(conversationId: string): Promise<AXMConversationMessage[]> {\n return this.conversationStore.loadConversationMessages(conversationId);\n }\n\n private paginateMessages(\n messages: AXMConversationMessage[],\n pagination: AXConversationPagination,\n ): AXConversationPaginatedResult<AXConversationMessage> {\n const mapped = this.mergePersistedMessages(\n messages[0]?.conversationId ?? '',\n messages,\n );\n return this.paginateAxMessages(mapped, pagination);\n }\n\n private paginateAxMessages(messages: AXConversationMessage[], pagination: AXConversationPagination): AXConversationPaginatedResult<AXConversationMessage> {\n const sorted = axmSortMessagesNewestFirst(messages);\n const start = pagination.page * pagination.pageSize;\n const end = start + pagination.pageSize;\n return {\n items: sorted.slice(start, end),\n total: sorted.length,\n hasMore: end < sorted.length,\n page: pagination.page,\n totalPages: Math.ceil(sorted.length / pagination.pageSize),\n };\n }\n\n private mergePersistedMessages(conversationId: string, entities: AXMConversationMessage[]): AXConversationMessage[] {\n const persisted = entities.map((m) => axmMessageEntityToMessage(m));\n if (!conversationId) {\n return persisted;\n }\n return this.assistResponse?.mergeLiveConversationMessages(conversationId, persisted) ?? persisted;\n }\n\n private async touchConversationLastMessage(\n conversationId: string,\n message: AXMConversationMessage,\n ): Promise<void> {\n await this.conversationStore.touchLastMessage(conversationId, axmMessageEntityToMessage(message));\n }\n\n //#endregion\n\n //#region ---- Message CRUD ----\n\n async sendMessage(command: AXConversationSendMessageCommand): Promise<AXConversationMessage> {\n await this.requireConversationParticipant(command.conversationId);\n const currentUser = await this.userApi.getCurrentUser();\n const now = new Date();\n const clientMessageId = command.tempId?.trim();\n const entity = {\n ...(clientMessageId ? { id: clientMessageId } : {}),\n conversationId: command.conversationId,\n senderId: currentUser.id,\n type: command.type,\n fileType: command.fileType,\n timestamp: now,\n payload: command.payload,\n status: 'sent',\n reactions: [],\n forwarded: command.forwarded,\n forwardedFrom: command.forwardedFrom,\n metadata: command.metadata,\n isLocal: false,\n ...(command.replyToId\n ? { replyTo: { id: command.replyToId } as AXMConversationMessage }\n : {}),\n } as AXMConversationMessage;\n\n const messageId = await this.messageData.create(entity);\n const stored: AXMConversationMessage = { ...entity, id: messageId };\n const message = axmMessageEntityToMessage(stored);\n\n // conversation already shows an optimistic bubble with `tempId`; mark it sent before\n // assist SSE can render the AI placeholder (server starts assist on create).\n if (clientMessageId) {\n this.conversationStore.publishMessageUpdate({ ...message, status: 'sent', isLocal: false });\n } else {\n this.conversationStore.publishNewMessage(message);\n }\n\n void this.touchConversationLastMessage(command.conversationId, stored);\n void this.commandService.execute(CONVERSATION_AFTER_MESSAGE_SENT_COMMAND, {\n conversationId: command.conversationId,\n messageId: stored.id,\n command,\n currentUserId: currentUser.id,\n });\n\n return message;\n }\n\n async getMessage(messageId: string): Promise<AXConversationMessage> {\n const live = this.assistResponse?.getLiveMessage(messageId);\n if (live) {\n return live;\n }\n let message: AXMConversationMessage | null = null;\n try {\n message = await this.messageData.byKey(messageId);\n } catch {\n message = null;\n }\n const needsReconcile =\n message &&\n (axmReadAssistResponseStatus(message.metadata) === 'streaming' ||\n message.metadata?.['isStreaming'] === true);\n if (needsReconcile && message?.conversationId) {\n await this.assistResponse?.reconcileStaleAssistPlaceholders(message.conversationId);\n }\n const reconciled = this.assistResponse?.getLiveMessage(messageId);\n if (reconciled) {\n return reconciled;\n }\n if (!message) {\n throw this.createError('MESSAGE_NOT_FOUND', 'Message not found', 404);\n }\n return axmMessageEntityToMessage(message);\n }\n\n async getMessages(conversationId: string, pagination: AXConversationPagination): Promise<AXConversationPaginatedResult<AXConversationMessage>> {\n await this.requireConversationParticipant(conversationId);\n const entities = await this.loadConversationMessages(conversationId);\n const merged = this.mergePersistedMessages(conversationId, entities);\n return this.paginateAxMessages(merged, pagination);\n }\n\n async editMessage(messageId: string, payload: AXConversationMessagePayload): Promise<AXConversationMessage> {\n await this.messageData.update(messageId, { payload, editedAt: new Date() });\n return this.getMessage(messageId);\n }\n\n async deleteMessage(messageId: string, _forEveryone?: boolean): Promise<void> {\n await this.messageData.update(messageId, { deleted: true, deletedAt: new Date() });\n }\n\n async deleteMessages(messageIds: string[], forEveryone?: boolean): Promise<void> {\n await Promise.all(messageIds.map((id) => this.deleteMessage(id, forEveryone)));\n }\n\n //#endregion\n\n //#region ---- Assist ----\n\n async retryAssistResponse(conversationId: string, messageId: string): Promise<AXConversationMessage> {\n const result = await this.commandService.execute<\n { conversationId: string; messageId: string },\n { message: AXConversationMessage }\n >(CONVERSATION_RETRY_ASSIST_RESPONSE_COMMAND, {\n conversationId,\n messageId,\n });\n const data = runtimeCommandPayloadData(result);\n if (!data?.message) {\n throw this.createError('ASSIST_RETRY_FAILED', 'Assist retry failed', 500);\n }\n return data.message;\n }\n\n //#endregion\n\n //#region ---- Search ----\n\n async searchMessages(\n conversationId: string,\n filters: AXConversationMessageSearchFilters,\n pagination?: AXConversationPagination,\n ): Promise<AXConversationPaginatedResult<AXConversationMessage>> {\n let messages = await this.loadConversationMessages(conversationId);\n const q = filters.query?.toLowerCase();\n if (q) {\n messages = messages.filter((m) => {\n if (m.payload.type === 'text') {\n return m.payload.text.toLowerCase().includes(q);\n }\n return false;\n });\n }\n if (filters.senderId) {\n messages = messages.filter((m) => m.senderId === filters.senderId);\n }\n return this.paginateMessages(messages, pagination ?? { page: 0, pageSize: 30 });\n }\n\n async searchAllMessages(\n filters: AXConversationMessageSearchFilters,\n pagination?: AXConversationPagination,\n ): Promise<AXConversationPaginatedResult<AXConversationMessage>> {\n const { items } = await this.messageData.query({ skip: 0, take: 500 });\n let messages = items.filter((m) => !m.deleted);\n const q = filters.query?.toLowerCase();\n if (q) {\n messages = messages.filter((m) => m.payload.type === 'text' && m.payload.text.toLowerCase().includes(q));\n }\n return this.paginateMessages(messages, pagination ?? { page: 0, pageSize: 30 });\n }\n\n //#endregion\n\n //#region ---- Reactions ----\n\n private async persistReactionsAndPublish(\n messageId: string,\n reactions: AXMConversationMessage['reactions'],\n base?: AXConversationMessage,\n ): Promise<void> {\n await this.messageData.update(messageId, { reactions });\n const cached = base ?? this.conversationStore.getCachedMessage(messageId);\n if (!cached) {\n return;\n }\n const mapped = { ...cached, reactions: reactions ?? [] };\n this.conversationStore.publishMessageUpdate(mapped);\n }\n\n async addReaction(messageId: string, emoji: string): Promise<void> {\n const message = await this.messageData.byKey(messageId);\n if (!message) {\n throw this.createError('MESSAGE_NOT_FOUND', 'Message not found', 404);\n }\n const currentUser = await this.userApi.getCurrentUser();\n const reactions = [...(message.reactions ?? [])];\n const existingIndex = reactions.findIndex((r) => r.userId === currentUser.id && r.emoji === emoji);\n if (existingIndex >= 0) {\n reactions.splice(existingIndex, 1);\n } else {\n reactions.push({ emoji, userId: currentUser.id, timestamp: new Date() });\n }\n await this.persistReactionsAndPublish(messageId, reactions, axmMessageEntityToMessage(message));\n }\n\n async removeReaction(messageId: string, emoji: string): Promise<void> {\n const message = await this.messageData.byKey(messageId);\n if (!message) {\n throw this.createError('MESSAGE_NOT_FOUND', 'Message not found', 404);\n }\n const currentUser = await this.userApi.getCurrentUser();\n const reactions = (message.reactions ?? []).filter(\n (r) => !(r.userId === currentUser.id && r.emoji === emoji),\n );\n await this.persistReactionsAndPublish(messageId, reactions, axmMessageEntityToMessage(message));\n }\n\n async getAvailableReactions(): Promise<string[]> {\n return ['👍', '❤️', '😂', '😮', '😢', '🙏'];\n }\n\n //#endregion\n\n //#region ---- Read state ----\n\n async markAsRead(conversationId: string, messageIds: string[]): Promise<void> {\n const currentUser = await this.userApi.getCurrentUser();\n await this.commandService.execute(CONVERSATION_SYNC_READ_STATE_COMMAND, {\n conversationId,\n messageIds,\n currentUserId: currentUser.id,\n });\n }\n\n async markAsUnread(conversationId: string): Promise<void> {\n await this.commandService.execute(CONVERSATION_MARK_CONVERSATION_UNREAD_COMMAND, { conversationId });\n }\n\n async getReadReceipts(_messageId: string): Promise<AXConversationReadReceipt[]> {\n return [];\n }\n\n async markMessagesAsRead(messageIds: string[]): Promise<void> {\n if (messageIds.length === 0) {\n return;\n }\n const first = await this.messageData.byKey(messageIds[0]);\n if (!first) {\n return;\n }\n await this.markAsRead(first.conversationId, messageIds);\n }\n\n //#endregion\n\n //#region ---- Forward / pin ----\n\n async forwardMessage(_data: AXConversationMessageForwardData): Promise<AXConversationMessage[]> {\n throw this.createError('NOT_IMPLEMENTED', 'Forward is not implemented', 501);\n }\n\n async pinMessage(conversationId: string, messageId: string): Promise<void> {\n await this.messageData.update(messageId, { pinned: true });\n const room = await this.roomData.byKey(conversationId);\n const pinnedIds = [...(room?.pinnedMessageIds ?? []), messageId];\n await this.roomData.update(conversationId, { pinnedMessageIds: pinnedIds, updatedAt: new Date() });\n }\n\n async unpinMessage(conversationId: string, messageId: string): Promise<void> {\n await this.messageData.update(messageId, { pinned: false });\n const room = await this.roomData.byKey(conversationId);\n const pinnedIds = (room?.pinnedMessageIds ?? []).filter((id) => id !== messageId);\n await this.roomData.update(conversationId, { pinnedMessageIds: pinnedIds, updatedAt: new Date() });\n }\n\n async getPinnedMessages(conversationId: string): Promise<AXConversationPinnedMessage[]> {\n const room = await this.roomData.byKey(conversationId);\n const ids = room?.pinnedMessageIds ?? [];\n const currentUser = await this.userApi.getCurrentUser();\n return ids.map((messageId) => ({\n messageId,\n pinnedBy: currentUser.id,\n pinnedAt: new Date(),\n }));\n }\n\n async getMessageReplies(\n messageId: string,\n pagination?: AXConversationPagination,\n ): Promise<AXConversationPaginatedResult<AXConversationMessage>> {\n const { items } = await this.messageData.query({\n skip: 0,\n take: 500,\n filter: {\n field: 'replyTo.id',\n value: messageId,\n operator: this.filterService.getOperator('equal') as never,\n },\n });\n return this.paginateMessages(orderBy(items, [(m) => m.timestamp.getTime()], ['asc']), pagination ?? { page: 0, pageSize: 30 });\n }\n\n async getReplyCount(messageId: string): Promise<number> {\n const result = await this.getMessageReplies(messageId, { page: 0, pageSize: 1 });\n return result.total ?? result.items.length;\n }\n\n async getForwardCount(_messageId: string): Promise<number> {\n return 0;\n }\n\n //#endregion\n\n //#region ---- Typing / metadata / status ----\n\n async sendTypingIndicator(conversationId: string): Promise<void> {\n const id = conversationId.trim();\n if (!id) {\n return;\n }\n this.realtime?.emitConversationTyping(id, true);\n this.#armTypingStop(id);\n }\n\n async stopTypingIndicator(conversationId: string): Promise<void> {\n const id = conversationId.trim();\n if (!id) {\n return;\n }\n this.#clearTypingStop(id);\n this.realtime?.emitConversationTyping(id, false);\n }\n\n #armTypingStop(conversationId: string): void {\n this.#clearTypingStop(conversationId);\n this.typingStopTimers.set(\n conversationId,\n setTimeout(() => {\n this.typingStopTimers.delete(conversationId);\n this.realtime?.emitConversationTyping(conversationId, false);\n }, 250),\n );\n }\n\n #clearTypingStop(conversationId: string): void {\n const timer = this.typingStopTimers.get(conversationId);\n if (timer) {\n clearTimeout(timer);\n this.typingStopTimers.delete(conversationId);\n }\n }\n\n async updateMessageMetadata(messageId: string, metadata: Record<string, unknown>): Promise<void> {\n const message = await this.messageData.byKey(messageId);\n await this.messageData.update(messageId, { metadata: { ...message?.metadata, ...metadata } });\n }\n\n async getMessageMetadata(messageId: string): Promise<Record<string, unknown>> {\n const message = await this.messageData.byKey(messageId);\n return message?.metadata ?? {};\n }\n\n async updateMessageStatus(\n messageId: string,\n status: 'sending' | 'sent' | 'delivered' | 'read' | 'failed',\n ): Promise<void> {\n await this.messageData.update(messageId, { status });\n }\n\n async getMessageDeliveryStatus(_messageId: string): Promise<{ delivered: number; read: number; total: number }> {\n return { delivered: 0, read: 0, total: 0 };\n }\n\n async bulkDeleteMessages(conversationId: string, messageIds: string[], forEveryone?: boolean): Promise<void> {\n await Promise.all(messageIds.map((id) => this.deleteMessage(id, forEveryone)));\n void conversationId;\n }\n\n async exportMessages(_conversationId: string, _format: 'json' | 'csv' | 'txt'): Promise<string | Blob> {\n throw this.createError('NOT_IMPLEMENTED', 'Export is not implemented', 501);\n }\n\n //#endregion\n}\n\n//#endregion\n","//#region ---- Imports ----\n\nimport type {\n AXConversationCallEvent,\n AXConversationConnectionEvent,\n AXConversationConnectionOptions,\n AXConversationConnectionStatus,\n AXConversation,\n AXConversationMessage,\n AXConversationNotificationEvent,\n AXConversationTypingIndicator,\n} from '@acorex/components/conversation';\nimport {\n AXPRealtimeConnectionService,\n AXPUserPresenceService,\n} from '@acorex-platform/framework-client/realtime';\nimport { inject, Injectable } from '@angular/core';\nimport { filter, map, merge, Observable, pairwise } from 'rxjs';\n\nimport { AXMChatRealtimeApi } from '../chat-conversation-apis.abstract';\nimport { AXMConversationRealtimeBus } from '../../../services/conversation-realtime.bus';\nimport { axmCoerceTimestampMs } from '../../utils/conversation-time.util';\n\n//#endregion\n\n//#region ---- Service ----\n\n/**\n * Entity-backed realtime API that forwards {@link AXMConversationRealtimeBus} events to conversation.\n */\n@Injectable()\nexport class AXMChatEntityRealtimeApi extends AXMChatRealtimeApi {\n //#region ---- Services & Dependencies ----\n\n private readonly bus = inject(AXMConversationRealtimeBus);\n private readonly realtimeConnection = inject(AXPRealtimeConnectionService, { optional: true });\n private readonly presence = inject(AXPUserPresenceService, { optional: true });\n\n //#endregion\n\n //#region ---- Connection state ----\n\n readonly connectionStatus$: Observable<AXConversationConnectionStatus> =\n this.realtimeConnection?.connectionStatus$ ?? this.bus.connectionStatus$;\n\n async connect(_options?: AXConversationConnectionOptions): Promise<void> {\n if (this.realtimeConnection) {\n this.realtimeConnection.connect();\n return;\n }\n this.bus.setConnectionStatus('connecting');\n this.bus.setConnectionStatus('connected');\n }\n\n async disconnect(): Promise<void> {\n this.realtimeConnection?.disconnect();\n }\n\n isConnected(): boolean {\n return this.realtimeConnection?.isSocketConnected() ?? false;\n }\n\n async reconnect(): Promise<void> {\n this.realtimeConnection?.reconnectWithCurrentToken();\n }\n\n subscribeToConnectionEvents(): Observable<AXConversationConnectionEvent> {\n return new Observable((subscriber) => {\n subscriber.next({ type: 'connected', timestamp: new Date() });\n });\n }\n\n //#endregion\n\n //#region ---- Message streams ----\n\n subscribeToMessages(conversationId: string): Observable<AXConversationMessage> {\n return this.bus.messagesForConversation(conversationId);\n }\n\n subscribeToMessageUpdates(conversationId?: string): Observable<AXConversationMessage> {\n return this.bus.messageUpdatesForConversation(conversationId);\n }\n\n subscribeToMessageDeletions(_conversationId?: string): Observable<string> {\n return this.bus.messageDeletions$;\n }\n\n subscribeToMessageReactions(conversationId?: string): Observable<AXConversationMessage> {\n return this.bus.messageUpdatesForConversation(conversationId);\n }\n\n //#endregion\n\n //#region ---- Conversation streams ----\n\n subscribeToConversationUpdates(): Observable<AXConversation> {\n return this.bus.conversationUpdates$;\n }\n\n subscribeToConversationCreated(): Observable<AXConversation> {\n return this.bus.conversationCreated$;\n }\n\n subscribeToConversationDeleted(): Observable<string> {\n return new Observable(() => undefined);\n }\n\n //#endregion\n\n //#region ---- Presence & typing ----\n\n subscribeToTypingIndicators(conversationId: string): Observable<AXConversationTypingIndicator> {\n return this.bus.typingIndicatorsForConversation(conversationId);\n }\n\n subscribeToPresenceUpdates(userIds?: string[]): Observable<import('@acorex/components/conversation').AXConversationPresenceUpdate> {\n if (userIds?.length) {\n this.presence?.ensureWatchMany(userIds);\n }\n return this.bus.presenceUpdates$;\n }\n\n subscribeToReadReceipts(conversationId?: string): Observable<{ messageId: string; userId: string; readAt: Date }> {\n const scoped = conversationId?.trim();\n return this.bus.messageUpdates$.pipe(\n pairwise(),\n filter(\n ([previous, current]) =>\n current.status === 'read' && (previous.id !== current.id || previous.status !== 'read'),\n ),\n filter(([, current]) => !scoped || current.conversationId === scoped),\n map(([, current]) => ({\n messageId: current.id,\n userId: current.senderId,\n readAt: new Date(),\n })),\n );\n }\n\n //#endregion\n\n //#region ---- Notifications & system ----\n\n subscribeToNotifications(): Observable<AXConversationNotificationEvent> {\n return new Observable(() => undefined);\n }\n\n subscribeToCallEvents(): Observable<AXConversationCallEvent> {\n return new Observable(() => undefined);\n }\n\n subscribeToUserBlockEvents(): Observable<{ userId: string; blocked: boolean }> {\n return new Observable(() => undefined);\n }\n\n subscribeToParticipantEvents(\n _conversationId?: string,\n ): Observable<{ conversationId: string; userId: string; action: 'added' | 'removed' }> {\n return new Observable(() => undefined);\n }\n\n subscribeToSystemEvents(): Observable<{ type: string; message: string; data?: unknown }> {\n return new Observable(() => undefined);\n }\n\n subscribeToMessageStatusChanges(conversationId?: string): Observable<{\n messageId: string;\n status: 'sending' | 'sent' | 'delivered' | 'read' | 'failed';\n timestamp: Date;\n }> {\n return this.bus.messageStatusChanges(conversationId).pipe(\n map((event) => ({\n ...event,\n timestamp: event.timestamp instanceof Date ? event.timestamp : new Date(axmCoerceTimestampMs(event.timestamp)),\n })),\n );\n }\n\n subscribeToConversationSettingsChanges(_conversationId?: string): Observable<{\n conversationId: string;\n settings: Record<string, unknown>;\n }> {\n return new Observable(() => undefined);\n }\n\n subscribeToDraftChanges(_conversationId?: string): Observable<{\n conversationId: string;\n draft: string | null;\n }> {\n return new Observable(() => undefined);\n }\n\n //#endregion\n}\n\n//#endregion\n","//#region ---- Imports ----\n\nimport type { AXConversation, AXConversationTab } from '@acorex/components/conversation';\n\n//#endregion\n\n//#region ---- Helpers ----\n\n/** True when the conversation is an assist / AI bot chat. */\nexport function axmIsAssistBotConversation(conversation: AXConversation): boolean {\n if (conversation.type === 'bot') {\n return true;\n }\n const fromMeta = conversation.metadata?.['assistId'];\n if (typeof fromMeta === 'string' && fromMeta.trim().length > 0) {\n return true;\n }\n for (const participant of conversation.participants ?? []) {\n if (typeof participant.id === 'string' && participant.id.startsWith('assist-')) {\n return true;\n }\n const fromParticipant = participant.metadata?.['assistId'];\n if (typeof fromParticipant === 'string' && fromParticipant.trim().length > 0) {\n return true;\n }\n }\n return false;\n}\n\n//#endregion\n\n//#region ---- Bot tab ----\n\n/** Sidebar tab for AI assist conversations (`type: 'bot'` or assist metadata). */\nexport const AXM_CONVERSATION_TAB_BOT: AXConversationTab = {\n id: 'bot',\n label: '@conversation:chat.tabs.bot',\n icon: 'fa-light fa-robot',\n priority: 30,\n filter: (conversations: AXConversation[]) =>\n conversations.filter((conversation) => axmIsAssistBotConversation(conversation)),\n};\n\n//#endregion\n","//#region ---- Imports ----\n\nimport type { AXConversationParticipant } from '@acorex/components/conversation';\nimport { AXConversationService } from '@acorex/components/conversation';\nimport type { WritableSignal, Signal } from '@angular/core';\n\n//#endregion\n\n//#region ---- Types ----\n\n/**\n * Session fields on {@link AXConversationService} not yet on the public API.\n * Centralize the cast here so feature code does not repeat it.\n */\nexport interface AXMConversationServiceSessionAdapter {\n readonly currentUser: Signal<AXConversationParticipant | null>;\n setCurrentUser(participant: AXConversationParticipant | null): void;\n closeActiveConversation(): void;\n resetConversationsPagination(): void;\n loadConversations(): Promise<void>;\n}\n\ninterface ConversationServiceSessionBridge {\n _currentUser: WritableSignal<AXConversationParticipant | null>;\n currentUser: Signal<AXConversationParticipant | null>;\n closeActiveConversation(): void;\n resetConversationsPagination(): void;\n loadConversations(): Promise<void>;\n}\n\n//#endregion\n\n//#region ---- Adapter ----\n\nexport function createConversationServiceSessionAdapter(\n service: AXConversationService,\n): AXMConversationServiceSessionAdapter {\n const bridge = service as unknown as ConversationServiceSessionBridge;\n\n return {\n currentUser: bridge.currentUser,\n setCurrentUser: (participant) => bridge._currentUser.set(participant),\n closeActiveConversation: () => bridge.closeActiveConversation(),\n resetConversationsPagination: () => bridge.resetConversationsPagination(),\n loadConversations: () => bridge.loadConversations(),\n };\n}\n\n//#endregion\n","//#region ---- Imports ----\n\nimport { AXConversationService } from '@acorex/components/conversation';\nimport { AXPSessionService } from '@acorex-platform/framework-client/auth';\nimport { DestroyRef, inject, Injectable } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { distinctUntilChanged, map } from 'rxjs';\n\nimport { AXMChatEntityUserApi } from '../plugins/services/entity/chat-entity-user.api';\nimport { createConversationServiceSessionAdapter } from './conversation-service-session.adapter';\n\n//#endregion\n\n//#region ---- Service ----\n\n/**\n * Keeps conversation's cached current user aligned with {@link AXPSessionService}\n * when switching accounts without a full page reload.\n */\n@Injectable({ providedIn: 'root' })\nexport class AXMConversationSessionSyncService {\n //#region ---- Services & Dependencies -----\n\n private readonly sessionService = inject(AXPSessionService);\n private readonly conversationService = inject(AXConversationService);\n private readonly userApi = inject(AXMChatEntityUserApi);\n private readonly destroyRef = inject(DestroyRef);\n\n //#endregion\n\n //#region ---- State Signals -----\n\n private switching = false;\n\n private readonly conversation = createConversationServiceSessionAdapter(this.conversationService);\n\n //#endregion\n\n //#region ---- Lifecycle -----\n\n start(): void {\n // Re-evaluate when user OR full workspace readiness changes.\n this.sessionService.isReadyForAppScopedApi$\n .pipe(\n distinctUntilChanged(),\n takeUntilDestroyed(this.destroyRef),\n )\n .subscribe((ready) => {\n if (!ready) {\n void this.handleUserIdChange(null);\n return;\n }\n void this.handleUserIdChange(this.sessionService.user?.id?.trim() ?? null);\n });\n\n this.sessionService.user$\n .pipe(\n map((user) => user?.id?.trim() ?? null),\n distinctUntilChanged(),\n takeUntilDestroyed(this.destroyRef),\n )\n .subscribe((userId) => {\n if (!this.sessionService.isReadyForAppScopedApi) {\n return;\n }\n void this.handleUserIdChange(userId);\n });\n }\n\n //#endregion\n\n //#region ---- Session sync ----\n\n private async handleUserIdChange(userId: string | null): Promise<void> {\n if (this.switching) {\n return;\n }\n\n if (!userId) {\n this.conversation.setCurrentUser(null);\n this.conversation.closeActiveConversation();\n return;\n }\n\n // Wait until tenant+app are bound. Syncing during password SignIn / restore\n // races with session bootstrap and surfaces USER_NOT_FOUND / hangs splash work.\n if (!this.sessionService.isReadyForAppScopedApi) {\n return;\n }\n\n const cachedUserId = this.conversation.currentUser()?.id;\n if (cachedUserId === userId) {\n return;\n }\n\n this.switching = true;\n try {\n const currentUser = await this.userApi.getCurrentUser();\n this.conversation.setCurrentUser(currentUser);\n this.conversation.closeActiveConversation();\n this.conversation.resetConversationsPagination();\n await this.conversation.loadConversations();\n } catch (error) {\n console.warn('Conversation session sync skipped:', error);\n } finally {\n this.switching = false;\n }\n }\n\n //#endregion\n}\n\n//#endregion\n","//#region ----- Imports -----\n\nimport { AXConversationService } from '@acorex/components/conversation';\nimport { Injectable, inject } from '@angular/core';\n\n//#endregion\n\n//#region ----- Constants -----\n\n/** Fallback clear if a stop packet never arrives. */\nconst TYPING_RECV_IDLE_MS = 600;\n\n//#endregion\n\n//#region ----- Service -----\n\n/**\n * Applies remote typing to the conversation inbox immediately.\n * ACoreX's built-in handler always treats events as \"start\" and clears after a timeout.\n */\n@Injectable()\nexport class AXMConversationTypingSyncService {\n private readonly conversationService = inject(AXConversationService);\n private readonly idleTimers = new Map<string, ReturnType<typeof setTimeout>>();\n\n apply(conversationId: string, userId: string, active: boolean): void {\n const scopedConversationId = conversationId.trim();\n const scopedUserId = userId.trim();\n if (!scopedConversationId || !scopedUserId) {\n return;\n }\n\n this.#write(scopedConversationId, scopedUserId, active);\n\n const key = `${scopedConversationId}:${scopedUserId}`;\n const pending = this.idleTimers.get(key);\n if (pending) {\n clearTimeout(pending);\n this.idleTimers.delete(key);\n }\n\n if (!active) {\n return;\n }\n\n this.idleTimers.set(\n key,\n setTimeout(() => {\n this.idleTimers.delete(key);\n this.#write(scopedConversationId, scopedUserId, false);\n }, TYPING_RECV_IDLE_MS),\n );\n }\n\n #write(conversationId: string, userId: string, active: boolean): void {\n const conversation = this.conversationService\n .conversations()\n .find((item) => item.id === conversationId);\n if (!conversation) {\n return;\n }\n\n const typingUsers = new Set(conversation.status?.typingUsers ?? []);\n if (active) {\n typingUsers.add(userId);\n } else {\n typingUsers.delete(userId);\n }\n\n void this.conversationService.updateConversation(conversationId, {\n status: {\n ...conversation.status,\n isTyping: typingUsers.size > 0,\n typingUsers: [...typingUsers],\n },\n });\n }\n}\n\n//#endregion\n","//#region ----- Imports -----\n\nimport { AXPRtcApiAbstract } from '@acorex-platform/extension-rtc-core-gateway';\nimport { AXToastService } from '@acorex/components/toast';\nimport { AXTranslationService } from '@acorex/core/translation';\nimport { inject } from '@angular/core';\nimport { firstValueFrom } from 'rxjs';\n\n//#endregion\n\n//#region ----- Types -----\n\nexport interface AXMChatCallRtcReadyDeps {\n rtc?: AXPRtcApiAbstract | null;\n translation?: AXTranslationService;\n toast?: AXToastService;\n showToast?: boolean;\n}\n\n//#endregion\n\n//#region ----- RTC readiness for chat calls -----\n\n/**\n * Returns whether the active RTC provider (e.g. LiveKit) is configured for media calls.\n * Prefer passing `rtc` when calling outside an Angular injection context.\n */\nexport async function axmIsChatCallRtcConfigured(\n deps?: Pick<AXMChatCallRtcReadyDeps, 'rtc'>,\n): Promise<boolean> {\n const rtc = deps?.rtc !== undefined ? deps.rtc : inject(AXPRtcApiAbstract, { optional: true });\n if (!rtc) {\n return false;\n }\n try {\n return (await firstValueFrom(rtc.isConfigured())) === true;\n } catch {\n return false;\n }\n}\n\n/**\n * Ensures RTC is configured before opening a media call. Shows an i18n toast when not.\n * Prefer passing deps when calling outside an Angular injection context.\n */\nexport async function axmEnsureChatCallRtcReady(deps?: AXMChatCallRtcReadyDeps): Promise<boolean> {\n const configured = await axmIsChatCallRtcConfigured({ rtc: deps?.rtc });\n if (configured) {\n return true;\n }\n\n if (deps?.showToast === false) {\n return false;\n }\n\n const translation = deps?.translation ?? inject(AXTranslationService);\n const toast = deps?.toast ?? inject(AXToastService);\n const content = await translation.translateAsync('@conversation:chat.call.rtc-not-configured');\n toast.show({\n color: 'danger',\n content,\n location: 'bottom-center',\n timeOut: 4000,\n });\n return false;\n}\n\n//#endregion\n","//#region ----- Constants -----\n\nconst CHAT_CALL_DARK_CONTEXT_ID = 'axm-chat-call-dark-context';\n\n//#endregion\n\n//#region ----- Popup theme -----\n\n/**\n * Hidden `ax-dark` node for popup `contextElement`.\n * Overlay visual-context copies theme from this element; `panelClass: 'ax-dark'`\n * is stripped when the app root is light.\n */\nexport function axmChatCallDarkThemeContextElement(): HTMLElement | undefined {\n if (typeof document === 'undefined') {\n return undefined;\n }\n\n const existing = document.getElementById(CHAT_CALL_DARK_CONTEXT_ID);\n if (existing) {\n return existing;\n }\n\n const element = document.createElement('div');\n element.id = CHAT_CALL_DARK_CONTEXT_ID;\n element.className = 'ax-dark';\n element.setAttribute('hidden', '');\n element.setAttribute('aria-hidden', 'true');\n element.style.display = 'none';\n document.body.appendChild(element);\n return element;\n}\n\n//#endregion\n","//#region ----- Imports -----\n\nimport type { AXConversation } from '@acorex/components/conversation';\nimport { AXPopupService } from '@acorex/components/popup';\nimport { inject } from '@angular/core';\n\nimport { axmChatCallDarkThemeContextElement } from './chat-call-popup-theme.util';\nimport type { AXMChatCallStartPopupData } from './chat-call-start-popup.component';\n\n//#endregion\n\n//#region ----- Types -----\n\nexport interface AXMOpenChatCallStartDialogOptions {\n conversation: AXConversation;\n popupService?: AXPopupService;\n}\n\n//#endregion\n\n//#region ----- Dialog -----\n\n/**\n * Opens the call-start chooser as an in-app popup.\n * Prefer passing {@link AXMOpenChatCallStartDialogOptions.popupService} when the\n * caller may already have awaited (injection context lost after `await`).\n */\nexport async function axmOpenChatCallStartDialog(\n options: AXMOpenChatCallStartDialogOptions,\n): Promise<void> {\n const conversation = options.conversation;\n if (!conversation?.id?.trim()) {\n return;\n }\n\n // Capture DI before any await (dynamic import below).\n const popupService = options.popupService ?? inject(AXPopupService);\n const comp = (await import('./chat-call-start-popup.component')).AXMChatCallStartPopupComponent;\n\n const data: AXMChatCallStartPopupData = { conversation };\n\n await popupService.open(comp, {\n header: false,\n closeButton: false,\n footer: false,\n size: 'sm',\n closeOnBackdropClick: true,\n panelClass: ['animate-fadeIn', 'animate-fast', 'axm-chat-call-start-overlay'],\n contextElement: axmChatCallDarkThemeContextElement(),\n data,\n });\n}\n\n//#endregion\n","import {\n AXConversation,\n AXConversationInfoBarService,\n} from '@acorex/components/conversation';\nimport { AXMConversationEntityStoreService } from '../../services/conversation-entity-store.service';\nimport { AXTranslationModule } from '@acorex/core/translation';\nimport { AXPAiAssistChatModelCatalogService } from '@acorex-platform/module-ai-management-client';\nimport { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, effect, inject, input, signal } from '@angular/core';\n\nimport { AXMAssistChatDebugModeService } from '../actions/assist-chat-debug-mode.service';\nimport { AXM_CHAT_ASSIST_CATALOG_PORT, type AXMChatAssistCatalogPort } from '../../services/chat-assist-catalog.port';\nimport { axmConversationHasAiChat, axmExtractModelEntityIdFromMetadata } from '../utils/assist-metadata.util';\n\n@Component({\n selector: 'axm-chat-info-bar-assist-model-action',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [CommonModule, AXTranslationModule],\n template: `\n @if (isAssistConversation() && assistDebugMode.active()) {\n <div\n class=\"axm-chat-assist-model-action text-sm\"\n [class.text-danger]=\"error()\"\n [class.text-default/80]=\"!error()\"\n [attr.aria-label]=\"ariaLabel()\"\n >\n @if (error()) {\n <span>{{ '@ai-management:chat.model-unavailable' | translate | async }}</span>\n } @else if (resolvedModelTitle()) {\n <span>{{ resolvedModelTitle() }}</span>\n }\n </div>\n }\n `,\n styles: [\n `\n :host {\n display: block;\n width: 100%;\n }\n\n .axm-chat-assist-model-action {\n width: min(100%, 24rem);\n }\n `,\n ],\n})\nexport class AXMChatInfoBarAssistModelActionComponent {\n //#region ---- Inputs ----\n\n readonly conversation = input.required<AXConversation>();\n readonly service = input<AXConversationInfoBarService | undefined>(undefined);\n\n //#endregion\n\n //#region ---- Services & Dependencies ----\n\n private readonly modelCatalog = inject(AXPAiAssistChatModelCatalogService);\n protected readonly assistDebugMode = inject(AXMAssistChatDebugModeService);\n private readonly entityStore = inject(AXMConversationEntityStoreService);\n private readonly assistCatalog = inject(AXM_CHAT_ASSIST_CATALOG_PORT, { optional: true });\n\n //#endregion\n\n //#region ---- State ----\n\n readonly error = signal(false);\n readonly resolvedModelTitle = signal<string | undefined>(undefined);\n readonly isAssistConversation = signal(false);\n\n readonly ariaLabel = computed(() => this.resolvedModelTitle() ?? '');\n\n private currentConversationId: string | null = null;\n\n //#endregion\n\n //#region ---- Effects ----\n\n private readonly loadOnConversationChange = effect(() => {\n const conversation = this.conversation();\n void this.syncModels(conversation);\n });\n\n //#endregion\n\n //#region ---- Utilities ----\n\n private async syncModels(conversation: AXConversation | null): Promise<void> {\n if (!conversation) {\n this.reset();\n return;\n }\n\n if (!axmConversationHasAiChat(conversation.metadata)) {\n this.reset();\n return;\n }\n\n const assistId = this.getAssistId(conversation);\n if (!assistId) {\n this.reset();\n return;\n }\n\n if (conversation.id === this.currentConversationId) {\n return;\n }\n\n this.currentConversationId = conversation.id;\n this.isAssistConversation.set(true);\n this.error.set(false);\n\n try {\n let modelEntityId = axmExtractModelEntityIdFromMetadata(conversation.metadata);\n\n if (!modelEntityId) {\n if (!this.assistCatalog) {\n this.error.set(true);\n this.resolvedModelTitle.set(undefined);\n return;\n }\n const assist =\n this.assistCatalog.getCachedAssist(assistId) ?? (await this.assistCatalog.getAssist(assistId));\n modelEntityId = assist?.modelId?.trim() ?? undefined;\n if (modelEntityId) {\n this.persistModelToMetadata(conversation.id, modelEntityId);\n }\n }\n\n if (!modelEntityId) {\n this.error.set(true);\n this.resolvedModelTitle.set(undefined);\n return;\n }\n\n const rows = await this.modelCatalog.listModels({ assistId });\n const title = rows.find((r) => r.id === modelEntityId)?.title?.trim();\n this.resolvedModelTitle.set(title ?? modelEntityId);\n } catch {\n this.error.set(true);\n this.resolvedModelTitle.set(undefined);\n }\n }\n\n /** Writes modelEntityId into conversation metadata (in-memory store + IndexedDB). */\n private persistModelToMetadata(conversationId: string, modelEntityId: string): void {\n void this.entityStore.updateConversationMetadata(conversationId, { modelEntityId });\n }\n\n private reset(): void {\n this.currentConversationId = null;\n this.isAssistConversation.set(false);\n this.error.set(false);\n this.resolvedModelTitle.set(undefined);\n }\n\n private getAssistId(conversation: AXConversation): string | null {\n const raw = conversation.metadata?.['assistId'];\n if (typeof raw === 'string' && raw.trim()) {\n return raw.trim();\n }\n\n for (const participant of conversation.participants ?? []) {\n const participantAssistId = participant.metadata?.['assistId'];\n if (typeof participantAssistId === 'string' && participantAssistId.trim()) {\n return participantAssistId.trim();\n }\n }\n return null;\n }\n\n //#endregion\n}\n","//#region ---- Imports ----\n\nimport { AXSwitchModule } from '@acorex/components/switch';\nimport type { AXConversation, AXConversationInfoBarService } from '@acorex/components/conversation';\nimport { AXTranslationModule } from '@acorex/core/translation';\nimport { AsyncPipe } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, inject, input } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\n\nimport { AXMAssistChatDebugModeService } from '../actions/assist-chat-debug-mode.service';\n\n//#endregion\n\n//#region ---- Component ----\n\n@Component({\n selector: 'axm-chat-info-bar-debug-switch',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [FormsModule, AXSwitchModule, AXTranslationModule, AsyncPipe],\n template: `\n @if (debugMode.isSystemDebugEnabled()) {\n <div class=\"axm-chat-debug-switch flex items-center gap-2 text-sm text-default/80\">\n <span>{{ '@conversation:chat.debug-mode' | translate | async }}:</span>\n <ax-switch\n [ngModel]=\"debugMode.sessionEnabled()\"\n (ngModelChange)=\"onSessionToggle($event)\"\n ></ax-switch>\n </div>\n }\n `,\n styles: [\n `\n :host {\n display: block;\n }\n `,\n ],\n})\nexport class AXMChatInfoBarDebugSwitchComponent {\n //#region ---- Inputs ----\n\n readonly conversation = input.required<AXConversation>();\n readonly service = input<AXConversationInfoBarService | undefined>(undefined);\n\n //#endregion\n\n //#region ---- Services & Dependencies ----\n\n protected readonly debugMode = inject(AXMAssistChatDebugModeService);\n\n //#endregion\n\n //#region ---- Event Handlers ----\n\n protected onSessionToggle(enabled: boolean): void {\n this.debugMode.setSessionEnabled(enabled);\n }\n\n //#endregion\n}\n\n//#endregion\n","import type { AXConversation, AXConversationInfoBarAction } from '@acorex/components/conversation';\nimport { AXPopupService } from '@acorex/components/popup';\nimport { AXToastService } from '@acorex/components/toast';\nimport { AXTranslationService } from '@acorex/core/translation';\nimport { AXPRtcApiAbstract } from '@acorex-platform/extension-rtc-core-gateway';\nimport { inject } from '@angular/core';\n\nimport { axmIsAssistChatSystemDebugEnabled } from '../actions/assist-chat-debug-mode.service';\nimport { axmEnsureChatCallRtcReady } from '../call/chat-call-rtc-ready.util';\nimport { axmOpenChatCallStartDialog } from '../call/open-chat-call-start.dialog';\nimport { axmConversationHasAiChat } from '../utils/assist-metadata.util';\nimport { AXMChatInfoBarAssistModelActionComponent } from './chat-info-bar-assist-model-action.component';\nimport { AXMChatInfoBarDebugSwitchComponent } from './chat-info-bar-debug-switch.component';\n\n/** True when the conversation is an assist chat. */\nfunction conversationHasAssistContext(conversation: AXConversation): boolean {\n if (axmConversationHasAiChat(conversation.metadata)) {\n return true;\n }\n for (const participant of conversation.participants ?? []) {\n if (typeof participant.id === 'string' && participant.id.startsWith('assist-')) {\n return true;\n }\n }\n return false;\n}\n\nexport const AXM_CHAT_INFO_BAR_ASSIST_MODEL_ACTION: AXConversationInfoBarAction = {\n id: 'assist-model',\n label: '@conversation:support.model',\n icon: 'fa-light fa-sparkles',\n location: 'inline',\n fullWidthComponent: false,\n priority: 210,\n toggleable: true,\n component: AXMChatInfoBarAssistModelActionComponent,\n visible: (context) => conversationHasAssistContext(context.conversation),\n};\n\nexport const AXM_CHAT_INFO_BAR_DEBUG_ACTION: AXConversationInfoBarAction = {\n id: 'assist-debug',\n label: '@conversation:chat.debug-mode',\n location: 'inline',\n fullWidthComponent: false,\n priority: 215,\n component: AXMChatInfoBarDebugSwitchComponent,\n visible: () => axmIsAssistChatSystemDebugEnabled(),\n};\n\nexport const AXM_CHAT_INFO_BAR_CALL_ACTION: AXConversationInfoBarAction = {\n id: 'call',\n label: '@conversation:chat.actions.call',\n icon: 'fa-light fa-phone',\n tooltip: '@conversation:chat.actions.call',\n location: 'inline',\n fullWidthComponent: false,\n priority: 205,\n handler: async (context) => {\n // Resolve DI synchronously — info-bar runs the handler in runInInjectionContext,\n // but that context is lost after the first await.\n const popupService = inject(AXPopupService);\n const rtc = inject(AXPRtcApiAbstract, { optional: true });\n const translation = inject(AXTranslationService);\n const toast = inject(AXToastService);\n\n if (!context.conversation?.id?.trim()) {\n return;\n }\n if (!(await axmEnsureChatCallRtcReady({ rtc, translation, toast }))) {\n return;\n }\n await axmOpenChatCallStartDialog({\n conversation: context.conversation,\n popupService,\n });\n },\n};\n","//#region ---- Imports ----\n\nimport { AXP_APP_STARTUP_PRIORITY, provideAppStartUpTask } from '@acorex-platform/framework-client/core';\nimport { AXPUserAvatarComponent } from '@acorex-platform/framework-client/layout/components';\nimport {\n AX_CONVERSATION_AUDIO_RENDERER,\n AX_CONVERSATION_COMPOSER_EMOJI_TAB,\n AX_CONVERSATION_COMPOSER_STICKER_TAB,\n AX_CONVERSATION_ERROR_HANDLER_CONFIG,\n AX_CONVERSATION_FILE_RENDERER,\n AX_CONVERSATION_IMAGE_RENDERER,\n // AX_CONVERSATION_INFO_BAR_BLOCK_ACTION,\n AX_CONVERSATION_INFO_BAR_DELETE_ACTION,\n AX_CONVERSATION_INFO_BAR_DIVIDER,\n AX_CONVERSATION_INFO_BAR_MUTE_ACTION,\n AX_CONVERSATION_INFO_BAR_SEARCH_ACTION,\n // AX_CONVERSATION_ITEM_BLOCK_ACTION,\n AX_CONVERSATION_ITEM_DELETE_ACTION,\n AX_CONVERSATION_ITEM_DIVIDER,\n AX_CONVERSATION_ITEM_MARK_READ_ACTION,\n AX_CONVERSATION_ITEM_MUTE_ACTION,\n AX_CONVERSATION_ITEM_PIN_ACTION,\n AX_CONVERSATION_LOCATION_RENDERER,\n AX_CONVERSATION_MESSAGE_DELETE_ACTION,\n AX_CONVERSATION_MESSAGE_EDIT_ACTION,\n AX_CONVERSATION_MESSAGE_FORWARD_ACTION,\n AX_CONVERSATION_MESSAGE_REPLY_ACTION,\n AX_CONVERSATION_STICKER_RENDERER,\n AX_CONVERSATION_TAB_ALL,\n AX_CONVERSATION_TAB_GROUPS,\n AX_CONVERSATION_TAB_PRIVATE,\n AX_CONVERSATION_VIDEO_RENDERER,\n AX_CONVERSATION_VOICE_RENDERER,\n AXConversation,\n AXConversationApi,\n AXConversationComposerService,\n AXConversationMessage,\n AXConversationMessageApi,\n AXConversationRealtimeApi,\n AXConversationService,\n AXConversationUserApi,\n AXConversationUserAvatarComponent,\n provideConversation,\n} from '@acorex/components/conversation';\nimport { inject, Type } from '@angular/core';\nimport { AXM_CHAT_COMPOSER_VOICE_RECORDING_ACTION } from './plugins/composer/chat-voice-recording-composer.action';\nimport { AXM_CONVERSATION_BOT_RENDERER } from './plugins/message-renderers/assist-message-renderer.plugin';\nimport { AXM_CONVERSATION_CALL_LOG_RENDERER } from './plugins/message-renderers/chat-call-log-message-renderer.plugin';\nimport { AXM_CONVERSATION_NODE_RENDERER } from './plugins/message-renderers/node-message-renderer.plugin';\nimport { AXMChatConversationApi, AXMChatMessageApi, AXMChatRealtimeApi, AXMChatUserApi } from './plugins/services/chat-conversation-apis.abstract';\nimport { AXMChatEntityConversationApi, AXMChatEntityConversationFocusHandler, AXMChatEntityConversationRoomQueryService, AXMChatEntityMessageApi, AXMChatEntityRealtimeApi, AXMChatEntityUserApi } from './plugins/services/entity';\nimport { AXM_CONVERSATION_TAB_BOT } from './plugins/tabs/chat-conversation-tabs';\nimport { AXMConversationSessionSyncService } from './services/conversation-session-sync.service';\nimport { AXMConversationTypingSyncService } from './services/conversation-typing-sync.service';\nimport {\n AXM_CHAT_INFO_BAR_CALL_ACTION,\n AXM_CHAT_INFO_BAR_DEBUG_ACTION,\n} from './plugins/info-bar-actions/chat-info-bar-actions';\n\n//#endregion\n\n//#region ---- Assist conversation helpers ----\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n\nfunction extractMessageCopyText(message: AXConversationMessage | null | undefined): string {\n if (!message) {\n return '';\n }\n\n if (!isRecord(message.payload)) {\n return '';\n }\n\n const payloadText = message.payload['text'];\n if (typeof payloadText === 'string') {\n return payloadText.trim();\n }\n\n const payloadContent = message.payload['content'];\n if (typeof payloadContent === 'string') {\n return payloadContent.trim();\n }\n\n const payloadResponses = message.payload['responses'];\n if (Array.isArray(payloadResponses)) {\n const collected = payloadResponses\n .map((response) => {\n if (!isRecord(response)) {\n return '';\n }\n const content = response['content'];\n return typeof content === 'string' ? content.trim() : '';\n })\n .filter((part) => part.length > 0)\n .join('\\n\\n')\n .trim();\n if (collected.length > 0) {\n return collected;\n }\n }\n\n return '';\n}\n\nasync function copyMessageText(message: AXConversationMessage): Promise<void> {\n const copyText = extractMessageCopyText(message);\n if (!copyText) {\n return;\n }\n await globalThis.navigator?.clipboard?.writeText?.(copyText);\n}\n\n//#endregion\n\n//#region ---- Providers ----\n\n/**\n * Registers `@acorex/components/conversation` for the whole conversation module so\n * {@link AXConversationService} is available outside {@link AXMChatComponent} (e.g. org chart contributions).\n */\nexport const AXM_CHAT_CONVERSATION_PROVIDERS = [\n AXMConversationTypingSyncService,\n AXMChatEntityUserApi,\n AXMChatEntityConversationFocusHandler,\n AXMChatEntityConversationRoomQueryService,\n AXMChatEntityConversationApi,\n AXMChatEntityMessageApi,\n AXMChatEntityRealtimeApi,\n ...provideConversation({\n userApi: AXMChatEntityUserApi as unknown as Type<AXConversationUserApi>,\n conversationApi: AXMChatEntityConversationApi as unknown as Type<AXConversationApi>,\n messageApi: AXMChatEntityMessageApi as unknown as Type<AXConversationMessageApi>,\n realtimeApi: AXMChatEntityRealtimeApi as unknown as Type<AXConversationRealtimeApi>,\n avatarComponents: {\n user: AXPUserAvatarComponent as unknown as Type<AXConversationUserAvatarComponent>,\n },\n config: {\n messagePageSize: 30,\n conversationPageSize: 20,\n infiniteScrollThreshold: 200,\n scrollThreshold: 100,\n maxFilesPerMessage: 3,\n debugApiLogging: true,\n typingIndicatorThrottle: 150,\n typingIndicatorTimeout: 2500,\n },\n registry: {\n messageRenderers: [\n AXM_CONVERSATION_CALL_LOG_RENDERER,\n AXM_CONVERSATION_BOT_RENDERER,\n AXM_CONVERSATION_NODE_RENDERER,\n // AX_CONVERSATION_TEXT_RENDERER,\n AX_CONVERSATION_IMAGE_RENDERER,\n AX_CONVERSATION_VIDEO_RENDERER,\n AX_CONVERSATION_AUDIO_RENDERER,\n {\n ...AX_CONVERSATION_VOICE_RENDERER,\n composerActions: [AXM_CHAT_COMPOSER_VOICE_RECORDING_ACTION],\n },\n AX_CONVERSATION_FILE_RENDERER,\n AX_CONVERSATION_LOCATION_RENDERER,\n AX_CONVERSATION_STICKER_RENDERER,\n ],\n messageActions: [\n {\n id: 'copy-message',\n label: '@conversation:chat.actions.copy',\n icon: 'fa-light fa-copy',\n priority: 95,\n visible: (message: AXConversationMessage) => extractMessageCopyText(message).length > 0,\n enabled: (message: AXConversationMessage) => extractMessageCopyText(message).length > 0,\n handler: async (context: { message: AXConversationMessage }) => {\n await copyMessageText(context.message);\n },\n },\n {\n ...AX_CONVERSATION_MESSAGE_REPLY_ACTION,\n visible: (arg: AXConversationMessage) => arg.metadata?.['isAssistResponse'] !== true,\n handler: async (context: { message: AXConversationMessage }) => {\n const composer = inject(AXConversationComposerService);\n composer.startReply(context.message);\n },\n },\n AX_CONVERSATION_MESSAGE_FORWARD_ACTION,\n AX_CONVERSATION_MESSAGE_EDIT_ACTION,\n AX_CONVERSATION_MESSAGE_DELETE_ACTION,\n ],\n composerActions: [\n // AX_CONVERSATION_COMPOSER_EMOJI_ACTION,\n // AX_CONVERSATION_COMPOSER_IMAGE_ACTION,\n // AX_CONVERSATION_COMPOSER_VIDEO_ACTION,\n // AX_CONVERSATION_COMPOSER_FILE_ACTION,\n // AX_CONVERSATION_COMPOSER_AUDIO_ACTION,\n // AX_CONVERSATION_COMPOSER_LOCATION_ACTION,\n ],\n composerTabs: [AX_CONVERSATION_COMPOSER_EMOJI_TAB, AX_CONVERSATION_COMPOSER_STICKER_TAB],\n conversationTabs: [AX_CONVERSATION_TAB_ALL, AX_CONVERSATION_TAB_PRIVATE, AX_CONVERSATION_TAB_GROUPS, AXM_CONVERSATION_TAB_BOT],\n infoBarActions: [\n AX_CONVERSATION_INFO_BAR_SEARCH_ACTION,\n AXM_CHAT_INFO_BAR_CALL_ACTION,\n AX_CONVERSATION_INFO_BAR_MUTE_ACTION,\n AXM_CHAT_INFO_BAR_DEBUG_ACTION,\n AX_CONVERSATION_INFO_BAR_DIVIDER,\n AX_CONVERSATION_INFO_BAR_DELETE_ACTION,\n // AX_CONVERSATION_INFO_BAR_BLOCK_ACTION,\n ],\n conversationItemActions: [\n AX_CONVERSATION_ITEM_MUTE_ACTION,\n {\n ...AX_CONVERSATION_ITEM_PIN_ACTION,\n handler: async (context: { conversation: AXConversation }) => {\n const conversationService = inject(AXConversationService);\n if (context.conversation.pinned) {\n await conversationService.unpinConversation(context.conversation.id);\n return;\n }\n await conversationService.pinConversation(context.conversation.id);\n },\n },\n AX_CONVERSATION_ITEM_MARK_READ_ACTION,\n AX_CONVERSATION_ITEM_DIVIDER,\n { ...AX_CONVERSATION_ITEM_DELETE_ACTION, destructive: true },\n // AX_CONVERSATION_ITEM_BLOCK_ACTION,\n ],\n },\n }),\n { provide: AXMChatUserApi, useExisting: AXMChatEntityUserApi },\n {\n provide: AXMChatConversationApi,\n useExisting: AXMChatEntityConversationApi,\n },\n { provide: AXMChatMessageApi, useExisting: AXMChatEntityMessageApi },\n { provide: AXMChatRealtimeApi, useExisting: AXMChatEntityRealtimeApi },\n { provide: AXConversationUserApi, useExisting: AXMChatEntityUserApi },\n { provide: AXConversationApi, useExisting: AXMChatEntityConversationApi },\n { provide: AXConversationMessageApi, useExisting: AXMChatEntityMessageApi },\n { provide: AXConversationRealtimeApi, useExisting: AXMChatEntityRealtimeApi },\n {\n provide: AX_CONVERSATION_ERROR_HANDLER_CONFIG,\n useValue: { logToConsole: false },\n },\n AXMConversationSessionSyncService,\n provideAppStartUpTask(() => {\n const sync = inject(AXMConversationSessionSyncService);\n return {\n name: 'conversation-session-sync',\n priority: AXP_APP_STARTUP_PRIORITY.conversationSessionSync,\n run: async () => {\n sync.start();\n },\n };\n }),\n];\n\n//#endregion\n","//#region ---- Imports ----\n\nimport { AXButtonModule } from '@acorex/components/button';\nimport { type AXConversation } from '@acorex/components/conversation';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { AXTranslationModule } from '@acorex/core/translation';\nimport {\n AXPStateMessageComponent,\n AXPAvatarComponent,\n} from '@acorex-platform/framework-client/layout/components';\nimport { AsyncPipe } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n inject,\n input,\n OnInit,\n output,\n signal,\n} from '@angular/core';\nimport { axmResolveConversationListAvatar } from '../chat/plugins/utils/chat-avatar.util';\nimport { AXMEntityChatService } from './entity-chat.service';\n\n//#endregion\n\n//#region ---- Component ----\n\n/**\n * Scrollable list of entity-scoped conversations for the mini chat panel.\n * Loads chats via {@link AXMEntityChatService.findEntityConversations}.\n */\n@Component({\n selector: 'axm-mini-chat-history',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n AXButtonModule,\n AXDecoratorModule,\n AXTranslationModule,\n AXPStateMessageComponent,\n AXPAvatarComponent,\n AsyncPipe,\n ],\n template: `\n <div class=\"axm-mini-chat-history flex min-h-0 flex-1 flex-col\">\n <div class=\"min-h-0 flex-1 overflow-auto px-2 py-2\">\n @if (loading()) {\n <div class=\"p-4 text-center text-sm text-muted\">Loading…</div>\n } @else if (conversations().length === 0) {\n <div class=\"axm-mini-chat-history__empty-state\">\n <axp-state-message\n icon=\"fa-light fa-comment\"\n [title]=\"'@conversation:mini-chat.entity-empty-state.title'\"\n [description]=\"\n '@conversation:mini-chat.entity-empty-state.description'\n \"\n >\n <ax-button\n slot=\"actions\"\n color=\"primary\"\n [text]=\"\n ('@conversation:mini-chat.new-chat' | translate | async) ?? ''\n \"\n (onClick)=\"onNewChat()\"\n >\n <ax-prefix\n ><ax-icon icon=\"fa-light fa-plus\"></ax-icon\n ></ax-prefix>\n </ax-button>\n </axp-state-message>\n </div>\n } @else {\n @for (conversation of conversations(); track conversation.id) {\n @let listAvatar = resolveListAvatar(conversation);\n <button\n type=\"button\"\n class=\"axm-mini-chat-history__item flex w-full items-center gap-2 rounded-lg px-3 py-2 text-start hover:opacity-80\"\n (click)=\"onSelect(conversation.id)\"\n >\n <axp-avatar\n [size]=\"32\"\n [fullName]=\"listAvatar.title\"\n [src]=\"listAvatar.avatar\"\n />\n <span class=\"flex-1 truncate text-sm\">{{\n conversation.title\n }}</span>\n </button>\n }\n }\n </div>\n </div>\n `,\n styles: `\n :host {\n display: flex;\n min-height: 0;\n flex: 1;\n flex-direction: column;\n }\n\n .axm-mini-chat-history__item {\n color: inherit;\n }\n `,\n})\nexport class AXMMiniChatHistoryComponent implements OnInit {\n //#region ---- Services & Dependencies ----\n\n private readonly entityChatService = inject(AXMEntityChatService);\n\n //#endregion\n\n //#region ---- Inputs / Outputs ----\n\n readonly entityId = input.required<string>();\n readonly entityType = input.required<string>();\n\n /** Emits when the user picks a conversation from the list. */\n readonly conversationSelected = output<string>();\n\n /** Emits when the user starts a new chat from the empty state. */\n readonly newChatRequested = output<void>();\n\n /** Emits whether the loaded history contains at least one conversation. */\n readonly hasConversationsChange = output<boolean>();\n\n //#endregion\n\n //#region ---- State ----\n\n readonly conversations = signal<AXConversation[]>([]);\n readonly loading = signal(false);\n\n //#endregion\n\n //#region ---- Lifecycle ----\n\n ngOnInit(): void {\n void this.refresh();\n }\n\n //#endregion\n\n //#region ---- Public Methods ----\n\n /** Reloads the entity conversation list (call when the history panel becomes visible). */\n async refresh(): Promise<void> {\n this.loading.set(true);\n try {\n const items = await this.entityChatService.findEntityConversations({\n entityId: this.entityId(),\n entityType: this.entityType(),\n });\n this.conversations.set(items);\n this.hasConversationsChange.emit(items.length > 0);\n } catch (error: unknown) {\n console.error('Failed to load entity mini chat history:', error);\n this.conversations.set([]);\n this.hasConversationsChange.emit(false);\n } finally {\n this.loading.set(false);\n }\n }\n\n //#endregion\n\n //#region ---- UI Handlers ----\n\n protected resolveListAvatar(conversation: AXConversation) {\n return axmResolveConversationListAvatar(conversation);\n }\n\n protected onSelect(conversationId: string): void {\n this.conversationSelected.emit(conversationId);\n }\n\n protected onNewChat(): void {\n this.newChatRequested.emit();\n }\n\n //#endregion\n}\n\n//#endregion\n","import type { AXConversation } from '@acorex/components/conversation';\nimport { InjectionToken } from '@angular/core';\n\nexport type AXMMiniChatInboxConversationFilter = (conversation: AXConversation) => boolean;\n\nexport const AXM_MINI_CHAT_INBOX_CONVERSATION_FILTER = new InjectionToken<AXMMiniChatInboxConversationFilter>(\n 'AXM_MINI_CHAT_INBOX_CONVERSATION_FILTER',\n);\n","//#region ---- Imports ----\n\nimport { AXButtonModule } from '@acorex/components/button';\nimport { type AXConversation } from '@acorex/components/conversation';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { AXTranslationModule } from '@acorex/core/translation';\nimport { AXPStateMessageComponent, AXPAvatarComponent } from '@acorex-platform/framework-client/layout/components';\nimport { AsyncPipe } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, inject, OnInit, output, signal } from '@angular/core';\nimport { axmResolveConversationListAvatar } from '../chat/plugins/utils/chat-avatar.util';\nimport { AXMChatConversationApi } from '../chat/plugins/services/chat-conversation-apis.abstract';\nimport { AXM_MINI_CHAT_INBOX_CONVERSATION_FILTER } from './mini-chat-inbox-filter.provider';\nimport { axmConversationIsEntityChat } from './entity-chat.util';\n\n//#endregion\n\n//#region ---- Component ----\n\n/**\n * Compact scrollable list of inbox AI-assist chats (non-entity bot / assist conversations).\n */\n@Component({\n selector: 'axm-mini-chat-inbox-history',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [AXButtonModule, AXDecoratorModule, AXTranslationModule, AXPStateMessageComponent, AXPAvatarComponent, AsyncPipe],\n template: `\n <div class=\"axm-mini-chat-inbox-history flex min-h-0 flex-1 flex-col\">\n <div class=\"min-h-0 flex-1 overflow-auto px-2 py-2\">\n @if (loading()) {\n <div class=\"p-4 text-center text-sm text-muted\">\n {{ '@conversation:mini-chat.loading' | translate | async }}\n </div>\n } @else if (conversations().length === 0) {\n <div class=\"axm-mini-chat-inbox-history__empty-state\">\n <axp-state-message\n icon=\"fa-light fa-robot\"\n [title]=\"'@conversation:mini-chat.inbox-empty-state.title'\"\n [description]=\"'@conversation:mini-chat.inbox-empty-state.description'\"\n >\n <ax-button\n slot=\"actions\"\n color=\"primary\"\n [text]=\"('@conversation:mini-chat.new-chat' | translate | async) ?? ''\"\n (onClick)=\"onNewChat()\"\n >\n <ax-prefix><ax-icon icon=\"fa-light fa-plus\"></ax-icon></ax-prefix>\n </ax-button>\n </axp-state-message>\n </div>\n } @else {\n @for (conversation of conversations(); track conversation.id) {\n @let listAvatar = resolveListAvatar(conversation);\n <button\n type=\"button\"\n class=\"axm-mini-chat-inbox-history__item flex w-full items-center gap-2 rounded-lg px-3 py-2 text-start hover:opacity-80\"\n (click)=\"onSelect(conversation.id)\"\n >\n <axp-avatar\n [size]=\"32\"\n [fullName]=\"listAvatar.title\"\n [src]=\"listAvatar.avatar\"\n />\n <span class=\"flex-1 truncate text-sm\">{{ conversation.title }}</span>\n </button>\n }\n }\n </div>\n </div>\n `,\n styles: `@reference '@acorex/styles/themes/default.css';\n\n :host {\n display: flex;\n min-height: 0;\n flex: 1;\n flex-direction: column;\n }\n\n .axm-mini-chat-inbox-history__item {\n color: inherit;\n }\n `,\n})\nexport class AXMMiniChatInboxHistoryComponent implements OnInit {\n //#region ---- Services & Dependencies ----\n\n private readonly conversationApi = inject(AXMChatConversationApi);\n private readonly conversationFilter = inject(AXM_MINI_CHAT_INBOX_CONVERSATION_FILTER, { optional: true });\n\n //#endregion\n\n //#region ---- Outputs ----\n\n /** Emits when the user picks a conversation from the list. */\n readonly conversationSelected = output<string>();\n\n /** Emits when the user starts a new chat from the empty state. */\n readonly newChatRequested = output<void>();\n\n /** Emits whether the loaded history contains at least one conversation. */\n readonly hasConversationsChange = output<boolean>();\n\n //#endregion\n\n //#region ---- State ----\n\n readonly conversations = signal<AXConversation[]>([]);\n readonly loading = signal(false);\n\n //#endregion\n\n //#region ---- Lifecycle ----\n\n ngOnInit(): void {\n void this.refresh();\n }\n\n //#endregion\n\n //#region ---- Public Methods ----\n\n /** Reloads AI-assist inbox conversations. */\n async refresh(): Promise<void> {\n this.loading.set(true);\n try {\n const result = await this.conversationApi.getConversations({ page: 0, pageSize: 100 });\n const items = (result.items ?? []).filter(\n (conversation) =>\n !axmConversationIsEntityChat(conversation.metadata) &&\n (this.conversationFilter ? this.conversationFilter(conversation) : true),\n );\n this.conversations.set(items);\n this.hasConversationsChange.emit(items.length > 0);\n } catch (error: unknown) {\n console.error('Failed to load inbox AI assist mini chat history:', error);\n this.conversations.set([]);\n this.hasConversationsChange.emit(false);\n } finally {\n this.loading.set(false);\n }\n }\n\n //#endregion\n\n //#region ---- UI Handlers ----\n\n protected resolveListAvatar(conversation: AXConversation) {\n return axmResolveConversationListAvatar(conversation);\n }\n\n protected onSelect(conversationId: string): void {\n this.conversationSelected.emit(conversationId);\n }\n\n protected onNewChat(): void {\n this.newChatRequested.emit();\n }\n\n //#endregion\n}\n\n//#endregion\n","import type { AXPAiChatMessageLite } from './ai-chat-lite.types';\n\nconst ASSIST_INITIAL_MESSAGES_MAX_LENGTH = 16_000;\n\nfunction stripAssistInitialHtmlToPlain(raw: string): string {\n let s = raw\n .replace(/<\\/p>\\s*(?:<br\\s*\\/?>\\s*)*<p[^>]*>/gi, '\\n\\n')\n .replace(/<\\/p>\\s*<p[^>]*>/gi, '\\n\\n')\n .replace(/<br\\s*\\/?>/gi, '\\n');\n s = s.replace(/<\\/(div|h[1-6]|li|tr)>/gi, '\\n');\n s = s.replace(/<[^>]+>/g, '');\n s = s\n .replace(/&nbsp;/gi, ' ')\n .replace(/&amp;/g, '&')\n .replace(/&lt;/g, '<')\n .replace(/&gt;/g, '>')\n .replace(/&quot;/g, '\"')\n .replace(/&#39;/g, \"'\");\n s = s.replace(/\\r\\n/g, '\\n').trim();\n if (s.length > ASSIST_INITIAL_MESSAGES_MAX_LENGTH) {\n s = s.slice(0, ASSIST_INITIAL_MESSAGES_MAX_LENGTH).trimEnd() + '…';\n }\n return s;\n}\n\nfunction aiChatTextMessage(role: AXPAiChatMessageLite['role'], text: string): AXPAiChatMessageLite {\n return {\n role,\n responses: [{ type: 'text', content: text }],\n };\n}\n\nexport function axmAssistInitialMessagesToTranscriptLite(raw: string | null | undefined): AXPAiChatMessageLite[] {\n const trimmed = raw?.trim() ?? '';\n if (!trimmed) {\n return [];\n }\n const plain = stripAssistInitialHtmlToPlain(trimmed);\n if (!plain) {\n return [];\n }\n const blocks = plain\n .split(/\\n{2,}/)\n .map((b) => b.replace(/\\n+/g, ' ').trim())\n .filter((b) => b.length > 0);\n if (blocks.length === 0) {\n return [];\n }\n return blocks.map((text) => aiChatTextMessage('assistant', text));\n}\n\nexport function axmAiChatMessageGetTextLite(message: AXPAiChatMessageLite): string {\n const parts: string[] = [];\n for (const r of message.responses) {\n if (r.type === 'text') {\n parts.push(r.content);\n } else if (r.type === 'node' || r.type === 'followUp') {\n try {\n parts.push(JSON.stringify({ type: r.type, content: r.content }));\n } catch {\n parts.push(`[${r.type}]`);\n }\n }\n }\n return parts.join('\\n\\n');\n}\n","//#region ---- Imports ----\n\nimport { AXTranslationModule, AXTranslationService } from '@acorex/core/translation';\nimport type { AXConversation, AXConversationType } from '@acorex/components/conversation';\nimport { AsyncPipe } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, inject, input } from '@angular/core';\n\n//#endregion\n\n//#region ---- Component ----\n\n/**\n * Mirrors conversation default empty state when assist welcome content is not configured.\n */\n@Component({\n selector: 'axm-chat-message-list-empty-fallback',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [AsyncPipe, AXTranslationModule],\n host: {\n class: 'ax-message-empty-host',\n },\n template: `\n <div class=\"ax-message-empty\" role=\"status\" [attr.aria-label]=\"('@acorex:chat.status.no-messages' | translate | async) ?? ''\">\n <div class=\"ax-message-empty__ambient\" aria-hidden=\"true\">\n <span class=\"ax-message-empty__grid\"></span>\n </div>\n\n <div class=\"ax-message-empty__card\">\n <div class=\"ax-message-empty__icon-stack\">\n <span class=\"ax-message-empty__pulse\" aria-hidden=\"true\"></span>\n <div class=\"ax-message-empty__icon-bg\">\n <i [class]=\"iconClass()\" aria-hidden=\"true\"></i>\n </div>\n </div>\n\n <p class=\"ax-message-empty__eyebrow\">{{ eyebrowLabel() }}</p>\n <h3 class=\"ax-message-empty__title\">{{ ('@acorex:chat.empty.no-messages-yet' | translate | async) ?? '' }}</h3>\n <p class=\"ax-message-empty__desc\">\n {{ descriptionPrefix() }}\n <span class=\"ax-message-empty__name\">{{ conversation().title }}</span>.\n </p>\n </div>\n </div>\n `,\n styles: `\n :host.ax-message-empty-host {\n display: block;\n width: 100%;\n max-width: min(24rem, 100%);\n margin-inline: auto;\n }\n\n .ax-message-empty {\n position: relative;\n isolation: isolate;\n padding: 0.25rem;\n }\n\n .ax-message-empty__ambient {\n position: absolute;\n top: -2rem;\n right: -1rem;\n bottom: -1rem;\n left: -1rem;\n z-index: 0;\n pointer-events: none;\n overflow: hidden;\n border-radius: 2rem;\n }\n\n .ax-message-empty__grid {\n position: absolute;\n inset: 0;\n background-image:\n linear-gradient(rgba(var(--ax-sys-color-on-surface), 0.04) 1px, transparent 1px),\n linear-gradient(90deg, rgba(var(--ax-sys-color-on-surface), 0.04) 1px, transparent 1px);\n background-size: 24px 24px;\n mask-image: radial-gradient(ellipse 80% 70% at 50% 45%, black 20%, transparent 75%);\n opacity: 0.5;\n }\n\n .ax-message-empty__card {\n position: relative;\n z-index: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n text-align: center;\n padding: 2rem 1.75rem 2.125rem;\n border-radius: 1.25rem;\n border: 1px solid rgba(var(--ax-sys-color-border-light-surface), 0.85);\n background: linear-gradient(\n 165deg,\n rgba(var(--ax-sys-color-lightest-surface), 0.72),\n rgba(var(--ax-sys-color-surface), 0.55)\n );\n }\n\n .ax-message-empty__icon-stack {\n position: relative;\n display: grid;\n place-items: center;\n margin-bottom: 1.25rem;\n }\n\n .ax-message-empty__pulse {\n position: absolute;\n width: 5.5rem;\n height: 5.5rem;\n border-radius: 50%;\n background: radial-gradient(circle, rgba(var(--ax-sys-color-primary-500), 0.22), transparent 70%);\n animation: axm-empty-pulse 3.2s ease-in-out infinite;\n }\n\n .ax-message-empty__icon-bg {\n position: relative;\n display: grid;\n place-items: center;\n width: 4.25rem;\n height: 4.25rem;\n border-radius: 1.125rem;\n background: linear-gradient(\n 145deg,\n rgba(var(--ax-sys-color-primary-500), 0.16),\n rgba(var(--ax-sys-color-primary-600), 0.06)\n );\n border: 1px solid rgba(var(--ax-sys-color-primary-500), 0.22);\n box-shadow:\n 0 1px rgba(var(--ax-sys-color-on-primary-surface), 0.06) inset,\n 0 12px 28px -16px rgba(var(--ax-sys-color-primary-600), 0.45);\n }\n\n .ax-message-empty__icon-bg i {\n font-size: 1.875rem;\n line-height: 1;\n color: rgb(var(--ax-sys-color-primary-600));\n opacity: 0.92;\n }\n\n .ax-message-empty__eyebrow {\n margin: 0 0 0.35rem;\n font-size: 0.6875rem;\n font-weight: 600;\n letter-spacing: 0.14em;\n text-transform: uppercase;\n color: rgb(var(--ax-sys-color-primary-600));\n opacity: 0.85;\n }\n\n .ax-message-empty__title {\n margin: 0 0 0.65rem;\n font-size: 1.375rem;\n font-weight: 600;\n letter-spacing: -0.03em;\n line-height: 1.25;\n color: rgb(var(--ax-sys-color-on-surface));\n }\n\n .ax-message-empty__desc {\n margin: 0;\n font-size: 0.9375rem;\n line-height: 1.65;\n color: rgb(var(--ax-sys-color-on-surface));\n opacity: 0.62;\n max-width: 20rem;\n }\n\n .ax-message-empty__name {\n font-weight: 600;\n color: rgb(var(--ax-sys-color-on-surface));\n opacity: 0.88;\n }\n\n @keyframes axm-empty-pulse {\n 0%,\n 100% {\n transform: scale(0.92);\n opacity: 0.55;\n }\n 50% {\n transform: scale(1.06);\n opacity: 0.85;\n }\n }\n\n @media (prefers-reduced-motion: reduce) {\n .ax-message-empty__pulse {\n animation: none;\n }\n }\n `,\n})\nexport class AXMChatMessageListEmptyFallbackComponent {\n //#region ---- Inputs ----\n\n readonly conversation = input.required<AXConversation>();\n\n //#endregion\n\n //#region ---- Services & Dependencies ----\n\n private readonly translationService = inject(AXTranslationService);\n\n //#endregion\n\n //#region ---- Computed Properties ----\n\n readonly iconClass = computed(() => iconClassForType(this.conversation().type));\n\n readonly eyebrowLabel = computed(() => eyebrowForType(this.conversation().type, this.translationService));\n\n readonly descriptionPrefix = computed(() => descriptionPrefixForType(this.conversation().type, this.translationService));\n\n //#endregion\n}\n\n//#endregion\n\n//#region ---- Helpers ----\n\nfunction iconClassForType(type: AXConversationType): string {\n switch (type) {\n case 'private':\n return 'fa-light fa-comment-dots';\n case 'group':\n return 'fa-light fa-users';\n case 'channel':\n return 'fa-light fa-hashtag';\n case 'bot':\n return 'fa-light fa-robot';\n default:\n return 'fa-light fa-comments';\n }\n}\n\nfunction eyebrowForType(type: AXConversationType, translation: AXTranslationService): string {\n switch (type) {\n case 'private':\n return translation.translateSync('@acorex:chat.empty.eyebrow.direct-message');\n case 'group':\n return translation.translateSync('@acorex:chat.empty.eyebrow.group-chat');\n case 'channel':\n return translation.translateSync('@acorex:chat.empty.eyebrow.channel');\n case 'bot':\n return translation.translateSync('@acorex:chat.empty.eyebrow.assistant');\n default:\n return translation.translateSync('@acorex:chat.empty.eyebrow.conversation');\n }\n}\n\nfunction descriptionPrefixForType(type: AXConversationType, translation: AXTranslationService): string {\n switch (type) {\n case 'private':\n return translation.translateSync('@acorex:chat.empty.description.private-prefix');\n case 'group':\n return translation.translateSync('@acorex:chat.empty.description.group-prefix');\n case 'channel':\n return translation.translateSync('@acorex:chat.empty.description.channel-prefix');\n case 'bot':\n return translation.translateSync('@acorex:chat.empty.description.bot-prefix');\n default:\n return translation.translateSync('@acorex:chat.empty.description.conversation-prefix');\n }\n}\n\n//#endregion\n","//#region ---- Imports ----\n\nimport {\n AXConversationService,\n AXConversationMessageApi,\n type AXConversation,\n type AXConversationMessage,\n type AXConversationPagination,\n} from '@acorex/components/conversation';\nimport { AXTranslationService } from '@acorex/core/translation';\nimport {\n axmAiChatMessageGetTextLite,\n axmAssistInitialMessagesToTranscriptLite,\n} from '../utils/assist-initial-messages-lite.util';\nimport { AXPMarkdownViewerComponent } from '@acorex-platform/framework-client/layout/components';\nimport {\n ChangeDetectionStrategy,\n Component,\n effect,\n inject,\n input,\n signal,\n untracked,\n} from '@angular/core';\nimport { AXMConversationRealtimeBus } from '../../services/conversation-realtime.bus';\nimport { AXMConversationEntityStoreService } from '../../services/conversation-entity-store.service';\nimport { AXM_CHAT_ASSIST_CATALOG_PORT } from '../../services/chat-assist-catalog.port';\nimport { AXMAssistSuggestionChipsComponent } from '../shared/assist-suggestion-chips.component';\nimport { axmAssistStarterPromptChipItems } from '../utils/assist-suggestion-chips.util';\nimport type { AXPAiChatFollowUpItemLite } from '../utils/ai-chat-lite.types';\nimport { AXMChatMessageListEmptyFallbackComponent } from '../empty-state/chat-message-list-empty-fallback.component';\nimport { axmConversationHasAiChat, axmExtractAssistSnapshotFromMetadata } from '../utils/assist-metadata.util';\nimport {\n AXMChatConversationApi,\n AXMChatUserApi,\n} from '../services/chat-conversation-apis.abstract';\n\n//#endregion\n\n//#region ---- Helpers ----\n\nfunction extractAssistId(conversation: AXConversation): string | null {\n const raw = conversation.metadata?.['assistId'];\n if (typeof raw === 'string' && raw.trim()) {\n return raw.trim();\n }\n\n for (const participant of conversation.participants ?? []) {\n const participantAssistId = participant.metadata?.['assistId'];\n if (typeof participantAssistId === 'string' && participantAssistId.trim()) {\n return participantAssistId.trim();\n }\n }\n\n return null;\n}\n\nfunction isStreamingPlaceholder(message: AXConversationMessage): boolean {\n const meta = message.metadata as Record<string, unknown> | undefined;\n return meta?.['isAssistResponse'] === true && meta?.['isStreaming'] === true;\n}\n\nasync function conversationHasUserMessage(\n messageApi: AXConversationMessageApi,\n entityStore: AXMConversationEntityStoreService,\n currentUserId: string,\n conversationId: string,\n): Promise<boolean> {\n const cachedList = entityStore.getCachedMessageList(conversationId);\n if (cachedList !== null) {\n return cachedList.some(\n (message) =>\n !isStreamingPlaceholder(message) && message.senderId === currentUserId,\n );\n }\n\n const pagination: AXConversationPagination = { page: 0, pageSize: 50 };\n const result = await messageApi.getMessages(conversationId, pagination);\n return result.items.some(\n (message) =>\n !isStreamingPlaceholder(message) && message.senderId === currentUserId,\n );\n}\n\nfunction initialMessageMarkdown(raw: string | null | undefined): string {\n return axmAssistInitialMessagesToTranscriptLite(raw)\n .map((line) => axmAiChatMessageGetTextLite(line).trim())\n .filter((text) => text.length > 0)\n .join('\\n\\n');\n}\n\n//#endregion\n\n//#region ---- Component ----\n\n@Component({\n selector: 'axm-chat-assist-composer-starter-prompts',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'axm-chat-assist-composer-starter-prompts-host',\n '[class.axm-chat-assist-composer-starter-prompts-host--compact]':\n 'compact()',\n },\n imports: [\n AXMAssistSuggestionChipsComponent,\n AXMChatMessageListEmptyFallbackComponent,\n AXPMarkdownViewerComponent,\n ],\n template: `\n @if (showWelcome()) {\n <div class=\"axm-chat-assist-welcome-empty\">\n @if (initialMessageMarkdown().length > 0) {\n <div class=\"axm-chat-assist-welcome-empty__message\">\n <axp-markdown-viewer [markdown]=\"initialMessageMarkdown()\" />\n </div>\n }\n @if (starterPromptItems().length > 0) {\n <axm-assist-suggestion-chips\n [items]=\"starterPromptItems()\"\n [compact]=\"compact()\"\n [sendInPlace]=\"sendStarterPromptsInPlace()\"\n />\n }\n </div>\n } @else if (activeConversation(); as conversation) {\n <axm-chat-message-list-empty-fallback [conversation]=\"conversation\" />\n }\n `,\n styles: `\n .axm-chat-assist-welcome-empty {\n width: min(100%, 48rem);\n margin-inline: auto;\n display: flex;\n flex-direction: column;\n align-items: stretch;\n gap: 0.5rem;\n padding: 0.5rem 0 1rem;\n }\n\n .axm-chat-assist-welcome-empty__message {\n padding: 1rem 1.25rem;\n border-radius: 1rem;\n border: 1px solid rgba(var(--ax-sys-color-border-light-surface), 0.85);\n background: rgba(var(--ax-sys-color-lightest-surface), 0.72);\n text-align: start;\n line-height: 1.6;\n }\n\n :host(.axm-chat-assist-composer-starter-prompts-host--compact)\n .axm-chat-assist-welcome-empty {\n width: 100%;\n gap: 0.375rem;\n padding: 0.25rem 0 0.5rem;\n }\n\n :host(.axm-chat-assist-composer-starter-prompts-host--compact)\n .axm-chat-assist-welcome-empty__message {\n padding: 0.625rem 0.75rem;\n border-radius: 0.75rem;\n font-size: 0.875rem;\n line-height: 1.5;\n }\n `,\n})\nexport class AXMChatAssistComposerStarterPromptsComponent {\n //#region ---- Inputs ----\n\n /** Mini chat: send starter prompts in the overlay without routing to the chat app. */\n readonly sendStarterPromptsInPlace = input(false);\n\n /** Tighter welcome layout for mini-chat and other narrow panels. */\n readonly compact = input(false);\n\n //#endregion\n\n //#region ---- Services & Dependencies ----\n\n private readonly conversationService = inject(AXConversationService);\n private readonly conversationApi = inject(AXMChatConversationApi);\n private readonly entityStore = inject(AXMConversationEntityStoreService);\n private readonly assistCatalog = inject(AXM_CHAT_ASSIST_CATALOG_PORT, { optional: true });\n private readonly realtimeBus = inject(AXMConversationRealtimeBus);\n private readonly messageApi = inject(AXConversationMessageApi);\n private readonly userApi = inject(AXMChatUserApi);\n private readonly translationService = inject(AXTranslationService);\n\n //#endregion\n\n //#region ---- State ----\n\n readonly starterPromptItems = signal<AXPAiChatFollowUpItemLite[]>([]);\n readonly initialMessageMarkdown = signal('');\n readonly showWelcome = signal(false);\n\n readonly activeConversation = signal<AXConversation | null>(null);\n\n private loadGeneration = 0;\n private readonly conversationsWithUserMessages = new Set<string>();\n\n //#endregion\n\n //#region ---- Effects ----\n\n constructor() {\n effect(() => {\n const conversationId = this.conversationService.activeConversationId();\n void this.syncForConversation(conversationId);\n });\n\n effect((onCleanup) => {\n const conversationId = untracked(() =>\n this.conversationService.activeConversationId(),\n );\n if (!conversationId) {\n return;\n }\n\n const sub = this.realtimeBus.messageStream$.subscribe((message) => {\n if (message.conversationId !== conversationId) {\n return;\n }\n if (isStreamingPlaceholder(message)) {\n return;\n }\n void this.userApi.getCurrentUser().then((user) => {\n if (message.senderId !== user.id) {\n return;\n }\n if (!this.conversationsWithUserMessages.has(conversationId)) {\n this.conversationsWithUserMessages.add(conversationId);\n this.starterPromptItems.set([]);\n this.initialMessageMarkdown.set('');\n this.showWelcome.set(false);\n }\n });\n });\n\n onCleanup(() => sub.unsubscribe());\n });\n }\n\n //#endregion\n\n //#region ---- Sync ----\n\n private async syncForConversation(\n conversationId: string | null | undefined,\n ): Promise<void> {\n const generation = ++this.loadGeneration;\n\n if (!conversationId) {\n this.starterPromptItems.set([]);\n this.initialMessageMarkdown.set('');\n this.showWelcome.set(false);\n return;\n }\n\n const conversation =\n this.conversationService.getConversation(conversationId) ??\n this.entityStore.getCachedConversation(conversationId);\n if (!conversation) {\n const loaded = await this.conversationApi.getConversation(conversationId);\n this.activeConversation.set(loaded);\n if (!loaded) {\n this.starterPromptItems.set([]);\n this.initialMessageMarkdown.set('');\n this.showWelcome.set(false);\n return;\n }\n await this.syncWelcomeForConversation(conversationId, loaded, generation);\n return;\n }\n\n await this.syncWelcomeForConversation(conversationId, conversation, generation);\n }\n\n private async syncWelcomeForConversation(\n conversationId: string,\n conversation: AXConversation,\n generation: number,\n ): Promise<void> {\n this.activeConversation.set(conversation);\n\n if (!axmConversationHasAiChat(conversation.metadata)) {\n this.starterPromptItems.set([]);\n this.initialMessageMarkdown.set('');\n this.showWelcome.set(false);\n return;\n }\n\n const assistId = extractAssistId(conversation);\n if (!assistId) {\n this.starterPromptItems.set([]);\n this.initialMessageMarkdown.set('');\n this.showWelcome.set(false);\n return;\n }\n\n try {\n if (this.conversationsWithUserMessages.has(conversationId)) {\n this.starterPromptItems.set([]);\n this.initialMessageMarkdown.set('');\n this.showWelcome.set(false);\n return;\n }\n\n const currentUser = await this.userApi.getCurrentUser();\n const inMemoryMessages = this.conversationService.activeMessages();\n let hasUserMessage =\n inMemoryMessages.length > 0 &&\n inMemoryMessages.some(\n (message) =>\n !isStreamingPlaceholder(message) && message.senderId === currentUser.id,\n );\n if (!hasUserMessage) {\n hasUserMessage = await conversationHasUserMessage(\n this.messageApi,\n this.entityStore,\n currentUser.id,\n conversationId,\n );\n }\n if (hasUserMessage) {\n this.conversationsWithUserMessages.add(conversationId);\n }\n if (generation !== this.loadGeneration) {\n return;\n }\n\n if (hasUserMessage) {\n this.starterPromptItems.set([]);\n this.initialMessageMarkdown.set('');\n this.showWelcome.set(false);\n return;\n }\n\n const snapshot = axmExtractAssistSnapshotFromMetadata(conversation.metadata);\n const assistCatalog = this.assistCatalog;\n const assist =\n snapshot\n ? {\n id: assistId,\n initialMessages: snapshot.initialMessages,\n starterPrompts: snapshot.starterPrompts,\n modelId: snapshot.modelId,\n }\n : assistCatalog\n ? await assistCatalog.getAssist(assistId)\n : null;\n if (!assist) {\n this.starterPromptItems.set([]);\n this.initialMessageMarkdown.set('');\n this.showWelcome.set(false);\n return;\n }\n if (generation !== this.loadGeneration) {\n return;\n }\n\n // Entity-bound conversations (mini chat) send in place and must not route to the chat app.\n const isEntityChat = Boolean(\n conversation.metadata?.['entityId'] &&\n conversation.metadata?.['entityType'],\n );\n const sendInPlace = this.sendStarterPromptsInPlace();\n const items = axmAssistStarterPromptChipItems(assist, {\n conversationId: conversationId ?? undefined,\n ...(isEntityChat\n ? {\n navigate: false,\n entityId:\n String(conversation.metadata?.['entityId'] ?? '').trim() ||\n undefined,\n entityType:\n String(conversation.metadata?.['entityType'] ?? '').trim() ||\n undefined,\n }\n : {}),\n ...(sendInPlace ? { navigate: false } : {}),\n });\n const welcomeMarkdown = initialMessageMarkdown(assist?.initialMessages);\n this.starterPromptItems.set(items);\n this.initialMessageMarkdown.set(welcomeMarkdown);\n this.showWelcome.set(welcomeMarkdown.length > 0 || items.length > 0);\n } catch (error: unknown) {\n console.error('Failed to load assist welcome interaction:', error);\n if (generation === this.loadGeneration) {\n this.starterPromptItems.set([]);\n this.initialMessageMarkdown.set('');\n this.showWelcome.set(false);\n }\n }\n }\n\n //#endregion\n}\n\n//#endregion\n","import { InjectionToken, type Type } from '@angular/core';\n\nexport const AXM_CHAT_EMPTY_STATE_COMPONENT = new InjectionToken<Type<unknown>>('AXM_CHAT_EMPTY_STATE_COMPONENT');\n","//#region ----- Imports -----\n\nimport { AXTranslationModule } from '@acorex/core/translation';\nimport { AsyncPipe } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n input,\n output,\n} from '@angular/core';\n\n//#endregion\n\n//#region ----- Component -----\n\n@Component({\n selector: 'axm-chat-empty-state-fallback',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'ax-message-empty-host',\n '[class.ax-message-empty-host--compact]': 'compact()',\n },\n imports: [AXTranslationModule, AsyncPipe],\n template: `\n <div class=\"ax-message-empty\" role=\"status\" aria-live=\"polite\">\n <div class=\"ax-message-empty__ambient\" aria-hidden=\"true\">\n <span class=\"ax-message-empty__grid\"></span>\n </div>\n\n <div class=\"ax-message-empty__card\">\n <div class=\"ax-message-empty__icon-stack\">\n <span class=\"ax-message-empty__pulse\" aria-hidden=\"true\"></span>\n <div class=\"ax-message-empty__icon-bg\">\n <i class=\"fa-light fa-comments\" aria-hidden=\"true\"></i>\n </div>\n </div>\n\n <p class=\"ax-message-empty__eyebrow\">\n {{ '@acorex:chat.empty.eyebrow.conversation' | translate | async }}\n </p>\n <h3 class=\"ax-message-empty__title\">\n {{ '@conversation:chat.empty-state.title' | translate | async }}\n </h3>\n <p class=\"ax-message-empty__desc\">\n {{ '@conversation:chat.empty-state.description' | translate | async }}\n </p>\n </div>\n </div>\n `,\n styles: `\n :host.ax-message-empty-host {\n display: flex;\n width: 100%;\n min-height: 100%;\n align-items: center;\n justify-content: center;\n padding: 1rem;\n }\n\n .ax-message-empty {\n position: relative;\n isolation: isolate;\n width: 100%;\n max-width: min(24rem, 100%);\n margin-inline: auto;\n padding: 0.25rem;\n }\n\n .ax-message-empty__ambient {\n position: absolute;\n top: -2rem;\n right: -1rem;\n bottom: -1rem;\n left: -1rem;\n z-index: 0;\n pointer-events: none;\n overflow: hidden;\n border-radius: 2rem;\n }\n\n .ax-message-empty__grid {\n position: absolute;\n inset: 0;\n background-image:\n linear-gradient(rgba(var(--ax-sys-color-on-surface), 0.04) 1px, transparent 1px),\n linear-gradient(90deg, rgba(var(--ax-sys-color-on-surface), 0.04) 1px, transparent 1px);\n background-size: 24px 24px;\n mask-image: radial-gradient(ellipse 80% 70% at 50% 45%, black 20%, transparent 75%);\n opacity: 0.5;\n }\n\n .ax-message-empty__card {\n position: relative;\n z-index: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n text-align: center;\n padding: 2rem 1.75rem 2.125rem;\n border-radius: 1.25rem;\n border: 1px solid rgba(var(--ax-sys-color-border-light-surface), 0.85);\n background: linear-gradient(\n 165deg,\n rgba(var(--ax-sys-color-lightest-surface), 0.72),\n rgba(var(--ax-sys-color-surface), 0.55)\n );\n }\n\n .ax-message-empty__icon-stack {\n position: relative;\n display: grid;\n place-items: center;\n margin-bottom: 1.25rem;\n }\n\n .ax-message-empty__pulse {\n position: absolute;\n width: 5.5rem;\n height: 5.5rem;\n border-radius: 50%;\n background: radial-gradient(circle, rgba(var(--ax-sys-color-primary-500), 0.22), transparent 70%);\n animation: axm-empty-pulse 3.2s ease-in-out infinite;\n }\n\n .ax-message-empty__icon-bg {\n position: relative;\n display: grid;\n place-items: center;\n width: 4.25rem;\n height: 4.25rem;\n border-radius: 1.125rem;\n background: linear-gradient(\n 145deg,\n rgba(var(--ax-sys-color-primary-500), 0.16),\n rgba(var(--ax-sys-color-primary-600), 0.06)\n );\n border: 1px solid rgba(var(--ax-sys-color-primary-500), 0.22);\n box-shadow:\n 0 1px rgba(var(--ax-sys-color-on-primary-surface), 0.06) inset,\n 0 12px 28px -16px rgba(var(--ax-sys-color-primary-600), 0.45);\n }\n\n .ax-message-empty__icon-bg i {\n font-size: 1.875rem;\n line-height: 1;\n color: rgb(var(--ax-sys-color-primary-600));\n opacity: 0.92;\n }\n\n .ax-message-empty__eyebrow {\n margin: 0 0 0.35rem;\n font-size: 0.6875rem;\n font-weight: 600;\n letter-spacing: 0.14em;\n text-transform: uppercase;\n color: rgb(var(--ax-sys-color-primary-600));\n opacity: 0.85;\n }\n\n .ax-message-empty__title {\n margin: 0 0 0.65rem;\n font-size: 1.375rem;\n font-weight: 600;\n letter-spacing: -0.03em;\n line-height: 1.25;\n color: rgb(var(--ax-sys-color-on-surface));\n }\n\n .ax-message-empty__desc {\n margin: 0;\n font-size: 0.9375rem;\n line-height: 1.65;\n color: rgb(var(--ax-sys-color-on-surface));\n opacity: 0.62;\n max-width: 20rem;\n }\n\n :host(.ax-message-empty-host--compact) {\n padding: 0.75rem;\n }\n\n :host(.ax-message-empty-host--compact) .ax-message-empty__card {\n padding: 1.25rem 1.25rem 1.375rem;\n border-radius: 1rem;\n }\n\n :host(.ax-message-empty-host--compact) .ax-message-empty__icon-stack {\n margin-bottom: 0.875rem;\n }\n\n :host(.ax-message-empty-host--compact) .ax-message-empty__pulse {\n width: 4.25rem;\n height: 4.25rem;\n }\n\n :host(.ax-message-empty-host--compact) .ax-message-empty__icon-bg {\n width: 3.25rem;\n height: 3.25rem;\n border-radius: 0.875rem;\n }\n\n :host(.ax-message-empty-host--compact) .ax-message-empty__icon-bg i {\n font-size: 1.375rem;\n }\n\n :host(.ax-message-empty-host--compact) .ax-message-empty__title {\n font-size: 1.125rem;\n }\n\n :host(.ax-message-empty-host--compact) .ax-message-empty__desc {\n font-size: 0.8125rem;\n }\n\n @keyframes axm-empty-pulse {\n 0%,\n 100% {\n transform: scale(0.92);\n opacity: 0.55;\n }\n 50% {\n transform: scale(1.06);\n opacity: 0.85;\n }\n }\n\n @media (prefers-reduced-motion: reduce) {\n .ax-message-empty__pulse {\n animation: none;\n }\n }\n `,\n})\nexport class AXMChatEmptyStateFallbackComponent {\n //#region ----- State Signals -----\n\n readonly compact = input(false);\n readonly initialAssistId = input<string | undefined>(undefined);\n readonly entityId = input<string | undefined>(undefined);\n readonly entityType = input<string | undefined>(undefined);\n readonly sendStarterPromptsInPlace = input(false);\n readonly conversationCreated = output<string>();\n\n //#endregion\n}\n\n//#endregion\n","import { AfterViewInit, ChangeDetectionStrategy, Component, ComponentRef, DestroyRef, EnvironmentInjector, Type, effect, inject, input, output, viewChild, ViewContainerRef } from '@angular/core';\nimport { AXM_CHAT_EMPTY_STATE_COMPONENT } from './chat-empty-state.provider';\nimport { AXMChatEmptyStateFallbackComponent } from './chat-empty-state-fallback.component';\n\n@Component({\n selector: 'axm-chat-empty-state-host',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [],\n template: ` <ng-container #host></ng-container> `,\n})\nexport class AXMChatEmptyStateHostComponent implements AfterViewInit {\n readonly compact = input(false);\n readonly initialAssistId = input<string | undefined>(undefined);\n readonly entityId = input<string | undefined>(undefined);\n readonly entityType = input<string | undefined>(undefined);\n readonly sendStarterPromptsInPlace = input(false);\n readonly conversationCreated = output<string>();\n\n private readonly host = viewChild.required('host', { read: ViewContainerRef });\n private readonly environmentInjector = inject(EnvironmentInjector);\n private readonly destroyRef = inject(DestroyRef);\n private readonly contributedComponent = inject(AXM_CHAT_EMPTY_STATE_COMPONENT, { optional: true });\n private componentRef: ComponentRef<unknown> | null = null;\n\n constructor() {\n effect(() => {\n this.syncChildInputs();\n });\n }\n\n ngAfterViewInit(): void {\n this.mountComponent();\n }\n\n private syncChildInputs(): void {\n const ref = this.componentRef;\n if (!ref) {\n return;\n }\n\n ref.setInput('compact', this.compact());\n ref.setInput('initialAssistId', this.initialAssistId());\n ref.setInput('entityId', this.entityId());\n ref.setInput('entityType', this.entityType());\n ref.setInput('sendStarterPromptsInPlace', this.sendStarterPromptsInPlace());\n }\n\n private mountComponent(): void {\n const viewContainer = this.host();\n viewContainer.clear();\n const componentType = (this.contributedComponent ?? AXMChatEmptyStateFallbackComponent) as Type<unknown>;\n this.componentRef = viewContainer.createComponent(componentType, {\n environmentInjector: this.environmentInjector,\n });\n this.syncChildInputs();\n\n const instance = this.componentRef.instance as Record<string, unknown>;\n const emitter = instance['conversationCreated'] as { subscribe?: (fn: (value: string) => void) => { unsubscribe(): void } } | undefined;\n const sub = emitter?.subscribe?.((conversationId) => this.conversationCreated.emit(conversationId));\n if (sub) {\n this.destroyRef.onDestroy(() => sub.unsubscribe());\n }\n }\n}\n","//#region ---- Imports ----\n\nimport { AXConversationComposerComponent, AXConversationContainerDirective, AXConversationInfoBarComponent, AXConversationMessageListComponent, AXConversationService } from '@acorex/components/conversation';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { AXTranslationModule } from '@acorex/core/translation';\nimport { ChangeDetectionStrategy, Component, computed, DestroyRef, effect, inject, input, output, ViewEncapsulation } from '@angular/core';\nimport { AXMChatAssistComposerStarterPromptsComponent } from '../chat/plugins/composer/chat-assist-composer-starter-prompts.component';\nimport { AXMChatEmptyStateHostComponent } from '../chat/plugins/empty-state/chat-empty-state-host.component';\nimport { AXMChatConversationApi } from '../chat/plugins/services/chat-conversation-apis.abstract';\nimport { AXM_CONVERSATION_ASSIST_RESPONSE_PORT } from '../chat/services/conversation-assist-response.port';\n\n//#endregion\n\n//#region ---- Component ----\n\n/**\n * Compact, entity-scoped chat: renders a single conversation thread (message list) with an optional\n * info-bar and composer. Opens an existing chat by {@link chatId}, or starts a new entity assist chat\n * (created lazily on first send and tagged with `entityId` / `entityType` in conversation metadata).\n *\n * Uses the shared {@link AXConversationService} (same instance as the main chat page) so message\n * streams, realtime updates, and assist replies behave identically. Selecting a chat / starting a\n * new one is coordinated by the host through {@link chatId} and {@link AXConversationService}.\n */\n@Component({\n selector: 'axm-mini-chat',\n templateUrl: './mini-chat.component.html',\n styleUrls: ['./mini-chat.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n AXConversationContainerDirective,\n AXConversationInfoBarComponent,\n AXConversationMessageListComponent,\n AXConversationComposerComponent,\n AXDecoratorModule,\n AXTranslationModule,\n AXMChatEmptyStateHostComponent,\n AXMChatAssistComposerStarterPromptsComponent,\n ],\n})\nexport class AXMMiniChatComponent {\n //#region ---- Services & Dependencies ----\n\n private readonly conversationService = inject(AXConversationService);\n private readonly conversationApi = inject(AXMChatConversationApi);\n private readonly assistResponse = inject(AXM_CONVERSATION_ASSIST_RESPONSE_PORT, { optional: true });\n private readonly destroyRef = inject(DestroyRef);\n\n //#endregion\n\n //#region ---- Inputs / Outputs ----\n\n /** Existing conversation id to open. When omitted (and no conversation is active), the new-chat composer is shown. */\n readonly chatId = input<string | undefined>(undefined);\n\n /** Entity reference the chat is (or will be) bound to; omitted for inbox (regular) chats. */\n readonly entityId = input<string | undefined>(undefined);\n readonly entityType = input<string | undefined>(undefined);\n\n /** Assist used as the bot peer when creating a new entity chat (falls back to the tenant default). */\n readonly assistId = input<string | undefined>(undefined);\n\n readonly showInfoBar = input(true);\n readonly showComposer = input(true);\n\n /** Emits the active conversation id when one is opened or newly created. */\n readonly conversationOpened = output<string>();\n\n //#endregion\n\n //#region ---- Computed ----\n\n readonly hasActiveConversation = computed(() => this.conversationService.activeConversationId() !== null);\n\n //#endregion\n\n //#region ---- Effects ----\n\n /**\n * Keeps assist SSE + realtime subscriptions aligned with the thread shown in mini chat\n * (same role as {@link AXMChatComponent}'s route sync via {@link AXMChatConversationApi#reportFocusedConversation}).\n */\n #syncFocusedConversation = effect(() => {\n const activeId = this.conversationService.activeConversationId();\n this.conversationApi.reportFocusedConversation(activeId);\n });\n\n /**\n * Selects the conversation requested via {@link chatId}. Deselection (showing the new-chat composer)\n * is left to the host so the lazily-created conversation isn't cleared right after it is selected.\n */\n #syncWithChatId = effect(() => {\n const chatId = this.chatId()?.trim();\n if (!chatId) {\n return;\n }\n\n if (chatId === this.conversationService.activeConversationId()) {\n return;\n }\n\n void this.conversationService.selectConversation(chatId).then(() => {\n this.conversationApi.reportFocusedConversation(chatId);\n this.conversationOpened.emit(chatId);\n });\n });\n\n //#endregion\n\n //#region ---- Lifecycle ----\n\n constructor() {\n this.destroyRef.onDestroy(() => {\n this.conversationApi.reportFocusedConversation(null);\n });\n }\n\n //#endregion\n\n //#region ---- UI Handlers ----\n\n /** New-chat composer created and selected a conversation; surface it to the host. */\n onConversationCreated(conversationId: string): void {\n this.conversationOpened.emit(conversationId);\n }\n\n onComposerGenerationCancelled(): void {\n const conversationId = this.conversationService.activeConversationId();\n if (!conversationId) {\n return;\n }\n void this.assistResponse?.cancelAssistGeneration(conversationId);\n }\n\n //#endregion\n}\n\n//#endregion\n","<div axConversationContainer class=\"axm-mini-chat flex h-full min-h-0 flex-col\">\n @if (showInfoBar() && hasActiveConversation()) {\n <ax-conversation-info-bar class=\"axm-mini-chat__info-bar shrink-0 shadow-sm\"></ax-conversation-info-bar>\n }\n\n <ax-conversation-message-list class=\"axm-mini-chat__messages min-h-0 flex-1 overflow-hidden\" style=\"direction: ltr\">\n <div ax-conversation-message-list-no-active class=\"axm-mini-chat__no-active block\">\n <axm-chat-empty-state-host [compact]=\"true\" [entityId]=\"entityId()\" [entityType]=\"entityType()\" [initialAssistId]=\"assistId()\" [sendStarterPromptsInPlace]=\"true\" (conversationCreated)=\"onConversationCreated($event)\" />\n </div>\n <axm-chat-assist-composer-starter-prompts ax-conversation-message-list-empty [compact]=\"true\" [sendStarterPromptsInPlace]=\"true\" />\n </ax-conversation-message-list>\n\n @if (showComposer() && hasActiveConversation()) {\n <ax-conversation-composer\n class=\"axm-mini-chat__composer shrink-0\"\n (generationCancelled)=\"onComposerGenerationCancelled()\"\n />\n }\n</div>\n","//#region ---- Imports ----\n\nimport { AXButtonModule } from '@acorex/components/button';\nimport { AXConversationService } from '@acorex/components/conversation';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { AXTranslationModule } from '@acorex/core/translation';\nimport { AsyncPipe } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n inject,\n input,\n OnDestroy,\n OnInit,\n signal,\n ViewEncapsulation,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { AXMConversationRealtimeBus } from '../chat/services/conversation-realtime.bus';\nimport { AXMChatConversationApi } from '../chat/plugins/services/chat-conversation-apis.abstract';\nimport { AXMMiniChatHistoryComponent } from './mini-chat-history.component';\nimport { AXMMiniChatInboxHistoryComponent } from './mini-chat-inbox-history.component';\nimport type { AXMMiniChatPanelScope, AXMMiniChatPanelSessionState } from './mini-chat-panel.types';\nimport { AXMMiniChatComponent } from './mini-chat.component';\n//#endregion\n\n//#region ---- Component ----\n\n/**\n * Mini chat panel overlay: header, thread view, and history (entity list or main inbox sidebar).\n */\n@Component({\n selector: 'axm-mini-chat-panel',\n templateUrl: './mini-chat-panel.component.html',\n styleUrls: ['./mini-chat-panel.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n AXButtonModule,\n AXDecoratorModule,\n AXTranslationModule,\n AXMMiniChatComponent,\n AXMMiniChatHistoryComponent,\n AXMMiniChatInboxHistoryComponent,\n AsyncPipe,\n ],\n})\nexport class AXMMiniChatPanelComponent implements OnInit, OnDestroy {\n //#region ---- Services & Dependencies ----\n\n private readonly conversationService = inject(AXConversationService);\n private readonly conversationApi = inject(AXMChatConversationApi);\n private readonly realtimeBus = inject(AXMConversationRealtimeBus);\n private readonly destroyRef = inject(DestroyRef);\n\n //#endregion\n\n //#region ---- Inputs ----\n\n readonly scope = input<AXMMiniChatPanelScope>('entity');\n readonly entityId = input<string | undefined>(undefined);\n readonly entityType = input<string | undefined>(undefined);\n readonly assistId = input<string | undefined>(undefined);\n readonly title = input('Entity Chats');\n readonly showInfoBar = input(false);\n readonly showComposer = input(true);\n readonly requestClose = input.required<() => void>();\n readonly initialView = input<'thread' | 'history'>('thread');\n readonly initialConversationId = input<string | undefined>(undefined);\n readonly startWithNewChat = input(false);\n readonly onSessionChange = input<(state: Pick<AXMMiniChatPanelSessionState, 'view' | 'selectedChatId'>) => void>();\n\n //#endregion\n\n //#region ---- State ----\n\n protected readonly view = signal<'thread' | 'history'>('thread');\n protected readonly selectedChatId = signal<string | undefined>(undefined);\n protected readonly historyHasItems = signal(false);\n\n protected readonly isInboxScope = computed(() => this.scope() === 'inbox');\n\n /** Bumps when shared conversation storage changes so the header title stays in sync. */\n private readonly storageRevision = signal(0);\n\n /** Active conversation title for the thread header; null when none is selected yet. */\n protected readonly headerTitle = computed(() => {\n this.storageRevision();\n return this.cachedHeaderTitle();\n });\n\n private readonly cachedHeaderTitle = signal<string | null>(null);\n\n //#endregion\n\n //#region ---- Lifecycle ----\n\n constructor() {\n this.realtimeBus.conversationUpdates$.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((conversation) => {\n const id = this.conversationService.activeConversationId() ?? this.selectedChatId();\n if (conversation.id === id) {\n this.cachedHeaderTitle.set(conversation.title?.trim() || null);\n }\n this.storageRevision.update((revision) => revision + 1);\n });\n }\n\n ngOnInit(): void {\n this.view.set(this.initialView());\n const conversationId = this.initialConversationId();\n\n if (this.startWithNewChat()) {\n void this.startNewChat();\n return;\n }\n\n this.selectedChatId.set(conversationId);\n if (!conversationId) {\n void this.startNewChat();\n return;\n }\n\n this.syncSession();\n }\n\n ngOnDestroy(): void {\n this.syncSession();\n }\n\n //#endregion\n\n //#region ---- UI Handlers ----\n\n protected closePanel(): void {\n this.syncSession();\n this.requestClose()();\n }\n\n protected openHistory(): void {\n this.historyHasItems.set(false);\n this.view.set('history');\n this.syncSession();\n }\n\n protected onHistoryHasConversationsChange(hasItems: boolean): void {\n this.historyHasItems.set(hasItems);\n }\n\n protected selectChat(conversationId: string): void {\n this.selectedChatId.set(conversationId);\n this.view.set('thread');\n this.conversationApi.reportFocusedConversation(conversationId);\n void this.conversationService.selectConversation(conversationId);\n void this.conversationApi.getConversation(conversationId).then((conversation) => {\n this.cachedHeaderTitle.set(conversation.title?.trim() || null);\n });\n this.syncSession();\n }\n\n protected onConversationOpened(conversationId: string): void {\n this.selectedChatId.set(conversationId);\n this.storageRevision.update((revision) => revision + 1);\n void this.conversationApi.getConversation(conversationId).then((conversation) => {\n this.cachedHeaderTitle.set(conversation.title?.trim() || null);\n });\n this.syncSession();\n }\n\n protected async startNewChat(): Promise<void> {\n this.selectedChatId.set(undefined);\n this.view.set('thread');\n this.conversationApi.reportFocusedConversation(null);\n await this.conversationService.selectConversation(null as never);\n this.syncSession();\n }\n\n //#endregion\n\n //#region ---- Utility Methods ----\n\n private syncSession(): void {\n this.onSessionChange()?.({\n view: this.view(),\n selectedChatId: this.selectedChatId(),\n });\n }\n\n //#endregion\n}\n\n//#endregion\n","<div class=\"axm-mini-chat-panel flex h-full min-h-0 flex-col\">\n <div class=\"axm-mini-chat-panel__header flex shrink-0 items-center justify-between gap-2 px-3 py-2\">\n <div class=\"flex min-w-0 flex-1 flex-col\">\n @if (view() === 'history') {\n <span class=\"text-sm font-semibold truncate\">\n {{ '@conversation:mini-chat.history-title' | translate | async }}\n </span>\n } @else if (headerTitle()) {\n <span class=\"text-sm font-semibold truncate\">{{ headerTitle() }}</span>\n } @else {\n <span class=\"text-sm font-semibold truncate\">\n {{ '@conversation:mini-chat.new-chat' | translate | async }}\n </span>\n }\n </div>\n <div class=\"flex shrink-0 items-center gap-1\">\n @if (view() !== 'history') {\n <ax-button look=\"blank\" [iconOnly]=\"true\" (onClick)=\"openHistory()\" aria-label=\"Chat history\">\n <ax-prefix><ax-icon icon=\"fa-light fa-clock-rotate-left\"></ax-icon></ax-prefix>\n </ax-button>\n }\n <ax-button look=\"blank\" [iconOnly]=\"true\" (onClick)=\"closePanel()\" aria-label=\"Close\">\n <ax-prefix><ax-icon icon=\"fa-light fa-xmark\"></ax-icon></ax-prefix>\n </ax-button>\n </div>\n </div>\n\n @if (view() === 'history') {\n <div class=\"axm-mini-chat-panel__history relative flex min-h-0 flex-1 flex-col\">\n @if (isInboxScope()) {\n <axm-mini-chat-inbox-history\n (conversationSelected)=\"selectChat($event)\"\n (hasConversationsChange)=\"onHistoryHasConversationsChange($event)\"\n (newChatRequested)=\"startNewChat()\"\n />\n } @else {\n <axm-mini-chat-history\n [entityId]=\"entityId()!\"\n [entityType]=\"entityType()!\"\n (conversationSelected)=\"selectChat($event)\"\n (hasConversationsChange)=\"onHistoryHasConversationsChange($event)\"\n (newChatRequested)=\"startNewChat()\"\n />\n }\n @if (historyHasItems()) {\n <div class=\"axm-mini-chat-panel__history-fab\">\n <ax-button\n class=\"rounded-full shadow-lg\"\n color=\"primary\"\n [iconOnly]=\"true\"\n (onClick)=\"startNewChat()\"\n [attr.aria-label]=\"('@conversation:mini-chat.new-chat' | translate | async) ?? 'New chat'\"\n >\n <ax-prefix><ax-icon icon=\"fa-light fa-plus\"></ax-icon></ax-prefix>\n </ax-button>\n </div>\n }\n </div>\n } @else {\n <div class=\"axm-mini-chat-panel__body flex min-h-0 flex-1 flex-col\">\n <axm-mini-chat\n class=\"flex min-h-0 flex-1 flex-col\"\n [chatId]=\"selectedChatId()\"\n [entityId]=\"entityId()\"\n [entityType]=\"entityType()\"\n [assistId]=\"assistId()\"\n [showInfoBar]=\"showInfoBar()\"\n [showComposer]=\"showComposer()\"\n (conversationOpened)=\"onConversationOpened($event)\"\n />\n </div>\n }\n</div>\n","//#region ---- Imports ----\n\nimport { ChangeDetectionStrategy, Component, input, ViewEncapsulation } from '@angular/core';\nimport { AXM_CHAT_CONVERSATION_PROVIDERS } from '../chat/chat-conversation.providers';\nimport { AXMConversationFocusService } from '../chat/services/conversation-focus.service';\nimport { AXMMiniChatPanelComponent } from './mini-chat-panel.component';\nimport type { AXMMiniChatPanelSessionState } from './mini-chat-panel.types';\n\n//#endregion\n\n//#region ---- Component ----\n\n/**\n * Host for inbox mini chat with an isolated {@link AXConversationService} so the header\n * slot does not change the main chat page selection while the user is on the chat route.\n */\n@Component({\n selector: 'axm-mini-chat-inbox-panel-host',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n providers: [...AXM_CHAT_CONVERSATION_PROVIDERS, AXMConversationFocusService],\n imports: [AXMMiniChatPanelComponent],\n template: `\n <axm-mini-chat-panel\n scope=\"inbox\"\n [title]=\"title()\"\n [showInfoBar]=\"showInfoBar()\"\n [showComposer]=\"showComposer()\"\n [requestClose]=\"requestClose()\"\n [initialView]=\"initialView()\"\n [initialConversationId]=\"initialConversationId()\"\n [startWithNewChat]=\"startWithNewChat()\"\n [onSessionChange]=\"onSessionChange()\"\n />\n `,\n})\nexport class AXMMiniChatInboxPanelHostComponent {\n //#region ---- Inputs ----\n\n readonly title = input('Chats');\n readonly showInfoBar = input(false);\n readonly showComposer = input(true);\n readonly requestClose = input.required<() => void>();\n readonly initialView = input<'thread' | 'history'>('thread');\n readonly initialConversationId = input<string | undefined>(undefined);\n readonly startWithNewChat = input(false);\n readonly onSessionChange =\n input<(state: Pick<AXMMiniChatPanelSessionState, 'view' | 'selectedChatId'>) => void>();\n\n //#endregion\n}\n\n//#endregion\n","//#region ---- Mini chat panel open options ----\n\nimport type { AXPlacement } from '@acorex/cdk/common';\nimport type { ElementRef } from '@angular/core';\n\n/** Anchor element for overlay positioning. */\nexport type AXMMiniChatPanelAnchor = Element | ElementRef<HTMLElement>;\n\n/**\n * Common placement aliases mapped to {@link AXPlacement}.\n * Examples: `top-right` → `top-end`, `bottom-left` → `bottom-start`.\n */\nexport type AXMMiniChatPanelSide =\n | AXPlacement\n | 'top-left'\n | 'top-right'\n | 'bottom-left'\n | 'bottom-right'\n | 'left'\n | 'right';\n\n/** Fixed viewport coordinates (px). Ignored when `anchor` is set. */\nexport interface AXMMiniChatPanelPosition {\n x: number;\n y: number;\n}\n\n/** Mini chat panel scope: entity-bound threads or main inbox (non-entity chats). */\nexport type AXMMiniChatPanelScope = 'entity' | 'inbox';\n\n/** Session key used for the global inbox mini chat (non-entity conversations). */\nexport const AXM_MINI_CHAT_INBOX_SESSION_KEY = '__inbox__';\n\n/** Persisted panel state for a mini chat session. */\nexport interface AXMMiniChatPanelSessionState {\n view: 'thread' | 'history';\n selectedChatId?: string;\n hasOpened: boolean;\n}\n\n/** Options passed to {@link AXMMiniChatPanelService.open}. */\nexport interface AXMMiniChatPanelOpenOptions {\n /** Default: `entity`. Use `inbox` for regular (non-entity) chats shown in the main chat sidebar. */\n scope?: AXMMiniChatPanelScope;\n entityId?: string;\n entityType?: string;\n assistId?: string;\n title?: string;\n showInfoBar?: boolean;\n showComposer?: boolean;\n /** Fixed viewport position (px). Ignored when `anchor` is set. */\n position?: AXMMiniChatPanelPosition;\n /** Anchor element for popover placement. */\n anchor?: AXMMiniChatPanelAnchor;\n /** Placement relative to anchor. Default: `top-end` when anchored. */\n placement?: AXMMiniChatPanelSide;\n offsetX?: number;\n offsetY?: number;\n autoFlip?: boolean;\n /** When true, always opens a fresh conversation thread. */\n forceNewChat?: boolean;\n}\n\n//#endregion\n","//#region ---- Imports ----\n\nimport type { AXPlacement } from '@acorex/cdk/common';\nimport { AXOverlayService, type AXOverlayRef } from '@acorex/cdk/overlay';\nimport { AXConversationService } from '@acorex/components/conversation';\nimport { DOCUMENT } from '@angular/common';\nimport { ElementRef, Injectable, inject, signal } from '@angular/core';\nimport { NavigationStart, Router } from '@angular/router';\nimport { filter, type Subscription } from 'rxjs';\nimport { AXMChatConversationApi } from '../chat/plugins/services/chat-conversation-apis.abstract';\nimport { AXMMiniChatInboxPanelHostComponent } from './mini-chat-inbox-panel-host.component';\nimport { AXMMiniChatPanelComponent } from './mini-chat-panel.component';\nimport type {\n AXMMiniChatPanelAnchor,\n AXMMiniChatPanelOpenOptions,\n AXMMiniChatPanelSessionState,\n AXMMiniChatPanelSide,\n} from './mini-chat-panel.types';\nimport { AXM_MINI_CHAT_INBOX_SESSION_KEY } from './mini-chat-panel.types';\n\n//#endregion\n\n//#region ---- Service ----\n\n/**\n * Opens the entity mini chat panel via {@link AXOverlayService}.\n * Restores the last conversation per entity on reopen; use {@link forceNewChat} for an explicit new thread.\n */\n@Injectable({ providedIn: 'root' })\nexport class AXMMiniChatPanelService {\n //#region ---- Services & Dependencies ----\n\n private readonly overlayService = inject(AXOverlayService);\n private readonly conversationService = inject(AXConversationService);\n private readonly conversationApi = inject(AXMChatConversationApi);\n private readonly document = inject(DOCUMENT);\n private readonly router = inject(Router);\n\n //#endregion\n\n //#region ---- Private Properties ----\n\n private overlayRef: AXOverlayRef<AXMMiniChatPanelComponent | AXMMiniChatInboxPanelHostComponent> | null = null;\n\n private anchorElement: HTMLElement | null = null;\n private keydownHandler: ((event: KeyboardEvent) => void) | null = null;\n private outsideClickHandler: ((event: MouseEvent) => void) | null = null;\n private routerSubscription: Subscription | null = null;\n\n /** Active conversation before the panel took over selection (restored on close). */\n private savedActiveConversationId: string | null | undefined;\n\n /** Per-entity session (view, selected conversation) restored when the panel reopens. */\n private readonly sessions = new Map<string, AXMMiniChatPanelSessionState>();\n\n /** Reactive open state for launcher UI (FAB icon). */\n readonly panelOpen = signal(false);\n\n //#endregion\n\n //#region ---- Public Methods ----\n\n /** True while the mini chat overlay is mounted. */\n isOpen(): boolean {\n return this.panelOpen();\n }\n\n /** Closes the overlay when it is open. */\n close(): void {\n this.disposeOverlayOnly();\n }\n\n /** Toggles the inbox mini chat overlay (regular non-entity conversations). */\n toggleInbox(options: Omit<AXMMiniChatPanelOpenOptions, 'scope' | 'entityId' | 'entityType'> = {}): void {\n this.toggle({ ...options, scope: 'inbox' });\n }\n\n /** Toggles the overlay, restoring the last session when reopening. */\n toggle(options: AXMMiniChatPanelOpenOptions): void {\n if (this.isOpen()) {\n this.close();\n return;\n }\n void this.open(options);\n }\n\n /**\n * Opens the mini chat panel overlay (replaces any existing overlay).\n * Restores the last session for the entity unless {@link AXMMiniChatPanelOpenOptions.forceNewChat} is set.\n */\n async open(options: AXMMiniChatPanelOpenOptions): Promise<void> {\n this.disposeOverlayOnly();\n\n const scope = options.scope ?? 'entity';\n\n if (scope !== 'inbox') {\n this.captureActiveConversation();\n }\n\n const entityKey =\n scope === 'inbox'\n ? AXM_MINI_CHAT_INBOX_SESSION_KEY\n : this.buildEntityKey(options.entityType!.trim(), options.entityId!.trim());\n\n const session = this.sessions.get(entityKey);\n const restoreSession = Boolean(session?.hasOpened) && !options.forceNewChat;\n const startWithNewChat = !restoreSession || options.forceNewChat;\n\n const initialView = restoreSession ? session!.view : 'thread';\n const initialConversationId = restoreSession ? session!.selectedChatId : undefined;\n\n const requestClose = (): void => {\n this.disposeOverlayOnly();\n };\n\n const onSessionChange = (state: Pick<AXMMiniChatPanelSessionState, 'view' | 'selectedChatId'>): void => {\n this.sessions.set(entityKey, {\n view: state.view,\n selectedChatId: state.selectedChatId,\n hasOpened: true,\n });\n };\n\n const panelClasses = ['axm-mini-chat-panel-shell'];\n const useAnchor = Boolean(options.anchor);\n const useFixedPosition = !useAnchor && Boolean(options.position);\n\n if (useAnchor) {\n panelClasses.push('axm-mini-chat-panel-shell--anchored');\n } else if (useFixedPosition) {\n panelClasses.push('axm-mini-chat-panel-shell--fixed');\n } else {\n panelClasses.push('axm-mini-chat-panel-shell--default');\n }\n\n try {\n const panelInputs = {\n title: options.title ?? (scope === 'inbox' ? 'Chats' : 'Entity Chats'),\n showInfoBar: options.showInfoBar ?? false,\n showComposer: options.showComposer ?? true,\n initialView,\n initialConversationId,\n startWithNewChat,\n requestClose,\n onSessionChange,\n };\n\n this.overlayRef = await this.overlayService.create(\n scope === 'inbox' ? AXMMiniChatInboxPanelHostComponent : AXMMiniChatPanelComponent,\n {\n centered: false,\n width: 'auto',\n actionSheetStyle: false,\n panelClass: panelClasses,\n backdrop: {\n enabled: false,\n background: false,\n closeOnClick: false,\n },\n closeOnEscape: true,\n closeOnOutsideClick: true,\n ...(useAnchor\n ? {\n anchorOptions: {\n anchor: this.resolveAnchorElement(options.anchor!),\n placement: this.normalizePlacement(options.placement ?? 'top-end'),\n offsetX: options.offsetX ?? 8,\n offsetY: options.offsetY ?? 8,\n autoFlip: options.autoFlip ?? true,\n },\n }\n : {}),\n inputs:\n scope === 'inbox'\n ? panelInputs\n : {\n scope,\n entityId: options.entityId,\n entityType: options.entityType,\n assistId: options.assistId,\n ...panelInputs,\n },\n onDispose: () => {\n this.handleOverlayDisposed();\n },\n },\n );\n\n if (useFixedPosition && options.position) {\n this.applyFixedPosition(this.overlayRef, options.position);\n }\n\n this.anchorElement = useAnchor ? this.resolveAnchorElement(options.anchor!) : null;\n\n setTimeout(() => {\n if (useAnchor) {\n this.overlayRef?.updatePosition();\n }\n this.bindDismissHandlers(this.overlayRef?.overlayElement ?? null, this.anchorElement);\n }, 0);\n\n this.panelOpen.set(true);\n } catch {\n this.overlayRef = null;\n }\n }\n\n //#endregion\n\n //#region ---- Utility Methods ----\n\n private buildEntityKey(entityType: string, entityId: string): string {\n return `${entityType}:${entityId}`;\n }\n\n private disposeOverlayOnly(): void {\n this.removeDismissHandlers();\n if (this.overlayRef) {\n this.overlayRef.dispose();\n this.overlayRef = null;\n }\n this.anchorElement = null;\n this.panelOpen.set(false);\n if (this.savedActiveConversationId !== undefined) {\n this.restoreActiveConversation();\n }\n }\n\n private handleOverlayDisposed(): void {\n this.removeDismissHandlers();\n this.overlayRef = null;\n this.anchorElement = null;\n this.panelOpen.set(false);\n }\n\n private bindDismissHandlers(overlayElement: HTMLElement | null, anchor: HTMLElement | null): void {\n this.removeDismissHandlers();\n\n this.keydownHandler = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n this.disposeOverlayOnly();\n }\n };\n this.document.addEventListener('keydown', this.keydownHandler);\n\n this.outsideClickHandler = (event: MouseEvent) => {\n const target = event.target as Element | null;\n if (!target || !overlayElement) {\n return;\n }\n if (this.isInsideInteractiveSurface(target, overlayElement, anchor)) {\n return;\n }\n this.disposeOverlayOnly();\n };\n this.document.addEventListener('mousedown', this.outsideClickHandler);\n\n this.routerSubscription = this.router.events\n .pipe(filter((event): event is NavigationStart => event instanceof NavigationStart))\n .subscribe(() => {\n this.disposeOverlayOnly();\n });\n }\n\n /** Ignore clicks on the anchor, overlay panel, or nested dropdown menus. */\n private isInsideInteractiveSurface(\n target: Element,\n overlayElement: HTMLElement,\n anchor: HTMLElement | null,\n ): boolean {\n if (anchor?.contains(target) || overlayElement.contains(target)) {\n return true;\n }\n\n return Boolean(\n target.closest('ax-dropdown-panel, ax-button-item-list, ax-button-item, ax-dropdown-button, .ax-dropdown-panel'),\n );\n }\n\n private removeDismissHandlers(): void {\n if (this.keydownHandler) {\n this.document.removeEventListener('keydown', this.keydownHandler);\n this.keydownHandler = null;\n }\n\n if (this.outsideClickHandler) {\n this.document.removeEventListener('mousedown', this.outsideClickHandler);\n this.outsideClickHandler = null;\n }\n\n if (this.routerSubscription) {\n this.routerSubscription.unsubscribe();\n this.routerSubscription = null;\n }\n }\n\n private captureActiveConversation(): void {\n this.savedActiveConversationId = this.conversationService.activeConversationId();\n }\n\n private restoreActiveConversation(): void {\n if (this.savedActiveConversationId === undefined) {\n return;\n }\n\n const conversationId = this.savedActiveConversationId;\n this.savedActiveConversationId = undefined;\n this.conversationApi.reportFocusedConversation(\n typeof conversationId === 'string' ? conversationId : null,\n );\n void this.conversationService.selectConversation(conversationId as never);\n }\n\n private resolveAnchorElement(anchor: AXMMiniChatPanelAnchor): HTMLElement {\n if (anchor instanceof ElementRef) {\n return anchor.nativeElement;\n }\n\n if (anchor instanceof HTMLElement) {\n return anchor;\n }\n\n const hostCandidate = anchor as Element & { getHostElement?: () => HTMLElement };\n if (typeof hostCandidate.getHostElement === 'function') {\n return hostCandidate.getHostElement();\n }\n\n return anchor as HTMLElement;\n }\n\n private normalizePlacement(placement: AXMMiniChatPanelSide): AXPlacement {\n const aliases: Record<string, AXPlacement> = {\n 'top-left': 'top-start',\n 'top-right': 'top-end',\n 'bottom-left': 'bottom-start',\n 'bottom-right': 'bottom-end',\n left: 'start',\n right: 'end',\n };\n\n return aliases[placement] ?? (placement as AXPlacement);\n }\n\n private applyFixedPosition(\n overlayRef: AXOverlayRef<AXMMiniChatPanelComponent | AXMMiniChatInboxPanelHostComponent>,\n position: { x: number; y: number },\n ): void {\n const pane = overlayRef.overlayElement?.querySelector('.ax-overlay-pane') as HTMLElement | null;\n if (!pane) {\n return;\n }\n\n pane.style.position = 'fixed';\n pane.style.left = `${position.x}px`;\n pane.style.top = `${position.y}px`;\n pane.style.right = 'auto';\n pane.style.bottom = 'auto';\n pane.style.transform = 'none';\n }\n\n //#endregion\n}\n\n//#endregion\n","//#region ----- Imports -----\n\nimport { AXClosableComponent, AXComponentCloseEvent } from '@acorex/cdk/common';\nimport { AXButtonComponent } from '@acorex/components/button';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { AXLabelComponent } from '@acorex/components/label';\nimport { AXSearchBoxComponent } from '@acorex/components/search-box';\nimport { AXSwitchModule } from '@acorex/components/switch';\nimport { AXTextBoxComponent } from '@acorex/components/text-box';\nimport { AXToastService } from '@acorex/components/toast';\nimport {\n AXConversationAvatarComponent,\n AXConversationAvatarPickerComponent,\n AXConversationRegistryComponentOutletComponent,\n AXConversationService,\n AXConversationMessageUtilsService,\n AX_CONVERSATION_DEFAULT_MESSAGE_LIST_BACKGROUND_PRESET_ID,\n AX_CONVERSATION_MESSAGE_LIST_BACKGROUND_PRESETS,\n fetchConversationMediaPage,\n filterSupplementalInfoPanelMessages,\n getConversationMediaCategories,\n getConversationProfileFields,\n isMessageListThemeBackground,\n isSameMessageListBackground,\n mergeInfoPanelMessages,\n normalizeMessageListBackgroundValue,\n resolveMessageListBackgroundRaw,\n} from '@acorex/components/conversation';\nimport type {\n AXConversation,\n AXConversationMessage,\n AXConversationMessageListBackground,\n AXConversationMessageListThemeBackground,\n AXConversationMediaCategory,\n AXConversationParticipant,\n} from '@acorex/components/conversation';\nimport { AXTranslationModule, AXTranslationService } from '@acorex/core/translation';\nimport { AXPlatform } from '@acorex/core/platform';\nimport { AsyncPipe } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n OnDestroy,\n OnInit,\n output,\n signal,\n ViewEncapsulation,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\n\n//#endregion\n\n//#region ----- Types -----\n\ninterface AXMInfoPanelQuickAction {\n id: string;\n labelKey: string;\n icon: string;\n danger?: boolean;\n}\n\n//#endregion\n\n//#region ----- Component -----\n\n@Component({\n selector: 'axm-chat-conversation-info-panel',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n AsyncPipe,\n FormsModule,\n AXButtonComponent,\n AXDecoratorModule,\n AXLabelComponent,\n AXSearchBoxComponent,\n AXSwitchModule,\n AXTextBoxComponent,\n AXConversationAvatarPickerComponent,\n AXConversationAvatarComponent,\n AXConversationRegistryComponentOutletComponent,\n AXTranslationModule,\n ],\n providers: [{ provide: AXClosableComponent, useExisting: AXMChatConversationInfoPanelComponent }],\n templateUrl: './chat-conversation-info-panel.component.html',\n styleUrl: './chat-conversation-info-panel.component.css',\n})\nexport class AXMChatConversationInfoPanelComponent extends AXClosableComponent implements OnInit, OnDestroy {\n //#region ----- Services -----\n\n private readonly toastService = inject(AXToastService);\n readonly translation = inject(AXTranslationService);\n private readonly platform = inject(AXPlatform);\n private readonly injectedConversationService = inject(AXConversationService, { optional: true });\n\n //#endregion\n\n //#region ----- Popup State -----\n\n readonly onClosed = output<AXComponentCloseEvent>();\n\n /** Assigned by {@link AXPopupService} via `data`. */\n conversation!: AXConversation;\n /** Assigned by {@link AXPopupService} via `data`. */\n conversationService!: AXConversationService;\n\n readonly activeTab = signal<'profile' | 'manage'>('profile');\n readonly showMemberSearch = signal(false);\n readonly panelView = signal<'main' | 'media'>('main');\n readonly selectedMediaCategory = signal<AXConversationMediaCategory | null>(null);\n readonly mediaViewLoader = () =>\n import('./chat-conversation-info-media-view.component').then((m) => m.AXMChatConversationInfoMediaViewComponent);\n readonly conversationMessages = signal<AXConversationMessage[]>([]);\n readonly loadingMessages = signal(false);\n readonly loadingMoreMedia = signal(false);\n readonly mediaHasMore = signal(false);\n private mediaNextPage = 1;\n private mediaNextCursor: string | undefined;\n readonly memberSearchQuery = signal('');\n\n archived = false;\n\n private initialNotifications = false;\n private initialArchived = false;\n\n editTitle = '';\n editAvatar = '';\n\n private groupTitleSaveTimer: ReturnType<typeof setTimeout> | undefined;\n private groupDetailsSaveInFlight = false;\n\n readonly backgroundPresets = AX_CONVERSATION_MESSAGE_LIST_BACKGROUND_PRESETS.map((preset) => ({\n ...preset,\n label: this.translateBackgroundPresetLabel(preset.id),\n }));\n\n //#endregion\n\n //#region ----- Derived State -----\n\n readonly heroSubtitle = computed(() => {\n const conversation = this.liveConversation();\n if (!conversation) return '';\n return AXConversationMessageUtilsService.getConversationSubtitle(conversation);\n });\n\n readonly liveConversation = computed(() => {\n const conversation = this.conversation;\n if (!conversation?.id) return conversation;\n const fromStore = this.conversationService?.conversations().find((c) => c.id === conversation.id);\n return fromStore ?? conversation;\n });\n\n readonly isConversationMuted = computed(() => this.liveConversation()?.settings?.notifications === false);\n\n readonly profileFields = computed(() => {\n const conversation = this.liveConversation();\n if (!conversation) return [];\n return getConversationProfileFields(conversation, this.conversationService?.currentUser()?.id);\n });\n\n readonly mediaCategories = computed(() => {\n if (!this.conversation) return [];\n return getConversationMediaCategories(this.conversationMessages());\n });\n\n readonly quickActions = computed((): AXMInfoPanelQuickAction[] => {\n if (!this.conversation) return [];\n const muted = this.isConversationMuted();\n const actions: AXMInfoPanelQuickAction[] = [\n {\n id: 'mute',\n labelKey: muted ? '@acorex:chat.actions.unmute' : '@acorex:chat.actions.mute',\n icon: muted ? 'fa-light fa-bell-slash' : 'fa-light fa-bell',\n },\n ];\n\n if (!this.isPrivateConversation()) {\n actions.push({\n id: 'leave',\n labelKey: '@acorex:chat.actions.leave-and-delete',\n icon: 'fa-light fa-door-open',\n danger: true,\n });\n }\n\n return actions;\n });\n\n readonly filteredMembers = computed(() => {\n if (!this.conversation) return [];\n const query = this.memberSearchQuery().toLowerCase().trim();\n const members = this.conversation?.participants ?? [];\n if (!query) return members;\n return members.filter(\n (p) =>\n p.name.toLowerCase().includes(query) ||\n (p.description ?? '').toLowerCase().includes(query) ||\n (p.role ?? '').toLowerCase().includes(query),\n );\n });\n\n //#endregion\n\n //#region ----- Lifecycle -----\n\n ngOnInit(): void {\n const resolvedService = this.conversationService ?? this.injectedConversationService;\n if (!resolvedService) {\n console.warn('AXMChatConversationInfoPanelComponent opened without conversationService.');\n this.close();\n return;\n }\n this.conversationService = resolvedService;\n\n if (!this.conversation) {\n const activeConversation = this.conversationService.activeConversation();\n if (activeConversation) {\n this.conversation = activeConversation;\n } else {\n console.warn('AXMChatConversationInfoPanelComponent opened without conversation context.');\n this.close();\n return;\n }\n }\n\n this.initialNotifications = this.conversation.settings?.notifications ?? true;\n this.archived = this.conversation.archived ?? false;\n this.initialArchived = this.archived;\n this.editTitle = this.conversation.title || '';\n this.editAvatar = this.conversation.avatar || '';\n\n void this.loadConversationMessages();\n }\n\n ngOnDestroy(): void {\n if (this.groupTitleSaveTimer) {\n clearTimeout(this.groupTitleSaveTimer);\n this.groupTitleSaveTimer = undefined;\n void this.persistGroupDetails();\n }\n\n const currentNotifications = this.liveConversation()?.settings?.notifications ?? true;\n const hasChanges = currentNotifications !== this.initialNotifications || this.archived !== this.initialArchived;\n\n if (hasChanges) {\n this.toastService.success(this.translation.translateSync('@acorex:chat.info-panel.toasts.settings-saved'));\n }\n }\n\n //#endregion\n\n //#region ----- Data Loading -----\n\n private async loadConversationMessages(): Promise<void> {\n this.loadingMessages.set(true);\n this.mediaNextPage = 1;\n this.mediaNextCursor = undefined;\n this.mediaHasMore.set(false);\n\n try {\n const page = await fetchConversationMediaPage(\n this.conversationService.conversationApi,\n this.conversation.id,\n 0,\n );\n\n this.mediaHasMore.set(page.hasMore);\n this.mediaNextCursor = page.nextCursor;\n\n const supplemental =\n this.conversationService.activeConversationId() === this.conversation.id\n ? filterSupplementalInfoPanelMessages(this.conversationService.activeMessages())\n : [];\n\n this.conversationMessages.set(mergeInfoPanelMessages(page.items, supplemental));\n } catch (error) {\n console.error('Failed to load conversation media messages:', error);\n } finally {\n this.loadingMessages.set(false);\n }\n }\n\n async loadMoreMedia(): Promise<void> {\n if (!this.mediaHasMore() || this.loadingMoreMedia() || this.loadingMessages()) {\n return;\n }\n\n this.loadingMoreMedia.set(true);\n try {\n const page = await fetchConversationMediaPage(\n this.conversationService.conversationApi,\n this.conversation.id,\n this.mediaNextPage,\n undefined,\n this.mediaNextCursor,\n );\n\n this.mediaHasMore.set(page.hasMore);\n this.mediaNextCursor = page.nextCursor;\n this.mediaNextPage += 1;\n\n this.conversationMessages.set(mergeInfoPanelMessages(page.items, this.conversationMessages()));\n } catch (error) {\n console.error('Failed to load more conversation media:', error);\n } finally {\n this.loadingMoreMedia.set(false);\n }\n }\n\n //#endregion\n\n //#region ----- UI Helpers -----\n\n isPrivateConversation(): boolean {\n return this.conversation.type === 'private';\n }\n\n isGroupConversation(): boolean {\n return this.conversation.type === 'group' || this.conversation.type === 'channel';\n }\n\n membersSectionTitle(): string {\n return this.translation.translateSync('@acorex:chat.info-panel.tabs.members-count-upper', {\n params: { count: this.conversation.participants.length },\n });\n }\n\n getMemberRoleLabel(participant: AXConversationParticipant): string | null {\n switch (participant.role) {\n case 'admin':\n return '@acorex:chat.info-panel.member-role.admin';\n case 'moderator':\n return '@acorex:chat.info-panel.member-role.moderator';\n default:\n return null;\n }\n }\n\n onMemberSearchChange(value: string | null | undefined): void {\n this.memberSearchQuery.set(value ?? '');\n }\n\n setActiveTab(tab: 'profile' | 'manage'): void {\n this.activeTab.set(tab);\n }\n\n toggleMemberSearch(): void {\n this.showMemberSearch.update((value) => !value);\n if (!this.showMemberSearch()) {\n this.memberSearchQuery.set('');\n }\n }\n\n openMediaCategory(category: AXConversationMediaCategory): void {\n this.selectedMediaCategory.set(category);\n this.panelView.set('media');\n }\n\n closeMediaView(): void {\n this.panelView.set('main');\n this.selectedMediaCategory.set(null);\n }\n\n getMediaViewInputs(category: AXConversationMediaCategory): Record<string, unknown> {\n return {\n category,\n messages: this.conversationMessages(),\n conversation: this.conversation,\n conversationService: this.conversationService,\n hasMoreMedia: this.mediaHasMore(),\n loadingMoreMedia: this.loadingMoreMedia(),\n onLoadMoreMedia: () => this.loadMoreMedia(),\n onBack: () => this.closeMediaView(),\n };\n }\n\n getMediaRowLabel(category: AXConversationMediaCategory): string {\n return this.translation.translateSync(category.countLabelKey, {\n params: { count: category.count },\n });\n }\n\n getMemberSubtitle(participant: AXConversationParticipant): string {\n if (participant.status === 'online') {\n return this.translation.translateSync('@acorex:chat.status.online');\n }\n if (participant.description?.trim()) return participant.description.trim();\n if (participant.role && participant.role !== 'member') return participant.role;\n return '';\n }\n\n //#endregion\n\n //#region ----- Actions -----\n\n onQuickAction(actionId: string): void {\n switch (actionId) {\n case 'mute':\n void this.toggleConversationMute();\n break;\n case 'leave':\n void this.onLeave();\n break;\n }\n }\n\n async toggleConversationMute(): Promise<void> {\n const notificationsEnabled = this.liveConversation()?.settings?.notifications ?? true;\n await this.onNotificationsChange(!notificationsEnabled);\n }\n\n async onNotificationsChange(value: boolean): Promise<void> {\n try {\n await this.conversationService.updateConversationSettings(this.conversation.id, {\n notifications: value,\n });\n const settings = this.conversation.settings ?? { notifications: true, showPreview: true };\n this.conversation.settings = { ...settings, notifications: value };\n } catch (error) {\n console.error('Failed to update notifications:', error);\n }\n }\n\n async onArchivedChange(value: boolean): Promise<void> {\n const previous = this.archived;\n this.archived = value;\n try {\n await this.conversationService.updateConversation(this.conversation.id, { archived: value });\n this.conversation.archived = value;\n this.initialArchived = value;\n } catch {\n this.archived = previous;\n }\n }\n\n close(data?: unknown): void {\n const event = new AXComponentCloseEvent();\n event.component = this;\n event.data = data;\n this.onClosed.emit(event);\n }\n\n closeAll(): void {\n this.close();\n }\n\n async onLeave(): Promise<void> {\n const isGroup = this.isGroupConversation();\n await this.conversationService.deleteConversation(this.conversation.id);\n\n if (this.conversationService.activeConversation()?.id === this.conversation.id) {\n this.conversationService.closeActiveConversation();\n }\n\n this.toastService.success(\n isGroup\n ? this.translation.translateSync('@acorex:chat.info-panel.toasts.left-conversation')\n : this.translation.translateSync('@acorex:chat.info-panel.toasts.deleted-conversation'),\n );\n this.close();\n }\n\n onGroupTitleChange(value: string): void {\n this.editTitle = value;\n clearTimeout(this.groupTitleSaveTimer);\n this.groupTitleSaveTimer = setTimeout(() => void this.persistGroupDetails(), 400);\n }\n\n onGroupAvatarChange(value: string): void {\n this.editAvatar = value;\n void this.persistGroupDetails();\n }\n\n private async persistGroupDetails(): Promise<void> {\n if (this.isPrivateConversation() || this.groupDetailsSaveInFlight) {\n return;\n }\n\n const title = this.editTitle.trim();\n if (!title) {\n return;\n }\n\n const nextAvatar = this.editAvatar.trim() || undefined;\n const currentTitle = this.conversation.title || '';\n const currentAvatar = this.conversation.avatar || undefined;\n\n if (title === currentTitle && nextAvatar === currentAvatar) {\n return;\n }\n\n this.groupDetailsSaveInFlight = true;\n try {\n await this.conversationService.updateConversation(this.conversation.id, {\n title,\n avatar: nextAvatar,\n });\n this.conversation.title = title;\n this.conversation.avatar = nextAvatar;\n } catch (error) {\n console.error('Failed to update group details:', error);\n this.toastService.danger(this.translation.translateSync('@acorex:chat.info-panel.toasts.failed-group-update'));\n } finally {\n this.groupDetailsSaveInFlight = false;\n }\n }\n\n isBackgroundSelected(preset: { id: string; value: AXConversationMessageListThemeBackground }): boolean {\n this.platform.themeMode();\n const bg = this.conversation?.metadata?.['messageListBackground'] as\n | AXConversationMessageListBackground\n | undefined;\n if (\n bg === undefined ||\n bg === '' ||\n (isMessageListThemeBackground(bg) && !bg.light.trim() && !bg.dark.trim())\n ) {\n return preset.id === AX_CONVERSATION_DEFAULT_MESSAGE_LIST_BACKGROUND_PRESET_ID;\n }\n return isSameMessageListBackground(bg, preset.value, this.platform.isDark());\n }\n\n presetBackgroundPreview(preset: AXConversationMessageListThemeBackground): string {\n this.platform.themeMode();\n const raw = resolveMessageListBackgroundRaw(preset, this.platform.isDark()) ?? '';\n return normalizeMessageListBackgroundValue(raw);\n }\n\n async applyMessageListBackground(value: AXConversationMessageListBackground): Promise<void> {\n const isReset =\n value === '' || (isMessageListThemeBackground(value) && !value.light.trim() && !value.dark.trim());\n try {\n const metadata = { ...(this.conversation.metadata ?? {}) };\n if (isReset) {\n delete metadata.messageListBackground;\n } else {\n metadata.messageListBackground = value;\n }\n await this.conversationService.updateConversationMetadata(this.conversation.id, metadata);\n this.conversation.metadata = metadata;\n this.toastService.success(\n isReset\n ? this.translation.translateSync('@acorex:chat.info-panel.toasts.background-reset')\n : this.translation.translateSync('@acorex:chat.info-panel.toasts.background-updated'),\n );\n } catch (error) {\n console.error('Failed to update message list background:', error);\n this.toastService.danger(\n this.translation.translateSync('@acorex:chat.info-panel.toasts.failed-background-update'),\n );\n }\n }\n\n getBackgroundAriaLabel(label: string): string {\n return this.translation.translateSync('@acorex:chat.info-panel.background.set-label', {\n params: { label },\n });\n }\n\n private translateBackgroundPresetLabel(id: string): string {\n const labelKeys: Record<string, string> = {\n 'solid-default': '@acorex:chat.info-panel.background.presets.default',\n 'solid-graphite': '@acorex:chat.info-panel.background.presets.graphite',\n 'solid-olive': '@acorex:chat.info-panel.background.presets.olive',\n 'solid-sky': '@acorex:chat.info-panel.background.presets.sky',\n 'grad-aurora': '@acorex:chat.info-panel.background.presets.aurora',\n 'grad-sunset': '@acorex:chat.info-panel.background.presets.sunset',\n };\n return this.translation.translateSync(labelKeys[id] ?? id);\n }\n\n //#endregion\n}\n\n//#endregion\n","@if (conversation) {\n <div class=\"tg-info-panel\">\n @if (panelView() === 'media' && selectedMediaCategory(); as category) {\n <ax-conversation-registry-component-outlet\n [componentLoader]=\"mediaViewLoader\"\n [inputs]=\"getMediaViewInputs(category)\"\n />\n } @else {\n <div class=\"tg-info-panel__scroll\">\n <section class=\"tg-hero\">\n <ax-conversation-avatar kind=\"auto\" [conversation]=\"conversation\" [size]=\"96\" />\n <h2 class=\"tg-hero__title\">{{ conversation.title }}</h2>\n <p class=\"tg-hero__subtitle\">{{ heroSubtitle() }}</p>\n </section>\n\n <section class=\"tg-quick-actions\">\n @for (action of quickActions(); track action.id) {\n <button\n type=\"button\"\n class=\"tg-quick-action\"\n [class.tg-quick-action--danger]=\"action.danger\"\n [class.tg-quick-action--active]=\"action.id === 'mute' && isConversationMuted()\"\n (click)=\"onQuickAction(action.id)\"\n >\n <span class=\"tg-quick-action__icon\"><i [class]=\"action.icon\"></i></span>\n <span class=\"tg-quick-action__label\">{{ action.labelKey | translate | async }}</span>\n </button>\n }\n </section>\n\n <nav class=\"tg-tabs\" role=\"tablist\">\n <button\n type=\"button\"\n class=\"tg-tab\"\n role=\"tab\"\n [class.tg-tab--active]=\"activeTab() === 'profile'\"\n [attr.aria-selected]=\"activeTab() === 'profile'\"\n (click)=\"setActiveTab('profile')\"\n >\n {{ '@acorex:chat.info-panel.tabs.profile' | translate | async }}\n </button>\n <button\n type=\"button\"\n class=\"tg-tab\"\n role=\"tab\"\n [class.tg-tab--active]=\"activeTab() === 'manage'\"\n [attr.aria-selected]=\"activeTab() === 'manage'\"\n (click)=\"setActiveTab('manage')\"\n >\n {{ '@acorex:chat.info-panel.tabs.manage' | translate | async }}\n </button>\n </nav>\n\n @if (activeTab() === 'profile') {\n @if (profileFields().length > 0) {\n <section class=\"tg-section tg-details\">\n @for (field of profileFields(); track field.id) {\n <div class=\"tg-detail-row\">\n <span class=\"tg-detail-row__icon\"><i [class]=\"field.icon\"></i></span>\n <div class=\"tg-detail-row__content\">\n <span class=\"tg-detail-row__value\">{{ field.value }}</span>\n <span class=\"tg-detail-row__label\">{{ field.labelKey | translate | async }}</span>\n </div>\n </div>\n }\n </section>\n }\n\n @if (loadingMessages()) {\n <div class=\"tg-loading\">{{ '@acorex:chat.info-panel.media.loading' | translate | async }}</div>\n } @else if (mediaCategories().length > 0) {\n <section class=\"tg-section tg-media\">\n @for (category of mediaCategories(); track category.id) {\n <button type=\"button\" class=\"tg-media-row\" (click)=\"openMediaCategory(category)\">\n <span class=\"tg-media-row__icon\"><i [class]=\"category.icon\"></i></span>\n <span class=\"tg-media-row__label\">{{ getMediaRowLabel(category) }}</span>\n <i class=\"fa-light fa-chevron-right tg-media-row__chevron\"></i>\n </button>\n }\n </section>\n }\n\n @if (isGroupConversation()) {\n <section class=\"tg-section tg-members\">\n <div class=\"tg-section-header tg-section-header--row\">\n <span class=\"tg-section-header__title\">{{ membersSectionTitle() }}</span>\n <div class=\"tg-section-header__actions\">\n <button\n type=\"button\"\n class=\"tg-icon-btn\"\n (click)=\"toggleMemberSearch()\"\n [attr.aria-label]=\"'@acorex:chat.info-panel.placeholders.search-members' | translate | async\"\n >\n <i class=\"fa-light fa-magnifying-glass\"></i>\n </button>\n </div>\n </div>\n @if (showMemberSearch()) {\n <div class=\"tg-members-search-wrap\">\n <ax-search-box\n class=\"tg-members-search\"\n [value]=\"memberSearchQuery()\"\n (valueChange)=\"onMemberSearchChange($event)\"\n [placeholder]=\"'@acorex:chat.info-panel.placeholders.search-members' | translate | async\"\n ></ax-search-box>\n </div>\n }\n @for (participant of filteredMembers(); track participant.id) {\n <div class=\"tg-member-row\">\n <ax-conversation-avatar\n kind=\"user\"\n [userId]=\"participant.id\"\n [conversation]=\"conversation\"\n [size]=\"42\"\n />\n <div class=\"tg-member-row__content\">\n <span class=\"tg-member-row__name\">{{ participant.name }}</span>\n <span\n class=\"tg-member-row__meta\"\n [class.tg-member-row__meta--online]=\"participant.status === 'online'\"\n >\n {{ getMemberSubtitle(participant) }}\n </span>\n </div>\n @if (getMemberRoleLabel(participant); as roleLabel) {\n <span class=\"tg-member-row__badge\">{{ roleLabel | translate | async }}</span>\n }\n </div>\n }\n </section>\n }\n }\n\n @if (activeTab() === 'manage') {\n <section class=\"tg-section tg-manage\">\n @if (!isPrivateConversation()) {\n <div class=\"tg-manage-block\">\n <ax-label class=\"tg-manage-label\">{{\n '@acorex:chat.info-panel.group-details.title' | translate | async\n }}</ax-label>\n <ax-text-box\n [value]=\"editTitle\"\n (valueChange)=\"onGroupTitleChange($event)\"\n [placeholder]=\"'@acorex:chat.info-panel.placeholders.enter-group-title' | translate | async\"\n ></ax-text-box>\n <div class=\"tg-manage-avatar\">\n <ax-conversation-avatar-picker\n [(avatarUrl)]=\"editAvatar\"\n (avatarUrlChange)=\"onGroupAvatarChange($event)\"\n ></ax-conversation-avatar-picker>\n </div>\n </div>\n }\n\n <div class=\"tg-setting-row\">\n <div class=\"tg-setting-row__info\">\n <span class=\"tg-setting-row__title\">{{\n '@acorex:chat.info-panel.settings.archived' | translate | async\n }}</span>\n <span class=\"tg-setting-row__desc\">{{\n '@acorex:chat.info-panel.settings.archived-description' | translate | async\n }}</span>\n </div>\n <ax-switch [(ngModel)]=\"archived\" (ngModelChange)=\"onArchivedChange($event)\"></ax-switch>\n </div>\n\n <div class=\"tg-manage-block tg-background-block\">\n <ax-label class=\"tg-manage-label\">{{\n '@acorex:chat.info-panel.background.title' | translate | async\n }}</ax-label>\n <p class=\"tg-background-desc\">\n {{ '@acorex:chat.info-panel.background.description' | translate | async }}\n </p>\n <div class=\"tg-background-grid\">\n @for (preset of backgroundPresets; track preset.id) {\n <button\n type=\"button\"\n class=\"tg-background-swatch\"\n [class.tg-background-swatch--active]=\"isBackgroundSelected(preset)\"\n [style.background]=\"presetBackgroundPreview(preset.value)\"\n (click)=\"applyMessageListBackground(preset.value)\"\n [attr.aria-label]=\"getBackgroundAriaLabel(preset.label)\"\n >\n <span class=\"tg-background-swatch__label\">{{ preset.label }}</span>\n </button>\n }\n </div>\n <ax-button\n [text]=\"'@acorex:chat.info-panel.actions.reset-to-default' | translate | async\"\n [look]=\"'ghost'\"\n (onClick)=\"applyMessageListBackground('')\"\n ></ax-button>\n </div>\n </section>\n }\n </div>\n }\n </div>\n}\n","import type { AXClickEvent } from '@acorex/cdk/common';\nimport type { AXConversation } from '@acorex/components/conversation';\nimport { InjectionToken } from '@angular/core';\n\nexport interface AXMChatSidebarAction {\n id: string;\n label: string;\n icon: string;\n priority?: number;\n run(event?: AXClickEvent): Promise<AXConversation | null | void> | AXConversation | null | void;\n}\n\nexport const AXM_CHAT_SIDEBAR_ACTION_PROVIDER = new InjectionToken<AXMChatSidebarAction[]>(\n 'AXM_CHAT_SIDEBAR_ACTION_PROVIDER',\n);\n","import { AXClickEvent } from '@acorex/cdk/common';\nimport { AXButtonModule } from '@acorex/components/button';\nimport {\n AXConversation,\n AXConversationService,\n AXConversationNewDialogComponent,\n} from '@acorex/components/conversation';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { AXFabComponent, AXFabItemComponent } from '@acorex/components/fab';\nimport { AXPopupService } from '@acorex/components/popup';\nimport { AXTranslationModule, AXTranslationService } from '@acorex/core/translation';\nimport { AsyncPipe } from '@angular/common';\n\nimport { ChangeDetectionStrategy, Component, inject, output } from '@angular/core';\nimport { AXM_CHAT_SIDEBAR_ACTION_PROVIDER, type AXMChatSidebarAction } from './chat-sidebar-action.provider';\n\n/**\n * Replaces the default sidebar \"New conversation\" control with a split-style dropdown:\n * - New chat: {@link AXConversationNewDialogComponent} (human peers only; assist peers are excluded from user discovery).\n * - Optional extension actions are contributed via {@link AXM_CHAT_SIDEBAR_ACTION_PROVIDER}.\n */\n@Component({\n selector: 'axm-chat-sidebar-new-actions',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [AXButtonModule, AXFabComponent, AXFabItemComponent, AXDecoratorModule, AXTranslationModule, AsyncPipe],\n template: `\n <div class=\"new-conversation-button-container-inner\">\n @if (singleAction(); as action) {\n <ax-button\n class=\"new-conversation-direct-button rounded-full\"\n color=\"primary\"\n [iconOnly]=\"true\"\n [attr.aria-label]=\"(action.label | translate | async) ?? ''\"\n (onClick)=\"runAction(action, $event)\"\n >\n <ax-prefix>\n <ax-icon [icon]=\"action.icon\"></ax-icon>\n </ax-prefix>\n </ax-button>\n } @else {\n <ax-fab class=\"new-conversation-fab\" [popupStyle]=\"'box'\" #fab>\n <ax-icon icon=\"fa-light fa-plus\"></ax-icon>\n @for (action of actions(); track action.id) {\n <ax-fab-item [label]=\"(action.label | translate | async) ?? ''\" (onClick)=\"runAction(action, $event); fab.close()\">\n <ax-icon [icon]=\"action.icon\"></ax-icon>\n </ax-fab-item>\n }\n </ax-fab>\n }\n </div>\n `,\n styles: [\n `\n\n :host {\n display: block;\n }\n\n .new-conversation-button-container-inner {\n display: flex;\n justify-content: end;\n align-items: center;\n padding-inline-end: 0.25rem;\n }\n\n .new-conversation-fab {\n z-index: 1;\n }\n\n .new-conversation-direct-button {\n z-index: 1;\n }\n `,\n ],\n})\nexport class AXMChatSidebarNewActionsComponent {\n private readonly popupService = inject(AXPopupService);\n private readonly conversationService = inject(AXConversationService);\n private readonly translationService = inject(AXTranslationService);\n private readonly contributedActions = inject(AXM_CHAT_SIDEBAR_ACTION_PROVIDER, { optional: true }) ?? [];\n\n /** Fires with the new conversation id after create + select (parent typically navigates). */\n readonly conversationCreated = output<string>();\n\n readonly actions = (): AXMChatSidebarAction[] => {\n const base: AXMChatSidebarAction = {\n id: 'new-chat',\n label: '@conversation:new-conversation.actions.new-chat',\n icon: 'fa-light fa-comment',\n run: (event?: AXClickEvent) => this.openNewConversation(event),\n };\n return [base, ...this.contributedActions].sort((a, b) => (a.priority ?? 100) - (b.priority ?? 100));\n };\n\n readonly singleAction = (): AXMChatSidebarAction | null => {\n const items = this.actions();\n return items.length === 1 ? items[0] : null;\n };\n\n async runAction(action: AXMChatSidebarAction, event?: AXClickEvent): Promise<void> {\n const result = await action.run(event);\n if (result && typeof result === 'object' && 'id' in result) {\n await this.finishWithConversation(result as AXConversation);\n }\n }\n\n private async openNewConversation(event?: AXClickEvent): Promise<AXConversation | null> {\n event?.nativeEvent?.stopPropagation();\n const title = await this.translationService.translateAsync('@conversation:new-conversation.header');\n const result = await this.popupService.open(AXConversationNewDialogComponent, {\n title,\n size: 'sm',\n closeButton: true,\n data: {\n conversationService: this.conversationService,\n },\n });\n if (result?.data) {\n return result.data as AXConversation;\n }\n return null;\n }\n\n private async finishWithConversation(conversation: AXConversation): Promise<void> {\n if (this.conversationService.activeConversationId() !== conversation.id) {\n await this.conversationService.selectConversation(conversation.id);\n }\n this.conversationCreated.emit(conversation.id);\n }\n}\n","import { AXBadgeModule } from '@acorex/components/badge';\nimport { AXButtonComponent } from '@acorex/components/button';\n\nimport { AXPDeviceService } from '@acorex-platform/framework-client/core';\nimport { AXPTaskBadgeService, AXPThemeLayoutBlockComponent, AXPThemeLayoutStartSideComponent } from '@acorex-platform/framework-client/layout/components';\nimport { AXPPageLayoutBaseComponent, AXPPageLayoutComponent } from '@acorex-platform/framework-client/layout/views';\nimport {\n AXConversationComposerComponent,\n AXConversationComposerService,\n AXConversationContainerDirective,\n AXConversationInfoBarComponent,\n AXConversationInfoBarService,\n AXConversationMessageListComponent,\n AXConversationService,\n AXConversationSidebarComponent,\n} from '@acorex/components/conversation';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { AXDialogService } from '@acorex/components/dialog';\nimport { AXPopupService } from '@acorex/components/popup';\nimport { AXTranslationModule } from '@acorex/core/translation';\n\nimport { AsyncPipe } from '@angular/common';\nimport { afterNextRender, ChangeDetectionStrategy, Component, computed, effect, inject, ViewEncapsulation } from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { ActivatedRoute } from '@angular/router';\nimport { map } from 'rxjs';\nimport { AXM_CHAT_BADGE_KEY } from '../../badge.provider';\nimport { AXMMiniChatPanelService } from '../mini-chat/mini-chat-panel.service';\nimport { AXMAssistChatDebugModeService } from './plugins/actions/assist-chat-debug-mode.service';\nimport { AXMChatAssistComposerStarterPromptsComponent } from './plugins/composer/chat-assist-composer-starter-prompts.component';\nimport { AXMChatEmptyStateHostComponent } from './plugins/empty-state/chat-empty-state-host.component';\nimport { AXMChatConversationInfoPanelComponent } from './plugins/info-bar/chat-conversation-info-panel.component';\nimport { AXMChatConversationApi } from './plugins/services/chat-conversation-apis.abstract';\nimport { AXM_CONVERSATION_ASSIST_RESPONSE_PORT } from './services/conversation-assist-response.port';\nimport { AXMChatSidebarNewActionsComponent } from './plugins/side-bar/chat-sidebar-new-actions.component';\n\n@Component({\n selector: 'axm-chat',\n templateUrl: './chat.component.html',\n styleUrls: ['./chat.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n AXConversationContainerDirective,\n AXConversationSidebarComponent,\n AXConversationInfoBarComponent,\n AXConversationMessageListComponent,\n AXConversationComposerComponent,\n AXButtonComponent,\n AsyncPipe,\n AXBadgeModule,\n AXDecoratorModule,\n AXTranslationModule,\n AXPPageLayoutComponent,\n AXPThemeLayoutBlockComponent,\n AXPThemeLayoutStartSideComponent,\n AXMChatSidebarNewActionsComponent,\n AXMChatEmptyStateHostComponent,\n AXMChatAssistComposerStarterPromptsComponent,\n ],\n host: {\n '(keydown.escape)': 'onContainerEscape()',\n '[tabindex]': '\"-1\"',\n },\n})\nexport class AXMChatComponent extends AXPPageLayoutBaseComponent {\n //#region ---- Services & Dependencies ----\n\n private readonly conversationService = inject(AXConversationService);\n private readonly chatConversationApi = inject(AXMChatConversationApi);\n private readonly assistResponse = inject(AXM_CONVERSATION_ASSIST_RESPONSE_PORT, { optional: true });\n private readonly miniChatPanelService = inject(AXMMiniChatPanelService);\n private readonly composerService = inject(AXConversationComposerService);\n private readonly infoBarService = inject(AXConversationInfoBarService);\n /** Eagerly resolves tenant debug mode for assist debug download action visibility. */\n private readonly _assistChatDebugModeInit = inject(AXMAssistChatDebugModeService);\n private readonly activatedRoute = inject(ActivatedRoute);\n private readonly dialogService = inject(AXDialogService);\n private readonly popupService = inject(AXPopupService);\n private readonly badgeService = inject(AXPTaskBadgeService);\n protected readonly deviceService = inject(AXPDeviceService);\n private readonly routeConversationId = toSignal(this.activatedRoute.paramMap.pipe(map((params) => params.get('id'))), { initialValue: this.activatedRoute.snapshot.paramMap.get('id') });\n\n /**\n * Keeps conversation state aligned with the current route id.\n * This handles deep links, browser back/forward, and route reuse.\n */\n #syncConversationWithRoute = effect(() => {\n if (this.miniChatPanelService.panelOpen()) {\n return;\n }\n\n const conversationId = this.routeConversationId();\n const activeConversationId = this.conversationService.activeConversationId();\n\n this.chatConversationApi.reportFocusedConversation(conversationId);\n\n if (conversationId === activeConversationId) {\n return;\n }\n\n if (conversationId) {\n void this.#trySelectConversationFromRoute(conversationId);\n return;\n }\n\n void this.conversationService.selectConversation(null as never);\n this.infoBarService.hideComponent();\n this.composerService.hideComponent();\n this.composerService.draftText.set('');\n });\n\n override async ngOnInit(): Promise<void> {\n await super.ngOnInit();\n }\n\n /**\n * Selects the conversation for a deep-linked route; on failure shows an alert and returns to chat root.\n */\n async #trySelectConversationFromRoute(conversationId: string): Promise<void> {\n try {\n await this.conversationService.selectConversation(conversationId);\n } catch {\n const title = await this.translateService.translateAsync('@conversation:chat.route.error-title');\n const message = await this.translateService.translateAsync('@conversation:chat.route.conversation-not-found');\n await this.dialogService.alert(title, message, 'danger');\n this.conversationService.closeActiveConversation();\n this.#navigateToChatRoot();\n }\n }\n\n //#endregion\n\n //#region ---- Properties ----\n\n /**\n * Computed signal to check if there is an active conversation selected.\n */\n readonly hasActiveConversation = computed(() => {\n return this.conversationService.activeConversationId() !== null;\n });\n\n readonly showChatList = computed(() => {\n return this.deviceService.isMobileDevice() && !this.hasActiveConversation();\n });\n\n /**\n * Unread messages in other chats (excludes the open conversation), for the mobile back control.\n */\n readonly backBadgeCount = computed(() => {\n const total = this.badgeService.getCount(AXM_CHAT_BADGE_KEY)();\n const activeId = this.conversationService.activeConversationId();\n if (!activeId) {\n return total;\n }\n const activeUnread = this.conversationService.conversations().find((conversation) => conversation.id === activeId)?.unreadCount ?? 0;\n return Math.max(0, total - Math.max(0, activeUnread));\n });\n\n //#endregion\n\n //#region ---- Lifecycle Methods ----\n\n /** Mobile list route: open sidebar after layout exists (no `:id`). */\n #afterRenderInit = afterNextRender(() => {\n if (!this.activatedRoute.snapshot.paramMap.get('id') && this.deviceService.isMobileDevice()) {\n this.toggleStartSide();\n }\n });\n\n //#endregion\n\n //#region ---- UI Handlers ----\n\n /**\n * Handles conversation selection from the sidebar.\n * Navigates to the selected conversation route.\n * On mobile, closes the sidebar after selection.\n * @param conversationId - The ID of the selected conversation.\n */\n onConversationSelected(conversationId: string): void {\n const routeConversationId = this.routeConversationId();\n\n if (routeConversationId !== conversationId) {\n // URL is the source of truth; #syncConversationWithRoute selects the conversation.\n void this.router.navigate([this.#getAppRouteSegment(), 'chat', conversationId]);\n } else if (this.conversationService.activeConversationId() !== conversationId) {\n void this.conversationService.selectConversation(conversationId);\n }\n\n // On mobile, close the sidebar when a conversation is selected\n if (this.deviceService.isMobileDevice()) {\n this.toggleStartSide();\n }\n }\n\n /**\n * Navigates back to the conversation list (mobile view).\n * Removes the route param and clears the active conversation.\n * Opens the sidebar to show the conversation list.\n */\n openChatList(): void {\n this.#navigateToChatRoot();\n\n // On mobile, open the sidebar to show conversation list\n if (this.deviceService.isMobileDevice()) {\n this.toggleStartSide();\n }\n }\n\n /**\n * Opens the platform conversation info panel when the info-bar title/avatar area is clicked.\n */\n onInfoBarClick(): void {\n const conversation = this.conversationService.activeConversation();\n if (!conversation?.id?.trim()) {\n return;\n }\n\n void this.popupService.open(AXMChatConversationInfoPanelComponent, {\n title: conversation.title,\n closeButton: true,\n size: 'sm',\n data: {\n conversation,\n conversationService: this.conversationService,\n },\n });\n }\n\n /** Composer Stop — abort server-side assist generation and SSE stream updates. */\n onComposerGenerationCancelled(): void {\n const conversationId = this.conversationService.activeConversationId();\n if (!conversationId) {\n return;\n }\n void this.assistResponse?.cancelAssistGeneration(conversationId);\n }\n\n /**\n * Handles Escape key from chat container.\n * Replicates conversation source behavior by closing active conversation here.\n * Also keeps URL and chat state in sync.\n */\n onContainerEscape(): void {\n if (this.hasActiveConversation()) {\n this.conversationService.closeActiveConversation();\n }\n\n if (this.routeConversationId()) {\n this.#navigateToChatRoot();\n }\n }\n\n /**\n * Toggles the start side (sidebar) visibility.\n */\n protected override toggleStartSide(): void {\n this.layout()?.toggleStartSide();\n }\n\n /**\n * Navigates to chat root route and removes `:id` when it exists.\n */\n #navigateToChatRoot(): void {\n if (!this.routeConversationId()) {\n return;\n }\n\n void this.router.navigate([this.#getAppRouteSegment(), 'chat']);\n }\n\n /**\n * Returns current app segment used in chat routes.\n */\n #getAppRouteSegment(): string {\n return this.activatedRoute.snapshot.parent?.paramMap.get('app') || 'platform';\n }\n\n //#endregion\n}\n","<axp-page-layout #container axConversationContainer>\n <!-- Sidebar: Always visible on desktop, visible on mobile only when no conversation is selected -->\n\n <axp-layout-start-side class=\"border-e h-full\">\n <axp-layout-content class=\"flex flex-col min-h-0 max-w-80\">\n <div class=\"h-full flex flex-col shrink-0\">\n <ax-conversation-sidebar (conversationSelected)=\"onConversationSelected($event.id)\" class=\"group\">\n <ax-suffix>\n <div class=\"flex h-14 shrink-0 items-center justify-end overflow-hidden\">\n <axm-chat-sidebar-new-actions class=\"group-hover:!translate-y-0 translate-y-36! transition-transform duration-200\" (conversationCreated)=\"onConversationSelected($event)\" />\n </div>\n </ax-suffix>\n </ax-conversation-sidebar>\n </div>\n </axp-layout-content>\n </axp-layout-start-side>\n\n <!-- Chat content: Always visible on desktop, visible on mobile only when a conversation is selected -->\n\n <axp-page-content class=\"h-full overflow-hidden p-0! flex min-h-0 flex-col\">\n @if (showChatList()) {\n <ax-conversation-sidebar (conversationSelected)=\"onConversationSelected($event.id)\" class=\"group\">\n <ax-suffix>\n <div class=\"flex h-14 shrink-0 items-center justify-end overflow-hidden\">\n <axm-chat-sidebar-new-actions class=\"group-hover:!translate-y-0 translate-y-36! transition-transform duration-200\" (conversationCreated)=\"onConversationSelected($event)\" />\n </div>\n </ax-suffix>\n </ax-conversation-sidebar>\n } @else {\n <div class=\"flex h-full min-h-0 flex-1 flex-col\">\n <ax-conversation-info-bar class=\"shadow-md cursor-pointer hover:bg-lighter transition-colors\" (infoClick)=\"onInfoBarClick()\">\n <ax-prefix>\n <!-- ----- Back to conversation list on mobile ----- -->\n @if (deviceService.isMobileDevice()) {\n <ax-button look=\"blank\" class=\"axm-chat__back\" [attr.aria-label]=\"('@conversation:chat.actions.back-to-chats' | translate | async) ?? ''\" (onClick)=\"openChatList()\">\n <ax-prefix>\n <ax-icon class=\"axm-chat__back-icon\" icon=\"fa-light fa-chevron-left\"></ax-icon>\n </ax-prefix>\n <!--->\n <!-- ----- Unread count from other chats ----- -->\n @if (backBadgeCount() > 0) {\n <ax-badge size=\"sm\" look=\"solid\" color=\"primary\" [text]=\"'' + backBadgeCount()\"></ax-badge>\n }\n </ax-button>\n }\n <!-- ----- Close chat on desktop ----- -->\n @else {\n <ax-button class=\"rounded-full\" look=\"blank\" (onClick)=\"onContainerEscape()\" aria-label=\"Close Chat\">\n <ax-icon icon=\"fa-light fa-xmark text-xl\"></ax-icon>\n </ax-button>\n }\n </ax-prefix>\n </ax-conversation-info-bar>\n <ax-conversation-message-list class=\"min-h-0 flex-1 overflow-hidden\" style=\"direction: ltr\">\n <div ax-conversation-message-list-no-active class=\"block\" style=\"width: min(95%, 50rem)\">\n <axm-chat-empty-state-host (conversationCreated)=\"onConversationSelected($event)\" />\n </div>\n <axm-chat-assist-composer-starter-prompts ax-conversation-message-list-empty />\n </ax-conversation-message-list>\n </div>\n }\n </axp-page-content>\n\n <axp-page-footer class=\"block\">\n <ax-conversation-composer (generationCancelled)=\"onComposerGenerationCancelled()\" />\n </axp-page-footer>\n</axp-page-layout>\n","//#region ---- Imports ----\n\nimport { RootConfig } from '@acorex-platform/module-conversation-client/contracts';\nimport { AXPFileStorageStatus } from '@acorex-platform/framework-shared/core';\nimport { type AXPFileStorageService } from '@acorex-platform/framework-client/common';\n\n//#endregion\n\n//#region ---- Constants ----\n\n/** refType for multimedia attachments sent from conversation chat. */\nexport const AXM_CONVERSATION_CHAT_ATTACHMENT_REF_TYPE = `${RootConfig.module.name}.ChatAttachment`;\n\n/** File storage category for conversation chat attachments. */\nexport const AXM_CONVERSATION_CHAT_ATTACHMENT_CATEGORY = 'chat-attachment';\n\n//#endregion\n\n//#region ---- Persistence ----\n\n/**\n * Persists a chat attachment; {@link refId} is typically the conversation id (batch grouping for multi-send).\n */\nexport async function persistChatAttachment(\n fileStorage: AXPFileStorageService,\n file: File,\n refId: string,\n): Promise<{ fileId: string }> {\n const trimmed = refId.trim();\n if (!trimmed) {\n throw new Error('refId is required for chat attachment persistence.');\n }\n\n const info = await fileStorage.save({\n file,\n name: file.name,\n refId: trimmed,\n refType: AXM_CONVERSATION_CHAT_ATTACHMENT_REF_TYPE,\n category: AXM_CONVERSATION_CHAT_ATTACHMENT_CATEGORY,\n status: AXPFileStorageStatus.Temporary,\n });\n\n const fileId = info.fileId?.trim();\n if (!fileId) {\n throw new Error('File storage did not return a fileId.');\n }\n\n await fileStorage.commit(fileId);\n return { fileId };\n}\n\n//#endregion\n","//#region ---- Imports ----\n\nimport { InjectionToken } from '@angular/core';\nimport type { AXConversationSendMessageCommand } from '@acorex/components/conversation';\n\n//#endregion\n\n//#region ---- Port ----\n\nexport interface AXMConversationRegularAutoReplyPort {\n maybeGenerate(command: AXConversationSendMessageCommand, userMessageId: string, currentUserId: string): Promise<void>;\n}\n\nexport const AXM_CONVERSATION_REGULAR_AUTO_REPLY_PORT = new InjectionToken<AXMConversationRegularAutoReplyPort>(\n 'AXM_CONVERSATION_REGULAR_AUTO_REPLY_PORT',\n);\n\n//#endregion\n","//#region ---- Imports ----\n\nimport type { AXMessagePayload } from '@acorex-platform/module-conversation-client/contracts';\n\n//#endregion\n\n//#region ---- Payload helpers ----\n\n/**\n * Extracts display text from a message payload (text messages and captions).\n */\nexport function axmExtractTextFromPayload(payload: AXMessagePayload | undefined): string {\n if (!payload) {\n return '';\n }\n\n if (payload.type === 'text') {\n return payload.text;\n }\n\n const caption = (payload as { caption?: string }).caption;\n return typeof caption === 'string' ? caption : '';\n}\n\n//#endregion\n","import { RootConfig } from '@acorex-platform/module-conversation-client/contracts';\nimport { AXPEntityService } from '@acorex-platform/framework-client/layout/entity';\nimport { AXPFilterOperatorMiddlewareService } from '@acorex-platform/framework-client/common';\nimport type { AXConversationTextPayload } from '@acorex/components/conversation';\nimport { AXTranslationService } from '@acorex/core/translation';\nimport { inject, Injectable } from '@angular/core';\nimport { AXPUserReference } from '@acorex-platform/framework-shared/core';\nimport {\n AXM_COMMENT_LIKE_EMOJI,\n AXMConversationMessage,\n AXReaction,\n} from '@acorex-platform/module-conversation-client/contracts';\nimport { AXMConversationRoom } from '@acorex-platform/module-conversation-client/contracts';\nimport { AXMCommentEntityData } from '@acorex-platform/module-conversation-client/contracts';\nimport { AXMComment, AXMCommentThread } from './comment.type';\nimport { axmExtractTextFromPayload } from './comment-payload.util';\n\n//#region ---- Abstract Comment Service ----\n\nexport abstract class AXMCommentService {\n //#region ---- Comment Thread Service ----\n\n abstract createThread(entityRef: AXMCommentEntityData, topic: string, title?: string): Promise<AXMCommentThread>;\n abstract getThread(entityRef: AXMCommentEntityData, topic: string): Promise<AXMCommentThread | null>;\n abstract listThreads(entityRef: AXMCommentEntityData, topic: string): Promise<AXMCommentThread[]>;\n abstract updateThread(\n entityRef: AXMCommentEntityData,\n topic: string,\n data: Partial<{ title: string }>,\n ): Promise<AXMCommentThread>;\n abstract deleteThread(entityRef: AXMCommentEntityData, topic: string): Promise<boolean>;\n\n //#endregion\n\n //#region ---- Comment Service ----\n\n abstract addComment(\n threadId: string,\n content: string,\n parentCommentId?: string,\n contentType?: string,\n userId?: string,\n ): Promise<AXMComment>;\n abstract getComments(threadId: string, nested: boolean): Promise<AXMComment[]>;\n abstract getComment(commentId: string): Promise<AXMComment>;\n abstract editComment(commentId: string, content: string, contentType?: string): Promise<AXMComment>;\n abstract deleteComment(commentId: string): Promise<boolean>;\n\n //#endregion\n\n //#region ---- Comment Reaction Service ----\n\n abstract addReaction(commentId: string, emoji: string): Promise<AXMComment>;\n abstract removeReaction(commentId: string, emoji: string): Promise<AXMComment>;\n abstract getReactions(commentId: string): Promise<AXReaction[]>;\n abstract likeComment(commentId: string): Promise<AXMComment>;\n abstract unlikeComment(commentId: string): Promise<AXMComment>;\n\n //#endregion\n\n //#region ---- Comment Pin Service ----\n\n abstract pinComment(commentId: string): Promise<AXMComment>;\n abstract unpinComment(commentId: string): Promise<AXMComment>;\n\n //#endregion\n}\n\n//#endregion\n\n@Injectable({\n providedIn: 'root',\n})\nexport class AXMCommentServiceImpl {\n private readonly entityService = inject(AXPEntityService);\n private readonly roomService = this.entityService\n .withEntity(RootConfig.module.name, RootConfig.entities.room.name)\n .data<string, AXMConversationRoom>();\n private readonly messageService = this.entityService\n .withEntity(RootConfig.module.name, RootConfig.entities.message.name)\n .data<string, AXMConversationMessage>();\n private readonly filterService = inject(AXPFilterOperatorMiddlewareService);\n private readonly translationService = inject(AXTranslationService);\n\n async createThread(\n creatorUser: AXPUserReference,\n entityRef: AXMCommentEntityData,\n topic: string,\n title?: string,\n ): Promise<AXMConversationRoom> {\n const displayName = title || topic || `${entityRef.entityTypeId}#${entityRef.entityId}`;\n const now = new Date();\n const room: Omit<AXMConversationRoom, 'id'> = {\n kind: 'comment',\n type: 'group',\n name: displayName,\n title: title || `Comments for ${entityRef.entityTypeId}#${entityRef.entityId}`,\n topic,\n entityRef: { ...entityRef },\n participants: [\n {\n id: creatorUser.id,\n name: creatorUser.fullName ?? creatorUser.username ?? creatorUser.id,\n role: 'admin',\n },\n ],\n lastMessageAt: now,\n unreadCount: 0,\n status: { isTyping: false, typingUsers: [] },\n settings: { notifications: true, showPreview: true },\n createdAt: now,\n updatedAt: now,\n };\n const newRoomId = await this.roomService.create(room);\n return this.requireRoom(newRoomId);\n }\n\n async getThread(entityRef: AXMCommentEntityData, topic: string): Promise<AXMConversationRoom | null> {\n const { items } = await this.roomService.query({\n skip: 0,\n take: 1,\n filter: {\n logic: 'and',\n filters: [\n {\n field: 'kind',\n value: 'comment',\n operator: this.filterService.getOperator('equal') as never,\n },\n {\n field: 'entityRef.entityId',\n value: entityRef.entityId,\n operator: this.filterService.getOperator('equal') as never,\n },\n {\n field: 'entityRef.entityTypeId',\n value: entityRef.entityTypeId,\n operator: this.filterService.getOperator('equal') as never,\n },\n {\n field: 'topic',\n value: topic,\n operator: this.filterService.getOperator('equal') as never,\n },\n ],\n },\n });\n\n return items[0] || null;\n }\n\n async listThreads(entityRef: AXMCommentEntityData, topic: string): Promise<AXMConversationRoom[]> {\n const { items } = await this.roomService.query({\n skip: 0,\n take: 100,\n filter: {\n logic: 'and',\n filters: [\n {\n field: 'kind',\n value: 'comment',\n operator: this.filterService.getOperator('equal') as never,\n },\n {\n field: 'entityRef.entityId',\n value: entityRef.entityId,\n operator: this.filterService.getOperator('equal') as never,\n },\n {\n field: 'entityRef.entityTypeId',\n value: entityRef.entityTypeId,\n operator: this.filterService.getOperator('equal') as never,\n },\n {\n field: 'topic',\n value: topic,\n operator: this.filterService.getOperator('equal') as never,\n },\n ],\n },\n });\n\n return items;\n }\n\n async updateThread(threadId: string, data: Partial<{ title: string }>): Promise<AXMConversationRoom> {\n await this.roomService.update(threadId, { ...data, updatedAt: new Date() });\n return this.requireRoom(threadId);\n }\n\n async deleteThread(threadId: string): Promise<boolean> {\n await this.roomService.delete(threadId);\n return true;\n }\n\n async addComment(\n threadId: string,\n content: string,\n author: AXPUserReference,\n parentCommentId?: string,\n _contentType = 'text',\n ): Promise<AXMConversationMessage> {\n const plainTitle =\n content.replace(/<[^>]+>/g, '').trim() ||\n (await this.translationService.translateAsync('@conversation:terms.common.comment'));\n const payload: AXConversationTextPayload = { type: 'text', text: content };\n const now = new Date();\n const message: Omit<AXMConversationMessage, 'id'> = {\n conversationId: threadId,\n senderId: author.id,\n type: 'text',\n timestamp: now,\n payload,\n status: 'sent',\n reactions: [],\n name: plainTitle,\n title: plainTitle,\n ...(parentCommentId ? { replyTo: { id: parentCommentId } as AXMConversationMessage } : {}),\n };\n const messageId = await this.messageService.create(message);\n return this.requireMessage(messageId);\n }\n\n async getComments(threadId: string): Promise<AXMConversationMessage[]> {\n const { items } = await this.messageService.query({\n skip: 0,\n filter: {\n field: 'conversationId',\n value: threadId,\n operator: this.filterService.getOperator('equal') as never,\n },\n sort: [{ field: 'timestamp', dir: 'asc' } as never],\n take: 500,\n });\n return items;\n }\n\n async getComment(commentId: string): Promise<AXMConversationMessage> {\n return this.requireMessage(commentId);\n }\n\n async editComment(\n commentId: string,\n content: string,\n _editor: AXPUserReference,\n _contentType = 'text',\n ): Promise<AXMConversationMessage> {\n const plainTitle =\n content.replace(/<[^>]+>/g, '').trim() ||\n (await this.translationService.translateAsync('@conversation:terms.common.comment'));\n const payload: AXConversationTextPayload = { type: 'text', text: content };\n await this.messageService.update(commentId, {\n name: plainTitle,\n title: plainTitle,\n payload,\n editedAt: new Date(),\n });\n return this.requireMessage(commentId);\n }\n\n async deleteComment(commentId: string): Promise<boolean> {\n await this.messageService.delete(commentId);\n return true;\n }\n\n async updateReactions(commentId: string, reactions: AXReaction[]): Promise<AXMConversationMessage> {\n await this.messageService.update(commentId, { reactions });\n return this.requireMessage(commentId);\n }\n\n async getReactions(commentId: string): Promise<AXReaction[]> {\n const comment = await this.requireMessage(commentId);\n return comment.reactions || [];\n }\n\n async pinComment(commentId: string, pinned: boolean): Promise<AXMConversationMessage> {\n await this.messageService.update(commentId, { pinned });\n return this.requireMessage(commentId);\n }\n\n private async requireRoom(id: string): Promise<AXMConversationRoom> {\n const room = await this.roomService.byKey(id);\n if (!room) {\n throw new Error(`Room ${id} not found`);\n }\n return room;\n }\n\n private async requireMessage(id: string): Promise<AXMConversationMessage> {\n const message = await this.messageService.byKey(id);\n if (!message) {\n throw new Error(`Message ${id} not found`);\n }\n return message;\n }\n}\n\nexport { axmExtractTextFromPayload };\n","import { Injectable } from '@angular/core';\nimport { Observable, Subject } from 'rxjs';\nimport { AXMCommentEvent, AXMThreadEvent } from './comment.type';\n\nexport abstract class AXMCommentRealtimeService {\n abstract readonly comment$: Observable<AXMCommentEvent>;\n abstract readonly thread$: Observable<AXMThreadEvent>;\n\n abstract notifyComment(event: AXMCommentEvent): void;\n abstract notifyThread(event: AXMThreadEvent): void;\n}\n\n@Injectable({\n providedIn: 'root',\n})\nexport class AXMCommentRealtimeServiceImpl extends AXMCommentRealtimeService {\n private readonly _comment$ = new Subject<AXMCommentEvent>();\n readonly comment$ = this._comment$.asObservable();\n\n private readonly _thread$ = new Subject<AXMThreadEvent>();\n readonly thread$ = this._thread$.asObservable();\n\n notifyComment(event: AXMCommentEvent): void {\n this._comment$.next(event);\n }\n\n notifyThread(event: AXMThreadEvent): void {\n this._thread$.next(event);\n }\n}\n","import { AXMSecurityManagementUsersEntityModel } from '@acorex-platform/module-security-management-client/contracts';\nimport { inject, Injectable } from '@angular/core';\nimport { AXPEntityService } from '@acorex-platform/framework-client/layout/entity';\n\nimport { AXMCommentEntityData } from '@acorex-platform/module-conversation-client/contracts';\nimport { AXMComment, AXMCommentThread } from './comment.type';\nimport { AXMCommentServiceImpl } from './comment.service';\nimport { AXPSessionService } from '@acorex-platform/framework-client/auth';\nimport { AXMCommentRealtimeService } from './comment-realtime.service';\nimport { AXPUserReference } from '@acorex-platform/framework-shared/core';\nimport {\n AXM_COMMENT_LIKE_EMOJI,\n AXMConversationMessage,\n AXMConversationRoom,\n AXReaction,\n} from '@acorex-platform/module-conversation-client/contracts';\nimport { axmCoerceDate } from '../chat/plugins/utils/conversation-time.util';\n\n//#region ---- Comment Management Service ----\n\n@Injectable({\n providedIn: 'root',\n})\nexport class AXMCommentManagementService {\n //#region ---- Services & Dependencies ----\n\n private readonly entityService = inject(AXPEntityService);\n private readonly commentImplService = inject(AXMCommentServiceImpl);\n private readonly sessionService = inject(AXPSessionService);\n private readonly usersService = this.entityService\n .withEntity('SecurityManagement', 'User')\n .data<string, AXMSecurityManagementUsersEntityModel>();\n private readonly realtimeService = inject(AXMCommentRealtimeService);\n\n //#endregion\n\n //#region ---- User helpers ----\n\n private getCurrentUser(): AXPUserReference {\n const user = this.sessionService.user;\n if (!user) {\n throw new Error('No authenticated user found.');\n }\n return {\n id: user.id,\n type: 'user',\n fullName: user.title,\n username: user.name,\n };\n }\n\n private async getUserInfo(userId: string): Promise<AXPUserReference> {\n const user = await this.usersService.byKey(userId);\n if (!user) {\n throw new Error(`User with ID ${userId} not found`);\n }\n return {\n id: userId,\n type: 'user',\n fullName: user.displayName,\n username: user.username,\n };\n }\n\n //#endregion\n\n //#region ---- Formatting ----\n\n private formatComment(message: AXMConversationMessage, depth = 0): AXMComment {\n return {\n ...message,\n timestamp: axmCoerceDate(message.timestamp),\n editedAt: message.editedAt ? axmCoerceDate(message.editedAt) : undefined,\n deletedAt: message.deletedAt ? axmCoerceDate(message.deletedAt) : undefined,\n reactions: (message.reactions || []).map((reaction) => ({\n ...reaction,\n timestamp: axmCoerceDate(reaction.timestamp),\n })),\n depth,\n replies: [],\n replyCount: 0,\n };\n }\n\n private buildCommentTree(comments: AXMComment[]): AXMComment[] {\n const commentMap = new Map<string, AXMComment>(comments.map((c) => [c.id, c]));\n const tree: AXMComment[] = [];\n\n comments.forEach((comment) => {\n const parentId = comment.replyTo?.id;\n if (parentId && commentMap.has(parentId)) {\n const parent = commentMap.get(parentId)!;\n parent.replies.push(comment);\n comment.depth = (parent.depth ?? 0) + 1;\n } else {\n tree.push(comment);\n }\n });\n\n commentMap.forEach((comment) => {\n comment.replyCount = comment.replies.length;\n });\n\n return tree;\n }\n\n private async formatThread(room: AXMConversationRoom): Promise<AXMCommentThread> {\n const comments = await this.getComments(room.id, true);\n return {\n ...room,\n comments,\n commentCount: comments.length,\n };\n }\n\n //#endregion\n\n //#region ---- Thread operations ----\n\n async createThread(entityRef: AXMCommentEntityData, topic: string, title?: string): Promise<AXMCommentThread> {\n const currentUser = this.getCurrentUser();\n const newRoom = await this.commentImplService.createThread(currentUser, entityRef, topic, title);\n const newThread = await this.formatThread(newRoom);\n this.realtimeService.notifyThread({ type: 'add', payload: newThread });\n return newThread;\n }\n\n async getThread(entityRef: AXMCommentEntityData, topic: string): Promise<AXMCommentThread | null> {\n const room = await this.commentImplService.getThread(entityRef, topic);\n if (!room) {\n return null;\n }\n return this.formatThread(room);\n }\n\n async listThreads(entityRef: AXMCommentEntityData, topic: string): Promise<AXMCommentThread[]> {\n const rooms = await this.commentImplService.listThreads(entityRef, topic);\n return Promise.all(rooms.map((room) => this.formatThread(room)));\n }\n\n async updateThread(\n entityRef: AXMCommentEntityData,\n topic: string,\n data: Partial<{ title: string }>,\n ): Promise<AXMCommentThread> {\n const thread = await this.getThread(entityRef, topic);\n if (!thread) {\n throw new Error(`Thread for entity ${entityRef.entityTypeId}#${entityRef.entityId} not found.`);\n }\n const updatedRoom = await this.commentImplService.updateThread(thread.id, data);\n const updatedThread = await this.formatThread(updatedRoom);\n this.realtimeService.notifyThread({ type: 'update', payload: updatedThread });\n return updatedThread;\n }\n\n async deleteThread(entityRef: AXMCommentEntityData, topic: string): Promise<boolean> {\n const thread = await this.getThread(entityRef, topic);\n if (thread) {\n await this.commentImplService.deleteThread(thread.id);\n this.realtimeService.notifyThread({ type: 'remove', payload: thread.id });\n return true;\n }\n return false;\n }\n\n //#endregion\n\n //#region ---- Comment operations ----\n\n async addComment(\n threadId: string,\n content: string,\n parentCommentId?: string,\n contentType = 'text',\n userId?: string,\n ): Promise<AXMComment> {\n const author = userId ? await this.getUserInfo(userId) : this.getCurrentUser();\n const rawComment = await this.commentImplService.addComment(\n threadId,\n content,\n author,\n parentCommentId,\n contentType,\n );\n const formattedComment = this.formatComment(rawComment);\n this.realtimeService.notifyComment({ type: 'add', payload: formattedComment });\n return formattedComment;\n }\n\n async getComments(threadId: string, nested: boolean): Promise<AXMComment[]> {\n const rawComments = await this.commentImplService.getComments(threadId);\n const formattedComments = rawComments.map((c) => this.formatComment(c));\n if (nested) {\n return this.buildCommentTree(formattedComments);\n }\n return formattedComments;\n }\n\n async getComment(commentId: string): Promise<AXMComment> {\n const rawComment = await this.commentImplService.getComment(commentId);\n return this.formatComment(rawComment);\n }\n\n async editComment(commentId: string, content: string, contentType = 'text'): Promise<AXMComment> {\n const editor = this.getCurrentUser();\n const rawComment = await this.commentImplService.editComment(commentId, content, editor, contentType);\n const formattedComment = this.formatComment(rawComment);\n this.realtimeService.notifyComment({ type: 'update', payload: formattedComment });\n return formattedComment;\n }\n\n async deleteComment(commentId: string): Promise<boolean> {\n const result = await this.commentImplService.deleteComment(commentId);\n if (result) {\n this.realtimeService.notifyComment({ type: 'remove', payload: commentId });\n }\n return result;\n }\n\n //#endregion\n\n //#region ---- Reactions ----\n\n async addReaction(commentId: string, emoji: string): Promise<AXMComment> {\n const author = this.getCurrentUser();\n const comment = await this.commentImplService.getComment(commentId);\n const reactions = comment.reactions || [];\n\n if (reactions.some((r) => r.userId === author.id && r.emoji === emoji)) {\n return this.formatComment(comment);\n }\n\n const updatedReactions: AXReaction[] = [\n ...reactions,\n { emoji, userId: author.id, timestamp: new Date() },\n ];\n const rawComment = await this.commentImplService.updateReactions(commentId, updatedReactions);\n const formattedComment = this.formatComment(rawComment);\n this.realtimeService.notifyComment({ type: 'update', payload: formattedComment });\n return formattedComment;\n }\n\n async removeReaction(commentId: string, emoji: string): Promise<AXMComment> {\n const author = this.getCurrentUser();\n const comment = await this.commentImplService.getComment(commentId);\n const updatedReactions = (comment.reactions || []).filter(\n (r) => !(r.userId === author.id && r.emoji === emoji),\n );\n\n const rawComment = await this.commentImplService.updateReactions(commentId, updatedReactions);\n const formattedComment = this.formatComment(rawComment);\n this.realtimeService.notifyComment({ type: 'update', payload: formattedComment });\n return formattedComment;\n }\n\n getReactions(commentId: string): Promise<AXReaction[]> {\n return this.commentImplService.getReactions(commentId);\n }\n\n likeComment(commentId: string): Promise<AXMComment> {\n return this.addReaction(commentId, AXM_COMMENT_LIKE_EMOJI);\n }\n\n unlikeComment(commentId: string): Promise<AXMComment> {\n return this.removeReaction(commentId, AXM_COMMENT_LIKE_EMOJI);\n }\n\n //#endregion\n\n //#region ---- Pin ----\n\n async pinComment(commentId: string): Promise<AXMComment> {\n const rawComment = await this.commentImplService.pinComment(commentId, true);\n const formattedComment = this.formatComment(rawComment);\n this.realtimeService.notifyComment({ type: 'update', payload: formattedComment });\n return formattedComment;\n }\n\n async unpinComment(commentId: string): Promise<AXMComment> {\n const rawComment = await this.commentImplService.pinComment(commentId, false);\n const formattedComment = this.formatComment(rawComment);\n this.realtimeService.notifyComment({ type: 'update', payload: formattedComment });\n return formattedComment;\n }\n\n //#endregion\n}\n\n//#endregion\n","import type { AXPInAppNotificationCreateRequest } from '@acorex-platform/framework-client/common';\nimport { AXPUserReference } from '@acorex-platform/framework-shared/core';\nimport { AXMComment, AXMCommentThread } from './comment.type';\nimport { axmExtractTextFromPayload } from './comment-payload.util';\n\n//#region ---- Comment in-app notification helper ----\n\nexport function buildCommentInAppNotificationRequest(\n thread: AXMCommentThread,\n comment: AXMComment,\n receiver: AXPUserReference,\n): AXPInAppNotificationCreateRequest {\n const body = axmExtractTextFromPayload(comment.payload) || 'New comment';\n\n return {\n id: `comment-in-app:${comment.id}`,\n name: thread.title || 'Comment',\n title: thread.title || 'New comment',\n body,\n icon: 'fa-light fa-comment',\n priority: 'Notice',\n receiver,\n data: {\n threadId: thread.id,\n entityTypeId: thread.entityRef?.entityTypeId,\n entityId: thread.entityRef?.entityId,\n moduleName: thread.entityRef?.moduleName,\n entityName: thread.entityRef?.entityName,\n },\n };\n}\n\n//#endregion\n","import {\n AXWysiwygContainerComponent,\n AXWysiwygModule,\n} from '@acorex/components/wysiwyg';\nimport {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n ElementRef,\n inject,\n input,\n OnInit,\n signal,\n viewChild,\n ViewEncapsulation,\n} from '@angular/core';\n\nimport { AXStyleLookType } from '@acorex/cdk/common';\nimport { AXDialogService } from '@acorex/components/dialog';\nimport { AXToastService } from '@acorex/components/toast';\nimport { AXPUserReference } from '@acorex-platform/framework-shared/core';\n\nimport { animate, style, transition, trigger } from '@angular/animations';\nimport { DomSanitizer } from '@angular/platform-browser';\nimport { AXMComment, AXMCommentThread } from './comment.type';\n\nimport { AXAvatarModule } from '@acorex/components/avatar';\nimport { AXButtonModule } from '@acorex/components/button';\nimport { AXCommentModule } from '@acorex/components/comment';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { AXDropdownModule } from '@acorex/components/dropdown';\nimport { AXDropdownButtonModule } from '@acorex/components/dropdown-button';\nimport { AXFormModule } from '@acorex/components/form';\nimport { AXImageModule } from '@acorex/components/image';\nimport { AXLoadingModule } from '@acorex/components/loading';\nimport { AXSkeletonModule } from '@acorex/components/skeleton';\nimport { AXToolBarModule } from '@acorex/components/toolbar';\nimport { AXFormatModule } from '@acorex/core/format';\nimport {\n AXTranslationModule,\n AXTranslationService,\n} from '@acorex/core/translation';\nimport {\n AXP_IN_APP_NOTIFICATION_SERVICE,\n type AXPInAppNotificationService,\n} from '@acorex-platform/framework-client/common';\nimport { AXPSessionService } from '@acorex-platform/framework-client/auth';\nimport {\n AXPStateMessageComponent,\n AXPUserAvatarComponent,\n AXPUserCardDirective,\n} from '@acorex-platform/framework-client/layout/components';\nimport { AsyncPipe } from '@angular/common';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { FormsModule } from '@angular/forms';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { filter } from 'rxjs';\nimport { AXM_COMMENT_LIKE_EMOJI } from '@acorex-platform/module-conversation-client/contracts';\nimport { AXMCommentManagementService } from './comment-management.service';\nimport { axmExtractTextFromPayload } from './comment-payload.util';\nimport { buildCommentInAppNotificationRequest } from './comment-notification.helper';\nimport { AXMCommentRealtimeService } from './comment-realtime.service';\n\nconst HIGHLIGHT_DURATION_MS = 2500;\nconst SUBMIT_COOLDOWN_MS = 100;\n\n@Component({\n templateUrl: './comment.component.html',\n styleUrl: './comment.component.css',\n selector: 'axm-comment',\n encapsulation: ViewEncapsulation.None,\n animations: [\n trigger('fadeIn', [\n transition(':enter', [\n style({ opacity: 0, transform: 'translateY(10px)' }),\n animate(\n '300ms ease-out',\n style({ opacity: 1, transform: 'translateY(0)' }),\n ),\n ]),\n ]),\n ],\n imports: [\n AXWysiwygModule,\n AXSkeletonModule,\n AXDecoratorModule,\n AXCommentModule,\n AXButtonModule,\n AXAvatarModule,\n AXImageModule,\n AXLoadingModule,\n AXDropdownModule,\n AXFormatModule,\n AXTranslationModule,\n AsyncPipe,\n AXFormModule,\n AXToolBarModule,\n FormsModule,\n AXDropdownButtonModule,\n AXPUserAvatarComponent,\n AXPUserCardDirective,\n AXPStateMessageComponent,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class AXMCommentComponent implements OnInit {\n //#region ---- Inputs ----\n\n refrenceType = input.required<string>();\n refrenceId = input.required<string>();\n subject = input.required<string>();\n\n //#endregion\n\n //#region ---- State Signals ----\n\n moduleName = signal<string | undefined>(undefined);\n entityName = signal<string | undefined>(undefined);\n\n protected hasCooldown = signal(false);\n protected commentContent = signal('');\n protected isSubmitting = signal(false);\n protected isReplyingMode = signal(false);\n protected isEditingMode = signal(false);\n protected isLoading = signal(true);\n protected activeReplyComment = signal<\n (AXMComment & { userName: string }) | undefined\n >(undefined);\n protected activeEditComment = signal<\n (AXMComment & { userName: string }) | undefined\n >(undefined);\n protected highlightedCommentId = signal<string | null>(null);\n protected expandedCommentIds = signal(new Set<string>());\n protected comments = signal<AXMComment[]>([]);\n protected thread = signal<AXMCommentThread | undefined>(undefined);\n protected wysiwygOptions = signal<{ look: AXStyleLookType }>({\n look: 'solid',\n });\n\n //#endregion\n\n //#region ---- View Children ----\n\n protected wysiwygEditor =\n viewChild.required<AXWysiwygContainerComponent>('w');\n\n //#endregion\n\n //#region ---- Services & Dependencies ----\n\n private readonly commentService = inject(AXMCommentManagementService);\n private readonly realtimeService = inject(AXMCommentRealtimeService);\n private readonly sessionService = inject(AXPSessionService);\n private readonly toastService = inject(AXToastService);\n private readonly dialogService = inject(AXDialogService);\n private readonly inAppNotificationService = inject(AXP_IN_APP_NOTIFICATION_SERVICE, {\n optional: true,\n }) as AXPInAppNotificationService | null;\n private readonly router = inject(Router);\n private readonly activatedRoute = inject(ActivatedRoute);\n private readonly sanitizer = inject(DomSanitizer);\n private readonly translationService = inject(AXTranslationService);\n private readonly destroyRef = inject(DestroyRef);\n private readonly elementRef = inject(ElementRef);\n\n //#endregion\n\n //#region ---- Lifecycle ----\n\n ngOnInit(): void {\n this.moduleName.set(this.activatedRoute.snapshot.params['module'] || null);\n this.entityName.set(this.activatedRoute.snapshot.params['entity'] || null);\n this.loadComments().finally(() => {\n setTimeout(() => this.isLoading.set(false), 250);\n });\n\n this.realtimeService.comment$\n .pipe(\n takeUntilDestroyed(this.destroyRef),\n filter((event) => !!event),\n )\n .subscribe((event) => {\n switch (event.type) {\n case 'add':\n this.handleAddComment(event.payload as AXMComment);\n break;\n case 'update':\n this.handleUpdateComment(event.payload as AXMComment);\n break;\n case 'remove':\n this.removeMessageById(event.payload as string);\n break;\n }\n });\n }\n\n //#endregion\n\n //#region ---- Data Loading ----\n\n async loadComments(): Promise<void> {\n try {\n const entityRef = {\n entityTypeId: this.refrenceType(),\n entityId: this.refrenceId(),\n moduleName: this.moduleName(),\n entityName: this.entityName(),\n };\n const thread = await this.commentService.getThread(\n entityRef,\n this.subject(),\n );\n\n if (thread) {\n this.thread.set(thread);\n this.comments.set(thread.comments || []);\n } else {\n const newThread = await this.commentService.createThread(\n entityRef,\n this.subject(),\n );\n this.thread.set(newThread);\n this.comments.set(newThread.comments || []);\n }\n } catch (error) {\n console.error('Failed to load comments:', error);\n this.showTranslatedToast('messages.error.load-comments', 'danger');\n this.comments.set([]);\n }\n }\n\n //#endregion\n\n //#region ---- Comment Actions ----\n\n /** Opens edit mode for the target comment (or its reply). */\n protected editMessage(\n comment: AXMComment,\n reply?: AXMComment,\n userName?: string,\n ): void {\n const target = reply || comment;\n this.isReplyingMode.set(false);\n this.activeReplyComment.set(undefined);\n this.isEditingMode.set(true);\n this.activeEditComment.set({ ...target, userName: userName || '' });\n this.commentContent.set(axmExtractTextFromPayload(target.payload));\n this.wysiwygEditor()\n .getHostElement()\n .scrollIntoView({ behavior: 'smooth', block: 'start' });\n }\n\n /** Opens reply mode, optionally mentioning a specific reply author. */\n protected replyMessage(\n comment: AXMComment,\n reply?: AXMComment,\n userName?: string,\n ): void {\n this.isEditingMode.set(false);\n this.activeEditComment.set(undefined);\n this.isReplyingMode.set(true);\n this.activeReplyComment.set({ ...comment, userName: userName || '' });\n\n if (reply) {\n const mention = `<strong><a data-id=\"${reply.senderId}\">@${userName || reply.senderId}</a></strong> `;\n this.commentContent.set(mention);\n this.setEditorContent(mention);\n this.wysiwygEditor()?.focus();\n }\n this.wysiwygEditor()\n .getHostElement()\n .scrollIntoView({ behavior: 'smooth', block: 'start' });\n }\n\n protected async deleteComment(commentId: string): Promise<void> {\n const [dialogTitle, dialogMessage, deleteText, deletingText, cancelText] =\n await Promise.all([\n this.t('confirmations.delete-comment.title'),\n this.t('confirmations.delete-comment.message'),\n this.t('actions.delete.title'),\n this.t('confirmations.delete-comment.deleting'),\n this.t('actions.cancel.title'),\n ]);\n\n const dialog = this.dialogService.open({\n icon: 'fa-regular fa-warning',\n content: dialogMessage,\n title: dialogTitle,\n type: 'danger',\n orientation: 'horizontal',\n buttons: [\n {\n text: deleteText,\n color: 'danger',\n onClick: async (e: any) => {\n e.handled = true;\n e.source.text = deletingText;\n e.source.disabled = true;\n e.source.loading = true;\n try {\n await this.commentService.deleteComment(commentId);\n this.removeMessageById(commentId);\n this.showTranslatedToast(\n 'messages.success.comment-deleted',\n 'success',\n );\n if (\n this.isEditingMode() &&\n this.activeEditComment()?.id === commentId\n ) {\n this.resetReplyEditState();\n }\n dialog.close();\n } catch (error) {\n if (typeof error === 'string') {\n this.showToast(error, 'danger');\n } else {\n this.showTranslatedToast(\n 'messages.error.delete-comment',\n 'danger',\n );\n }\n }\n },\n },\n {\n text: cancelText,\n color: 'default',\n autofocus: true,\n onClick: () => dialog.close(),\n },\n ],\n closeButton: false,\n });\n }\n\n protected resetReplyEditState(): void {\n this.isEditingMode.set(false);\n this.activeEditComment.set(undefined);\n this.isReplyingMode.set(false);\n this.activeReplyComment.set(undefined);\n this.commentContent.set('');\n this.clearEditorContent();\n }\n\n protected async submitComment(): Promise<void> {\n this.isSubmitting.set(true);\n try {\n const currentThread = this.thread();\n if (!currentThread) return;\n\n if (this.isEditingMode() && this.activeEditComment()?.id) {\n await this.commentService.editComment(\n this.activeEditComment()!.id,\n this.commentContent(),\n );\n this.hasCooldown.set(true);\n this.isEditingMode.set(false);\n this.activeEditComment.set(undefined);\n } else {\n const parentCommentId = this.activeReplyComment()?.id;\n const newComment = await this.commentService.addComment(\n currentThread.id,\n this.commentContent(),\n parentCommentId,\n );\n this.hasCooldown.set(true);\n if (parentCommentId) {\n this.expandReplies(parentCommentId);\n }\n this.isReplyingMode.set(false);\n this.activeReplyComment.set(undefined);\n\n if (newComment?.id) {\n this.scrollToAndHighlight(newComment.id);\n }\n }\n\n this.commentContent.set('');\n this.clearEditorContent();\n setTimeout(() => this.hasCooldown.set(false), SUBMIT_COOLDOWN_MS);\n } catch (error) {\n console.error('Error submitting comment:', error);\n if (typeof error === 'string') {\n this.showToast(error, 'danger');\n } else {\n this.showTranslatedToast('messages.error.submit-comment', 'danger');\n }\n } finally {\n this.isSubmitting.set(false);\n }\n }\n\n //#endregion\n\n //#region ---- Reactions ----\n\n protected async toggleLike(comment: AXMComment): Promise<void> {\n const isLiked = this.isLikedByUser(comment);\n this.updateLikeStatus(comment.id, !isLiked);\n try {\n if (isLiked) {\n await this.commentService.unlikeComment(comment.id);\n } else {\n await this.commentService.likeComment(comment.id);\n }\n } catch (error) {\n console.error('Failed to toggle like:', error);\n this.updateLikeStatus(comment.id, isLiked);\n }\n }\n\n protected isLikedByUser(comment: AXMComment): boolean {\n const user = this.getCurrentUser();\n if (!user) return false;\n return (comment.reactions || []).some(\n (r) => r.userId === user.id && r.emoji === AXM_COMMENT_LIKE_EMOJI,\n );\n }\n\n protected getReactionsCount(comment: AXMComment): number {\n return (comment.reactions || []).filter(\n (r) => r.emoji === AXM_COMMENT_LIKE_EMOJI,\n ).length;\n }\n\n //#endregion\n\n //#region ---- Replies Expansion ----\n\n protected isRepliesExpanded(commentId: string): boolean {\n return this.expandedCommentIds().has(commentId);\n }\n\n protected onRepliesExpandedChange(\n commentId: string,\n expanded: boolean,\n ): void {\n this.expandedCommentIds.update((ids) => {\n const next = new Set(ids);\n if (expanded) {\n next.add(commentId);\n } else {\n next.delete(commentId);\n }\n return next;\n });\n }\n\n private expandReplies(commentId: string): void {\n this.expandedCommentIds.update((ids) => {\n const next = new Set(ids);\n next.add(commentId);\n return next;\n });\n }\n\n //#endregion\n\n //#region ---- Scroll & Highlight ----\n\n /**\n * Scrolls to the referenced comment and triggers a highlight pulse animation.\n * Expands parent replies if needed to ensure the target is in the DOM.\n */\n protected scrollMain(): void {\n const comment = this.isReplyingMode()\n ? this.activeReplyComment()\n : this.activeEditComment();\n if (!comment?.id) return;\n\n if (comment.replyTo?.id) {\n this.expandReplies(comment.replyTo.id);\n }\n\n this.scrollToAndHighlight(comment.id);\n }\n\n /**\n * Scrolls to a comment element and applies a highlight pulse animation.\n * Uses setTimeout to wait for Angular to render after signal updates.\n */\n private scrollToAndHighlight(commentId: string): void {\n this.highlightedCommentId.set(null);\n\n setTimeout(() => {\n const el = this.elementRef.nativeElement.querySelector(\n `ax-comment-item[id=\"${commentId}\"]`,\n );\n if (!el) return;\n\n el.scrollIntoView({ behavior: 'smooth', block: 'center' });\n this.highlightedCommentId.set(commentId);\n setTimeout(\n () => this.highlightedCommentId.set(null),\n HIGHLIGHT_DURATION_MS,\n );\n });\n }\n\n //#endregion\n\n //#region ---- HTML Sanitization ----\n\n protected sanitizeHtml(htmlContent: string | undefined) {\n if (!htmlContent) return this.sanitizer.bypassSecurityTrustHtml('');\n return this.sanitizer.bypassSecurityTrustHtml(htmlContent);\n }\n\n //#endregion\n\n //#region ---- Realtime Event Handlers ----\n\n private handleAddComment(comment: AXMComment): void {\n if (comment.senderId !== this.getCurrentUser()?.id && this.thread()) {\n void this.inAppNotificationService?.create(\n buildCommentInAppNotificationRequest(\n this.thread()!,\n comment,\n this.sessionService.user as unknown as AXPUserReference,\n ),\n );\n }\n const parentId = comment.replyTo?.id;\n if (parentId) {\n this.expandReplies(parentId);\n this.comments.update((comments) =>\n comments.map((c) => {\n if (c.id === parentId) {\n const newReplies = c.replies ? [...c.replies, comment] : [comment];\n return { ...c, replies: newReplies, replyCount: newReplies.length };\n }\n return c;\n }),\n );\n } else {\n this.comments.update((comments) => [...comments, comment]);\n }\n }\n\n private handleUpdateComment(updatedComment: AXMComment): void {\n const update = (list: AXMComment[]): AXMComment[] =>\n list.map((c) => {\n if (c.id === updatedComment.id) {\n return {\n ...c,\n ...updatedComment,\n replies: c.replies,\n replyCount: c.replyCount,\n depth: c.depth,\n };\n }\n if (c.replies?.length) {\n return { ...c, replies: update(c.replies) };\n }\n return c;\n });\n this.comments.update((comments) => update(comments));\n }\n\n //#endregion\n\n //#region ---- Private Helpers ----\n\n private getCurrentUser(): AXPUserReference | null {\n const user = this.sessionService.user;\n return user ? { id: user.id, type: 'user' } : null;\n }\n\n private updateLikeStatus(commentId: string, willBeLiked: boolean): void {\n const findAndToggle = (comments: AXMComment[]): AXMComment[] =>\n comments.map((c) => {\n if (c.id === commentId) {\n const user = this.getCurrentUser();\n if (!user) return c;\n const reactions = willBeLiked\n ? [\n ...(c.reactions || []),\n {\n emoji: AXM_COMMENT_LIKE_EMOJI,\n userId: user.id,\n timestamp: new Date(),\n },\n ]\n : (c.reactions || []).filter(\n (r) =>\n r.userId !== user.id || r.emoji !== AXM_COMMENT_LIKE_EMOJI,\n );\n return { ...c, reactions };\n }\n if (c.replies?.length) {\n return { ...c, replies: findAndToggle(c.replies) };\n }\n return c;\n });\n this.comments.update((comments) => findAndToggle(comments));\n }\n\n private removeMessageById(commentId: string): void {\n const filterOut = (comments: AXMComment[]): AXMComment[] =>\n comments\n .filter((c) => c.id !== commentId)\n .map((c) => {\n if (c.replies?.length) {\n return { ...c, replies: filterOut(c.replies) };\n }\n return c;\n });\n this.comments.update((comments) => filterOut(comments));\n }\n\n /** Workaround: Quill editor may not sync immediately with ngModel on clear */\n private clearEditorContent(): void {\n const editor = this.elementRef.nativeElement.querySelector('.ql-editor');\n if (editor) editor.innerHTML = '';\n }\n\n /** Workaround: Quill editor may not sync immediately with ngModel on set */\n private setEditorContent(html: string): void {\n const editor = this.elementRef.nativeElement.querySelector('.ql-editor');\n if (editor) editor.innerHTML = html;\n }\n\n /** Shorthand translator scoped to the comments feature */\n private t(key: string): Promise<string> {\n return this.translationService.translateAsync(\n `@conversation:comments.${key}`,\n );\n }\n\n private showToast(content: string, color: 'success' | 'danger'): void {\n this.toastService.show({\n content,\n color,\n location: 'bottom-center',\n closeButton: true,\n timeOut: 3000,\n timeOutProgress: true,\n });\n }\n\n private async showTranslatedToast(\n key: string,\n color: 'success' | 'danger',\n ): Promise<void> {\n const content = await this.t(key);\n this.showToast(content, color);\n }\n\n protected getCommentText(comment: AXMComment): string {\n return axmExtractTextFromPayload(comment.payload);\n }\n\n //#endregion\n}\n","<div class=\"axm-comment size-full flex flex-col overflow-hidden\">\n <div class=\"axm-comment__list flex-1 min-h-0 overflow-y-auto\">\n <ax-comment-container>\n @if (isLoading()) {\n <div class=\"axm-comment__skeleton\">\n <ax-skeleton class=\"size-10 shrink-0 rounded-full\"></ax-skeleton>\n <div class=\"axm-comment__skeleton-body\">\n <ax-skeleton class=\"h-4 w-32 rounded\"></ax-skeleton>\n <ax-skeleton class=\"h-3 w-full rounded-full\"></ax-skeleton>\n <ax-skeleton class=\"h-3 w-11/12 rounded-full\"></ax-skeleton>\n <ax-skeleton class=\"h-3 w-4/5 rounded-full\"></ax-skeleton>\n </div>\n </div>\n } @else if (comments().length > 0) {\n <ax-comment-view class=\"axm-comment__view\">\n @for (comment of comments(); track comment.id) {\n <ax-comment-item\n [id]=\"comment.id!\"\n [replyCount]=\"comment.replyCount\"\n [repliesExpanded]=\"isRepliesExpanded(comment.id!)\"\n (repliesExpandedChange)=\"\n onRepliesExpandedChange(comment.id!, $event)\n \"\n [class.highlighted]=\"highlightedCommentId() === comment.id\"\n [@fadeIn]\n >\n <axp-user-avatar\n #user\n [size]=\"36\"\n [userId]=\"comment.senderId\"\n [axpUserCard]=\"comment.senderId\"\n ngProjectAs=\"'ax-avatar'\"\n ></axp-user-avatar>\n <ax-title class=\"axm-comment__author\" [axpUserCard]=\"comment.senderId\">{{\n user.title()\n }}</ax-title>\n <ax-comment-date class=\"axm-comment__date\">\n {{ comment.timestamp | format: 'timeleft' | async }}\n </ax-comment-date>\n <ax-comment-menu-options>\n <ax-button\n class=\"axm-comment__menu-btn ax-sm\"\n look=\"blank\"\n color=\"neutral\"\n >\n <ax-icon icon=\"fa-regular fa-ellipsis\"></ax-icon>\n </ax-button>\n <ax-dropdown-panel>\n <ax-button-item-list>\n <ax-button-item\n [text]=\"\n ('@conversation:comments.actions.edit.title'\n | translate\n | async) ?? ''\n \"\n color=\"neutral\"\n (click)=\"editMessage(comment, undefined, user.title())\"\n >\n <ax-prefix>\n <ax-icon icon=\"fa-light fa-pen\"></ax-icon>\n </ax-prefix>\n </ax-button-item>\n <ax-button-item\n [text]=\"\n ('@conversation:comments.actions.delete.title'\n | translate\n | async) ?? ''\n \"\n color=\"danger\"\n (click)=\"deleteComment(comment.id!)\"\n >\n <ax-prefix>\n <ax-icon icon=\"fa-light fa-trash-can\"></ax-icon>\n </ax-prefix>\n </ax-button-item>\n </ax-button-item-list>\n </ax-dropdown-panel>\n </ax-comment-menu-options>\n <ax-content\n [innerHTML]=\"sanitizeHtml(getCommentText(comment))\"\n ></ax-content>\n <ax-comment-like\n (click)=\"toggleLike(comment)\"\n [like]=\"isLikedByUser(comment)\"\n >\n {{ getReactionsCount(comment) }}\n </ax-comment-like>\n <ax-comment-reply-text\n (click)=\"replyMessage(comment, undefined, user.title())\"\n ></ax-comment-reply-text>\n\n @for (reply of comment.replies; track reply.id) {\n <ax-comment-item\n [id]=\"reply.id\"\n [class.highlighted]=\"highlightedCommentId() === reply.id\"\n [@fadeIn]\n >\n <axp-user-avatar\n #replyUser\n [size]=\"36\"\n [userId]=\"reply.senderId\"\n [axpUserCard]=\"reply.senderId\"\n ngProjectAs=\"'ax-avatar'\"\n ></axp-user-avatar>\n <ax-title class=\"axm-comment__author\" [axpUserCard]=\"reply.senderId\">{{\n replyUser.title()\n }}</ax-title>\n <ax-comment-date class=\"axm-comment__date\">\n {{ reply.timestamp | format: 'timeleft' | async }}\n </ax-comment-date>\n <ax-comment-menu-options>\n <ax-button\n class=\"axm-comment__menu-btn ax-sm\"\n look=\"blank\"\n color=\"neutral\"\n >\n <ax-icon icon=\"fa-regular fa-ellipsis\"></ax-icon>\n </ax-button>\n <ax-dropdown-panel>\n <ax-button-item-list>\n <ax-button-item\n [text]=\"\n ('@conversation:comments.actions.edit.title'\n | translate\n | async) ?? ''\n \"\n color=\"neutral\"\n (click)=\"\n editMessage(comment, reply, replyUser.title())\n \"\n >\n <ax-prefix>\n <ax-icon icon=\"fa-light fa-pen\"></ax-icon>\n </ax-prefix>\n </ax-button-item>\n <ax-button-item\n [text]=\"\n ('@conversation:comments.actions.delete.title'\n | translate\n | async) ?? ''\n \"\n color=\"danger\"\n (click)=\"deleteComment(reply.id!)\"\n >\n <ax-prefix>\n <ax-icon icon=\"fa-light fa-trash-can\"></ax-icon>\n </ax-prefix>\n </ax-button-item>\n </ax-button-item-list>\n </ax-dropdown-panel>\n </ax-comment-menu-options>\n <ax-content\n [innerHTML]=\"sanitizeHtml(getCommentText(reply))\"\n ></ax-content>\n <ax-comment-like\n (click)=\"toggleLike(reply)\"\n [like]=\"isLikedByUser(reply)\"\n >\n {{ getReactionsCount(reply) }}\n </ax-comment-like>\n <ax-comment-reply-text\n (click)=\"replyMessage(comment, reply, replyUser.title())\"\n ></ax-comment-reply-text>\n </ax-comment-item>\n }\n </ax-comment-item>\n }\n </ax-comment-view>\n }\n <!-- ----- Empty state when no comments exist ----- -->\n @else {\n <axp-state-message\n icon=\"fa-light fa-comments\"\n [title]=\"\n '@conversation:comments.components.comment.empty-states.no-comments.title'\n \"\n [description]=\"\n '@conversation:comments.components.comment.empty-states.no-comments.description'\n \"\n >\n </axp-state-message>\n }\n </ax-comment-container>\n </div>\n\n <div class=\"axm-comment__composer\">\n @if (isReplyingMode() || isEditingMode()) {\n <div class=\"axm-comment__context\">\n <button\n type=\"button\"\n class=\"axm-comment__context-main\"\n (click)=\"scrollMain()\"\n >\n <i\n class=\"fa-light axm-comment__context-icon\"\n [class.fa-reply]=\"isReplyingMode()\"\n [class.fa-pen]=\"isEditingMode()\"\n ></i>\n <div class=\"axm-comment__context-copy\">\n <p class=\"axm-comment__context-label\">\n @if (isReplyingMode()) {\n {{\n '@conversation:comments.actions.reply-to' | translate | async\n }}\n <span>{{ activeReplyComment()?.userName }}</span>\n } @else {\n {{\n '@conversation:comments.actions.edit-message'\n | translate\n | async\n }}\n }\n </p>\n <div\n class=\"axm-comment__context-preview\"\n [innerHTML]=\"\n isReplyingMode()\n ? sanitizeHtml(getCommentText(activeReplyComment()!))\n : sanitizeHtml(getCommentText(activeEditComment()!))\n \"\n ></div>\n </div>\n </button>\n <button\n type=\"button\"\n class=\"axm-comment__context-close\"\n (click)=\"resetReplyEditState()\"\n [attr.aria-label]=\"\n ('@conversation:comments.actions.cancel.title'\n | translate\n | async) ?? 'Cancel'\n \"\n >\n <i class=\"fa-light fa-xmark\"></i>\n </button>\n </div>\n }\n\n <div class=\"axm-comment__editor\">\n <ax-wysiwyg-container\n #w\n [look]=\"wysiwygOptions().look\"\n [(ngModel)]=\"commentContent\"\n >\n <ax-wysiwyg-view class=\"min-h-24\"></ax-wysiwyg-view>\n <ax-wysiwyg-toolbar>\n <ax-prefix>\n <ax-wysiwyg-history></ax-wysiwyg-history>\n <ax-wysiwyg-font-style></ax-wysiwyg-font-style>\n <ax-wysiwyg-colors></ax-wysiwyg-colors>\n <ax-wysiwyg-list></ax-wysiwyg-list>\n <ax-wysiwyg-alignment></ax-wysiwyg-alignment>\n </ax-prefix>\n <ax-suffix>\n <ax-button\n look=\"solid\"\n color=\"primary\"\n class=\"ax-sm\"\n [disabled]=\"hasCooldown() || !commentContent()\"\n (click)=\"submitComment()\"\n [text]=\"\n '@conversation:comments.actions.send.title' | translate | async\n \"\n >\n @if (isSubmitting()) {\n <ax-loading></ax-loading>\n }\n </ax-button>\n </ax-suffix>\n </ax-wysiwyg-toolbar>\n </ax-wysiwyg-container>\n </div>\n </div>\n</div>\n","\nimport { AXPEntityAction, AXPEntityCommandScope, AXPEntityMasterSingleLayoutView } from '@acorex-platform/framework-shared/entity';\nimport {\n AXPEntityActionPlugin,\n cloneLayoutArrays,\n ensureLayoutPropertyView,\n ensureLayoutSection,\n ensureListActions,\n actionExists,\n resolveEntityPluginDetailPageOrder,\n} from '@acorex-platform/framework-client/layout/entity';\n\n/** How to show comments in entity single view: as a section (default) or as a separate page. */\nexport type CommentsDisplayMode = 'section' | 'page';\n\n/** Component key used when display is 'page'. Register a page component with this key via AXP_PAGE_COMPONENT_PROVIDER. */\nexport const COMMENTS_PAGE_COMPONENT_KEY = 'entity-comments-page';\n\nexport type CommentsPluginOptions = {\n /** Where to show comments: section (inline) or page (separate tab). Default 'section' */\n display?: CommentsDisplayMode;\n /** Icon for the comments page (when display is 'page'). Default 'fa-light fa-comments' */\n icon?: string;\n /** Title override for comments section/page. Default '@conversation:terms.common.comments' */\n title?: string;\n};\n\n/**\n * Comments plugin.\n * - When display is 'section' (default), adds a section to the single layout with the comment widget.\n * - When display is 'page', adds a page to entity.pages with COMMENTS_PAGE_COMPONENT_KEY.\n * - Always adds a list action to open the comment popup.\n */\nexport const commentsPlugin: AXPEntityActionPlugin = {\n name: 'comments',\n order: 50,\n apply: (ctx, options?: CommentsPluginOptions) => {\n const opts = options ?? {};\n const displayMode: CommentsDisplayMode = opts.display ?? 'section';\n const displayTitle = opts.title?.trim() || '@conversation:terms.common.comments';\n\n //#region ---- Group & Property ----\n\n const groups = ctx.groups.list() ?? [];\n if (!groups.some((g: any) => g.id === 'comments')) {\n ctx.groups.add({ id: 'comments', title: displayTitle } as any);\n }\n\n const props = ctx.properties.list();\n if (!props.some((p: any) => p.name === 'comments')) {\n ctx.properties.add({\n name: 'comments',\n title: displayTitle,\n groupId: 'comments',\n schema: {\n dataType: 'object',\n interface: {\n type: 'comment',\n options: {\n refrenceType: `${ctx.entity.module}.${ctx.entity.name}`,\n refrenceId: '{{ context.eval(\"id\") }}',\n subject: '{{ context.eval(\"title\", { pipes: [\"translate\"] }) }}',\n },\n },\n },\n } as any);\n }\n\n //#endregion\n\n //#region ---- Display Mode ----\n\n if (displayMode === 'section') {\n ctx.interfaces.master.single.update((single) => {\n const next: any = cloneLayoutArrays(\n (single ?? { title: ctx.entity.title, sections: [], properties: [] }) as AXPEntityMasterSingleLayoutView,\n );\n ensureLayoutSection(next, { id: 'comments', title: displayTitle, order: 100 } as any);\n ensureLayoutPropertyView(next, {\n name: 'comments',\n layout: {\n label: { visible: false },\n positions: { lg: { colSpan: 12, order: 7 } },\n },\n } as any);\n return next;\n });\n } else {\n ctx.entity.pages ??= [];\n const pageExists = ctx.entity.pages.some((p: any) => p.componentKey === COMMENTS_PAGE_COMPONENT_KEY);\n const pageOrder = resolveEntityPluginDetailPageOrder(\n { relatedEntities: ctx.entity.relatedEntities, pages: ctx.entity.pages },\n 'comments',\n {\n componentKey: COMMENTS_PAGE_COMPONENT_KEY,\n skipPage: pageExists ? { componentKey: COMMENTS_PAGE_COMPONENT_KEY } : undefined,\n },\n );\n const page = {\n componentKey: COMMENTS_PAGE_COMPONENT_KEY,\n title: displayTitle,\n icon: opts.icon ?? 'fa-light fa-comments',\n layout: { order: pageOrder },\n } as any;\n if (!pageExists) {\n ctx.entity.pages.push(page);\n } else {\n const pages = ctx.entity.pages as any[];\n const index = pages.findIndex((p) => p.componentKey === COMMENTS_PAGE_COMPONENT_KEY);\n if (index >= 0) {\n pages[index] = { ...pages[index], ...page };\n }\n }\n }\n\n //#endregion\n\n //#region ---- List Actions ----\n\n ensureListActions(ctx);\n ctx.interfaces.update((i) => {\n const actions = (i as any).master.list.actions as AXPEntityAction[];\n const cmdName = 'show-comment-popup';\n if (!actionExists(actions, cmdName)) {\n actions.push({\n title: '@conversation:actions.show-comment-popup',\n command: {\n name: cmdName,\n options: {\n refId: '{{ context.eval(\"id\") }}',\n refType: `${ctx.entity.module}.${ctx.entity.name}`,\n subject: '{{ context.eval(\"title\", { pipes: [\"translate\"] }) }}',\n },\n },\n priority: 'secondary',\n type: 'comments',\n separated: true,\n scope: AXPEntityCommandScope.Individual,\n });\n }\n return i as any;\n });\n\n //#endregion\n },\n};\n","import { AXPCommand, type AXPCommandExecuteResultPromise } from '@acorex-platform/framework-shared/runtime';\nimport { AXMReactionType } from '@acorex-platform/module-conversation-client/contracts';\nimport { AXPRuntimeCommandResult } from '@acorex-platform/framework-shared/core';\n\nimport { Injectable } from '@angular/core';\n\nexport interface AXMAddReactionCommandInput {\n commentId: string;\n reaction: AXMReactionType;\n}\n\n@Injectable({\n providedIn: 'root',\n})\nexport class AXMAddReactionCommand implements AXPCommand<AXMAddReactionCommandInput, void> {\n async execute(input: AXMAddReactionCommandInput): AXPCommandExecuteResultPromise<void> {\n return {\n success: false,\n message: {\n text: '@conversation:comments.messages.error.add-reaction-not-implemented',\n },\n };\n }\n}\n","import { AXPopupService } from '@acorex/components/popup';\nimport { AXTranslationService } from '@acorex/core/translation';\nimport {\n AXPCommand,\n entityActionDataRecord,\n resolveEntityActionCommandInput,\n type AXPCommandExecuteResultPromise,\n} from '@acorex-platform/framework-shared/runtime';\nimport { Injectable, inject, signal } from '@angular/core';\n\n//#region ---- Types ----\n\nexport interface AXMShowCommentPopupCommandInput {\n data?: Record<string, unknown>;\n options?: {\n refType?: string;\n refId?: string;\n subject?: string;\n };\n}\n\n//#endregion\n\n//#region ---- Helpers ----\n\nfunction resolveCommentPopupOptions(input: AXMShowCommentPopupCommandInput = {}) {\n const resolved = resolveEntityActionCommandInput(input);\n const options = resolved.options ?? {};\n const data = entityActionDataRecord(resolved.data) ?? {};\n\n return {\n refType: String(options['refType'] ?? data['refType'] ?? ''),\n refId: String(options['refId'] ?? data['id'] ?? data['refId'] ?? ''),\n subject: String(options['subject'] ?? data['subject'] ?? data['title'] ?? ''),\n };\n}\n\n//#endregion\n\n//#region ---- Show comment popup command ----\n\n/**\n * Opens the comments popup for a referenced entity record.\n * Replaces the former `show-comment-popup` workflow (single popup step).\n */\n@Injectable({ providedIn: 'root' })\nexport class AXMShowCommentPopupCommand\n implements AXPCommand<AXMShowCommentPopupCommandInput>\n{\n private readonly popupService = inject(AXPopupService);\n private readonly translate = inject(AXTranslationService);\n\n async execute(input: AXMShowCommentPopupCommandInput = {}): AXPCommandExecuteResultPromise {\n const { refType, refId, subject } = resolveCommentPopupOptions(input);\n\n if (!refType || !refId) {\n return {\n success: false,\n message: { text: 'Comment popup requires refType and refId.' },\n };\n }\n\n const comp = (await import('../popup/comment-popup.component')).AXMCommentPopupComponent;\n\n await this.popupService.open(comp, {\n title: await this.translate.translateAsync('@conversation:comments.feature.title'),\n size: 'lg',\n data: {\n refrenceType: signal(refType),\n refrenceId: signal(refId),\n subject: signal(subject),\n },\n });\n\n return {\n success: true,\n kind: 'object',\n data: undefined,\n metadata: { refresh: false },\n };\n }\n}\n\n//#endregion\n","/**\n * Build-time only. Do not import from Angular modules.\n */\n\nimport { AXP_COMMAND_DEFINITION_CATEGORY_UTILITY, defineCommand } from '@acorex-platform/framework-shared/runtime';\n\nexport const axmShowCommentPopupCommandDefinition = defineCommand({\n key: 'show-comment-popup',\n title: 'Show comment popup',\n description:\n 'AXMShowCommentPopupCommand opens AXMCommentPopupComponent for a referenced entity (refType, refId, subject from options).',\n executionMode: 'frontend',\n inputs: [\n {\n name: 'entity',\n title: 'Entity',\n description: 'Entity full name (Module.Entity).',\n interface: { name: 'json' },\n },\n {\n name: 'data',\n title: 'Data',\n description: 'Row, selection, or seed data.',\n interface: { name: 'json' },\n },\n {\n name: 'options',\n title: 'Options',\n description: 'Evaluated action options / process flags.',\n interface: { name: 'json' },\n },\n ],\n outcomes: {\n mode: 'static',\n values: ['success', 'failure'],\n },\n ai: {\n tags: ['conversation', 'comments', 'popup', 'entity'],\n },\n categories: [AXP_COMMAND_DEFINITION_CATEGORY_UTILITY],\n});\n","import { CommonModule } from '@angular/common';\nimport { Component, ViewEncapsulation, input, ChangeDetectionStrategy } from '@angular/core';\n\nimport { AXButtonModule } from '@acorex/components/button';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { AXBasePageComponent } from '@acorex/components/page';\nimport { AXTranslationModule } from '@acorex/core/translation';\nimport { AXMCommentComponent } from '../comment.component';\n\n@Component({\n selector: 'axm-comment-popup',\n standalone: true,\n imports: [\n // Angular\n CommonModule,\n // ACoreX\n AXDecoratorModule,\n AXButtonModule,\n AXTranslationModule,\n // Comment\n AXMCommentComponent,\n ],\n templateUrl: './comment-popup.component.html',\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.Eager,\n providers: [],\n})\nexport class AXMCommentPopupComponent extends AXBasePageComponent {\n refrenceType = input.required<string>();\n refrenceId = input.required<string>();\n subject = input.required<string>();\n}\n","<ax-content>\n <div class=\"p-2 min-h-[30vh] overflow-y-auto\">\n <axm-comment\n [refrenceType]=\"refrenceType()\"\n [refrenceId]=\"refrenceId()\"\n [subject]=\"subject()\"\n ></axm-comment>\n </div>\n</ax-content>\n<ax-footer>\n <ax-prefix></ax-prefix>\n <ax-suffix>\n <ax-button\n [text]=\"'@general:actions.close.title' | translate | async\"\n look=\"solid\"\n color=\"primary\"\n (onClick)=\"close()\"\n >\n </ax-button>\n </ax-suffix>\n</ax-footer>\n","import { AXPEntityReference } from '@acorex-platform/framework-shared/core';\n\nimport { AXPValueWidgetComponent } from '@acorex-platform/framework-client/layout/widget-core';\nimport { ChangeDetectionStrategy, Component, computed } from '@angular/core';\nimport { AXMCommentComponent } from '..';\n\n@Component({\n template: `\n <axm-comment [refrenceId]=\"refrenceId()\" [refrenceType]=\"refrenceType()\" [subject]=\"subject()\"></axm-comment>\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [AXMCommentComponent],\n})\nexport class AXMCommentWidgetViewComponent extends AXPValueWidgetComponent<AXPEntityReference & { subject: string }> {\n protected refrenceType = computed(() => this.options()?.['refrenceType']);\n protected refrenceId = computed(() => this.options()?.['refrenceId']);\n protected subject = computed(() => this.options()?.['subject']);\n}\n","import { AXPWidgetConfig, AXPWidgetGroupEnum } from '@acorex-platform/framework-shared/widget-core';\n\nexport const AXPCommentWidget: AXPWidgetConfig = {\n name: 'comment',\n title: '@conversation:comments.widget.title',\n description: '@conversation:comments.widget.description',\n type: 'view',\n categories: [],\n groups: [AXPWidgetGroupEnum.EntityWidget],\n icon: 'fa-light fa-comments',\n properties: [],\n components: {\n view: {\n component: () => import('./comment-widget-view.component').then((c) => c.AXMCommentWidgetViewComponent),\n },\n edit: {\n component: () => import('./comment-widget-view.component').then((c) => c.AXMCommentWidgetViewComponent),\n },\n },\n};\n","//#region ---- Imports ----\n\nimport { AXButtonModule } from '@acorex/components/button';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { ChangeDetectionStrategy, Component, ElementRef, inject, viewChild, ViewEncapsulation } from '@angular/core';\nimport { AXMMiniChatPanelService } from './mini-chat-panel.service';\n\n//#endregion\n\n//#region ---- Component ----\n\n/**\n * Root header slot that toggles the inbox mini chat overlay (AI-assist conversations only).\n */\n@Component({\n selector: 'axm-mini-chat-header-slot',\n templateUrl: './mini-chat-header-slot.component.html',\n styleUrls: ['./mini-chat-header-slot.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [AXButtonModule, AXDecoratorModule],\n})\nexport class AXMMiniChatHeaderSlotComponent {\n //#region ---- Services & Dependencies ----\n\n private readonly panelService = inject(AXMMiniChatPanelService);\n\n //#endregion\n\n //#region ---- View References ----\n\n private readonly chatButtonRef = viewChild('chatButton', { read: ElementRef<HTMLElement> });\n\n //#endregion\n\n //#region ---- UI Handlers ----\n\n protected onToggleClick(): void {\n const anchor = this.chatButtonRef()?.nativeElement;\n\n this.panelService.toggleInbox({\n ...(anchor\n ? {\n anchor,\n placement: 'bottom-end' as const,\n offsetX: 0,\n offsetY: 8,\n autoFlip: true,\n }\n : {}),\n });\n }\n\n //#endregion\n}\n\n//#endregion\n","<ax-button\n [iconOnly]=\"true\"\n class=\"relative\"\n color=\"primary\"\n #chatButton\n (onClick)=\"onToggleClick()\"\n>\n <ax-icon>\n <i class=\"fa-regular fa-robot\"></i>\n </ax-icon>\n</ax-button>\n","//#region ---- Imports ----\n\nimport { AXButtonModule } from '@acorex/components/button';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { ChangeDetectionStrategy, Component, computed, ElementRef, inject, input, viewChild } from '@angular/core';\nimport { AXMMiniChatPanelService } from './mini-chat-panel.service';\n\n//#endregion\n\n//#region ---- Component ----\n\n/**\n * Fixed bottom-right FAB that toggles the entity mini chat overlay via {@link AXMMiniChatPanelService}.\n * Reopens the last conversation for the entity; pass {@link placement} to control popover side.\n */\n@Component({\n selector: 'axm-mini-chat-launcher',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [AXButtonModule, AXDecoratorModule],\n template: `\n <ax-button\n #fabButton\n class=\"axm-mini-chat-launcher fixed bottom-6 end-6 z-50 rounded-full shadow-lg\"\n color=\"primary\"\n [iconOnly]=\"true\"\n (onClick)=\"onFabClick()\"\n aria-label=\"Toggle entity chat\"\n >\n <ax-prefix>\n <ax-icon [icon]=\"isOpen() ? 'fa-light fa-xmark' : 'fa-light fa-comments'\"></ax-icon>\n </ax-prefix>\n </ax-button>\n `,\n styles: `\n\n :host {\n display: contents;\n }\n `,\n})\nexport class AXMMiniChatLauncherComponent {\n //#region ---- Services & Dependencies ----\n\n protected readonly panelService = inject(AXMMiniChatPanelService);\n\n protected readonly isOpen = computed(() => this.panelService.panelOpen());\n\n //#endregion\n\n //#region ---- Inputs ----\n\n readonly entityId = input.required<string>();\n readonly entityType = input.required<string>();\n readonly assistId = input<string | undefined>(undefined);\n readonly title = input<string | undefined>(undefined);\n /** Placement relative to the FAB when no custom {@link position} is set. Default: `top-end`. */\n readonly placement = input<'top-end' | 'top-start' | 'bottom-end' | 'bottom-start' | 'top' | 'bottom'>('top-end');\n readonly offsetX = input(8);\n readonly offsetY = input(0);\n\n //#endregion\n\n //#region ---- View References ----\n\n private readonly fabRef = viewChild('fabButton', { read: ElementRef<HTMLElement> });\n\n //#endregion\n\n //#region ---- UI Handlers ----\n\n protected onFabClick(): void {\n const anchor = this.fabRef()?.nativeElement;\n\n this.panelService.toggle({\n entityId: this.entityId(),\n entityType: this.entityType(),\n assistId: this.assistId(),\n title: this.title(),\n ...(anchor\n ? {\n anchor,\n placement: this.placement(),\n offsetX: this.offsetX(),\n offsetY: this.offsetY(),\n autoFlip: true,\n }\n : {}),\n });\n }\n\n //#endregion\n}\n\n//#endregion\n","//#region ----- LiveKit connect options -----\n\n/** Extra time for ICE on local / Docker Desktop. */\nexport const AXM_CHAT_CALL_PEER_CONNECTION_TIMEOUT_MS = 25_000;\n\nexport function axmChatCallRoomConnectOptions(\n _serverUrl?: string,\n iceServers?: RTCIceServer[],\n forceRelay?: boolean,\n): {\n peerConnectionTimeout: number;\n rtcConfig?: RTCConfiguration;\n} {\n const options: {\n peerConnectionTimeout: number;\n rtcConfig?: RTCConfiguration;\n } = {\n peerConnectionTimeout: AXM_CHAT_CALL_PEER_CONNECTION_TIMEOUT_MS,\n };\n\n if (forceRelay) {\n // Production TURN — ICE/TURN from LiveKit join response (do not override iceServers here).\n options.rtcConfig = { iceTransportPolicy: 'relay' };\n return options;\n }\n\n if (iceServers?.length) {\n options.rtcConfig = { iceServers };\n }\n\n return options;\n}\n\n//#endregion\n","//#region ----- RTC room names -----\n\nexport function axmChatCallMediaRoomName(conversationId: string): string {\n return `chat-call-${conversationId.trim()}`;\n}\n\nexport function axmRtcUserSignalRoomName(userId: string): string {\n return `rtc-signal-${userId.trim()}`;\n}\n\n//#endregion\n","//#region ----- Imports -----\n\nimport {\n AXPRtcApiAbstract,\n AXERtcGatewayService,\n} from '@acorex-platform/extension-rtc-core-gateway';\nimport { Injectable, NgZone, inject, signal } from '@angular/core';\nimport {\n ConnectionState,\n LocalVideoTrack,\n Participant,\n RemoteParticipant,\n RemoteTrack,\n RemoteTrackPublication,\n Room,\n RoomEvent,\n Track,\n createLocalScreenTracks,\n} from 'livekit-client';\nimport { firstValueFrom } from 'rxjs';\n\nimport { axmChatCallRoomConnectOptions } from './chat-call-rtc-connect.util';\nimport { axmChatCallMediaRoomName } from './chat-call-room.names';\nimport type { AXMChatCallMediaType } from './chat-call-session.types';\n\n//#endregion\n\n//#region ----- Types -----\n\nexport interface AXMChatCallRtcRemoteVideo {\n participantId: string;\n participantName: string;\n track: RemoteTrack;\n}\n\nexport interface AXMChatCallRtcConnectOptions {\n conversationId: string;\n participantIdentity: string;\n participantName?: string;\n media: AXMChatCallMediaType;\n}\n\n//#endregion\n\n//#region ----- Service -----\n\n/**\n * LiveKit room session for chat calls (token via RTC gateway).\n */\n@Injectable()\nexport class AXMChatCallRtcService {\n //#region ----- Services & Dependencies -----\n\n private readonly rtcApi = inject(AXPRtcApiAbstract);\n private readonly zone = inject(NgZone);\n\n //#endregion\n\n //#region ----- State Signals -----\n\n readonly connectionState = signal<ConnectionState>(ConnectionState.Disconnected);\n readonly localVideoTrack = signal<LocalVideoTrack | null>(null);\n readonly remoteVideos = signal<AXMChatCallRtcRemoteVideo[]>([]);\n readonly remoteParticipantCount = signal(0);\n readonly errorMessage = signal<string | null>(null);\n\n //#endregion\n\n //#region ----- Private State -----\n\n private room: Room | null = null;\n private connectedConversationId: string | null = null;\n private connectInFlight: Promise<void> | null = null;\n private screenTrack: LocalVideoTrack | null = null;\n private preferredAudioDeviceId: string | null = null;\n private preferredVideoDeviceId: string | null = null;\n private readonly remoteAudioElements = new Map<string, HTMLMediaElement>();\n private audioSink: HTMLElement | null = null;\n\n //#endregion\n\n //#region ----- Connect / Disconnect -----\n\n async connect(options: AXMChatCallRtcConnectOptions): Promise<void> {\n const conversationId = options.conversationId.trim();\n if (this.connectInFlight) {\n try {\n await this.connectInFlight;\n } catch {\n // Previous attempt failed; retry below.\n }\n if (this.#isActiveFor(conversationId)) {\n return;\n }\n }\n if (this.#isActiveFor(conversationId)) {\n return;\n }\n\n const pending = this.#connectRoom(options);\n this.connectInFlight = pending;\n try {\n await pending;\n } finally {\n if (this.connectInFlight === pending) {\n this.connectInFlight = null;\n }\n }\n }\n\n async disconnect(): Promise<void> {\n this.connectedConversationId = null;\n await this.#stopScreenShare();\n this.#clearRemoteAudio();\n const room = this.room;\n this.room = null;\n if (room) {\n room.removeAllListeners();\n await room.disconnect();\n }\n this.localVideoTrack.set(null);\n this.remoteVideos.set([]);\n this.remoteParticipantCount.set(0);\n this.connectionState.set(ConnectionState.Disconnected);\n }\n\n async #connectRoom(options: AXMChatCallRtcConnectOptions): Promise<void> {\n const conversationId = options.conversationId.trim();\n await this.disconnect();\n this.errorMessage.set(null);\n\n const unlockMedia = this.#unlockMediaDevices(options.media);\n const tokenResult = await firstValueFrom(\n this.rtcApi.createAccessToken({\n roomName: axmChatCallMediaRoomName(conversationId),\n participantIdentity: options.participantIdentity,\n participantName: options.participantName,\n purpose: 'media',\n metadata: JSON.stringify({ conversationId, media: options.media }),\n }),\n );\n await unlockMedia;\n\n const room = new Room({\n adaptiveStream: true,\n dynacast: true,\n reconnectPolicy: {\n nextRetryDelayInMs: () => null,\n },\n audioCaptureDefaults: {\n echoCancellation: true,\n noiseSuppression: true,\n autoGainControl: true,\n },\n });\n this.room = room;\n this.connectedConversationId = conversationId;\n this.connectionState.set(ConnectionState.Connecting);\n this.#wireRoomEvents(room);\n\n try {\n await room.connect(\n tokenResult.serverUrl,\n tokenResult.token,\n axmChatCallRoomConnectOptions(\n tokenResult.serverUrl,\n tokenResult.iceServers,\n tokenResult.forceRelay,\n ),\n );\n } catch (error) {\n room.removeAllListeners();\n await room.disconnect();\n if (this.room === room) {\n this.room = null;\n }\n this.connectionState.set(ConnectionState.Disconnected);\n throw error;\n }\n this.connectionState.set(room.state);\n this.connectedConversationId = conversationId;\n\n await room.localParticipant.setMicrophoneEnabled(true);\n if (options.media === 'video') {\n await room.localParticipant.setCameraEnabled(true);\n }\n await this.#applyPreferredDevices(room);\n await this.#startRoomAudio(room);\n this.#syncRemoteAudio(room);\n\n this.#syncLocalVideo(room);\n this.#syncRemoteVideos(room);\n this.remoteParticipantCount.set(room.remoteParticipants.size);\n }\n\n //#endregion\n\n //#region ----- Media Controls -----\n\n async setCameraEnabled(enabled: boolean): Promise<void> {\n const room = this.room;\n if (!room) {\n return;\n }\n await room.localParticipant.setCameraEnabled(enabled);\n this.#syncLocalVideo(room);\n }\n\n async listInputDevices(kind: 'audioinput' | 'videoinput'): Promise<MediaDeviceInfo[]> {\n try {\n return await Room.getLocalDevices(kind);\n } catch {\n const devices = await navigator.mediaDevices.enumerateDevices();\n return devices.filter((device) => device.kind === kind);\n }\n }\n\n async switchInputDevice(kind: 'audioinput' | 'videoinput', deviceId: string): Promise<void> {\n const id = deviceId.trim();\n if (!id) {\n return;\n }\n if (kind === 'audioinput') {\n this.preferredAudioDeviceId = id;\n } else {\n this.preferredVideoDeviceId = id;\n }\n const room = this.room;\n if (!room) {\n return;\n }\n await room.switchActiveDevice(kind, id);\n this.#syncLocalVideo(room);\n }\n\n async setMicrophoneEnabled(enabled: boolean): Promise<void> {\n const room = this.room;\n if (!room) {\n return;\n }\n await room.localParticipant.setMicrophoneEnabled(enabled);\n if (enabled) {\n await this.#startRoomAudio(room);\n }\n }\n\n /** Call after user gesture when remote audio is silent (autoplay / AudioContext). */\n async ensureAudioPlayback(): Promise<void> {\n const room = this.room;\n if (!room) {\n return;\n }\n await this.#startRoomAudio(room);\n this.#syncRemoteAudio(room);\n }\n\n async toggleScreenShare(enabled: boolean): Promise<void> {\n if (!enabled) {\n await this.#stopScreenShare();\n return;\n }\n\n const room = this.room;\n if (!room) {\n return;\n }\n\n const tracks = await createLocalScreenTracks({ audio: false });\n const videoTrack = tracks.find((track) => track.kind === Track.Kind.Video) as LocalVideoTrack | undefined;\n if (!videoTrack) {\n tracks.forEach((track) => track.stop());\n return;\n }\n\n await room.localParticipant.publishTrack(videoTrack);\n this.screenTrack = videoTrack;\n videoTrack.mediaStreamTrack.addEventListener('ended', () => {\n void this.#stopScreenShare();\n });\n }\n\n isScreenSharing(): boolean {\n return !!this.screenTrack;\n }\n\n //#endregion\n\n //#region ----- Room Events -----\n\n #wireRoomEvents(room: Room): void {\n const run = (work: () => void): void => {\n this.zone.run(work);\n };\n\n room.on(RoomEvent.ConnectionStateChanged, (state) => {\n run(() => this.connectionState.set(state));\n });\n\n room.on(RoomEvent.AudioPlaybackStatusChanged, () => {\n if (room.canPlaybackAudio) {\n this.#syncRemoteAudio(room);\n }\n });\n\n room.on(RoomEvent.ParticipantConnected, () => {\n run(() => {\n this.remoteParticipantCount.set(room.remoteParticipants.size);\n this.#syncRemoteVideos(room);\n this.#syncRemoteAudio(room);\n });\n });\n\n room.on(RoomEvent.ParticipantDisconnected, () => {\n run(() => {\n this.remoteParticipantCount.set(room.remoteParticipants.size);\n this.#syncRemoteVideos(room);\n });\n });\n\n room.on(RoomEvent.TrackSubscribed, (track, _publication, participant) => {\n if (track.kind === Track.Kind.Video) {\n run(() => this.#upsertRemoteVideo(participant, track));\n } else if (track.kind === Track.Kind.Audio) {\n this.#attachRemoteAudio(track);\n void this.#startRoomAudio(room);\n }\n });\n\n room.on(RoomEvent.TrackUnsubscribed, (track, _publication, participant) => {\n if (track.kind === Track.Kind.Video) {\n run(() => {\n this.remoteVideos.update((items) =>\n items.filter(\n (item) => !(item.participantId === participant.identity && item.track.sid === track.sid),\n ),\n );\n });\n } else if (track.kind === Track.Kind.Audio) {\n this.#detachRemoteAudio(track);\n }\n });\n\n room.on(RoomEvent.LocalTrackPublished, () => {\n run(() => this.#syncLocalVideo(room));\n });\n\n room.on(RoomEvent.LocalTrackUnpublished, () => {\n run(() => this.#syncLocalVideo(room));\n });\n\n room.on(RoomEvent.Disconnected, () => {\n run(() => {\n if (this.room !== room) {\n return;\n }\n this.connectedConversationId = null;\n this.connectionState.set(ConnectionState.Disconnected);\n this.localVideoTrack.set(null);\n this.remoteVideos.set([]);\n this.remoteParticipantCount.set(0);\n this.#clearRemoteAudio();\n });\n });\n }\n\n #isActiveFor(conversationId: string): boolean {\n const state = this.connectionState();\n return Boolean(\n this.room &&\n this.connectedConversationId === conversationId &&\n (state === ConnectionState.Connected ||\n state === ConnectionState.Connecting ||\n state === ConnectionState.SignalReconnecting),\n );\n }\n\n #syncLocalVideo(room: Room): void {\n const publication = room.localParticipant.getTrackPublication(Track.Source.Camera);\n const track = publication?.track;\n this.localVideoTrack.set(track instanceof LocalVideoTrack ? track : null);\n }\n\n #syncRemoteVideos(room: Room): void {\n const next: AXMChatCallRtcRemoteVideo[] = [];\n room.remoteParticipants.forEach((participant) => {\n participant.trackPublications.forEach((publication: RemoteTrackPublication) => {\n if (publication.kind === Track.Kind.Video && publication.track) {\n next.push({\n participantId: participant.identity,\n participantName: participant.name || participant.identity,\n track: publication.track,\n });\n }\n });\n });\n this.remoteVideos.set(next);\n }\n\n #upsertRemoteVideo(participant: Participant | RemoteParticipant, track: RemoteTrack): void {\n this.remoteVideos.update((items) => {\n const without = items.filter(\n (item) => !(item.participantId === participant.identity && item.track.sid === track.sid),\n );\n return [\n ...without,\n {\n participantId: participant.identity,\n participantName: participant.name || participant.identity,\n track,\n },\n ];\n });\n }\n\n async #applyPreferredDevices(room: Room): Promise<void> {\n try {\n if (this.preferredAudioDeviceId) {\n await room.switchActiveDevice('audioinput', this.preferredAudioDeviceId);\n }\n if (this.preferredVideoDeviceId) {\n await room.switchActiveDevice('videoinput', this.preferredVideoDeviceId);\n }\n } catch {\n // Keep the default device when the preferred id is gone.\n }\n }\n\n async #startRoomAudio(room: Room): Promise<void> {\n try {\n await room.startAudio();\n } catch {\n // Retry after the next user gesture (accept / unmute).\n }\n }\n\n #audioSinkElement(): HTMLElement {\n if (!this.audioSink && typeof document !== 'undefined') {\n const sink = document.createElement('div');\n sink.setAttribute('data-axm-chat-call-audio-sink', 'true');\n // display:none blocks playback in Chrome — keep elements in layout but invisible.\n sink.style.cssText =\n 'position:fixed;width:0;height:0;overflow:hidden;opacity:0;pointer-events:none;left:0;bottom:0;';\n document.body.appendChild(sink);\n this.audioSink = sink;\n }\n return this.audioSink ?? document.body;\n }\n\n #audioTrackKey(track: RemoteTrack): string | null {\n return track.sid ?? track.mediaStreamTrack.id ?? null;\n }\n\n #attachRemoteAudio(track: RemoteTrack): void {\n const key = this.#audioTrackKey(track);\n if (track.kind !== Track.Kind.Audio || !key || this.remoteAudioElements.has(key)) {\n return;\n }\n const element = track.attach();\n if (element instanceof HTMLAudioElement) {\n element.autoplay = true;\n element.volume = 1;\n }\n this.#audioSinkElement().appendChild(element);\n this.remoteAudioElements.set(key, element);\n void element.play().catch(() => undefined);\n }\n\n #detachRemoteAudio(track: RemoteTrack): void {\n const key = this.#audioTrackKey(track);\n if (!key) {\n return;\n }\n const element = this.remoteAudioElements.get(key);\n if (!element) {\n return;\n }\n track.detach(element);\n element.remove();\n this.remoteAudioElements.delete(key);\n }\n\n #syncRemoteAudio(room: Room): void {\n room.remoteParticipants.forEach((participant) => {\n participant.audioTrackPublications.forEach((publication) => {\n const track = publication.track;\n if (track) {\n this.#attachRemoteAudio(track);\n }\n });\n });\n }\n\n #clearRemoteAudio(): void {\n for (const element of this.remoteAudioElements.values()) {\n element.remove();\n }\n this.remoteAudioElements.clear();\n this.audioSink?.remove();\n this.audioSink = null;\n }\n\n async #unlockMediaDevices(media: AXMChatCallMediaType): Promise<void> {\n const mediaDevices = globalThis.navigator?.mediaDevices;\n if (!mediaDevices?.getUserMedia) {\n return;\n }\n try {\n const stream = await mediaDevices.getUserMedia({\n audio: true,\n video: media === 'video',\n });\n for (const track of stream.getTracks()) {\n track.stop();\n }\n } catch {\n // Permission denied still allows signaling; publish will surface the error.\n }\n }\n\n async #stopScreenShare(): Promise<void> {\n const room = this.room;\n const track = this.screenTrack;\n this.screenTrack = null;\n if (track && room) {\n try {\n await room.localParticipant.unpublishTrack(track);\n } catch {\n // ignore unpublish races while disconnecting\n }\n track.stop();\n }\n }\n\n //#endregion\n}\n\n//#endregion\n\n//#region ----- Providers -----\n\n/** Shared RTC gateway + call room service providers for conversation call UI. */\nexport const AXM_CHAT_CALL_RTC_PROVIDERS = [\n AXERtcGatewayService,\n { provide: AXPRtcApiAbstract, useExisting: AXERtcGatewayService },\n AXMChatCallRtcService,\n];\n\n/** Module-level RTC API only (IsConfigured gate before opening call UI). */\nexport const AXM_CHAT_CALL_RTC_API_PROVIDERS = [\n AXERtcGatewayService,\n { provide: AXPRtcApiAbstract, useExisting: AXERtcGatewayService },\n];\n\n\n//#endregion\n","import { inject, type Provider } from '@angular/core';\nimport {\n AXP_APP_STARTUP_PRIORITY,\n provideAppStartUpTask,\n} from '@acorex-platform/framework-client/core';\nimport { AXPSessionService } from '@acorex-platform/framework-client/auth';\nimport {\n AXPRealtimeDispatcherService,\n AXPUserPresenceService,\n AXP_REALTIME_TOPIC_CONVERSATION_MESSAGE,\n AXP_REALTIME_TOPIC_CONVERSATION_TYPING,\n AXP_REALTIME_TOPIC_ENTITY_MUTATION,\n type AXPRealtimeConversationMessagePayload,\n type AXPRealtimeConversationTypingPayload,\n type AXPRealtimeEntityMutationPayload,\n} from '@acorex-platform/framework-client/realtime';\nimport { RootConfig, type AXMConversationMessage } from '@acorex-platform/module-conversation-contracts';\nimport { axmMessageEntityToMessage } from '../plugins/services/entity/chat-entity-mapper.util';\nimport { AXMConversationEntityStoreService } from './conversation-entity-store.service';\nimport { AXMConversationRealtimeBus } from './conversation-realtime.bus';\nimport { AXMConversationTypingSyncService } from './conversation-typing-sync.service';\n\n//#region ---- Conversation realtime topic handlers ----\n\nconst ROOM_ENTITY_NAME = `${RootConfig.module.name}.${RootConfig.entities.room.name}`;\n\nexport function provideConversationRealtimeHandlers(): Provider[] {\n return [\n provideAppStartUpTask(() => {\n const dispatcher = inject(AXPRealtimeDispatcherService, { optional: true });\n const store = inject(AXMConversationEntityStoreService);\n const bus = inject(AXMConversationRealtimeBus);\n const session = inject(AXPSessionService);\n const typingSync = inject(AXMConversationTypingSyncService);\n\n return {\n name: 'conversation-realtime-handlers',\n priority: AXP_APP_STARTUP_PRIORITY.realtimeHandlers,\n run: async () => {\n dispatcher?.register({\n topic: AXP_REALTIME_TOPIC_CONVERSATION_MESSAGE,\n handle: async (envelope) => {\n const payload = envelope.payload as AXPRealtimeConversationMessagePayload;\n const messageId = payload?.messageId?.trim();\n const op = payload?.op;\n if (!messageId || !op) {\n return;\n }\n\n if (op === 'deleted') {\n bus.publishMessageDeletion(messageId);\n return;\n }\n\n const snapshot = payload.message;\n const message = snapshot\n ? axmMessageEntityToMessage(snapshot as unknown as AXMConversationMessage)\n : await store.getMessage(messageId);\n if (!message) {\n return;\n }\n\n if (op === 'updated') {\n bus.publishMessageUpdate(message);\n } else {\n bus.publishMessage(message);\n }\n },\n });\n\n dispatcher?.register({\n topic: AXP_REALTIME_TOPIC_CONVERSATION_TYPING,\n handle: (envelope) => {\n const payload = envelope.payload as AXPRealtimeConversationTypingPayload;\n const conversationId = payload?.conversationId?.trim();\n const userId = payload?.userId?.trim();\n if (!conversationId || !userId || userId === session.user?.id) {\n return;\n }\n typingSync.apply(conversationId, userId, payload.active !== false);\n },\n });\n\n dispatcher?.register({\n topic: AXP_REALTIME_TOPIC_ENTITY_MUTATION,\n handle: async (envelope) => {\n const payload = envelope.payload as AXPRealtimeEntityMutationPayload;\n if (payload?.entityName !== ROOM_ENTITY_NAME || !payload.id) {\n return;\n }\n if (bus.shouldSuppressRemoteRoomRefetch(payload.id)) {\n return;\n }\n const cached = store.getCachedConversation(payload.id);\n if (cached) {\n if (payload.operation === 'created') {\n bus.publishConversationCreated(cached);\n } else {\n bus.publishConversationUpdate(cached);\n }\n return;\n }\n const conversation = await store.getConversation(payload.id);\n if (!conversation) {\n return;\n }\n if (payload.operation === 'created') {\n bus.publishConversationCreated(conversation);\n } else {\n bus.publishConversationUpdate(conversation);\n }\n },\n });\n },\n };\n }),\n provideAppStartUpTask(() => {\n const presence = inject(AXPUserPresenceService, { optional: true });\n const bus = inject(AXMConversationRealtimeBus);\n return {\n name: 'conversation-presence-bridge',\n priority: AXP_APP_STARTUP_PRIORITY.realtimeSubscriptions,\n run: async () => {\n presence?.updates$.subscribe((update) => {\n bus.publishPresenceUpdate({\n userId: update.userId,\n status: update.status === 'busy' ? 'away' : update.status,\n lastSeen: update.lastSeen ? new Date(update.lastSeen) : undefined,\n });\n });\n },\n };\n }),\n ];\n}\n\n//#endregion\n","import type { AXConversation, AXConversationMessage } from '@acorex/components/conversation';\nimport type { CommunicationSendInput } from '@acorex-platform/module-communication-management-client/contracts';\nimport { CONVERSATION_OPEN_CHAT_COMMAND } from '../../commands/conversation-command.keys';\n\n//#region ---- Chat notification helpers ----\n\nfunction extractMessageText(message: AXConversationMessage): string {\n const payload = message.payload;\n if (!payload || typeof payload !== 'object') {\n return '';\n }\n\n const record = payload as unknown as Record<string, unknown>;\n const text = record['text'];\n if (typeof text === 'string' && text.trim()) {\n return text.trim();\n }\n\n const caption = record['caption'];\n if (typeof caption === 'string' && caption.trim()) {\n return caption.trim();\n }\n\n return '';\n}\n\nexport function buildChatInAppCommunicationSendInput(\n message: AXConversationMessage,\n conversation: AXConversation,\n senderName: string,\n recipientUserId: string,\n): CommunicationSendInput {\n const body = extractMessageText(message) || 'New message';\n const title = conversation.title?.trim() || senderName;\n const senderUserId = message.senderId?.trim();\n\n return {\n title,\n message: {\n subject: title,\n body: `${senderName}: ${body}`,\n },\n channel: 'in-app',\n recipientUserId,\n recipientName: senderName,\n definitionKey: 'conversation-chat-message',\n correlationId: senderUserId\n ? `conversation:${message.conversationId}:${message.id}:${senderUserId}`\n : `conversation:${message.conversationId}:${message.id}`,\n idempotencyKey: `conversation-in-app:${message.id}`,\n actions: [\n {\n title: '@conversation:in-app.actions.open-chat',\n command: {\n name: CONVERSATION_OPEN_CHAT_COMMAND,\n options: {\n conversationId: message.conversationId,\n ...(senderUserId ? { senderUserId } : {}),\n },\n },\n },\n ],\n };\n}\n\n//#endregion\n","import { DestroyRef, inject, type Provider } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { AXPSessionService } from '@acorex-platform/framework-client/auth';\nimport {\n AXP_APP_STARTUP_PRIORITY,\n provideAppStartUpTask,\n} from '@acorex-platform/framework-client/core';\nimport { AXPInAppInboxRealtimeService } from '@acorex-platform/module-communication-management-client';\nimport { AXPCommunicationManagementClient } from '@acorex-platform/module-communication-management-client';\nimport { AXMChatEntityUserApi } from '../plugins/services/entity/chat-entity-user.api';\nimport { buildChatInAppCommunicationSendInput } from './conversation-chat-notification.util';\nimport { AXMConversationEntityStoreService } from './conversation-entity-store.service';\nimport { AXMConversationFocusService } from './conversation-focus.service';\nimport { AXMConversationRealtimeBus } from './conversation-realtime.bus';\n\n//#region ---- Out-of-chat notification bridge ----\n\n/**\n * When a realtime message arrives and the conversation is not focused,\n * send an in-app communication to the current user.\n */\nexport function provideConversationChatNotificationRealtime(): Provider[] {\n return [\n provideAppStartUpTask(() => {\n const bus = inject(AXMConversationRealtimeBus);\n const focus = inject(AXMConversationFocusService);\n const session = inject(AXPSessionService);\n const store = inject(AXMConversationEntityStoreService);\n const userApi = inject(AXMChatEntityUserApi);\n const communicationClient = inject(AXPCommunicationManagementClient, { optional: true });\n const inboxRealtime = inject(AXPInAppInboxRealtimeService);\n const destroyRef = inject(DestroyRef);\n\n return {\n name: 'conversation-chat-notification-realtime',\n priority: AXP_APP_STARTUP_PRIORITY.realtimeSubscriptions,\n run: async () => {\n if (!communicationClient) {\n return;\n }\n\n bus.messageStream$.pipe(takeUntilDestroyed(destroyRef)).subscribe((message) => {\n void (async () => {\n const currentUserId = session.user?.id?.trim();\n if (!currentUserId || message.senderId === currentUserId) {\n return;\n }\n if (focus.isFocused(message.conversationId)) {\n return;\n }\n\n const cached = store.getCachedConversation(message.conversationId);\n const conversation = cached ?? (await store.getConversation(message.conversationId));\n if (!conversation || conversation.settings?.notifications === false) {\n return;\n }\n\n const sender = conversation.participants?.find(\n (participant) => participant.id === message.senderId,\n );\n let senderName = sender?.name?.trim();\n if (!senderName && sender?.id) {\n senderName = (await userApi.getUserById(sender.id).catch(() => null))?.name?.trim();\n }\n const resolvedSenderName = senderName ?? 'User';\n\n await communicationClient.send(\n buildChatInAppCommunicationSendInput(\n message,\n conversation,\n resolvedSenderName,\n currentUserId,\n ),\n );\n inboxRealtime.notifyChanged({ type: 'refresh' });\n })();\n });\n },\n };\n }),\n ];\n}\n\n//#endregion\n","import { DestroyRef, inject, type Provider } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport {\n AXP_APP_STARTUP_PRIORITY,\n provideAppStartUpTask,\n} from '@acorex-platform/framework-client/core';\nimport { AXPRealtimeConnectionService } from '@acorex-platform/framework-client/realtime';\nimport { AXMConversationRealtimeBus } from './conversation-realtime.bus';\n\n//#region ---- Socket status → chat bus ----\n\nexport function provideConversationRealtimeConnectionSync(): Provider[] {\n return [\n provideAppStartUpTask(() => {\n const connection = inject(AXPRealtimeConnectionService, { optional: true });\n const bus = inject(AXMConversationRealtimeBus);\n const destroyRef = inject(DestroyRef);\n\n return {\n name: 'conversation-realtime-connection-sync',\n priority: AXP_APP_STARTUP_PRIORITY.realtimeSubscriptions,\n run: async () => {\n if (!connection) {\n return;\n }\n\n connection.connectionStatus$\n .pipe(takeUntilDestroyed(destroyRef))\n .subscribe((status) => {\n bus.setConnectionStatus(status);\n });\n },\n };\n }),\n ];\n}\n\n//#endregion\n","//#region ----- Imports -----\n\nimport type { AXPRealtimeConversationCallPayload } from '@acorex-platform/framework-client/realtime';\nimport { Injectable } from '@angular/core';\nimport { Subject } from 'rxjs';\n\n//#endregion\n\n//#region ----- Service -----\n\n/**\n * In-memory fan-out for conversation.call actions after invite/ring.\n */\n@Injectable({ providedIn: 'root' })\nexport class AXMChatCallEventsService {\n private readonly eventsSubject = new Subject<AXPRealtimeConversationCallPayload>();\n\n readonly events$ = this.eventsSubject.asObservable();\n\n publish(payload: AXPRealtimeConversationCallPayload): void {\n this.eventsSubject.next(payload);\n }\n}\n\n//#endregion\n","//#region ----- Imports -----\n\nimport type { AXMChatCallMediaType } from './chat-call-session.types';\n\n//#endregion\n\n//#region ----- RTC signaling payloads -----\n\nexport const AXM_CHAT_CALL_RTC_SIGNAL_TYPE_RING = 'ring' as const;\n\nexport interface AXMChatCallRtcRingPayload {\n type: typeof AXM_CHAT_CALL_RTC_SIGNAL_TYPE_RING;\n conversationId: string;\n callId: string;\n media: AXMChatCallMediaType;\n fromUserId: string;\n fromUserName?: string;\n}\n\nexport function axmParseChatCallRtcRingPayload(raw: unknown): AXMChatCallRtcRingPayload | null {\n if (!raw || typeof raw !== 'object') {\n return null;\n }\n const value = raw as Record<string, unknown>;\n if (value['type'] !== AXM_CHAT_CALL_RTC_SIGNAL_TYPE_RING) {\n return null;\n }\n const conversationId = typeof value['conversationId'] === 'string' ? value['conversationId'].trim() : '';\n const callId = typeof value['callId'] === 'string' ? value['callId'].trim() : '';\n const fromUserId = typeof value['fromUserId'] === 'string' ? value['fromUserId'].trim() : '';\n if (!conversationId || !callId || !fromUserId) {\n return null;\n }\n return {\n type: AXM_CHAT_CALL_RTC_SIGNAL_TYPE_RING,\n conversationId,\n callId,\n media: value['media'] === 'video' ? 'video' : 'voice',\n fromUserId,\n fromUserName: typeof value['fromUserName'] === 'string' ? value['fromUserName'] : undefined,\n };\n}\n\n//#endregion\n","//#region ----- Imports -----\n\nimport type { AXConversation } from '@acorex/components/conversation';\nimport { AXPopupService } from '@acorex/components/popup';\nimport { inject } from '@angular/core';\n\nimport { axmChatCallDarkThemeContextElement } from './chat-call-popup-theme.util';\nimport type { AXMChatCallMediaType, AXMChatCallPhase } from './chat-call-session.types';\n\n//#endregion\n\n//#region ----- Types -----\n\nexport interface AXMChatCallSessionPopupData {\n sessionConversation: AXConversation;\n sessionMedia: AXMChatCallMediaType;\n sessionPhase?: AXMChatCallPhase;\n sessionCallId?: string;\n}\n\nexport interface AXMOpenChatCallSessionDialogOptions {\n conversation: AXConversation;\n media: AXMChatCallMediaType;\n phase?: AXMChatCallPhase;\n callId?: string;\n popupService?: AXPopupService;\n}\n\n//#endregion\n\n//#region ----- Dialog -----\n\n/**\n * Opens the LiveKit-backed call session as an in-app popup.\n * Must be called from an injection context when `popupService` is omitted.\n */\nexport async function axmOpenChatCallSessionDialog(\n options: AXMOpenChatCallSessionDialogOptions,\n): Promise<void> {\n const conversation = options.conversation;\n if (!conversation?.id?.trim()) {\n return;\n }\n\n const popupService = options.popupService ?? inject(AXPopupService);\n const comp = (await import('./chat-call-session-page.component')).AXMChatCallSessionPageComponent;\n\n const data: AXMChatCallSessionPopupData = {\n sessionConversation: conversation,\n sessionMedia: options.media === 'video' ? 'video' : 'voice',\n sessionPhase: options.phase ?? 'outgoing-waiting',\n sessionCallId: options.callId?.trim() || undefined,\n };\n\n await popupService.open(comp, {\n header: false,\n closeButton: false,\n footer: false,\n size: 'full',\n closeOnBackdropClick: false,\n panelClass: ['animate-fadeIn', 'animate-fast', 'axm-chat-call-session-overlay'],\n contextElement: axmChatCallDarkThemeContextElement(),\n data,\n });\n}\n\n//#endregion\n","//#region ----- Imports -----\n\nimport { AXPRtcApiAbstract } from '@acorex-platform/extension-rtc-core-gateway';\nimport { AXPSessionService } from '@acorex-platform/framework-client/auth';\nimport { AXPopupService } from '@acorex/components/popup';\nimport { AXToastService } from '@acorex/components/toast';\nimport { AXTranslationService } from '@acorex/core/translation';\nimport type { AXConversation } from '@acorex/components/conversation';\nimport { DestroyRef, Injectable, NgZone, inject } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { Room, RoomEvent } from 'livekit-client';\nimport { distinctUntilChanged, firstValueFrom, map } from 'rxjs';\n\nimport { AXMConversationEntityStoreService } from '../../services/conversation-entity-store.service';\nimport { axmChatCallRoomConnectOptions } from './chat-call-rtc-connect.util';\nimport { axmEnsureChatCallRtcReady } from './chat-call-rtc-ready.util';\nimport { axmRtcUserSignalRoomName } from './chat-call-room.names';\nimport {\n axmParseChatCallRtcRingPayload,\n type AXMChatCallRtcRingPayload,\n} from './chat-call-rtc-signal.types';\nimport type { AXMChatCallMediaType } from './chat-call-session.types';\nimport { axmOpenChatCallSessionDialog } from './open-chat-call-session.dialog';\n\n//#endregion\n\n//#region ----- Constants -----\n\nconst RING_WAIT_FOR_CALLEE_MS = 1500;\nconst RING_PUBLISH_FLUSH_MS = 400;\nconst INBOX_RECONNECT_MS = 8000;\nconst INBOX_RECONNECT_MAX_MS = 60_000;\nconst INBOX_RECONNECT_MAX_ATTEMPTS = 4;\n\n//#endregion\n\n//#region ----- Service -----\n\n/**\n * Always-on personal LiveKit room used to receive incoming call rings.\n */\n@Injectable({ providedIn: 'root' })\nexport class AXMChatCallRtcSignalInboxService {\n //#region ----- Services & Dependencies -----\n\n private readonly rtcApi = inject(AXPRtcApiAbstract, { optional: true });\n private readonly session = inject(AXPSessionService);\n private readonly store = inject(AXMConversationEntityStoreService);\n private readonly popupService = inject(AXPopupService);\n private readonly translation = inject(AXTranslationService);\n private readonly toast = inject(AXToastService);\n private readonly zone = inject(NgZone);\n private readonly destroyRef = inject(DestroyRef);\n\n //#endregion\n\n //#region ----- Private State -----\n\n private room: Room | null = null;\n private connecting = false;\n private started = false;\n private connectedUserId: string | null = null;\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n private reconnectAttempts = 0;\n private readonly openCallIds = new Set<string>();\n\n //#endregion\n\n //#region ----- Inbox connection -----\n\n /**\n * Watches session readiness and keeps the personal signal room connected.\n * A one-shot connect at boot is not enough: token queries need a ready session,\n * and LiveKit drops the inbox on disconnect without a retry.\n */\n start(): void {\n if (this.started) {\n return;\n }\n this.started = true;\n\n this.session.isReadyForAppScopedApi$\n .pipe(distinctUntilChanged(), takeUntilDestroyed(this.destroyRef))\n .subscribe((ready) => {\n if (!ready) {\n void this.disconnect();\n return;\n }\n void this.connect();\n });\n\n this.session.user$\n .pipe(\n map((user) => user?.id?.trim() ?? null),\n distinctUntilChanged(),\n takeUntilDestroyed(this.destroyRef),\n )\n .subscribe((userId) => {\n if (!userId || !this.session.isReadyForAppScopedApi) {\n void this.disconnect();\n return;\n }\n if (this.connectedUserId && this.connectedUserId !== userId) {\n this.reconnectAttempts = 0;\n void this.disconnect().then(() => this.connect());\n return;\n }\n this.reconnectAttempts = 0;\n void this.connect();\n });\n }\n\n async connect(): Promise<void> {\n if (!this.rtcApi || this.connecting) {\n return;\n }\n\n const userId = this.session.user?.id?.trim();\n const userName = this.session.user?.name;\n if (!userId || !this.session.isReadyForAppScopedApi) {\n return;\n }\n\n if (this.room && this.connectedUserId === userId) {\n return;\n }\n\n if (\n !(await axmEnsureChatCallRtcReady({\n rtc: this.rtcApi,\n translation: this.translation,\n toast: this.toast,\n showToast: false,\n }))\n ) {\n this.#scheduleReconnect();\n return;\n }\n\n this.connecting = true;\n this.#clearReconnect();\n try {\n if (this.room) {\n await this.disconnect();\n }\n\n const tokenResult = await firstValueFrom(\n this.rtcApi.createAccessToken({\n roomName: axmRtcUserSignalRoomName(userId),\n participantIdentity: userId,\n participantName: userName,\n purpose: 'signal',\n metadata: JSON.stringify({ kind: 'signal-inbox' }),\n }),\n );\n\n const room = new Room();\n room.on(RoomEvent.DataReceived, (payload) => {\n this.zone.run(() => {\n void this.#onData(payload);\n });\n });\n room.on(RoomEvent.Disconnected, () => {\n if (this.room !== room) {\n return;\n }\n this.room = null;\n this.connectedUserId = null;\n this.#scheduleReconnect();\n });\n await room.connect(\n tokenResult.serverUrl,\n tokenResult.token,\n axmChatCallRoomConnectOptions(\n tokenResult.serverUrl,\n tokenResult.iceServers,\n tokenResult.forceRelay,\n ),\n );\n this.room = room;\n this.connectedUserId = userId;\n this.reconnectAttempts = 0;\n } catch {\n this.room = null;\n this.connectedUserId = null;\n this.#scheduleReconnect();\n } finally {\n this.connecting = false;\n }\n }\n\n async disconnect(): Promise<void> {\n this.#clearReconnect();\n const room = this.room;\n this.room = null;\n this.connectedUserId = null;\n if (room) {\n room.removeAllListeners();\n await room.disconnect();\n }\n }\n\n //#endregion\n\n //#region ----- Outgoing ring -----\n\n async sendRing(options: {\n conversationId: string;\n callId: string;\n media: AXMChatCallMediaType;\n targetUserIds: string[];\n fromUserId: string;\n fromUserName?: string;\n }): Promise<void> {\n if (!this.rtcApi) {\n return;\n }\n\n const payload: AXMChatCallRtcRingPayload = {\n type: 'ring',\n conversationId: options.conversationId,\n callId: options.callId,\n media: options.media,\n fromUserId: options.fromUserId,\n fromUserName: options.fromUserName,\n };\n const encoded = new TextEncoder().encode(JSON.stringify(payload));\n const bytes = new Uint8Array(encoded.byteLength);\n bytes.set(encoded);\n\n for (const targetUserId of options.targetUserIds) {\n const id = targetUserId.trim();\n if (!id || id === options.fromUserId) {\n continue;\n }\n await this.#publishToUserRoom(id, options.fromUserId, options.fromUserName, bytes);\n }\n }\n\n releaseCall(callId: string | null | undefined): void {\n const id = callId?.trim();\n if (id) {\n this.openCallIds.delete(id);\n }\n }\n\n //#endregion\n\n //#region ----- Private -----\n\n async #onData(payload: Uint8Array): Promise<void> {\n let parsed: unknown;\n try {\n parsed = JSON.parse(new TextDecoder().decode(payload));\n } catch {\n return;\n }\n\n const ring = axmParseChatCallRtcRingPayload(parsed);\n if (!ring) {\n return;\n }\n await this.presentIncoming(ring);\n }\n\n async presentIncoming(ring: AXMChatCallRtcRingPayload): Promise<void> {\n const selfId = this.session.user?.id?.trim();\n if (!selfId || ring.fromUserId === selfId || this.openCallIds.has(ring.callId)) {\n return;\n }\n\n const conversation =\n (await this.store.getConversation(ring.conversationId)) ??\n this.#conversationFromRing(ring);\n\n this.openCallIds.add(ring.callId);\n try {\n await axmOpenChatCallSessionDialog({\n conversation,\n media: ring.media,\n phase: 'incoming',\n callId: ring.callId,\n popupService: this.popupService,\n });\n } finally {\n this.openCallIds.delete(ring.callId);\n }\n }\n\n async #publishToUserRoom(\n targetUserId: string,\n fromUserId: string,\n fromUserName: string | undefined,\n bytes: Uint8Array<ArrayBuffer>,\n ): Promise<void> {\n if (!this.rtcApi) {\n return;\n }\n\n const tokenResult = await firstValueFrom(\n this.rtcApi.createAccessToken({\n roomName: axmRtcUserSignalRoomName(targetUserId),\n participantIdentity: `${fromUserId}:ring:${Date.now()}`,\n participantName: fromUserName,\n purpose: 'signal',\n metadata: JSON.stringify({ kind: 'call-ring' }),\n }),\n );\n\n const room = new Room();\n try {\n await room.connect(\n tokenResult.serverUrl,\n tokenResult.token,\n axmChatCallRoomConnectOptions(\n tokenResult.serverUrl,\n tokenResult.iceServers,\n tokenResult.forceRelay,\n ),\n );\n await this.#waitForRemoteIdentity(room, targetUserId, RING_WAIT_FOR_CALLEE_MS);\n await room.localParticipant.publishData(bytes, {\n reliable: true,\n destinationIdentities: [targetUserId],\n });\n await this.#delay(RING_PUBLISH_FLUSH_MS);\n } finally {\n room.removeAllListeners();\n await room.disconnect();\n }\n }\n\n #conversationFromRing(ring: AXMChatCallRtcRingPayload): AXConversation {\n return {\n id: ring.conversationId,\n type: 'private',\n title: ring.fromUserName?.trim() || ring.fromUserId,\n participants: [\n { id: ring.fromUserId, name: ring.fromUserName?.trim() || ring.fromUserId },\n ],\n } as AXConversation;\n }\n\n #waitForRemoteIdentity(room: Room, identity: string, timeoutMs: number): Promise<boolean> {\n if (room.remoteParticipants.has(identity)) {\n return Promise.resolve(true);\n }\n\n return new Promise((resolve) => {\n const finish = (found: boolean) => {\n clearTimeout(timer);\n room.off(RoomEvent.ParticipantConnected, onJoin);\n resolve(found);\n };\n const onJoin = (participant: { identity?: string }) => {\n if (participant.identity === identity) {\n finish(true);\n }\n };\n const timer = setTimeout(() => {\n finish(room.remoteParticipants.has(identity));\n }, timeoutMs);\n room.on(RoomEvent.ParticipantConnected, onJoin);\n });\n }\n\n #scheduleReconnect(): void {\n if (this.reconnectTimer || !this.session.isReadyForAppScopedApi || !this.session.user?.id) {\n return;\n }\n if (this.reconnectAttempts >= INBOX_RECONNECT_MAX_ATTEMPTS) {\n return;\n }\n const delay = Math.min(\n INBOX_RECONNECT_MS * 2 ** this.reconnectAttempts,\n INBOX_RECONNECT_MAX_MS,\n );\n this.reconnectAttempts += 1;\n this.reconnectTimer = setTimeout(() => {\n this.reconnectTimer = null;\n void this.connect();\n }, delay);\n }\n\n #clearReconnect(): void {\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n }\n\n #delay(ms: number): Promise<void> {\n return new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n }\n\n //#endregion\n}\n\n//#endregion\n","//#region ----- Imports -----\n\nimport { AXPSessionService } from '@acorex-platform/framework-client/auth';\nimport {\n AXP_APP_STARTUP_PRIORITY,\n provideAppStartUpTask,\n} from '@acorex-platform/framework-client/core';\nimport {\n AXPRealtimeDispatcherService,\n AXP_REALTIME_TOPIC_CONVERSATION_CALL,\n type AXPRealtimeConversationCallPayload,\n} from '@acorex-platform/framework-client/realtime';\nimport { inject, type Provider } from '@angular/core';\n\nimport { AXMChatCallEventsService } from '../plugins/call/chat-call-events.service';\nimport { AXMChatCallRtcSignalInboxService } from '../plugins/call/chat-call-rtc-signal-inbox.service';\n\n//#endregion\n\n//#region ---- Conversation call ring (socket + RTC inbox) ----\n\n/**\n * Incoming rings arrive on the always-on runtime socket. The LiveKit inbox is\n * a secondary path when RTC is configured.\n */\nexport function provideConversationCallRealtimeHandlers(): Provider[] {\n return [\n provideAppStartUpTask(() => {\n const inbox = inject(AXMChatCallRtcSignalInboxService);\n const callEvents = inject(AXMChatCallEventsService);\n const dispatcher = inject(AXPRealtimeDispatcherService, { optional: true });\n const session = inject(AXPSessionService);\n\n return {\n name: 'conversation-call-rtc-signal-inbox',\n priority: AXP_APP_STARTUP_PRIORITY.realtimeSubscriptions,\n run: async () => {\n dispatcher?.register({\n topic: AXP_REALTIME_TOPIC_CONVERSATION_CALL,\n handle: (envelope) => {\n const payload = envelope.payload as AXPRealtimeConversationCallPayload;\n const action = payload?.action;\n const conversationId = payload?.conversationId?.trim();\n const fromUserId = payload?.fromUserId?.trim();\n if (!conversationId || !fromUserId) {\n return;\n }\n if (action === 'invite' || action === 'ring') {\n if (fromUserId === session.user?.id?.trim()) {\n return;\n }\n void inbox.presentIncoming({\n type: 'ring',\n conversationId,\n callId: payload.callId?.trim() || crypto.randomUUID(),\n media: payload.media === 'video' ? 'video' : 'voice',\n fromUserId,\n fromUserName: payload.fromUserName,\n });\n return;\n }\n if (action === 'accept' || action === 'decline' || action === 'cancel' || action === 'end') {\n callEvents.publish(payload);\n }\n },\n });\n\n // Ring uses Socket.IO. A always-on LiveKit inbox is not required.\n },\n };\n }),\n ];\n}\n\n//#endregion\n","import {\n AXPPageComponentDefinition,\n AXPPageComponentProvider,\n} from '@acorex-platform/framework-client/layout/components';\nimport { Injectable } from '@angular/core';\nimport { COMMENTS_PAGE_COMPONENT_KEY } from '../comments.plugin';\n\n//#region ---- Comments Page Component Provider ----\n\n@Injectable()\nexport class AXMCommentsPageComponentProvider implements AXPPageComponentProvider {\n async components(): Promise<AXPPageComponentDefinition[]> {\n return [\n {\n key: COMMENTS_PAGE_COMPONENT_KEY,\n loader: () =>\n import('./comments-page.component').then((m) => m.AXMCommentsPageComponent),\n },\n ];\n }\n}\n\n//#endregion\n","//#region ---- Imports ----\n\nimport { AXPWidgetDefinitionProvider } from '@acorex-platform/framework-client/layout/widget-core';\nimport { Injectable } from '@angular/core';\nimport { AXPCommentWidget } from './features';\n\n//#endregion\n\n//#region ---- Conversation Widgets Provider ----\n\n@Injectable()\nexport class AXMConversationWidgetsProvider implements AXPWidgetDefinitionProvider {\n getWidgets() {\n return [AXPCommentWidget];\n }\n}\n\n//#endregion\n","import type { AXFileUploadOptions } from '@acorex/cdk/uploader';\nimport { trim } from 'lodash';\n\nconst DEFAULT_MIME = 'application/octet-stream';\n\nexport function axmNormalizeMimeType(mime: string | undefined): string {\n const trimmed = trim(mime);\n if (!trimmed) {\n return DEFAULT_MIME;\n }\n return trimmed.split(';')[0]?.trim() || DEFAULT_MIME;\n}\n\nexport function axmEnsureAudioFileName(fileName: string | undefined, mime: string): string {\n const base = trim(fileName) || 'audio';\n if (/\\.[a-z0-9]+$/i.test(base)) {\n return base;\n }\n\n const normalized = axmNormalizeMimeType(mime).toLowerCase();\n if (normalized.includes('webm')) return `${base}.webm`;\n if (normalized.includes('wav')) return `${base}.wav`;\n if (normalized.includes('ogg') || normalized.includes('oga')) return `${base}.ogg`;\n if (normalized.includes('mpeg') || normalized.includes('mp3')) return `${base}.mp3`;\n if (normalized.includes('m4a') || normalized.includes('mp4')) return `${base}.m4a`;\n if (normalized.includes('flac')) return `${base}.flac`;\n return `${base}.webm`;\n}\n\nexport function axmToUploadFile(options: AXFileUploadOptions): File {\n const source = options.source;\n const type = axmNormalizeMimeType(trim(options.mimeType) || source.type || DEFAULT_MIME);\n let name = trim(options.fileName) || 'attachment';\n if (type.startsWith('audio/')) {\n name = axmEnsureAudioFileName(name, type);\n }\n\n if (source instanceof File) {\n if (source.type === type && source.name === name) {\n return source;\n }\n return new File([source], name, { type });\n }\n\n return new File([source], name, { type });\n}\n\n","import {\n AXUploaderService,\n type AXFileUploadOptions,\n type AXUploadReference,\n type AXUploadResult,\n} from '@acorex/cdk/uploader';\nimport { AXPFileStorageService } from '@acorex-platform/framework-client/common';\nimport { DestroyRef, Injectable, inject } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { trim } from 'lodash';\nimport { persistChatAttachment } from '../chat-attachment-persist';\nimport { axmNormalizeMimeType, axmToUploadFile } from './chat-uploader.util';\n\n@Injectable()\nexport class AXMChatUploaderService {\n private readonly uploader = inject(AXUploaderService);\n private readonly destroyRef = inject(DestroyRef);\n private readonly fileStorage = inject(AXPFileStorageService);\n\n constructor() {\n this.uploader.onUpload.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((event) => {\n void this.handleUpload(event.options)\n .then((result) => event.resolve(result))\n .catch((error) => event.reject(error));\n });\n\n this.uploader.onResolveUrl.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((event) => {\n void this.resolveUrl(event.reference, event.signal)\n .then((url) => event.resolve(url))\n .catch((error) => event.reject(error));\n });\n\n this.uploader.onDeleteMedia.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((event) => {\n void this.deleteMedia(event.reference)\n .then(() => event.resolve())\n .catch((error) => event.reject(error));\n });\n }\n\n private async handleUpload(options: AXFileUploadOptions): Promise<AXUploadResult> {\n const conversationId = trim(String(options.metadata?.['conversationId'] ?? ''));\n if (!conversationId) {\n throw new Error('conversationId is required in upload metadata.');\n }\n if (options.signal?.aborted) {\n throw new Error('Upload aborted.');\n }\n\n const file = axmToUploadFile(options);\n options.onProgress?.(0);\n\n const { fileId } = await persistChatAttachment(this.fileStorage, file, conversationId);\n\n if (options.signal?.aborted) {\n throw new Error('Upload aborted.');\n }\n options.onProgress?.(100);\n\n const mimeType = axmNormalizeMimeType(trim(file.type) || options.mimeType);\n return {\n url: '',\n mediaId: fileId,\n size: file.size,\n mimeType,\n ...(mimeType.startsWith('image/') ? { thumbnailUrl: '' } : {}),\n metadata: { fileName: file.name, ...(options.metadata ?? {}) },\n };\n }\n\n private async resolveUrl(reference: AXUploadReference, signal?: AbortSignal): Promise<string> {\n if (signal?.aborted) {\n throw new Error('Resolve aborted.');\n }\n\n const directUrl = trim(reference.url);\n const mediaId = trim(reference.mediaId);\n if (directUrl && !directUrl.startsWith('blob:') && !directUrl.startsWith('data:') && !mediaId) {\n return directUrl;\n }\n if (!mediaId) {\n throw new Error('No mediaId or url in reference.');\n }\n\n const info = await this.fileStorage.getInfo(mediaId);\n const storedUrl = trim(info.url);\n if (storedUrl && !storedUrl.startsWith('blob:') && !storedUrl.startsWith('data:')) {\n return storedUrl;\n }\n if (info.binary instanceof Blob && info.binary.size > 0) {\n return URL.createObjectURL(info.binary);\n }\n if (directUrl && !directUrl.startsWith('blob:') && !directUrl.startsWith('data:')) {\n return directUrl;\n }\n throw new Error(`Could not resolve media ${mediaId}.`);\n }\n\n private async deleteMedia(reference: AXUploadReference): Promise<void> {\n const mediaId = trim(reference.mediaId);\n if (!mediaId) {\n return;\n }\n await this.fileStorage.remove(mediaId);\n }\n}\n\n","import { AXP_PERMISSION_DEFINITION_PROVIDER } from '@acorex-platform/framework-client/auth';\nimport {\n AXP_MENU_PROVIDER,\n AXP_PROTECTED_ROUTE_GUARDS,\n} from '@acorex-platform/framework-client/common';\nimport {\n AXP_APP_STARTUP_PRIORITY,\n AXP_DISTRIBUTED_EVENT_LISTENER_PROVIDER,\n AXP_MODULE_MANIFEST_PROVIDER,\n provideAppStartUpTask,\n} from '@acorex-platform/framework-client/core';\nimport {\n AXP_PAGE_COMPONENT_PROVIDER,\n AXP_TASK_BADGE_PROVIDERS,\n} from '@acorex-platform/framework-client/layout/components';\nimport {\n AXP_ENTITY_ACTION_PLUGIN,\n AXP_ENTITY_DEFINITION_LOADER,\n} from '@acorex-platform/framework-client/layout/entity';\nimport { provideCommandSetups } from '@acorex-platform/framework-client/runtime';\nimport { AXPRootLayoutComponent } from '@acorex-platform/framework-client/themes/default';\nimport {\n AXP_WIDGET_DEFINITION_PROVIDER,\n AXPWidgetCoreModule,\n} from '@acorex-platform/framework-client/layout/widget-core';\nimport { DatePipe } from '@angular/common';\nimport { importProvidersFrom, inject, NgModule } from '@angular/core';\nimport { RouterModule, Routes, ROUTES } from '@angular/router';\n\nimport {\n CONVERSATION_AFTER_MESSAGE_SENT_COMMAND,\n CONVERSATION_EMIT_TYPING_INDICATOR_COMMAND,\n CONVERSATION_MARK_CONVERSATION_UNREAD_COMMAND,\n CONVERSATION_OPEN_CHAT_COMMAND,\n CONVERSATION_RETRY_ASSIST_RESPONSE_COMMAND,\n CONVERSATION_START_DIRECT_CHAT_COMMAND,\n CONVERSATION_SYNC_READ_STATE_COMMAND,\n} from './features/commands/conversation-command.keys';\nimport { ConversationUserCardItemsHookProvider } from './features/user-card/conversation-user-card-items.hook';\nimport { AXMPermissionsKeys, RootConfig as ConversationRootConfig } from '@acorex-platform/module-conversation-client/contracts';\nimport { ConversationManifest } from './manifest';\nimport { AXMMenuProvider } from './menu.provider';\nimport { AXMPermissionDefinitionProvider } from './permission-definition.provider';\nimport { AXMChatBadgeProvider } from './badge.provider';\n\nimport {\n AXMCommentRealtimeService,\n AXMCommentRealtimeServiceImpl,\n AXMCommentService,\n AXMCommentServiceImpl,\n} from './features';\nimport { AXM_CHAT_CONVERSATION_PROVIDERS } from './features/chat/chat-conversation.providers';\nimport { AXM_CHAT_CALL_RTC_API_PROVIDERS } from './features/chat/plugins/call/chat-call-rtc.service';\nimport { provideConversationRealtimeHandlers } from './features/chat/services/conversation-realtime-handlers.providers';\nimport { provideConversationChatNotificationRealtime } from './features/chat/services/conversation-chat-notification-realtime.providers';\nimport { provideConversationRealtimeConnectionSync } from './features/chat/services/conversation-realtime-connection.providers';\nimport { provideConversationCallRealtimeHandlers } from './features/chat/services/conversation-call-realtime.providers';\nimport { AXMCommentsPageComponentProvider } from './features/comment/comments-page/comments-page-component.provider';\nimport { commentsPlugin } from './features/comment/comments.plugin';\nimport { AXMConversationWidgetsProvider } from './widget-definition.provider';\nimport { AXMChatUploaderService } from './features/chat/plugins/services/uploader/chat-uploader.service';\nconst CHAT_ROUTE_ACCESS_DATA = {\n requiredFeature: ConversationRootConfig.module.name,\n requiredPermission: AXMPermissionsKeys.Conversation.Management,\n} as const;\n\nfunction routesFactory(): Routes {\n const routes: Routes = [\n {\n path: ':app/chat',\n canActivate: [...AXP_PROTECTED_ROUTE_GUARDS],\n data: { tab: true, rootLayout: true, ...CHAT_ROUTE_ACCESS_DATA },\n loadComponent: () => {\n return AXPRootLayoutComponent;\n },\n children: [\n {\n path: '',\n loadComponent: () =>\n import('./features/chat/chat.component').then(\n (c) => c.AXMChatComponent,\n ),\n data: { reuse: true, ...CHAT_ROUTE_ACCESS_DATA },\n },\n {\n path: ':id',\n loadComponent: () =>\n import('./features/chat/chat.component').then(\n (c) => c.AXMChatComponent,\n ),\n // Reuse the chat shell when switching `:id` so conversation can restore per-conversation composer\n // drafts without destroying AXMChatComponent (selectConversation reloads messages).\n data: { reuse: true, ...CHAT_ROUTE_ACCESS_DATA },\n },\n ],\n },\n {\n path: ':app/comments/t/:refrenceType/i/:refrenceId/s/:subject',\n title: '@conversation:comments.feature.title',\n canActivate: [...AXP_PROTECTED_ROUTE_GUARDS],\n data: { rootLayout: true },\n loadComponent: () => AXPRootLayoutComponent,\n // resolve: {\n // refrenceType: {\n // resolve: refrenceTypeResolver,\n // },\n // refrenceId: {\n // resolve: refrenceIdResolver,\n // },\n // subject: {\n // resolve: subjectResolver,\n // },\n // },\n children: [\n {\n path: '',\n loadComponent: () =>\n import('./features/comment/comment.component').then(\n (c) => c.AXMCommentComponent,\n ),\n },\n ],\n },\n {\n path: ':app/comments/',\n title: '@conversation:comments.feature.title',\n canActivate: [...AXP_PROTECTED_ROUTE_GUARDS],\n data: { rootLayout: true },\n loadComponent: () => AXPRootLayoutComponent,\n children: [\n {\n path: '',\n loadComponent: () =>\n import('./features/comment/comment.component').then(\n (c) => c.AXMCommentComponent,\n ),\n },\n ],\n },\n ];\n return routes;\n}\n\n@NgModule({\n declarations: [],\n imports: [\n AXPWidgetCoreModule,\n ],\n exports: [\n // Modules\n RouterModule,\n ],\n providers: [\n {\n provide: AXMCommentService,\n useClass: AXMCommentServiceImpl,\n },\n {\n provide: AXMCommentRealtimeService,\n useClass: AXMCommentRealtimeServiceImpl,\n },\n ...AXM_CHAT_CONVERSATION_PROVIDERS,\n ...AXM_CHAT_CALL_RTC_API_PROVIDERS,\n ...provideConversationRealtimeHandlers(),\n ...provideConversationCallRealtimeHandlers(),\n ...provideConversationRealtimeConnectionSync(),\n ...provideConversationChatNotificationRealtime(),\n // Module-specific providers (not part of manifest system)\n {\n provide: AXP_ENTITY_ACTION_PLUGIN,\n useValue: commentsPlugin,\n multi: true,\n },\n {\n provide: AXP_PAGE_COMPONENT_PROVIDER,\n useClass: AXMCommentsPageComponentProvider,\n multi: true,\n },\n {\n provide: AXP_TASK_BADGE_PROVIDERS,\n useClass: AXMChatBadgeProvider,\n multi: true,\n },\n {\n provide: ROUTES,\n multi: true,\n useFactory: routesFactory,\n },\n // Conversation Module\n DatePipe,\n // Module Manifest Provider\n {\n provide: AXP_MODULE_MANIFEST_PROVIDER,\n useValue: ConversationManifest,\n multi: true,\n },\n // Provider references (now using tokens)\n {\n provide: AXP_PERMISSION_DEFINITION_PROVIDER,\n useClass: AXMPermissionDefinitionProvider,\n multi: true,\n },\n {\n provide: AXP_MENU_PROVIDER,\n useClass: AXMMenuProvider,\n multi: true,\n },\n \n {\n provide: AXP_WIDGET_DEFINITION_PROVIDER,\n useClass: AXMConversationWidgetsProvider,\n multi: true,\n },\n {\n provide: AXP_DISTRIBUTED_EVENT_LISTENER_PROVIDER,\n useValue: ConversationUserCardItemsHookProvider,\n multi: true,\n },\n provideCommandSetups([\n {\n key: CONVERSATION_AFTER_MESSAGE_SENT_COMMAND,\n command: () =>\n import('./features/commands/after-message-sent.command').then(\n (m) => m.AXMConversationAfterMessageSentCommand,\n ),\n },\n {\n key: CONVERSATION_RETRY_ASSIST_RESPONSE_COMMAND,\n command: () =>\n import('./features/commands/retry-assist-response.command').then(\n (m) => m.AXMConversationRetryAssistResponseCommand,\n ),\n },\n {\n key: CONVERSATION_SYNC_READ_STATE_COMMAND,\n command: () =>\n import('./features/commands/sync-read-state.command').then(\n (m) => m.AXMConversationSyncReadStateCommand,\n ),\n },\n {\n key: CONVERSATION_MARK_CONVERSATION_UNREAD_COMMAND,\n command: () =>\n import('./features/commands/mark-conversation-unread.command').then(\n (m) => m.AXMConversationMarkConversationUnreadCommand,\n ),\n },\n {\n key: CONVERSATION_EMIT_TYPING_INDICATOR_COMMAND,\n command: () =>\n import('./features/commands/emit-typing-indicator.command').then(\n (m) => m.AXMConversationEmitTypingIndicatorCommand,\n ),\n },\n {\n key: CONVERSATION_START_DIRECT_CHAT_COMMAND,\n command: () =>\n import('./features/commands/start-direct-chat.command').then(\n (m) => m.AXMConversationStartDirectChatCommand,\n ),\n },\n {\n key: CONVERSATION_OPEN_CHAT_COMMAND,\n command: () =>\n import('./features/commands/open-chat.command').then((m) => m.AXMConversationOpenChatCommand),\n },\n {\n key: 'show-comment-popup',\n command: () =>\n import('./features/comment/commands/show-comment-popup.command').then(\n (m) => m.AXMShowCommentPopupCommand,\n ),\n },\n ]),\n AXMChatUploaderService,\n provideAppStartUpTask(() => {\n // Eagerly construct uploader so its constructor-side wiring runs at bootstrap.\n inject(AXMChatUploaderService);\n return {\n name: 'conversation-chat-uploader',\n priority: AXP_APP_STARTUP_PRIORITY.conversationSessionSync,\n run: async () => undefined,\n };\n }),\n ],\n})\nexport class AXMConversationModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i5","axmConversationHasAiChat","i2","i1","i3","i4","i6","i7","i8","i10","RootConfig","ConversationRootConfig"],"mappings":"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"}