@acorex-platform/module-conversation-client 0.0.37 → 0.0.46

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. package/fesm2022/{acorex-platform-module-conversation-client-acorex-platform-module-conversation-client-C8FR7Snp.mjs → acorex-platform-module-conversation-client-acorex-platform-module-conversation-client-DUR2oyfP.mjs} +10935 -9294
  2. package/fesm2022/acorex-platform-module-conversation-client-acorex-platform-module-conversation-client-DUR2oyfP.mjs.map +1 -0
  3. package/fesm2022/{acorex-platform-module-conversation-client-after-message-sent.command-hVFQo07j.mjs → acorex-platform-module-conversation-client-after-message-sent.command-qTWATpgC.mjs} +2 -2
  4. package/fesm2022/{acorex-platform-module-conversation-client-after-message-sent.command-hVFQo07j.mjs.map → acorex-platform-module-conversation-client-after-message-sent.command-qTWATpgC.mjs.map} +1 -1
  5. package/fesm2022/{acorex-platform-module-conversation-client-assist-delegated-agent-detail-popup.component-D6XrMTQm.mjs → acorex-platform-module-conversation-client-assist-delegated-agent-detail-popup.component-DQWhOmBE.mjs} +8 -7
  6. package/fesm2022/{acorex-platform-module-conversation-client-assist-delegated-agent-detail-popup.component-D6XrMTQm.mjs.map → acorex-platform-module-conversation-client-assist-delegated-agent-detail-popup.component-DQWhOmBE.mjs.map} +1 -1
  7. package/fesm2022/acorex-platform-module-conversation-client-assist-message-renderer.component-DyVepuaW.mjs +1756 -0
  8. package/fesm2022/acorex-platform-module-conversation-client-assist-message-renderer.component-DyVepuaW.mjs.map +1 -0
  9. package/fesm2022/acorex-platform-module-conversation-client-assist-tool-detail-popup.component-D8na_1QJ.mjs +120 -0
  10. package/fesm2022/{acorex-platform-module-conversation-client-assist-tool-detail-popup.component-BV1YH96m.mjs.map → acorex-platform-module-conversation-client-assist-tool-detail-popup.component-D8na_1QJ.mjs.map} +1 -1
  11. package/fesm2022/{acorex-platform-module-conversation-client-chat-call-session-page.component-b84Na7R_.mjs → acorex-platform-module-conversation-client-chat-call-session-page.component-BeS4Duip.mjs} +747 -25
  12. package/fesm2022/acorex-platform-module-conversation-client-chat-call-session-page.component-BeS4Duip.mjs.map +1 -0
  13. package/fesm2022/{acorex-platform-module-conversation-client-chat-call-start-popup.component-BTOtRRPY.mjs → acorex-platform-module-conversation-client-chat-call-start-popup.component-BbEhkLLh.mjs} +4 -4
  14. package/fesm2022/{acorex-platform-module-conversation-client-chat-call-start-popup.component-BTOtRRPY.mjs.map → acorex-platform-module-conversation-client-chat-call-start-popup.component-BbEhkLLh.mjs.map} +1 -1
  15. package/fesm2022/{acorex-platform-module-conversation-client-chat-conversation-info-media-view.component-CppNPfqe.mjs → acorex-platform-module-conversation-client-chat-conversation-info-media-view.component-Bnbj0e6M.mjs} +3 -3
  16. package/fesm2022/{acorex-platform-module-conversation-client-chat-conversation-info-media-view.component-CppNPfqe.mjs.map → acorex-platform-module-conversation-client-chat-conversation-info-media-view.component-Bnbj0e6M.mjs.map} +1 -1
  17. package/fesm2022/acorex-platform-module-conversation-client-chat-conversation-info-panel.component-bwT1-lAn.mjs +497 -0
  18. package/fesm2022/acorex-platform-module-conversation-client-chat-conversation-info-panel.component-bwT1-lAn.mjs.map +1 -0
  19. package/fesm2022/{acorex-platform-module-conversation-client-comments-page.component-BhSJiJY5.mjs → acorex-platform-module-conversation-client-comments-page.component-BxUz9jTX.mjs} +2 -2
  20. package/fesm2022/{acorex-platform-module-conversation-client-comments-page.component-BhSJiJY5.mjs.map → acorex-platform-module-conversation-client-comments-page.component-BxUz9jTX.mjs.map} +1 -1
  21. package/fesm2022/acorex-platform-module-conversation-client-contracts-entities-channel-audience.mjs +277 -0
  22. package/fesm2022/acorex-platform-module-conversation-client-contracts-entities-channel-audience.mjs.map +1 -0
  23. package/fesm2022/acorex-platform-module-conversation-client-contracts-entities-channel-post.mjs +530 -0
  24. package/fesm2022/acorex-platform-module-conversation-client-contracts-entities-channel-post.mjs.map +1 -0
  25. package/fesm2022/acorex-platform-module-conversation-client-contracts-entities-channel-receipt.mjs +206 -0
  26. package/fesm2022/acorex-platform-module-conversation-client-contracts-entities-channel-receipt.mjs.map +1 -0
  27. package/fesm2022/acorex-platform-module-conversation-client-contracts-entities-message.mjs +65 -17
  28. package/fesm2022/acorex-platform-module-conversation-client-contracts-entities-message.mjs.map +1 -1
  29. package/fesm2022/acorex-platform-module-conversation-client-contracts-entities-room.mjs +231 -59
  30. package/fesm2022/acorex-platform-module-conversation-client-contracts-entities-room.mjs.map +1 -1
  31. package/fesm2022/acorex-platform-module-conversation-client-contracts-entity-catalog-acorex-platform-module-conversation-client-contracts-entity-catalog-CV_sCYGf.mjs +87 -0
  32. package/fesm2022/acorex-platform-module-conversation-client-contracts-entity-catalog-acorex-platform-module-conversation-client-contracts-entity-catalog-CV_sCYGf.mjs.map +1 -0
  33. package/fesm2022/acorex-platform-module-conversation-client-contracts-entity-catalog-channel-audience.entity-DyaUcESJ.mjs +213 -0
  34. package/fesm2022/acorex-platform-module-conversation-client-contracts-entity-catalog-channel-audience.entity-DyaUcESJ.mjs.map +1 -0
  35. package/fesm2022/acorex-platform-module-conversation-client-contracts-entity-catalog-channel-post.entity-CbBcChEt.mjs +466 -0
  36. package/fesm2022/acorex-platform-module-conversation-client-contracts-entity-catalog-channel-post.entity-CbBcChEt.mjs.map +1 -0
  37. package/fesm2022/acorex-platform-module-conversation-client-contracts-entity-catalog-channel-receipt.entity-DtRFj8zV.mjs +142 -0
  38. package/fesm2022/acorex-platform-module-conversation-client-contracts-entity-catalog-channel-receipt.entity-DtRFj8zV.mjs.map +1 -0
  39. package/fesm2022/{acorex-platform-module-conversation-client-contracts-entity-catalog-message.entity-Dz7cO1P4.mjs → acorex-platform-module-conversation-client-contracts-entity-catalog-message.entity-CJk1wEvA.mjs} +35 -19
  40. package/fesm2022/acorex-platform-module-conversation-client-contracts-entity-catalog-message.entity-CJk1wEvA.mjs.map +1 -0
  41. package/fesm2022/acorex-platform-module-conversation-client-contracts-entity-catalog-room.entity-Ctt7qzfF.mjs +403 -0
  42. package/fesm2022/acorex-platform-module-conversation-client-contracts-entity-catalog-room.entity-Ctt7qzfF.mjs.map +1 -0
  43. package/fesm2022/acorex-platform-module-conversation-client-contracts-entity-catalog.mjs +1 -1
  44. package/fesm2022/acorex-platform-module-conversation-client-contracts.mjs +846 -4
  45. package/fesm2022/acorex-platform-module-conversation-client-contracts.mjs.map +1 -1
  46. package/fesm2022/acorex-platform-module-conversation-client-local-entities.mjs +3 -0
  47. package/fesm2022/acorex-platform-module-conversation-client-local-entities.mjs.map +1 -1
  48. package/fesm2022/{acorex-platform-module-conversation-client-mark-conversation-unread.command-D0rr0npJ.mjs → acorex-platform-module-conversation-client-mark-conversation-unread.command-juoWxu7I.mjs} +2 -2
  49. package/fesm2022/{acorex-platform-module-conversation-client-mark-conversation-unread.command-D0rr0npJ.mjs.map → acorex-platform-module-conversation-client-mark-conversation-unread.command-juoWxu7I.mjs.map} +1 -1
  50. package/fesm2022/{acorex-platform-module-conversation-client-open-chat.command-Bbgp4ZfT.mjs → acorex-platform-module-conversation-client-open-chat.command-ridcdmj7.mjs} +2 -2
  51. package/fesm2022/{acorex-platform-module-conversation-client-open-chat.command-Bbgp4ZfT.mjs.map → acorex-platform-module-conversation-client-open-chat.command-ridcdmj7.mjs.map} +1 -1
  52. package/fesm2022/{acorex-platform-module-conversation-client-retry-assist-response.command-BMZTab8j.mjs → acorex-platform-module-conversation-client-retry-assist-response.command-BsYxaH3g.mjs} +2 -2
  53. package/fesm2022/{acorex-platform-module-conversation-client-retry-assist-response.command-BMZTab8j.mjs.map → acorex-platform-module-conversation-client-retry-assist-response.command-BsYxaH3g.mjs.map} +1 -1
  54. package/fesm2022/{acorex-platform-module-conversation-client-sync-read-state.command-9G3Knrre.mjs → acorex-platform-module-conversation-client-sync-read-state.command-DsCyIdEk.mjs} +7 -2
  55. package/fesm2022/acorex-platform-module-conversation-client-sync-read-state.command-DsCyIdEk.mjs.map +1 -0
  56. package/fesm2022/acorex-platform-module-conversation-client.mjs +1 -1
  57. package/package.json +14 -2
  58. package/types/acorex-platform-module-conversation-client-contracts-entities-channel-audience.d.ts +5 -0
  59. package/types/acorex-platform-module-conversation-client-contracts-entities-channel-post.d.ts +5 -0
  60. package/types/acorex-platform-module-conversation-client-contracts-entities-channel-receipt.d.ts +5 -0
  61. package/types/acorex-platform-module-conversation-client-contracts.d.ts +432 -2
  62. package/types/acorex-platform-module-conversation-client.d.ts +680 -161
  63. package/fesm2022/acorex-platform-module-conversation-client-acorex-platform-module-conversation-client-C8FR7Snp.mjs.map +0 -1
  64. package/fesm2022/acorex-platform-module-conversation-client-assist-tool-detail-popup.component-BV1YH96m.mjs +0 -120
  65. package/fesm2022/acorex-platform-module-conversation-client-chat-call-session-page.component-b84Na7R_.mjs.map +0 -1
  66. package/fesm2022/acorex-platform-module-conversation-client-chat-conversation-info-panel.component-C5xS98oE.mjs +0 -472
  67. package/fesm2022/acorex-platform-module-conversation-client-chat-conversation-info-panel.component-C5xS98oE.mjs.map +0 -1
  68. package/fesm2022/acorex-platform-module-conversation-client-contracts-entity-catalog-acorex-platform-module-conversation-client-contracts-entity-catalog-Cy3LwYMZ.mjs +0 -52
  69. package/fesm2022/acorex-platform-module-conversation-client-contracts-entity-catalog-acorex-platform-module-conversation-client-contracts-entity-catalog-Cy3LwYMZ.mjs.map +0 -1
  70. package/fesm2022/acorex-platform-module-conversation-client-contracts-entity-catalog-message.entity-Dz7cO1P4.mjs.map +0 -1
  71. package/fesm2022/acorex-platform-module-conversation-client-contracts-entity-catalog-room.entity-B9txvc3y.mjs +0 -263
  72. package/fesm2022/acorex-platform-module-conversation-client-contracts-entity-catalog-room.entity-B9txvc3y.mjs.map +0 -1
  73. package/fesm2022/acorex-platform-module-conversation-client-sync-read-state.command-9G3Knrre.mjs.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"acorex-platform-module-conversation-client-acorex-platform-module-conversation-client-DUR2oyfP.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/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/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/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/call/chat-call-log.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-participant-hydrate.util.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/conversation-unread.util.ts","../../../../libs/modules/conversation/client/src/lib/features/chat/plugins/utils/conversation-snapshot-merge.util.ts","../../../../libs/modules/conversation/client/src/lib/features/chat/utils/pagination.utils.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/utils/axm-chat-presence.util.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-realtime.bus.ts","../../../../libs/modules/conversation/client/src/lib/features/chat/services/conversation-entity-store.service.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/channel-unread-badge.provider.ts","../../../../libs/modules/conversation/client/src/lib/channel-search-command.provider.ts","../../../../libs/modules/conversation/client/src/lib/features/channel-feed/channel-feed.page.routes.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/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/channel-feed/channel-feed-file.util.ts","../../../../libs/modules/conversation/client/src/lib/features/channel-feed/channel-feed-gallery/channel-feed-gallery.component.ts","../../../../libs/modules/conversation/client/src/lib/features/channel-feed/channel-feed-gallery/channel-feed-gallery.component.html","../../../../libs/modules/conversation/client/src/lib/features/channel-feed/channel-feed-item/channel-feed-item.component.ts","../../../../libs/modules/conversation/client/src/lib/features/channel-feed/channel-feed-item/channel-feed-item.component.html","../../../../libs/modules/conversation/client/src/lib/features/channel-feed/channel-feed.page.ts","../../../../libs/modules/conversation/client/src/lib/features/channel-feed/channel-feed.page.html","../../../../libs/modules/conversation/client/src/lib/features/chat/plugins/utils/conversation-chat-url.util.ts","../../../../libs/modules/conversation/client/src/lib/features/chat/services/conversation-focus.service.ts","../../../../libs/modules/conversation/client/src/lib/features/mini-chat/mini-chat-panel.types.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/conversation-list-sort.util.ts","../../../../libs/modules/conversation/client/src/lib/features/mini-chat/mini-chat-history-live.util.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/services/chat-assist-catalog.port.ts","../../../../libs/modules/conversation/client/src/lib/features/mini-chat/mini-chat-page-context.util.ts","../../../../libs/modules/conversation/client/src/lib/features/mini-chat/mini-chat-page-context.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-i18n-label.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/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-assist-session.service.ts","../../../../libs/modules/conversation/client/src/lib/features/chat/plugins/composer/chat-composer-ensure-assist-conversation.directive.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/chat/plugins/info-bar/open-chat-conversation-info-panel.dialog.ts","../../../../libs/modules/conversation/client/src/lib/features/chat/plugins/utils/assist-composer-stop.util.ts","../../../../libs/modules/conversation/client/src/lib/features/chat/services/conversation-assist-response.port.ts","../../../../libs/modules/conversation/client/src/lib/features/chat/services/conversation-appearance-sync.service.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-popup-window.component.ts","../../../../libs/modules/conversation/client/src/lib/features/mini-chat/mini-chat-popup-window.component.html","../../../../libs/modules/conversation/client/src/lib/features/mini-chat/mini-chat-panel.service.ts","../../../../libs/modules/conversation/client/src/lib/features/chat/plugins/call/chat-call-active-session.service.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/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/plugins/utils/bulletin-feed-message.util.ts","../../../../libs/modules/conversation/client/src/lib/features/chat/plugins/utils/announcement-subscriber-count.util.ts","../../../../libs/modules/conversation/client/src/lib/features/chat/plugins/services/entity/chat-entity-announcement-channel.service.ts","../../../../libs/modules/conversation/client/src/lib/features/chat/plugins/utils/conversation-participant.util.ts","../../../../libs/modules/conversation/client/src/lib/features/chat/plugins/utils/announcement-channel-access.util.ts","../../../../libs/modules/conversation/client/src/lib/features/chat/plugins/utils/chat-conversation-group-upgrade.util.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-in-app-notification-sync.service.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/plugins/composer/chat-composer-assist-picker.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/services/conversation-regular-auto-reply.port.ts","../../../../libs/modules/conversation/client/src/lib/features/chat/services/conversation-service-session.adapter.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-page-action.component.ts","../../../../libs/modules/conversation/client/src/lib/features/mini-chat/mini-chat-page-action.component.html","../../../../libs/modules/conversation/client/src/lib/features/mini-chat/mini-chat-launcher.component.ts","../../../../libs/modules/conversation/client/src/lib/features/mini-chat/mini-chat-footer-dock.component.ts","../../../../libs/modules/conversation/client/src/lib/features/mini-chat/mini-chat-footer-dock.component.html","../../../../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-recorder.component.html","../../../../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/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/plugins/message-renderers/assist-message-renderer.plugin.ts","../../../../libs/modules/conversation/client/src/lib/features/chat/plugins/message-renderers/bulletin-feed-item-message-renderer.component.ts","../../../../libs/modules/conversation/client/src/lib/features/chat/plugins/message-renderers/bulletin-feed-item-message-renderer.component.html","../../../../libs/modules/conversation/client/src/lib/features/chat/plugins/message-renderers/bulletin-feed-item-message-renderer.plugin.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/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.component.html","../../../../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.component.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/chat-message-action.util.ts","../../../../libs/modules/conversation/client/src/lib/features/chat/services/conversation-chat-inbox-bridge.service.ts","../../../../libs/modules/conversation/client/src/lib/features/chat/services/conversation-chat-inbox-catch-up.service.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/chat-conversation.providers.ts","../../../../libs/modules/conversation/client/src/lib/features/chat/plugins/call/chat-call-rtc-api.providers.ts","../../../../libs/modules/conversation/client/src/lib/features/chat/services/conversation-chat-in-app-notification.service.ts","../../../../libs/modules/conversation/client/src/lib/features/chat/services/conversation-prefer-local-edited-text.util.ts","../../../../libs/modules/conversation/client/src/lib/features/chat/services/conversation-realtime-message-dedupe.util.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-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-livekit.loader.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-signal.types.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/chat/services/conversation-focus-route-sync.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';\r\nimport { AXPHookProvider } from '@acorex-platform/framework-client/core';\r\nimport {\r\n USER_CARD_ITEMS_HOOK,\r\n type AXPUserCardItemsPayload,\r\n} from '@acorex-platform/framework-client/layout/components';\r\nimport { inject } from '@angular/core';\r\n\r\nimport { CONVERSATION_START_DIRECT_CHAT_COMMAND } from '../commands/conversation-command.keys';\r\n\r\n//#region ----- Conversation user-card items -----\r\n\r\n/** Contributes a Message CTA that starts a private chat with the card's user. */\r\nexport const ConversationUserCardItemsHookProvider: AXPHookProvider<\r\n AXPUserCardItemsPayload,\r\n AXPUserCardItemsPayload\r\n> = {\r\n key: USER_CARD_ITEMS_HOOK,\r\n priority: 10,\r\n execute: (payload) => {\r\n const userId = payload.userId?.trim();\r\n if (!userId) {\r\n return payload;\r\n }\r\n\r\n const sessionService = inject(AXPSessionService);\r\n // Hide Message on the signed-in user's own card — there is no self-chat.\r\n if (sessionService.user?.id === userId) {\r\n return payload;\r\n }\r\n\r\n return {\r\n ...payload,\r\n actions: [\r\n ...payload.actions,\r\n {\r\n name: 'conversation.start-direct-chat',\r\n title: '@conversation:chat.user-card.message',\r\n icon: 'fa-light fa-message',\r\n priority: 10,\r\n command: {\r\n name: CONVERSATION_START_DIRECT_CHAT_COMMAND,\r\n options: { userId },\r\n },\r\n },\r\n ],\r\n };\r\n },\r\n};\r\n\r\n//#endregion\r\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 ----\r\n\r\nimport type { AXMAssistConversationSnapshotLite } from './ai-chat-lite.types';\r\n\r\n//#endregion\r\n\r\n//#region ---- Assist metadata ----\r\n\r\n/**\r\n * Resolves assist id from conversation metadata.\r\n */\r\nexport function axmExtractAssistIdFromMetadata(metadata: Record<string, unknown> | undefined): string | undefined {\r\n if (!metadata) {\r\n return undefined;\r\n }\r\n const direct = metadata['assistId'];\r\n if (typeof direct === 'string' && direct.trim()) {\r\n return direct.trim();\r\n }\r\n const nested = metadata['metadata'];\r\n if (nested && typeof nested === 'object' && nested !== null) {\r\n const inner = (nested as Record<string, unknown>)['assistId'];\r\n if (typeof inner === 'string' && inner.trim()) {\r\n return inner.trim();\r\n }\r\n }\r\n return undefined;\r\n}\r\n\r\n/**\r\n * Legacy detector for unsupported agent-as-chat rooms. Not an engine targeting API.\r\n */\r\nexport function axmExtractDirectAgentIdFromMetadata(\r\n metadata: Record<string, unknown> | undefined,\r\n): string | undefined {\r\n if (!metadata) {\r\n return undefined;\r\n }\r\n const direct = metadata['directAgentId'];\r\n if (typeof direct === 'string' && direct.trim()) {\r\n return direct.trim();\r\n }\r\n const nested = metadata['metadata'];\r\n if (nested && typeof nested === 'object' && nested !== null) {\r\n const inner = (nested as Record<string, unknown>)['directAgentId'];\r\n if (typeof inner === 'string' && inner.trim()) {\r\n return inner.trim();\r\n }\r\n }\r\n return undefined;\r\n}\r\n\r\nfunction axmExtractConversationKindFromMetadata(\r\n metadata: Record<string, unknown> | undefined,\r\n): string | undefined {\r\n if (!metadata) {\r\n return undefined;\r\n }\r\n const kind = metadata['kind'];\r\n if (typeof kind === 'string' && kind.trim()) {\r\n return kind.trim();\r\n }\r\n const nested = metadata['metadata'];\r\n if (nested && typeof nested === 'object' && nested !== null) {\r\n const inner = (nested as Record<string, unknown>)['kind'];\r\n if (typeof inner === 'string' && inner.trim()) {\r\n return inner.trim();\r\n }\r\n }\r\n return undefined;\r\n}\r\n\r\n/**\r\n * True when the room is a leftover agent-as-chat conversation with no Assist id.\r\n * Callers must fail explicitly; do not map these rooms onto the default Assist.\r\n */\r\nexport function axmIsUnsupportedLegacyAgentAssistConversation(\r\n metadata: Record<string, unknown> | undefined,\r\n): boolean {\r\n if (axmExtractAssistIdFromMetadata(metadata)) {\r\n return false;\r\n }\r\n return (\r\n !!axmExtractDirectAgentIdFromMetadata(metadata) ||\r\n axmExtractConversationKindFromMetadata(metadata) === 'agent-assist'\r\n );\r\n}\r\n\r\n/** True when the conversation targets an assist catalog row or a leftover unsupported agent-as-chat room. */\r\nexport function axmConversationHasAiChat(metadata: Record<string, unknown> | undefined): boolean {\r\n return !!(\r\n axmExtractAssistIdFromMetadata(metadata) ??\r\n axmExtractDirectAgentIdFromMetadata(metadata) ??\r\n (axmExtractConversationKindFromMetadata(metadata) === 'agent-assist' ? 'agent-assist' : undefined)\r\n );\r\n}\r\n\r\nfunction isAssistSnapshot(value: unknown): value is AXMAssistConversationSnapshotLite {\r\n return value != null && typeof value === 'object';\r\n}\r\n\r\n/** Reads embedded assist welcome/model fields stamped at conversation create. */\r\nexport function axmExtractAssistSnapshotFromMetadata(\r\n metadata: Record<string, unknown> | undefined,\r\n): AXMAssistConversationSnapshotLite | null {\r\n if (!metadata) {\r\n return null;\r\n }\r\n const direct = metadata['assistSnapshot'];\r\n if (isAssistSnapshot(direct)) {\r\n return direct;\r\n }\r\n const nested = metadata['metadata'];\r\n if (nested && typeof nested === 'object' && nested !== null) {\r\n const inner = (nested as Record<string, unknown>)['assistSnapshot'];\r\n if (isAssistSnapshot(inner)) {\r\n return inner;\r\n }\r\n }\r\n return null;\r\n}\r\n\r\n/** Resolves model entity id from conversation metadata (snapshot or persisted patch). */\r\nexport function axmExtractModelEntityIdFromMetadata(\r\n metadata: Record<string, unknown> | undefined,\r\n): string | undefined {\r\n if (!metadata) {\r\n return undefined;\r\n }\r\n const direct = metadata['modelEntityId'];\r\n if (typeof direct === 'string' && direct.trim()) {\r\n return direct.trim();\r\n }\r\n const snapshot = axmExtractAssistSnapshotFromMetadata(metadata);\r\n const fromSnapshot = snapshot?.modelId;\r\n if (typeof fromSnapshot === 'string' && fromSnapshot.trim()) {\r\n return fromSnapshot.trim();\r\n }\r\n return undefined;\r\n}\r\n\r\n//#endregion\r\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 { axmAiChatConversationUiMetadata } from '@acorex-platform/module-conversation-client/contracts';\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> = {\n assistId: row.id,\n ...axmAiChatConversationUiMetadata(),\n };\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 type { AXConversationCreateData, AXConversationParticipant } from '@acorex/components/conversation';\r\n\r\nimport { axmExtractAssistIdFromMetadata } from './assist-metadata.util';\r\nimport { axmChatAiPeerParticipantId } from './chat-ai-target.util';\r\n\r\n/**\r\n * True when the participant is an AI Assist peer (synthetic `assist-*` id or assist metadata).\r\n * Such entries should not appear in human-only pickers (e.g. regular \"New chat\").\r\n */\r\nexport function axmIsAssistPeerParticipant(participant: AXConversationParticipant): boolean {\r\n if (typeof participant.id === 'string' && participant.id.startsWith('assist-')) {\r\n return true;\r\n }\r\n const meta = participant.metadata as Record<string, unknown> | undefined;\r\n if (!meta) {\r\n return false;\r\n }\r\n if (meta['kind'] === 'assist') {\r\n return true;\r\n }\r\n const assistId = meta['assistId'];\r\n return typeof assistId === 'string' && assistId.trim().length > 0;\r\n}\r\n\r\n/**\r\n * Builds a synthetic assist peer for entity-backed room creation when the id is not a security user.\r\n */\r\nexport function axmBuildAssistPeerParticipantFromCreateData(\r\n participantId: string,\r\n data: AXConversationCreateData,\r\n): AXConversationParticipant | null {\r\n const meta = (data.metadata ?? {}) as Record<string, unknown>;\r\n const assistId = axmExtractAssistIdFromMetadata(meta);\r\n if (!assistId || (data.type !== 'private' && data.type !== 'bot')) {\r\n return null;\r\n }\r\n const expectedId = axmChatAiPeerParticipantId(assistId);\r\n if (participantId !== expectedId) {\r\n return null;\r\n }\r\n const name = typeof data.title === 'string' && data.title.trim() ? data.title.trim() : 'AI Assistant';\r\n return {\r\n id: participantId,\r\n name,\r\n avatar: data.avatar,\r\n icon: data.icon,\r\n role: 'member',\r\n metadata: { assistId, kind: 'assist' },\r\n };\r\n}\r\n\r\n/**\r\n * Minimal assist peer for lookups by synthetic `assist-*` participant id.\r\n */\r\nexport function axmBuildAssistPeerParticipantFromId(participantId: string): AXConversationParticipant | null {\r\n if (!participantId.startsWith('assist-')) {\r\n return null;\r\n }\r\n const catalogPeerId = participantId.slice('assist-'.length).trim();\r\n if (!catalogPeerId) {\r\n return null;\r\n }\r\n return {\r\n id: participantId,\r\n name: 'AI Assistant',\r\n role: 'member',\r\n metadata: { assistId: catalogPeerId, kind: 'assist' },\r\n };\r\n}\r\n","//#region ---- Imports ----\n\nimport type { AXConversation } from '@acorex/components/conversation';\nimport { axmBuildHeuristicConversationTitleFallback } from '@acorex-platform/module-conversation-client/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 { AXConversationMessage, AXConversationMessagePayload } from '@acorex/components/conversation';\nimport type { AXSystemEventType, AXSystemPayload } from '@acorex-platform/module-conversation-client/contracts';\n\nimport type { AXMChatCallMediaType } from './chat-call-session.types';\n\n//#endregion\n\n//#region ----- Types -----\n\nexport type AXMChatCallLogOutcome = 'declined' | 'missed' | 'cancelled' | 'completed';\n\nexport interface AXMChatCallLogInfo {\n callId: string;\n outcome: AXMChatCallLogOutcome;\n media: AXMChatCallMediaType;\n eventType: AXSystemEventType;\n actorUserId?: string;\n initiatorUserId?: string;\n peerUserId?: string;\n peerUserName?: string;\n durationSec?: number;\n isGroup?: boolean;\n joinedUserNames?: string[];\n absentUserNames?: string[];\n}\n\n//#endregion\n\n//#region ----- Call log helpers -----\n\nconst OUTCOME_EVENT: Record<AXMChatCallLogOutcome, AXSystemEventType> = {\n declined: 'call_declined',\n missed: 'call_missed',\n cancelled: 'call_cancelled',\n completed: 'call_completed',\n};\n\nconst EVENT_TO_OUTCOME: Partial<Record<AXSystemEventType, AXMChatCallLogOutcome>> = {\n call_declined: 'declined',\n call_missed: 'missed',\n call_cancelled: 'cancelled',\n call_completed: 'completed',\n};\n\n/** Maps legacy `system` call rows to `call-log` so they render inside chat bubbles. */\nexport function axmNormalizeCallLogMessageType(message: AXConversationMessage): AXConversationMessage {\n if (message.type === 'call-log') {\n return message;\n }\n if (message.type === 'system' && axmReadChatCallLog(message)) {\n return { ...message, type: 'call-log' };\n }\n return message;\n}\n\nexport function axmBuildChatCallLogMessage(input: {\n messageId: string;\n conversationId: string;\n senderId: string;\n outcome: AXMChatCallLogOutcome;\n media: AXMChatCallMediaType;\n callId: string;\n timestamp?: Date;\n initiatorUserId?: string;\n isGroup?: boolean;\n durationSec?: number;\n actorUserId?: string;\n peerUserId?: string | null;\n peerUserName?: string | null;\n joinedUserIds?: string[];\n absentUserIds?: string[];\n joinedUserNames?: string[];\n absentUserNames?: string[];\n}): AXConversationMessage {\n const callId = input.callId.trim();\n const media = input.media === 'video' ? 'video' : 'voice';\n const eventType = OUTCOME_EVENT[input.outcome];\n const timestamp = input.timestamp ?? new Date();\n const joinedUserIds = input.joinedUserIds ?? [];\n const absentUserIds = input.absentUserIds ?? [];\n const payload: AXSystemPayload = {\n type: 'system',\n eventType,\n text: `@conversation:chat.call.log.${input.outcome}`,\n data: {\n callId,\n media,\n outcome: input.outcome,\n actorUserId: input.actorUserId ?? input.senderId,\n initiatorUserId: input.initiatorUserId ?? input.senderId,\n peerUserId: input.peerUserId ?? null,\n peerUserName: input.peerUserName ?? null,\n durationSec: input.durationSec,\n isGroup: input.isGroup === true,\n joinedUserIds,\n joinedUserNames: input.joinedUserNames ?? [],\n absentUserIds,\n absentUserNames: input.absentUserNames ?? [],\n },\n };\n\n return {\n id: input.messageId.trim(),\n conversationId: input.conversationId.trim(),\n senderId: input.senderId.trim(),\n type: 'call-log',\n timestamp,\n status: 'sent',\n payload: payload as AXConversationMessagePayload,\n metadata: {\n callId,\n callOutcome: input.outcome,\n media,\n isGroup: input.isGroup === true,\n },\n reactions: [],\n forwarded: false,\n pinned: false,\n deleted: false,\n isLocal: false,\n };\n}\n\nexport function axmIsChatCallLogEventType(eventType: string | undefined): eventType is AXSystemEventType {\n return (\n eventType === 'call_declined' ||\n eventType === 'call_missed' ||\n eventType === 'call_cancelled' ||\n eventType === 'call_completed'\n );\n}\n\nexport function axmReadChatCallLog(message: AXConversationMessage | null | undefined): AXMChatCallLogInfo | null {\n if (!message) {\n return null;\n }\n if (message.type !== 'call-log' && message.type !== 'system') {\n return null;\n }\n\n const payload = axmCoerceSystemPayload(message.payload);\n const eventType = payload?.eventType;\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 const readStringArray = (value: unknown): string[] =>\n Array.isArray(value)\n ? value.filter((entry): entry is string => typeof entry === 'string' && Boolean(entry.trim()))\n : [];\n\n return {\n callId,\n outcome: EVENT_TO_OUTCOME[eventType] ?? 'missed',\n media,\n eventType,\n actorUserId: typeof data['actorUserId'] === 'string' ? data['actorUserId'] : undefined,\n initiatorUserId: typeof data['initiatorUserId'] === 'string' ? data['initiatorUserId'] : undefined,\n peerUserId: typeof data['peerUserId'] === 'string' ? data['peerUserId'] : undefined,\n peerUserName: typeof data['peerUserName'] === 'string' ? data['peerUserName'] : undefined,\n durationSec: typeof data['durationSec'] === 'number' ? data['durationSec'] : undefined,\n isGroup: metadata['isGroup'] === true || data['isGroup'] === true,\n joinedUserNames: readStringArray(data['joinedUserNames']),\n absentUserNames: readStringArray(data['absentUserNames']),\n };\n}\n\nexport interface AXMCallDurationTranslation {\n key: string;\n params: Record<string, string | number>;\n}\n\nexport function axmResolveCallDurationTranslation(durationSec: number): AXMCallDurationTranslation {\n const total = Math.max(0, Math.round(durationSec));\n\n if (total < 60) {\n return {\n key: '@conversation:chat.call.log.duration.seconds',\n params: { count: total },\n };\n }\n\n const minutes = Math.floor(total / 60);\n const seconds = total % 60;\n\n if (seconds === 0) {\n return {\n key: '@conversation:chat.call.log.duration.minutes',\n params: { count: minutes },\n };\n }\n\n return {\n key: '@conversation:chat.call.log.duration.minutes-seconds',\n params: {\n minutes,\n seconds: String(seconds).padStart(2, '0'),\n },\n };\n}\n\nexport type AXMChatCallLogPerspective =\n | 'outgoing-completed'\n | 'incoming-completed'\n | 'outgoing-declined'\n | 'incoming-declined'\n | 'outgoing-cancelled'\n | 'incoming-cancelled'\n | 'outgoing-missed'\n | 'incoming-missed'\n | 'group-completed'\n | 'group-declined'\n | 'group-missed'\n | 'group-cancelled';\n\n/** Resolves viewer-relative call-log perspective used by subject/action copy keys. */\nexport function axmChatCallLogPerspective(\n info: AXMChatCallLogInfo,\n viewerUserId: string | null | undefined,\n): AXMChatCallLogPerspective {\n const viewer = viewerUserId?.trim() ?? '';\n const actor = info.actorUserId?.trim() ?? '';\n const initiator = info.initiatorUserId?.trim() ?? '';\n const isViewerActor = Boolean(viewer && actor && viewer === actor);\n const isViewerInitiator = Boolean(viewer && initiator && viewer === initiator);\n\n if (info.isGroup) {\n switch (info.outcome) {\n case 'completed':\n return 'group-completed';\n case 'declined':\n return 'group-declined';\n case 'cancelled':\n return 'group-cancelled';\n case 'missed':\n default:\n return 'group-missed';\n }\n }\n\n switch (info.outcome) {\n case 'completed':\n return isViewerInitiator ? 'outgoing-completed' : 'incoming-completed';\n case 'declined':\n return isViewerActor ? 'incoming-declined' : 'outgoing-declined';\n case 'cancelled':\n return isViewerActor ? 'outgoing-cancelled' : 'incoming-cancelled';\n case 'missed':\n return isViewerInitiator ? 'outgoing-missed' : 'incoming-missed';\n default:\n return 'incoming-missed';\n }\n}\n\n/** Telegram-style bold headline (Missed Call / Incoming Call / …). */\nexport function axmChatCallLogHeadlineKey(\n info: AXMChatCallLogInfo,\n viewerUserId: string | null | undefined,\n): string {\n const mediaSuffix = info.media === 'video' ? '-video' : '';\n const perspective = axmChatCallLogPerspective(info, viewerUserId);\n\n if (perspective.startsWith('group-')) {\n return `@conversation:chat.call.log.headline.${perspective}${mediaSuffix}`;\n }\n if (perspective.endsWith('-missed')) {\n return `@conversation:chat.call.log.headline.missed${mediaSuffix}`;\n }\n if (perspective.endsWith('-declined')) {\n return `@conversation:chat.call.log.headline.declined${mediaSuffix}`;\n }\n if (perspective.endsWith('-cancelled')) {\n return `@conversation:chat.call.log.headline.cancelled${mediaSuffix}`;\n }\n if (perspective === 'outgoing-completed') {\n return `@conversation:chat.call.log.headline.outgoing${mediaSuffix}`;\n }\n return `@conversation:chat.call.log.headline.incoming${mediaSuffix}`;\n}\n\n/** Top line: peer / self / group subject. */\nexport function axmChatCallLogSubjectKey(\n info: AXMChatCallLogInfo,\n viewerUserId: string | null | undefined,\n): string {\n const perspective = axmChatCallLogPerspective(info, viewerUserId);\n switch (perspective) {\n case 'outgoing-completed':\n case 'outgoing-missed':\n return '@conversation:chat.call.log.subject.with-name';\n case 'incoming-declined':\n case 'outgoing-cancelled':\n return '@conversation:chat.call.log.subject.you';\n case 'group-completed':\n case 'group-declined':\n case 'group-missed':\n case 'group-cancelled':\n return '@conversation:chat.call.log.subject.group';\n case 'incoming-completed':\n case 'outgoing-declined':\n case 'incoming-cancelled':\n case 'incoming-missed':\n default:\n return '@conversation:chat.call.log.subject.name';\n }\n}\n\n/** Second line: call operation / outcome copy. */\nexport function axmChatCallLogActionKey(\n info: AXMChatCallLogInfo,\n viewerUserId: string | null | undefined,\n): string {\n const mediaSuffix = info.media === 'video' ? '-video' : '';\n const perspective = axmChatCallLogPerspective(info, viewerUserId);\n return `@conversation:chat.call.log.action.${perspective}${mediaSuffix}`;\n}\n\n/** @deprecated Prefer subject + action keys for Telegram-style two-line copy. */\nexport function axmChatCallLogTitleKey(\n info: AXMChatCallLogInfo,\n viewerUserId: string | null | undefined,\n): string {\n const mediaSuffix = info.media === 'video' ? '-video' : '';\n const perspective = axmChatCallLogPerspective(info, viewerUserId);\n return `@conversation:chat.call.log.${perspective}${mediaSuffix}`;\n}\n\nexport function axmChatCallLogTranslateParams(info: AXMChatCallLogInfo): Record<string, string> {\n const params: Record<string, string> = {};\n if (info.peerUserName?.trim()) {\n params['name'] = info.peerUserName.trim();\n }\n if (info.isGroup) {\n params['joined'] = info.joinedUserNames?.length ? info.joinedUserNames.join(', ') : '—';\n if (info.absentUserNames?.length) {\n params['absent'] = info.absentUserNames.join(', ');\n }\n }\n return params;\n}\n\n/** Group call log attendance line — omits absent copy when nobody was absent. */\nexport function axmChatCallLogGroupAttendanceKey(info: AXMChatCallLogInfo): string {\n return info.absentUserNames?.length\n ? '@conversation:chat.call.log.group-attendance'\n : '@conversation:chat.call.log.group-attendance-joined-only';\n}\n\nfunction axmCoerceSystemPayload(payload: unknown): AXSystemPayload | undefined {\n if (!payload) {\n return undefined;\n }\n if (typeof payload === 'string') {\n try {\n return axmCoerceSystemPayload(JSON.parse(payload) as unknown);\n } catch {\n return undefined;\n }\n }\n if (typeof payload === 'object' && (payload as AXSystemPayload).type === 'system') {\n return payload as AXSystemPayload;\n }\n return undefined;\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, axmNormalizeChatMediaValue } from '../../utils/chat-avatar.util';\nimport { axmRoomWithAssistPeerDisplayName } from '../../utils/assist-conversation-title.util';\nimport { axmCoerceDate } from '../../utils/conversation-time.util';\nimport { axmNormalizeCallLogMessageType } from '../../call/chat-call-log.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 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 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 axmNormalizeCallLogMessageType({\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?.id\n ? message.replyTo.conversationId\n ? axmMessageEntityToMessage(message.replyTo)\n : ({ id: message.replyTo.id } as AXConversationMessage)\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/**\n * Builds a UI message from a realtime envelope, filling id/conversationId when\n * the snapshot omitted them (Mongo `_id`, partial payloads).\n */\nexport function axmHydrateRealtimeConversationMessage(\n snapshot: Record<string, unknown> | undefined,\n messageId: string,\n conversationId: string,\n): AXConversationMessage | null {\n if (!snapshot || typeof snapshot !== 'object') {\n return null;\n }\n const id =\n coerceUnknownToTrimmedString(snapshot['id'] ?? snapshot['_id']) || messageId.trim();\n const scopedConversationId =\n coerceUnknownToTrimmedString(snapshot['conversationId']) || conversationId.trim();\n if (!id || !scopedConversationId) {\n return null;\n }\n return axmMessageEntityToMessage({\n ...(snapshot as unknown as AXMConversationMessage),\n id,\n conversationId: scopedConversationId,\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 avatar?: string | null;\n}): AXConversationParticipant {\n return {\n id: user.id,\n name: user.displayName ?? user.username ?? user.id,\n avatar: axmNormalizeChatMediaValue(user.avatar ?? undefined),\n role: 'member',\n };\n}\n\n//#endregion\n","//#region ---- Imports ----\n\nimport type { AXConversationParticipant } from '@acorex/components/conversation';\nimport { AXMConversationRoom } from '@acorex-platform/module-conversation-client/contracts';\n\nimport { axmNormalizeChatMediaValue } from './chat-avatar.util';\n\n//#endregion\n\n//#region ---- Participant merge / hydrate ----\n\n/** Merges a participant patch without wiping avatar, icon, or display name. */\nexport function axmMergeParticipantSnapshot(\n existing: AXConversationParticipant,\n incoming?: AXConversationParticipant | null,\n): AXConversationParticipant {\n if (!incoming) {\n return existing;\n }\n\n return {\n ...existing,\n ...incoming,\n name: incoming.name?.trim() ? incoming.name : existing.name,\n avatar: axmNormalizeChatMediaValue(incoming.avatar) ?? existing.avatar,\n icon: axmNormalizeChatMediaValue(incoming.icon) ?? existing.icon,\n role: incoming.role ?? existing.role,\n description: incoming.description?.trim() ? incoming.description : existing.description,\n metadata: incoming.metadata ? { ...existing.metadata, ...incoming.metadata } : existing.metadata,\n };\n}\n\n/** Merges participant arrays by id; keeps existing rows when incoming omits them. */\nexport function axmMergeParticipantSnapshots(\n existing: AXConversationParticipant[],\n incoming: AXConversationParticipant[],\n): AXConversationParticipant[] {\n if (!incoming.length) {\n return existing;\n }\n if (!existing.length) {\n return incoming;\n }\n\n const incomingById = new Map(incoming.map((participant) => [participant.id, participant]));\n const merged = existing.map((participant) =>\n axmMergeParticipantSnapshot(participant, incomingById.get(participant.id)),\n );\n\n for (const participant of incoming) {\n if (!existing.some((entry) => entry.id === participant.id)) {\n merged.push(participant);\n }\n }\n\n return merged;\n}\n\n/** Fills missing participant profile fields from security user rows. */\nexport async function axmHydrateRoomParticipants(\n room: AXMConversationRoom,\n resolveUsersByIds: (userIds: string[]) => Promise<AXConversationParticipant[]>,\n): Promise<AXMConversationRoom> {\n const userIds = [...new Set(room.participants.map((participant) => participant.id).filter(Boolean))];\n if (userIds.length === 0) {\n return room;\n }\n\n const users = await resolveUsersByIds(userIds);\n const usersById = new Map(users.map((user) => [user.id, user]));\n let changed = false;\n\n const participants = room.participants.map((participant) => {\n const user = usersById.get(participant.id);\n if (!user) {\n return participant;\n }\n const merged = axmMergeParticipantSnapshot(participant, user);\n if (merged !== participant) {\n changed = true;\n }\n return merged;\n });\n\n return changed ? { ...room, participants } : room;\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 type AxmAssistFollowUpStatus = 'preparing' | 'ready' | 'skipped';\n\nexport function axmReadAssistFollowUpStatus(metadata: unknown): AxmAssistFollowUpStatus | undefined {\n const meta = metadata as Record<string, unknown> | undefined;\n const status = meta?.['followUpStatus'];\n if (status === 'preparing' || status === 'ready' || status === 'skipped') {\n return status;\n }\n return undefined;\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","//#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/** True when the bubble is an assist-response row (streaming or terminal). */\nexport function axmIsAssistResponseMessage(message: AXConversationMessage): boolean {\n const meta = message.metadata as Record<string, unknown> | undefined;\n return meta?.['isAssistResponse'] === true || message.type === 'assist-response';\n}\n\n/**\n * True while an assist placeholder is still generating (not yet a deliverable reply).\n */\nexport function axmIsAssistStreamingMessage(message: AXConversationMessage): boolean {\n if (!axmIsAssistResponseMessage(message)) {\n return false;\n }\n const meta = message.metadata as Record<string, unknown> | undefined;\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/**\n * `room.unreadCount` is a shared document field, not per-user.\n * A sender's last-message touch refetch often carries 0 and must not replace\n * a higher in-memory unread on the recipient.\n */\nexport function axmPreferLocalUnreadCount(localUnread: number | undefined, incomingUnread: number | undefined): number {\n return Math.max(localUnread ?? 0, incomingUnread ?? 0);\n}\n\n//#endregion\n","//#region ---- Imports ----\n\nimport type { AXConversation } from '@acorex/components/conversation';\nimport { AXMConversationRoom } from '@acorex-platform/module-conversation-client/contracts';\n\nimport { axmEnrichRoomAvatar, axmNormalizeChatMediaValue } from './chat-avatar.util';\nimport { axmMergeParticipantSnapshots } from './conversation-participant-hydrate.util';\n\n//#endregion\n\n//#region ---- Merge ----\n\n/**\n * Merges a partial conversation snapshot onto a cached row without wiping\n * participants, title, or avatar when the incoming payload is incomplete.\n */\nexport function axmMergeConversationSnapshot(\n existing: AXConversation,\n incoming: AXConversation,\n currentUserId?: string,\n): AXConversation {\n const participants = incoming.participants?.length\n ? axmMergeParticipantSnapshots(existing.participants ?? [], incoming.participants)\n : existing.participants;\n\n let merged: AXConversation = {\n ...existing,\n ...incoming,\n title: incoming.title?.trim() ? incoming.title : existing.title,\n avatar: axmNormalizeChatMediaValue(incoming.avatar) ?? existing.avatar,\n icon: axmNormalizeChatMediaValue(incoming.icon) ?? existing.icon,\n participants,\n metadata: incoming.metadata ? { ...existing.metadata, ...incoming.metadata } : existing.metadata,\n lastMessage: incoming.lastMessage ?? existing.lastMessage,\n lastMessageAt: incoming.lastMessageAt ?? existing.lastMessageAt,\n };\n\n const scopedUserId = currentUserId?.trim();\n if (scopedUserId && (merged.type === 'private' || merged.type === 'bot')) {\n const enrichedRoom = axmEnrichRoomAvatar(\n {\n ...merged,\n kind: 'chat',\n creatorId: merged.creatorId,\n participants: merged.participants ?? [],\n } as AXMConversationRoom,\n scopedUserId,\n );\n merged = {\n ...merged,\n title: enrichedRoom.title ?? merged.title,\n avatar: enrichedRoom.avatar ?? merged.avatar,\n icon: enrichedRoom.icon ?? merged.icon,\n };\n }\n\n return merged;\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 {\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 type {\n AXConversationPresenceStatus,\n AXConversationPresenceUpdate,\n} from '@acorex/components/conversation';\nimport type { AXPUserPresence } from '@acorex-platform/framework-client/realtime';\nimport { isWatchablePresenceUserId } from '@acorex-platform/framework-client/realtime';\nimport { AXPQueryService } from '@acorex-platform/framework-client/runtime';\nimport { runtimeQueryCollectionData } from '@acorex-platform/framework-shared/core';\nimport { PRESENCE_USER_CHAT_LAST_SEEN } from '@acorex-platform/framework-shared/runtime';\nimport { inject, Injectable } from '@angular/core';\n\n//#endregion\n\n//#region ---- Mapping helpers ----\n\nexport function axmToConversationPresenceStatus(\n status: string | undefined,\n): AXConversationPresenceStatus {\n if (status === 'online' || status === 'away' || status === 'busy' || status === 'offline') {\n return status;\n }\n return 'offline';\n}\n\n/**\n * Resolves chat \"last seen\" for subtitle display.\n * Prefers segment timestamps from presence reports; falls back to live `since` / `lastSeen`.\n */\nexport function axmResolveChatLastSeen(\n status: AXConversationPresenceStatus,\n presence?: Pick<AXPUserPresence, 'lastSeen' | 'since'>,\n segmentLastSeenAt?: string | null,\n): Date | undefined {\n if (status === 'online') {\n return undefined;\n }\n\n if (segmentLastSeenAt) {\n const segmentDate = new Date(segmentLastSeenAt);\n if (!Number.isNaN(segmentDate.getTime())) {\n return segmentDate;\n }\n }\n\n if (status === 'away' || status === 'busy') {\n if (presence?.since) {\n const sinceDate = new Date(presence.since);\n if (!Number.isNaN(sinceDate.getTime())) {\n return sinceDate;\n }\n }\n return undefined;\n }\n\n if (presence?.lastSeen) {\n const lastSeenDate = new Date(presence.lastSeen);\n if (!Number.isNaN(lastSeenDate.getTime())) {\n return lastSeenDate;\n }\n }\n\n return undefined;\n}\n\nexport function axmMapUserPresenceToConversationUpdate(\n userId: string,\n presence: AXPUserPresence | undefined,\n segmentLastSeenAt?: string | null,\n): AXConversationPresenceUpdate {\n const status = axmToConversationPresenceStatus(presence?.status);\n const lastSeen = axmResolveChatLastSeen(status, presence, segmentLastSeenAt);\n return {\n userId,\n status,\n ...(lastSeen ? { lastSeen } : {}),\n };\n}\n\n//#endregion\n\n//#region ---- Segment last-seen loader ----\n\n@Injectable({ providedIn: 'root' })\nexport class AXMChatPresenceLastSeenService {\n //#region ---- Services & Dependencies -----\n\n private readonly queryService = inject(AXPQueryService, { optional: true });\n\n //#endregion\n\n //#region ---- Public API -----\n\n async fetchLastSeenMap(userIds: readonly string[]): Promise<Map<string, string | null>> {\n const scoped = [...new Set(userIds.map((id) => id.trim()).filter(isWatchablePresenceUserId))];\n const map = new Map<string, string | null>();\n if (scoped.length === 0 || !this.queryService) {\n return map;\n }\n\n try {\n const result = await this.queryService.fetch<{ userIds: string[] }, Record<string, unknown>>(\n PRESENCE_USER_CHAT_LAST_SEEN,\n { userIds: scoped },\n );\n const items = runtimeQueryCollectionData(result)?.items ?? [];\n for (const row of items) {\n const userId = typeof row['userId'] === 'string' ? row['userId'].trim() : '';\n if (!userId) {\n continue;\n }\n const lastSeenAt = typeof row['lastSeenAt'] === 'string' ? row['lastSeenAt'] : null;\n map.set(userId, lastSeenAt);\n }\n } catch {\n // Best-effort; live presence `since` / `lastSeen` still apply.\n }\n\n return map;\n }\n\n //#endregion\n}\n\n//#endregion\n","//#region ---- Imports ----\n\nimport type {\n AXConversationBlockReportReason,\n AXConversationPaginatedResult,\n AXConversationPagination,\n AXConversationParticipant,\n AXConversationPresenceStatus,\n AXConversationPresenceUpdate,\n AXConversationRoomPreferences,\n AXConversationRoomPreferencesMap,\n AXConversationUser,\n AXConversationUserProfileUpdate,\n AXConversationUserSearchFilters,\n} from '@acorex/components/conversation';\nimport { AX_CONVERSATION_DEFAULT_ROOM_PREFERENCES } 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 {\n axmMapUserPresenceToConversationUpdate,\n AXMChatPresenceLastSeenService,\n} from '../../utils/axm-chat-presence.util';\nimport { axmUserRowToParticipant } from './chat-entity-mapper.util';\n\n//#endregion\n\n//#region ---- Helpers ----\n\nfunction roomPreferencesStorageKey(userId: string): string {\n return `axm-chat-room-prefs:${userId}`;\n}\n\nfunction parseRoomPreferences(raw: unknown): AXConversationRoomPreferences {\n const source = raw && typeof raw === 'object' ? (raw as Record<string, unknown>) : {};\n const mutedUntilRaw = source['mutedUntil'];\n return {\n notifications: source['notifications'] !== false,\n showPreview: source['showPreview'] !== false,\n notificationSound:\n typeof source['notificationSound'] === 'string' ? source['notificationSound'] : undefined,\n mutedUntil: mutedUntilRaw ? new Date(String(mutedUntilRaw)) : undefined,\n custom:\n source['custom'] && typeof source['custom'] === 'object'\n ? (source['custom'] as Record<string, unknown>)\n : undefined,\n };\n}\n\nfunction readStoredPreferencesMap(userId: string): AXConversationRoomPreferencesMap {\n if (!userId || typeof localStorage === 'undefined') {\n return {};\n }\n try {\n const raw = localStorage.getItem(roomPreferencesStorageKey(userId));\n if (!raw) {\n return {};\n }\n const parsed = JSON.parse(raw) as Record<string, unknown>;\n const map: AXConversationRoomPreferencesMap = {};\n for (const [conversationId, value] of Object.entries(parsed)) {\n map[conversationId] = parseRoomPreferences(value);\n }\n return map;\n } catch {\n return {};\n }\n}\n\nfunction writeStoredPreferencesMap(userId: string, map: AXConversationRoomPreferencesMap): void {\n if (!userId || typeof localStorage === 'undefined') {\n return;\n }\n try {\n localStorage.setItem(roomPreferencesStorageKey(userId), JSON.stringify(map));\n } catch {\n // Ignore quota / private-mode failures; in-memory map still applies for this session.\n }\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; avatar?: string | null }>();\n private readonly presence = inject(AXPUserPresenceService, { optional: true });\n private readonly chatLastSeen = inject(AXMChatPresenceLastSeenService);\n private readonly preferencesByUserId = new Map<string, AXConversationRoomPreferencesMap>();\n\n //#endregion\n\n //#region ---- User Profile ----\n\n async getCurrentUser(): Promise<AXConversationUser> {\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 conversationPreferences: await this.getConversationPreferences(),\n };\n }\n\n async updateProfile(updates: AXConversationUserProfileUpdate): Promise<AXConversationUser> {\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 /** Tenant-scoped directory size (includes the current user). */\n async countDirectoryUsers(): Promise<number> {\n const page = await this.usersData.query({ skip: 0, take: 1 });\n if (typeof page.total === 'number' && page.total >= (page.items?.length ?? 0)) {\n return page.total;\n }\n const full = await this.usersData.query({ skip: 0, take: 1000 });\n return typeof full.total === 'number' ? full.total : (full.items?.length ?? 0);\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 const segmentMap = await this.chatLastSeen.fetchLastSeenMap([userId]);\n return axmMapUserPresenceToConversationUpdate(userId, current, segmentMap.get(userId));\n }\n\n async getUsersPresence(userIds: string[]): Promise<AXConversationPresenceUpdate[]> {\n const scoped = [\n ...new Set(userIds.map((id) => id.trim()).filter((id) => isWatchablePresenceUserId(id))),\n ];\n if (scoped.length === 0) {\n return [];\n }\n this.presence?.ensureWatchMany(scoped);\n const segmentMap = await this.chatLastSeen.fetchLastSeenMap(scoped);\n return scoped.map((id) =>\n axmMapUserPresenceToConversationUpdate(id, this.presence?.get(id), segmentMap.get(id)),\n );\n }\n\n async updatePresence(\n status: AXConversationPresenceStatus,\n _statusText?: string,\n ): Promise<void> {\n if (status === 'offline') {\n return;\n }\n await this.presence?.setAvailability(status, '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 //#region ---- Room preferences ----\n\n async getConversationPreferences(): Promise<AXConversationRoomPreferencesMap> {\n const userId = this.sessionService.user?.id?.trim();\n if (!userId) {\n return {};\n }\n const cached = this.preferencesByUserId.get(userId);\n if (cached) {\n return { ...cached };\n }\n const stored = readStoredPreferencesMap(userId);\n this.preferencesByUserId.set(userId, stored);\n return { ...stored };\n }\n\n async getConversationPreferencesForRoom(\n conversationId: string,\n ): Promise<AXConversationRoomPreferences> {\n const scoped = conversationId.trim();\n if (!scoped) {\n return { ...AX_CONVERSATION_DEFAULT_ROOM_PREFERENCES };\n }\n const map = await this.getConversationPreferences();\n return { ...AX_CONVERSATION_DEFAULT_ROOM_PREFERENCES, ...map[scoped] };\n }\n\n async updateConversationPreferences(\n conversationId: string,\n preferences: Partial<AXConversationRoomPreferences>,\n ): Promise<AXConversationRoomPreferences> {\n const userId = this.sessionService.user?.id?.trim();\n const scoped = conversationId.trim();\n if (!userId || !scoped) {\n return { ...AX_CONVERSATION_DEFAULT_ROOM_PREFERENCES, ...preferences };\n }\n\n const map = await this.getConversationPreferences();\n const next: AXConversationRoomPreferences = {\n ...AX_CONVERSATION_DEFAULT_ROOM_PREFERENCES,\n ...map[scoped],\n ...preferences,\n };\n map[scoped] = next;\n this.preferencesByUserId.set(userId, map);\n writeStoredPreferencesMap(userId, map);\n return next;\n }\n\n //#endregion\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 private readonly conversationDeletedSubject = new Subject<string>();\n\n readonly conversationUpdates$ = this.conversationUpdateSubject.asObservable();\n readonly conversationCreated$ = this.conversationCreatedSubject.asObservable();\n readonly conversationDeleted$ = this.conversationDeletedSubject.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, markLocal = true): void {\n if (markLocal) {\n this.markLocalRoomMutation(conversation.id);\n }\n this.conversationUpdateSubject.next(conversation);\n }\n\n publishConversationCreated(conversation: AXConversation, markLocal = true): void {\n if (markLocal) {\n this.markLocalRoomMutation(conversation.id);\n }\n this.conversationCreatedSubject.next(conversation);\n this.conversationUpdateSubject.next(conversation);\n }\n\n publishConversationDeleted(conversationId: string): void {\n const scoped = conversationId?.trim();\n if (!scoped) {\n return;\n }\n this.conversationDeletedSubject.next(scoped);\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 { AXPSessionService } from '@acorex-platform/framework-client/auth';\nimport { AXPEntityService } from '@acorex-platform/framework-client/layout/entity';\nimport type { AXConversation, AXConversationMessage, AXConversationMessageType, AXConversationSendMessageCommand } from '@acorex/components/conversation';\nimport { inject, Injectable, signal } from '@angular/core';\n\nimport {\n AXMConversationMessage,\n AXMConversationRoom,\n RootConfig,\n axmIsCommentRoom,\n} from '@acorex-platform/module-conversation-client/contracts';\nimport { axmCompareMessagesChronologically } from '@acorex-platform/module-conversation-client/contracts';\nimport { axmMessageEntityToMessage, axmRoomEntityToConversation } from '../plugins/services/entity/chat-entity-mapper.util';\nimport { axmNormalizeCallLogMessageType } from '../plugins/call/chat-call-log.util';\nimport { axmHydrateRoomParticipants } from '../plugins/utils/conversation-participant-hydrate.util';\nimport { axmComputeConversationUnreadCount, axmMessageCountsTowardUnread, axmPreferLocalUnreadCount } from '../plugins/utils/conversation-unread.util';\nimport { axmMergeConversationSnapshot } from '../plugins/utils/conversation-snapshot-merge.util';\nimport { AXMChatEntityUserApi } from '../plugins/services/entity/chat-entity-user.api';\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 session = inject(AXPSessionService);\n private readonly bus = inject(AXMConversationRealtimeBus);\n private readonly userApi = inject(AXMChatEntityUserApi, { optional: true });\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 /** Bumped on session reset so in-flight assist persists do not write into the next user. */\n private persistGeneration = 0;\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 private readonly unreadTotalSignal = signal(0);\n\n /** Telegram-style total unread across cached rooms — drives the Conversations menu badge. */\n readonly unreadTotal = this.unreadTotalSignal.asReadonly();\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 this.recomputeUnreadTotal();\n }\n\n clearSessionCaches(): void {\n this.persistGeneration += 1;\n this.persistChains.clear();\n this.persistedMessageIds.clear();\n this.conversationCache.clear();\n this.messageCache.clear();\n this.messageListCache.clear();\n this.conversationFetchChains.clear();\n this.messageListFetchChains.clear();\n this.unreadTotalSignal.set(0);\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 if (!options?.force) {\n const cached = this.conversationCache.get(scoped);\n if (cached) {\n return cached;\n }\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 async refreshConversation(conversationId: string): Promise<AXConversation | null> {\n const scoped = conversationId?.trim();\n if (!scoped) {\n return null;\n }\n const previous = this.getCachedConversation(scoped);\n const fetched = await this.fetchConversationFromEntity(scoped, { cache: false });\n if (!fetched) {\n return null;\n }\n const currentUserId = this.session.user?.id?.trim();\n const current = this.getCachedConversation(scoped) ?? previous;\n const merged = current ? axmMergeConversationSnapshot(current, fetched, currentUserId) : fetched;\n const next = current ? { ...merged, unreadCount: current.unreadCount ?? 0 } : merged;\n this.cacheConversation(next);\n return next;\n }\n\n private async fetchConversationFromEntity(\n conversationId: string,\n options?: { cache?: boolean },\n ): Promise<AXConversation | null> {\n let room: AXMConversationRoom | null = null;\n try {\n room = await this.roomData.byKey(conversationId);\n } catch {\n room = null;\n }\n if (!room) {\n if (options?.cache !== false) {\n this.conversationCache.delete(conversationId);\n }\n return null;\n }\n if (axmIsCommentRoom(room)) {\n if (this.getCachedConversation(conversationId)) {\n this.publishConversationDeleted(conversationId);\n }\n return null;\n }\n const currentUserId = this.session.user?.id?.trim();\n const hydratedRoom = this.userApi\n ? await axmHydrateRoomParticipants(room, (userIds) => this.userApi!.getUsersByIds(userIds))\n : room;\n const conversation = axmRoomEntityToConversation(hydratedRoom, currentUserId);\n if (options?.cache === false) {\n return conversation;\n }\n const existing = this.getCachedConversation(conversationId);\n const next = existing\n ? {\n ...axmMergeConversationSnapshot(existing, conversation, currentUserId),\n unreadCount: axmPreferLocalUnreadCount(existing.unreadCount, conversation.unreadCount),\n }\n : conversation;\n this.cacheConversation(next);\n return next;\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) {\n // Do not seed a stub list. A one-message cache would block the full history\n // fetch when the user later opens the thread.\n return;\n }\n if (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 private mergeRealtimeMessagesIntoList(conversationId: string, messages: AXConversationMessage[]): AXConversationMessage[] {\n const byId = new Map(messages.filter((message) => message.id).map((message) => [message.id, message]));\n for (const message of this.messageCache.values()) {\n if (!message.id || message.deleted || message.conversationId !== conversationId) {\n continue;\n }\n if (!byId.has(message.id)) {\n byId.set(message.id, message);\n }\n }\n return [...byId.values()].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 const merged = this.mergeRealtimeMessagesIntoList(scoped, cached);\n this.messageListCache.set(scoped, merged);\n return merged.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 const merged = this.mergeRealtimeMessagesIntoList(conversationId, mapped);\n this.messageListCache.set(conversationId, merged);\n for (const message of merged) {\n this.cacheMessage(message);\n }\n return merged;\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 generation = this.persistGeneration;\n const previous = this.persistChains.get(message.id) ?? Promise.resolve();\n const next = previous.then(() => {\n if (this.persistGeneration !== generation) {\n return;\n }\n return this.persistMessageInternal(message, generation);\n });\n this.persistChains.set(message.id, next);\n return next;\n }\n\n private async persistMessageInternal(message: AXConversationMessage, generation: number): Promise<void> {\n if (this.persistGeneration !== generation) {\n return;\n }\n const fields = this.messageToEntityFields(message);\n if (this.persistedMessageIds.has(message.id)) {\n if (this.persistGeneration !== generation) {\n return;\n }\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 if (this.persistGeneration === generation) {\n this.persistedMessageIds.add(message.id);\n }\n return;\n } catch (createError: unknown) {\n try {\n await this.messageData.update(message.id, fields);\n if (this.persistGeneration === generation) {\n this.persistedMessageIds.add(message.id);\n }\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 pinnedMessageIds: conversation.pinnedMessageIds,\n blocked: conversation.blocked,\n pinned: conversation.pinned,\n archived: conversation.archived,\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 /**\n * Increments unread for an incoming message that is not currently focused.\n * Stays in-memory so a shared room.unreadCount is not written to the sender.\n */\n async applyIncomingMessageUnread(message: AXConversationMessage, currentUserId: string): Promise<void> {\n if (!axmMessageCountsTowardUnread(message, currentUserId)) {\n return;\n }\n\n const conversationId = message.conversationId?.trim();\n if (!conversationId) {\n return;\n }\n\n const cached = this.getCachedConversation(conversationId);\n const conversation = cached ?? (await this.getConversation(conversationId));\n if (!conversation) {\n return;\n }\n\n const lastMessageAt =\n message.timestamp instanceof Date ? message.timestamp : new Date(message.timestamp);\n const updated: AXConversation = {\n ...conversation,\n unreadCount: (conversation.unreadCount ?? 0) + 1,\n lastMessage: message,\n lastMessageAt,\n updatedAt: new Date(),\n };\n this.cacheMessage(message);\n this.appendToMessageListCache(conversationId, message);\n this.cacheConversation(updated);\n if (cached) {\n this.publishConversationUpdate(updated, false);\n return;\n }\n this.publishConversationCreated(updated, false);\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 recomputeUnreadTotal(): void {\n let total = 0;\n for (const conversation of this.conversationCache.values()) {\n total += Math.max(0, conversation.unreadCount ?? 0);\n }\n this.unreadTotalSignal.set(total);\n }\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 const normalized = axmNormalizeCallLogMessageType(message);\n this.cacheMessage(normalized);\n this.appendToMessageListCache(normalized.conversationId, normalized);\n this.bus.publishMessage(normalized);\n }\n\n publishMessageUpdate(message: AXConversationMessage): void {\n const normalized = axmNormalizeCallLogMessageType(message);\n this.cacheMessage(normalized);\n this.patchMessageListCache(normalized.conversationId, normalized);\n this.bus.publishMessageUpdate(normalized);\n }\n\n publishMessageDeletion(messageId: string): void {\n const scoped = messageId?.trim();\n if (!scoped) {\n return;\n }\n const cached = this.messageCache.get(scoped);\n this.messageCache.delete(scoped);\n if (cached?.conversationId) {\n this.invalidateMessageListCache(cached.conversationId);\n }\n this.bus.publishMessageDeletion(scoped);\n }\n\n publishConversationUpdate(conversation: AXConversation, markLocal = true): void {\n const scoped = conversation.id?.trim();\n if (!scoped) {\n return;\n }\n const existing = this.conversationCache.get(scoped);\n const currentUserId = this.session.user?.id?.trim();\n let merged = existing\n ? axmMergeConversationSnapshot(existing, conversation, currentUserId)\n : conversation;\n // Remote room snapshots use shared `unreadCount` (often the sender's 0).\n // Local writes (`markLocal`) may still decrease unread (open chat / mark as read).\n if (!markLocal && existing) {\n merged = {\n ...merged,\n unreadCount: axmPreferLocalUnreadCount(existing.unreadCount, merged.unreadCount),\n };\n }\n this.cacheConversation(merged);\n this.bus.publishConversationUpdate(merged, markLocal);\n }\n\n publishConversationCreated(conversation: AXConversation, markLocal = true): void {\n this.cacheConversation(conversation);\n this.bus.publishConversationCreated(conversation, markLocal);\n }\n\n /** Persists inbox last-message when the edited/deleted bubble is the current preview. */\n async syncPersistedLastMessage(message: AXConversationMessage): Promise<void> {\n const conversationId = message.conversationId?.trim();\n if (!conversationId) {\n return;\n }\n const cached = this.getCachedConversation(conversationId);\n if (!cached?.lastMessage || cached.lastMessage.id !== message.id) {\n return;\n }\n await this.touchLastMessage(conversationId, message);\n }\n\n publishConversationDeleted(conversationId: string): void {\n const scoped = conversationId?.trim();\n if (!scoped) {\n return;\n }\n this.conversationCache.delete(scoped);\n this.invalidateMessageListCache(scoped);\n this.bus.publishConversationDeleted(scoped);\n }\n\n /** Keeps inbox last-message preview in sync when the last bubble is edited or deleted. */\n syncConversationPreviewFromMessage(message: AXConversationMessage): void {\n const conversationId = message.conversationId?.trim();\n if (!conversationId) {\n return;\n }\n const cached = this.getCachedConversation(conversationId);\n if (!cached?.lastMessage || cached.lastMessage.id !== message.id) {\n return;\n }\n const next = {\n ...cached,\n lastMessage: message,\n updatedAt: new Date(),\n };\n this.publishConversationUpdate(next, false);\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 { AXPTaskBadgeProvider } from '@acorex-platform/framework-client/layout/components';\nimport { inject, Injectable } from '@angular/core';\nimport { AXMConversationEntityStoreService } from './features/chat/services/conversation-entity-store.service';\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 cached room unread counts (Telegram-style total), including messages\n * that arrive while the chat page is not open.\n */\n@Injectable()\nexport class AXMChatBadgeProvider extends AXPTaskBadgeProvider {\n //#region ----- Services & Dependencies -----\n\n private readonly conversationStore = inject(AXMConversationEntityStoreService);\n\n //#endregion\n\n //#region ----- Signals & Properties -----\n\n readonly key = AXM_CHAT_BADGE_KEY;\n\n readonly count = this.conversationStore.unreadTotal;\n\n //#endregion\n}\n\n//#endregion\n","//#region ----- Imports -----\n\nimport { AXPSessionService } from '@acorex-platform/framework-client/auth';\nimport { AXPMenuProvider, AXPMenuProviderContext } from '@acorex-platform/framework-client/common';\nimport { AXPEntityService } from '@acorex-platform/framework-client/layout/entity';\nimport { AXPCommonMenuKeys } from '@acorex-platform/module-common-client/contracts';\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//#endregion\n\n//#region ----- Menu Provider -----\n\n@Injectable()\nexport class AXMMenuProvider implements AXPMenuProvider {\n //#region ----- Services & Dependencies -----\n\n private readonly sessionService = inject(AXPSessionService);\n private readonly entityService = inject(AXPEntityService);\n\n //#endregion\n\n async provide(context: AXPMenuProviderContext): Promise<void> {\n const module = RootConfig;\n const keys = AXPCollaborationPermissionKeys;\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: [keys.MaintainConversations],\n },\n },\n ]);\n\n const contentMenu = context.find(AXPCommonMenuKeys.Content);\n if (!contentMenu.exists) {\n context.find(AXPCommonMenuKeys.Administration).addItems([\n {\n name: AXPCommonMenuKeys.Content,\n priority: 10,\n text: '@general:menus.content.title',\n icon: 'fa-light fa-paint-brush',\n type: 'menu',\n children: [],\n },\n ]);\n }\n\n context.find(AXPCommonMenuKeys.Content).addItems([\n {\n name: AXPConversationMenuKeys.Channels,\n text: '@conversation:menus.channels.title',\n path: `${this.entityService.createPath(module.module.name, RootConfig.entities.room.name, 'list')}?view=channels`,\n priority: 3,\n icon: 'fa-light fa-bullhorn',\n policy: {\n features: [module.module.name],\n permissions: [keys.MaintainBulletins],\n },\n },\n ]);\n }\n}\n\n//#endregion\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 context\n .addGroup(\n groups.Collaboration.Communications,\n `${G}.collaboration-communications.title`,\n `${G}.collaboration-communications.description`,\n { parent: groups.Collaboration.Root, order: 30 },\n )\n .addPermission(keys.ViewBulletins, `${P}.view-bulletins.title`, `${P}.view-bulletins.description`)\n .endPermission()\n .addPermission(keys.MaintainBulletins, `${P}.maintain-bulletins.title`, `${P}.maintain-bulletins.description`)\n .endPermission()\n .addPermission(keys.PublishBulletins, `${P}.publish-bulletins.title`, `${P}.publish-bulletins.description`)\n .endPermission()\n .addPermission(\n keys.ModerateBulletinDiscussions,\n `${P}.moderate-bulletin-discussions.title`,\n `${P}.moderate-bulletin-discussions.description`,\n )\n .endPermission()\n .endGroup();\n }\n}\n\n//#endregion\n","//#region ----- Imports -----\n\nimport { AXPSessionService } from '@acorex-platform/framework-client/auth';\nimport { AXPEntityBroadcastService } from '@acorex-platform/framework-client/core';\nimport { AXPTaskBadgeProvider } from '@acorex-platform/framework-client/layout/components';\nimport {\n AXPCommandEventsService,\n AXPQueryService,\n type AXPCommandExecutionEvent,\n} from '@acorex-platform/framework-client/runtime';\nimport {\n AXPConversationCommandKeys,\n AXPConversationQueryKeys,\n RootConfig,\n type AXMChannelUnreadCount,\n} from '@acorex-platform/module-conversation-client/contracts';\nimport { runtimeQueryObjectData } from '@acorex-platform/framework-shared/core';\nimport { DestroyRef, inject, Injectable, signal } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { distinctUntilChanged } from 'rxjs';\n\n//#endregion\n\n//#region ----- Constants -----\n\n/** Menu `badgeKey` for unseen channel posts. */\nexport const AXM_CHANNEL_UNREAD_BADGE_KEY = 'conversation-channel-unread-badge';\n\nconst CHANNEL_POST_ENTITY = RootConfig.entities.channelPost.source;\n\n//#endregion\n\n//#region ----- Task badge provider -----\n\n/**\n * Shows unseen channel-post count. Decrements immediately when a post is seen;\n * refetches after login and relevant commands.\n */\n@Injectable({ providedIn: 'root' })\nexport class AXMChannelUnreadBadgeProvider extends AXPTaskBadgeProvider {\n //#region ----- Services & Dependencies -----\n\n private readonly queryService = inject(AXPQueryService);\n private readonly sessionService = inject(AXPSessionService);\n private readonly commandEvents = inject(AXPCommandEventsService);\n private readonly entityBroadcast = inject(AXPEntityBroadcastService);\n private readonly destroyRef = inject(DestroyRef);\n\n //#endregion\n\n //#region ----- Signals & Properties -----\n\n readonly key = AXM_CHANNEL_UNREAD_BADGE_KEY;\n readonly count = signal(0);\n\n private readonly locallySeenIds = new Set<string>();\n private refreshGeneration = 0;\n\n //#endregion\n\n constructor() {\n super();\n\n this.sessionService.isReadyForAppScopedApi$\n .pipe(distinctUntilChanged(), takeUntilDestroyed(this.destroyRef))\n .subscribe((ready) => {\n this.locallySeenIds.clear();\n if (!ready) {\n this.count.set(0);\n return;\n }\n void this.refresh();\n });\n\n this.sessionService.user$\n .pipe(\n distinctUntilChanged((prev, next) => prev?.id === next?.id),\n takeUntilDestroyed(this.destroyRef),\n )\n .subscribe((user) => {\n this.count.set(0);\n this.locallySeenIds.clear();\n if (user?.id != null && this.sessionService.isReadyForAppScopedApi) {\n void this.refresh();\n }\n });\n\n const unsubscribeCommands = this.commandEvents.listen((event) => {\n if (this.isRelevantCommandEvent(event)) {\n void this.handleCommandEvent(event);\n }\n });\n\n const layoutSub = this.entityBroadcast.listenLayoutRefresh().subscribe(({ data }) => {\n if (data?.name === CHANNEL_POST_ENTITY) {\n void this.refresh();\n }\n });\n\n this.destroyRef.onDestroy(() => {\n unsubscribeCommands();\n layoutSub.unsubscribe();\n });\n }\n\n //#region ----- Badge actions -----\n\n markSeen(postId: string): void {\n const id = postId.trim();\n if (!id || this.locallySeenIds.has(id)) {\n return;\n }\n this.locallySeenIds.add(id);\n this.count.update((value) => Math.max(0, value - 1));\n }\n\n confirmSeen(postId: string): void {\n const id = postId.trim();\n if (!id) {\n return;\n }\n this.locallySeenIds.delete(id);\n }\n\n revertSeen(postId: string): void {\n const id = postId.trim();\n if (!id || !this.locallySeenIds.has(id)) {\n return;\n }\n this.locallySeenIds.delete(id);\n this.count.update((value) => value + 1);\n }\n\n async refresh(): Promise<void> {\n const generation = ++this.refreshGeneration;\n const currentUserId = this.sessionService.user?.id;\n if (currentUserId == null || !this.sessionService.isReadyForAppScopedApi) {\n if (generation === this.refreshGeneration) {\n this.count.set(0);\n }\n return;\n }\n\n try {\n const result = await this.queryService.fetch<void, AXMChannelUnreadCount>(\n AXPConversationQueryKeys.ChannelFeed.GetUnreadCount,\n undefined as void,\n );\n if (generation !== this.refreshGeneration || this.sessionService.user?.id !== currentUserId) {\n return;\n }\n const data = runtimeQueryObjectData(result);\n this.count.set(Math.max(0, (data?.count ?? 0) - this.locallySeenIds.size));\n } catch {\n if (generation === this.refreshGeneration) {\n this.count.set(0);\n }\n }\n }\n\n private isRelevantCommandEvent(event: AXPCommandExecutionEvent): boolean {\n if (\n event.key === AXPConversationCommandKeys.ChannelFeed.MarkRead ||\n event.key.startsWith(`${RootConfig.module.name}.`)\n ) {\n return true;\n }\n\n const input = event.input as Record<string, unknown> | undefined;\n if (input?.['entity'] === CHANNEL_POST_ENTITY) {\n return true;\n }\n\n const entityInfo = input?.['entityInfo'] as Record<string, unknown> | undefined;\n return (\n entityInfo?.['source'] === CHANNEL_POST_ENTITY ||\n (entityInfo?.['module'] === RootConfig.module.name &&\n entityInfo?.['name'] === RootConfig.entities.channelPost.name)\n );\n }\n\n private async handleCommandEvent(event?: AXPCommandExecutionEvent): Promise<void> {\n if (!event || event.stage !== 'after' || !event.success) {\n return;\n }\n if (event.key === AXPConversationCommandKeys.ChannelFeed.MarkRead) {\n const input = event.input as Record<string, unknown> | undefined;\n const roomId = typeof input?.['roomId'] === 'string' ? input['roomId'].trim() : '';\n const postId = typeof input?.['postId'] === 'string' ? input['postId'].trim() : '';\n if (roomId && !postId) {\n await this.refresh();\n }\n return;\n }\n await this.refresh();\n }\n\n //#endregion\n}\n\n//#endregion\n","//#region ----- Imports -----\n\nimport { AXPSearchCommandProvider, AXPSearchResult, createEntityCommandOptions } from '@acorex-platform/framework-client/common';\nimport { RootConfig } from '@acorex-platform/module-conversation-client/contracts';\n\n//#endregion\n\n//#region ----- Search Command Provider -----\n\nexport class AXMChannelSearchCommandProvider extends AXPSearchCommandProvider {\n commands: AXPSearchResult[] = [\n {\n id: 'create-channel-post',\n group: 'command',\n title: RootConfig.entities.channelPost.title,\n icon: RootConfig.entities.channelPost.icon,\n description: RootConfig.entities.channelPost.titlePlural,\n command: {\n name: 'Entity:Create',\n options: createEntityCommandOptions(RootConfig.entities.channelPost.source, {\n name: RootConfig.entities.channelPost.name,\n module: RootConfig.module.name,\n title: RootConfig.entities.channelPost.title,\n }),\n },\n },\n ];\n}\n\n//#endregion\n","import { AXP_PROTECTED_ROUTE_GUARDS } from '@acorex-platform/framework-client/common';\nimport { AXPRootLayoutComponent } from '@acorex-platform/framework-client/themes/default';\nimport { Routes } from '@angular/router';\nimport { AXPCollaborationPermissionKeys, RootConfig } from '@acorex-platform/module-conversation-client/contracts';\n\n//#region ----- Channel Feed Routes -----\n\nexport const channelFeedPageRoutes: Routes = [\n {\n path: `:app/${RootConfig.pages.feed.path}`,\n canActivate: [...AXP_PROTECTED_ROUTE_GUARDS],\n loadComponent: () => AXPRootLayoutComponent,\n data: {\n rootLayout: true,\n requiredFeature: RootConfig.module.name,\n requiredPermission: AXPCollaborationPermissionKeys.ViewBulletins,\n },\n children: [\n {\n path: '',\n loadComponent: () => import('./channel-feed.page').then((m) => m.AXMChannelFeedPage),\n data: { reuse: true },\n },\n ],\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 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 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 listRoomsForEntity(entityRef: AXMCommentEntityData): Promise<AXMConversationRoom[]> {\n const entityId = entityRef.entityId?.trim();\n const entityTypeId = entityRef.entityTypeId?.trim();\n if (!entityId || !entityTypeId) {\n return [];\n }\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: entityId,\n operator: this.filterService.getOperator('equal') as never,\n },\n {\n field: 'entityRef.entityTypeId',\n value: entityTypeId,\n operator: this.filterService.getOperator('equal') as never,\n },\n ],\n },\n });\n return items;\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 countCommentsForEntity(entityRef: AXMCommentEntityData): Promise<number> {\n const rooms = await this.commentImplService.listRoomsForEntity(entityRef);\n let total = 0;\n for (const room of rooms) {\n const comments = await this.commentImplService.getComments(room.id);\n total += comments.filter((comment) => !comment.deleted && !comment.deletedAt).length;\n }\n return total;\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","//#region ----- Imports -----\n\nimport type { AXPFileListItem } from '@acorex-platform/framework-shared/core';\n\n//#endregion\n\n//#region ----- Types -----\n\nexport type ChannelFeedMediaKind = 'image' | 'video' | 'file';\n\n//#endregion\n\n//#region ----- Media -----\n\nexport function channelFeedMediaKind(file: AXPFileListItem): ChannelFeedMediaKind {\n const ext = fileExtension(file.name);\n if (['jpg', 'jpeg', 'png', 'gif', 'webp', 'svg', 'bmp'].includes(ext)) {\n return 'image';\n }\n if (['mp4', 'webm', 'ogg', 'mov', 'm4v'].includes(ext)) {\n return 'video';\n }\n return 'file';\n}\n\nexport function channelFeedFileUrl(file: AXPFileListItem): string {\n const source = file.source;\n if (source?.kind === 'url' && typeof source.value === 'string') {\n return source.value;\n }\n if (typeof source?.value === 'string' && (source.value.startsWith('/') || source.value.startsWith('http'))) {\n return source.value;\n }\n return '';\n}\n\nfunction fileExtension(name: string): string {\n const parts = name.toLowerCase().split('.');\n return parts.length > 1 ? (parts[parts.length - 1] ?? '') : '';\n}\n\n//#endregion\n","//#region ----- Imports -----\n\nimport { AXPFileViewerService } from '@acorex-platform/framework-client/layout/components';\nimport type { AXPFileListItem } from '@acorex-platform/framework-shared/core';\nimport { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, inject, input } from '@angular/core';\nimport { channelFeedFileUrl, channelFeedMediaKind } from '../channel-feed-file.util';\n\n//#endregion\n\n//#region ----- Types -----\n\ninterface ChannelFeedGalleryTile {\n file: AXPFileListItem;\n url: string;\n kind: 'image' | 'video';\n}\n\n//#endregion\n\n//#region ----- Constants -----\n\nconst MAX_VISIBLE_TILES = 4;\n\n//#endregion\n\n//#region ----- Component -----\n\n@Component({\n selector: 'axm-channel-feed-gallery',\n templateUrl: './channel-feed-gallery.component.html',\n styleUrl: './channel-feed-gallery.component.css',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [CommonModule],\n})\nexport class AXMChannelFeedGalleryComponent {\n //#region ----- Services & Dependencies -----\n\n private readonly fileViewer = inject(AXPFileViewerService);\n\n //#endregion\n\n //#region ----- Inputs -----\n\n files = input<readonly AXPFileListItem[]>([]);\n\n //#endregion\n\n //#region ----- Computed Properties -----\n\n protected readonly tiles = computed((): ChannelFeedGalleryTile[] =>\n this.files()\n .map((file) => ({\n file,\n url: channelFeedFileUrl(file),\n kind: channelFeedMediaKind(file),\n }))\n .filter((tile): tile is ChannelFeedGalleryTile => (tile.kind === 'image' || tile.kind === 'video') && !!tile.url),\n );\n\n protected readonly visibleTiles = computed(() => this.tiles().slice(0, MAX_VISIBLE_TILES));\n protected readonly overflowCount = computed(() => Math.max(0, this.tiles().length - MAX_VISIBLE_TILES));\n\n //#endregion\n\n //#region ----- Event Handlers -----\n\n protected openLightbox(index: number, event: Event): void {\n event.stopPropagation();\n const files = this.tiles().map((tile) => tile.file);\n if (files.length === 0) {\n return;\n }\n this.fileViewer.openFiles(files, {\n startIndex: index,\n thumbnail: true,\n download: true,\n });\n }\n\n //#endregion\n}\n\n//#endregion\n","<!-- ----- Media gallery tiles ----- -->\n@if (tiles().length > 0) {\n <div\n class=\"axm-channel-feed-gallery\"\n [class.axm-channel-feed-gallery--1]=\"tiles().length === 1\"\n [class.axm-channel-feed-gallery--2]=\"tiles().length === 2\"\n [class.axm-channel-feed-gallery--3]=\"tiles().length === 3\"\n [class.axm-channel-feed-gallery--4]=\"tiles().length >= 4\"\n >\n @for (tile of visibleTiles(); track tile.url; let index = $index) {\n <button\n type=\"button\"\n class=\"axm-channel-feed-gallery__tile\"\n (click)=\"openLightbox(index, $event)\"\n >\n <!--->\n <!-- ----- Video poster tile ----- -->\n @if (tile.kind === 'video') {\n <video class=\"axm-channel-feed-gallery__media\" [src]=\"tile.url\" muted></video>\n <span class=\"axm-channel-feed-gallery__play\"><i class=\"fa-solid fa-play\"></i></span>\n }\n <!-- ----- Image tile ----- -->\n @else {\n <img class=\"axm-channel-feed-gallery__media\" [src]=\"tile.url\" [alt]=\"tile.file.name\" />\n }\n <!--->\n <!-- ----- Overflow count on the last visible tile ----- -->\n @if (index === visibleTiles().length - 1 && overflowCount() > 0) {\n <span class=\"axm-channel-feed-gallery__more\">+{{ overflowCount() }}</span>\n }\n </button>\n }\n </div>\n}\n","//#region ----- Imports -----\n\nimport { AXClickEvent } from '@acorex/cdk/common';\nimport { AXBadgeModule } from '@acorex/components/badge';\nimport { AXButtonModule } from '@acorex/components/button';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { AXFormatModule } from '@acorex/core/format';\nimport { AXTranslationModule, AXTranslationService } from '@acorex/core/translation';\nimport { AXPTag, AXPTagService } from '@acorex-platform/framework-client/core';\nimport {\n AXPUserAvatarComponent,\n AXPUserAvatarService,\n AXPUserCardDirective,\n} from '@acorex-platform/framework-client/layout/components';\nimport { AXPFileListComponent } from '@acorex-platform/framework-client/layout/entity';\nimport { AXPCommandService } from '@acorex-platform/framework-client/runtime';\nimport {\n coerceUnknownToMultiLanguageString,\n resolveMultiLanguageString,\n type AXPMultiLanguageString,\n} from '@acorex-platform/framework-shared/core';\nimport {\n CHANNEL_POST_ENTITY_NAME,\n type AXMChannelFeedItem,\n} from '@acorex-platform/module-conversation-client/contracts';\nimport { CommonModule } from '@angular/common';\nimport {\n afterNextRender,\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n effect,\n ElementRef,\n inject,\n Injector,\n input,\n output,\n signal,\n untracked,\n viewChild,\n} from '@angular/core';\nimport { AXMCommentManagementService } from '../../comment/comment-management.service';\nimport { AXMChannelFeedGalleryComponent } from '../channel-feed-gallery/channel-feed-gallery.component';\n\n//#endregion\n\n//#region ----- Types -----\n\ntype ChannelFeedItemChrome = 'card' | 'bubble';\n\ntype ChannelFeedTagView = {\n title: AXPMultiLanguageString;\n color: string;\n trackKey: string;\n};\n\n//#endregion\n\n//#region ----- Component -----\n\n@Component({\n selector: 'axm-channel-feed-item',\n templateUrl: './channel-feed-item.component.html',\n styleUrl: './channel-feed-item.component.css',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n CommonModule,\n AXBadgeModule,\n AXButtonModule,\n AXDecoratorModule,\n AXFormatModule,\n AXTranslationModule,\n AXPUserAvatarComponent,\n AXPUserCardDirective,\n AXPFileListComponent,\n AXMChannelFeedGalleryComponent,\n ],\n})\nexport class AXMChannelFeedItemComponent {\n //#region ----- Services & Dependencies -----\n\n private readonly userAvatarService = inject(AXPUserAvatarService);\n private readonly tagService = inject(AXPTagService);\n private readonly commandService = inject(AXPCommandService);\n private readonly commentManagement = inject(AXMCommentManagementService);\n private readonly translation = inject(AXTranslationService);\n private readonly host = inject(ElementRef);\n private readonly destroyRef = inject(DestroyRef);\n private readonly injector = inject(Injector);\n\n //#endregion\n\n //#region ----- Inputs -----\n\n item = input.required<AXMChannelFeedItem>();\n /** `card` is the announcements page. `bubble` sits inside a conversation bubble. */\n chrome = input<ChannelFeedItemChrome>('card');\n\n //#endregion\n\n //#region ----- Outputs -----\n\n itemSeen = output<string>();\n\n //#endregion\n\n //#region ----- View Children -----\n\n private readonly bodyEl = viewChild<ElementRef<HTMLElement>>('bodyText');\n\n //#endregion\n\n //#region ----- State Signals -----\n\n protected readonly expanded = signal(false);\n protected readonly authorName = signal('');\n protected readonly canExpand = signal(false);\n protected readonly commentsBusy = signal(false);\n private readonly availableTags = signal<AXPTag[]>([]);\n private readonly commentCountOverride = signal<number | null>(null);\n private lastCommentPostId: string | null = null;\n\n //#endregion\n\n //#region ----- Computed Properties -----\n\n protected readonly isUnread = computed(() => !this.item().isRead);\n protected readonly gallery = computed(() => this.item().gallery ?? []);\n protected readonly attachments = computed(() => this.item().attachments ?? []);\n protected readonly publishedAt = computed(() => asDate(this.item().publishedAt));\n protected readonly eventStartsAt = computed(() => asDate(this.item().eventStartsAt));\n protected readonly hasEventLocation = computed(() => hasMlsContent(this.item().eventLocation));\n protected readonly commentCount = computed(() => this.commentCountOverride() ?? this.item().commentCount ?? 0);\n protected readonly tags = computed((): ChannelFeedTagView[] => {\n const catalog = this.availableTags();\n return (this.item().tags ?? []).map((raw) => {\n const trackKey = tagTrackKey(raw);\n const found = catalog.find((tag) => tag.title.toLowerCase() === trackKey);\n return {\n title: raw,\n color: found?.color ?? '',\n trackKey,\n };\n });\n });\n\n //#endregion\n\n //#region ----- Lifecycle -----\n\n constructor() {\n let observer: IntersectionObserver | undefined;\n afterNextRender(() => {\n const pageRoot = document.getElementById('axp-page-layout');\n const scrollRoot = closestOverflowRoot(this.host.nativeElement) ?? pageRoot;\n observer = new IntersectionObserver(\n (entries) => {\n if (!entries.some((entry) => entry.isIntersecting) || this.item().isRead) {\n return;\n }\n this.itemSeen.emit(this.item().id);\n },\n { root: scrollRoot ?? null, threshold: 0.55 },\n );\n observer.observe(this.host.nativeElement);\n }, { injector: this.injector });\n this.destroyRef.onDestroy(() => observer?.disconnect());\n\n void this.tagService\n .getTags()\n .then((tags) => this.availableTags.set(tags))\n .catch(() => this.availableTags.set([]));\n\n effect(() => {\n const userId = this.item().authorUserId;\n void this.userAvatarService\n .getUserInfo(userId)\n .then((user) => {\n const name = [user.firstName, user.lastName].filter(Boolean).join(' ').trim();\n this.authorName.set(name || user.username || '');\n })\n .catch(() => this.authorName.set(''));\n });\n\n effect(() => {\n this.item().body;\n this.expanded();\n afterNextRender(() => this.updateCanExpand(), { injector: this.injector });\n });\n\n effect(() => {\n const item = this.item();\n const postId = item.id;\n untracked(() => {\n if (this.lastCommentPostId === postId) {\n return;\n }\n this.lastCommentPostId = postId;\n this.commentCountOverride.set(null);\n if (item.allowComments && typeof item.commentCount !== 'number') {\n void this.refreshCommentCount();\n }\n });\n });\n }\n\n //#endregion\n\n //#region ----- Event Handlers -----\n\n protected toggleBody(event: Event): void {\n event.stopPropagation();\n this.expanded.update((value) => !value);\n this.itemSeen.emit(this.item().id);\n }\n\n protected openComments(event: AXClickEvent): void {\n event.nativeEvent?.stopPropagation();\n event.nativeEvent?.preventDefault();\n void this.showCommentsPopup();\n }\n\n //#endregion\n\n //#region ----- Comments -----\n\n private async showCommentsPopup(): Promise<void> {\n const item = this.item();\n if (!item.allowComments || this.commentsBusy()) {\n return;\n }\n this.commentsBusy.set(true);\n try {\n await this.commandService.execute('show-comment-popup', {\n options: {\n refType: CHANNEL_POST_ENTITY_NAME,\n refId: item.id,\n subject: resolveFeedCommentSubject(item.title, this.translation.getActiveLang()),\n },\n });\n await this.refreshCommentCount();\n } finally {\n this.commentsBusy.set(false);\n }\n }\n\n private async refreshCommentCount(): Promise<void> {\n const item = this.item();\n if (!item.allowComments) {\n this.commentCountOverride.set(0);\n return;\n }\n try {\n const count = await this.commentManagement.countCommentsForEntity({\n entityTypeId: CHANNEL_POST_ENTITY_NAME,\n entityId: item.id,\n });\n this.commentCountOverride.set(count);\n } catch {\n /* Keep the last known count when the thread cannot be loaded. */\n }\n }\n\n //#endregion\n\n //#region ----- Display -----\n\n private updateCanExpand(): void {\n if (this.expanded()) {\n this.canExpand.set(true);\n return;\n }\n const el = this.bodyEl()?.nativeElement;\n this.canExpand.set(!!el && el.scrollHeight > el.clientHeight + 1);\n }\n\n //#endregion\n}\n\n//#endregion\n\n//#region ----- Helpers -----\n\nfunction asDate(value: Date | string | number | undefined | null): Date | null {\n if (value == null || value === '') {\n return null;\n }\n const date = value instanceof Date ? value : new Date(value);\n return Number.isNaN(date.getTime()) ? null : date;\n}\n\nfunction hasMlsContent(value: AXPMultiLanguageString | undefined | null): boolean {\n if (value == null) {\n return false;\n }\n if (typeof value === 'string') {\n return value.trim().length > 0;\n }\n return Object.values(value).some((entry) => typeof entry === 'string' && entry.trim().length > 0);\n}\n\nfunction resolveFeedCommentSubject(title: AXPMultiLanguageString | undefined, locale: string): string {\n return resolveMultiLanguageString(coerceUnknownToMultiLanguageString(title), locale).trim();\n}\n\nfunction tagTrackKey(value: AXPMultiLanguageString): string {\n if (typeof value === 'string') {\n return value.trim().toLowerCase();\n }\n const en = value['en-US'];\n if (typeof en === 'string' && en.trim()) {\n return en.trim().toLowerCase();\n }\n const first = Object.values(value).find((entry) => typeof entry === 'string' && entry.trim());\n return typeof first === 'string' ? first.trim().toLowerCase() : '';\n}\n\nfunction closestOverflowRoot(el: HTMLElement): Element | null {\n let current = el.parentElement;\n while (current) {\n const overflowY = getComputedStyle(current).overflowY;\n if (/(auto|scroll|overlay)/.test(overflowY) && current.scrollHeight > current.clientHeight + 1) {\n return current;\n }\n current = current.parentElement;\n }\n return null;\n}\n\n//#endregion\n","<article class=\"axm-channel-feed-item\" [class.unread]=\"isUnread()\" [class.axm-channel-feed-item--bubble]=\"chrome() === 'bubble'\">\n <header class=\"axm-channel-feed-item__header\">\n <div class=\"axm-channel-feed-item__identity\" [axpUserCard]=\"item().authorUserId\">\n <axp-user-avatar [size]=\"44\" [userId]=\"item().authorUserId\" [showPresence]=\"chrome() !== 'bubble'\"></axp-user-avatar>\n <div class=\"axm-channel-feed-item__author\">\n <div class=\"axm-channel-feed-item__author-name\">{{ authorName() }}</div>\n <div class=\"axm-channel-feed-item__meta\">\n <!-- ----- Relative publish time ----- -->\n @if (publishedAt(); as published) {\n <span class=\"axm-channel-feed-item__published\">{{ published | format: 'timeleft' | async }}</span>\n }\n <!-- ----- Pin marker for currently pinned posts ----- -->\n @if (item().isPinned) {\n <ax-icon class=\"axm-channel-feed-item__pin\">\n <i class=\"fa-solid fa-thumbtack\"></i>\n </ax-icon>\n }\n </div>\n </div>\n </div>\n </header>\n\n <h2 class=\"axm-channel-feed-item__title\">{{ item().title | translate | async }}</h2>\n\n <!-- ----- Post body; clamp when collapsed ----- -->\n <p #bodyText class=\"axm-channel-feed-item__body\" [class.axm-channel-feed-item__body--clamped]=\"!expanded()\">\n {{ item().body | translate | async }}\n </p>\n\n <!-- ----- See more / see less when the body overflows the clamp ----- -->\n @if (canExpand()) {\n <button type=\"button\" class=\"axm-channel-feed-item__see-more\" (click)=\"toggleBody($event)\">\n {{ (expanded() ? '@conversation:pages.feed.actions.see-less' : '@conversation:pages.feed.actions.see-more') | translate | async }}\n </button>\n }\n\n <!-- ----- Event time and location ----- -->\n @if (eventStartsAt(); as eventAt) {\n <div class=\"axm-channel-feed-item__event\">\n <ax-icon><i class=\"fa-light fa-calendar\"></i></ax-icon>\n <span>{{ eventAt | format: 'datetime' : { format: 'datetime' } | async }}</span>\n <!-- ----- Event location when it is provided ----- -->\n @if (hasEventLocation()) {\n <span>· {{ item().eventLocation | translate | async }}</span>\n }\n </div>\n }\n\n <!-- ----- Image and video gallery ----- -->\n @if (gallery().length > 0) {\n <axm-channel-feed-gallery [files]=\"gallery()\" />\n }\n\n <!-- ----- Downloadable file attachments ----- -->\n @if (attachments().length > 0) {\n <div class=\"axm-channel-feed-item__attachments\">\n <axp-file-list [files]=\"attachments()\" [readonly]=\"true\" [enableTitleDescription]=\"true\" />\n </div>\n }\n\n <!-- ----- Tags, reactions, and comments ----- -->\n @if (tags().length > 0 || item().allowReactions || item().allowComments) {\n <footer class=\"axm-channel-feed-item__footer\">\n <!-- ----- Post tags from the platform tag catalog ----- -->\n @if (tags().length > 0) {\n <div class=\"axm-channel-feed-item__tags\">\n @for (tag of tags(); track tag.trackKey) {\n <span class=\"axm-channel-feed-item__tag\" [style.background-color]=\"tag.color || null\" [style.color]=\"tag.color ? 'white' : null\">\n <i class=\"fa-solid fa-tag\" [style.color]=\"tag.color ? 'white' : null\"></i>\n <span>{{ tag.title | translate | async }}</span>\n </span>\n }\n </div>\n }\n <!-- ----- Reactions (stub) and comments ----- -->\n @if (item().allowReactions || item().allowComments) {\n <div class=\"axm-channel-feed-item__actions\">\n <!-- ----- Reactions in a later phase ----- -->\n @if (item().allowReactions) {\n <ax-button look=\"blank\" class=\"ax-sm axm-channel-feed-item__action\" [disabled]=\"true\" [text]=\"('@conversation:pages.feed.actions.react' | translate | async) ?? ''\">\n <ax-prefix>\n <ax-icon><i class=\"fa-light fa-thumbs-up\"></i></ax-icon>\n </ax-prefix>\n </ax-button>\n }\n <!-- ----- Comments: same popup as the ChannelPost comments tab ----- -->\n @if (item().allowComments) {\n <ax-button look=\"blank\" class=\"ax-sm axm-channel-feed-item__action\" [disabled]=\"commentsBusy()\" [text]=\"('@conversation:pages.feed.actions.comment' | translate | async) ?? ''\" (onClick)=\"openComments($event)\">\n <ax-prefix>\n <ax-icon><i class=\"fa-light fa-comment\"></i></ax-icon>\n </ax-prefix>\n <!-- ----- Thread count including replies ----- -->\n @if (commentCount() > 0) {\n <ax-badge size=\"sm\" look=\"solid\" color=\"primary\" [text]=\"'' + commentCount()\"></ax-badge>\n }\n </ax-button>\n }\n </div>\n }\n </footer>\n }\n</article>\n","//#region ----- Imports -----\n\nimport { AXButtonModule } from '@acorex/components/button';\nimport { AXSkeletonModule } from '@acorex/components/skeleton';\nimport { AXTranslationModule } from '@acorex/core/translation';\nimport { AXPTagService } from '@acorex-platform/framework-client/core';\nimport {\n // AXPQueryFiltersComponent,\n AXPInfiniteScrollDirective,\n AXPStateMessageComponent,\n AXPThemeLayoutBlockComponent,\n mergeInfiniteScrollPage,\n} from '@acorex-platform/framework-client/layout/components';\nimport {\n AXPPageLayoutBase,\n AXPPageLayoutBaseComponent,\n AXPPageLayoutComponent,\n} from '@acorex-platform/framework-client/layout/views';\nimport { AXPCommandService, AXPQueryService } from '@acorex-platform/framework-client/runtime';\nimport {\n AXP_QUERY_QUICK_SEARCH_FIELD,\n AXPActionMenuItem,\n AXPExecuteCommand,\n AXPFilterDefinition,\n AXPFilterQuery,\n runtimeQueryCollectionData,\n type AXPMultiLanguageString,\n} from '@acorex-platform/framework-shared/core';\nimport { AXMChannelUnreadBadgeProvider } from '../../channel-unread-badge.provider';\nimport {\n AXPConversationCommandKeys,\n AXPConversationQueryKeys,\n RootConfig,\n type AXMChannelFeedItem,\n type AXMChannelFeedQueryInput,\n type AXMChannelMarkReadCommandInput,\n} from '@acorex-platform/module-conversation-client/contracts';\nimport { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n inject,\n signal,\n} from '@angular/core';\nimport { AXMChannelFeedItemComponent } from './channel-feed-item/channel-feed-item.component';\n\n//#endregion\n\n//#region ----- Constants -----\n\nconst SKELETON_COUNT = 3;\nconst PAGE_SIZE = 5;\n\n//#endregion\n\n//#region ----- Component -----\n\n@Component({\n selector: 'axm-channel-feed-page',\n templateUrl: './channel-feed.page.html',\n styleUrl: './channel-feed.page.css',\n imports: [\n CommonModule,\n AXButtonModule,\n AXSkeletonModule,\n AXTranslationModule,\n AXPPageLayoutComponent,\n AXPThemeLayoutBlockComponent,\n // AXPQueryFiltersComponent,\n AXPInfiniteScrollDirective,\n AXPStateMessageComponent,\n AXMChannelFeedItemComponent,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: AXPPageLayoutBase,\n useExisting: AXMChannelFeedPage,\n },\n ],\n host: { class: 'axm-channel-feed-page' },\n})\nexport class AXMChannelFeedPage extends AXPPageLayoutBaseComponent {\n //#region ----- Services & Dependencies -----\n\n private readonly queryService = inject(AXPQueryService);\n private readonly commandService = inject(AXPCommandService);\n private readonly tagService = inject(AXPTagService);\n private readonly unreadBadge = inject(AXMChannelUnreadBadgeProvider);\n\n //#endregion\n\n //#region ----- State Signals -----\n\n protected readonly loading = signal(true);\n protected readonly loadingMore = signal(false);\n protected readonly loadFailed = signal(false);\n protected readonly items = signal<readonly AXMChannelFeedItem[]>([]);\n protected readonly hasMore = signal(false);\n protected readonly filterDefinitions = signal<AXPFilterDefinition[]>([]);\n protected readonly panelInitialFilters = signal<AXPFilterQuery[]>([]);\n protected readonly queryFiltersKey = signal(0);\n private readonly activeFilters = signal<AXPFilterQuery[]>([]);\n private skip = 0;\n\n //#endregion\n\n //#region ----- Computed Properties -----\n\n protected readonly skeletonPlaceholders = Array.from({ length: SKELETON_COUNT }, (_, index) => index);\n\n readonly hasActiveFilters = computed(() =>\n this.activeFilters().some((filter) => {\n if (filter.field === 'readStatus' && (!filter.value || filter.value === 'all')) {\n return false;\n }\n return filter.value != null && String(filter.value).trim() !== '';\n }),\n );\n\n protected readonly visible = computed((): AXMChannelFeedItem[] => {\n const query = this.searchText();\n const unreadOnly = this.isUnreadFilterActive();\n const tag = this.tagFilter();\n const pinnedOnly = this.isPinnedFilterActive();\n\n return this.items().filter((item) => {\n if (unreadOnly && item.isRead) {\n return false;\n }\n if (pinnedOnly && !item.isPinned) {\n return false;\n }\n if (tag && !(item.tags ?? []).some((value) => tagMatchKey(value) === tag)) {\n return false;\n }\n if (query) {\n const haystack = [\n mlsSearchText(item.title),\n mlsSearchText(item.body),\n ...(item.tags ?? []).map((value) => mlsSearchText(value)),\n ]\n .join(' ')\n .toLowerCase();\n if (!haystack.includes(query)) {\n return false;\n }\n }\n return true;\n });\n });\n\n private readonly searchText = computed(() => {\n const searchFilter = this.activeFilters().find(\n (filter) => filter.field === 'all' || filter.field === AXP_QUERY_QUICK_SEARCH_FIELD,\n );\n return searchFilter?.value != null ? String(searchFilter.value).trim().toLowerCase() : '';\n });\n\n private readonly isUnreadFilterActive = computed(() => {\n const readFilter = this.activeFilters().find((filter) => filter.field === 'readStatus');\n return readFilter?.value === 'unread';\n });\n\n private readonly isPinnedFilterActive = computed(() => {\n const pinnedFilter = this.activeFilters().find((filter) => filter.field === 'pinned');\n return pinnedFilter?.value === 'pinned';\n });\n\n private readonly tagFilter = computed((): string | null => {\n const tag = this.activeFilters().find((filter) => filter.field === 'tags')?.value;\n return tag != null && String(tag).trim() !== '' ? String(tag).trim().toLowerCase() : null;\n });\n\n //#endregion\n\n //#region ----- Lifecycle -----\n\n override async ngOnInit(): Promise<void> {\n await super.ngOnInit();\n // Filter bar is hidden until a better feed filter UX is designed.\n // await this.loadFilterDefinitions();\n await this.loadFeed(true);\n }\n\n override getPageTitle(): string {\n return RootConfig.pages.feed.title;\n }\n\n override getPageIcon(): string | null {\n return RootConfig.pages.feed.icon;\n }\n\n override getPageDescription(): string {\n return RootConfig.pages.feed.description;\n }\n\n override async getSecondaryMenuItems(): Promise<AXPActionMenuItem[]> {\n return [\n {\n title: await this.translateService.translateAsync('@conversation:pages.feed.actions.refresh'),\n icon: 'fa-light fa-rotate',\n command: { name: 'refresh' },\n },\n ];\n }\n\n override async execute(command: AXPExecuteCommand): Promise<void> {\n if (command.name === 'refresh') {\n await this.loadFeed(true);\n }\n }\n\n //#endregion\n\n //#region ----- Event Handlers -----\n\n protected handleFiltersChanged(filters: AXPFilterQuery[]): void {\n this.activeFilters.set(filters);\n }\n\n protected clearFilters(): void {\n this.activeFilters.set([]);\n this.panelInitialFilters.set([]);\n this.queryFiltersKey.update((key) => key + 1);\n }\n\n protected onItemSeen(id: string): void {\n void this.markRead(id);\n }\n\n protected retry(): void {\n void this.loadFeed(true);\n }\n\n protected onInfiniteScrollReached(): void {\n void this.loadMore();\n }\n\n protected emptyTitle(): string {\n if (this.hasActiveFilters()) {\n return '@conversation:pages.feed.no-results-title';\n }\n return '@conversation:pages.feed.empty-title';\n }\n\n protected emptyDescription(): string {\n if (this.hasActiveFilters()) {\n return '@conversation:pages.feed.no-results-description';\n }\n return '@conversation:pages.feed.empty-description';\n }\n\n //#endregion\n\n //#region ----- Data Loading -----\n\n private async loadMore(): Promise<void> {\n if (!this.hasMore() || this.loading() || this.loadingMore()) {\n return;\n }\n await this.loadFeed(false);\n }\n\n private async loadFeed(reset: boolean): Promise<void> {\n if (reset) {\n this.skip = 0;\n this.loading.set(true);\n this.loadFailed.set(false);\n } else {\n this.loadingMore.set(true);\n }\n\n try {\n const result = await this.queryService.fetch<AXMChannelFeedQueryInput, AXMChannelFeedItem>(\n AXPConversationQueryKeys.ChannelFeed.Get,\n { skip: this.skip, take: PAGE_SIZE },\n );\n const page = runtimeQueryCollectionData(result);\n if (!page && reset) {\n this.loadFailed.set(true);\n }\n\n const merged = mergeInfiniteScrollPage(this.items(), page, { reset, skip: this.skip });\n this.items.set(merged.items);\n this.skip = merged.skip;\n this.hasMore.set(merged.hasMore);\n } catch {\n if (reset) {\n this.items.set([]);\n this.loadFailed.set(true);\n }\n this.hasMore.set(false);\n } finally {\n this.loading.set(false);\n this.loadingMore.set(false);\n this.recompute();\n }\n }\n\n private async markRead(postId: string): Promise<void> {\n const current = this.items().find((item) => item.id === postId);\n if (!current || current.isRead) {\n return;\n }\n\n this.items.update((items) => items.map((item) => (item.id === postId ? { ...item, isRead: true } : item)));\n this.unreadBadge.markSeen(postId);\n this.recompute();\n\n try {\n const result = await this.commandService.execute<AXMChannelMarkReadCommandInput, void>(\n AXPConversationCommandKeys.ChannelFeed.MarkRead,\n { postId },\n );\n if (result && result.success === false) {\n this.items.update((items) => items.map((item) => (item.id === postId ? { ...item, isRead: false } : item)));\n this.unreadBadge.revertSeen(postId);\n this.recompute();\n return;\n }\n this.unreadBadge.confirmSeen(postId);\n } catch {\n this.items.update((items) => items.map((item) => (item.id === postId ? { ...item, isRead: false } : item)));\n this.unreadBadge.revertSeen(postId);\n this.recompute();\n }\n }\n\n private async loadFilterDefinitions(): Promise<void> {\n const [allLabel, unreadLabel, pinnedLabel] = await Promise.all([\n this.translateService.translateAsync('@conversation:pages.feed.filters.all'),\n this.translateService.translateAsync('@conversation:pages.feed.filters.unread'),\n this.translateService.translateAsync('@conversation:pages.feed.filters.pinned'),\n ]);\n const catalogTags = await this.tagService.getTags().catch(() => []);\n const usedTitles = new Set(\n this.items()\n .flatMap((item) => item.tags ?? [])\n .map((title) => tagMatchKey(title))\n .filter((title) => title.length > 0),\n );\n const tagOptions = [...catalogTags]\n .filter(\n (tag) =>\n tag.scope === 'tenant' ||\n usedTitles.has(tag.title.toLowerCase()) ||\n ['Urgent', 'Important', 'Review'].includes(tag.title),\n )\n .sort((left, right) => left.title.localeCompare(right.title))\n .map((tag) => ({ id: tag.title, title: tag.title }));\n\n this.filterDefinitions.set([\n {\n field: 'all',\n title: '@conversation:pages.feed.search-placeholder',\n icon: 'fa-light fa-magnifying-glass',\n widget: { type: 'string-filter' },\n filterType: { inline: true, advance: false },\n },\n {\n field: 'readStatus',\n operator: { type: 'equal' },\n title: '@conversation:pages.feed.filters.read-status',\n icon: 'fa-light fa-envelope-open-text',\n widget: {\n type: 'select-filter',\n options: {\n dataSource: [\n { id: 'all', title: allLabel },\n { id: 'unread', title: unreadLabel },\n ],\n valueField: 'id',\n textField: 'title',\n allowClear: true,\n },\n },\n filterType: { advance: true, inline: false },\n },\n {\n field: 'tags',\n operator: { type: 'equal' },\n title: '@conversation:pages.feed.filters.tags',\n icon: 'fa-light fa-tags',\n widget: {\n type: 'select-filter',\n options: {\n dataSource: tagOptions,\n valueField: 'id',\n textField: 'title',\n allowClear: true,\n },\n },\n filterType: { advance: true, inline: false },\n },\n {\n field: 'pinned',\n operator: { type: 'equal' },\n title: '@conversation:pages.feed.filters.pinned',\n icon: 'fa-light fa-thumbtack',\n widget: {\n type: 'select-filter',\n options: {\n dataSource: [{ id: 'pinned', title: pinnedLabel }],\n valueField: 'id',\n textField: 'title',\n allowClear: true,\n },\n },\n filterType: { advance: true, inline: false },\n },\n ]);\n }\n\n //#endregion\n}\n\n//#endregion\n\n//#region ----- Helpers -----\n\nfunction tagMatchKey(value: AXPMultiLanguageString): string {\n if (typeof value === 'string') {\n return value.trim().toLowerCase();\n }\n const en = value['en-US'];\n if (typeof en === 'string' && en.trim()) {\n return en.trim().toLowerCase();\n }\n const first = Object.values(value).find((entry) => typeof entry === 'string' && entry.trim());\n return typeof first === 'string' ? first.trim().toLowerCase() : '';\n}\n\nfunction mlsSearchText(value: AXPMultiLanguageString | undefined | null): string {\n if (value == null) {\n return '';\n }\n if (typeof value === 'string') {\n return value;\n }\n return Object.values(value)\n .filter((entry): entry is string => typeof entry === 'string')\n .join(' ');\n}\n\n//#endregion\n","<axp-page-layout>\n <!-- Filter bar parked until a better feed filter UX is designed.\n <axp-page-toolbar>\n <div class=\"w-full flex items-center\">\n <axp-layout-prefix class=\"w-full\">\n @for (_k of [queryFiltersKey()]; track _k) {\n <axp-query-filters\n [filtersDefinitions]=\"filterDefinitions()\"\n [initialFilters]=\"panelInitialFilters()\"\n [quickSearch]=\"true\"\n (onFiltersChanged)=\"handleFiltersChanged($event)\"\n />\n }\n </axp-layout-prefix>\n </div>\n </axp-page-toolbar>\n -->\n\n <axp-page-content>\n <div class=\"axm-channel-feed-page__panel\">\n @if (loading() && items().length === 0) {\n <!-- ----- Card skeletons while the first page loads ----- -->\n <div class=\"axm-channel-feed-page__stream\">\n @for (_ of skeletonPlaceholders; track $index) {\n <div class=\"axm-channel-feed-page__skeleton-card\">\n <div class=\"axm-channel-feed-page__skeleton-header\">\n <ax-skeleton [animated]=\"true\" class=\"axm-channel-feed-page__skeleton-avatar\"></ax-skeleton>\n <div class=\"axm-channel-feed-page__skeleton-meta\">\n <ax-skeleton [animated]=\"true\" class=\"axm-channel-feed-page__skeleton-line axm-channel-feed-page__skeleton-line--name\"></ax-skeleton>\n <ax-skeleton [animated]=\"true\" class=\"axm-channel-feed-page__skeleton-line axm-channel-feed-page__skeleton-line--time\"></ax-skeleton>\n </div>\n </div>\n <ax-skeleton [animated]=\"true\" class=\"axm-channel-feed-page__skeleton-line axm-channel-feed-page__skeleton-line--wide\"></ax-skeleton>\n <ax-skeleton [animated]=\"true\" class=\"axm-channel-feed-page__skeleton-line\"></ax-skeleton>\n <ax-skeleton [animated]=\"true\" class=\"axm-channel-feed-page__skeleton-media\"></ax-skeleton>\n </div>\n }\n </div>\n }\n <!-- ----- Query failure ----- -->\n @else if (loadFailed() && items().length === 0) {\n <axp-state-message\n mode=\"error\"\n icon=\"fa-light fa-triangle-exclamation\"\n title=\"@conversation:pages.feed.load-error-title\"\n description=\"@conversation:pages.feed.load-error-description\"\n >\n <ax-button\n slot=\"actions\"\n look=\"outline\"\n [text]=\"('@conversation:pages.feed.actions.retry' | translate | async) ?? ''\"\n (onClick)=\"retry()\"\n />\n </axp-state-message>\n }\n <!-- ----- Empty feed or no matches for the current filters ----- -->\n @else if (visible().length === 0 && !hasMore() && !loadingMore()) {\n <axp-state-message\n mode=\"empty\"\n icon=\"fa-light fa-bullhorn\"\n [title]=\"emptyTitle()\"\n [description]=\"emptyDescription()\"\n >\n <!--->\n <!-- ----- Clear filters when the empty state is caused by filtering ----- -->\n @if (hasActiveFilters()) {\n <ax-button\n slot=\"actions\"\n look=\"outline\"\n [text]=\"('@conversation:pages.feed.actions.clear-filters' | translate | async) ?? ''\"\n (onClick)=\"clearFilters()\"\n />\n }\n </axp-state-message>\n }\n <!-- ----- Card stream ----- -->\n @else {\n <div class=\"axm-channel-feed-page__stream\">\n @for (item of visible(); track item.id) {\n <axm-channel-feed-item [item]=\"item\" (itemSeen)=\"onItemSeen($event)\" />\n }\n <!-- ----- Loading more cards at the end of the stream ----- -->\n @if (loadingMore() || (visible().length === 0 && hasMore())) {\n <div class=\"axm-channel-feed-page__skeleton-card\">\n <div class=\"axm-channel-feed-page__skeleton-header\">\n <ax-skeleton [animated]=\"true\" class=\"axm-channel-feed-page__skeleton-avatar\"></ax-skeleton>\n <div class=\"axm-channel-feed-page__skeleton-meta\">\n <ax-skeleton [animated]=\"true\" class=\"axm-channel-feed-page__skeleton-line axm-channel-feed-page__skeleton-line--name\"></ax-skeleton>\n <ax-skeleton [animated]=\"true\" class=\"axm-channel-feed-page__skeleton-line axm-channel-feed-page__skeleton-line--time\"></ax-skeleton>\n </div>\n </div>\n <ax-skeleton [animated]=\"true\" class=\"axm-channel-feed-page__skeleton-media\"></ax-skeleton>\n </div>\n }\n <div\n axpInfiniteScroll\n class=\"axm-channel-feed-page__sentinel\"\n [axpInfiniteScrollEnabled]=\"hasMore() && !loading() && !loadingMore()\"\n (axpInfiniteScrollReached)=\"onInfiniteScrollReached()\"\n ></div>\n </div>\n }\n </div>\n </axp-page-content>\n</axp-page-layout>\n","//#region ---- Chat route ----\n\n/**\n * True when the URL is the Conversations page (`/:app/chat` or `/:app/chat/:id`).\n */\nexport function axmIsConversationChatUrl(url: string): boolean {\n const path = (url ?? '').split('?')[0].split('#')[0];\n return /\\/[^/]+\\/chat(?:\\/|$)/.test(path);\n}\n\n//#endregion\n","//#region ---- Imports ----\n\nimport type { AXConversationMessage } from '@acorex/components/conversation';\nimport { DOCUMENT } from '@angular/common';\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 private readonly document = inject(DOCUMENT);\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 if (this.focusedConversationId !== conversationId) {\n return false;\n }\n // Hidden browser tab: user is not looking at the thread (notify + badge).\n if (this.document.visibilityState === 'hidden') {\n return false;\n }\n return true;\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 ---- Mini chat panel open options ----\n\nimport type { AXPlacement } from '@acorex/cdk/common';\nimport type { AXMContextualAssistContext } from '@acorex-platform/module-conversation-client/contracts';\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/**\n * How the shared panel is hosted.\n * `overlay` is the floating window (header / entity pages).\n * `embedded` fills the host (entity record details, later).\n */\nexport type AXMMiniChatPanelPresentation = 'overlay' | 'embedded';\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/** Popup dock name for minimized mini-chat tabs in the root footer. */\nexport const AXM_MINI_CHAT_POPUP_DOCK = 'mini-chat';\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 /** Default: `overlay`. Use `embedded` when the panel is inlined in a page. */\n presentation?: AXMMiniChatPanelPresentation;\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 * Record/surface context for a new assist thread (entity-row assist).\n * Stored on the room and used to generate contextual starter chips.\n */\n launchContext?: AXMContextualAssistContext;\n}\n\n/** Window controls exposed by the mini-chat popup host to {@link AXMMiniChatPanelService}. */\nexport interface AXMMiniChatPopupWindowApi {\n close(): void;\n restore(): void;\n minimize(): void;\n maximize(): void;\n isMinimized(): boolean;\n isMaximized(): boolean;\n}\n\n/** Assigned onto {@link AXMMiniChatPopupWindowComponent} via popup `data`. */\nexport interface AXMMiniChatPopupWindowData {\n scope: AXMMiniChatPanelScope;\n entityId?: string;\n entityType?: string;\n assistId?: string;\n panelTitle?: string;\n showInfoBar: boolean;\n showComposer: boolean;\n initialView: 'thread' | 'history';\n initialConversationId?: string;\n startWithNewChat: boolean;\n launchContext?: AXMContextualAssistContext;\n onSessionChange?: (state: Pick<AXMMiniChatPanelSessionState, 'view' | 'selectedChatId'>) => void;\n registerWindow?: (api: AXMMiniChatPopupWindowApi | null) => void;\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 {\n AXM_ASSIST_LAUNCH_CONTEXT_METADATA_KEY,\n AXM_CONTEXTUAL_ASSIST_KIND_ENTITY_RECORD,\n axmAiChatConversationUiMetadata,\n type AXMCommentEntityData,\n type AXMContextualAssistContext,\n} from '@acorex-platform/module-conversation-client/contracts';\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/** Room fields used to decide whether a chat belongs on the main inbox. */\nexport interface AXMEntityChatRoomRef {\n metadata?: Record<string, unknown>;\n entityRef?: Pick<AXMCommentEntityData, 'entityId' | 'entityTypeId'> | null;\n}\n\n//#endregion\n\n//#region ----- Constants -----\n\n/** Room metadata flag: entity mini-chats stay off `/chat/`; header inbox chats omit this. */\nexport const AXM_MINI_CHAT_SCOPE_METADATA_KEY = 'miniChatScope';\n\nexport const AXM_MINI_CHAT_SCOPE_ENTITY = 'entity';\n\n/**\n * Synthetic record id for Ask AI on an entity **list** (no row id).\n * Keeps list history on that page and out of the main chat sidebar.\n */\nexport const AXM_ENTITY_LIST_CHAT_ID = '__entity-list__';\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 [AXM_MINI_CHAT_SCOPE_METADATA_KEY]: AXM_MINI_CHAT_SCOPE_ENTITY,\n assistId: args.assistId.trim(),\n entityId: args.entityId.trim(),\n entityType: args.entityType.trim(),\n ...axmAiChatConversationUiMetadata(),\n };\n}\n\n/**\n * `AXConversationService.createConversation` stores the whole UI options object as\n * `room.metadata`, nesting real keys under `metadata.metadata`. Flatten so entity\n * flags sit at the top level for inbox filters and `entityRef`.\n */\nexport function axmFlattenConversationCreateMetadata(\n metadata: Record<string, unknown> | undefined,\n): Record<string, unknown> | undefined {\n if (isNil(metadata)) {\n return undefined;\n }\n\n const nestedRaw = metadata['metadata'];\n const nested =\n !isNil(nestedRaw) && typeof nestedRaw === 'object' && !Array.isArray(nestedRaw)\n ? (nestedRaw as Record<string, unknown>)\n : undefined;\n const { metadata: _nested, ...rest } = metadata;\n return {\n ...rest,\n ...(nested ?? {}),\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 { entityId, entityType };\n }\n\n return axmEntityRefFromLaunchContext(readLaunchContext(metadata));\n}\n\n/** Entity id/type from a contextual-assist launch payload (entity row / details). */\nexport function axmEntityRefFromLaunchContext(\n launch: AXMContextualAssistContext | undefined,\n): AXMEntityChatRef | undefined {\n if (!launch || launch.kind !== AXM_CONTEXTUAL_ASSIST_KIND_ENTITY_RECORD) {\n return undefined;\n }\n\n const payload = launch.payload ?? {};\n const recordId = isString(payload['recordId']) ? payload['recordId'].trim() : '';\n const moduleName = isString(payload['moduleName']) ? payload['moduleName'].trim() : '';\n const entityName = isString(payload['entityName']) ? payload['entityName'].trim() : '';\n if (!recordId || !moduleName || !entityName) {\n return undefined;\n }\n\n return { entityId: recordId, entityType: `${moduleName}.${entityName}` };\n}\n\n/** True when the conversation is bound to an entity page (not the site-header inbox). */\nexport function axmConversationIsEntityChat(metadata: Record<string, unknown> | undefined): boolean {\n if (isNil(metadata)) {\n return false;\n }\n if (readMetadataString(metadata, AXM_MINI_CHAT_SCOPE_METADATA_KEY) === AXM_MINI_CHAT_SCOPE_ENTITY) {\n return true;\n }\n if (!isNil(axmExtractEntityRefFromMetadata(metadata))) {\n return true;\n }\n return readLaunchContext(metadata)?.kind === AXM_CONTEXTUAL_ASSIST_KIND_ENTITY_RECORD;\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/**\n * True when a persisted room is an entity-scoped chat (metadata and/or `entityRef`).\n * Header / inbox AI chats have neither; they belong on `/chat/`.\n */\nexport function axmRoomIsEntityChat(room: AXMEntityChatRoomRef | null | undefined): boolean {\n if (!room) {\n return false;\n }\n if (axmConversationIsEntityChat(room.metadata)) {\n return true;\n }\n const entityId = room.entityRef?.entityId?.trim();\n const entityTypeId = room.entityRef?.entityTypeId?.trim();\n return Boolean(entityId && entityTypeId);\n}\n\n/** True when a room is bound to the given entity via metadata or `entityRef`. */\nexport function axmRoomMatchesEntity(\n room: AXMEntityChatRoomRef | null | undefined,\n ref: AXMEntityChatRef,\n): boolean {\n if (!room) {\n return false;\n }\n const entityId = ref.entityId.trim();\n const entityType = ref.entityType.trim();\n if (axmConversationMatchesEntity(room.metadata, { entityId, entityType })) {\n return true;\n }\n return room.entityRef?.entityId?.trim() === entityId && room.entityRef?.entityTypeId?.trim() === entityType;\n}\n\n/**\n * Persisted `entityRef` for an entity-scoped chat room so history can query by record\n * and the main inbox can exclude the room (comment threads use `kind: 'comment'`).\n */\nexport function axmBuildEntityChatRoomEntityRef(\n metadata: Record<string, unknown> | undefined,\n): AXMCommentEntityData | undefined {\n const ref = axmExtractEntityRefFromMetadata(metadata);\n if (!ref) {\n return undefined;\n }\n\n const entityType = ref.entityType;\n const separator = entityType.lastIndexOf('.');\n const moduleName = separator > 0 ? entityType.slice(0, separator) : undefined;\n const entityName = separator > 0 ? entityType.slice(separator + 1) : entityType;\n\n return {\n entityId: ref.entityId,\n entityTypeId: entityType,\n ...(moduleName ? { moduleName } : {}),\n entityName,\n };\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\nfunction readLaunchContext(metadata: Record<string, unknown>): AXMContextualAssistContext | undefined {\n const direct = metadata[AXM_ASSIST_LAUNCH_CONTEXT_METADATA_KEY];\n if (isLaunchContext(direct)) {\n return direct;\n }\n\n const nested = metadata['metadata'];\n if (!isNil(nested) && typeof nested === 'object') {\n const inner = (nested as Record<string, unknown>)[AXM_ASSIST_LAUNCH_CONTEXT_METADATA_KEY];\n if (isLaunchContext(inner)) {\n return inner;\n }\n }\n\n return undefined;\n}\n\nfunction isLaunchContext(value: unknown): value is AXMContextualAssistContext {\n if (isNil(value) || typeof value !== 'object') {\n return false;\n }\n const kind = (value as AXMContextualAssistContext).kind;\n return isString(kind) && kind.trim().length > 0;\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 /**\n * Creates a new entity-scoped assist conversation and selects it.\n * Must go through {@link AXConversationService.createConversation} so the open mini-chat\n * instance owns the thread; the inbox tab filter hides entity rooms from `/chat/`.\n */\n async createEntityChat(\n ref: AXMEntityChatRef,\n assistId?: string,\n extraMetadata?: Record<string, unknown>,\n ): Promise<AXConversation> {\n const createData = await this.buildEntityChatCreateData(ref, assistId, extraMetadata);\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(\n ref: AXMEntityChatRef,\n assistId?: string,\n extraMetadata?: Record<string, unknown>,\n ): 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: {\n ...extraMetadata,\n ...axmBuildEntityChatConversationMetadata({\n entityId: ref.entityId,\n entityType: ref.entityType,\n assistId: row.id,\n }),\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 ---- 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 ----- Imports -----\n\nimport type { AXConversation } from '@acorex/components/conversation';\n\nimport { axmSortConversationsByPinAndRecency } from '../chat/plugins/utils/conversation-list-sort.util';\n\n//#endregion\n\n//#region ----- History list patches -----\n\n/** Inserts or replaces a conversation in a mini-chat history list, then re-sorts. */\nexport function axmUpsertMiniChatHistoryItem(\n items: AXConversation[],\n next: AXConversation,\n matches: (conversation: AXConversation) => boolean,\n): AXConversation[] {\n if (!matches(next)) {\n return items.filter((item) => item.id !== next.id);\n }\n\n return axmSortConversationsByPinAndRecency([next, ...items.filter((item) => item.id !== next.id)]);\n}\n\n/** Removes a conversation from a mini-chat history list. */\nexport function axmRemoveMiniChatHistoryItem(\n items: AXConversation[],\n conversationId: string,\n): AXConversation[] {\n const scoped = conversationId.trim();\n if (!scoped) {\n return items;\n }\n return items.filter((item) => item.id !== scoped);\n}\n\n//#endregion\n","//#region ---- Imports ----\n\nimport { type AXConversation } from '@acorex/components/conversation';\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 DestroyRef,\n inject,\n input,\n OnInit,\n output,\n signal,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { merge } from 'rxjs';\nimport { axmResolveConversationListAvatar } from '../chat/plugins/utils/chat-avatar.util';\nimport { AXMConversationRealtimeBus } from '../chat/services/conversation-realtime.bus';\nimport { AXMEntityChatService } from './entity-chat.service';\nimport { axmConversationMatchesEntity } from './entity-chat.util';\nimport { axmRemoveMiniChatHistoryItem, axmUpsertMiniChatHistoryItem } from './mini-chat-history-live.util';\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 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\">\n {{ '@conversation:mini-chat.loading' | translate | async }}\n </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 </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 private readonly realtimeBus = inject(AXMConversationRealtimeBus);\n private readonly destroyRef = inject(DestroyRef);\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 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 this.bindRealtimeHistory();\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 ---- Live updates ----\n\n private bindRealtimeHistory(): void {\n merge(this.realtimeBus.conversationCreated$, this.realtimeBus.conversationUpdates$)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe((conversation) => {\n const next = axmUpsertMiniChatHistoryItem(this.conversations(), conversation, (item) =>\n axmConversationMatchesEntity(item.metadata, {\n entityId: this.entityId(),\n entityType: this.entityType(),\n }),\n );\n this.conversations.set(next);\n this.hasConversationsChange.emit(next.length > 0);\n });\n\n this.realtimeBus.conversationDeleted$\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe((conversationId) => {\n const next = axmRemoveMiniChatHistoryItem(this.conversations(), conversationId);\n this.conversations.set(next);\n this.hasConversationsChange.emit(next.length > 0);\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 //#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 { AXPAvatarComponent, AXPStateMessageComponent } from '@acorex-platform/framework-client/layout/components';\nimport { type AXConversation } from '@acorex/components/conversation';\nimport { AXTranslationModule } from '@acorex/core/translation';\nimport { AsyncPipe } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, DestroyRef, inject, OnInit, output, signal } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { merge } from 'rxjs';\nimport { AXMChatConversationApi } from '../chat/plugins/services/chat-conversation-apis.abstract';\nimport { axmResolveConversationListAvatar } from '../chat/plugins/utils/chat-avatar.util';\nimport { AXMConversationRealtimeBus } from '../chat/services/conversation-realtime.bus';\nimport { axmRoomIsEntityChat } from './entity-chat.util';\nimport { axmRemoveMiniChatHistoryItem, axmUpsertMiniChatHistoryItem } from './mini-chat-history-live.util';\nimport { AXM_MINI_CHAT_INBOX_CONVERSATION_FILTER } from './mini-chat-inbox-filter.provider';\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: [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 icon=\"fa-light fa-robot\" [title]=\"'@conversation:mini-chat.inbox-empty-state.title'\" [description]=\"'@conversation:mini-chat.inbox-empty-state.description'\"></axp-state-message>\n </div>\n } @else {\n @for (conversation of conversations(); track conversation.id) {\n @let listAvatar = resolveListAvatar(conversation);\n <button type=\"button\" 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\" (click)=\"onSelect(conversation.id)\">\n <axp-avatar [size]=\"32\" [fullName]=\"listAvatar.title\" [src]=\"listAvatar.avatar\" />\n <span class=\"flex-1 truncate text-sm\">{{ conversation.title }}</span>\n </button>\n }\n }\n </div>\n </div>\n `,\n styles: `\n @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 private readonly realtimeBus = inject(AXMConversationRealtimeBus);\n private readonly destroyRef = inject(DestroyRef);\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 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 this.bindRealtimeHistory();\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((conversation) => !axmRoomIsEntityChat(conversation) && (this.conversationFilter ? this.conversationFilter(conversation) : true));\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 ---- Live updates ----\n\n private bindRealtimeHistory(): void {\n merge(this.realtimeBus.conversationCreated$, this.realtimeBus.conversationUpdates$)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe((conversation) => {\n const next = axmUpsertMiniChatHistoryItem(this.conversations(), conversation, (item) => this.matchesInbox(item));\n this.conversations.set(next);\n this.hasConversationsChange.emit(next.length > 0);\n });\n\n this.realtimeBus.conversationDeleted$.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((conversationId) => {\n const next = axmRemoveMiniChatHistoryItem(this.conversations(), conversationId);\n this.conversations.set(next);\n this.hasConversationsChange.emit(next.length > 0);\n });\n }\n\n private matchesInbox(conversation: AXConversation): boolean {\n return !axmRoomIsEntityChat(conversation) && (this.conversationFilter ? this.conversationFilter(conversation) : true);\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 //#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 { 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","//#region ----- Imports -----\n\nimport type { AXMContextualAssistContext } from '@acorex-platform/module-conversation-client/contracts';\n\n//#endregion\n\n//#region ----- Constants -----\n\n/** Launch kind stored on a header mini-chat room after the first message. */\nexport const AXM_MINI_CHAT_PAGE_CONTEXT_KIND = 'entity-page';\n\n/** Action name paired with {@link AXM_MINI_CHAT_PAGE_CONTEXT_KIND}. */\nexport const AXM_MINI_CHAT_PAGE_CONTEXT_ACTION = 'entity.page.context';\n\nexport const AXM_MINI_CHAT_ENTITY_CHIP_ID = 'entity';\n\nexport const AXM_MINI_CHAT_VIEW_CHIP_ID = 'view';\n\n//#endregion\n\n//#region ----- Types -----\n\nexport type AXMMiniChatContextChipKind = 'entity' | 'view' | 'record';\n\nexport interface AXMMiniChatContextChip {\n id: string;\n kind: AXMMiniChatContextChipKind;\n label: string;\n}\n\nexport interface AXMMiniChatPageContextRecord {\n id: string;\n title: string;\n moduleName: string;\n entityName: string;\n}\n\nexport interface AXMMiniChatPageContextPayload {\n guidance?: string;\n entity?: {\n moduleName: string;\n entityName: string;\n title: string;\n };\n view?: {\n name: string;\n title: string;\n };\n records?: AXMMiniChatPageContextRecord[];\n}\n\nexport interface AXMMiniChatPageContextDraft {\n moduleName: string;\n entityName: string;\n entityTitle: string;\n entityKey: string;\n viewName?: string;\n viewTitle?: string;\n viewKey: string;\n includeView: boolean;\n records: Array<{ id: string; title: string }>;\n selectionKey: string;\n}\n\n//#endregion\n\n//#region ----- Chips -----\n\nexport function axmMiniChatRecordChipId(recordId: string): string {\n return `record:${recordId}`;\n}\n\nexport function axmMiniChatContextChipIcon(kind: AXMMiniChatContextChipKind): string {\n if (kind === 'record') {\n return 'fa-light fa-file-lines';\n }\n if (kind === 'view') {\n return 'fa-light fa-layer-group';\n }\n return 'fa-light fa-cube';\n}\n\nexport function axmMiniChatChipsFromDraft(\n draft: AXMMiniChatPageContextDraft,\n dismissed: ReadonlySet<string>,\n): AXMMiniChatContextChip[] {\n const chips: AXMMiniChatContextChip[] = [];\n if (draft.entityTitle && !dismissed.has(AXM_MINI_CHAT_ENTITY_CHIP_ID)) {\n chips.push({\n id: AXM_MINI_CHAT_ENTITY_CHIP_ID,\n kind: 'entity',\n label: draft.entityTitle,\n });\n }\n if (draft.includeView && draft.viewTitle && !dismissed.has(AXM_MINI_CHAT_VIEW_CHIP_ID)) {\n chips.push({\n id: AXM_MINI_CHAT_VIEW_CHIP_ID,\n kind: 'view',\n label: draft.viewTitle,\n });\n }\n for (const record of draft.records) {\n const id = axmMiniChatRecordChipId(record.id);\n if (dismissed.has(id)) {\n continue;\n }\n chips.push({\n id,\n kind: 'record',\n label: record.title || record.id,\n });\n }\n return chips;\n}\n\nexport function axmMiniChatSameChips(\n left: readonly AXMMiniChatContextChip[],\n right: readonly AXMMiniChatContextChip[],\n): boolean {\n if (left.length !== right.length) {\n return false;\n }\n return left.every((chip, index) => {\n const other = right[index];\n return other != null && chip.id === other.id && chip.kind === other.kind && chip.label === other.label;\n });\n}\n\n//#endregion\n\n//#region ----- Launch context -----\n\nexport function axmMiniChatLaunchContextFromDraft(\n draft: AXMMiniChatPageContextDraft,\n chips: readonly AXMMiniChatContextChip[],\n): AXMContextualAssistContext | undefined {\n const visible = new Set(chips.map((chip) => chip.id));\n const entity =\n visible.has(AXM_MINI_CHAT_ENTITY_CHIP_ID) && draft.moduleName && draft.entityName\n ? {\n moduleName: draft.moduleName,\n entityName: draft.entityName,\n title: draft.entityTitle,\n }\n : undefined;\n const view =\n visible.has(AXM_MINI_CHAT_VIEW_CHIP_ID) && draft.viewName && draft.viewTitle\n ? { name: draft.viewName, title: draft.viewTitle }\n : undefined;\n const records = draft.records\n .filter((record) => visible.has(axmMiniChatRecordChipId(record.id)))\n .map((record) => ({\n id: record.id,\n title: record.title || record.id,\n moduleName: draft.moduleName,\n entityName: draft.entityName,\n }));\n\n if (!entity && !view && records.length === 0) {\n return undefined;\n }\n\n const payload: AXMMiniChatPageContextPayload = {\n guidance:\n 'Answer using this entity page context for the whole conversation. Use only the entity, view, and records listed here.',\n ...(entity ? { entity } : {}),\n ...(view ? { view } : {}),\n ...(records.length ? { records } : {}),\n };\n\n return {\n kind: AXM_MINI_CHAT_PAGE_CONTEXT_KIND,\n actionName: AXM_MINI_CHAT_PAGE_CONTEXT_ACTION,\n ...(entity?.title ? { title: entity.title } : {}),\n payload: { ...payload },\n };\n}\n\nexport function axmMiniChatChipsFromLaunchContext(\n context: AXMContextualAssistContext | undefined,\n): AXMMiniChatContextChip[] {\n if (!context || context.kind !== AXM_MINI_CHAT_PAGE_CONTEXT_KIND) {\n return [];\n }\n const payload = context.payload;\n const chips: AXMMiniChatContextChip[] = [];\n const entity = readEntity(payload['entity']);\n if (entity?.title) {\n chips.push({\n id: AXM_MINI_CHAT_ENTITY_CHIP_ID,\n kind: 'entity',\n label: entity.title,\n });\n }\n const view = readView(payload['view']);\n if (view?.title) {\n chips.push({\n id: AXM_MINI_CHAT_VIEW_CHIP_ID,\n kind: 'view',\n label: view.title,\n });\n }\n const records = readRecords(payload['records']);\n for (const record of records) {\n chips.push({\n id: axmMiniChatRecordChipId(record.id),\n kind: 'record',\n label: record.title || record.id,\n });\n }\n return chips;\n}\n\n//#endregion\n\n//#region ----- Payload readers -----\n\nfunction readEntity(value: unknown): AXMMiniChatPageContextPayload['entity'] | undefined {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return undefined;\n }\n const row = value as Record<string, unknown>;\n const moduleName = readText(row['moduleName']);\n const entityName = readText(row['entityName']);\n const title = readText(row['title']);\n if (!moduleName || !entityName || !title) {\n return undefined;\n }\n return { moduleName, entityName, title };\n}\n\nfunction readView(value: unknown): AXMMiniChatPageContextPayload['view'] | undefined {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return undefined;\n }\n const row = value as Record<string, unknown>;\n const name = readText(row['name']);\n const title = readText(row['title']);\n if (!name || !title) {\n return undefined;\n }\n return { name, title };\n}\n\nfunction readRecords(value: unknown): AXMMiniChatPageContextRecord[] {\n if (!Array.isArray(value)) {\n return [];\n }\n const records: AXMMiniChatPageContextRecord[] = [];\n for (const item of value) {\n if (!item || typeof item !== 'object' || Array.isArray(item)) {\n continue;\n }\n const row = item as Record<string, unknown>;\n const id = readText(row['id']);\n const moduleName = readText(row['moduleName']);\n const entityName = readText(row['entityName']);\n if (!id || !moduleName || !entityName) {\n continue;\n }\n records.push({\n id,\n title: readText(row['title']) || id,\n moduleName,\n entityName,\n });\n }\n return records;\n}\n\nfunction readText(value: unknown): string {\n return typeof value === 'string' ? value.trim() : '';\n}\n\n//#endregion\n","//#region ----- Imports -----\n\nimport { AXPPageContextRegistry, type AXPPageContextSnapshot } from '@acorex-platform/framework-client/core';\nimport { AXPEntityDefinitionRegistryService, AXPEntityService } from '@acorex-platform/framework-client/layout/entity';\nimport type { AXPMultiLanguageString } from '@acorex-platform/framework-shared/core';\nimport {\n axmExtractAssistLaunchContextFromMetadata,\n type AXMContextualAssistContext,\n} from '@acorex-platform/module-conversation-client/contracts';\nimport { AXTranslationService } from '@acorex/core/translation';\nimport { DestroyRef, Injectable, inject, signal } from '@angular/core';\nimport { NavigationEnd, Router, type ActivatedRouteSnapshot } from '@angular/router';\nimport { filter, interval, Subscription } from 'rxjs';\nimport {\n AXM_MINI_CHAT_ENTITY_CHIP_ID,\n AXM_MINI_CHAT_VIEW_CHIP_ID,\n axmMiniChatChipsFromDraft,\n axmMiniChatChipsFromLaunchContext,\n axmMiniChatLaunchContextFromDraft,\n axmMiniChatSameChips,\n type AXMMiniChatContextChip,\n type AXMMiniChatPageContextDraft,\n} from './mini-chat-page-context.util';\n\n//#endregion\n\n//#region ----- Types -----\n\ninterface AXMMiniChatDetailRoute {\n moduleName: string;\n entityName: string;\n recordId: string;\n}\n\n//#endregion\n\n//#region ----- Service -----\n\n/**\n * Live entity/view/record chips for the header mini chat.\n * Chips stay editable until the first message pins them on the conversation.\n */\n@Injectable({ providedIn: 'root' })\nexport class AXMMiniChatPageContextChipsService {\n //#region ----- Services & Dependencies -----\n\n private readonly pageContext = inject(AXPPageContextRegistry);\n private readonly router = inject(Router);\n private readonly entityRegistry = inject(AXPEntityDefinitionRegistryService);\n private readonly entityService = inject(AXPEntityService);\n private readonly translation = inject(AXTranslationService);\n\n //#endregion\n\n //#region ----- State Signals -----\n\n readonly chips = signal<AXMMiniChatContextChip[]>([]);\n readonly locked = signal(false);\n\n private capturing = false;\n private pinnedId: string | null = null;\n private readonly dismissed = new Set<string>();\n private entityKey = '';\n private viewKey = '';\n private selectionKey = '';\n private draft: AXMMiniChatPageContextDraft | null = null;\n private detailSeq = 0;\n private loadedDetailKey = '';\n private detailPending: Promise<void> | null = null;\n private watchStop: (() => void) | null = null;\n\n //#endregion\n\n //#region ----- Lifecycle -----\n\n /** Follows the current page until the panel is destroyed. */\n start(destroyRef: DestroyRef): void {\n this.stop();\n this.capturing = true;\n const poll: Subscription = interval(400).subscribe(() => this.refreshLive());\n const routes: Subscription = this.router.events\n .pipe(filter((event): event is NavigationEnd => event instanceof NavigationEnd))\n .subscribe(() => this.refreshLive());\n const stop = (): void => {\n poll.unsubscribe();\n routes.unsubscribe();\n this.capturing = false;\n this.watchStop = null;\n };\n this.watchStop = stop;\n destroyRef.onDestroy(stop);\n this.refreshLive();\n }\n\n stop(): void {\n this.watchStop?.();\n }\n\n //#endregion\n\n //#region ----- Public API -----\n\n /** Editable chips from the page the user is on now. */\n beginDraft(): void {\n this.pinnedId = null;\n this.locked.set(false);\n this.dismissed.clear();\n this.entityKey = '';\n this.viewKey = '';\n this.selectionKey = '';\n this.draft = null;\n this.loadedDetailKey = '';\n this.detailSeq += 1;\n this.detailPending = null;\n this.refreshLive();\n }\n\n /** Stops live updates while a saved conversation is opening. */\n pinPending(conversationId: string): void {\n const id = conversationId.trim();\n if (!id) {\n return;\n }\n this.pinnedId = id;\n this.locked.set(true);\n }\n\n /** Shows the chips stored on a conversation and keeps them readonly. */\n pin(conversationId: string, metadata: Record<string, unknown> | undefined): void {\n const id = conversationId.trim();\n if (!id || (this.pinnedId && this.pinnedId !== id)) {\n return;\n }\n this.pinnedId = id;\n this.locked.set(true);\n const context = axmExtractAssistLaunchContextFromMetadata(metadata);\n const next = axmMiniChatChipsFromLaunchContext(context);\n if (!axmMiniChatSameChips(this.chips(), next)) {\n this.chips.set(next);\n }\n }\n\n dismiss(chipId: string): void {\n if (this.locked() || !chipId) {\n return;\n }\n this.dismissed.add(chipId);\n if (!this.draft) {\n this.chips.set([]);\n return;\n }\n this.chips.set(axmMiniChatChipsFromDraft(this.draft, this.dismissed));\n }\n\n /**\n * Context for the conversation created by the first mini-chat message.\n * Empty when the user removed every chip or the page is not an entity page.\n */\n async resolveDraftLaunchContext(): Promise<AXMContextualAssistContext | undefined> {\n if (!this.capturing || this.locked()) {\n return undefined;\n }\n this.refreshLive();\n if (this.detailPending) {\n await Promise.race([\n this.detailPending,\n new Promise<void>((resolve) => setTimeout(resolve, 1500)),\n ]);\n }\n if (!this.draft || this.locked()) {\n return undefined;\n }\n return axmMiniChatLaunchContextFromDraft(this.draft, this.chips());\n }\n\n //#endregion\n\n //#region ----- Live Page -----\n\n private refreshLive(): void {\n if (!this.capturing || this.locked()) {\n return;\n }\n const page = this.pageContext.getSnapshot();\n if (page.kind === 'entity-list' && page.entity?.fullName?.trim()) {\n this.detailSeq += 1;\n this.detailPending = null;\n this.loadedDetailKey = '';\n this.applyDraft(this.draftFromList(page));\n return;\n }\n\n const detail = this.readDetailRoute();\n if (detail) {\n this.ensureDetailDraft(detail);\n return;\n }\n\n this.detailSeq += 1;\n this.detailPending = null;\n this.loadedDetailKey = '';\n this.draft = null;\n if (this.chips().length > 0) {\n this.chips.set([]);\n }\n }\n\n private draftFromList(page: AXPPageContextSnapshot): AXMMiniChatPageContextDraft | null {\n const fullName = page.entity?.fullName?.trim() ?? '';\n const parts = splitEntityFullName(fullName);\n if (!parts) {\n return null;\n }\n const entityTitle = page.entity?.title?.trim() || parts.entityName;\n const defaultViewName = page.views?.[0]?.name?.trim() ?? '';\n const viewName = page.view?.name?.trim() ?? '';\n const viewTitle = page.view?.title?.trim() || viewName;\n const includeView = Boolean(viewName && defaultViewName && viewName !== defaultViewName);\n const records = readListRecords(page);\n return {\n moduleName: parts.moduleName,\n entityName: parts.entityName,\n entityTitle,\n entityKey: fullName,\n ...(includeView ? { viewName, viewTitle } : {}),\n viewKey: includeView ? viewName : '',\n includeView,\n records,\n selectionKey: records.map((record) => record.id).join('\\0'),\n };\n }\n\n private ensureDetailDraft(route: AXMMiniChatDetailRoute): void {\n const key = `${route.moduleName}.${route.entityName}:${route.recordId}`;\n const entityKey = `${route.moduleName}.${route.entityName}`;\n const selectionKey = `detail:${route.recordId}`;\n if (!this.draft || this.draft.entityKey !== entityKey || this.draft.selectionKey !== selectionKey) {\n this.applyDraft({\n moduleName: route.moduleName,\n entityName: route.entityName,\n entityTitle: route.entityName,\n entityKey: `${route.moduleName}.${route.entityName}`,\n viewKey: '',\n includeView: false,\n records: [{ id: route.recordId, title: route.recordId }],\n selectionKey: `detail:${route.recordId}`,\n });\n }\n if (this.loadedDetailKey === key) {\n return;\n }\n this.loadedDetailKey = key;\n const seq = ++this.detailSeq;\n const pending = this.fetchDetail(route)\n .then((draft) => {\n if (seq !== this.detailSeq || this.locked() || !draft) {\n return;\n }\n this.applyDraft(draft);\n })\n .finally(() => {\n if (this.detailPending === pending) {\n this.detailPending = null;\n }\n });\n this.detailPending = pending;\n }\n\n private async fetchDetail(route: AXMMiniChatDetailRoute): Promise<AXMMiniChatPageContextDraft | null> {\n try {\n const entity = await this.entityRegistry.resolve(route.moduleName, route.entityName);\n const entityTitle =\n this.resolveText(entity.formats?.plural) || this.resolveText(entity.title) || route.entityName;\n const row = await this.entityService.withEntity(route.moduleName, route.entityName).data().byKey(route.recordId as never);\n const recordTitle = this.readRecordTitle(row) || route.recordId;\n return {\n moduleName: route.moduleName,\n entityName: route.entityName,\n entityTitle,\n entityKey: `${route.moduleName}.${route.entityName}`,\n viewKey: '',\n includeView: false,\n records: [{ id: route.recordId, title: recordTitle }],\n selectionKey: `detail:${route.recordId}`,\n };\n } catch {\n return null;\n }\n }\n\n private applyDraft(draft: AXMMiniChatPageContextDraft | null): void {\n if (this.locked()) {\n return;\n }\n if (!draft) {\n this.draft = null;\n if (this.chips().length > 0) {\n this.chips.set([]);\n }\n return;\n }\n if (draft.entityKey !== this.entityKey) {\n this.dismissed.delete(AXM_MINI_CHAT_ENTITY_CHIP_ID);\n this.entityKey = draft.entityKey;\n }\n if (draft.viewKey !== this.viewKey) {\n this.dismissed.delete(AXM_MINI_CHAT_VIEW_CHIP_ID);\n this.viewKey = draft.viewKey;\n }\n if (draft.selectionKey !== this.selectionKey) {\n for (const id of [...this.dismissed]) {\n if (id.startsWith('record:')) {\n this.dismissed.delete(id);\n }\n }\n this.selectionKey = draft.selectionKey;\n }\n this.draft = draft;\n const next = axmMiniChatChipsFromDraft(draft, this.dismissed);\n if (!axmMiniChatSameChips(this.chips(), next)) {\n this.chips.set(next);\n }\n }\n\n //#endregion\n\n //#region ----- Route & Titles -----\n\n private readDetailRoute(): AXMMiniChatDetailRoute | null {\n const params = collectRouteParams(this.router);\n const moduleName = params['module']?.trim() ?? '';\n const entityName = params['entity']?.trim() ?? '';\n const recordId = params['id']?.trim() ?? '';\n if (!moduleName || !entityName || !recordId) {\n return null;\n }\n return { moduleName, entityName, recordId };\n }\n\n private readRecordTitle(row: unknown): string {\n if (!row || typeof row !== 'object') {\n return '';\n }\n const record = row as Record<string, unknown>;\n for (const key of ['title', 'name', 'displayName']) {\n const text = this.resolveText(record[key]);\n if (text) {\n return text;\n }\n }\n return '';\n }\n\n private resolveText(value: unknown): string {\n if (typeof value === 'string') {\n const trimmed = value.trim();\n if (!trimmed) {\n return '';\n }\n if (trimmed.startsWith('@')) {\n return this.translation.translateSync(trimmed) || trimmed;\n }\n return trimmed;\n }\n if (value && typeof value === 'object') {\n return this.translation.resolve(value as AXPMultiLanguageString)?.trim() || '';\n }\n return '';\n }\n\n //#endregion\n}\n\n//#endregion\n\n//#region ----- Helpers -----\n\nfunction splitEntityFullName(fullName: string): { moduleName: string; entityName: string } | null {\n const separator = fullName.lastIndexOf('.');\n if (separator <= 0 || separator >= fullName.length - 1) {\n return null;\n }\n return {\n moduleName: fullName.slice(0, separator),\n entityName: fullName.slice(separator + 1),\n };\n}\n\nfunction readListRecords(page: AXPPageContextSnapshot): Array<{ id: string; title: string }> {\n const fromRecords = (page.selectedRecords ?? [])\n .map((record) => ({\n id: record.id?.trim() ?? '',\n title: record.title?.trim() || record.id?.trim() || '',\n }))\n .filter((record) => record.id.length > 0);\n if (fromRecords.length > 0) {\n return fromRecords;\n }\n return (page.selectedIds ?? [])\n .map((id) => id.trim())\n .filter((id) => id.length > 0)\n .map((id) => ({ id, title: id }));\n}\n\nfunction collectRouteParams(router: Router): Record<string, string> {\n const params: Record<string, string> = {};\n const visit = (node: ActivatedRouteSnapshot): void => {\n for (const key of node.paramMap.keys) {\n const value = node.paramMap.get(key);\n if (value) {\n params[key] = value;\n }\n }\n for (const child of node.children) {\n visit(child);\n }\n };\n visit(router.routerState.snapshot.root);\n return params;\n}\n\n//#endregion\n","//#region ---- Imports ----\n\nimport { AXPMultiLanguageString } from '@acorex-platform/framework-shared/core';\nimport { AXM_ASSIST_LAUNCH_CONTEXT_METADATA_KEY, axmSanitizeContextualAssistContext, type AXMContextualAssistContext } from '@acorex-platform/module-conversation-client/contracts';\nimport { AXConversationService, type AXConversation, type AXConversationMessagePayload } from '@acorex/components/conversation';\nimport { AXTranslationService } from '@acorex/core/translation';\nimport { AXMEntityChatService } from '../../../mini-chat/entity-chat.service';\nimport { axmEntityRefFromLaunchContext } from '../../../mini-chat/entity-chat.util';\nimport type { AXMChatAssistCatalogPort } from '../../services/chat-assist-catalog.port';\nimport { AXMChatConversationApi } from '../services/chat-conversation-apis.abstract';\nimport type { AXMSendAssistChatMessageOptions } from './assist-send-options.types';\nimport { axmBuildAiChatConversationMetadata, axmChatAiPeerParticipantId, axmChatAiTargetAvatarUrl, type AXMChatAiTargetRow } from './chat-ai-target.util';\n\n//#endregion\n\n//#region ---- Types ----\n\nexport interface AXMAssistStarterPromptSendDeps {\n conversationService: AXConversationService;\n conversationApi: AXMChatConversationApi;\n entityChatService: AXMEntityChatService;\n /** Required only when this send must create a new assist conversation. */\n assistCatalog?: AXMChatAssistCatalogPort;\n translationService: AXTranslationService;\n /** Header mini chat: page chips captured when the first message creates the room. */\n resolveDraftLaunchContext?: () => Promise<AXMContextualAssistContext | undefined>;\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(deps: AXMAssistStarterPromptSendDeps, text: string, options: Partial<AXMSendAssistChatMessageOptions>): Promise<{ conversationId: string } | null> {\n const trimmedText = text.trim();\n if (!trimmedText) {\n return null;\n }\n\n let conversationId = (typeof options.conversationId === 'string' ? options.conversationId.trim() : '') || deps.conversationService.activeConversationId()?.trim() || '';\n\n if (!conversationId) {\n const assistId = (typeof options.assistId === 'string' ? options.assistId.trim() : '') || (typeof options.targetId === 'string' ? options.targetId.trim() : '');\n if (!assistId) {\n return null;\n }\n\n const fromLaunch = axmEntityRefFromLaunchContext(options.launchContext);\n const entityId = (typeof options.entityId === 'string' ? options.entityId.trim() : '') || fromLaunch?.entityId || '';\n const entityType = (typeof options.entityType === 'string' ? options.entityType.trim() : '') || fromLaunch?.entityType || '';\n const launchContext = options.launchContext ?? (await deps.resolveDraftLaunchContext?.());\n\n const conversation = entityId && entityType ? await createEntityConversation(deps, { entityId, entityType }, assistId, launchContext) : await createAssistConversation(deps, assistId, launchContext);\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 launchContext?: AXMContextualAssistContext,\n): Promise<AXConversation> {\n const createData = await deps.entityChatService.buildEntityChatCreateData(\n ref,\n assistId,\n launchContext\n ? { [AXM_ASSIST_LAUNCH_CONTEXT_METADATA_KEY]: axmSanitizeContextualAssistContext(launchContext) }\n : undefined,\n );\n return deps.conversationService.createConversation(createData.participantIds, createData.type, createData.options);\n}\n\nasync function createAssistConversation(deps: AXMAssistStarterPromptSendDeps, assistId: string, launchContext?: AXMSendAssistChatMessageOptions['launchContext']): Promise<AXConversation | null> {\n const catalog = deps.assistCatalog;\n if (!catalog) {\n return null;\n }\n\n const rows = await catalog.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 = catalog.getCachedAssist(row.id) ?? (await catalog.getAssist(row.id));\n const assistSnapshot = assistRow ? catalog.toSnapshot(assistRow) : undefined;\n const metadata = axmBuildAiChatConversationMetadata(row, assistSnapshot);\n if (launchContext) {\n metadata[AXM_ASSIST_LAUNCH_CONTEXT_METADATA_KEY] = axmSanitizeContextualAssistContext(launchContext);\n }\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,\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 { translateSync } from '@acorex/core/translation';\n\n//#endregion\n\n//#region ----- Types -----\n\n/** Sync lookup used by UI that already holds {@link AXTranslationService}. */\nexport type AxmI18nTranslateSync = (key: string) => string;\n\n//#endregion\n\n//#region ----- Public API -----\n\n/**\n * Resolves a UI label that may be an i18n key (`@scope:path.to.key`) or already-plain text.\n * Composite values like `key | All Items` are resolved piece by piece.\n */\nexport function axmResolveI18nLabel(\n value: string | undefined | null,\n translate?: AxmI18nTranslateSync,\n): string {\n const trimmed = value?.trim() ?? '';\n if (!trimmed) {\n return '';\n }\n if (trimmed.includes(' | ')) {\n return trimmed\n .split(' | ')\n .map((part) => axmResolveI18nLabel(part, translate))\n .filter(Boolean)\n .join(' | ');\n }\n if (!trimmed.startsWith('@')) {\n return trimmed;\n }\n\n const fromCaller = translate?.(trimmed)?.trim();\n if (fromCaller && fromCaller !== trimmed) {\n return fromCaller;\n }\n\n const direct = translateSync(trimmed)?.trim();\n if (direct && direct !== trimmed) {\n return direct;\n }\n\n const separator = trimmed.indexOf(':');\n if (separator > 1) {\n const scope = trimmed.slice(1, separator);\n const path = trimmed.slice(separator + 1);\n const fromCallerPath = translate?.(path)?.trim();\n if (fromCallerPath && fromCallerPath !== path) {\n return fromCallerPath;\n }\n const scoped = translateSync(path, { scope })?.trim();\n if (scoped && scoped !== path) {\n return scoped;\n }\n }\n\n return fromCaller || direct || trimmed;\n}\n\n//#endregion\n","//#region ---- Imports ----\n\nimport type { AXMContextualAssistContext } from '@acorex-platform/module-conversation-client/contracts';\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 /** Merged into room metadata when a chip creates a new conversation. */\n launchContext?: AXMContextualAssistContext;\n}\n\n//#endregion\n\n//#region ---- Constants ----\n\nconst AXM_ASSIST_SUGGESTION_MAX = 3;\n\nconst ASSIST_SUGGESTION_ICON_RULES: ReadonlyArray<{ icon: string; keywords: readonly string[] }> = [\n { icon: 'fa-light fa-pen-to-square', keywords: ['update', 'edit', 'change', 'modify', 'rewrite', 'ویرایش', 'تغییر', 'بروزرسانی'] },\n { icon: 'fa-light fa-filter', keywords: ['filter', 'rate', 'preferred', 'higher', 'فیلتر'] },\n { icon: 'fa-light fa-compass', keywords: ['menu', 'feature', 'navigate', 'page', 'منو', 'قابلیت'] },\n { icon: 'fa-light fa-table-list', keywords: ['list', 'record', 'entity', 'entities', 'فهرست', 'لیست', 'رکورد'] },\n { icon: 'fa-light fa-file-lines', keywords: ['summar', 'explain', 'overview', 'describe', 'خلاصه', 'توضیح'] },\n { icon: 'fa-light fa-magnifying-glass', keywords: ['find', 'search', 'where', 'locate', 'look', 'جستجو', 'پیدا', 'کجا'] },\n { icon: 'fa-light fa-circle-plus', keywords: ['create', 'add', 'new', 'ایجاد', 'ساخت'] },\n { icon: 'fa-light fa-circle-question', keywords: ['help', 'how', 'کمک', 'چطور'] },\n];\n\nconst ASSIST_SUGGESTION_ICON_FALLBACK = [\n 'fa-light fa-comment-dots',\n 'fa-light fa-lightbulb',\n 'fa-light fa-sparkles',\n] as const;\n\n//#endregion\n\n//#region ---- Icons ----\n\n/** Picks a chip icon from the prompt text; skips icons already used in the same list. */\nexport function axmAssistSuggestionIconForLabel(\n label: string,\n index = 0,\n taken: ReadonlySet<string> = new Set(),\n): string {\n const text = label.trim().toLowerCase();\n const matched = ASSIST_SUGGESTION_ICON_RULES.find((rule) => rule.keywords.some((keyword) => text.includes(keyword)))?.icon;\n if (matched && !taken.has(matched)) {\n return matched;\n }\n\n const unusedFallback = ASSIST_SUGGESTION_ICON_FALLBACK.find((icon) => !taken.has(icon) && icon !== matched);\n if (unusedFallback) {\n return unusedFallback;\n }\n\n return ASSIST_SUGGESTION_ICON_FALLBACK[index % ASSIST_SUGGESTION_ICON_FALLBACK.length];\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 if (name === 'Entity:OpenList' || name === 'Entity:OpenDetails') {\n return name;\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).slice(0, AXM_ASSIST_SUGGESTION_MAX);\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 ...(options?.launchContext ? { launchContext: options.launchContext } : {}),\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 if (labels.length >= AXM_ASSIST_SUGGESTION_MAX) {\n break;\n }\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 } 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 { AXMMiniChatPageContextChipsService } from '../../../mini-chat/mini-chat-page-context.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 { axmResolveI18nLabel } from '../utils/assist-i18n-label.util';\nimport {\n axmAssistNormalizeFollowUpItemsForConversation,\n axmAssistResolveFollowUpCommandName,\n axmAssistSuggestionIconForLabel,\n} 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 @if (compact()) {\n <button\n type=\"button\"\n class=\"axm-assist-suggestion-chips__row\"\n role=\"listitem\"\n [disabled]=\"isInteractionBlocked()\"\n (click)=\"onChipClick(item)\"\n >\n <i class=\"{{ chipIcons()[$index] }}\" aria-hidden=\"true\"></i>\n <span class=\"axm-assist-suggestion-chips__row-text\">{{ (resolveChipLabel(item) | translate | async) ?? resolveChipLabel(item) }}</span>\n <i class=\"fa-light fa-arrow-right axm-assist-suggestion-chips__row-arrow\" aria-hidden=\"true\"></i>\n </button>\n }\n <!-- ----- Full-page starter / follow-up chips ----- -->\n @else {\n <ax-button\n class=\"axm-assist-suggestion-chips__chip rounded-full\"\n look=\"twotone\"\n [text]=\"(resolveChipLabel(item) | translate | async) ?? resolveChipLabel(item)\"\n [disabled]=\"isInteractionBlocked()\"\n (onClick)=\"onChipClick(item)\"\n ></ax-button>\n }\n }\n </div>\n }\n `,\n styles: `\n :host {\n display: block;\n width: 100%;\n }\n\n :host(.axm-assist-suggestion-chips-host--compact) {\n display: flex;\n flex-direction: column;\n min-height: 0;\n height: auto;\n overflow: hidden;\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: 0 0 auto;\n flex-direction: column;\n flex-wrap: nowrap;\n align-items: stretch;\n gap: 0.625rem;\n padding: 0;\n min-height: 0;\n overflow-y: auto;\n overscroll-behavior: contain;\n }\n\n :host(.axm-assist-suggestion-chips-host--compact) .axm-assist-suggestion-chips__row {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n width: 100%;\n min-height: 2.75rem;\n padding: 0.625rem 0.875rem;\n border-radius: 0.875rem;\n border: 1px solid rgb(var(--ax-sys-color-border-light-surface));\n background: rgb(var(--ax-sys-color-lightest-surface));\n color: rgb(var(--ax-sys-color-on-surface));\n text-align: start;\n font-size: 0.8125rem;\n font-weight: 500;\n line-height: 1.35;\n cursor: pointer;\n transition:\n background-color 160ms ease,\n border-color 160ms ease;\n }\n\n :host(.axm-assist-suggestion-chips-host--compact) .axm-assist-suggestion-chips__row:hover:not(:disabled) {\n border-color: rgba(var(--ax-sys-color-primary-500), 0.35);\n background: rgba(var(--ax-sys-color-primary-500), 0.06);\n }\n\n :host(.axm-assist-suggestion-chips-host--compact) .axm-assist-suggestion-chips__row:disabled {\n opacity: 0.55;\n cursor: default;\n }\n\n :host(.axm-assist-suggestion-chips-host--compact) .axm-assist-suggestion-chips__row > i:first-child {\n color: rgb(var(--ax-sys-color-primary-600));\n font-size: 0.875rem;\n width: 1rem;\n text-align: center;\n flex-shrink: 0;\n }\n\n :host(.axm-assist-suggestion-chips-host--compact) .axm-assist-suggestion-chips__row-text {\n flex: 1;\n min-width: 0;\n }\n\n :host(.axm-assist-suggestion-chips-host--compact) .axm-assist-suggestion-chips__row-arrow {\n opacity: 0.4;\n font-size: 0.75rem;\n flex-shrink: 0;\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 /**\n * When true, sends starter-prompt chips via the local {@link AXConversationService}\n * instead of routing to the chat app. Follow-up chips also send in-place when this\n * service already has an active conversation (header mini-chat overlay).\n */\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 protected readonly chipIcons = computed(() => {\n const taken = new Set<string>();\n return this.normalizedItems().map((item, index) => {\n const icon = axmAssistSuggestionIconForLabel(this.resolveChipLabel(item), index, taken);\n taken.add(icon);\n return icon;\n });\n });\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 pageContextChips = inject(AXMMiniChatPageContextChipsService);\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.isSendAssistChatMessageCommand(item) && this.shouldSendAssistMessageInPlace()) {\n const catalog = this.assistCatalog;\n const localConversationId = this.conversationService.activeConversationId()?.trim() ?? '';\n if (!localConversationId && !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 translationService: this.translationService,\n assistCatalog: catalog ?? undefined,\n resolveDraftLaunchContext: () => this.pageContextChips.resolveDraftLaunchContext(),\n },\n text,\n {\n ...((item.command.options ?? {}) as Partial<AXMSendAssistChatMessageOptions>),\n ...(localConversationId ? { conversationId: localConversationId } : {}),\n },\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 const options = (item.command.options ?? {}) as Record<string, unknown>;\n const payload = this.isSendAssistChatMessageCommand(item) ? { ...options, text } : { ...options };\n await this.commandService.execute(name, payload);\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 shouldSendAssistMessageInPlace(): boolean {\n return this.sendInPlace() || Boolean(this.conversationService.activeConversationId()?.trim());\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 axmResolveI18nLabel(trimmed, (key) => this.translationService.translateSync(key));\n }\n return trimmed;\n }\n return (this.translationService.resolve(label) ?? '').trim();\n }\n}\n\n//#endregion\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';\nimport { toSignal } from '@angular/core/rxjs-interop';\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 private readonly activeLang = toSignal(this.translationService.langChanges$, {\n initialValue: this.translationService.getActiveLang(),\n });\n\n //#endregion\n\n //#region ---- Computed Properties ----\n\n readonly iconClass = computed(() => iconClassForType(this.conversation().type));\n\n readonly eyebrowLabel = computed(() => {\n this.activeLang();\n return eyebrowForType(this.conversation().type, this.translationService);\n });\n\n readonly descriptionPrefix = computed(() => {\n this.activeLang();\n return descriptionPrefixForType(this.conversation().type, this.translationService);\n });\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","//#region ----- Imports -----\n\nimport { AXPMultiLanguageString } from '@acorex-platform/framework-shared/core';\nimport {\n AXM_ASSIST_LAUNCH_CONTEXT_METADATA_KEY,\n axmSanitizeContextualAssistContext,\n type AXMContextualAssistContext,\n} from '@acorex-platform/module-conversation-client/contracts';\nimport {\n AXConversationComposerService,\n AXConversationService,\n type AXConversation,\n} from '@acorex/components/conversation';\nimport { AXToastService } from '@acorex/components/toast';\nimport { AXTranslationService } from '@acorex/core/translation';\nimport { Injectable, Injector, inject, signal } from '@angular/core';\nimport { AXMEntityChatService } from '../../../mini-chat/entity-chat.service';\nimport { AXMMiniChatPageContextChipsService } from '../../../mini-chat/mini-chat-page-context.service';\nimport { axmEntityRefFromLaunchContext, type AXMEntityChatRef } from '../../../mini-chat/entity-chat.util';\nimport { AXM_CHAT_ASSIST_CATALOG_PORT } from '../../services/chat-assist-catalog.port';\nimport { AXMChatConversationApi } from '../services/chat-conversation-apis.abstract';\nimport {\n axmBuildAiChatConversationMetadata,\n axmChatAiPeerParticipantId,\n axmChatAiTargetAvatarUrl,\n type AXMChatAiTargetRow,\n} from '../utils/chat-ai-target.util';\n\n//#endregion\n\n//#region ----- Types -----\n\nexport type AXMChatEmptyAssistCreatedHandler = (conversationId: string) => void | Promise<void>;\nexport type AXMChatEmptyAssistContinue = 'none' | 'send' | 'attach';\n\nexport interface AXMChatEmptyAssistSessionBind {\n selectedAssistId?: string;\n rows?: readonly AXMChatAiTargetRow[];\n entityId?: string;\n entityType?: string;\n launchContext?: AXMContextualAssistContext;\n}\n\n//#endregion\n\n//#region ----- Service -----\n\n/**\n * Shared new-chat assist selection for the empty-state welcome UI and the real\n * {@link AXConversationComposerComponent}. Creates the assist room on first send/attach\n * so the library composer can upload files.\n */\n@Injectable({ providedIn: 'root' })\nexport class AXMChatEmptyAssistSessionService {\n //#region ----- Services & Dependencies -----\n\n private readonly injector = inject(Injector);\n private readonly conversationService = inject(AXConversationService);\n private readonly composerService = inject(AXConversationComposerService);\n private readonly entityChatService = inject(AXMEntityChatService);\n private readonly pageContextChips = inject(AXMMiniChatPageContextChipsService);\n private readonly translationService = inject(AXTranslationService);\n private readonly toastService = inject(AXToastService);\n\n //#endregion\n\n //#region ----- Lazy dependencies -----\n\n private get conversationApi(): AXMChatConversationApi {\n return this.injector.get(AXMChatConversationApi);\n }\n\n private get assistCatalog() {\n return this.injector.get(AXM_CHAT_ASSIST_CATALOG_PORT, null, { optional: true });\n }\n\n //#endregion\n\n //#region ----- State Signals -----\n\n readonly rows = signal<AXMChatAiTargetRow[]>([]);\n readonly selectedAssistId = signal<string | undefined>(undefined);\n readonly entityId = signal<string | undefined>(undefined);\n readonly entityType = signal<string | undefined>(undefined);\n readonly launchContext = signal<AXMContextualAssistContext | undefined>(undefined);\n readonly assistPickerOpen = signal(false);\n\n private ensurePromise: Promise<string | null> | null = null;\n\n //#endregion\n\n //#region ----- Public API -----\n\n bind(input: AXMChatEmptyAssistSessionBind): void {\n if (input.rows) {\n this.rows.set([...input.rows]);\n }\n this.selectedAssistId.set(input.selectedAssistId?.trim() || undefined);\n this.entityId.set(input.entityId?.trim() || undefined);\n this.entityType.set(input.entityType?.trim() || undefined);\n this.launchContext.set(input.launchContext);\n }\n\n setSelectedAssistId(assistId: string | undefined): void {\n this.selectedAssistId.set(assistId?.trim() || undefined);\n }\n\n openAssistPicker(): void {\n if (this.rows().length === 0) {\n return;\n }\n this.assistPickerOpen.set(true);\n }\n\n closeAssistPicker(): void {\n this.assistPickerOpen.set(false);\n }\n\n /**\n * Creates the assist room only when the empty-state lookalike composer actually sends,\n * then uploads any local files and delivers the first message.\n */\n sendWelcome(\n text: string,\n files: File[],\n onCreated?: AXMChatEmptyAssistCreatedHandler,\n ): Promise<string | null> {\n if (this.ensurePromise) {\n return this.ensurePromise;\n }\n this.ensurePromise = this.sendWelcomeCore(text, files, onCreated).finally(() => {\n this.ensurePromise = null;\n });\n return this.ensurePromise;\n }\n\n /**\n * Creates and selects an assist conversation when the composer has no active room,\n * restoring any in-progress draft so send/attach can continue on the real composer.\n */\n ensureConversationPreservingDraft(\n onCreated?: AXMChatEmptyAssistCreatedHandler,\n continueWith: AXMChatEmptyAssistContinue = 'none',\n ): Promise<string | null> {\n if (this.ensurePromise) {\n return this.ensurePromise;\n }\n this.ensurePromise = this.ensureConversationPreservingDraftCore(onCreated, continueWith).finally(() => {\n this.ensurePromise = null;\n });\n return this.ensurePromise;\n }\n\n //#endregion\n\n //#region ----- Conversation create -----\n\n private async ensureConversationPreservingDraftCore(\n onCreated?: AXMChatEmptyAssistCreatedHandler,\n continueWith: AXMChatEmptyAssistContinue = 'none',\n ): Promise<string | null> {\n const existingId = this.conversationService.activeConversationId()?.trim();\n if (existingId) {\n return existingId;\n }\n\n const draftText = this.composerService.draftText();\n const draftAttachments = this.composerService.draftAttachments().slice();\n\n try {\n const conversation = await this.createConversation();\n if (!conversation?.id) {\n return null;\n }\n\n this.closeAssistPicker();\n await onCreated?.(conversation.id);\n if (this.conversationService.activeConversationId() !== conversation.id) {\n await this.conversationService.selectConversation(conversation.id);\n }\n this.conversationApi.reportFocusedConversation(conversation.id);\n\n this.composerService.draftText.set(draftText);\n this.composerService.draftAttachments.set(draftAttachments);\n\n if (continueWith === 'send') {\n await this.sendRestoredDraft(conversation.id);\n } else if (continueWith === 'attach') {\n await this.composerService.browseDraftAttachments();\n }\n\n return conversation.id;\n } catch {\n const message = await this.translationService.translateAsync('@conversation:chat.empty-assist.errors.send');\n this.toastService.danger(message);\n return null;\n }\n }\n\n private async sendWelcomeCore(\n text: string,\n files: File[],\n onCreated?: AXMChatEmptyAssistCreatedHandler,\n ): Promise<string | null> {\n const trimmed = text.trim();\n if (!trimmed && files.length === 0) {\n return null;\n }\n\n try {\n const conversationId = await this.ensureConversationPreservingDraftCore(onCreated, 'none');\n if (!conversationId) {\n return null;\n }\n\n if (files.length > 0) {\n await this.composerService.addDraftAttachments(files);\n await this.waitUntilAttachmentsSettled();\n if (this.composerService.draftAttachmentsReady()) {\n const command = await this.composerService.buildDraftAttachmentCommand(trimmed || undefined);\n if (command) {\n await this.composerService.sendMessage(command);\n return conversationId;\n }\n }\n }\n\n if (trimmed) {\n await this.composerService.sendMessage({\n conversationId,\n type: 'text',\n payload: { type: 'text', text: trimmed },\n });\n }\n\n return conversationId;\n } catch {\n const message = await this.translationService.translateAsync('@conversation:chat.empty-assist.errors.send');\n this.toastService.danger(message);\n return null;\n }\n }\n\n private async waitUntilAttachmentsSettled(timeoutMs = 60_000): Promise<void> {\n const startedAt = Date.now();\n while (Date.now() - startedAt < timeoutMs) {\n const items = this.composerService.draftAttachments();\n if (items.length === 0 || items.every((item) => !item.uploading)) {\n return;\n }\n await new Promise((resolve) => setTimeout(resolve, 50));\n }\n }\n\n private async sendRestoredDraft(conversationId: string): Promise<void> {\n const attachments = this.composerService.draftAttachments();\n if (attachments.length > 0) {\n if (!this.composerService.draftAttachmentsReady()) {\n return;\n }\n const command = await this.composerService.buildDraftAttachmentCommand(this.composerService.draftText().trim() || undefined);\n if (command) {\n await this.composerService.sendMessage(command);\n }\n return;\n }\n\n const text = this.composerService.draftText().trim();\n if (!text) {\n return;\n }\n await this.composerService.sendMessage({\n conversationId,\n type: 'text',\n payload: { type: 'text', text },\n });\n }\n\n private async createConversation(): Promise<AXConversation | null> {\n const assistId = this.selectedAssistId()?.trim();\n if (!assistId) {\n return null;\n }\n\n const entityRef = this.resolveEntityChatRef();\n if (entityRef) {\n const createData = await this.entityChatService.buildEntityChatCreateData(\n entityRef,\n assistId,\n await this.launchMetadata(),\n );\n return this.conversationService.createConversation(createData.participantIds, createData.type, createData.options);\n }\n\n return this.createAssistConversation(assistId);\n }\n\n private async createAssistConversation(assistId: string): Promise<AXConversation | null> {\n const catalog = this.assistCatalog;\n if (!catalog) {\n return null;\n }\n\n const row = this.rows().find((item) => item.id === assistId);\n if (!row) {\n return null;\n }\n\n const assistRow = catalog.getCachedAssist(row.id) ?? (await catalog.getAssist(row.id));\n const assistSnapshot = assistRow ? catalog.toSnapshot(assistRow) : undefined;\n const metadata = axmBuildAiChatConversationMetadata(row, assistSnapshot);\n Object.assign(metadata, await this.launchMetadata());\n const avatar = axmChatAiTargetAvatarUrl(row);\n\n return this.conversationService.createConversation([axmChatAiPeerParticipantId(row.id)], 'bot', {\n title: this.translationService.resolve(row.title as AXPMultiLanguageString) ?? row.name,\n ...(avatar ? { avatar } : {}),\n icon: 'fa-solid fa-robot',\n metadata,\n });\n }\n\n private resolveEntityChatRef(): AXMEntityChatRef | undefined {\n const entityId = this.entityId()?.trim();\n const entityType = this.entityType()?.trim();\n if (entityId && entityType) {\n return { entityId, entityType };\n }\n return axmEntityRefFromLaunchContext(this.launchContext());\n }\n\n private async launchMetadata(): Promise<Record<string, unknown>> {\n const explicit = this.launchContext();\n const launchContext = explicit ?? (await this.pageContextChips.resolveDraftLaunchContext());\n if (!launchContext) {\n return {};\n }\n return {\n [AXM_ASSIST_LAUNCH_CONTEXT_METADATA_KEY]: axmSanitizeContextualAssistContext(launchContext),\n };\n }\n\n //#endregion\n}\n\n//#endregion\n","//#region ----- Imports -----\n\nimport { AXConversationComposerService, AXConversationService } from '@acorex/components/conversation';\nimport { DestroyRef, Directive, ElementRef, inject, input } from '@angular/core';\nimport { AXMChatEmptyAssistSessionService } from '../empty-state/chat-empty-assist-session.service';\n\n//#endregion\n\n//#region ----- Directive -----\n\n/**\n * Creates the assist conversation before the library composer sends or attaches files.\n * {@link AXConversationComposerComponent} no-ops both paths when no room is selected.\n */\n@Directive({\n selector: 'ax-conversation-composer[axmEnsureAssistConversation]',\n})\nexport class AXMChatComposerEnsureAssistConversationDirective {\n //#region ----- Services & Dependencies -----\n\n private readonly hostRef = inject(ElementRef<HTMLElement>);\n private readonly conversationService = inject(AXConversationService);\n private readonly composerService = inject(AXConversationComposerService);\n private readonly session = inject(AXMChatEmptyAssistSessionService);\n private readonly destroyRef = inject(DestroyRef);\n\n //#endregion\n\n //#region ----- Inputs -----\n\n readonly conversationCreated = input<(conversationId: string) => void | Promise<void> | undefined>(undefined, {\n alias: 'axmAssistConversationCreated',\n });\n\n //#endregion\n\n //#region ----- Lifecycle -----\n\n constructor() {\n const host = this.hostRef.nativeElement;\n const onClick = (event: MouseEvent) => {\n void this.onCaptureClick(event);\n };\n const onKeydown = (event: KeyboardEvent) => {\n void this.onCaptureKeydown(event);\n };\n host.addEventListener('click', onClick, true);\n host.addEventListener('keydown', onKeydown, true);\n this.destroyRef.onDestroy(() => {\n host.removeEventListener('click', onClick, true);\n host.removeEventListener('keydown', onKeydown, true);\n });\n }\n\n //#endregion\n\n //#region ----- Event Handlers -----\n\n private async onCaptureClick(event: MouseEvent): Promise<void> {\n if (!this.shouldEnsureConversation()) {\n return;\n }\n const target = event.target;\n if (!(target instanceof Element)) {\n return;\n }\n if (target.closest('.axm-chat-composer-assist-picker')) {\n return;\n }\n\n const isAttach = !!target.closest('.composer-attach-menu-trigger, .composer-attach-menu-panel');\n const isPrimary = !!target.closest('.composer-primary-button-slot');\n if (!isAttach && !isPrimary) {\n return;\n }\n\n const button = target.closest('ax-button, button, ax-button-item');\n if (!button) {\n return;\n }\n\n event.preventDefault();\n event.stopImmediatePropagation();\n const continueWith = isAttach ? 'attach' : this.composerService.canSend() ? 'send' : 'none';\n await this.session.ensureConversationPreservingDraft(this.conversationCreated(), continueWith);\n }\n\n private async onCaptureKeydown(event: KeyboardEvent): Promise<void> {\n if (!this.shouldEnsureConversation()) {\n return;\n }\n if (event.key !== 'Enter' || event.shiftKey || event.isComposing) {\n return;\n }\n if (!this.composerService.canSend()) {\n return;\n }\n\n event.preventDefault();\n event.stopImmediatePropagation();\n await this.session.ensureConversationPreservingDraft(this.conversationCreated(), 'send');\n }\n\n private shouldEnsureConversation(): boolean {\n return !this.conversationService.activeConversationId() && !!this.session.selectedAssistId();\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';\nimport type { AXMContextualAssistContext } from '@acorex-platform/module-conversation-client/contracts';\nimport type { AXMChatEmptyAssistCreatedHandler } from './chat-empty-assist-session.service';\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 launchContext = input<AXMContextualAssistContext | undefined>(undefined);\n readonly assistConversationCreated = input<AXMChatEmptyAssistCreatedHandler | undefined>(undefined);\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 type { AXMContextualAssistContext } from '@acorex-platform/module-conversation-client/contracts';\nimport { AXM_CHAT_EMPTY_STATE_COMPONENT } from './chat-empty-state.provider';\nimport { AXMChatEmptyStateFallbackComponent } from './chat-empty-state-fallback.component';\nimport type { AXMChatEmptyAssistCreatedHandler } from './chat-empty-assist-session.service';\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 launchContext = input<AXMContextualAssistContext | undefined>(undefined);\n readonly assistConversationCreated = input<AXMChatEmptyAssistCreatedHandler | undefined>(undefined);\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 ref.setInput('launchContext', this.launchContext());\n ref.setInput('assistConversationCreated', this.assistConversationCreated());\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 type { AXConversation } from '@acorex/components/conversation';\nimport { AXConversationService } from '@acorex/components/conversation';\nimport { AXPopupService } from '@acorex/components/popup';\nimport { inject } from '@angular/core';\n\n//#endregion\n\n//#region ----- Types -----\n\nexport interface AXMOpenChatConversationInfoPanelDialogOptions {\n conversation: AXConversation;\n popupService?: AXPopupService;\n conversationService?: AXConversationService;\n}\n\n//#endregion\n\n//#region ----- Dialog -----\n\n/**\n * Opens the conversation info panel popup for the given conversation.\n * Pass {@link AXMOpenChatConversationInfoPanelDialogOptions.popupService} and\n * {@link AXMOpenChatConversationInfoPanelDialogOptions.conversationService} from the\n * caller — popup content is created on the root view container, so `inject()` after\n * `await` or from overlay DI cannot see the chat feature's conversation service.\n */\nexport async function axmOpenChatConversationInfoPanelDialog(\n options: AXMOpenChatConversationInfoPanelDialogOptions,\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 conversationService = options.conversationService ?? inject(AXConversationService);\n const comp = (await import('./chat-conversation-info-panel.component')).AXMChatConversationInfoPanelComponent;\n\n await popupService.open(comp, {\n title: conversation.title,\n closeButton: true,\n size: 'sm',\n data: {\n conversation,\n conversationService,\n },\n });\n}\n\n//#endregion\n","//#region ---- Imports ----\n\nimport { AXConversationService } from '@acorex/components/conversation';\n\nimport type { AXMConversationAssistResponsePort } from '../../services/conversation-assist-response.port';\n\n//#endregion\n\n//#region ---- Composer stop ----\n\n/** Forwards the composer Stop click to in-flight assist cancel (server abort + SSE terminate). */\nexport function axmCancelAssistComposerGeneration(\n conversationService: AXConversationService,\n assistResponse: AXMConversationAssistResponsePort | null | undefined,\n): void {\n const conversationId = conversationService.activeConversationId()?.trim() || '';\n void assistResponse?.cancelAssistGeneration(conversationId);\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(\n conversationId: string,\n userMessageId: string,\n command: AXConversationSendMessageCommand,\n currentUserId: string,\n options?: { skipAssistSync?: boolean },\n ): 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 /** Drops in-memory assist rows (e.g. after the user edited an earlier turn). */\n forgetLiveMessages(messageIds: string[]): void;\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 { AXPLayoutThemeService, AXPThemeMode } from '@acorex-platform/framework-client/themes/shared';\nimport { AXPlatform, type AXThemeMode } from '@acorex/core/platform';\nimport { AXTranslationService } from '@acorex/core/translation';\nimport { computed, DestroyRef, effect, inject, Injectable, signal, untracked } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { distinctUntilChanged, from, skip, switchMap } from 'rxjs';\n\n//#endregion\n\n//#region ---- Service ----\n\n/**\n * Bridges platform theme/locale into `@acorex/components/conversation`.\n *\n * Showcase chat calls `AXPlatform.switchLightMode()` / `AXLocaleService.setProfile()` directly,\n * so wallpaper and `translateSync` labels update immediately. The platform shell instead\n * toggles `ax-dark` via {@link AXPLayoutThemeService} and keeps the chat page OnPush —\n * conversation computeds that depend on `AXPlatform.themeMode()` never re-run, and\n * `@acorex:chat` JSON for the new locale is not preloaded until a full refresh.\n */\n@Injectable({ providedIn: 'root' })\nexport class AXMConversationAppearanceSyncService {\n //#region ---- Services & Dependencies ----\n\n private readonly layoutTheme = inject(AXPLayoutThemeService);\n private readonly platform = inject(AXPlatform);\n private readonly translation = inject(AXTranslationService);\n private readonly destroyRef = inject(DestroyRef);\n\n //#endregion\n\n //#region ---- State Signals ----\n\n private readonly revision = signal(0);\n\n /** Stable one-item list so `@for (key of viewKeys(); track key)` remounts conversation widgets. */\n readonly viewKeys = computed(() => [this.revision()]);\n\n //#endregion\n\n //#region ---- Lifecycle ----\n\n constructor() {\n effect(() => {\n const mode = this.layoutTheme.currentMode();\n const isDark = this.layoutTheme.isDarkMode();\n untracked(() => this.syncPlatformTheme(mode, isDark));\n });\n\n this.translation.langChanges$\n .pipe(\n distinctUntilChanged(),\n skip(1),\n switchMap((lang) => from(this.preloadChatLocales(lang))),\n takeUntilDestroyed(this.destroyRef),\n )\n .subscribe(() => {\n this.revision.update((value) => value + 1);\n });\n }\n\n /** Ensures constructor effects are created at app start (called from the conversation startup task). */\n start(): void {\n this.syncPlatformTheme(this.layoutTheme.currentMode(), this.layoutTheme.isDarkMode());\n }\n\n //#endregion\n\n //#region ---- Theme ----\n\n private syncPlatformTheme(mode: AXPThemeMode, isDark: boolean): void {\n const next = this.toAxThemeMode(mode, isDark);\n if (this.platform.themeMode() === next) {\n return;\n }\n this.platform.themeMode.set(next);\n this.platform.themeMode$.next(next);\n }\n\n private toAxThemeMode(mode: AXPThemeMode, isDark: boolean): AXThemeMode {\n if (mode === AXPThemeMode.System) {\n return isDark ? 'system-dark' : 'system-light';\n }\n return isDark ? 'dark' : 'light';\n }\n\n //#endregion\n\n //#region ---- Locale ----\n\n private async preloadChatLocales(lang: string): Promise<void> {\n await Promise.all([\n this.translation.translateAsync('@acorex:chat.actions.send', { lang }),\n this.translation.translateAsync('@conversation:chat.actions.back-to-chats', { lang }),\n ]);\n }\n\n //#endregion\n}\n\n//#endregion\n","//#region ---- Imports ----\n\nimport type { AXMContextualAssistContext } from '@acorex-platform/module-conversation-client/contracts';\nimport { AXConversationComposerComponent, AXConversationContainerDirective, AXConversationInfoBarComponent, AXConversationMessageListComponent, AXConversationService } from '@acorex/components/conversation';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { AXPopupService } from '@acorex/components/popup';\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 { AXMChatComposerEnsureAssistConversationDirective } from '../chat/plugins/composer/chat-composer-ensure-assist-conversation.directive';\nimport { AXMChatEmptyStateHostComponent } from '../chat/plugins/empty-state/chat-empty-state-host.component';\nimport { axmOpenChatConversationInfoPanelDialog } from '../chat/plugins/info-bar/open-chat-conversation-info-panel.dialog';\nimport { axmCancelAssistComposerGeneration } from '../chat/plugins/utils/assist-composer-stop.util';\nimport { AXMChatConversationApi } from '../chat/plugins/services/chat-conversation-apis.abstract';\nimport { AXM_CONVERSATION_ASSIST_RESPONSE_PORT } from '../chat/services/conversation-assist-response.port';\nimport { AXMConversationAppearanceSyncService } from '../chat/services/conversation-appearance-sync.service';\n\n//#endregion\n\n//#region ---- Component ----\n\n/**\n * Compact, entity-scoped or inbox chat: renders a single conversation thread (message list)\n * with an optional info-bar and composer. Opens an existing chat by {@link chatId}, or starts\n * a new entity assist chat (created lazily on first send and tagged with `entityId` /\n * `entityType` in conversation metadata).\n *\n * Reports focus through {@link AXMChatConversationApi} so assist SSE and realtime message\n * patches reach this thread while the overlay is open.\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 AXMChatComposerEnsureAssistConversationDirective,\n ],\n})\nexport class AXMMiniChatComponent {\n //#region ---- Services & Dependencies ----\n\n private readonly conversationService = inject(AXConversationService);\n private readonly popupService = inject(AXPopupService);\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 protected readonly appearanceSync = inject(AXMConversationAppearanceSyncService);\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 /** Surface context for a new assist thread (entity-row assist chips and room metadata). */\n readonly launchContext = input<AXMContextualAssistContext | 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(() => Boolean(this.conversationService.activeConversationId()?.trim()));\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()?.trim() || null;\n if (!activeId) {\n return;\n }\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 void this.conversationService.ensureInitialized();\n this.destroyRef.onDestroy(() => {\n this.conversationApi.reportFocusedConversation(null);\n });\n }\n\n //#endregion\n\n //#region ---- UI Handlers ----\n\n /** Opens the conversation info panel when the info-bar title/avatar area is clicked. */\n onInfoBarClick(): void {\n const conversation = this.conversationService.activeConversation();\n if (!conversation?.id?.trim()) {\n return;\n }\n\n void axmOpenChatConversationInfoPanelDialog({\n conversation,\n popupService: this.popupService,\n conversationService: this.conversationService,\n });\n }\n\n /** New-chat composer created and selected a conversation; surface it to the host. */\n readonly onAssistConversationCreated = (conversationId: string) => this.onConversationCreated(conversationId);\n\n onConversationCreated(conversationId: string): void {\n this.conversationOpened.emit(conversationId);\n }\n\n /** Composer Stop — abort the in-flight assist stream for the active conversation. */\n onComposerGenerationCancelled(): void {\n axmCancelAssistComposerGeneration(this.conversationService, this.assistResponse);\n }\n\n //#endregion\n}\n\n//#endregion\n","<div axConversationContainer class=\"axm-mini-chat flex h-full min-h-0 flex-col\">\n @for (rev of appearanceSync.viewKeys(); track rev) {\n <!---->\n <!-- ----- Mini-chat widgets remount after platform locale/theme change ----- -->\n @if (showInfoBar() && hasActiveConversation()) {\n <ax-conversation-info-bar class=\"axm-mini-chat__info-bar shrink-0 shadow-sm\" (infoClick)=\"onInfoBarClick()\"></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\n [compact]=\"true\"\n [entityId]=\"entityId()\"\n [entityType]=\"entityType()\"\n [initialAssistId]=\"assistId()\"\n [launchContext]=\"launchContext()\"\n [sendStarterPromptsInPlace]=\"true\"\n [assistConversationCreated]=\"onAssistConversationCreated\"\n (conversationCreated)=\"onConversationCreated($event)\"\n />\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()) {\n <ax-conversation-composer\n axmEnsureAssistConversation\n [axmAssistConversationCreated]=\"onAssistConversationCreated\"\n class=\"axm-mini-chat__composer shrink-0\"\n [hidden]=\"!hasActiveConversation()\"\n (generationCancelled)=\"onComposerGenerationCancelled()\"\n />\n }\n }\n</div>\n","//#region ----- Imports -----\n\nimport { AXDragHandleDirective } from '@acorex/cdk/drag-drop';\nimport { AXButtonModule } from '@acorex/components/button';\nimport { AXConversationService } from '@acorex/components/conversation';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { AXPopupCaptionIconComponent } from '@acorex/components/popup';\nimport { AXChipsComponent } from '@acorex/components/chips';\nimport { AXTranslationModule } from '@acorex/core/translation';\nimport { AXLocaleService } from '@acorex/core/locale';\nimport { AXPDeviceService, AXPPageContextRegistry } from '@acorex-platform/framework-client/core';\nimport { AsyncPipe, NgTemplateOutlet } 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 { toSignal } from '@angular/core/rxjs-interop';\nimport { AXMChatConversationApi } from '../chat/plugins/services/chat-conversation-apis.abstract';\nimport {\n AXM_CONTEXTUAL_ASSIST_KIND_ENTITY_RECORD,\n type AXMContextualAssistContext,\n} from '@acorex-platform/module-conversation-client/contracts';\nimport { AXMMiniChatHistoryComponent } from './mini-chat-history.component';\nimport { AXMMiniChatInboxHistoryComponent } from './mini-chat-inbox-history.component';\nimport type {\n AXMMiniChatPanelPresentation,\n AXMMiniChatPanelScope,\n AXMMiniChatPanelSessionState,\n} from './mini-chat-panel.types';\nimport { AXMMiniChatComponent } from './mini-chat.component';\nimport { AXMMiniChatPageContextChipsService } from './mini-chat-page-context.service';\nimport { axmMiniChatContextChipIcon, type AXMMiniChatContextChipKind } from './mini-chat-page-context.util';\n\n//#endregion\n\n//#region ----- Component -----\n\n/**\n * Mini chat panel: branded window chrome, context strip, thread, and history.\n * Hosted as a popup window (header / entity pages) or embedded in a page.\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 host: {\n '[class.axm-mini-chat-panel--embedded]': 'isEmbedded()',\n },\n imports: [\n AXButtonModule,\n AXDecoratorModule,\n AXDragHandleDirective,\n AXPopupCaptionIconComponent,\n AXTranslationModule,\n AXMMiniChatComponent,\n AXMMiniChatHistoryComponent,\n AXMMiniChatInboxHistoryComponent,\n AsyncPipe,\n NgTemplateOutlet,\n AXChipsComponent,\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 pageContext = inject(AXPPageContextRegistry);\n private readonly localeService = inject(AXLocaleService);\n private readonly device = inject(AXPDeviceService);\n private readonly destroyRef = inject(DestroyRef);\n protected readonly pageContextChips = inject(AXMMiniChatPageContextChipsService);\n private readonly localeProfile = toSignal(this.localeService.profileChanged$, {\n initialValue: this.localeService.activeProfile(),\n });\n\n //#endregion\n\n //#region ----- Inputs -----\n\n readonly scope = input<AXMMiniChatPanelScope>('entity');\n readonly presentation = input<AXMMiniChatPanelPresentation>('overlay');\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<string | undefined>(undefined);\n readonly showInfoBar = input(false);\n readonly showComposer = input(true);\n readonly requestClose = input.required<() => void>();\n readonly requestMinimize = input<(() => void) | undefined>(undefined);\n readonly requestMaximize = input<(() => void) | undefined>(undefined);\n readonly requestRestore = input<(() => void) | undefined>(undefined);\n readonly isMaximized = input(false);\n readonly initialView = input<'thread' | 'history'>('thread');\n readonly initialConversationId = input<string | undefined>(undefined);\n readonly startWithNewChat = input(false);\n readonly launchContext = input<AXMContextualAssistContext | undefined>(undefined);\n readonly onSessionChange = input<(state: Pick<AXMMiniChatPanelSessionState, 'view' | 'selectedChatId'>) => void>();\n\n //#endregion\n\n //#region ----- State Signals -----\n\n protected readonly view = signal<'thread' | 'history'>('thread');\n protected readonly selectedChatId = signal<string | undefined>(undefined);\n\n //#endregion\n\n //#region ----- Computed Properties -----\n\n protected readonly isInboxScope = computed(() => this.scope() === 'inbox');\n protected readonly isEmbedded = computed(() => this.presentation() === 'embedded');\n protected readonly isRtl = computed(() => this.localeProfile()?.i18nMeta?.rtl === true);\n protected readonly canDragWindow = computed(() => !this.isEmbedded() && !this.device.isSmall());\n protected readonly canMinimize = computed(() => !this.isEmbedded() && Boolean(this.requestMinimize()));\n protected readonly canMaximize = computed(() => !this.isEmbedded() && Boolean(this.requestMaximize()));\n protected readonly canClose = computed(() => !this.isEmbedded());\n\n protected readonly isRecordAssist = computed(() => {\n const launch = this.launchContext();\n return launch?.kind === AXM_CONTEXTUAL_ASSIST_KIND_ENTITY_RECORD;\n });\n\n protected readonly workingInEntityTitle = computed(() => {\n this.localeProfile();\n if (this.isRecordAssist()) {\n return null;\n }\n const page = this.pageContext.getSnapshot();\n if (page.kind === 'entity-list' && page.title.trim()) {\n return page.title.trim();\n }\n const entityType = this.entityType()?.trim();\n if (entityType) {\n return entityType.split('.').pop() ?? entityType;\n }\n return null;\n });\n\n protected readonly workingInViewTitle = computed(() => {\n this.localeProfile();\n if (this.isRecordAssist()) {\n return null;\n }\n const page = this.pageContext.getSnapshot();\n if (page.kind !== 'entity-list') {\n return null;\n }\n const viewTitle = page.view?.title?.trim();\n return viewTitle || null;\n });\n\n protected readonly recordTitleLabel = computed(() => {\n this.localeProfile();\n const launch = this.launchContext();\n if (launch?.kind !== AXM_CONTEXTUAL_ASSIST_KIND_ENTITY_RECORD) {\n return null;\n }\n return this.readRecordTitle(launch.payload) || null;\n });\n\n protected readonly recordEntityTitle = computed(() => {\n this.localeProfile();\n const launch = this.launchContext();\n if (launch?.kind !== AXM_CONTEXTUAL_ASSIST_KIND_ENTITY_RECORD) {\n return null;\n }\n const fromPayload =\n typeof launch.payload['entityTitle'] === 'string' ? launch.payload['entityTitle'].trim() : '';\n return fromPayload || launch.title?.trim() || null;\n });\n\n protected readonly showContextBar = computed(\n () =>\n this.view() !== 'history' &&\n Boolean(this.recordTitleLabel() || this.recordEntityTitle() || this.workingInEntityTitle()),\n );\n\n protected readonly contextBarIcon = computed(() =>\n this.isRecordAssist() ? 'fa-building' : 'fa-table-list',\n );\n\n //#endregion\n\n //#region ----- Lifecycle -----\n\n ngOnInit(): void {\n this.view.set(this.initialView());\n const conversationId = this.initialConversationId()?.trim();\n this.bindPageContextChips(conversationId);\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 ----- Event Handlers -----\n\n protected closePanel(): void {\n this.syncSession();\n this.requestClose()();\n }\n\n protected minimizePanel(): void {\n this.syncSession();\n this.requestMinimize()?.();\n }\n\n protected toggleMaximizePanel(): void {\n if (this.isMaximized()) {\n this.requestRestore()?.();\n return;\n }\n this.requestMaximize()?.();\n }\n\n protected backToThread(): void {\n this.view.set('thread');\n this.syncSession();\n }\n\n protected openHistory(): void {\n this.view.set('history');\n this.syncSession();\n }\n\n protected selectChat(conversationId: string): void {\n this.selectedChatId.set(conversationId);\n this.view.set('thread');\n this.pinPageContextConversation(conversationId);\n this.conversationApi.reportFocusedConversation(conversationId);\n void this.conversationService.selectConversation(conversationId).then(() => {\n this.pinPageContextConversation(conversationId);\n });\n this.syncSession();\n }\n\n protected onConversationOpened(conversationId: string): void {\n this.selectedChatId.set(conversationId);\n this.pinPageContextConversation(conversationId);\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 if (!this.launchContext()) {\n this.pageContextChips.beginDraft();\n }\n this.syncSession();\n }\n\n protected chipIcon(kind: AXMMiniChatContextChipKind): string {\n return axmMiniChatContextChipIcon(kind);\n }\n\n protected dismissPageContextChip(chipId: string, event: Event): void {\n event.preventDefault();\n event.stopPropagation();\n this.pageContextChips.dismiss(chipId);\n }\n\n //#endregion\n\n //#region ----- Page Context Chips -----\n\n private bindPageContextChips(conversationId: string | undefined): void {\n if (this.launchContext()) {\n return;\n }\n if (conversationId && !this.startWithNewChat()) {\n this.pageContextChips.pinPending(conversationId);\n }\n this.pageContextChips.start(this.destroyRef);\n if (conversationId && !this.startWithNewChat()) {\n this.pinPageContextConversation(conversationId);\n }\n }\n\n private pinPageContextConversation(conversationId: string): void {\n if (this.launchContext()) {\n return;\n }\n const id = conversationId.trim();\n if (!id) {\n return;\n }\n this.pageContextChips.pinPending(id);\n const active = this.conversationService.activeConversation();\n const conversation =\n this.conversationService.getConversation(id) ?? (active?.id === id ? active : undefined);\n if (conversation?.id === id) {\n this.pageContextChips.pin(id, conversation.metadata as Record<string, unknown> | undefined);\n }\n }\n\n //#endregion\n\n //#region ----- Context Bar -----\n\n private readRecordTitle(payload: Record<string, unknown>): string {\n const columns = payload['columns'];\n if (!Array.isArray(columns)) {\n return '';\n }\n const preferred = new Set(['title', 'name', 'displayName']);\n for (const column of columns) {\n if (typeof column !== 'object' || column == null) {\n continue;\n }\n const rec = column as Record<string, unknown>;\n const name = typeof rec['name'] === 'string' ? rec['name'] : '';\n if (!preferred.has(name)) {\n continue;\n }\n const value = rec['value'];\n if (typeof value === 'string' && value.trim()) {\n return value.trim();\n }\n }\n return '';\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\" [class.axm-mini-chat-panel--embedded]=\"isEmbedded()\">\n <div class=\"axm-mini-chat-panel__header flex shrink-0 items-center justify-between gap-2\">\n <ng-template #brandTpl>\n @if (view() === 'history') {\n <ax-button class=\"ax-sm\" look=\"blank\" [iconOnly]=\"true\" (onClick)=\"backToThread()\" [attr.aria-label]=\"('@conversation:mini-chat.back' | translate | async) ?? ''\">\n <ax-prefix>\n <ax-icon [icon]=\"isRtl() ? 'fa-light fa-chevron-right' : 'fa-light fa-chevron-left'\"></ax-icon>\n </ax-prefix>\n </ax-button>\n }\n <!-- ----- Brand mark on the main thread ----- -->\n @else {\n <span class=\"axm-mini-chat-panel__brand-mark shrink-0\" aria-hidden=\"true\">\n <ax-icon icon=\"fa-regular fa-sparkles\"></ax-icon>\n </span>\n }\n <div class=\"min-w-0 flex flex-col\">\n <span class=\"axm-mini-chat-panel__brand-title truncate\">\n @if (view() === 'history') {\n {{ '@conversation:mini-chat.history-title' | translate | async }}\n } @else if (title()?.trim(); as panelTitle) {\n {{ (panelTitle | translate | async) ?? panelTitle }}\n }\n <!-- ----- Default branded title when the caller did not pass one ----- -->\n @else {\n {{ '@conversation:mini-chat.brand-title' | translate | async }}\n }\n </span>\n </div>\n </ng-template>\n @if (canDragWindow()) {\n <div axDragHandle class=\"axm-mini-chat-panel__brand axm-mini-chat-panel__brand--draggable min-w-0 flex items-center gap-2\">\n <ng-container [ngTemplateOutlet]=\"brandTpl\"></ng-container>\n </div>\n }\n <!-- ----- Brand without a window drag handle (embedded or small screens) ----- -->\n @else {\n <div class=\"axm-mini-chat-panel__brand min-w-0 flex items-center gap-2\">\n <ng-container [ngTemplateOutlet]=\"brandTpl\"></ng-container>\n </div>\n }\n <div class=\"axm-mini-chat-panel__header-actions flex shrink-0 items-center gap-0.5\">\n <ax-button class=\"ax-sm\" look=\"blank\" [iconOnly]=\"true\" (onClick)=\"startNewChat()\" [attr.aria-label]=\"('@conversation:mini-chat.new-chat' | translate | async) ?? ''\">\n <ax-prefix><ax-icon icon=\"fa-light fa-plus\"></ax-icon></ax-prefix>\n </ax-button>\n @if (view() !== 'history') {\n <ax-button class=\"ax-sm\" look=\"blank\" [iconOnly]=\"true\" (onClick)=\"openHistory()\" [attr.aria-label]=\"('@conversation:mini-chat.history-title' | translate | async) ?? ''\">\n <ax-prefix><ax-icon icon=\"fa-light fa-clock-rotate-left\"></ax-icon></ax-prefix>\n </ax-button>\n }\n @if (canMinimize()) {\n <ax-button class=\"ax-sm\" look=\"blank\" [iconOnly]=\"true\" (onClick)=\"minimizePanel()\" [attr.aria-label]=\"('@conversation:mini-chat.minimize' | translate | async) ?? ''\">\n <ax-prefix>\n <ax-popup-caption-icon name=\"minimize\" />\n </ax-prefix>\n </ax-button>\n }\n @if (canMaximize()) {\n <ax-button class=\"ax-sm\" look=\"blank\" [iconOnly]=\"true\" (onClick)=\"toggleMaximizePanel()\" [attr.aria-label]=\"((isMaximized() ? '@conversation:mini-chat.restore' : '@conversation:mini-chat.maximize') | translate | async) ?? ''\">\n <ax-prefix>\n <ax-popup-caption-icon [name]=\"isMaximized() ? 'restore' : 'maximize'\" />\n </ax-prefix>\n </ax-button>\n }\n @if (canClose()) {\n <ax-button class=\"ax-sm\" look=\"blank\" [iconOnly]=\"true\" (onClick)=\"closePanel()\" [attr.aria-label]=\"('@conversation:mini-chat.close' | translate | async) ?? ''\">\n <ax-prefix>\n <ax-popup-caption-icon name=\"close\" />\n </ax-prefix>\n </ax-button>\n }\n </div>\n </div>\n\n @if (launchContext()) {\n @if (showContextBar()) {\n <!-- ----- Current list or record the assist is working in ----- -->\n <div class=\"axm-mini-chat-panel__context shrink-0\">\n <i class=\"axm-mini-chat-panel__context-icon fa-light {{ contextBarIcon() }}\" aria-hidden=\"true\"></i>\n <span class=\"truncate\">\n <!---->\n <!-- ----- Record-scoped assist (entity row or details) ----- -->\n @if (isRecordAssist()) {\n @let recordTitle = recordTitleLabel();\n @let entityTitle = recordEntityTitle();\n @let entityLabel = entityTitle ? ((entityTitle | translate | async) ?? entityTitle) : '';\n @if (recordTitle) {\n {{ recordTitle }}\n @if (entityLabel) {\n · {{ entityLabel }}\n }\n } @else if (entityLabel) {\n {{ entityLabel }}\n }\n }\n <!-- ----- List page: Working in Entity | View ----- -->\n @else if (workingInEntityTitle(); as entityTitle) {\n @let entityLabel = (entityTitle | translate | async) ?? entityTitle;\n @let viewTitle = workingInViewTitle();\n @let viewLabel = viewTitle ? ((viewTitle | translate | async) ?? viewTitle) : '';\n @let place = viewLabel ? entityLabel + ' | ' + viewLabel : entityLabel;\n {{ '@conversation:mini-chat.working-in' | translate: { params: { place } } | async }}\n }\n </span>\n </div>\n }\n }\n <!-- ----- Page chips when the header chat is not opened from another surface ----- -->\n @else if (view() !== 'history' && pageContextChips.chips().length > 0) {\n <!-- ----- Entity, view, and selected records for this chat ----- -->\n <div class=\"axm-mini-chat-panel__context axm-mini-chat-panel__context--chips shrink-0\">\n @for (chip of pageContextChips.chips(); track chip.id) {\n <ax-chips class=\"ax-sm\" look=\"outline\" color=\"primary\" [text]=\"chip.label\">\n <ax-prefix>\n <ax-icon [icon]=\"chipIcon(chip.kind)\"></ax-icon>\n </ax-prefix>\n <!--------------------------------------------------------------->\n <!-- ----- Remove this chip until the next page or selection change ----- -->\n @if (!pageContextChips.locked()) {\n <ax-suffix>\n <button\n type=\"button\"\n class=\"axm-mini-chat-panel__chip-close\"\n (click)=\"dismissPageContextChip(chip.id, $event)\"\n [attr.aria-label]=\"('@conversation:mini-chat.close' | translate | async) ?? ''\"\n >\n <ax-icon icon=\"fa-light fa-xmark\"></ax-icon>\n </button>\n </ax-suffix>\n }\n </ax-chips>\n }\n </div>\n }\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 (conversationSelected)=\"selectChat($event)\" />\n }\n <!-- ----- Entity-bound history when the panel is opened from a record ----- -->\n @else {\n <axm-mini-chat-history [entityId]=\"entityId()!\" [entityType]=\"entityType()!\" (conversationSelected)=\"selectChat($event)\" />\n }\n </div>\n }\n <!-- ----- Active thread ----- -->\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 [launchContext]=\"launchContext()\"\n [showInfoBar]=\"showInfoBar()\"\n [showComposer]=\"showComposer()\"\n (conversationOpened)=\"onConversationOpened($event)\"\n />\n </div>\n }\n</div>\n","//#region ----- Imports -----\n\nimport { AXPopupComponentBase } from '@acorex/components/popup';\nimport { afterNextRender, ChangeDetectionStrategy, Component, DestroyRef, inject, ViewEncapsulation } from '@angular/core';\nimport type { AXMContextualAssistContext } from '@acorex-platform/module-conversation-client/contracts';\nimport { AXMMiniChatPanelComponent } from './mini-chat-panel.component';\nimport type {\n AXMMiniChatPanelScope,\n AXMMiniChatPanelSessionState,\n AXMMiniChatPopupWindowApi,\n} from './mini-chat-panel.types';\n\n//#endregion\n\n//#region ----- Component -----\n\n/**\n * Popup host for mini chat: custom chrome lives in {@link AXMMiniChatPanelComponent},\n * while this wrapper receives popup `data` and exposes minimize/maximize/close on the window.\n */\n@Component({\n selector: 'axm-mini-chat-popup-window',\n templateUrl: './mini-chat-popup-window.component.html',\n styleUrls: ['./mini-chat-popup-window.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [AXMMiniChatPanelComponent],\n host: {\n class: 'axm-mini-chat-popup-window block h-full',\n },\n})\nexport class AXMMiniChatPopupWindowComponent extends AXPopupComponentBase {\n //#region ----- Services & Dependencies -----\n\n private readonly destroyRef = inject(DestroyRef);\n\n //#endregion\n\n //#region ----- Popup Data -----\n\n scope: AXMMiniChatPanelScope = 'entity';\n entityId?: string;\n entityType?: string;\n assistId?: string;\n panelTitle?: string;\n showInfoBar = false;\n showComposer = true;\n initialView: 'thread' | 'history' = 'thread';\n initialConversationId?: string;\n startWithNewChat = false;\n launchContext?: AXMContextualAssistContext;\n onSessionChange?: (state: Pick<AXMMiniChatPanelSessionState, 'view' | 'selectedChatId'>) => void;\n registerWindow?: (api: AXMMiniChatPopupWindowApi | null) => void;\n\n //#endregion\n\n //#region ----- Window API -----\n\n protected readonly closeFn = (): void => {\n this.close();\n };\n\n protected readonly minimizeFn = (): void => {\n this.minimize();\n };\n\n protected readonly maximizeFn = (): void => {\n this.maximize();\n };\n\n protected readonly restoreFn = (): void => {\n this.restore();\n };\n\n private readonly windowApi: AXMMiniChatPopupWindowApi = {\n close: () => this.close(),\n restore: () => this.restore(),\n minimize: () => this.minimize(),\n maximize: () => this.maximize(),\n isMinimized: () => this.isMinimized(),\n isMaximized: () => this.isMaximized(),\n };\n\n //#endregion\n\n //#region ----- Lifecycle -----\n\n constructor() {\n super();\n afterNextRender(() => {\n this.registerWindow?.(this.windowApi);\n });\n this.destroyRef.onDestroy(() => {\n this.registerWindow?.(null);\n });\n }\n\n //#endregion\n}\n\n//#endregion\n","<axm-mini-chat-panel\n class=\"block h-full min-h-0\"\n [scope]=\"scope\"\n [entityId]=\"entityId\"\n [entityType]=\"entityType\"\n [assistId]=\"assistId\"\n [title]=\"panelTitle\"\n [showInfoBar]=\"showInfoBar\"\n [showComposer]=\"showComposer\"\n [presentation]=\"'overlay'\"\n [initialView]=\"initialView\"\n [initialConversationId]=\"initialConversationId\"\n [startWithNewChat]=\"startWithNewChat\"\n [launchContext]=\"launchContext\"\n [onSessionChange]=\"onSessionChange\"\n [requestClose]=\"closeFn\"\n [requestMinimize]=\"minimizeFn\"\n [requestMaximize]=\"maximizeFn\"\n [requestRestore]=\"restoreFn\"\n [isMaximized]=\"isMaximized()\"\n/>\n","//#region ---- Imports ----\n\nimport { axmSanitizeContextualAssistContext } from '@acorex-platform/module-conversation-client/contracts';\nimport { AXConversationService } from '@acorex/components/conversation';\nimport { AXPopupService } from '@acorex/components/popup';\nimport { AXTranslationService } from '@acorex/core/translation';\nimport { Injectable, inject, signal } from '@angular/core';\nimport { AXMChatConversationApi } from '../chat/plugins/services/chat-conversation-apis.abstract';\nimport { AXMConversationFocusService } from '../chat/services/conversation-focus.service';\nimport type { AXMMiniChatPanelOpenOptions, AXMMiniChatPanelSessionState, AXMMiniChatPopupWindowApi, AXMMiniChatPopupWindowData } from './mini-chat-panel.types';\nimport { AXM_MINI_CHAT_INBOX_SESSION_KEY, AXM_MINI_CHAT_POPUP_DOCK } from './mini-chat-panel.types';\nimport { AXMMiniChatPopupWindowComponent } from './mini-chat-popup-window.component';\n\n//#endregion\n\n//#region ---- Service ----\n\n/**\n * Opens the shared mini chat window via {@link AXPopupService} (header inbox, entity FAB, contextual assist).\n * Uses the module {@link AXConversationService} so assist SSE patches stream live.\n * Stays mounted across route changes; minimize hides the overlay and docks a tab in the footer.\n * Restores the last conversation per session 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 popupService = inject(AXPopupService);\n private readonly translation = inject(AXTranslationService);\n private readonly conversationService = inject(AXConversationService);\n private readonly conversationApi = inject(AXMChatConversationApi);\n private readonly focusService = inject(AXMConversationFocusService);\n\n //#endregion\n\n //#region ---- Private Properties ----\n\n private windowApi: AXMMiniChatPopupWindowApi | null = null;\n private closePromise: Promise<unknown> | null = null;\n private windowGeneration = 0;\n\n /** Active conversation before the panel took over selection (entity scope; restored on close). */\n private savedActiveConversationId: string | null | undefined;\n\n /** Root focus id before the panel opened (restored so assist/realtime keep the right thread). */\n private savedFocusedConversationId: 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 (true while the window exists, including minimized). */\n readonly panelOpen = signal(false);\n\n //#endregion\n\n //#region ---- Public Methods ----\n\n /** True while the mini chat window is mounted (visible or minimized). */\n isOpen(): boolean {\n return this.panelOpen();\n }\n\n /** Closes the window when it is open. */\n close(): void {\n this.windowApi?.close();\n }\n\n /** Toggles the inbox mini chat window (regular non-entity conversations). */\n toggleInbox(options: Omit<AXMMiniChatPanelOpenOptions, 'scope' | 'entityId' | 'entityType'> = {}): void {\n this.toggle({ ...options, scope: 'inbox' });\n }\n\n /**\n * Toggles the window: restores when minimized, closes when visible, opens when closed.\n */\n toggle(options: AXMMiniChatPanelOpenOptions): void {\n if (this.windowApi?.isMinimized()) {\n this.windowApi.restore();\n return;\n }\n if (this.isOpen()) {\n this.close();\n return;\n }\n void this.open(options);\n }\n\n /**\n * Opens the mini chat window (replaces any existing window).\n * Restores the last session for the entity unless {@link AXMMiniChatPanelOpenOptions.forceNewChat} is set.\n */\n async open(options: AXMMiniChatPanelOpenOptions): Promise<void> {\n this.abandonOpenWindow();\n\n const scope = options.scope ?? 'entity';\n const generation = this.windowGeneration;\n\n this.captureFocusedConversation();\n this.captureActiveConversation();\n\n const entityKey = this.buildSessionKey(options, scope);\n\n const session = this.sessions.get(entityKey);\n const restoreSession = Boolean(session?.hasOpened) && !options.forceNewChat;\n const startWithNewChat = !restoreSession;\n\n const initialView = restoreSession ? session!.view : 'thread';\n const initialConversationId = restoreSession ? session!.selectedChatId : undefined;\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 data: AXMMiniChatPopupWindowData = {\n scope,\n entityId: options.entityId,\n entityType: options.entityType,\n assistId: options.assistId,\n panelTitle: options.title,\n showInfoBar: options.showInfoBar ?? false,\n showComposer: options.showComposer ?? true,\n initialView,\n initialConversationId,\n startWithNewChat,\n launchContext: options.launchContext ? axmSanitizeContextualAssistContext(options.launchContext) : undefined,\n onSessionChange,\n registerWindow: (api) => {\n this.windowApi = api;\n },\n };\n\n const title = await this.resolveWindowTitle(options.title);\n\n try {\n const closed = this.popupService.open(AXMMiniChatPopupWindowComponent, {\n header: false,\n footer: false,\n draggable: true,\n hasBackdrop: false,\n closeButton: false,\n closeOnBackdropClick: false,\n closeOnEscape: true,\n size: 'sm',\n title,\n panelClass: ['axm-mini-chat-popup'],\n resizable: {\n handles: ['top-end', 'bottom-end'],\n minWidth: 320,\n minHeight: 280,\n },\n buttons: {\n close: false,\n maximize: true,\n minimize: {\n enable: true,\n position: 'bottom-right',\n dock: AXM_MINI_CHAT_POPUP_DOCK,\n },\n },\n data,\n });\n\n this.closePromise = closed;\n this.panelOpen.set(true);\n void closed.finally(() => {\n if (generation !== this.windowGeneration) {\n return;\n }\n this.closePromise = null;\n this.windowApi = null;\n this.finishWindowClose();\n });\n } catch {\n this.windowApi = null;\n this.closePromise = null;\n this.finishWindowClose();\n }\n }\n\n //#endregion\n\n //#region ---- Utility Methods ----\n\n private async resolveWindowTitle(title?: string): Promise<string> {\n const trimmed = title?.trim();\n if (trimmed?.startsWith('@')) {\n return this.translation.translateAsync(trimmed);\n }\n if (trimmed) {\n return trimmed;\n }\n return this.translation.translateAsync('@conversation:mini-chat.brand-title');\n }\n\n private buildSessionKey(options: AXMMiniChatPanelOpenOptions, scope: string): string {\n if (options.launchContext) {\n const payload = options.launchContext.payload;\n const recordId = typeof payload['recordId'] === 'string' ? payload['recordId'].trim() : '';\n return `__contextual__:${options.launchContext.kind}:${options.launchContext.actionName}:${recordId}`;\n }\n\n if (scope === 'inbox') {\n return AXM_MINI_CHAT_INBOX_SESSION_KEY;\n }\n\n return this.buildEntityKey(options.entityType!.trim(), options.entityId!.trim());\n }\n\n private buildEntityKey(entityType: string, entityId: string): string {\n return `${entityType}:${entityId}`;\n }\n\n private abandonOpenWindow(): void {\n if (!this.panelOpen() && !this.windowApi) {\n return;\n }\n this.windowGeneration += 1;\n const api = this.windowApi;\n this.windowApi = null;\n this.closePromise = null;\n api?.close();\n this.panelOpen.set(false);\n }\n\n private finishWindowClose(): void {\n if (this.savedActiveConversationId !== undefined) {\n this.restoreActiveConversation();\n }\n this.restoreFocusedConversation();\n this.panelOpen.set(false);\n }\n\n private captureActiveConversation(): void {\n this.savedActiveConversationId = this.conversationService.activeConversationId();\n }\n\n private captureFocusedConversation(): void {\n this.savedFocusedConversationId = this.focusService.getFocusedConversationId();\n }\n\n private restoreFocusedConversation(): void {\n if (this.savedFocusedConversationId === undefined) {\n return;\n }\n\n const conversationId = this.savedFocusedConversationId;\n this.savedFocusedConversationId = undefined;\n this.conversationApi.reportFocusedConversation(conversationId);\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(typeof conversationId === 'string' ? conversationId : null);\n void this.conversationService.selectConversation(conversationId as never);\n }\n\n //#endregion\n}\n\n//#endregion\n","//#region ----- Imports -----\n\nimport { Injectable, signal } from '@angular/core';\n\n//#endregion\n\n//#region ----- Service -----\n\n/**\n * Tracks callIds with an open or accepted session so duplicate invite packets\n * do not reopen the incoming-call UI or restart the ringer.\n */\n@Injectable({ providedIn: 'root' })\nexport class AXMChatCallActiveSessionService {\n private readonly activeCallIds = new Set<string>();\n private readonly participantIdsByCall = new Map<string, Set<string>>();\n\n /** True while any call-session popup is open (blocks chat route selection takeover). */\n readonly engaged = signal(false);\n\n engage(callId: string | null | undefined): void {\n const id = callId?.trim();\n if (id) {\n this.activeCallIds.add(id);\n this.#syncEngaged();\n }\n }\n\n release(callId: string | null | undefined): void {\n const id = callId?.trim();\n if (id) {\n this.activeCallIds.delete(id);\n this.participantIdsByCall.delete(id);\n this.#syncEngaged();\n }\n }\n\n #syncEngaged(): void {\n this.engaged.set(this.activeCallIds.size > 0);\n }\n\n isEngaged(callId: string | null | undefined): boolean {\n const id = callId?.trim();\n return Boolean(id && this.activeCallIds.has(id));\n }\n\n addParticipant(callId: string | null | undefined, userId: string | null | undefined): void {\n const scopedCallId = callId?.trim();\n const scopedUserId = userId?.trim();\n if (!scopedCallId || !scopedUserId) {\n return;\n }\n const members = this.participantIdsByCall.get(scopedCallId) ?? new Set<string>();\n members.add(scopedUserId);\n this.participantIdsByCall.set(scopedCallId, members);\n }\n\n addParticipants(callId: string | null | undefined, userIds: string[]): void {\n for (const userId of userIds) {\n this.addParticipant(callId, userId);\n }\n }\n\n getParticipantIds(callId: string | null | undefined): string[] {\n const scopedCallId = callId?.trim();\n if (!scopedCallId) {\n return [];\n }\n return [...(this.participantIdsByCall.get(scopedCallId) ?? [])];\n }\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","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, signal } 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 host: {\n '[class.fab-menu-open]': 'fabMenuOpen()',\n },\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\n class=\"new-conversation-fab\"\n [popupStyle]=\"'box'\"\n #fab\n (onOpened)=\"onFabOpened()\"\n (onClosed)=\"onFabClosed()\"\n >\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 transform: translateY(9rem);\n transition: transform 200ms;\n }\n\n :host-context(.group:hover),\n :host(.fab-menu-open) {\n transform: translateY(0);\n }\n\n /** Matches {@link AXPDeviceService} mobile breakpoint; touch has no reliable sidebar hover. */\n @media (max-width: 600px) {\n :host {\n transform: translateY(0);\n }\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 /** Keeps the FAB trigger visible while its popover menu is open (popover is outside sidebar hover). */\n protected readonly fabMenuOpen = signal(false);\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 protected onFabOpened(): void {\n this.fabMenuOpen.set(true);\n }\n\n protected onFabClosed(): void {\n this.fabMenuOpen.set(false);\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 { AXPStateMessageComponent, 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 { ChangeDetectionStrategy, Component, computed, DestroyRef, effect, inject, signal, ViewEncapsulation } from '@angular/core';\nimport { takeUntilDestroyed, toSignal } from '@angular/core/rxjs-interop';\nimport { ActivatedRoute, NavigationEnd } from '@angular/router';\nimport { filter, map } from 'rxjs';\nimport { AXM_CHAT_BADGE_KEY } from '../../badge.provider';\nimport { axmIsConversationChatUrl } from './plugins/utils/conversation-chat-url.util';\nimport { axmIsChannelRoom } from '@acorex-platform/module-conversation-client/contracts';\nimport { AXMMiniChatPanelService } from '../mini-chat/mini-chat-panel.service';\nimport { AXMChatCallActiveSessionService } from './plugins/call/chat-call-active-session.service';\nimport { AXMAssistChatDebugModeService } from './plugins/actions/assist-chat-debug-mode.service';\nimport { AXMChatAssistComposerStarterPromptsComponent } from './plugins/composer/chat-assist-composer-starter-prompts.component';\nimport { AXMChatComposerEnsureAssistConversationDirective } from './plugins/composer/chat-composer-ensure-assist-conversation.directive';\nimport { AXMChatEmptyStateHostComponent } from './plugins/empty-state/chat-empty-state-host.component';\nimport { AXM_CONVERSATION_ASSIST_RESPONSE_PORT } from './services/conversation-assist-response.port';\nimport { axmCancelAssistComposerGeneration } from './plugins/utils/assist-composer-stop.util';\nimport { AXMChatConversationApi } from './plugins/services/chat-conversation-apis.abstract';\nimport { axmOpenChatConversationInfoPanelDialog } from './plugins/info-bar/open-chat-conversation-info-panel.dialog';\nimport { AXMChatSidebarNewActionsComponent } from './plugins/side-bar/chat-sidebar-new-actions.component';\nimport { AXMConversationAppearanceSyncService } from './services/conversation-appearance-sync.service';\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 AXPStateMessageComponent,\n AXPThemeLayoutBlockComponent,\n AXPThemeLayoutStartSideComponent,\n AXMChatSidebarNewActionsComponent,\n AXMChatEmptyStateHostComponent,\n AXMChatAssistComposerStarterPromptsComponent,\n AXMChatComposerEnsureAssistConversationDirective,\n ],\n host: {\n '(keydown.escape)': 'onContainerEscape()',\n '[tabindex]': '\"-1\"',\n '[class.axm-chat--announcements]': 'isAnnouncementChannelActive()',\n '[class.axm-chat--composer-hidden]': 'hidePageComposer()',\n },\n})\nexport class AXMChatComponent extends AXPPageLayoutBaseComponent {\n //#region ---- Services & Dependencies ----\n\n private readonly conversationService = inject(AXConversationService);\n private readonly popupService = inject(AXPopupService);\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 activeCallSessions = inject(AXMChatCallActiveSessionService);\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 badgeService = inject(AXPTaskBadgeService);\n protected readonly deviceService = inject(AXPDeviceService);\n private readonly destroyRef = inject(DestroyRef);\n protected readonly appearanceSync = inject(AXMConversationAppearanceSyncService);\n private readonly routeConversationId = toSignal(this.activatedRoute.paramMap.pipe(map((params) => params.get('id'))), { initialValue: this.activatedRoute.snapshot.paramMap.get('id') });\n private readonly routerUrl = signal(this.router.url);\n\n #trackRouterUrl = this.router.events\n .pipe(\n filter((event): event is NavigationEnd => event instanceof NavigationEnd),\n takeUntilDestroyed(this.destroyRef),\n )\n .subscribe(() => {\n this.routerUrl.set(this.router.url);\n });\n\n #releaseFocusOnDestroy = this.destroyRef.onDestroy(() => {\n if (!this.miniChatPanelService.panelOpen()) {\n this.chatConversationApi.reportFocusedConversation(null);\n }\n });\n\n /**\n * Keeps conversation state aligned with the current route id.\n * This handles deep links, browser back/forward, and route reuse.\n * Cached chat tabs must not keep \"focus\" after the user leaves — otherwise\n * inbox notifications and the Conversations badge skip incoming messages.\n */\n #syncConversationWithRoute = effect(() => {\n if (this.miniChatPanelService.panelOpen()) {\n return;\n }\n if (this.activeCallSessions.engaged()) {\n return;\n }\n\n if (!this.#isChatPageShowing()) {\n this.chatConversationApi.reportFocusedConversation(null);\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 Boolean(this.conversationService.activeConversationId()?.trim());\n });\n\n readonly hidePageComposer = computed(() => !this.hasActiveConversation() || this.isAnnouncementChannelActive());\n\n readonly showChatList = computed(() => {\n return this.deviceService.isMobileDevice() && !this.hasActiveConversation();\n });\n\n readonly isAnnouncementChannelActive = computed(() => {\n return axmIsChannelRoom(this.conversationService.activeConversation());\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 ---- UI Handlers ----\n\n /**\n * Handles conversation selection from the sidebar.\n * Navigates to the selected conversation route.\n * @param conversationId - The ID of the selected conversation.\n */\n readonly onAssistConversationCreated = (conversationId: string) => this.onConversationSelected(conversationId);\n\n async onConversationSelected(conversationId: string): Promise<void> {\n const routeConversationId = this.routeConversationId();\n\n if (routeConversationId !== conversationId) {\n // URL is the source of truth; #syncConversationWithRoute selects the conversation.\n await this.router.navigate([this.#getAppRouteSegment(), 'chat', conversationId]);\n return;\n }\n if (this.conversationService.activeConversationId() !== conversationId) {\n await this.conversationService.selectConversation(conversationId);\n }\n }\n\n /** Mobile back: return to the full-screen conversation list (no layout sidebar). */\n openChatList(): void {\n this.#navigateToChatRoot();\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 axmOpenChatConversationInfoPanelDialog({\n conversation,\n popupService: this.popupService,\n conversationService: this.conversationService,\n });\n }\n\n /** Composer Stop — abort the in-flight assist stream for the active conversation. */\n onComposerGenerationCancelled(): void {\n axmCancelAssistComposerGeneration(this.conversationService, this.assistResponse);\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 * 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 /**\n * False when this cached chat instance is detached (another tab/page is showing).\n */\n #isChatPageShowing(): boolean {\n const pageKey = this.getPageTabKey();\n const activeKey = this.tabNavigation.activeKey();\n if (this.tabNavigation.effectiveMode() === 'tabular' && pageKey && activeKey && pageKey !== activeKey) {\n return false;\n }\n return axmIsConversationChatUrl(this.routerUrl());\n }\n\n //#endregion\n}\n","<axp-page-layout #container axConversationContainer>\n <!-- ----- Desktop sidebar only; mobile uses full-screen list + back navigation ----- -->\n @if (!deviceService.isMobileDevice()) {\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 @for (rev of appearanceSync.viewKeys(); track rev) {\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 (conversationCreated)=\"onConversationSelected($event)\" />\n </div>\n </ax-suffix>\n </ax-conversation-sidebar>\n </div>\n }\n </axp-layout-content>\n </axp-layout-start-side>\n }\n\n <!-- ----- Chat content: list on mobile when idle; conversation + back when selected ----- -->\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 <!-- ----- 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\">\n <div ax-conversation-message-list-no-active class=\"block\" style=\"width: min(95%, 50rem)\">\n <axm-chat-empty-state-host\n [assistConversationCreated]=\"onAssistConversationCreated\"\n (conversationCreated)=\"onConversationSelected($event)\"\n />\n </div>\n <!-- ----- Assist starter prompts for empty chats ----- -->\n @if (!isAnnouncementChannelActive()) {\n <axm-chat-assist-composer-starter-prompts ax-conversation-message-list-empty />\n }\n <!-- ----- Empty announcements feed ----- -->\n @else {\n <div ax-conversation-message-list-empty class=\"axm-chat-announcements-empty\">\n <axp-state-message\n mode=\"empty\"\n icon=\"fa-light fa-bullhorn\"\n title=\"@conversation:pages.feed.empty-title\"\n description=\"@conversation:pages.feed.empty-description\"\n />\n </div>\n }\n </ax-conversation-message-list>\n </div>\n }\n </axp-page-content>\n\n <!-- ----- Always project the footer so page-layout can show it; hide via host class when idle/announcements ----- -->\n <axp-page-footer class=\"block\">\n @if (!isAnnouncementChannelActive()) {\n <ax-conversation-composer\n axmEnsureAssistConversation\n [axmAssistConversationCreated]=\"onAssistConversationCreated\"\n (generationCancelled)=\"onComposerGenerationCancelled()\"\n />\n }\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 type { AXConversationMessage, AXConversationMessagePayload } from '@acorex/components/conversation';\nimport { resolveMultiLanguageString } from '@acorex-platform/framework-shared/core';\nimport type { AXMChannelFeedItem } from '@acorex-platform/module-conversation-client/contracts';\nimport {\n AXM_CONVERSATION_ANNOUNCEMENT_FEED_ITEM_META_KEY,\n AXM_CONVERSATION_ANNOUNCEMENT_MESSAGE_TYPE,\n AXM_CONVERSATION_CHANNEL_POST_ID_META_KEY,\n} from '@acorex-platform/module-conversation-client/contracts';\n\nimport { axmCoerceDate } from './conversation-time.util';\n\n//#endregion\n\n//#region ----- Constants -----\n\n/** Legacy bulletin-management metadata key kept so existing chat messages still render. */\nconst LEGACY_BULLETIN_FEED_ITEM_META_KEY = 'bulletinFeedItem';\n\n//#endregion\n\n//#region ----- Mapping -----\n\nfunction readFeedItemMetadata(\n message: AXConversationMessage,\n): unknown {\n return (\n message.metadata?.[AXM_CONVERSATION_ANNOUNCEMENT_FEED_ITEM_META_KEY] ??\n message.metadata?.[LEGACY_BULLETIN_FEED_ITEM_META_KEY]\n );\n}\n\n/** Reads the channel feed projection stored on a chat message. */\nexport function axmReadChannelFeedItem(\n message: AXConversationMessage | null | undefined,\n): AXMChannelFeedItem | null {\n if (!message) {\n return null;\n }\n const raw = readFeedItemMetadata(message);\n if (!raw || typeof raw !== 'object') {\n return null;\n }\n const item = raw as AXMChannelFeedItem;\n return typeof item.id === 'string' && item.id.trim() ? item : null;\n}\n\n/** @deprecated Prefer {@link axmReadChannelFeedItem}. */\nexport const axmReadBulletinFeedItem = axmReadChannelFeedItem;\n\n/** Maps a channel feed row to a conversation message the custom renderer can handle. */\nexport function axmChannelFeedItemToMessage(\n item: AXMChannelFeedItem,\n conversationId: string,\n locale: string,\n): AXConversationMessage {\n const title = resolveMultiLanguageString(item.title, locale);\n return {\n id: item.id,\n conversationId,\n senderId: item.authorUserId,\n type: AXM_CONVERSATION_ANNOUNCEMENT_MESSAGE_TYPE,\n timestamp: axmCoerceDate(item.publishedAt),\n payload: { type: 'text', text: title } as AXConversationMessagePayload,\n status: item.isRead ? 'read' : 'delivered',\n reactions: [],\n pinned: item.isPinned,\n metadata: {\n [AXM_CONVERSATION_CHANNEL_POST_ID_META_KEY]: item.id,\n [AXM_CONVERSATION_ANNOUNCEMENT_FEED_ITEM_META_KEY]: item,\n },\n };\n}\n\n/** @deprecated Prefer {@link axmChannelFeedItemToMessage}. */\nexport const axmBulletinFeedItemToMessage = axmChannelFeedItemToMessage;\n\nexport function axmIsBulletinFeedMessage(message: AXConversationMessage): boolean {\n return (\n message.type === AXM_CONVERSATION_ANNOUNCEMENT_MESSAGE_TYPE || axmReadChannelFeedItem(message) !== null\n );\n}\n\n//#endregion\n","//#region ----- Imports -----\n\nimport type { AXConversationParticipant } from '@acorex/components/conversation';\n\n//#endregion\n\n//#region ----- Constants -----\n\n/**\n * Placeholder participant id used only to make `participants.length` match the\n * tenant directory size. Presence treats `system` as not watchable.\n */\nexport const AXM_ANNOUNCEMENT_SUBSCRIBER_PAD_ID = 'system';\n\n//#endregion\n\n//#region ----- Display count -----\n\nexport function axmIsAnnouncementSubscriberPad(\n participant: { id?: string | null } | null | undefined,\n): boolean {\n return participant?.id?.trim() === AXM_ANNOUNCEMENT_SUBSCRIBER_PAD_ID;\n}\n\n/**\n * Pads (or trims pads on) the in-memory participant list so channel UIs that\n * read `participants.length` show the tenant subscriber count.\n * Does not persist; stored rooms keep the real membership row(s).\n */\nexport function axmWithAnnouncementSubscriberCount(\n participants: AXConversationParticipant[] | null | undefined,\n count: number,\n): AXConversationParticipant[] {\n const real = (participants ?? []).filter((participant) => !axmIsAnnouncementSubscriberPad(participant));\n const target = Math.max(0, Math.floor(count));\n if (target <= real.length) {\n return real;\n }\n const next = real.slice();\n while (next.length < target) {\n next.push({\n id: AXM_ANNOUNCEMENT_SUBSCRIBER_PAD_ID,\n name: '',\n role: 'member',\n });\n }\n return next;\n}\n\n//#endregion\n","//#region ----- Imports -----\n\nimport { AXPSessionService } from '@acorex-platform/framework-client/auth';\nimport { AXPFilterOperatorMiddlewareService } from '@acorex-platform/framework-client/common';\nimport { AXPEntityService } from '@acorex-platform/framework-client/layout/entity';\nimport { AXPQueryService } from '@acorex-platform/framework-client/runtime';\nimport { runtimeQueryCollectionData, runtimeQueryObjectData } from '@acorex-platform/framework-shared/core';\nimport { AXTranslationService } from '@acorex/core/translation';\nimport { AXLocaleService } from '@acorex/core/locale';\nimport type {\n AXConversation,\n AXConversationMessage,\n AXConversationPaginatedResult,\n AXConversationPagination,\n} from '@acorex/components/conversation';\nimport { inject, Injectable } from '@angular/core';\nimport {\n AXM_CONVERSATION_ANNOUNCEMENT_FEED_ITEM_META_KEY,\n AXPCollaborationPermissionKeys,\n AXPConversationQueryKeys,\n AXMConversationRoom,\n AXM_CONVERSATION_ANNOUNCEMENT_CHANNEL_NAME,\n axmAnnouncementChannelMetadata,\n axmIsAnnouncementChannel,\n axmIsChannelRoom,\n RootConfig,\n type AXMChannelFeedItem,\n type AXMChannelFeedQueryInput,\n type AXMChannelUnreadCount,\n} from '@acorex-platform/module-conversation-client/contracts';\n\nimport { AXMChatEntityUserApi } from './chat-entity-user.api';\nimport { axmChannelFeedItemToMessage } from '../../utils/bulletin-feed-message.util';\nimport { axmWithAnnouncementSubscriberCount } from '../../utils/announcement-subscriber-count.util';\n\n//#endregion\n\n//#region ----- Service -----\n\n/**\n * Ensures the tenant announcements channel exists and loads feed rows as chat messages.\n */\n@Injectable()\nexport class AXMChatAnnouncementChannelService {\n //#region ----- Services & Dependencies -----\n\n private readonly entityService = inject(AXPEntityService);\n private readonly filterService = inject(AXPFilterOperatorMiddlewareService);\n private readonly queryService = inject(AXPQueryService);\n private readonly session = inject(AXPSessionService);\n private readonly translation = inject(AXTranslationService);\n private readonly locale = inject(AXLocaleService);\n private readonly userApi = inject(AXMChatEntityUserApi);\n private subscriberCountCache: { value: number; at: number } | null = null;\n private unreadByRoomCache: { value: Record<string, number>; at: number } | null = null;\n private readonly roomData = this.entityService\n .withEntity(RootConfig.module.name, RootConfig.entities.room.name)\n .data<string, AXMConversationRoom>();\n private readonly feedMessageCache = new Map<string, AXConversationMessage>();\n\n //#endregion\n\n //#region ----- Access -----\n\n canViewBulletins(): boolean {\n return this.session.authorize(AXPCollaborationPermissionKeys.ViewBulletins);\n }\n\n isAnnouncementChannel(\n value: { name?: string | null; metadata?: Record<string, unknown> | null } | null | undefined,\n ): boolean {\n return axmIsAnnouncementChannel(value);\n }\n\n isChannelRoom(\n value: {\n kind?: string | null;\n type?: string | null;\n name?: string | null;\n metadata?: Record<string, unknown> | null;\n } | null | undefined,\n ): boolean {\n return axmIsChannelRoom(value);\n }\n\n //#endregion\n\n //#region ----- Room -----\n\n async ensureRoom(): Promise<AXMConversationRoom | null> {\n if (!this.canViewBulletins()) {\n return null;\n }\n const existing = await this.findRoom();\n if (existing) {\n return existing;\n }\n try {\n return await this.createRoom();\n } catch {\n return this.findRoom();\n }\n }\n\n async findRoom(): Promise<AXMConversationRoom | null> {\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 const matches = items.filter((room) => axmIsAnnouncementChannel(room));\n if (matches.length === 0) {\n return null;\n }\n return [...matches].sort((left, right) => {\n const leftMs = new Date(left.createdAt ?? 0).getTime();\n const rightMs = new Date(right.createdAt ?? 0).getTime();\n return leftMs - rightMs;\n })[0];\n }\n\n async decorateConversation(conversation: AXConversation): Promise<AXConversation> {\n if (!axmIsChannelRoom(conversation)) {\n return conversation;\n }\n\n const unreadByRoom = await this.resolveUnreadByRoom();\n const unreadCount = Math.max(0, unreadByRoom[conversation.id] ?? 0);\n const asChannel: AXConversation = {\n ...conversation,\n type: 'channel',\n unreadCount,\n };\n\n if (!axmIsAnnouncementChannel(conversation)) {\n return asChannel;\n }\n\n const [title, description, preview, subscriberCount] = await Promise.all([\n this.translation.translateAsync(RootConfig.pages.feed.title),\n this.translation.translateAsync(RootConfig.pages.feed.description),\n this.getFeedMessages(conversation.id, { page: 0, pageSize: 1 }),\n this.resolveSubscriberCount(),\n ]);\n const previewMessage = preview.items[0] ?? conversation.lastMessage;\n return {\n ...asChannel,\n title: title || conversation.title,\n description: description || conversation.description,\n icon: RootConfig.pages.feed.icon,\n lastMessage: previewMessage,\n lastMessageAt: previewMessage?.timestamp ?? conversation.lastMessageAt,\n participants:\n subscriberCount > 0\n ? axmWithAnnouncementSubscriberCount(conversation.participants, subscriberCount)\n : conversation.participants,\n metadata: {\n ...conversation.metadata,\n subscriberCount,\n },\n };\n }\n\n private async resolveUnreadByRoom(): Promise<Record<string, number>> {\n const now = Date.now();\n if (this.unreadByRoomCache && now - this.unreadByRoomCache.at < 15_000) {\n return this.unreadByRoomCache.value;\n }\n try {\n const result = await this.queryService.fetch<void, AXMChannelUnreadCount>(\n AXPConversationQueryKeys.ChannelFeed.GetUnreadCount,\n undefined as void,\n );\n const data = runtimeQueryObjectData(result);\n const value = data?.byRoomId ?? {};\n this.unreadByRoomCache = { value, at: now };\n return value;\n } catch {\n return this.unreadByRoomCache?.value ?? {};\n }\n }\n\n private async resolveSubscriberCount(): Promise<number> {\n const now = Date.now();\n if (this.subscriberCountCache && now - this.subscriberCountCache.at < 60_000) {\n return this.subscriberCountCache.value;\n }\n try {\n const value = Math.max(0, await this.userApi.countDirectoryUsers());\n this.subscriberCountCache = { value, at: now };\n return value;\n } catch {\n return this.subscriberCountCache?.value ?? 0;\n }\n }\n\n //#endregion\n\n //#region ----- Feed messages -----\n\n getCachedFeedMessage(messageId: string): AXConversationMessage | null {\n return this.feedMessageCache.get(messageId.trim()) ?? null;\n }\n\n async getFeedMessages(\n conversationId: string,\n pagination: AXConversationPagination,\n ): Promise<AXConversationPaginatedResult<AXConversationMessage>> {\n const page = Math.max(0, pagination.page);\n const pageSize = Math.max(1, pagination.pageSize);\n const skip = page * pageSize;\n const locale = this.locale.activeProfile()?.localeInfo?.code ?? 'en-US';\n try {\n const result = await this.queryService.fetch<AXMChannelFeedQueryInput, AXMChannelFeedItem>(\n AXPConversationQueryKeys.ChannelFeed.Get,\n { skip, take: pageSize, roomId: conversationId },\n );\n const collection = runtimeQueryCollectionData(result);\n const items = (collection?.items ?? []).map((item) =>\n axmChannelFeedItemToMessage(item, conversationId, locale),\n );\n for (const message of items) {\n this.feedMessageCache.set(message.id, message);\n }\n const total = collection?.total ?? items.length;\n return {\n items,\n total,\n hasMore: skip + items.length < total,\n page,\n totalPages: Math.ceil(total / pageSize) || 0,\n };\n } catch {\n return {\n items: [],\n total: 0,\n hasMore: false,\n page,\n totalPages: 0,\n };\n }\n }\n\n async searchFeedMessages(\n conversationId: string,\n query: string | undefined,\n pagination: AXConversationPagination,\n ): Promise<AXConversationPaginatedResult<AXConversationMessage>> {\n const pageSize = Math.max(1, pagination.pageSize);\n const firstPage = await this.getFeedMessages(conversationId, { page: 0, pageSize: 50 });\n const needle = query?.trim().toLowerCase() ?? '';\n const filtered = needle\n ? firstPage.items.filter((message) => {\n const payload = message.payload as { type?: string; text?: string };\n if (payload.type === 'text' && payload.text?.toLowerCase().includes(needle)) {\n return true;\n }\n const item = message.metadata?.[AXM_CONVERSATION_ANNOUNCEMENT_FEED_ITEM_META_KEY] as\n | AXMChannelFeedItem\n | undefined;\n if (!item) {\n return false;\n }\n const haystack = [item.title, item.body]\n .map((value) => (typeof value === 'string' ? value : Object.values(value ?? {}).join(' ')))\n .join(' ')\n .toLowerCase();\n return haystack.includes(needle);\n })\n : firstPage.items;\n const start = pagination.page * pageSize;\n return {\n items: filtered.slice(start, start + pageSize),\n total: filtered.length,\n hasMore: start + pageSize < filtered.length,\n page: pagination.page,\n totalPages: Math.ceil(filtered.length / pageSize) || 0,\n };\n }\n\n //#endregion\n\n //#region ----- Create -----\n\n private async createRoom(): Promise<AXMConversationRoom> {\n const currentUser = await this.userApi.getCurrentUser();\n const now = new Date();\n const title = await this.translation.translateAsync(RootConfig.pages.feed.title);\n const description = await this.translation.translateAsync(RootConfig.pages.feed.description);\n const room: Omit<AXMConversationRoom, 'id'> = {\n kind: 'chat',\n type: 'channel',\n name: AXM_CONVERSATION_ANNOUNCEMENT_CHANNEL_NAME,\n creatorId: currentUser.id,\n title: title || AXM_CONVERSATION_ANNOUNCEMENT_CHANNEL_NAME,\n icon: RootConfig.pages.feed.icon,\n description: description || undefined,\n participants: [\n {\n id: currentUser.id,\n name: currentUser.name,\n avatar: currentUser.avatar,\n role: 'member',\n },\n ],\n lastMessageAt: now,\n unreadCount: 0,\n pinned: true,\n archived: false,\n createdAt: now,\n updatedAt: now,\n audienceTargetType: 'organization',\n audienceMode: 'include',\n metadata: axmAnnouncementChannelMetadata(),\n };\n const id = await this.roomData.create(room);\n return { ...room, id };\n }\n\n //#endregion\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 { axmIsChannelRoom, axmIsCommentRoom } from '@acorex-platform/module-conversation-client/contracts';\n\nimport { axmIsConversationParticipant } from './conversation-participant.util';\n\n//#endregion\n\n//#region ----- Types -----\n\ntype ChatRoomAccessRef = {\n kind?: string | null;\n type?: string | null;\n name?: string | null;\n metadata?: Record<string, unknown> | null;\n participants?: Array<{ id?: string }> | null;\n};\n\n//#endregion\n\n//#region ----- Access -----\n\n/**\n * Channel rooms: any tenant member with ViewBulletins (audience refined later).\n * Other rooms: participant list only.\n */\nexport function axmCanAccessChatRoom(\n room: ChatRoomAccessRef | null | undefined,\n userId: string | undefined | null,\n canViewBulletins: boolean,\n): boolean {\n if (!room || axmIsCommentRoom(room)) {\n return false;\n }\n return axmIsChannelRoom(room)\n ? canViewBulletins\n : axmIsConversationParticipant(room.participants, userId);\n}\n\n/** Resolves a conversation from an action `visible` argument (row or `{ conversation }`). */\nexport function axmConversationFromActionTarget(\n target: { conversation?: ChatRoomAccessRef } | ChatRoomAccessRef | null | undefined,\n): ChatRoomAccessRef | null {\n if (!target) {\n return null;\n }\n if ('conversation' in target && target.conversation) {\n return target.conversation;\n }\n return target as ChatRoomAccessRef;\n}\n\n//#endregion\n","//#region ----- Types -----\n\nexport interface AXMChatConversationGroupUpgradeNameSource {\n id?: string;\n name?: string;\n}\n\n//#endregion\n\n//#region ----- Private-to-group upgrade -----\n\n/** True when a private chat must fork into a new group instead of mutating the 1:1 room. */\nexport function axmShouldForkPrivateToGroup(\n roomType: string | undefined,\n existingParticipantCount: number,\n newUserIds: string[],\n): boolean {\n if (roomType !== 'private') {\n return false;\n }\n const uniqueNewCount = new Set(newUserIds.map((id) => id.trim()).filter(Boolean)).size;\n return existingParticipantCount + uniqueNewCount > 2;\n}\n\n/** Participant ids for the forked group (inviter is added by createConversation). */\nexport function axmBuildForkedGroupParticipantIds(\n existingParticipantIds: string[],\n newUserIds: string[],\n inviterUserId: string,\n): string[] {\n const scopedInviter = inviterUserId.trim();\n const ids = new Set<string>();\n\n for (const id of existingParticipantIds) {\n const scoped = id.trim();\n if (scoped && scoped !== scopedInviter) {\n ids.add(scoped);\n }\n }\n for (const id of newUserIds) {\n const scoped = id.trim();\n if (scoped && scoped !== scopedInviter) {\n ids.add(scoped);\n }\n }\n\n return [...ids];\n}\n\n/** Default group title when promoting a private chat (Telegram-style name list). */\nexport function axmBuildUpgradedGroupTitle(options: {\n existingParticipants: AXMChatConversationGroupUpgradeNameSource[];\n newUsers: AXMChatConversationGroupUpgradeNameSource[];\n inviterUserId: string;\n}): string {\n const inviterId = options.inviterUserId.trim();\n const names: string[] = [];\n const seen = new Set<string>();\n\n const pushName = (name?: string): void => {\n const trimmed = name?.trim();\n if (!trimmed) {\n return;\n }\n const key = trimmed.toLowerCase();\n if (seen.has(key)) {\n return;\n }\n seen.add(key);\n names.push(trimmed);\n };\n\n for (const participant of options.existingParticipants) {\n if (participant.id?.trim() === inviterId) {\n continue;\n }\n pushName(participant.name);\n }\n for (const user of options.newUsers) {\n if (user.id?.trim() === inviterId) {\n continue;\n }\n pushName(user.name);\n }\n\n return names.slice(0, 4).join(', ') || 'New Group';\n}\n\nexport function axmReadForkedFromConversationId(metadata: unknown): string | null {\n if (!metadata || typeof metadata !== 'object') {\n return null;\n }\n const value = (metadata as Record<string, unknown>)['forkedFromConversationId'];\n return typeof value === 'string' && value.trim() ? value.trim() : null;\n}\n\nexport function axmReadForkedForCallId(metadata: unknown): string | null {\n if (!metadata || typeof metadata !== 'object') {\n return null;\n }\n const value = (metadata as Record<string, unknown>)['forkedForCallId'];\n return typeof value === 'string' && value.trim() ? value.trim() : null;\n}\n\nexport function axmMatchesForkedGroupForCall(\n metadata: unknown,\n sourceConversationId: string,\n callId?: string | null,\n): boolean {\n const forkedFrom = axmReadForkedFromConversationId(metadata);\n if (!forkedFrom || forkedFrom !== sourceConversationId.trim()) {\n return false;\n }\n const scopedCallId = callId?.trim();\n if (!scopedCallId) {\n return true;\n }\n const forkCallId = axmReadForkedForCallId(metadata);\n return !forkCallId || forkCallId === scopedCallId;\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\nfunction isDirectConversation(conversation: AXConversation): boolean {\n return conversation.type === 'private';\n}\n\nfunction formatChatInAppNotificationBody(\n conversation: AXConversation,\n senderName: string,\n messageText: string,\n): string {\n const body = messageText.trim() || 'New message';\n if (isDirectConversation(conversation)) {\n return body;\n }\n return `${senderName}: ${body}`;\n}\n\nexport const CONVERSATION_CHAT_IN_APP_DEFINITION_KEY = 'conversation-chat-message';\n\nexport function buildConversationChatInAppIdempotencyKey(\n conversationId: string,\n recipientUserId: string,\n): string {\n return `conversation-in-app:${conversationId.trim()}:${recipientUserId.trim()}`;\n}\n\nexport function buildConversationChatInAppCorrelationPrefix(conversationId: string): string {\n return `conversation:${conversationId.trim()}:`;\n}\n\nexport function buildConversationChatInAppCorrelationId(\n conversationId: string,\n messageId: string,\n senderUserId?: string,\n): string {\n const scopedConversationId = conversationId.trim();\n const scopedMessageId = messageId.trim();\n const scopedSenderUserId = senderUserId?.trim();\n if (scopedSenderUserId) {\n return `conversation:${scopedConversationId}:${scopedMessageId}:${scopedSenderUserId}`;\n }\n return `conversation:${scopedConversationId}:${scopedMessageId}`;\n}\n\nexport function parseConversationChatInAppCorrelationId(\n correlationId: string | null | undefined,\n): { conversationId: string; messageId: string; senderUserId?: string } | undefined {\n const scoped = correlationId?.trim();\n if (!scoped?.startsWith('conversation:')) {\n return undefined;\n }\n\n const segments = scoped.split(':');\n if (segments.length < 3) {\n return undefined;\n }\n\n const conversationId = segments[1]?.trim();\n const messageId = segments[2]?.trim();\n if (!conversationId || !messageId) {\n return undefined;\n }\n\n const senderUserId = segments[3]?.trim() || undefined;\n return { conversationId, messageId, senderUserId };\n}\n\n/** Stable local-only inbox id until the server delivery id is known. */\nexport function buildConversationChatLocalInboxId(conversationId: string): string {\n return `local:conversation-in-app:${conversationId.trim()}`;\n}\n\nexport function buildChatInAppCommunicationSendInput(\n message: AXConversationMessage,\n conversation: AXConversation,\n senderName: string,\n recipientUserId: string,\n): CommunicationSendInput {\n const messageText = extractMessageText(message) || 'New message';\n const title = conversation.title?.trim() || senderName;\n const senderUserId = message.senderId?.trim();\n const notificationBody = formatChatInAppNotificationBody(conversation, senderName, messageText);\n\n return {\n title,\n message: {\n subject: title,\n body: notificationBody,\n },\n channel: 'in-app',\n recipientUserId,\n recipientName: senderName,\n definitionKey: CONVERSATION_CHAT_IN_APP_DEFINITION_KEY,\n correlationId: buildConversationChatInAppCorrelationId(\n message.conversationId,\n message.id,\n senderUserId,\n ),\n idempotencyKey: buildConversationChatInAppIdempotencyKey(message.conversationId, recipientUserId),\n bypassDebugRedirect: true,\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\nexport function buildChatInAppLocalInboxItem(input: {\n message: AXConversationMessage;\n conversation: AXConversation;\n senderName: string;\n recipientUserId: string;\n}): {\n sendInput: CommunicationSendInput;\n localItem: {\n id: string;\n title: string;\n body: string;\n createdAt: Date;\n seenAt: null;\n readAt: null;\n sender?: { id: string; fullName: string };\n definitionKey: string;\n correlationId: string;\n recipientUserId: string;\n priority: 'Notice';\n isPinned: false;\n actions: CommunicationSendInput['actions'];\n };\n} {\n const sendInput = buildChatInAppCommunicationSendInput(\n input.message,\n input.conversation,\n input.senderName,\n input.recipientUserId,\n );\n const senderUserId = input.message.senderId?.trim();\n const createdAt =\n input.message.timestamp instanceof Date\n ? input.message.timestamp\n : new Date(input.message.timestamp ?? Date.now());\n\n return {\n sendInput,\n localItem: {\n id: buildConversationChatLocalInboxId(input.message.conversationId),\n title: sendInput.title,\n body: sendInput.message.body,\n createdAt,\n seenAt: null,\n readAt: null,\n sender:\n senderUserId && input.senderName.trim()\n ? { id: senderUserId, fullName: input.senderName.trim() }\n : undefined,\n definitionKey: CONVERSATION_CHAT_IN_APP_DEFINITION_KEY,\n correlationId: sendInput.correlationId ?? '',\n recipientUserId: input.recipientUserId.trim(),\n priority: 'Notice',\n isPinned: false,\n actions: sendInput.actions,\n },\n };\n}\n\n//#endregion\n","import { inject, Injectable } from '@angular/core';\nimport { AXPInAppInboxConnectorService } from '@acorex-platform/module-communication-management-client';\nimport { buildConversationChatInAppCorrelationPrefix } from './conversation-chat-notification.util';\n\n//#region ---- Conversation in-app notification sync ----\n\nconst SYNC_MIN_INTERVAL_MS = 2500;\n\n@Injectable({ providedIn: 'root' })\nexport class AXMConversationInAppNotificationSyncService {\n private readonly inboxConnector = inject(AXPInAppInboxConnectorService, { optional: true });\n\n private readonly lastSyncAt = new Map<string, number>();\n private readonly syncChains = new Map<string, Promise<void>>();\n private readonly knownReadDeliveryIds = new Set<string>();\n\n /**\n * Marks the in-app inbox row for this conversation as read (best-effort).\n * Pass `force` when the user just opened the thread so a recent no-op cannot skip the write.\n */\n async markConversationInAppNotificationRead(\n conversationId: string,\n recipientUserId: string,\n options?: { force?: boolean },\n ): Promise<void> {\n await this.runConversationInboxMutation(conversationId, recipientUserId, options, async () => {\n await this.inboxConnector!.markReadByCorrelationIdPrefix(\n buildConversationChatInAppCorrelationPrefix(conversationId),\n );\n this.rememberReadDeliveries(conversationId);\n });\n }\n\n /**\n * Removes the in-app inbox row for this conversation (muted rooms).\n */\n async dismissConversationInAppNotification(\n conversationId: string,\n recipientUserId: string,\n options?: { force?: boolean },\n ): Promise<void> {\n await this.runConversationInboxMutation(conversationId, recipientUserId, options, async () => {\n await this.inboxConnector!.dismissByCorrelationIdPrefix(\n buildConversationChatInAppCorrelationPrefix(conversationId),\n );\n });\n }\n\n rememberReadDeliveries(conversationId: string): void {\n const prefix = buildConversationChatInAppCorrelationPrefix(conversationId);\n for (const item of this.inboxConnector?.inboxList() ?? []) {\n if (item.correlationId?.trim().startsWith(prefix) || item.id === `local:conversation-in-app:${conversationId}`) {\n this.knownReadDeliveryIds.add(item.id);\n }\n }\n }\n\n hasRememberedReadDelivery(deliveryId: string): boolean {\n return this.knownReadDeliveryIds.has(deliveryId);\n }\n\n rememberReadDeliveryId(deliveryId: string): void {\n const scoped = deliveryId.trim();\n if (scoped) {\n this.knownReadDeliveryIds.add(scoped);\n }\n }\n\n clearRememberedReadDeliveries(): void {\n this.knownReadDeliveryIds.clear();\n }\n\n private async runConversationInboxMutation(\n conversationId: string,\n recipientUserId: string,\n options: { force?: boolean } | undefined,\n mutate: () => Promise<void>,\n ): Promise<void> {\n if (!this.inboxConnector || !conversationId.trim() || !recipientUserId.trim()) {\n return;\n }\n\n const key = `${conversationId.trim()}:${recipientUserId.trim()}`;\n const now = Date.now();\n const last = this.lastSyncAt.get(key) ?? 0;\n if (!options?.force && now - last < SYNC_MIN_INTERVAL_MS) {\n return;\n }\n\n const previous = this.syncChains.get(key) ?? Promise.resolve();\n const next = previous.then(() => this.runMutationInternal(mutate));\n this.syncChains.set(\n key,\n next.finally(() => {\n if (this.syncChains.get(key) === next) {\n this.syncChains.delete(key);\n }\n }),\n );\n await next;\n this.lastSyncAt.set(key, Date.now());\n }\n\n private async runMutationInternal(mutate: () => Promise<void>): Promise<void> {\n try {\n await mutate();\n } catch {\n // Best-effort — opening the chat should still proceed.\n }\n }\n}\n\n//#endregion\n","//#region ---- Imports ----\n\nimport { AXPSessionService } from '@acorex-platform/framework-client/auth';\nimport { AXPCommandService } from '@acorex-platform/framework-client/runtime';\nimport { AXPRealtimeConnectionService } from '@acorex-platform/framework-client/realtime';\nimport { DOCUMENT } from '@angular/common';\nimport { DestroyRef, 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 { AXMConversationInAppNotificationSyncService } from '../../../services/conversation-in-app-notification-sync.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 session = inject(AXPSessionService);\n private readonly focusService = inject(AXMConversationFocusService);\n private readonly inAppSync = inject(AXMConversationInAppNotificationSyncService);\n private readonly assistResponse = inject(AXM_CONVERSATION_ASSIST_RESPONSE_PORT, { optional: true });\n private readonly realtimeConnection = inject(AXPRealtimeConnectionService, { optional: true });\n private readonly document = inject(DOCUMENT);\n private readonly destroyRef = inject(DestroyRef);\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 constructor() {\n const onVisibility = (): void => {\n if (this.document.visibilityState !== 'visible') {\n return;\n }\n const focusId = this.focusService.getFocusedConversationId();\n if (!focusId) {\n return;\n }\n void this.runFocusedConversationSync(focusId);\n };\n this.document.addEventListener('visibilitychange', onVisibility);\n this.destroyRef.onDestroy(() => {\n this.document.removeEventListener('visibilitychange', onVisibility);\n });\n }\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.dismissInboxForVisibleFocus(scoped);\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 private dismissInboxForVisibleFocus(conversationId: string): void {\n if (this.document.visibilityState === 'hidden') {\n return;\n }\n const userId = this.session.user?.id?.trim();\n if (!userId) {\n return;\n }\n void this.inAppSync.markConversationInAppNotificationRead(conversationId, userId, { force: true });\n }\n\n //#endregion\n}\n\n//#endregion\n","//#region ---- Imports ----\n\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 type {\n AXConversation,\n AXConversationPaginatedResult,\n AXConversationPagination,\n} from '@acorex/components/conversation';\nimport { inject, Injectable } from '@angular/core';\n\nimport {\n AXMConversationMessage,\n AXMConversationRoom,\n AXPCollaborationPermissionKeys,\n RootConfig,\n axmIsCommentRoom,\n} from '@acorex-platform/module-conversation-client/contracts';\nimport { axmCanAccessChatRoom } from '../../utils/announcement-channel-access.util';\nimport { axmRoomIsEntityChat } from '../../../../mini-chat/entity-chat.util';\nimport { axmRoomEntityToConversation } from './chat-entity-mapper.util';\nimport { axmHydrateRoomParticipants } from '../../utils/conversation-participant-hydrate.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 session = inject(AXPSessionService);\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 const canViewBulletins = this.session.authorize(AXPCollaborationPermissionKeys.ViewBulletins);\n return items.filter(\n (room) =>\n !axmIsCommentRoom(room) &&\n !axmRoomIsEntityChat(room) &&\n axmCanAccessChatRoom(room, currentUserId, canViewBulletins),\n );\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 const hydratedRoom = await axmHydrateRoomParticipants(room, (userIds) =>\n this.userApi.getUsersByIds(userIds),\n );\n return axmRoomEntityToConversation(hydratedRoom, 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 AXConversationUser,\n AXConversationUpdateData,\n} from '@acorex/components/conversation';\nimport { AXPCommandService } from '@acorex-platform/framework-client/runtime';\nimport { inject, Injectable } from '@angular/core';\n\nimport {\n AXPConversationCommandKeys,\n AXMConversationRoom,\n RootConfig,\n axmAiChatConversationUiMetadata,\n type AXMChannelMarkReadCommandInput,\n} 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 { axmCanAccessChatRoom } from '../../utils/announcement-channel-access.util';\nimport { axmMergeConversationSnapshot } from '../../utils/conversation-snapshot-merge.util';\nimport {\n axmBuildForkedGroupParticipantIds,\n axmBuildUpgradedGroupTitle,\n axmMatchesForkedGroupForCall,\n} from '../../utils/chat-conversation-group-upgrade.util';\nimport { axmPreferLocalUnreadCount } from '../../utils/conversation-unread.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';\nimport { AXMChatAnnouncementChannelService } from './chat-entity-announcement-channel.service';\nimport {\n axmBuildEntityChatRoomEntityRef,\n axmFlattenConversationCreateMetadata,\n axmRoomMatchesEntity,\n} from '../../../../mini-chat/entity-chat.util';\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 announcements = inject(AXMChatAnnouncementChannelService);\n private readonly commandService = inject(AXPCommandService);\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: AXConversationUser): Promise<AXConversationParticipant[]> {\n const resolved: AXConversationParticipant[] = [\n {\n id: currentUser.id,\n name: currentUser.name,\n avatar: currentUser.avatar,\n icon: currentUser.icon,\n description: currentUser.description,\n profile: currentUser.profile,\n metadata: currentUser.metadata,\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 return role;\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 flattened = isPrivate\n ? undefined\n : axmFlattenConversationCreateMetadata(data.metadata as Record<string, unknown> | undefined);\n const metadata =\n data.type === 'bot' ? { ...(flattened ?? {}), ...axmAiChatConversationUiMetadata() } : flattened;\n const entityRef = axmBuildEntityChatRoomEntityRef(metadata);\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 pinned: false,\n archived: false,\n createdAt: now,\n updatedAt: now,\n metadata,\n ...(entityRef ? { entityRef } : {}),\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 currentUser = await this.userApi.getCurrentUser().catch(() => null);\n const currentUserId = currentUser?.id?.trim();\n const cached = this.conversationStore.getCachedConversation(conversationId);\n const conversation = cached ?? (await this.conversationStore.getConversation(conversationId));\n if (!conversation) {\n throw this.createError('CONVERSATION_NOT_FOUND', 'Conversation not found', 404);\n }\n if (\n !currentUserId ||\n !axmCanAccessChatRoom(conversation, currentUserId, this.announcements.canViewBulletins())\n ) {\n throw this.createError('CONVERSATION_NOT_FOUND', 'Conversation not found', 404);\n }\n const decorated = await this.announcements.decorateConversation(conversation);\n this.conversationStore.cacheConversation(decorated);\n return decorated;\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 await this.announcements.ensureRoom();\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 const withLocalUnread = await Promise.all(\n enriched.map(async (conversation) => {\n const decorated = await this.announcements.decorateConversation(conversation);\n if (this.announcements.isChannelRoom(decorated)) {\n this.conversationStore.cacheConversation(decorated);\n return decorated;\n }\n const existing = this.conversationStore.getCachedConversation(decorated.id);\n const next = existing\n ? {\n ...decorated,\n unreadCount: axmPreferLocalUnreadCount(existing.unreadCount, decorated.unreadCount),\n }\n : decorated;\n this.conversationStore.cacheConversation(next);\n return next;\n }),\n );\n const sorted = axmSortConversationsByPinAndRecency(withLocalUnread);\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 =\n this.conversationStore.getCachedConversation(conversationId) ??\n (await this.conversationStore.getConversation(conversationId));\n const conversation: AXConversation = {\n ...(cached ?? { id: conversationId, type: 'private', creatorId: '', title: '', participants: [] }),\n ...updates,\n updatedAt: now,\n } as AXConversation;\n if (cached) {\n const currentUser = await this.userApi.getCurrentUser().catch(() => null);\n const merged = axmMergeConversationSnapshot(\n cached,\n conversation,\n currentUser?.id?.trim(),\n );\n this.conversationStore.publishConversationUpdate(merged);\n return merged;\n }\n this.conversationStore.publishConversationUpdate(conversation);\n return conversation;\n }\n\n async deleteConversation(conversationId: string): Promise<boolean> {\n const cached = this.conversationStore.getCachedConversation(conversationId);\n if (this.announcements.isAnnouncementChannel(cached)) {\n throw this.createError('ANNOUNCEMENT_CHANNEL_LOCKED', 'The announcements channel cannot be deleted', 403);\n }\n this.realtimeBus.markLocalRoomMutation(conversationId);\n await this.roomData.delete(conversationId);\n this.conversationStore.publishConversationDeleted(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 (this.announcements.isChannelRoom(cached)) {\n await this.commandService.execute<AXMChannelMarkReadCommandInput, void>(\n AXPConversationCommandKeys.ChannelFeed.MarkRead,\n { roomId: conversationId },\n );\n const now = new Date();\n this.realtimeBus.markLocalRoomMutation(conversationId);\n await this.publishConversationById(conversationId, { unreadCount: 0, updatedAt: now });\n return;\n }\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 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 ref = { entityType: entityType.trim(), entityId: entityId.trim() };\n if (!ref.entityType || !ref.entityId) {\n return [];\n }\n\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 const matched = items.filter((room) => axmRoomMatchesEntity(room, ref));\n const currentUser = await this.userApi.getCurrentUser().catch(() => null);\n const currentUserId = currentUser?.id?.trim();\n const enriched = await Promise.all(\n matched.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 if (this.announcements.isChannelRoom(room)) {\n throw this.createError('ANNOUNCEMENT_CHANNEL_READ_ONLY', 'The announcements channel is read-only', 403);\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 return this.persistParticipants(conversationId, merged);\n }\n\n /**\n * Creates a new group from a private chat when a third participant accepts a call invite.\n * The private room is left unchanged; the inviter becomes group owner.\n */\n async forkPrivateToGroupForCall(\n sourceConversationId: string,\n acceptedUserIds: string[],\n options?: { callId?: string },\n ): Promise<AXConversation> {\n const currentUser = await this.userApi.getCurrentUser();\n const room = await this.roomData.byKey(sourceConversationId);\n if (!room) {\n throw this.createError('CONVERSATION_NOT_FOUND', 'Conversation not found', 404);\n }\n if (room.type !== 'private') {\n throw this.createError('INVALID_CONVERSATION_TYPE', 'Only private chats can be upgraded to a group', 400);\n }\n\n const uniqueAcceptedUserIds = [...new Set(acceptedUserIds.map((id) => id.trim()).filter(Boolean))];\n return this.#forkPrivateConversationToGroup(room, uniqueAcceptedUserIds, currentUser, options?.callId);\n }\n\n async findForkedGroupFromPrivateChat(\n sourceConversationId: string,\n callId?: string,\n ): Promise<AXConversation | null> {\n const scopedSourceId = sourceConversationId.trim();\n if (!scopedSourceId) {\n return null;\n }\n const currentUser = await this.userApi.getCurrentUser().catch(() => null);\n const currentUserId = currentUser?.id?.trim();\n const rooms = await this.roomQuery.loadChatRooms();\n const match = rooms.find(\n (room) =>\n room.type === 'group' &&\n axmMatchesForkedGroupForCall(room.metadata, scopedSourceId, callId) &&\n (!currentUserId || axmIsConversationParticipant(room.participants, currentUserId)),\n );\n if (!match) {\n return null;\n }\n return this.roomQuery.enrichRoom(match, {\n probeLastMessage: false,\n currentUserId,\n });\n }\n\n /**\n * Promotes a 1:1 chat into a new group when a third participant joins.\n * The private room is left unchanged; the inviter becomes group owner.\n */\n async #forkPrivateConversationToGroup(\n room: AXMConversationRoom,\n newUserIds: string[],\n currentUser: AXConversationUser,\n callId?: string,\n ): Promise<AXConversation> {\n const participantIds = axmBuildForkedGroupParticipantIds(\n room.participants.map((participant) => participant.id),\n newUserIds,\n currentUser.id,\n );\n const newUsers = await this.userApi.getUsersByIds(newUserIds);\n const title = axmBuildUpgradedGroupTitle({\n existingParticipants: room.participants,\n newUsers,\n inviterUserId: currentUser.id,\n });\n\n const created = await this.createConversation({\n type: 'group',\n participantIds,\n title,\n metadata: {\n forkedFromConversationId: room.id,\n forkedByUserId: currentUser.id,\n ...(callId?.trim() ? { forkedForCallId: callId.trim() } : {}),\n },\n });\n\n const participants: AXConversationParticipant[] = created.participants.map((participant) => ({\n ...participant,\n role: participant.id === currentUser.id ? 'owner' : participant.role === 'admin' ? 'member' : participant.role ?? 'member',\n }));\n const now = new Date();\n this.realtimeBus.markLocalRoomMutation(created.id);\n await this.roomData.update(created.id, {\n participants,\n creatorId: currentUser.id,\n type: 'group',\n metadata: {\n forkedFromConversationId: room.id,\n forkedByUserId: currentUser.id,\n ...(callId?.trim() ? { forkedForCallId: callId.trim() } : {}),\n },\n updatedAt: now,\n });\n\n const updatedRoom = await this.roomData.byKey(created.id);\n if (!updatedRoom) {\n throw this.createError('CONVERSATION_NOT_FOUND', 'Conversation not found', 404);\n }\n const conversation = await this.roomQuery.enrichRoom(updatedRoom, {\n probeLastMessage: false,\n currentUserId: currentUser.id,\n });\n this.conversationStore.publishConversationUpdate(conversation);\n this.conversationStore.publishConversationCreated(conversation);\n return conversation;\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 if (this.announcements.isChannelRoom(room)) {\n throw this.createError('ANNOUNCEMENT_CHANNEL_READ_ONLY', 'The announcements channel is read-only', 403);\n }\n const participants = room.participants.filter((p) => p.id !== userId);\n return this.persistParticipants(conversationId, participants);\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 if (this.announcements.isChannelRoom(room)) {\n throw this.createError('ANNOUNCEMENT_CHANNEL_READ_ONLY', 'The announcements channel is read-only', 403);\n }\n const participants: AXConversationParticipant[] = room.participants.map((p) => (p.id === update.userId ? { ...p, role: this.toParticipantRole(update.role) ?? p.role } : p));\n return this.persistParticipants(conversationId, participants);\n }\n\n private async persistParticipants(\n conversationId: string,\n participants: AXConversationParticipant[],\n ): Promise<AXConversation> {\n const currentUser = await this.userApi.getCurrentUser();\n this.realtimeBus.markLocalRoomMutation(conversationId);\n await this.roomData.update(conversationId, {\n participants,\n updatedAt: new Date(),\n });\n const updatedRoom = await this.roomData.byKey(conversationId);\n if (!updatedRoom) {\n throw this.createError('CONVERSATION_NOT_FOUND', 'Conversation not found', 404);\n }\n const conversation = await this.roomQuery.enrichRoom(updatedRoom, {\n probeLastMessage: false,\n currentUserId: currentUser.id,\n });\n if (!axmIsConversationParticipant(conversation.participants, currentUser.id)) {\n this.conversationStore.publishConversationDeleted(conversationId);\n return conversation;\n }\n this.conversationStore.publishConversationUpdate(conversation);\n return conversation;\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 { AXConversationComposerGenerationStateService } from '@acorex/components/conversation';\nimport { inject, Injectable } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { orderBy } from 'lodash';\n\nimport {\n axmChannelPostIdFromMessage,\n axmIsChannelRoom,\n AXPConversationCommandKeys,\n AXMConversationMessage,\n AXMConversationRoom,\n RootConfig,\n axmMessagesAfterId,\n type AXMChannelMarkReadCommandInput,\n type AXMChannelReceiptEntityModel,\n} 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 { axmCanAccessChatRoom } from '../../utils/announcement-channel-access.util';\nimport { axmConversationHasAiChat } from '../../utils/assist-metadata.util';\nimport { axmSortMessagesNewestFirst } from '../../utils/conversation-time.util';\nimport { AXMChatAnnouncementChannelService } from './chat-entity-announcement-channel.service';\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 generationState = inject(AXConversationComposerGenerationStateService);\n private readonly conversationStore = inject(AXMConversationEntityStoreService);\n private readonly announcements = inject(AXMChatAnnouncementChannelService);\n private readonly realtime = inject(AXPRealtimeConnectionPort, { optional: true });\n private readonly typingStopTimers = new Map<string, ReturnType<typeof setTimeout>>();\n private readonly typingEmitState = new Map<string, { isTyping: boolean; lastEmitMs: number }>();\n private static readonly TYPING_EMIT_THROTTLE_MS = 500;\n private static readonly TYPING_STOP_IDLE_MS = 2500;\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 private readonly receiptData = this.entityService\n .withEntity(RootConfig.module.name, RootConfig.entities.channelReceipt.name)\n .data<string, AXMChannelReceiptEntityModel>();\n\n private readonly cancelAssistOnComposerStop = this.generationState.onCancelled\n .pipe(takeUntilDestroyed())\n .subscribe(() => {\n void this.assistResponse?.cancelAssistGeneration('');\n });\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 axmCanAccessChatRoom(cached, currentUser.id, this.announcements.canViewBulletins())\n ) {\n return {\n id: conversationId,\n kind: 'chat',\n type: cached.type,\n creatorId: cached.creatorId,\n title: cached.title ?? '',\n icon: cached.icon,\n description: cached.description,\n participants: cached.participants,\n lastMessageAt: cached.lastMessageAt ?? new Date(),\n unreadCount: cached.unreadCount ?? 0,\n pinned: cached.pinned ?? false,\n archived: cached.archived ?? false,\n createdAt: cached.createdAt ?? new Date(),\n updatedAt: cached.updatedAt ?? new Date(),\n metadata: cached.metadata,\n };\n }\n const room = await this.roomData.byKey(conversationId).catch(() => null);\n if (\n !room ||\n room.kind !== 'chat' ||\n !axmCanAccessChatRoom(room, currentUser.id, this.announcements.canViewBulletins())\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 const room = await this.requireConversationParticipant(command.conversationId);\n if (axmIsChannelRoom(room)) {\n throw this.createError('ANNOUNCEMENT_CHANNEL_READ_ONLY', 'The announcements channel is read-only', 403);\n }\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 const feedMessage = this.announcements.getCachedFeedMessage(messageId);\n if (feedMessage) {\n return feedMessage;\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.conversationStore.loadConversationMessages(conversationId, {\n force: pagination.page === 0,\n });\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 const existing =\n this.conversationStore.getCachedMessage(messageId) ?? (await this.getMessage(messageId));\n const conversation = this.conversationStore.getCachedConversation(existing.conversationId);\n if (axmIsChannelRoom(conversation)) {\n throw this.createError('ANNOUNCEMENT_CHANNEL_READ_ONLY', 'The announcements channel is read-only', 403);\n }\n\n const isAssistUserTextEdit = this.isAssistUserTextEdit(existing, conversation?.metadata as Record<string, unknown> | undefined);\n if (isAssistUserTextEdit) {\n this.dropMessagesAfterAssistEdit(existing.conversationId, messageId);\n }\n\n const editedAt = new Date();\n const message: AXConversationMessage = { ...existing, payload, editedAt };\n this.conversationStore.publishMessageUpdate(message);\n\n await this.messageData.update(messageId, { payload, editedAt });\n await this.conversationStore.syncPersistedLastMessage(message);\n\n if (isAssistUserTextEdit) {\n await this.conversationStore.touchLastMessage(existing.conversationId, message);\n const currentUser = await this.userApi.getCurrentUser();\n await this.assistResponse?.handleAfterUserMessage(\n existing.conversationId,\n messageId,\n {\n conversationId: existing.conversationId,\n type: 'text',\n payload,\n },\n currentUser.id,\n { skipAssistSync: true },\n );\n }\n\n return message;\n }\n\n async deleteMessage(messageId: string, _forEveryone?: boolean): Promise<void> {\n const cached = this.conversationStore.getCachedMessage(messageId);\n const conversationId = cached?.conversationId;\n const conversation = conversationId ? this.conversationStore.getCachedConversation(conversationId) : null;\n if (axmIsChannelRoom(conversation)) {\n throw this.createError('ANNOUNCEMENT_CHANNEL_READ_ONLY', 'The announcements channel is read-only', 403);\n }\n await this.messageData.update(messageId, { deleted: true, deletedAt: new Date() });\n this.conversationStore.publishMessageDeletion(messageId);\n if (cached) {\n await this.conversationStore.syncPersistedLastMessage({ ...cached, deleted: true, deletedAt: new Date() });\n }\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 private isAssistUserTextEdit(\n message: AXConversationMessage,\n conversationMetadata: Record<string, unknown> | undefined,\n ): boolean {\n if (!axmConversationHasAiChat(conversationMetadata)) {\n return false;\n }\n if (message.type !== 'text' || message.deleted) {\n return false;\n }\n return message.metadata?.['isAssistResponse'] !== true;\n }\n\n private dropMessagesAfterAssistEdit(conversationId: string, messageId: string): void {\n const persisted = this.conversationStore.getCachedMessageList(conversationId) ?? [];\n const merged = this.assistResponse?.mergeLiveConversationMessages(conversationId, persisted) ?? persisted;\n const later = axmMessagesAfterId(merged, messageId);\n if (later.length === 0) {\n return;\n }\n this.assistResponse?.forgetLiveMessages(later.map((message) => message.id));\n for (const message of later) {\n this.conversationStore.publishMessageDeletion(message.id);\n }\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 await this.requireConversationParticipant(conversationId);\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 room = await this.roomData.byKey(conversationId);\n if (axmIsChannelRoom(room)) {\n await this.markChannelPostsRead(messageIds);\n return;\n }\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 const postId = await this.resolveChannelPostId(messageId);\n if (!postId) {\n return [];\n }\n const receipts = (await this.queryPostReceipts(postId)).filter((receipt) => !!receipt.readAt);\n if (receipts.length === 0) {\n return [];\n }\n const users = await this.userApi.getUsersByIds(receipts.map((receipt) => receipt.userId));\n const nameById = new Map(users.map((user) => [user.id, user.name ?? '']));\n return receipts.map((receipt) => ({\n userId: receipt.userId,\n userName: nameById.get(receipt.userId) ?? '',\n readAt: receipt.readAt instanceof Date ? receipt.readAt : new Date(String(receipt.readAt)),\n }));\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\n this.#armTypingStop(id);\n\n const now = Date.now();\n const state = this.typingEmitState.get(id) ?? { isTyping: false, lastEmitMs: 0 };\n if (state.isTyping && now - state.lastEmitMs < AXMChatEntityMessageApi.TYPING_EMIT_THROTTLE_MS) {\n return;\n }\n\n state.isTyping = true;\n state.lastEmitMs = now;\n this.typingEmitState.set(id, state);\n this.realtime?.emitConversationTyping(id, true);\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.typingEmitState.delete(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.typingEmitState.delete(conversationId);\n this.realtime?.emitConversationTyping(conversationId, false);\n }, AXMChatEntityMessageApi.TYPING_STOP_IDLE_MS),\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 const postId = await this.resolveChannelPostId(messageId);\n if (!postId) {\n return { delivered: 0, read: 0, total: 0 };\n }\n const receipts = await this.queryPostReceipts(postId);\n const read = receipts.filter((receipt) => !!receipt.readAt).length;\n const delivered = receipts.filter((receipt) => !!receipt.firstSeenAt || !!receipt.readAt).length;\n return { delivered, read, total: Math.max(delivered, read) };\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 //#region ----- Channel receipts -----\n\n private async markChannelPostsRead(messageIds: string[]): Promise<void> {\n const postIds = new Set<string>();\n for (const messageId of messageIds) {\n const postId = await this.resolveChannelPostId(messageId);\n if (postId) {\n postIds.add(postId);\n }\n }\n await Promise.all(\n [...postIds].map((postId) =>\n this.commandService.execute<AXMChannelMarkReadCommandInput, void>(\n AXPConversationCommandKeys.ChannelFeed.MarkRead,\n { postId },\n ),\n ),\n );\n }\n\n private async resolveChannelPostId(messageId: string): Promise<string | null> {\n const trimmed = messageId.trim();\n if (!trimmed) {\n return null;\n }\n const fromCache = axmChannelPostIdFromMessage(this.conversationStore.getCachedMessage(trimmed));\n if (fromCache) {\n return fromCache;\n }\n const fromFeed = axmChannelPostIdFromMessage(this.announcements.getCachedFeedMessage(trimmed));\n if (fromFeed) {\n return fromFeed;\n }\n try {\n const message = await this.messageData.byKey(trimmed);\n return axmChannelPostIdFromMessage(message);\n } catch {\n return null;\n }\n }\n\n private async queryPostReceipts(postId: string): Promise<AXMChannelReceiptEntityModel[]> {\n const { items } = await this.receiptData.query({\n skip: 0,\n take: 1000,\n filter: {\n field: 'postId',\n value: postId,\n operator: this.filterService.getOperator('equal') as never,\n },\n });\n return items ?? [];\n }\n\n //#endregion\n}\n\n//#endregion\n","//#region ---- Imports ----\n\nimport { AXPUserPresenceService } from '@acorex-platform/framework-client/realtime';\nimport type { AXConversation, AXConversationMessage, AXConversationTypingIndicator } from '@acorex/components/conversation';\nimport { inject, Injectable } from '@angular/core';\nimport { filter, map, Observable, pairwise } from 'rxjs';\n\nimport { AXMConversationRealtimeBus } from '../../../services/conversation-realtime.bus';\nimport { AXMChatPresenceLastSeenService, axmMapUserPresenceToConversationUpdate } from '../../utils/axm-chat-presence.util';\nimport { axmCoerceTimestampMs } from '../../utils/conversation-time.util';\nimport { AXMChatRealtimeApi } from '../chat-conversation-apis.abstract';\nimport { axmRoomIsEntityChat } from '../../../../mini-chat/entity-chat.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 presence = inject(AXPUserPresenceService, { optional: true });\n private readonly chatLastSeen = inject(AXMChatPresenceLastSeenService);\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 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 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(([previous, current]) => current.status === 'read' && (previous.id !== current.id || previous.status !== 'read')),\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 ---- Conversation streams ----\n\n subscribeToConversationUpdates(): Observable<AXConversation> {\n return this.bus.conversationUpdates$.pipe(filter((conversation) => !axmRoomIsEntityChat(conversation)));\n }\n\n subscribeToConversationCreated(): Observable<AXConversation> {\n return this.bus.conversationCreated$.pipe(filter((conversation) => !axmRoomIsEntityChat(conversation)));\n }\n\n subscribeToConversationDeleted(): Observable<string> {\n return this.bus.conversationDeleted$;\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 const scoped = [...new Set((userIds ?? []).map((id) => id.trim()).filter(Boolean))];\n if (scoped.length) {\n this.presence?.ensureWatchMany(scoped);\n void this.hydratePresenceLastSeen(scoped);\n }\n return this.bus.presenceUpdates$;\n }\n\n private async hydratePresenceLastSeen(userIds: string[]): Promise<void> {\n const segmentMap = await this.chatLastSeen.fetchLastSeenMap(userIds);\n for (const userId of userIds) {\n const current = this.presence?.get(userId);\n if (!current) {\n continue;\n }\n this.bus.publishPresenceUpdate(axmMapUserPresenceToConversationUpdate(userId, current, segmentMap.get(userId)));\n }\n }\n\n //#endregion\n}\n\n//#endregion\n","//#region ---- Imports ----\n\nimport type { AXConversation, AXConversationTab } from '@acorex/components/conversation';\nimport { axmRoomIsEntityChat } from '../../../mini-chat/entity-chat.util';\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/** Inbox (`/chat/`) must not list entity-record mini chats. */\nexport function axmExcludeEntityChatConversations(conversations: AXConversation[]): AXConversation[] {\n return conversations.filter((conversation) => !axmRoomIsEntityChat(conversation));\n}\n\n/** Wraps a sidebar tab so entity-scoped chats stay off the main chat list. */\nexport function axmInboxConversationTab(tab: AXConversationTab): AXConversationTab {\n return {\n ...tab,\n filter: (conversations: AXConversation[]) =>\n axmExcludeEntityChatConversations(tab.filter ? tab.filter(conversations) : conversations),\n };\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 axmExcludeEntityChatConversations(conversations).filter((conversation) => axmIsAssistBotConversation(conversation)),\n};\n\n//#endregion\n","//#region ----- Imports -----\n\nimport { AXPMultiLanguageString } from '@acorex-platform/framework-shared/core';\nimport { AXButtonModule } from '@acorex/components/button';\nimport { AXTranslationModule, AXTranslationService } from '@acorex/core/translation';\nimport type { AXPopupRef } from '@acorex/components/popup';\nimport { ChangeDetectionStrategy, Component, inject, input } from '@angular/core';\nimport { AXMChatEmptyAssistSessionService } from '../empty-state/chat-empty-assist-session.service';\n\n//#endregion\n\n//#region ----- Component -----\n\n/**\n * Compact assist list opened from the composer sparkles action on a new chat.\n */\n@Component({\n selector: 'axm-chat-composer-assist-picker',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [AXButtonModule, AXTranslationModule],\n host: {\n class: 'axm-chat-composer-assist-picker-panel',\n },\n template: `\n <ax-button-item-list>\n @for (row of session.rows(); track row.id) {\n <ax-button-item\n [text]=\"assistLabel(row.title, row.name)\"\n [selected]=\"row.id === session.selectedAssistId()\"\n (onClick)=\"select(row.id)\"\n ></ax-button-item>\n }\n </ax-button-item-list>\n `,\n styles: `\n :host {\n display: block;\n min-width: 14rem;\n max-width: 22rem;\n padding: 0.25rem;\n }\n `,\n})\nexport class AXMChatComposerAssistPickerComponent {\n //#region ----- Services & Dependencies -----\n\n readonly session = inject(AXMChatEmptyAssistSessionService);\n private readonly translationService = inject(AXTranslationService);\n\n //#endregion\n\n //#region ----- Inputs -----\n\n readonly __popup__ = input<AXPopupRef | undefined>();\n\n //#endregion\n\n //#region ----- Event Handlers -----\n\n assistLabel(title: AXPMultiLanguageString | string | undefined, fallback: string): string {\n return this.translationService.resolve(title as AXPMultiLanguageString) ?? fallback;\n }\n\n select(assistId: string): void {\n this.session.setSelectedAssistId(assistId);\n this.session.closeAssistPicker();\n this.__popup__()?.close();\n }\n\n //#endregion\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 axpAiExtractChatWidgetNodeFromUnknown,\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/** Designer canvas roots — apply to the form designer, do not render in chat. */\nconst AXM_ASSIST_DESIGNER_CANVAS_ROOT_TYPES = new Set(['document-layout', 'page-layout']);\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/** Widget trees the chat layout renderer can host (not Form Template designer shells). */\nexport function axmChatRenderableAssistWidgetNode(content: unknown): AXPWidgetNode | null {\n const node = axmAssistWidgetNodeFromUnknown(content);\n if (!node) {\n return null;\n }\n const type = typeof node.type === 'string' ? node.type.trim() : '';\n if (AXM_ASSIST_DESIGNER_CANVAS_ROOT_TYPES.has(type)) {\n return null;\n }\n return node;\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 hideWidgetNodes = false,\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 (hideWidgetNodes || !axmChatRenderableAssistWidgetNode(response.content)) {\n continue;\n }\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 === 'tool_result') {\n const node = axpAiExtractChatWidgetNodeFromUnknown(r.content);\n if (node != null) {\n tryPushAttachment({ type: 'node', content: node });\n }\n continue;\n }\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 axmChatRenderableAssistWidgetNode(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 axmChatRenderableAssistWidgetNode(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(\n line: AXPAiChatMessage,\n options?: { hideWidgetNodes?: boolean },\n): AxmAssistUserVisibleItem[] {\n const hideWidgetNodes = options?.hideWidgetNodes === true;\n const out: AxmAssistUserVisibleItem[] = [];\n let followUpPushed = false;\n const nodeKeys = new Set<string>();\n\n const tryPushNode = (content: unknown): void => {\n if (hideWidgetNodes || !axmChatRenderableAssistWidgetNode(content)) {\n return;\n }\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, hideWidgetNodes);\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, hideWidgetNodes);\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 { 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 { AXConversationUser } 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<AXConversationUser | null>;\n setCurrentUser(user: AXConversationUser | null): void;\n closeActiveConversation(): void;\n resetConversationsPagination(): void;\n loadConversations(): Promise<void>;\n}\n\ninterface ConversationServiceSessionBridge {\n _currentUser: WritableSignal<AXConversationUser | null>;\n currentUser: Signal<AXConversationUser | 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: (user) => bridge._currentUser.set(user),\n closeActiveConversation: () => bridge.closeActiveConversation(),\n resetConversationsPagination: () => bridge.resetConversationsPagination(),\n loadConversations: () => bridge.loadConversations(),\n };\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 { AXTranslationModule } from '@acorex/core/translation';\nimport { AsyncPipe } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, ElementRef, inject, viewChild, ViewEncapsulation } from '@angular/core';\nimport { AXMMiniChatPanelService } from './mini-chat-panel.service';\nimport { AXPLayoutThemeService } from '@acorex-platform/framework-client/themes/shared';\n\n//#endregion\n\n//#region ---- Component ----\n\n/**\n * Root header slot that toggles the shared inbox mini chat overlay (AI-assist conversations).\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, AXTranslationModule, AsyncPipe],\n})\nexport class AXMMiniChatHeaderSlotComponent {\n //#region ---- Services & Dependencies ----\n\n private readonly panelService = inject(AXMMiniChatPanelService);\n protected readonly themeStore = inject(AXPLayoutThemeService);\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]=\"themeStore.headerButtonColor()\"\n [look]=\"themeStore.headerButtonLook()\"\n #chatButton\n (onClick)=\"onToggleClick()\"\n [attr.aria-label]=\"('@conversation:mini-chat.brand-title' | translate | async) ?? ''\"\n>\n <ax-icon>\n <i class=\"fa-regular fa-robot\"></i>\n </ax-icon>\n</ax-button>\n","//#region ----- Imports -----\n\nimport { AXPDeviceService, AXPPageContextRegistry } from '@acorex-platform/framework-client/core';\nimport { AXM_CONTEXTUAL_ASSIST_ACTION_ENTITY_RECORD, AXM_CONTEXTUAL_ASSIST_KIND_ENTITY_RECORD } from '@acorex-platform/module-conversation-client/contracts';\nimport { AXButtonModule } from '@acorex/components/button';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { AXTranslationModule } from '@acorex/core/translation';\nimport { AsyncPipe } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, ElementRef, inject, viewChild, ViewEncapsulation } from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { ActivatedRoute, NavigationEnd, Router } from '@angular/router';\nimport { filter, map } from 'rxjs';\nimport { AXM_ENTITY_LIST_CHAT_ID, type AXMEntityChatRef } from './entity-chat.util';\nimport { AXMMiniChatPanelService } from './mini-chat-panel.service';\n\n//#endregion\n\n//#region ----- Component -----\n\n/**\n * Page-header Ask AI control for entity list/detail pages.\n * Opens the same {@link AXMMiniChatPanelService} overlay as the root header slot.\n */\n@Component({\n selector: 'axm-mini-chat-page-action',\n templateUrl: './mini-chat-page-action.component.html',\n styleUrls: ['./mini-chat-page-action.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [AXButtonModule, AXDecoratorModule, AXTranslationModule, AsyncPipe],\n})\nexport class AXMMiniChatPageActionComponent {\n //#region ----- Services & Dependencies -----\n\n private readonly panelService = inject(AXMMiniChatPanelService);\n private readonly pageContext = inject(AXPPageContextRegistry);\n private readonly route = inject(ActivatedRoute);\n private readonly router = inject(Router);\n protected readonly device = inject(AXPDeviceService);\n\n private readonly url = toSignal(\n this.router.events.pipe(\n filter((event): event is NavigationEnd => event instanceof NavigationEnd),\n map((event) => event.urlAfterRedirects),\n ),\n { initialValue: this.router.url },\n );\n\n //#endregion\n\n //#region ----- View References -----\n\n private readonly buttonRef = viewChild('askAiButton', { read: ElementRef<HTMLElement> });\n\n //#endregion\n\n //#region ----- Computed Properties -----\n\n protected readonly visible = computed(() => {\n this.url();\n const page = this.pageContext.getSnapshot();\n if (page.kind === 'entity-list') {\n return true;\n }\n return this.readEntityRoute() != null;\n });\n\n //#endregion\n\n //#region ----- Event Handlers -----\n\n protected onToggleClick(): void {\n const anchor = this.buttonRef()?.nativeElement;\n const placement = {\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 const entityRef = this.resolveEntityChatRef();\n if (entityRef) {\n const entityType = entityRef.entityType;\n const separator = entityType.lastIndexOf('.');\n const moduleName = separator > 0 ? entityType.slice(0, separator) : entityType;\n const entityName = separator > 0 ? entityType.slice(separator + 1) : entityType;\n const isRecord = entityRef.entityId !== AXM_ENTITY_LIST_CHAT_ID;\n const page = this.pageContext.getSnapshot();\n const entityTitle = page.entity?.title?.trim() || page.title.trim() || entityName;\n this.panelService.toggle({\n scope: 'entity',\n entityType: entityRef.entityType,\n entityId: entityRef.entityId,\n ...(isRecord\n ? {\n launchContext: {\n kind: AXM_CONTEXTUAL_ASSIST_KIND_ENTITY_RECORD,\n actionName: AXM_CONTEXTUAL_ASSIST_ACTION_ENTITY_RECORD,\n title: entityTitle,\n payload: {\n moduleName,\n entityName,\n recordId: entityRef.entityId,\n entityTitle,\n columns: [],\n },\n },\n }\n : {}),\n ...placement,\n });\n }\n }\n\n //#endregion\n\n //#region ----- Route -----\n\n private resolveEntityChatRef(): AXMEntityChatRef | null {\n const fromRoute = this.readEntityRoute();\n if (fromRoute) {\n return {\n entityType: fromRoute.entityType,\n entityId: fromRoute.id ?? AXM_ENTITY_LIST_CHAT_ID,\n };\n }\n\n const page = this.pageContext.getSnapshot();\n const fullName = page.entity?.fullName?.trim();\n if (page.kind === 'entity-list' && fullName) {\n return { entityType: fullName, entityId: AXM_ENTITY_LIST_CHAT_ID };\n }\n\n return null;\n }\n\n private readEntityRoute(): { entityType: string; id?: string } | null {\n const params = this.collectRouteParams();\n const moduleName = params['module']?.trim();\n const entityName = params['entity']?.trim();\n if (!moduleName || !entityName) {\n return null;\n }\n const id = params['id']?.trim();\n return {\n entityType: `${moduleName}.${entityName}`,\n ...(id ? { id } : {}),\n };\n }\n\n private collectRouteParams(): Record<string, string> {\n const params: Record<string, string> = {};\n const visit = (node: ActivatedRoute): void => {\n for (const key of node.snapshot.paramMap.keys) {\n const value = node.snapshot.paramMap.get(key);\n if (value) {\n params[key] = value;\n }\n }\n for (const child of node.children) {\n visit(child);\n }\n };\n visit(this.route.root);\n return params;\n }\n\n //#endregion\n}\n\n//#endregion\n","@if (visible()) {\n <ax-button\n #askAiButton\n class=\"axm-mini-chat-page-action\"\n look=\"outline\"\n color=\"primary\"\n [class.ax-sm]=\"device.isSmall()\"\n [iconOnly]=\"device.isSmall()\"\n [text]=\"device.isSmall() ? '' : (('@conversation:mini-chat.ask-ai' | translate | async) ?? '')\"\n (onClick)=\"onToggleClick()\"\n >\n <ax-prefix>\n <ax-icon icon=\"fa-regular fa-sparkles\"></ax-icon>\n </ax-prefix>\n </ax-button>\n}\n","//#region ---- Imports ----\n\nimport { AXButtonModule } from '@acorex/components/button';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { AXTranslationModule } from '@acorex/core/translation';\nimport { AsyncPipe } from '@angular/common';\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, AXTranslationModule, AsyncPipe],\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 [attr.aria-label]=\"('@conversation:mini-chat.ask-ai' | translate | async) ?? ''\"\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 ----- Imports -----\n\nimport { AXDragHandleDirective } from '@acorex/cdk/drag-drop';\nimport { AXButtonModule } from '@acorex/components/button';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { AXPopupCaptionIconComponent, AXPopupDockComponent } from '@acorex/components/popup';\nimport { AXTranslationModule } from '@acorex/core/translation';\nimport { AsyncPipe } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, ViewEncapsulation } from '@angular/core';\nimport { AXM_MINI_CHAT_POPUP_DOCK } from './mini-chat-panel.types';\n\n//#endregion\n\n//#region ----- Component -----\n\n/**\n * Root-footer dock for minimized mini-chat windows (`mini-chat` dock name).\n */\n@Component({\n selector: 'axm-mini-chat-footer-dock',\n templateUrl: './mini-chat-footer-dock.component.html',\n styleUrls: ['./mini-chat-footer-dock.component.css'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n AsyncPipe,\n AXButtonModule,\n AXDecoratorModule,\n AXDragHandleDirective,\n AXPopupCaptionIconComponent,\n AXPopupDockComponent,\n AXTranslationModule,\n ],\n})\nexport class AXMMiniChatFooterDockComponent {\n protected readonly dockName = AXM_MINI_CHAT_POPUP_DOCK;\n}\n\n//#endregion\n","<ax-popup-dock [name]=\"dockName\" class=\"axm-mini-chat-dock\">\n <ng-template let-item>\n <div class=\"axm-mini-chat-dock__item flex h-full min-w-0 items-center gap-1\">\n <span axDragHandle class=\"axm-mini-chat-dock__title min-w-0 flex-1 truncate\">\n {{ item.title() }}\n </span>\n <div class=\"flex shrink-0 items-center\" (pointerdown)=\"$event.stopPropagation()\">\n <ax-button\n class=\"ax-sm\"\n look=\"blank\"\n [iconOnly]=\"true\"\n (onClick)=\"item.restore()\"\n [attr.aria-label]=\"('@conversation:mini-chat.restore' | translate | async) ?? ''\"\n >\n <ax-prefix>\n <ax-popup-caption-icon name=\"restore\" />\n </ax-prefix>\n </ax-button>\n <ax-button\n class=\"ax-sm\"\n look=\"blank\"\n [iconOnly]=\"true\"\n (onClick)=\"item.close()\"\n [attr.aria-label]=\"('@conversation:mini-chat.close' | translate | async) ?? ''\"\n >\n <ax-prefix>\n <ax-popup-caption-icon name=\"close\" />\n </ax-prefix>\n </ax-button>\n </div>\n </div>\n </ng-template>\n</ax-popup-dock>\n","//#region ----- Imports -----\n\nimport type { AXActionSheetRef } from '@acorex/components/action-sheet';\nimport { AXAudioWaveChangeEvent, AXAudioWaveComponent, AXWaveConfig } from '@acorex/components/audio-wave';\nimport { AXButtonComponent } from '@acorex/components/button';\nimport {\n AXConversationComposerService,\n type AXConversation,\n type AXConversationComposerActionComponent,\n type AXConversationSendMessageCommand,\n} from '@acorex/components/conversation';\nimport { AXDecoratorModule } from '@acorex/components/decorators';\nimport { AXLoadingModule } from '@acorex/components/loading';\nimport type { AXPopupRef } from '@acorex/components/popup';\nimport { AXProgressBarModule } from '@acorex/components/progress-bar';\nimport { AXToastService } from '@acorex/components/toast';\nimport { AXTranslationModule, AXTranslationService } from '@acorex/core/translation';\nimport { createRandomUuid, runtimeCommandPayloadData } from '@acorex-platform/framework-shared/core';\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 { AsyncPipe, isPlatformBrowser } from '@angular/common';\nimport {\n afterNextRender,\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n ElementRef,\n Injector,\n PLATFORM_ID,\n ViewEncapsulation,\n computed,\n inject,\n input,\n output,\n signal,\n viewChild,\n} from '@angular/core';\n\n//#endregion\n\n//#region ----- Types -----\n\nfunction isAbortError(error: unknown): boolean {\n return (\n (typeof DOMException !== 'undefined' && error instanceof DOMException && error.name === 'AbortError') ||\n (error instanceof Error && (error.name === 'AbortError' || /aborted/i.test(error.message)))\n );\n}\n\nfunction isUploadAborted(error: unknown): boolean {\n return isAbortError(error) || (error instanceof Error && /upload aborted/i.test(error.message));\n}\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\nconst WAVE_HEIGHT = 36;\nconst WAVE_BAR_WIDTH = 2;\nconst WAVE_BAR_GAP = 2;\nconst WAVE_BAR_RADIUS = 2;\nconst LIVE_BAR_INTERVAL_MS = 100;\n\n//#endregion\n\n//#region ----- Component -----\n\n@Component({\n selector: 'axm-chat-voice-recorder',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n AsyncPipe,\n AXAudioWaveComponent,\n AXButtonComponent,\n AXDecoratorModule,\n AXLoadingModule,\n AXProgressBarModule,\n AXTranslationModule,\n ],\n templateUrl: './chat-voice-recorder.component.html',\n styleUrl: './chat-voice-recorder.component.css',\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 composerServiceFromInjector = inject(AXConversationComposerService, { optional: true });\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 private get composerService(): AXConversationComposerService {\n const svc = this.service() ?? this.composerServiceFromInjector;\n if (!svc) {\n throw new Error('AXConversationComposerService is required for the voice recorder');\n }\n return svc;\n }\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 | undefined>();\n readonly initialFiles = input<File[]>([]);\n readonly autoRun = input(false);\n readonly __popup__ = input<AXPopupRef | undefined>();\n readonly __actionSheet__ = input<AXActionSheetRef | undefined>();\n readonly recordingComplete = output<Blob>();\n readonly recordingCancelled = output<void>();\n\n //#endregion\n\n //#region ----- State Signals -----\n\n readonly isRecording = signal(false);\n readonly isPreview = signal(false);\n readonly isPlayingPreview = signal(false);\n readonly isUploading = signal(false);\n readonly isTranscribing = signal(false);\n readonly uploadProgress = signal(0);\n readonly recordingDuration = signal(0);\n readonly previewUrl = signal<string | null>(null);\n readonly livePeaks = signal<number[]>([]);\n readonly liveBarCount = signal(48);\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 sendAfterStop = false;\n private sendInFlight = false;\n private awaitingPreviewData = false;\n private previewBlob: Blob | null = null;\n private uploadAbortController?: AbortController;\n private audioContext?: AudioContext;\n private analyser?: AnalyserNode;\n private timeDomain = new Uint8Array(0);\n private rafId = 0;\n private lastLivePeakAt = 0;\n private waveResizeObserver?: ResizeObserver;\n private readonly waveWrapRef = viewChild<ElementRef<HTMLElement>>('waveWrap');\n private readonly waveRef = viewChild(AXAudioWaveComponent);\n\n //#endregion\n\n //#region ----- Computed Properties -----\n\n readonly formattedTime = computed(() => {\n const duration = this.recordingDuration();\n const hours = Math.floor(duration / 3600);\n const minutes = Math.floor((duration % 3600) / 60);\n const seconds = duration % 60;\n return [hours, minutes, seconds].map((value) => value.toString().padStart(2, '0')).join(':');\n });\n\n readonly canSend = computed(() => this.recordingDuration() > 0 || this.isPreview());\n\n readonly canTranscribe = computed(() => {\n return this.isPreview() && !!this.previewUrl()?.trim() && !this.isTranscribing();\n });\n\n readonly liveDisplayBars = computed(() => {\n const peaks = this.livePeaks();\n const count = this.liveBarCount();\n return Array.from({ length: count }, (_, index) => ({\n index,\n recorded: index < peaks.length,\n height: peaks[index] ?? 8,\n }));\n });\n\n readonly waveConfig = computed((): AXWaveConfig | null => {\n const url = this.previewUrl()?.trim();\n if (!url) {\n return null;\n }\n return {\n url,\n height: WAVE_HEIGHT,\n barWidth: WAVE_BAR_WIDTH,\n barGap: WAVE_BAR_GAP,\n barRadius: WAVE_BAR_RADIUS,\n audioRate: 1,\n };\n });\n\n //#endregion\n\n //#region ----- Lifecycle -----\n\n constructor() {\n this.destroyRef.onDestroy(() => this.stopAndCleanup());\n afterNextRender(() => {\n if (this.initialFiles().length > 0) {\n return;\n }\n if (!this.autoRun()) {\n return;\n }\n void this.activate();\n });\n }\n\n //#endregion\n\n //#region ----- Event Handlers -----\n\n activate(): Promise<void> {\n return this.startRecording();\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 this.sendAfterStop = false;\n this.clearPreview();\n this.livePeaks.set([]);\n\n this.mediaRecorder.ondataavailable = (event) => {\n if (event.data.size > 0) {\n this.audioChunks.push(event.data);\n }\n this.flushPreviewIfWaiting();\n };\n\n this.mediaRecorder.onstop = () => {\n this.stopLiveWave();\n this.releaseStream();\n this.isRecording.set(false);\n this.clearTimer();\n\n if (this.cancelled) {\n this.cancelled = false;\n this.audioChunks = [];\n return;\n }\n\n const audioBlob = this.buildRecordingBlob();\n this.recordingComplete.emit(audioBlob);\n\n if (this.sendAfterStop) {\n this.sendAfterStop = false;\n const conv = this.conversation();\n if (conv && audioBlob.size > 0) {\n void this.sendVoiceMessage(audioBlob, conv);\n }\n return;\n }\n\n this.enterPreview(audioBlob);\n };\n\n this.mediaRecorder.start();\n this.isRecording.set(true);\n this.isPreview.set(false);\n this.recordingStartTime = Date.now();\n this.recordingDuration.set(0);\n this.timerInterval = window.setInterval(() => {\n const elapsed = Math.floor((Date.now() - this.recordingStartTime) / 1000);\n this.recordingDuration.set(elapsed);\n }, 1000);\n\n requestAnimationFrame(() => this.startLiveWave(stream));\n } catch (error) {\n console.error('Failed to start recording:', error);\n if (this.autoRun()) {\n this.dismissHost();\n }\n }\n }\n\n toggleStopOrContinue(): void {\n if (this.isRecording()) {\n this.pauseRecording();\n return;\n }\n if (this.isPreview()) {\n this.continueRecording();\n }\n }\n\n stopRecording(): void {\n this.pauseRecording();\n }\n\n sendRecording(): void {\n const recorder = this.mediaRecorder;\n if (recorder && (recorder.state === 'recording' || recorder.state === 'paused')) {\n this.sendAfterStop = true;\n this.pausePreview();\n recorder.stop();\n return;\n }\n\n const conv = this.conversation();\n const blob = this.previewBlob;\n if (conv && blob) {\n void this.sendVoiceMessage(blob, conv);\n }\n }\n\n deleteRecording(): void {\n this.pausePreview();\n this.discardActiveRecorder();\n this.clearPreview();\n this.recordingDuration.set(0);\n this.audioChunks = [];\n this.recordingCancelled.emit();\n this.dismissHost();\n }\n\n cancelRecording(): void {\n this.discardActiveRecorder();\n this.pausePreview();\n this.clearPreview();\n this.recordingCancelled.emit();\n this.dismissHost();\n }\n\n cancel(): void {\n if (this.isRecording() || this.isPreview()) {\n this.cancelRecording();\n return;\n }\n this.abortInProgressUploads();\n this.dismissHost();\n }\n\n togglePreview(): void {\n if (!isPlatformBrowser(this.platformId)) {\n return;\n }\n const wave = this.waveRef();\n if (!wave) {\n return;\n }\n if (this.isPlayingPreview()) {\n wave.pause();\n return;\n }\n void wave.play().catch((error: unknown) => {\n if (!isAbortError(error)) {\n throw error;\n }\n });\n }\n\n onWaveStatusChanged(event: AXAudioWaveChangeEvent): void {\n switch (event.status) {\n case 'play':\n this.isPlayingPreview.set(true);\n break;\n case 'pause':\n case 'finish':\n this.isPlayingPreview.set(false);\n break;\n default:\n break;\n }\n }\n\n async applySpeechToText(): Promise<void> {\n if (!this.canTranscribe()) {\n return;\n }\n\n const audioBlob = this.previewBlob;\n if (!audioBlob || audioBlob.size === 0) {\n return;\n }\n\n this.pausePreview();\n this.isTranscribing.set(true);\n\n try {\n const text = await this.transcribeVoiceBlob(audioBlob);\n if (!text) {\n return;\n }\n\n this.composerService.draftText.set(text);\n this.discardActiveRecorder();\n this.clearPreview();\n this.dismissHost();\n setTimeout(() => {\n (document.querySelector('.composer-input-wrapper textarea') as HTMLTextAreaElement)?.focus();\n }, 100);\n } catch {\n const errTitle = await this.translation.translateAsync('@general:messages.generic.error.title');\n const content = await this.translation.translateAsync(\n '@conversation:chat.speech-to-text.errors.transcription-failed',\n );\n await this.toastService.show({ color: 'danger', title: errTitle, content });\n } finally {\n this.isTranscribing.set(false);\n }\n }\n\n abortInProgressUploads(): void {\n if (this.uploadAbortController && !this.uploadAbortController.signal.aborted) {\n this.uploadAbortController.abort();\n }\n this.uploadAbortController = undefined;\n if (this.isUploading()) {\n this.isUploading.set(false);\n this.uploadProgress.set(0);\n }\n }\n\n getUploadingLabel(): string {\n return this.translation.translateSync('@acorex:chat.pickers.files.uploading-progress', {\n params: { progress: this.uploadProgress() },\n });\n }\n\n //#endregion\n\n //#region ----- Recording -----\n\n private pauseRecording(): void {\n const recorder = this.mediaRecorder;\n if (recorder?.state !== 'recording') {\n return;\n }\n this.sendAfterStop = false;\n this.awaitingPreviewData = true;\n recorder.pause();\n recorder.requestData();\n this.stopLiveWave();\n this.clearTimer();\n this.isRecording.set(false);\n this.isPreview.set(true);\n this.flushPreviewIfWaiting();\n }\n\n private continueRecording(): void {\n const recorder = this.mediaRecorder;\n const stream = this.activeStream;\n if (!isPlatformBrowser(this.platformId) || recorder?.state !== 'paused' || !stream) {\n return;\n }\n this.awaitingPreviewData = false;\n this.pausePreview();\n this.clearPreviewUrl();\n this.isPreview.set(false);\n this.isPlayingPreview.set(false);\n recorder.resume();\n this.isRecording.set(true);\n this.recordingStartTime = Date.now() - this.recordingDuration() * 1000;\n this.timerInterval = window.setInterval(() => {\n const elapsed = Math.floor((Date.now() - this.recordingStartTime) / 1000);\n this.recordingDuration.set(elapsed);\n }, 1000);\n requestAnimationFrame(() => this.startLiveWave(stream));\n }\n\n private flushPreviewIfWaiting(): void {\n if (!this.awaitingPreviewData || this.mediaRecorder?.state !== 'paused') {\n return;\n }\n const audioBlob = this.buildRecordingBlob();\n if (audioBlob.size === 0) {\n return;\n }\n this.awaitingPreviewData = false;\n this.enterPreview(audioBlob);\n }\n\n private buildRecordingBlob(): Blob {\n return new Blob(this.audioChunks, { type: this.mediaRecorder?.mimeType || 'audio/webm' });\n }\n\n private discardActiveRecorder(): void {\n if (this.mediaRecorder && this.mediaRecorder.state !== 'inactive') {\n this.cancelled = true;\n this.mediaRecorder.stop();\n } else {\n this.releaseStream();\n }\n this.isRecording.set(false);\n this.clearTimer();\n this.audioChunks = [];\n }\n\n private releaseStream(): void {\n this.activeStream?.getTracks().forEach((track) => track.stop());\n this.activeStream = undefined;\n }\n\n //#endregion\n\n //#region ----- Preview & Wave -----\n\n private startLiveWave(stream: MediaStream): void {\n this.stopLiveWave();\n this.audioContext = new AudioContext();\n const source = this.audioContext.createMediaStreamSource(stream);\n this.analyser = this.audioContext.createAnalyser();\n this.analyser.fftSize = 256;\n source.connect(this.analyser);\n this.timeDomain = new Uint8Array(this.analyser.fftSize);\n this.lastLivePeakAt = 0;\n void this.audioContext.resume();\n this.observeWaveWidth();\n if (!this.waveWrapRef()?.nativeElement) {\n requestAnimationFrame(() => this.observeWaveWidth());\n }\n this.tickLiveWave();\n }\n\n private observeWaveWidth(): void {\n this.waveResizeObserver?.disconnect();\n const el = this.waveWrapRef()?.nativeElement;\n if (!el || typeof ResizeObserver === 'undefined') {\n this.updateBarCount(el?.clientWidth ?? 320);\n return;\n }\n this.waveResizeObserver = new ResizeObserver((entries) => {\n const width = entries[0]?.contentRect.width ?? el.clientWidth;\n this.updateBarCount(width);\n });\n this.waveResizeObserver.observe(el);\n this.updateBarCount(el.clientWidth);\n }\n\n private updateBarCount(width: number): void {\n const unit = WAVE_BAR_WIDTH + WAVE_BAR_GAP;\n const count = Math.max(24, Math.floor(Math.max(width, 1) / unit));\n if (count === this.liveBarCount()) {\n return;\n }\n this.liveBarCount.set(count);\n this.livePeaks.update((peaks) => (peaks.length > count ? peaks.slice(peaks.length - count) : peaks));\n }\n\n private tickLiveWave = (): void => {\n if (!this.analyser || !this.isRecording()) {\n return;\n }\n const now = performance.now();\n if (now - this.lastLivePeakAt >= LIVE_BAR_INTERVAL_MS) {\n this.lastLivePeakAt = now;\n this.analyser.getByteTimeDomainData(this.timeDomain);\n let max = 0;\n for (const value of this.timeDomain) {\n const amplitude = Math.abs(value - 128) / 128;\n if (amplitude > max) {\n max = amplitude;\n }\n }\n const height = Math.max(4, Math.round(max * WAVE_HEIGHT));\n this.livePeaks.update((peaks) => {\n const count = this.liveBarCount();\n const next = peaks.length >= count ? peaks.slice(1) : [...peaks];\n next.push(height);\n return next;\n });\n }\n this.rafId = requestAnimationFrame(this.tickLiveWave);\n };\n\n private stopLiveWave(): void {\n if (this.rafId) {\n cancelAnimationFrame(this.rafId);\n this.rafId = 0;\n }\n this.waveResizeObserver?.disconnect();\n this.waveResizeObserver = undefined;\n this.analyser?.disconnect();\n this.analyser = undefined;\n void this.audioContext?.close();\n this.audioContext = undefined;\n }\n\n private enterPreview(audioBlob: Blob): void {\n this.previewBlob = audioBlob;\n if (this.previewUrl()) {\n this.isPreview.set(true);\n return;\n }\n this.clearPreviewUrl();\n if (isPlatformBrowser(this.platformId)) {\n this.previewUrl.set(URL.createObjectURL(audioBlob));\n }\n this.isPreview.set(true);\n }\n\n private pausePreview(): void {\n this.waveRef()?.pause();\n this.isPlayingPreview.set(false);\n }\n\n private clearPreview(): void {\n this.pausePreview();\n this.clearPreviewUrl();\n this.previewBlob = null;\n this.isPreview.set(false);\n this.isPlayingPreview.set(false);\n }\n\n private clearPreviewUrl(): void {\n const url = this.previewUrl();\n if (url && isPlatformBrowser(this.platformId)) {\n URL.revokeObjectURL(url);\n }\n this.previewUrl.set(null);\n }\n\n private clearTimer(): void {\n if (this.timerInterval) {\n clearInterval(this.timerInterval);\n this.timerInterval = undefined;\n }\n }\n\n //#endregion\n\n //#region ----- Speech to Text -----\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() ? localeRaw.trim() : '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() || createRandomUuid();\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 throw new Error('@conversation:chat.speech-to-text.errors.transcription-failed');\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 //#endregion\n\n //#region ----- Send -----\n\n private async sendVoiceMessage(audioBlob: Blob, conversation: AXConversation): Promise<void> {\n const command: AXConversationSendMessageCommand = {\n conversationId: conversation.id,\n type: 'voice',\n payload: {\n type: 'voice',\n url: '',\n duration: this.recordingDuration(),\n size: audioBlob.size,\n mimeType: audioBlob.type || 'audio/webm',\n },\n };\n\n this.sendInFlight = true;\n this.uploadAbortController = undefined;\n this.isUploading.set(true);\n this.uploadProgress.set(0);\n\n const sendPromise = this.composerService.sendMessage(command, {\n media: {\n source: audioBlob,\n fileName: `voice-${Date.now()}.webm`,\n mimeType: audioBlob.type || 'audio/webm',\n onProgress: (percent) => this.uploadProgress.set(percent),\n },\n });\n\n this.dismissHost();\n\n void sendPromise\n .catch((error) => {\n if (!isUploadAborted(error)) {\n console.error('Failed to send voice message:', error);\n }\n })\n .finally(() => {\n this.isUploading.set(false);\n this.uploadProgress.set(0);\n });\n }\n\n //#endregion\n\n //#region ----- Cleanup -----\n\n private dismissHost(): void {\n const popup = this.__popup__();\n if (popup) {\n popup.close();\n return;\n }\n const actionSheet = this.__actionSheet__();\n if (actionSheet) {\n actionSheet.close();\n return;\n }\n this.composerService.hideComponent();\n }\n\n private stopAndCleanup(): void {\n if (!this.sendInFlight) {\n this.abortInProgressUploads();\n }\n this.clearTimer();\n this.stopLiveWave();\n this.clearPreview();\n this.discardActiveRecorder();\n }\n\n //#endregion\n}\n\n//#endregion\n","<div class=\"voice-recorder\" [class.voice-recorder--preview]=\"isPreview()\" role=\"dialog\" aria-modal=\"true\" [attr.aria-label]=\"translation.translateSync('@conversation:chat.voice-recorder.title')\">\n @if (isUploading()) {\n <!-- ----- Upload progress while the voice file is sent ----- -->\n <div class=\"voice-recorder__upload\">\n <span class=\"voice-recorder__upload-label\">{{ getUploadingLabel() }}</span>\n <ax-progress-bar [progress]=\"uploadProgress()\" [mode]=\"'determinate'\" [height]=\"6\" />\n </div>\n }\n <!-- ----- Speech-to-text overlay while the recording is transcribed ----- -->\n @else if (isTranscribing()) {\n <div class=\"voice-recorder__upload\">\n <ax-loading></ax-loading>\n <span class=\"voice-recorder__upload-label\">{{ '@conversation:chat.voice-recorder.transcribing' | translate | async }}</span>\n </div>\n }\n <!-- ----- Idle microphone before recording starts ----- -->\n @else if (!isRecording() && !isPreview()) {\n <div class=\"voice-recorder__idle\">\n <button type=\"button\" class=\"voice-recorder__mic\" [attr.aria-label]=\"translation.translateSync('@conversation:chat.voice-recorder.tap-to-start')\" (click)=\"startRecording()\">\n <i class=\"fa-light fa-microphone\" aria-hidden=\"true\"></i>\n </button>\n <span class=\"voice-recorder__hint\">{{ '@conversation:chat.voice-recorder.tap-to-start' | translate | async }}</span>\n </div>\n }\n <!-- ----- Live waveform or paused preview with send actions ----- -->\n @else {\n <div class=\"voice-recorder__body\">\n <div class=\"voice-recorder__visual\">\n <div class=\"voice-recorder__wave-wrap\" #waveWrap>\n <!-- ----- Live bars while the microphone is capturing ----- -->\n @if (isRecording()) {\n <div class=\"voice-recorder__live-wave\" aria-hidden=\"true\">\n @for (bar of liveDisplayBars(); track bar.index) {\n <span class=\"voice-recorder__bar\" [class.voice-recorder__bar--recorded]=\"bar.recorded\" [style.height.px]=\"bar.height\"></span>\n }\n </div>\n }\n <!-- ----- Preview waveform after recording is paused ----- -->\n @else if (waveConfig(); as config) {\n <ax-audio-wave class=\"voice-recorder__audio-wave\" [config]=\"config\" (onStatusChanged)=\"onWaveStatusChanged($event)\" />\n }\n </div>\n <!-- ----- Play or pause the recorded preview ----- -->\n @if (isPreview()) {\n <ax-button\n class=\"voice-recorder__play rounded-full\"\n look=\"twotone\"\n [iconOnly]=\"true\"\n [text]=\"isPlayingPreview() ? translation.translateSync('@conversation:chat.media.pause') : translation.translateSync('@conversation:chat.media.play')\"\n (onClick)=\"togglePreview()\"\n >\n <ax-icon>\n <i class=\"fa-solid\" [class.fa-pause]=\"isPlayingPreview()\" [class.fa-play]=\"!isPlayingPreview()\"></i>\n </ax-icon>\n </ax-button>\n }\n </div>\n\n <div class=\"voice-recorder__time\" aria-live=\"polite\">\n {{ formattedTime() }}\n <span class=\"sr-only\">{{ '@conversation:chat.voice-recorder.recording' | translate | async }}</span>\n </div>\n </div>\n\n <footer class=\"voice-recorder__footer\">\n <div class=\"voice-recorder__footer-start\">\n <!-- ----- Delete the current recording ----- -->\n @if (isPreview()) {\n <ax-button class=\"voice-recorder__delete\" look=\"blank\" color=\"danger\" [iconOnly]=\"true\" [text]=\"translation.translateSync('@acorex:chat.actions.delete')\" (onClick)=\"deleteRecording()\">\n <ax-icon><i class=\"fa-light fa-trash-can\"></i></ax-icon>\n </ax-button>\n }\n <!-- ----- Pause recording or continue from preview ----- -->\n @if (isRecording() || isPreview()) {\n <ax-button\n class=\"voice-recorder__stop\"\n look=\"blank\"\n [iconOnly]=\"true\"\n [text]=\"isPreview() ? translation.translateSync('@conversation:chat.voice-recorder.continue-recording') : translation.translateSync('@conversation:chat.voice-recorder.stop-recording')\"\n (onClick)=\"toggleStopOrContinue()\"\n >\n <ax-icon>\n <i class=\"fa-solid\" [class.fa-pause]=\"isRecording()\" [class.fa-microphone]=\"isPreview()\"></i>\n </ax-icon>\n </ax-button>\n }\n </div>\n\n <div class=\"voice-recorder__footer-end\">\n <!-- ----- Convert the paused recording into composer text ----- -->\n @if (isPreview()) {\n <ax-button class=\"voice-recorder__transcribe\" look=\"outline\" color=\"secondary\" [text]=\"translation.translateSync('@conversation:chat.voice-recorder.transcribe')\" [disabled]=\"!canTranscribe()\" (onClick)=\"applySpeechToText()\">\n <ax-prefix>\n <ax-icon><i class=\"fa-light fa-waveform-lines\"></i></ax-icon>\n </ax-prefix>\n </ax-button>\n }\n <ax-button class=\"voice-recorder__send\" look=\"solid\" color=\"primary\" [text]=\"translation.translateSync('@acorex:chat.actions.send')\" [disabled]=\"!canSend()\" (onClick)=\"sendRecording()\">\n <ax-prefix>\n <ax-icon><i class=\"fa-light fa-paper-plane-top\"></i></ax-icon>\n </ax-prefix>\n </ax-button>\n </div>\n </footer>\n }\n</div>\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 default: true,\n component: AXMChatVoiceRecorderComponent,\n autoRun: true,\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 { 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","import type { AXConversationMessageRenderer } from '@acorex/components/conversation';\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 *\n * The renderer (and `@acorex/components/code-editor` / TypeScript) load on first assist message.\n */\nexport const AXM_CONVERSATION_BOT_RENDERER: AXConversationMessageRenderer = {\n type: 'assist-response',\n componentLoader: () =>\n import('./assist-message-renderer.component').then((m) => m.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 {\n AXConversationMessageRendererComponent,\n AXConversationMessageRendererContentState,\n AXConversationMessageRendererState,\n} from '@acorex/components/conversation';\nimport { AXConversationService } from '@acorex/components/conversation';\nimport { AXPCommandService } from '@acorex-platform/framework-client/runtime';\nimport {\n AXPConversationCommandKeys,\n AXM_CONVERSATION_ANNOUNCEMENT_FEED_ITEM_META_KEY,\n type AXMChannelFeedItem,\n type AXMChannelMarkReadCommandInput,\n} from '@acorex-platform/module-conversation-client/contracts';\nimport { ChangeDetectionStrategy, Component, computed, inject, input, signal } from '@angular/core';\n\nimport { AXMChannelFeedItemComponent } from '../../../channel-feed/channel-feed-item/channel-feed-item.component';\nimport { AXMChannelUnreadBadgeProvider } from '../../../../channel-unread-badge.provider';\nimport { AXMConversationEntityStoreService } from '../../services/conversation-entity-store.service';\nimport { axmReadChannelFeedItem } from '../utils/bulletin-feed-message.util';\n\n//#endregion\n\n//#region ----- Component -----\n\n@Component({\n selector: 'axm-bulletin-feed-item-message-renderer',\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './bulletin-feed-item-message-renderer.component.html',\n styleUrl: './bulletin-feed-item-message-renderer.component.css',\n imports: [AXMChannelFeedItemComponent],\n host: {\n class: 'axm-bulletin-feed-item-message-renderer',\n },\n})\nexport class AXMBulletinFeedItemMessageRendererComponent implements AXConversationMessageRendererComponent {\n readonly message = input.required<import('@acorex/components/conversation').AXConversationMessage>();\n\n //#region ----- Services & Dependencies -----\n\n private readonly commandService = inject(AXPCommandService);\n private readonly unreadBadge = inject(AXMChannelUnreadBadgeProvider);\n private readonly conversationService = inject(AXConversationService);\n private readonly conversationStore = inject(AXMConversationEntityStoreService);\n\n //#endregion\n\n //#region ----- State Signals -----\n\n private readonly contentState = signal<AXConversationMessageRendererContentState>('ready');\n private readonly localItem = signal<AXMChannelFeedItem | null>(null);\n\n //#endregion\n\n //#region ----- Computed Properties -----\n\n readonly rendererState = computed<AXConversationMessageRendererState>(() => ({\n deliveryStatus: this.message().status,\n contentState: this.contentState(),\n }));\n\n protected readonly feedItem = computed((): AXMChannelFeedItem | null => {\n return this.localItem() ?? axmReadChannelFeedItem(this.message());\n });\n\n //#endregion\n\n //#region ----- Event Handlers -----\n\n protected onItemSeen(postId: string): void {\n void this.markRead(postId);\n }\n\n //#endregion\n\n //#region ----- Mark read -----\n\n private async markRead(postId: string): Promise<void> {\n const current = this.feedItem();\n if (!current || current.id !== postId || current.isRead) {\n return;\n }\n\n const next: AXMChannelFeedItem = { ...current, isRead: true };\n this.localItem.set(next);\n this.unreadBadge.markSeen(postId);\n this.publishItem(next);\n this.syncConversationUnread();\n\n try {\n const result = await this.commandService.execute<AXMChannelMarkReadCommandInput, void>(\n AXPConversationCommandKeys.ChannelFeed.MarkRead,\n { postId },\n );\n if (result && result.success === false) {\n this.revertRead(current);\n return;\n }\n this.unreadBadge.confirmSeen(postId);\n } catch {\n this.revertRead(current);\n }\n }\n\n private revertRead(previous: AXMChannelFeedItem): void {\n this.localItem.set(previous);\n this.unreadBadge.revertSeen(previous.id);\n this.publishItem(previous);\n this.syncConversationUnread();\n }\n\n private publishItem(item: AXMChannelFeedItem): void {\n const message = this.message();\n this.conversationStore.publishMessageUpdate({\n ...message,\n status: item.isRead ? 'read' : 'delivered',\n metadata: {\n ...message.metadata,\n [AXM_CONVERSATION_ANNOUNCEMENT_FEED_ITEM_META_KEY]: item,\n },\n });\n }\n\n private syncConversationUnread(): void {\n const conversation = this.conversationService.activeConversation();\n if (!conversation) {\n return;\n }\n this.conversationStore.publishConversationUpdate(\n {\n ...conversation,\n unreadCount: Math.max(0, this.unreadBadge.count()),\n },\n true,\n );\n }\n\n //#endregion\n}\n\n//#endregion\n","<!-- ----- Channel feed card inside a chat message ----- -->\n@if (feedItem(); as item) {\n <axm-channel-feed-item chrome=\"bubble\" [item]=\"item\" (itemSeen)=\"onItemSeen($event)\" />\n}\n","import type { AXConversationMessageRenderer } from '@acorex/components/conversation';\n\nimport { AXM_CONVERSATION_ANNOUNCEMENT_MESSAGE_TYPE } from '@acorex-platform/module-conversation-client/contracts';\nimport { axmIsBulletinFeedMessage } from '../utils/bulletin-feed-message.util';\nimport { AXMBulletinFeedItemMessageRendererComponent } from './bulletin-feed-item-message-renderer.component';\n\nexport const AXM_CONVERSATION_BULLETIN_FEED_ITEM_RENDERER: AXConversationMessageRenderer = {\n type: AXM_CONVERSATION_ANNOUNCEMENT_MESSAGE_TYPE,\n component: AXMBulletinFeedItemMessageRendererComponent,\n canHandle: (message) => axmIsBulletinFeedMessage(message),\n chrome: 'bubble',\n capabilities: {\n supportsReactions: false,\n supportsReplies: false,\n supportsEdit: false,\n supportsForward: false,\n supportsSelection: false,\n },\n displayName: 'Announcement',\n icon: 'fa-light fa-bullhorn',\n};\n","//#region ----- Imports -----\n\nimport type { AXConversation } from '@acorex/components/conversation';\nimport { AXPopupService } from '@acorex/components/popup';\nimport { createRandomUuid } from '@acorex-platform/framework-shared/core';\nimport { inject } from '@angular/core';\n\nimport { axmChatCallDarkThemeContextElement } from './chat-call-popup-theme.util';\nimport { AXMChatCallActiveSessionService } from './chat-call-active-session.service';\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 sessionInitiatorUserId?: string;\n}\n\nexport interface AXMOpenChatCallSessionDialogOptions {\n conversation: AXConversation;\n media: AXMChatCallMediaType;\n phase?: AXMChatCallPhase;\n callId?: string;\n initiatorUserId?: string;\n popupService?: AXPopupService;\n /** Required when the caller has already awaited (injection context lost). */\n activeCallSessions?: AXMChatCallActiveSessionService;\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` or\n * `activeCallSessions` are 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 activeCallSessions = options.activeCallSessions ?? inject(AXMChatCallActiveSessionService);\n const comp = (await import('./chat-call-session-page.component')).AXMChatCallSessionPageComponent;\n\n const scopedCallId = options.callId?.trim() || createRandomUuid();\n activeCallSessions.engage(scopedCallId);\n\n const data: AXMChatCallSessionPopupData = {\n sessionConversation: conversation,\n sessionMedia: options.media === 'video' ? 'video' : 'voice',\n sessionPhase: options.phase ?? 'outgoing-waiting',\n sessionCallId: scopedCallId,\n sessionInitiatorUserId: options.initiatorUserId?.trim() || undefined,\n };\n\n try {\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'],\n contextElement: axmChatCallDarkThemeContextElement(),\n data,\n });\n } catch (error) {\n activeCallSessions.release(scopedCallId);\n throw error;\n }\n}\n\n//#endregion\n","//#region ----- Imports -----\n\nimport type {\n AXConversationMessageRendererComponent,\n AXConversationMessageRendererContentState,\n AXConversationMessageRendererState,\n} from '@acorex/components/conversation';\nimport { AXConversationService } from '@acorex/components/conversation';\nimport { AXPopupService } from '@acorex/components/popup';\nimport { AXToastService } from '@acorex/components/toast';\nimport { AXPSessionService } from '@acorex-platform/framework-client/auth';\nimport { AXPSettingsService } from '@acorex-platform/framework-client/common';\nimport { AXPRtcApiAbstract } from '@acorex-platform/extension-rtc-core-gateway';\nimport { AXPRegionalSetting } from '@acorex-platform/framework-shared/core';\nimport { AXTranslationModule, AXTranslationService } from '@acorex/core/translation';\nimport { AXLocaleService } from '@acorex/core/locale';\nimport { AsyncPipe } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n DestroyRef,\n effect,\n inject,\n input,\n signal,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { filter } from 'rxjs';\n\nimport {\n axmChatCallLogGroupAttendanceKey,\n axmChatCallLogHeadlineKey,\n axmChatCallLogTranslateParams,\n axmReadChatCallLog,\n axmResolveCallDurationTranslation,\n type AXMChatCallLogInfo,\n} from '../call/chat-call-log.util';\nimport { axmEnsureChatCallRtcReady } from '../call/chat-call-rtc-ready.util';\nimport { axmOpenChatCallSessionDialog } from '../call/open-chat-call-session.dialog';\nimport { AXMChatCallActiveSessionService } from '../call/chat-call-active-session.service';\n\n//#endregion\n\n//#region ----- Types -----\n\ntype AXMChatCallLogDirection = 'incoming' | 'outgoing';\ntype AXMChatCallLogIconTone = 'success' | 'danger';\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 templateUrl: './chat-call-log-message-renderer.component.html',\n styleUrl: './chat-call-log-message-renderer.component.css',\n host: {\n '(contextmenu)': 'onContextMenu($event)',\n },\n})\nexport class AXMChatCallLogMessageRendererComponent implements AXConversationMessageRendererComponent {\n readonly message = input.required<import('@acorex/components/conversation').AXConversationMessage>();\n\n //#region ----- Services & Dependencies -----\n\n private readonly session = inject(AXPSessionService);\n private readonly translation = inject(AXTranslationService);\n private readonly localeService = inject(AXLocaleService);\n private readonly settings = inject(AXPSettingsService);\n private readonly conversationService = inject(AXConversationService);\n private readonly popupService = inject(AXPopupService);\n private readonly activeCallSessions = inject(AXMChatCallActiveSessionService);\n private readonly toastService = inject(AXToastService);\n private readonly rtcApi = inject(AXPRtcApiAbstract, { optional: true });\n private readonly destroyRef = inject(DestroyRef);\n\n //#endregion\n\n //#region ----- State Signals -----\n\n private readonly contentState = signal<AXConversationMessageRendererContentState>('ready');\n protected readonly translateParams = signal<Record<string, string>>({});\n protected readonly callbackBusy = signal(false);\n\n //#endregion\n\n //#region ----- Lifecycle -----\n\n constructor() {\n effect(() => {\n const info = this.log();\n void this.message();\n void this.refreshTranslateParams(info);\n });\n\n this.settings.onChanged\n .pipe(\n filter((change) => change.keys.includes(AXPRegionalSetting.Language)),\n takeUntilDestroyed(this.destroyRef),\n )\n .subscribe(() => {\n void this.refreshTranslateParams(this.log());\n });\n }\n\n //#endregion\n\n //#region ----- Computed Properties -----\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 /** Own bubble (primary/blue) — icons must use on-primary, not status red/green. */\n protected readonly isOwnBubble = computed(() => {\n const viewerId = this.session.user?.id?.trim() ?? '';\n const senderId = this.message().senderId?.trim() ?? '';\n return Boolean(viewerId && senderId && viewerId === senderId);\n });\n\n protected readonly isRtlLayout = computed(() => this.localeService.activeProfile()?.i18nMeta?.rtl === true);\n\n protected readonly headlineKey = computed(() => {\n const info = this.log();\n if (!info) {\n return '@conversation:chat.call.log.headline.missed';\n }\n return axmChatCallLogHeadlineKey(info, this.session.user?.id ?? null);\n });\n\n protected readonly showGroupAttendance = computed(() => {\n const info = this.log();\n return Boolean(\n info?.isGroup &&\n info.outcome === 'completed' &&\n (info.joinedUserNames?.length || info.absentUserNames?.length),\n );\n });\n\n protected readonly groupAttendanceKey = computed(() => {\n const info = this.log();\n if (!info) {\n return '@conversation:chat.call.log.group-attendance-joined-only';\n }\n return axmChatCallLogGroupAttendanceKey(info);\n });\n\n /**\n * Call direction relative to the viewer (drives arrow ↙ / ↗).\n * Based on who initiated the call — not who last acted (decline/cancel).\n */\n protected readonly callDirection = computed((): AXMChatCallLogDirection => {\n const info = this.log();\n if (!info) {\n return 'incoming';\n }\n return this.isViewerInitiator(info) ? 'outgoing' : 'incoming';\n });\n\n /**\n * Status color (Telegram-style):\n * - completed (answered) → green\n * - missed / declined / cancelled → red\n */\n protected readonly iconTone = computed((): AXMChatCallLogIconTone => {\n const outcome = this.log()?.outcome;\n return outcome === 'completed' ? 'success' : 'danger';\n });\n\n /** Status glyph: cancelled → ban; otherwise diagonal arrow by direction. */\n protected readonly statusIconClass = computed(() => {\n if (this.log()?.outcome === 'cancelled') {\n return 'fa-ban';\n }\n return this.callDirection() === 'outgoing'\n ? 'fa-arrow-up axm-chat-call-log__arrow axm-chat-call-log__arrow--out'\n : 'fa-arrow-down axm-chat-call-log__arrow axm-chat-call-log__arrow--in';\n });\n\n /** Large trailing call-back glyph (phone / video). */\n protected readonly callbackIconClass = computed(() => (this.isVideo() ? 'fa-video' : 'fa-phone'));\n\n //#endregion\n\n //#region ----- Event Handlers -----\n\n /** Blocks bubble context menu — call logs are not actionable chat messages. */\n protected onContextMenu(event: Event): void {\n event.preventDefault();\n event.stopPropagation();\n }\n\n /** Quick re-call with the same media type as this log entry. */\n protected async onCallbackClick(event: Event): Promise<void> {\n event.preventDefault();\n event.stopPropagation();\n if (this.callbackBusy()) {\n return;\n }\n\n const conversationId = this.message().conversationId?.trim() ?? '';\n if (!conversationId) {\n return;\n }\n\n const active = this.conversationService.activeConversation();\n const conversation =\n active?.id === conversationId\n ? active\n : this.conversationService.conversations().find((item) => item.id === conversationId);\n if (!conversation?.id?.trim()) {\n return;\n }\n\n this.callbackBusy.set(true);\n try {\n if (\n !(await axmEnsureChatCallRtcReady({\n rtc: this.rtcApi,\n translation: this.translation,\n toast: this.toastService,\n }))\n ) {\n return;\n }\n\n await axmOpenChatCallSessionDialog({\n conversation,\n media: this.log()?.media === 'video' ? 'video' : 'voice',\n popupService: this.popupService,\n activeCallSessions: this.activeCallSessions,\n });\n } finally {\n this.callbackBusy.set(false);\n }\n }\n\n //#endregion\n\n //#region ----- Icon helpers -----\n\n /** True when the current user started the call (outgoing direction). */\n private isViewerInitiator(info: AXMChatCallLogInfo): boolean {\n const viewer = this.session.user?.id?.trim() ?? '';\n const initiator = info.initiatorUserId?.trim() ?? '';\n return Boolean(viewer && initiator && viewer === initiator);\n }\n\n //#endregion\n\n //#region ----- Display formatting -----\n\n private async refreshTranslateParams(info: AXMChatCallLogInfo | null | undefined): Promise<void> {\n if (!info) {\n this.translateParams.set({});\n return;\n }\n\n const params = axmChatCallLogTranslateParams(info);\n\n if (!params['name']?.trim()) {\n params['name'] = await this.translation.translateAsync('@conversation:chat.call.log.subject.unknown');\n }\n\n if (info.durationSec != null) {\n const durationTranslation = axmResolveCallDurationTranslation(info.durationSec);\n params['duration'] = await this.translation.translateAsync(durationTranslation.key, {\n params: durationTranslation.params,\n });\n }\n\n this.translateParams.set(params);\n }\n\n //#endregion\n}\n//#endregion\n","@if (log(); as info) {\n <div\n class=\"axm-chat-call-log\"\n [attr.dir]=\"isRtlLayout() ? 'rtl' : 'ltr'\"\n [class.axm-chat-call-log--video]=\"isVideo()\"\n [class.axm-chat-call-log--success]=\"iconTone() === 'success'\"\n [class.axm-chat-call-log--danger]=\"iconTone() === 'danger'\"\n [class.axm-chat-call-log--own]=\"isOwnBubble()\"\n [class.axm-chat-call-log--outgoing]=\"callDirection() === 'outgoing'\"\n [class.axm-chat-call-log--incoming]=\"callDirection() === 'incoming'\"\n >\n <!-- ----- Call-back action (Telegram phone button) ----- -->\n <button\n type=\"button\"\n class=\"axm-chat-call-log__callback\"\n [disabled]=\"callbackBusy()\"\n [attr.aria-label]=\"'@conversation:chat.call.log.callback' | translate | async\"\n (click)=\"onCallbackClick($event)\"\n >\n <i [class]=\"'fa-solid ' + callbackIconClass()\" aria-hidden=\"true\"></i>\n </button>\n\n <div class=\"axm-chat-call-log__body\">\n <!-- ----- Telegram-style status headline ----- -->\n <span class=\"axm-chat-call-log__title\">{{\n headlineKey() | translate: { params: translateParams() } | async\n }}</span>\n\n <div class=\"axm-chat-call-log__meta\">\n <!-- ----- Status marker + call/ring duration (bubble already shows message time) ----- -->\n <span class=\"axm-chat-call-log__status\" aria-hidden=\"true\">\n <i [class]=\"'fa-solid ' + statusIconClass()\"></i>\n </span>\n @if (translateParams()['duration']; as duration) {\n <span class=\"axm-chat-call-log__meta-text\">{{ duration }}</span>\n }\n </div>\n\n @if (showGroupAttendance()) {\n <!-- ----- Group attendance summary when the call completed ----- -->\n <span class=\"axm-chat-call-log__detail\">{{\n groupAttendanceKey() | translate: { params: translateParams() } | async\n }}</span>\n }\n </div>\n </div>\n}\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: 'call-log',\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 { 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","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 ----- Imports -----\n\nimport type { AXConversationMessage } from '@acorex/components/conversation';\nimport { AXConversationService } from '@acorex/components/conversation';\nimport { inject } from '@angular/core';\n\nimport { axmReadChatCallLog } from '../call/chat-call-log.util';\nimport { axmIsBulletinFeedMessage } from './bulletin-feed-message.util';\n\n//#endregion\n\n//#region ----- Message action visibility -----\n\n/** Call-log rows are system-style entries — no reply / forward / edit / delete context actions. */\nexport function axmMessageSupportsContextMenuActions(message: AXConversationMessage): boolean {\n return axmReadChatCallLog(message) === null && !axmIsBulletinFeedMessage(message);\n}\n\nexport function axmMessageRendererCapabilityEnabled(\n message: AXConversationMessage,\n capability: 'supportsReplies' | 'supportsEdit' | 'supportsForward',\n): boolean {\n const registry = inject(AXConversationService).registry;\n const renderer = registry.messageRenderers.getRenderer(message);\n if (!renderer) {\n return true;\n }\n return renderer.capabilities[capability] !== false;\n}\n\n//#endregion\n","//#region ----- Imports -----\n\nimport { AXPSessionService } from '@acorex-platform/framework-client/auth';\nimport { AXPCommandService } from '@acorex-platform/framework-client/runtime';\nimport {\n AXPInAppInboxConnectorService,\n isInAppInboxUnread,\n type AXPInAppInboxItem,\n} from '@acorex-platform/module-communication-management-client';\nimport { DestroyRef, effect, inject, Injectable } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { distinctUntilChanged, map } from 'rxjs';\n\nimport { CONVERSATION_SYNC_READ_STATE_COMMAND } from '../../commands/conversation-command.keys';\nimport { AXMChatEntityUserApi } from '../plugins/services/entity/chat-entity-user.api';\nimport { parseConversationChatInAppCorrelationId } from './conversation-chat-notification.util';\nimport { AXMConversationFocusService } from './conversation-focus.service';\nimport { AXMConversationInAppNotificationSyncService } from './conversation-in-app-notification-sync.service';\n\n//#endregion\n\nconst CHAT_IN_APP_DEFINITION_KEY = 'conversation-chat-message';\n\n//#region ----- Chat ↔ inbox read bridge -----\n\n/**\n * Keeps chat unread and in-app chat notifications aligned:\n * focused / muted rooms clear the tray unread; marking a notification read marks the chat read.\n */\n@Injectable({ providedIn: 'root' })\nexport class AXMConversationChatInboxBridgeService {\n //#region ----- Services & Dependencies -----\n\n private readonly inboxConnector = inject(AXPInAppInboxConnectorService, { optional: true });\n private readonly focus = inject(AXMConversationFocusService);\n private readonly inAppSync = inject(AXMConversationInAppNotificationSyncService);\n private readonly userApi = inject(AXMChatEntityUserApi);\n private readonly session = inject(AXPSessionService);\n private readonly commandService = inject(AXPCommandService);\n private readonly destroyRef = inject(DestroyRef);\n\n //#endregion\n\n //#region ----- State -----\n\n private primed = false;\n private reconcileChain: Promise<void> = Promise.resolve();\n private readonly reverseSyncInFlight = new Set<string>();\n\n //#endregion\n\n constructor() {\n this.session.user$\n .pipe(\n map((user) => user?.id?.trim() ?? null),\n distinctUntilChanged(),\n takeUntilDestroyed(this.destroyRef),\n )\n .subscribe(() => {\n this.primed = false;\n this.inAppSync.clearRememberedReadDeliveries();\n this.reverseSyncInFlight.clear();\n });\n\n effect(() => {\n this.focus.focusedConversationIdSignal();\n this.inboxConnector?.inboxList();\n this.reconcileChain = this.reconcileChain\n .then(() => this.reconcile())\n .catch(() => undefined);\n });\n }\n\n private async reconcile(): Promise<void> {\n if (!this.inboxConnector) {\n return;\n }\n\n await this.inboxConnector.ensureReady();\n const items = this.inboxConnector.inboxList();\n\n const userId = this.session.user?.id?.trim();\n if (!userId) {\n return;\n }\n\n const chatItems = items.filter((item) => item.definitionKey === CHAT_IN_APP_DEFINITION_KEY);\n\n for (const item of chatItems) {\n const conversationId = this.conversationIdFromItem(item);\n if (!conversationId) {\n continue;\n }\n\n if (isInAppInboxUnread(item.readAt)) {\n if (this.focus.isFocused(conversationId)) {\n this.inAppSync.rememberReadDeliveryId(item.id);\n await this.inAppSync.markConversationInAppNotificationRead(conversationId, userId, {\n force: true,\n });\n continue;\n }\n\n const preferences = await this.userApi.getConversationPreferencesForRoom(conversationId);\n const muted =\n preferences.notifications === false ||\n (preferences.mutedUntil != null && preferences.mutedUntil.getTime() > Date.now());\n if (muted) {\n await this.inAppSync.dismissConversationInAppNotification(conversationId, userId, {\n force: true,\n });\n }\n continue;\n }\n\n if (!this.primed) {\n this.inAppSync.rememberReadDeliveryId(item.id);\n continue;\n }\n\n if (this.inAppSync.hasRememberedReadDelivery(item.id)) {\n continue;\n }\n\n this.inAppSync.rememberReadDeliveryId(item.id);\n await this.syncChatFromNotification(conversationId, userId);\n }\n\n this.primed = true;\n }\n\n private conversationIdFromItem(item: AXPInAppInboxItem): string | null {\n const parsed = parseConversationChatInAppCorrelationId(item.correlationId);\n if (parsed?.conversationId) {\n return parsed.conversationId;\n }\n const options = item.actions?.[0]?.command?.options;\n const conversationId = options?.['conversationId'];\n return typeof conversationId === 'string' && conversationId.trim() ? conversationId.trim() : null;\n }\n\n private async syncChatFromNotification(conversationId: string, currentUserId: string): Promise<void> {\n if (this.reverseSyncInFlight.has(conversationId)) {\n return;\n }\n this.reverseSyncInFlight.add(conversationId);\n try {\n await this.commandService.execute(CONVERSATION_SYNC_READ_STATE_COMMAND, {\n conversationId,\n currentUserId,\n force: true,\n fromInbox: true,\n });\n } finally {\n this.reverseSyncInFlight.delete(conversationId);\n }\n }\n}\n\n//#endregion\n","import { inject, Injectable } from '@angular/core';\nimport { AXConversationService } from '@acorex/components/conversation';\nimport { AXPSessionService } from '@acorex-platform/framework-client/auth';\nimport {\n AXPCommunicationManagementClient,\n AXPInAppInboxConnectorService,\n AXPInAppInboxRealtimeService,\n} from '@acorex-platform/module-communication-management-client';\nimport { AXMChatEntityUserApi } from '../plugins/services/entity/chat-entity-user.api';\nimport { axmIsAssistStreamingMessage } from '../plugins/utils/conversation-unread.util';\nimport {\n buildChatInAppCommunicationSendInput,\n buildConversationChatInAppCorrelationPrefix,\n} from './conversation-chat-notification.util';\nimport { AXMConversationFocusService } from './conversation-focus.service';\n\n//#region ---- Login catch-up for stale chat inbox rows ----\n\n/**\n * After conversations load, ensure chat inbox rows exist and match the room's\n * last inbound message (covers offline delivery gaps and stale previews).\n */\n@Injectable({ providedIn: 'root' })\nexport class AXMConversationChatInboxCatchUpService {\n private readonly session = inject(AXPSessionService);\n private readonly conversationService = inject(AXConversationService);\n private readonly focus = inject(AXMConversationFocusService);\n private readonly userApi = inject(AXMChatEntityUserApi);\n private readonly communicationClient = inject(AXPCommunicationManagementClient, { optional: true });\n private readonly inboxConnector = inject(AXPInAppInboxConnectorService, { optional: true });\n private readonly inboxRealtime = inject(AXPInAppInboxRealtimeService);\n\n async reconcileStaleChatInboxRows(): Promise<void> {\n if (!this.communicationClient || !this.inboxConnector) {\n return;\n }\n\n const currentUserId = this.session.user?.id?.trim();\n if (!currentUserId) {\n return;\n }\n\n await this.inboxConnector.ensureReady();\n const inboxItems = this.inboxConnector.inboxList();\n let refreshed = false;\n\n for (const conversation of this.conversationService.conversations()) {\n const conversationId = conversation.id?.trim();\n const lastMessage = conversation.lastMessage;\n if (!conversationId || !lastMessage?.id || lastMessage.senderId === currentUserId) {\n continue;\n }\n if (axmIsAssistStreamingMessage(lastMessage)) {\n continue;\n }\n if ((conversation.unreadCount ?? 0) <= 0) {\n continue;\n }\n if (this.focus.isFocused(conversationId)) {\n continue;\n }\n\n const existing = inboxItems.find((item) =>\n item.correlationId?.trim().startsWith(buildConversationChatInAppCorrelationPrefix(conversationId)),\n );\n if (existing) {\n const correlation = existing.correlationId?.trim() ?? '';\n const correlationMessageId = correlation.split(':')[2]?.trim();\n if (correlationMessageId === lastMessage.id) {\n continue;\n }\n }\n\n const preferences = await this.userApi.getConversationPreferencesForRoom(conversationId);\n if (preferences.notifications === false) {\n continue;\n }\n if (preferences.mutedUntil && preferences.mutedUntil.getTime() > Date.now()) {\n continue;\n }\n\n const sender = conversation.participants?.find((participant) => participant.id === lastMessage.senderId);\n const senderName = sender?.name?.trim() || 'User';\n await this.communicationClient.send(\n buildChatInAppCommunicationSendInput(lastMessage, conversation, senderName, currentUserId),\n );\n refreshed = true;\n }\n\n if (refreshed) {\n this.inboxRealtime.notifyChanged({ type: 'refresh' });\n }\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 { AXMConversationChatInboxCatchUpService } from './conversation-chat-inbox-catch-up.service';\nimport { AXMConversationEntityStoreService } from './conversation-entity-store.service';\nimport { AXMConversationFocusService } from './conversation-focus.service';\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 conversationStore = inject(AXMConversationEntityStoreService);\n private readonly focus = inject(AXMConversationFocusService);\n private readonly inboxCatchUp = inject(AXMConversationChatInboxCatchUpService);\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.focus.setFocusedConversation(null);\n this.conversationStore.clearSessionCaches();\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 this.focus.setFocusedConversation(null);\n this.conversationStore.clearSessionCaches();\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 await this.inboxCatchUp.reconcileStaleChatInboxRows();\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 { inject, Injectable } from '@angular/core';\n\nimport { AXMConversationEntityStoreService } from './conversation-entity-store.service';\n\n//#endregion\n\n//#region ----- Service -----\n\n/**\n * Forwards remote typing packets onto the conversation realtime bus.\n * Display state is owned by {@link AXConversationService} (ephemeral, not stored on the room).\n */\n@Injectable()\nexport class AXMConversationTypingSyncService {\n private readonly store = inject(AXMConversationEntityStoreService);\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.store.publishTypingIndicator({\n conversationId: scopedConversationId,\n userId: scopedUserId,\n timestamp: new Date(),\n isTyping: active,\n });\n }\n}\n\n//#endregion\n","//#region ---- Imports ----\n\nimport { AXPSessionService } from '@acorex-platform/framework-client/auth';\nimport { AXP_APP_STARTUP_PRIORITY, provideAppStartUpTask } from '@acorex-platform/framework-client/core';\nimport { AXPUserAvatarComponent } from '@acorex-platform/framework-client/layout/components';\nimport { AXPCommandService } from '@acorex-platform/framework-client/runtime';\nimport {\n AX_CONVERSATION_AUDIO_RENDERER,\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 { axmIsAnnouncementChannel, axmIsChannelRoom } from '@acorex-platform/module-conversation-client/contracts';\nimport { axmConversationFromActionTarget } from './plugins/utils/announcement-channel-access.util';\nimport { inject, Type } from '@angular/core';\nimport { CONVERSATION_SYNC_READ_STATE_COMMAND } from '../commands/conversation-command.keys';\nimport { AXM_CHAT_COMPOSER_VOICE_RECORDING_ACTION } from './plugins/composer/chat-voice-recording-composer.action';\nimport { AXM_CHAT_INFO_BAR_CALL_ACTION, AXM_CHAT_INFO_BAR_DEBUG_ACTION } from './plugins/info-bar-actions/chat-info-bar-actions';\nimport { AXM_CONVERSATION_BOT_RENDERER } from './plugins/message-renderers/assist-message-renderer.plugin';\nimport { AXM_CONVERSATION_BULLETIN_FEED_ITEM_RENDERER } from './plugins/message-renderers/bulletin-feed-item-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, AXMChatAnnouncementChannelService } from './plugins/services/entity';\nimport { AXM_CONVERSATION_TAB_BOT, axmInboxConversationTab } from './plugins/tabs/chat-conversation-tabs';\nimport { axmMessageRendererCapabilityEnabled, axmMessageSupportsContextMenuActions } from './plugins/utils/chat-message-action.util';\nimport { AXMConversationAppearanceSyncService } from './services/conversation-appearance-sync.service';\nimport { AXMConversationChatInboxBridgeService } from './services/conversation-chat-inbox-bridge.service';\nimport { AXMConversationSessionSyncService } from './services/conversation-session-sync.service';\nimport { AXMConversationTypingSyncService } from './services/conversation-typing-sync.service';\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 AXMChatAnnouncementChannelService,\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: 500,\n typingIndicatorTimeout: 2500,\n typingDisplayDuration: 4000,\n messageReadDebounce: 3000,\n features: {\n composerTabs: [],\n },\n },\n registry: {\n messageRenderers: [\n AXM_CONVERSATION_BULLETIN_FEED_ITEM_RENDERER,\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) => axmMessageSupportsContextMenuActions(message) && 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: (message: AXConversationMessage) => axmMessageSupportsContextMenuActions(message) && axmMessageRendererCapabilityEnabled(message, 'supportsReplies') && message.metadata?.['isAssistResponse'] !== true,\n handler: async (context: { message: AXConversationMessage }) => {\n const composer = inject(AXConversationComposerService);\n composer.startReply(context.message);\n },\n },\n {\n ...AX_CONVERSATION_MESSAGE_FORWARD_ACTION,\n visible: (message: AXConversationMessage) => axmMessageSupportsContextMenuActions(message) && axmMessageRendererCapabilityEnabled(message, 'supportsForward'),\n },\n {\n ...AX_CONVERSATION_MESSAGE_EDIT_ACTION,\n visible: (message: AXConversationMessage, currentUser) =>\n axmMessageSupportsContextMenuActions(message) &&\n axmMessageRendererCapabilityEnabled(message, 'supportsEdit') &&\n AX_CONVERSATION_MESSAGE_EDIT_ACTION.visible(message, currentUser),\n },\n {\n ...AX_CONVERSATION_MESSAGE_DELETE_ACTION,\n visible: (message: AXConversationMessage, currentUser) => axmMessageSupportsContextMenuActions(message) && AX_CONVERSATION_MESSAGE_DELETE_ACTION.visible(message, currentUser),\n },\n ],\n // composerTabs: [AX_CONVERSATION_COMPOSER_EMOJI_TAB, AX_CONVERSATION_COMPOSER_STICKER_TAB],\n conversationTabs: [\n axmInboxConversationTab(AX_CONVERSATION_TAB_ALL),\n axmInboxConversationTab(AX_CONVERSATION_TAB_PRIVATE),\n axmInboxConversationTab(AX_CONVERSATION_TAB_GROUPS),\n AXM_CONVERSATION_TAB_BOT,\n ],\n infoBarActions: [\n AX_CONVERSATION_INFO_BAR_SEARCH_ACTION,\n {\n ...AXM_CHAT_INFO_BAR_CALL_ACTION,\n visible: (context: { conversation: AXConversation }) =>\n !axmIsChannelRoom(context.conversation),\n },\n AX_CONVERSATION_INFO_BAR_MUTE_ACTION,\n AXM_CHAT_INFO_BAR_DEBUG_ACTION,\n AX_CONVERSATION_INFO_BAR_DIVIDER,\n {\n ...AX_CONVERSATION_INFO_BAR_DELETE_ACTION,\n visible: (context: { conversation: AXConversation }) =>\n !axmIsAnnouncementChannel(context.conversation) &&\n (AX_CONVERSATION_INFO_BAR_DELETE_ACTION.visible?.(context) ?? true),\n },\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 {\n ...AX_CONVERSATION_ITEM_MARK_READ_ACTION,\n visible: (target: AXConversation | { conversation: AXConversation }, ...rest: unknown[]) => {\n const conversation = axmConversationFromActionTarget(target);\n if (axmIsChannelRoom(conversation)) {\n return false;\n }\n const original = (\n AX_CONVERSATION_ITEM_MARK_READ_ACTION as { visible?: (...args: unknown[]) => boolean }\n ).visible;\n return original ? original(target, ...rest) : true;\n },\n handler: async (context: { conversation: AXConversation }) => {\n const commandService = inject(AXPCommandService);\n const session = inject(AXPSessionService);\n const currentUserId = session.user?.id?.trim();\n if (!currentUserId) {\n return;\n }\n await commandService.execute(CONVERSATION_SYNC_READ_STATE_COMMAND, {\n conversationId: context.conversation.id,\n currentUserId,\n force: true,\n });\n },\n },\n AX_CONVERSATION_ITEM_DIVIDER,\n {\n ...AX_CONVERSATION_ITEM_DELETE_ACTION,\n destructive: true,\n visible: (target: AXConversation | { conversation: AXConversation }, ...rest: unknown[]) => {\n const conversation = axmConversationFromActionTarget(target);\n if (axmIsAnnouncementChannel(conversation)) {\n return false;\n }\n const original = (\n AX_CONVERSATION_ITEM_DELETE_ACTION as { visible?: (...args: unknown[]) => boolean }\n ).visible;\n return original ? original(target, ...rest) : true;\n },\n },\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 const appearance = inject(AXMConversationAppearanceSyncService);\n inject(AXMConversationChatInboxBridgeService);\n return {\n name: 'conversation-session-sync',\n priority: AXP_APP_STARTUP_PRIORITY.conversationSessionSync,\n run: async () => {\n appearance.start();\n sync.start();\n },\n };\n }),\n];\n\n//#endregion\n","//#region ----- Imports -----\n\nimport {\n AXPRtcApiAbstract,\n AXERtcGatewayService,\n} from '@acorex-platform/extension-rtc-core-gateway';\n\n//#endregion\n\n//#region ----- Providers -----\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//#endregion\n","import { inject, Injectable } from '@angular/core';\nimport type { AXConversationMessage } from '@acorex/components/conversation';\nimport { AXPSessionService } from '@acorex-platform/framework-client/auth';\nimport {\n AXPCommunicationManagementClient,\n AXPInAppInboxConnectorService,\n AXPInAppInboxRealtimeService,\n} from '@acorex-platform/module-communication-management-client';\nimport { AXMChatEntityUserApi } from '../plugins/services/entity/chat-entity-user.api';\nimport { axmIsAssistStreamingMessage } from '../plugins/utils/conversation-unread.util';\nimport {\n buildChatInAppLocalInboxItem,\n buildConversationChatLocalInboxId,\n} from './conversation-chat-notification.util';\nimport { AXMConversationEntityStoreService } from './conversation-entity-store.service';\nimport { AXMConversationFocusService } from './conversation-focus.service';\nimport { AXMConversationInAppNotificationSyncService } from './conversation-in-app-notification-sync.service';\n\n//#region ---- Chat in-app notification ----\n\n/**\n * Sends a single in-app inbox row when an incoming chat message arrives while the\n * conversation is not focused. Invoked from the conversation realtime handler only.\n */\n@Injectable({ providedIn: 'root' })\nexport class AXMConversationChatInAppNotificationService {\n private readonly focus = inject(AXMConversationFocusService);\n private readonly session = inject(AXPSessionService);\n private readonly store = inject(AXMConversationEntityStoreService);\n private readonly userApi = inject(AXMChatEntityUserApi);\n private readonly communicationClient = inject(AXPCommunicationManagementClient, { optional: true });\n private readonly inboxConnector = inject(AXPInAppInboxConnectorService, { optional: true });\n private readonly inboxRealtime = inject(AXPInAppInboxRealtimeService);\n private readonly inAppSync = inject(AXMConversationInAppNotificationSyncService);\n\n private readonly notifiedKeys = new Set<string>();\n private readonly notifyChains = new Map<string, Promise<void>>();\n\n maybeNotifyForIncomingMessage(message: AXConversationMessage): void {\n void this.maybeNotifyForIncomingMessageInternal(message);\n }\n\n /** Marks a raced inbox row read when the user is already viewing the thread. */\n markLeftoverReadForFocusedConversation(conversationId: string, recipientUserId: string): void {\n void this.inAppSync.markConversationInAppNotificationRead(conversationId, recipientUserId, { force: true });\n }\n\n private async maybeNotifyForIncomingMessageInternal(message: AXConversationMessage): Promise<void> {\n if (!this.communicationClient && !this.inboxConnector) {\n return;\n }\n\n const messageId = message.id?.trim();\n const conversationId = message.conversationId?.trim();\n const currentUserId = this.session.user?.id?.trim();\n const senderId = message.senderId?.trim();\n if (!messageId || !conversationId || !currentUserId || !senderId || senderId === currentUserId) {\n return;\n }\n if (axmIsAssistStreamingMessage(message)) {\n return;\n }\n if (this.focus.isFocused(conversationId)) {\n return;\n }\n\n const chainKey = `${conversationId}:${currentUserId}`;\n const messageDedupeKey = `${conversationId}:${messageId}:${currentUserId}`;\n if (this.notifiedKeys.has(messageDedupeKey)) {\n return;\n }\n\n const previous = this.notifyChains.get(chainKey) ?? Promise.resolve();\n const next = previous\n .then(() =>\n this.sendNotification(message, conversationId, currentUserId, messageDedupeKey),\n )\n .finally(() => {\n if (this.notifyChains.get(chainKey) === next) {\n this.notifyChains.delete(chainKey);\n }\n });\n this.notifyChains.set(chainKey, next);\n await next;\n }\n\n private async sendNotification(\n message: AXConversationMessage,\n conversationId: string,\n currentUserId: string,\n messageDedupeKey: string,\n ): Promise<void> {\n if (this.notifiedKeys.has(messageDedupeKey)) {\n return;\n }\n\n const cached = this.store.getCachedConversation(conversationId);\n const conversation = cached ?? (await this.store.getConversation(conversationId));\n if (!conversation) {\n return;\n }\n const preferences = await this.userApi.getConversationPreferencesForRoom(conversationId);\n if (preferences.notifications === false) {\n return;\n }\n if (preferences.mutedUntil && preferences.mutedUntil.getTime() > Date.now()) {\n return;\n }\n if (this.focus.isFocused(conversationId)) {\n return;\n }\n\n const sender = conversation.participants?.find((participant) => participant.id === message.senderId);\n let senderName = sender?.name?.trim();\n if (!senderName && sender?.id) {\n senderName = (await this.userApi.getUserById(sender.id).catch(() => null))?.name?.trim();\n }\n\n const { sendInput, localItem } = buildChatInAppLocalInboxItem({\n message,\n conversation,\n senderName: senderName ?? 'User',\n recipientUserId: currentUserId,\n });\n\n // Show in the tray immediately (same beat as the Conversations badge).\n if (this.inboxConnector) {\n try {\n await this.inboxConnector.upsertLocalItems([localItem]);\n } catch {\n // Persistence path below may still succeed.\n }\n }\n\n if (!this.communicationClient) {\n this.notifiedKeys.add(messageDedupeKey);\n return;\n }\n\n try {\n const result = await this.communicationClient.send(sendInput);\n this.notifiedKeys.add(messageDedupeKey);\n\n const deliveryId = result.deliveryId?.trim();\n if (deliveryId && this.inboxConnector) {\n await this.inboxConnector.replacePendingChatWithDelivery(\n buildConversationChatLocalInboxId(conversationId),\n deliveryId,\n );\n }\n this.inboxRealtime.notifyChanged({ type: 'refresh' });\n } catch {\n // Keep the optimistic local row; catch-up / next message may persist later.\n this.notifiedKeys.add(messageDedupeKey);\n }\n }\n}\n\n//#endregion\n","import { extractMessageTextFromPayload } from '@acorex-platform/module-conversation-client/contracts';\nimport type { AXConversationMessage } from '@acorex/components/conversation';\n\n//#region ---- Prefer local user-text edit ----\n\n/**\n * Entity/SSE updates can echo a cached pre-edit payload after the client already\n * applied the new text. Keep the newer local bubble until a strictly newer edit arrives.\n */\nexport function axmPreferLocalEditedUserText(\n local: AXConversationMessage | null | undefined,\n incoming: AXConversationMessage,\n): AXConversationMessage {\n if (!local || local.type !== 'text' || incoming.type !== 'text') {\n return incoming;\n }\n if (local.metadata?.['isAssistResponse'] === true || incoming.metadata?.['isAssistResponse'] === true) {\n return incoming;\n }\n\n const localText = extractMessageTextFromPayload(local.payload);\n const incomingText = extractMessageTextFromPayload(incoming.payload);\n if (!localText || localText === incomingText) {\n return incoming;\n }\n\n const localEdited = local.editedAt ? new Date(local.editedAt).getTime() : 0;\n const incomingEdited = incoming.editedAt ? new Date(incoming.editedAt).getTime() : 0;\n // Server/entity-cache echoes can stamp a slightly newer editedAt on the old payload.\n if (localEdited > 0 && incomingEdited < localEdited + 5000) {\n return { ...incoming, payload: local.payload, editedAt: local.editedAt };\n }\n return incoming;\n}\n\n//#endregion\n","//#region ---- Realtime message dedupe ----\n\nconst RECENT_MESSAGE_EVENT_TTL_MS = 15_000;\nconst recentMessageEvents = new Map<string, number>();\n\n/** Stable key so read-receipts do not swallow a later edit/delete of the same id. */\nexport function conversationMessageEventFingerprint(\n op: string,\n snapshot?: Record<string, unknown>,\n): string {\n const scopedOp = op.trim();\n if (scopedOp === 'created' || scopedOp === 'deleted' || !snapshot) {\n return '';\n }\n\n const editedAt = String(snapshot['editedAt'] ?? '');\n const deleted = snapshot['deleted'] === true ? '1' : '0';\n const status = String(snapshot['status'] ?? '');\n let payloadKey = '';\n try {\n payloadKey = JSON.stringify(snapshot['payload'] ?? null);\n } catch {\n payloadKey = '';\n }\n return `${editedAt}:${deleted}:${status}:${payloadKey}`;\n}\n\n/** Drop duplicate conversation.message envelopes (overlapping Socket.IO rooms). */\nexport function shouldSkipDuplicateConversationMessageEvent(\n messageId: string,\n op: string,\n fingerprint = '',\n): boolean {\n const scopedMessageId = messageId.trim();\n const scopedOp = op.trim();\n if (!scopedMessageId || !scopedOp) {\n return true;\n }\n\n // Read-receipts and edits both publish `updated`. Without a snapshot we cannot\n // tell them apart, so coalescing would swallow the later event for 15s.\n if (scopedOp !== 'created' && !fingerprint) {\n return false;\n }\n\n const key = `${scopedMessageId}:${scopedOp}:${fingerprint}`;\n const now = Date.now();\n const lastSeen = recentMessageEvents.get(key);\n if (lastSeen != null && now - lastSeen < RECENT_MESSAGE_EVENT_TTL_MS) {\n return true;\n }\n\n recentMessageEvents.set(key, now);\n\n if (recentMessageEvents.size > 500) {\n for (const [entryKey, stampedAt] of recentMessageEvents) {\n if (now - stampedAt >= RECENT_MESSAGE_EVENT_TTL_MS) {\n recentMessageEvents.delete(entryKey);\n }\n }\n }\n\n return false;\n}\n\n//#endregion\n","import { AXPSessionService } from '@acorex-platform/framework-client/auth';\nimport { AXP_APP_STARTUP_PRIORITY, provideAppStartUpTask } from '@acorex-platform/framework-client/core';\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 } from '@acorex-platform/module-conversation-client/contracts';\nimport type { AXConversationMessage } from '@acorex/components/conversation';\nimport { inject, type Provider } from '@angular/core';\nimport { axmHydrateRealtimeConversationMessage } from '../plugins/services/entity/chat-entity-mapper.util';\nimport { axmMapUserPresenceToConversationUpdate } from '../plugins/utils/axm-chat-presence.util';\nimport { axmIsConversationParticipant } from '../plugins/utils/conversation-participant.util';\nimport { axmIsAssistResponseMessage, axmIsAssistStreamingMessage, axmMessageCountsTowardUnread } from '../plugins/utils/conversation-unread.util';\nimport { AXMConversationChatInAppNotificationService } from './conversation-chat-in-app-notification.service';\nimport { AXMConversationEntityStoreService } from './conversation-entity-store.service';\nimport { AXMConversationFocusService } from './conversation-focus.service';\nimport { axmPreferLocalEditedUserText } from './conversation-prefer-local-edited-text.util';\nimport { conversationMessageEventFingerprint, shouldSkipDuplicateConversationMessageEvent } from './conversation-realtime-message-dedupe.util';\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 focus = inject(AXMConversationFocusService);\n const typingSync = inject(AXMConversationTypingSyncService);\n const chatInAppNotification = inject(AXMConversationChatInAppNotificationService);\n\n return {\n name: 'conversation-realtime-handlers',\n priority: AXP_APP_STARTUP_PRIORITY.realtimeHandlers,\n run: async () => {\n const notifyIncomingIfUnfocused = async (message: AXConversationMessage): Promise<void> => {\n const userId = session.user?.id?.trim();\n const conversationId = message.conversationId?.trim();\n if (userId && conversationId && focus.isFocused(conversationId)) {\n chatInAppNotification.markLeftoverReadForFocusedConversation(conversationId, userId);\n return;\n }\n chatInAppNotification.maybeNotifyForIncomingMessage(message);\n if (userId && conversationId) {\n const unreadMessage = message.status === 'read' ? { ...message, status: 'sent' as const } : message;\n await store.applyIncomingMessageUnread(unreadMessage, userId);\n }\n };\n\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 (shouldSkipDuplicateConversationMessageEvent(messageId, op, conversationMessageEventFingerprint(op, payload.message))) {\n return;\n }\n\n if (op === 'deleted') {\n store.publishMessageDeletion(messageId);\n const deletedMessage = axmHydrateRealtimeConversationMessage(payload.message, messageId, payload.conversationId?.trim() ?? '');\n if (deletedMessage) {\n store.syncConversationPreviewFromMessage({ ...deletedMessage, deleted: true });\n }\n return;\n }\n\n const conversationIdFromPayload = payload.conversationId?.trim() ?? '';\n const previous = messageId ? store.getCachedMessage(messageId) : null;\n const message = axmHydrateRealtimeConversationMessage(payload.message as Record<string, unknown> | undefined, messageId, conversationIdFromPayload) ?? (await store.getMessage(messageId));\n if (!message) {\n return;\n }\n const inboxConversationId = message.conversationId?.trim() ?? conversationIdFromPayload;\n if (inboxConversationId && !(store.getCachedConversation(inboxConversationId) ?? (await store.getConversation(inboxConversationId)))) {\n return;\n }\n\n if (op === 'updated') {\n const next = axmPreferLocalEditedUserText(previous, message);\n applyIncomingConversationMessage(store, next, 'updated');\n store.syncConversationPreviewFromMessage(next);\n store.cacheMessage(next);\n if (axmIsAssistResponseMessage(message) && !axmIsAssistStreamingMessage(message) && (!previous || axmIsAssistStreamingMessage(previous))) {\n await notifyIncomingIfUnfocused(message);\n }\n return;\n }\n\n if (op === 'created') {\n applyIncomingConversationMessage(store, message, 'created');\n store.cacheMessage(message);\n if (axmIsAssistStreamingMessage(message)) {\n return;\n }\n await notifyIncomingIfUnfocused(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 (payload.operation === 'deleted') {\n store.publishConversationDeleted(payload.id);\n return;\n }\n const mutation = payload as AXPRealtimeEntityMutationPayload & {\n actorUserId?: string;\n lastMessage?: Record<string, unknown>;\n };\n const actorUserId = mutation.actorUserId?.trim();\n const currentUserId = session.user?.id?.trim();\n const isSelfActor = Boolean(actorUserId && currentUserId && actorUserId === currentUserId);\n if (isSelfActor && bus.shouldSuppressRemoteRoomRefetch(payload.id)) {\n return;\n }\n if (!actorUserId && bus.shouldSuppressRemoteRoomRefetch(payload.id)) {\n return;\n }\n const envelopeLastMessage = axmHydrateRealtimeConversationMessage(mutation.lastMessage, String(mutation.lastMessage?.['id'] ?? '').trim(), payload.id);\n const applyEnvelopeLastMessage = (): void => {\n if (!envelopeLastMessage) {\n return;\n }\n const existingMessage = store.getCachedMessage(envelopeLastMessage.id);\n if (!existingMessage) {\n applyIncomingConversationMessage(store, envelopeLastMessage, 'created');\n store.cacheMessage(envelopeLastMessage);\n }\n };\n if (payload.operation === 'updated') {\n const unreadBefore = store.getCachedConversation(payload.id)?.unreadCount ?? 0;\n const refreshed = await store.refreshConversation(payload.id);\n if (!refreshed) {\n return;\n }\n applyEnvelopeLastMessage();\n if (currentUserId && !axmIsConversationParticipant(refreshed.participants, currentUserId)) {\n store.publishConversationDeleted(payload.id);\n return;\n }\n const unread = Math.max(unreadBefore, store.getCachedConversation(payload.id)?.unreadCount ?? 0);\n const next = { ...refreshed, unreadCount: unread };\n store.cacheConversation(next);\n // ACoreX copies `unreadCount` from this snapshot onto the sidebar.\n // Shared room.unreadCount is the sender's 0. Never emit a room refetch\n // while this thread is not focused — the message stream already updated preview.\n if (!focus.isFocused(payload.id)) {\n return;\n }\n store.publishConversationUpdate(next, false);\n return;\n }\n\n const conversation = await store.getConversation(payload.id, { force: true });\n if (!conversation) {\n return;\n }\n applyEnvelopeLastMessage();\n if (currentUserId && !axmIsConversationParticipant(conversation.participants, currentUserId)) {\n return;\n }\n if (payload.operation === 'created' && !focus.isFocused(payload.id)) {\n const inboundLastMessage = envelopeLastMessage ? (envelopeLastMessage.status === 'read' ? { ...envelopeLastMessage, status: 'sent' as const } : envelopeLastMessage) : null;\n const inboundUnread = inboundLastMessage && currentUserId && axmMessageCountsTowardUnread(inboundLastMessage, currentUserId) ? 1 : 0;\n const unread = Math.max(store.getCachedConversation(payload.id)?.unreadCount ?? 0, conversation.unreadCount ?? 0, inboundUnread);\n const next = { ...conversation, unreadCount: unread };\n store.cacheConversation(next);\n store.publishConversationCreated(next, false);\n return;\n }\n if (payload.operation === 'created') {\n store.cacheEmptyMessageList(payload.id);\n store.publishConversationCreated(conversation, false);\n } else {\n store.publishConversationUpdate(conversation, false);\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(axmMapUserPresenceToConversationUpdate(update.userId, update));\n });\n },\n };\n }),\n ];\n}\n\n/**\n * UI `handleNewMessage` ignores `status === 'read'`. Incoming bubbles must hit\n * the stream as sent/delivered first, then the real snapshot as an update.\n */\nfunction applyIncomingConversationMessage(store: AXMConversationEntityStoreService, message: AXConversationMessage, op: 'created' | 'updated'): void {\n if (message.deleted) {\n store.publishMessageDeletion(message.id);\n return;\n }\n\n const listMessage = message.status === 'read' ? { ...message, status: 'sent' as const } : message;\n if (op === 'created') {\n store.publishNewMessage(listMessage);\n return;\n }\n\n store.publishNewMessage(listMessage);\n store.publishMessageUpdate(message);\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 ----- Types -----\n\nexport type LiveKitClient = typeof import('livekit-client');\n\n//#endregion\n\n//#region ----- Loader -----\n\nlet pending: Promise<LiveKitClient> | null = null;\n\n/** Loads the LiveKit browser SDK once, on first call/inbox connect. */\nexport function loadLiveKitClient(): Promise<LiveKitClient> {\n pending ??= import('livekit-client');\n return pending;\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 = 45_000;\n\nconst DEFAULT_DEV_LIVEKIT_WS_PROXY_PATH = '/livekit-ws';\n\nfunction axmIsLocalDevHostname(hostname: string): boolean {\n const normalized = hostname.trim().toLowerCase();\n return normalized === 'localhost' || normalized === '127.0.0.1' || normalized === '[::1]';\n}\n\n/**\n * Route LiveKit WebSocket signaling through the Angular/Vite dev proxy (`proxy.conf.mjs`).\n *\n * - localhost UI + remote LiveKit host (LIVEKIT_DEV_WS_PROXY)\n * - LAN / Safari UI + API URL pointing at 127.0.0.1 (browser must use UI origin, not loopback)\n */\nexport function axmResolveChatCallLiveKitServerUrl(serverUrl: string | undefined): string {\n const trimmed = serverUrl?.trim();\n if (!trimmed || typeof window === 'undefined') {\n return trimmed ?? '';\n }\n\n try {\n const resolved = new URL(trimmed);\n const localUi = axmIsLocalDevHostname(window.location.hostname);\n const localLiveKit = axmIsLocalDevHostname(resolved.hostname);\n\n const useDevProxy = (localUi && !localLiveKit) || (!localUi && localLiveKit);\n if (!useDevProxy) {\n return trimmed;\n }\n\n const proxy = new URL(window.location.origin);\n proxy.pathname = DEFAULT_DEV_LIVEKIT_WS_PROXY_PATH;\n return proxy.toString().replace(/\\/$/, '');\n } catch {\n return trimmed;\n }\n}\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 options.rtcConfig = { iceTransportPolicy: 'relay' };\n return options;\n }\n\n if (iceServers?.length) {\n options.rtcConfig = { iceServers };\n return options;\n }\n\n if (isLocalLiveKitUrl(serverUrl)) {\n // Let LiveKit join response supply ICE (embedded TURN on local Docker).\n // Do not override iceServers — embedded TURN credentials come from the server.\n options.rtcConfig = { iceTransportPolicy: 'all' };\n }\n\n return options;\n}\n\nfunction isLocalLiveKitUrl(serverUrl: string | undefined): boolean {\n if (!serverUrl?.trim()) {\n return false;\n }\n try {\n const url = new URL(serverUrl.trim());\n return axmIsLocalDevHostname(url.hostname);\n } catch {\n return false;\n }\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 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 { 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 type { Room } from 'livekit-client';\nimport { distinctUntilChanged, firstValueFrom, map } from 'rxjs';\n\nimport { loadLiveKitClient, type LiveKitClient } from './chat-call-livekit.loader';\n\nimport { AXMConversationEntityStoreService } from '../../services/conversation-entity-store.service';\nimport { axmChatCallRoomConnectOptions, axmResolveChatCallLiveKitServerUrl } 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 { AXMChatCallActiveSessionService } from './chat-call-active-session.service';\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 activeSessions = inject(AXMChatCallActiveSessionService);\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 livekit: LiveKitClient | 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 private readonly suppressedCallIds = 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 livekit = await this.#ensureLiveKit();\n const room = new livekit.Room();\n room.on(livekit.RoomEvent.DataReceived, (payload) => {\n this.zone.run(() => {\n void this.#onData(payload);\n });\n });\n room.on(livekit.RoomEvent.Disconnected, () => {\n if (this.room !== room) {\n return;\n }\n this.room = null;\n this.connectedUserId = null;\n this.#scheduleReconnect();\n });\n const livekitUrl = axmResolveChatCallLiveKitServerUrl(tokenResult.serverUrl);\n await room.connect(\n livekitUrl,\n tokenResult.token,\n axmChatCallRoomConnectOptions(\n livekitUrl,\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 /**\n * Prevents re-presenting the same incoming call (e.g. after accept/decline or connect failure).\n */\n suppressCall(callId: string | null | undefined): void {\n const id = callId?.trim();\n if (id) {\n this.suppressedCallIds.add(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 (\n !selfId ||\n ring.fromUserId === selfId ||\n this.openCallIds.has(ring.callId) ||\n this.suppressedCallIds.has(ring.callId) ||\n this.activeSessions.isEngaged(ring.callId)\n ) {\n return;\n }\n\n const conversation =\n (await this.store.refreshConversation(ring.conversationId)) ??\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 initiatorUserId: ring.fromUserId,\n popupService: this.popupService,\n activeCallSessions: this.activeSessions,\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 livekit = await this.#ensureLiveKit();\n const room = new livekit.Room();\n const livekitUrl = axmResolveChatCallLiveKitServerUrl(tokenResult.serverUrl);\n try {\n await room.connect(\n livekitUrl,\n tokenResult.token,\n axmChatCallRoomConnectOptions(\n livekitUrl,\n tokenResult.iceServers,\n tokenResult.forceRelay,\n ),\n );\n await this.#waitForRemoteIdentity(room, livekit, 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 async #ensureLiveKit(): Promise<LiveKitClient> {\n this.livekit ??= await loadLiveKitClient();\n return this.livekit;\n }\n\n #waitForRemoteIdentity(\n room: Room,\n livekit: LiveKitClient,\n identity: string,\n timeoutMs: number,\n ): 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(livekit.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(livekit.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 { createRandomUuid } from '@acorex-platform/framework-shared/core';\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 { AXMChatCallActiveSessionService } from '../plugins/call/chat-call-active-session.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 activeSessions = inject(AXMChatCallActiveSessionService);\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 const callId = payload.callId?.trim() || createRandomUuid();\n if (activeSessions.isEngaged(callId)) {\n return;\n }\n void inbox.presentIncoming({\n type: 'ring',\n conversationId,\n callId,\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 const selfId = session.user?.id?.trim();\n const callId = payload.callId?.trim();\n if (callId && selfId && fromUserId === selfId) {\n inbox.suppressCall(callId);\n }\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 { DestroyRef, inject, type Provider } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { NavigationEnd, Router } from '@angular/router';\nimport { filter } from 'rxjs';\n\nimport {\n AXP_APP_STARTUP_PRIORITY,\n provideAppStartUpTask,\n} from '@acorex-platform/framework-client/core';\n\nimport { AXMChatConversationApi } from '../plugins/services/chat-conversation-apis.abstract';\nimport { axmIsConversationChatUrl } from '../plugins/utils/conversation-chat-url.util';\nimport { AXMMiniChatPanelService } from '../../mini-chat/mini-chat-panel.service';\nimport { AXMChatCallActiveSessionService } from '../plugins/call/chat-call-active-session.service';\n\n//#region ---- Release chat focus when the page is not showing ----\n\n/**\n * Chat routes use tab reuse, so {@link AXMChatComponent} stays cached after leave.\n * Without this, the last conversation stays \"focused\" and incoming messages skip\n * inbox notifications and the Conversations badge.\n */\nexport function provideConversationFocusRouteSync(): Provider[] {\n return [\n provideAppStartUpTask(() => {\n const router = inject(Router);\n const conversationApi = inject(AXMChatConversationApi);\n const miniChatPanel = inject(AXMMiniChatPanelService);\n const activeCallSessions = inject(AXMChatCallActiveSessionService);\n const destroyRef = inject(DestroyRef);\n\n return {\n name: 'conversation-focus-route-sync',\n priority: AXP_APP_STARTUP_PRIORITY.realtimeSubscriptions,\n run: async () => {\n router.events\n .pipe(\n filter((event): event is NavigationEnd => event instanceof NavigationEnd),\n takeUntilDestroyed(destroyRef),\n )\n .subscribe(() => {\n if (miniChatPanel.panelOpen() || activeCallSessions.engaged()) {\n return;\n }\n if (!axmIsConversationChatUrl(router.url)) {\n conversationApi.reportFocusedConversation(null);\n }\n });\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 AXP_SEARCH_PROVIDER,\n} from '@acorex-platform/framework-client/common';\nimport {\n AXP_APP_STARTUP_PRIORITY,\n AXP_HOOK_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 { 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 { AXMMenuProvider } from './menu.provider';\nimport { AXMPermissionDefinitionProvider } from './permission-definition.provider';\nimport { AXMChatBadgeProvider } from './badge.provider';\nimport { AXMChannelUnreadBadgeProvider } from './channel-unread-badge.provider';\nimport { AXMChannelSearchCommandProvider } from './channel-search-command.provider';\nimport { channelFeedPageRoutes } from './features/channel-feed/channel-feed.page.routes';\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-api.providers';\nimport { provideConversationRealtimeHandlers } from './features/chat/services/conversation-realtime-handlers.providers';\nimport { provideConversationRealtimeConnectionSync } from './features/chat/services/conversation-realtime-connection.providers';\nimport { provideConversationCallRealtimeHandlers } from './features/chat/services/conversation-call-realtime.providers';\nimport { provideConversationFocusRouteSync } from './features/chat/services/conversation-focus-route-sync.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 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 ...provideConversationFocusRouteSync(),\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: AXP_TASK_BADGE_PROVIDERS,\n useExisting: AXMChannelUnreadBadgeProvider,\n multi: true,\n },\n {\n provide: ROUTES,\n multi: true,\n useFactory: routesFactory,\n },\n {\n provide: ROUTES,\n multi: true,\n useFactory: () => [...channelFeedPageRoutes],\n },\n // Conversation Module\n DatePipe,\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 provide: AXP_SEARCH_PROVIDER,\n useClass: AXMChannelSearchCommandProvider,\n multi: true,\n },\n \n {\n provide: AXP_WIDGET_DEFINITION_PROVIDER,\n useClass: AXMConversationWidgetsProvider,\n multi: true,\n },\n {\n provide: AXP_HOOK_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 provideAppStartUpTask(() => {\n const unreadBadge = inject(AXMChannelUnreadBadgeProvider);\n return {\n name: 'conversation-channel-unread-badge',\n priority: AXP_APP_STARTUP_PRIORITY.conversationSessionSync,\n run: async () => {\n await unreadBadge.refresh();\n },\n };\n }),\n ],\n})\nexport class AXMConversationModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["axmConversationHasAiChat","i2","i4","i6","i1","i3","axmAiChatConversationUiMetadata","i5","i8","i9","i10","RootConfig","ConversationRootConfig"],"mappings":"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"}