@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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"whiteboard-channel.js","sourceRoot":"","sources":["../../../../../src/lib/components/realtime/whiteboard/whiteboard-channel.ts"],"names":[],"mappings":";;;;;;AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAEvD,OAAO,EAAE,yBAAyB,EAA4B,MAAM,0CAA0C,CAAC;AAC/G,OAAO,EACL,wBAAwB,EAAE,+BAA+B,EAAE,2BAA2B,EACtF,sBAAsB,EAAE,eAAe,EACxC,MAAM,+BAA+B,CAAC;AAEvC;;;;GAIG;AACH,MAAM,CAAC,MAAM,uCAAuC,GAAG,IAAI,CAAC;AAY5D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEI,IAAM,yBAAyB,GAA/B,MAAM,yBAA0B,SAAQ,yBAA0D;IACvG,qFAAqF;IACrE,KAAK,GAAG,IAAI,eAAe,EAAE,CAAC;IAE9C,2EAA2E;IACnE,IAAI,GAA2C,IAAI,CAAC;IAC5D,4FAA4F;IACpF,WAAW,GAAmB,EAAE,CAAC;IACzC,8EAA8E;IACtE,eAAe,GAAwB,IAAI,CAAC;IACpD,6EAA6E;IACrE,oBAAoB,GAAG,IAAI,GAAG,EAAoC,CAAC;IAE3E,IAAW,WAAW;QACpB,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,IAAW,cAAc;QACvB,OAAO,sBAAsB,CAAC;IAChC,CAAC;IAED,IAAW,QAAQ;QACjB,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,IAAW,OAAO;QAChB,OAAO,wBAAwB,CAAC;IAClC,CAAC;IAEM,kBAAkB;QACvB,OAAO,2BAA2B,CAAC;IACrC,CAAC;IAEe,mBAAmB;QACjC,OAAO,+BAA+B,CAAC;IACzC,CAAC;IAED,8FAA8F;IAC9E,oBAAoB;QAClC,OAAO;YACL,OAAO,EAAE,YAAY;YACrB,WAAW,EACT,qFAAqF;gBACrF,6FAA6F;YAC/F,IAAI,EAAE;gBACJ,0EAA0E;gBAC1E,qFAAqF;gBACrF,oFAAoF;aACrF;YACD,SAAS,EAAE,wBAAwB;SACpC,CAAC;IACJ,CAAC;IAED,+FAA+F;IAC5E,YAAY;QAC7B,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAG,EAAE;YACxD,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;QACjD,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;;OAIG;IACI,WAAW,CAAC,QAAyC;QAC1D,IAAI,CAAC,cAAc,EAAE,CAAC;QACtB,IAAI,CAAC,IAAI,GAAG,QAAQ,CAAC;QACrB,QAAQ,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QAC5B,QAAQ,CAAC,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,SAAS,IAAI,OAAO,CAAC;QACxD,IAAI,CAAC,WAAW,CAAC,IAAI;QACnB,4EAA4E;QAC5E,QAAQ,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,SAAiB,EAAE,EAAE;YAClD,kFAAkF;YAClF,gFAAgF;YAChF,6EAA6E;YAC7E,iEAAiE;YACjE,IAAI,CAAC,OAAO,EAAE,eAAe,CAC3B,iFAAiF;gBACjF,mEAAmE,GAAG,SAAS,CAAC,CAAC;QACrF,CAAC,CAAC;QACF,sFAAsF;QACtF,QAAQ,CAAC,SAAS,CAAC,SAAS,CAAC,GAAG,EAAE;YAChC,IAAI,CAAC,OAAO,EAAE,eAAe,CAAC,0CAA0C,CAAC,CAAC;QAC5E,CAAC,CAAC;QACF,+EAA+E;QAC/E,kFAAkF;QAClF,8EAA8E;QAC9E,iCAAiC;QACjC,QAAQ,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,MAAmC,EAAE,EAAE;YACzE,sEAAsE;YACtE,IAAI,CAAC,OAAO,EAAE,eAAe,CAC3B,oDAAoD,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,MAAM,MAAM,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;YAC5G,+EAA+E;YAC/E,gFAAgF;YAChF,6CAA6C;YAC7C,IAAI,CAAC,OAAO,EAAE,qBAAqB,EAAE,CACnC,2DAA2D,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,MAAM,MAAM,MAAM,CAAC,QAAQ,IAAI;gBACjH,sFAAsF,CAAC,CAAC;QAC5F,CAAC,CAAC;QACF,gFAAgF;QAChF,kFAAkF;QAClF,qFAAqF;QACrF,oFAAoF;QACpF,QAAQ,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC,WAA6C,EAAE,EAAE;YACrF,IAAI,CAAC,mBAAmB,CAAC,WAAW,CAAC,CAAC;QACxC,CAAC,CAAC;QACF,qFAAqF;QACrF,QAAQ,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,OAAgB,EAAE,EAAE;YACtD,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,OAAO,CAAC,CAAC;QACtC,CAAC,CAAC;QACF,+EAA+E;QAC/E,QAAQ,CAAC,wBAAwB,CAAC,SAAS,CAAC,GAAG,EAAE;YAC/C,KAAK,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAClC,CAAC,CAAC,CACH,CAAC;IACJ,CAAC;IAEe,aAAa;QAC3B,IAAI,CAAC,cAAc,EAAE,CAAC;IACxB,CAAC;IAED;;;;;;OAMG;IACK,mBAAmB,CAAC,WAA6C;QACvE,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,KAAK,GAAG,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAChE,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,KAAK,KAAK,IAAI,IAAI,GAAG,GAAG,KAAK,CAAC,UAAU,IAAI,uCAAuC,CAAC,EAAE,CAAC;YAC1G,IAAI,CAAC,mBAAmB,CAAC,WAAW,CAAC,CAAC;YACtC,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,WAAW,CAAC,MAAM,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;YACnG,OAAO;QACT,CAAC;QACD,KAAK,CAAC,OAAO,GAAG,WAAW,CAAC,CAAC,gCAAgC;QAC7D,IAAI,KAAK,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;YACzB,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,UAAU,GAAG,uCAAuC,GAAG,GAAG,CAAC,CAAC;YAC3F,KAAK,CAAC,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC5B,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC;gBACnB,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;gBAC9B,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC;gBACrB,IAAI,OAAO,EAAE,CAAC;oBACZ,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;oBAC9B,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;gBACpC,CAAC;YACH,CAAC,EAAE,IAAI,CAAC,CAAC;QACX,CAAC;IACH,CAAC;IAED,mGAAmG;IAC3F,mBAAmB,CAAC,WAA6C;QACvE,IAAI,CAAC,OAAO,EAAE,eAAe,CAC3B,4CAA4C,WAAW,CAAC,KAAK,IAAI,WAAW,CAAC,MAAM,IAAI;YACvF,0EAA0E;YAC1E,4CAA4C,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC;IACvE,CAAC;IAED,0FAA0F;IAClF,yBAAyB;QAC/B,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,oBAAoB,CAAC,MAAM,EAAE,EAAE,CAAC;YACvD,IAAI,KAAK,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;gBACzB,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC;QACD,IAAI,CAAC,oBAAoB,CAAC,KAAK,EAAE,CAAC;IACpC,CAAC;IAED;;;;OAIG;IACK,KAAK,CAAC,mBAAmB;QAC/B,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC;QACzB,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO;QACT,CAAC;QACD,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,IAAI,GAAG,gBAAgB,GAAG,CAAC,kBAAkB,EAAE,IAAI,GAAG,CAAC,kBAAkB,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;QAC9H,MAAM,UAAU,GAAG,MAAM,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;QACvE,IAAI,UAAU,EAAE,CAAC;YACf,GAAG,CAAC,eAAe,CAAC,kEAAkE,IAAI,GAAG,CAAC,CAAC;QACjG,CAAC;IACH,CAAC;IAED;;;;OAIG;IACI,cAAc,CAAC,QAAgB,EAAE,QAAgB;QACtD,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,OAAO,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACtD,CAAC;QACD,OAAO,wBAAwB,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAClE,CAAC;IAED,oFAAoF;IACpE,cAAc;QAC5B,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;IAC7B,CAAC;IAED;;;;;OAKG;IACa,YAAY,CAAC,SAAiB;QAC5C,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;IAC5C,CAAC;IAED;;;;OAIG;IACa,gBAAgB;QAC9B,IAAI,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC;YACzB,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;QAC1B,CAAC;IACH,CAAC;IAEe,OAAO;QACrB,IAAI,CAAC,eAAe,EAAE,WAAW,EAAE,CAAC;QACpC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAC5B,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,yCAAyC;IAC5D,CAAC;IAED,gGAAgG;IACxF,cAAc;QACpB,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACnC,GAAG,CAAC,WAAW,EAAE,CAAC;QACpB,CAAC;QACD,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;QACtB,IAAI,CAAC,yBAAyB,EAAE,CAAC;QACjC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF,CAAA;AAjPY,yBAAyB;IADrC,aAAa,CAAC,yBAAyB,EAAE,2BAA2B,CAAC;GACzD,yBAAyB,CAiPrC;;AAED;;;;;GAKG;AACH,MAAM,UAAU,6BAA6B;IAC3C,uEAAuE;AACzE,CAAC","sourcesContent":["import type { Type } from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport { RegisterClass } from '@memberjunction/global';\nimport { RealtimeToolDefinition } from '@memberjunction/ai';\nimport { BaseRealtimeChannelClient, ChannelOnboardingDetails } from '../channels/base-realtime-channel-client';\nimport {\n ApplyWhiteboardAgentTool, RealtimeWhiteboardHostComponent, WHITEBOARD_TOOL_DEFINITIONS,\n WHITEBOARD_TOOL_PREFIX, WhiteboardState, WhiteboardWidgetInteractionEvent, WhiteboardWidgetSubmitEvent\n} from '@memberjunction/ng-whiteboard';\n\n/**\n * Per-widget throttle window for AMBIENT interaction context notes: at most one note per\n * widget per this many ms — within the window the LATEST summary wins (chatty widgets\n * collapse to one trailing-edge note instead of flooding the model's context).\n */\nexport const WHITEBOARD_INTERACTION_NOTE_THROTTLE_MS = 4000;\n\n/** Per-widget ambient-note throttle bookkeeping. */\ninterface InteractionThrottleEntry {\n /** When this widget's last ambient note was sent (epoch ms). */\n LastSentAt: number;\n /** Trailing-edge timer for a deferred note, or null when the window is idle. */\n Timer: ReturnType<typeof setTimeout> | null;\n /** The latest event received within the open window (sent when the timer fires). */\n Pending: WhiteboardWidgetInteractionEvent | null;\n}\n\n/**\n * The LIVE WHITEBOARD as a pluggable interactive channel — the canonical\n * {@link BaseRealtimeChannelClient} implementation, resolved from the `MJ: AI Agent\n * Channels` registry row whose `ClientPluginClass` is `'RealtimeWhiteboardChannel'`.\n *\n * One instance per session (created via ClassFactory at session start). It owns the\n * board's {@link WhiteboardState} engine and contributes the channel's full contract:\n *\n * - **Action**: the `Whiteboard_*` client-executed tool set\n * ({@link WHITEBOARD_TOOL_DEFINITIONS}); {@link ApplyAgentTool} prefers the BOUND host\n * component (board mutation + violet pop-in / toast / presence-cursor garnish) and\n * falls back to the pure {@link ApplyWhiteboardAgentTool} engine call when no surface\n * is bound (e.g. the surface panel is collapsed) — the channel keeps working, just\n * without the garnish.\n * - **Perception**: {@link BindSurface} subscribes the host's coalesced (750 ms)\n * `SceneDelta` stream and pipes each delta into the live model's context as a\n * `[whiteboard]` background note; the agent-undo toast click flows the same way.\n * - **Surface**: {@link RealtimeWhiteboardHostComponent}, created dynamically by the\n * overlay's channel tab; the host's Focus toggle rides `Context.SetFocusMode` so the\n * shell can collapse/restore the main call column.\n * - **State of record**: every board mutation (user edits AND agent tool calls) requests\n * a save of {@link WhiteboardState.ToJSON} under channel name `'Whiteboard'` — the\n * host debounces and flushes at teardown.\n *\n * A PRIOR session's persisted board is restored through {@link RestoreState} (invoked by\n * the session host after Initialize, before any surface binding): the saved JSON is\n * rehydrated IN PLACE into the same {@link WhiteboardState} instance, so the save\n * subscription and any later surface binding keep pointing at one engine. Malformed or\n * incompatible payloads are tolerated — the board simply starts fresh.\n */\n@RegisterClass(BaseRealtimeChannelClient, 'RealtimeWhiteboardChannel')\nexport class RealtimeWhiteboardChannel extends BaseRealtimeChannelClient<RealtimeWhiteboardHostComponent> {\n /** The board's state of record — created fresh with the plugin (one per session). */\n public readonly State = new WhiteboardState();\n\n /** The live bound surface, when the channel tab's pane is instantiated. */\n private host: RealtimeWhiteboardHostComponent | null = null;\n /** Output subscriptions on the bound surface (SceneDelta / AgentUndo / FocusModeChange). */\n private surfaceSubs: Subscription[] = [];\n /** Board-mutation subscription driving the debounced state-of-record save. */\n private stateChangedSub: Subscription | null = null;\n /** Per-widget ambient-interaction note throttles (ItemID → window state). */\n private interactionThrottles = new Map<string, InteractionThrottleEntry>();\n\n public get ChannelName(): string {\n return 'Whiteboard';\n }\n\n public get ToolNamePrefix(): string {\n return WHITEBOARD_TOOL_PREFIX;\n }\n\n public get TabTitle(): string {\n return 'Whiteboard';\n }\n\n public get TabIcon(): string {\n return 'fa-solid fa-chalkboard';\n }\n\n public GetToolDefinitions(): RealtimeToolDefinition[] {\n return WHITEBOARD_TOOL_DEFINITIONS;\n }\n\n public override GetSurfaceComponent(): Type<RealtimeWhiteboardHostComponent> {\n return RealtimeWhiteboardHostComponent;\n }\n\n /** First-run intro shown the first time the user opens the Whiteboard tab (once per user). */\n public override GetOnboardingDetails(): ChannelOnboardingDetails {\n return {\n Heading: 'Whiteboard',\n Description:\n 'A shared canvas the agent can sketch, write and annotate on live during the call — ' +\n 'whatever it draws appears here instantly, and anything you add is something it can see too.',\n Tips: [\n 'Watch the board fill in as you talk — the agent updates it in real time.',\n 'Add your own notes or shapes; the agent perceives your edits and can build on them.',\n 'Use Focus to give the board the whole screen, and save it to artifacts to keep it.'\n ],\n IconClass: 'fa-solid fa-chalkboard'\n };\n }\n\n /** Persist the board (host-debounced) on EVERY board mutation — user edits AND agent tools. */\n protected override OnInitialize(): void {\n this.stateChangedSub = this.State.Changed$.subscribe(() => {\n this.Context?.RequestSave(this.State.ToJSON());\n });\n }\n\n /**\n * Wires the dynamically-created board host: inputs (shared state engine + agent name)\n * are set BEFORE the component's first change detection, and the perception/garnish\n * outputs are subscribed back into the host context — the overlay never sees any of it.\n */\n public BindSurface(instance: RealtimeWhiteboardHostComponent): void {\n this.releaseSurface();\n this.host = instance;\n instance.State = this.State;\n instance.AgentName = this.Context?.AgentName ?? 'Agent';\n this.surfaceSubs.push(\n // The board's coalesced scene delta — the perception feed the agent \"sees\".\n instance.SceneDelta.subscribe((deltaJson: string) => {\n // Background PERCEPTION, not conversation: the model sees every user edit without\n // being told, but must not narrate minor changes — only react when something is\n // significant (or when asked). The etiquette rides in the note itself so any\n // realtime model gets it regardless of system-prompt sync state.\n this.Context?.SendContextNote(\n '[whiteboard] board update (background context — do NOT comment on minor edits; ' +\n 'only mention it if the change is significant to the discussion): ' + deltaJson);\n }),\n // The user clicked Undo on the agent-action toast (the undo already applied locally).\n instance.AgentUndo.subscribe(() => {\n this.Context?.SendContextNote('[whiteboard] user undid your last change');\n }),\n // A sandboxed HTML widget submitted user input (MJWhiteboard.submit) — already\n // validated, size-capped and not canceled (the host's cancelable WidgetSubmitting\n // event ran first). Surface it to the agent so it can react to quiz answers /\n // micro-form input it asked for.\n instance.WidgetSubmitted.subscribe((submit: WhiteboardWidgetSubmitEvent) => {\n // Durable awareness first (the note persists in the model's context)…\n this.Context?.SendContextNote(\n `[whiteboard] the user submitted input in widget \"${submit.Title || submit.ItemID}\": ${submit.DataJson}`);\n // …then make the model REACT — a submission is explicit user input the user is\n // waiting on; without this trigger, SendContextNote alone produces dead silence\n // (\"I clicked Submit and nothing happened\").\n this.Context?.RequestSpokenResponse?.(\n `The user just submitted input in the whiteboard widget \"${submit.Title || submit.ItemID}\": ${submit.DataJson}. ` +\n `React to it now in your own voice — acknowledge their choice and continue naturally.`);\n }),\n // AMBIENT widget telemetry (the injected recorder, NOT widget-authored script):\n // clicks / changes / typing summarized by the board. Pure background perception —\n // throttled per widget so chatty widgets don't flood the model's context, and framed\n // with do-not-respond etiquette (explicit MJWhiteboard.submit input arrives above).\n instance.WidgetInteraction.subscribe((interaction: WhiteboardWidgetInteractionEvent) => {\n this.onWidgetInteraction(interaction);\n }),\n // The board's Focus toggle — ask the shell to collapse/restore the main call column.\n instance.FocusModeChange.subscribe((focused: boolean) => {\n this.Context?.SetFocusMode(focused);\n }),\n // \"Save to artifacts\": snapshot the board as a first-class versioned artifact.\n instance.SaveToArtifactsRequested.subscribe(() => {\n void this.saveBoardAsArtifact();\n })\n );\n }\n\n public override UnbindSurface(): void {\n this.releaseSurface();\n }\n\n /**\n * Routes one ambient widget-interaction batch to the agent as a throttled background\n * context note: outside an open window the note goes out immediately and opens a\n * {@link WHITEBOARD_INTERACTION_NOTE_THROTTLE_MS} window; within the window the LATEST\n * event is stashed and a trailing-edge timer sends it when the window closes (one note\n * per widget per window, latest summary wins).\n */\n private onWidgetInteraction(interaction: WhiteboardWidgetInteractionEvent): void {\n const now = Date.now();\n const entry = this.interactionThrottles.get(interaction.ItemID);\n if (!entry || (entry.Timer === null && now - entry.LastSentAt >= WHITEBOARD_INTERACTION_NOTE_THROTTLE_MS)) {\n this.sendInteractionNote(interaction);\n this.interactionThrottles.set(interaction.ItemID, { LastSentAt: now, Timer: null, Pending: null });\n return;\n }\n entry.Pending = interaction; // latest wins within the window\n if (entry.Timer === null) {\n const wait = Math.max(0, entry.LastSentAt + WHITEBOARD_INTERACTION_NOTE_THROTTLE_MS - now);\n entry.Timer = setTimeout(() => {\n entry.Timer = null;\n const pending = entry.Pending;\n entry.Pending = null;\n if (pending) {\n entry.LastSentAt = Date.now();\n this.sendInteractionNote(pending);\n }\n }, wait);\n }\n }\n\n /** The ambient-note framing: background etiquette rides in the note itself (like scene deltas). */\n private sendInteractionNote(interaction: WhiteboardWidgetInteractionEvent): void {\n this.Context?.SendContextNote(\n `[whiteboard] ambient activity in widget \"${interaction.Title || interaction.ItemID}\" ` +\n '(background — do NOT respond unless it is significant or you are asked; ' +\n `explicit submissions arrive separately): ${interaction.Summary}`);\n }\n\n /** Cancels all pending ambient-note timers and resets the per-widget throttle windows. */\n private clearInteractionThrottles(): void {\n for (const entry of this.interactionThrottles.values()) {\n if (entry.Timer !== null) {\n clearTimeout(entry.Timer);\n }\n }\n this.interactionThrottles.clear();\n }\n\n /**\n * Persists the current board as a `MJ: Artifacts` snapshot via the host context\n * (best-effort; the host logs failures). On success the agent is told via a context\n * note so it can reference the saved artifact naturally.\n */\n private async saveBoardAsArtifact(): Promise<void> {\n const ctx = this.Context;\n if (!ctx) {\n return;\n }\n const now = new Date();\n const name = `Whiteboard — ${now.toLocaleDateString()} ${now.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' })}`;\n const artifactId = await ctx.SaveAsArtifact(name, this.State.ToJSON());\n if (artifactId) {\n ctx.SendContextNote(`[whiteboard] the user saved the current board as the artifact \"${name}\"`);\n }\n }\n\n /**\n * Executes one `Whiteboard_*` tool call LOCALLY. Prefers the live bound host (board\n * mutation + UI garnish); falls back to the pure engine function when no surface is\n * bound so the channel keeps working with the pane collapsed.\n */\n public ApplyAgentTool(toolName: string, argsJson: string): string {\n if (this.host) {\n return this.host.ApplyAgentTool(toolName, argsJson);\n }\n return ApplyWhiteboardAgentTool(this.State, toolName, argsJson);\n }\n\n /** The board's serialized state of record (persisted under {@link ChannelName}). */\n public override SerializeState(): string | null {\n return this.State.ToJSON();\n }\n\n /**\n * Rehydrates a prior session's saved board into THIS session's state engine (in place —\n * the {@link State} instance and its subscriptions are preserved). Returns `true` on\n * success; malformed / incompatible JSON returns `false` and the board stays fresh\n * (never throws — {@link WhiteboardState.LoadFromJSON} is tolerant by contract).\n */\n public override RestoreState(stateJson: string): boolean {\n return this.State.LoadFromJSON(stateJson);\n }\n\n /**\n * Exit focus mode THROUGH the bound host (its own Focus button state stays in sync; it\n * re-emits `FocusModeChange(false)` → `Context.SetFocusMode(false)`). When no surface is\n * bound the overlay's defensive flag clear covers it.\n */\n public override RequestFocusExit(): void {\n if (this.host?.FocusMode) {\n this.host.ToggleFocus();\n }\n }\n\n public override Dispose(): void {\n this.stateChangedSub?.unsubscribe();\n this.stateChangedSub = null;\n super.Dispose(); // releases the surface binding + context\n }\n\n /** Unsubscribes surface outputs, cancels pending ambient notes and drops the host reference. */\n private releaseSurface(): void {\n for (const sub of this.surfaceSubs) {\n sub.unsubscribe();\n }\n this.surfaceSubs = [];\n this.clearInteractionThrottles();\n this.host = null;\n }\n}\n\n/**\n * Tree-shaking prevention: the whiteboard channel is resolved dynamically through the\n * ClassFactory (by the registry row's `ClientPluginClass` key), so this static call is\n * what keeps its `@RegisterClass` side effect from being eliminated by the bundler.\n * Called by `RealtimeSessionService` alongside the realtime-client driver Load calls.\n */\nexport function LoadRealtimeWhiteboardChannel(): void {\n // intentional no-op — the import side effect performs the registration\n}\n"]}
@@ -0,0 +1,11 @@
1
+ import type { IMJChatAgentPresenceComponent, MJChatAgentPresenceState } from './slot-interfaces';
2
+ import * as i0 from "@angular/core";
3
+ export declare class MJChatAgentPresenceDefaultComponent implements IMJChatAgentPresenceComponent {
4
+ State: MJChatAgentPresenceState;
5
+ AgentName?: string;
6
+ AvatarUrl?: string;
7
+ Mode: 'subtle' | 'prominent';
8
+ static ɵfac: i0.ɵɵFactoryDeclaration<MJChatAgentPresenceDefaultComponent, never>;
9
+ static ɵcmp: i0.ɵɵComponentDeclaration<MJChatAgentPresenceDefaultComponent, "mj-chat-agent-presence-default", never, { "State": { "alias": "State"; "required": false; }; "AgentName": { "alias": "AgentName"; "required": false; }; "AvatarUrl": { "alias": "AvatarUrl"; "required": false; }; "Mode": { "alias": "Mode"; "required": false; }; }, {}, never, never, true, never>;
10
+ }
11
+ //# sourceMappingURL=mj-chat-agent-presence-default.component.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mj-chat-agent-presence-default.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/slots/mj-chat-agent-presence-default.component.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EACR,6BAA6B,EAC7B,wBAAwB,EAC3B,MAAM,mBAAmB,CAAC;;AAE3B,qBA0Ea,mCAAoC,YAAW,6BAA6B;IACrE,KAAK,EAAE,wBAAwB,CAAU;IACzC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,QAAQ,GAAG,WAAW,CAAY;yCAJ/C,mCAAmC;2CAAnC,mCAAmC;CAK/C"}
@@ -0,0 +1,98 @@
1
+ /**
2
+ * @fileoverview Default `agentPresence` slot component.
3
+ *
4
+ * Renders a small avatar + agent-name + voice-state indicator. Off by default
5
+ * (the chat-area's `[ShowAgentCharacter]` input gates this slot's visibility).
6
+ *
7
+ * @module @memberjunction/ng-conversations
8
+ */
9
+ import { Component, Input } from '@angular/core';
10
+ import { CommonModule } from '@angular/common';
11
+ import * as i0 from "@angular/core";
12
+ function MJChatAgentPresenceDefaultComponent_Conditional_1_Template(rf, ctx) { if (rf & 1) {
13
+ i0.ɵɵdomElement(0, "img", 1);
14
+ } if (rf & 2) {
15
+ const ctx_r0 = i0.ɵɵnextContext();
16
+ i0.ɵɵdomProperty("src", ctx_r0.AvatarUrl, i0.ɵɵsanitizeUrl);
17
+ } }
18
+ function MJChatAgentPresenceDefaultComponent_Conditional_2_Template(rf, ctx) { if (rf & 1) {
19
+ i0.ɵɵdomElementStart(0, "div", 2);
20
+ i0.ɵɵdomElement(1, "i", 5);
21
+ i0.ɵɵdomElementEnd();
22
+ } }
23
+ function MJChatAgentPresenceDefaultComponent_Conditional_3_Template(rf, ctx) { if (rf & 1) {
24
+ i0.ɵɵdomElementStart(0, "span", 3);
25
+ i0.ɵɵtext(1);
26
+ i0.ɵɵdomElementEnd();
27
+ } if (rf & 2) {
28
+ const ctx_r0 = i0.ɵɵnextContext();
29
+ i0.ɵɵadvance();
30
+ i0.ɵɵtextInterpolate(ctx_r0.AgentName);
31
+ } }
32
+ function MJChatAgentPresenceDefaultComponent_Conditional_4_Template(rf, ctx) { if (rf & 1) {
33
+ i0.ɵɵdomElementStart(0, "span", 4);
34
+ i0.ɵɵtext(1);
35
+ i0.ɵɵdomElementEnd();
36
+ } if (rf & 2) {
37
+ const ctx_r0 = i0.ɵɵnextContext();
38
+ i0.ɵɵadvance();
39
+ i0.ɵɵtextInterpolate(ctx_r0.State);
40
+ } }
41
+ export class MJChatAgentPresenceDefaultComponent {
42
+ State = 'idle';
43
+ AgentName;
44
+ AvatarUrl;
45
+ Mode = 'subtle';
46
+ static ɵfac = function MJChatAgentPresenceDefaultComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || MJChatAgentPresenceDefaultComponent)(); };
47
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: MJChatAgentPresenceDefaultComponent, selectors: [["mj-chat-agent-presence-default"]], inputs: { State: "State", AgentName: "AgentName", AvatarUrl: "AvatarUrl", Mode: "Mode" }, decls: 5, vars: 11, consts: [[1, "mj-chat-agent-presence-default"], ["alt", "", 1, "mj-chat-agent-presence-default__avatar", 3, "src"], [1, "mj-chat-agent-presence-default__avatar-placeholder"], [1, "mj-chat-agent-presence-default__name"], [1, "mj-chat-agent-presence-default__state"], [1, "fa-solid", "fa-robot"]], template: function MJChatAgentPresenceDefaultComponent_Template(rf, ctx) { if (rf & 1) {
48
+ i0.ɵɵdomElementStart(0, "div", 0);
49
+ i0.ɵɵconditionalCreate(1, MJChatAgentPresenceDefaultComponent_Conditional_1_Template, 1, 1, "img", 1)(2, MJChatAgentPresenceDefaultComponent_Conditional_2_Template, 2, 0, "div", 2);
50
+ i0.ɵɵconditionalCreate(3, MJChatAgentPresenceDefaultComponent_Conditional_3_Template, 2, 1, "span", 3);
51
+ i0.ɵɵconditionalCreate(4, MJChatAgentPresenceDefaultComponent_Conditional_4_Template, 2, 1, "span", 4);
52
+ i0.ɵɵdomElementEnd();
53
+ } if (rf & 2) {
54
+ i0.ɵɵclassProp("mj-chat-agent-presence-default--prominent", ctx.Mode === "prominent")("mj-chat-agent-presence-default--listening", ctx.State === "listening")("mj-chat-agent-presence-default--thinking", ctx.State === "thinking")("mj-chat-agent-presence-default--speaking", ctx.State === "speaking");
55
+ i0.ɵɵadvance();
56
+ i0.ɵɵconditional(ctx.AvatarUrl ? 1 : 2);
57
+ i0.ɵɵadvance(2);
58
+ i0.ɵɵconditional(ctx.AgentName ? 3 : -1);
59
+ i0.ɵɵadvance();
60
+ i0.ɵɵconditional(ctx.State !== "idle" ? 4 : -1);
61
+ } }, dependencies: [CommonModule], styles: [".mj-chat-agent-presence-default[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0.25rem 0.5rem;\n border-radius: 999px;\n background: var(--mj-chat-character-accent, var(--mj-bg-surface-card));\n color: var(--mj-text-primary);\n font-size: 0.85rem;\n opacity: 1;\n transition: opacity 0.2s ease;\n }\n .mj-chat-agent-presence-default__avatar[_ngcontent-%COMP%], \n .mj-chat-agent-presence-default__avatar-placeholder[_ngcontent-%COMP%] {\n width: 24px;\n height: 24px;\n border-radius: 50%;\n background: var(--mj-bg-surface);\n display: inline-flex;\n align-items: center;\n justify-content: center;\n }\n .mj-chat-agent-presence-default__name[_ngcontent-%COMP%] {\n font-weight: 500;\n }\n .mj-chat-agent-presence-default__state[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary);\n font-style: italic;\n }\n .mj-chat-agent-presence-default--listening[_ngcontent-%COMP%] .mj-chat-agent-presence-default__state[_ngcontent-%COMP%] {\n color: var(--mj-chat-voice-listening, var(--mj-status-info));\n }\n .mj-chat-agent-presence-default--thinking[_ngcontent-%COMP%] .mj-chat-agent-presence-default__state[_ngcontent-%COMP%] {\n color: var(--mj-chat-voice-thinking, var(--mj-status-warning));\n }\n .mj-chat-agent-presence-default--speaking[_ngcontent-%COMP%] .mj-chat-agent-presence-default__state[_ngcontent-%COMP%] {\n color: var(--mj-chat-voice-speaking, var(--mj-brand-primary));\n }\n .mj-chat-agent-presence-default--prominent[_ngcontent-%COMP%] {\n padding: 0.5rem 1rem;\n font-size: 1rem;\n }"] });
62
+ }
63
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(MJChatAgentPresenceDefaultComponent, [{
64
+ type: Component,
65
+ args: [{ selector: 'mj-chat-agent-presence-default', standalone: true, imports: [CommonModule], template: `
66
+ <div
67
+ class="mj-chat-agent-presence-default"
68
+ [class.mj-chat-agent-presence-default--prominent]="Mode === 'prominent'"
69
+ [class.mj-chat-agent-presence-default--listening]="State === 'listening'"
70
+ [class.mj-chat-agent-presence-default--thinking]="State === 'thinking'"
71
+ [class.mj-chat-agent-presence-default--speaking]="State === 'speaking'"
72
+ >
73
+ @if (AvatarUrl) {
74
+ <img class="mj-chat-agent-presence-default__avatar" [src]="AvatarUrl" alt="" />
75
+ } @else {
76
+ <div class="mj-chat-agent-presence-default__avatar-placeholder">
77
+ <i class="fa-solid fa-robot"></i>
78
+ </div>
79
+ }
80
+ @if (AgentName) {
81
+ <span class="mj-chat-agent-presence-default__name">{{ AgentName }}</span>
82
+ }
83
+ @if (State !== 'idle') {
84
+ <span class="mj-chat-agent-presence-default__state">{{ State }}</span>
85
+ }
86
+ </div>
87
+ `, styles: ["\n .mj-chat-agent-presence-default {\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0.25rem 0.5rem;\n border-radius: 999px;\n background: var(--mj-chat-character-accent, var(--mj-bg-surface-card));\n color: var(--mj-text-primary);\n font-size: 0.85rem;\n opacity: 1;\n transition: opacity 0.2s ease;\n }\n .mj-chat-agent-presence-default__avatar,\n .mj-chat-agent-presence-default__avatar-placeholder {\n width: 24px;\n height: 24px;\n border-radius: 50%;\n background: var(--mj-bg-surface);\n display: inline-flex;\n align-items: center;\n justify-content: center;\n }\n .mj-chat-agent-presence-default__name {\n font-weight: 500;\n }\n .mj-chat-agent-presence-default__state {\n color: var(--mj-text-secondary);\n font-style: italic;\n }\n .mj-chat-agent-presence-default--listening .mj-chat-agent-presence-default__state {\n color: var(--mj-chat-voice-listening, var(--mj-status-info));\n }\n .mj-chat-agent-presence-default--thinking .mj-chat-agent-presence-default__state {\n color: var(--mj-chat-voice-thinking, var(--mj-status-warning));\n }\n .mj-chat-agent-presence-default--speaking .mj-chat-agent-presence-default__state {\n color: var(--mj-chat-voice-speaking, var(--mj-brand-primary));\n }\n .mj-chat-agent-presence-default--prominent {\n padding: 0.5rem 1rem;\n font-size: 1rem;\n }\n "] }]
88
+ }], null, { State: [{
89
+ type: Input
90
+ }], AgentName: [{
91
+ type: Input
92
+ }], AvatarUrl: [{
93
+ type: Input
94
+ }], Mode: [{
95
+ type: Input
96
+ }] }); })();
97
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(MJChatAgentPresenceDefaultComponent, { className: "MJChatAgentPresenceDefaultComponent", filePath: "src/lib/components/slots/mj-chat-agent-presence-default.component.ts", lineNumber: 92 }); })();
98
+ //# sourceMappingURL=mj-chat-agent-presence-default.component.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mj-chat-agent-presence-default.component.js","sourceRoot":"","sources":["../../../../src/lib/components/slots/mj-chat-agent-presence-default.component.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;;;IAoB/B,4BAA+E;;;IAA3B,2DAAiB;;;IAErE,iCAAgE;IAC5D,0BAAiC;IACrC,oBAAM;;;IAGN,kCAAmD;IAAA,YAAe;IAAA,oBAAO;;;IAAtB,cAAe;IAAf,sCAAe;;;IAGlE,kCAAoD;IAAA,YAAW;IAAA,oBAAO;;;IAAlB,cAAW;IAAX,kCAAW;;AAmD/E,MAAM,OAAO,mCAAmC;IAC5B,KAAK,GAA6B,MAAM,CAAC;IACzC,SAAS,CAAU;IACnB,SAAS,CAAU;IACnB,IAAI,GAA2B,QAAQ,CAAC;6HAJ/C,mCAAmC;6DAAnC,mCAAmC;YArExC,iCAMC;YAGK,AAFF,qGAAiB,+EAER;YAKT,sGAAiB;YAGjB,sGAAwB;YAG5B,oBAAM;;YAfF,AADA,AADA,AADA,qFAAwE,wEACC,sEACF,sEACA;YAEvE,cAMC;YAND,uCAMC;YACD,eAEC;YAFD,wCAEC;YACD,cAEC;YAFD,+CAEC;4BArBC,YAAY;;iFAuEb,mCAAmC;cA1E/C,SAAS;2BACI,gCAAgC,cAC9B,IAAI,WACP,CAAC,YAAY,CAAC,YACb;;;;;;;;;;;;;;;;;;;;;;KAsBT;;kBAiDA,KAAK;;kBACL,KAAK;;kBACL,KAAK;;kBACL,KAAK;;kFAJG,mCAAmC","sourcesContent":["/**\n * @fileoverview Default `agentPresence` slot component.\n *\n * Renders a small avatar + agent-name + voice-state indicator. Off by default\n * (the chat-area's `[ShowAgentCharacter]` input gates this slot's visibility).\n *\n * @module @memberjunction/ng-conversations\n */\n\nimport { Component, Input } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\nimport type {\n IMJChatAgentPresenceComponent,\n MJChatAgentPresenceState,\n} from './slot-interfaces';\n\n@Component({\n selector: 'mj-chat-agent-presence-default',\n standalone: true,\n imports: [CommonModule],\n template: `\n <div\n class=\"mj-chat-agent-presence-default\"\n [class.mj-chat-agent-presence-default--prominent]=\"Mode === 'prominent'\"\n [class.mj-chat-agent-presence-default--listening]=\"State === 'listening'\"\n [class.mj-chat-agent-presence-default--thinking]=\"State === 'thinking'\"\n [class.mj-chat-agent-presence-default--speaking]=\"State === 'speaking'\"\n >\n @if (AvatarUrl) {\n <img class=\"mj-chat-agent-presence-default__avatar\" [src]=\"AvatarUrl\" alt=\"\" />\n } @else {\n <div class=\"mj-chat-agent-presence-default__avatar-placeholder\">\n <i class=\"fa-solid fa-robot\"></i>\n </div>\n }\n @if (AgentName) {\n <span class=\"mj-chat-agent-presence-default__name\">{{ AgentName }}</span>\n }\n @if (State !== 'idle') {\n <span class=\"mj-chat-agent-presence-default__state\">{{ State }}</span>\n }\n </div>\n `,\n styles: [\n `\n .mj-chat-agent-presence-default {\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0.25rem 0.5rem;\n border-radius: 999px;\n background: var(--mj-chat-character-accent, var(--mj-bg-surface-card));\n color: var(--mj-text-primary);\n font-size: 0.85rem;\n opacity: 1;\n transition: opacity 0.2s ease;\n }\n .mj-chat-agent-presence-default__avatar,\n .mj-chat-agent-presence-default__avatar-placeholder {\n width: 24px;\n height: 24px;\n border-radius: 50%;\n background: var(--mj-bg-surface);\n display: inline-flex;\n align-items: center;\n justify-content: center;\n }\n .mj-chat-agent-presence-default__name {\n font-weight: 500;\n }\n .mj-chat-agent-presence-default__state {\n color: var(--mj-text-secondary);\n font-style: italic;\n }\n .mj-chat-agent-presence-default--listening .mj-chat-agent-presence-default__state {\n color: var(--mj-chat-voice-listening, var(--mj-status-info));\n }\n .mj-chat-agent-presence-default--thinking .mj-chat-agent-presence-default__state {\n color: var(--mj-chat-voice-thinking, var(--mj-status-warning));\n }\n .mj-chat-agent-presence-default--speaking .mj-chat-agent-presence-default__state {\n color: var(--mj-chat-voice-speaking, var(--mj-brand-primary));\n }\n .mj-chat-agent-presence-default--prominent {\n padding: 0.5rem 1rem;\n font-size: 1rem;\n }\n `,\n ],\n})\nexport class MJChatAgentPresenceDefaultComponent implements IMJChatAgentPresenceComponent {\n @Input() public State: MJChatAgentPresenceState = 'idle';\n @Input() public AgentName?: string;\n @Input() public AvatarUrl?: string;\n @Input() public Mode: 'subtle' | 'prominent' = 'subtle';\n}\n"]}
@@ -0,0 +1,9 @@
1
+ import type { IMJChatDemonstrationSurfaceComponent } from './slot-interfaces';
2
+ import * as i0 from "@angular/core";
3
+ export declare class MJChatDemonstrationSurfaceDefaultComponent implements IMJChatDemonstrationSurfaceComponent {
4
+ Content?: unknown;
5
+ Visible: boolean;
6
+ static ɵfac: i0.ɵɵFactoryDeclaration<MJChatDemonstrationSurfaceDefaultComponent, never>;
7
+ static ɵcmp: i0.ɵɵComponentDeclaration<MJChatDemonstrationSurfaceDefaultComponent, "mj-chat-demonstration-surface-default", never, { "Content": { "alias": "Content"; "required": false; }; "Visible": { "alias": "Visible"; "required": false; }; }, {}, never, never, true, never>;
8
+ }
9
+ //# sourceMappingURL=mj-chat-demonstration-surface-default.component.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mj-chat-demonstration-surface-default.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/slots/mj-chat-demonstration-surface-default.component.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,oCAAoC,EAAE,MAAM,mBAAmB,CAAC;;AAE9E,qBAMa,0CACT,YAAW,oCAAoC;IAE/B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,OAAO,CAAS;yCAJhC,0CAA0C;2CAA1C,0CAA0C;CAKtD"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * @fileoverview Default `demonstrationSurface` slot component — no-op by default.
3
+ *
4
+ * The `demonstrationSurface` slot is intended for full-width adjacent content
5
+ * the agent is "walking through" — annotated lesson material, step-by-step
6
+ * screenshots, a paused video frame with arrows pointing at relevant regions,
7
+ * etc. By default it renders nothing; consumers project their own template or
8
+ * subclass this default to populate the surface.
9
+ *
10
+ * @module @memberjunction/ng-conversations
11
+ */
12
+ import { Component, Input } from '@angular/core';
13
+ import { CommonModule } from '@angular/common';
14
+ import * as i0 from "@angular/core";
15
+ export class MJChatDemonstrationSurfaceDefaultComponent {
16
+ Content;
17
+ Visible = false;
18
+ static ɵfac = function MJChatDemonstrationSurfaceDefaultComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || MJChatDemonstrationSurfaceDefaultComponent)(); };
19
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: MJChatDemonstrationSurfaceDefaultComponent, selectors: [["mj-chat-demonstration-surface-default"]], inputs: { Content: "Content", Visible: "Visible" }, decls: 0, vars: 0, template: function MJChatDemonstrationSurfaceDefaultComponent_Template(rf, ctx) { }, dependencies: [CommonModule], encapsulation: 2 });
20
+ }
21
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(MJChatDemonstrationSurfaceDefaultComponent, [{
22
+ type: Component,
23
+ args: [{
24
+ selector: 'mj-chat-demonstration-surface-default',
25
+ standalone: true,
26
+ imports: [CommonModule],
27
+ template: ``,
28
+ }]
29
+ }], null, { Content: [{
30
+ type: Input
31
+ }], Visible: [{
32
+ type: Input
33
+ }] }); })();
34
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(MJChatDemonstrationSurfaceDefaultComponent, { className: "MJChatDemonstrationSurfaceDefaultComponent", filePath: "src/lib/components/slots/mj-chat-demonstration-surface-default.component.ts", lineNumber: 24 }); })();
35
+ //# sourceMappingURL=mj-chat-demonstration-surface-default.component.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mj-chat-demonstration-surface-default.component.js","sourceRoot":"","sources":["../../../../src/lib/components/slots/mj-chat-demonstration-surface-default.component.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;;AAU/C,MAAM,OAAO,0CAA0C;IAGnC,OAAO,CAAW;IAClB,OAAO,GAAY,KAAK,CAAC;oIAJhC,0CAA0C;6DAA1C,0CAA0C,qOAHzC,YAAY;;iFAGb,0CAA0C;cANtD,SAAS;eAAC;gBACP,QAAQ,EAAE,uCAAuC;gBACjD,UAAU,EAAE,IAAI;gBAChB,OAAO,EAAE,CAAC,YAAY,CAAC;gBACvB,QAAQ,EAAE,EAAE;aACf;;kBAII,KAAK;;kBACL,KAAK;;kFAJG,0CAA0C","sourcesContent":["/**\n * @fileoverview Default `demonstrationSurface` slot component — no-op by default.\n *\n * The `demonstrationSurface` slot is intended for full-width adjacent content\n * the agent is \"walking through\" — annotated lesson material, step-by-step\n * screenshots, a paused video frame with arrows pointing at relevant regions,\n * etc. By default it renders nothing; consumers project their own template or\n * subclass this default to populate the surface.\n *\n * @module @memberjunction/ng-conversations\n */\n\nimport { Component, Input } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\nimport type { IMJChatDemonstrationSurfaceComponent } from './slot-interfaces';\n\n@Component({\n selector: 'mj-chat-demonstration-surface-default',\n standalone: true,\n imports: [CommonModule],\n template: ``,\n})\nexport class MJChatDemonstrationSurfaceDefaultComponent\n implements IMJChatDemonstrationSurfaceComponent\n{\n @Input() public Content?: unknown;\n @Input() public Visible: boolean = false;\n}\n"]}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * @fileoverview Default `emptyState` slot component.
3
+ *
4
+ * Minimal greeting + optional subtext + optional suggested-prompt chips.
5
+ * Standalone, exported, intentionally simple so consumers can:
6
+ *
7
+ * 1. Project an ad-hoc template via `<ng-template mjChatSlot="emptyState">` if
8
+ * the default's shape doesn't fit.
9
+ * 2. Wrap this default in their own frame (containment) — e.g. a warm tutor
10
+ * welcome card surrounding the default's prompts.
11
+ * 3. Subclass — extend this component, override only what they need (e.g.,
12
+ * swap the prompt-chip rendering for a different visual treatment), and
13
+ * use the subclass as the slot fill.
14
+ *
15
+ * @module @memberjunction/ng-conversations
16
+ */
17
+ import { EventEmitter } from '@angular/core';
18
+ import type { IMJChatEmptyStateComponent } from './slot-interfaces';
19
+ import * as i0 from "@angular/core";
20
+ export declare class MJChatEmptyStateDefaultComponent implements IMJChatEmptyStateComponent {
21
+ Greeting: string;
22
+ Subtext?: string;
23
+ SuggestedPrompts?: string[];
24
+ PromptSelected: EventEmitter<string>;
25
+ static ɵfac: i0.ɵɵFactoryDeclaration<MJChatEmptyStateDefaultComponent, never>;
26
+ static ɵcmp: i0.ɵɵComponentDeclaration<MJChatEmptyStateDefaultComponent, "mj-chat-empty-state-default", never, { "Greeting": { "alias": "Greeting"; "required": false; }; "Subtext": { "alias": "Subtext"; "required": false; }; "SuggestedPrompts": { "alias": "SuggestedPrompts"; "required": false; }; }, { "PromptSelected": "PromptSelected"; }, never, never, true, never>;
27
+ }
28
+ //# sourceMappingURL=mj-chat-empty-state-default.component.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mj-chat-empty-state-default.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/slots/mj-chat-empty-state-default.component.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAa,YAAY,EAAiB,MAAM,eAAe,CAAC;AAGvE,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,mBAAmB,CAAC;;AAEpE,qBAiEa,gCAAiC,YAAW,0BAA0B;IAC/D,QAAQ,EAAE,MAAM,CAAyB;IACzC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAE3B,cAAc,uBAA8B;yCALpD,gCAAgC;2CAAhC,gCAAgC;CAM5C"}
@@ -0,0 +1,104 @@
1
+ /**
2
+ * @fileoverview Default `emptyState` slot component.
3
+ *
4
+ * Minimal greeting + optional subtext + optional suggested-prompt chips.
5
+ * Standalone, exported, intentionally simple so consumers can:
6
+ *
7
+ * 1. Project an ad-hoc template via `<ng-template mjChatSlot="emptyState">` if
8
+ * the default's shape doesn't fit.
9
+ * 2. Wrap this default in their own frame (containment) — e.g. a warm tutor
10
+ * welcome card surrounding the default's prompts.
11
+ * 3. Subclass — extend this component, override only what they need (e.g.,
12
+ * swap the prompt-chip rendering for a different visual treatment), and
13
+ * use the subclass as the slot fill.
14
+ *
15
+ * @module @memberjunction/ng-conversations
16
+ */
17
+ import { Component, EventEmitter, Input, Output } from '@angular/core';
18
+ import { CommonModule } from '@angular/common';
19
+ import * as i0 from "@angular/core";
20
+ function MJChatEmptyStateDefaultComponent_Conditional_3_Template(rf, ctx) { if (rf & 1) {
21
+ i0.ɵɵdomElementStart(0, "div", 2);
22
+ i0.ɵɵtext(1);
23
+ i0.ɵɵdomElementEnd();
24
+ } if (rf & 2) {
25
+ const ctx_r0 = i0.ɵɵnextContext();
26
+ i0.ɵɵadvance();
27
+ i0.ɵɵtextInterpolate(ctx_r0.Subtext);
28
+ } }
29
+ function MJChatEmptyStateDefaultComponent_Conditional_4_For_2_Template(rf, ctx) { if (rf & 1) {
30
+ const _r2 = i0.ɵɵgetCurrentView();
31
+ i0.ɵɵdomElementStart(0, "button", 5);
32
+ i0.ɵɵdomListener("click", function MJChatEmptyStateDefaultComponent_Conditional_4_For_2_Template_button_click_0_listener() { const prompt_r3 = i0.ɵɵrestoreView(_r2).$implicit; const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.PromptSelected.emit(prompt_r3)); });
33
+ i0.ɵɵtext(1);
34
+ i0.ɵɵdomElementEnd();
35
+ } if (rf & 2) {
36
+ const prompt_r3 = ctx.$implicit;
37
+ i0.ɵɵadvance();
38
+ i0.ɵɵtextInterpolate1(" ", prompt_r3, " ");
39
+ } }
40
+ function MJChatEmptyStateDefaultComponent_Conditional_4_Template(rf, ctx) { if (rf & 1) {
41
+ i0.ɵɵdomElementStart(0, "div", 3);
42
+ i0.ɵɵrepeaterCreate(1, MJChatEmptyStateDefaultComponent_Conditional_4_For_2_Template, 2, 1, "button", 4, i0.ɵɵrepeaterTrackByIdentity);
43
+ i0.ɵɵdomElementEnd();
44
+ } if (rf & 2) {
45
+ const ctx_r0 = i0.ɵɵnextContext();
46
+ i0.ɵɵadvance();
47
+ i0.ɵɵrepeater(ctx_r0.SuggestedPrompts);
48
+ } }
49
+ export class MJChatEmptyStateDefaultComponent {
50
+ Greeting = 'How can I help you?';
51
+ Subtext;
52
+ SuggestedPrompts;
53
+ PromptSelected = new EventEmitter();
54
+ static ɵfac = function MJChatEmptyStateDefaultComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || MJChatEmptyStateDefaultComponent)(); };
55
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: MJChatEmptyStateDefaultComponent, selectors: [["mj-chat-empty-state-default"]], inputs: { Greeting: "Greeting", Subtext: "Subtext", SuggestedPrompts: "SuggestedPrompts" }, outputs: { PromptSelected: "PromptSelected" }, decls: 5, vars: 3, consts: [[1, "mj-chat-empty-state-default"], [1, "mj-chat-empty-state-default__greeting"], [1, "mj-chat-empty-state-default__subtext"], [1, "mj-chat-empty-state-default__prompts"], ["type", "button", 1, "mj-chat-empty-state-default__prompt-chip"], ["type", "button", 1, "mj-chat-empty-state-default__prompt-chip", 3, "click"]], template: function MJChatEmptyStateDefaultComponent_Template(rf, ctx) { if (rf & 1) {
56
+ i0.ɵɵdomElementStart(0, "div", 0)(1, "div", 1);
57
+ i0.ɵɵtext(2);
58
+ i0.ɵɵdomElementEnd();
59
+ i0.ɵɵconditionalCreate(3, MJChatEmptyStateDefaultComponent_Conditional_3_Template, 2, 1, "div", 2);
60
+ i0.ɵɵconditionalCreate(4, MJChatEmptyStateDefaultComponent_Conditional_4_Template, 3, 0, "div", 3);
61
+ i0.ɵɵdomElementEnd();
62
+ } if (rf & 2) {
63
+ i0.ɵɵadvance(2);
64
+ i0.ɵɵtextInterpolate(ctx.Greeting);
65
+ i0.ɵɵadvance();
66
+ i0.ɵɵconditional(ctx.Subtext ? 3 : -1);
67
+ i0.ɵɵadvance();
68
+ i0.ɵɵconditional(ctx.SuggestedPrompts && ctx.SuggestedPrompts.length > 0 ? 4 : -1);
69
+ } }, dependencies: [CommonModule], styles: [".mj-chat-empty-state-default[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 0.5rem;\n padding: 2rem;\n text-align: center;\n color: var(--mj-text-primary);\n }\n .mj-chat-empty-state-default__greeting[_ngcontent-%COMP%] {\n font-size: 1.25rem;\n font-weight: 600;\n }\n .mj-chat-empty-state-default__subtext[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary);\n }\n .mj-chat-empty-state-default__prompts[_ngcontent-%COMP%] {\n display: flex;\n flex-wrap: wrap;\n gap: 0.5rem;\n margin-top: 1rem;\n }\n .mj-chat-empty-state-default__prompt-chip[_ngcontent-%COMP%] {\n padding: 0.4rem 0.8rem;\n border-radius: 999px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-primary);\n cursor: pointer;\n font-size: 0.85rem;\n }\n .mj-chat-empty-state-default__prompt-chip[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n }"] });
70
+ }
71
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(MJChatEmptyStateDefaultComponent, [{
72
+ type: Component,
73
+ args: [{ selector: 'mj-chat-empty-state-default', standalone: true, imports: [CommonModule], template: `
74
+ <div class="mj-chat-empty-state-default">
75
+ <div class="mj-chat-empty-state-default__greeting">{{ Greeting }}</div>
76
+ @if (Subtext) {
77
+ <div class="mj-chat-empty-state-default__subtext">{{ Subtext }}</div>
78
+ }
79
+ @if (SuggestedPrompts && SuggestedPrompts.length > 0) {
80
+ <div class="mj-chat-empty-state-default__prompts">
81
+ @for (prompt of SuggestedPrompts; track prompt) {
82
+ <button
83
+ type="button"
84
+ class="mj-chat-empty-state-default__prompt-chip"
85
+ (click)="PromptSelected.emit(prompt)"
86
+ >
87
+ {{ prompt }}
88
+ </button>
89
+ }
90
+ </div>
91
+ }
92
+ </div>
93
+ `, styles: ["\n .mj-chat-empty-state-default {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 0.5rem;\n padding: 2rem;\n text-align: center;\n color: var(--mj-text-primary);\n }\n .mj-chat-empty-state-default__greeting {\n font-size: 1.25rem;\n font-weight: 600;\n }\n .mj-chat-empty-state-default__subtext {\n color: var(--mj-text-secondary);\n }\n .mj-chat-empty-state-default__prompts {\n display: flex;\n flex-wrap: wrap;\n gap: 0.5rem;\n margin-top: 1rem;\n }\n .mj-chat-empty-state-default__prompt-chip {\n padding: 0.4rem 0.8rem;\n border-radius: 999px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-primary);\n cursor: pointer;\n font-size: 0.85rem;\n }\n .mj-chat-empty-state-default__prompt-chip:hover {\n background: var(--mj-bg-surface-hover);\n }\n "] }]
94
+ }], null, { Greeting: [{
95
+ type: Input
96
+ }], Subtext: [{
97
+ type: Input
98
+ }], SuggestedPrompts: [{
99
+ type: Input
100
+ }], PromptSelected: [{
101
+ type: Output
102
+ }] }); })();
103
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(MJChatEmptyStateDefaultComponent, { className: "MJChatEmptyStateDefaultComponent", filePath: "src/lib/components/slots/mj-chat-empty-state-default.component.ts", lineNumber: 88 }); })();
104
+ //# sourceMappingURL=mj-chat-empty-state-default.component.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mj-chat-empty-state-default.component.js","sourceRoot":"","sources":["../../../../src/lib/components/slots/mj-chat-empty-state-default.component.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACvE,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;;;IAY/B,iCAAkD;IAAA,YAAa;IAAA,oBAAM;;;IAAnB,cAAa;IAAb,oCAAa;;;;IAKvD,oCAIC;IADG,0OAAS,qCAA2B,KAAC;IAErC,YACJ;IAAA,oBAAS;;;IADL,cACJ;IADI,0CACJ;;;IARR,iCAAkD;IAC9C,sIAQC;IACL,oBAAM;;;IATF,cAQC;IARD,sCAQC;;AA6CrB,MAAM,OAAO,gCAAgC;IACzB,QAAQ,GAAW,qBAAqB,CAAC;IACzC,OAAO,CAAU;IACjB,gBAAgB,CAAY;IAE3B,cAAc,GAAG,IAAI,YAAY,EAAU,CAAC;0HALpD,gCAAgC;6DAAhC,gCAAgC;YA3DjC,AADJ,iCAAyC,aACc;YAAA,YAAc;YAAA,oBAAM;YACvE,kGAAe;YAGf,kGAAuD;YAa3D,oBAAM;;YAjBiD,eAAc;YAAd,kCAAc;YACjE,cAEC;YAFD,sCAEC;YACD,cAYC;YAZD,kFAYC;4BAnBC,YAAY;;iFA8Db,gCAAgC;cAjE5C,SAAS;2BACI,6BAA6B,cAC3B,IAAI,WACP,CAAC,YAAY,CAAC,YACb;;;;;;;;;;;;;;;;;;;;KAoBT;;kBA0CA,KAAK;;kBACL,KAAK;;kBACL,KAAK;;kBAEL,MAAM;;kFALE,gCAAgC","sourcesContent":["/**\n * @fileoverview Default `emptyState` slot component.\n *\n * Minimal greeting + optional subtext + optional suggested-prompt chips.\n * Standalone, exported, intentionally simple so consumers can:\n *\n * 1. Project an ad-hoc template via `<ng-template mjChatSlot=\"emptyState\">` if\n * the default's shape doesn't fit.\n * 2. Wrap this default in their own frame (containment) — e.g. a warm tutor\n * welcome card surrounding the default's prompts.\n * 3. Subclass — extend this component, override only what they need (e.g.,\n * swap the prompt-chip rendering for a different visual treatment), and\n * use the subclass as the slot fill.\n *\n * @module @memberjunction/ng-conversations\n */\n\nimport { Component, EventEmitter, Input, Output } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\nimport type { IMJChatEmptyStateComponent } from './slot-interfaces';\n\n@Component({\n selector: 'mj-chat-empty-state-default',\n standalone: true,\n imports: [CommonModule],\n template: `\n <div class=\"mj-chat-empty-state-default\">\n <div class=\"mj-chat-empty-state-default__greeting\">{{ Greeting }}</div>\n @if (Subtext) {\n <div class=\"mj-chat-empty-state-default__subtext\">{{ Subtext }}</div>\n }\n @if (SuggestedPrompts && SuggestedPrompts.length > 0) {\n <div class=\"mj-chat-empty-state-default__prompts\">\n @for (prompt of SuggestedPrompts; track prompt) {\n <button\n type=\"button\"\n class=\"mj-chat-empty-state-default__prompt-chip\"\n (click)=\"PromptSelected.emit(prompt)\"\n >\n {{ prompt }}\n </button>\n }\n </div>\n }\n </div>\n `,\n styles: [\n `\n .mj-chat-empty-state-default {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 0.5rem;\n padding: 2rem;\n text-align: center;\n color: var(--mj-text-primary);\n }\n .mj-chat-empty-state-default__greeting {\n font-size: 1.25rem;\n font-weight: 600;\n }\n .mj-chat-empty-state-default__subtext {\n color: var(--mj-text-secondary);\n }\n .mj-chat-empty-state-default__prompts {\n display: flex;\n flex-wrap: wrap;\n gap: 0.5rem;\n margin-top: 1rem;\n }\n .mj-chat-empty-state-default__prompt-chip {\n padding: 0.4rem 0.8rem;\n border-radius: 999px;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-primary);\n cursor: pointer;\n font-size: 0.85rem;\n }\n .mj-chat-empty-state-default__prompt-chip:hover {\n background: var(--mj-bg-surface-hover);\n }\n `,\n ],\n})\nexport class MJChatEmptyStateDefaultComponent implements IMJChatEmptyStateComponent {\n @Input() public Greeting: string = 'How can I help you?';\n @Input() public Subtext?: string;\n @Input() public SuggestedPrompts?: string[];\n\n @Output() public PromptSelected = new EventEmitter<string>();\n}\n"]}
@@ -0,0 +1,11 @@
1
+ import type { IMJChatHeaderComponent } from './slot-interfaces';
2
+ import * as i0 from "@angular/core";
3
+ export declare class MJChatHeaderDefaultComponent implements IMJChatHeaderComponent {
4
+ ConversationTitle?: string | null;
5
+ SharedBy?: string | null;
6
+ ArtifactCount?: number;
7
+ ShowArtifactIndicator: boolean;
8
+ static ɵfac: i0.ɵɵFactoryDeclaration<MJChatHeaderDefaultComponent, never>;
9
+ static ɵcmp: i0.ɵɵComponentDeclaration<MJChatHeaderDefaultComponent, "mj-chat-header-default", never, { "ConversationTitle": { "alias": "ConversationTitle"; "required": false; }; "SharedBy": { "alias": "SharedBy"; "required": false; }; "ArtifactCount": { "alias": "ArtifactCount"; "required": false; }; "ShowArtifactIndicator": { "alias": "ShowArtifactIndicator"; "required": false; }; }, {}, never, never, true, never>;
10
+ }
11
+ //# sourceMappingURL=mj-chat-header-default.component.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mj-chat-header-default.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/slots/mj-chat-header-default.component.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;;AAEhE,qBAyDa,4BAA6B,YAAW,sBAAsB;IACvD,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,qBAAqB,EAAE,OAAO,CAAQ;yCAJ7C,4BAA4B;2CAA5B,4BAA4B;CAKxC"}
@@ -0,0 +1,103 @@
1
+ /**
2
+ * @fileoverview Default `header` slot component.
3
+ *
4
+ * Minimal title-and-badge header. Most production usage of the chat-area still
5
+ * uses the component's built-in header rendering (export / share / member /
6
+ * artifact chips); this default is the version a consumer gets when they
7
+ * project a custom template into the `header` slot and want to wrap the
8
+ * default for containment.
9
+ *
10
+ * @module @memberjunction/ng-conversations
11
+ */
12
+ import { Component, Input } from '@angular/core';
13
+ import { CommonModule } from '@angular/common';
14
+ import * as i0 from "@angular/core";
15
+ function MJChatHeaderDefaultComponent_Conditional_2_Template(rf, ctx) { if (rf & 1) {
16
+ i0.ɵɵtext(0);
17
+ } if (rf & 2) {
18
+ const ctx_r0 = i0.ɵɵnextContext();
19
+ i0.ɵɵtextInterpolate1(" ", ctx_r0.ConversationTitle, " ");
20
+ } }
21
+ function MJChatHeaderDefaultComponent_Conditional_3_Template(rf, ctx) { if (rf & 1) {
22
+ i0.ɵɵdomElementStart(0, "span", 2);
23
+ i0.ɵɵtext(1, "New conversation");
24
+ i0.ɵɵdomElementEnd();
25
+ } }
26
+ function MJChatHeaderDefaultComponent_Conditional_4_Template(rf, ctx) { if (rf & 1) {
27
+ i0.ɵɵdomElementStart(0, "span", 3);
28
+ i0.ɵɵdomElement(1, "i", 5);
29
+ i0.ɵɵtext(2);
30
+ i0.ɵɵdomElementEnd();
31
+ } if (rf & 2) {
32
+ const ctx_r0 = i0.ɵɵnextContext();
33
+ i0.ɵɵadvance(2);
34
+ i0.ɵɵtextInterpolate1(" Shared by ", ctx_r0.SharedBy, " ");
35
+ } }
36
+ function MJChatHeaderDefaultComponent_Conditional_5_Template(rf, ctx) { if (rf & 1) {
37
+ i0.ɵɵdomElementStart(0, "span", 4);
38
+ i0.ɵɵdomElement(1, "i", 6);
39
+ i0.ɵɵtext(2);
40
+ i0.ɵɵdomElementEnd();
41
+ } if (rf & 2) {
42
+ const ctx_r0 = i0.ɵɵnextContext();
43
+ i0.ɵɵadvance(2);
44
+ i0.ɵɵtextInterpolate1(" ", ctx_r0.ArtifactCount, " ");
45
+ } }
46
+ export class MJChatHeaderDefaultComponent {
47
+ ConversationTitle;
48
+ SharedBy;
49
+ ArtifactCount;
50
+ ShowArtifactIndicator = true;
51
+ static ɵfac = function MJChatHeaderDefaultComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || MJChatHeaderDefaultComponent)(); };
52
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: MJChatHeaderDefaultComponent, selectors: [["mj-chat-header-default"]], inputs: { ConversationTitle: "ConversationTitle", SharedBy: "SharedBy", ArtifactCount: "ArtifactCount", ShowArtifactIndicator: "ShowArtifactIndicator" }, decls: 6, vars: 3, consts: [[1, "mj-chat-header-default"], [1, "mj-chat-header-default__title"], [1, "mj-chat-header-default__title-placeholder"], [1, "mj-chat-header-default__shared-by"], [1, "mj-chat-header-default__artifact-badge"], [1, "fa-solid", "fa-share-nodes"], [1, "fa-solid", "fa-cube"]], template: function MJChatHeaderDefaultComponent_Template(rf, ctx) { if (rf & 1) {
53
+ i0.ɵɵdomElementStart(0, "div", 0)(1, "div", 1);
54
+ i0.ɵɵconditionalCreate(2, MJChatHeaderDefaultComponent_Conditional_2_Template, 1, 1)(3, MJChatHeaderDefaultComponent_Conditional_3_Template, 2, 0, "span", 2);
55
+ i0.ɵɵdomElementEnd();
56
+ i0.ɵɵconditionalCreate(4, MJChatHeaderDefaultComponent_Conditional_4_Template, 3, 1, "span", 3);
57
+ i0.ɵɵconditionalCreate(5, MJChatHeaderDefaultComponent_Conditional_5_Template, 3, 1, "span", 4);
58
+ i0.ɵɵdomElementEnd();
59
+ } if (rf & 2) {
60
+ i0.ɵɵadvance(2);
61
+ i0.ɵɵconditional(ctx.ConversationTitle ? 2 : 3);
62
+ i0.ɵɵadvance(2);
63
+ i0.ɵɵconditional(ctx.SharedBy ? 4 : -1);
64
+ i0.ɵɵadvance();
65
+ i0.ɵɵconditional(ctx.ShowArtifactIndicator && ctx.ArtifactCount && ctx.ArtifactCount > 0 ? 5 : -1);
66
+ } }, dependencies: [CommonModule], styles: [".mj-chat-header-default[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n padding: 0.5rem 0.75rem;\n background: var(--mj-bg-surface);\n border-bottom: 1px solid var(--mj-border-default);\n }\n .mj-chat-header-default__title[_ngcontent-%COMP%] {\n font-weight: 600;\n color: var(--mj-text-primary);\n }\n .mj-chat-header-default__title-placeholder[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n font-style: italic;\n font-weight: 400;\n }\n .mj-chat-header-default__shared-by[_ngcontent-%COMP%], \n .mj-chat-header-default__artifact-badge[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n font-size: 0.85rem;\n color: var(--mj-text-secondary);\n }"] });
67
+ }
68
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(MJChatHeaderDefaultComponent, [{
69
+ type: Component,
70
+ args: [{ selector: 'mj-chat-header-default', standalone: true, imports: [CommonModule], template: `
71
+ <div class="mj-chat-header-default">
72
+ <div class="mj-chat-header-default__title">
73
+ @if (ConversationTitle) {
74
+ {{ ConversationTitle }}
75
+ } @else {
76
+ <span class="mj-chat-header-default__title-placeholder">New conversation</span>
77
+ }
78
+ </div>
79
+ @if (SharedBy) {
80
+ <span class="mj-chat-header-default__shared-by">
81
+ <i class="fa-solid fa-share-nodes"></i>
82
+ Shared by {{ SharedBy }}
83
+ </span>
84
+ }
85
+ @if (ShowArtifactIndicator && ArtifactCount && ArtifactCount > 0) {
86
+ <span class="mj-chat-header-default__artifact-badge">
87
+ <i class="fa-solid fa-cube"></i>
88
+ {{ ArtifactCount }}
89
+ </span>
90
+ }
91
+ </div>
92
+ `, styles: ["\n .mj-chat-header-default {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n padding: 0.5rem 0.75rem;\n background: var(--mj-bg-surface);\n border-bottom: 1px solid var(--mj-border-default);\n }\n .mj-chat-header-default__title {\n font-weight: 600;\n color: var(--mj-text-primary);\n }\n .mj-chat-header-default__title-placeholder {\n color: var(--mj-text-muted);\n font-style: italic;\n font-weight: 400;\n }\n .mj-chat-header-default__shared-by,\n .mj-chat-header-default__artifact-badge {\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n font-size: 0.85rem;\n color: var(--mj-text-secondary);\n }\n "] }]
93
+ }], null, { ConversationTitle: [{
94
+ type: Input
95
+ }], SharedBy: [{
96
+ type: Input
97
+ }], ArtifactCount: [{
98
+ type: Input
99
+ }], ShowArtifactIndicator: [{
100
+ type: Input
101
+ }] }); })();
102
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(MJChatHeaderDefaultComponent, { className: "MJChatHeaderDefaultComponent", filePath: "src/lib/components/slots/mj-chat-header-default.component.ts", lineNumber: 75 }); })();
103
+ //# sourceMappingURL=mj-chat-header-default.component.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mj-chat-header-default.component.js","sourceRoot":"","sources":["../../../../src/lib/components/slots/mj-chat-header-default.component.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;;;IAY3B,YACJ;;;IADI,yDACJ;;;IACI,kCAAwD;IAAA,gCAAgB;IAAA,oBAAO;;;IAInF,kCAAgD;IAC5C,0BAAuC;IACvC,YACJ;IAAA,oBAAO;;;IADH,eACJ;IADI,0DACJ;;;IAGA,kCAAqD;IACjD,0BAAgC;IAChC,YACJ;IAAA,oBAAO;;;IADH,eACJ;IADI,qDACJ;;AAkChB,MAAM,OAAO,4BAA4B;IACrB,iBAAiB,CAAiB;IAClC,QAAQ,CAAiB;IACzB,aAAa,CAAU;IACvB,qBAAqB,GAAY,IAAI,CAAC;sHAJ7C,4BAA4B;6DAA5B,4BAA4B;YAnD7B,AADJ,iCAAoC,aACW;YAGrC,AAFF,oFAAyB,yEAEhB;YAGb,oBAAM;YACN,+FAAgB;YAMhB,+FAAmE;YAMvE,oBAAM;;YAlBE,eAIC;YAJD,+CAIC;YAEL,eAKC;YALD,uCAKC;YACD,cAKC;YALD,kGAKC;4BArBC,YAAY;;iFAsDb,4BAA4B;cAzDxC,SAAS;2BACI,wBAAwB,cACtB,IAAI,WACP,CAAC,YAAY,CAAC,YACb;;;;;;;;;;;;;;;;;;;;;;KAsBT;;kBAgCA,KAAK;;kBACL,KAAK;;kBACL,KAAK;;kBACL,KAAK;;kFAJG,4BAA4B","sourcesContent":["/**\n * @fileoverview Default `header` slot component.\n *\n * Minimal title-and-badge header. Most production usage of the chat-area still\n * uses the component's built-in header rendering (export / share / member /\n * artifact chips); this default is the version a consumer gets when they\n * project a custom template into the `header` slot and want to wrap the\n * default for containment.\n *\n * @module @memberjunction/ng-conversations\n */\n\nimport { Component, Input } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\nimport type { IMJChatHeaderComponent } from './slot-interfaces';\n\n@Component({\n selector: 'mj-chat-header-default',\n standalone: true,\n imports: [CommonModule],\n template: `\n <div class=\"mj-chat-header-default\">\n <div class=\"mj-chat-header-default__title\">\n @if (ConversationTitle) {\n {{ ConversationTitle }}\n } @else {\n <span class=\"mj-chat-header-default__title-placeholder\">New conversation</span>\n }\n </div>\n @if (SharedBy) {\n <span class=\"mj-chat-header-default__shared-by\">\n <i class=\"fa-solid fa-share-nodes\"></i>\n Shared by {{ SharedBy }}\n </span>\n }\n @if (ShowArtifactIndicator && ArtifactCount && ArtifactCount > 0) {\n <span class=\"mj-chat-header-default__artifact-badge\">\n <i class=\"fa-solid fa-cube\"></i>\n {{ ArtifactCount }}\n </span>\n }\n </div>\n `,\n styles: [\n `\n .mj-chat-header-default {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n padding: 0.5rem 0.75rem;\n background: var(--mj-bg-surface);\n border-bottom: 1px solid var(--mj-border-default);\n }\n .mj-chat-header-default__title {\n font-weight: 600;\n color: var(--mj-text-primary);\n }\n .mj-chat-header-default__title-placeholder {\n color: var(--mj-text-muted);\n font-style: italic;\n font-weight: 400;\n }\n .mj-chat-header-default__shared-by,\n .mj-chat-header-default__artifact-badge {\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n font-size: 0.85rem;\n color: var(--mj-text-secondary);\n }\n `,\n ],\n})\nexport class MJChatHeaderDefaultComponent implements IMJChatHeaderComponent {\n @Input() public ConversationTitle?: string | null;\n @Input() public SharedBy?: string | null;\n @Input() public ArtifactCount?: number;\n @Input() public ShowArtifactIndicator: boolean = true;\n}\n"]}
@@ -0,0 +1,15 @@
1
+ import type { MJConversationDetailEntity } from '@memberjunction/core-entities';
2
+ import type { IMJChatMessageRendererComponent } from './slot-interfaces';
3
+ import * as i0 from "@angular/core";
4
+ export declare class MJChatMessageBubbleDefaultComponent implements IMJChatMessageRendererComponent {
5
+ Message: MJConversationDetailEntity | null;
6
+ /**
7
+ * `true` for messages authored by the conversation participant ("User" role).
8
+ * Drives side-alignment and which color token applies. Falls back to `false`
9
+ * (agent / left-aligned) for any non-User role, including null and unknown.
10
+ */
11
+ get IsUser(): boolean;
12
+ static ɵfac: i0.ɵɵFactoryDeclaration<MJChatMessageBubbleDefaultComponent, never>;
13
+ static ɵcmp: i0.ɵɵComponentDeclaration<MJChatMessageBubbleDefaultComponent, "mj-chat-message-bubble-default", never, { "Message": { "alias": "Message"; "required": false; }; }, {}, never, never, true, never>;
14
+ }
15
+ //# sourceMappingURL=mj-chat-message-bubble-default.component.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mj-chat-message-bubble-default.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/slots/mj-chat-message-bubble-default.component.ts"],"names":[],"mappings":"AA6BA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,+BAA+B,CAAC;AAEhF,OAAO,KAAK,EAAE,+BAA+B,EAAE,MAAM,mBAAmB,CAAC;;AAEzE,qBAkDa,mCAAoC,YAAW,+BAA+B;IACvE,OAAO,EAAE,0BAA0B,GAAG,IAAI,CAAQ;IAElE;;;;OAIG;IACH,IAAW,MAAM,IAAI,OAAO,CAE3B;yCAVQ,mCAAmC;2CAAnC,mCAAmC;CAW/C"}