@memberjunction/ng-conversations 5.40.2 → 5.41.0

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 (378) hide show
  1. package/README.md +57 -0
  2. package/dist/__tests__/channel-optional-surface.test.d.ts +2 -0
  3. package/dist/__tests__/channel-optional-surface.test.d.ts.map +1 -0
  4. package/dist/__tests__/channel-optional-surface.test.js +53 -0
  5. package/dist/__tests__/channel-optional-surface.test.js.map +1 -0
  6. package/dist/__tests__/chat-events.test.d.ts +14 -0
  7. package/dist/__tests__/chat-events.test.d.ts.map +1 -0
  8. package/dist/__tests__/chat-events.test.js +109 -0
  9. package/dist/__tests__/chat-events.test.js.map +1 -0
  10. package/dist/__tests__/conversation-naming.test.d.ts +2 -0
  11. package/dist/__tests__/conversation-naming.test.d.ts.map +1 -0
  12. package/dist/__tests__/conversation-naming.test.js +110 -0
  13. package/dist/__tests__/conversation-naming.test.js.map +1 -0
  14. package/dist/__tests__/delegation-result-parser.test.d.ts +2 -0
  15. package/dist/__tests__/delegation-result-parser.test.d.ts.map +1 -0
  16. package/dist/__tests__/delegation-result-parser.test.js +107 -0
  17. package/dist/__tests__/delegation-result-parser.test.js.map +1 -0
  18. package/dist/__tests__/event-wiring.test.d.ts +15 -0
  19. package/dist/__tests__/event-wiring.test.d.ts.map +1 -0
  20. package/dist/__tests__/event-wiring.test.js +100 -0
  21. package/dist/__tests__/event-wiring.test.js.map +1 -0
  22. package/dist/__tests__/narration-template.test.d.ts +2 -0
  23. package/dist/__tests__/narration-template.test.d.ts.map +1 -0
  24. package/dist/__tests__/narration-template.test.js +76 -0
  25. package/dist/__tests__/narration-template.test.js.map +1 -0
  26. package/dist/__tests__/realtime-agent-picker-models.test.d.ts +2 -0
  27. package/dist/__tests__/realtime-agent-picker-models.test.d.ts.map +1 -0
  28. package/dist/__tests__/realtime-agent-picker-models.test.js +49 -0
  29. package/dist/__tests__/realtime-agent-picker-models.test.js.map +1 -0
  30. package/dist/__tests__/realtime-audio-visuals.test.d.ts +2 -0
  31. package/dist/__tests__/realtime-audio-visuals.test.d.ts.map +1 -0
  32. package/dist/__tests__/realtime-audio-visuals.test.js +123 -0
  33. package/dist/__tests__/realtime-audio-visuals.test.js.map +1 -0
  34. package/dist/__tests__/realtime-delegation-card-cancel.test.d.ts +2 -0
  35. package/dist/__tests__/realtime-delegation-card-cancel.test.d.ts.map +1 -0
  36. package/dist/__tests__/realtime-delegation-card-cancel.test.js +48 -0
  37. package/dist/__tests__/realtime-delegation-card-cancel.test.js.map +1 -0
  38. package/dist/__tests__/realtime-disclosure.test.d.ts +2 -0
  39. package/dist/__tests__/realtime-disclosure.test.d.ts.map +1 -0
  40. package/dist/__tests__/realtime-disclosure.test.js +164 -0
  41. package/dist/__tests__/realtime-disclosure.test.js.map +1 -0
  42. package/dist/__tests__/realtime-pairing.test.d.ts +2 -0
  43. package/dist/__tests__/realtime-pairing.test.d.ts.map +1 -0
  44. package/dist/__tests__/realtime-pairing.test.js +207 -0
  45. package/dist/__tests__/realtime-pairing.test.js.map +1 -0
  46. package/dist/__tests__/realtime-review-lifecycle.test.d.ts +2 -0
  47. package/dist/__tests__/realtime-review-lifecycle.test.d.ts.map +1 -0
  48. package/dist/__tests__/realtime-review-lifecycle.test.js +154 -0
  49. package/dist/__tests__/realtime-review-lifecycle.test.js.map +1 -0
  50. package/dist/__tests__/realtime-session-cancel-usage.test.d.ts +2 -0
  51. package/dist/__tests__/realtime-session-cancel-usage.test.d.ts.map +1 -0
  52. package/dist/__tests__/realtime-session-cancel-usage.test.js +230 -0
  53. package/dist/__tests__/realtime-session-cancel-usage.test.js.map +1 -0
  54. package/dist/__tests__/realtime-session-channels.test.d.ts +2 -0
  55. package/dist/__tests__/realtime-session-channels.test.d.ts.map +1 -0
  56. package/dist/__tests__/realtime-session-channels.test.js +252 -0
  57. package/dist/__tests__/realtime-session-channels.test.js.map +1 -0
  58. package/dist/__tests__/realtime-session-client-tools.test.d.ts +2 -0
  59. package/dist/__tests__/realtime-session-client-tools.test.d.ts.map +1 -0
  60. package/dist/__tests__/realtime-session-client-tools.test.js +103 -0
  61. package/dist/__tests__/realtime-session-client-tools.test.js.map +1 -0
  62. package/dist/__tests__/realtime-session-minimized.test.d.ts +2 -0
  63. package/dist/__tests__/realtime-session-minimized.test.d.ts.map +1 -0
  64. package/dist/__tests__/realtime-session-minimized.test.js +32 -0
  65. package/dist/__tests__/realtime-session-minimized.test.js.map +1 -0
  66. package/dist/__tests__/realtime-session-mint.test.d.ts +2 -0
  67. package/dist/__tests__/realtime-session-mint.test.d.ts.map +1 -0
  68. package/dist/__tests__/realtime-session-mint.test.js +69 -0
  69. package/dist/__tests__/realtime-session-mint.test.js.map +1 -0
  70. package/dist/__tests__/realtime-session-policy.test.d.ts +2 -0
  71. package/dist/__tests__/realtime-session-policy.test.d.ts.map +1 -0
  72. package/dist/__tests__/realtime-session-policy.test.js +303 -0
  73. package/dist/__tests__/realtime-session-policy.test.js.map +1 -0
  74. package/dist/__tests__/realtime-session-review.service.test.d.ts +2 -0
  75. package/dist/__tests__/realtime-session-review.service.test.d.ts.map +1 -0
  76. package/dist/__tests__/realtime-session-review.service.test.js +743 -0
  77. package/dist/__tests__/realtime-session-review.service.test.js.map +1 -0
  78. package/dist/__tests__/realtime-session-state.test.d.ts +2 -0
  79. package/dist/__tests__/realtime-session-state.test.d.ts.map +1 -0
  80. package/dist/__tests__/realtime-session-state.test.js +83 -0
  81. package/dist/__tests__/realtime-session-state.test.js.map +1 -0
  82. package/dist/__tests__/realtime-session-timeline-card.test.d.ts +2 -0
  83. package/dist/__tests__/realtime-session-timeline-card.test.d.ts.map +1 -0
  84. package/dist/__tests__/realtime-session-timeline-card.test.js +106 -0
  85. package/dist/__tests__/realtime-session-timeline-card.test.js.map +1 -0
  86. package/dist/__tests__/realtime-session-timeline.test.d.ts +2 -0
  87. package/dist/__tests__/realtime-session-timeline.test.d.ts.map +1 -0
  88. package/dist/__tests__/realtime-session-timeline.test.js +142 -0
  89. package/dist/__tests__/realtime-session-timeline.test.js.map +1 -0
  90. package/dist/__tests__/realtime-sessions-adapter.test.d.ts +19 -0
  91. package/dist/__tests__/realtime-sessions-adapter.test.d.ts.map +1 -0
  92. package/dist/__tests__/realtime-sessions-adapter.test.js +188 -0
  93. package/dist/__tests__/realtime-sessions-adapter.test.js.map +1 -0
  94. package/dist/__tests__/realtime-surface-panel-prefs.test.d.ts +2 -0
  95. package/dist/__tests__/realtime-surface-panel-prefs.test.d.ts.map +1 -0
  96. package/dist/__tests__/realtime-surface-panel-prefs.test.js +100 -0
  97. package/dist/__tests__/realtime-surface-panel-prefs.test.js.map +1 -0
  98. package/dist/__tests__/realtime-surface-tabs-model.test.d.ts +2 -0
  99. package/dist/__tests__/realtime-surface-tabs-model.test.d.ts.map +1 -0
  100. package/dist/__tests__/realtime-surface-tabs-model.test.js +193 -0
  101. package/dist/__tests__/realtime-surface-tabs-model.test.js.map +1 -0
  102. package/dist/__tests__/remote-browser-audio-player.test.d.ts +2 -0
  103. package/dist/__tests__/remote-browser-audio-player.test.d.ts.map +1 -0
  104. package/dist/__tests__/remote-browser-audio-player.test.js +137 -0
  105. package/dist/__tests__/remote-browser-audio-player.test.js.map +1 -0
  106. package/dist/__tests__/remote-browser-channel.test.d.ts +2 -0
  107. package/dist/__tests__/remote-browser-channel.test.d.ts.map +1 -0
  108. package/dist/__tests__/remote-browser-channel.test.js +423 -0
  109. package/dist/__tests__/remote-browser-channel.test.js.map +1 -0
  110. package/dist/__tests__/slot-defaults.test.d.ts +24 -0
  111. package/dist/__tests__/slot-defaults.test.d.ts.map +1 -0
  112. package/dist/__tests__/slot-defaults.test.js +63 -0
  113. package/dist/__tests__/slot-defaults.test.js.map +1 -0
  114. package/dist/__tests__/user-authorization.test.d.ts +2 -0
  115. package/dist/__tests__/user-authorization.test.d.ts.map +1 -0
  116. package/dist/__tests__/user-authorization.test.js +97 -0
  117. package/dist/__tests__/user-authorization.test.js.map +1 -0
  118. package/dist/__tests__/voice-session-narration.test.d.ts +2 -0
  119. package/dist/__tests__/voice-session-narration.test.d.ts.map +1 -0
  120. package/dist/__tests__/voice-session-narration.test.js +609 -0
  121. package/dist/__tests__/voice-session-narration.test.js.map +1 -0
  122. package/dist/__tests__/whiteboard-artifact-viewer.test.d.ts +2 -0
  123. package/dist/__tests__/whiteboard-artifact-viewer.test.d.ts.map +1 -0
  124. package/dist/__tests__/whiteboard-artifact-viewer.test.js +101 -0
  125. package/dist/__tests__/whiteboard-artifact-viewer.test.js.map +1 -0
  126. package/dist/__tests__/whiteboard-channel.test.d.ts +2 -0
  127. package/dist/__tests__/whiteboard-channel.test.d.ts.map +1 -0
  128. package/dist/__tests__/whiteboard-channel.test.js +260 -0
  129. package/dist/__tests__/whiteboard-channel.test.js.map +1 -0
  130. package/dist/__tests__/whiteboard-restore-state.test.d.ts +2 -0
  131. package/dist/__tests__/whiteboard-restore-state.test.d.ts.map +1 -0
  132. package/dist/__tests__/whiteboard-restore-state.test.js +108 -0
  133. package/dist/__tests__/whiteboard-restore-state.test.js.map +1 -0
  134. package/dist/lib/components/conversation/conversation-chat-area.component.d.ts +205 -3
  135. package/dist/lib/components/conversation/conversation-chat-area.component.d.ts.map +1 -1
  136. package/dist/lib/components/conversation/conversation-chat-area.component.js +911 -342
  137. package/dist/lib/components/conversation/conversation-chat-area.component.js.map +1 -1
  138. package/dist/lib/components/mention/mention-dropdown.component.js +35 -17
  139. package/dist/lib/components/mention/mention-dropdown.component.js.map +1 -1
  140. package/dist/lib/components/mention/mention-editor.component.d.ts +4 -0
  141. package/dist/lib/components/mention/mention-editor.component.d.ts.map +1 -1
  142. package/dist/lib/components/mention/mention-editor.component.js +43 -19
  143. package/dist/lib/components/mention/mention-editor.component.js.map +1 -1
  144. package/dist/lib/components/message/message-input-box.component.d.ts +17 -1
  145. package/dist/lib/components/message/message-input-box.component.d.ts.map +1 -1
  146. package/dist/lib/components/message/message-input-box.component.js +73 -15
  147. package/dist/lib/components/message/message-input-box.component.js.map +1 -1
  148. package/dist/lib/components/message/message-input.component.d.ts +142 -6
  149. package/dist/lib/components/message/message-input.component.d.ts.map +1 -1
  150. package/dist/lib/components/message/message-input.component.js +328 -82
  151. package/dist/lib/components/message/message-input.component.js.map +1 -1
  152. package/dist/lib/components/message/message-item.component.d.ts +28 -3
  153. package/dist/lib/components/message/message-item.component.d.ts.map +1 -1
  154. package/dist/lib/components/message/message-item.component.js +180 -108
  155. package/dist/lib/components/message/message-item.component.js.map +1 -1
  156. package/dist/lib/components/message/message-list.component.d.ts +81 -2
  157. package/dist/lib/components/message/message-list.component.d.ts.map +1 -1
  158. package/dist/lib/components/message/message-list.component.js +252 -87
  159. package/dist/lib/components/message/message-list.component.js.map +1 -1
  160. package/dist/lib/components/realtime/channels/base-realtime-channel-client.d.ts +282 -0
  161. package/dist/lib/components/realtime/channels/base-realtime-channel-client.d.ts.map +1 -0
  162. package/dist/lib/components/realtime/channels/base-realtime-channel-client.js +158 -0
  163. package/dist/lib/components/realtime/channels/base-realtime-channel-client.js.map +1 -0
  164. package/dist/lib/components/realtime/channels/channel-onboarding-panel.component.d.ts +25 -0
  165. package/dist/lib/components/realtime/channels/channel-onboarding-panel.component.d.ts.map +1 -0
  166. package/dist/lib/components/realtime/channels/channel-onboarding-panel.component.js +140 -0
  167. package/dist/lib/components/realtime/channels/channel-onboarding-panel.component.js.map +1 -0
  168. package/dist/lib/components/realtime/channels/realtime-channel-pane.component.d.ts +35 -0
  169. package/dist/lib/components/realtime/channels/realtime-channel-pane.component.d.ts.map +1 -0
  170. package/dist/lib/components/realtime/channels/realtime-channel-pane.component.js +58 -0
  171. package/dist/lib/components/realtime/channels/realtime-channel-pane.component.js.map +1 -0
  172. package/dist/lib/components/realtime/realtime-activity-rail.component.d.ts +63 -0
  173. package/dist/lib/components/realtime/realtime-activity-rail.component.d.ts.map +1 -0
  174. package/dist/lib/components/realtime/realtime-activity-rail.component.js +260 -0
  175. package/dist/lib/components/realtime/realtime-activity-rail.component.js.map +1 -0
  176. package/dist/lib/components/realtime/realtime-agent-banner.component.d.ts +117 -0
  177. package/dist/lib/components/realtime/realtime-agent-banner.component.d.ts.map +1 -0
  178. package/dist/lib/components/realtime/realtime-agent-banner.component.js +504 -0
  179. package/dist/lib/components/realtime/realtime-agent-banner.component.js.map +1 -0
  180. package/dist/lib/components/realtime/realtime-agent-picker.component.d.ts +168 -0
  181. package/dist/lib/components/realtime/realtime-agent-picker.component.d.ts.map +1 -0
  182. package/dist/lib/components/realtime/realtime-agent-picker.component.js +556 -0
  183. package/dist/lib/components/realtime/realtime-agent-picker.component.js.map +1 -0
  184. package/dist/lib/components/realtime/realtime-audio-visuals.d.ts +97 -0
  185. package/dist/lib/components/realtime/realtime-audio-visuals.d.ts.map +1 -0
  186. package/dist/lib/components/realtime/realtime-audio-visuals.js +139 -0
  187. package/dist/lib/components/realtime/realtime-audio-visuals.js.map +1 -0
  188. package/dist/lib/components/realtime/realtime-channel-strip.component.d.ts +29 -0
  189. package/dist/lib/components/realtime/realtime-channel-strip.component.d.ts.map +1 -0
  190. package/dist/lib/components/realtime/realtime-channel-strip.component.js +69 -0
  191. package/dist/lib/components/realtime/realtime-channel-strip.component.js.map +1 -0
  192. package/dist/lib/components/realtime/realtime-composer.component.d.ts +65 -0
  193. package/dist/lib/components/realtime/realtime-composer.component.d.ts.map +1 -0
  194. package/dist/lib/components/realtime/realtime-composer.component.js +256 -0
  195. package/dist/lib/components/realtime/realtime-composer.component.js.map +1 -0
  196. package/dist/lib/components/realtime/realtime-delegation-card.component.d.ts +71 -0
  197. package/dist/lib/components/realtime/realtime-delegation-card.component.d.ts.map +1 -0
  198. package/dist/lib/components/realtime/realtime-delegation-card.component.js +324 -0
  199. package/dist/lib/components/realtime/realtime-delegation-card.component.js.map +1 -0
  200. package/dist/lib/components/realtime/realtime-disclosure.d.ts +135 -0
  201. package/dist/lib/components/realtime/realtime-disclosure.d.ts.map +1 -0
  202. package/dist/lib/components/realtime/realtime-disclosure.js +188 -0
  203. package/dist/lib/components/realtime/realtime-disclosure.js.map +1 -0
  204. package/dist/lib/components/realtime/realtime-session-overlay.component.d.ts +491 -0
  205. package/dist/lib/components/realtime/realtime-session-overlay.component.d.ts.map +1 -0
  206. package/dist/lib/components/realtime/realtime-session-overlay.component.js +1274 -0
  207. package/dist/lib/components/realtime/realtime-session-overlay.component.js.map +1 -0
  208. package/dist/lib/components/realtime/realtime-session-state.d.ts +191 -0
  209. package/dist/lib/components/realtime/realtime-session-state.d.ts.map +1 -0
  210. package/dist/lib/components/realtime/realtime-session-state.js +244 -0
  211. package/dist/lib/components/realtime/realtime-session-state.js.map +1 -0
  212. package/dist/lib/components/realtime/realtime-session-thread.component.d.ts +56 -0
  213. package/dist/lib/components/realtime/realtime-session-thread.component.d.ts.map +1 -0
  214. package/dist/lib/components/realtime/realtime-session-thread.component.js +246 -0
  215. package/dist/lib/components/realtime/realtime-session-thread.component.js.map +1 -0
  216. package/dist/lib/components/realtime/realtime-session-timeline-card.component.d.ts +51 -0
  217. package/dist/lib/components/realtime/realtime-session-timeline-card.component.d.ts.map +1 -0
  218. package/dist/lib/components/realtime/realtime-session-timeline-card.component.js +193 -0
  219. package/dist/lib/components/realtime/realtime-session-timeline-card.component.js.map +1 -0
  220. package/dist/lib/components/realtime/realtime-surface-panel-prefs.d.ts +77 -0
  221. package/dist/lib/components/realtime/realtime-surface-panel-prefs.d.ts.map +1 -0
  222. package/dist/lib/components/realtime/realtime-surface-panel-prefs.js +114 -0
  223. package/dist/lib/components/realtime/realtime-surface-panel-prefs.js.map +1 -0
  224. package/dist/lib/components/realtime/realtime-surface-tabs.component.d.ts +173 -0
  225. package/dist/lib/components/realtime/realtime-surface-tabs.component.d.ts.map +1 -0
  226. package/dist/lib/components/realtime/realtime-surface-tabs.component.js +496 -0
  227. package/dist/lib/components/realtime/realtime-surface-tabs.component.js.map +1 -0
  228. package/dist/lib/components/realtime/realtime-surface-tabs.model.d.ts +181 -0
  229. package/dist/lib/components/realtime/realtime-surface-tabs.model.d.ts.map +1 -0
  230. package/dist/lib/components/realtime/realtime-surface-tabs.model.js +223 -0
  231. package/dist/lib/components/realtime/realtime-surface-tabs.model.js.map +1 -0
  232. package/dist/lib/components/realtime/remote-browser/remote-browser-audio-player.d.ts +163 -0
  233. package/dist/lib/components/realtime/remote-browser/remote-browser-audio-player.d.ts.map +1 -0
  234. package/dist/lib/components/realtime/remote-browser/remote-browser-audio-player.js +309 -0
  235. package/dist/lib/components/realtime/remote-browser/remote-browser-audio-player.js.map +1 -0
  236. package/dist/lib/components/realtime/remote-browser/remote-browser-channel.d.ts +168 -0
  237. package/dist/lib/components/realtime/remote-browser/remote-browser-channel.d.ts.map +1 -0
  238. package/dist/lib/components/realtime/remote-browser/remote-browser-channel.js +524 -0
  239. package/dist/lib/components/realtime/remote-browser/remote-browser-channel.js.map +1 -0
  240. package/dist/lib/components/realtime/remote-browser/remote-browser-surface.component.d.ts +346 -0
  241. package/dist/lib/components/realtime/remote-browser/remote-browser-surface.component.d.ts.map +1 -0
  242. package/dist/lib/components/realtime/remote-browser/remote-browser-surface.component.js +851 -0
  243. package/dist/lib/components/realtime/remote-browser/remote-browser-surface.component.js.map +1 -0
  244. package/dist/lib/components/realtime/remote-browser/remote-browser-tools.d.ts +86 -0
  245. package/dist/lib/components/realtime/remote-browser/remote-browser-tools.d.ts.map +1 -0
  246. package/dist/lib/components/realtime/remote-browser/remote-browser-tools.js +210 -0
  247. package/dist/lib/components/realtime/remote-browser/remote-browser-tools.js.map +1 -0
  248. package/dist/lib/components/realtime/whiteboard/whiteboard-artifact-viewer.component.d.ts +48 -0
  249. package/dist/lib/components/realtime/whiteboard/whiteboard-artifact-viewer.component.d.ts.map +1 -0
  250. package/dist/lib/components/realtime/whiteboard/whiteboard-artifact-viewer.component.js +180 -0
  251. package/dist/lib/components/realtime/whiteboard/whiteboard-artifact-viewer.component.js.map +1 -0
  252. package/dist/lib/components/realtime/whiteboard/whiteboard-channel.d.ts +119 -0
  253. package/dist/lib/components/realtime/whiteboard/whiteboard-channel.d.ts.map +1 -0
  254. package/dist/lib/components/realtime/whiteboard/whiteboard-channel.js +274 -0
  255. package/dist/lib/components/realtime/whiteboard/whiteboard-channel.js.map +1 -0
  256. package/dist/lib/components/slots/mj-chat-agent-presence-default.component.d.ts +11 -0
  257. package/dist/lib/components/slots/mj-chat-agent-presence-default.component.d.ts.map +1 -0
  258. package/dist/lib/components/slots/mj-chat-agent-presence-default.component.js +98 -0
  259. package/dist/lib/components/slots/mj-chat-agent-presence-default.component.js.map +1 -0
  260. package/dist/lib/components/slots/mj-chat-demonstration-surface-default.component.d.ts +9 -0
  261. package/dist/lib/components/slots/mj-chat-demonstration-surface-default.component.d.ts.map +1 -0
  262. package/dist/lib/components/slots/mj-chat-demonstration-surface-default.component.js +35 -0
  263. package/dist/lib/components/slots/mj-chat-demonstration-surface-default.component.js.map +1 -0
  264. package/dist/lib/components/slots/mj-chat-empty-state-default.component.d.ts +28 -0
  265. package/dist/lib/components/slots/mj-chat-empty-state-default.component.d.ts.map +1 -0
  266. package/dist/lib/components/slots/mj-chat-empty-state-default.component.js +104 -0
  267. package/dist/lib/components/slots/mj-chat-empty-state-default.component.js.map +1 -0
  268. package/dist/lib/components/slots/mj-chat-header-default.component.d.ts +11 -0
  269. package/dist/lib/components/slots/mj-chat-header-default.component.d.ts.map +1 -0
  270. package/dist/lib/components/slots/mj-chat-header-default.component.js +103 -0
  271. package/dist/lib/components/slots/mj-chat-header-default.component.js.map +1 -0
  272. package/dist/lib/components/slots/mj-chat-message-bubble-default.component.d.ts +15 -0
  273. package/dist/lib/components/slots/mj-chat-message-bubble-default.component.d.ts.map +1 -0
  274. package/dist/lib/components/slots/mj-chat-message-bubble-default.component.js +73 -0
  275. package/dist/lib/components/slots/mj-chat-message-bubble-default.component.js.map +1 -0
  276. package/dist/lib/components/slots/mj-chat-message-extra-default.component.d.ts +9 -0
  277. package/dist/lib/components/slots/mj-chat-message-extra-default.component.d.ts.map +1 -0
  278. package/dist/lib/components/slots/mj-chat-message-extra-default.component.js +34 -0
  279. package/dist/lib/components/slots/mj-chat-message-extra-default.component.js.map +1 -0
  280. package/dist/lib/components/slots/slot-interfaces.d.ts +95 -0
  281. package/dist/lib/components/slots/slot-interfaces.d.ts.map +1 -0
  282. package/dist/lib/components/slots/slot-interfaces.js +18 -0
  283. package/dist/lib/components/slots/slot-interfaces.js.map +1 -0
  284. package/dist/lib/components/workspace/conversation-workspace.component.d.ts +11 -0
  285. package/dist/lib/components/workspace/conversation-workspace.component.d.ts.map +1 -1
  286. package/dist/lib/components/workspace/conversation-workspace.component.js +28 -4
  287. package/dist/lib/components/workspace/conversation-workspace.component.js.map +1 -1
  288. package/dist/lib/conversations.module.d.ts +12 -1
  289. package/dist/lib/conversations.module.d.ts.map +1 -1
  290. package/dist/lib/conversations.module.js +93 -5
  291. package/dist/lib/conversations.module.js.map +1 -1
  292. package/dist/lib/directives/chat-slot.directive.d.ts +44 -0
  293. package/dist/lib/directives/chat-slot.directive.d.ts.map +1 -0
  294. package/dist/lib/directives/chat-slot.directive.js +54 -0
  295. package/dist/lib/directives/chat-slot.directive.js.map +1 -0
  296. package/dist/lib/events/chat-events.d.ts +137 -0
  297. package/dist/lib/events/chat-events.d.ts.map +1 -0
  298. package/dist/lib/events/chat-events.js +189 -0
  299. package/dist/lib/events/chat-events.js.map +1 -0
  300. package/dist/lib/models/conversation-state.model.d.ts +2 -1
  301. package/dist/lib/models/conversation-state.model.d.ts.map +1 -1
  302. package/dist/lib/models/conversation-state.model.js.map +1 -1
  303. package/dist/lib/services/artifact-state.service.d.ts.map +1 -1
  304. package/dist/lib/services/artifact-state.service.js +23 -6
  305. package/dist/lib/services/artifact-state.service.js.map +1 -1
  306. package/dist/lib/services/conversation-agent.service.d.ts +60 -74
  307. package/dist/lib/services/conversation-agent.service.d.ts.map +1 -1
  308. package/dist/lib/services/conversation-agent.service.js +100 -313
  309. package/dist/lib/services/conversation-agent.service.js.map +1 -1
  310. package/dist/lib/services/conversation-bridge.service.d.ts +11 -70
  311. package/dist/lib/services/conversation-bridge.service.d.ts.map +1 -1
  312. package/dist/lib/services/conversation-bridge.service.js +51 -85
  313. package/dist/lib/services/conversation-bridge.service.js.map +1 -1
  314. package/dist/lib/services/conversation-naming.d.ts +63 -0
  315. package/dist/lib/services/conversation-naming.d.ts.map +1 -0
  316. package/dist/lib/services/conversation-naming.js +58 -0
  317. package/dist/lib/services/conversation-naming.js.map +1 -0
  318. package/dist/lib/services/conversation-streaming.service.d.ts +24 -154
  319. package/dist/lib/services/conversation-streaming.service.d.ts.map +1 -1
  320. package/dist/lib/services/conversation-streaming.service.js +39 -361
  321. package/dist/lib/services/conversation-streaming.service.js.map +1 -1
  322. package/dist/lib/services/conversations-runtime-bootstrap.service.d.ts +10 -0
  323. package/dist/lib/services/conversations-runtime-bootstrap.service.d.ts.map +1 -0
  324. package/dist/lib/services/conversations-runtime-bootstrap.service.js +104 -0
  325. package/dist/lib/services/conversations-runtime-bootstrap.service.js.map +1 -0
  326. package/dist/lib/services/delegation-result-parser.d.ts +45 -0
  327. package/dist/lib/services/delegation-result-parser.d.ts.map +1 -0
  328. package/dist/lib/services/delegation-result-parser.js +48 -0
  329. package/dist/lib/services/delegation-result-parser.js.map +1 -0
  330. package/dist/lib/services/mention-autocomplete.service.d.ts +19 -4
  331. package/dist/lib/services/mention-autocomplete.service.d.ts.map +1 -1
  332. package/dist/lib/services/mention-autocomplete.service.js +65 -4
  333. package/dist/lib/services/mention-autocomplete.service.js.map +1 -1
  334. package/dist/lib/services/mention-parser.service.d.ts +8 -53
  335. package/dist/lib/services/mention-parser.service.d.ts.map +1 -1
  336. package/dist/lib/services/mention-parser.service.js +32 -243
  337. package/dist/lib/services/mention-parser.service.js.map +1 -1
  338. package/dist/lib/services/narration-template.d.ts +42 -0
  339. package/dist/lib/services/narration-template.d.ts.map +1 -0
  340. package/dist/lib/services/narration-template.js +73 -0
  341. package/dist/lib/services/narration-template.js.map +1 -0
  342. package/dist/lib/services/realtime-pairing.d.ts +120 -0
  343. package/dist/lib/services/realtime-pairing.d.ts.map +1 -0
  344. package/dist/lib/services/realtime-pairing.js +150 -0
  345. package/dist/lib/services/realtime-pairing.js.map +1 -0
  346. package/dist/lib/services/realtime-session-review.service.d.ts +233 -0
  347. package/dist/lib/services/realtime-session-review.service.d.ts.map +1 -0
  348. package/dist/lib/services/realtime-session-review.service.js +417 -0
  349. package/dist/lib/services/realtime-session-review.service.js.map +1 -0
  350. package/dist/lib/services/realtime-session.service.d.ts +739 -0
  351. package/dist/lib/services/realtime-session.service.d.ts.map +1 -0
  352. package/dist/lib/services/realtime-session.service.js +1647 -0
  353. package/dist/lib/services/realtime-session.service.js.map +1 -0
  354. package/dist/lib/services/realtime-sessions-adapter.d.ts +54 -0
  355. package/dist/lib/services/realtime-sessions-adapter.d.ts.map +1 -0
  356. package/dist/lib/services/realtime-sessions-adapter.js +154 -0
  357. package/dist/lib/services/realtime-sessions-adapter.js.map +1 -0
  358. package/dist/lib/services/user-authorization.d.ts +67 -0
  359. package/dist/lib/services/user-authorization.d.ts.map +1 -0
  360. package/dist/lib/services/user-authorization.js +66 -0
  361. package/dist/lib/services/user-authorization.js.map +1 -0
  362. package/dist/lib/utils/realtime-session-timeline.d.ts +84 -0
  363. package/dist/lib/utils/realtime-session-timeline.d.ts.map +1 -0
  364. package/dist/lib/utils/realtime-session-timeline.js +94 -0
  365. package/dist/lib/utils/realtime-session-timeline.js.map +1 -0
  366. package/dist/public-api.d.ts +41 -0
  367. package/dist/public-api.d.ts.map +1 -1
  368. package/dist/public-api.js +50 -0
  369. package/dist/public-api.js.map +1 -1
  370. package/package.json +27 -24
  371. package/dist/__tests__/conversation-bridge.service.test.d.ts +0 -2
  372. package/dist/__tests__/conversation-bridge.service.test.d.ts.map +0 -1
  373. package/dist/__tests__/conversation-bridge.service.test.js +0 -98
  374. package/dist/__tests__/conversation-bridge.service.test.js.map +0 -1
  375. package/dist/__tests__/mention-parser.test.d.ts +0 -2
  376. package/dist/__tests__/mention-parser.test.d.ts.map +0 -1
  377. package/dist/__tests__/mention-parser.test.js +0 -154
  378. package/dist/__tests__/mention-parser.test.js.map +0 -1
@@ -1,9 +1,11 @@
1
- import { EventEmitter, ViewContainerRef, OnInit, OnDestroy, OnChanges, SimpleChanges, ChangeDetectorRef, ElementRef, AfterViewInit, AfterViewChecked } from '@angular/core';
1
+ import { EventEmitter, ViewContainerRef, OnInit, OnDestroy, OnChanges, SimpleChanges, ChangeDetectorRef, ElementRef, AfterViewInit, AfterViewChecked, TemplateRef } from '@angular/core';
2
2
  import { MJConversationDetailEntity, MJConversationEntity, RatingJSON } from '@memberjunction/core-entities';
3
3
  import { UserInfo, CompositeKey } from '@memberjunction/core';
4
4
  import { BaseAngularComponent } from '@memberjunction/ng-base-types';
5
5
  import { MessageAttachment } from './message-item.component';
6
+ import { BeforeResponseFormSubmittedEventArgs, AfterResponseFormSubmittedEventArgs } from '../../events/chat-events';
6
7
  import { LazyArtifactInfo } from '../../models/lazy-artifact-info';
8
+ import { RealtimeSessionTimelineMeta } from '../../utils/realtime-session-timeline';
7
9
  import { MJAIAgentRunEntityExtended } from '@memberjunction/ai-core-plus';
8
10
  import * as i0 from "@angular/core";
9
11
  /**
@@ -25,6 +27,33 @@ export declare class MessageListComponent extends BaseAngularComponent implement
25
27
  iconClass: string | null;
26
28
  }>;
27
29
  attachmentsMap: Map<string, MessageAttachment[]>;
30
+ /**
31
+ * Optional session-row enrichment for realtime SESSION BLOCKS, keyed by
32
+ * `NormalizeUUID(sessionId)` (agent name / status / close reason). Details stamped
33
+ * with an `AgentSessionID` collapse into one timeline card per session — see
34
+ * `BuildConversationTimeline` — and this map dresses those cards up when present.
35
+ */
36
+ sessionMetaMap: Map<string, RealtimeSessionTimelineMeta>;
37
+ /**
38
+ * Optional per-iteration custom message renderer. When set, the list renders each
39
+ * message via this template (full replacement) instead of the default
40
+ * `MessageItemComponent`. Forwarded by chat-area when a consumer projects
41
+ * `mjChatSlot="messageRenderer"`. The template receives the message as
42
+ * `$implicit` and as a named `message` context binding.
43
+ *
44
+ * Consumers opting into a custom renderer take full responsibility for displaying
45
+ * the message — edit/delete/retry affordances, artifacts, ratings, attachments,
46
+ * etc. The minimal `MJChatMessageBubbleDefaultComponent` ships as a ready-to-use
47
+ * bubble renderer.
48
+ */
49
+ messageRendererTemplate: TemplateRef<unknown> | null;
50
+ /**
51
+ * Optional per-message additive decoration template, projected INSIDE the default
52
+ * `MessageItemComponent` (after the message text). Forwarded by chat-area when a
53
+ * consumer projects `mjChatSlot="messageExtra"`. Ignored when
54
+ * `messageRendererTemplate` is set (custom renderers own all per-message content).
55
+ */
56
+ messageExtraTemplate: TemplateRef<unknown> | null;
28
57
  editMessage: EventEmitter<MJConversationDetailEntity>;
29
58
  deleteMessage: EventEmitter<MJConversationDetailEntity>;
30
59
  retryMessage: EventEmitter<MJConversationDetailEntity>;
@@ -47,8 +76,19 @@ export declare class MessageListComponent extends BaseAngularComponent implement
47
76
  attachmentClicked: EventEmitter<MessageAttachment>;
48
77
  diagnosticRequested: EventEmitter<string>;
49
78
  messagePinToggled: EventEmitter<MJConversationDetailEntity>;
79
+ /** Emitted with the `MJ: AI Agent Sessions.ID` when a realtime session block's Open affordance is clicked. */
80
+ realtimeSessionOpenRequested: EventEmitter<string>;
81
+ /** Forwarded from MessageItemComponent — see its docs. */
82
+ beforeResponseFormSubmitted: EventEmitter<BeforeResponseFormSubmittedEventArgs>;
83
+ /** Forwarded from MessageItemComponent — see its docs. */
84
+ afterResponseFormSubmitted: EventEmitter<AfterResponseFormSubmittedEventArgs>;
50
85
  messageContainerRef: ViewContainerRef;
51
86
  scrollContainer: ElementRef;
87
+ /**
88
+ * Per-message rendered entries — see `RenderedMessageEntry` for the 3-way
89
+ * union (default MessageItemComponent / consumer messageRenderer slot
90
+ * embedded view / collapsed realtime session timeline card).
91
+ */
52
92
  private _renderedMessages;
53
93
  private _shouldScrollToBottom;
54
94
  private _previousMessageCount;
@@ -72,8 +112,47 @@ export declare class MessageListComponent extends BaseAngularComponent implement
72
112
  /**
73
113
  * Updates the message list using dynamic component creation
74
114
  * Only adds/removes changed messages for optimal performance
115
+ *
116
+ * REALTIME SESSIONS: details stamped with an `AgentSessionID` (turns persisted during
117
+ * a live realtime session) do NOT render as normal chat bubbles. The timeline pass
118
+ * (`BuildConversationTimeline`) collapses each session's stamped rows into ONE session
119
+ * block, rendered as a `RealtimeSessionTimelineCardComponent` at the session's
120
+ * chronological position. Everything else renders exactly as before.
75
121
  */
76
122
  private updateMessages;
123
+ /** Stable render key for a timeline item — message ID, or a prefixed session key for session blocks. */
124
+ private getTimelineKey;
125
+ /** Render key for a session block (case-insensitive on the session id; prefixed so it can't collide with message IDs). */
126
+ private getSessionKey;
127
+ /** The render key of the LAST normal message item in the timeline (drives `isLastMessage`), or null when none. */
128
+ private findLastMessageKey;
129
+ /**
130
+ * Creates or updates the ONE timeline card a realtime session collapses to.
131
+ * Click/Open on the card bubbles up via {@link realtimeSessionOpenRequested} so the
132
+ * chat area can host the SESSION REVIEW overlay for it.
133
+ */
134
+ private renderSessionBlock;
135
+ /**
136
+ * Creates or updates one normal chat message item. Routes to the
137
+ * consumer-projected `messageRenderer` slot template (EmbeddedViewRef path)
138
+ * when present, otherwise falls back to the default `MessageItemComponent`
139
+ * dynamic-component path. Both paths flow through the shared
140
+ * `createRenderedEntry` / `updateMessageItemInstance` helpers.
141
+ */
142
+ private renderMessageItem;
143
+ /**
144
+ * Updates an existing `MessageItemComponent` in place — used on the default
145
+ * (non-custom-renderer) path when a message's status / artifacts / agent-run /
146
+ * etc. changes mid-stream.
147
+ */
148
+ private updateMessageItemInstance;
149
+ /**
150
+ * Creates a new rendered entry — either a `MessageItemComponent` (default path)
151
+ * or an `EmbeddedViewRef` from the consumer's `messageRenderer` slot template.
152
+ * Stores the entry in `_renderedMessages` and stamps a back-reference on the
153
+ * message entity.
154
+ */
155
+ private createRenderedEntry;
77
156
  /**
78
157
  * Resolves the DISTINCT artifacts for a message (one entry per artifactId at its
79
158
  * latest version), lazy-loads them all, and applies them to the rendered
@@ -122,6 +201,6 @@ export declare class MessageListComponent extends BaseAngularComponent implement
122
201
  */
123
202
  removeMessage(message: MJConversationDetailEntity): void;
124
203
  static ɵfac: i0.ɵɵFactoryDeclaration<MessageListComponent, never>;
125
- static ɵcmp: i0.ɵɵComponentDeclaration<MessageListComponent, "mj-conversation-message-list", never, { "messages": { "alias": "messages"; "required": false; }; "conversation": { "alias": "conversation"; "required": false; }; "currentUser": { "alias": "currentUser"; "required": false; }; "isProcessing": { "alias": "isProcessing"; "required": false; }; "artifactMap": { "alias": "artifactMap"; "required": false; }; "agentRunMap": { "alias": "agentRunMap"; "required": false; }; "ratingsMap": { "alias": "ratingsMap"; "required": false; }; "userAvatarMap": { "alias": "userAvatarMap"; "required": false; }; "attachmentsMap": { "alias": "attachmentsMap"; "required": false; }; "messagesUpdate": { "alias": "messagesUpdate"; "required": false; }; }, { "editMessage": "editMessage"; "deleteMessage": "deleteMessage"; "retryMessage": "retryMessage"; "testFeedbackMessage": "testFeedbackMessage"; "artifactClicked": "artifactClicked"; "replyInThread": "replyInThread"; "viewThread": "viewThread"; "messageEdited": "messageEdited"; "openEntityRecord": "openEntityRecord"; "suggestedResponseSelected": "suggestedResponseSelected"; "attachmentClicked": "attachmentClicked"; "diagnosticRequested": "diagnosticRequested"; "messagePinToggled": "messagePinToggled"; }, never, never, false, never>;
204
+ static ɵcmp: i0.ɵɵComponentDeclaration<MessageListComponent, "mj-conversation-message-list", never, { "messages": { "alias": "messages"; "required": false; }; "conversation": { "alias": "conversation"; "required": false; }; "currentUser": { "alias": "currentUser"; "required": false; }; "isProcessing": { "alias": "isProcessing"; "required": false; }; "artifactMap": { "alias": "artifactMap"; "required": false; }; "agentRunMap": { "alias": "agentRunMap"; "required": false; }; "ratingsMap": { "alias": "ratingsMap"; "required": false; }; "userAvatarMap": { "alias": "userAvatarMap"; "required": false; }; "attachmentsMap": { "alias": "attachmentsMap"; "required": false; }; "sessionMetaMap": { "alias": "sessionMetaMap"; "required": false; }; "messageRendererTemplate": { "alias": "messageRendererTemplate"; "required": false; }; "messageExtraTemplate": { "alias": "messageExtraTemplate"; "required": false; }; "messagesUpdate": { "alias": "messagesUpdate"; "required": false; }; }, { "editMessage": "editMessage"; "deleteMessage": "deleteMessage"; "retryMessage": "retryMessage"; "testFeedbackMessage": "testFeedbackMessage"; "artifactClicked": "artifactClicked"; "replyInThread": "replyInThread"; "viewThread": "viewThread"; "messageEdited": "messageEdited"; "openEntityRecord": "openEntityRecord"; "suggestedResponseSelected": "suggestedResponseSelected"; "attachmentClicked": "attachmentClicked"; "diagnosticRequested": "diagnosticRequested"; "messagePinToggled": "messagePinToggled"; "realtimeSessionOpenRequested": "realtimeSessionOpenRequested"; "beforeResponseFormSubmitted": "beforeResponseFormSubmitted"; "afterResponseFormSubmitted": "afterResponseFormSubmitted"; }, never, never, false, never>;
126
205
  }
127
206
  //# sourceMappingURL=message-list.component.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"message-list.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/message/message-list.component.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"message-list.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/message/message-list.component.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,10 @@
1
1
  import { Component, Input, Output, EventEmitter, ViewChild, ViewContainerRef } from '@angular/core';
2
+ import { NormalizeUUID } from '@memberjunction/global';
2
3
  import { BaseAngularComponent } from '@memberjunction/ng-base-types';
3
4
  import { MessageItemComponent } from './message-item.component';
5
+ import { RealtimeSessionTimelineCardComponent } from '../realtime/realtime-session-timeline-card.component';
4
6
  import { selectDistinctLatestArtifacts } from '../../utils/distinct-artifacts';
7
+ import { BuildConversationTimeline } from '../../utils/realtime-session-timeline';
5
8
  import * as i0 from "@angular/core";
6
9
  const _c0 = ["messageContainer"];
7
10
  const _c1 = ["scrollContainer"];
@@ -63,6 +66,33 @@ export class MessageListComponent extends BaseAngularComponent {
63
66
  ratingsMap = new Map();
64
67
  userAvatarMap = new Map();
65
68
  attachmentsMap = new Map();
69
+ /**
70
+ * Optional session-row enrichment for realtime SESSION BLOCKS, keyed by
71
+ * `NormalizeUUID(sessionId)` (agent name / status / close reason). Details stamped
72
+ * with an `AgentSessionID` collapse into one timeline card per session — see
73
+ * `BuildConversationTimeline` — and this map dresses those cards up when present.
74
+ */
75
+ sessionMetaMap = new Map();
76
+ /**
77
+ * Optional per-iteration custom message renderer. When set, the list renders each
78
+ * message via this template (full replacement) instead of the default
79
+ * `MessageItemComponent`. Forwarded by chat-area when a consumer projects
80
+ * `mjChatSlot="messageRenderer"`. The template receives the message as
81
+ * `$implicit` and as a named `message` context binding.
82
+ *
83
+ * Consumers opting into a custom renderer take full responsibility for displaying
84
+ * the message — edit/delete/retry affordances, artifacts, ratings, attachments,
85
+ * etc. The minimal `MJChatMessageBubbleDefaultComponent` ships as a ready-to-use
86
+ * bubble renderer.
87
+ */
88
+ messageRendererTemplate = null;
89
+ /**
90
+ * Optional per-message additive decoration template, projected INSIDE the default
91
+ * `MessageItemComponent` (after the message text). Forwarded by chat-area when a
92
+ * consumer projects `mjChatSlot="messageExtra"`. Ignored when
93
+ * `messageRendererTemplate` is set (custom renderers own all per-message content).
94
+ */
95
+ messageExtraTemplate = null;
66
96
  editMessage = new EventEmitter();
67
97
  deleteMessage = new EventEmitter();
68
98
  retryMessage = new EventEmitter();
@@ -76,8 +106,19 @@ export class MessageListComponent extends BaseAngularComponent {
76
106
  attachmentClicked = new EventEmitter();
77
107
  diagnosticRequested = new EventEmitter(); // emits messageId
78
108
  messagePinToggled = new EventEmitter();
109
+ /** Emitted with the `MJ: AI Agent Sessions.ID` when a realtime session block's Open affordance is clicked. */
110
+ realtimeSessionOpenRequested = new EventEmitter();
111
+ /** Forwarded from MessageItemComponent — see its docs. */
112
+ beforeResponseFormSubmitted = new EventEmitter();
113
+ /** Forwarded from MessageItemComponent — see its docs. */
114
+ afterResponseFormSubmitted = new EventEmitter();
79
115
  messageContainerRef;
80
116
  scrollContainer;
117
+ /**
118
+ * Per-message rendered entries — see `RenderedMessageEntry` for the 3-way
119
+ * union (default MessageItemComponent / consumer messageRenderer slot
120
+ * embedded view / collapsed realtime session timeline card).
121
+ */
81
122
  _renderedMessages = new Map();
82
123
  _shouldScrollToBottom = false;
83
124
  _previousMessageCount = 0; // Track previous count to detect new messages
@@ -146,6 +187,11 @@ export class MessageListComponent extends BaseAngularComponent {
146
187
  if (changes['attachmentsMap'] && this.messages && this.messageContainerRef) {
147
188
  this.updateMessages(this.messages);
148
189
  }
190
+ // Watch for session-meta changes so realtime session blocks pick up their
191
+ // agent name / status chip once the (async, batched) session lookup lands
192
+ if (changes['sessionMetaMap'] && this.messages && this.messageContainerRef) {
193
+ this.updateMessages(this.messages);
194
+ }
149
195
  }
150
196
  ngAfterViewChecked() {
151
197
  if (this._shouldScrollToBottom) {
@@ -154,10 +200,10 @@ export class MessageListComponent extends BaseAngularComponent {
154
200
  }
155
201
  }
156
202
  ngOnDestroy() {
157
- // Clean up all dynamically created components
158
- this._renderedMessages.forEach((componentRef) => {
159
- if (componentRef) {
160
- componentRef.destroy();
203
+ // Clean up all dynamically created components AND embedded views (both have destroy()).
204
+ this._renderedMessages.forEach((entry) => {
205
+ if (entry) {
206
+ entry.ref.destroy();
161
207
  }
162
208
  });
163
209
  this._renderedMessages.clear();
@@ -177,95 +223,42 @@ export class MessageListComponent extends BaseAngularComponent {
177
223
  /**
178
224
  * Updates the message list using dynamic component creation
179
225
  * Only adds/removes changed messages for optimal performance
226
+ *
227
+ * REALTIME SESSIONS: details stamped with an `AgentSessionID` (turns persisted during
228
+ * a live realtime session) do NOT render as normal chat bubbles. The timeline pass
229
+ * (`BuildConversationTimeline`) collapses each session's stamped rows into ONE session
230
+ * block, rendered as a `RealtimeSessionTimelineCardComponent` at the session's
231
+ * chronological position. Everything else renders exactly as before.
180
232
  */
181
233
  updateMessages(messages) {
182
234
  // Temporarily detach change detection for performance
183
235
  this.cdRef.detach();
184
236
  try {
185
- // Remove messages that no longer exist
186
- const currentIds = new Set(messages.map(m => this.getMessageKey(m)));
187
- this._renderedMessages.forEach((componentRef, key) => {
188
- if (!currentIds.has(key)) {
189
- componentRef.destroy();
237
+ // Build the timeline first collapses contiguous realtime-session rows
238
+ // into ONE session block per session, leaving normal messages in place.
239
+ // See `BuildConversationTimeline` in `utils/realtime-session-timeline`.
240
+ const timeline = BuildConversationTimeline(messages);
241
+ // Remove rendered items (messages AND session blocks) that no longer exist
242
+ const currentKeys = new Set(timeline.map(item => this.getTimelineKey(item)));
243
+ this._renderedMessages.forEach((entry, key) => {
244
+ if (!currentKeys.has(key)) {
245
+ entry.ref.destroy();
190
246
  this._renderedMessages.delete(key);
191
247
  }
192
248
  });
193
- // Add or update messages
194
- messages.forEach((message, index) => {
195
- const key = this.getMessageKey(message);
196
- const existing = this._renderedMessages.get(key);
197
- if (existing) {
198
- // Update existing component
199
- const instance = existing.instance;
200
- // Store previous message for comparison
201
- const previousMessage = instance.message;
202
- instance.message = message;
203
- instance.allMessages = messages;
204
- instance.isProcessing = this.isProcessing;
205
- instance.userAvatarMap = this.userAvatarMap;
206
- instance.isLastMessage = (index === messages.length - 1); // Update last message flag
207
- // Surface ALL distinct artifacts on this message (latest version each),
208
- // not just the most recent one. Loads lazily in the background.
209
- this.applyArtifactsToInstance(instance, message.ID, existing.changeDetectorRef);
210
- // Update agent run from map
211
- instance.agentRun = this.agentRunMap.get(message.ID) || null;
212
- // Update ratings from map
213
- instance.ratings = this.ratingsMap.get(message.ID);
214
- // Update attachments from map
215
- instance.attachments = this.attachmentsMap.get(message.ID) || [];
216
- // Manually trigger change detection in child component when message status changes
217
- // This is necessary because we're using OnPush change detection and direct property assignment
218
- // doesn't trigger ngOnChanges (only reference changes do)
219
- if (previousMessage && previousMessage.Status !== message.Status) {
220
- // Use ComponentRef.changeDetectorRef to force update on dynamic child
221
- existing.changeDetectorRef.markForCheck();
222
- }
249
+ // Add or update timeline items in chronological order. `renderMessageItem`
250
+ // internally branches on the slot template (messageRenderer) vs the
251
+ // default MessageItemComponent; `renderSessionBlock` always creates a
252
+ // RealtimeSessionTimelineCardComponent.
253
+ const lastMessageKey = this.findLastMessageKey(timeline);
254
+ for (const item of timeline) {
255
+ if (item.Kind === 'session') {
256
+ this.renderSessionBlock(item.Group);
223
257
  }
224
258
  else {
225
- // Create new component
226
- const componentRef = this.messageContainerRef.createComponent(MessageItemComponent);
227
- const instance = componentRef.instance;
228
- // Set inputs
229
- instance.message = message;
230
- instance.conversation = this.conversation;
231
- instance.currentUser = this.currentUser;
232
- instance.allMessages = messages;
233
- instance.isProcessing = this.isProcessing;
234
- instance.userAvatarMap = this.userAvatarMap;
235
- instance.isLastMessage = (index === messages.length - 1); // Mark last message
236
- // Surface ALL distinct artifacts on this message (latest version each).
237
- this.applyArtifactsToInstance(instance, message.ID, componentRef.changeDetectorRef);
238
- // Pass agent run from map (loaded once per conversation)
239
- instance.agentRun = this.agentRunMap.get(message.ID) || null;
240
- // Pass ratings from map (parsed once per conversation)
241
- instance.ratings = this.ratingsMap.get(message.ID);
242
- // Pass attachments from map
243
- instance.attachments = this.attachmentsMap.get(message.ID) || [];
244
- // Subscribe to outputs
245
- instance.editClicked.subscribe((msg) => this.editMessage.emit(msg));
246
- instance.deleteClicked.subscribe((msg) => this.deleteMessage.emit(msg));
247
- instance.retryClicked.subscribe((msg) => this.retryMessage.emit(msg));
248
- instance.testFeedbackClicked.subscribe((msg) => this.testFeedbackMessage.emit(msg));
249
- instance.artifactClicked.subscribe((data) => this.artifactClicked.emit(data));
250
- instance.messageEdited.subscribe((msg) => this.messageEdited.emit(msg));
251
- instance.openEntityRecord.subscribe((data) => this.openEntityRecord.emit(data));
252
- instance.suggestedResponseSelected.subscribe((data) => this.suggestedResponseSelected.emit(data));
253
- instance.attachmentClicked.subscribe((attachment) => this.attachmentClicked.emit(attachment));
254
- instance.diagnosticRequested.subscribe((messageId) => this.diagnosticRequested.emit(messageId));
255
- instance.messagePinToggled.subscribe((msg) => this.messagePinToggled.emit(msg));
256
- // Handle artifact actions if the output exists
257
- if (instance.artifactActionPerformed) {
258
- instance.artifactActionPerformed.subscribe((data) => {
259
- // Parent can handle artifact actions (save, fork, history, share)
260
- console.log('Artifact action:', data);
261
- });
262
- }
263
- // Store reference
264
- this._renderedMessages.set(key, componentRef);
265
- // Store reference on the message entity for later access (like skip-chat pattern)
266
- message._componentRef = componentRef;
259
+ this.renderMessageItem(item.Detail, messages, this.getMessageKey(item.Detail) === lastMessageKey);
267
260
  }
268
- });
261
+ }
269
262
  // Only scroll to bottom if new messages were added (not just updates)
270
263
  // This prevents scrolling when the message list is merely refreshed (e.g., during agent run timer)
271
264
  const previousCount = this._previousMessageCount;
@@ -280,6 +273,166 @@ export class MessageListComponent extends BaseAngularComponent {
280
273
  this.cdRef.detectChanges();
281
274
  }
282
275
  }
276
+ /** Stable render key for a timeline item — message ID, or a prefixed session key for session blocks. */
277
+ getTimelineKey(item) {
278
+ return item.Kind === 'session' ? this.getSessionKey(item.Group.SessionID) : this.getMessageKey(item.Detail);
279
+ }
280
+ /** Render key for a session block (case-insensitive on the session id; prefixed so it can't collide with message IDs). */
281
+ getSessionKey(sessionId) {
282
+ return `session:${NormalizeUUID(sessionId)}`;
283
+ }
284
+ /** The render key of the LAST normal message item in the timeline (drives `isLastMessage`), or null when none. */
285
+ findLastMessageKey(timeline) {
286
+ for (let i = timeline.length - 1; i >= 0; i--) {
287
+ const item = timeline[i];
288
+ if (item.Kind === 'message') {
289
+ return this.getMessageKey(item.Detail);
290
+ }
291
+ }
292
+ return null;
293
+ }
294
+ /**
295
+ * Creates or updates the ONE timeline card a realtime session collapses to.
296
+ * Click/Open on the card bubbles up via {@link realtimeSessionOpenRequested} so the
297
+ * chat area can host the SESSION REVIEW overlay for it.
298
+ */
299
+ renderSessionBlock(group) {
300
+ const key = this.getSessionKey(group.SessionID);
301
+ const meta = this.sessionMetaMap.get(NormalizeUUID(group.SessionID)) ?? null;
302
+ const existing = this._renderedMessages.get(key);
303
+ if (existing && existing.kind === 'realtime-session') {
304
+ // Update existing card in place.
305
+ const instance = existing.ref.instance;
306
+ instance.Group = group;
307
+ instance.Meta = meta;
308
+ existing.ref.changeDetectorRef.markForCheck();
309
+ return;
310
+ }
311
+ // Different kind at this key (e.g. mode changed) — drop the old entry, fall through to create.
312
+ if (existing) {
313
+ existing.ref.destroy();
314
+ this._renderedMessages.delete(key);
315
+ }
316
+ const componentRef = this.messageContainerRef.createComponent(RealtimeSessionTimelineCardComponent);
317
+ componentRef.instance.Group = group;
318
+ componentRef.instance.Meta = meta;
319
+ componentRef.instance.UserName = this.currentUser?.Name || 'You';
320
+ componentRef.instance.OpenRequested.subscribe((sessionId) => this.realtimeSessionOpenRequested.emit(sessionId));
321
+ this._renderedMessages.set(key, { kind: 'realtime-session', ref: componentRef });
322
+ }
323
+ /**
324
+ * Creates or updates one normal chat message item. Routes to the
325
+ * consumer-projected `messageRenderer` slot template (EmbeddedViewRef path)
326
+ * when present, otherwise falls back to the default `MessageItemComponent`
327
+ * dynamic-component path. Both paths flow through the shared
328
+ * `createRenderedEntry` / `updateMessageItemInstance` helpers.
329
+ */
330
+ renderMessageItem(message, messages, isLastMessage) {
331
+ const key = this.getMessageKey(message);
332
+ // `index` is only used for the `isLastMessage` heuristic inside
333
+ // updateMessageItemInstance — synthesize a value that produces the right
334
+ // boolean (last index when `isLastMessage` is true, else 0 — any non-last
335
+ // index works since it just affects that one comparison).
336
+ const index = isLastMessage ? messages.length - 1 : 0;
337
+ const useCustomRenderer = this.messageRendererTemplate !== null;
338
+ const existing = this._renderedMessages.get(key);
339
+ if (existing && existing.kind === 'embedded' && useCustomRenderer) {
340
+ // Update existing embedded view from messageRenderer slot
341
+ existing.ref.context.$implicit = message;
342
+ existing.ref.context.message = message;
343
+ existing.ref.markForCheck();
344
+ return;
345
+ }
346
+ if (existing && existing.kind === 'component' && !useCustomRenderer) {
347
+ // Update existing MessageItemComponent in place
348
+ this.updateMessageItemInstance(existing.ref, message, messages, index);
349
+ return;
350
+ }
351
+ if (existing) {
352
+ // Rendering kind changed (e.g. component↔embedded, or a session block was
353
+ // overwritten with a message). Destroy + recreate.
354
+ existing.ref.destroy();
355
+ this._renderedMessages.delete(key);
356
+ }
357
+ this.createRenderedEntry(message, messages, index, key, useCustomRenderer);
358
+ }
359
+ /**
360
+ * Updates an existing `MessageItemComponent` in place — used on the default
361
+ * (non-custom-renderer) path when a message's status / artifacts / agent-run /
362
+ * etc. changes mid-stream.
363
+ */
364
+ updateMessageItemInstance(ref, message, messages, index) {
365
+ const instance = ref.instance;
366
+ const previousMessage = instance.message;
367
+ instance.message = message;
368
+ instance.allMessages = messages;
369
+ instance.isProcessing = this.isProcessing;
370
+ instance.userAvatarMap = this.userAvatarMap;
371
+ instance.isLastMessage = (index === messages.length - 1);
372
+ instance.messageExtraTemplate = this.messageExtraTemplate;
373
+ this.applyArtifactsToInstance(instance, message.ID, ref.changeDetectorRef);
374
+ instance.agentRun = this.agentRunMap.get(message.ID) || null;
375
+ instance.ratings = this.ratingsMap.get(message.ID);
376
+ instance.attachments = this.attachmentsMap.get(message.ID) || [];
377
+ // Status change requires explicit markForCheck on the OnPush dynamic child.
378
+ if (previousMessage && previousMessage.Status !== message.Status) {
379
+ ref.changeDetectorRef.markForCheck();
380
+ }
381
+ }
382
+ /**
383
+ * Creates a new rendered entry — either a `MessageItemComponent` (default path)
384
+ * or an `EmbeddedViewRef` from the consumer's `messageRenderer` slot template.
385
+ * Stores the entry in `_renderedMessages` and stamps a back-reference on the
386
+ * message entity.
387
+ */
388
+ createRenderedEntry(message, messages, index, key, useCustomRenderer) {
389
+ if (useCustomRenderer && this.messageRendererTemplate) {
390
+ // The slot directive carries TemplateRef<unknown>; assert the contract here
391
+ // (consumers' `let-message` bindings consume the message context shape below).
392
+ const template = this.messageRendererTemplate;
393
+ const viewRef = this.messageContainerRef.createEmbeddedView(template, { $implicit: message, message });
394
+ this._renderedMessages.set(key, { kind: 'embedded', ref: viewRef });
395
+ // Stamp back-ref for parity with the component path.
396
+ message._viewRef = viewRef;
397
+ return;
398
+ }
399
+ const componentRef = this.messageContainerRef.createComponent(MessageItemComponent);
400
+ const instance = componentRef.instance;
401
+ instance.message = message;
402
+ instance.conversation = this.conversation;
403
+ instance.currentUser = this.currentUser;
404
+ instance.allMessages = messages;
405
+ instance.isProcessing = this.isProcessing;
406
+ instance.userAvatarMap = this.userAvatarMap;
407
+ instance.isLastMessage = (index === messages.length - 1);
408
+ instance.messageExtraTemplate = this.messageExtraTemplate;
409
+ this.applyArtifactsToInstance(instance, message.ID, componentRef.changeDetectorRef);
410
+ instance.agentRun = this.agentRunMap.get(message.ID) || null;
411
+ instance.ratings = this.ratingsMap.get(message.ID);
412
+ instance.attachments = this.attachmentsMap.get(message.ID) || [];
413
+ instance.editClicked.subscribe((msg) => this.editMessage.emit(msg));
414
+ instance.deleteClicked.subscribe((msg) => this.deleteMessage.emit(msg));
415
+ instance.retryClicked.subscribe((msg) => this.retryMessage.emit(msg));
416
+ instance.testFeedbackClicked.subscribe((msg) => this.testFeedbackMessage.emit(msg));
417
+ instance.artifactClicked.subscribe((data) => this.artifactClicked.emit(data));
418
+ instance.messageEdited.subscribe((msg) => this.messageEdited.emit(msg));
419
+ instance.openEntityRecord.subscribe((data) => this.openEntityRecord.emit(data));
420
+ instance.suggestedResponseSelected.subscribe((data) => this.suggestedResponseSelected.emit(data));
421
+ instance.attachmentClicked.subscribe((attachment) => this.attachmentClicked.emit(attachment));
422
+ instance.diagnosticRequested.subscribe((messageId) => this.diagnosticRequested.emit(messageId));
423
+ instance.messagePinToggled.subscribe((msg) => this.messagePinToggled.emit(msg));
424
+ instance.beforeResponseFormSubmitted.subscribe((e) => this.beforeResponseFormSubmitted.emit(e));
425
+ instance.afterResponseFormSubmitted.subscribe((e) => this.afterResponseFormSubmitted.emit(e));
426
+ if (instance.artifactActionPerformed) {
427
+ instance.artifactActionPerformed.subscribe((data) => {
428
+ // Parent can handle artifact actions (save, fork, history, share)
429
+ console.log('Artifact action:', data);
430
+ });
431
+ }
432
+ this._renderedMessages.set(key, { kind: 'component', ref: componentRef });
433
+ // Preserve the existing back-ref pattern from the skip-chat performance design.
434
+ message._componentRef = componentRef;
435
+ }
283
436
  /**
284
437
  * Resolves the DISTINCT artifacts for a message (one entry per artifactId at its
285
438
  * latest version), lazy-loads them all, and applies them to the rendered
@@ -384,9 +537,9 @@ export class MessageListComponent extends BaseAngularComponent {
384
537
  */
385
538
  removeMessage(message) {
386
539
  const key = this.getMessageKey(message);
387
- const componentRef = this._renderedMessages.get(key);
388
- if (componentRef) {
389
- componentRef.destroy();
540
+ const entry = this._renderedMessages.get(key);
541
+ if (entry) {
542
+ entry.ref.destroy();
390
543
  this._renderedMessages.delete(key);
391
544
  }
392
545
  }
@@ -397,7 +550,7 @@ export class MessageListComponent extends BaseAngularComponent {
397
550
  let _t;
398
551
  i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.messageContainerRef = _t.first);
399
552
  i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.scrollContainer = _t.first);
400
- } }, inputs: { messages: "messages", conversation: "conversation", currentUser: "currentUser", isProcessing: "isProcessing", artifactMap: "artifactMap", agentRunMap: "agentRunMap", ratingsMap: "ratingsMap", userAvatarMap: "userAvatarMap", attachmentsMap: "attachmentsMap", messagesUpdate: "messagesUpdate" }, outputs: { editMessage: "editMessage", deleteMessage: "deleteMessage", retryMessage: "retryMessage", testFeedbackMessage: "testFeedbackMessage", artifactClicked: "artifactClicked", replyInThread: "replyInThread", viewThread: "viewThread", messageEdited: "messageEdited", openEntityRecord: "openEntityRecord", suggestedResponseSelected: "suggestedResponseSelected", attachmentClicked: "attachmentClicked", diagnosticRequested: "diagnosticRequested", messagePinToggled: "messagePinToggled" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature, i0.ɵɵNgOnChangesFeature], decls: 6, vars: 2, consts: [["scrollContainer", ""], ["messageContainer", ""], [1, "message-list-container"], [1, "sticky-date-header"], [1, "empty-state"], [1, "sticky-date-wrapper"], [1, "sticky-date-button", 3, "click"], [1, "fas", "fa-chevron-down"], [1, "date-nav-dropdown"], [1, "date-nav-option", "jump-to"], [1, "date-nav-option", 3, "click"], [1, "fas", "fa-comments"]], template: function MessageListComponent_Template(rf, ctx) { if (rf & 1) {
553
+ } }, inputs: { messages: "messages", conversation: "conversation", currentUser: "currentUser", isProcessing: "isProcessing", artifactMap: "artifactMap", agentRunMap: "agentRunMap", ratingsMap: "ratingsMap", userAvatarMap: "userAvatarMap", attachmentsMap: "attachmentsMap", sessionMetaMap: "sessionMetaMap", messageRendererTemplate: "messageRendererTemplate", messageExtraTemplate: "messageExtraTemplate", messagesUpdate: "messagesUpdate" }, outputs: { editMessage: "editMessage", deleteMessage: "deleteMessage", retryMessage: "retryMessage", testFeedbackMessage: "testFeedbackMessage", artifactClicked: "artifactClicked", replyInThread: "replyInThread", viewThread: "viewThread", messageEdited: "messageEdited", openEntityRecord: "openEntityRecord", suggestedResponseSelected: "suggestedResponseSelected", attachmentClicked: "attachmentClicked", diagnosticRequested: "diagnosticRequested", messagePinToggled: "messagePinToggled", realtimeSessionOpenRequested: "realtimeSessionOpenRequested", beforeResponseFormSubmitted: "beforeResponseFormSubmitted", afterResponseFormSubmitted: "afterResponseFormSubmitted" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature, i0.ɵɵNgOnChangesFeature], decls: 6, vars: 2, consts: [["scrollContainer", ""], ["messageContainer", ""], [1, "message-list-container"], [1, "sticky-date-header"], [1, "empty-state"], [1, "sticky-date-wrapper"], [1, "sticky-date-button", 3, "click"], [1, "fas", "fa-chevron-down"], [1, "date-nav-dropdown"], [1, "date-nav-option", "jump-to"], [1, "date-nav-option", 3, "click"], [1, "fas", "fa-comments"]], template: function MessageListComponent_Template(rf, ctx) { if (rf & 1) {
401
554
  i0.ɵɵelementStart(0, "div", 2, 0);
402
555
  i0.ɵɵconditionalCreate(2, MessageListComponent_Conditional_2_Template, 17, 3, "div", 3);
403
556
  i0.ɵɵelementContainer(3, null, 1);
@@ -431,6 +584,12 @@ export class MessageListComponent extends BaseAngularComponent {
431
584
  type: Input
432
585
  }], attachmentsMap: [{
433
586
  type: Input
587
+ }], sessionMetaMap: [{
588
+ type: Input
589
+ }], messageRendererTemplate: [{
590
+ type: Input
591
+ }], messageExtraTemplate: [{
592
+ type: Input
434
593
  }], editMessage: [{
435
594
  type: Output
436
595
  }], deleteMessage: [{
@@ -457,6 +616,12 @@ export class MessageListComponent extends BaseAngularComponent {
457
616
  type: Output
458
617
  }], messagePinToggled: [{
459
618
  type: Output
619
+ }], realtimeSessionOpenRequested: [{
620
+ type: Output
621
+ }], beforeResponseFormSubmitted: [{
622
+ type: Output
623
+ }], afterResponseFormSubmitted: [{
624
+ type: Output
460
625
  }], messageContainerRef: [{
461
626
  type: ViewChild,
462
627
  args: ['messageContainer', { read: ViewContainerRef }]
@@ -466,5 +631,5 @@ export class MessageListComponent extends BaseAngularComponent {
466
631
  }], messagesUpdate: [{
467
632
  type: Input
468
633
  }] }); })();
469
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(MessageListComponent, { className: "MessageListComponent", filePath: "src/lib/components/message/message-list.component.ts", lineNumber: 36 }); })();
634
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(MessageListComponent, { className: "MessageListComponent", filePath: "src/lib/components/message/message-list.component.ts", lineNumber: 77 }); })();
470
635
  //# sourceMappingURL=message-list.component.js.map