@memberjunction/ng-conversations 5.40.2 → 5.41.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (378) hide show
  1. package/README.md +57 -0
  2. package/dist/__tests__/channel-optional-surface.test.d.ts +2 -0
  3. package/dist/__tests__/channel-optional-surface.test.d.ts.map +1 -0
  4. package/dist/__tests__/channel-optional-surface.test.js +53 -0
  5. package/dist/__tests__/channel-optional-surface.test.js.map +1 -0
  6. package/dist/__tests__/chat-events.test.d.ts +14 -0
  7. package/dist/__tests__/chat-events.test.d.ts.map +1 -0
  8. package/dist/__tests__/chat-events.test.js +109 -0
  9. package/dist/__tests__/chat-events.test.js.map +1 -0
  10. package/dist/__tests__/conversation-naming.test.d.ts +2 -0
  11. package/dist/__tests__/conversation-naming.test.d.ts.map +1 -0
  12. package/dist/__tests__/conversation-naming.test.js +110 -0
  13. package/dist/__tests__/conversation-naming.test.js.map +1 -0
  14. package/dist/__tests__/delegation-result-parser.test.d.ts +2 -0
  15. package/dist/__tests__/delegation-result-parser.test.d.ts.map +1 -0
  16. package/dist/__tests__/delegation-result-parser.test.js +107 -0
  17. package/dist/__tests__/delegation-result-parser.test.js.map +1 -0
  18. package/dist/__tests__/event-wiring.test.d.ts +15 -0
  19. package/dist/__tests__/event-wiring.test.d.ts.map +1 -0
  20. package/dist/__tests__/event-wiring.test.js +100 -0
  21. package/dist/__tests__/event-wiring.test.js.map +1 -0
  22. package/dist/__tests__/narration-template.test.d.ts +2 -0
  23. package/dist/__tests__/narration-template.test.d.ts.map +1 -0
  24. package/dist/__tests__/narration-template.test.js +76 -0
  25. package/dist/__tests__/narration-template.test.js.map +1 -0
  26. package/dist/__tests__/realtime-agent-picker-models.test.d.ts +2 -0
  27. package/dist/__tests__/realtime-agent-picker-models.test.d.ts.map +1 -0
  28. package/dist/__tests__/realtime-agent-picker-models.test.js +49 -0
  29. package/dist/__tests__/realtime-agent-picker-models.test.js.map +1 -0
  30. package/dist/__tests__/realtime-audio-visuals.test.d.ts +2 -0
  31. package/dist/__tests__/realtime-audio-visuals.test.d.ts.map +1 -0
  32. package/dist/__tests__/realtime-audio-visuals.test.js +123 -0
  33. package/dist/__tests__/realtime-audio-visuals.test.js.map +1 -0
  34. package/dist/__tests__/realtime-delegation-card-cancel.test.d.ts +2 -0
  35. package/dist/__tests__/realtime-delegation-card-cancel.test.d.ts.map +1 -0
  36. package/dist/__tests__/realtime-delegation-card-cancel.test.js +48 -0
  37. package/dist/__tests__/realtime-delegation-card-cancel.test.js.map +1 -0
  38. package/dist/__tests__/realtime-disclosure.test.d.ts +2 -0
  39. package/dist/__tests__/realtime-disclosure.test.d.ts.map +1 -0
  40. package/dist/__tests__/realtime-disclosure.test.js +164 -0
  41. package/dist/__tests__/realtime-disclosure.test.js.map +1 -0
  42. package/dist/__tests__/realtime-pairing.test.d.ts +2 -0
  43. package/dist/__tests__/realtime-pairing.test.d.ts.map +1 -0
  44. package/dist/__tests__/realtime-pairing.test.js +207 -0
  45. package/dist/__tests__/realtime-pairing.test.js.map +1 -0
  46. package/dist/__tests__/realtime-review-lifecycle.test.d.ts +2 -0
  47. package/dist/__tests__/realtime-review-lifecycle.test.d.ts.map +1 -0
  48. package/dist/__tests__/realtime-review-lifecycle.test.js +154 -0
  49. package/dist/__tests__/realtime-review-lifecycle.test.js.map +1 -0
  50. package/dist/__tests__/realtime-session-cancel-usage.test.d.ts +2 -0
  51. package/dist/__tests__/realtime-session-cancel-usage.test.d.ts.map +1 -0
  52. package/dist/__tests__/realtime-session-cancel-usage.test.js +230 -0
  53. package/dist/__tests__/realtime-session-cancel-usage.test.js.map +1 -0
  54. package/dist/__tests__/realtime-session-channels.test.d.ts +2 -0
  55. package/dist/__tests__/realtime-session-channels.test.d.ts.map +1 -0
  56. package/dist/__tests__/realtime-session-channels.test.js +252 -0
  57. package/dist/__tests__/realtime-session-channels.test.js.map +1 -0
  58. package/dist/__tests__/realtime-session-client-tools.test.d.ts +2 -0
  59. package/dist/__tests__/realtime-session-client-tools.test.d.ts.map +1 -0
  60. package/dist/__tests__/realtime-session-client-tools.test.js +103 -0
  61. package/dist/__tests__/realtime-session-client-tools.test.js.map +1 -0
  62. package/dist/__tests__/realtime-session-minimized.test.d.ts +2 -0
  63. package/dist/__tests__/realtime-session-minimized.test.d.ts.map +1 -0
  64. package/dist/__tests__/realtime-session-minimized.test.js +32 -0
  65. package/dist/__tests__/realtime-session-minimized.test.js.map +1 -0
  66. package/dist/__tests__/realtime-session-mint.test.d.ts +2 -0
  67. package/dist/__tests__/realtime-session-mint.test.d.ts.map +1 -0
  68. package/dist/__tests__/realtime-session-mint.test.js +69 -0
  69. package/dist/__tests__/realtime-session-mint.test.js.map +1 -0
  70. package/dist/__tests__/realtime-session-policy.test.d.ts +2 -0
  71. package/dist/__tests__/realtime-session-policy.test.d.ts.map +1 -0
  72. package/dist/__tests__/realtime-session-policy.test.js +303 -0
  73. package/dist/__tests__/realtime-session-policy.test.js.map +1 -0
  74. package/dist/__tests__/realtime-session-review.service.test.d.ts +2 -0
  75. package/dist/__tests__/realtime-session-review.service.test.d.ts.map +1 -0
  76. package/dist/__tests__/realtime-session-review.service.test.js +743 -0
  77. package/dist/__tests__/realtime-session-review.service.test.js.map +1 -0
  78. package/dist/__tests__/realtime-session-state.test.d.ts +2 -0
  79. package/dist/__tests__/realtime-session-state.test.d.ts.map +1 -0
  80. package/dist/__tests__/realtime-session-state.test.js +83 -0
  81. package/dist/__tests__/realtime-session-state.test.js.map +1 -0
  82. package/dist/__tests__/realtime-session-timeline-card.test.d.ts +2 -0
  83. package/dist/__tests__/realtime-session-timeline-card.test.d.ts.map +1 -0
  84. package/dist/__tests__/realtime-session-timeline-card.test.js +106 -0
  85. package/dist/__tests__/realtime-session-timeline-card.test.js.map +1 -0
  86. package/dist/__tests__/realtime-session-timeline.test.d.ts +2 -0
  87. package/dist/__tests__/realtime-session-timeline.test.d.ts.map +1 -0
  88. package/dist/__tests__/realtime-session-timeline.test.js +142 -0
  89. package/dist/__tests__/realtime-session-timeline.test.js.map +1 -0
  90. package/dist/__tests__/realtime-sessions-adapter.test.d.ts +19 -0
  91. package/dist/__tests__/realtime-sessions-adapter.test.d.ts.map +1 -0
  92. package/dist/__tests__/realtime-sessions-adapter.test.js +188 -0
  93. package/dist/__tests__/realtime-sessions-adapter.test.js.map +1 -0
  94. package/dist/__tests__/realtime-surface-panel-prefs.test.d.ts +2 -0
  95. package/dist/__tests__/realtime-surface-panel-prefs.test.d.ts.map +1 -0
  96. package/dist/__tests__/realtime-surface-panel-prefs.test.js +100 -0
  97. package/dist/__tests__/realtime-surface-panel-prefs.test.js.map +1 -0
  98. package/dist/__tests__/realtime-surface-tabs-model.test.d.ts +2 -0
  99. package/dist/__tests__/realtime-surface-tabs-model.test.d.ts.map +1 -0
  100. package/dist/__tests__/realtime-surface-tabs-model.test.js +193 -0
  101. package/dist/__tests__/realtime-surface-tabs-model.test.js.map +1 -0
  102. package/dist/__tests__/remote-browser-audio-player.test.d.ts +2 -0
  103. package/dist/__tests__/remote-browser-audio-player.test.d.ts.map +1 -0
  104. package/dist/__tests__/remote-browser-audio-player.test.js +137 -0
  105. package/dist/__tests__/remote-browser-audio-player.test.js.map +1 -0
  106. package/dist/__tests__/remote-browser-channel.test.d.ts +2 -0
  107. package/dist/__tests__/remote-browser-channel.test.d.ts.map +1 -0
  108. package/dist/__tests__/remote-browser-channel.test.js +423 -0
  109. package/dist/__tests__/remote-browser-channel.test.js.map +1 -0
  110. package/dist/__tests__/slot-defaults.test.d.ts +24 -0
  111. package/dist/__tests__/slot-defaults.test.d.ts.map +1 -0
  112. package/dist/__tests__/slot-defaults.test.js +63 -0
  113. package/dist/__tests__/slot-defaults.test.js.map +1 -0
  114. package/dist/__tests__/user-authorization.test.d.ts +2 -0
  115. package/dist/__tests__/user-authorization.test.d.ts.map +1 -0
  116. package/dist/__tests__/user-authorization.test.js +97 -0
  117. package/dist/__tests__/user-authorization.test.js.map +1 -0
  118. package/dist/__tests__/voice-session-narration.test.d.ts +2 -0
  119. package/dist/__tests__/voice-session-narration.test.d.ts.map +1 -0
  120. package/dist/__tests__/voice-session-narration.test.js +609 -0
  121. package/dist/__tests__/voice-session-narration.test.js.map +1 -0
  122. package/dist/__tests__/whiteboard-artifact-viewer.test.d.ts +2 -0
  123. package/dist/__tests__/whiteboard-artifact-viewer.test.d.ts.map +1 -0
  124. package/dist/__tests__/whiteboard-artifact-viewer.test.js +101 -0
  125. package/dist/__tests__/whiteboard-artifact-viewer.test.js.map +1 -0
  126. package/dist/__tests__/whiteboard-channel.test.d.ts +2 -0
  127. package/dist/__tests__/whiteboard-channel.test.d.ts.map +1 -0
  128. package/dist/__tests__/whiteboard-channel.test.js +260 -0
  129. package/dist/__tests__/whiteboard-channel.test.js.map +1 -0
  130. package/dist/__tests__/whiteboard-restore-state.test.d.ts +2 -0
  131. package/dist/__tests__/whiteboard-restore-state.test.d.ts.map +1 -0
  132. package/dist/__tests__/whiteboard-restore-state.test.js +108 -0
  133. package/dist/__tests__/whiteboard-restore-state.test.js.map +1 -0
  134. package/dist/lib/components/conversation/conversation-chat-area.component.d.ts +205 -3
  135. package/dist/lib/components/conversation/conversation-chat-area.component.d.ts.map +1 -1
  136. package/dist/lib/components/conversation/conversation-chat-area.component.js +911 -342
  137. package/dist/lib/components/conversation/conversation-chat-area.component.js.map +1 -1
  138. package/dist/lib/components/mention/mention-dropdown.component.js +35 -17
  139. package/dist/lib/components/mention/mention-dropdown.component.js.map +1 -1
  140. package/dist/lib/components/mention/mention-editor.component.d.ts +4 -0
  141. package/dist/lib/components/mention/mention-editor.component.d.ts.map +1 -1
  142. package/dist/lib/components/mention/mention-editor.component.js +43 -19
  143. package/dist/lib/components/mention/mention-editor.component.js.map +1 -1
  144. package/dist/lib/components/message/message-input-box.component.d.ts +17 -1
  145. package/dist/lib/components/message/message-input-box.component.d.ts.map +1 -1
  146. package/dist/lib/components/message/message-input-box.component.js +73 -15
  147. package/dist/lib/components/message/message-input-box.component.js.map +1 -1
  148. package/dist/lib/components/message/message-input.component.d.ts +142 -6
  149. package/dist/lib/components/message/message-input.component.d.ts.map +1 -1
  150. package/dist/lib/components/message/message-input.component.js +328 -82
  151. package/dist/lib/components/message/message-input.component.js.map +1 -1
  152. package/dist/lib/components/message/message-item.component.d.ts +28 -3
  153. package/dist/lib/components/message/message-item.component.d.ts.map +1 -1
  154. package/dist/lib/components/message/message-item.component.js +180 -108
  155. package/dist/lib/components/message/message-item.component.js.map +1 -1
  156. package/dist/lib/components/message/message-list.component.d.ts +81 -2
  157. package/dist/lib/components/message/message-list.component.d.ts.map +1 -1
  158. package/dist/lib/components/message/message-list.component.js +252 -87
  159. package/dist/lib/components/message/message-list.component.js.map +1 -1
  160. package/dist/lib/components/realtime/channels/base-realtime-channel-client.d.ts +282 -0
  161. package/dist/lib/components/realtime/channels/base-realtime-channel-client.d.ts.map +1 -0
  162. package/dist/lib/components/realtime/channels/base-realtime-channel-client.js +158 -0
  163. package/dist/lib/components/realtime/channels/base-realtime-channel-client.js.map +1 -0
  164. package/dist/lib/components/realtime/channels/channel-onboarding-panel.component.d.ts +25 -0
  165. package/dist/lib/components/realtime/channels/channel-onboarding-panel.component.d.ts.map +1 -0
  166. package/dist/lib/components/realtime/channels/channel-onboarding-panel.component.js +140 -0
  167. package/dist/lib/components/realtime/channels/channel-onboarding-panel.component.js.map +1 -0
  168. package/dist/lib/components/realtime/channels/realtime-channel-pane.component.d.ts +35 -0
  169. package/dist/lib/components/realtime/channels/realtime-channel-pane.component.d.ts.map +1 -0
  170. package/dist/lib/components/realtime/channels/realtime-channel-pane.component.js +58 -0
  171. package/dist/lib/components/realtime/channels/realtime-channel-pane.component.js.map +1 -0
  172. package/dist/lib/components/realtime/realtime-activity-rail.component.d.ts +63 -0
  173. package/dist/lib/components/realtime/realtime-activity-rail.component.d.ts.map +1 -0
  174. package/dist/lib/components/realtime/realtime-activity-rail.component.js +260 -0
  175. package/dist/lib/components/realtime/realtime-activity-rail.component.js.map +1 -0
  176. package/dist/lib/components/realtime/realtime-agent-banner.component.d.ts +117 -0
  177. package/dist/lib/components/realtime/realtime-agent-banner.component.d.ts.map +1 -0
  178. package/dist/lib/components/realtime/realtime-agent-banner.component.js +504 -0
  179. package/dist/lib/components/realtime/realtime-agent-banner.component.js.map +1 -0
  180. package/dist/lib/components/realtime/realtime-agent-picker.component.d.ts +168 -0
  181. package/dist/lib/components/realtime/realtime-agent-picker.component.d.ts.map +1 -0
  182. package/dist/lib/components/realtime/realtime-agent-picker.component.js +556 -0
  183. package/dist/lib/components/realtime/realtime-agent-picker.component.js.map +1 -0
  184. package/dist/lib/components/realtime/realtime-audio-visuals.d.ts +97 -0
  185. package/dist/lib/components/realtime/realtime-audio-visuals.d.ts.map +1 -0
  186. package/dist/lib/components/realtime/realtime-audio-visuals.js +139 -0
  187. package/dist/lib/components/realtime/realtime-audio-visuals.js.map +1 -0
  188. package/dist/lib/components/realtime/realtime-channel-strip.component.d.ts +29 -0
  189. package/dist/lib/components/realtime/realtime-channel-strip.component.d.ts.map +1 -0
  190. package/dist/lib/components/realtime/realtime-channel-strip.component.js +69 -0
  191. package/dist/lib/components/realtime/realtime-channel-strip.component.js.map +1 -0
  192. package/dist/lib/components/realtime/realtime-composer.component.d.ts +65 -0
  193. package/dist/lib/components/realtime/realtime-composer.component.d.ts.map +1 -0
  194. package/dist/lib/components/realtime/realtime-composer.component.js +256 -0
  195. package/dist/lib/components/realtime/realtime-composer.component.js.map +1 -0
  196. package/dist/lib/components/realtime/realtime-delegation-card.component.d.ts +71 -0
  197. package/dist/lib/components/realtime/realtime-delegation-card.component.d.ts.map +1 -0
  198. package/dist/lib/components/realtime/realtime-delegation-card.component.js +324 -0
  199. package/dist/lib/components/realtime/realtime-delegation-card.component.js.map +1 -0
  200. package/dist/lib/components/realtime/realtime-disclosure.d.ts +135 -0
  201. package/dist/lib/components/realtime/realtime-disclosure.d.ts.map +1 -0
  202. package/dist/lib/components/realtime/realtime-disclosure.js +188 -0
  203. package/dist/lib/components/realtime/realtime-disclosure.js.map +1 -0
  204. package/dist/lib/components/realtime/realtime-session-overlay.component.d.ts +491 -0
  205. package/dist/lib/components/realtime/realtime-session-overlay.component.d.ts.map +1 -0
  206. package/dist/lib/components/realtime/realtime-session-overlay.component.js +1274 -0
  207. package/dist/lib/components/realtime/realtime-session-overlay.component.js.map +1 -0
  208. package/dist/lib/components/realtime/realtime-session-state.d.ts +191 -0
  209. package/dist/lib/components/realtime/realtime-session-state.d.ts.map +1 -0
  210. package/dist/lib/components/realtime/realtime-session-state.js +244 -0
  211. package/dist/lib/components/realtime/realtime-session-state.js.map +1 -0
  212. package/dist/lib/components/realtime/realtime-session-thread.component.d.ts +56 -0
  213. package/dist/lib/components/realtime/realtime-session-thread.component.d.ts.map +1 -0
  214. package/dist/lib/components/realtime/realtime-session-thread.component.js +246 -0
  215. package/dist/lib/components/realtime/realtime-session-thread.component.js.map +1 -0
  216. package/dist/lib/components/realtime/realtime-session-timeline-card.component.d.ts +51 -0
  217. package/dist/lib/components/realtime/realtime-session-timeline-card.component.d.ts.map +1 -0
  218. package/dist/lib/components/realtime/realtime-session-timeline-card.component.js +193 -0
  219. package/dist/lib/components/realtime/realtime-session-timeline-card.component.js.map +1 -0
  220. package/dist/lib/components/realtime/realtime-surface-panel-prefs.d.ts +77 -0
  221. package/dist/lib/components/realtime/realtime-surface-panel-prefs.d.ts.map +1 -0
  222. package/dist/lib/components/realtime/realtime-surface-panel-prefs.js +114 -0
  223. package/dist/lib/components/realtime/realtime-surface-panel-prefs.js.map +1 -0
  224. package/dist/lib/components/realtime/realtime-surface-tabs.component.d.ts +173 -0
  225. package/dist/lib/components/realtime/realtime-surface-tabs.component.d.ts.map +1 -0
  226. package/dist/lib/components/realtime/realtime-surface-tabs.component.js +496 -0
  227. package/dist/lib/components/realtime/realtime-surface-tabs.component.js.map +1 -0
  228. package/dist/lib/components/realtime/realtime-surface-tabs.model.d.ts +181 -0
  229. package/dist/lib/components/realtime/realtime-surface-tabs.model.d.ts.map +1 -0
  230. package/dist/lib/components/realtime/realtime-surface-tabs.model.js +223 -0
  231. package/dist/lib/components/realtime/realtime-surface-tabs.model.js.map +1 -0
  232. package/dist/lib/components/realtime/remote-browser/remote-browser-audio-player.d.ts +163 -0
  233. package/dist/lib/components/realtime/remote-browser/remote-browser-audio-player.d.ts.map +1 -0
  234. package/dist/lib/components/realtime/remote-browser/remote-browser-audio-player.js +309 -0
  235. package/dist/lib/components/realtime/remote-browser/remote-browser-audio-player.js.map +1 -0
  236. package/dist/lib/components/realtime/remote-browser/remote-browser-channel.d.ts +168 -0
  237. package/dist/lib/components/realtime/remote-browser/remote-browser-channel.d.ts.map +1 -0
  238. package/dist/lib/components/realtime/remote-browser/remote-browser-channel.js +524 -0
  239. package/dist/lib/components/realtime/remote-browser/remote-browser-channel.js.map +1 -0
  240. package/dist/lib/components/realtime/remote-browser/remote-browser-surface.component.d.ts +346 -0
  241. package/dist/lib/components/realtime/remote-browser/remote-browser-surface.component.d.ts.map +1 -0
  242. package/dist/lib/components/realtime/remote-browser/remote-browser-surface.component.js +851 -0
  243. package/dist/lib/components/realtime/remote-browser/remote-browser-surface.component.js.map +1 -0
  244. package/dist/lib/components/realtime/remote-browser/remote-browser-tools.d.ts +86 -0
  245. package/dist/lib/components/realtime/remote-browser/remote-browser-tools.d.ts.map +1 -0
  246. package/dist/lib/components/realtime/remote-browser/remote-browser-tools.js +210 -0
  247. package/dist/lib/components/realtime/remote-browser/remote-browser-tools.js.map +1 -0
  248. package/dist/lib/components/realtime/whiteboard/whiteboard-artifact-viewer.component.d.ts +48 -0
  249. package/dist/lib/components/realtime/whiteboard/whiteboard-artifact-viewer.component.d.ts.map +1 -0
  250. package/dist/lib/components/realtime/whiteboard/whiteboard-artifact-viewer.component.js +180 -0
  251. package/dist/lib/components/realtime/whiteboard/whiteboard-artifact-viewer.component.js.map +1 -0
  252. package/dist/lib/components/realtime/whiteboard/whiteboard-channel.d.ts +119 -0
  253. package/dist/lib/components/realtime/whiteboard/whiteboard-channel.d.ts.map +1 -0
  254. package/dist/lib/components/realtime/whiteboard/whiteboard-channel.js +274 -0
  255. package/dist/lib/components/realtime/whiteboard/whiteboard-channel.js.map +1 -0
  256. package/dist/lib/components/slots/mj-chat-agent-presence-default.component.d.ts +11 -0
  257. package/dist/lib/components/slots/mj-chat-agent-presence-default.component.d.ts.map +1 -0
  258. package/dist/lib/components/slots/mj-chat-agent-presence-default.component.js +98 -0
  259. package/dist/lib/components/slots/mj-chat-agent-presence-default.component.js.map +1 -0
  260. package/dist/lib/components/slots/mj-chat-demonstration-surface-default.component.d.ts +9 -0
  261. package/dist/lib/components/slots/mj-chat-demonstration-surface-default.component.d.ts.map +1 -0
  262. package/dist/lib/components/slots/mj-chat-demonstration-surface-default.component.js +35 -0
  263. package/dist/lib/components/slots/mj-chat-demonstration-surface-default.component.js.map +1 -0
  264. package/dist/lib/components/slots/mj-chat-empty-state-default.component.d.ts +28 -0
  265. package/dist/lib/components/slots/mj-chat-empty-state-default.component.d.ts.map +1 -0
  266. package/dist/lib/components/slots/mj-chat-empty-state-default.component.js +104 -0
  267. package/dist/lib/components/slots/mj-chat-empty-state-default.component.js.map +1 -0
  268. package/dist/lib/components/slots/mj-chat-header-default.component.d.ts +11 -0
  269. package/dist/lib/components/slots/mj-chat-header-default.component.d.ts.map +1 -0
  270. package/dist/lib/components/slots/mj-chat-header-default.component.js +103 -0
  271. package/dist/lib/components/slots/mj-chat-header-default.component.js.map +1 -0
  272. package/dist/lib/components/slots/mj-chat-message-bubble-default.component.d.ts +15 -0
  273. package/dist/lib/components/slots/mj-chat-message-bubble-default.component.d.ts.map +1 -0
  274. package/dist/lib/components/slots/mj-chat-message-bubble-default.component.js +73 -0
  275. package/dist/lib/components/slots/mj-chat-message-bubble-default.component.js.map +1 -0
  276. package/dist/lib/components/slots/mj-chat-message-extra-default.component.d.ts +9 -0
  277. package/dist/lib/components/slots/mj-chat-message-extra-default.component.d.ts.map +1 -0
  278. package/dist/lib/components/slots/mj-chat-message-extra-default.component.js +34 -0
  279. package/dist/lib/components/slots/mj-chat-message-extra-default.component.js.map +1 -0
  280. package/dist/lib/components/slots/slot-interfaces.d.ts +95 -0
  281. package/dist/lib/components/slots/slot-interfaces.d.ts.map +1 -0
  282. package/dist/lib/components/slots/slot-interfaces.js +18 -0
  283. package/dist/lib/components/slots/slot-interfaces.js.map +1 -0
  284. package/dist/lib/components/workspace/conversation-workspace.component.d.ts +11 -0
  285. package/dist/lib/components/workspace/conversation-workspace.component.d.ts.map +1 -1
  286. package/dist/lib/components/workspace/conversation-workspace.component.js +28 -4
  287. package/dist/lib/components/workspace/conversation-workspace.component.js.map +1 -1
  288. package/dist/lib/conversations.module.d.ts +12 -1
  289. package/dist/lib/conversations.module.d.ts.map +1 -1
  290. package/dist/lib/conversations.module.js +93 -5
  291. package/dist/lib/conversations.module.js.map +1 -1
  292. package/dist/lib/directives/chat-slot.directive.d.ts +44 -0
  293. package/dist/lib/directives/chat-slot.directive.d.ts.map +1 -0
  294. package/dist/lib/directives/chat-slot.directive.js +54 -0
  295. package/dist/lib/directives/chat-slot.directive.js.map +1 -0
  296. package/dist/lib/events/chat-events.d.ts +137 -0
  297. package/dist/lib/events/chat-events.d.ts.map +1 -0
  298. package/dist/lib/events/chat-events.js +189 -0
  299. package/dist/lib/events/chat-events.js.map +1 -0
  300. package/dist/lib/models/conversation-state.model.d.ts +2 -1
  301. package/dist/lib/models/conversation-state.model.d.ts.map +1 -1
  302. package/dist/lib/models/conversation-state.model.js.map +1 -1
  303. package/dist/lib/services/artifact-state.service.d.ts.map +1 -1
  304. package/dist/lib/services/artifact-state.service.js +23 -6
  305. package/dist/lib/services/artifact-state.service.js.map +1 -1
  306. package/dist/lib/services/conversation-agent.service.d.ts +60 -74
  307. package/dist/lib/services/conversation-agent.service.d.ts.map +1 -1
  308. package/dist/lib/services/conversation-agent.service.js +100 -313
  309. package/dist/lib/services/conversation-agent.service.js.map +1 -1
  310. package/dist/lib/services/conversation-bridge.service.d.ts +11 -70
  311. package/dist/lib/services/conversation-bridge.service.d.ts.map +1 -1
  312. package/dist/lib/services/conversation-bridge.service.js +51 -85
  313. package/dist/lib/services/conversation-bridge.service.js.map +1 -1
  314. package/dist/lib/services/conversation-naming.d.ts +63 -0
  315. package/dist/lib/services/conversation-naming.d.ts.map +1 -0
  316. package/dist/lib/services/conversation-naming.js +58 -0
  317. package/dist/lib/services/conversation-naming.js.map +1 -0
  318. package/dist/lib/services/conversation-streaming.service.d.ts +24 -154
  319. package/dist/lib/services/conversation-streaming.service.d.ts.map +1 -1
  320. package/dist/lib/services/conversation-streaming.service.js +39 -361
  321. package/dist/lib/services/conversation-streaming.service.js.map +1 -1
  322. package/dist/lib/services/conversations-runtime-bootstrap.service.d.ts +10 -0
  323. package/dist/lib/services/conversations-runtime-bootstrap.service.d.ts.map +1 -0
  324. package/dist/lib/services/conversations-runtime-bootstrap.service.js +104 -0
  325. package/dist/lib/services/conversations-runtime-bootstrap.service.js.map +1 -0
  326. package/dist/lib/services/delegation-result-parser.d.ts +45 -0
  327. package/dist/lib/services/delegation-result-parser.d.ts.map +1 -0
  328. package/dist/lib/services/delegation-result-parser.js +48 -0
  329. package/dist/lib/services/delegation-result-parser.js.map +1 -0
  330. package/dist/lib/services/mention-autocomplete.service.d.ts +19 -4
  331. package/dist/lib/services/mention-autocomplete.service.d.ts.map +1 -1
  332. package/dist/lib/services/mention-autocomplete.service.js +65 -4
  333. package/dist/lib/services/mention-autocomplete.service.js.map +1 -1
  334. package/dist/lib/services/mention-parser.service.d.ts +8 -53
  335. package/dist/lib/services/mention-parser.service.d.ts.map +1 -1
  336. package/dist/lib/services/mention-parser.service.js +32 -243
  337. package/dist/lib/services/mention-parser.service.js.map +1 -1
  338. package/dist/lib/services/narration-template.d.ts +42 -0
  339. package/dist/lib/services/narration-template.d.ts.map +1 -0
  340. package/dist/lib/services/narration-template.js +73 -0
  341. package/dist/lib/services/narration-template.js.map +1 -0
  342. package/dist/lib/services/realtime-pairing.d.ts +120 -0
  343. package/dist/lib/services/realtime-pairing.d.ts.map +1 -0
  344. package/dist/lib/services/realtime-pairing.js +150 -0
  345. package/dist/lib/services/realtime-pairing.js.map +1 -0
  346. package/dist/lib/services/realtime-session-review.service.d.ts +233 -0
  347. package/dist/lib/services/realtime-session-review.service.d.ts.map +1 -0
  348. package/dist/lib/services/realtime-session-review.service.js +417 -0
  349. package/dist/lib/services/realtime-session-review.service.js.map +1 -0
  350. package/dist/lib/services/realtime-session.service.d.ts +739 -0
  351. package/dist/lib/services/realtime-session.service.d.ts.map +1 -0
  352. package/dist/lib/services/realtime-session.service.js +1647 -0
  353. package/dist/lib/services/realtime-session.service.js.map +1 -0
  354. package/dist/lib/services/realtime-sessions-adapter.d.ts +54 -0
  355. package/dist/lib/services/realtime-sessions-adapter.d.ts.map +1 -0
  356. package/dist/lib/services/realtime-sessions-adapter.js +154 -0
  357. package/dist/lib/services/realtime-sessions-adapter.js.map +1 -0
  358. package/dist/lib/services/user-authorization.d.ts +67 -0
  359. package/dist/lib/services/user-authorization.d.ts.map +1 -0
  360. package/dist/lib/services/user-authorization.js +66 -0
  361. package/dist/lib/services/user-authorization.js.map +1 -0
  362. package/dist/lib/utils/realtime-session-timeline.d.ts +84 -0
  363. package/dist/lib/utils/realtime-session-timeline.d.ts.map +1 -0
  364. package/dist/lib/utils/realtime-session-timeline.js +94 -0
  365. package/dist/lib/utils/realtime-session-timeline.js.map +1 -0
  366. package/dist/public-api.d.ts +41 -0
  367. package/dist/public-api.d.ts.map +1 -1
  368. package/dist/public-api.js +50 -0
  369. package/dist/public-api.js.map +1 -1
  370. package/package.json +27 -24
  371. package/dist/__tests__/conversation-bridge.service.test.d.ts +0 -2
  372. package/dist/__tests__/conversation-bridge.service.test.d.ts.map +0 -1
  373. package/dist/__tests__/conversation-bridge.service.test.js +0 -98
  374. package/dist/__tests__/conversation-bridge.service.test.js.map +0 -1
  375. package/dist/__tests__/mention-parser.test.d.ts +0 -2
  376. package/dist/__tests__/mention-parser.test.d.ts.map +0 -1
  377. package/dist/__tests__/mention-parser.test.js +0 -154
  378. package/dist/__tests__/mention-parser.test.js.map +0 -1
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Pure parsing of the serialized realtime tool result (`ResultJson`) the server's
3
+ * `RealtimeToolBroker` produces — `{ success, output, runId?, artifacts? }` on success or
4
+ * `{ success: false, error }` on failure. Kept framework-free (no Angular / GraphQL
5
+ * imports) so it is unit-testable in isolation and the {@link RealtimeSessionService}
6
+ * stays focused on session orchestration.
7
+ */
8
+ /**
9
+ * One artifact a delegated run produced, as reported in the tool ResultJson
10
+ * (`artifacts: [{ artifactId, artifactVersionId, name }]`). The call overlay opens each
11
+ * in its own artifact tab on the tabbed surface panel.
12
+ */
13
+ export interface ParsedDelegationArtifact {
14
+ /** The `MJ: Artifacts` row id. */
15
+ ArtifactID: string;
16
+ /** The `MJ: Artifact Versions` row id of the version the run produced. */
17
+ ArtifactVersionID: string;
18
+ /** The artifact's display name (used as the tab title). */
19
+ Name: string;
20
+ }
21
+ /** The normalized shape a tool ResultJson parses into. */
22
+ export interface ParsedDelegationResult {
23
+ /** Whether the delegated work succeeded (`success !== false`; non-JSON payloads default to true). */
24
+ Success: boolean;
25
+ /** The result text — the agent's output, or the structured error message on failure. */
26
+ Output: string;
27
+ /**
28
+ * ID of the delegated agent run (`MJ: AI Agent Runs`) when the server reported one
29
+ * (`runId` in the JSON). Lets developer tooling link straight to the run record.
30
+ */
31
+ RunID?: string;
32
+ /**
33
+ * Artifacts the delegated run produced, when the server reported any (`artifacts` in
34
+ * the JSON). Drives the overlay's auto-opened artifact tabs. `undefined` when absent,
35
+ * empty, or malformed.
36
+ */
37
+ Artifacts?: ParsedDelegationArtifact[];
38
+ }
39
+ /**
40
+ * Parses the broker's `{success, output, runId, artifacts}` | `{success:false, error}` ResultJson.
41
+ * If the payload isn't JSON, the raw string is surfaced as the output (success assumed) —
42
+ * mirroring the spoken path, which feeds whatever came back to the model verbatim.
43
+ */
44
+ export declare function ParseDelegationResultJson(resultJson: string): ParsedDelegationResult;
45
+ //# sourceMappingURL=delegation-result-parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delegation-result-parser.d.ts","sourceRoot":"","sources":["../../../src/lib/services/delegation-result-parser.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;;;GAIG;AACH,MAAM,WAAW,wBAAwB;IACvC,kCAAkC;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,0EAA0E;IAC1E,iBAAiB,EAAE,MAAM,CAAC;IAC1B,2DAA2D;IAC3D,IAAI,EAAE,MAAM,CAAC;CACd;AAED,0DAA0D;AAC1D,MAAM,WAAW,sBAAsB;IACrC,qGAAqG;IACrG,OAAO,EAAE,OAAO,CAAC;IACjB,wFAAwF;IACxF,MAAM,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;OAIG;IACH,SAAS,CAAC,EAAE,wBAAwB,EAAE,CAAC;CACxC;AASD;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,UAAU,EAAE,MAAM,GAAG,sBAAsB,CAkBpF"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Pure parsing of the serialized realtime tool result (`ResultJson`) the server's
3
+ * `RealtimeToolBroker` produces — `{ success, output, runId?, artifacts? }` on success or
4
+ * `{ success: false, error }` on failure. Kept framework-free (no Angular / GraphQL
5
+ * imports) so it is unit-testable in isolation and the {@link RealtimeSessionService}
6
+ * stays focused on session orchestration.
7
+ */
8
+ /**
9
+ * Parses the broker's `{success, output, runId, artifacts}` | `{success:false, error}` ResultJson.
10
+ * If the payload isn't JSON, the raw string is surfaced as the output (success assumed) —
11
+ * mirroring the spoken path, which feeds whatever came back to the model verbatim.
12
+ */
13
+ export function ParseDelegationResultJson(resultJson) {
14
+ try {
15
+ const parsed = JSON.parse(resultJson);
16
+ return {
17
+ Success: parsed.success !== false,
18
+ Output: parsed.output ?? parsed.error ?? '',
19
+ RunID: typeof parsed.runId === 'string' && parsed.runId.length > 0 ? parsed.runId : undefined,
20
+ Artifacts: parseArtifacts(parsed.artifacts)
21
+ };
22
+ }
23
+ catch {
24
+ return { Success: true, Output: resultJson };
25
+ }
26
+ }
27
+ /**
28
+ * Normalizes the raw `artifacts` array: entries must carry non-empty `artifactId` and
29
+ * `artifactVersionId` strings (malformed entries are dropped); a missing/blank `name`
30
+ * falls back to `"Artifact"`. Returns `undefined` when nothing valid remains.
31
+ */
32
+ function parseArtifacts(raw) {
33
+ if (!Array.isArray(raw)) {
34
+ return undefined;
35
+ }
36
+ const artifacts = [];
37
+ for (const entry of raw) {
38
+ const artifactId = typeof entry?.artifactId === 'string' ? entry.artifactId : '';
39
+ const versionId = typeof entry?.artifactVersionId === 'string' ? entry.artifactVersionId : '';
40
+ if (artifactId.length === 0 || versionId.length === 0) {
41
+ continue;
42
+ }
43
+ const name = typeof entry.name === 'string' && entry.name.trim().length > 0 ? entry.name.trim() : 'Artifact';
44
+ artifacts.push({ ArtifactID: artifactId, ArtifactVersionID: versionId, Name: name });
45
+ }
46
+ return artifacts.length > 0 ? artifacts : undefined;
47
+ }
48
+ //# sourceMappingURL=delegation-result-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delegation-result-parser.js","sourceRoot":"","sources":["../../../src/lib/services/delegation-result-parser.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AA0CH;;;;GAIG;AACH,MAAM,UAAU,yBAAyB,CAAC,UAAkB;IAC1D,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAMnC,CAAC;QACF,OAAO;YACL,OAAO,EAAE,MAAM,CAAC,OAAO,KAAK,KAAK;YACjC,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,KAAK,IAAI,EAAE;YAC3C,KAAK,EAAE,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;YAC7F,SAAS,EAAE,cAAc,CAAC,MAAM,CAAC,SAAS,CAAC;SAC5C,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;IAC/C,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,SAAS,cAAc,CAAC,GAAY;IAClC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACxB,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,SAAS,GAA+B,EAAE,CAAC;IACjD,KAAK,MAAM,KAAK,IAAI,GAA8B,EAAE,CAAC;QACnD,MAAM,UAAU,GAAG,OAAO,KAAK,EAAE,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;QACjF,MAAM,SAAS,GAAG,OAAO,KAAK,EAAE,iBAAiB,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9F,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtD,SAAS;QACX,CAAC;QACD,MAAM,IAAI,GAAG,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC;QAC7G,SAAS,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,UAAU,EAAE,iBAAiB,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IACvF,CAAC;IACD,OAAO,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;AACtD,CAAC","sourcesContent":["/**\n * Pure parsing of the serialized realtime tool result (`ResultJson`) the server's\n * `RealtimeToolBroker` produces — `{ success, output, runId?, artifacts? }` on success or\n * `{ success: false, error }` on failure. Kept framework-free (no Angular / GraphQL\n * imports) so it is unit-testable in isolation and the {@link RealtimeSessionService}\n * stays focused on session orchestration.\n */\n\n/**\n * One artifact a delegated run produced, as reported in the tool ResultJson\n * (`artifacts: [{ artifactId, artifactVersionId, name }]`). The call overlay opens each\n * in its own artifact tab on the tabbed surface panel.\n */\nexport interface ParsedDelegationArtifact {\n /** The `MJ: Artifacts` row id. */\n ArtifactID: string;\n /** The `MJ: Artifact Versions` row id of the version the run produced. */\n ArtifactVersionID: string;\n /** The artifact's display name (used as the tab title). */\n Name: string;\n}\n\n/** The normalized shape a tool ResultJson parses into. */\nexport interface ParsedDelegationResult {\n /** Whether the delegated work succeeded (`success !== false`; non-JSON payloads default to true). */\n Success: boolean;\n /** The result text — the agent's output, or the structured error message on failure. */\n Output: string;\n /**\n * ID of the delegated agent run (`MJ: AI Agent Runs`) when the server reported one\n * (`runId` in the JSON). Lets developer tooling link straight to the run record.\n */\n RunID?: string;\n /**\n * Artifacts the delegated run produced, when the server reported any (`artifacts` in\n * the JSON). Drives the overlay's auto-opened artifact tabs. `undefined` when absent,\n * empty, or malformed.\n */\n Artifacts?: ParsedDelegationArtifact[];\n}\n\n/** The raw camelCase artifact entry shape the broker serializes. */\ninterface RawDelegationArtifact {\n artifactId?: unknown;\n artifactVersionId?: unknown;\n name?: unknown;\n}\n\n/**\n * Parses the broker's `{success, output, runId, artifacts}` | `{success:false, error}` ResultJson.\n * If the payload isn't JSON, the raw string is surfaced as the output (success assumed) —\n * mirroring the spoken path, which feeds whatever came back to the model verbatim.\n */\nexport function ParseDelegationResultJson(resultJson: string): ParsedDelegationResult {\n try {\n const parsed = JSON.parse(resultJson) as {\n success?: boolean;\n output?: string;\n error?: string;\n runId?: string;\n artifacts?: unknown;\n };\n return {\n Success: parsed.success !== false,\n Output: parsed.output ?? parsed.error ?? '',\n RunID: typeof parsed.runId === 'string' && parsed.runId.length > 0 ? parsed.runId : undefined,\n Artifacts: parseArtifacts(parsed.artifacts)\n };\n } catch {\n return { Success: true, Output: resultJson };\n }\n}\n\n/**\n * Normalizes the raw `artifacts` array: entries must carry non-empty `artifactId` and\n * `artifactVersionId` strings (malformed entries are dropped); a missing/blank `name`\n * falls back to `\"Artifact\"`. Returns `undefined` when nothing valid remains.\n */\nfunction parseArtifacts(raw: unknown): ParsedDelegationArtifact[] | undefined {\n if (!Array.isArray(raw)) {\n return undefined;\n }\n const artifacts: ParsedDelegationArtifact[] = [];\n for (const entry of raw as RawDelegationArtifact[]) {\n const artifactId = typeof entry?.artifactId === 'string' ? entry.artifactId : '';\n const versionId = typeof entry?.artifactVersionId === 'string' ? entry.artifactVersionId : '';\n if (artifactId.length === 0 || versionId.length === 0) {\n continue;\n }\n const name = typeof entry.name === 'string' && entry.name.trim().length > 0 ? entry.name.trim() : 'Artifact';\n artifacts.push({ ArtifactID: artifactId, ArtifactVersionID: versionId, Name: name });\n }\n return artifacts.length > 0 ? artifacts : undefined;\n}\n"]}
@@ -1,11 +1,11 @@
1
1
  import { MJAIAgentEntityExtended } from '@memberjunction/ai-core-plus';
2
- import { UserInfo } from '@memberjunction/core';
2
+ import { UserInfo, EntityInfo, IMetadataProvider } from '@memberjunction/core';
3
3
  import * as i0 from "@angular/core";
4
4
  /**
5
5
  * Item in the autocomplete dropdown
6
6
  */
7
7
  export interface MentionSuggestion {
8
- type: 'agent' | 'user';
8
+ type: 'agent' | 'user' | 'entity';
9
9
  id: string;
10
10
  name: string;
11
11
  displayName: string;
@@ -20,6 +20,7 @@ export interface MentionSuggestion {
20
20
  export declare class MentionAutocompleteService {
21
21
  private agentsCache;
22
22
  private usersCache;
23
+ private entitiesCache;
23
24
  private isInitialized;
24
25
  private initializationPromise;
25
26
  constructor();
@@ -27,7 +28,7 @@ export declare class MentionAutocompleteService {
27
28
  * Initialize the service by loading agents and users
28
29
  * Prevents concurrent initialization with promise lock
29
30
  */
30
- initialize(currentUser: UserInfo): Promise<void>;
31
+ initialize(currentUser: UserInfo, provider?: IMetadataProvider): Promise<void>;
31
32
  /**
32
33
  * Internal initialization logic
33
34
  */
@@ -38,13 +39,23 @@ export declare class MentionAutocompleteService {
38
39
  * Agents with explicit permission records are checked against the user.
39
40
  */
40
41
  private filterAgentsByRunPermission;
42
+ /**
43
+ * Load entities the current user has read permission for.
44
+ * These are the candidates surfaced for #entity mentions.
45
+ */
46
+ private loadReadableEntities;
41
47
  /**
42
48
  * Get suggestions based on search query
43
49
  * @param query The search text after @ symbol
44
50
  * @param includeUsers Whether to include users in suggestions
45
51
  * @returns Filtered and ranked suggestions
46
52
  */
47
- getSuggestions(query: string, includeUsers?: boolean): MentionSuggestion[];
53
+ getSuggestions(query: string, includeUsers?: boolean, trigger?: string): MentionSuggestion[];
54
+ /**
55
+ * Get entity suggestions for #entity mentions, ranked by query match.
56
+ * Capped to keep the dropdown light (entity sets can be large).
57
+ */
58
+ private getEntitySuggestions;
48
59
  /**
49
60
  * Calculate match score for ranking
50
61
  * Higher score = better match
@@ -62,6 +73,10 @@ export declare class MentionAutocompleteService {
62
73
  * Get available users for parsing
63
74
  */
64
75
  getAvailableUsers(): UserInfo[];
76
+ /**
77
+ * Get available entities for parsing
78
+ */
79
+ getAvailableEntities(): EntityInfo[];
65
80
  /**
66
81
  * Refresh the caches
67
82
  * Resets initialization state and reloads agents
@@ -1 +1 @@
1
- {"version":3,"file":"mention-autocomplete.service.d.ts","sourceRoot":"","sources":["../../../src/lib/services/mention-autocomplete.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;;AAGhD;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,OAAO,GAAG,MAAM,CAAC;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,qBAGa,0BAA0B;IACrC,OAAO,CAAC,WAAW,CAAiC;IACpD,OAAO,CAAC,UAAU,CAAkB;IACpC,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,qBAAqB,CAA8B;;IAI3D;;;OAGG;IACG,UAAU,CAAC,WAAW,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAqBtD;;OAEG;YACW,mBAAmB;IA0BjC;;;;OAIG;YACW,2BAA2B;IAkBzC;;;;;OAKG;IACH,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,GAAE,OAAc,GAAG,iBAAiB,EAAE;IAmDhF;;;OAGG;IACH,OAAO,CAAC,mBAAmB;IAwB3B;;OAEG;IACH,OAAO,CAAC,YAAY;IAepB;;OAEG;IACH,kBAAkB,IAAI,uBAAuB,EAAE;IAI/C;;OAEG;IACH,iBAAiB,IAAI,QAAQ,EAAE;IAI/B;;;OAGG;IACG,OAAO,CAAC,WAAW,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;yCA9MxC,0BAA0B;6CAA1B,0BAA0B;CAmNtC"}
1
+ {"version":3,"file":"mention-autocomplete.service.d.ts","sourceRoot":"","sources":["../../../src/lib/services/mention-autocomplete.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAE,QAAQ,EAAY,UAAU,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;;AAGzF;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,QAAQ,CAAC;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,qBAGa,0BAA0B;IACrC,OAAO,CAAC,WAAW,CAAiC;IACpD,OAAO,CAAC,UAAU,CAAkB;IACpC,OAAO,CAAC,aAAa,CAAoB;IACzC,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,qBAAqB,CAA8B;;IAI3D;;;OAGG;IACG,UAAU,CAAC,WAAW,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAqBpF;;OAEG;YACW,mBAAmB;IA6BjC;;;;OAIG;YACW,2BAA2B;IAkBzC;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IAiB5B;;;;;OAKG;IACH,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,GAAE,OAAc,EAAE,OAAO,GAAE,MAAY,GAAG,iBAAiB,EAAE;IAwDvG;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IAsB5B;;;OAGG;IACH,OAAO,CAAC,mBAAmB;IAwB3B;;OAEG;IACH,OAAO,CAAC,YAAY;IAepB;;OAEG;IACH,kBAAkB,IAAI,uBAAuB,EAAE;IAI/C;;OAEG;IACH,iBAAiB,IAAI,QAAQ,EAAE;IAI/B;;OAEG;IACH,oBAAoB,IAAI,UAAU,EAAE;IAIpC;;;OAGG;IACG,OAAO,CAAC,WAAW,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;yCA7QxC,0BAA0B;6CAA1B,0BAA0B;CAkRtC"}
@@ -1,4 +1,5 @@
1
1
  import { Injectable } from '@angular/core';
2
+ import { Metadata } from '@memberjunction/core';
2
3
  import { AIEngineBase, AIAgentPermissionHelper } from '@memberjunction/ai-engine-base';
3
4
  import * as i0 from "@angular/core";
4
5
  /**
@@ -7,6 +8,7 @@ import * as i0 from "@angular/core";
7
8
  export class MentionAutocompleteService {
8
9
  agentsCache = [];
9
10
  usersCache = [];
11
+ entitiesCache = [];
10
12
  isInitialized = false;
11
13
  initializationPromise = null;
12
14
  constructor() { }
@@ -14,7 +16,7 @@ export class MentionAutocompleteService {
14
16
  * Initialize the service by loading agents and users
15
17
  * Prevents concurrent initialization with promise lock
16
18
  */
17
- async initialize(currentUser) {
19
+ async initialize(currentUser, provider) {
18
20
  // If already initialized, return immediately
19
21
  if (this.isInitialized) {
20
22
  return;
@@ -24,7 +26,7 @@ export class MentionAutocompleteService {
24
26
  return this.initializationPromise;
25
27
  }
26
28
  // Create initialization promise and store it
27
- this.initializationPromise = this._initializeInternal(currentUser);
29
+ this.initializationPromise = this._initializeInternal(currentUser, provider);
28
30
  try {
29
31
  await this.initializationPromise;
30
32
  }
@@ -35,7 +37,7 @@ export class MentionAutocompleteService {
35
37
  /**
36
38
  * Internal initialization logic
37
39
  */
38
- async _initializeInternal(currentUser) {
40
+ async _initializeInternal(currentUser, provider) {
39
41
  try {
40
42
  // Load agents from AIEngineBase
41
43
  await AIEngineBase.Instance.Config(false);
@@ -47,6 +49,8 @@ export class MentionAutocompleteService {
47
49
  // Load users from the system (optional - can be expanded later)
48
50
  // For now, we'll just use the current user
49
51
  this.usersCache = [currentUser];
52
+ // Load entities the current user can read (candidates for #entity mentions)
53
+ this.entitiesCache = this.loadReadableEntities(currentUser, provider);
50
54
  this.isInitialized = true;
51
55
  }
52
56
  catch (error) {
@@ -74,13 +78,39 @@ export class MentionAutocompleteService {
74
78
  }
75
79
  return permitted;
76
80
  }
81
+ /**
82
+ * Load entities the current user has read permission for.
83
+ * These are the candidates surfaced for #entity mentions.
84
+ */
85
+ loadReadableEntities(user, provider) {
86
+ try {
87
+ const md = provider ?? new Metadata();
88
+ return (md.Entities || []).filter(entity => {
89
+ try {
90
+ return entity.GetUserPermisions(user).CanRead;
91
+ }
92
+ catch {
93
+ // Fail closed — exclude entity on permission-check error
94
+ return false;
95
+ }
96
+ });
97
+ }
98
+ catch (error) {
99
+ console.error('Failed to load entities for mention autocomplete:', error);
100
+ return [];
101
+ }
102
+ }
77
103
  /**
78
104
  * Get suggestions based on search query
79
105
  * @param query The search text after @ symbol
80
106
  * @param includeUsers Whether to include users in suggestions
81
107
  * @returns Filtered and ranked suggestions
82
108
  */
83
- getSuggestions(query, includeUsers = true) {
109
+ getSuggestions(query, includeUsers = true, trigger = '@') {
110
+ // The '#' trigger searches entities; '@' searches agents + users
111
+ if (trigger === '#') {
112
+ return this.getEntitySuggestions(query);
113
+ }
84
114
  const lowerQuery = query.toLowerCase().trim();
85
115
  const suggestions = [];
86
116
  // Add agent suggestions
@@ -127,6 +157,31 @@ export class MentionAutocompleteService {
127
157
  return a.name.localeCompare(b.name);
128
158
  });
129
159
  }
160
+ /**
161
+ * Get entity suggestions for #entity mentions, ranked by query match.
162
+ * Capped to keep the dropdown light (entity sets can be large).
163
+ */
164
+ getEntitySuggestions(query) {
165
+ const lowerQuery = query.toLowerCase().trim();
166
+ const MAX_ENTITY_SUGGESTIONS = 12;
167
+ return this.entitiesCache
168
+ .map(entity => ({ entity, score: this.calculateMatchScore(entity.Name || '', lowerQuery) }))
169
+ .filter(x => x.score > 0 || !lowerQuery)
170
+ .sort((a, b) => {
171
+ if (b.score !== a.score)
172
+ return b.score - a.score;
173
+ return (a.entity.Name || '').localeCompare(b.entity.Name || '');
174
+ })
175
+ .slice(0, MAX_ENTITY_SUGGESTIONS)
176
+ .map(({ entity }) => ({
177
+ type: 'entity',
178
+ id: entity.ID,
179
+ name: entity.Name,
180
+ displayName: entity.Name,
181
+ description: entity.Description || undefined,
182
+ icon: 'fa-solid fa-table'
183
+ }));
184
+ }
130
185
  /**
131
186
  * Calculate match score for ranking
132
187
  * Higher score = better match
@@ -186,6 +241,12 @@ export class MentionAutocompleteService {
186
241
  getAvailableUsers() {
187
242
  return this.usersCache;
188
243
  }
244
+ /**
245
+ * Get available entities for parsing
246
+ */
247
+ getAvailableEntities() {
248
+ return this.entitiesCache;
249
+ }
189
250
  /**
190
251
  * Refresh the caches
191
252
  * Resets initialization state and reloads agents
@@ -1 +1 @@
1
- {"version":3,"file":"mention-autocomplete.service.js","sourceRoot":"","sources":["../../../src/lib/services/mention-autocomplete.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { Injectable } from '@angular/core';\nimport { MJAIAgentEntityExtended } from '@memberjunction/ai-core-plus';\nimport { UserInfo } from '@memberjunction/core';\nimport { AIEngineBase, AIAgentPermissionHelper } from '@memberjunction/ai-engine-base';\n\n/**\n * Item in the autocomplete dropdown\n */\nexport interface MentionSuggestion {\n type: 'agent' | 'user';\n id: string;\n name: string;\n displayName: string;\n description?: string;\n avatarUrl?: string; // Deprecated, use imageUrl\n imageUrl?: string; // For agent LogoURL or user avatar\n icon?: string; // For agents (FontAwesome class)\n}\n\n/**\n * Service for autocomplete suggestions when typing @mentions\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class MentionAutocompleteService {\n private agentsCache: MJAIAgentEntityExtended[] = [];\n private usersCache: UserInfo[] = [];\n private isInitialized = false;\n private initializationPromise: Promise<void> | null = null;\n\n constructor() {}\n\n /**\n * Initialize the service by loading agents and users\n * Prevents concurrent initialization with promise lock\n */\n async initialize(currentUser: UserInfo): Promise<void> {\n // If already initialized, return immediately\n if (this.isInitialized) {\n return;\n }\n\n // If initialization is in progress, wait for it\n if (this.initializationPromise) {\n return this.initializationPromise;\n }\n\n // Create initialization promise and store it\n this.initializationPromise = this._initializeInternal(currentUser);\n\n try {\n await this.initializationPromise;\n } finally {\n this.initializationPromise = null;\n }\n }\n\n /**\n * Internal initialization logic\n */\n private async _initializeInternal(currentUser: UserInfo): Promise<void> {\n try {\n // Load agents from AIEngineBase\n await AIEngineBase.Instance.Config(false);\n\n const allAgents = AIEngineBase.Instance.Agents || [];\n\n // Filter by status, hierarchy, and invocation mode first\n const candidateAgents = allAgents.filter(\n a => !a.ParentID && a.Status === 'Active' && a.InvocationMode !== 'Sub-Agent' && !a.IsRestricted\n );\n\n // Filter by user's 'run' permission — respects open-by-default + explicit permissions\n this.agentsCache = await this.filterAgentsByRunPermission(candidateAgents, currentUser);\n\n // Load users from the system (optional - can be expanded later)\n // For now, we'll just use the current user\n this.usersCache = [currentUser];\n\n this.isInitialized = true;\n } catch (error) {\n console.error('Failed to initialize MentionAutocompleteService:', error);\n throw error;\n }\n }\n\n /**\n * Filter agents to only those the current user has 'run' permission for.\n * Agents with no permission records are open to everyone (canRun = true).\n * Agents with explicit permission records are checked against the user.\n */\n private async filterAgentsByRunPermission(\n agents: MJAIAgentEntityExtended[],\n user: UserInfo\n ): Promise<MJAIAgentEntityExtended[]> {\n const permitted: MJAIAgentEntityExtended[] = [];\n for (const agent of agents) {\n try {\n const canRun = await AIAgentPermissionHelper.HasPermission(agent.ID, user, 'run');\n if (canRun) {\n permitted.push(agent);\n }\n } catch {\n // Fail closed — exclude agent on error\n }\n }\n return permitted;\n }\n\n /**\n * Get suggestions based on search query\n * @param query The search text after @ symbol\n * @param includeUsers Whether to include users in suggestions\n * @returns Filtered and ranked suggestions\n */\n getSuggestions(query: string, includeUsers: boolean = true): MentionSuggestion[] {\n const lowerQuery = query.toLowerCase().trim();\n const suggestions: MentionSuggestion[] = [];\n\n // Add agent suggestions\n for (const agent of this.agentsCache) {\n const score = this.calculateMatchScore(agent.Name || '', lowerQuery);\n if (score > 0 || !lowerQuery) {\n suggestions.push({\n type: 'agent',\n id: agent.ID,\n name: agent.Name || 'Unknown',\n displayName: agent.Name || 'Unknown',\n description: agent.Description || undefined,\n imageUrl: agent.LogoURL || undefined, // Agent logo/avatar image\n icon: this.getAgentIcon(agent)\n });\n }\n }\n\n // Add user suggestions (if enabled)\n if (includeUsers) {\n for (const user of this.usersCache) {\n const score = this.calculateMatchScore(user.Name, lowerQuery);\n if (score > 0 || !lowerQuery) {\n suggestions.push({\n type: 'user',\n id: user.ID,\n name: user.Name,\n displayName: user.Name,\n description: user.Email || undefined,\n avatarUrl: undefined // Future: load user avatars\n });\n }\n }\n }\n\n // Sort by relevance: exact match > starts with > contains\n return suggestions.sort((a, b) => {\n const scoreA = this.calculateMatchScore(a.name, lowerQuery);\n const scoreB = this.calculateMatchScore(b.name, lowerQuery);\n if (scoreB !== scoreA) return scoreB - scoreA;\n\n // If scores are equal, sort agents before users\n if (a.type !== b.type) return a.type === 'agent' ? -1 : 1;\n\n // Otherwise alphabetically\n return a.name.localeCompare(b.name);\n });\n }\n\n /**\n * Calculate match score for ranking\n * Higher score = better match\n */\n private calculateMatchScore(name: string, query: string): number {\n if (!query) return 1; // Show all if no query\n\n const lowerName = name.toLowerCase();\n const lowerQuery = query.toLowerCase();\n\n // Exact match\n if (lowerName === lowerQuery) return 100;\n\n // Starts with\n if (lowerName.startsWith(lowerQuery)) return 50;\n\n // Contains\n if (lowerName.includes(lowerQuery)) return 25;\n\n // Word boundary match (e.g., \"MA\" matches \"Marketing Agent\")\n const words = lowerName.split(/\\s+/);\n for (const word of words) {\n if (word.startsWith(lowerQuery)) return 40;\n }\n\n return 0; // No match\n }\n\n /**\n * Get icon for agent based on type/name\n */\n private getAgentIcon(agent: MJAIAgentEntityExtended): string {\n // Use agent's icon if available, otherwise default based on type\n if (agent.IconClass) return agent.IconClass;\n\n // Default icons based on agent name patterns\n const name = agent.Name?.toLowerCase() || '';\n if (name.includes('marketing')) return 'fa-megaphone';\n if (name.includes('data') || name.includes('analysis')) return 'fa-chart-line';\n if (name.includes('code') || name.includes('developer')) return 'fa-code';\n if (name.includes('design')) return 'fa-palette';\n if (name.includes('conversation') || name.includes('manager')) return 'fa-comments';\n\n return 'fa-robot'; // Default\n }\n\n /**\n * Get available agents for parsing\n */\n getAvailableAgents(): MJAIAgentEntityExtended[] {\n return this.agentsCache;\n }\n\n /**\n * Get available users for parsing\n */\n getAvailableUsers(): UserInfo[] {\n return this.usersCache;\n }\n\n /**\n * Refresh the caches\n * Resets initialization state and reloads agents\n */\n async refresh(currentUser: UserInfo): Promise<void> {\n this.isInitialized = false;\n this.initializationPromise = null;\n await this.initialize(currentUser);\n }\n}\n"]}
1
+ {"version":3,"file":"mention-autocomplete.service.js","sourceRoot":"","sources":["../../../src/lib/services/mention-autocomplete.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { Injectable } from '@angular/core';\nimport { MJAIAgentEntityExtended } from '@memberjunction/ai-core-plus';\nimport { UserInfo, Metadata, EntityInfo, IMetadataProvider } from '@memberjunction/core';\nimport { AIEngineBase, AIAgentPermissionHelper } from '@memberjunction/ai-engine-base';\n\n/**\n * Item in the autocomplete dropdown\n */\nexport interface MentionSuggestion {\n type: 'agent' | 'user' | 'entity';\n id: string;\n name: string;\n displayName: string;\n description?: string;\n avatarUrl?: string; // Deprecated, use imageUrl\n imageUrl?: string; // For agent LogoURL or user avatar\n icon?: string; // For agents (FontAwesome class)\n}\n\n/**\n * Service for autocomplete suggestions when typing @mentions\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class MentionAutocompleteService {\n private agentsCache: MJAIAgentEntityExtended[] = [];\n private usersCache: UserInfo[] = [];\n private entitiesCache: EntityInfo[] = [];\n private isInitialized = false;\n private initializationPromise: Promise<void> | null = null;\n\n constructor() {}\n\n /**\n * Initialize the service by loading agents and users\n * Prevents concurrent initialization with promise lock\n */\n async initialize(currentUser: UserInfo, provider?: IMetadataProvider): Promise<void> {\n // If already initialized, return immediately\n if (this.isInitialized) {\n return;\n }\n\n // If initialization is in progress, wait for it\n if (this.initializationPromise) {\n return this.initializationPromise;\n }\n\n // Create initialization promise and store it\n this.initializationPromise = this._initializeInternal(currentUser, provider);\n\n try {\n await this.initializationPromise;\n } finally {\n this.initializationPromise = null;\n }\n }\n\n /**\n * Internal initialization logic\n */\n private async _initializeInternal(currentUser: UserInfo, provider?: IMetadataProvider): Promise<void> {\n try {\n // Load agents from AIEngineBase\n await AIEngineBase.Instance.Config(false);\n\n const allAgents = AIEngineBase.Instance.Agents || [];\n\n // Filter by status, hierarchy, and invocation mode first\n const candidateAgents = allAgents.filter(\n a => !a.ParentID && a.Status === 'Active' && a.InvocationMode !== 'Sub-Agent' && !a.IsRestricted\n );\n\n // Filter by user's 'run' permission — respects open-by-default + explicit permissions\n this.agentsCache = await this.filterAgentsByRunPermission(candidateAgents, currentUser);\n\n // Load users from the system (optional - can be expanded later)\n // For now, we'll just use the current user\n this.usersCache = [currentUser];\n\n // Load entities the current user can read (candidates for #entity mentions)\n this.entitiesCache = this.loadReadableEntities(currentUser, provider);\n\n this.isInitialized = true;\n } catch (error) {\n console.error('Failed to initialize MentionAutocompleteService:', error);\n throw error;\n }\n }\n\n /**\n * Filter agents to only those the current user has 'run' permission for.\n * Agents with no permission records are open to everyone (canRun = true).\n * Agents with explicit permission records are checked against the user.\n */\n private async filterAgentsByRunPermission(\n agents: MJAIAgentEntityExtended[],\n user: UserInfo\n ): Promise<MJAIAgentEntityExtended[]> {\n const permitted: MJAIAgentEntityExtended[] = [];\n for (const agent of agents) {\n try {\n const canRun = await AIAgentPermissionHelper.HasPermission(agent.ID, user, 'run');\n if (canRun) {\n permitted.push(agent);\n }\n } catch {\n // Fail closed — exclude agent on error\n }\n }\n return permitted;\n }\n\n /**\n * Load entities the current user has read permission for.\n * These are the candidates surfaced for #entity mentions.\n */\n private loadReadableEntities(user: UserInfo, provider?: IMetadataProvider): EntityInfo[] {\n try {\n const md = provider ?? new Metadata();\n return (md.Entities || []).filter(entity => {\n try {\n return entity.GetUserPermisions(user).CanRead;\n } catch {\n // Fail closed — exclude entity on permission-check error\n return false;\n }\n });\n } catch (error) {\n console.error('Failed to load entities for mention autocomplete:', error);\n return [];\n }\n }\n\n /**\n * Get suggestions based on search query\n * @param query The search text after @ symbol\n * @param includeUsers Whether to include users in suggestions\n * @returns Filtered and ranked suggestions\n */\n getSuggestions(query: string, includeUsers: boolean = true, trigger: string = '@'): MentionSuggestion[] {\n // The '#' trigger searches entities; '@' searches agents + users\n if (trigger === '#') {\n return this.getEntitySuggestions(query);\n }\n\n const lowerQuery = query.toLowerCase().trim();\n const suggestions: MentionSuggestion[] = [];\n\n // Add agent suggestions\n for (const agent of this.agentsCache) {\n const score = this.calculateMatchScore(agent.Name || '', lowerQuery);\n if (score > 0 || !lowerQuery) {\n suggestions.push({\n type: 'agent',\n id: agent.ID,\n name: agent.Name || 'Unknown',\n displayName: agent.Name || 'Unknown',\n description: agent.Description || undefined,\n imageUrl: agent.LogoURL || undefined, // Agent logo/avatar image\n icon: this.getAgentIcon(agent)\n });\n }\n }\n\n // Add user suggestions (if enabled)\n if (includeUsers) {\n for (const user of this.usersCache) {\n const score = this.calculateMatchScore(user.Name, lowerQuery);\n if (score > 0 || !lowerQuery) {\n suggestions.push({\n type: 'user',\n id: user.ID,\n name: user.Name,\n displayName: user.Name,\n description: user.Email || undefined,\n avatarUrl: undefined // Future: load user avatars\n });\n }\n }\n }\n\n // Sort by relevance: exact match > starts with > contains\n return suggestions.sort((a, b) => {\n const scoreA = this.calculateMatchScore(a.name, lowerQuery);\n const scoreB = this.calculateMatchScore(b.name, lowerQuery);\n if (scoreB !== scoreA) return scoreB - scoreA;\n\n // If scores are equal, sort agents before users\n if (a.type !== b.type) return a.type === 'agent' ? -1 : 1;\n\n // Otherwise alphabetically\n return a.name.localeCompare(b.name);\n });\n }\n\n /**\n * Get entity suggestions for #entity mentions, ranked by query match.\n * Capped to keep the dropdown light (entity sets can be large).\n */\n private getEntitySuggestions(query: string): MentionSuggestion[] {\n const lowerQuery = query.toLowerCase().trim();\n const MAX_ENTITY_SUGGESTIONS = 12;\n\n return this.entitiesCache\n .map(entity => ({ entity, score: this.calculateMatchScore(entity.Name || '', lowerQuery) }))\n .filter(x => x.score > 0 || !lowerQuery)\n .sort((a, b) => {\n if (b.score !== a.score) return b.score - a.score;\n return (a.entity.Name || '').localeCompare(b.entity.Name || '');\n })\n .slice(0, MAX_ENTITY_SUGGESTIONS)\n .map(({ entity }) => ({\n type: 'entity' as const,\n id: entity.ID,\n name: entity.Name,\n displayName: entity.Name,\n description: entity.Description || undefined,\n icon: 'fa-solid fa-table'\n }));\n }\n\n /**\n * Calculate match score for ranking\n * Higher score = better match\n */\n private calculateMatchScore(name: string, query: string): number {\n if (!query) return 1; // Show all if no query\n\n const lowerName = name.toLowerCase();\n const lowerQuery = query.toLowerCase();\n\n // Exact match\n if (lowerName === lowerQuery) return 100;\n\n // Starts with\n if (lowerName.startsWith(lowerQuery)) return 50;\n\n // Contains\n if (lowerName.includes(lowerQuery)) return 25;\n\n // Word boundary match (e.g., \"MA\" matches \"Marketing Agent\")\n const words = lowerName.split(/\\s+/);\n for (const word of words) {\n if (word.startsWith(lowerQuery)) return 40;\n }\n\n return 0; // No match\n }\n\n /**\n * Get icon for agent based on type/name\n */\n private getAgentIcon(agent: MJAIAgentEntityExtended): string {\n // Use agent's icon if available, otherwise default based on type\n if (agent.IconClass) return agent.IconClass;\n\n // Default icons based on agent name patterns\n const name = agent.Name?.toLowerCase() || '';\n if (name.includes('marketing')) return 'fa-megaphone';\n if (name.includes('data') || name.includes('analysis')) return 'fa-chart-line';\n if (name.includes('code') || name.includes('developer')) return 'fa-code';\n if (name.includes('design')) return 'fa-palette';\n if (name.includes('conversation') || name.includes('manager')) return 'fa-comments';\n\n return 'fa-robot'; // Default\n }\n\n /**\n * Get available agents for parsing\n */\n getAvailableAgents(): MJAIAgentEntityExtended[] {\n return this.agentsCache;\n }\n\n /**\n * Get available users for parsing\n */\n getAvailableUsers(): UserInfo[] {\n return this.usersCache;\n }\n\n /**\n * Get available entities for parsing\n */\n getAvailableEntities(): EntityInfo[] {\n return this.entitiesCache;\n }\n\n /**\n * Refresh the caches\n * Resets initialization state and reloads agents\n */\n async refresh(currentUser: UserInfo): Promise<void> {\n this.isInitialized = false;\n this.initializationPromise = null;\n await this.initialize(currentUser);\n }\n}\n"]}
@@ -1,64 +1,19 @@
1
- import { Mention, MentionParseResult } from '../models/conversation-state.model';
1
+ import type { Mention, MentionParseResult } from '@memberjunction/conversations-runtime';
2
2
  import { MJAIAgentEntityExtended } from '@memberjunction/ai-core-plus';
3
3
  import { UserInfo } from '@memberjunction/core';
4
+ import { ConversationsRuntimeBootstrap } from './conversations-runtime-bootstrap.service';
4
5
  import * as i0 from "@angular/core";
5
- /**
6
- * Service for parsing @mentions from message text
7
- * Supports both JSON format and legacy text format
8
- */
9
6
  export declare class MentionParserService {
10
- private readonly JSON_MENTION_REGEX;
11
- private readonly LEGACY_MENTION_REGEX;
12
- constructor();
13
- /**
14
- * Parse mentions from message text
15
- * Supports both JSON format (@{type:"agent",id:"uuid",...}) and legacy text format (@AgentName)
16
- * @param text The message text to parse
17
- * @param availableAgents List of available agents for matching
18
- * @param availableUsers List of available users for matching (optional)
19
- * @returns Parsed mentions with agent and user separation
20
- */
7
+ constructor(_bootstrap: ConversationsRuntimeBootstrap);
8
+ /** Pass-through to {@link ConversationsRuntime.Instance.Mentions.parseMentions}. */
21
9
  parseMentions(text: string, availableAgents: MJAIAgentEntityExtended[], availableUsers?: UserInfo[]): MentionParseResult;
22
- /**
23
- * Find an agent by name (case-insensitive)
24
- * Uses exact match or starts-with match (no contains match to avoid ambiguity)
25
- */
26
- private findAgent;
27
- /**
28
- * Find a user by name (case-insensitive)
29
- * Uses exact match, email match, or starts-with match (no contains match to avoid ambiguity)
30
- */
31
- private findUser;
32
- /**
33
- * Validate mentions - check if all mentions are valid
34
- * Returns array of invalid mention names
35
- * Supports both JSON and legacy mention formats
36
- */
10
+ /** Pass-through to {@link ConversationsRuntime.Instance.Mentions.validateMentions}. */
37
11
  validateMentions(text: string, availableAgents: MJAIAgentEntityExtended[], availableUsers?: UserInfo[]): string[];
38
- /**
39
- * Extract all mention names from text (raw strings)
40
- * Supports both JSON and legacy mention formats
41
- */
12
+ /** Pass-through to {@link ConversationsRuntime.Instance.Mentions.extractMentionNames}. */
42
13
  extractMentionNames(text: string): string[];
43
- /**
44
- * Replace mentions in text with formatted versions
45
- * Example: "@agent" -> "@Agent Name" (with proper casing)
46
- */
14
+ /** Pass-through to {@link ConversationsRuntime.Instance.Mentions.formatMentions}. */
47
15
  formatMentions(text: string, mentions: Mention[]): string;
48
- /**
49
- * Convert a message with JSON-encoded mentions to plain text.
50
- * Replaces @{...} JSON mentions with simple @Name format.
51
- * This is a wrapper around ConversationUtility.ToPlainText() for Angular injection.
52
- *
53
- * @param text - The message text containing JSON mentions
54
- * @param agents - Optional array of agents for name lookup
55
- * @param users - Optional array of users for name lookup
56
- * @returns Plain text with mentions converted to @Name format
57
- *
58
- * @example
59
- * // Input: '@{"type":"agent","id":"123","name":"Sage"} help me'
60
- * // Output: '@Sage help me'
61
- */
16
+ /** Pass-through to {@link ConversationsRuntime.Instance.Mentions.toPlainText}. */
62
17
  toPlainText(text: string, agents?: MJAIAgentEntityExtended[], users?: UserInfo[]): string;
63
18
  static ɵfac: i0.ɵɵFactoryDeclaration<MentionParserService, never>;
64
19
  static ɵprov: i0.ɵɵInjectableDeclaration<MentionParserService>;
@@ -1 +1 @@
1
- {"version":3,"file":"mention-parser.service.d.ts","sourceRoot":"","sources":["../../../src/lib/services/mention-parser.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AACjF,OAAO,EAAE,uBAAuB,EAAuB,MAAM,8BAA8B,CAAC;AAC5F,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;;AAEhD;;;GAGG;AACH,qBAGa,oBAAoB;IAE/B,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAiB;IAEpD,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAwB;;IAI7D;;;;;;;OAOG;IACH,aAAa,CACX,IAAI,EAAE,MAAM,EACZ,eAAe,EAAE,uBAAuB,EAAE,EAC1C,cAAc,CAAC,EAAE,QAAQ,EAAE,GAC1B,kBAAkB;IA8ErB;;;OAGG;IACH,OAAO,CAAC,SAAS;IAwBjB;;;OAGG;IACH,OAAO,CAAC,QAAQ;IAkBhB;;;;OAIG;IACH,gBAAgB,CACd,IAAI,EAAE,MAAM,EACZ,eAAe,EAAE,uBAAuB,EAAE,EAC1C,cAAc,CAAC,EAAE,QAAQ,EAAE,GAC1B,MAAM,EAAE;IAgDX;;;OAGG;IACH,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE;IAoB3C;;;OAGG;IACH,cAAc,CACZ,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,OAAO,EAAE,GAClB,MAAM;IAkBT;;;;;;;;;;;;;OAaG;IACH,WAAW,CACT,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,uBAAuB,EAAE,EAClC,KAAK,CAAC,EAAE,QAAQ,EAAE,GACjB,MAAM;yCAhRE,oBAAoB;6CAApB,oBAAoB;CAiShC"}
1
+ {"version":3,"file":"mention-parser.service.d.ts","sourceRoot":"","sources":["../../../src/lib/services/mention-parser.service.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,OAAO,EAAE,kBAAkB,EAAE,MAAM,uCAAuC,CAAC;AACzF,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAEhD,OAAO,EAAE,6BAA6B,EAAE,MAAM,2CAA2C,CAAC;;AAO1F,qBACa,oBAAoB;gBACjB,UAAU,EAAE,6BAA6B;IAIrD,oFAAoF;IACpF,aAAa,CACT,IAAI,EAAE,MAAM,EACZ,eAAe,EAAE,uBAAuB,EAAE,EAC1C,cAAc,CAAC,EAAE,QAAQ,EAAE,GAC5B,kBAAkB;IAQrB,uFAAuF;IACvF,gBAAgB,CACZ,IAAI,EAAE,MAAM,EACZ,eAAe,EAAE,uBAAuB,EAAE,EAC1C,cAAc,CAAC,EAAE,QAAQ,EAAE,GAC5B,MAAM,EAAE;IAQX,0FAA0F;IAC1F,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE;IAI3C,qFAAqF;IACrF,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,MAAM;IAIzD,kFAAkF;IAClF,WAAW,CACP,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,uBAAuB,EAAE,EAClC,KAAK,CAAC,EAAE,QAAQ,EAAE,GACnB,MAAM;yCA9CA,oBAAoB;6CAApB,oBAAoB;CAiDhC"}