@memberjunction/ng-conversations 5.40.1 → 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 +1 @@
1
- {"version":3,"file":"conversation-agent.service.js","sourceRoot":"","sources":["../../../src/lib/services/conversation-agent.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { Injectable } from '@angular/core';\nimport { BehaviorSubject, Observable } from 'rxjs';\nimport { Metadata, RunView, IMetadataProvider } from '@memberjunction/core';\nimport { GraphQLDataProvider, GraphQLAIClient } from '@memberjunction/graphql-dataprovider';\nimport { ExecuteAgentResult, AgentExecutionProgressCallback, ConversationUtility } from '@memberjunction/ai-core-plus';\nimport { ChatMessage, ChatMessageContent } from '@memberjunction/ai';\nimport { AIEngineBase, AIAgentPermissionHelper } from '@memberjunction/ai-engine-base';\nimport { MJConversationDetailEntity, MJConversationDetailArtifactEntity, MJArtifactVersionEntity } from '@memberjunction/core-entities';\nimport { MJAIAgentEntityExtended, MJAIAgentRunEntityExtended } from \"@memberjunction/ai-core-plus\";\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\nimport { AgentClientService } from '@memberjunction/ng-agent-client';\nimport { RunAgentFromConversationDetailParams } from '@memberjunction/ai-agent-client';\nimport { LazyArtifactInfo } from '../models/lazy-artifact-info';\nimport { MentionParserService } from './mention-parser.service';\nimport { UUIDsEqual } from '@memberjunction/global';\n\n/**\n * Context for artifact lookups - provides pre-loaded data from conversation\n * to avoid redundant database queries\n */\nexport interface ArtifactLookupContext {\n agentRunsByDetailId: Map<string, MJAIAgentRunEntityExtended>;\n artifactsByDetailId: Map<string, LazyArtifactInfo[]>;\n}\n\n/**\n * Result from intent check - indicates whether to continue with agent\n * and which artifact version to use as payload\n */\nexport interface IntentCheckResult {\n decision: 'YES' | 'NO' | 'UNSURE';\n reasoning: string;\n targetArtifactVersionId?: string;\n}\n\n/**\n * Service for managing agent interactions within conversations.\n * Handles communication with the ambient Sage Agent and other agents.\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class ConversationAgentService {\n /** GraphQL AI client - retained for RunAIPrompt (intent checking) which AgentClientService doesn't wrap */\n private _aiClient: GraphQLAIClient | null = null;\n private _conversationManagerAgent: MJAIAgentEntityExtended | null = null;\n private _sessionIds: Map<string, string> = new Map(); // conversationId -> sessionId\n private _isProcessing$ = new BehaviorSubject<boolean>(false);\n\n /**\n * Observable indicating if the ambient agent is currently processing\n */\n public readonly isProcessing$: Observable<boolean> = this._isProcessing$.asObservable();\n\n private _provider: IMetadataProvider | null = null;\n\n constructor(\n private mentionParser: MentionParserService,\n private agentClientService: AgentClientService\n ) {\n this.initializeAIClient();\n }\n\n /**\n * The metadata provider this service uses. When unset, falls back to Metadata.Provider.\n * Setting it re-initializes the AI client to bind to the supplied provider.\n */\n public get Provider(): IMetadataProvider {\n return this._provider ?? Metadata.Provider;\n }\n public set Provider(value: IMetadataProvider | null) {\n this._provider = value;\n this.initializeAIClient();\n }\n\n /**\n * Initialize the GraphQL AI Client.\n * Retained for RunAIPrompt calls (intent checking) which the AgentClientService doesn't wrap.\n * Agent execution (RunAIAgentFromConversationDetail) now goes through AgentClientService.\n */\n private initializeAIClient(): void {\n try {\n const provider = this.Provider as GraphQLDataProvider;\n if (provider) {\n this._aiClient = new GraphQLAIClient(provider);\n } else {\n console.warn('GraphQLDataProvider not available, agent functionality will be limited');\n }\n } catch (error) {\n console.error('Failed to initialize GraphQL AI Client:', error);\n }\n }\n\n /**\n * Get or load the Sage Agent (formerly Conversation Manager Agent)\n */\n public async getConversationManagerAgent(): Promise<MJAIAgentEntityExtended | null> {\n if (this._conversationManagerAgent) {\n return this._conversationManagerAgent;\n }\n\n try {\n // Ensure AIEngineBase is configured\n await AIEngineBase.Instance.Config(false);\n\n // Find the Sage Agent\n const agents = AIEngineBase.Instance.Agents;\n this._conversationManagerAgent = agents.find(\n (agent: MJAIAgentEntityExtended) => agent.Name === 'Sage'\n ) || null;\n\n if (!this._conversationManagerAgent) {\n const errorMsg = 'Sage Agent not found in AIEngineBase.Agents';\n console.warn(errorMsg);\n MJNotificationService.Instance?.CreateSimpleNotification(errorMsg, 'error', 5000);\n }\n\n return this._conversationManagerAgent;\n } catch (error) {\n const errorMsg = 'Error loading Sage Agent: ' + (error instanceof Error ? error.message : String(error));\n console.error('Error loading Sage Agent:', error);\n MJNotificationService.Instance?.CreateSimpleNotification(errorMsg, 'error', 5000);\n return null;\n }\n }\n\n\n /**\n * Process a message through the ambient Sage Agent.\n * This should be called for every message sent in a conversation.\n *\n * Uses the optimized RunAIAgentFromConversationDetail mutation which loads\n * conversation history (including attachments) server-side for better performance.\n *\n * @param conversationId The conversation ID\n * @param message The message that was just sent\n * @param conversationHistory Recent messages in the conversation for context (kept for backwards compatibility but not used)\n * @param conversationDetailId The ID of the conversation detail record to link to the agent run\n * @param onProgress Optional callback for receiving progress updates during execution\n * @returns The agent's response, or null if the agent chooses not to respond\n */\n async processMessage(\n conversationId: string,\n message: MJConversationDetailEntity,\n conversationHistory: MJConversationDetailEntity[],\n conversationDetailId: string,\n onProgress?: AgentExecutionProgressCallback,\n appContext?: Record<string, unknown> | null\n ): Promise<ExecuteAgentResult | null> {\n // Don't process if user is tagging someone else (future enhancement)\n // For now, we'll always send to the ambient agent\n\n const agent = await this.getConversationManagerAgent();\n if (!agent || !agent.ID) {\n const errorMsg = 'Sage Agent not available';\n console.warn(errorMsg);\n MJNotificationService.Instance?.CreateSimpleNotification(errorMsg, 'warning', 5000);\n return null;\n }\n\n try {\n // Indicate agent is processing\n this._isProcessing$.next(true);\n\n // Get current user for permission filtering\n const currentUser = this.Provider.CurrentUser;\n if (!currentUser) {\n console.warn('⚠️ No current user available for permission filtering, using unfiltered agents');\n }\n\n // Filter agents by status and hierarchy first\n const candidateAgents = AIEngineBase.Instance.Agents.filter(\n a => !UUIDsEqual(a.ID, agent.ID) &&\n !a.ParentID &&\n a.Status === 'Active' &&\n a.InvocationMode !== 'Sub-Agent' // ensure that the agent is intended to run as top-level\n );\n\n // Filter by user permissions if user context available\n const availAgents = currentUser\n ? await this.filterAgentsByPermissions(candidateAgents, currentUser)\n : candidateAgents;\n\n console.log(`📋 Available agents for Sage: ${availAgents.length} (filtered from ${candidateAgents.length} candidates)`);\n\n // Use AgentClientService which wraps GraphQLAIClient.RunAIAgentFromConversationDetail\n // and automatically integrates with client tool request handling\n const agentParams: RunAgentFromConversationDetailParams = {\n ConversationDetailId: conversationDetailId,\n AgentId: agent.ID,\n MaxHistoryMessages: 20,\n Data: {\n ALL_AVAILABLE_AGENTS: availAgents.map(a => ({\n ID: a.ID,\n Name: a.Name,\n Description: a.Description\n })),\n conversationId: conversationId,\n latestMessageId: message.ID,\n ...(appContext ? { appContext } : {}),\n // Include all registered client tools so the LLM sees them in the prompt.\n // These are ephemeral tools registered by the client app (CopyToClipboard, etc.)\n // that supplement the metadata-defined tools from the junction table.\n clientTools: this.agentClientService.GetRegisteredTools().map(t => ({\n Name: t.Name,\n Description: t.Description,\n InputSchema: t.ParameterSchema\n }))\n },\n CreateArtifacts: true,\n CreateNotification: true,\n OnProgress: onProgress ? (progress) => {\n onProgress({\n step: progress.CurrentStep as 'initialization' | 'validation' | 'prompt_execution' | 'action_execution' | 'subagent_execution' | 'decision_processing' | 'finalization',\n percentage: progress.Percentage,\n message: progress.Message,\n metadata: progress.Metadata\n });\n } : undefined\n };\n\n const runResult = await this.agentClientService.RunAgentFromConversationDetail(agentParams);\n\n // Unwrap RunAgentResult to get the original ExecuteAgentResult\n if (runResult.Success && runResult.Result) {\n return runResult.Result as ExecuteAgentResult;\n } else if (!runResult.Success) {\n const errorMsg = runResult.ErrorMessage || 'Agent execution failed';\n console.error('Agent execution failed:', errorMsg);\n MJNotificationService.Instance?.CreateSimpleNotification(errorMsg, 'error', 5000);\n return null;\n }\n\n return null;\n } catch (error) {\n const errorMsg = 'Error processing message through agent: ' + (error instanceof Error ? error.message : String(error));\n console.error('Error processing message through agent:', error);\n MJNotificationService.Instance?.CreateSimpleNotification(errorMsg, 'error', 5000);\n return null;\n } finally {\n // Always clear processing state\n this._isProcessing$.next(false);\n }\n }\n\n /**\n * Find the configuration preset ID from a previous @mention of an agent in conversation history.\n * Searches backwards through User messages to find the most recent @mention of the specified agent\n * that includes a configId.\n *\n * @param agentId The agent ID to search for\n * @param conversationHistory The conversation history to search through\n * @returns The configuration preset ID if found, undefined otherwise\n */\n public findConfigurationPresetFromHistory(\n agentId: string,\n conversationHistory: MJConversationDetailEntity[]\n ): string | undefined {\n // Search backwards through history for User messages that @mention this agent with a configId\n const userMentionWithConfig = conversationHistory\n .slice()\n .reverse()\n .find(msg => {\n if (msg.Role !== 'User' || !msg.Message) return false;\n // Parse the message to check for an @mention of this agent with a configId\n const mentionResult = this.mentionParser.parseMentions(\n msg.Message,\n AIEngineBase.Instance.Agents,\n []\n );\n return mentionResult.agentMention?.id === agentId && mentionResult.agentMention?.configurationId;\n });\n\n if (userMentionWithConfig) {\n const mentionResult = this.mentionParser.parseMentions(\n userMentionWithConfig.Message,\n AIEngineBase.Instance.Agents,\n []\n );\n if (mentionResult.agentMention?.configurationId) {\n console.log(`🎯 Found configuration preset from @mention: ${mentionResult.agentMention.configurationId}`);\n return mentionResult.agentMention.configurationId;\n }\n }\n\n return undefined;\n }\n\n /**\n * Build the message array for the agent from conversation history.\n * Note: conversationHistory already includes the current message, so we don't add it separately.\n * IMPORTANT: This method loads artifacts and attachments for each message.\n *\n * @deprecated This method is no longer used by processMessage() which now uses the optimized\n * RunAIAgentFromConversationDetail mutation that loads history server-side. Kept for backwards\n * compatibility with other callers that may need client-side message building.\n */\n private async buildAgentMessages(\n history: MJConversationDetailEntity[]\n ): Promise<ChatMessage[]> {\n const messages: ChatMessage[] = [];\n\n // Add historical messages (limit to recent context, e.g., last 20 messages)\n // History already includes the current message from the caller\n const recentHistory = history.slice(-20);\n\n // Get IDs of all messages in history\n const messageIds = recentHistory.map(msg => msg.ID).filter(id => id); // Filter out any undefined IDs\n\n // Create lookup maps\n const artifactsByDetailId = new Map<string, string[]>(); // DetailID -> array of artifact JSON strings\n // attachmentsByDetailId removed — artifact junction is the single source of truth\n // after the backfill migration. Multimodal content handled server-side.\n\n if (messageIds.length > 0) {\n const rv = RunView.FromMetadataProvider(this.Provider);\n\n // Load artifacts for messages. Since the backfill migration\n // (V202605271400__Backfill_Attachment_Artifacts) converted all legacy\n // ConversationDetailAttachment rows to artifact pairs, the artifact\n // junction is the single source of truth. Multimodal content (images,\n // audio, video) is handled server-side by the resolver's artifact path.\n const artifactsLoaded = await this.loadArtifactsForMessages(rv, messageIds, artifactsByDetailId);\n\n if (artifactsLoaded) {\n console.log(`📦 Loaded ${artifactsByDetailId.size} artifact groups for ${messageIds.length} messages`);\n }\n }\n\n // Build messages with artifact context\n for (const msg of recentHistory) {\n const messageText = msg.Message || '';\n const artifacts = artifactsByDetailId.get(msg.ID);\n\n let content: ChatMessageContent = messageText;\n\n if (artifacts && artifacts.length > 0) {\n for (const artifactJson of artifacts) {\n content += `\\n\\n# Artifact\\n${artifactJson}\\n`;\n }\n }\n\n messages.push({\n role: this.mapRoleToAgentRole(msg.Role) as 'system' | 'user' | 'assistant',\n content: content\n });\n }\n\n return messages;\n }\n\n /**\n * Load artifacts for messages (OUTPUT direction only)\n */\n private async loadArtifactsForMessages(\n rv: RunView,\n messageIds: string[],\n artifactsByDetailId: Map<string, string[]>\n ): Promise<boolean> {\n try {\n const junctionResult = await rv.RunView<MJConversationDetailArtifactEntity>({\n EntityName: 'MJ: Conversation Detail Artifacts',\n ExtraFilter: `ConversationDetailID IN ('${messageIds.join(\"','\")}') AND Direction='Output'`,\n ResultType: 'entity_object'\n });\n\n if (junctionResult.Success && junctionResult.Results && junctionResult.Results.length > 0) {\n // Collect unique version IDs\n const versionIds = new Set<string>();\n for (const junction of junctionResult.Results) {\n versionIds.add(junction.ArtifactVersionID);\n }\n\n // Batch load all artifact versions\n const versionResult = await rv.RunView<MJArtifactVersionEntity>({\n EntityName: 'MJ: Artifact Versions',\n ExtraFilter: `ID IN ('${Array.from(versionIds).join(\"','\")}')`,\n ResultType: 'entity_object'\n });\n\n if (versionResult.Success && versionResult.Results) {\n const versionMap = new Map(versionResult.Results.map(v => [v.ID, v]));\n\n for (const junction of junctionResult.Results) {\n const version = versionMap.get(junction.ArtifactVersionID);\n if (version && version.Content) {\n const existing = artifactsByDetailId.get(junction.ConversationDetailID) || [];\n existing.push(version.Content);\n artifactsByDetailId.set(junction.ConversationDetailID, existing);\n }\n }\n return true;\n }\n }\n } catch (error) {\n console.error('Error loading artifacts for conversation context:', error);\n }\n return false;\n }\n\n /**\n * Map ConversationDetail Role to agent message role\n */\n private mapRoleToAgentRole(role: string): string {\n const roleLower = (role || '').toLowerCase();\n if (roleLower === 'user') return 'user';\n if (roleLower === 'assistant' || roleLower === 'agent') return 'assistant';\n return 'user'; // Default to user\n }\n\n /**\n * Check if a message is tagging another user or agent.\n * Returns true if the message contains @mentions that are NOT the ambient agent.\n * Future enhancement: parse @mentions and determine if ambient agent should process.\n */\n private isTaggingOthers(message: string): boolean {\n // Future implementation: check for @mentions\n // For now, always return false (always process through ambient agent)\n return false;\n }\n\n /**\n * Invoke a sub-agent based on Sage Agent's payload.\n * This is called when Sage decides to delegate to a specialist agent.\n *\n * @param agentName Name of the agent to invoke\n * @param conversationId The conversation ID\n * @param message The user message that triggered this\n * @param conversationHistory Recent conversation history for context\n * @param reasoning Why this agent is being invoked\n * @param conversationDetailId The ID of the conversation detail record to link to the agent run\n * @param payload Optional payload to pass to the agent (e.g., previous OUTPUT artifact for continuity)\n * @param onProgress Optional callback for receiving progress updates during execution\n * @param sourceArtifactId Optional source artifact ID for versioning\n * @param sourceArtifactVersionId Optional source artifact version ID for versioning\n * @param agentConfigurationPresetId Optional ID of the AIAgentConfiguration preset (will be mapped to AIConfigurationID)\n * @returns The agent's execution result, or null if agent not found\n */\n async invokeSubAgent(\n agentName: string,\n conversationId: string,\n message: MJConversationDetailEntity,\n conversationHistory: MJConversationDetailEntity[],\n reasoning: string,\n conversationDetailId: string,\n payload?: unknown,\n onProgress?: AgentExecutionProgressCallback,\n sourceArtifactId?: string,\n sourceArtifactVersionId?: string,\n agentConfigurationPresetId?: string,\n appContext?: Record<string, unknown> | null\n ): Promise<ExecuteAgentResult | null> {\n try {\n // Ensure AIEngineBase is configured\n await AIEngineBase.Instance.Config(false);\n\n // Find the agent by name\n const agent = AIEngineBase.Instance.Agents.find(a => a.Name === agentName);\n\n if (!agent || !agent.ID) {\n const errorMsg = `Sub-agent \"${agentName}\" not found`;\n console.warn(`${errorMsg}`);\n MJNotificationService.Instance?.CreateSimpleNotification(errorMsg, 'error', 5000);\n return null;\n }\n\n console.log(`Invoking sub-agent: ${agentName}`, { reasoning, hasPayload: !!payload, hasConfigPreset: !!agentConfigurationPresetId });\n\n // Map AIAgentConfiguration preset ID to actual AIConfiguration ID\n let aiConfigurationId: string | undefined = undefined;\n if (agentConfigurationPresetId) {\n // Get the preset from AIEngineBase to extract the AIConfigurationID\n const presets = AIEngineBase.Instance.GetAgentConfigurationPresets(agent.ID, false);\n // check by preset ID or AIConfigurationID - since sometimes we have the actual\n // configuration ID. Since both UUID no collisions should ever be possible.\n const preset = presets.find(p => UUIDsEqual(p.ID, agentConfigurationPresetId) || UUIDsEqual(p.AIConfigurationID, agentConfigurationPresetId));\n\n if (preset) {\n aiConfigurationId = preset.AIConfigurationID || undefined;\n console.log(`Mapped agent configuration preset \"${preset.Name}\" to AIConfigurationID: ${aiConfigurationId || 'default'}`);\n } else {\n console.warn(`Agent configuration preset ${agentConfigurationPresetId} not found for agent ${agent.ID}`);\n }\n }\n\n // Use AgentClientService which wraps GraphQLAIClient.RunAIAgentFromConversationDetail\n // and integrates with client tool request handling\n const agentParams: RunAgentFromConversationDetailParams = {\n ConversationDetailId: conversationDetailId,\n AgentId: agent.ID,\n MaxHistoryMessages: 20,\n Data: {\n conversationId: conversationId,\n latestMessageId: message.ID,\n invocationReason: reasoning,\n // Pass the embedder's appContext through to the agent runtime\n // so direct-routed sub-agents (e.g. Form Builder invoked via the\n // cockpit's `defaultAgentId`) see the same `appContext` block in\n // their system prompt that Sage-routed agents do. Without this,\n // the ActiveForm/Schema/OverrideID context the embedder\n // assembles is dropped on the floor for direct routing.\n ...(appContext ? { appContext } : {}),\n },\n ...(payload ? { Payload: payload as Record<string, unknown> } : {}),\n ...(aiConfigurationId ? { ConfigurationId: aiConfigurationId } : {}),\n CreateArtifacts: true,\n CreateNotification: true,\n SourceArtifactId: sourceArtifactId,\n SourceArtifactVersionId: sourceArtifactVersionId,\n OnProgress: onProgress ? (progress) => {\n onProgress({\n step: progress.CurrentStep as 'initialization' | 'validation' | 'prompt_execution' | 'action_execution' | 'subagent_execution' | 'decision_processing' | 'finalization',\n percentage: progress.Percentage,\n message: progress.Message,\n metadata: progress.Metadata\n });\n } : undefined\n };\n\n const runResult = await this.agentClientService.RunAgentFromConversationDetail(agentParams);\n\n // Unwrap RunAgentResult to get the original ExecuteAgentResult\n if (runResult.Success && runResult.Result) {\n return runResult.Result as ExecuteAgentResult;\n } else if (!runResult.Success) {\n const errorMsg = `Sub-agent \"${agentName}\" failed: ${runResult.ErrorMessage || 'unknown error'}`;\n console.error(errorMsg);\n MJNotificationService.Instance?.CreateSimpleNotification(errorMsg, 'error', 5000);\n return null;\n }\n\n return null;\n } catch (error) {\n const errorMsg = `Error invoking sub-agent \"${agentName}\": ` + (error instanceof Error ? error.message : String(error));\n console.error(`Error invoking sub-agent \"${agentName}\":`, error);\n MJNotificationService.Instance?.CreateSimpleNotification(errorMsg, 'error', 5000);\n return null;\n }\n }\n\n /**\n * Check if user's latest message should continue with the previous agent or route through Sage.\n * Uses fast inference (<500ms) to determine intent and avoid unnecessary Sage overhead.\n *\n * @param agentId The ID of the previous agent\n * @param latestMessage The user's new message\n * @param conversationHistory Recent conversation history for context (last 10 messages)\n * @param context Pre-loaded artifact and agent run data to avoid database queries\n * @returns IntentCheckResult with decision, reasoning, and optional target artifact version\n */\n async checkAgentContinuityIntent(\n agentId: string,\n latestMessage: string,\n conversationHistory: MJConversationDetailEntity[],\n context: ArtifactLookupContext\n ): Promise<IntentCheckResult> {\n if (!this._aiClient) {\n console.warn('AI Client not initialized, defaulting to UNSURE for intent check');\n return { decision: 'UNSURE', reasoning: 'AI Client not initialized' };\n }\n\n try {\n // Load the Check Sage Intent prompt\n await AIEngineBase.Instance.Config(false);\n const prompt = AIEngineBase.Instance.Prompts.find(p => p.Name === 'Check Sage Intent');\n if (!prompt) {\n console.warn('⚠️ Check Sage Intent prompt not found, defaulting to UNSURE');\n return { decision: 'UNSURE', reasoning: 'Check Sage Intent prompt not found' };\n }\n\n // Get agent details\n const agent = AIEngineBase.Instance.Agents.find(a => UUIDsEqual(a.ID, agentId));\n if (!agent) {\n console.warn('⚠️ Previous agent not found, defaulting to UNSURE');\n return { decision: 'UNSURE', reasoning: 'Previous agent not found' };\n }\n\n // Find all artifacts from this agent in this conversation\n const agentArtifacts = this.findAllAgentArtifacts(\n agentId,\n conversationHistory,\n context\n );\n\n // Build compact conversation history (last 10 messages)\n const recentHistory = conversationHistory.slice(-10);\n const compactHistory = recentHistory.map((msg, idx) => {\n const role = msg.Role === 'User' ? 'User' : agent.Name || 'Agent';\n const content = msg.Message || '';\n return `${idx + 1}. ${role}: ${content.substring(0, 150)}${content.length > 150 ? '...' : ''}`;\n }).join('\\n');\n\n // Build artifact context if available\n let artifactContext = '';\n if (agentArtifacts.length > 0) {\n artifactContext = '\\n\\n**Prior Artifacts Created by This Agent**:\\n';\n agentArtifacts.forEach((artifact, idx) => {\n artifactContext += `${idx + 1}. ${artifact.artifactName} (${artifact.artifactType})\\n`;\n artifactContext += ` - Versions: ${artifact.versions.length}\\n`;\n if (artifact.versions.length > 0) {\n artifactContext += ` - Latest: v${artifact.versions[0].versionNumber}`;\n if (artifact.versions[0].versionName) {\n artifactContext += ` - ${artifact.versions[0].versionName}`;\n }\n artifactContext += '\\n';\n }\n });\n }\n\n // Build user message with context\n const userMessage = `**Previous Agent**: ${agent.Name} - ${agent.Description || 'No description'}\n\n**Conversation History** (last ${recentHistory.length} messages):\n${compactHistory}${artifactContext}\n\n**Latest User Message**: \"${latestMessage}\"`;\n\n console.log('🔍 Checking agent continuity intent...', {\n agentName: agent.Name,\n messagePreview: latestMessage.substring(0, 50),\n artifactCount: agentArtifacts.length\n });\n\n // Run the prompt with artifact data included\n const result = await this._aiClient.RunAIPrompt({\n promptId: prompt.ID,\n messages: [{ role: 'user', content: userMessage }],\n data: {\n hasPriorArtifact: agentArtifacts.length > 0,\n priorArtifacts: agentArtifacts\n }\n });\n\n if (result && result.success && (result.parsedResult || result.output)) {\n const parsed = result.parsedResult ||\n (result.output ? JSON.parse(result.output) : null);\n\n if (parsed && parsed.continuesWith) {\n const decision = parsed.continuesWith.toUpperCase();\n const reasoning = parsed.reasoning || 'No reasoning provided';\n const targetArtifactVersionId = parsed.targetArtifactVersionId || undefined;\n\n console.log(`✅ Intent check result: ${decision}`, {\n reasoning,\n targetArtifactVersionId,\n latency: result.executionTimeMs || 'unknown'\n });\n\n // Validate the response\n if (decision === 'YES' || decision === 'NO' || decision === 'UNSURE') {\n return {\n decision: decision as 'YES' | 'NO' | 'UNSURE',\n reasoning,\n targetArtifactVersionId\n };\n }\n }\n }\n\n console.warn('⚠️ Intent check failed or returned invalid format, defaulting to UNSURE');\n return { decision: 'UNSURE', reasoning: 'Invalid format from intent check prompt' };\n } catch (error) {\n console.error('❌ Error checking agent continuity intent:', error);\n // On error, default to UNSURE (safer to let Sage evaluate)\n return {\n decision: 'UNSURE',\n reasoning: `Error during intent check: ${error instanceof Error ? error.message : String(error)}`\n };\n }\n }\n\n /**\n * Clear the session for a conversation (useful when starting a new topic)\n */\n clearSession(conversationId: string): void {\n this._sessionIds.delete(conversationId);\n }\n\n /**\n * Filter agents based on user's 'run' permission.\n * Only returns agents that the user has permission to run.\n *\n * @param agents List of candidate agents to filter\n * @param user User to check permissions for\n * @returns Filtered list of agents the user can run\n */\n private async filterAgentsByPermissions(\n agents: MJAIAgentEntityExtended[],\n user: any\n ): Promise<MJAIAgentEntityExtended[]> {\n const permittedAgents: MJAIAgentEntityExtended[] = [];\n\n for (const agent of agents) {\n try {\n const hasPermission = await AIAgentPermissionHelper.HasPermission(\n agent.ID,\n user,\n 'run'\n );\n if (hasPermission) {\n permittedAgents.push(agent);\n }\n } catch (error) {\n console.error(`Error checking permission for agent ${agent.Name}:`, error);\n // On error, exclude agent (fail closed)\n }\n }\n\n return permittedAgents;\n }\n\n /**\n * Find all artifacts created by the specified agent in this conversation.\n * Returns artifacts grouped by artifact with versions, ordered most recent first.\n * Enables LLM to reason about which artifact/version user is referencing.\n *\n * Uses pre-loaded data from ArtifactLookupContext for performance (no database queries).\n */\n private findAllAgentArtifacts(\n agentId: string,\n conversationDetails: MJConversationDetailEntity[],\n context: ArtifactLookupContext\n ): Array<{\n artifactId: string;\n artifactName: string;\n artifactType: string;\n artifactDescription: string | null;\n versions: Array<{\n runId: string;\n versionId: string;\n versionNumber: number;\n versionName: string | null;\n versionDescription: string | null;\n createdAt: Date;\n }>;\n }> {\n const artifactMap = new Map<string, {\n artifactId: string;\n artifactName: string;\n artifactType: string;\n artifactDescription: string | null;\n versions: Array<{\n runId: string;\n versionId: string;\n versionNumber: number;\n versionName: string | null;\n versionDescription: string | null;\n createdAt: Date;\n }>;\n }>();\n\n // Iterate backwards through conversation details (most recent first)\n for (let i = conversationDetails.length - 1; i >= 0; i--) {\n const detail = conversationDetails[i];\n\n // Skip non-AI messages and errors\n if (detail.Role !== 'AI' || detail.Status === 'Error') continue;\n\n // O(1) lookup for agent run from pre-loaded data\n const agentRun = context.agentRunsByDetailId.get(detail.ID);\n if (!agentRun || !UUIDsEqual(agentRun.AgentID, agentId) || agentRun.Status !== 'Completed') {\n continue;\n }\n\n // O(1) lookup for artifacts from pre-loaded data\n const artifacts = context.artifactsByDetailId.get(detail.ID);\n if (!artifacts || artifacts.length === 0) continue;\n\n // Process each artifact\n for (const lazyArtifact of artifacts) {\n const mainArtifactId = lazyArtifact.artifactId;\n\n // Get or create artifact entry\n if (!artifactMap.has(mainArtifactId)) {\n artifactMap.set(mainArtifactId, {\n artifactId: mainArtifactId,\n artifactName: lazyArtifact.artifactName,\n artifactType: lazyArtifact.artifactType,\n artifactDescription: lazyArtifact.artifactDescription || null,\n versions: []\n });\n }\n\n // Add version to artifact\n const artifactEntry = artifactMap.get(mainArtifactId)!;\n artifactEntry.versions.push({\n runId: agentRun.ID,\n versionId: lazyArtifact.artifactVersionId,\n versionNumber: lazyArtifact.versionNumber,\n versionName: lazyArtifact.versionName,\n versionDescription: lazyArtifact.versionDescription,\n createdAt: lazyArtifact.versionCreatedAt\n });\n }\n }\n\n // Convert map to array (most recent artifacts first based on their latest version)\n return Array.from(artifactMap.values()).sort((a, b) => {\n const aLatest = a.versions[0]?.createdAt || new Date(0);\n const bLatest = b.versions[0]?.createdAt || new Date(0);\n return bLatest.getTime() - aLatest.getTime();\n });\n }\n}\n"]}
1
+ {"version":3,"file":"conversation-agent.service.js","sourceRoot":"","sources":["../../../src/lib/services/conversation-agent.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { Injectable } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { Metadata, IMetadataProvider } from '@memberjunction/core';\nimport { GraphQLDataProvider, GraphQLAIClient } from '@memberjunction/graphql-dataprovider';\nimport { ExecuteAgentResult, AgentExecutionProgressCallback } from '@memberjunction/ai-core-plus';\nimport { AIEngineBase } from '@memberjunction/ai-engine-base';\nimport { MJConversationDetailEntity } from '@memberjunction/core-entities';\nimport { MJAIAgentEntityExtended, MJAIAgentRunEntityExtended } from '@memberjunction/ai-core-plus';\nimport { MJNotificationService } from '@memberjunction/ng-notifications';\nimport { AgentClientService } from '@memberjunction/ng-agent-client';\nimport { RunAgentFromConversationDetailParams } from '@memberjunction/ai-agent-client';\nimport { ConversationsRuntime } from '@memberjunction/conversations-runtime';\nimport { LazyArtifactInfo } from '../models/lazy-artifact-info';\nimport { MentionParserService } from './mention-parser.service';\nimport { UUIDsEqual } from '@memberjunction/global';\n\nimport { ConversationsRuntimeBootstrap } from './conversations-runtime-bootstrap.service';\n\n/**\n * Context for artifact lookups - provides pre-loaded data from conversation\n * to avoid redundant database queries\n */\nexport interface ArtifactLookupContext {\n agentRunsByDetailId: Map<string, MJAIAgentRunEntityExtended>;\n artifactsByDetailId: Map<string, LazyArtifactInfo[]>;\n}\n\n/**\n * Result from intent check - indicates whether to continue with agent\n * and which artifact version to use as payload\n */\nexport interface IntentCheckResult {\n decision: 'YES' | 'NO' | 'UNSURE';\n reasoning: string;\n targetArtifactVersionId?: string;\n}\n\n/**\n * Angular DI service for conversation-level agent orchestration.\n *\n * After PR 2 of the conversations-runtime extraction, the core\n * `processMessage` flow and the conversation-manager-agent resolution are\n * delegated to `@memberjunction/conversations-runtime`. This service is\n * primarily a shim for those operations PLUS the holder of the helpers\n * that haven't been ported yet:\n *\n * - `invokeSubAgent(...)` — used by Sage's routing decisions in\n * `message-input.component`.\n * - `checkAgentContinuityIntent(...)` — fast intent classification when the\n * user replies to a previous-agent thread.\n * - `findConfigurationPresetFromHistory(...)` — locates an agent's preset\n * from prior @mentions in the conversation.\n * - `clearSession(...)` — per-conversation session-id bookkeeping.\n *\n * These can move to the runtime in a follow-up; they aren't strictly needed\n * to invoke an agent end-to-end and stay here so the shim has zero behavior\n * difference vs. the original.\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class ConversationAgentService {\n /** GraphQL AI client - retained for RunAIPrompt (intent checking) which AgentClientService doesn't wrap */\n private _aiClient: GraphQLAIClient | null = null;\n /** Cached resolution of the conversation manager agent (default agent). */\n private _conversationManagerAgent: MJAIAgentEntityExtended | null = null;\n private _sessionIds: Map<string, string> = new Map();\n\n /** Observable indicating if the ambient agent is currently processing — delegated to the runtime's AgentRunner. */\n public readonly isProcessing$: Observable<boolean>;\n\n private _provider: IMetadataProvider | null = null;\n\n constructor(\n _bootstrap: ConversationsRuntimeBootstrap,\n private mentionParser: MentionParserService,\n private agentClientService: AgentClientService\n ) {\n // Injecting `_bootstrap` forces the runtime's INotificationAdapter +\n // IActiveTaskTracker adapters to register before any shim method runs.\n this.isProcessing$ = ConversationsRuntime.Instance.AgentRunner.isProcessing$;\n this.initializeAIClient();\n }\n\n /**\n * The metadata provider this service uses. When unset, falls back to Metadata.Provider.\n * Setting it re-initializes the AI client and forwards the provider to the runtime's runner.\n */\n public get Provider(): IMetadataProvider {\n return this._provider ?? Metadata.Provider;\n }\n public set Provider(value: IMetadataProvider | null) {\n this._provider = value;\n this.initializeAIClient();\n ConversationsRuntime.Instance.AgentRunner.Provider = value;\n }\n\n /**\n * Initialize the GraphQL AI Client.\n * Retained for RunAIPrompt calls (intent checking) which the AgentClientService doesn't wrap.\n * Agent execution (RunAIAgentFromConversationDetail) now goes through ConversationsRuntime.AgentRunner.\n */\n private initializeAIClient(): void {\n try {\n const provider = this.Provider as GraphQLDataProvider;\n if (provider) {\n this._aiClient = new GraphQLAIClient(provider);\n } else {\n console.warn('GraphQLDataProvider not available, agent functionality will be limited');\n }\n } catch (error) {\n console.error('Failed to initialize GraphQL AI Client:', error);\n }\n }\n\n /**\n * Resolve the conversation manager agent via the runtime's 4-step\n * DefaultAgentResolver chain (explicit input → app-scoped Application\n * Setting → global Application Setting → code-const Sage fallback). The\n * result is cached on this service for use by the synchronous\n * {@link ConversationManagerAgentName} getter.\n *\n * Existing callers expect a Promise<MJAIAgentEntityExtended | null> — we\n * preserve that shape (returning null on failure rather than throwing)\n * so the call sites don't need to change.\n */\n public async getConversationManagerAgent(): Promise<MJAIAgentEntityExtended | null> {\n if (this._conversationManagerAgent) {\n return this._conversationManagerAgent;\n }\n\n try {\n const provider = this.Provider;\n const agent = await ConversationsRuntime.Instance.DefaultAgent.resolve({\n contextUser: provider.CurrentUser ?? undefined,\n provider,\n });\n this._conversationManagerAgent = agent;\n return agent;\n } catch (error) {\n const errorMsg = 'Error resolving conversation manager agent: ' + (error instanceof Error ? error.message : String(error));\n console.error(errorMsg);\n MJNotificationService.Instance?.CreateSimpleNotification(errorMsg, 'error', 5000);\n return null;\n }\n }\n\n /**\n * Synchronous read of the cached conversation-manager-agent name. Returns\n * `null` until {@link getConversationManagerAgent} has been called at least\n * once and resolved successfully. Used by `MessageItemComponent.isConversationManager`\n * to flag messages from the routing agent without hardcoding `'Sage'`.\n */\n public get ConversationManagerAgentName(): string | null {\n return this._conversationManagerAgent?.Name ?? null;\n }\n\n /**\n * Returns `true` if the supplied agent identifier (UUID or name) matches the\n * currently cached conversation manager agent. Robust to either input.\n */\n public IsConversationManagerAgent(agentIdOrName: string | null | undefined): boolean {\n if (!agentIdOrName || !this._conversationManagerAgent) return false;\n return (\n UUIDsEqual(this._conversationManagerAgent.ID, agentIdOrName) ||\n this._conversationManagerAgent.Name === agentIdOrName\n );\n }\n\n /**\n * Process a message through the conversation manager agent. Delegates to\n * `ConversationsRuntime.Instance.AgentRunner.processMessage(...)`.\n *\n * Signature is preserved verbatim from the original service so existing\n * call sites continue to compile. The unused `conversationHistory`\n * parameter is kept for backwards compatibility (it was already\n * documented as \"kept for backwards compatibility but not used\" in the\n * original).\n */\n async processMessage(\n conversationId: string,\n message: MJConversationDetailEntity,\n conversationHistory: MJConversationDetailEntity[],\n conversationDetailId: string,\n onProgress?: AgentExecutionProgressCallback,\n appContext?: Record<string, unknown> | null\n ): Promise<ExecuteAgentResult | null> {\n // Warm the cached default-agent name for any synchronous consumers\n // before the runtime resolves on its own.\n if (!this._conversationManagerAgent) {\n await this.getConversationManagerAgent();\n }\n return ConversationsRuntime.Instance.AgentRunner.processMessage({\n conversationId,\n message,\n conversationDetailId,\n appContext,\n onProgress,\n });\n }\n\n /**\n * Find the configuration preset ID from a previous @mention of an agent in conversation history.\n * Searches backwards through User messages to find the most recent @mention of the specified agent\n * that includes a configId.\n *\n * @param agentId The agent ID to search for\n * @param conversationHistory The conversation history to search through\n * @returns The configuration preset ID if found, undefined otherwise\n */\n public findConfigurationPresetFromHistory(\n agentId: string,\n conversationHistory: MJConversationDetailEntity[]\n ): string | undefined {\n // Search backwards through history for User messages that @mention this agent with a configId\n const userMentionWithConfig = conversationHistory\n .slice()\n .reverse()\n .find(msg => {\n if (msg.Role !== 'User' || !msg.Message) return false;\n const mentionResult = this.mentionParser.parseMentions(\n msg.Message,\n AIEngineBase.Instance.Agents,\n []\n );\n return mentionResult.agentMention?.id === agentId && mentionResult.agentMention?.configurationId;\n });\n\n if (userMentionWithConfig) {\n const mentionResult = this.mentionParser.parseMentions(\n userMentionWithConfig.Message,\n AIEngineBase.Instance.Agents,\n []\n );\n if (mentionResult.agentMention?.configurationId) {\n console.log(`🎯 Found configuration preset from @mention: ${mentionResult.agentMention.configurationId}`);\n return mentionResult.agentMention.configurationId;\n }\n }\n\n return undefined;\n }\n\n /**\n * Clear the session for a conversation (useful when starting a new topic)\n */\n clearSession(conversationId: string): void {\n this._sessionIds.delete(conversationId);\n }\n\n /**\n * Invoke a sub-agent based on Sage Agent's payload.\n * This is called when Sage decides to delegate to a specialist agent.\n *\n * Stays on the Angular shim because it directly uses AgentClientService.\n * Could move to the runtime in a follow-up if needed.\n */\n async invokeSubAgent(\n agentName: string,\n conversationId: string,\n message: MJConversationDetailEntity,\n conversationHistory: MJConversationDetailEntity[],\n reasoning: string,\n conversationDetailId: string,\n payload?: unknown,\n onProgress?: AgentExecutionProgressCallback,\n sourceArtifactId?: string,\n sourceArtifactVersionId?: string,\n agentConfigurationPresetId?: string,\n appContext?: Record<string, unknown> | null\n ): Promise<ExecuteAgentResult | null> {\n try {\n // Ensure AIEngineBase is configured\n await AIEngineBase.Instance.Config(false);\n\n // Find the agent by name\n const agent = AIEngineBase.Instance.Agents.find(a => a.Name === agentName);\n\n if (!agent || !agent.ID) {\n const errorMsg = `Sub-agent \"${agentName}\" not found`;\n console.warn(`${errorMsg}`);\n MJNotificationService.Instance?.CreateSimpleNotification(errorMsg, 'error', 5000);\n return null;\n }\n\n console.log(`Invoking sub-agent: ${agentName}`, { reasoning, hasPayload: !!payload, hasConfigPreset: !!agentConfigurationPresetId });\n\n // Map AIAgentConfiguration preset ID to actual AIConfiguration ID\n let aiConfigurationId: string | undefined = undefined;\n if (agentConfigurationPresetId) {\n const presets = AIEngineBase.Instance.GetAgentConfigurationPresets(agent.ID, false);\n const preset = presets.find(p => UUIDsEqual(p.ID, agentConfigurationPresetId) || UUIDsEqual(p.AIConfigurationID, agentConfigurationPresetId));\n\n if (preset) {\n aiConfigurationId = preset.AIConfigurationID || undefined;\n console.log(`Mapped agent configuration preset \"${preset.Name}\" to AIConfigurationID: ${aiConfigurationId || 'default'}`);\n } else {\n console.warn(`Agent configuration preset ${agentConfigurationPresetId} not found for agent ${agent.ID}`);\n }\n }\n\n const agentParams: RunAgentFromConversationDetailParams = {\n ConversationDetailId: conversationDetailId,\n AgentId: agent.ID,\n MaxHistoryMessages: 20,\n Data: {\n conversationId: conversationId,\n latestMessageId: message.ID,\n invocationReason: reasoning,\n ...(appContext ? { appContext } : {}),\n },\n ...(payload ? { Payload: payload as Record<string, unknown> } : {}),\n ...(aiConfigurationId ? { ConfigurationId: aiConfigurationId } : {}),\n CreateArtifacts: true,\n CreateNotification: true,\n SourceArtifactId: sourceArtifactId,\n SourceArtifactVersionId: sourceArtifactVersionId,\n OnProgress: onProgress ? (progress) => {\n onProgress({\n step: progress.CurrentStep as 'initialization' | 'validation' | 'prompt_execution' | 'action_execution' | 'subagent_execution' | 'decision_processing' | 'finalization',\n percentage: progress.Percentage,\n message: progress.Message,\n metadata: progress.Metadata\n });\n } : undefined\n };\n\n const runResult = await this.agentClientService.RunAgentFromConversationDetail(agentParams);\n\n if (runResult.Success && runResult.Result) {\n return runResult.Result as ExecuteAgentResult;\n } else if (!runResult.Success) {\n const errorMsg = `Sub-agent \"${agentName}\" failed: ${runResult.ErrorMessage || 'unknown error'}`;\n console.error(errorMsg);\n MJNotificationService.Instance?.CreateSimpleNotification(errorMsg, 'error', 5000);\n return null;\n }\n\n return null;\n } catch (error) {\n const errorMsg = `Error invoking sub-agent \"${agentName}\": ` + (error instanceof Error ? error.message : String(error));\n console.error(`Error invoking sub-agent \"${agentName}\":`, error);\n MJNotificationService.Instance?.CreateSimpleNotification(errorMsg, 'error', 5000);\n return null;\n }\n }\n\n /**\n * Check if user's latest message should continue with the previous agent or route through Sage.\n * Uses fast inference (<500ms) to determine intent and avoid unnecessary Sage overhead.\n *\n * Stays on the Angular shim because it directly uses GraphQLAIClient.\n * Could move to the runtime in a follow-up.\n */\n async checkAgentContinuityIntent(\n agentId: string,\n latestMessage: string,\n conversationHistory: MJConversationDetailEntity[],\n context: ArtifactLookupContext\n ): Promise<IntentCheckResult> {\n if (!this._aiClient) {\n console.warn('AI Client not initialized, defaulting to UNSURE for intent check');\n return { decision: 'UNSURE', reasoning: 'AI Client not initialized' };\n }\n\n try {\n await AIEngineBase.Instance.Config(false);\n const prompt = AIEngineBase.Instance.Prompts.find(p => p.Name === 'Check Sage Intent');\n if (!prompt) {\n console.warn('⚠️ Check Sage Intent prompt not found, defaulting to UNSURE');\n return { decision: 'UNSURE', reasoning: 'Check Sage Intent prompt not found' };\n }\n\n const agent = AIEngineBase.Instance.Agents.find(a => UUIDsEqual(a.ID, agentId));\n if (!agent) {\n console.warn('⚠️ Previous agent not found, defaulting to UNSURE');\n return { decision: 'UNSURE', reasoning: 'Previous agent not found' };\n }\n\n const agentArtifacts = this.findAllAgentArtifacts(\n agentId,\n conversationHistory,\n context\n );\n\n const recentHistory = conversationHistory.slice(-10);\n const compactHistory = recentHistory.map((msg, idx) => {\n const role = msg.Role === 'User' ? 'User' : agent.Name || 'Agent';\n const content = msg.Message || '';\n return `${idx + 1}. ${role}: ${content.substring(0, 150)}${content.length > 150 ? '...' : ''}`;\n }).join('\\n');\n\n let artifactContext = '';\n if (agentArtifacts.length > 0) {\n artifactContext = '\\n\\n**Prior Artifacts Created by This Agent**:\\n';\n agentArtifacts.forEach((artifact, idx) => {\n artifactContext += `${idx + 1}. ${artifact.artifactName} (${artifact.artifactType})\\n`;\n artifactContext += ` - Versions: ${artifact.versions.length}\\n`;\n if (artifact.versions.length > 0) {\n artifactContext += ` - Latest: v${artifact.versions[0].versionNumber}`;\n if (artifact.versions[0].versionName) {\n artifactContext += ` - ${artifact.versions[0].versionName}`;\n }\n artifactContext += '\\n';\n }\n });\n }\n\n const userMessage = `**Previous Agent**: ${agent.Name} - ${agent.Description || 'No description'}\n\n**Conversation History** (last ${recentHistory.length} messages):\n${compactHistory}${artifactContext}\n\n**Latest User Message**: \"${latestMessage}\"`;\n\n console.log('🔍 Checking agent continuity intent...', {\n agentName: agent.Name,\n messagePreview: latestMessage.substring(0, 50),\n artifactCount: agentArtifacts.length\n });\n\n const result = await this._aiClient.RunAIPrompt({\n promptId: prompt.ID,\n messages: [{ role: 'user', content: userMessage }],\n data: {\n hasPriorArtifact: agentArtifacts.length > 0,\n priorArtifacts: agentArtifacts\n }\n });\n\n if (result && result.success && (result.parsedResult || result.output)) {\n const parsed = result.parsedResult ||\n (result.output ? JSON.parse(result.output) : null);\n\n if (parsed && parsed.continuesWith) {\n const decision = parsed.continuesWith.toUpperCase();\n const reasoning = parsed.reasoning || 'No reasoning provided';\n const targetArtifactVersionId = parsed.targetArtifactVersionId || undefined;\n\n console.log(`✅ Intent check result: ${decision}`, {\n reasoning,\n targetArtifactVersionId,\n latency: result.executionTimeMs || 'unknown'\n });\n\n if (decision === 'YES' || decision === 'NO' || decision === 'UNSURE') {\n return {\n decision: decision as 'YES' | 'NO' | 'UNSURE',\n reasoning,\n targetArtifactVersionId\n };\n }\n }\n }\n\n console.warn('⚠️ Intent check failed or returned invalid format, defaulting to UNSURE');\n return { decision: 'UNSURE', reasoning: 'Invalid format from intent check prompt' };\n } catch (error) {\n console.error('❌ Error checking agent continuity intent:', error);\n return {\n decision: 'UNSURE',\n reasoning: `Error during intent check: ${error instanceof Error ? error.message : String(error)}`\n };\n }\n }\n\n /**\n * Find all artifacts created by the specified agent in this conversation.\n * Returns artifacts grouped by artifact with versions, ordered most recent first.\n * Enables LLM to reason about which artifact/version user is referencing.\n *\n * Uses pre-loaded data from ArtifactLookupContext for performance (no database queries).\n */\n private findAllAgentArtifacts(\n agentId: string,\n conversationDetails: MJConversationDetailEntity[],\n context: ArtifactLookupContext\n ): Array<{\n artifactId: string;\n artifactName: string;\n artifactType: string;\n artifactDescription: string | null;\n versions: Array<{\n runId: string;\n versionId: string;\n versionNumber: number;\n versionName: string | null;\n versionDescription: string | null;\n createdAt: Date;\n }>;\n }> {\n const artifactMap = new Map<string, {\n artifactId: string;\n artifactName: string;\n artifactType: string;\n artifactDescription: string | null;\n versions: Array<{\n runId: string;\n versionId: string;\n versionNumber: number;\n versionName: string | null;\n versionDescription: string | null;\n createdAt: Date;\n }>;\n }>();\n\n for (let i = conversationDetails.length - 1; i >= 0; i--) {\n const detail = conversationDetails[i];\n\n if (detail.Role !== 'AI' || detail.Status === 'Error') continue;\n\n const agentRun = context.agentRunsByDetailId.get(detail.ID);\n if (!agentRun || !UUIDsEqual(agentRun.AgentID, agentId) || agentRun.Status !== 'Completed') {\n continue;\n }\n\n const artifacts = context.artifactsByDetailId.get(detail.ID);\n if (!artifacts || artifacts.length === 0) continue;\n\n for (const lazyArtifact of artifacts) {\n const mainArtifactId = lazyArtifact.artifactId;\n\n if (!artifactMap.has(mainArtifactId)) {\n artifactMap.set(mainArtifactId, {\n artifactId: mainArtifactId,\n artifactName: lazyArtifact.artifactName,\n artifactType: lazyArtifact.artifactType,\n artifactDescription: lazyArtifact.artifactDescription || null,\n versions: []\n });\n }\n\n const artifactEntry = artifactMap.get(mainArtifactId)!;\n artifactEntry.versions.push({\n runId: agentRun.ID,\n versionId: lazyArtifact.artifactVersionId,\n versionNumber: lazyArtifact.versionNumber,\n versionName: lazyArtifact.versionName,\n versionDescription: lazyArtifact.versionDescription,\n createdAt: lazyArtifact.versionCreatedAt\n });\n }\n }\n\n return Array.from(artifactMap.values()).sort((a, b) => {\n const aLatest = a.versions[0]?.createdAt || new Date(0);\n const bLatest = b.versions[0]?.createdAt || new Date(0);\n return bLatest.getTime() - aLatest.getTime();\n });\n }\n}\n"]}
@@ -1,84 +1,25 @@
1
1
  import { BehaviorSubject, Subject } from 'rxjs';
2
+ import { type ConversationSwitchEvent, type ConversationDeepLink } from '@memberjunction/conversations-runtime';
3
+ import { ConversationsRuntimeBootstrap } from './conversations-runtime-bootstrap.service';
2
4
  import * as i0 from "@angular/core";
3
- /** Event emitted when switching between overlay and workspace */
4
- export interface ConversationSwitchEvent {
5
- /** The conversation ID being transferred */
6
- ConversationID: string | null;
7
- /** Source of the switch */
8
- Source: 'overlay' | 'workspace' | 'deep-link';
9
- /** Target destination */
10
- Target: 'overlay' | 'workspace';
11
- }
12
- /** Deep link parameters for navigating to a conversation */
13
- export interface ConversationDeepLink {
14
- ConversationID: string;
15
- /** Optional: scroll to a specific message */
16
- MessageID?: string;
17
- /** Optional: auto-open the overlay or workspace */
18
- OpenIn?: 'overlay' | 'workspace';
19
- }
5
+ export type { ConversationSwitchEvent, ConversationDeepLink };
20
6
  export declare class ConversationBridgeService {
21
- /** The currently active conversation ID shared between overlay and workspace */
22
- ActiveConversationID$: BehaviorSubject<string | null>;
23
- /** Whether the overlay is currently active (expanded) */
24
- OverlayActive$: BehaviorSubject<boolean>;
25
- /** Whether the full workspace is currently active (visible) */
26
- WorkspaceActive$: BehaviorSubject<boolean>;
27
- /** Events emitted when switching between overlay and workspace */
28
- SwitchEvent$: Subject<ConversationSwitchEvent>;
29
- /** Deep link requests */
30
- DeepLinkRequest$: Subject<ConversationDeepLink>;
31
- /**
32
- * "Expand the overlay" requests from anywhere in the app — typically
33
- * a dashboard's "Refine with AI" button that wants to pop the chat
34
- * after setting fresh AppContext. The mounted overlay subscribes and
35
- * calls its own `Expand()` in response. Decoupled this way because the
36
- * overlay component reference isn't reachable from arbitrary callers,
37
- * and we don't want everyone to take a hard dep on the overlay class.
38
- */
39
- ExpandOverlayRequested$: Subject<void>;
40
- /**
41
- * Ask the overlay to expand. Idempotent if already expanded.
42
- */
7
+ constructor(_bootstrap: ConversationsRuntimeBootstrap);
8
+ private get bridge();
9
+ get ActiveConversationID$(): BehaviorSubject<string | null>;
10
+ get OverlayActive$(): BehaviorSubject<boolean>;
11
+ get WorkspaceActive$(): BehaviorSubject<boolean>;
12
+ get SwitchEvent$(): Subject<ConversationSwitchEvent>;
13
+ get DeepLinkRequest$(): Subject<ConversationDeepLink>;
14
+ get ExpandOverlayRequested$(): Subject<void>;
43
15
  RequestExpandOverlay(): void;
44
- /**
45
- * Set the active conversation from the overlay.
46
- * The workspace will pick up the change automatically.
47
- */
48
16
  SetActiveFromOverlay(conversationId: string | null): void;
49
- /**
50
- * Set the active conversation from the workspace.
51
- * The overlay will pick up the change automatically.
52
- */
53
17
  SetActiveFromWorkspace(conversationId: string | null): void;
54
- /**
55
- * Request switching from overlay to full workspace.
56
- * The overlay should minimize, and the workspace should open
57
- * with the same conversation.
58
- */
59
18
  SwitchToWorkspace(conversationId: string | null): void;
60
- /**
61
- * Request switching from workspace to overlay.
62
- * The workspace can stay open, but the overlay resumes
63
- * the conversation.
64
- */
65
19
  SwitchToOverlay(conversationId: string | null): void;
66
- /**
67
- * Navigate to a specific conversation via deep link.
68
- */
69
20
  NavigateToConversation(deepLink: ConversationDeepLink): void;
70
- /**
71
- * Notify that the overlay is now active.
72
- */
73
21
  NotifyOverlayActive(active: boolean): void;
74
- /**
75
- * Notify that the workspace is now active.
76
- */
77
22
  NotifyWorkspaceActive(active: boolean): void;
78
- /**
79
- * Check if the conversation should be resumed in the overlay
80
- * (i.e., workspace is not active but there's an active conversation).
81
- */
82
23
  ShouldResumeInOverlay(): boolean;
83
24
  static ɵfac: i0.ɵɵFactoryDeclaration<ConversationBridgeService, never>;
84
25
  static ɵprov: i0.ɵɵInjectableDeclaration<ConversationBridgeService>;
@@ -1 +1 @@
1
- {"version":3,"file":"conversation-bridge.service.d.ts","sourceRoot":"","sources":["../../../src/lib/services/conversation-bridge.service.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;;AAEhD,iEAAiE;AACjE,MAAM,WAAW,uBAAuB;IACpC,4CAA4C;IAC5C,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,2BAA2B;IAC3B,MAAM,EAAE,SAAS,GAAG,WAAW,GAAG,WAAW,CAAC;IAC9C,yBAAyB;IACzB,MAAM,EAAE,SAAS,GAAG,WAAW,CAAC;CACnC;AAED,4DAA4D;AAC5D,MAAM,WAAW,oBAAoB;IACjC,cAAc,EAAE,MAAM,CAAC;IACvB,6CAA6C;IAC7C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mDAAmD;IACnD,MAAM,CAAC,EAAE,SAAS,GAAG,WAAW,CAAC;CACpC;AAED,qBACa,yBAAyB;IAClC,gFAAgF;IACzE,qBAAqB,iCAA4C;IAExE,yDAAyD;IAClD,cAAc,2BAAuC;IAE5D,+DAA+D;IACxD,gBAAgB,2BAAuC;IAE9D,kEAAkE;IAC3D,YAAY,mCAA0C;IAE7D,yBAAyB;IAClB,gBAAgB,gCAAuC;IAE9D;;;;;;;OAOG;IACI,uBAAuB,gBAAuB;IAErD;;OAEG;IACI,oBAAoB,IAAI,IAAI;IAInC;;;OAGG;IACI,oBAAoB,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAIhE;;;OAGG;IACI,sBAAsB,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAIlE;;;;OAIG;IACI,iBAAiB,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAQ7D;;;;OAIG;IACI,eAAe,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAQ3D;;OAEG;IACI,sBAAsB,CAAC,QAAQ,EAAE,oBAAoB,GAAG,IAAI;IAKnE;;OAEG;IACI,mBAAmB,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI;IAIjD;;OAEG;IACI,qBAAqB,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI;IAInD;;;OAGG;IACI,qBAAqB,IAAI,OAAO;yCArG9B,yBAAyB;6CAAzB,yBAAyB;CAwGrC"}
1
+ {"version":3,"file":"conversation-bridge.service.d.ts","sourceRoot":"","sources":["../../../src/lib/services/conversation-bridge.service.ts"],"names":[],"mappings":"AAkBA,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAChD,OAAO,EAEH,KAAK,uBAAuB,EAC5B,KAAK,oBAAoB,EAC5B,MAAM,uCAAuC,CAAC;AAE/C,OAAO,EAAE,6BAA6B,EAAE,MAAM,2CAA2C,CAAC;;AAG1F,YAAY,EAAE,uBAAuB,EAAE,oBAAoB,EAAE,CAAC;AAE9D,qBACa,yBAAyB;gBACtB,UAAU,EAAE,6BAA6B;IAIrD,OAAO,KAAK,MAAM,GAEjB;IAED,IAAW,qBAAqB,IAAI,eAAe,CAAC,MAAM,GAAG,IAAI,CAAC,CAEjE;IACD,IAAW,cAAc,IAAI,eAAe,CAAC,OAAO,CAAC,CAEpD;IACD,IAAW,gBAAgB,IAAI,eAAe,CAAC,OAAO,CAAC,CAEtD;IACD,IAAW,YAAY,IAAI,OAAO,CAAC,uBAAuB,CAAC,CAE1D;IACD,IAAW,gBAAgB,IAAI,OAAO,CAAC,oBAAoB,CAAC,CAE3D;IACD,IAAW,uBAAuB,IAAI,OAAO,CAAC,IAAI,CAAC,CAElD;IAEM,oBAAoB,IAAI,IAAI;IAG5B,oBAAoB,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAGzD,sBAAsB,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAG3D,iBAAiB,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAGtD,eAAe,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAGpD,sBAAsB,CAAC,QAAQ,EAAE,oBAAoB,GAAG,IAAI;IAG5D,mBAAmB,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI;IAG1C,qBAAqB,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI;IAG5C,qBAAqB,IAAI,OAAO;yCApD9B,yBAAyB;6CAAzB,yBAAyB;CAuDrC"}
@@ -1,114 +1,80 @@
1
1
  /**
2
- * @fileoverview Conversation Bridge Service
2
+ * @fileoverview Angular DI shim over the framework-agnostic `ConversationBridge`
3
+ * from `@memberjunction/conversations-runtime`.
3
4
  *
4
- * Provides shared state between the floating chat overlay and the
5
- * full Conversations workspace. Ensures conversation continuity
6
- * when switching between the two views.
5
+ * The bridge's state (active conversation ID, overlay vs workspace activeness,
6
+ * switch + deep-link event subjects) now lives in the runtime so it's shared
7
+ * across all consumers Angular widget, future React widget, server jobs.
7
8
  *
8
- * Key responsibilities:
9
- * - Tracks the active ConversationID across overlay and workspace
10
- * - Maintains message history reference (no duplication)
11
- * - Supports deep link navigation to specific conversations
12
- * - Emits events when the active conversation changes
9
+ * This service is now a thin pass-through. Existing
10
+ * `inject(ConversationBridgeService)` call sites continue to work without
11
+ * changes; observables (`ActiveConversationID$`, `SwitchEvent$`, etc.) are now
12
+ * getters that return the runtime's BehaviorSubjects/Subjects, so subscribers
13
+ * see exactly the same events as any non-Angular consumer.
14
+ *
15
+ * **For new code:** prefer `ConversationsRuntime.Instance.Bridge` directly.
13
16
  */
14
17
  import { Injectable } from '@angular/core';
15
- import { BehaviorSubject, Subject } from 'rxjs';
18
+ import { ConversationsRuntime, } from '@memberjunction/conversations-runtime';
16
19
  import * as i0 from "@angular/core";
20
+ import * as i1 from "./conversations-runtime-bootstrap.service";
17
21
  export class ConversationBridgeService {
18
- /** The currently active conversation ID shared between overlay and workspace */
19
- ActiveConversationID$ = new BehaviorSubject(null);
20
- /** Whether the overlay is currently active (expanded) */
21
- OverlayActive$ = new BehaviorSubject(false);
22
- /** Whether the full workspace is currently active (visible) */
23
- WorkspaceActive$ = new BehaviorSubject(false);
24
- /** Events emitted when switching between overlay and workspace */
25
- SwitchEvent$ = new Subject();
26
- /** Deep link requests */
27
- DeepLinkRequest$ = new Subject();
28
- /**
29
- * "Expand the overlay" requests from anywhere in the app — typically
30
- * a dashboard's "Refine with AI" button that wants to pop the chat
31
- * after setting fresh AppContext. The mounted overlay subscribes and
32
- * calls its own `Expand()` in response. Decoupled this way because the
33
- * overlay component reference isn't reachable from arbitrary callers,
34
- * and we don't want everyone to take a hard dep on the overlay class.
35
- */
36
- ExpandOverlayRequested$ = new Subject();
37
- /**
38
- * Ask the overlay to expand. Idempotent if already expanded.
39
- */
22
+ constructor(_bootstrap) {
23
+ // Injecting the bootstrap forces adapter registration on first construction.
24
+ }
25
+ get bridge() {
26
+ return ConversationsRuntime.Instance.Bridge;
27
+ }
28
+ get ActiveConversationID$() {
29
+ return this.bridge.ActiveConversationID$;
30
+ }
31
+ get OverlayActive$() {
32
+ return this.bridge.OverlayActive$;
33
+ }
34
+ get WorkspaceActive$() {
35
+ return this.bridge.WorkspaceActive$;
36
+ }
37
+ get SwitchEvent$() {
38
+ return this.bridge.SwitchEvent$;
39
+ }
40
+ get DeepLinkRequest$() {
41
+ return this.bridge.DeepLinkRequest$;
42
+ }
43
+ get ExpandOverlayRequested$() {
44
+ return this.bridge.ExpandOverlayRequested$;
45
+ }
40
46
  RequestExpandOverlay() {
41
- this.ExpandOverlayRequested$.next();
47
+ this.bridge.RequestExpandOverlay();
42
48
  }
43
- /**
44
- * Set the active conversation from the overlay.
45
- * The workspace will pick up the change automatically.
46
- */
47
49
  SetActiveFromOverlay(conversationId) {
48
- this.ActiveConversationID$.next(conversationId);
50
+ this.bridge.SetActiveFromOverlay(conversationId);
49
51
  }
50
- /**
51
- * Set the active conversation from the workspace.
52
- * The overlay will pick up the change automatically.
53
- */
54
52
  SetActiveFromWorkspace(conversationId) {
55
- this.ActiveConversationID$.next(conversationId);
53
+ this.bridge.SetActiveFromWorkspace(conversationId);
56
54
  }
57
- /**
58
- * Request switching from overlay to full workspace.
59
- * The overlay should minimize, and the workspace should open
60
- * with the same conversation.
61
- */
62
55
  SwitchToWorkspace(conversationId) {
63
- this.SwitchEvent$.next({
64
- ConversationID: conversationId,
65
- Source: 'overlay',
66
- Target: 'workspace'
67
- });
68
- }
69
- /**
70
- * Request switching from workspace to overlay.
71
- * The workspace can stay open, but the overlay resumes
72
- * the conversation.
73
- */
56
+ this.bridge.SwitchToWorkspace(conversationId);
57
+ }
74
58
  SwitchToOverlay(conversationId) {
75
- this.SwitchEvent$.next({
76
- ConversationID: conversationId,
77
- Source: 'workspace',
78
- Target: 'overlay'
79
- });
80
- }
81
- /**
82
- * Navigate to a specific conversation via deep link.
83
- */
59
+ this.bridge.SwitchToOverlay(conversationId);
60
+ }
84
61
  NavigateToConversation(deepLink) {
85
- this.ActiveConversationID$.next(deepLink.ConversationID);
86
- this.DeepLinkRequest$.next(deepLink);
62
+ this.bridge.NavigateToConversation(deepLink);
87
63
  }
88
- /**
89
- * Notify that the overlay is now active.
90
- */
91
64
  NotifyOverlayActive(active) {
92
- this.OverlayActive$.next(active);
65
+ this.bridge.NotifyOverlayActive(active);
93
66
  }
94
- /**
95
- * Notify that the workspace is now active.
96
- */
97
67
  NotifyWorkspaceActive(active) {
98
- this.WorkspaceActive$.next(active);
68
+ this.bridge.NotifyWorkspaceActive(active);
99
69
  }
100
- /**
101
- * Check if the conversation should be resumed in the overlay
102
- * (i.e., workspace is not active but there's an active conversation).
103
- */
104
70
  ShouldResumeInOverlay() {
105
- return !this.WorkspaceActive$.value && this.ActiveConversationID$.value !== null;
71
+ return this.bridge.ShouldResumeInOverlay();
106
72
  }
107
- static ɵfac = function ConversationBridgeService_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || ConversationBridgeService)(); };
73
+ static ɵfac = function ConversationBridgeService_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || ConversationBridgeService)(i0.ɵɵinject(i1.ConversationsRuntimeBootstrap)); };
108
74
  static ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: ConversationBridgeService, factory: ConversationBridgeService.ɵfac, providedIn: 'root' });
109
75
  }
110
76
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ConversationBridgeService, [{
111
77
  type: Injectable,
112
78
  args: [{ providedIn: 'root' }]
113
- }], null, null); })();
79
+ }], () => [{ type: i1.ConversationsRuntimeBootstrap }], null); })();
114
80
  //# sourceMappingURL=conversation-bridge.service.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"conversation-bridge.service.js","sourceRoot":"","sources":["../../../src/lib/services/conversation-bridge.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;;AAsBhD,MAAM,OAAO,yBAAyB;IAClC,gFAAgF;IACzE,qBAAqB,GAAG,IAAI,eAAe,CAAgB,IAAI,CAAC,CAAC;IAExE,yDAAyD;IAClD,cAAc,GAAG,IAAI,eAAe,CAAU,KAAK,CAAC,CAAC;IAE5D,+DAA+D;IACxD,gBAAgB,GAAG,IAAI,eAAe,CAAU,KAAK,CAAC,CAAC;IAE9D,kEAAkE;IAC3D,YAAY,GAAG,IAAI,OAAO,EAA2B,CAAC;IAE7D,yBAAyB;IAClB,gBAAgB,GAAG,IAAI,OAAO,EAAwB,CAAC;IAE9D;;;;;;;OAOG;IACI,uBAAuB,GAAG,IAAI,OAAO,EAAQ,CAAC;IAErD;;OAEG;IACI,oBAAoB;QACvB,IAAI,CAAC,uBAAuB,CAAC,IAAI,EAAE,CAAC;IACxC,CAAC;IAED;;;OAGG;IACI,oBAAoB,CAAC,cAA6B;QACrD,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IACpD,CAAC;IAED;;;OAGG;IACI,sBAAsB,CAAC,cAA6B;QACvD,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IACpD,CAAC;IAED;;;;OAIG;IACI,iBAAiB,CAAC,cAA6B;QAClD,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;YACnB,cAAc,EAAE,cAAc;YAC9B,MAAM,EAAE,SAAS;YACjB,MAAM,EAAE,WAAW;SACtB,CAAC,CAAC;IACP,CAAC;IAED;;;;OAIG;IACI,eAAe,CAAC,cAA6B;QAChD,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;YACnB,cAAc,EAAE,cAAc;YAC9B,MAAM,EAAE,WAAW;YACnB,MAAM,EAAE,SAAS;SACpB,CAAC,CAAC;IACP,CAAC;IAED;;OAEG;IACI,sBAAsB,CAAC,QAA8B;QACxD,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;QACzD,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACzC,CAAC;IAED;;OAEG;IACI,mBAAmB,CAAC,MAAe;QACtC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACrC,CAAC;IAED;;OAEG;IACI,qBAAqB,CAAC,MAAe;QACxC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACvC,CAAC;IAED;;;OAGG;IACI,qBAAqB;QACxB,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,KAAK,IAAI,IAAI,CAAC,qBAAqB,CAAC,KAAK,KAAK,IAAI,CAAC;IACrF,CAAC;mHAvGQ,yBAAyB;gEAAzB,yBAAyB,WAAzB,yBAAyB,mBADZ,MAAM;;iFACnB,yBAAyB;cADrC,UAAU;eAAC,EAAE,UAAU,EAAE,MAAM,EAAE","sourcesContent":["/**\n * @fileoverview Conversation Bridge Service\n *\n * Provides shared state between the floating chat overlay and the\n * full Conversations workspace. Ensures conversation continuity\n * when switching between the two views.\n *\n * Key responsibilities:\n * - Tracks the active ConversationID across overlay and workspace\n * - Maintains message history reference (no duplication)\n * - Supports deep link navigation to specific conversations\n * - Emits events when the active conversation changes\n */\n\nimport { Injectable } from '@angular/core';\nimport { BehaviorSubject, Subject } from 'rxjs';\n\n/** Event emitted when switching between overlay and workspace */\nexport interface ConversationSwitchEvent {\n /** The conversation ID being transferred */\n ConversationID: string | null;\n /** Source of the switch */\n Source: 'overlay' | 'workspace' | 'deep-link';\n /** Target destination */\n Target: 'overlay' | 'workspace';\n}\n\n/** Deep link parameters for navigating to a conversation */\nexport interface ConversationDeepLink {\n ConversationID: string;\n /** Optional: scroll to a specific message */\n MessageID?: string;\n /** Optional: auto-open the overlay or workspace */\n OpenIn?: 'overlay' | 'workspace';\n}\n\n@Injectable({ providedIn: 'root' })\nexport class ConversationBridgeService {\n /** The currently active conversation ID shared between overlay and workspace */\n public ActiveConversationID$ = new BehaviorSubject<string | null>(null);\n\n /** Whether the overlay is currently active (expanded) */\n public OverlayActive$ = new BehaviorSubject<boolean>(false);\n\n /** Whether the full workspace is currently active (visible) */\n public WorkspaceActive$ = new BehaviorSubject<boolean>(false);\n\n /** Events emitted when switching between overlay and workspace */\n public SwitchEvent$ = new Subject<ConversationSwitchEvent>();\n\n /** Deep link requests */\n public DeepLinkRequest$ = new Subject<ConversationDeepLink>();\n\n /**\n * \"Expand the overlay\" requests from anywhere in the app — typically\n * a dashboard's \"Refine with AI\" button that wants to pop the chat\n * after setting fresh AppContext. The mounted overlay subscribes and\n * calls its own `Expand()` in response. Decoupled this way because the\n * overlay component reference isn't reachable from arbitrary callers,\n * and we don't want everyone to take a hard dep on the overlay class.\n */\n public ExpandOverlayRequested$ = new Subject<void>();\n\n /**\n * Ask the overlay to expand. Idempotent if already expanded.\n */\n public RequestExpandOverlay(): void {\n this.ExpandOverlayRequested$.next();\n }\n\n /**\n * Set the active conversation from the overlay.\n * The workspace will pick up the change automatically.\n */\n public SetActiveFromOverlay(conversationId: string | null): void {\n this.ActiveConversationID$.next(conversationId);\n }\n\n /**\n * Set the active conversation from the workspace.\n * The overlay will pick up the change automatically.\n */\n public SetActiveFromWorkspace(conversationId: string | null): void {\n this.ActiveConversationID$.next(conversationId);\n }\n\n /**\n * Request switching from overlay to full workspace.\n * The overlay should minimize, and the workspace should open\n * with the same conversation.\n */\n public SwitchToWorkspace(conversationId: string | null): void {\n this.SwitchEvent$.next({\n ConversationID: conversationId,\n Source: 'overlay',\n Target: 'workspace'\n });\n }\n\n /**\n * Request switching from workspace to overlay.\n * The workspace can stay open, but the overlay resumes\n * the conversation.\n */\n public SwitchToOverlay(conversationId: string | null): void {\n this.SwitchEvent$.next({\n ConversationID: conversationId,\n Source: 'workspace',\n Target: 'overlay'\n });\n }\n\n /**\n * Navigate to a specific conversation via deep link.\n */\n public NavigateToConversation(deepLink: ConversationDeepLink): void {\n this.ActiveConversationID$.next(deepLink.ConversationID);\n this.DeepLinkRequest$.next(deepLink);\n }\n\n /**\n * Notify that the overlay is now active.\n */\n public NotifyOverlayActive(active: boolean): void {\n this.OverlayActive$.next(active);\n }\n\n /**\n * Notify that the workspace is now active.\n */\n public NotifyWorkspaceActive(active: boolean): void {\n this.WorkspaceActive$.next(active);\n }\n\n /**\n * Check if the conversation should be resumed in the overlay\n * (i.e., workspace is not active but there's an active conversation).\n */\n public ShouldResumeInOverlay(): boolean {\n return !this.WorkspaceActive$.value && this.ActiveConversationID$.value !== null;\n }\n}\n"]}
1
+ {"version":3,"file":"conversation-bridge.service.js","sourceRoot":"","sources":["../../../src/lib/services/conversation-bridge.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE3C,OAAO,EACH,oBAAoB,GAGvB,MAAM,uCAAuC,CAAC;;;AAQ/C,MAAM,OAAO,yBAAyB;IAClC,YAAY,UAAyC;QACjD,6EAA6E;IACjF,CAAC;IAED,IAAY,MAAM;QACd,OAAO,oBAAoB,CAAC,QAAQ,CAAC,MAAM,CAAC;IAChD,CAAC;IAED,IAAW,qBAAqB;QAC5B,OAAO,IAAI,CAAC,MAAM,CAAC,qBAAqB,CAAC;IAC7C,CAAC;IACD,IAAW,cAAc;QACrB,OAAO,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC;IACtC,CAAC;IACD,IAAW,gBAAgB;QACvB,OAAO,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC;IACxC,CAAC;IACD,IAAW,YAAY;QACnB,OAAO,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC;IACpC,CAAC;IACD,IAAW,gBAAgB;QACvB,OAAO,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC;IACxC,CAAC;IACD,IAAW,uBAAuB;QAC9B,OAAO,IAAI,CAAC,MAAM,CAAC,uBAAuB,CAAC;IAC/C,CAAC;IAEM,oBAAoB;QACvB,IAAI,CAAC,MAAM,CAAC,oBAAoB,EAAE,CAAC;IACvC,CAAC;IACM,oBAAoB,CAAC,cAA6B;QACrD,IAAI,CAAC,MAAM,CAAC,oBAAoB,CAAC,cAAc,CAAC,CAAC;IACrD,CAAC;IACM,sBAAsB,CAAC,cAA6B;QACvD,IAAI,CAAC,MAAM,CAAC,sBAAsB,CAAC,cAAc,CAAC,CAAC;IACvD,CAAC;IACM,iBAAiB,CAAC,cAA6B;QAClD,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,cAAc,CAAC,CAAC;IAClD,CAAC;IACM,eAAe,CAAC,cAA6B;QAChD,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC;IAChD,CAAC;IACM,sBAAsB,CAAC,QAA8B;QACxD,IAAI,CAAC,MAAM,CAAC,sBAAsB,CAAC,QAAQ,CAAC,CAAC;IACjD,CAAC;IACM,mBAAmB,CAAC,MAAe;QACtC,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAC5C,CAAC;IACM,qBAAqB,CAAC,MAAe;QACxC,IAAI,CAAC,MAAM,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC;IAC9C,CAAC;IACM,qBAAqB;QACxB,OAAO,IAAI,CAAC,MAAM,CAAC,qBAAqB,EAAE,CAAC;IAC/C,CAAC;mHAtDQ,yBAAyB;gEAAzB,yBAAyB,WAAzB,yBAAyB,mBADZ,MAAM;;iFACnB,yBAAyB;cADrC,UAAU;eAAC,EAAE,UAAU,EAAE,MAAM,EAAE","sourcesContent":["/**\n * @fileoverview Angular DI shim over the framework-agnostic `ConversationBridge`\n * from `@memberjunction/conversations-runtime`.\n *\n * The bridge's state (active conversation ID, overlay vs workspace activeness,\n * switch + deep-link event subjects) now lives in the runtime so it's shared\n * across all consumers Angular widget, future React widget, server jobs.\n *\n * This service is now a thin pass-through. Existing\n * `inject(ConversationBridgeService)` call sites continue to work without\n * changes; observables (`ActiveConversationID$`, `SwitchEvent$`, etc.) are now\n * getters that return the runtime's BehaviorSubjects/Subjects, so subscribers\n * see exactly the same events as any non-Angular consumer.\n *\n * **For new code:** prefer `ConversationsRuntime.Instance.Bridge` directly.\n */\n\nimport { Injectable } from '@angular/core';\nimport { BehaviorSubject, Subject } from 'rxjs';\nimport {\n ConversationsRuntime,\n type ConversationSwitchEvent,\n type ConversationDeepLink,\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 { ConversationSwitchEvent, ConversationDeepLink };\n\n@Injectable({ providedIn: 'root' })\nexport class ConversationBridgeService {\n constructor(_bootstrap: ConversationsRuntimeBootstrap) {\n // Injecting the bootstrap forces adapter registration on first construction.\n }\n\n private get bridge() {\n return ConversationsRuntime.Instance.Bridge;\n }\n\n public get ActiveConversationID$(): BehaviorSubject<string | null> {\n return this.bridge.ActiveConversationID$;\n }\n public get OverlayActive$(): BehaviorSubject<boolean> {\n return this.bridge.OverlayActive$;\n }\n public get WorkspaceActive$(): BehaviorSubject<boolean> {\n return this.bridge.WorkspaceActive$;\n }\n public get SwitchEvent$(): Subject<ConversationSwitchEvent> {\n return this.bridge.SwitchEvent$;\n }\n public get DeepLinkRequest$(): Subject<ConversationDeepLink> {\n return this.bridge.DeepLinkRequest$;\n }\n public get ExpandOverlayRequested$(): Subject<void> {\n return this.bridge.ExpandOverlayRequested$;\n }\n\n public RequestExpandOverlay(): void {\n this.bridge.RequestExpandOverlay();\n }\n public SetActiveFromOverlay(conversationId: string | null): void {\n this.bridge.SetActiveFromOverlay(conversationId);\n }\n public SetActiveFromWorkspace(conversationId: string | null): void {\n this.bridge.SetActiveFromWorkspace(conversationId);\n }\n public SwitchToWorkspace(conversationId: string | null): void {\n this.bridge.SwitchToWorkspace(conversationId);\n }\n public SwitchToOverlay(conversationId: string | null): void {\n this.bridge.SwitchToOverlay(conversationId);\n }\n public NavigateToConversation(deepLink: ConversationDeepLink): void {\n this.bridge.NavigateToConversation(deepLink);\n }\n public NotifyOverlayActive(active: boolean): void {\n this.bridge.NotifyOverlayActive(active);\n }\n public NotifyWorkspaceActive(active: boolean): void {\n this.bridge.NotifyWorkspaceActive(active);\n }\n public ShouldResumeInOverlay(): boolean {\n return this.bridge.ShouldResumeInOverlay();\n }\n}\n"]}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * @fileoverview Shared conversation auto-naming helper — extracted from the message
3
+ * input's first-message naming flow so BOTH chat paths use one implementation:
4
+ *
5
+ * - **Regular chat**: the composer names a brand-new conversation from its first
6
+ * user message (the original behavior, now delegated here).
7
+ * - **Realtime sessions**: a voice call that created a fresh conversation names it
8
+ * from the first user utterance when the call ends.
9
+ *
10
+ * The naming itself is DB-driven: the `Name Conversation` AI prompt runs through the
11
+ * GraphQL AI client (same path agents use) with a timeout guard; the parsed
12
+ * `{ name, description }` is saved through {@link ConversationEngine.SaveConversation},
13
+ * which updates the engine's cached conversation list in place (the sidebar reacts
14
+ * through the engine's observables). Failures are logged and return `null` — naming is
15
+ * always best-effort background work that must never affect the user experience.
16
+ */
17
+ import { UserInfo } from '@memberjunction/core';
18
+ import { GraphQLDataProvider } from '@memberjunction/graphql-dataprovider';
19
+ /** The applied result of a successful auto-naming run. */
20
+ export interface ConversationNameResult {
21
+ /** The generated conversation name (already saved). */
22
+ Name: string;
23
+ /** The generated description (already saved; empty string when the prompt omitted it). */
24
+ Description: string;
25
+ }
26
+ /** Options for {@link GenerateAndApplyConversationName}. */
27
+ export interface GenerateConversationNameOptions {
28
+ /** The conversation to name (must exist; the caller owns membership checks). */
29
+ ConversationId: string;
30
+ /**
31
+ * The text the name is derived from — the first user message (regular chat) or the
32
+ * first spoken user utterance (realtime). Callers strip mentions/markup first.
33
+ */
34
+ MessageText: string;
35
+ /** The GraphQL provider the AI client runs over. */
36
+ Provider: GraphQLDataProvider;
37
+ /** The acting user (threaded into the conversation save). */
38
+ CurrentUser: UserInfo;
39
+ /** Abort guard for the prompt run. Default 30s — the conversation keeps its default name on timeout. */
40
+ TimeoutMs?: number;
41
+ /**
42
+ * Test seam: overrides the prompt execution. Production leaves this undefined and the
43
+ * helper runs the `Name Conversation` prompt via {@link GraphQLAIClient.RunAIPrompt}.
44
+ */
45
+ RunPrompt?: (promptId: string, messageText: string) => Promise<{
46
+ success: boolean;
47
+ parsedResult?: unknown;
48
+ output?: string;
49
+ } | null>;
50
+ }
51
+ /** The seeded name of the AI prompt that generates conversation names. */
52
+ export declare const NAME_CONVERSATION_PROMPT = "Name Conversation";
53
+ /**
54
+ * Generates a name + description for a conversation from its first message and SAVES it
55
+ * (DB + engine cache) — the single naming implementation shared by the regular composer
56
+ * and the realtime session path.
57
+ *
58
+ * @returns The applied `{ Name, Description }`, or `null` when naming was skipped/failed
59
+ * (missing prompt, provider unavailable, timeout, unparseable output, save failure) —
60
+ * the conversation keeps its current name in every null case.
61
+ */
62
+ export declare function GenerateAndApplyConversationName(options: GenerateConversationNameOptions): Promise<ConversationNameResult | null>;
63
+ //# sourceMappingURL=conversation-naming.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation-naming.d.ts","sourceRoot":"","sources":["../../../src/lib/services/conversation-naming.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAGhD,OAAO,EAAE,mBAAmB,EAAmB,MAAM,sCAAsC,CAAC;AAG5F,0DAA0D;AAC1D,MAAM,WAAW,sBAAsB;IACrC,uDAAuD;IACvD,IAAI,EAAE,MAAM,CAAC;IACb,0FAA0F;IAC1F,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,4DAA4D;AAC5D,MAAM,WAAW,+BAA+B;IAC9C,gFAAgF;IAChF,cAAc,EAAE,MAAM,CAAC;IACvB;;;OAGG;IACH,WAAW,EAAE,MAAM,CAAC;IACpB,oDAAoD;IACpD,QAAQ,EAAE,mBAAmB,CAAC;IAC9B,6DAA6D;IAC7D,WAAW,EAAE,QAAQ,CAAC;IACtB,wGAAwG;IACxG,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,SAAS,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,YAAY,CAAC,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC,CAAC;CACtI;AAED,0EAA0E;AAC1E,eAAO,MAAM,wBAAwB,sBAAsB,CAAC;AAE5D;;;;;;;;GAQG;AACH,wBAAsB,gCAAgC,CACpD,OAAO,EAAE,+BAA+B,GACvC,OAAO,CAAC,sBAAsB,GAAG,IAAI,CAAC,CAoDxC"}