@memberjunction/ng-conversations 5.43.0 → 5.44.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 (351) hide show
  1. package/dist/lib/components/active-tasks/active-tasks-panel.component.d.ts +0 -1
  2. package/dist/lib/components/active-tasks/active-tasks-panel.component.d.ts.map +1 -1
  3. package/dist/lib/components/active-tasks/active-tasks-panel.component.js +56 -52
  4. package/dist/lib/components/active-tasks/active-tasks-panel.component.js.map +1 -1
  5. package/dist/lib/components/artifact/artifact-share-modal.component.js +37 -41
  6. package/dist/lib/components/artifact/artifact-share-modal.component.js.map +1 -1
  7. package/dist/lib/components/collection/collection-form-modal.component.d.ts.map +1 -1
  8. package/dist/lib/components/collection/collection-form-modal.component.js +10 -14
  9. package/dist/lib/components/collection/collection-form-modal.component.js.map +1 -1
  10. package/dist/lib/components/collection/collection-share-modal.component.js +41 -45
  11. package/dist/lib/components/collection/collection-share-modal.component.js.map +1 -1
  12. package/dist/lib/components/collection/collection-view.component.d.ts.map +1 -1
  13. package/dist/lib/components/collection/collection-view.component.js +22 -36
  14. package/dist/lib/components/collection/collection-view.component.js.map +1 -1
  15. package/dist/lib/components/collection/collections-full-view.component.d.ts +4 -0
  16. package/dist/lib/components/collection/collections-full-view.component.d.ts.map +1 -1
  17. package/dist/lib/components/collection/collections-full-view.component.js +134 -166
  18. package/dist/lib/components/collection/collections-full-view.component.js.map +1 -1
  19. package/dist/lib/components/conversation/conversation-chat-area.component.d.ts +73 -8
  20. package/dist/lib/components/conversation/conversation-chat-area.component.d.ts.map +1 -1
  21. package/dist/lib/components/conversation/conversation-chat-area.component.js +487 -123
  22. package/dist/lib/components/conversation/conversation-chat-area.component.js.map +1 -1
  23. package/dist/lib/components/conversation/pinned-messages-panel.component.js +6 -9
  24. package/dist/lib/components/conversation/pinned-messages-panel.component.js.map +1 -1
  25. package/dist/lib/components/library/library-full-view.component.d.ts.map +1 -1
  26. package/dist/lib/components/library/library-full-view.component.js +20 -24
  27. package/dist/lib/components/library/library-full-view.component.js.map +1 -1
  28. package/dist/lib/components/members/members-modal.component.d.ts.map +1 -1
  29. package/dist/lib/components/members/members-modal.component.js +10 -11
  30. package/dist/lib/components/members/members-modal.component.js.map +1 -1
  31. package/dist/lib/components/mention/mention-dropdown.component.js +49 -28
  32. package/dist/lib/components/mention/mention-dropdown.component.js.map +1 -1
  33. package/dist/lib/components/mention/mention-editor.component.d.ts.map +1 -1
  34. package/dist/lib/components/mention/mention-editor.component.js +24 -10
  35. package/dist/lib/components/mention/mention-editor.component.js.map +1 -1
  36. package/dist/lib/components/message/message-input-box.component.d.ts +11 -16
  37. package/dist/lib/components/message/message-input-box.component.d.ts.map +1 -1
  38. package/dist/lib/components/message/message-input-box.component.js +52 -46
  39. package/dist/lib/components/message/message-input-box.component.js.map +1 -1
  40. package/dist/lib/components/message/message-input.component.d.ts +83 -18
  41. package/dist/lib/components/message/message-input.component.d.ts.map +1 -1
  42. package/dist/lib/components/message/message-input.component.js +238 -151
  43. package/dist/lib/components/message/message-input.component.js.map +1 -1
  44. package/dist/lib/components/message/message-item.component.d.ts +10 -1
  45. package/dist/lib/components/message/message-item.component.d.ts.map +1 -1
  46. package/dist/lib/components/message/message-item.component.js +67 -15
  47. package/dist/lib/components/message/message-item.component.js.map +1 -1
  48. package/dist/lib/components/message/message-list.component.js +6 -9
  49. package/dist/lib/components/message/message-list.component.js.map +1 -1
  50. package/dist/lib/components/overlay/chat-overlay.component.d.ts +3 -0
  51. package/dist/lib/components/overlay/chat-overlay.component.d.ts.map +1 -1
  52. package/dist/lib/components/overlay/chat-overlay.component.js +9 -4
  53. package/dist/lib/components/overlay/chat-overlay.component.js.map +1 -1
  54. package/dist/lib/components/realtime/channels/base-realtime-channel-client.d.ts +45 -0
  55. package/dist/lib/components/realtime/channels/base-realtime-channel-client.d.ts.map +1 -1
  56. package/dist/lib/components/realtime/channels/base-realtime-channel-client.js +10 -0
  57. package/dist/lib/components/realtime/channels/base-realtime-channel-client.js.map +1 -1
  58. package/dist/lib/components/realtime/channels/client-context-channel.d.ts +46 -0
  59. package/dist/lib/components/realtime/channels/client-context-channel.d.ts.map +1 -0
  60. package/dist/lib/components/realtime/channels/client-context-channel.js +174 -0
  61. package/dist/lib/components/realtime/channels/client-context-channel.js.map +1 -0
  62. package/dist/lib/components/realtime/evidence-playback/realtime-evidence-playback.component.d.ts +123 -0
  63. package/dist/lib/components/realtime/evidence-playback/realtime-evidence-playback.component.d.ts.map +1 -0
  64. package/dist/lib/components/realtime/evidence-playback/realtime-evidence-playback.component.js +397 -0
  65. package/dist/lib/components/realtime/evidence-playback/realtime-evidence-playback.component.js.map +1 -0
  66. package/dist/lib/components/realtime/media/media-channel-state.d.ts +103 -0
  67. package/dist/lib/components/realtime/media/media-channel-state.d.ts.map +1 -0
  68. package/dist/lib/components/realtime/media/media-channel-state.js +143 -0
  69. package/dist/lib/components/realtime/media/media-channel-state.js.map +1 -0
  70. package/dist/lib/components/realtime/media/media-channel-tools.d.ts +24 -0
  71. package/dist/lib/components/realtime/media/media-channel-tools.d.ts.map +1 -0
  72. package/dist/lib/components/realtime/media/media-channel-tools.js +107 -0
  73. package/dist/lib/components/realtime/media/media-channel-tools.js.map +1 -0
  74. package/dist/lib/components/realtime/media/media-channel.d.ts +89 -0
  75. package/dist/lib/components/realtime/media/media-channel.d.ts.map +1 -0
  76. package/dist/lib/components/realtime/media/media-channel.js +253 -0
  77. package/dist/lib/components/realtime/media/media-channel.js.map +1 -0
  78. package/dist/lib/components/realtime/media/realtime-media-surface.component.d.ts +141 -0
  79. package/dist/lib/components/realtime/media/realtime-media-surface.component.d.ts.map +1 -0
  80. package/dist/lib/components/realtime/media/realtime-media-surface.component.js +574 -0
  81. package/dist/lib/components/realtime/media/realtime-media-surface.component.js.map +1 -0
  82. package/dist/lib/components/realtime/realtime-activity-rail.component.d.ts +59 -14
  83. package/dist/lib/components/realtime/realtime-activity-rail.component.d.ts.map +1 -1
  84. package/dist/lib/components/realtime/realtime-activity-rail.component.js +277 -74
  85. package/dist/lib/components/realtime/realtime-activity-rail.component.js.map +1 -1
  86. package/dist/lib/components/realtime/realtime-agent-banner.component.d.ts +28 -27
  87. package/dist/lib/components/realtime/realtime-agent-banner.component.d.ts.map +1 -1
  88. package/dist/lib/components/realtime/realtime-agent-banner.component.js +144 -143
  89. package/dist/lib/components/realtime/realtime-agent-banner.component.js.map +1 -1
  90. package/dist/lib/components/realtime/realtime-agent-picker.component.d.ts +12 -0
  91. package/dist/lib/components/realtime/realtime-agent-picker.component.d.ts.map +1 -1
  92. package/dist/lib/components/realtime/realtime-agent-picker.component.js +105 -43
  93. package/dist/lib/components/realtime/realtime-agent-picker.component.js.map +1 -1
  94. package/dist/lib/components/realtime/realtime-audio-visuals.d.ts +2 -2
  95. package/dist/lib/components/realtime/realtime-audio-visuals.d.ts.map +1 -1
  96. package/dist/lib/components/realtime/realtime-audio-visuals.js.map +1 -1
  97. package/dist/lib/components/realtime/realtime-composer.component.d.ts +41 -7
  98. package/dist/lib/components/realtime/realtime-composer.component.d.ts.map +1 -1
  99. package/dist/lib/components/realtime/realtime-composer.component.js +216 -102
  100. package/dist/lib/components/realtime/realtime-composer.component.js.map +1 -1
  101. package/dist/lib/components/realtime/realtime-delegation-card.component.d.ts +0 -2
  102. package/dist/lib/components/realtime/realtime-delegation-card.component.d.ts.map +1 -1
  103. package/dist/lib/components/realtime/realtime-delegation-card.component.js +67 -71
  104. package/dist/lib/components/realtime/realtime-delegation-card.component.js.map +1 -1
  105. package/dist/lib/components/realtime/realtime-session-overlay.component.d.ts +364 -44
  106. package/dist/lib/components/realtime/realtime-session-overlay.component.d.ts.map +1 -1
  107. package/dist/lib/components/realtime/realtime-session-overlay.component.js +839 -153
  108. package/dist/lib/components/realtime/realtime-session-overlay.component.js.map +1 -1
  109. package/dist/lib/components/realtime/realtime-session-state.d.ts +5 -5
  110. package/dist/lib/components/realtime/realtime-session-state.d.ts.map +1 -1
  111. package/dist/lib/components/realtime/realtime-session-state.js.map +1 -1
  112. package/dist/lib/components/realtime/realtime-surface-tab-style.d.ts +70 -0
  113. package/dist/lib/components/realtime/realtime-surface-tab-style.d.ts.map +1 -0
  114. package/dist/lib/components/realtime/realtime-surface-tab-style.js +115 -0
  115. package/dist/lib/components/realtime/realtime-surface-tab-style.js.map +1 -0
  116. package/dist/lib/components/realtime/realtime-surface-tabs.component.d.ts +55 -57
  117. package/dist/lib/components/realtime/realtime-surface-tabs.component.d.ts.map +1 -1
  118. package/dist/lib/components/realtime/realtime-surface-tabs.component.js +165 -143
  119. package/dist/lib/components/realtime/realtime-surface-tabs.component.js.map +1 -1
  120. package/dist/lib/components/realtime/realtime-surface-tabs.model.d.ts +80 -71
  121. package/dist/lib/components/realtime/realtime-surface-tabs.model.d.ts.map +1 -1
  122. package/dist/lib/components/realtime/realtime-surface-tabs.model.js +83 -113
  123. package/dist/lib/components/realtime/realtime-surface-tabs.model.js.map +1 -1
  124. package/dist/lib/components/realtime/realtime-ui-config.d.ts +270 -0
  125. package/dist/lib/components/realtime/realtime-ui-config.d.ts.map +1 -0
  126. package/dist/lib/components/realtime/realtime-ui-config.js +212 -0
  127. package/dist/lib/components/realtime/realtime-ui-config.js.map +1 -0
  128. package/dist/lib/components/search/search-panel.component.d.ts +2 -0
  129. package/dist/lib/components/search/search-panel.component.d.ts.map +1 -1
  130. package/dist/lib/components/search/search-panel.component.js +92 -101
  131. package/dist/lib/components/search/search-panel.component.js.map +1 -1
  132. package/dist/lib/components/share/share-modal.component.d.ts.map +1 -1
  133. package/dist/lib/components/share/share-modal.component.js +10 -11
  134. package/dist/lib/components/share/share-modal.component.js.map +1 -1
  135. package/dist/lib/components/shared/user-picker.component.d.ts.map +1 -1
  136. package/dist/lib/components/shared/user-picker.component.js +12 -15
  137. package/dist/lib/components/shared/user-picker.component.js.map +1 -1
  138. package/dist/lib/components/workspace/conversation-workspace.component.d.ts +5 -0
  139. package/dist/lib/components/workspace/conversation-workspace.component.d.ts.map +1 -1
  140. package/dist/lib/components/workspace/conversation-workspace.component.js +18 -7
  141. package/dist/lib/components/workspace/conversation-workspace.component.js.map +1 -1
  142. package/dist/lib/conversations.module.d.ts +29 -26
  143. package/dist/lib/conversations.module.d.ts.map +1 -1
  144. package/dist/lib/conversations.module.js +37 -6
  145. package/dist/lib/conversations.module.js.map +1 -1
  146. package/dist/lib/models/conversation-state.model.d.ts +6 -3
  147. package/dist/lib/models/conversation-state.model.d.ts.map +1 -1
  148. package/dist/lib/models/conversation-state.model.js.map +1 -1
  149. package/dist/lib/services/conversation-agent.service.d.ts +2 -2
  150. package/dist/lib/services/conversation-agent.service.d.ts.map +1 -1
  151. package/dist/lib/services/conversation-agent.service.js +6 -2
  152. package/dist/lib/services/conversation-agent.service.js.map +1 -1
  153. package/dist/lib/services/mention-autocomplete.service.d.ts +17 -1
  154. package/dist/lib/services/mention-autocomplete.service.d.ts.map +1 -1
  155. package/dist/lib/services/mention-autocomplete.service.js +58 -2
  156. package/dist/lib/services/mention-autocomplete.service.js.map +1 -1
  157. package/dist/lib/services/realtime-audio-recorder.d.ts +143 -0
  158. package/dist/lib/services/realtime-audio-recorder.d.ts.map +1 -0
  159. package/dist/lib/services/realtime-audio-recorder.js +379 -0
  160. package/dist/lib/services/realtime-audio-recorder.js.map +1 -0
  161. package/dist/lib/services/realtime-pcm-wav.d.ts +75 -0
  162. package/dist/lib/services/realtime-pcm-wav.d.ts.map +1 -0
  163. package/dist/lib/services/realtime-pcm-wav.js +205 -0
  164. package/dist/lib/services/realtime-pcm-wav.js.map +1 -0
  165. package/dist/lib/services/realtime-session-review.service.d.ts +28 -1
  166. package/dist/lib/services/realtime-session-review.service.d.ts.map +1 -1
  167. package/dist/lib/services/realtime-session-review.service.js +12 -3
  168. package/dist/lib/services/realtime-session-review.service.js.map +1 -1
  169. package/dist/lib/services/realtime-session.service.d.ts +210 -20
  170. package/dist/lib/services/realtime-session.service.d.ts.map +1 -1
  171. package/dist/lib/services/realtime-session.service.js +452 -21
  172. package/dist/lib/services/realtime-session.service.js.map +1 -1
  173. package/dist/lib/services/realtime-sessions-adapter.js +1 -1
  174. package/dist/lib/services/realtime-sessions-adapter.js.map +1 -1
  175. package/dist/lib/services/ui-command-handler.service.d.ts +7 -2
  176. package/dist/lib/services/ui-command-handler.service.d.ts.map +1 -1
  177. package/dist/lib/services/ui-command-handler.service.js +6 -2
  178. package/dist/lib/services/ui-command-handler.service.js.map +1 -1
  179. package/dist/lib/utils/plan-mode-preference.d.ts +62 -0
  180. package/dist/lib/utils/plan-mode-preference.d.ts.map +1 -0
  181. package/dist/lib/utils/plan-mode-preference.js +130 -0
  182. package/dist/lib/utils/plan-mode-preference.js.map +1 -0
  183. package/dist/public-api.d.ts +6 -0
  184. package/dist/public-api.d.ts.map +1 -1
  185. package/dist/public-api.js +8 -0
  186. package/dist/public-api.js.map +1 -1
  187. package/package.json +28 -26
  188. package/dist/__tests__/attachment-badge.test.d.ts +0 -2
  189. package/dist/__tests__/attachment-badge.test.d.ts.map +0 -1
  190. package/dist/__tests__/attachment-badge.test.js +0 -66
  191. package/dist/__tests__/attachment-badge.test.js.map +0 -1
  192. package/dist/__tests__/channel-optional-surface.test.d.ts +0 -2
  193. package/dist/__tests__/channel-optional-surface.test.d.ts.map +0 -1
  194. package/dist/__tests__/channel-optional-surface.test.js +0 -53
  195. package/dist/__tests__/channel-optional-surface.test.js.map +0 -1
  196. package/dist/__tests__/chat-events.test.d.ts +0 -14
  197. package/dist/__tests__/chat-events.test.d.ts.map +0 -1
  198. package/dist/__tests__/chat-events.test.js +0 -109
  199. package/dist/__tests__/chat-events.test.js.map +0 -1
  200. package/dist/__tests__/collections-full-view.test.d.ts +0 -2
  201. package/dist/__tests__/collections-full-view.test.d.ts.map +0 -1
  202. package/dist/__tests__/collections-full-view.test.js +0 -225
  203. package/dist/__tests__/collections-full-view.test.js.map +0 -1
  204. package/dist/__tests__/conversation-cache.test.d.ts +0 -2
  205. package/dist/__tests__/conversation-cache.test.d.ts.map +0 -1
  206. package/dist/__tests__/conversation-cache.test.js +0 -233
  207. package/dist/__tests__/conversation-cache.test.js.map +0 -1
  208. package/dist/__tests__/conversation-naming.test.d.ts +0 -2
  209. package/dist/__tests__/conversation-naming.test.d.ts.map +0 -1
  210. package/dist/__tests__/conversation-naming.test.js +0 -110
  211. package/dist/__tests__/conversation-naming.test.js.map +0 -1
  212. package/dist/__tests__/delegation-result-parser.test.d.ts +0 -2
  213. package/dist/__tests__/delegation-result-parser.test.d.ts.map +0 -1
  214. package/dist/__tests__/delegation-result-parser.test.js +0 -107
  215. package/dist/__tests__/delegation-result-parser.test.js.map +0 -1
  216. package/dist/__tests__/distinct-artifacts.test.d.ts +0 -2
  217. package/dist/__tests__/distinct-artifacts.test.d.ts.map +0 -1
  218. package/dist/__tests__/distinct-artifacts.test.js +0 -56
  219. package/dist/__tests__/distinct-artifacts.test.js.map +0 -1
  220. package/dist/__tests__/event-wiring.test.d.ts +0 -15
  221. package/dist/__tests__/event-wiring.test.d.ts.map +0 -1
  222. package/dist/__tests__/event-wiring.test.js +0 -100
  223. package/dist/__tests__/event-wiring.test.js.map +0 -1
  224. package/dist/__tests__/index.test.d.ts +0 -2
  225. package/dist/__tests__/index.test.d.ts.map +0 -1
  226. package/dist/__tests__/index.test.js +0 -7
  227. package/dist/__tests__/index.test.js.map +0 -1
  228. package/dist/__tests__/narration-template.test.d.ts +0 -2
  229. package/dist/__tests__/narration-template.test.d.ts.map +0 -1
  230. package/dist/__tests__/narration-template.test.js +0 -76
  231. package/dist/__tests__/narration-template.test.js.map +0 -1
  232. package/dist/__tests__/notification-model.test.d.ts +0 -2
  233. package/dist/__tests__/notification-model.test.d.ts.map +0 -1
  234. package/dist/__tests__/notification-model.test.js +0 -68
  235. package/dist/__tests__/notification-model.test.js.map +0 -1
  236. package/dist/__tests__/realtime-agent-picker-models.test.d.ts +0 -2
  237. package/dist/__tests__/realtime-agent-picker-models.test.d.ts.map +0 -1
  238. package/dist/__tests__/realtime-agent-picker-models.test.js +0 -49
  239. package/dist/__tests__/realtime-agent-picker-models.test.js.map +0 -1
  240. package/dist/__tests__/realtime-audio-visuals.test.d.ts +0 -2
  241. package/dist/__tests__/realtime-audio-visuals.test.d.ts.map +0 -1
  242. package/dist/__tests__/realtime-audio-visuals.test.js +0 -123
  243. package/dist/__tests__/realtime-audio-visuals.test.js.map +0 -1
  244. package/dist/__tests__/realtime-delegation-card-cancel.test.d.ts +0 -2
  245. package/dist/__tests__/realtime-delegation-card-cancel.test.d.ts.map +0 -1
  246. package/dist/__tests__/realtime-delegation-card-cancel.test.js +0 -48
  247. package/dist/__tests__/realtime-delegation-card-cancel.test.js.map +0 -1
  248. package/dist/__tests__/realtime-disclosure.test.d.ts +0 -2
  249. package/dist/__tests__/realtime-disclosure.test.d.ts.map +0 -1
  250. package/dist/__tests__/realtime-disclosure.test.js +0 -164
  251. package/dist/__tests__/realtime-disclosure.test.js.map +0 -1
  252. package/dist/__tests__/realtime-pairing.test.d.ts +0 -2
  253. package/dist/__tests__/realtime-pairing.test.d.ts.map +0 -1
  254. package/dist/__tests__/realtime-pairing.test.js +0 -207
  255. package/dist/__tests__/realtime-pairing.test.js.map +0 -1
  256. package/dist/__tests__/realtime-review-lifecycle.test.d.ts +0 -2
  257. package/dist/__tests__/realtime-review-lifecycle.test.d.ts.map +0 -1
  258. package/dist/__tests__/realtime-review-lifecycle.test.js +0 -154
  259. package/dist/__tests__/realtime-review-lifecycle.test.js.map +0 -1
  260. package/dist/__tests__/realtime-session-cancel-usage.test.d.ts +0 -2
  261. package/dist/__tests__/realtime-session-cancel-usage.test.d.ts.map +0 -1
  262. package/dist/__tests__/realtime-session-cancel-usage.test.js +0 -230
  263. package/dist/__tests__/realtime-session-cancel-usage.test.js.map +0 -1
  264. package/dist/__tests__/realtime-session-channels.test.d.ts +0 -2
  265. package/dist/__tests__/realtime-session-channels.test.d.ts.map +0 -1
  266. package/dist/__tests__/realtime-session-channels.test.js +0 -252
  267. package/dist/__tests__/realtime-session-channels.test.js.map +0 -1
  268. package/dist/__tests__/realtime-session-client-tools.test.d.ts +0 -2
  269. package/dist/__tests__/realtime-session-client-tools.test.d.ts.map +0 -1
  270. package/dist/__tests__/realtime-session-client-tools.test.js +0 -103
  271. package/dist/__tests__/realtime-session-client-tools.test.js.map +0 -1
  272. package/dist/__tests__/realtime-session-minimized.test.d.ts +0 -2
  273. package/dist/__tests__/realtime-session-minimized.test.d.ts.map +0 -1
  274. package/dist/__tests__/realtime-session-minimized.test.js +0 -32
  275. package/dist/__tests__/realtime-session-minimized.test.js.map +0 -1
  276. package/dist/__tests__/realtime-session-mint.test.d.ts +0 -2
  277. package/dist/__tests__/realtime-session-mint.test.d.ts.map +0 -1
  278. package/dist/__tests__/realtime-session-mint.test.js +0 -69
  279. package/dist/__tests__/realtime-session-mint.test.js.map +0 -1
  280. package/dist/__tests__/realtime-session-policy.test.d.ts +0 -2
  281. package/dist/__tests__/realtime-session-policy.test.d.ts.map +0 -1
  282. package/dist/__tests__/realtime-session-policy.test.js +0 -303
  283. package/dist/__tests__/realtime-session-policy.test.js.map +0 -1
  284. package/dist/__tests__/realtime-session-review.service.test.d.ts +0 -2
  285. package/dist/__tests__/realtime-session-review.service.test.d.ts.map +0 -1
  286. package/dist/__tests__/realtime-session-review.service.test.js +0 -743
  287. package/dist/__tests__/realtime-session-review.service.test.js.map +0 -1
  288. package/dist/__tests__/realtime-session-state.test.d.ts +0 -2
  289. package/dist/__tests__/realtime-session-state.test.d.ts.map +0 -1
  290. package/dist/__tests__/realtime-session-state.test.js +0 -83
  291. package/dist/__tests__/realtime-session-state.test.js.map +0 -1
  292. package/dist/__tests__/realtime-session-timeline-card.test.d.ts +0 -2
  293. package/dist/__tests__/realtime-session-timeline-card.test.d.ts.map +0 -1
  294. package/dist/__tests__/realtime-session-timeline-card.test.js +0 -106
  295. package/dist/__tests__/realtime-session-timeline-card.test.js.map +0 -1
  296. package/dist/__tests__/realtime-session-timeline.test.d.ts +0 -2
  297. package/dist/__tests__/realtime-session-timeline.test.d.ts.map +0 -1
  298. package/dist/__tests__/realtime-session-timeline.test.js +0 -142
  299. package/dist/__tests__/realtime-session-timeline.test.js.map +0 -1
  300. package/dist/__tests__/realtime-sessions-adapter.test.d.ts +0 -19
  301. package/dist/__tests__/realtime-sessions-adapter.test.d.ts.map +0 -1
  302. package/dist/__tests__/realtime-sessions-adapter.test.js +0 -188
  303. package/dist/__tests__/realtime-sessions-adapter.test.js.map +0 -1
  304. package/dist/__tests__/realtime-surface-panel-prefs.test.d.ts +0 -2
  305. package/dist/__tests__/realtime-surface-panel-prefs.test.d.ts.map +0 -1
  306. package/dist/__tests__/realtime-surface-panel-prefs.test.js +0 -100
  307. package/dist/__tests__/realtime-surface-panel-prefs.test.js.map +0 -1
  308. package/dist/__tests__/realtime-surface-tabs-model.test.d.ts +0 -2
  309. package/dist/__tests__/realtime-surface-tabs-model.test.d.ts.map +0 -1
  310. package/dist/__tests__/realtime-surface-tabs-model.test.js +0 -193
  311. package/dist/__tests__/realtime-surface-tabs-model.test.js.map +0 -1
  312. package/dist/__tests__/remote-browser-audio-player.test.d.ts +0 -2
  313. package/dist/__tests__/remote-browser-audio-player.test.d.ts.map +0 -1
  314. package/dist/__tests__/remote-browser-audio-player.test.js +0 -137
  315. package/dist/__tests__/remote-browser-audio-player.test.js.map +0 -1
  316. package/dist/__tests__/remote-browser-channel.test.d.ts +0 -2
  317. package/dist/__tests__/remote-browser-channel.test.d.ts.map +0 -1
  318. package/dist/__tests__/remote-browser-channel.test.js +0 -585
  319. package/dist/__tests__/remote-browser-channel.test.js.map +0 -1
  320. package/dist/__tests__/search-service.test.d.ts +0 -2
  321. package/dist/__tests__/search-service.test.d.ts.map +0 -1
  322. package/dist/__tests__/search-service.test.js +0 -114
  323. package/dist/__tests__/search-service.test.js.map +0 -1
  324. package/dist/__tests__/slot-defaults.test.d.ts +0 -24
  325. package/dist/__tests__/slot-defaults.test.d.ts.map +0 -1
  326. package/dist/__tests__/slot-defaults.test.js +0 -63
  327. package/dist/__tests__/slot-defaults.test.js.map +0 -1
  328. package/dist/__tests__/toast-service.test.d.ts +0 -2
  329. package/dist/__tests__/toast-service.test.d.ts.map +0 -1
  330. package/dist/__tests__/toast-service.test.js +0 -143
  331. package/dist/__tests__/toast-service.test.js.map +0 -1
  332. package/dist/__tests__/user-authorization.test.d.ts +0 -2
  333. package/dist/__tests__/user-authorization.test.d.ts.map +0 -1
  334. package/dist/__tests__/user-authorization.test.js +0 -97
  335. package/dist/__tests__/user-authorization.test.js.map +0 -1
  336. package/dist/__tests__/voice-session-narration.test.d.ts +0 -2
  337. package/dist/__tests__/voice-session-narration.test.d.ts.map +0 -1
  338. package/dist/__tests__/voice-session-narration.test.js +0 -609
  339. package/dist/__tests__/voice-session-narration.test.js.map +0 -1
  340. package/dist/__tests__/whiteboard-artifact-viewer.test.d.ts +0 -2
  341. package/dist/__tests__/whiteboard-artifact-viewer.test.d.ts.map +0 -1
  342. package/dist/__tests__/whiteboard-artifact-viewer.test.js +0 -101
  343. package/dist/__tests__/whiteboard-artifact-viewer.test.js.map +0 -1
  344. package/dist/__tests__/whiteboard-channel.test.d.ts +0 -2
  345. package/dist/__tests__/whiteboard-channel.test.d.ts.map +0 -1
  346. package/dist/__tests__/whiteboard-channel.test.js +0 -260
  347. package/dist/__tests__/whiteboard-channel.test.js.map +0 -1
  348. package/dist/__tests__/whiteboard-restore-state.test.d.ts +0 -2
  349. package/dist/__tests__/whiteboard-restore-state.test.d.ts.map +0 -1
  350. package/dist/__tests__/whiteboard-restore-state.test.js +0 -108
  351. package/dist/__tests__/whiteboard-restore-state.test.js.map +0 -1
@@ -64,7 +64,7 @@ export class RealtimeSessionsAdapter {
64
64
  //
65
65
  // We ALSO synthesize session-channel:open events for each initial
66
66
  // channel listed in channelNames. Reason: RealtimeSessionService's
67
- // StartVoiceSession calls startChannels() (which emits to
67
+ // StartRealtimeSession calls startChannels() (which emits to
68
68
  // ActiveChannels$) BEFORE mintSession() resolves and sets
69
69
  // agentSessionId. By the time our ActiveChannels$ diff handler runs for
70
70
  // that first emission, CurrentAgentSessionId is still null and the
@@ -1 +1 @@
1
- {"version":3,"file":"realtime-sessions-adapter.js","sourceRoot":"","sources":["../../../src/lib/services/realtime-sessions-adapter.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @fileoverview Angular host's bridge from {@link RealtimeSessionService} to\n * `@memberjunction/conversations-runtime`'s framework-agnostic\n * `SessionsObserver`.\n *\n * **Role.** Implements `ISessionsAdapter` (defined in conversations-runtime) by\n * subscribing to the voice service's three lifecycle observables —\n * `SessionStarted$`, `ActiveChannels$` (diffed for channel open/close),\n * `SessionEnded$` — and emitting a single discriminated-union stream the\n * runtime re-broadcasts as `ConversationsRuntime.Instance.Sessions.SessionLifecycle$`.\n *\n * **Why not subscribe to `RealtimeSessionService` from the runtime directly?**\n * The runtime is pure TypeScript and must remain Angular-free so non-Angular\n * consumers (React, Vue, Node workers) can use it. This adapter is the\n * Angular-specific code that bridges Angular DI's voice service into the\n * framework-agnostic adapter contract.\n *\n * **Multi-source-ready.** Today this is a 1:1 bridge for `RealtimeSessionService`.\n * A future Angular host that also has a video-session service would either\n * extend this adapter with `merge(voice.SessionLifecycle$, video.SessionLifecycle$)`\n * or register a sibling adapter — the runtime contract doesn't change.\n *\n * @module @memberjunction/ng-conversations\n */\n\nimport { Observable, Subject, Subscription, pairwise, startWith } from 'rxjs';\nimport type {\n ISessionsAdapter,\n SessionLifecycleEvent,\n} from '@memberjunction/conversations-runtime';\nimport { RealtimeSessionService } from './realtime-session.service';\n\n/**\n * Bridges `RealtimeSessionService`'s native lifecycle observables to the generic\n * `SessionLifecycleEvent` shape the runtime expects.\n *\n * **Lifecycle.** Construct once at host bootstrap (see\n * `ConversationsRuntimeBootstrap`), pass to\n * `ConversationsRuntime.Instance.UseSessionsAdapter(...)`, and the runtime owns\n * subscription/teardown via `SessionsObserver`. The adapter itself holds the\n * subscriptions to the voice service and exposes them merged into one stream.\n *\n * Call {@link Dispose} when tearing down the host (typically only in tests —\n * production hosts run for the lifetime of the page).\n */\nexport class RealtimeSessionsAdapter implements ISessionsAdapter {\n public readonly SessionLifecycle$: Observable<SessionLifecycleEvent>;\n\n private readonly _events$ = new Subject<SessionLifecycleEvent>();\n private readonly _subs: Subscription[] = [];\n\n constructor(private readonly voice: RealtimeSessionService) {\n this.SessionLifecycle$ = this._events$.asObservable();\n this.wireUp();\n }\n\n /**\n * Tear down all subscriptions to the voice service and complete the\n * lifecycle stream. Safe to call multiple times.\n */\n public Dispose(): void {\n for (const sub of this._subs) {\n sub.unsubscribe();\n }\n this._subs.length = 0;\n this._events$.complete();\n }\n\n private wireUp(): void {\n // session-started — bridge RealtimeSessionService.SessionStarted$ verbatim.\n // That service emits ONLY after both agentSessionId is set AND the\n // realtime client is connected, so we don't need any correlation here.\n //\n // We ALSO synthesize session-channel:open events for each initial\n // channel listed in channelNames. Reason: RealtimeSessionService's\n // StartVoiceSession calls startChannels() (which emits to\n // ActiveChannels$) BEFORE mintSession() resolves and sets\n // agentSessionId. By the time our ActiveChannels$ diff handler runs for\n // that first emission, CurrentAgentSessionId is still null and the\n // event is skipped (correctly — we can't attribute it to a session\n // yet). The result without this synthesis would be asymmetric — initial\n // channels never get an open event, even though they get a close event\n // during teardown. Emitting opens from SessionStarted$ closes the gap.\n this._subs.push(\n this.voice.SessionStarted$.subscribe((started) => {\n this._events$.next({\n kind: 'session-started',\n sessionId: started.sessionId,\n channelKinds: started.channelNames,\n });\n for (const channelName of started.channelNames) {\n this._events$.next({\n kind: 'session-channel',\n sessionId: started.sessionId,\n channelKind: channelName,\n state: 'open',\n });\n }\n })\n );\n\n // session-channel (mid-session additions + removals) — diff\n // ActiveChannels$ to surface DYNAMIC channel changes during a live\n // session. The service emits the FULL channel array each time (or []\n // on teardown); we compare consecutive emissions to figure out which\n // channels were added vs removed.\n //\n // INITIAL channel-open events at session start are intentionally NOT\n // produced by this diff path — they're synthesized from SessionStarted$\n // above (see the timing rationale there). Channel CLOSES at teardown\n // DO flow through this path because agentSessionId is still set when\n // disposeChannels() emits [] to ActiveChannels$ (teardown nulls it\n // afterwards).\n //\n // `startWith([])` seeds pairwise so it can emit on the first real value\n // — needed so the initial-emission case still goes through the diff\n // logic (where the null-sessionId guard catches it).\n this._subs.push(\n this.voice.ActiveChannels$\n .pipe(startWith([] as ReturnType<() => readonly { ChannelName: string }[]>), pairwise())\n .subscribe(([prev, curr]) => {\n const sessionId = this.voice.CurrentAgentSessionId;\n // No active session id means we can't meaningfully attribute the\n // channel event. Two cases land here:\n // 1. Initial emission during startChannels() — sessionId not set yet;\n // initial opens are handled by SessionStarted$ above.\n // 2. The brief post-teardown window after agentSessionId is nulled.\n if (!sessionId) {\n return;\n }\n const prevNames = new Set(prev.map(c => c.ChannelName));\n const currNames = new Set(curr.map(c => c.ChannelName));\n\n for (const name of currNames) {\n if (!prevNames.has(name)) {\n this._events$.next({\n kind: 'session-channel',\n sessionId,\n channelKind: name,\n state: 'open',\n });\n }\n }\n for (const name of prevNames) {\n if (!currNames.has(name)) {\n this._events$.next({\n kind: 'session-channel',\n sessionId,\n channelKind: name,\n state: 'closed',\n });\n }\n }\n })\n );\n\n // session-ended — bridge RealtimeSessionService.SessionEnded$ verbatim\n // (the service narrows the reason union to what's actually\n // distinguishable client-side; the runtime widens to include 'unknown'\n // for adapters that can't tell, which we don't need here).\n this._subs.push(\n this.voice.SessionEnded$.subscribe((ended) => {\n this._events$.next({\n kind: 'session-ended',\n sessionId: ended.sessionId,\n reason: ended.reason,\n });\n })\n );\n }\n}\n"]}
1
+ {"version":3,"file":"realtime-sessions-adapter.js","sourceRoot":"","sources":["../../../src/lib/services/realtime-sessions-adapter.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @fileoverview Angular host's bridge from {@link RealtimeSessionService} to\n * `@memberjunction/conversations-runtime`'s framework-agnostic\n * `SessionsObserver`.\n *\n * **Role.** Implements `ISessionsAdapter` (defined in conversations-runtime) by\n * subscribing to the voice service's three lifecycle observables —\n * `SessionStarted$`, `ActiveChannels$` (diffed for channel open/close),\n * `SessionEnded$` — and emitting a single discriminated-union stream the\n * runtime re-broadcasts as `ConversationsRuntime.Instance.Sessions.SessionLifecycle$`.\n *\n * **Why not subscribe to `RealtimeSessionService` from the runtime directly?**\n * The runtime is pure TypeScript and must remain Angular-free so non-Angular\n * consumers (React, Vue, Node workers) can use it. This adapter is the\n * Angular-specific code that bridges Angular DI's voice service into the\n * framework-agnostic adapter contract.\n *\n * **Multi-source-ready.** Today this is a 1:1 bridge for `RealtimeSessionService`.\n * A future Angular host that also has a video-session service would either\n * extend this adapter with `merge(voice.SessionLifecycle$, video.SessionLifecycle$)`\n * or register a sibling adapter — the runtime contract doesn't change.\n *\n * @module @memberjunction/ng-conversations\n */\n\nimport { Observable, Subject, Subscription, pairwise, startWith } from 'rxjs';\nimport type {\n ISessionsAdapter,\n SessionLifecycleEvent,\n} from '@memberjunction/conversations-runtime';\nimport { RealtimeSessionService } from './realtime-session.service';\n\n/**\n * Bridges `RealtimeSessionService`'s native lifecycle observables to the generic\n * `SessionLifecycleEvent` shape the runtime expects.\n *\n * **Lifecycle.** Construct once at host bootstrap (see\n * `ConversationsRuntimeBootstrap`), pass to\n * `ConversationsRuntime.Instance.UseSessionsAdapter(...)`, and the runtime owns\n * subscription/teardown via `SessionsObserver`. The adapter itself holds the\n * subscriptions to the voice service and exposes them merged into one stream.\n *\n * Call {@link Dispose} when tearing down the host (typically only in tests —\n * production hosts run for the lifetime of the page).\n */\nexport class RealtimeSessionsAdapter implements ISessionsAdapter {\n public readonly SessionLifecycle$: Observable<SessionLifecycleEvent>;\n\n private readonly _events$ = new Subject<SessionLifecycleEvent>();\n private readonly _subs: Subscription[] = [];\n\n constructor(private readonly voice: RealtimeSessionService) {\n this.SessionLifecycle$ = this._events$.asObservable();\n this.wireUp();\n }\n\n /**\n * Tear down all subscriptions to the voice service and complete the\n * lifecycle stream. Safe to call multiple times.\n */\n public Dispose(): void {\n for (const sub of this._subs) {\n sub.unsubscribe();\n }\n this._subs.length = 0;\n this._events$.complete();\n }\n\n private wireUp(): void {\n // session-started — bridge RealtimeSessionService.SessionStarted$ verbatim.\n // That service emits ONLY after both agentSessionId is set AND the\n // realtime client is connected, so we don't need any correlation here.\n //\n // We ALSO synthesize session-channel:open events for each initial\n // channel listed in channelNames. Reason: RealtimeSessionService's\n // StartRealtimeSession calls startChannels() (which emits to\n // ActiveChannels$) BEFORE mintSession() resolves and sets\n // agentSessionId. By the time our ActiveChannels$ diff handler runs for\n // that first emission, CurrentAgentSessionId is still null and the\n // event is skipped (correctly — we can't attribute it to a session\n // yet). The result without this synthesis would be asymmetric — initial\n // channels never get an open event, even though they get a close event\n // during teardown. Emitting opens from SessionStarted$ closes the gap.\n this._subs.push(\n this.voice.SessionStarted$.subscribe((started) => {\n this._events$.next({\n kind: 'session-started',\n sessionId: started.sessionId,\n channelKinds: started.channelNames,\n });\n for (const channelName of started.channelNames) {\n this._events$.next({\n kind: 'session-channel',\n sessionId: started.sessionId,\n channelKind: channelName,\n state: 'open',\n });\n }\n })\n );\n\n // session-channel (mid-session additions + removals) — diff\n // ActiveChannels$ to surface DYNAMIC channel changes during a live\n // session. The service emits the FULL channel array each time (or []\n // on teardown); we compare consecutive emissions to figure out which\n // channels were added vs removed.\n //\n // INITIAL channel-open events at session start are intentionally NOT\n // produced by this diff path — they're synthesized from SessionStarted$\n // above (see the timing rationale there). Channel CLOSES at teardown\n // DO flow through this path because agentSessionId is still set when\n // disposeChannels() emits [] to ActiveChannels$ (teardown nulls it\n // afterwards).\n //\n // `startWith([])` seeds pairwise so it can emit on the first real value\n // — needed so the initial-emission case still goes through the diff\n // logic (where the null-sessionId guard catches it).\n this._subs.push(\n this.voice.ActiveChannels$\n .pipe(startWith([] as ReturnType<() => readonly { ChannelName: string }[]>), pairwise())\n .subscribe(([prev, curr]) => {\n const sessionId = this.voice.CurrentAgentSessionId;\n // No active session id means we can't meaningfully attribute the\n // channel event. Two cases land here:\n // 1. Initial emission during startChannels() — sessionId not set yet;\n // initial opens are handled by SessionStarted$ above.\n // 2. The brief post-teardown window after agentSessionId is nulled.\n if (!sessionId) {\n return;\n }\n const prevNames = new Set(prev.map(c => c.ChannelName));\n const currNames = new Set(curr.map(c => c.ChannelName));\n\n for (const name of currNames) {\n if (!prevNames.has(name)) {\n this._events$.next({\n kind: 'session-channel',\n sessionId,\n channelKind: name,\n state: 'open',\n });\n }\n }\n for (const name of prevNames) {\n if (!currNames.has(name)) {\n this._events$.next({\n kind: 'session-channel',\n sessionId,\n channelKind: name,\n state: 'closed',\n });\n }\n }\n })\n );\n\n // session-ended — bridge RealtimeSessionService.SessionEnded$ verbatim\n // (the service narrows the reason union to what's actually\n // distinguishable client-side; the runtime widens to include 'unknown'\n // for adapters that can't tell, which we don't need here).\n this._subs.push(\n this.voice.SessionEnded$.subscribe((ended) => {\n this._events$.next({\n kind: 'session-ended',\n sessionId: ended.sessionId,\n reason: ended.reason,\n });\n })\n );\n }\n}\n"]}
@@ -2,6 +2,11 @@ import { EventEmitter } from '@angular/core';
2
2
  import { ActionableCommand, AutomaticCommand } from '@memberjunction/ai-core-plus';
3
3
  import { DataCacheService } from './data-cache.service';
4
4
  import * as i0 from "@angular/core";
5
+ export interface ActionableCommandRequest {
6
+ command: ActionableCommand;
7
+ conversationId?: string | null;
8
+ conversationDetailId?: string | null;
9
+ }
5
10
  /**
6
11
  * Service for handling UI commands from agents.
7
12
  *
@@ -14,7 +19,7 @@ export declare class UICommandHandlerService {
14
19
  * Event emitted when an actionable command requires host-app handling.
15
20
  * Currently only open:resource commands are emitted — open:url is handled directly.
16
21
  */
17
- actionableCommandRequested: EventEmitter<ActionableCommand>;
22
+ actionableCommandRequested: EventEmitter<ActionableCommandRequest>;
18
23
  /**
19
24
  * Event emitted when an automatic command should be executed
20
25
  * Host application should subscribe to this and handle the command appropriately
@@ -25,7 +30,7 @@ export declare class UICommandHandlerService {
25
30
  * Execute an actionable command (triggered by user clicking a button).
26
31
  * Generic commands like open:url are handled directly; others are emitted to the host.
27
32
  */
28
- executeActionableCommand(command: ActionableCommand): Promise<void>;
33
+ executeActionableCommand(command: ActionableCommand, origin?: Omit<ActionableCommandRequest, 'command'>): Promise<void>;
29
34
  /**
30
35
  * Handle open:url commands directly by opening the URL in a browser tab.
31
36
  * Data URIs are converted to Blob URLs because Chrome blocks window.open with data: URIs.
@@ -1 +1 @@
1
- {"version":3,"file":"ui-command-handler.service.d.ts","sourceRoot":"","sources":["../../../src/lib/services/ui-command-handler.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,YAAY,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAsC,MAAM,8BAA8B,CAAC;AACvH,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;;AAExD;;;;;GAKG;AACH,qBAGa,uBAAuB;IAchC,OAAO,CAAC,gBAAgB;IAb1B;;;OAGG;IACI,0BAA0B,kCAAyC;IAE1E;;;OAGG;IACI,yBAAyB,iCAAwC;gBAG9D,gBAAgB,EAAE,gBAAgB;IAG5C;;;OAGG;IACU,wBAAwB,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAUhF;;;OAGG;IACH,OAAO,CAAC,aAAa;IAYrB;;;OAGG;IACH,OAAO,CAAC,WAAW;IAgBnB;;;OAGG;IACU,uBAAuB,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAa9E;;OAEG;IACU,wBAAwB,CAAC,QAAQ,EAAE,gBAAgB,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAclF;;;OAGG;YACW,iBAAiB;yCAzGpB,uBAAuB;6CAAvB,uBAAuB;CA0HnC"}
1
+ {"version":3,"file":"ui-command-handler.service.d.ts","sourceRoot":"","sources":["../../../src/lib/services/ui-command-handler.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,YAAY,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAsC,MAAM,8BAA8B,CAAC;AACvH,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;;AAExD,MAAM,WAAW,wBAAwB;IACvC,OAAO,EAAE,iBAAiB,CAAC;IAC3B,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,oBAAoB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACtC;AAED;;;;;GAKG;AACH,qBAGa,uBAAuB;IAchC,OAAO,CAAC,gBAAgB;IAb1B;;;OAGG;IACI,0BAA0B,yCAAgD;IAEjF;;;OAGG;IACI,yBAAyB,iCAAwC;gBAG9D,gBAAgB,EAAE,gBAAgB;IAG5C;;;OAGG;IACU,wBAAwB,CAAC,OAAO,EAAE,iBAAiB,EAAE,MAAM,CAAC,EAAE,IAAI,CAAC,wBAAwB,EAAE,SAAS,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAcpI;;;OAGG;IACH,OAAO,CAAC,aAAa;IAYrB;;;OAGG;IACH,OAAO,CAAC,WAAW;IAgBnB;;;OAGG;IACU,uBAAuB,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAa9E;;OAEG;IACU,wBAAwB,CAAC,QAAQ,EAAE,gBAAgB,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAclF;;;OAGG;YACW,iBAAiB;yCA7GpB,uBAAuB;6CAAvB,uBAAuB;CA8HnC"}
@@ -26,14 +26,18 @@ export class UICommandHandlerService {
26
26
  * Execute an actionable command (triggered by user clicking a button).
27
27
  * Generic commands like open:url are handled directly; others are emitted to the host.
28
28
  */
29
- async executeActionableCommand(command) {
29
+ async executeActionableCommand(command, origin) {
30
30
  if (command.type === 'open:url') {
31
31
  this.handleOpenUrl(command);
32
32
  }
33
33
  else {
34
34
  // open:resource requires app-specific navigation — emit for host to handle
35
35
  console.log('📤 Emitting actionable command for host app:', command);
36
- this.actionableCommandRequested.emit(command);
36
+ this.actionableCommandRequested.emit({
37
+ command,
38
+ conversationId: origin?.conversationId ?? null,
39
+ conversationDetailId: origin?.conversationDetailId ?? null
40
+ });
37
41
  }
38
42
  }
39
43
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"ui-command-handler.service.js","sourceRoot":"","sources":["../../../src/lib/services/ui-command-handler.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { Injectable, EventEmitter } from '@angular/core';\nimport { ActionableCommand, AutomaticCommand, RefreshDataCommand, OpenURLCommand } from '@memberjunction/ai-core-plus';\nimport { DataCacheService } from './data-cache.service';\n\n/**\n * Service for handling UI commands from agents.\n *\n * Generic commands (open:url) are handled directly by this service.\n * App-specific commands (open:resource) are emitted for the host application to handle.\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class UICommandHandlerService {\n /**\n * Event emitted when an actionable command requires host-app handling.\n * Currently only open:resource commands are emitted — open:url is handled directly.\n */\n public actionableCommandRequested = new EventEmitter<ActionableCommand>();\n\n /**\n * Event emitted when an automatic command should be executed\n * Host application should subscribe to this and handle the command appropriately\n */\n public automaticCommandRequested = new EventEmitter<AutomaticCommand>();\n\n constructor(\n private dataCacheService: DataCacheService\n ) {}\n\n /**\n * Execute an actionable command (triggered by user clicking a button).\n * Generic commands like open:url are handled directly; others are emitted to the host.\n */\n public async executeActionableCommand(command: ActionableCommand): Promise<void> {\n if (command.type === 'open:url') {\n this.handleOpenUrl(command);\n } else {\n // open:resource requires app-specific navigation — emit for host to handle\n console.log('📤 Emitting actionable command for host app:', command);\n this.actionableCommandRequested.emit(command);\n }\n }\n\n /**\n * Handle open:url commands directly by opening the URL in a browser tab.\n * Data URIs are converted to Blob URLs because Chrome blocks window.open with data: URIs.\n */\n private handleOpenUrl(command: OpenURLCommand): void {\n const url = command.url;\n const newTab = command.newTab !== false;\n\n if (url.startsWith('data:')) {\n this.openDataUri(url);\n } else {\n const target = newTab ? '_blank' : '_self';\n window.open(url, target, target === '_blank' ? 'noopener,noreferrer' : undefined);\n }\n }\n\n /**\n * Open a data URI by converting it to a Blob URL.\n * Chrome blocks window.open('data:...') for security, so we create a Blob URL instead.\n */\n private openDataUri(dataUri: string): void {\n const [header, base64Data] = dataUri.split(',');\n const mimeMatch = header.match(/data:([^;]+)/);\n const mimeType = mimeMatch ? mimeMatch[1] : 'application/octet-stream';\n\n const byteString = atob(base64Data);\n const byteArray = new Uint8Array(byteString.length);\n for (let i = 0; i < byteString.length; i++) {\n byteArray[i] = byteString.charCodeAt(i);\n }\n\n const blob = new Blob([byteArray], { type: mimeType });\n const blobUrl = URL.createObjectURL(blob);\n window.open(blobUrl, '_blank');\n }\n\n /**\n * Execute an automatic command (runs immediately without user interaction)\n * Special handling: refresh:data commands execute locally, others emit to host\n */\n public async executeAutomaticCommand(command: AutomaticCommand): Promise<void> {\n console.log('Executing automatic command:', command);\n\n if (command.type === 'refresh:data') {\n // Handle data refresh locally as it's a generic operation\n await this.handleRefreshData(command);\n } else {\n // Emit other automatic commands (like notifications) for host to handle\n console.log('📤 Emitting automatic command for host app:', command);\n this.automaticCommandRequested.emit(command);\n }\n }\n\n /**\n * Execute all automatic commands from an agent result\n */\n public async executeAutomaticCommands(commands: AutomaticCommand[]): Promise<void> {\n if (!commands || commands.length === 0) {\n return;\n }\n\n for (const command of commands) {\n try {\n await this.executeAutomaticCommand(command);\n } catch (error) {\n console.error('Error executing automatic command:', command, error);\n }\n }\n }\n\n /**\n * Handle refreshing data (entity data or caches)\n * This is handled locally as it's a generic operation that doesn't require host app knowledge\n */\n private async handleRefreshData(command: RefreshDataCommand): Promise<void> {\n const { scope, entityNames, cacheName } = command;\n\n if (scope === 'entity' && entityNames && entityNames.length > 0) {\n // Refresh specific entity data\n for (const entityName of entityNames) {\n await this.dataCacheService.refreshEntity(entityName);\n }\n console.log('Refreshed entity data:', entityNames);\n } else if (scope === 'cache' && cacheName) {\n // Refresh a specific cache\n await this.dataCacheService.refreshCache(cacheName);\n console.log('Refreshed cache:', cacheName);\n } else {\n console.warn('Invalid refresh:data command parameters:', command);\n }\n }\n}\n"]}
1
+ {"version":3,"file":"ui-command-handler.service.js","sourceRoot":"","sources":["../../../src/lib/services/ui-command-handler.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { Injectable, EventEmitter } from '@angular/core';\nimport { ActionableCommand, AutomaticCommand, RefreshDataCommand, OpenURLCommand } from '@memberjunction/ai-core-plus';\nimport { DataCacheService } from './data-cache.service';\n\nexport interface ActionableCommandRequest {\n command: ActionableCommand;\n conversationId?: string | null;\n conversationDetailId?: string | null;\n}\n\n/**\n * Service for handling UI commands from agents.\n *\n * Generic commands (open:url) are handled directly by this service.\n * App-specific commands (open:resource) are emitted for the host application to handle.\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class UICommandHandlerService {\n /**\n * Event emitted when an actionable command requires host-app handling.\n * Currently only open:resource commands are emitted — open:url is handled directly.\n */\n public actionableCommandRequested = new EventEmitter<ActionableCommandRequest>();\n\n /**\n * Event emitted when an automatic command should be executed\n * Host application should subscribe to this and handle the command appropriately\n */\n public automaticCommandRequested = new EventEmitter<AutomaticCommand>();\n\n constructor(\n private dataCacheService: DataCacheService\n ) {}\n\n /**\n * Execute an actionable command (triggered by user clicking a button).\n * Generic commands like open:url are handled directly; others are emitted to the host.\n */\n public async executeActionableCommand(command: ActionableCommand, origin?: Omit<ActionableCommandRequest, 'command'>): Promise<void> {\n if (command.type === 'open:url') {\n this.handleOpenUrl(command);\n } else {\n // open:resource requires app-specific navigation — emit for host to handle\n console.log('📤 Emitting actionable command for host app:', command);\n this.actionableCommandRequested.emit({\n command,\n conversationId: origin?.conversationId ?? null,\n conversationDetailId: origin?.conversationDetailId ?? null\n });\n }\n }\n\n /**\n * Handle open:url commands directly by opening the URL in a browser tab.\n * Data URIs are converted to Blob URLs because Chrome blocks window.open with data: URIs.\n */\n private handleOpenUrl(command: OpenURLCommand): void {\n const url = command.url;\n const newTab = command.newTab !== false;\n\n if (url.startsWith('data:')) {\n this.openDataUri(url);\n } else {\n const target = newTab ? '_blank' : '_self';\n window.open(url, target, target === '_blank' ? 'noopener,noreferrer' : undefined);\n }\n }\n\n /**\n * Open a data URI by converting it to a Blob URL.\n * Chrome blocks window.open('data:...') for security, so we create a Blob URL instead.\n */\n private openDataUri(dataUri: string): void {\n const [header, base64Data] = dataUri.split(',');\n const mimeMatch = header.match(/data:([^;]+)/);\n const mimeType = mimeMatch ? mimeMatch[1] : 'application/octet-stream';\n\n const byteString = atob(base64Data);\n const byteArray = new Uint8Array(byteString.length);\n for (let i = 0; i < byteString.length; i++) {\n byteArray[i] = byteString.charCodeAt(i);\n }\n\n const blob = new Blob([byteArray], { type: mimeType });\n const blobUrl = URL.createObjectURL(blob);\n window.open(blobUrl, '_blank');\n }\n\n /**\n * Execute an automatic command (runs immediately without user interaction)\n * Special handling: refresh:data commands execute locally, others emit to host\n */\n public async executeAutomaticCommand(command: AutomaticCommand): Promise<void> {\n console.log('Executing automatic command:', command);\n\n if (command.type === 'refresh:data') {\n // Handle data refresh locally as it's a generic operation\n await this.handleRefreshData(command);\n } else {\n // Emit other automatic commands (like notifications) for host to handle\n console.log('📤 Emitting automatic command for host app:', command);\n this.automaticCommandRequested.emit(command);\n }\n }\n\n /**\n * Execute all automatic commands from an agent result\n */\n public async executeAutomaticCommands(commands: AutomaticCommand[]): Promise<void> {\n if (!commands || commands.length === 0) {\n return;\n }\n\n for (const command of commands) {\n try {\n await this.executeAutomaticCommand(command);\n } catch (error) {\n console.error('Error executing automatic command:', command, error);\n }\n }\n }\n\n /**\n * Handle refreshing data (entity data or caches)\n * This is handled locally as it's a generic operation that doesn't require host app knowledge\n */\n private async handleRefreshData(command: RefreshDataCommand): Promise<void> {\n const { scope, entityNames, cacheName } = command;\n\n if (scope === 'entity' && entityNames && entityNames.length > 0) {\n // Refresh specific entity data\n for (const entityName of entityNames) {\n await this.dataCacheService.refreshEntity(entityName);\n }\n console.log('Refreshed entity data:', entityNames);\n } else if (scope === 'cache' && cacheName) {\n // Refresh a specific cache\n await this.dataCacheService.refreshCache(cacheName);\n console.log('Refreshed cache:', cacheName);\n } else {\n console.warn('Invalid refresh:data command parameters:', command);\n }\n }\n}\n"]}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * @fileoverview Per-conversation Plan Mode preference.
3
+ *
4
+ * Plan Mode is scoped to a CONVERSATION, not globally to the user: toggling it in one
5
+ * conversation must not bleed into others. State is persisted server-side in a single
6
+ * `MJ: User Settings` row (via `UserInfoEngine`, debounced writes + read-after-write
7
+ * cache) so it survives component recreation, navigation, reloads, and sessions:
8
+ *
9
+ * ```json
10
+ * { "pendingNew": true, "byConversation": { "<conversationId>": true, ... } }
11
+ * ```
12
+ *
13
+ * - `pendingNew` — the toggle state chosen on a composer with NO conversation yet (the
14
+ * empty-state / new-conversation composer). It is CLAIMED by (moved onto) the actual
15
+ * conversation when its first message is routed.
16
+ * - `byConversation` — per-conversation flags, capped at {@link MAX_TRACKED} entries
17
+ * (oldest dropped) so the settings row stays small. Keys are normalized UUIDs so
18
+ * SQL Server (uppercase) and PostgreSQL (lowercase) ids can't create duplicates.
19
+ *
20
+ * All composer instances (empty-state, chat-area, thread panel) and the plan-approval
21
+ * form handler read/write through this ONE class, so they can never disagree.
22
+ *
23
+ * @module @memberjunction/ng-conversations
24
+ */
25
+ /** Static utility — all state lives in UserInfoEngine's cache; this class only parses/writes. */
26
+ export declare class PlanModePreference {
27
+ /** `MJ: User Settings` key for the per-conversation plan-mode map. */
28
+ private static readonly PrefKey;
29
+ /** v1 stored a single global boolean — superseded by per-conversation scoping; deleted on sight. */
30
+ private static readonly LegacyPrefKey;
31
+ /** Cap on tracked conversations (oldest entries dropped beyond this). */
32
+ private static readonly MAX_TRACKED;
33
+ /** Memoized parse of the raw setting string (avoids JSON.parse per change-detection pass). */
34
+ private static rawCache;
35
+ private static stateCache;
36
+ /**
37
+ * Whether Plan Mode is on for the given conversation (or for the not-yet-created
38
+ * conversation when `conversationId` is null/undefined). Synchronous cache read —
39
+ * safe to call from Angular getters every change-detection pass.
40
+ */
41
+ static IsEnabled(conversationId: string | null | undefined): boolean;
42
+ /** Sets Plan Mode for the given conversation (or the pending-new bucket when no id yet). */
43
+ static Set(conversationId: string | null | undefined, enabled: boolean): void;
44
+ /**
45
+ * Moves a `pendingNew` choice onto the actual conversation. Call when routing the FIRST
46
+ * message of a conversation — whichever composer instance sends it claims the pending
47
+ * value (the empty-state composer that set it never routes; it hands off via
48
+ * `emptyStateSubmit`). No-op when nothing is pending.
49
+ */
50
+ static ClaimPendingNew(conversationId: string): void;
51
+ /**
52
+ * Warm the UserInfoEngine cache and drop the superseded v1 (global) setting if present.
53
+ * Fire-and-forget from component init; failures just leave the default (off).
54
+ */
55
+ static Warm(): void;
56
+ /** Read + memoize the persisted state. Defensive: any failure yields the last-known state. */
57
+ private static read;
58
+ private static write;
59
+ /** Cap the per-conversation map, dropping the OLDEST entries (insertion order). */
60
+ private static capped;
61
+ }
62
+ //# sourceMappingURL=plan-mode-preference.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan-mode-preference.d.ts","sourceRoot":"","sources":["../../../src/lib/utils/plan-mode-preference.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAaH,iGAAiG;AACjG,qBAAa,kBAAkB;IAC7B,sEAAsE;IACtE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAkC;IACjE,oGAAoG;IACpG,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAkC;IACvE,yEAAyE;IACzE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAO;IAE1C,8FAA8F;IAC9F,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAiC;IACxD,OAAO,CAAC,MAAM,CAAC,UAAU,CAAqB;IAE9C;;;;OAIG;WACW,SAAS,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO;IAQ3E,4FAA4F;WAC9E,GAAG,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI;IAapF;;;;;OAKG;WACW,eAAe,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI;IAc3D;;;OAGG;WACW,IAAI,IAAI,IAAI;IAU1B,8FAA8F;IAC9F,OAAO,CAAC,MAAM,CAAC,IAAI;IAanB,OAAO,CAAC,MAAM,CAAC,KAAK;IAQpB,mFAAmF;IACnF,OAAO,CAAC,MAAM,CAAC,MAAM;CAUtB"}
@@ -0,0 +1,130 @@
1
+ /**
2
+ * @fileoverview Per-conversation Plan Mode preference.
3
+ *
4
+ * Plan Mode is scoped to a CONVERSATION, not globally to the user: toggling it in one
5
+ * conversation must not bleed into others. State is persisted server-side in a single
6
+ * `MJ: User Settings` row (via `UserInfoEngine`, debounced writes + read-after-write
7
+ * cache) so it survives component recreation, navigation, reloads, and sessions:
8
+ *
9
+ * ```json
10
+ * { "pendingNew": true, "byConversation": { "<conversationId>": true, ... } }
11
+ * ```
12
+ *
13
+ * - `pendingNew` — the toggle state chosen on a composer with NO conversation yet (the
14
+ * empty-state / new-conversation composer). It is CLAIMED by (moved onto) the actual
15
+ * conversation when its first message is routed.
16
+ * - `byConversation` — per-conversation flags, capped at {@link MAX_TRACKED} entries
17
+ * (oldest dropped) so the settings row stays small. Keys are normalized UUIDs so
18
+ * SQL Server (uppercase) and PostgreSQL (lowercase) ids can't create duplicates.
19
+ *
20
+ * All composer instances (empty-state, chat-area, thread panel) and the plan-approval
21
+ * form handler read/write through this ONE class, so they can never disagree.
22
+ *
23
+ * @module @memberjunction/ng-conversations
24
+ */
25
+ import { UserInfoEngine } from '@memberjunction/core-entities';
26
+ import { NormalizeUUID } from '@memberjunction/global';
27
+ /** Static utility — all state lives in UserInfoEngine's cache; this class only parses/writes. */
28
+ export class PlanModePreference {
29
+ /** `MJ: User Settings` key for the per-conversation plan-mode map. */
30
+ static PrefKey = 'mj.conversations.planMode.v2';
31
+ /** v1 stored a single global boolean — superseded by per-conversation scoping; deleted on sight. */
32
+ static LegacyPrefKey = 'mj.conversations.planMode.v1';
33
+ /** Cap on tracked conversations (oldest entries dropped beyond this). */
34
+ static MAX_TRACKED = 100;
35
+ /** Memoized parse of the raw setting string (avoids JSON.parse per change-detection pass). */
36
+ static rawCache = undefined;
37
+ static stateCache = {};
38
+ /**
39
+ * Whether Plan Mode is on for the given conversation (or for the not-yet-created
40
+ * conversation when `conversationId` is null/undefined). Synchronous cache read —
41
+ * safe to call from Angular getters every change-detection pass.
42
+ */
43
+ static IsEnabled(conversationId) {
44
+ const state = this.read();
45
+ if (!conversationId) {
46
+ return state.pendingNew === true;
47
+ }
48
+ return state.byConversation?.[NormalizeUUID(conversationId)] === true;
49
+ }
50
+ /** Sets Plan Mode for the given conversation (or the pending-new bucket when no id yet). */
51
+ static Set(conversationId, enabled) {
52
+ const state = { ...this.read() };
53
+ if (!conversationId) {
54
+ state.pendingNew = enabled;
55
+ }
56
+ else {
57
+ state.byConversation = this.capped({
58
+ ...(state.byConversation ?? {}),
59
+ [NormalizeUUID(conversationId)]: enabled,
60
+ });
61
+ }
62
+ this.write(state);
63
+ }
64
+ /**
65
+ * Moves a `pendingNew` choice onto the actual conversation. Call when routing the FIRST
66
+ * message of a conversation — whichever composer instance sends it claims the pending
67
+ * value (the empty-state composer that set it never routes; it hands off via
68
+ * `emptyStateSubmit`). No-op when nothing is pending.
69
+ */
70
+ static ClaimPendingNew(conversationId) {
71
+ const state = this.read();
72
+ if (state.pendingNew === undefined) {
73
+ return;
74
+ }
75
+ const next = {
76
+ byConversation: this.capped({
77
+ ...(state.byConversation ?? {}),
78
+ [NormalizeUUID(conversationId)]: state.pendingNew,
79
+ }),
80
+ };
81
+ this.write(next);
82
+ }
83
+ /**
84
+ * Warm the UserInfoEngine cache and drop the superseded v1 (global) setting if present.
85
+ * Fire-and-forget from component init; failures just leave the default (off).
86
+ */
87
+ static Warm() {
88
+ UserInfoEngine.Instance.Config()
89
+ .then(() => {
90
+ if (UserInfoEngine.Instance.GetSetting(this.LegacyPrefKey) !== undefined) {
91
+ void UserInfoEngine.Instance.DeleteSetting(this.LegacyPrefKey);
92
+ }
93
+ })
94
+ .catch(() => { });
95
+ }
96
+ /** Read + memoize the persisted state. Defensive: any failure yields the last-known state. */
97
+ static read() {
98
+ try {
99
+ const raw = UserInfoEngine.Instance.GetSetting(this.PrefKey);
100
+ if (raw !== this.rawCache) {
101
+ this.rawCache = raw;
102
+ this.stateCache = raw ? JSON.parse(raw) : {};
103
+ }
104
+ return this.stateCache;
105
+ }
106
+ catch {
107
+ return this.stateCache; // engine not configured yet or malformed payload
108
+ }
109
+ }
110
+ static write(state) {
111
+ try {
112
+ UserInfoEngine.Instance.SetSettingDebounced(this.PrefKey, JSON.stringify(state));
113
+ }
114
+ catch (error) {
115
+ console.warn('[PlanModePreference] Failed to persist plan-mode preference:', error);
116
+ }
117
+ }
118
+ /** Cap the per-conversation map, dropping the OLDEST entries (insertion order). */
119
+ static capped(map) {
120
+ const keys = Object.keys(map);
121
+ if (keys.length <= this.MAX_TRACKED) {
122
+ return map;
123
+ }
124
+ for (const stale of keys.slice(0, keys.length - this.MAX_TRACKED)) {
125
+ delete map[stale];
126
+ }
127
+ return map;
128
+ }
129
+ }
130
+ //# sourceMappingURL=plan-mode-preference.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan-mode-preference.js","sourceRoot":"","sources":["../../../src/lib/utils/plan-mode-preference.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @fileoverview Per-conversation Plan Mode preference.\n *\n * Plan Mode is scoped to a CONVERSATION, not globally to the user: toggling it in one\n * conversation must not bleed into others. State is persisted server-side in a single\n * `MJ: User Settings` row (via `UserInfoEngine`, debounced writes + read-after-write\n * cache) so it survives component recreation, navigation, reloads, and sessions:\n *\n * ```json\n * { \"pendingNew\": true, \"byConversation\": { \"<conversationId>\": true, ... } }\n * ```\n *\n * - `pendingNew` — the toggle state chosen on a composer with NO conversation yet (the\n * empty-state / new-conversation composer). It is CLAIMED by (moved onto) the actual\n * conversation when its first message is routed.\n * - `byConversation` — per-conversation flags, capped at {@link MAX_TRACKED} entries\n * (oldest dropped) so the settings row stays small. Keys are normalized UUIDs so\n * SQL Server (uppercase) and PostgreSQL (lowercase) ids can't create duplicates.\n *\n * All composer instances (empty-state, chat-area, thread panel) and the plan-approval\n * form handler read/write through this ONE class, so they can never disagree.\n *\n * @module @memberjunction/ng-conversations\n */\n\nimport { UserInfoEngine } from '@memberjunction/core-entities';\nimport { NormalizeUUID } from '@memberjunction/global';\n\n/** Persisted shape of the plan-mode preference setting. */\ninterface PlanModeState {\n /** Toggle state chosen before the conversation exists (new-conversation composer). */\n pendingNew?: boolean;\n /** Per-conversation toggle states, keyed by normalized conversation ID. */\n byConversation?: Record<string, boolean>;\n}\n\n/** Static utility — all state lives in UserInfoEngine's cache; this class only parses/writes. */\nexport class PlanModePreference {\n /** `MJ: User Settings` key for the per-conversation plan-mode map. */\n private static readonly PrefKey = 'mj.conversations.planMode.v2';\n /** v1 stored a single global boolean — superseded by per-conversation scoping; deleted on sight. */\n private static readonly LegacyPrefKey = 'mj.conversations.planMode.v1';\n /** Cap on tracked conversations (oldest entries dropped beyond this). */\n private static readonly MAX_TRACKED = 100;\n\n /** Memoized parse of the raw setting string (avoids JSON.parse per change-detection pass). */\n private static rawCache: string | undefined = undefined;\n private static stateCache: PlanModeState = {};\n\n /**\n * Whether Plan Mode is on for the given conversation (or for the not-yet-created\n * conversation when `conversationId` is null/undefined). Synchronous cache read —\n * safe to call from Angular getters every change-detection pass.\n */\n public static IsEnabled(conversationId: string | null | undefined): boolean {\n const state = this.read();\n if (!conversationId) {\n return state.pendingNew === true;\n }\n return state.byConversation?.[NormalizeUUID(conversationId)] === true;\n }\n\n /** Sets Plan Mode for the given conversation (or the pending-new bucket when no id yet). */\n public static Set(conversationId: string | null | undefined, enabled: boolean): void {\n const state = { ...this.read() };\n if (!conversationId) {\n state.pendingNew = enabled;\n } else {\n state.byConversation = this.capped({\n ...(state.byConversation ?? {}),\n [NormalizeUUID(conversationId)]: enabled,\n });\n }\n this.write(state);\n }\n\n /**\n * Moves a `pendingNew` choice onto the actual conversation. Call when routing the FIRST\n * message of a conversation — whichever composer instance sends it claims the pending\n * value (the empty-state composer that set it never routes; it hands off via\n * `emptyStateSubmit`). No-op when nothing is pending.\n */\n public static ClaimPendingNew(conversationId: string): void {\n const state = this.read();\n if (state.pendingNew === undefined) {\n return;\n }\n const next: PlanModeState = {\n byConversation: this.capped({\n ...(state.byConversation ?? {}),\n [NormalizeUUID(conversationId)]: state.pendingNew,\n }),\n };\n this.write(next);\n }\n\n /**\n * Warm the UserInfoEngine cache and drop the superseded v1 (global) setting if present.\n * Fire-and-forget from component init; failures just leave the default (off).\n */\n public static Warm(): void {\n UserInfoEngine.Instance.Config()\n .then(() => {\n if (UserInfoEngine.Instance.GetSetting(this.LegacyPrefKey) !== undefined) {\n void UserInfoEngine.Instance.DeleteSetting(this.LegacyPrefKey);\n }\n })\n .catch(() => { /* reads fall back to default (off) until the engine loads */ });\n }\n\n /** Read + memoize the persisted state. Defensive: any failure yields the last-known state. */\n private static read(): PlanModeState {\n try {\n const raw = UserInfoEngine.Instance.GetSetting(this.PrefKey);\n if (raw !== this.rawCache) {\n this.rawCache = raw;\n this.stateCache = raw ? (JSON.parse(raw) as PlanModeState) : {};\n }\n return this.stateCache;\n } catch {\n return this.stateCache; // engine not configured yet or malformed payload\n }\n }\n\n private static write(state: PlanModeState): void {\n try {\n UserInfoEngine.Instance.SetSettingDebounced(this.PrefKey, JSON.stringify(state));\n } catch (error) {\n console.warn('[PlanModePreference] Failed to persist plan-mode preference:', error);\n }\n }\n\n /** Cap the per-conversation map, dropping the OLDEST entries (insertion order). */\n private static capped(map: Record<string, boolean>): Record<string, boolean> {\n const keys = Object.keys(map);\n if (keys.length <= this.MAX_TRACKED) {\n return map;\n }\n for (const stale of keys.slice(0, keys.length - this.MAX_TRACKED)) {\n delete map[stale];\n }\n return map;\n }\n}\n"]}
@@ -89,6 +89,7 @@ export * from './lib/components/realtime/realtime-channel-strip.component';
89
89
  export * from './lib/components/realtime/realtime-session-timeline-card.component';
90
90
  export * from './lib/utils/realtime-session-timeline';
91
91
  export * from './lib/components/realtime/channels/base-realtime-channel-client';
92
+ export * from './lib/components/realtime/channels/client-context-channel';
92
93
  export * from './lib/components/realtime/channels/realtime-channel-pane.component';
93
94
  export * from './lib/components/realtime/channels/channel-onboarding-panel.component';
94
95
  export * from './lib/components/realtime/whiteboard/whiteboard-channel';
@@ -97,4 +98,9 @@ export * from './lib/components/realtime/remote-browser/remote-browser-channel';
97
98
  export * from './lib/components/realtime/remote-browser/remote-browser-surface.component';
98
99
  export * from './lib/components/realtime/remote-browser/remote-browser-tools';
99
100
  export * from './lib/components/realtime/remote-browser/remote-browser-audio-player';
101
+ export * from './lib/components/realtime/media/media-channel';
102
+ export * from './lib/components/realtime/media/media-channel-state';
103
+ export * from './lib/components/realtime/media/media-channel-tools';
104
+ export * from './lib/components/realtime/media/realtime-media-surface.component';
105
+ export * from './lib/components/realtime/evidence-playback/realtime-evidence-playback.component';
100
106
  //# sourceMappingURL=public-api.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"public-api.d.ts","sourceRoot":"","sources":["../src/public-api.ts"],"names":[],"mappings":"AAKA,cAAc,4BAA4B,CAAC;AAG3C,cAAc,uCAAuC,CAAC;AACtD,cAAc,iCAAiC,CAAC;AAChD,cAAc,iCAAiC,CAAC;AAChD,cAAc,uCAAuC,CAAC;AAGtD,cAAc,mCAAmC,CAAC;AAClD,cAAc,uCAAuC,CAAC;AACtD,cAAc,oCAAoC,CAAC;AACnD,cAAc,2CAA2C,CAAC;AAC1D,cAAc,qCAAqC,CAAC;AACpD,cAAc,+CAA+C,CAAC;AAC9D,cAAc,+BAA+B,CAAC;AAC9C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,qCAAqC,CAAC;AACpD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,uCAAuC,CAAC;AACtD,cAAc,6CAA6C,CAAC;AAC5D,cAAc,8CAA8C,CAAC;AAC7D,cAAc,4CAA4C,CAAC;AAC3D,cAAc,8CAA8C,CAAC;AAC7D,cAAc,yCAAyC,CAAC;AACxD,cAAc,gDAAgD,CAAC;AAC/D,cAAc,2CAA2C,CAAC;AAC1D,cAAc,4CAA4C,CAAC;AAC3D,cAAc,yCAAyC,CAAC;AACxD,cAAc,iCAAiC,CAAC;AAChD,cAAc,mCAAmC,CAAC;AAClD,cAAc,0CAA0C,CAAC;AACzD,cAAc,gDAAgD,CAAC;AAC/D,cAAc,yCAAyC,CAAC;AAGxD,cAAc,6DAA6D,CAAC;AAC5E,cAAc,+DAA+D,CAAC;AAC9E,cAAc,yDAAyD,CAAC;AACxE,cAAc,2DAA2D,CAAC;AAC1E,cAAc,gEAAgE,CAAC;AAC/E,cAAc,kEAAkE,CAAC;AACjF,cAAc,iDAAiD,CAAC;AAChE,cAAc,iDAAiD,CAAC;AAChE,cAAc,kDAAkD,CAAC;AACjE,cAAc,sDAAsD,CAAC;AACrE,cAAc,gEAAgE,CAAC;AAC/E,cAAc,qDAAqD,CAAC;AACpE,cAAc,mDAAmD,CAAC;AAClE,cAAc,uDAAuD,CAAC;AACtE,cAAc,uDAAuD,CAAC;AACtE,cAAc,6DAA6D,CAAC;AAC5E,cAAc,gEAAgE,CAAC;AAC/E,cAAc,wEAAwE,CAAC;AACvF,cAAc,8DAA8D,CAAC;AAC7E,cAAc,0DAA0D,CAAC;AACzE,cAAc,qDAAqD,CAAC;AACpE,cAAc,uDAAuD,CAAC;AACtE,cAAc,iDAAiD,CAAC;AAChE,cAAc,8CAA8C,CAAC;AAC7D,cAAc,sDAAsD,CAAC;AACrE,cAAc,yDAAyD,CAAC;AACxE,cAAc,4DAA4D,CAAC;AAC3E,cAAc,8CAA8C,CAAC;AAC7D,cAAc,4DAA4D,CAAC;AAC3E,cAAc,4DAA4D,CAAC;AAC3E,cAAc,wCAAwC,CAAC;AACvD,cAAc,4DAA4D,CAAC;AAC3E,cAAc,oDAAoD,CAAC;AACnE,cAAc,iDAAiD,CAAC;AAGhE,cAAc,wDAAwD,CAAC;AACvE,cAAc,sCAAsC,CAAC;AACrD,cAAc,wCAAwC,CAAC;AACvD,cAAc,8DAA8D,CAAC;AAC7E,cAAc,iEAAiE,CAAC;AAChF,cAAc,yDAAyD,CAAC;AACxE,cAAc,gEAAgE,CAAC;AAC/E,cAAc,wEAAwE,CAAC;AACvF,cAAc,iEAAiE,CAAC;AAChF,cAAc,0BAA0B,CAAC;AAGzC,cAAc,2DAA2D,CAAC;AAE1E,cAAc,8DAA8D,CAAC;AAC7E,cAAc,kDAAkD,CAAC;AACjE,cAAc,2DAA2D,CAAC;AAC1E,cAAc,6DAA6D,CAAC;AAC5E,cAAc,8DAA8D,CAAC;AAC7E,cAAc,4DAA4D,CAAC;AAC3E,cAAc,2DAA2D,CAAC;AAC1E,cAAc,uDAAuD,CAAC;AACtE,cAAc,wDAAwD,CAAC;AACvE,cAAc,+CAA+C,CAAC;AAC9D,cAAc,kDAAkD,CAAC;AACjE,cAAc,uDAAuD,CAAC;AACtE,cAAc,4DAA4D,CAAC;AAE3E,cAAc,oEAAoE,CAAC;AACnF,cAAc,uCAAuC,CAAC;AAEtD,cAAc,iEAAiE,CAAC;AAChF,cAAc,oEAAoE,CAAC;AACnF,cAAc,uEAAuE,CAAC;AAItF,cAAc,yDAAyD,CAAC;AACxE,cAAc,2EAA2E,CAAC;AAE1F,cAAc,iEAAiE,CAAC;AAChF,cAAc,2EAA2E,CAAC;AAC1F,cAAc,+DAA+D,CAAC;AAC9E,cAAc,sEAAsE,CAAC"}
1
+ {"version":3,"file":"public-api.d.ts","sourceRoot":"","sources":["../src/public-api.ts"],"names":[],"mappings":"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"}
@@ -101,6 +101,7 @@ export * from './lib/components/realtime/realtime-session-timeline-card.componen
101
101
  export * from './lib/utils/realtime-session-timeline';
102
102
  // Pluggable interactive-channel contract (registry-resolved client plugins) + pane host
103
103
  export * from './lib/components/realtime/channels/base-realtime-channel-client';
104
+ export * from './lib/components/realtime/channels/client-context-channel';
104
105
  export * from './lib/components/realtime/channels/realtime-channel-pane.component';
105
106
  export * from './lib/components/realtime/channels/channel-onboarding-panel.component';
106
107
  // Live whiteboard channel plugin + artifact viewer (thin consumers of the generic board).
@@ -113,4 +114,11 @@ export * from './lib/components/realtime/remote-browser/remote-browser-channel';
113
114
  export * from './lib/components/realtime/remote-browser/remote-browser-surface.component';
114
115
  export * from './lib/components/realtime/remote-browser/remote-browser-tools';
115
116
  export * from './lib/components/realtime/remote-browser/remote-browser-audio-player';
117
+ // Media channel plugin (Tabs-layout media display surface) + its state engine, tools, and surface.
118
+ export * from './lib/components/realtime/media/media-channel';
119
+ export * from './lib/components/realtime/media/media-channel-state';
120
+ export * from './lib/components/realtime/media/media-channel-tools';
121
+ export * from './lib/components/realtime/media/realtime-media-surface.component';
122
+ // Time-aligned Evidence Playback component (recorded session audio synced to the transcript).
123
+ export * from './lib/components/realtime/evidence-playback/realtime-evidence-playback.component';
116
124
  //# sourceMappingURL=public-api.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"public-api.js","sourceRoot":"","sources":["../src/public-api.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Public API Surface of @memberjunction/ng-conversations\n */\n\n// Module\nexport * from './lib/conversations.module';\n\n// Models\nexport * from './lib/models/conversation-state.model';\nexport * from './lib/models/notification.model';\nexport * from './lib/models/lazy-artifact-info';\nexport * from './lib/models/navigation-request.model';\n\n// Services - State\nexport * from './lib/services/data-cache.service';\nexport * from './lib/services/artifact-state.service';\nexport * from './lib/services/agent-state.service';\nexport * from './lib/services/conversation-agent.service';\nexport * from './lib/services/active-tasks.service';\nexport * from './lib/services/conversation-streaming.service';\nexport * from './lib/services/dialog.service';\nexport * from './lib/services/export.service';\nexport * from './lib/services/notification.service';\nexport * from './lib/services/toast.service';\nexport * from './lib/services/mention-parser.service';\nexport * from './lib/services/mention-autocomplete.service';\nexport * from './lib/services/collection-permission.service';\nexport * from './lib/services/artifact-permission.service';\nexport * from './lib/services/artifact-use-tracking.service';\nexport * from './lib/services/collection-state.service';\nexport * from './lib/services/conversation-attachment.service';\nexport * from './lib/services/ui-command-handler.service';\nexport * from './lib/services/conversation-bridge.service';\nexport * from './lib/services/realtime-session.service';\nexport * from './lib/services/realtime-pairing';\nexport * from './lib/services/user-authorization';\nexport * from './lib/services/realtime-sessions-adapter';\nexport * from './lib/services/realtime-session-review.service';\nexport * from './lib/services/delegation-result-parser';\n\n// Components\nexport * from './lib/components/workspace/conversation-workspace.component';\nexport * from './lib/components/navigation/conversation-navigation.component';\nexport * from './lib/components/sidebar/conversation-sidebar.component';\nexport * from './lib/components/conversation/conversation-list.component';\nexport * from './lib/components/conversation/conversation-chat-area.component';\nexport * from './lib/components/conversation/conversation-empty-state.component';\nexport * from './lib/components/message/message-item.component';\nexport * from './lib/components/message/message-list.component';\nexport * from './lib/components/message/message-input.component';\nexport * from './lib/components/message/message-input-box.component';\nexport * from './lib/components/message/conversation-message-rating.component';\nexport * from './lib/components/mention/mention-dropdown.component';\nexport * from './lib/components/mention/mention-editor.component';\nexport * from './lib/components/collection/collection-tree.component';\nexport * from './lib/components/collection/collection-view.component';\nexport * from './lib/components/collection/collections-full-view.component';\nexport * from './lib/components/collection/collection-artifact-card.component';\nexport * from './lib/components/collection/artifact-collection-picker-modal.component';\nexport * from './lib/components/collection/collection-share-modal.component';\nexport * from './lib/components/artifact/artifact-share-modal.component';\nexport * from './lib/components/project/project-selector.component';\nexport * from './lib/components/project/project-form-modal.component';\nexport * from './lib/components/task/tasks-full-view.component';\nexport * from './lib/components/tasks/task-widget.component';\nexport * from './lib/components/agent/agent-process-panel.component';\nexport * from './lib/components/agent/active-agent-indicator.component';\nexport * from './lib/components/active-tasks/active-tasks-panel.component';\nexport * from './lib/components/share/share-modal.component';\nexport * from './lib/components/notification/notification-badge.component';\nexport * from './lib/components/notification/activity-indicator.component';\nexport * from './lib/components/toast/toast.component';\nexport * from './lib/components/global-tasks/global-tasks-panel.component';\nexport * from './lib/components/attachment/image-viewer.component';\nexport * from './lib/components/overlay/chat-overlay.component';\n\n// PR 2c — Widget extension surface (slots, events, design tokens)\nexport * from './lib/services/conversations-runtime-bootstrap.service';\nexport * from './lib/directives/chat-slot.directive';\nexport * from './lib/components/slots/slot-interfaces';\nexport * from './lib/components/slots/mj-chat-empty-state-default.component';\nexport * from './lib/components/slots/mj-chat-agent-presence-default.component';\nexport * from './lib/components/slots/mj-chat-header-default.component';\nexport * from './lib/components/slots/mj-chat-message-extra-default.component';\nexport * from './lib/components/slots/mj-chat-demonstration-surface-default.component';\nexport * from './lib/components/slots/mj-chat-message-bubble-default.component';\nexport * from './lib/events/chat-events';\n\n// Realtime / voice (PR #2787 — co-agent realtime sessions)\nexport * from './lib/components/realtime/realtime-agent-picker.component';\n// Real-time \"call mode\" overlay + its componentized parts\nexport * from './lib/components/realtime/realtime-session-overlay.component';\nexport * from './lib/components/realtime/realtime-session-state';\nexport * from './lib/components/realtime/realtime-agent-banner.component';\nexport * from './lib/components/realtime/realtime-session-thread.component';\nexport * from './lib/components/realtime/realtime-delegation-card.component';\nexport * from './lib/components/realtime/realtime-activity-rail.component';\nexport * from './lib/components/realtime/realtime-surface-tabs.component';\nexport * from './lib/components/realtime/realtime-surface-tabs.model';\nexport * from './lib/components/realtime/realtime-surface-panel-prefs';\nexport * from './lib/components/realtime/realtime-disclosure';\nexport * from './lib/components/realtime/realtime-audio-visuals';\nexport * from './lib/components/realtime/realtime-composer.component';\nexport * from './lib/components/realtime/realtime-channel-strip.component';\n// Conversation-timeline collapse of past realtime sessions (one card per session) + its pure grouping pass\nexport * from './lib/components/realtime/realtime-session-timeline-card.component';\nexport * from './lib/utils/realtime-session-timeline';\n// Pluggable interactive-channel contract (registry-resolved client plugins) + pane host\nexport * from './lib/components/realtime/channels/base-realtime-channel-client';\nexport * from './lib/components/realtime/channels/realtime-channel-pane.component';\nexport * from './lib/components/realtime/channels/channel-onboarding-panel.component';\n// Live whiteboard channel plugin + artifact viewer (thin consumers of the generic board).\n// NOTE: the whiteboard itself (engine, tools, components, export builders) lives in\n// @memberjunction/ng-whiteboard — import board types/components from there directly.\nexport * from './lib/components/realtime/whiteboard/whiteboard-channel';\nexport * from './lib/components/realtime/whiteboard/whiteboard-artifact-viewer.component';\n// Remote Browser channel plugin (client-direct, server-hosted browser) + its live surface + tools.\nexport * from './lib/components/realtime/remote-browser/remote-browser-channel';\nexport * from './lib/components/realtime/remote-browser/remote-browser-surface.component';\nexport * from './lib/components/realtime/remote-browser/remote-browser-tools';\nexport * from './lib/components/realtime/remote-browser/remote-browser-audio-player';\n"]}
1
+ {"version":3,"file":"public-api.js","sourceRoot":"","sources":["../src/public-api.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Public API Surface of @memberjunction/ng-conversations\n */\n\n// Module\nexport * from './lib/conversations.module';\n\n// Models\nexport * from './lib/models/conversation-state.model';\nexport * from './lib/models/notification.model';\nexport * from './lib/models/lazy-artifact-info';\nexport * from './lib/models/navigation-request.model';\n\n// Services - State\nexport * from './lib/services/data-cache.service';\nexport * from './lib/services/artifact-state.service';\nexport * from './lib/services/agent-state.service';\nexport * from './lib/services/conversation-agent.service';\nexport * from './lib/services/active-tasks.service';\nexport * from './lib/services/conversation-streaming.service';\nexport * from './lib/services/dialog.service';\nexport * from './lib/services/export.service';\nexport * from './lib/services/notification.service';\nexport * from './lib/services/toast.service';\nexport * from './lib/services/mention-parser.service';\nexport * from './lib/services/mention-autocomplete.service';\nexport * from './lib/services/collection-permission.service';\nexport * from './lib/services/artifact-permission.service';\nexport * from './lib/services/artifact-use-tracking.service';\nexport * from './lib/services/collection-state.service';\nexport * from './lib/services/conversation-attachment.service';\nexport * from './lib/services/ui-command-handler.service';\nexport * from './lib/services/conversation-bridge.service';\nexport * from './lib/services/realtime-session.service';\nexport * from './lib/services/realtime-pairing';\nexport * from './lib/services/user-authorization';\nexport * from './lib/services/realtime-sessions-adapter';\nexport * from './lib/services/realtime-session-review.service';\nexport * from './lib/services/delegation-result-parser';\n\n// Components\nexport * from './lib/components/workspace/conversation-workspace.component';\nexport * from './lib/components/navigation/conversation-navigation.component';\nexport * from './lib/components/sidebar/conversation-sidebar.component';\nexport * from './lib/components/conversation/conversation-list.component';\nexport * from './lib/components/conversation/conversation-chat-area.component';\nexport * from './lib/components/conversation/conversation-empty-state.component';\nexport * from './lib/components/message/message-item.component';\nexport * from './lib/components/message/message-list.component';\nexport * from './lib/components/message/message-input.component';\nexport * from './lib/components/message/message-input-box.component';\nexport * from './lib/components/message/conversation-message-rating.component';\nexport * from './lib/components/mention/mention-dropdown.component';\nexport * from './lib/components/mention/mention-editor.component';\nexport * from './lib/components/collection/collection-tree.component';\nexport * from './lib/components/collection/collection-view.component';\nexport * from './lib/components/collection/collections-full-view.component';\nexport * from './lib/components/collection/collection-artifact-card.component';\nexport * from './lib/components/collection/artifact-collection-picker-modal.component';\nexport * from './lib/components/collection/collection-share-modal.component';\nexport * from './lib/components/artifact/artifact-share-modal.component';\nexport * from './lib/components/project/project-selector.component';\nexport * from './lib/components/project/project-form-modal.component';\nexport * from './lib/components/task/tasks-full-view.component';\nexport * from './lib/components/tasks/task-widget.component';\nexport * from './lib/components/agent/agent-process-panel.component';\nexport * from './lib/components/agent/active-agent-indicator.component';\nexport * from './lib/components/active-tasks/active-tasks-panel.component';\nexport * from './lib/components/share/share-modal.component';\nexport * from './lib/components/notification/notification-badge.component';\nexport * from './lib/components/notification/activity-indicator.component';\nexport * from './lib/components/toast/toast.component';\nexport * from './lib/components/global-tasks/global-tasks-panel.component';\nexport * from './lib/components/attachment/image-viewer.component';\nexport * from './lib/components/overlay/chat-overlay.component';\n\n// PR 2c — Widget extension surface (slots, events, design tokens)\nexport * from './lib/services/conversations-runtime-bootstrap.service';\nexport * from './lib/directives/chat-slot.directive';\nexport * from './lib/components/slots/slot-interfaces';\nexport * from './lib/components/slots/mj-chat-empty-state-default.component';\nexport * from './lib/components/slots/mj-chat-agent-presence-default.component';\nexport * from './lib/components/slots/mj-chat-header-default.component';\nexport * from './lib/components/slots/mj-chat-message-extra-default.component';\nexport * from './lib/components/slots/mj-chat-demonstration-surface-default.component';\nexport * from './lib/components/slots/mj-chat-message-bubble-default.component';\nexport * from './lib/events/chat-events';\n\n// Realtime / voice (PR #2787 — co-agent realtime sessions)\nexport * from './lib/components/realtime/realtime-agent-picker.component';\n// Real-time \"call mode\" overlay + its componentized parts\nexport * from './lib/components/realtime/realtime-session-overlay.component';\nexport * from './lib/components/realtime/realtime-session-state';\nexport * from './lib/components/realtime/realtime-agent-banner.component';\nexport * from './lib/components/realtime/realtime-session-thread.component';\nexport * from './lib/components/realtime/realtime-delegation-card.component';\nexport * from './lib/components/realtime/realtime-activity-rail.component';\nexport * from './lib/components/realtime/realtime-surface-tabs.component';\nexport * from './lib/components/realtime/realtime-surface-tabs.model';\nexport * from './lib/components/realtime/realtime-surface-panel-prefs';\nexport * from './lib/components/realtime/realtime-disclosure';\nexport * from './lib/components/realtime/realtime-audio-visuals';\nexport * from './lib/components/realtime/realtime-composer.component';\nexport * from './lib/components/realtime/realtime-channel-strip.component';\n// Conversation-timeline collapse of past realtime sessions (one card per session) + its pure grouping pass\nexport * from './lib/components/realtime/realtime-session-timeline-card.component';\nexport * from './lib/utils/realtime-session-timeline';\n// Pluggable interactive-channel contract (registry-resolved client plugins) + pane host\nexport * from './lib/components/realtime/channels/base-realtime-channel-client';\nexport * from './lib/components/realtime/channels/client-context-channel';\nexport * from './lib/components/realtime/channels/realtime-channel-pane.component';\nexport * from './lib/components/realtime/channels/channel-onboarding-panel.component';\n// Live whiteboard channel plugin + artifact viewer (thin consumers of the generic board).\n// NOTE: the whiteboard itself (engine, tools, components, export builders) lives in\n// @memberjunction/ng-whiteboard — import board types/components from there directly.\nexport * from './lib/components/realtime/whiteboard/whiteboard-channel';\nexport * from './lib/components/realtime/whiteboard/whiteboard-artifact-viewer.component';\n// Remote Browser channel plugin (client-direct, server-hosted browser) + its live surface + tools.\nexport * from './lib/components/realtime/remote-browser/remote-browser-channel';\nexport * from './lib/components/realtime/remote-browser/remote-browser-surface.component';\nexport * from './lib/components/realtime/remote-browser/remote-browser-tools';\nexport * from './lib/components/realtime/remote-browser/remote-browser-audio-player';\n// Media channel plugin (Tabs-layout media display surface) + its state engine, tools, and surface.\nexport * from './lib/components/realtime/media/media-channel';\nexport * from './lib/components/realtime/media/media-channel-state';\nexport * from './lib/components/realtime/media/media-channel-tools';\nexport * from './lib/components/realtime/media/realtime-media-surface.component';\n// Time-aligned Evidence Playback component (recorded session audio synced to the transcript).\nexport * from './lib/components/realtime/evidence-playback/realtime-evidence-playback.component';\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@memberjunction/ng-conversations",
3
- "version": "5.43.0",
3
+ "version": "5.44.0",
4
4
  "description": "MemberJunction: Conversation, Collection, and Artifact management components for any Angular application",
5
5
  "main": "./dist/public-api.js",
6
6
  "typings": "./dist/public-api.d.ts",
@@ -31,31 +31,33 @@
31
31
  "dependencies": {
32
32
  "@angular/animations": "21.1.3",
33
33
  "@angular/cdk": "21.1.3",
34
- "@memberjunction/ai": "5.43.0",
35
- "@memberjunction/ai-agent-client": "5.43.0",
36
- "@memberjunction/ai-core-plus": "5.43.0",
37
- "@memberjunction/ai-engine-base": "5.43.0",
38
- "@memberjunction/ai-realtime-client": "5.43.0",
39
- "@memberjunction/conversations-runtime": "5.43.0",
40
- "@memberjunction/core": "5.43.0",
41
- "@memberjunction/core-entities": "5.43.0",
42
- "@memberjunction/global": "5.43.0",
43
- "@memberjunction/graphql-dataprovider": "5.43.0",
44
- "@memberjunction/interactive-component-types": "5.43.0",
45
- "@memberjunction/ng-agent-client": "5.43.0",
46
- "@memberjunction/ng-artifacts": "5.43.0",
47
- "@memberjunction/ng-base-types": "5.43.0",
48
- "@memberjunction/ng-code-editor": "5.43.0",
49
- "@memberjunction/ng-container-directives": "5.43.0",
50
- "@memberjunction/ng-forms": "5.43.0",
51
- "@memberjunction/ng-markdown": "5.43.0",
52
- "@memberjunction/ng-notifications": "5.43.0",
53
- "@memberjunction/ng-resource-permissions": "5.43.0",
54
- "@memberjunction/ng-shared-generic": "5.43.0",
55
- "@memberjunction/ng-tasks": "5.43.0",
56
- "@memberjunction/ng-testing": "5.43.0",
57
- "@memberjunction/ng-ui-components": "5.43.0",
58
- "@memberjunction/ng-whiteboard": "5.43.0",
34
+ "@memberjunction/ai": "5.44.0",
35
+ "@memberjunction/ai-agent-client": "5.44.0",
36
+ "@memberjunction/ai-core-plus": "5.44.0",
37
+ "@memberjunction/ai-engine-base": "5.44.0",
38
+ "@memberjunction/ai-realtime-client": "5.44.0",
39
+ "@memberjunction/conversations-runtime": "5.44.0",
40
+ "@memberjunction/core": "5.44.0",
41
+ "@memberjunction/core-entities": "5.44.0",
42
+ "@memberjunction/global": "5.44.0",
43
+ "@memberjunction/graphql-dataprovider": "5.44.0",
44
+ "@memberjunction/interactive-component-types": "5.44.0",
45
+ "@memberjunction/ng-agent-client": "5.44.0",
46
+ "@memberjunction/ng-artifacts": "5.44.0",
47
+ "@memberjunction/ng-base-types": "5.44.0",
48
+ "@memberjunction/ng-code-editor": "5.44.0",
49
+ "@memberjunction/ng-container-directives": "5.44.0",
50
+ "@memberjunction/ng-forms": "5.44.0",
51
+ "@memberjunction/ng-markdown": "5.44.0",
52
+ "@memberjunction/ng-media-player": "5.44.0",
53
+ "@memberjunction/ng-notifications": "5.44.0",
54
+ "@memberjunction/ng-resource-permissions": "5.44.0",
55
+ "@memberjunction/ng-shared-generic": "5.44.0",
56
+ "@memberjunction/ng-tasks": "5.44.0",
57
+ "@memberjunction/ng-testing": "5.44.0",
58
+ "@memberjunction/ng-ui-components": "5.44.0",
59
+ "@memberjunction/ng-whiteboard": "5.44.0",
60
+ "angular-split": "^20.0.0",
59
61
  "rxjs": "^7.8.2",
60
62
  "tslib": "^2.8.1"
61
63
  },
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=attachment-badge.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"attachment-badge.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/attachment-badge.test.ts"],"names":[],"mappings":""}