@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,395 +1,73 @@
1
- import { Injectable } from '@angular/core';
2
- import { BehaviorSubject, Subject } from 'rxjs';
3
- import { GraphQLDataProvider } from '@memberjunction/graphql-dataprovider';
4
- import * as i0 from "@angular/core";
5
- import * as i1 from "./active-tasks.service";
6
- import * as i2 from "./data-cache.service";
7
1
  /**
8
- * Global streaming service that manages PubSub subscriptions for all conversations.
2
+ * @fileoverview Angular DI shim over the framework-agnostic `ConversationStreaming`
3
+ * from `@memberjunction/conversations-runtime`.
4
+ *
5
+ * The PubSub subscription, message routing, completion replay, and reconnection
6
+ * logic all moved into the runtime in PR 2a. This service is now a thin pass-
7
+ * through. The runtime accesses the active-task tracker via the adapter
8
+ * registered by `ConversationsRuntimeBootstrap`.
9
9
  *
10
- * This service maintains a single WebSocket connection and routes updates to all
11
- * registered message callbacks, regardless of which conversation is currently visible.
12
- * This ensures that messages update correctly even when users navigate away and return.
10
+ * **For new code:** prefer `ConversationsRuntime.Instance.Streaming` directly.
13
11
  */
12
+ import { Injectable } from '@angular/core';
13
+ import { ConversationsRuntime, } from '@memberjunction/conversations-runtime';
14
+ import * as i0 from "@angular/core";
15
+ import * as i1 from "./conversations-runtime-bootstrap.service";
14
16
  export class ConversationStreamingService {
15
- activeTasks;
16
- dataCache;
17
- // Single PubSub subscription shared across the entire app
18
- pushStatusSubscription;
19
- // Registry of callbacks per conversation detail ID
20
- // Multiple callbacks can be registered for the same message (e.g., different components)
21
- callbackRegistry = new Map();
22
- // Track recent completions for late-arriving components (e.g., after navigation)
23
- // Key: conversationDetailId, Value: completion info with timestamp
24
- recentCompletions = new Map();
25
- // Observable for components to subscribe to completion events in real-time
26
- completionEvents$ = new Subject();
27
- // Subject to emit connection status changes
28
- connectionStatus$ = new BehaviorSubject('disconnected');
29
- // Track if service has been initialized
30
- initialized = false;
31
- // Reconnection timeout
32
- reconnectionTimeout;
33
- constructor(activeTasks, dataCache) {
34
- this.activeTasks = activeTasks;
35
- this.dataCache = dataCache;
17
+ constructor(_bootstrap) {
18
+ // Injecting the bootstrap forces adapter registration on first construction.
19
+ }
20
+ get streaming() {
21
+ return ConversationsRuntime.Instance.Streaming;
22
+ }
23
+ /** Pass-through to {@link ConversationsRuntime.Instance.Streaming.completionEvents$}. */
24
+ get completionEvents$() {
25
+ return this.streaming.completionEvents$;
36
26
  }
37
- /**
38
- * Initialize the global PubSub subscription.
39
- * Should be called once at app startup (e.g., in workspace component).
40
- */
41
27
  initialize() {
42
- if (this.initialized) {
43
- return;
44
- }
45
- try {
46
- const dataProvider = GraphQLDataProvider.Instance;
47
- const sessionId = dataProvider.sessionId || dataProvider._sessionId;
48
- this.pushStatusSubscription = dataProvider.PushStatusUpdates().subscribe({
49
- next: (status) => {
50
- this.handlePushStatusUpdate(status);
51
- },
52
- error: (error) => {
53
- console.error('[ConversationStreamingService] PubSub connection error:', error);
54
- this.connectionStatus$.next('error');
55
- this.scheduleReconnection();
56
- },
57
- complete: () => {
58
- this.connectionStatus$.next('disconnected');
59
- this.scheduleReconnection();
60
- }
61
- });
62
- this.initialized = true;
63
- this.connectionStatus$.next('connected');
64
- }
65
- catch (error) {
66
- console.error('[ConversationStreamingService] Failed to initialize:', error);
67
- this.connectionStatus$.next('error');
68
- this.scheduleReconnection();
69
- }
28
+ this.streaming.initialize();
70
29
  }
71
- /**
72
- * Get the current connection status as an observable
73
- */
74
30
  getConnectionStatus$() {
75
- return this.connectionStatus$.asObservable();
31
+ return this.streaming.getConnectionStatus$();
76
32
  }
77
- /**
78
- * Get the current connection status value
79
- */
80
33
  getConnectionStatus() {
81
- return this.connectionStatus$.value;
34
+ return this.streaming.getConnectionStatus();
82
35
  }
83
- /**
84
- * Register a callback for a specific conversation detail (message).
85
- * The callback will be invoked whenever progress updates arrive for this message.
86
- *
87
- * @param conversationDetailId - The ID of the conversation detail entity
88
- * @param callback - Function to call with progress updates
89
- */
90
36
  registerMessageCallback(conversationDetailId, callback) {
91
- const existing = this.callbackRegistry.get(conversationDetailId) || [];
92
- existing.push(callback);
93
- this.callbackRegistry.set(conversationDetailId, existing);
37
+ this.streaming.registerMessageCallback(conversationDetailId, callback);
94
38
  }
95
- /**
96
- * Unregister a callback for a specific conversation detail.
97
- * If no callback is provided, all callbacks for the message are removed.
98
- *
99
- * @param conversationDetailId - The ID of the conversation detail entity
100
- * @param callback - Optional specific callback to remove
101
- */
102
39
  unregisterMessageCallback(conversationDetailId, callback) {
103
- if (callback) {
104
- // Remove specific callback
105
- const existing = this.callbackRegistry.get(conversationDetailId) || [];
106
- const filtered = existing.filter(cb => cb !== callback);
107
- if (filtered.length > 0) {
108
- this.callbackRegistry.set(conversationDetailId, filtered);
109
- }
110
- else {
111
- this.callbackRegistry.delete(conversationDetailId);
112
- }
113
- }
114
- else {
115
- // Remove all callbacks for this message
116
- const hadCallbacks = this.callbackRegistry.has(conversationDetailId);
117
- this.callbackRegistry.delete(conversationDetailId);
118
- if (hadCallbacks) {
119
- // console.log(`[ConversationStreamingService] Unregistered all callbacks for message ${conversationDetailId}`);
120
- }
121
- }
40
+ this.streaming.unregisterMessageCallback(conversationDetailId, callback);
122
41
  }
123
- /**
124
- * Get the number of registered callbacks (for monitoring/debugging)
125
- */
126
42
  getRegisteredCallbackCount() {
127
- let count = 0;
128
- for (const callbacks of this.callbackRegistry.values()) {
129
- count += callbacks.length;
130
- }
131
- return count;
43
+ return this.streaming.getRegisteredCallbackCount();
132
44
  }
133
- /**
134
- * Get the number of messages being tracked (for monitoring/debugging)
135
- */
136
45
  getTrackedMessageCount() {
137
- return this.callbackRegistry.size;
46
+ return this.streaming.getTrackedMessageCount();
138
47
  }
139
- /**
140
- * Handle incoming PubSub status updates and route to registered callbacks
141
- */
142
- async handlePushStatusUpdate(status) {
143
- if (!status) {
144
- console.warn('PubSub status is null or undefined');
145
- return;
146
- }
147
- try {
148
- // Parse the status if it's a JSON string, otherwise use as-is
149
- // GraphQL subscription emits JSON strings that need to be parsed
150
- const statusObj = typeof status === 'string' ? JSON.parse(status) : status;
151
- // Handle both resolver types for agent progress updates
152
- if (statusObj.resolver === 'TaskOrchestrator') {
153
- // Task graph execution (multi-step workflows)
154
- await this.routeTaskProgress(statusObj);
155
- }
156
- else if (statusObj.resolver === 'RunAIAgentResolver') {
157
- // Direct agent execution (Sage, Research Agent, etc.)
158
- await this.routeAgentProgress(statusObj);
159
- }
160
- else {
161
- }
162
- }
163
- catch (error) {
164
- console.error('[ConversationStreamingService] Error processing push status update:', error);
165
- }
166
- }
167
- /**
168
- * Route task progress updates to registered callbacks.
169
- * Uses conversationDetailId from PubSub message for direct routing.
170
- */
171
- async routeTaskProgress(statusObj) {
172
- try {
173
- // Extract progress information from status object
174
- const { taskName, message, percentComplete, metadata, conversationDetailId } = statusObj.data || {};
175
- // console.log(`[ConversationStreamingService] 📥 Received progress update:`, {
176
- // taskName,
177
- // hasMessage: !!message,
178
- // conversationDetailId,
179
- // registeredCallbacks: Array.from(this.callbackRegistry.keys())
180
- // });
181
- if (!message) {
182
- console.warn('[ConversationStreamingService] ⚠️ No message content in progress update');
183
- return; // No message content to update
184
- }
185
- if (!conversationDetailId) {
186
- console.warn('[ConversationStreamingService] ⚠️ Progress update missing conversationDetailId, cannot route', { taskName, message });
187
- return;
188
- }
189
- // Direct lookup using conversationDetailId from backend
190
- const callbacks = this.callbackRegistry.get(conversationDetailId) || [];
191
- if (callbacks.length === 0) {
192
- // No callbacks registered - expected when progress is handled directly by graphQLAIClient's
193
- // fire-and-forget subscription, or when the message is in a hidden conversation.
194
- return;
195
- }
196
- // Create progress update object
197
- const progressUpdate = {
198
- message,
199
- percentComplete,
200
- taskName,
201
- conversationDetailId,
202
- metadata,
203
- resolver: 'TaskOrchestrator'
204
- };
205
- // Invoke all registered callbacks for this specific message
206
- for (const callback of callbacks) {
207
- try {
208
- await callback(progressUpdate);
209
- }
210
- catch (error) {
211
- console.error(`[ConversationStreamingService] Error executing callback for message ${conversationDetailId}:`, error);
212
- // Continue with other callbacks even if one fails
213
- }
214
- }
215
- // console.log(`[ConversationStreamingService] ✅ Routed progress update to message ${conversationDetailId} (${callbacks.length} callback(s))`);
216
- }
217
- catch (error) {
218
- console.error('[ConversationStreamingService] Error routing task progress:', error);
219
- }
220
- }
221
- /**
222
- * Route agent progress updates (from RunAIAgentResolver) to registered callbacks.
223
- * Uses conversationDetailID from agentRun data for direct routing.
224
- * Also handles completion messages to remove tasks from ActiveTasksService.
225
- */
226
- async routeAgentProgress(statusObj) {
227
- try {
228
- // Extract progress information from RunAIAgentResolver message
229
- const { agentRun, progress, type } = statusObj.data || {};
230
- // Handle completion messages - backend sends type: 'complete' when agent finishes.
231
- // Now includes conversationDetailId and enriched result data (success, errorMessage, result)
232
- // from the server's fire-and-forget execution.
233
- if (type === 'complete') {
234
- const agentRunId = statusObj.data?.agentRunId;
235
- const conversationDetailId = statusObj.data?.conversationDetailId;
236
- const success = statusObj.data?.success;
237
- const errorMessage = statusObj.data?.errorMessage;
238
- // Remove from active tasks (clears spinner in conversation list)
239
- if (agentRunId) {
240
- const removed = this.activeTasks.removeByAgentRunId(agentRunId);
241
- if (removed) {
242
- console.log(`[ConversationStreamingService] ✅ Agent run ${agentRunId} completed, removed from active tasks`);
243
- }
244
- }
245
- // Broadcast completion event if we have the conversationDetailId
246
- if (conversationDetailId) {
247
- // Store for late-arriving components (navigation scenario)
248
- this.recentCompletions.set(conversationDetailId, {
249
- conversationDetailId,
250
- agentRunId: agentRunId || '',
251
- timestamp: new Date()
252
- });
253
- // Broadcast enriched completion to all subscribers
254
- this.completionEvents$.next({
255
- conversationDetailId,
256
- agentRunId: agentRunId || '',
257
- success,
258
- errorMessage
259
- });
260
- // Cleanup old completions to prevent memory leak
261
- this.cleanupOldCompletions();
262
- console.log(`[ConversationStreamingService] 📢 Completion broadcast for message ${conversationDetailId} (success: ${success})`);
263
- }
264
- else {
265
- console.warn(`[ConversationStreamingService] ⚠️ Completion received without conversationDetailId for agentRunId: ${agentRunId}`);
266
- }
267
- return;
268
- }
269
- const conversationDetailId = agentRun?.ConversationDetailID;
270
- const message = progress?.message;
271
- const percentComplete = progress?.percentage;
272
- const stepCount = progress?.stepCount;
273
- if (!message) {
274
- console.warn('[ConversationStreamingService] ⚠️ No message content in agent progress update');
275
- return;
276
- }
277
- if (!conversationDetailId) {
278
- console.warn('[ConversationStreamingService] ⚠️ Agent progress update missing conversationDetailId', { agentName: agentRun?.Agent, message });
279
- return;
280
- }
281
- // Direct lookup using conversationDetailID from backend
282
- const callbacks = this.callbackRegistry.get(conversationDetailId) || [];
283
- if (callbacks.length === 0) {
284
- // No callbacks registered - expected when progress is handled directly by graphQLAIClient's
285
- // fire-and-forget subscription, or when the message is in a hidden conversation.
286
- return;
287
- }
288
- // Create progress update object
289
- const progressUpdate = {
290
- message,
291
- percentComplete,
292
- taskName: agentRun?.Agent || 'Agent',
293
- conversationDetailId,
294
- metadata: { agentRun, progress },
295
- stepCount,
296
- resolver: 'RunAIAgentResolver'
297
- };
298
- // Invoke all registered callbacks for this specific message
299
- for (const callback of callbacks) {
300
- try {
301
- await callback(progressUpdate);
302
- }
303
- catch (error) {
304
- console.error(`[ConversationStreamingService] Error executing callback for message ${conversationDetailId}:`, error);
305
- // Continue with other callbacks even if one fails
306
- }
307
- }
308
- }
309
- catch (error) {
310
- console.error('[ConversationStreamingService] Error routing agent progress:', error);
311
- }
312
- }
313
- /**
314
- * Schedule a reconnection attempt after a delay
315
- */
316
- scheduleReconnection() {
317
- if (this.reconnectionTimeout) {
318
- clearTimeout(this.reconnectionTimeout);
319
- }
320
- this.connectionStatus$.next('reconnecting');
321
- this.reconnectionTimeout = setTimeout(() => {
322
- console.log('[ConversationStreamingService] Attempting to reconnect...');
323
- this.initialized = false; // Reset initialization flag
324
- this.initialize();
325
- }, 5000);
326
- }
327
- /**
328
- * Get a recent completion event for a message (used when component initializes after completion)
329
- * This handles the navigation scenario: user navigates away, agent completes, user returns.
330
- * @param conversationDetailId - The message ID to check
331
- * @returns Completion info if found within the last 5 minutes, undefined otherwise
332
- */
333
48
  getRecentCompletion(conversationDetailId) {
334
- const completion = this.recentCompletions.get(conversationDetailId);
335
- return completion ? { agentRunId: completion.agentRunId } : undefined;
49
+ return this.streaming.getRecentCompletion(conversationDetailId);
336
50
  }
337
- /**
338
- * Clear a recent completion after it has been handled
339
- * @param conversationDetailId - The message ID to clear
340
- */
341
51
  clearRecentCompletion(conversationDetailId) {
342
- this.recentCompletions.delete(conversationDetailId);
52
+ this.streaming.clearRecentCompletion(conversationDetailId);
343
53
  }
344
- /**
345
- * Get a diagnostic snapshot of streaming state for a specific message.
346
- * Used by the Shift+Click debug tool to dump live in-memory state to the console.
347
- * @param messageId - The ConversationDetailID to inspect
348
- */
349
54
  getDiagnosticSnapshot(messageId) {
350
- const callbacks = this.callbackRegistry.get(messageId);
351
- return {
352
- hasCallbacks: !!callbacks && callbacks.length > 0,
353
- callbackCount: callbacks?.length ?? 0,
354
- recentCompletion: this.recentCompletions.get(messageId),
355
- connectionStatus: this.connectionStatus$.getValue(),
356
- };
357
- }
358
- /**
359
- * Cleanup completions older than 5 minutes to prevent memory leak
360
- */
361
- cleanupOldCompletions() {
362
- const fiveMinutesAgo = Date.now() - 5 * 60 * 1000;
363
- for (const [id, data] of this.recentCompletions) {
364
- if (data.timestamp.getTime() < fiveMinutesAgo) {
365
- this.recentCompletions.delete(id);
366
- }
367
- }
55
+ return this.streaming.getDiagnosticSnapshot(messageId);
368
56
  }
369
57
  /**
370
- * Cleanup when service is destroyed
58
+ * Angular OnDestroy hook. We do NOT call the runtime's Streaming.Dispose()
59
+ * here — that would tear down a shared singleton on a per-injector destroy,
60
+ * which could affect other consumers. The runtime is process-scoped; its
61
+ * lifecycle ends with the process, not with any Angular injector.
371
62
  */
372
63
  ngOnDestroy() {
373
- if (this.reconnectionTimeout) {
374
- clearTimeout(this.reconnectionTimeout);
375
- }
376
- if (this.pushStatusSubscription) {
377
- this.pushStatusSubscription.unsubscribe();
378
- this.pushStatusSubscription = undefined;
379
- }
380
- this.callbackRegistry.clear();
381
- this.recentCompletions.clear();
382
- this.completionEvents$.complete();
383
- this.connectionStatus$.complete();
384
- this.initialized = false;
64
+ // intentionally empty — see jsdoc above
385
65
  }
386
- static ɵfac = function ConversationStreamingService_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || ConversationStreamingService)(i0.ɵɵinject(i1.ActiveTasksService), i0.ɵɵinject(i2.DataCacheService)); };
66
+ static ɵfac = function ConversationStreamingService_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || ConversationStreamingService)(i0.ɵɵinject(i1.ConversationsRuntimeBootstrap)); };
387
67
  static ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: ConversationStreamingService, factory: ConversationStreamingService.ɵfac, providedIn: 'root' });
388
68
  }
389
69
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ConversationStreamingService, [{
390
70
  type: Injectable,
391
- args: [{
392
- providedIn: 'root'
393
- }]
394
- }], () => [{ type: i1.ActiveTasksService }, { type: i2.DataCacheService }], null); })();
71
+ args: [{ providedIn: 'root' }]
72
+ }], () => [{ type: i1.ConversationsRuntimeBootstrap }], null); })();
395
73
  //# sourceMappingURL=conversation-streaming.service.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"conversation-streaming.service.js","sourceRoot":"","sources":["../../../src/lib/services/conversation-streaming.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { Injectable, OnDestroy } from '@angular/core';\nimport { BehaviorSubject, Subject, Subscription, firstValueFrom } from 'rxjs';\nimport { GraphQLDataProvider } from '@memberjunction/graphql-dataprovider';\nimport { ActiveTasksService } from './active-tasks.service';\nimport { DataCacheService } from './data-cache.service';\nimport { MJConversationDetailEntity } from '@memberjunction/core-entities';\nimport { UserInfo } from '@memberjunction/core';\n\n/**\n * Completion event structure broadcast when an agent finishes.\n * Includes enriched result data from the server's fire-and-forget completion event.\n */\nexport interface CompletionEvent {\n conversationDetailId: string;\n agentRunId: string;\n /** Whether the agent execution succeeded */\n success?: boolean;\n /** Error message if the agent execution failed */\n errorMessage?: string;\n}\n\n/**\n * Metadata structure for message progress updates\n */\nexport interface MessageProgressMetadata {\n /** Progress details (from RunAIAgentResolver) */\n progress?: {\n hierarchicalStep?: string;\n percentage?: number;\n message?: string;\n stepCount?: number;\n agentName?: string;\n agentType?: string;\n };\n /** Agent run information (from RunAIAgentResolver) */\n agentRun?: {\n Agent?: string;\n ConversationDetailID?: string;\n ID?: string;\n };\n /** Agent run ID (alternative to agentRun.ID) */\n agentRunId?: string;\n}\n\n/**\n * Message progress update structure\n */\nexport interface MessageProgressUpdate {\n message: string;\n percentComplete?: number;\n taskName?: string;\n conversationDetailId: string;\n metadata?: MessageProgressMetadata;\n stepCount?: number;\n /** Identifies which backend resolver published this update */\n resolver?: 'TaskOrchestrator' | 'RunAIAgentResolver' | string;\n}\n\n/**\n * Callback type for message progress updates\n */\nexport type MessageProgressCallback = (progress: MessageProgressUpdate) => Promise<void> | void;\n\n/**\n * Connection status for streaming service\n */\nexport type StreamingConnectionStatus = 'connected' | 'disconnected' | 'error' | 'reconnecting';\n\n/**\n * Global streaming service that manages PubSub subscriptions for all conversations.\n *\n * This service maintains a single WebSocket connection and routes updates to all\n * registered message callbacks, regardless of which conversation is currently visible.\n * This ensures that messages update correctly even when users navigate away and return.\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class ConversationStreamingService implements OnDestroy {\n // Single PubSub subscription shared across the entire app\n private pushStatusSubscription?: Subscription;\n\n // Registry of callbacks per conversation detail ID\n // Multiple callbacks can be registered for the same message (e.g., different components)\n private callbackRegistry = new Map<string, MessageProgressCallback[]>();\n\n // Track recent completions for late-arriving components (e.g., after navigation)\n // Key: conversationDetailId, Value: completion info with timestamp\n private recentCompletions = new Map<string, {\n conversationDetailId: string;\n agentRunId: string;\n timestamp: Date;\n }>();\n\n // Observable for components to subscribe to completion events in real-time\n public completionEvents$ = new Subject<CompletionEvent>();\n\n // Subject to emit connection status changes\n private connectionStatus$ = new BehaviorSubject<StreamingConnectionStatus>('disconnected');\n\n // Track if service has been initialized\n private initialized = false;\n\n // Reconnection timeout\n private reconnectionTimeout?: any;\n\n constructor(\n private activeTasks: ActiveTasksService,\n private dataCache: DataCacheService\n ) {\n }\n\n /**\n * Initialize the global PubSub subscription.\n * Should be called once at app startup (e.g., in workspace component).\n */\n public initialize(): void {\n if (this.initialized) {\n return;\n }\n\n\n try {\n const dataProvider = GraphQLDataProvider.Instance;\n const sessionId = (dataProvider as any).sessionId || (dataProvider as any)._sessionId;\n\n this.pushStatusSubscription = dataProvider.PushStatusUpdates().subscribe({\n next: (status: any) => {\n this.handlePushStatusUpdate(status);\n },\n error: (error: any) => {\n console.error('[ConversationStreamingService] PubSub connection error:', error);\n this.connectionStatus$.next('error');\n this.scheduleReconnection();\n },\n complete: () => {\n this.connectionStatus$.next('disconnected');\n this.scheduleReconnection();\n }\n });\n\n this.initialized = true;\n this.connectionStatus$.next('connected');\n } catch (error) {\n console.error('[ConversationStreamingService] Failed to initialize:', error);\n this.connectionStatus$.next('error');\n this.scheduleReconnection();\n }\n }\n\n /**\n * Get the current connection status as an observable\n */\n public getConnectionStatus$() {\n return this.connectionStatus$.asObservable();\n }\n\n /**\n * Get the current connection status value\n */\n public getConnectionStatus(): StreamingConnectionStatus {\n return this.connectionStatus$.value;\n }\n\n /**\n * Register a callback for a specific conversation detail (message).\n * The callback will be invoked whenever progress updates arrive for this message.\n *\n * @param conversationDetailId - The ID of the conversation detail entity\n * @param callback - Function to call with progress updates\n */\n public registerMessageCallback(\n conversationDetailId: string,\n callback: MessageProgressCallback\n ): void {\n const existing = this.callbackRegistry.get(conversationDetailId) || [];\n existing.push(callback);\n this.callbackRegistry.set(conversationDetailId, existing);\n }\n\n /**\n * Unregister a callback for a specific conversation detail.\n * If no callback is provided, all callbacks for the message are removed.\n *\n * @param conversationDetailId - The ID of the conversation detail entity\n * @param callback - Optional specific callback to remove\n */\n public unregisterMessageCallback(\n conversationDetailId: string,\n callback?: MessageProgressCallback\n ): void {\n if (callback) {\n // Remove specific callback\n const existing = this.callbackRegistry.get(conversationDetailId) || [];\n const filtered = existing.filter(cb => cb !== callback);\n\n if (filtered.length > 0) {\n this.callbackRegistry.set(conversationDetailId, filtered);\n } else {\n this.callbackRegistry.delete(conversationDetailId);\n }\n } else {\n // Remove all callbacks for this message\n const hadCallbacks = this.callbackRegistry.has(conversationDetailId);\n this.callbackRegistry.delete(conversationDetailId);\n\n if (hadCallbacks) {\n // console.log(`[ConversationStreamingService] Unregistered all callbacks for message ${conversationDetailId}`);\n }\n }\n }\n\n /**\n * Get the number of registered callbacks (for monitoring/debugging)\n */\n public getRegisteredCallbackCount(): number {\n let count = 0;\n for (const callbacks of this.callbackRegistry.values()) {\n count += callbacks.length;\n }\n return count;\n }\n\n /**\n * Get the number of messages being tracked (for monitoring/debugging)\n */\n public getTrackedMessageCount(): number {\n return this.callbackRegistry.size;\n }\n\n /**\n * Handle incoming PubSub status updates and route to registered callbacks\n */\n private async handlePushStatusUpdate(status: any): Promise<void> {\n\n if (!status) {\n console.warn('PubSub status is null or undefined');\n return;\n }\n\n try {\n // Parse the status if it's a JSON string, otherwise use as-is\n // GraphQL subscription emits JSON strings that need to be parsed\n const statusObj = typeof status === 'string' ? JSON.parse(status) : status;\n\n // Handle both resolver types for agent progress updates\n if (statusObj.resolver === 'TaskOrchestrator') {\n // Task graph execution (multi-step workflows)\n await this.routeTaskProgress(statusObj);\n } else if (statusObj.resolver === 'RunAIAgentResolver') {\n // Direct agent execution (Sage, Research Agent, etc.)\n await this.routeAgentProgress(statusObj);\n } else {\n }\n\n } catch (error) {\n console.error('[ConversationStreamingService] Error processing push status update:', error);\n }\n }\n\n /**\n * Route task progress updates to registered callbacks.\n * Uses conversationDetailId from PubSub message for direct routing.\n */\n private async routeTaskProgress(statusObj: any): Promise<void> {\n try {\n // Extract progress information from status object\n const { taskName, message, percentComplete, metadata, conversationDetailId } = statusObj.data || {};\n\n // console.log(`[ConversationStreamingService] 📥 Received progress update:`, {\n // taskName,\n // hasMessage: !!message,\n // conversationDetailId,\n // registeredCallbacks: Array.from(this.callbackRegistry.keys())\n // });\n\n if (!message) {\n console.warn('[ConversationStreamingService] ⚠️ No message content in progress update');\n return; // No message content to update\n }\n\n if (!conversationDetailId) {\n console.warn('[ConversationStreamingService] ⚠️ Progress update missing conversationDetailId, cannot route', { taskName, message });\n return;\n }\n\n // Direct lookup using conversationDetailId from backend\n const callbacks = this.callbackRegistry.get(conversationDetailId) || [];\n\n if (callbacks.length === 0) {\n // No callbacks registered - expected when progress is handled directly by graphQLAIClient's\n // fire-and-forget subscription, or when the message is in a hidden conversation.\n return;\n }\n\n // Create progress update object\n const progressUpdate: MessageProgressUpdate = {\n message,\n percentComplete,\n taskName,\n conversationDetailId,\n metadata,\n resolver: 'TaskOrchestrator'\n };\n\n // Invoke all registered callbacks for this specific message\n for (const callback of callbacks) {\n try {\n await callback(progressUpdate);\n } catch (error) {\n console.error(`[ConversationStreamingService] Error executing callback for message ${conversationDetailId}:`, error);\n // Continue with other callbacks even if one fails\n }\n }\n\n // console.log(`[ConversationStreamingService] ✅ Routed progress update to message ${conversationDetailId} (${callbacks.length} callback(s))`);\n\n } catch (error) {\n console.error('[ConversationStreamingService] Error routing task progress:', error);\n }\n }\n\n /**\n * Route agent progress updates (from RunAIAgentResolver) to registered callbacks.\n * Uses conversationDetailID from agentRun data for direct routing.\n * Also handles completion messages to remove tasks from ActiveTasksService.\n */\n private async routeAgentProgress(statusObj: any): Promise<void> {\n try {\n // Extract progress information from RunAIAgentResolver message\n const { agentRun, progress, type } = statusObj.data || {};\n\n // Handle completion messages - backend sends type: 'complete' when agent finishes.\n // Now includes conversationDetailId and enriched result data (success, errorMessage, result)\n // from the server's fire-and-forget execution.\n if (type === 'complete') {\n const agentRunId = statusObj.data?.agentRunId;\n const conversationDetailId = statusObj.data?.conversationDetailId;\n const success = statusObj.data?.success;\n const errorMessage = statusObj.data?.errorMessage;\n\n // Remove from active tasks (clears spinner in conversation list)\n if (agentRunId) {\n const removed = this.activeTasks.removeByAgentRunId(agentRunId);\n if (removed) {\n console.log(`[ConversationStreamingService] ✅ Agent run ${agentRunId} completed, removed from active tasks`);\n }\n }\n\n // Broadcast completion event if we have the conversationDetailId\n if (conversationDetailId) {\n // Store for late-arriving components (navigation scenario)\n this.recentCompletions.set(conversationDetailId, {\n conversationDetailId,\n agentRunId: agentRunId || '',\n timestamp: new Date()\n });\n\n // Broadcast enriched completion to all subscribers\n this.completionEvents$.next({\n conversationDetailId,\n agentRunId: agentRunId || '',\n success,\n errorMessage\n });\n\n // Cleanup old completions to prevent memory leak\n this.cleanupOldCompletions();\n\n console.log(`[ConversationStreamingService] 📢 Completion broadcast for message ${conversationDetailId} (success: ${success})`);\n } else {\n console.warn(`[ConversationStreamingService] ⚠️ Completion received without conversationDetailId for agentRunId: ${agentRunId}`);\n }\n\n return;\n }\n\n const conversationDetailId = agentRun?.ConversationDetailID;\n const message = progress?.message;\n const percentComplete = progress?.percentage;\n const stepCount = progress?.stepCount;\n\n if (!message) {\n console.warn('[ConversationStreamingService] ⚠️ No message content in agent progress update');\n return;\n }\n\n if (!conversationDetailId) {\n console.warn('[ConversationStreamingService] ⚠️ Agent progress update missing conversationDetailId', { agentName: agentRun?.Agent, message });\n return;\n }\n\n // Direct lookup using conversationDetailID from backend\n const callbacks = this.callbackRegistry.get(conversationDetailId) || [];\n\n if (callbacks.length === 0) {\n // No callbacks registered - expected when progress is handled directly by graphQLAIClient's\n // fire-and-forget subscription, or when the message is in a hidden conversation.\n return;\n }\n\n // Create progress update object\n const progressUpdate: MessageProgressUpdate = {\n message,\n percentComplete,\n taskName: agentRun?.Agent || 'Agent',\n conversationDetailId,\n metadata: { agentRun, progress } as MessageProgressMetadata,\n stepCount,\n resolver: 'RunAIAgentResolver'\n };\n\n // Invoke all registered callbacks for this specific message\n for (const callback of callbacks) {\n try {\n await callback(progressUpdate);\n } catch (error) {\n console.error(`[ConversationStreamingService] Error executing callback for message ${conversationDetailId}:`, error);\n // Continue with other callbacks even if one fails\n }\n }\n\n } catch (error) {\n console.error('[ConversationStreamingService] Error routing agent progress:', error);\n }\n }\n\n /**\n * Schedule a reconnection attempt after a delay\n */\n private scheduleReconnection(): void {\n if (this.reconnectionTimeout) {\n clearTimeout(this.reconnectionTimeout);\n }\n\n this.connectionStatus$.next('reconnecting');\n\n this.reconnectionTimeout = setTimeout(() => {\n console.log('[ConversationStreamingService] Attempting to reconnect...');\n this.initialized = false; // Reset initialization flag\n this.initialize();\n }, 5000);\n }\n\n /**\n * Get a recent completion event for a message (used when component initializes after completion)\n * This handles the navigation scenario: user navigates away, agent completes, user returns.\n * @param conversationDetailId - The message ID to check\n * @returns Completion info if found within the last 5 minutes, undefined otherwise\n */\n public getRecentCompletion(conversationDetailId: string): { agentRunId: string } | undefined {\n const completion = this.recentCompletions.get(conversationDetailId);\n return completion ? { agentRunId: completion.agentRunId } : undefined;\n }\n\n /**\n * Clear a recent completion after it has been handled\n * @param conversationDetailId - The message ID to clear\n */\n public clearRecentCompletion(conversationDetailId: string): void {\n this.recentCompletions.delete(conversationDetailId);\n }\n\n /**\n * Get a diagnostic snapshot of streaming state for a specific message.\n * Used by the Shift+Click debug tool to dump live in-memory state to the console.\n * @param messageId - The ConversationDetailID to inspect\n */\n public getDiagnosticSnapshot(messageId: string): {\n hasCallbacks: boolean;\n callbackCount: number;\n recentCompletion: { conversationDetailId: string; agentRunId: string; timestamp: Date } | undefined;\n connectionStatus: StreamingConnectionStatus;\n } {\n const callbacks = this.callbackRegistry.get(messageId);\n return {\n hasCallbacks: !!callbacks && callbacks.length > 0,\n callbackCount: callbacks?.length ?? 0,\n recentCompletion: this.recentCompletions.get(messageId),\n connectionStatus: this.connectionStatus$.getValue(),\n };\n }\n\n /**\n * Cleanup completions older than 5 minutes to prevent memory leak\n */\n private cleanupOldCompletions(): void {\n const fiveMinutesAgo = Date.now() - 5 * 60 * 1000;\n for (const [id, data] of this.recentCompletions) {\n if (data.timestamp.getTime() < fiveMinutesAgo) {\n this.recentCompletions.delete(id);\n }\n }\n }\n\n /**\n * Cleanup when service is destroyed\n */\n ngOnDestroy(): void {\n if (this.reconnectionTimeout) {\n clearTimeout(this.reconnectionTimeout);\n }\n\n if (this.pushStatusSubscription) {\n this.pushStatusSubscription.unsubscribe();\n this.pushStatusSubscription = undefined;\n }\n\n this.callbackRegistry.clear();\n this.recentCompletions.clear();\n this.completionEvents$.complete();\n this.connectionStatus$.complete();\n this.initialized = false;\n }\n}\n"]}
1
+ {"version":3,"file":"conversation-streaming.service.js","sourceRoot":"","sources":["../../../src/lib/services/conversation-streaming.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,UAAU,EAAa,MAAM,eAAe,CAAC;AAEtD,OAAO,EACH,oBAAoB,GAMvB,MAAM,uCAAuC,CAAC;;;AAc/C,MAAM,OAAO,4BAA4B;IACrC,YAAY,UAAyC;QACjD,6EAA6E;IACjF,CAAC;IAED,IAAY,SAAS;QACjB,OAAO,oBAAoB,CAAC,QAAQ,CAAC,SAAS,CAAC;IACnD,CAAC;IAED,yFAAyF;IACzF,IAAW,iBAAiB;QACxB,OAAO,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC;IAC5C,CAAC;IAEM,UAAU;QACb,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,CAAC;IAChC,CAAC;IAEM,oBAAoB;QACvB,OAAO,IAAI,CAAC,SAAS,CAAC,oBAAoB,EAAE,CAAC;IACjD,CAAC;IAEM,mBAAmB;QACtB,OAAO,IAAI,CAAC,SAAS,CAAC,mBAAmB,EAAE,CAAC;IAChD,CAAC;IAEM,uBAAuB,CAC1B,oBAA4B,EAC5B,QAAiC;QAEjC,IAAI,CAAC,SAAS,CAAC,uBAAuB,CAAC,oBAAoB,EAAE,QAAQ,CAAC,CAAC;IAC3E,CAAC;IAEM,yBAAyB,CAC5B,oBAA4B,EAC5B,QAAkC;QAElC,IAAI,CAAC,SAAS,CAAC,yBAAyB,CAAC,oBAAoB,EAAE,QAAQ,CAAC,CAAC;IAC7E,CAAC;IAEM,0BAA0B;QAC7B,OAAO,IAAI,CAAC,SAAS,CAAC,0BAA0B,EAAE,CAAC;IACvD,CAAC;IAEM,sBAAsB;QACzB,OAAO,IAAI,CAAC,SAAS,CAAC,sBAAsB,EAAE,CAAC;IACnD,CAAC;IAEM,mBAAmB,CAAC,oBAA4B;QACnD,OAAO,IAAI,CAAC,SAAS,CAAC,mBAAmB,CAAC,oBAAoB,CAAC,CAAC;IACpE,CAAC;IAEM,qBAAqB,CAAC,oBAA4B;QACrD,IAAI,CAAC,SAAS,CAAC,qBAAqB,CAAC,oBAAoB,CAAC,CAAC;IAC/D,CAAC;IAEM,qBAAqB,CAAC,SAAiB;QAG1C,OAAO,IAAI,CAAC,SAAS,CAAC,qBAAqB,CAAC,SAAS,CAAC,CAAC;IAC3D,CAAC;IAED;;;;;OAKG;IACI,WAAW;QACd,wCAAwC;IAC5C,CAAC;sHAtEQ,4BAA4B;gEAA5B,4BAA4B,WAA5B,4BAA4B,mBADf,MAAM;;iFACnB,4BAA4B;cADxC,UAAU;eAAC,EAAE,UAAU,EAAE,MAAM,EAAE","sourcesContent":["/**\n * @fileoverview Angular DI shim over the framework-agnostic `ConversationStreaming`\n * from `@memberjunction/conversations-runtime`.\n *\n * The PubSub subscription, message routing, completion replay, and reconnection\n * logic all moved into the runtime in PR 2a. This service is now a thin pass-\n * through. The runtime accesses the active-task tracker via the adapter\n * registered by `ConversationsRuntimeBootstrap`.\n *\n * **For new code:** prefer `ConversationsRuntime.Instance.Streaming` directly.\n */\n\nimport { Injectable, OnDestroy } from '@angular/core';\nimport { Observable, Subject } from 'rxjs';\nimport {\n ConversationsRuntime,\n type CompletionEvent,\n type MessageProgressCallback,\n type MessageProgressMetadata,\n type MessageProgressUpdate,\n type StreamingConnectionStatus,\n} from '@memberjunction/conversations-runtime';\n\nimport { ConversationsRuntimeBootstrap } from './conversations-runtime-bootstrap.service';\n\n// Re-export the runtime's types so existing imports from this file continue to compile.\nexport type {\n CompletionEvent,\n MessageProgressCallback,\n MessageProgressMetadata,\n MessageProgressUpdate,\n StreamingConnectionStatus,\n};\n\n@Injectable({ providedIn: 'root' })\nexport class ConversationStreamingService implements OnDestroy {\n constructor(_bootstrap: ConversationsRuntimeBootstrap) {\n // Injecting the bootstrap forces adapter registration on first construction.\n }\n\n private get streaming() {\n return ConversationsRuntime.Instance.Streaming;\n }\n\n /** Pass-through to {@link ConversationsRuntime.Instance.Streaming.completionEvents$}. */\n public get completionEvents$(): Subject<CompletionEvent> {\n return this.streaming.completionEvents$;\n }\n\n public initialize(): void {\n this.streaming.initialize();\n }\n\n public getConnectionStatus$(): Observable<StreamingConnectionStatus> {\n return this.streaming.getConnectionStatus$();\n }\n\n public getConnectionStatus(): StreamingConnectionStatus {\n return this.streaming.getConnectionStatus();\n }\n\n public registerMessageCallback(\n conversationDetailId: string,\n callback: MessageProgressCallback\n ): void {\n this.streaming.registerMessageCallback(conversationDetailId, callback);\n }\n\n public unregisterMessageCallback(\n conversationDetailId: string,\n callback?: MessageProgressCallback\n ): void {\n this.streaming.unregisterMessageCallback(conversationDetailId, callback);\n }\n\n public getRegisteredCallbackCount(): number {\n return this.streaming.getRegisteredCallbackCount();\n }\n\n public getTrackedMessageCount(): number {\n return this.streaming.getTrackedMessageCount();\n }\n\n public getRecentCompletion(conversationDetailId: string): { agentRunId: string } | undefined {\n return this.streaming.getRecentCompletion(conversationDetailId);\n }\n\n public clearRecentCompletion(conversationDetailId: string): void {\n this.streaming.clearRecentCompletion(conversationDetailId);\n }\n\n public getDiagnosticSnapshot(messageId: string): ReturnType<\n typeof ConversationsRuntime.Instance.Streaming.getDiagnosticSnapshot\n > {\n return this.streaming.getDiagnosticSnapshot(messageId);\n }\n\n /**\n * Angular OnDestroy hook. We do NOT call the runtime's Streaming.Dispose()\n * here — that would tear down a shared singleton on a per-injector destroy,\n * which could affect other consumers. The runtime is process-scoped; its\n * lifecycle ends with the process, not with any Angular injector.\n */\n public ngOnDestroy(): void {\n // intentionally empty — see jsdoc above\n }\n}\n"]}
@@ -0,0 +1,10 @@
1
+ import { ActiveTasksService } from './active-tasks.service';
2
+ import { RealtimeSessionService } from './realtime-session.service';
3
+ import * as i0 from "@angular/core";
4
+ export declare class ConversationsRuntimeBootstrap {
5
+ constructor(activeTasks: ActiveTasksService, voice: RealtimeSessionService);
6
+ private injectChatTokens;
7
+ static ɵfac: i0.ɵɵFactoryDeclaration<ConversationsRuntimeBootstrap, never>;
8
+ static ɵprov: i0.ɵɵInjectableDeclaration<ConversationsRuntimeBootstrap>;
9
+ }
10
+ //# sourceMappingURL=conversations-runtime-bootstrap.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversations-runtime-bootstrap.service.d.ts","sourceRoot":"","sources":["../../../src/lib/services/conversations-runtime-bootstrap.service.ts"],"names":[],"mappings":"AAqBA,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;;AA4CpE,qBACa,6BAA6B;gBAC1B,WAAW,EAAE,kBAAkB,EAAE,KAAK,EAAE,sBAAsB;IAgC1E,OAAO,CAAC,gBAAgB;yCAjCf,6BAA6B;6CAA7B,6BAA6B;CA0CzC"}
@@ -0,0 +1,104 @@
1
+ /**
2
+ * @fileoverview Wires the framework-agnostic `@memberjunction/conversations-runtime`
3
+ * to the Angular host's UI services at module bootstrap.
4
+ *
5
+ * The runtime knows nothing about Angular — it surfaces user-facing messages
6
+ * through `INotificationAdapter` and clears running tasks through
7
+ * `IActiveTaskTracker`. This service implements both adapters using MJ's
8
+ * Angular notification + active-task services and registers them on the runtime
9
+ * at first injection.
10
+ *
11
+ * Each Angular DI shim service (ConversationAgentService, ConversationStreamingService,
12
+ * etc.) takes `ConversationsRuntimeBootstrap` as a constructor dependency so the
13
+ * adapters are guaranteed registered before any shim method is called. Because
14
+ * the bootstrap is `providedIn: 'root'`, the registration happens exactly once
15
+ * per app, on the first injection of any shim.
16
+ */
17
+ import { Injectable } from '@angular/core';
18
+ import { ConversationsRuntime } from '@memberjunction/conversations-runtime';
19
+ import { MJNotificationService } from '@memberjunction/ng-notifications';
20
+ import { RealtimeSessionsAdapter } from './realtime-sessions-adapter';
21
+ import * as i0 from "@angular/core";
22
+ import * as i1 from "./active-tasks.service";
23
+ import * as i2 from "./realtime-session.service";
24
+ /**
25
+ * Document-level `--mj-chat-*` design tokens. Each token defaults to a
26
+ * semantic `--mj-*` token from MJ's design system so the chat surface
27
+ * adapts to light/dark mode automatically. Consumers override these (in
28
+ * their own `:root {}` or a scoped selector) to theme the chat without
29
+ * touching MJ's underlying semantic tokens.
30
+ *
31
+ * Injected at runtime via `<style>` rather than carried via Angular
32
+ * `styleUrls` because Angular's emulated view encapsulation rewrites
33
+ * `:root {}` selectors into `[_ngcontent-…]:root {}` — which never matches
34
+ * `<html>` at runtime — even though Angular's docs claim `:root` is
35
+ * preserved. Runtime injection sidesteps encapsulation entirely and works
36
+ * uniformly across every chat surface (overlay, embed, full-page) and
37
+ * every host (MJExplorer, custom apps).
38
+ */
39
+ const CHAT_TOKENS_CSS = `
40
+ :root {
41
+ /* ===== Bubbles ===== */
42
+ --mj-chat-bubble-user-bg: var(--mj-brand-primary);
43
+ --mj-chat-bubble-user-text: var(--mj-text-inverse);
44
+ --mj-chat-bubble-agent-bg: var(--mj-bg-surface-card);
45
+ --mj-chat-bubble-agent-text: var(--mj-text-primary);
46
+
47
+ /* ===== Composer ===== */
48
+ --mj-chat-composer-bg: var(--mj-bg-surface);
49
+ --mj-chat-composer-border: var(--mj-border-default);
50
+
51
+ /* ===== Character / persona ===== */
52
+ --mj-chat-character-accent: var(--mj-brand-primary);
53
+ --mj-chat-presence-pulse-color: var(--mj-brand-primary);
54
+
55
+ /* ===== Voice state (PR #2787 — bridged to RealtimeSessionService) ===== */
56
+ --mj-chat-voice-listening: var(--mj-status-info);
57
+ --mj-chat-voice-thinking: var(--mj-status-warning);
58
+ --mj-chat-voice-speaking: var(--mj-brand-primary);
59
+ }
60
+ `.trim();
61
+ /** Marker on the <style> element so we don't double-inject if the bootstrap is constructed more than once. */
62
+ const CHAT_TOKENS_STYLE_ID = 'mj-chat-tokens';
63
+ export class ConversationsRuntimeBootstrap {
64
+ constructor(activeTasks, voice) {
65
+ const runtime = ConversationsRuntime.Instance;
66
+ // INotificationAdapter — bridge to MJNotificationService.CreateSimpleNotification.
67
+ // Our NotificationLevel ('info' | 'success' | 'warning' | 'error') maps directly
68
+ // to MJNotificationService's style values, so no translation is needed.
69
+ runtime.UseNotificationAdapter({
70
+ Notify: (level, message, ttlMs) => {
71
+ MJNotificationService.Instance?.CreateSimpleNotification(message, level, ttlMs ?? 5_000);
72
+ },
73
+ });
74
+ // IActiveTaskTracker — bridge to ActiveTasksService.removeByAgentRunId.
75
+ runtime.UseActiveTaskTracker({
76
+ RemoveByAgentRunId: (agentRunId) => activeTasks.removeByAgentRunId(agentRunId),
77
+ });
78
+ // ISessionsAdapter — bridge RealtimeSessionService's lifecycle observables
79
+ // (SessionStarted$ / ActiveChannels$ / SessionEnded$) into the runtime's
80
+ // framework-agnostic SessionsObserver. See RealtimeSessionsAdapter docs for
81
+ // the why-an-adapter design rationale.
82
+ runtime.UseSessionsAdapter(new RealtimeSessionsAdapter(voice));
83
+ // Inject the chat-token CSS into the document <head> exactly once.
84
+ // Guarded against SSR (no `document` global) and double-injection.
85
+ this.injectChatTokens();
86
+ }
87
+ injectChatTokens() {
88
+ if (typeof document === 'undefined')
89
+ return;
90
+ if (document.getElementById(CHAT_TOKENS_STYLE_ID))
91
+ return;
92
+ const styleEl = document.createElement('style');
93
+ styleEl.id = CHAT_TOKENS_STYLE_ID;
94
+ styleEl.textContent = CHAT_TOKENS_CSS;
95
+ document.head.appendChild(styleEl);
96
+ }
97
+ static ɵfac = function ConversationsRuntimeBootstrap_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || ConversationsRuntimeBootstrap)(i0.ɵɵinject(i1.ActiveTasksService), i0.ɵɵinject(i2.RealtimeSessionService)); };
98
+ static ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: ConversationsRuntimeBootstrap, factory: ConversationsRuntimeBootstrap.ɵfac, providedIn: 'root' });
99
+ }
100
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ConversationsRuntimeBootstrap, [{
101
+ type: Injectable,
102
+ args: [{ providedIn: 'root' }]
103
+ }], () => [{ type: i1.ActiveTasksService }, { type: i2.RealtimeSessionService }], null); })();
104
+ //# sourceMappingURL=conversations-runtime-bootstrap.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversations-runtime-bootstrap.service.js","sourceRoot":"","sources":["../../../src/lib/services/conversations-runtime-bootstrap.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,oBAAoB,EAAE,MAAM,uCAAuC,CAAC;AAC7E,OAAO,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AAIzE,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;;;;AAEtE;;;;;;;;;;;;;;GAcG;AACH,MAAM,eAAe,GAAG;;;;;;;;;;;;;;;;;;;;;CAqBvB,CAAC,IAAI,EAAE,CAAC;AAET,8GAA8G;AAC9G,MAAM,oBAAoB,GAAG,gBAAgB,CAAC;AAG9C,MAAM,OAAO,6BAA6B;IACtC,YAAY,WAA+B,EAAE,KAA6B;QACtE,MAAM,OAAO,GAAG,oBAAoB,CAAC,QAAQ,CAAC;QAE9C,mFAAmF;QACnF,iFAAiF;QACjF,wEAAwE;QACxE,OAAO,CAAC,sBAAsB,CAAC;YAC3B,MAAM,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;gBAC9B,qBAAqB,CAAC,QAAQ,EAAE,wBAAwB,CACpD,OAAO,EACP,KAAK,EACL,KAAK,IAAI,KAAK,CACjB,CAAC;YACN,CAAC;SACJ,CAAC,CAAC;QAEH,wEAAwE;QACxE,OAAO,CAAC,oBAAoB,CAAC;YACzB,kBAAkB,EAAE,CAAC,UAAU,EAAE,EAAE,CAAC,WAAW,CAAC,kBAAkB,CAAC,UAAU,CAAC;SACjF,CAAC,CAAC;QAEH,2EAA2E;QAC3E,yEAAyE;QACzE,4EAA4E;QAC5E,uCAAuC;QACvC,OAAO,CAAC,kBAAkB,CAAC,IAAI,uBAAuB,CAAC,KAAK,CAAC,CAAC,CAAC;QAE/D,mEAAmE;QACnE,mEAAmE;QACnE,IAAI,CAAC,gBAAgB,EAAE,CAAC;IAC5B,CAAC;IAEO,gBAAgB;QACpB,IAAI,OAAO,QAAQ,KAAK,WAAW;YAAE,OAAO;QAC5C,IAAI,QAAQ,CAAC,cAAc,CAAC,oBAAoB,CAAC;YAAE,OAAO;QAE1D,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QAChD,OAAO,CAAC,EAAE,GAAG,oBAAoB,CAAC;QAClC,OAAO,CAAC,WAAW,GAAG,eAAe,CAAC;QACtC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IACvC,CAAC;uHAzCQ,6BAA6B;gEAA7B,6BAA6B,WAA7B,6BAA6B,mBADhB,MAAM;;iFACnB,6BAA6B;cADzC,UAAU;eAAC,EAAE,UAAU,EAAE,MAAM,EAAE","sourcesContent":["/**\n * @fileoverview Wires the framework-agnostic `@memberjunction/conversations-runtime`\n * to the Angular host's UI services at module bootstrap.\n *\n * The runtime knows nothing about Angular — it surfaces user-facing messages\n * through `INotificationAdapter` and clears running tasks through\n * `IActiveTaskTracker`. This service implements both adapters using MJ's\n * Angular notification + active-task services and registers them on the runtime\n * at first injection.\n *\n * Each Angular DI shim service (ConversationAgentService, ConversationStreamingService,\n * etc.) takes `ConversationsRuntimeBootstrap` as a constructor dependency so the\n * adapters are guaranteed registered before any shim method is called. Because\n * the bootstrap is `providedIn: 'root'`, the registration happens exactly once\n * per app, on the first injection of any shim.\n */\n\nimport { Injectable } from '@angular/core';\nimport { ConversationsRuntime } from '@memberjunction/conversations-runtime';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\n\nimport { ActiveTasksService } from './active-tasks.service';\nimport { RealtimeSessionService } from './realtime-session.service';\nimport { RealtimeSessionsAdapter } from './realtime-sessions-adapter';\n\n/**\n * Document-level `--mj-chat-*` design tokens. Each token defaults to a\n * semantic `--mj-*` token from MJ's design system so the chat surface\n * adapts to light/dark mode automatically. Consumers override these (in\n * their own `:root {}` or a scoped selector) to theme the chat without\n * touching MJ's underlying semantic tokens.\n *\n * Injected at runtime via `<style>` rather than carried via Angular\n * `styleUrls` because Angular's emulated view encapsulation rewrites\n * `:root {}` selectors into `[_ngcontent-…]:root {}` — which never matches\n * `<html>` at runtime — even though Angular's docs claim `:root` is\n * preserved. Runtime injection sidesteps encapsulation entirely and works\n * uniformly across every chat surface (overlay, embed, full-page) and\n * every host (MJExplorer, custom apps).\n */\nconst CHAT_TOKENS_CSS = `\n:root {\n /* ===== Bubbles ===== */\n --mj-chat-bubble-user-bg: var(--mj-brand-primary);\n --mj-chat-bubble-user-text: var(--mj-text-inverse);\n --mj-chat-bubble-agent-bg: var(--mj-bg-surface-card);\n --mj-chat-bubble-agent-text: var(--mj-text-primary);\n\n /* ===== Composer ===== */\n --mj-chat-composer-bg: var(--mj-bg-surface);\n --mj-chat-composer-border: var(--mj-border-default);\n\n /* ===== Character / persona ===== */\n --mj-chat-character-accent: var(--mj-brand-primary);\n --mj-chat-presence-pulse-color: var(--mj-brand-primary);\n\n /* ===== Voice state (PR #2787 — bridged to RealtimeSessionService) ===== */\n --mj-chat-voice-listening: var(--mj-status-info);\n --mj-chat-voice-thinking: var(--mj-status-warning);\n --mj-chat-voice-speaking: var(--mj-brand-primary);\n}\n`.trim();\n\n/** Marker on the <style> element so we don't double-inject if the bootstrap is constructed more than once. */\nconst CHAT_TOKENS_STYLE_ID = 'mj-chat-tokens';\n\n@Injectable({ providedIn: 'root' })\nexport class ConversationsRuntimeBootstrap {\n constructor(activeTasks: ActiveTasksService, voice: RealtimeSessionService) {\n const runtime = ConversationsRuntime.Instance;\n\n // INotificationAdapter — bridge to MJNotificationService.CreateSimpleNotification.\n // Our NotificationLevel ('info' | 'success' | 'warning' | 'error') maps directly\n // to MJNotificationService's style values, so no translation is needed.\n runtime.UseNotificationAdapter({\n Notify: (level, message, ttlMs) => {\n MJNotificationService.Instance?.CreateSimpleNotification(\n message,\n level,\n ttlMs ?? 5_000\n );\n },\n });\n\n // IActiveTaskTracker — bridge to ActiveTasksService.removeByAgentRunId.\n runtime.UseActiveTaskTracker({\n RemoveByAgentRunId: (agentRunId) => activeTasks.removeByAgentRunId(agentRunId),\n });\n\n // ISessionsAdapter — bridge RealtimeSessionService's lifecycle observables\n // (SessionStarted$ / ActiveChannels$ / SessionEnded$) into the runtime's\n // framework-agnostic SessionsObserver. See RealtimeSessionsAdapter docs for\n // the why-an-adapter design rationale.\n runtime.UseSessionsAdapter(new RealtimeSessionsAdapter(voice));\n\n // Inject the chat-token CSS into the document <head> exactly once.\n // Guarded against SSR (no `document` global) and double-injection.\n this.injectChatTokens();\n }\n\n private injectChatTokens(): void {\n if (typeof document === 'undefined') return;\n if (document.getElementById(CHAT_TOKENS_STYLE_ID)) return;\n\n const styleEl = document.createElement('style');\n styleEl.id = CHAT_TOKENS_STYLE_ID;\n styleEl.textContent = CHAT_TOKENS_CSS;\n document.head.appendChild(styleEl);\n }\n}\n"]}