@acorex-platform/framework-client 0.0.38 → 0.0.48

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 (111) hide show
  1. package/fesm2022/acorex-platform-framework-client-auth.mjs +212 -44
  2. package/fesm2022/acorex-platform-framework-client-auth.mjs.map +1 -1
  3. package/fesm2022/{acorex-platform-framework-client-common-common-settings.provider-CzBr0cRi.mjs → acorex-platform-framework-client-common-common-settings.provider-ChU2tvyt.mjs} +31 -1
  4. package/fesm2022/acorex-platform-framework-client-common-common-settings.provider-ChU2tvyt.mjs.map +1 -0
  5. package/fesm2022/acorex-platform-framework-client-common.mjs +1172 -193
  6. package/fesm2022/acorex-platform-framework-client-common.mjs.map +1 -1
  7. package/fesm2022/acorex-platform-framework-client-core.mjs +233 -132
  8. package/fesm2022/acorex-platform-framework-client-core.mjs.map +1 -1
  9. package/fesm2022/acorex-platform-framework-client-layout-builder.mjs +295 -59
  10. package/fesm2022/acorex-platform-framework-client-layout-builder.mjs.map +1 -1
  11. package/fesm2022/{acorex-platform-framework-client-layout-components-binding-expression-editor-popup.component-Bp2cNCPO.mjs → acorex-platform-framework-client-layout-components-binding-expression-editor-popup.component-BqPaHKPM.mjs} +10 -6
  12. package/fesm2022/acorex-platform-framework-client-layout-components-binding-expression-editor-popup.component-BqPaHKPM.mjs.map +1 -0
  13. package/fesm2022/acorex-platform-framework-client-layout-components-property-viewer-inline-code-editor.component-CcpUTEVQ.mjs +66 -0
  14. package/fesm2022/acorex-platform-framework-client-layout-components-property-viewer-inline-code-editor.component-CcpUTEVQ.mjs.map +1 -0
  15. package/fesm2022/acorex-platform-framework-client-layout-components-resource-appointment-board.component-DCkpgsFH.mjs +195 -0
  16. package/fesm2022/acorex-platform-framework-client-layout-components-resource-appointment-board.component-DCkpgsFH.mjs.map +1 -0
  17. package/fesm2022/acorex-platform-framework-client-layout-components.mjs +4015 -1014
  18. package/fesm2022/acorex-platform-framework-client-layout-components.mjs.map +1 -1
  19. package/fesm2022/acorex-platform-framework-client-layout-designer.mjs +1179 -304
  20. package/fesm2022/acorex-platform-framework-client-layout-designer.mjs.map +1 -1
  21. package/fesm2022/{acorex-platform-framework-client-layout-entity-acorex-platform-framework-client-layout-entity-CvaOWbJx.mjs → acorex-platform-framework-client-layout-entity-acorex-platform-framework-client-layout-entity-UkQsf84C.mjs} +1701 -300
  22. package/fesm2022/acorex-platform-framework-client-layout-entity-acorex-platform-framework-client-layout-entity-UkQsf84C.mjs.map +1 -0
  23. package/fesm2022/{acorex-platform-framework-client-layout-entity-attachments-page.component-Ds63Rt2n.mjs → acorex-platform-framework-client-layout-entity-attachments-page.component-DmmiDLZw.mjs} +2 -2
  24. package/fesm2022/{acorex-platform-framework-client-layout-entity-attachments-page.component-Ds63Rt2n.mjs.map → acorex-platform-framework-client-layout-entity-attachments-page.component-DmmiDLZw.mjs.map} +1 -1
  25. package/fesm2022/{acorex-platform-framework-client-layout-entity-bulk-entity.command-C0pohwdo.mjs → acorex-platform-framework-client-layout-entity-bulk-entity.command-BOFTb66c.mjs} +2 -2
  26. package/fesm2022/{acorex-platform-framework-client-layout-entity-bulk-entity.command-C0pohwdo.mjs.map → acorex-platform-framework-client-layout-entity-bulk-entity.command-BOFTb66c.mjs.map} +1 -1
  27. package/fesm2022/{acorex-platform-framework-client-layout-entity-gallery-page.component-o2HuZrDN.mjs → acorex-platform-framework-client-layout-entity-gallery-page.component-Bg-cMOlQ.mjs} +2 -2
  28. package/fesm2022/{acorex-platform-framework-client-layout-entity-gallery-page.component-o2HuZrDN.mjs.map → acorex-platform-framework-client-layout-entity-gallery-page.component-Bg-cMOlQ.mjs.map} +1 -1
  29. package/fesm2022/acorex-platform-framework-client-layout-entity.mjs +2 -2
  30. package/fesm2022/acorex-platform-framework-client-layout-views.mjs +47 -8
  31. package/fesm2022/acorex-platform-framework-client-layout-views.mjs.map +1 -1
  32. package/fesm2022/acorex-platform-framework-client-layout-widget-core.mjs +3854 -3292
  33. package/fesm2022/acorex-platform-framework-client-layout-widget-core.mjs.map +1 -1
  34. package/fesm2022/acorex-platform-framework-client-layout-widgets-acorex-platform-framework-client-layout-widgets-DJNSBNVe.mjs +33319 -0
  35. package/fesm2022/acorex-platform-framework-client-layout-widgets-acorex-platform-framework-client-layout-widgets-DJNSBNVe.mjs.map +1 -0
  36. package/fesm2022/{acorex-platform-framework-client-layout-widgets-button-widget-designer.component-BDOdcoyN.mjs → acorex-platform-framework-client-layout-widgets-button-widget-designer.component-BkrPu1wO.mjs} +8 -5
  37. package/fesm2022/acorex-platform-framework-client-layout-widgets-button-widget-designer.component-BkrPu1wO.mjs.map +1 -0
  38. package/fesm2022/acorex-platform-framework-client-layout-widgets-code-editor-value.util-Cb7R1qLO.mjs +45 -0
  39. package/fesm2022/acorex-platform-framework-client-layout-widgets-code-editor-value.util-Cb7R1qLO.mjs.map +1 -0
  40. package/fesm2022/acorex-platform-framework-client-layout-widgets-code-editor-widget-column.component-BL621E1r.mjs +68 -0
  41. package/fesm2022/acorex-platform-framework-client-layout-widgets-code-editor-widget-column.component-BL621E1r.mjs.map +1 -0
  42. package/fesm2022/acorex-platform-framework-client-layout-widgets-code-editor-widget-edit.component-CVsPKhNl.mjs +88 -0
  43. package/fesm2022/acorex-platform-framework-client-layout-widgets-code-editor-widget-edit.component-CVsPKhNl.mjs.map +1 -0
  44. package/fesm2022/acorex-platform-framework-client-layout-widgets-code-editor-widget-view.component-BEq4O4al.mjs +71 -0
  45. package/fesm2022/acorex-platform-framework-client-layout-widgets-code-editor-widget-view.component-BEq4O4al.mjs.map +1 -0
  46. package/fesm2022/acorex-platform-framework-client-layout-widgets-condition-builder-edit-popup.component-WpiEHusZ.mjs +81 -0
  47. package/fesm2022/acorex-platform-framework-client-layout-widgets-condition-builder-edit-popup.component-WpiEHusZ.mjs.map +1 -0
  48. package/fesm2022/{acorex-platform-framework-client-layout-widgets-page-widget-designer.component-WzIiwnGC.mjs → acorex-platform-framework-client-layout-widgets-page-widget-designer.component-Cadl6guA.mjs} +41 -23
  49. package/fesm2022/acorex-platform-framework-client-layout-widgets-page-widget-designer.component-Cadl6guA.mjs.map +1 -0
  50. package/fesm2022/{acorex-platform-framework-client-layout-widgets-repeater-widget-column.component-4mX8aYzA.mjs → acorex-platform-framework-client-layout-widgets-repeater-widget-column.component-CKtGsWPI.mjs} +3 -3
  51. package/fesm2022/{acorex-platform-framework-client-layout-widgets-repeater-widget-column.component-4mX8aYzA.mjs.map → acorex-platform-framework-client-layout-widgets-repeater-widget-column.component-CKtGsWPI.mjs.map} +1 -1
  52. package/fesm2022/acorex-platform-framework-client-layout-widgets-scheduler-picker-widget-column.component-Clb27Loe.mjs +71 -0
  53. package/fesm2022/acorex-platform-framework-client-layout-widgets-scheduler-picker-widget-column.component-Clb27Loe.mjs.map +1 -0
  54. package/fesm2022/acorex-platform-framework-client-layout-widgets-scheduler-picker-widget-edit.component-l7q8A-D3.mjs +111 -0
  55. package/fesm2022/acorex-platform-framework-client-layout-widgets-scheduler-picker-widget-edit.component-l7q8A-D3.mjs.map +1 -0
  56. package/fesm2022/acorex-platform-framework-client-layout-widgets-scheduler-picker-widget-view.component-Cc1AH09b.mjs +77 -0
  57. package/fesm2022/acorex-platform-framework-client-layout-widgets-scheduler-picker-widget-view.component-Cc1AH09b.mjs.map +1 -0
  58. package/fesm2022/{acorex-platform-framework-client-layout-widgets-tabular-data-edit-popup.component-TWxthl21.mjs → acorex-platform-framework-client-layout-widgets-tabular-data-edit-popup.component-BCLxS3rS.mjs} +3 -3
  59. package/fesm2022/{acorex-platform-framework-client-layout-widgets-tabular-data-edit-popup.component-TWxthl21.mjs.map → acorex-platform-framework-client-layout-widgets-tabular-data-edit-popup.component-BCLxS3rS.mjs.map} +1 -1
  60. package/fesm2022/{acorex-platform-framework-client-layout-widgets-text-block-widget-designer.component-D6HFPmGC.mjs → acorex-platform-framework-client-layout-widgets-text-block-widget-designer.component-DYxgwR2E.mjs} +21 -8
  61. package/fesm2022/acorex-platform-framework-client-layout-widgets-text-block-widget-designer.component-DYxgwR2E.mjs.map +1 -0
  62. package/fesm2022/acorex-platform-framework-client-layout-widgets-trigger-expression-editor-popup.component-C2PGoC7r.mjs +124 -0
  63. package/fesm2022/acorex-platform-framework-client-layout-widgets-trigger-expression-editor-popup.component-C2PGoC7r.mjs.map +1 -0
  64. package/fesm2022/acorex-platform-framework-client-layout-widgets-triggers-widget-editor.component-DDDoPoQa.mjs +345 -0
  65. package/fesm2022/acorex-platform-framework-client-layout-widgets-triggers-widget-editor.component-DDDoPoQa.mjs.map +1 -0
  66. package/fesm2022/acorex-platform-framework-client-layout-widgets.mjs +1 -31985
  67. package/fesm2022/acorex-platform-framework-client-layout-widgets.mjs.map +1 -1
  68. package/fesm2022/acorex-platform-framework-client-realtime.mjs +2 -1
  69. package/fesm2022/acorex-platform-framework-client-realtime.mjs.map +1 -1
  70. package/fesm2022/acorex-platform-framework-client-runtime.mjs +2 -2
  71. package/fesm2022/acorex-platform-framework-client-runtime.mjs.map +1 -1
  72. package/fesm2022/{acorex-platform-framework-client-themes-default-entity-master-create-view.component-CT7WWWG0.mjs → acorex-platform-framework-client-themes-default-entity-master-create-view.component-DlS4v_zb.mjs} +3 -3
  73. package/fesm2022/acorex-platform-framework-client-themes-default-entity-master-create-view.component-DlS4v_zb.mjs.map +1 -0
  74. package/fesm2022/acorex-platform-framework-client-themes-default-entity-master-modify-view.component-DBmdBKBL.mjs +122 -0
  75. package/fesm2022/acorex-platform-framework-client-themes-default-entity-master-modify-view.component-DBmdBKBL.mjs.map +1 -0
  76. package/fesm2022/{acorex-platform-framework-client-themes-default-entity-master-single-view.component-DBUwSzvg.mjs → acorex-platform-framework-client-themes-default-entity-master-single-view.component-CkpRT1a9.mjs} +3 -3
  77. package/fesm2022/acorex-platform-framework-client-themes-default-entity-master-single-view.component-CkpRT1a9.mjs.map +1 -0
  78. package/fesm2022/acorex-platform-framework-client-themes-default.mjs +424 -103
  79. package/fesm2022/acorex-platform-framework-client-themes-default.mjs.map +1 -1
  80. package/fesm2022/{acorex-platform-framework-client-themes-shared-settings.provider-CpsAIsxj.mjs → acorex-platform-framework-client-themes-shared-settings.provider-DIkjSTU7.mjs} +102 -1
  81. package/fesm2022/acorex-platform-framework-client-themes-shared-settings.provider-DIkjSTU7.mjs.map +1 -0
  82. package/fesm2022/acorex-platform-framework-client-themes-shared.mjs +174 -22
  83. package/fesm2022/acorex-platform-framework-client-themes-shared.mjs.map +1 -1
  84. package/package.json +2 -2
  85. package/realtime/README.md +1 -1
  86. package/types/acorex-platform-framework-client-auth.d.ts +18 -1
  87. package/types/acorex-platform-framework-client-common.d.ts +243 -9
  88. package/types/acorex-platform-framework-client-core.d.ts +152 -119
  89. package/types/acorex-platform-framework-client-layout-builder.d.ts +29 -0
  90. package/types/acorex-platform-framework-client-layout-components.d.ts +717 -147
  91. package/types/acorex-platform-framework-client-layout-designer.d.ts +192 -14
  92. package/types/acorex-platform-framework-client-layout-entity.d.ts +167 -92
  93. package/types/acorex-platform-framework-client-layout-views.d.ts +23 -1
  94. package/types/acorex-platform-framework-client-layout-widget-core.d.ts +148 -40
  95. package/types/acorex-platform-framework-client-layout-widgets.d.ts +261 -119
  96. package/types/acorex-platform-framework-client-realtime.d.ts +16 -3
  97. package/types/acorex-platform-framework-client-themes-default.d.ts +62 -11
  98. package/types/acorex-platform-framework-client-themes-shared.d.ts +25 -2
  99. package/fesm2022/acorex-platform-framework-client-common-common-settings.provider-CzBr0cRi.mjs.map +0 -1
  100. package/fesm2022/acorex-platform-framework-client-layout-components-binding-expression-editor-popup.component-Bp2cNCPO.mjs.map +0 -1
  101. package/fesm2022/acorex-platform-framework-client-layout-components-file-provider-picker.popup.component-BtLEUWAA.mjs +0 -77
  102. package/fesm2022/acorex-platform-framework-client-layout-components-file-provider-picker.popup.component-BtLEUWAA.mjs.map +0 -1
  103. package/fesm2022/acorex-platform-framework-client-layout-entity-acorex-platform-framework-client-layout-entity-CvaOWbJx.mjs.map +0 -1
  104. package/fesm2022/acorex-platform-framework-client-layout-widgets-button-widget-designer.component-BDOdcoyN.mjs.map +0 -1
  105. package/fesm2022/acorex-platform-framework-client-layout-widgets-page-widget-designer.component-WzIiwnGC.mjs.map +0 -1
  106. package/fesm2022/acorex-platform-framework-client-layout-widgets-text-block-widget-designer.component-D6HFPmGC.mjs.map +0 -1
  107. package/fesm2022/acorex-platform-framework-client-themes-default-entity-master-create-view.component-CT7WWWG0.mjs.map +0 -1
  108. package/fesm2022/acorex-platform-framework-client-themes-default-entity-master-modify-view.component-DienTcPE.mjs +0 -122
  109. package/fesm2022/acorex-platform-framework-client-themes-default-entity-master-modify-view.component-DienTcPE.mjs.map +0 -1
  110. package/fesm2022/acorex-platform-framework-client-themes-default-entity-master-single-view.component-DBUwSzvg.mjs.map +0 -1
  111. package/fesm2022/acorex-platform-framework-client-themes-shared-settings.provider-CpsAIsxj.mjs.map +0 -1
@@ -22,6 +22,7 @@ const AXP_REALTIME_TOPIC_ENTITY_MUTATION = 'entity.mutation';
22
22
  const AXP_REALTIME_TOPIC_BULK_PROGRESS = 'runtime.bulk.progress';
23
23
  const AXP_REALTIME_TOPIC_USER_PRESENCE = 'user.presence';
24
24
  const AXP_REALTIME_TOPIC_AUTH_SECURITY_ALERT = 'auth.security-alert';
25
+ const AXP_REALTIME_TOPIC_AI_VOICE_SESSION = 'ai.voice.session';
25
26
  const AXP_REALTIME_SOCKET_EVENT = 'realtime';
26
27
  const AXP_REALTIME_SUBSCRIBE_CONVERSATION = 'subscribe.conversation';
27
28
  const AXP_REALTIME_UNSUBSCRIBE_CONVERSATION = 'unsubscribe.conversation';
@@ -726,5 +727,5 @@ function presenceDurationBucket(ms) {
726
727
  * Generated bundle index. Do not edit.
727
728
  */
728
729
 
729
- export { AXPRealtimeConnectionPort, AXPRealtimeConnectionService, AXPRealtimeDispatcherService, AXPUserPresenceIdleService, AXPUserPresenceService, AXP_REALTIME_CONFIG, AXP_REALTIME_EMIT_TYPING, AXP_REALTIME_PRESENCE_LEAVE, AXP_REALTIME_PRESENCE_SET, AXP_REALTIME_SOCKET_EVENT, AXP_REALTIME_SUBSCRIBE_CONVERSATION, AXP_REALTIME_SUBSCRIBE_PRESENCE, AXP_REALTIME_TOPIC_AUTH_SECURITY_ALERT, AXP_REALTIME_TOPIC_BACKGROUND_JOB_TRAY_REFRESH, AXP_REALTIME_TOPIC_BULK_PROGRESS, AXP_REALTIME_TOPIC_CONVERSATION_CALL, AXP_REALTIME_TOPIC_CONVERSATION_MESSAGE, AXP_REALTIME_TOPIC_CONVERSATION_TYPING, AXP_REALTIME_TOPIC_ENTITY_MUTATION, AXP_REALTIME_TOPIC_HANDLER, AXP_REALTIME_TOPIC_INBOX_REFRESH, AXP_REALTIME_TOPIC_USER_PRESENCE, AXP_REALTIME_UNSUBSCRIBE_CONVERSATION, AXP_REALTIME_UNSUBSCRIBE_PRESENCE, AXP_USER_PRESENCE_IDLE_MS, isWatchablePresenceUserId, parseUserPresencePayload, presenceDurationBucket, provideRealtime, resolveRealtimeSocketUrl };
730
+ export { AXPRealtimeConnectionPort, AXPRealtimeConnectionService, AXPRealtimeDispatcherService, AXPUserPresenceIdleService, AXPUserPresenceService, AXP_REALTIME_CONFIG, AXP_REALTIME_EMIT_TYPING, AXP_REALTIME_PRESENCE_LEAVE, AXP_REALTIME_PRESENCE_SET, AXP_REALTIME_SOCKET_EVENT, AXP_REALTIME_SUBSCRIBE_CONVERSATION, AXP_REALTIME_SUBSCRIBE_PRESENCE, AXP_REALTIME_TOPIC_AI_VOICE_SESSION, AXP_REALTIME_TOPIC_AUTH_SECURITY_ALERT, AXP_REALTIME_TOPIC_BACKGROUND_JOB_TRAY_REFRESH, AXP_REALTIME_TOPIC_BULK_PROGRESS, AXP_REALTIME_TOPIC_CONVERSATION_CALL, AXP_REALTIME_TOPIC_CONVERSATION_MESSAGE, AXP_REALTIME_TOPIC_CONVERSATION_TYPING, AXP_REALTIME_TOPIC_ENTITY_MUTATION, AXP_REALTIME_TOPIC_HANDLER, AXP_REALTIME_TOPIC_INBOX_REFRESH, AXP_REALTIME_TOPIC_USER_PRESENCE, AXP_REALTIME_UNSUBSCRIBE_CONVERSATION, AXP_REALTIME_UNSUBSCRIBE_PRESENCE, AXP_USER_PRESENCE_IDLE_MS, isWatchablePresenceUserId, parseUserPresencePayload, presenceDurationBucket, provideRealtime, resolveRealtimeSocketUrl };
730
731
  //# sourceMappingURL=acorex-platform-framework-client-realtime.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"acorex-platform-framework-client-realtime.mjs","sources":["../../../../../libs/framework/client/realtime/src/lib/realtime.types.ts","../../../../../libs/framework/client/realtime/src/lib/realtime.topics.ts","../../../../../libs/framework/client/realtime/src/lib/realtime-url.util.ts","../../../../../libs/framework/client/realtime/src/lib/tokens.ts","../../../../../libs/framework/client/realtime/src/lib/realtime-dispatcher.service.ts","../../../../../libs/framework/client/realtime/src/lib/realtime-connection.port.ts","../../../../../libs/framework/client/realtime/src/lib/realtime-connection.service.ts","../../../../../libs/framework/client/realtime/src/lib/presence-idle.constants.ts","../../../../../libs/framework/client/realtime/src/lib/presence/user-presence.util.ts","../../../../../libs/framework/client/realtime/src/lib/presence/user-presence.service.ts","../../../../../libs/framework/client/realtime/src/lib/presence/user-presence-idle.service.ts","../../../../../libs/framework/client/realtime/src/lib/realtime.providers.ts","../../../../../libs/framework/client/realtime/src/lib/presence/user-presence.types.ts","../../../../../libs/framework/client/realtime/src/lib/presence/user-presence-duration.util.ts","../../../../../libs/framework/client/realtime/src/acorex-platform-framework-client-realtime.ts"],"sourcesContent":["//#region ---- Client realtime types ----\n\nexport interface AXPRealtimeAudience {\n userIds?: string[];\n // TODO(realtime): See server realtime.types.ts — generic refType/refId scopes.\n conversationId?: string;\n /** When true, deliver to all connected users in the envelope tenant. */\n tenant?: boolean;\n /** Deliver to every connected socket for these users across all tenants. */\n globalUserIds?: string[];\n /** Deliver to sockets that joined the JWT `sid` room (`s:{sid}`). */\n sessionIds?: string[];\n}\n\nexport interface AXPRealtimeEnvelope {\n topic: string;\n tenantId: string;\n audience: AXPRealtimeAudience;\n payload: unknown;\n correlationId?: string;\n emittedAt: string;\n}\n\nexport interface AXPRealtimeInboxRefreshPayload {\n deliveryId?: string;\n deliveryIds?: string[];\n /** Optional hint so clients can apply deletes/archives without a fetch. */\n op?: 'created' | 'updated' | 'deleted' | 'archived';\n}\n\nexport interface AXPRealtimeBackgroundJobTrayRefreshPayload {\n jobId?: string;\n /**\n * Hint for client tray sync.\n * Prefer applying locally; full list fetch only when the job is missing (e.g. `created`).\n */\n op?: 'created' | 'updated' | 'completed' | 'failed' | 'cancelled' | 'dismissed';\n status?: string;\n progress?: number;\n statusText?: string;\n currentStep?: string;\n supportsProgress?: boolean;\n keepInTrayAfterComplete?: boolean;\n completedAt?: string;\n trayDismissedAt?: string;\n}\n\nexport interface AXPRealtimeConversationMessagePayload {\n conversationId: string;\n messageId: string;\n op: 'created' | 'updated' | 'deleted';\n /** Optional entity snapshot so clients can skip a follow-up GET. */\n message?: Record<string, unknown>;\n}\n\nexport interface AXPRealtimeConversationTypingPayload {\n conversationId: string;\n userId: string;\n userName?: string;\n active: boolean;\n}\n\nexport type AXPRealtimeConversationCallAction =\n | 'invite'\n | 'ring'\n | 'accept'\n | 'decline'\n | 'cancel'\n | 'end';\n\nexport type AXPRealtimeConversationCallMedia = 'voice' | 'video';\n\n/** Built-in realtime signaling for chat calls (media joins via RTC when configured). */\nexport interface AXPRealtimeConversationCallPayload {\n conversationId: string;\n action: AXPRealtimeConversationCallAction;\n media: AXPRealtimeConversationCallMedia;\n /** Caller / actor user id. */\n fromUserId: string;\n fromUserName?: string;\n /** Optional call correlation id shared across invite → accept. */\n callId?: string;\n}\n\nexport interface AXPRealtimeBulkProgressPayload {\n executionId: string;\n entity: string;\n name: string;\n current: number;\n total: number;\n succeeded: number;\n failed: number;\n status: 'running' | 'completed';\n}\n\nexport interface AXPRealtimeEntityMutationPayload {\n entityName: string;\n operation: 'created' | 'updated' | 'deleted';\n id?: string;\n /** True when the mutation originated from a server bulk command fan-out. */\n bulk?: boolean;\n /** Number of successfully mutated records in a bulk operation. */\n count?: number;\n bulkExecutionId?: string;\n}\n\nexport type AXPRealtimeUserPresenceStatus = 'online' | 'offline' | 'away' | 'busy';\nexport type AXPRealtimeUserPresenceSource = 'auto' | 'manual';\n\nexport interface AXPRealtimeUserPresencePayload {\n userId: string;\n status: AXPRealtimeUserPresenceStatus;\n lastSeen?: string;\n since?: string;\n source?: AXPRealtimeUserPresenceSource;\n}\n\nexport interface AXPRealtimeUserPresenceSnapshotItem {\n userId: string;\n status: AXPRealtimeUserPresenceStatus;\n lastSeen?: string;\n since?: string;\n source?: AXPRealtimeUserPresenceSource;\n}\n\nexport interface AXPRealtimePresenceSetResult {\n ok: boolean;\n reason?: string;\n item?: AXPRealtimeUserPresenceSnapshotItem;\n}\n\nexport interface AXPRealtimePresenceSubscribeResult {\n ok: boolean;\n reason?: string;\n items?: AXPRealtimeUserPresenceSnapshotItem[];\n}\n\nexport type AXPRealtimeAuthSecurityAlertKind =\n | 'login_success'\n | 'login_failed'\n | 'account_locked'\n | 'logout'\n | 'session_terminated';\n\nexport interface AXPRealtimeAuthSecurityAlertPayload {\n kind: AXPRealtimeAuthSecurityAlertKind;\n at: string;\n actorSessionId?: string;\n /** JWT `sid` of the revoked session (session_terminated). */\n targetSessionId?: string;\n deviceSummary?: string;\n ipAddress?: string;\n browser?: string;\n deviceName?: string;\n operatingSystem?: string;\n}\n\nexport interface AXPRealtimeConfig {\n /**\n * Socket.IO namespace URL, e.g. `http://localhost:5500/realtime`.\n * Derived from API baseUrl when omitted (strip trailing `/api`).\n */\n url?: string;\n /** When false, connection is not started automatically. Default true. */\n autoConnect?: boolean;\n}\n\nexport type AXPRealtimeTopicHandler = (envelope: AXPRealtimeEnvelope) => void | Promise<void>;\n\nexport interface AXPRealtimeTopicHandlerRegistration {\n topic: string;\n handle: AXPRealtimeTopicHandler;\n}\n\n//#endregion\n","//#region ---- Client topic constants (mirror server) ----\n\nexport const AXP_REALTIME_TOPIC_INBOX_REFRESH = 'inbox.refresh';\nexport const AXP_REALTIME_TOPIC_BACKGROUND_JOB_TRAY_REFRESH = 'background-job.tray.refresh';\nexport const AXP_REALTIME_TOPIC_CONVERSATION_MESSAGE = 'conversation.message';\nexport const AXP_REALTIME_TOPIC_CONVERSATION_TYPING = 'conversation.typing';\nexport const AXP_REALTIME_TOPIC_CONVERSATION_CALL = 'conversation.call';\nexport const AXP_REALTIME_TOPIC_ENTITY_MUTATION = 'entity.mutation';\nexport const AXP_REALTIME_TOPIC_BULK_PROGRESS = 'runtime.bulk.progress';\nexport const AXP_REALTIME_TOPIC_USER_PRESENCE = 'user.presence';\nexport const AXP_REALTIME_TOPIC_AUTH_SECURITY_ALERT = 'auth.security-alert';\n\nexport const AXP_REALTIME_SOCKET_EVENT = 'realtime';\nexport const AXP_REALTIME_SUBSCRIBE_CONVERSATION = 'subscribe.conversation';\nexport const AXP_REALTIME_UNSUBSCRIBE_CONVERSATION = 'unsubscribe.conversation';\nexport const AXP_REALTIME_SUBSCRIBE_PRESENCE = 'subscribe.presence';\nexport const AXP_REALTIME_UNSUBSCRIBE_PRESENCE = 'unsubscribe.presence';\nexport const AXP_REALTIME_PRESENCE_LEAVE = 'presence.leave';\nexport const AXP_REALTIME_PRESENCE_SET = 'presence.set';\nexport const AXP_REALTIME_EMIT_TYPING = 'conversation.typing.emit';\n\n//#endregion\n","//#region ---- Realtime URL helpers ----\n\n/**\n * Builds Socket.IO namespace URL from an HTTP API baseUrl (`…/api` → `…/realtime`).\n */\nexport function resolveRealtimeSocketUrl(apiBaseUrl: string): string {\n const trimmed = apiBaseUrl.trim().replace(/\\/+$/, '');\n const withoutApi = trimmed.endsWith('/api') ? trimmed.slice(0, -4) : trimmed;\n return `${withoutApi}/realtime`;\n}\n\n//#endregion\n","import { InjectionToken } from '@angular/core';\nimport type {\n AXPRealtimeConfig,\n AXPRealtimeTopicHandlerRegistration,\n} from './realtime.types';\n\n//#region ---- DI tokens ----\n\nexport const AXP_REALTIME_CONFIG = new InjectionToken<AXPRealtimeConfig>('AXP_REALTIME_CONFIG');\n\nexport const AXP_REALTIME_TOPIC_HANDLER = new InjectionToken<AXPRealtimeTopicHandlerRegistration>(\n 'AXP_REALTIME_TOPIC_HANDLER',\n);\n\n//#endregion\n","import { Inject, Injectable, Optional } from '@angular/core';\nimport { AXP_REALTIME_TOPIC_HANDLER } from './tokens';\nimport type {\n AXPRealtimeEnvelope,\n AXPRealtimeTopicHandlerRegistration,\n} from './realtime.types';\n\n//#region ---- Topic dispatcher ----\n\n@Injectable()\nexport class AXPRealtimeDispatcherService {\n private readonly handlers = new Map<string, AXPRealtimeTopicHandlerRegistration[]>();\n\n constructor(\n @Optional()\n @Inject(AXP_REALTIME_TOPIC_HANDLER)\n registrations?: AXPRealtimeTopicHandlerRegistration[] | AXPRealtimeTopicHandlerRegistration,\n ) {\n const list = !registrations\n ? []\n : Array.isArray(registrations)\n ? registrations\n : [registrations];\n for (const registration of list) {\n this.register(registration);\n }\n }\n\n register(registration: AXPRealtimeTopicHandlerRegistration): void {\n const topic = registration.topic?.trim();\n if (!topic || typeof registration.handle !== 'function') {\n return;\n }\n const existing = this.handlers.get(topic) ?? [];\n existing.push(registration);\n this.handlers.set(topic, existing);\n }\n\n async dispatch(envelope: AXPRealtimeEnvelope): Promise<void> {\n const topic = envelope?.topic?.trim();\n if (!topic) {\n return;\n }\n const list = this.handlers.get(topic);\n if (!list?.length) {\n return;\n }\n for (const registration of list) {\n await registration.handle(envelope);\n }\n }\n}\n\n//#endregion\n","import type { Observable } from 'rxjs';\n\n//#region ---- Connection port ----\n\nexport type AXPRealtimeConnectionStatus = 'connected' | 'connecting' | 'disconnected';\n\n/**\n * Always-on realtime connection used by the app shell.\n * Built-in implementation uses Socket.IO; alternate backends may replace this port.\n */\nexport abstract class AXPRealtimeConnectionPort {\n abstract readonly connectionStatus$: Observable<AXPRealtimeConnectionStatus>;\n\n abstract connect(): void;\n abstract disconnect(): void;\n abstract reconnectWithCurrentToken(): void;\n abstract isSocketConnected(): boolean;\n abstract subscribeConversation(conversationId: string): void;\n abstract unsubscribeConversation(conversationId: string): void;\n abstract emitConversationTyping(conversationId: string, active: boolean): void;\n}\n\n//#endregion\n","import { DOCUMENT } from '@angular/common';\nimport { Inject, Injectable, OnDestroy, Optional, inject } from '@angular/core';\nimport { AXPSessionService, AXPSessionStatus } from '@acorex-platform/framework-client/auth';\nimport { io, type Socket } from 'socket.io-client';\nimport { BehaviorSubject, Subscription } from 'rxjs';\nimport {\n AXPRealtimeConnectionPort,\n type AXPRealtimeConnectionStatus,\n} from './realtime-connection.port';\nimport { AXPBulkProgressChannel } from '@acorex-platform/framework-client/runtime';\nimport { AXPRealtimeDispatcherService } from './realtime-dispatcher.service';\nimport {\n AXP_REALTIME_EMIT_TYPING,\n AXP_REALTIME_PRESENCE_LEAVE,\n AXP_REALTIME_PRESENCE_SET,\n AXP_REALTIME_SOCKET_EVENT,\n AXP_REALTIME_SUBSCRIBE_CONVERSATION,\n AXP_REALTIME_SUBSCRIBE_PRESENCE,\n AXP_REALTIME_TOPIC_BULK_PROGRESS,\n AXP_REALTIME_UNSUBSCRIBE_CONVERSATION,\n AXP_REALTIME_UNSUBSCRIBE_PRESENCE,\n} from './realtime.topics';\nimport type {\n AXPRealtimeBulkProgressPayload,\n AXPRealtimeConfig,\n AXPRealtimeEnvelope,\n AXPRealtimePresenceSetResult,\n AXPRealtimePresenceSubscribeResult,\n AXPRealtimeUserPresenceSnapshotItem,\n} from './realtime.types';\nimport { AXP_REALTIME_CONFIG } from './tokens';\n\n//#region ---- Constants ----\n\nconst RECONNECT_DELAY_MS = 1_000;\nconst RECONNECT_DELAY_MAX_MS = 10_000;\nconst CONNECT_TIMEOUT_MS = 20_000;\n\n//#endregion\n\n//#region ---- Socket.IO connection (built-in) ----\n\n/**\n * Built-in always-on realtime connection via Socket.IO.\n */\n@Injectable()\nexport class AXPRealtimeConnectionService extends AXPRealtimeConnectionPort implements OnDestroy {\n private readonly session = inject(AXPSessionService);\n private readonly dispatcher = inject(AXPRealtimeDispatcherService);\n private readonly bulkProgress = inject(AXPBulkProgressChannel, { optional: true });\n private readonly document = inject(DOCUMENT);\n private socket: Socket | null = null;\n private statusSub: Subscription | null = null;\n private wakeListenersBound = false;\n private readonly joinedConversations = new Set<string>();\n private readonly connectionStatusSubject = new BehaviorSubject<AXPRealtimeConnectionStatus>(\n 'disconnected',\n );\n\n /** Latest Socket.IO connection state for feature modules (e.g. chat). */\n override readonly connectionStatus$ = this.connectionStatusSubject.asObservable();\n\n constructor(\n @Optional()\n @Inject(AXP_REALTIME_CONFIG)\n private readonly config: AXPRealtimeConfig | null,\n ) {\n super();\n this.registerBulkProgressHandler();\n if (config?.autoConnect === false) {\n return;\n }\n this.bindWakeListeners();\n this.statusSub = this.session.status$.subscribe((status) => {\n if (status === AXPSessionStatus.Authorized) {\n this.connect();\n } else {\n void this.leaveAndDisconnect();\n }\n });\n }\n\n ngOnDestroy(): void {\n this.statusSub?.unsubscribe();\n this.unbindWakeListeners();\n this.disconnect();\n }\n\n /** Sign-out: tell the server to skip grace, then close the socket. */\n async leaveAndDisconnect(): Promise<void> {\n await this.leavePresence();\n this.disconnect();\n }\n\n connect(): void {\n const url = this.config?.url?.trim();\n if (!url || !this.session.hasSessionCredentials()) {\n this.connectionStatusSubject.next('disconnected');\n return;\n }\n\n if (this.socket?.connected) {\n return;\n }\n\n // Resume a dead manager (sleep / tab freeze / network drop) instead of creating a second client.\n if (this.socket) {\n this.connectionStatusSubject.next('connecting');\n this.socket.connect();\n return;\n }\n\n this.connectionStatusSubject.next('connecting');\n\n // Auth uses HttpOnly access cookie (same-site / proxied); no token in JS.\n this.socket = io(url, {\n transports: ['websocket', 'polling'],\n withCredentials: true,\n autoConnect: true,\n reconnection: true,\n reconnectionAttempts: Infinity,\n reconnectionDelay: RECONNECT_DELAY_MS,\n reconnectionDelayMax: RECONNECT_DELAY_MAX_MS,\n timeout: CONNECT_TIMEOUT_MS,\n });\n\n this.socket.on(AXP_REALTIME_SOCKET_EVENT, (envelope: AXPRealtimeEnvelope) => {\n void this.dispatcher.dispatch(envelope);\n });\n\n this.socket.on('connect', () => {\n this.connectionStatusSubject.next('connected');\n for (const conversationId of this.joinedConversations) {\n this.socket?.emit(AXP_REALTIME_SUBSCRIBE_CONVERSATION, { conversationId });\n }\n });\n\n this.socket.on('disconnect', () => {\n this.connectionStatusSubject.next('disconnected');\n });\n\n this.socket.on('connect_error', () => {\n this.connectionStatusSubject.next('disconnected');\n });\n }\n\n override disconnect(): void {\n if (this.socket) {\n this.socket.removeAllListeners();\n this.socket.disconnect();\n this.socket = null;\n }\n this.connectionStatusSubject.next('disconnected');\n }\n\n /** Re-auth with the latest access token (e.g. after refresh). */\n override reconnectWithCurrentToken(): void {\n this.disconnect();\n this.connect();\n }\n\n /** Whether the underlying Socket.IO client is connected. */\n override isSocketConnected(): boolean {\n return this.socket?.connected === true;\n }\n\n override subscribeConversation(conversationId: string): void {\n const id = conversationId?.trim();\n if (!id) {\n return;\n }\n this.joinedConversations.add(id);\n this.socket?.emit(AXP_REALTIME_SUBSCRIBE_CONVERSATION, { conversationId: id });\n }\n\n override unsubscribeConversation(conversationId: string): void {\n const id = conversationId?.trim();\n if (!id) {\n return;\n }\n this.joinedConversations.delete(id);\n this.socket?.emit(AXP_REALTIME_UNSUBSCRIBE_CONVERSATION, { conversationId: id });\n }\n\n override emitConversationTyping(conversationId: string, active: boolean): void {\n const id = conversationId?.trim();\n if (!id || !this.socket?.connected) {\n return;\n }\n this.socket.emit(AXP_REALTIME_EMIT_TYPING, { conversationId: id, active });\n }\n\n subscribePresence(userIds: readonly string[]): Promise<AXPRealtimeUserPresenceSnapshotItem[]> {\n const ids = userIds.map((id) => id.trim()).filter(Boolean);\n if (ids.length === 0 || !this.socket?.connected) {\n return Promise.resolve([]);\n }\n\n return new Promise((resolve) => {\n this.socket?.emit(\n AXP_REALTIME_SUBSCRIBE_PRESENCE,\n { userIds: ids },\n (result: AXPRealtimePresenceSubscribeResult | undefined) => {\n resolve(Array.isArray(result?.items) ? result.items : []);\n },\n );\n });\n }\n\n unsubscribePresence(userIds: readonly string[]): void {\n const ids = userIds.map((id) => id.trim()).filter(Boolean);\n if (ids.length === 0) {\n return;\n }\n this.socket?.emit(AXP_REALTIME_UNSUBSCRIBE_PRESENCE, { userIds: ids });\n }\n\n leavePresence(): Promise<void> {\n if (!this.socket?.connected) {\n return Promise.resolve();\n }\n\n return new Promise((resolve) => {\n const timer = setTimeout(resolve, 400);\n this.socket?.emit(AXP_REALTIME_PRESENCE_LEAVE, {}, () => {\n clearTimeout(timer);\n resolve();\n });\n });\n }\n\n setPresence(\n status: 'online' | 'away' | 'busy',\n source: 'auto' | 'manual' = 'manual',\n ): Promise<AXPRealtimeUserPresenceSnapshotItem | undefined> {\n if (!this.socket?.connected) {\n return Promise.resolve(undefined);\n }\n\n return new Promise((resolve) => {\n this.socket?.emit(\n AXP_REALTIME_PRESENCE_SET,\n { status, source },\n (result: AXPRealtimePresenceSetResult | undefined) => {\n resolve(result?.ok ? result.item : undefined);\n },\n );\n });\n }\n\n private registerBulkProgressHandler(): void {\n this.dispatcher.register({\n topic: AXP_REALTIME_TOPIC_BULK_PROGRESS,\n handle: async (envelope) => {\n const payload = envelope.payload as AXPRealtimeBulkProgressPayload;\n if (!payload?.executionId?.trim()) {\n return;\n }\n this.bulkProgress?.notify(payload);\n },\n });\n }\n\n //#region ---- Wake / network resume ----\n\n private bindWakeListeners(): void {\n if (this.wakeListenersBound) {\n return;\n }\n this.wakeListenersBound = true;\n this.document.addEventListener('visibilitychange', this.onVisibilityResume);\n this.document.defaultView?.addEventListener('online', this.onNetworkResume);\n }\n\n private unbindWakeListeners(): void {\n if (!this.wakeListenersBound) {\n return;\n }\n this.wakeListenersBound = false;\n this.document.removeEventListener('visibilitychange', this.onVisibilityResume);\n this.document.defaultView?.removeEventListener('online', this.onNetworkResume);\n }\n\n private readonly onVisibilityResume = (): void => {\n if (this.document.visibilityState === 'visible') {\n this.resumeIfAuthorized();\n }\n };\n\n private readonly onNetworkResume = (): void => {\n this.resumeIfAuthorized();\n };\n\n private resumeIfAuthorized(): void {\n if (!this.session.isAuthorized || !this.session.hasSessionCredentials()) {\n return;\n }\n if (this.socket?.connected) {\n return;\n }\n this.connect();\n }\n\n //#endregion\n}\n\n//#endregion\n","//#region ----- Constants -----\n\n/** Idle without input before automatic Away. Keep in sync with server `AXP_USER_PRESENCE_IDLE_MS`. */\nexport const AXP_USER_PRESENCE_IDLE_MS = 5 * 60_000;\n\n//#endregion\n","import type { AXPRealtimeUserPresencePayload, AXPRealtimeUserPresenceStatus } from '../realtime.types';\nimport type { AXPUserPresence, AXPUserPresenceSource } from './user-presence.types';\n\n//#region ----- Presence helpers -----\n\nconst PRESENCE_STATUSES: readonly AXPRealtimeUserPresenceStatus[] = ['online', 'offline', 'away', 'busy'];\n\nexport function isWatchablePresenceUserId(userId: string | null | undefined): boolean {\n const id = userId?.trim() ?? '';\n if (!id || id === 'system') {\n return false;\n }\n return !id.startsWith('assist-');\n}\n\nexport function parseUserPresencePayload(payload: unknown): AXPUserPresence | null {\n if (!payload || typeof payload !== 'object') {\n return null;\n }\n\n const raw = payload as AXPRealtimeUserPresencePayload;\n const userId = raw.userId?.trim();\n if (!userId) {\n return null;\n }\n\n const status = PRESENCE_STATUSES.includes(raw.status) ? raw.status : 'offline';\n const lastSeen = typeof raw.lastSeen === 'string' && raw.lastSeen.trim() ? raw.lastSeen.trim() : undefined;\n const since = typeof raw.since === 'string' && raw.since.trim() ? raw.since.trim() : undefined;\n const source: AXPUserPresenceSource | undefined =\n raw.source === 'auto' || raw.source === 'manual' ? raw.source : undefined;\n return {\n userId,\n status,\n ...(lastSeen ? { lastSeen } : {}),\n ...(since ? { since } : {}),\n ...(source ? { source } : {}),\n };\n}\n\n//#endregion\n","import { Injectable, inject } from '@angular/core';\nimport { BehaviorSubject, Observable, Subject } from 'rxjs';\nimport { AXPRealtimeConnectionService } from '../realtime-connection.service';\nimport type { AXPUserPresence } from './user-presence.types';\nimport { isWatchablePresenceUserId, parseUserPresencePayload } from './user-presence.util';\n\n//#region ----- User presence store -----\n\nconst FLUSH_DEBOUNCE_MS = 40;\n\n@Injectable({ providedIn: 'root' })\nexport class AXPUserPresenceService {\n //#region ----- Services & Dependencies -----\n\n private readonly connection = inject(AXPRealtimeConnectionService, { optional: true });\n\n //#endregion\n\n //#region ----- State -----\n\n private readonly presenceByUserId = new Map<string, AXPUserPresence>();\n private readonly watchCounts = new Map<string, number>();\n private readonly subjects = new Map<string, BehaviorSubject<AXPUserPresence>>();\n private readonly updatesSubject = new Subject<AXPUserPresence>();\n private flushTimer: ReturnType<typeof setTimeout> | null = null;\n private pendingSubscribe = new Set<string>();\n private pendingUnsubscribe = new Set<string>();\n\n readonly updates$ = this.updatesSubject.asObservable();\n\n //#endregion\n\n constructor() {\n this.connection?.connectionStatus$.subscribe((status) => {\n if (status === 'connected') {\n this.resubscribeAll();\n }\n });\n }\n\n //#region ----- Public API -----\n\n get(userId: string): AXPUserPresence | undefined {\n const id = userId?.trim();\n if (!id) {\n return undefined;\n }\n return this.presenceByUserId.get(id);\n }\n\n presence$(userId: string): Observable<AXPUserPresence> {\n const id = userId?.trim();\n const fallback: AXPUserPresence = { userId: id, status: 'offline' };\n if (!id) {\n return new BehaviorSubject(fallback).asObservable();\n }\n\n let subject = this.subjects.get(id);\n if (!subject) {\n subject = new BehaviorSubject<AXPUserPresence>(this.presenceByUserId.get(id) ?? fallback);\n this.subjects.set(id, subject);\n }\n return subject.asObservable();\n }\n\n watch(userId: string): void {\n if (!isWatchablePresenceUserId(userId)) {\n return;\n }\n const id = userId.trim();\n const next = (this.watchCounts.get(id) ?? 0) + 1;\n this.watchCounts.set(id, next);\n if (next === 1) {\n this.pendingUnsubscribe.delete(id);\n this.pendingSubscribe.add(id);\n this.scheduleFlush();\n }\n }\n\n watchMany(userIds: readonly string[]): void {\n for (const userId of userIds) {\n this.watch(userId);\n }\n }\n\n /** Watch only if this user is not already in the local watch set. */\n ensureWatch(userId: string): void {\n const id = userId?.trim();\n if (!id || (this.watchCounts.get(id) ?? 0) > 0) {\n return;\n }\n this.watch(id);\n }\n\n ensureWatchMany(userIds: readonly string[]): void {\n for (const userId of userIds) {\n this.ensureWatch(userId);\n }\n }\n\n unwatch(userId: string): void {\n const id = userId?.trim();\n if (!id) {\n return;\n }\n const current = this.watchCounts.get(id) ?? 0;\n if (current <= 1) {\n this.watchCounts.delete(id);\n this.pendingSubscribe.delete(id);\n this.pendingUnsubscribe.add(id);\n this.scheduleFlush();\n return;\n }\n this.watchCounts.set(id, current - 1);\n }\n\n applySnapshot(items: readonly AXPUserPresence[]): void {\n for (const item of items) {\n this.applyPresence(item);\n }\n }\n\n applyEnvelopePayload(payload: unknown): void {\n const parsed = parseUserPresencePayload(payload);\n if (parsed) {\n this.applyPresence(parsed);\n }\n }\n\n async setAvailability(\n status: 'online' | 'away' | 'busy',\n source: 'auto' | 'manual' = 'manual',\n ): Promise<void> {\n const item = await this.connection?.setPresence(status, source);\n if (item) {\n this.applyPresence(item);\n }\n }\n\n //#endregion\n\n //#region ----- Store updates -----\n\n private applyPresence(presence: AXPUserPresence): void {\n const previous = this.presenceByUserId.get(presence.userId);\n if (\n previous &&\n previous.status === presence.status &&\n previous.lastSeen === presence.lastSeen &&\n previous.since === presence.since\n ) {\n return;\n }\n\n this.presenceByUserId.set(presence.userId, presence);\n const subject = this.subjects.get(presence.userId);\n if (subject && !subject.closed) {\n subject.next(presence);\n }\n this.updatesSubject.next(presence);\n }\n\n private scheduleFlush(): void {\n if (this.flushTimer) {\n return;\n }\n this.flushTimer = setTimeout(() => {\n this.flushTimer = null;\n void this.flush();\n }, FLUSH_DEBOUNCE_MS);\n }\n\n private async flush(): Promise<void> {\n const subscribeIds = Array.from(this.pendingSubscribe);\n const unsubscribeIds = Array.from(this.pendingUnsubscribe);\n this.pendingSubscribe.clear();\n this.pendingUnsubscribe.clear();\n\n if (unsubscribeIds.length > 0) {\n this.connection?.unsubscribePresence(unsubscribeIds);\n }\n if (subscribeIds.length === 0) {\n return;\n }\n\n const items = (await this.connection?.subscribePresence(subscribeIds)) ?? [];\n this.applySnapshot(items);\n }\n\n private resubscribeAll(): void {\n const watched = Array.from(this.watchCounts.keys());\n if (watched.length === 0) {\n return;\n }\n this.pendingUnsubscribe.clear();\n for (const id of watched) {\n this.pendingSubscribe.add(id);\n }\n this.scheduleFlush();\n }\n\n //#endregion\n}\n\n//#endregion\n","import { DOCUMENT } from '@angular/common';\nimport { DestroyRef, Injectable, inject } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { AXPSessionService, AXPSessionStatus } from '@acorex-platform/framework-client/auth';\nimport { AXP_USER_PRESENCE_IDLE_MS } from '../presence-idle.constants';\nimport { AXPUserPresenceService } from './user-presence.service';\n\n//#region ----- Automatic away from idle -----\n\nconst IDLE_CHECK_MS = 15_000;\nconst ACTIVITY_THROTTLE_MS = 1_000;\n\n@Injectable({ providedIn: 'root' })\nexport class AXPUserPresenceIdleService {\n //#region ----- Services & Dependencies -----\n\n private readonly document = inject(DOCUMENT);\n private readonly session = inject(AXPSessionService);\n private readonly presence = inject(AXPUserPresenceService);\n private readonly destroyRef = inject(DestroyRef);\n\n //#endregion\n\n //#region ----- State -----\n\n private lastActivityAt = Date.now();\n private lastActivityEmitAt = 0;\n private idle = false;\n private checkTimer: ReturnType<typeof setInterval> | null = null;\n private started = false;\n\n //#endregion\n\n constructor() {\n this.session.status$.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((status) => {\n if (status === AXPSessionStatus.Authorized) {\n this.start();\n return;\n }\n this.stop();\n });\n }\n\n //#region ----- Lifecycle -----\n\n start(): void {\n if (this.started) {\n return;\n }\n this.started = true;\n this.lastActivityAt = Date.now();\n this.idle = false;\n const target = this.document.defaultView ?? this.document;\n target.addEventListener('mousemove', this.onActivity, { passive: true });\n target.addEventListener('keydown', this.onActivity, { passive: true });\n target.addEventListener('mousedown', this.onActivity, { passive: true });\n target.addEventListener('touchstart', this.onActivity, { passive: true });\n this.document.addEventListener('visibilitychange', this.onVisibility);\n this.checkTimer = setInterval(() => this.checkIdle(), IDLE_CHECK_MS);\n }\n\n stop(): void {\n if (!this.started) {\n return;\n }\n this.started = false;\n this.idle = false;\n const target = this.document.defaultView ?? this.document;\n target.removeEventListener('mousemove', this.onActivity);\n target.removeEventListener('keydown', this.onActivity);\n target.removeEventListener('mousedown', this.onActivity);\n target.removeEventListener('touchstart', this.onActivity);\n this.document.removeEventListener('visibilitychange', this.onVisibility);\n if (this.checkTimer) {\n clearInterval(this.checkTimer);\n this.checkTimer = null;\n }\n }\n\n //#endregion\n\n //#region ----- Activity -----\n\n private readonly onActivity = (): void => {\n const now = Date.now();\n this.lastActivityAt = now;\n if (now - this.lastActivityEmitAt < ACTIVITY_THROTTLE_MS) {\n return;\n }\n this.lastActivityEmitAt = now;\n if (this.idle) {\n this.idle = false;\n void this.presence.setAvailability('online', 'auto');\n }\n };\n\n private readonly onVisibility = (): void => {\n if (!this.document.hidden) {\n this.onActivity();\n }\n };\n\n private checkIdle(): void {\n if (!this.started || this.idle) {\n return;\n }\n if (Date.now() - this.lastActivityAt < AXP_USER_PRESENCE_IDLE_MS) {\n return;\n }\n this.idle = true;\n void this.presence.setAvailability('away', 'auto');\n }\n\n //#endregion\n}\n\n//#endregion\n","import {\n inject,\n makeEnvironmentProviders,\n type EnvironmentProviders,\n} from '@angular/core';\nimport {\n AXP_APP_STARTUP_PRIORITY,\n provideAppStartUpTask,\n} from '@acorex-platform/framework-client/core';\nimport { provideCommandSetups } from '@acorex-platform/framework-client/runtime';\nimport { PRESENCE_SET_AVAILABILITY } from '@acorex-platform/framework-shared/runtime';\nimport { AXPUserPresenceIdleService } from './presence/user-presence-idle.service';\nimport { AXPUserPresenceService } from './presence/user-presence.service';\nimport { AXPRealtimeConnectionPort } from './realtime-connection.port';\nimport { AXPRealtimeConnectionService } from './realtime-connection.service';\nimport { AXPRealtimeDispatcherService } from './realtime-dispatcher.service';\nimport type { AXPRealtimeConfig } from './realtime.types';\nimport { resolveRealtimeSocketUrl } from './realtime-url.util';\nimport { AXP_REALTIME_TOPIC_USER_PRESENCE } from './realtime.topics';\nimport { AXP_REALTIME_CONFIG } from './tokens';\n\n//#region ---- provideRealtime ----\n\nexport interface AXPProvideRealtimeOptions extends AXPRealtimeConfig {\n apiBaseUrl?: string;\n /**\n * Always-on backend. Default `builtin` (Socket.IO).\n * Call/media uses extensions/rtc when configured — not this switch.\n */\n backend?: 'builtin';\n}\n\n/**\n * Registers built-in always-on realtime (Socket.IO) + topic dispatcher.\n */\nexport function provideRealtime(config: AXPProvideRealtimeOptions = {}): EnvironmentProviders {\n const backend = config.backend ?? 'builtin';\n if (backend !== 'builtin') {\n throw new Error(`Unsupported realtime backend '${String(backend)}'. Use 'builtin'.`);\n }\n\n const url =\n config.url?.trim() ||\n (config.apiBaseUrl?.trim() ? resolveRealtimeSocketUrl(config.apiBaseUrl) : undefined);\n\n return makeEnvironmentProviders([\n {\n provide: AXP_REALTIME_CONFIG,\n useValue: {\n autoConnect: config.autoConnect !== false,\n url,\n } satisfies AXPRealtimeConfig,\n },\n AXPRealtimeDispatcherService,\n AXPRealtimeConnectionService,\n {\n provide: AXPRealtimeConnectionPort,\n useExisting: AXPRealtimeConnectionService,\n },\n provideCommandSetups([\n {\n key: PRESENCE_SET_AVAILABILITY,\n command: () =>\n import('./presence/set-presence-availability.command').then((c) => c.AXPSetPresenceAvailabilityCommand),\n },\n ]),\n provideAppStartUpTask(() => {\n inject(AXPUserPresenceIdleService);\n return {\n name: 'user-presence-idle',\n priority: AXP_APP_STARTUP_PRIORITY.realtimeSubscriptions,\n run: async () => undefined,\n };\n }),\n provideAppStartUpTask(() => {\n const dispatcher = inject(AXPRealtimeDispatcherService);\n const presence = inject(AXPUserPresenceService);\n return {\n name: 'user-presence-handler',\n priority: AXP_APP_STARTUP_PRIORITY.realtimeHandlers,\n run: async () => {\n dispatcher.register({\n topic: AXP_REALTIME_TOPIC_USER_PRESENCE,\n handle: (envelope) => {\n presence.applyEnvelopePayload(envelope.payload);\n },\n });\n },\n };\n }),\n provideAppStartUpTask(() => {\n const connection = inject(AXPRealtimeConnectionPort);\n return {\n name: 'realtime-connect',\n priority: AXP_APP_STARTUP_PRIORITY.realtimeConnect,\n run: async () => {\n // Connection lifecycle is owned by the connection service (session.status$).\n // Eagerly invoke connect once so an already-authenticated session connects on bootstrap.\n connection.connect();\n },\n };\n }),\n ]);\n}\n\n//#endregion\n","import type { AXPRealtimeUserPresenceStatus, AXPRealtimeUserPresenceSource } from '../realtime.types';\n\n//#region ----- Types -----\n\nexport type AXPUserPresenceStatus = AXPRealtimeUserPresenceStatus;\nexport type AXPUserPresenceSource = AXPRealtimeUserPresenceSource;\n\nexport interface AXPUserPresence {\n userId: string;\n status: AXPUserPresenceStatus;\n lastSeen?: string;\n since?: string;\n source?: AXPUserPresenceSource;\n}\n\nexport interface AXPUserPresenceSetInput {\n status: 'online' | 'away' | 'busy';\n source?: AXPUserPresenceSource;\n}\n\n//#endregion\n","//#region ----- Presence duration tooltip -----\n\nexport type AXPPresenceDurationBucket = {\n key:\n | 'duration.less-than-a-minute'\n | 'duration.one-minute'\n | 'duration.minutes'\n | 'duration.one-hour'\n | 'duration.hours'\n | 'duration.one-day'\n | 'duration.days';\n params?: { count: number };\n};\n\nexport function presenceDurationBucket(ms: number): AXPPresenceDurationBucket {\n const elapsed = Math.max(0, ms);\n if (elapsed < 60_000) {\n return { key: 'duration.less-than-a-minute' };\n }\n\n const minutes = Math.floor(elapsed / 60_000);\n if (minutes < 60) {\n return minutes === 1 ? { key: 'duration.one-minute' } : { key: 'duration.minutes', params: { count: minutes } };\n }\n\n const hours = Math.floor(minutes / 60);\n if (hours < 24) {\n return hours === 1 ? { key: 'duration.one-hour' } : { key: 'duration.hours', params: { count: hours } };\n }\n\n const days = Math.floor(hours / 24);\n return days === 1 ? { key: 'duration.one-day' } : { key: 'duration.days', params: { count: days } };\n}\n\n//#endregion\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"acorex-platform-framework-client-realtime.mjs","sources":["../../../../../libs/framework/client/realtime/src/lib/realtime.types.ts","../../../../../libs/framework/client/realtime/src/lib/realtime.topics.ts","../../../../../libs/framework/client/realtime/src/lib/realtime-url.util.ts","../../../../../libs/framework/client/realtime/src/lib/tokens.ts","../../../../../libs/framework/client/realtime/src/lib/realtime-dispatcher.service.ts","../../../../../libs/framework/client/realtime/src/lib/realtime-connection.port.ts","../../../../../libs/framework/client/realtime/src/lib/realtime-connection.service.ts","../../../../../libs/framework/client/realtime/src/lib/presence-idle.constants.ts","../../../../../libs/framework/client/realtime/src/lib/presence/user-presence.util.ts","../../../../../libs/framework/client/realtime/src/lib/presence/user-presence.service.ts","../../../../../libs/framework/client/realtime/src/lib/presence/user-presence-idle.service.ts","../../../../../libs/framework/client/realtime/src/lib/realtime.providers.ts","../../../../../libs/framework/client/realtime/src/lib/presence/user-presence.types.ts","../../../../../libs/framework/client/realtime/src/lib/presence/user-presence-duration.util.ts","../../../../../libs/framework/client/realtime/src/acorex-platform-framework-client-realtime.ts"],"sourcesContent":["//#region ---- Client realtime types ----\n\nexport interface AXPRealtimeAudience {\n userIds?: string[];\n // TODO(realtime): See server realtime.types.ts — generic refType/refId scopes.\n conversationId?: string;\n /** When true, deliver to all connected users in the envelope tenant. */\n tenant?: boolean;\n /** Deliver to every connected socket for these users across all tenants. */\n globalUserIds?: string[];\n /** Deliver to sockets that joined the JWT `sid` room (`s:{sid}`). */\n sessionIds?: string[];\n}\n\nexport interface AXPRealtimeEnvelope {\n topic: string;\n tenantId: string;\n audience: AXPRealtimeAudience;\n payload: unknown;\n correlationId?: string;\n emittedAt: string;\n}\n\nexport interface AXPRealtimeInboxRefreshPayload {\n deliveryId?: string;\n deliveryIds?: string[];\n /** Optional hint so clients can apply deletes/archives without a fetch. */\n op?: 'created' | 'updated' | 'deleted' | 'archived';\n}\n\nexport interface AXPRealtimeBackgroundJobTrayRefreshPayload {\n jobId?: string;\n /**\n * Hint for client tray sync.\n * Prefer applying locally; full list fetch only when the job is missing (e.g. `created`).\n */\n op?: 'created' | 'updated' | 'completed' | 'failed' | 'cancelled' | 'dismissed';\n status?: string;\n progress?: number;\n statusText?: string;\n currentStep?: string;\n supportsProgress?: boolean;\n keepInTrayAfterComplete?: boolean;\n completedAt?: string;\n trayDismissedAt?: string;\n}\n\nexport interface AXPRealtimeConversationMessagePayload {\n conversationId: string;\n messageId: string;\n op: 'created' | 'updated' | 'deleted';\n /** Optional entity snapshot so clients can skip a follow-up GET. */\n message?: Record<string, unknown>;\n}\n\nexport interface AXPRealtimeConversationTypingPayload {\n conversationId: string;\n userId: string;\n userName?: string;\n active: boolean;\n}\n\nexport type AXPRealtimeConversationCallAction =\n | 'invite'\n | 'ring'\n | 'accept'\n | 'decline'\n | 'cancel'\n | 'end';\n\nexport type AXPRealtimeConversationCallMedia = 'voice' | 'video';\n\n/** Built-in realtime signaling for chat calls (media joins via RTC when configured). */\nexport interface AXPRealtimeConversationCallPayload {\n conversationId: string;\n action: AXPRealtimeConversationCallAction;\n media: AXPRealtimeConversationCallMedia;\n /** Caller / actor user id. */\n fromUserId: string;\n fromUserName?: string;\n /** Optional call correlation id shared across invite → accept. */\n callId?: string;\n}\n\nexport interface AXPRealtimeBulkProgressPayload {\n executionId: string;\n entity: string;\n name: string;\n current: number;\n total: number;\n succeeded: number;\n failed: number;\n status: 'running' | 'completed';\n}\n\nexport interface AXPRealtimeEntityMutationPayload {\n entityName: string;\n operation: 'created' | 'updated' | 'deleted';\n id?: string;\n /** True when the mutation originated from a server bulk command fan-out. */\n bulk?: boolean;\n /** Number of successfully mutated records in a bulk operation. */\n count?: number;\n bulkExecutionId?: string;\n}\n\nexport type AXPRealtimeUserPresenceStatus = 'online' | 'offline' | 'away' | 'busy';\nexport type AXPRealtimeUserPresenceSource = 'auto' | 'manual';\n\nexport interface AXPRealtimeUserPresencePayload {\n userId: string;\n status: AXPRealtimeUserPresenceStatus;\n lastSeen?: string;\n since?: string;\n source?: AXPRealtimeUserPresenceSource;\n}\n\nexport interface AXPRealtimeUserPresenceSnapshotItem {\n userId: string;\n status: AXPRealtimeUserPresenceStatus;\n lastSeen?: string;\n since?: string;\n source?: AXPRealtimeUserPresenceSource;\n}\n\nexport interface AXPRealtimePresenceSetResult {\n ok: boolean;\n reason?: string;\n item?: AXPRealtimeUserPresenceSnapshotItem;\n}\n\nexport interface AXPRealtimePresenceSubscribeResult {\n ok: boolean;\n reason?: string;\n items?: AXPRealtimeUserPresenceSnapshotItem[];\n}\n\nexport type AXPRealtimeAuthSecurityAlertKind =\n | 'login_success'\n | 'login_failed'\n | 'account_locked'\n | 'logout'\n | 'session_terminated'\n | 'two_factor_enabled'\n | 'two_factor_disabled'\n | 'two_factor_admin_reset'\n | 'two_factor_recovery_codes_regenerated';\n\nexport type AXPRealtimeAiVoiceSessionState =\n | 'connecting'\n | 'listening'\n | 'thinking'\n | 'speaking'\n | 'interrupted'\n | 'ended'\n | 'error';\n\n/** Control-plane only — never carries audio frames. */\nexport interface AXPRealtimeAiVoiceSessionPayload {\n sessionId: string;\n conversationId?: string;\n state: AXPRealtimeAiVoiceSessionState;\n partialTranscript?: string;\n finalTranscript?: string;\n spokenDelta?: string;\n errorKey?: string;\n toolName?: string;\n}\n\nexport interface AXPRealtimeAuthSecurityAlertPayload {\n kind: AXPRealtimeAuthSecurityAlertKind;\n at: string;\n actorSessionId?: string;\n /** JWT `sid` of the revoked session (session_terminated). */\n targetSessionId?: string;\n deviceSummary?: string;\n ipAddress?: string;\n browser?: string;\n deviceName?: string;\n operatingSystem?: string;\n}\n\nexport interface AXPRealtimeConfig {\n /**\n * Socket.IO namespace URL, e.g. `http://localhost:5500/realtime`.\n * Derived from API baseUrl when omitted (strip trailing `/api`).\n */\n url?: string;\n /** When false, connection is not started automatically. Default true. */\n autoConnect?: boolean;\n}\n\nexport type AXPRealtimeTopicHandler = (envelope: AXPRealtimeEnvelope) => void | Promise<void>;\n\nexport interface AXPRealtimeTopicHandlerRegistration {\n topic: string;\n handle: AXPRealtimeTopicHandler;\n}\n\n//#endregion\n","//#region ---- Client topic constants (mirror server) ----\n\nexport const AXP_REALTIME_TOPIC_INBOX_REFRESH = 'inbox.refresh';\nexport const AXP_REALTIME_TOPIC_BACKGROUND_JOB_TRAY_REFRESH = 'background-job.tray.refresh';\nexport const AXP_REALTIME_TOPIC_CONVERSATION_MESSAGE = 'conversation.message';\nexport const AXP_REALTIME_TOPIC_CONVERSATION_TYPING = 'conversation.typing';\nexport const AXP_REALTIME_TOPIC_CONVERSATION_CALL = 'conversation.call';\nexport const AXP_REALTIME_TOPIC_ENTITY_MUTATION = 'entity.mutation';\nexport const AXP_REALTIME_TOPIC_BULK_PROGRESS = 'runtime.bulk.progress';\nexport const AXP_REALTIME_TOPIC_USER_PRESENCE = 'user.presence';\nexport const AXP_REALTIME_TOPIC_AUTH_SECURITY_ALERT = 'auth.security-alert';\nexport const AXP_REALTIME_TOPIC_AI_VOICE_SESSION = 'ai.voice.session';\n\nexport const AXP_REALTIME_SOCKET_EVENT = 'realtime';\nexport const AXP_REALTIME_SUBSCRIBE_CONVERSATION = 'subscribe.conversation';\nexport const AXP_REALTIME_UNSUBSCRIBE_CONVERSATION = 'unsubscribe.conversation';\nexport const AXP_REALTIME_SUBSCRIBE_PRESENCE = 'subscribe.presence';\nexport const AXP_REALTIME_UNSUBSCRIBE_PRESENCE = 'unsubscribe.presence';\nexport const AXP_REALTIME_PRESENCE_LEAVE = 'presence.leave';\nexport const AXP_REALTIME_PRESENCE_SET = 'presence.set';\nexport const AXP_REALTIME_EMIT_TYPING = 'conversation.typing.emit';\n\n//#endregion\n","//#region ---- Realtime URL helpers ----\n\n/**\n * Builds Socket.IO namespace URL from an HTTP API baseUrl (`…/api` → `…/realtime`).\n */\nexport function resolveRealtimeSocketUrl(apiBaseUrl: string): string {\n const trimmed = apiBaseUrl.trim().replace(/\\/+$/, '');\n const withoutApi = trimmed.endsWith('/api') ? trimmed.slice(0, -4) : trimmed;\n return `${withoutApi}/realtime`;\n}\n\n//#endregion\n","import { InjectionToken } from '@angular/core';\nimport type {\n AXPRealtimeConfig,\n AXPRealtimeTopicHandlerRegistration,\n} from './realtime.types';\n\n//#region ---- DI tokens ----\n\nexport const AXP_REALTIME_CONFIG = new InjectionToken<AXPRealtimeConfig>('AXP_REALTIME_CONFIG');\n\nexport const AXP_REALTIME_TOPIC_HANDLER = new InjectionToken<AXPRealtimeTopicHandlerRegistration>(\n 'AXP_REALTIME_TOPIC_HANDLER',\n);\n\n//#endregion\n","import { Inject, Injectable, Optional } from '@angular/core';\nimport { AXP_REALTIME_TOPIC_HANDLER } from './tokens';\nimport type {\n AXPRealtimeEnvelope,\n AXPRealtimeTopicHandlerRegistration,\n} from './realtime.types';\n\n//#region ---- Topic dispatcher ----\n\n@Injectable()\nexport class AXPRealtimeDispatcherService {\n private readonly handlers = new Map<string, AXPRealtimeTopicHandlerRegistration[]>();\n\n constructor(\n @Optional()\n @Inject(AXP_REALTIME_TOPIC_HANDLER)\n registrations?: AXPRealtimeTopicHandlerRegistration[] | AXPRealtimeTopicHandlerRegistration,\n ) {\n const list = !registrations\n ? []\n : Array.isArray(registrations)\n ? registrations\n : [registrations];\n for (const registration of list) {\n this.register(registration);\n }\n }\n\n register(registration: AXPRealtimeTopicHandlerRegistration): void {\n const topic = registration.topic?.trim();\n if (!topic || typeof registration.handle !== 'function') {\n return;\n }\n const existing = this.handlers.get(topic) ?? [];\n existing.push(registration);\n this.handlers.set(topic, existing);\n }\n\n async dispatch(envelope: AXPRealtimeEnvelope): Promise<void> {\n const topic = envelope?.topic?.trim();\n if (!topic) {\n return;\n }\n const list = this.handlers.get(topic);\n if (!list?.length) {\n return;\n }\n for (const registration of list) {\n await registration.handle(envelope);\n }\n }\n}\n\n//#endregion\n","import type { Observable } from 'rxjs';\n\n//#region ---- Connection port ----\n\nexport type AXPRealtimeConnectionStatus = 'connected' | 'connecting' | 'disconnected';\n\n/**\n * Always-on realtime connection used by the app shell.\n * Built-in implementation uses Socket.IO; alternate backends may replace this port.\n */\nexport abstract class AXPRealtimeConnectionPort {\n abstract readonly connectionStatus$: Observable<AXPRealtimeConnectionStatus>;\n\n abstract connect(): void;\n abstract disconnect(): void;\n abstract reconnectWithCurrentToken(): void;\n abstract isSocketConnected(): boolean;\n abstract subscribeConversation(conversationId: string): void;\n abstract unsubscribeConversation(conversationId: string): void;\n abstract emitConversationTyping(conversationId: string, active: boolean): void;\n}\n\n//#endregion\n","import { DOCUMENT } from '@angular/common';\nimport { Inject, Injectable, OnDestroy, Optional, inject } from '@angular/core';\nimport { AXPSessionService, AXPSessionStatus } from '@acorex-platform/framework-client/auth';\nimport { io, type Socket } from 'socket.io-client';\nimport { BehaviorSubject, Subscription } from 'rxjs';\nimport {\n AXPRealtimeConnectionPort,\n type AXPRealtimeConnectionStatus,\n} from './realtime-connection.port';\nimport { AXPBulkProgressChannel } from '@acorex-platform/framework-client/runtime';\nimport { AXPRealtimeDispatcherService } from './realtime-dispatcher.service';\nimport {\n AXP_REALTIME_EMIT_TYPING,\n AXP_REALTIME_PRESENCE_LEAVE,\n AXP_REALTIME_PRESENCE_SET,\n AXP_REALTIME_SOCKET_EVENT,\n AXP_REALTIME_SUBSCRIBE_CONVERSATION,\n AXP_REALTIME_SUBSCRIBE_PRESENCE,\n AXP_REALTIME_TOPIC_BULK_PROGRESS,\n AXP_REALTIME_UNSUBSCRIBE_CONVERSATION,\n AXP_REALTIME_UNSUBSCRIBE_PRESENCE,\n} from './realtime.topics';\nimport type {\n AXPRealtimeBulkProgressPayload,\n AXPRealtimeConfig,\n AXPRealtimeEnvelope,\n AXPRealtimePresenceSetResult,\n AXPRealtimePresenceSubscribeResult,\n AXPRealtimeUserPresenceSnapshotItem,\n} from './realtime.types';\nimport { AXP_REALTIME_CONFIG } from './tokens';\n\n//#region ---- Constants ----\n\nconst RECONNECT_DELAY_MS = 1_000;\nconst RECONNECT_DELAY_MAX_MS = 10_000;\nconst CONNECT_TIMEOUT_MS = 20_000;\n\n//#endregion\n\n//#region ---- Socket.IO connection (built-in) ----\n\n/**\n * Built-in always-on realtime connection via Socket.IO.\n */\n@Injectable()\nexport class AXPRealtimeConnectionService extends AXPRealtimeConnectionPort implements OnDestroy {\n private readonly session = inject(AXPSessionService);\n private readonly dispatcher = inject(AXPRealtimeDispatcherService);\n private readonly bulkProgress = inject(AXPBulkProgressChannel, { optional: true });\n private readonly document = inject(DOCUMENT);\n private socket: Socket | null = null;\n private statusSub: Subscription | null = null;\n private wakeListenersBound = false;\n private readonly joinedConversations = new Set<string>();\n private readonly connectionStatusSubject = new BehaviorSubject<AXPRealtimeConnectionStatus>(\n 'disconnected',\n );\n\n /** Latest Socket.IO connection state for feature modules (e.g. chat). */\n override readonly connectionStatus$ = this.connectionStatusSubject.asObservable();\n\n constructor(\n @Optional()\n @Inject(AXP_REALTIME_CONFIG)\n private readonly config: AXPRealtimeConfig | null,\n ) {\n super();\n this.registerBulkProgressHandler();\n if (config?.autoConnect === false) {\n return;\n }\n this.bindWakeListeners();\n this.statusSub = this.session.status$.subscribe((status) => {\n if (status === AXPSessionStatus.Authorized) {\n this.connect();\n } else {\n void this.leaveAndDisconnect();\n }\n });\n }\n\n ngOnDestroy(): void {\n this.statusSub?.unsubscribe();\n this.unbindWakeListeners();\n this.disconnect();\n }\n\n /** Sign-out: tell the server to skip grace, then close the socket. */\n async leaveAndDisconnect(): Promise<void> {\n await this.leavePresence();\n this.disconnect();\n }\n\n connect(): void {\n const url = this.config?.url?.trim();\n if (!url || !this.session.hasSessionCredentials()) {\n this.connectionStatusSubject.next('disconnected');\n return;\n }\n\n if (this.socket?.connected) {\n return;\n }\n\n // Resume a dead manager (sleep / tab freeze / network drop) instead of creating a second client.\n if (this.socket) {\n this.connectionStatusSubject.next('connecting');\n this.socket.connect();\n return;\n }\n\n this.connectionStatusSubject.next('connecting');\n\n // Auth uses HttpOnly access cookie (same-site / proxied); no token in JS.\n this.socket = io(url, {\n transports: ['websocket', 'polling'],\n withCredentials: true,\n autoConnect: true,\n reconnection: true,\n reconnectionAttempts: Infinity,\n reconnectionDelay: RECONNECT_DELAY_MS,\n reconnectionDelayMax: RECONNECT_DELAY_MAX_MS,\n timeout: CONNECT_TIMEOUT_MS,\n });\n\n this.socket.on(AXP_REALTIME_SOCKET_EVENT, (envelope: AXPRealtimeEnvelope) => {\n void this.dispatcher.dispatch(envelope);\n });\n\n this.socket.on('connect', () => {\n this.connectionStatusSubject.next('connected');\n for (const conversationId of this.joinedConversations) {\n this.socket?.emit(AXP_REALTIME_SUBSCRIBE_CONVERSATION, { conversationId });\n }\n });\n\n this.socket.on('disconnect', () => {\n this.connectionStatusSubject.next('disconnected');\n });\n\n this.socket.on('connect_error', () => {\n this.connectionStatusSubject.next('disconnected');\n });\n }\n\n override disconnect(): void {\n if (this.socket) {\n this.socket.removeAllListeners();\n this.socket.disconnect();\n this.socket = null;\n }\n this.connectionStatusSubject.next('disconnected');\n }\n\n /** Re-auth with the latest access token (e.g. after refresh). */\n override reconnectWithCurrentToken(): void {\n this.disconnect();\n this.connect();\n }\n\n /** Whether the underlying Socket.IO client is connected. */\n override isSocketConnected(): boolean {\n return this.socket?.connected === true;\n }\n\n override subscribeConversation(conversationId: string): void {\n const id = conversationId?.trim();\n if (!id) {\n return;\n }\n this.joinedConversations.add(id);\n this.socket?.emit(AXP_REALTIME_SUBSCRIBE_CONVERSATION, { conversationId: id });\n }\n\n override unsubscribeConversation(conversationId: string): void {\n const id = conversationId?.trim();\n if (!id) {\n return;\n }\n this.joinedConversations.delete(id);\n this.socket?.emit(AXP_REALTIME_UNSUBSCRIBE_CONVERSATION, { conversationId: id });\n }\n\n override emitConversationTyping(conversationId: string, active: boolean): void {\n const id = conversationId?.trim();\n if (!id || !this.socket?.connected) {\n return;\n }\n this.socket.emit(AXP_REALTIME_EMIT_TYPING, { conversationId: id, active });\n }\n\n subscribePresence(userIds: readonly string[]): Promise<AXPRealtimeUserPresenceSnapshotItem[]> {\n const ids = userIds.map((id) => id.trim()).filter(Boolean);\n if (ids.length === 0 || !this.socket?.connected) {\n return Promise.resolve([]);\n }\n\n return new Promise((resolve) => {\n this.socket?.emit(\n AXP_REALTIME_SUBSCRIBE_PRESENCE,\n { userIds: ids },\n (result: AXPRealtimePresenceSubscribeResult | undefined) => {\n resolve(Array.isArray(result?.items) ? result.items : []);\n },\n );\n });\n }\n\n unsubscribePresence(userIds: readonly string[]): void {\n const ids = userIds.map((id) => id.trim()).filter(Boolean);\n if (ids.length === 0) {\n return;\n }\n this.socket?.emit(AXP_REALTIME_UNSUBSCRIBE_PRESENCE, { userIds: ids });\n }\n\n leavePresence(): Promise<void> {\n if (!this.socket?.connected) {\n return Promise.resolve();\n }\n\n return new Promise((resolve) => {\n const timer = setTimeout(resolve, 400);\n this.socket?.emit(AXP_REALTIME_PRESENCE_LEAVE, {}, () => {\n clearTimeout(timer);\n resolve();\n });\n });\n }\n\n setPresence(\n status: 'online' | 'away' | 'busy',\n source: 'auto' | 'manual' = 'manual',\n ): Promise<AXPRealtimeUserPresenceSnapshotItem | undefined> {\n if (!this.socket?.connected) {\n return Promise.resolve(undefined);\n }\n\n return new Promise((resolve) => {\n this.socket?.emit(\n AXP_REALTIME_PRESENCE_SET,\n { status, source },\n (result: AXPRealtimePresenceSetResult | undefined) => {\n resolve(result?.ok ? result.item : undefined);\n },\n );\n });\n }\n\n private registerBulkProgressHandler(): void {\n this.dispatcher.register({\n topic: AXP_REALTIME_TOPIC_BULK_PROGRESS,\n handle: async (envelope) => {\n const payload = envelope.payload as AXPRealtimeBulkProgressPayload;\n if (!payload?.executionId?.trim()) {\n return;\n }\n this.bulkProgress?.notify(payload);\n },\n });\n }\n\n //#region ---- Wake / network resume ----\n\n private bindWakeListeners(): void {\n if (this.wakeListenersBound) {\n return;\n }\n this.wakeListenersBound = true;\n this.document.addEventListener('visibilitychange', this.onVisibilityResume);\n this.document.defaultView?.addEventListener('online', this.onNetworkResume);\n }\n\n private unbindWakeListeners(): void {\n if (!this.wakeListenersBound) {\n return;\n }\n this.wakeListenersBound = false;\n this.document.removeEventListener('visibilitychange', this.onVisibilityResume);\n this.document.defaultView?.removeEventListener('online', this.onNetworkResume);\n }\n\n private readonly onVisibilityResume = (): void => {\n if (this.document.visibilityState === 'visible') {\n this.resumeIfAuthorized();\n }\n };\n\n private readonly onNetworkResume = (): void => {\n this.resumeIfAuthorized();\n };\n\n private resumeIfAuthorized(): void {\n if (!this.session.isAuthorized || !this.session.hasSessionCredentials()) {\n return;\n }\n if (this.socket?.connected) {\n return;\n }\n this.connect();\n }\n\n //#endregion\n}\n\n//#endregion\n","//#region ----- Constants -----\n\n/** Idle without input before automatic Away. Keep in sync with server `AXP_USER_PRESENCE_IDLE_MS`. */\nexport const AXP_USER_PRESENCE_IDLE_MS = 5 * 60_000;\n\n//#endregion\n","import type { AXPRealtimeUserPresencePayload, AXPRealtimeUserPresenceStatus } from '../realtime.types';\nimport type { AXPUserPresence, AXPUserPresenceSource } from './user-presence.types';\n\n//#region ----- Presence helpers -----\n\nconst PRESENCE_STATUSES: readonly AXPRealtimeUserPresenceStatus[] = ['online', 'offline', 'away', 'busy'];\n\nexport function isWatchablePresenceUserId(userId: string | null | undefined): boolean {\n const id = userId?.trim() ?? '';\n if (!id || id === 'system') {\n return false;\n }\n return !id.startsWith('assist-');\n}\n\nexport function parseUserPresencePayload(payload: unknown): AXPUserPresence | null {\n if (!payload || typeof payload !== 'object') {\n return null;\n }\n\n const raw = payload as AXPRealtimeUserPresencePayload;\n const userId = raw.userId?.trim();\n if (!userId) {\n return null;\n }\n\n const status = PRESENCE_STATUSES.includes(raw.status) ? raw.status : 'offline';\n const lastSeen = typeof raw.lastSeen === 'string' && raw.lastSeen.trim() ? raw.lastSeen.trim() : undefined;\n const since = typeof raw.since === 'string' && raw.since.trim() ? raw.since.trim() : undefined;\n const source: AXPUserPresenceSource | undefined =\n raw.source === 'auto' || raw.source === 'manual' ? raw.source : undefined;\n return {\n userId,\n status,\n ...(lastSeen ? { lastSeen } : {}),\n ...(since ? { since } : {}),\n ...(source ? { source } : {}),\n };\n}\n\n//#endregion\n","import { Injectable, inject } from '@angular/core';\nimport { BehaviorSubject, Observable, Subject } from 'rxjs';\nimport { AXPRealtimeConnectionService } from '../realtime-connection.service';\nimport type { AXPUserPresence } from './user-presence.types';\nimport { isWatchablePresenceUserId, parseUserPresencePayload } from './user-presence.util';\n\n//#region ----- User presence store -----\n\nconst FLUSH_DEBOUNCE_MS = 40;\n\n@Injectable({ providedIn: 'root' })\nexport class AXPUserPresenceService {\n //#region ----- Services & Dependencies -----\n\n private readonly connection = inject(AXPRealtimeConnectionService, { optional: true });\n\n //#endregion\n\n //#region ----- State -----\n\n private readonly presenceByUserId = new Map<string, AXPUserPresence>();\n private readonly watchCounts = new Map<string, number>();\n private readonly subjects = new Map<string, BehaviorSubject<AXPUserPresence>>();\n private readonly updatesSubject = new Subject<AXPUserPresence>();\n private flushTimer: ReturnType<typeof setTimeout> | null = null;\n private pendingSubscribe = new Set<string>();\n private pendingUnsubscribe = new Set<string>();\n\n readonly updates$ = this.updatesSubject.asObservable();\n\n //#endregion\n\n constructor() {\n this.connection?.connectionStatus$.subscribe((status) => {\n if (status === 'connected') {\n this.resubscribeAll();\n }\n });\n }\n\n //#region ----- Public API -----\n\n get(userId: string): AXPUserPresence | undefined {\n const id = userId?.trim();\n if (!id) {\n return undefined;\n }\n return this.presenceByUserId.get(id);\n }\n\n presence$(userId: string): Observable<AXPUserPresence> {\n const id = userId?.trim();\n const fallback: AXPUserPresence = { userId: id, status: 'offline' };\n if (!id) {\n return new BehaviorSubject(fallback).asObservable();\n }\n\n let subject = this.subjects.get(id);\n if (!subject) {\n subject = new BehaviorSubject<AXPUserPresence>(this.presenceByUserId.get(id) ?? fallback);\n this.subjects.set(id, subject);\n }\n return subject.asObservable();\n }\n\n watch(userId: string): void {\n if (!isWatchablePresenceUserId(userId)) {\n return;\n }\n const id = userId.trim();\n const next = (this.watchCounts.get(id) ?? 0) + 1;\n this.watchCounts.set(id, next);\n if (next === 1) {\n this.pendingUnsubscribe.delete(id);\n this.pendingSubscribe.add(id);\n this.scheduleFlush();\n }\n }\n\n watchMany(userIds: readonly string[]): void {\n for (const userId of userIds) {\n this.watch(userId);\n }\n }\n\n /** Watch only if this user is not already in the local watch set. */\n ensureWatch(userId: string): void {\n const id = userId?.trim();\n if (!id || (this.watchCounts.get(id) ?? 0) > 0) {\n return;\n }\n this.watch(id);\n }\n\n ensureWatchMany(userIds: readonly string[]): void {\n for (const userId of userIds) {\n this.ensureWatch(userId);\n }\n }\n\n unwatch(userId: string): void {\n const id = userId?.trim();\n if (!id) {\n return;\n }\n const current = this.watchCounts.get(id) ?? 0;\n if (current <= 1) {\n this.watchCounts.delete(id);\n this.pendingSubscribe.delete(id);\n this.pendingUnsubscribe.add(id);\n this.scheduleFlush();\n return;\n }\n this.watchCounts.set(id, current - 1);\n }\n\n applySnapshot(items: readonly AXPUserPresence[]): void {\n for (const item of items) {\n this.applyPresence(item);\n }\n }\n\n applyEnvelopePayload(payload: unknown): void {\n const parsed = parseUserPresencePayload(payload);\n if (parsed) {\n this.applyPresence(parsed);\n }\n }\n\n async setAvailability(\n status: 'online' | 'away' | 'busy',\n source: 'auto' | 'manual' = 'manual',\n ): Promise<void> {\n const item = await this.connection?.setPresence(status, source);\n if (item) {\n this.applyPresence(item);\n }\n }\n\n //#endregion\n\n //#region ----- Store updates -----\n\n private applyPresence(presence: AXPUserPresence): void {\n const previous = this.presenceByUserId.get(presence.userId);\n if (\n previous &&\n previous.status === presence.status &&\n previous.lastSeen === presence.lastSeen &&\n previous.since === presence.since\n ) {\n return;\n }\n\n this.presenceByUserId.set(presence.userId, presence);\n const subject = this.subjects.get(presence.userId);\n if (subject && !subject.closed) {\n subject.next(presence);\n }\n this.updatesSubject.next(presence);\n }\n\n private scheduleFlush(): void {\n if (this.flushTimer) {\n return;\n }\n this.flushTimer = setTimeout(() => {\n this.flushTimer = null;\n void this.flush();\n }, FLUSH_DEBOUNCE_MS);\n }\n\n private async flush(): Promise<void> {\n const subscribeIds = Array.from(this.pendingSubscribe);\n const unsubscribeIds = Array.from(this.pendingUnsubscribe);\n this.pendingSubscribe.clear();\n this.pendingUnsubscribe.clear();\n\n if (unsubscribeIds.length > 0) {\n this.connection?.unsubscribePresence(unsubscribeIds);\n }\n if (subscribeIds.length === 0) {\n return;\n }\n\n const items = (await this.connection?.subscribePresence(subscribeIds)) ?? [];\n this.applySnapshot(items);\n }\n\n private resubscribeAll(): void {\n const watched = Array.from(this.watchCounts.keys());\n if (watched.length === 0) {\n return;\n }\n this.pendingUnsubscribe.clear();\n for (const id of watched) {\n this.pendingSubscribe.add(id);\n }\n this.scheduleFlush();\n }\n\n //#endregion\n}\n\n//#endregion\n","import { DOCUMENT } from '@angular/common';\nimport { DestroyRef, Injectable, inject } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { AXPSessionService, AXPSessionStatus } from '@acorex-platform/framework-client/auth';\nimport { AXP_USER_PRESENCE_IDLE_MS } from '../presence-idle.constants';\nimport { AXPUserPresenceService } from './user-presence.service';\n\n//#region ----- Automatic away from idle -----\n\nconst IDLE_CHECK_MS = 15_000;\nconst ACTIVITY_THROTTLE_MS = 1_000;\n\n@Injectable({ providedIn: 'root' })\nexport class AXPUserPresenceIdleService {\n //#region ----- Services & Dependencies -----\n\n private readonly document = inject(DOCUMENT);\n private readonly session = inject(AXPSessionService);\n private readonly presence = inject(AXPUserPresenceService);\n private readonly destroyRef = inject(DestroyRef);\n\n //#endregion\n\n //#region ----- State -----\n\n private lastActivityAt = Date.now();\n private lastActivityEmitAt = 0;\n private idle = false;\n private checkTimer: ReturnType<typeof setInterval> | null = null;\n private started = false;\n\n //#endregion\n\n constructor() {\n this.session.status$.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((status) => {\n if (status === AXPSessionStatus.Authorized) {\n this.start();\n return;\n }\n this.stop();\n });\n }\n\n //#region ----- Lifecycle -----\n\n start(): void {\n if (this.started) {\n return;\n }\n this.started = true;\n this.lastActivityAt = Date.now();\n this.idle = false;\n const target = this.document.defaultView ?? this.document;\n target.addEventListener('mousemove', this.onActivity, { passive: true });\n target.addEventListener('keydown', this.onActivity, { passive: true });\n target.addEventListener('mousedown', this.onActivity, { passive: true });\n target.addEventListener('touchstart', this.onActivity, { passive: true });\n this.document.addEventListener('visibilitychange', this.onVisibility);\n this.checkTimer = setInterval(() => this.checkIdle(), IDLE_CHECK_MS);\n }\n\n stop(): void {\n if (!this.started) {\n return;\n }\n this.started = false;\n this.idle = false;\n const target = this.document.defaultView ?? this.document;\n target.removeEventListener('mousemove', this.onActivity);\n target.removeEventListener('keydown', this.onActivity);\n target.removeEventListener('mousedown', this.onActivity);\n target.removeEventListener('touchstart', this.onActivity);\n this.document.removeEventListener('visibilitychange', this.onVisibility);\n if (this.checkTimer) {\n clearInterval(this.checkTimer);\n this.checkTimer = null;\n }\n }\n\n //#endregion\n\n //#region ----- Activity -----\n\n private readonly onActivity = (): void => {\n const now = Date.now();\n this.lastActivityAt = now;\n if (now - this.lastActivityEmitAt < ACTIVITY_THROTTLE_MS) {\n return;\n }\n this.lastActivityEmitAt = now;\n if (this.idle) {\n this.idle = false;\n void this.presence.setAvailability('online', 'auto');\n }\n };\n\n private readonly onVisibility = (): void => {\n if (!this.document.hidden) {\n this.onActivity();\n }\n };\n\n private checkIdle(): void {\n if (!this.started || this.idle) {\n return;\n }\n if (Date.now() - this.lastActivityAt < AXP_USER_PRESENCE_IDLE_MS) {\n return;\n }\n this.idle = true;\n void this.presence.setAvailability('away', 'auto');\n }\n\n //#endregion\n}\n\n//#endregion\n","import {\n inject,\n makeEnvironmentProviders,\n type EnvironmentProviders,\n} from '@angular/core';\nimport {\n AXP_APP_STARTUP_PRIORITY,\n provideAppStartUpTask,\n} from '@acorex-platform/framework-client/core';\nimport { provideCommandSetups } from '@acorex-platform/framework-client/runtime';\nimport { PRESENCE_SET_AVAILABILITY } from '@acorex-platform/framework-shared/runtime';\nimport { AXPUserPresenceIdleService } from './presence/user-presence-idle.service';\nimport { AXPUserPresenceService } from './presence/user-presence.service';\nimport { AXPRealtimeConnectionPort } from './realtime-connection.port';\nimport { AXPRealtimeConnectionService } from './realtime-connection.service';\nimport { AXPRealtimeDispatcherService } from './realtime-dispatcher.service';\nimport type { AXPRealtimeConfig } from './realtime.types';\nimport { resolveRealtimeSocketUrl } from './realtime-url.util';\nimport { AXP_REALTIME_TOPIC_USER_PRESENCE } from './realtime.topics';\nimport { AXP_REALTIME_CONFIG } from './tokens';\n\n//#region ---- provideRealtime ----\n\nexport interface AXPProvideRealtimeOptions extends AXPRealtimeConfig {\n apiBaseUrl?: string;\n /**\n * Always-on backend. Default `builtin` (Socket.IO).\n * Call/media uses extensions/rtc when configured — not this switch.\n */\n backend?: 'builtin';\n}\n\n/**\n * Registers built-in always-on realtime (Socket.IO) + topic dispatcher.\n */\nexport function provideRealtime(config: AXPProvideRealtimeOptions = {}): EnvironmentProviders {\n const backend = config.backend ?? 'builtin';\n if (backend !== 'builtin') {\n throw new Error(`Unsupported realtime backend '${String(backend)}'. Use 'builtin'.`);\n }\n\n const url =\n config.url?.trim() ||\n (config.apiBaseUrl?.trim() ? resolveRealtimeSocketUrl(config.apiBaseUrl) : undefined);\n\n return makeEnvironmentProviders([\n {\n provide: AXP_REALTIME_CONFIG,\n useValue: {\n autoConnect: config.autoConnect !== false,\n url,\n } satisfies AXPRealtimeConfig,\n },\n AXPRealtimeDispatcherService,\n AXPRealtimeConnectionService,\n {\n provide: AXPRealtimeConnectionPort,\n useExisting: AXPRealtimeConnectionService,\n },\n provideCommandSetups([\n {\n key: PRESENCE_SET_AVAILABILITY,\n command: () =>\n import('./presence/set-presence-availability.command').then((c) => c.AXPSetPresenceAvailabilityCommand),\n },\n ]),\n provideAppStartUpTask(() => {\n inject(AXPUserPresenceIdleService);\n return {\n name: 'user-presence-idle',\n priority: AXP_APP_STARTUP_PRIORITY.realtimeSubscriptions,\n run: async () => undefined,\n };\n }),\n provideAppStartUpTask(() => {\n const dispatcher = inject(AXPRealtimeDispatcherService);\n const presence = inject(AXPUserPresenceService);\n return {\n name: 'user-presence-handler',\n priority: AXP_APP_STARTUP_PRIORITY.realtimeHandlers,\n run: async () => {\n dispatcher.register({\n topic: AXP_REALTIME_TOPIC_USER_PRESENCE,\n handle: (envelope) => {\n presence.applyEnvelopePayload(envelope.payload);\n },\n });\n },\n };\n }),\n provideAppStartUpTask(() => {\n const connection = inject(AXPRealtimeConnectionPort);\n return {\n name: 'realtime-connect',\n priority: AXP_APP_STARTUP_PRIORITY.realtimeConnect,\n run: async () => {\n // Connection lifecycle is owned by the connection service (session.status$).\n // Eagerly invoke connect once so an already-authenticated session connects on bootstrap.\n connection.connect();\n },\n };\n }),\n ]);\n}\n\n//#endregion\n","import type { AXPRealtimeUserPresenceStatus, AXPRealtimeUserPresenceSource } from '../realtime.types';\n\n//#region ----- Types -----\n\nexport type AXPUserPresenceStatus = AXPRealtimeUserPresenceStatus;\nexport type AXPUserPresenceSource = AXPRealtimeUserPresenceSource;\n\nexport interface AXPUserPresence {\n userId: string;\n status: AXPUserPresenceStatus;\n lastSeen?: string;\n since?: string;\n source?: AXPUserPresenceSource;\n}\n\nexport interface AXPUserPresenceSetInput {\n status: 'online' | 'away' | 'busy';\n source?: AXPUserPresenceSource;\n}\n\n//#endregion\n","//#region ----- Presence duration tooltip -----\n\nexport type AXPPresenceDurationBucket = {\n key:\n | 'duration.less-than-a-minute'\n | 'duration.one-minute'\n | 'duration.minutes'\n | 'duration.one-hour'\n | 'duration.hours'\n | 'duration.one-day'\n | 'duration.days';\n params?: { count: number };\n};\n\nexport function presenceDurationBucket(ms: number): AXPPresenceDurationBucket {\n const elapsed = Math.max(0, ms);\n if (elapsed < 60_000) {\n return { key: 'duration.less-than-a-minute' };\n }\n\n const minutes = Math.floor(elapsed / 60_000);\n if (minutes < 60) {\n return minutes === 1 ? { key: 'duration.one-minute' } : { key: 'duration.minutes', params: { count: minutes } };\n }\n\n const hours = Math.floor(minutes / 60);\n if (hours < 24) {\n return hours === 1 ? { key: 'duration.one-hour' } : { key: 'duration.hours', params: { count: hours } };\n }\n\n const days = Math.floor(hours / 24);\n return days === 1 ? { key: 'duration.one-day' } : { key: 'duration.days', params: { count: days } };\n}\n\n//#endregion\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { inject, Injectable, NgZone, InjectionToken, EnvironmentInjector, runInInjectionContext, makeEnvironmentProviders, input, ElementRef, effect, Directive, isDevMode, NgModule } from '@angular/core';
3
- import { AXPHookService, AXPBroadcastEventService, AXPDistributedEventListenerService, AXPExpressionEvaluatorService, AXPContextEvalFactory, toExpressionRecord, resolveCommandExpressionData, createCommandExpressionScope, AXP_DISTRIBUTED_EVENT_LISTENER_PROVIDER } from '@acorex-platform/framework-client/core';
3
+ import { AXPHookService, AXPBroadcastEventService, AXPDistributedEventListenerService, AXPExpressionEvaluatorService, AXPContextEvalFactory, toExpressionRecord, resolveCommandExpressionData, createCommandExpressionScope, AXP_HOOK_PROVIDER, AXP_DISTRIBUTED_EVENT_LISTENER_PROVIDER } from '@acorex-platform/framework-client/core';
4
4
  import { Subject, Observable } from 'rxjs';
5
5
  import { filter } from 'rxjs/operators';
6
6
  import { createRandomUuid } from '@acorex-platform/framework-shared/core';
@@ -1369,7 +1369,7 @@ function provideExternalRuntimeBulkTransport(transport, options = {}) {
1369
1369
  };
1370
1370
  return [
1371
1371
  {
1372
- provide: AXP_DISTRIBUTED_EVENT_LISTENER_PROVIDER,
1372
+ provide: AXP_HOOK_PROVIDER,
1373
1373
  useValue: provider,
1374
1374
  multi: true,
1375
1375
  },