@memberjunction/ng-conversations 6.1.4 → 6.2.0-edge.1

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 (424) hide show
  1. package/README.md +36 -3
  2. package/dist/lib/components/active-tasks/active-tasks-panel.component.d.ts +19 -3
  3. package/dist/lib/components/active-tasks/active-tasks-panel.component.d.ts.map +1 -1
  4. package/dist/lib/components/active-tasks/active-tasks-panel.component.js +39 -7
  5. package/dist/lib/components/active-tasks/active-tasks-panel.component.js.map +1 -1
  6. package/dist/lib/components/agent/active-agent-indicator.component.d.ts +74 -6
  7. package/dist/lib/components/agent/active-agent-indicator.component.d.ts.map +1 -1
  8. package/dist/lib/components/agent/active-agent-indicator.component.js +111 -21
  9. package/dist/lib/components/agent/active-agent-indicator.component.js.map +1 -1
  10. package/dist/lib/components/agent/agent-process-panel.component.d.ts +31 -5
  11. package/dist/lib/components/agent/agent-process-panel.component.d.ts.map +1 -1
  12. package/dist/lib/components/agent/agent-process-panel.component.js +71 -15
  13. package/dist/lib/components/agent/agent-process-panel.component.js.map +1 -1
  14. package/dist/lib/components/artifact/artifact-share-modal.component.d.ts +65 -9
  15. package/dist/lib/components/artifact/artifact-share-modal.component.d.ts.map +1 -1
  16. package/dist/lib/components/artifact/artifact-share-modal.component.js +169 -57
  17. package/dist/lib/components/artifact/artifact-share-modal.component.js.map +1 -1
  18. package/dist/lib/components/attachment/image-viewer.component.d.ts +77 -11
  19. package/dist/lib/components/attachment/image-viewer.component.d.ts.map +1 -1
  20. package/dist/lib/components/attachment/image-viewer.component.js +181 -47
  21. package/dist/lib/components/attachment/image-viewer.component.js.map +1 -1
  22. package/dist/lib/components/collection/artifact-collection-picker-modal.component.d.ts +129 -19
  23. package/dist/lib/components/collection/artifact-collection-picker-modal.component.d.ts.map +1 -1
  24. package/dist/lib/components/collection/artifact-collection-picker-modal.component.js +350 -116
  25. package/dist/lib/components/collection/artifact-collection-picker-modal.component.js.map +1 -1
  26. package/dist/lib/components/collection/artifact-create-modal.component.d.ts +60 -8
  27. package/dist/lib/components/collection/artifact-create-modal.component.d.ts.map +1 -1
  28. package/dist/lib/components/collection/artifact-create-modal.component.js +130 -46
  29. package/dist/lib/components/collection/artifact-create-modal.component.js.map +1 -1
  30. package/dist/lib/components/collection/collection-artifact-card.component.d.ts +63 -3
  31. package/dist/lib/components/collection/collection-artifact-card.component.d.ts.map +1 -1
  32. package/dist/lib/components/collection/collection-artifact-card.component.js +113 -19
  33. package/dist/lib/components/collection/collection-artifact-card.component.js.map +1 -1
  34. package/dist/lib/components/collection/collection-form-modal.component.d.ts +54 -8
  35. package/dist/lib/components/collection/collection-form-modal.component.d.ts.map +1 -1
  36. package/dist/lib/components/collection/collection-form-modal.component.js +130 -46
  37. package/dist/lib/components/collection/collection-form-modal.component.js.map +1 -1
  38. package/dist/lib/components/collection/collection-share-modal.component.d.ts +70 -10
  39. package/dist/lib/components/collection/collection-share-modal.component.d.ts.map +1 -1
  40. package/dist/lib/components/collection/collection-share-modal.component.js +175 -53
  41. package/dist/lib/components/collection/collection-share-modal.component.js.map +1 -1
  42. package/dist/lib/components/collection/collection-tree.component.d.ts +89 -9
  43. package/dist/lib/components/collection/collection-tree.component.d.ts.map +1 -1
  44. package/dist/lib/components/collection/collection-tree.component.js +220 -70
  45. package/dist/lib/components/collection/collection-tree.component.js.map +1 -1
  46. package/dist/lib/components/collection/collection-view.component.d.ts +89 -11
  47. package/dist/lib/components/collection/collection-view.component.d.ts.map +1 -1
  48. package/dist/lib/components/collection/collection-view.component.js +154 -40
  49. package/dist/lib/components/collection/collection-view.component.js.map +1 -1
  50. package/dist/lib/components/collection/collections-full-view.component.d.ts +390 -38
  51. package/dist/lib/components/collection/collections-full-view.component.d.ts.map +1 -1
  52. package/dist/lib/components/collection/collections-full-view.component.js +951 -367
  53. package/dist/lib/components/collection/collections-full-view.component.js.map +1 -1
  54. package/dist/lib/components/composer/ai-composer.component.d.ts +213 -18
  55. package/dist/lib/components/composer/ai-composer.component.d.ts.map +1 -1
  56. package/dist/lib/components/composer/ai-composer.component.js +388 -44
  57. package/dist/lib/components/composer/ai-composer.component.js.map +1 -1
  58. package/dist/lib/components/conversation/conversation-agent-picker.component.d.ts +12 -1
  59. package/dist/lib/components/conversation/conversation-agent-picker.component.d.ts.map +1 -1
  60. package/dist/lib/components/conversation/conversation-agent-picker.component.js +26 -4
  61. package/dist/lib/components/conversation/conversation-agent-picker.component.js.map +1 -1
  62. package/dist/lib/components/conversation/conversation-chat-area.component.d.ts +1090 -123
  63. package/dist/lib/components/conversation/conversation-chat-area.component.d.ts.map +1 -1
  64. package/dist/lib/components/conversation/conversation-chat-area.component.js +2407 -731
  65. package/dist/lib/components/conversation/conversation-chat-area.component.js.map +1 -1
  66. package/dist/lib/components/conversation/conversation-empty-state.component.d.ts +139 -19
  67. package/dist/lib/components/conversation/conversation-empty-state.component.d.ts.map +1 -1
  68. package/dist/lib/components/conversation/conversation-empty-state.component.js +296 -59
  69. package/dist/lib/components/conversation/conversation-empty-state.component.js.map +1 -1
  70. package/dist/lib/components/conversation/conversation-list.component.d.ts +579 -78
  71. package/dist/lib/components/conversation/conversation-list.component.d.ts.map +1 -1
  72. package/dist/lib/components/conversation/conversation-list.component.js +2322 -823
  73. package/dist/lib/components/conversation/conversation-list.component.js.map +1 -1
  74. package/dist/lib/components/conversation/pinned-messages-panel.component.d.ts +40 -4
  75. package/dist/lib/components/conversation/pinned-messages-panel.component.d.ts.map +1 -1
  76. package/dist/lib/components/conversation/pinned-messages-panel.component.js +72 -14
  77. package/dist/lib/components/conversation/pinned-messages-panel.component.js.map +1 -1
  78. package/dist/lib/components/dialogs/input-dialog.component.d.ts +57 -11
  79. package/dist/lib/components/dialogs/input-dialog.component.d.ts.map +1 -1
  80. package/dist/lib/components/dialogs/input-dialog.component.js +128 -16
  81. package/dist/lib/components/dialogs/input-dialog.component.js.map +1 -1
  82. package/dist/lib/components/dialogs/rating-dialog.component.d.ts +68 -10
  83. package/dist/lib/components/dialogs/rating-dialog.component.d.ts.map +1 -1
  84. package/dist/lib/components/dialogs/rating-dialog.component.js +151 -27
  85. package/dist/lib/components/dialogs/rating-dialog.component.js.map +1 -1
  86. package/dist/lib/components/export/export-modal.component.d.ts +84 -10
  87. package/dist/lib/components/export/export-modal.component.d.ts.map +1 -1
  88. package/dist/lib/components/export/export-modal.component.js +173 -49
  89. package/dist/lib/components/export/export-modal.component.js.map +1 -1
  90. package/dist/lib/components/global-tasks/global-tasks-panel.component.d.ts +29 -3
  91. package/dist/lib/components/global-tasks/global-tasks-panel.component.d.ts.map +1 -1
  92. package/dist/lib/components/global-tasks/global-tasks-panel.component.js +58 -12
  93. package/dist/lib/components/global-tasks/global-tasks-panel.component.js.map +1 -1
  94. package/dist/lib/components/library/library-full-view.component.d.ts +57 -8
  95. package/dist/lib/components/library/library-full-view.component.d.ts.map +1 -1
  96. package/dist/lib/components/library/library-full-view.component.js +119 -35
  97. package/dist/lib/components/library/library-full-view.component.js.map +1 -1
  98. package/dist/lib/components/members/members-modal.component.d.ts +76 -10
  99. package/dist/lib/components/members/members-modal.component.d.ts.map +1 -1
  100. package/dist/lib/components/members/members-modal.component.js +164 -50
  101. package/dist/lib/components/members/members-modal.component.js.map +1 -1
  102. package/dist/lib/components/message/actionable-commands.component.d.ts +37 -5
  103. package/dist/lib/components/message/actionable-commands.component.d.ts.map +1 -1
  104. package/dist/lib/components/message/actionable-commands.component.js +82 -16
  105. package/dist/lib/components/message/actionable-commands.component.js.map +1 -1
  106. package/dist/lib/components/message/conversation-message-rating.component.d.ts +46 -10
  107. package/dist/lib/components/message/conversation-message-rating.component.d.ts.map +1 -1
  108. package/dist/lib/components/message/conversation-message-rating.component.js +120 -36
  109. package/dist/lib/components/message/conversation-message-rating.component.js.map +1 -1
  110. package/dist/lib/components/message/message-input.component.d.ts +549 -74
  111. package/dist/lib/components/message/message-input.component.d.ts.map +1 -1
  112. package/dist/lib/components/message/message-input.component.js +1250 -421
  113. package/dist/lib/components/message/message-input.component.js.map +1 -1
  114. package/dist/lib/components/message/message-item.component.d.ts +411 -29
  115. package/dist/lib/components/message/message-item.component.d.ts.map +1 -1
  116. package/dist/lib/components/message/message-item.component.js +896 -222
  117. package/dist/lib/components/message/message-item.component.js.map +1 -1
  118. package/dist/lib/components/message/message-list.component.d.ts +288 -29
  119. package/dist/lib/components/message/message-list.component.d.ts.map +1 -1
  120. package/dist/lib/components/message/message-list.component.js +561 -123
  121. package/dist/lib/components/message/message-list.component.js.map +1 -1
  122. package/dist/lib/components/navigation/conversation-navigation.component.d.ts +64 -5
  123. package/dist/lib/components/navigation/conversation-navigation.component.d.ts.map +1 -1
  124. package/dist/lib/components/navigation/conversation-navigation.component.js +101 -11
  125. package/dist/lib/components/navigation/conversation-navigation.component.js.map +1 -1
  126. package/dist/lib/components/notification/activity-indicator.component.d.ts +6 -2
  127. package/dist/lib/components/notification/activity-indicator.component.d.ts.map +1 -1
  128. package/dist/lib/components/notification/activity-indicator.component.js +13 -3
  129. package/dist/lib/components/notification/activity-indicator.component.js.map +1 -1
  130. package/dist/lib/components/notification/notification-badge.component.d.ts +15 -3
  131. package/dist/lib/components/notification/notification-badge.component.d.ts.map +1 -1
  132. package/dist/lib/components/notification/notification-badge.component.js +36 -8
  133. package/dist/lib/components/notification/notification-badge.component.js.map +1 -1
  134. package/dist/lib/components/overlay/chat-overlay.component.d.ts +1 -1
  135. package/dist/lib/components/overlay/chat-overlay.component.js +4 -4
  136. package/dist/lib/components/overlay/chat-overlay.component.js.map +1 -1
  137. package/dist/lib/components/project/project-form-modal.component.d.ts +93 -11
  138. package/dist/lib/components/project/project-form-modal.component.d.ts.map +1 -1
  139. package/dist/lib/components/project/project-form-modal.component.js +348 -87
  140. package/dist/lib/components/project/project-form-modal.component.js.map +1 -1
  141. package/dist/lib/components/project/project-selector.component.d.ts +78 -8
  142. package/dist/lib/components/project/project-selector.component.d.ts.map +1 -1
  143. package/dist/lib/components/project/project-selector.component.js +177 -46
  144. package/dist/lib/components/project/project-selector.component.js.map +1 -1
  145. package/dist/lib/components/realtime/channels/channel-onboarding-panel.component.d.ts +1 -1
  146. package/dist/lib/components/realtime/channels/channel-onboarding-panel.component.d.ts.map +1 -1
  147. package/dist/lib/components/realtime/channels/channel-onboarding-panel.component.js.map +1 -1
  148. package/dist/lib/components/realtime/channels/client-context-channel.d.ts +1 -1
  149. package/dist/lib/components/realtime/channels/client-context-channel.d.ts.map +1 -1
  150. package/dist/lib/components/realtime/channels/client-context-channel.js +1 -1
  151. package/dist/lib/components/realtime/channels/client-context-channel.js.map +1 -1
  152. package/dist/lib/components/realtime/channels/realtime-channel-pane.component.d.ts +1 -1
  153. package/dist/lib/components/realtime/channels/realtime-channel-pane.component.d.ts.map +1 -1
  154. package/dist/lib/components/realtime/channels/realtime-channel-pane.component.js +3 -0
  155. package/dist/lib/components/realtime/channels/realtime-channel-pane.component.js.map +1 -1
  156. package/dist/lib/components/realtime/media/media-channel.d.ts +2 -1
  157. package/dist/lib/components/realtime/media/media-channel.d.ts.map +1 -1
  158. package/dist/lib/components/realtime/media/media-channel.js +1 -1
  159. package/dist/lib/components/realtime/media/media-channel.js.map +1 -1
  160. package/dist/lib/components/realtime/realtime-activity-rail.component.d.ts +2 -2
  161. package/dist/lib/components/realtime/realtime-activity-rail.component.d.ts.map +1 -1
  162. package/dist/lib/components/realtime/realtime-activity-rail.component.js +2 -2
  163. package/dist/lib/components/realtime/realtime-activity-rail.component.js.map +1 -1
  164. package/dist/lib/components/realtime/realtime-agent-banner.component.d.ts +1 -1
  165. package/dist/lib/components/realtime/realtime-agent-banner.component.d.ts.map +1 -1
  166. package/dist/lib/components/realtime/realtime-agent-banner.component.js.map +1 -1
  167. package/dist/lib/components/realtime/realtime-composer.component.d.ts +3 -1
  168. package/dist/lib/components/realtime/realtime-composer.component.d.ts.map +1 -1
  169. package/dist/lib/components/realtime/realtime-composer.component.js +26 -8
  170. package/dist/lib/components/realtime/realtime-composer.component.js.map +1 -1
  171. package/dist/lib/components/realtime/realtime-delegation-card.component.d.ts +2 -2
  172. package/dist/lib/components/realtime/realtime-delegation-card.component.d.ts.map +1 -1
  173. package/dist/lib/components/realtime/realtime-delegation-card.component.js +2 -2
  174. package/dist/lib/components/realtime/realtime-delegation-card.component.js.map +1 -1
  175. package/dist/lib/components/realtime/realtime-session-overlay.component.d.ts +4 -4
  176. package/dist/lib/components/realtime/realtime-session-overlay.component.d.ts.map +1 -1
  177. package/dist/lib/components/realtime/realtime-session-overlay.component.js +19 -19
  178. package/dist/lib/components/realtime/realtime-session-overlay.component.js.map +1 -1
  179. package/dist/lib/components/realtime/realtime-session-state.d.ts +2 -3
  180. package/dist/lib/components/realtime/realtime-session-state.d.ts.map +1 -1
  181. package/dist/lib/components/realtime/realtime-session-state.js +3 -2
  182. package/dist/lib/components/realtime/realtime-session-state.js.map +1 -1
  183. package/dist/lib/components/realtime/realtime-session-thread.component.d.ts +17 -1
  184. package/dist/lib/components/realtime/realtime-session-thread.component.d.ts.map +1 -1
  185. package/dist/lib/components/realtime/realtime-session-thread.component.js +122 -45
  186. package/dist/lib/components/realtime/realtime-session-thread.component.js.map +1 -1
  187. package/dist/lib/components/realtime/realtime-session-timeline-card.component.d.ts +47 -31
  188. package/dist/lib/components/realtime/realtime-session-timeline-card.component.d.ts.map +1 -1
  189. package/dist/lib/components/realtime/realtime-session-timeline-card.component.js +138 -124
  190. package/dist/lib/components/realtime/realtime-session-timeline-card.component.js.map +1 -1
  191. package/dist/lib/components/realtime/realtime-surface-tabs.component.d.ts +4 -4
  192. package/dist/lib/components/realtime/realtime-surface-tabs.component.d.ts.map +1 -1
  193. package/dist/lib/components/realtime/realtime-surface-tabs.component.js +4 -4
  194. package/dist/lib/components/realtime/realtime-surface-tabs.component.js.map +1 -1
  195. package/dist/lib/components/realtime/realtime-surface-tabs.model.d.ts +2 -2
  196. package/dist/lib/components/realtime/realtime-surface-tabs.model.d.ts.map +1 -1
  197. package/dist/lib/components/realtime/realtime-surface-tabs.model.js +3 -3
  198. package/dist/lib/components/realtime/realtime-surface-tabs.model.js.map +1 -1
  199. package/dist/lib/components/realtime/realtime-ui-config.d.ts +13 -11
  200. package/dist/lib/components/realtime/realtime-ui-config.d.ts.map +1 -1
  201. package/dist/lib/components/realtime/realtime-ui-config.js +29 -25
  202. package/dist/lib/components/realtime/realtime-ui-config.js.map +1 -1
  203. package/dist/lib/components/realtime/remote-browser/remote-browser-channel.d.ts +1 -1
  204. package/dist/lib/components/realtime/remote-browser/remote-browser-channel.d.ts.map +1 -1
  205. package/dist/lib/components/realtime/remote-browser/remote-browser-channel.js +1 -1
  206. package/dist/lib/components/realtime/remote-browser/remote-browser-channel.js.map +1 -1
  207. package/dist/lib/components/realtime/whiteboard/whiteboard-channel.d.ts +4 -2
  208. package/dist/lib/components/realtime/whiteboard/whiteboard-channel.d.ts.map +1 -1
  209. package/dist/lib/components/realtime/whiteboard/whiteboard-channel.js +7 -3
  210. package/dist/lib/components/realtime/whiteboard/whiteboard-channel.js.map +1 -1
  211. package/dist/lib/components/search/search-panel.component.d.ts +133 -22
  212. package/dist/lib/components/search/search-panel.component.d.ts.map +1 -1
  213. package/dist/lib/components/search/search-panel.component.js +312 -83
  214. package/dist/lib/components/search/search-panel.component.js.map +1 -1
  215. package/dist/lib/components/share/share-modal.component.d.ts +69 -9
  216. package/dist/lib/components/share/share-modal.component.d.ts.map +1 -1
  217. package/dist/lib/components/share/share-modal.component.js +139 -31
  218. package/dist/lib/components/share/share-modal.component.js.map +1 -1
  219. package/dist/lib/components/shared/user-picker.component.d.ts +48 -8
  220. package/dist/lib/components/shared/user-picker.component.d.ts.map +1 -1
  221. package/dist/lib/components/shared/user-picker.component.js +110 -30
  222. package/dist/lib/components/shared/user-picker.component.js.map +1 -1
  223. package/dist/lib/components/sidebar/conversation-sidebar.component.d.ts +114 -11
  224. package/dist/lib/components/sidebar/conversation-sidebar.component.d.ts.map +1 -1
  225. package/dist/lib/components/sidebar/conversation-sidebar.component.js +199 -21
  226. package/dist/lib/components/sidebar/conversation-sidebar.component.js.map +1 -1
  227. package/dist/lib/components/sidebar/routines-section.component.d.ts +20 -1
  228. package/dist/lib/components/sidebar/routines-section.component.d.ts.map +1 -1
  229. package/dist/lib/components/sidebar/routines-section.component.js +25 -5
  230. package/dist/lib/components/sidebar/routines-section.component.js.map +1 -1
  231. package/dist/lib/components/slots/slot-interfaces.d.ts +19 -0
  232. package/dist/lib/components/slots/slot-interfaces.d.ts.map +1 -1
  233. package/dist/lib/components/slots/slot-interfaces.js.map +1 -1
  234. package/dist/lib/components/task/tasks-full-view.component.d.ts +95 -13
  235. package/dist/lib/components/task/tasks-full-view.component.d.ts.map +1 -1
  236. package/dist/lib/components/task/tasks-full-view.component.js +223 -75
  237. package/dist/lib/components/task/tasks-full-view.component.js.map +1 -1
  238. package/dist/lib/components/tasks/task-widget.component.d.ts +46 -6
  239. package/dist/lib/components/tasks/task-widget.component.d.ts.map +1 -1
  240. package/dist/lib/components/tasks/task-widget.component.js +100 -16
  241. package/dist/lib/components/tasks/task-widget.component.js.map +1 -1
  242. package/dist/lib/components/tasks/tasks-dropdown.component.d.ts +64 -7
  243. package/dist/lib/components/tasks/tasks-dropdown.component.d.ts.map +1 -1
  244. package/dist/lib/components/tasks/tasks-dropdown.component.js +127 -27
  245. package/dist/lib/components/tasks/tasks-dropdown.component.js.map +1 -1
  246. package/dist/lib/components/thread/thread-panel.component.d.ts +66 -8
  247. package/dist/lib/components/thread/thread-panel.component.d.ts.map +1 -1
  248. package/dist/lib/components/thread/thread-panel.component.js +146 -36
  249. package/dist/lib/components/thread/thread-panel.component.js.map +1 -1
  250. package/dist/lib/components/toast/toast.component.d.ts +11 -1
  251. package/dist/lib/components/toast/toast.component.d.ts.map +1 -1
  252. package/dist/lib/components/toast/toast.component.js +25 -5
  253. package/dist/lib/components/toast/toast.component.js.map +1 -1
  254. package/dist/lib/components/workspace/conversation-workspace.component.d.ts +385 -42
  255. package/dist/lib/components/workspace/conversation-workspace.component.d.ts.map +1 -1
  256. package/dist/lib/components/workspace/conversation-workspace.component.js +887 -291
  257. package/dist/lib/components/workspace/conversation-workspace.component.js.map +1 -1
  258. package/dist/lib/composer-plugins/base-conversation-mention.provider.d.ts +8 -0
  259. package/dist/lib/composer-plugins/base-conversation-mention.provider.d.ts.map +1 -1
  260. package/dist/lib/composer-plugins/base-conversation-mention.provider.js +8 -1
  261. package/dist/lib/composer-plugins/base-conversation-mention.provider.js.map +1 -1
  262. package/dist/lib/conversations.module.d.ts.map +1 -1
  263. package/dist/lib/conversations.module.js.map +1 -1
  264. package/dist/lib/directives/chat-slot.directive.d.ts +5 -1
  265. package/dist/lib/directives/chat-slot.directive.d.ts.map +1 -1
  266. package/dist/lib/directives/chat-slot.directive.js.map +1 -1
  267. package/dist/lib/directives/search-shortcut.directive.d.ts +9 -1
  268. package/dist/lib/directives/search-shortcut.directive.d.ts.map +1 -1
  269. package/dist/lib/directives/search-shortcut.directive.js +14 -4
  270. package/dist/lib/directives/search-shortcut.directive.js.map +1 -1
  271. package/dist/lib/events/chat-events.d.ts +34 -7
  272. package/dist/lib/events/chat-events.d.ts.map +1 -1
  273. package/dist/lib/events/chat-events.js +37 -7
  274. package/dist/lib/events/chat-events.js.map +1 -1
  275. package/dist/lib/models/agent-turn.model.d.ts +103 -0
  276. package/dist/lib/models/agent-turn.model.d.ts.map +1 -0
  277. package/dist/lib/models/agent-turn.model.js +12 -0
  278. package/dist/lib/models/agent-turn.model.js.map +1 -0
  279. package/dist/lib/models/collection-view.model.js.map +1 -1
  280. package/dist/lib/models/conversation-state.model.d.ts +8 -0
  281. package/dist/lib/models/conversation-state.model.d.ts.map +1 -1
  282. package/dist/lib/models/conversation-state.model.js.map +1 -1
  283. package/dist/lib/models/lazy-artifact-info.d.ts +44 -12
  284. package/dist/lib/models/lazy-artifact-info.d.ts.map +1 -1
  285. package/dist/lib/models/lazy-artifact-info.js +98 -34
  286. package/dist/lib/models/lazy-artifact-info.js.map +1 -1
  287. package/dist/lib/services/active-tasks.service.d.ts +30 -4
  288. package/dist/lib/services/active-tasks.service.d.ts.map +1 -1
  289. package/dist/lib/services/active-tasks.service.js +71 -19
  290. package/dist/lib/services/active-tasks.service.js.map +1 -1
  291. package/dist/lib/services/agent-state.service.d.ts +17 -1
  292. package/dist/lib/services/agent-state.service.d.ts.map +1 -1
  293. package/dist/lib/services/agent-state.service.js +48 -16
  294. package/dist/lib/services/agent-state.service.js.map +1 -1
  295. package/dist/lib/services/artifact-permission.service.d.ts +39 -0
  296. package/dist/lib/services/artifact-permission.service.d.ts.map +1 -1
  297. package/dist/lib/services/artifact-permission.service.js +152 -17
  298. package/dist/lib/services/artifact-permission.service.js.map +1 -1
  299. package/dist/lib/services/artifact-state.service.d.ts +58 -5
  300. package/dist/lib/services/artifact-state.service.d.ts.map +1 -1
  301. package/dist/lib/services/artifact-state.service.js +135 -35
  302. package/dist/lib/services/artifact-state.service.js.map +1 -1
  303. package/dist/lib/services/browser-realtime-media-host.d.ts +24 -0
  304. package/dist/lib/services/browser-realtime-media-host.d.ts.map +1 -0
  305. package/dist/lib/services/browser-realtime-media-host.js +95 -0
  306. package/dist/lib/services/browser-realtime-media-host.js.map +1 -0
  307. package/dist/lib/services/collection-permission.service.d.ts +28 -0
  308. package/dist/lib/services/collection-permission.service.d.ts.map +1 -1
  309. package/dist/lib/services/collection-permission.service.js +88 -32
  310. package/dist/lib/services/collection-permission.service.js.map +1 -1
  311. package/dist/lib/services/collection-state.service.d.ts +11 -1
  312. package/dist/lib/services/collection-state.service.d.ts.map +1 -1
  313. package/dist/lib/services/collection-state.service.js +25 -5
  314. package/dist/lib/services/collection-state.service.js.map +1 -1
  315. package/dist/lib/services/conversation-agent.service.d.ts +26 -4
  316. package/dist/lib/services/conversation-agent.service.d.ts.map +1 -1
  317. package/dist/lib/services/conversation-agent.service.js +57 -18
  318. package/dist/lib/services/conversation-agent.service.js.map +1 -1
  319. package/dist/lib/services/conversation-attachment.service.d.ts +41 -2
  320. package/dist/lib/services/conversation-attachment.service.d.ts.map +1 -1
  321. package/dist/lib/services/conversation-attachment.service.js +80 -13
  322. package/dist/lib/services/conversation-attachment.service.js.map +1 -1
  323. package/dist/lib/services/conversation-streaming.service.d.ts +22 -0
  324. package/dist/lib/services/conversation-streaming.service.d.ts.map +1 -1
  325. package/dist/lib/services/conversation-streaming.service.js +50 -10
  326. package/dist/lib/services/conversation-streaming.service.js.map +1 -1
  327. package/dist/lib/services/data-cache.service.d.ts +31 -0
  328. package/dist/lib/services/data-cache.service.d.ts.map +1 -1
  329. package/dist/lib/services/data-cache.service.js +71 -15
  330. package/dist/lib/services/data-cache.service.js.map +1 -1
  331. package/dist/lib/services/dialog.service.d.ts +13 -0
  332. package/dist/lib/services/dialog.service.d.ts.map +1 -1
  333. package/dist/lib/services/dialog.service.js +25 -5
  334. package/dist/lib/services/dialog.service.js.map +1 -1
  335. package/dist/lib/services/export.service.d.ts +2 -0
  336. package/dist/lib/services/export.service.d.ts.map +1 -1
  337. package/dist/lib/services/export.service.js +5 -1
  338. package/dist/lib/services/export.service.js.map +1 -1
  339. package/dist/lib/services/graphql-attachment-blob-store.d.ts +44 -0
  340. package/dist/lib/services/graphql-attachment-blob-store.d.ts.map +1 -0
  341. package/dist/lib/services/graphql-attachment-blob-store.js +113 -0
  342. package/dist/lib/services/graphql-attachment-blob-store.js.map +1 -0
  343. package/dist/lib/services/mention-autocomplete.service.d.ts +17 -141
  344. package/dist/lib/services/mention-autocomplete.service.d.ts.map +1 -1
  345. package/dist/lib/services/mention-autocomplete.service.js +15 -460
  346. package/dist/lib/services/mention-autocomplete.service.js.map +1 -1
  347. package/dist/lib/services/mention-parser.service.d.ts +10 -0
  348. package/dist/lib/services/mention-parser.service.d.ts.map +1 -1
  349. package/dist/lib/services/mention-parser.service.js +25 -5
  350. package/dist/lib/services/mention-parser.service.js.map +1 -1
  351. package/dist/lib/services/notification.service.d.ts +54 -6
  352. package/dist/lib/services/notification.service.d.ts.map +1 -1
  353. package/dist/lib/services/notification.service.js +123 -27
  354. package/dist/lib/services/notification.service.js.map +1 -1
  355. package/dist/lib/services/realtime-audio-recorder.d.ts +4 -4
  356. package/dist/lib/services/realtime-audio-recorder.js +12 -12
  357. package/dist/lib/services/realtime-audio-recorder.js.map +1 -1
  358. package/dist/lib/services/realtime-pcm-wav.d.ts +4 -0
  359. package/dist/lib/services/realtime-pcm-wav.d.ts.map +1 -1
  360. package/dist/lib/services/realtime-pcm-wav.js +10 -2
  361. package/dist/lib/services/realtime-pcm-wav.js.map +1 -1
  362. package/dist/lib/services/realtime-session-review.service.d.ts +1 -1
  363. package/dist/lib/services/realtime-session-review.service.d.ts.map +1 -1
  364. package/dist/lib/services/realtime-session-review.service.js +1 -1
  365. package/dist/lib/services/realtime-session-review.service.js.map +1 -1
  366. package/dist/lib/services/realtime-session.service.d.ts +16 -1150
  367. package/dist/lib/services/realtime-session.service.d.ts.map +1 -1
  368. package/dist/lib/services/realtime-session.service.js +28 -2430
  369. package/dist/lib/services/realtime-session.service.js.map +1 -1
  370. package/dist/lib/services/search.service.d.ts +42 -9
  371. package/dist/lib/services/search.service.d.ts.map +1 -1
  372. package/dist/lib/services/search.service.js +103 -23
  373. package/dist/lib/services/search.service.js.map +1 -1
  374. package/dist/lib/services/toast.service.d.ts +19 -1
  375. package/dist/lib/services/toast.service.d.ts.map +1 -1
  376. package/dist/lib/services/toast.service.js +45 -9
  377. package/dist/lib/services/toast.service.js.map +1 -1
  378. package/dist/lib/services/ui-command-handler.service.d.ts +16 -2
  379. package/dist/lib/services/ui-command-handler.service.d.ts.map +1 -1
  380. package/dist/lib/services/ui-command-handler.service.js +36 -8
  381. package/dist/lib/services/ui-command-handler.service.js.map +1 -1
  382. package/dist/lib/utils/agent-artifact-summary.d.ts +2 -2
  383. package/dist/lib/utils/agent-artifact-summary.js +3 -3
  384. package/dist/lib/utils/agent-artifact-summary.js.map +1 -1
  385. package/dist/lib/utils/agent-turn-routing.d.ts +69 -0
  386. package/dist/lib/utils/agent-turn-routing.d.ts.map +1 -0
  387. package/dist/lib/utils/agent-turn-routing.js +96 -0
  388. package/dist/lib/utils/agent-turn-routing.js.map +1 -0
  389. package/dist/lib/utils/artifact-panel-action.d.ts +15 -4
  390. package/dist/lib/utils/artifact-panel-action.d.ts.map +1 -1
  391. package/dist/lib/utils/artifact-panel-action.js +10 -2
  392. package/dist/lib/utils/artifact-panel-action.js.map +1 -1
  393. package/dist/lib/utils/distinct-artifacts.d.ts +2 -0
  394. package/dist/lib/utils/distinct-artifacts.d.ts.map +1 -1
  395. package/dist/lib/utils/distinct-artifacts.js +5 -1
  396. package/dist/lib/utils/distinct-artifacts.js.map +1 -1
  397. package/dist/lib/utils/plan-mode-preference.d.ts +2 -2
  398. package/dist/lib/utils/plan-mode-preference.js +6 -6
  399. package/dist/lib/utils/plan-mode-preference.js.map +1 -1
  400. package/dist/lib/utils/realtime-session-timeline.d.ts +8 -79
  401. package/dist/lib/utils/realtime-session-timeline.d.ts.map +1 -1
  402. package/dist/lib/utils/realtime-session-timeline.js +8 -89
  403. package/dist/lib/utils/realtime-session-timeline.js.map +1 -1
  404. package/dist/public-api.d.ts +5 -2
  405. package/dist/public-api.d.ts.map +1 -1
  406. package/dist/public-api.js +9 -2
  407. package/dist/public-api.js.map +1 -1
  408. package/package.json +33 -32
  409. package/dist/lib/components/realtime/channels/base-realtime-channel-client.d.ts +0 -384
  410. package/dist/lib/components/realtime/channels/base-realtime-channel-client.d.ts.map +0 -1
  411. package/dist/lib/components/realtime/channels/base-realtime-channel-client.js +0 -231
  412. package/dist/lib/components/realtime/channels/base-realtime-channel-client.js.map +0 -1
  413. package/dist/lib/services/delegation-result-parser.d.ts +0 -50
  414. package/dist/lib/services/delegation-result-parser.d.ts.map +0 -1
  415. package/dist/lib/services/delegation-result-parser.js +0 -60
  416. package/dist/lib/services/delegation-result-parser.js.map +0 -1
  417. package/dist/lib/services/narration-template.d.ts +0 -42
  418. package/dist/lib/services/narration-template.d.ts.map +0 -1
  419. package/dist/lib/services/narration-template.js +0 -73
  420. package/dist/lib/services/narration-template.js.map +0 -1
  421. package/dist/lib/services/skill-picker-narrowing.d.ts +0 -13
  422. package/dist/lib/services/skill-picker-narrowing.d.ts.map +0 -1
  423. package/dist/lib/services/skill-picker-narrowing.js +0 -13
  424. package/dist/lib/services/skill-picker-narrowing.js.map +0 -1
@@ -1,8 +1,10 @@
1
1
  import { Component, EventEmitter, Input, Output, ViewChild, ChangeDetectorRef, inject } from '@angular/core';
2
2
  import { CommonModule } from '@angular/common';
3
+ import { MarkdownModule } from '@memberjunction/ng-markdown';
3
4
  import { RealtimeDelegationCardComponent } from './realtime-delegation-card.component';
4
5
  import * as i0 from "@angular/core";
5
- import * as i1 from "@angular/common";
6
+ import * as i1 from "@memberjunction/ng-markdown";
7
+ import * as i2 from "@angular/common";
6
8
  const _c0 = ["scrollAnchor"];
7
9
  function RealtimeSessionThreadComponent_For_2_Case_0_Conditional_0_Conditional_5_Template(rf, ctx) { if (rf & 1) {
8
10
  i0.ɵɵelementStart(0, "span", 10);
@@ -15,13 +17,32 @@ function RealtimeSessionThreadComponent_For_2_Case_0_Conditional_0_Conditional_5
15
17
  } }
16
18
  function RealtimeSessionThreadComponent_For_2_Case_0_Conditional_0_Conditional_6_Template(rf, ctx) { if (rf & 1) {
17
19
  i0.ɵɵtext(0);
18
- i0.ɵɵelementStart(1, "span", 12);
20
+ i0.ɵɵelementStart(1, "span", 15);
19
21
  i0.ɵɵtext(2, "\u00B7 voice");
20
22
  i0.ɵɵelementEnd();
21
23
  } if (rf & 2) {
22
24
  const ctx_r0 = i0.ɵɵnextContext(4);
23
25
  i0.ɵɵtextInterpolate1(" ", ctx_r0.AgentName, " ");
24
26
  } }
27
+ function RealtimeSessionThreadComponent_For_2_Case_0_Conditional_0_Conditional_10_Template(rf, ctx) { if (rf & 1) {
28
+ const _r2 = i0.ɵɵgetCurrentView();
29
+ i0.ɵɵelementStart(0, "div", 14)(1, "button", 16);
30
+ i0.ɵɵlistener("click", function RealtimeSessionThreadComponent_For_2_Case_0_Conditional_0_Conditional_10_Template_button_click_1_listener($event) { i0.ɵɵrestoreView(_r2); const $index_r3 = i0.ɵɵnextContext(3).$index; const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.ToggleExpanded($index_r3, $event)); });
31
+ i0.ɵɵelementStart(2, "span");
32
+ i0.ɵɵtext(3);
33
+ i0.ɵɵelementEnd();
34
+ i0.ɵɵelement(4, "i", 17);
35
+ i0.ɵɵelementEnd()();
36
+ } if (rf & 2) {
37
+ const $index_r3 = i0.ɵɵnextContext(3).$index;
38
+ const ctx_r0 = i0.ɵɵnextContext();
39
+ i0.ɵɵadvance();
40
+ i0.ɵɵattribute("aria-expanded", ctx_r0.IsExpanded($index_r3));
41
+ i0.ɵɵadvance(2);
42
+ i0.ɵɵtextInterpolate(ctx_r0.IsExpanded($index_r3) ? "Show less" : "Show more");
43
+ i0.ɵɵadvance();
44
+ i0.ɵɵclassProp("fa-chevron-up", ctx_r0.IsExpanded($index_r3))("fa-chevron-down", !ctx_r0.IsExpanded($index_r3));
45
+ } }
25
46
  function RealtimeSessionThreadComponent_For_2_Case_0_Conditional_0_Template(rf, ctx) { if (rf & 1) {
26
47
  i0.ɵɵelementStart(0, "div", 6)(1, "div", 7);
27
48
  i0.ɵɵtext(2);
@@ -29,70 +50,80 @@ function RealtimeSessionThreadComponent_For_2_Case_0_Conditional_0_Template(rf,
29
50
  i0.ɵɵelementStart(3, "div", 8)(4, "div", 9);
30
51
  i0.ɵɵconditionalCreate(5, RealtimeSessionThreadComponent_For_2_Case_0_Conditional_0_Conditional_5_Template, 2, 1, "span", 10)(6, RealtimeSessionThreadComponent_For_2_Case_0_Conditional_0_Conditional_6_Template, 3, 1);
31
52
  i0.ɵɵelementEnd();
32
- i0.ɵɵelementStart(7, "div", 11);
33
- i0.ɵɵtext(8);
53
+ i0.ɵɵelementStart(7, "div", 11)(8, "div", 12);
54
+ i0.ɵɵelement(9, "mj-markdown", 13);
55
+ i0.ɵɵelementEnd();
56
+ i0.ɵɵconditionalCreate(10, RealtimeSessionThreadComponent_For_2_Case_0_Conditional_0_Conditional_10_Template, 5, 6, "div", 14);
34
57
  i0.ɵɵelementEnd()()();
35
58
  } if (rf & 2) {
36
- const item_r2 = i0.ɵɵnextContext(2).$implicit;
59
+ const ctx_r3 = i0.ɵɵnextContext(2);
60
+ const item_r5 = ctx_r3.$implicit;
61
+ const $index_r3 = ctx_r3.$index;
37
62
  const ctx_r0 = i0.ɵɵnextContext();
38
- i0.ɵɵclassProp("turn--user", item_r2.Role === "User")("turn--agent", item_r2.Role === "Assistant");
63
+ i0.ɵɵclassProp("turn--user", item_r5.Role === "User")("turn--agent", item_r5.Role === "Assistant");
39
64
  i0.ɵɵadvance(2);
40
- i0.ɵɵtextInterpolate((item_r2.Role === "User" ? ctx_r0.UserName : ctx_r0.AgentName).charAt(0).toUpperCase());
41
- i0.ɵɵadvance(3);
42
- i0.ɵɵconditional(item_r2.Role === "User" ? 5 : 6);
65
+ i0.ɵɵtextInterpolate((item_r5.Role === "User" ? ctx_r0.UserName : ctx_r0.AgentName).charAt(0).toUpperCase());
43
66
  i0.ɵɵadvance(3);
44
- i0.ɵɵtextInterpolate(item_r2.Text);
67
+ i0.ɵɵconditional(item_r5.Role === "User" ? 5 : 6);
68
+ i0.ɵɵadvance(2);
69
+ i0.ɵɵclassProp("bubble--clamped", ctx_r0.IsLongText(item_r5.Text) && !ctx_r0.IsExpanded($index_r3))("bubble--expanded", ctx_r0.IsLongText(item_r5.Text) && ctx_r0.IsExpanded($index_r3));
70
+ i0.ɵɵadvance();
71
+ i0.ɵɵclassProp("bubble-content--clamped", ctx_r0.IsLongText(item_r5.Text) && !ctx_r0.IsExpanded($index_r3))("bubble-content--expanded", ctx_r0.IsLongText(item_r5.Text) && ctx_r0.IsExpanded($index_r3));
72
+ i0.ɵɵadvance();
73
+ i0.ɵɵproperty("data", ctx_r0.FormatMarkdownText(item_r5.Text))("enableCollapsibleHeadings", true);
74
+ i0.ɵɵadvance();
75
+ i0.ɵɵconditional(ctx_r0.IsLongText(item_r5.Text) ? 10 : -1);
45
76
  } }
46
77
  function RealtimeSessionThreadComponent_For_2_Case_0_Template(rf, ctx) { if (rf & 1) {
47
- i0.ɵɵconditionalCreate(0, RealtimeSessionThreadComponent_For_2_Case_0_Conditional_0_Template, 9, 7, "div", 5);
78
+ i0.ɵɵconditionalCreate(0, RealtimeSessionThreadComponent_For_2_Case_0_Conditional_0_Template, 11, 17, "div", 5);
48
79
  } if (rf & 2) {
49
80
  const ctx_r0 = i0.ɵɵnextContext(2);
50
81
  i0.ɵɵconditional(ctx_r0.ShowCaptions ? 0 : -1);
51
82
  } }
52
83
  function RealtimeSessionThreadComponent_For_2_Case_1_Conditional_5_Template(rf, ctx) { if (rf & 1) {
53
- i0.ɵɵelementStart(0, "span", 16);
84
+ i0.ɵɵelementStart(0, "span", 21);
54
85
  i0.ɵɵtext(1);
55
86
  i0.ɵɵpipe(2, "date");
56
87
  i0.ɵɵelementEnd();
57
88
  } if (rf & 2) {
58
- const item_r2 = i0.ɵɵnextContext(2).$implicit;
89
+ const item_r5 = i0.ɵɵnextContext(2).$implicit;
59
90
  i0.ɵɵadvance();
60
- i0.ɵɵtextInterpolate1("\u00B7 ", i0.ɵɵpipeBind2(2, 1, item_r2.At, "MMM d, h:mm a"));
91
+ i0.ɵɵtextInterpolate1("\u00B7 ", i0.ɵɵpipeBind2(2, 1, item_r5.At, "MMM d, h:mm a"));
61
92
  } }
62
93
  function RealtimeSessionThreadComponent_For_2_Case_1_Conditional_6_Template(rf, ctx) { if (rf & 1) {
63
- i0.ɵɵelementStart(0, "span", 17);
94
+ i0.ɵɵelementStart(0, "span", 22);
64
95
  i0.ɵɵtext(1);
65
96
  i0.ɵɵelementEnd();
66
97
  } if (rf & 2) {
67
- const item_r2 = i0.ɵɵnextContext(2).$implicit;
98
+ const item_r5 = i0.ɵɵnextContext(2).$implicit;
68
99
  i0.ɵɵadvance();
69
- i0.ɵɵtextInterpolate(item_r2.CloseReason);
100
+ i0.ɵɵtextInterpolate(item_r5.CloseReason);
70
101
  } }
71
102
  function RealtimeSessionThreadComponent_For_2_Case_1_Template(rf, ctx) { if (rf & 1) {
72
103
  i0.ɵɵelementStart(0, "div", 3);
73
- i0.ɵɵelement(1, "span", 13);
74
- i0.ɵɵelementStart(2, "span", 14);
75
- i0.ɵɵelement(3, "i", 15);
104
+ i0.ɵɵelement(1, "span", 18);
105
+ i0.ɵɵelementStart(2, "span", 19);
106
+ i0.ɵɵelement(3, "i", 20);
76
107
  i0.ɵɵtext(4);
77
- i0.ɵɵconditionalCreate(5, RealtimeSessionThreadComponent_For_2_Case_1_Conditional_5_Template, 3, 4, "span", 16);
108
+ i0.ɵɵconditionalCreate(5, RealtimeSessionThreadComponent_For_2_Case_1_Conditional_5_Template, 3, 4, "span", 21);
78
109
  i0.ɵɵelementEnd();
79
- i0.ɵɵconditionalCreate(6, RealtimeSessionThreadComponent_For_2_Case_1_Conditional_6_Template, 2, 1, "span", 17);
80
- i0.ɵɵelement(7, "span", 13);
110
+ i0.ɵɵconditionalCreate(6, RealtimeSessionThreadComponent_For_2_Case_1_Conditional_6_Template, 2, 1, "span", 22);
111
+ i0.ɵɵelement(7, "span", 18);
81
112
  i0.ɵɵelementEnd();
82
113
  } if (rf & 2) {
83
- const item_r2 = i0.ɵɵnextContext().$implicit;
114
+ const item_r5 = i0.ɵɵnextContext().$implicit;
84
115
  i0.ɵɵadvance(3);
85
- i0.ɵɵclassMap(item_r2.Icon);
116
+ i0.ɵɵclassMap(item_r5.Icon);
86
117
  i0.ɵɵadvance();
87
- i0.ɵɵtextInterpolate1(" ", item_r2.Label, " ");
118
+ i0.ɵɵtextInterpolate1(" ", item_r5.Label, " ");
88
119
  i0.ɵɵadvance();
89
- i0.ɵɵconditional(item_r2.At ? 5 : -1);
120
+ i0.ɵɵconditional(item_r5.At ? 5 : -1);
90
121
  i0.ɵɵadvance();
91
- i0.ɵɵconditional(item_r2.CloseReason ? 6 : -1);
122
+ i0.ɵɵconditional(item_r5.CloseReason ? 6 : -1);
92
123
  } }
93
124
  function RealtimeSessionThreadComponent_For_2_Case_2_Conditional_2_Template(rf, ctx) { if (rf & 1) {
94
- i0.ɵɵelementStart(0, "div", 19);
95
- i0.ɵɵelement(1, "i", 20);
125
+ i0.ɵɵelementStart(0, "div", 24);
126
+ i0.ɵɵelement(1, "i", 25);
96
127
  i0.ɵɵtext(2);
97
128
  i0.ɵɵelementEnd();
98
129
  } if (rf & 2) {
@@ -101,26 +132,26 @@ function RealtimeSessionThreadComponent_For_2_Case_2_Conditional_2_Template(rf,
101
132
  i0.ɵɵtextInterpolate1(" ", ctx_r0.State.Narration, " ");
102
133
  } }
103
134
  function RealtimeSessionThreadComponent_For_2_Case_2_Template(rf, ctx) { if (rf & 1) {
104
- const _r3 = i0.ɵɵgetCurrentView();
105
- i0.ɵɵelementStart(0, "div", 4)(1, "mj-realtime-delegation-card", 18);
106
- i0.ɵɵlistener("OpenRunRequested", function RealtimeSessionThreadComponent_For_2_Case_2_Template_mj_realtime_delegation_card_OpenRunRequested_1_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.OpenRunRequested.emit($event)); })("OpenArtifactRequested", function RealtimeSessionThreadComponent_For_2_Case_2_Template_mj_realtime_delegation_card_OpenArtifactRequested_1_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.OpenArtifactRequested.emit($event)); })("CancelRequested", function RealtimeSessionThreadComponent_For_2_Case_2_Template_mj_realtime_delegation_card_CancelRequested_1_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.CancelRequested.emit($event)); });
135
+ const _r6 = i0.ɵɵgetCurrentView();
136
+ i0.ɵɵelementStart(0, "div", 4)(1, "mj-realtime-delegation-card", 23);
137
+ i0.ɵɵlistener("OpenRunRequested", function RealtimeSessionThreadComponent_For_2_Case_2_Template_mj_realtime_delegation_card_OpenRunRequested_1_listener($event) { i0.ɵɵrestoreView(_r6); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.OpenRunRequested.emit($event)); })("OpenArtifactRequested", function RealtimeSessionThreadComponent_For_2_Case_2_Template_mj_realtime_delegation_card_OpenArtifactRequested_1_listener($event) { i0.ɵɵrestoreView(_r6); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.OpenArtifactRequested.emit($event)); })("CancelRequested", function RealtimeSessionThreadComponent_For_2_Case_2_Template_mj_realtime_delegation_card_CancelRequested_1_listener($event) { i0.ɵɵrestoreView(_r6); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.CancelRequested.emit($event)); });
107
138
  i0.ɵɵelementEnd();
108
- i0.ɵɵconditionalCreate(2, RealtimeSessionThreadComponent_For_2_Case_2_Conditional_2_Template, 3, 1, "div", 19);
139
+ i0.ɵɵconditionalCreate(2, RealtimeSessionThreadComponent_For_2_Case_2_Conditional_2_Template, 3, 1, "div", 24);
109
140
  i0.ɵɵelementEnd();
110
141
  } if (rf & 2) {
111
- const item_r2 = i0.ɵɵnextContext().$implicit;
142
+ const item_r5 = i0.ɵɵnextContext().$implicit;
112
143
  const ctx_r0 = i0.ɵɵnextContext();
113
144
  i0.ɵɵadvance();
114
- i0.ɵɵproperty("Card", item_r2.Card)("DevMode", ctx_r0.DevMode);
145
+ i0.ɵɵproperty("Card", item_r5.Card)("DevMode", ctx_r0.DevMode);
115
146
  i0.ɵɵadvance();
116
- i0.ɵɵconditional(ctx_r0.ShowsLiveNote(item_r2) ? 2 : -1);
147
+ i0.ɵɵconditional(ctx_r0.ShowsLiveNote(item_r5) ? 2 : -1);
117
148
  } }
118
149
  function RealtimeSessionThreadComponent_For_2_Template(rf, ctx) { if (rf & 1) {
119
150
  i0.ɵɵconditionalCreate(0, RealtimeSessionThreadComponent_For_2_Case_0_Template, 1, 1)(1, RealtimeSessionThreadComponent_For_2_Case_1_Template, 8, 5, "div", 3)(2, RealtimeSessionThreadComponent_For_2_Case_2_Template, 3, 3, "div", 4);
120
151
  } if (rf & 2) {
121
152
  let tmp_11_0;
122
- const item_r2 = ctx.$implicit;
123
- i0.ɵɵconditional((tmp_11_0 = item_r2.Kind) === "caption" ? 0 : tmp_11_0 === "divider" ? 1 : tmp_11_0 === "delegation" ? 2 : -1);
153
+ const item_r5 = ctx.$implicit;
154
+ i0.ɵɵconditional((tmp_11_0 = item_r5.Kind) === "caption" ? 0 : tmp_11_0 === "divider" ? 1 : tmp_11_0 === "delegation" ? 2 : -1);
124
155
  } }
125
156
  function RealtimeSessionThreadComponent_ForEmpty_3_Template(rf, ctx) { if (rf & 1) {
126
157
  i0.ɵɵelementStart(0, "div", 2);
@@ -165,7 +196,7 @@ export class RealtimeSessionThreadComponent {
165
196
  /** Drives auto-scroll: set whenever the list grows. */
166
197
  pendingScroll = false;
167
198
  changedSub;
168
- cdr = inject(ChangeDetectorRef);
199
+ cdr = inject(ChangeDetectorRef, { optional: true });
169
200
  ngOnInit() {
170
201
  this.changedSub = this.State.Changed$.subscribe(() => this.onStateChanged());
171
202
  this.lastItemCount = this.State.Items.length;
@@ -194,13 +225,59 @@ export class RealtimeSessionThreadComponent {
194
225
  && this.State.Narration !== null
195
226
  && item.Card.CallID === this.State.ActiveCallId;
196
227
  }
228
+ /** Set of item indices whose long text has been expanded by the user. */
229
+ ExpandedItems = new Set();
230
+ /**
231
+ * Returns true when the caption text is considered a "long blob" (>280 chars or >4 lines)
232
+ * that warrants height clamping and an expand/collapse toggle.
233
+ */
234
+ IsLongText(text) {
235
+ if (!text) {
236
+ return false;
237
+ }
238
+ return text.length > 280 || text.split('\n').length > 4;
239
+ }
240
+ /** Returns whether the caption item at the specified index is expanded. */
241
+ IsExpanded(index) {
242
+ return this.ExpandedItems.has(index);
243
+ }
244
+ /** Toggles expanded/collapsed state for the caption item at the given index. */
245
+ ToggleExpanded(index, event) {
246
+ if (event) {
247
+ event.stopPropagation();
248
+ }
249
+ if (this.ExpandedItems.has(index)) {
250
+ this.ExpandedItems.delete(index);
251
+ }
252
+ else {
253
+ this.ExpandedItems.add(index);
254
+ }
255
+ this.cdr?.markForCheck();
256
+ }
257
+ /**
258
+ * Prepares text for markdown rendering, restoring structure (headings, horizontal rules,
259
+ * bullet items) if newlines were stripped by single-line input paste or speech-to-text.
260
+ */
261
+ FormatMarkdownText(text) {
262
+ if (!text) {
263
+ return '';
264
+ }
265
+ let cleaned = text;
266
+ // Restore newlines before markdown headings on same line: "Title ### Heading" -> "Title\n\n### Heading"
267
+ cleaned = cleaned.replace(/[ \t]+(?:—\s*)?(#{1,6}[ \t]+)/g, '\n\n$1');
268
+ // Restore newlines around horizontal rules on same line: "Text --- ##" -> "Text\n\n---\n\n##"
269
+ cleaned = cleaned.replace(/[ \t]+(?:—\s*)?(---|___|\*\*\*)[ \t]*/g, '\n\n$1\n\n');
270
+ // Restore newlines before bullet items on same line: "around: - Item 1 - Item 2" -> "around:\n- Item 1\n- Item 2"
271
+ cleaned = cleaned.replace(/[ \t]+-[ \t]+(?=[A-Za-z0-9\*])/g, '\n- ');
272
+ return cleaned;
273
+ }
197
274
  /** Marks for check on every state change; auto-scrolls when the thread grew. */
198
275
  onStateChanged() {
199
276
  if (this.State.Items.length > this.lastItemCount) {
200
277
  this.pendingScroll = true;
201
278
  }
202
279
  this.lastItemCount = this.State.Items.length;
203
- this.cdr.markForCheck();
280
+ this.cdr?.markForCheck();
204
281
  }
205
282
  static ɵfac = function RealtimeSessionThreadComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || RealtimeSessionThreadComponent)(); };
206
283
  static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: RealtimeSessionThreadComponent, selectors: [["mj-realtime-session-thread"]], viewQuery: function RealtimeSessionThreadComponent_Query(rf, ctx) { if (rf & 1) {
@@ -208,7 +285,7 @@ export class RealtimeSessionThreadComponent {
208
285
  } if (rf & 2) {
209
286
  let _t;
210
287
  i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.scrollAnchor = _t.first);
211
- } }, inputs: { AgentName: "AgentName", UserName: "UserName", State: "State", ShowCaptions: "ShowCaptions", DevMode: "DevMode" }, outputs: { OpenRunRequested: "OpenRunRequested", OpenArtifactRequested: "OpenArtifactRequested", CancelRequested: "CancelRequested" }, decls: 6, vars: 1, consts: [["scrollAnchor", ""], [1, "thread"], [1, "thread-empty"], ["role", "separator", 1, "thread-divider"], [1, "delegation-block"], [1, "turn", 3, "turn--user", "turn--agent"], [1, "turn"], [1, "turn-avatar"], [1, "turn-body"], [1, "turn-meta"], [1, "typed-tag"], [1, "bubble"], [1, "muted"], ["aria-hidden", "true", 1, "thread-divider__line"], [1, "thread-divider__label"], ["aria-hidden", "true"], [1, "thread-divider__time"], ["title", "Why the previous session leg ended", 1, "thread-divider__chip"], [3, "OpenRunRequested", "OpenArtifactRequested", "CancelRequested", "Card", "DevMode"], ["role", "status", "aria-live", "polite", 1, "live-note"], ["aria-hidden", "true", 1, "fa-solid", "fa-comment-dots"]], template: function RealtimeSessionThreadComponent_Template(rf, ctx) { if (rf & 1) {
288
+ } }, inputs: { AgentName: "AgentName", UserName: "UserName", State: "State", ShowCaptions: "ShowCaptions", DevMode: "DevMode" }, outputs: { OpenRunRequested: "OpenRunRequested", OpenArtifactRequested: "OpenArtifactRequested", CancelRequested: "CancelRequested" }, decls: 6, vars: 1, consts: [["scrollAnchor", ""], [1, "thread"], [1, "thread-empty"], ["role", "separator", 1, "thread-divider"], [1, "delegation-block"], [1, "turn", 3, "turn--user", "turn--agent"], [1, "turn"], [1, "turn-avatar"], [1, "turn-body"], [1, "turn-meta"], [1, "typed-tag"], [1, "bubble"], [1, "bubble-content"], [3, "data", "enableCollapsibleHeadings"], [1, "bubble-actions"], [1, "muted"], ["type", "button", 1, "bubble-expand-btn", 3, "click"], ["aria-hidden", "true", 1, "fa-solid"], ["aria-hidden", "true", 1, "thread-divider__line"], [1, "thread-divider__label"], ["aria-hidden", "true"], [1, "thread-divider__time"], ["title", "Why the previous session leg ended", 1, "thread-divider__chip"], [3, "OpenRunRequested", "OpenArtifactRequested", "CancelRequested", "Card", "DevMode"], ["role", "status", "aria-live", "polite", 1, "live-note"], ["aria-hidden", "true", 1, "fa-solid", "fa-comment-dots"]], template: function RealtimeSessionThreadComponent_Template(rf, ctx) { if (rf & 1) {
212
289
  i0.ɵɵelementStart(0, "div", 1);
213
290
  i0.ɵɵrepeaterCreate(1, RealtimeSessionThreadComponent_For_2_Template, 3, 1, null, null, ctx.TrackItem, true, RealtimeSessionThreadComponent_ForEmpty_3_Template, 2, 0, "div", 2);
214
291
  i0.ɵɵelement(4, "div", null, 0);
@@ -216,11 +293,11 @@ export class RealtimeSessionThreadComponent {
216
293
  } if (rf & 2) {
217
294
  i0.ɵɵadvance();
218
295
  i0.ɵɵrepeater(ctx.State.Items);
219
- } }, dependencies: [CommonModule, RealtimeDelegationCardComponent, i1.DatePipe], styles: ["[_nghost-%COMP%] {\n display: block;\n}\n\n.thread[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n\n.thread-empty[_ngcontent-%COMP%] {\n text-align: center;\n font-size: 12.5px;\n color: var(--mj-text-disabled);\n padding: 24px 0;\n}\n\n\n.turn[_ngcontent-%COMP%] {\n display: flex;\n gap: 10px;\n max-width: 100%;\n}\n.turn--user[_ngcontent-%COMP%] {\n flex-direction: row-reverse;\n}\n.turn-body[_ngcontent-%COMP%] {\n min-width: 0;\n}\n.turn-avatar[_ngcontent-%COMP%] {\n width: 26px;\n height: 26px;\n border-radius: 50%;\n display: grid;\n place-items: center;\n flex-shrink: 0;\n font-size: 11px;\n font-weight: 700;\n margin-top: 2px;\n}\n.turn--agent[_ngcontent-%COMP%] .turn-avatar[_ngcontent-%COMP%] {\n background: linear-gradient(135deg, var(--mj-brand-primary), var(--mj-brand-accent, var(--mj-brand-primary)));\n color: var(--mj-text-inverse, #fff);\n}\n.turn--user[_ngcontent-%COMP%] .turn-avatar[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-elevated);\n color: var(--mj-text-secondary);\n border: 1px solid var(--mj-border-strong);\n}\n.bubble[_ngcontent-%COMP%] {\n padding: 8px 12px;\n border-radius: 12px;\n max-width: 560px;\n font-size: 13.5px;\n line-height: 1.5;\n position: relative;\n}\n.turn--agent[_ngcontent-%COMP%] .bubble[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-top-left-radius: 4px;\n color: var(--mj-text-primary);\n}\n.turn--user[_ngcontent-%COMP%] .bubble[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse, #fff);\n border-top-right-radius: 4px;\n}\n.turn-meta[_ngcontent-%COMP%] {\n font-size: 10.5px;\n color: var(--mj-text-muted);\n margin-bottom: 3px;\n display: flex;\n align-items: center;\n gap: 6px;\n font-weight: 600;\n}\n.turn--user[_ngcontent-%COMP%] .turn-meta[_ngcontent-%COMP%] {\n justify-content: flex-end;\n}\n.muted[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n}\n.typed-tag[_ngcontent-%COMP%] {\n font-size: 9.5px;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n color: var(--mj-text-muted);\n border: 1px solid var(--mj-border-strong);\n border-radius: 4px;\n padding: 1px 5px;\n}\n\n\n.delegation-block[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n.live-note[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: 7px;\n margin-left: 22px;\n max-width: 520px;\n font-size: 12px;\n font-style: italic;\n color: var(--mj-text-muted);\n animation: _ngcontent-%COMP%_live-note-in 220ms ease;\n}\n.live-note[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 10px;\n margin-top: 3px;\n flex-shrink: 0;\n}\n@keyframes _ngcontent-%COMP%_live-note-in {\n from { opacity: 0; transform: translateY(2px); }\n to { opacity: 1; transform: translateY(0); }\n}\n\n\n.thread-divider[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n margin: 10px 0 6px;\n user-select: none;\n}\n.thread-divider__line[_ngcontent-%COMP%] {\n flex: 1;\n height: 1px;\n background: var(--mj-border-subtle);\n}\n.thread-divider__label[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n font-size: 11px;\n font-weight: 600;\n letter-spacing: 0.02em;\n color: var(--mj-text-muted);\n white-space: nowrap;\n}\n.thread-divider__label[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 10px;\n}\n.thread-divider__time[_ngcontent-%COMP%] {\n font-weight: 400;\n}\n.thread-divider__chip[_ngcontent-%COMP%] {\n font-size: 9.5px;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n color: var(--mj-text-muted);\n border: 1px solid var(--mj-border-default);\n border-radius: 999px;\n padding: 1px 7px;\n background: var(--mj-bg-surface-card);\n white-space: nowrap;\n}"] });
296
+ } }, dependencies: [CommonModule, RealtimeDelegationCardComponent, MarkdownModule, i1.MarkdownComponent, i2.DatePipe], styles: ["[_nghost-%COMP%] {\n display: block;\n}\n\n.thread[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n\n.thread-empty[_ngcontent-%COMP%] {\n text-align: center;\n font-size: 12.5px;\n color: var(--mj-text-disabled);\n padding: 24px 0;\n}\n\n\n.turn[_ngcontent-%COMP%] {\n display: flex;\n gap: 10px;\n max-width: 100%;\n}\n.turn--user[_ngcontent-%COMP%] {\n flex-direction: row-reverse;\n}\n.turn-body[_ngcontent-%COMP%] {\n min-width: 0;\n}\n.turn-avatar[_ngcontent-%COMP%] {\n width: 26px;\n height: 26px;\n border-radius: 50%;\n display: grid;\n place-items: center;\n flex-shrink: 0;\n font-size: 11px;\n font-weight: 700;\n margin-top: 2px;\n}\n.turn--agent[_ngcontent-%COMP%] .turn-avatar[_ngcontent-%COMP%] {\n background: linear-gradient(135deg, var(--mj-brand-primary), var(--mj-brand-accent, var(--mj-brand-primary)));\n color: var(--mj-text-inverse, #fff);\n}\n.turn--user[_ngcontent-%COMP%] .turn-avatar[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-elevated);\n color: var(--mj-text-secondary);\n border: 1px solid var(--mj-border-strong);\n}\n.bubble[_ngcontent-%COMP%] {\n padding: 8px 12px;\n border-radius: 12px;\n max-width: 560px;\n font-size: 13.5px;\n line-height: 1.5;\n position: relative;\n}\n.turn--agent[_ngcontent-%COMP%] .bubble[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-top-left-radius: 4px;\n color: var(--mj-text-primary);\n}\n.turn--user[_ngcontent-%COMP%] .bubble[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse, #fff);\n border-top-right-radius: 4px;\n}\n\n\n.bubble-content[_ngcontent-%COMP%] {\n position: relative;\n word-break: break-word;\n}\n\n.bubble-content--clamped[_ngcontent-%COMP%] {\n max-height: 120px;\n overflow: hidden;\n -webkit-mask-image: linear-gradient(to bottom, rgba(0, 0, 0, 1) 60%, rgba(0, 0, 0, 0) 100%);\n mask-image: linear-gradient(to bottom, rgba(0, 0, 0, 1) 60%, rgba(0, 0, 0, 0) 100%);\n}\n\n.bubble-content--expanded[_ngcontent-%COMP%] {\n max-height: 440px;\n overflow-y: auto;\n scrollbar-width: thin;\n scrollbar-color: rgba(255, 255, 255, 0.4) transparent;\n}\n.turn--agent[_ngcontent-%COMP%] .bubble-content--expanded[_ngcontent-%COMP%] {\n scrollbar-color: var(--mj-border-strong) transparent;\n}\n.bubble-content--expanded[_ngcontent-%COMP%]::-webkit-scrollbar {\n width: 5px;\n}\n.bubble-content--expanded[_ngcontent-%COMP%]::-webkit-scrollbar-thumb {\n background: rgba(255, 255, 255, 0.35);\n border-radius: 3px;\n}\n.turn--agent[_ngcontent-%COMP%] .bubble-content--expanded[_ngcontent-%COMP%]::-webkit-scrollbar-thumb {\n background: var(--mj-border-strong);\n}\n\n.bubble-actions[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n margin-top: 6px;\n padding-top: 2px;\n}\n.turn--user[_ngcontent-%COMP%] .bubble-actions[_ngcontent-%COMP%] {\n justify-content: flex-end;\n}\n\n.bubble-expand-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 3px 8px;\n font-size: 11.5px;\n font-weight: 600;\n border-radius: 6px;\n cursor: pointer;\n background: transparent;\n border: none;\n transition: background-color 140ms ease, color 140ms ease;\n user-select: none;\n}\n\n.bubble-expand-btn[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 10px;\n}\n\n.turn--agent[_ngcontent-%COMP%] .bubble-expand-btn[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, transparent);\n}\n.turn--agent[_ngcontent-%COMP%] .bubble-expand-btn[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 16%, transparent);\n}\n\n.turn--user[_ngcontent-%COMP%] .bubble-expand-btn[_ngcontent-%COMP%] {\n color: var(--mj-text-inverse, #fff);\n background: rgba(255, 255, 255, 0.18);\n border: 1px solid rgba(255, 255, 255, 0.28);\n}\n.turn--user[_ngcontent-%COMP%] .bubble-expand-btn[_ngcontent-%COMP%]:hover {\n background: rgba(255, 255, 255, 0.28);\n}\n\n\n.bubble[_ngcontent-%COMP%] .mj-markdown-container {\n font-size: 13.5px;\n line-height: 1.55;\n}\n\n.bubble[_ngcontent-%COMP%] .mj-markdown-container h1 { font-size: 1.35em; font-weight: 700; margin-top: 0.6em; margin-bottom: 0.3em; }\n.bubble[_ngcontent-%COMP%] .mj-markdown-container h2 { font-size: 1.2em; font-weight: 650; margin-top: 0.5em; margin-bottom: 0.25em; }\n.bubble[_ngcontent-%COMP%] .mj-markdown-container h3 { font-size: 1.1em; font-weight: 600; margin-top: 0.4em; margin-bottom: 0.2em; }\n.bubble[_ngcontent-%COMP%] .mj-markdown-container h4, \n.bubble[_ngcontent-%COMP%] .mj-markdown-container h5, \n.bubble[_ngcontent-%COMP%] .mj-markdown-container h6 { font-size: 1em; font-weight: 600; margin-top: 0.4em; margin-bottom: 0.2em; }\n.bubble[_ngcontent-%COMP%] .mj-markdown-container p { margin: 0 0 0.6em 0; }\n.bubble[_ngcontent-%COMP%] .mj-markdown-container p:last-child { margin-bottom: 0; }\n.bubble[_ngcontent-%COMP%] .mj-markdown-container ul, \n.bubble[_ngcontent-%COMP%] .mj-markdown-container ol { margin: 0.25em 0 0.6em 1.25em; padding: 0; }\n.bubble[_ngcontent-%COMP%] .mj-markdown-container li { margin-bottom: 0.25em; line-height: 1.45; }\n\n\n.turn--user[_ngcontent-%COMP%] .bubble[_ngcontent-%COMP%] .mj-markdown-container, \n.turn--user[_ngcontent-%COMP%] .bubble[_ngcontent-%COMP%] .mj-markdown-container p, \n.turn--user[_ngcontent-%COMP%] .bubble[_ngcontent-%COMP%] .mj-markdown-container h1, \n.turn--user[_ngcontent-%COMP%] .bubble[_ngcontent-%COMP%] .mj-markdown-container h2, \n.turn--user[_ngcontent-%COMP%] .bubble[_ngcontent-%COMP%] .mj-markdown-container h3, \n.turn--user[_ngcontent-%COMP%] .bubble[_ngcontent-%COMP%] .mj-markdown-container h4, \n.turn--user[_ngcontent-%COMP%] .bubble[_ngcontent-%COMP%] .mj-markdown-container h5, \n.turn--user[_ngcontent-%COMP%] .bubble[_ngcontent-%COMP%] .mj-markdown-container h6, \n.turn--user[_ngcontent-%COMP%] .bubble[_ngcontent-%COMP%] .mj-markdown-container strong, \n.turn--user[_ngcontent-%COMP%] .bubble[_ngcontent-%COMP%] .mj-markdown-container b, \n.turn--user[_ngcontent-%COMP%] .bubble[_ngcontent-%COMP%] .mj-markdown-container li {\n color: var(--mj-text-inverse, #fff);\n}\n\n.turn--user[_ngcontent-%COMP%] .bubble[_ngcontent-%COMP%] .mj-markdown-container li::marker {\n color: var(--mj-text-inverse, #fff);\n}\n\n.turn--user[_ngcontent-%COMP%] .bubble[_ngcontent-%COMP%] .mj-markdown-container a {\n color: #fff;\n text-decoration: underline;\n}\n\n.turn--user[_ngcontent-%COMP%] .bubble[_ngcontent-%COMP%] .mj-markdown-container code {\n color: #fff;\n background: rgba(255, 255, 255, 0.2);\n}\n\n.turn--user[_ngcontent-%COMP%] .bubble[_ngcontent-%COMP%] .mj-markdown-container pre {\n background: rgba(0, 0, 0, 0.25);\n color: #fff;\n}\n\n.turn--user[_ngcontent-%COMP%] .bubble[_ngcontent-%COMP%] .mj-markdown-container blockquote {\n border-left-color: rgba(255, 255, 255, 0.5);\n color: rgba(255, 255, 255, 0.9);\n}\n\n.turn--user[_ngcontent-%COMP%] .bubble[_ngcontent-%COMP%] .mj-markdown-container hr {\n border-color: rgba(255, 255, 255, 0.25);\n margin: 0.6em 0;\n}\n.turn-meta[_ngcontent-%COMP%] {\n font-size: 10.5px;\n color: var(--mj-text-muted);\n margin-bottom: 3px;\n display: flex;\n align-items: center;\n gap: 6px;\n font-weight: 600;\n}\n.turn--user[_ngcontent-%COMP%] .turn-meta[_ngcontent-%COMP%] {\n justify-content: flex-end;\n}\n.muted[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n}\n.typed-tag[_ngcontent-%COMP%] {\n font-size: 9.5px;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n color: var(--mj-text-muted);\n border: 1px solid var(--mj-border-strong);\n border-radius: 4px;\n padding: 1px 5px;\n}\n\n\n.delegation-block[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n.live-note[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: 7px;\n margin-left: 22px;\n max-width: 520px;\n font-size: 12px;\n font-style: italic;\n color: var(--mj-text-muted);\n animation: _ngcontent-%COMP%_live-note-in 220ms ease;\n}\n.live-note[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 10px;\n margin-top: 3px;\n flex-shrink: 0;\n}\n@keyframes _ngcontent-%COMP%_live-note-in {\n from { opacity: 0; transform: translateY(2px); }\n to { opacity: 1; transform: translateY(0); }\n}\n\n\n.thread-divider[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n margin: 10px 0 6px;\n user-select: none;\n}\n.thread-divider__line[_ngcontent-%COMP%] {\n flex: 1;\n height: 1px;\n background: var(--mj-border-subtle);\n}\n.thread-divider__label[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n font-size: 11px;\n font-weight: 600;\n letter-spacing: 0.02em;\n color: var(--mj-text-muted);\n white-space: nowrap;\n}\n.thread-divider__label[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 10px;\n}\n.thread-divider__time[_ngcontent-%COMP%] {\n font-weight: 400;\n}\n.thread-divider__chip[_ngcontent-%COMP%] {\n font-size: 9.5px;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n color: var(--mj-text-muted);\n border: 1px solid var(--mj-border-default);\n border-radius: 999px;\n padding: 1px 7px;\n background: var(--mj-bg-surface-card);\n white-space: nowrap;\n}"] });
220
297
  }
221
298
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(RealtimeSessionThreadComponent, [{
222
299
  type: Component,
223
- args: [{ standalone: true, selector: 'mj-realtime-session-thread', imports: [CommonModule, RealtimeDelegationCardComponent], template: "<div class=\"thread\">\n @for (item of State.Items; track TrackItem($index, item)) {\n @switch (item.Kind) {\n @case ('caption') {\n @if (ShowCaptions) {\n <div class=\"turn\" [class.turn--user]=\"item.Role === 'User'\" [class.turn--agent]=\"item.Role === 'Assistant'\">\n <div class=\"turn-avatar\">{{ (item.Role === 'User' ? UserName : AgentName).charAt(0).toUpperCase() }}</div>\n <div class=\"turn-body\">\n <div class=\"turn-meta\">\n @if (item.Role === 'User') {\n <span class=\"typed-tag\">{{ UserName }}</span>\n } @else {\n {{ AgentName }} <span class=\"muted\">\u00B7 voice</span>\n }\n </div>\n <div class=\"bubble\">{{ item.Text }}</div>\n </div>\n </div>\n }\n }\n @case ('divider') {\n <!-- Session-leg boundary: subtle rule marking a resume / chained leg -->\n <div class=\"thread-divider\" role=\"separator\">\n <span class=\"thread-divider__line\" aria-hidden=\"true\"></span>\n <span class=\"thread-divider__label\">\n <i [class]=\"item.Icon\" aria-hidden=\"true\"></i>\n {{ item.Label }}\n @if (item.At) {\n <span class=\"thread-divider__time\">\u00B7 {{ item.At | date:'MMM d, h:mm a' }}</span>\n }\n </span>\n @if (item.CloseReason) {\n <span class=\"thread-divider__chip\" title=\"Why the previous session leg ended\">{{ item.CloseReason }}</span>\n }\n <span class=\"thread-divider__line\" aria-hidden=\"true\"></span>\n </div>\n }\n @case ('delegation') {\n <div class=\"delegation-block\">\n <mj-realtime-delegation-card\n [Card]=\"item.Card\"\n [DevMode]=\"DevMode\"\n (OpenRunRequested)=\"OpenRunRequested.emit($event)\"\n (OpenArtifactRequested)=\"OpenArtifactRequested.emit($event)\"\n (CancelRequested)=\"CancelRequested.emit($event)\">\n </mj-realtime-delegation-card>\n @if (ShowsLiveNote(item)) {\n <!-- Ephemeral narration: latest only, never persisted, fades with completion -->\n <div class=\"live-note\" role=\"status\" aria-live=\"polite\">\n <i class=\"fa-solid fa-comment-dots\" aria-hidden=\"true\"></i>\n {{ State.Narration }}\n </div>\n }\n </div>\n }\n }\n } @empty {\n <div class=\"thread-empty\">The live transcript and any delegated work will appear here.</div>\n }\n <div #scrollAnchor></div>\n</div>\n", styles: [":host {\n display: block;\n}\n\n.thread {\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n\n.thread-empty {\n text-align: center;\n font-size: 12.5px;\n color: var(--mj-text-disabled);\n padding: 24px 0;\n}\n\n/* ---------- Transcript bubbles ---------- */\n.turn {\n display: flex;\n gap: 10px;\n max-width: 100%;\n}\n.turn--user {\n flex-direction: row-reverse;\n}\n.turn-body {\n min-width: 0;\n}\n.turn-avatar {\n width: 26px;\n height: 26px;\n border-radius: 50%;\n display: grid;\n place-items: center;\n flex-shrink: 0;\n font-size: 11px;\n font-weight: 700;\n margin-top: 2px;\n}\n.turn--agent .turn-avatar {\n background: linear-gradient(135deg, var(--mj-brand-primary), var(--mj-brand-accent, var(--mj-brand-primary)));\n color: var(--mj-text-inverse, #fff);\n}\n.turn--user .turn-avatar {\n background: var(--mj-bg-surface-elevated);\n color: var(--mj-text-secondary);\n border: 1px solid var(--mj-border-strong);\n}\n.bubble {\n padding: 8px 12px;\n border-radius: 12px;\n max-width: 560px;\n font-size: 13.5px;\n line-height: 1.5;\n position: relative;\n}\n.turn--agent .bubble {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-top-left-radius: 4px;\n color: var(--mj-text-primary);\n}\n.turn--user .bubble {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse, #fff);\n border-top-right-radius: 4px;\n}\n.turn-meta {\n font-size: 10.5px;\n color: var(--mj-text-muted);\n margin-bottom: 3px;\n display: flex;\n align-items: center;\n gap: 6px;\n font-weight: 600;\n}\n.turn--user .turn-meta {\n justify-content: flex-end;\n}\n.muted {\n color: var(--mj-text-muted);\n}\n.typed-tag {\n font-size: 9.5px;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n color: var(--mj-text-muted);\n border: 1px solid var(--mj-border-strong);\n border-radius: 4px;\n padding: 1px 5px;\n}\n\n/* ---------- Delegation block + ephemeral live note ---------- */\n.delegation-block {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n.live-note {\n display: flex;\n align-items: flex-start;\n gap: 7px;\n margin-left: 22px;\n max-width: 520px;\n font-size: 12px;\n font-style: italic;\n color: var(--mj-text-muted);\n animation: live-note-in 220ms ease;\n}\n.live-note i {\n font-size: 10px;\n margin-top: 3px;\n flex-shrink: 0;\n}\n@keyframes live-note-in {\n from { opacity: 0; transform: translateY(2px); }\n to { opacity: 1; transform: translateY(0); }\n}\n\n/* ---------- Session-leg divider (resume / chained-leg boundary) ---------- */\n.thread-divider {\n display: flex;\n align-items: center;\n gap: 10px;\n margin: 10px 0 6px;\n user-select: none;\n}\n.thread-divider__line {\n flex: 1;\n height: 1px;\n background: var(--mj-border-subtle);\n}\n.thread-divider__label {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n font-size: 11px;\n font-weight: 600;\n letter-spacing: 0.02em;\n color: var(--mj-text-muted);\n white-space: nowrap;\n}\n.thread-divider__label i {\n font-size: 10px;\n}\n.thread-divider__time {\n font-weight: 400;\n}\n.thread-divider__chip {\n font-size: 9.5px;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n color: var(--mj-text-muted);\n border: 1px solid var(--mj-border-default);\n border-radius: 999px;\n padding: 1px 7px;\n background: var(--mj-bg-surface-card);\n white-space: nowrap;\n}\n"] }]
300
+ args: [{ standalone: true, selector: 'mj-realtime-session-thread', imports: [CommonModule, RealtimeDelegationCardComponent, MarkdownModule], template: "<div class=\"thread\">\n @for (item of State.Items; track TrackItem($index, item)) {\n @switch (item.Kind) {\n @case ('caption') {\n @if (ShowCaptions) {\n <div class=\"turn\" [class.turn--user]=\"item.Role === 'User'\" [class.turn--agent]=\"item.Role === 'Assistant'\">\n <div class=\"turn-avatar\">{{ (item.Role === 'User' ? UserName : AgentName).charAt(0).toUpperCase() }}</div>\n <div class=\"turn-body\">\n <div class=\"turn-meta\">\n @if (item.Role === 'User') {\n <span class=\"typed-tag\">{{ UserName }}</span>\n } @else {\n {{ AgentName }} <span class=\"muted\">\u00B7 voice</span>\n }\n </div>\n <div class=\"bubble\" [class.bubble--clamped]=\"IsLongText(item.Text) && !IsExpanded($index)\" [class.bubble--expanded]=\"IsLongText(item.Text) && IsExpanded($index)\">\n <div class=\"bubble-content\" [class.bubble-content--clamped]=\"IsLongText(item.Text) && !IsExpanded($index)\" [class.bubble-content--expanded]=\"IsLongText(item.Text) && IsExpanded($index)\">\n <mj-markdown [data]=\"FormatMarkdownText(item.Text)\" [enableCollapsibleHeadings]=\"true\"></mj-markdown>\n </div>\n @if (IsLongText(item.Text)) {\n <div class=\"bubble-actions\">\n <button\n type=\"button\"\n class=\"bubble-expand-btn\"\n (click)=\"ToggleExpanded($index, $event)\"\n [attr.aria-expanded]=\"IsExpanded($index)\">\n <span>{{ IsExpanded($index) ? 'Show less' : 'Show more' }}</span>\n <i class=\"fa-solid\" [class.fa-chevron-up]=\"IsExpanded($index)\" [class.fa-chevron-down]=\"!IsExpanded($index)\" aria-hidden=\"true\"></i>\n </button>\n </div>\n }\n </div>\n </div>\n </div>\n }\n }\n @case ('divider') {\n <!-- Session-leg boundary: subtle rule marking a resume / chained leg -->\n <div class=\"thread-divider\" role=\"separator\">\n <span class=\"thread-divider__line\" aria-hidden=\"true\"></span>\n <span class=\"thread-divider__label\">\n <i [class]=\"item.Icon\" aria-hidden=\"true\"></i>\n {{ item.Label }}\n @if (item.At) {\n <span class=\"thread-divider__time\">\u00B7 {{ item.At | date:'MMM d, h:mm a' }}</span>\n }\n </span>\n @if (item.CloseReason) {\n <span class=\"thread-divider__chip\" title=\"Why the previous session leg ended\">{{ item.CloseReason }}</span>\n }\n <span class=\"thread-divider__line\" aria-hidden=\"true\"></span>\n </div>\n }\n @case ('delegation') {\n <div class=\"delegation-block\">\n <mj-realtime-delegation-card\n [Card]=\"item.Card\"\n [DevMode]=\"DevMode\"\n (OpenRunRequested)=\"OpenRunRequested.emit($event)\"\n (OpenArtifactRequested)=\"OpenArtifactRequested.emit($event)\"\n (CancelRequested)=\"CancelRequested.emit($event)\">\n </mj-realtime-delegation-card>\n @if (ShowsLiveNote(item)) {\n <!-- Ephemeral narration: latest only, never persisted, fades with completion -->\n <div class=\"live-note\" role=\"status\" aria-live=\"polite\">\n <i class=\"fa-solid fa-comment-dots\" aria-hidden=\"true\"></i>\n {{ State.Narration }}\n </div>\n }\n </div>\n }\n }\n } @empty {\n <div class=\"thread-empty\">The live transcript and any delegated work will appear here.</div>\n }\n <div #scrollAnchor></div>\n</div>\n", styles: [":host {\n display: block;\n}\n\n.thread {\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n\n.thread-empty {\n text-align: center;\n font-size: 12.5px;\n color: var(--mj-text-disabled);\n padding: 24px 0;\n}\n\n/* ---------- Transcript bubbles ---------- */\n.turn {\n display: flex;\n gap: 10px;\n max-width: 100%;\n}\n.turn--user {\n flex-direction: row-reverse;\n}\n.turn-body {\n min-width: 0;\n}\n.turn-avatar {\n width: 26px;\n height: 26px;\n border-radius: 50%;\n display: grid;\n place-items: center;\n flex-shrink: 0;\n font-size: 11px;\n font-weight: 700;\n margin-top: 2px;\n}\n.turn--agent .turn-avatar {\n background: linear-gradient(135deg, var(--mj-brand-primary), var(--mj-brand-accent, var(--mj-brand-primary)));\n color: var(--mj-text-inverse, #fff);\n}\n.turn--user .turn-avatar {\n background: var(--mj-bg-surface-elevated);\n color: var(--mj-text-secondary);\n border: 1px solid var(--mj-border-strong);\n}\n.bubble {\n padding: 8px 12px;\n border-radius: 12px;\n max-width: 560px;\n font-size: 13.5px;\n line-height: 1.5;\n position: relative;\n}\n.turn--agent .bubble {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-top-left-radius: 4px;\n color: var(--mj-text-primary);\n}\n.turn--user .bubble {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse, #fff);\n border-top-right-radius: 4px;\n}\n\n/* ---------- Bubble content clamping and expansion ---------- */\n.bubble-content {\n position: relative;\n word-break: break-word;\n}\n\n.bubble-content--clamped {\n max-height: 120px;\n overflow: hidden;\n -webkit-mask-image: linear-gradient(to bottom, rgba(0, 0, 0, 1) 60%, rgba(0, 0, 0, 0) 100%);\n mask-image: linear-gradient(to bottom, rgba(0, 0, 0, 1) 60%, rgba(0, 0, 0, 0) 100%);\n}\n\n.bubble-content--expanded {\n max-height: 440px;\n overflow-y: auto;\n scrollbar-width: thin;\n scrollbar-color: rgba(255, 255, 255, 0.4) transparent;\n}\n.turn--agent .bubble-content--expanded {\n scrollbar-color: var(--mj-border-strong) transparent;\n}\n.bubble-content--expanded::-webkit-scrollbar {\n width: 5px;\n}\n.bubble-content--expanded::-webkit-scrollbar-thumb {\n background: rgba(255, 255, 255, 0.35);\n border-radius: 3px;\n}\n.turn--agent .bubble-content--expanded::-webkit-scrollbar-thumb {\n background: var(--mj-border-strong);\n}\n\n.bubble-actions {\n display: flex;\n align-items: center;\n margin-top: 6px;\n padding-top: 2px;\n}\n.turn--user .bubble-actions {\n justify-content: flex-end;\n}\n\n.bubble-expand-btn {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 3px 8px;\n font-size: 11.5px;\n font-weight: 600;\n border-radius: 6px;\n cursor: pointer;\n background: transparent;\n border: none;\n transition: background-color 140ms ease, color 140ms ease;\n user-select: none;\n}\n\n.bubble-expand-btn i {\n font-size: 10px;\n}\n\n.turn--agent .bubble-expand-btn {\n color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, transparent);\n}\n.turn--agent .bubble-expand-btn:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 16%, transparent);\n}\n\n.turn--user .bubble-expand-btn {\n color: var(--mj-text-inverse, #fff);\n background: rgba(255, 255, 255, 0.18);\n border: 1px solid rgba(255, 255, 255, 0.28);\n}\n.turn--user .bubble-expand-btn:hover {\n background: rgba(255, 255, 255, 0.28);\n}\n\n/* ---------- Markdown styling within realtime bubbles ---------- */\n.bubble ::ng-deep .mj-markdown-container {\n font-size: 13.5px;\n line-height: 1.55;\n}\n\n.bubble ::ng-deep .mj-markdown-container h1 { font-size: 1.35em; font-weight: 700; margin-top: 0.6em; margin-bottom: 0.3em; }\n.bubble ::ng-deep .mj-markdown-container h2 { font-size: 1.2em; font-weight: 650; margin-top: 0.5em; margin-bottom: 0.25em; }\n.bubble ::ng-deep .mj-markdown-container h3 { font-size: 1.1em; font-weight: 600; margin-top: 0.4em; margin-bottom: 0.2em; }\n.bubble ::ng-deep .mj-markdown-container h4,\n.bubble ::ng-deep .mj-markdown-container h5,\n.bubble ::ng-deep .mj-markdown-container h6 { font-size: 1em; font-weight: 600; margin-top: 0.4em; margin-bottom: 0.2em; }\n.bubble ::ng-deep .mj-markdown-container p { margin: 0 0 0.6em 0; }\n.bubble ::ng-deep .mj-markdown-container p:last-child { margin-bottom: 0; }\n.bubble ::ng-deep .mj-markdown-container ul,\n.bubble ::ng-deep .mj-markdown-container ol { margin: 0.25em 0 0.6em 1.25em; padding: 0; }\n.bubble ::ng-deep .mj-markdown-container li { margin-bottom: 0.25em; line-height: 1.45; }\n\n/* User turn contrast: markdown on brand-primary background */\n.turn--user .bubble ::ng-deep .mj-markdown-container,\n.turn--user .bubble ::ng-deep .mj-markdown-container p,\n.turn--user .bubble ::ng-deep .mj-markdown-container h1,\n.turn--user .bubble ::ng-deep .mj-markdown-container h2,\n.turn--user .bubble ::ng-deep .mj-markdown-container h3,\n.turn--user .bubble ::ng-deep .mj-markdown-container h4,\n.turn--user .bubble ::ng-deep .mj-markdown-container h5,\n.turn--user .bubble ::ng-deep .mj-markdown-container h6,\n.turn--user .bubble ::ng-deep .mj-markdown-container strong,\n.turn--user .bubble ::ng-deep .mj-markdown-container b,\n.turn--user .bubble ::ng-deep .mj-markdown-container li {\n color: var(--mj-text-inverse, #fff);\n}\n\n.turn--user .bubble ::ng-deep .mj-markdown-container li::marker {\n color: var(--mj-text-inverse, #fff);\n}\n\n.turn--user .bubble ::ng-deep .mj-markdown-container a {\n color: #fff;\n text-decoration: underline;\n}\n\n.turn--user .bubble ::ng-deep .mj-markdown-container code {\n color: #fff;\n background: rgba(255, 255, 255, 0.2);\n}\n\n.turn--user .bubble ::ng-deep .mj-markdown-container pre {\n background: rgba(0, 0, 0, 0.25);\n color: #fff;\n}\n\n.turn--user .bubble ::ng-deep .mj-markdown-container blockquote {\n border-left-color: rgba(255, 255, 255, 0.5);\n color: rgba(255, 255, 255, 0.9);\n}\n\n.turn--user .bubble ::ng-deep .mj-markdown-container hr {\n border-color: rgba(255, 255, 255, 0.25);\n margin: 0.6em 0;\n}\n.turn-meta {\n font-size: 10.5px;\n color: var(--mj-text-muted);\n margin-bottom: 3px;\n display: flex;\n align-items: center;\n gap: 6px;\n font-weight: 600;\n}\n.turn--user .turn-meta {\n justify-content: flex-end;\n}\n.muted {\n color: var(--mj-text-muted);\n}\n.typed-tag {\n font-size: 9.5px;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n color: var(--mj-text-muted);\n border: 1px solid var(--mj-border-strong);\n border-radius: 4px;\n padding: 1px 5px;\n}\n\n/* ---------- Delegation block + ephemeral live note ---------- */\n.delegation-block {\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n.live-note {\n display: flex;\n align-items: flex-start;\n gap: 7px;\n margin-left: 22px;\n max-width: 520px;\n font-size: 12px;\n font-style: italic;\n color: var(--mj-text-muted);\n animation: live-note-in 220ms ease;\n}\n.live-note i {\n font-size: 10px;\n margin-top: 3px;\n flex-shrink: 0;\n}\n@keyframes live-note-in {\n from { opacity: 0; transform: translateY(2px); }\n to { opacity: 1; transform: translateY(0); }\n}\n\n/* ---------- Session-leg divider (resume / chained-leg boundary) ---------- */\n.thread-divider {\n display: flex;\n align-items: center;\n gap: 10px;\n margin: 10px 0 6px;\n user-select: none;\n}\n.thread-divider__line {\n flex: 1;\n height: 1px;\n background: var(--mj-border-subtle);\n}\n.thread-divider__label {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n font-size: 11px;\n font-weight: 600;\n letter-spacing: 0.02em;\n color: var(--mj-text-muted);\n white-space: nowrap;\n}\n.thread-divider__label i {\n font-size: 10px;\n}\n.thread-divider__time {\n font-weight: 400;\n}\n.thread-divider__chip {\n font-size: 9.5px;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n color: var(--mj-text-muted);\n border: 1px solid var(--mj-border-default);\n border-radius: 999px;\n padding: 1px 7px;\n background: var(--mj-bg-surface-card);\n white-space: nowrap;\n}\n"] }]
224
301
  }], null, { scrollAnchor: [{
225
302
  type: ViewChild,
226
303
  args: ['scrollAnchor']
@@ -242,5 +319,5 @@ export class RealtimeSessionThreadComponent {
242
319
  }], CancelRequested: [{
243
320
  type: Output
244
321
  }] }); })();
245
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(RealtimeSessionThreadComponent, { className: "RealtimeSessionThreadComponent", filePath: "src/lib/components/realtime/realtime-session-thread.component.ts", lineNumber: 29 }); })();
322
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(RealtimeSessionThreadComponent, { className: "RealtimeSessionThreadComponent", filePath: "src/lib/components/realtime/realtime-session-thread.component.ts", lineNumber: 30 }); })();
246
323
  //# sourceMappingURL=realtime-session-thread.component.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"realtime-session-thread.component.js","sourceRoot":"","sources":["../../../../src/lib/components/realtime/realtime-session-thread.component.ts","../../../../src/lib/components/realtime/realtime-session-thread.component.html"],"names":[],"mappings":"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","sourcesContent":["import {\n Component, EventEmitter, Input, Output, ElementRef, ViewChild, AfterViewChecked, OnInit, OnDestroy,\n ChangeDetectorRef, inject\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { Subscription } from 'rxjs';\nimport { RealtimeSessionState, RealtimeThreadItem } from './realtime-session-state';\nimport { RealtimeDelegationCardComponent } from './realtime-delegation-card.component';\nimport { ParsedDelegationArtifact } from '../../services/delegation-result-parser';\n\n/**\n * The unified, chronological live thread for the call overlay: caption bubbles\n * interleaved with delegation cards exactly where they happened.\n *\n * PURELY PRESENTATIONAL over {@link RealtimeSessionState} — the overlay shell owns the\n * state object (which merges the service streams once) and passes it here AND to the\n * activity rail, so there is exactly one copy of the per-CallID merge logic.\n *\n * Also renders the EPHEMERAL narration \"live note\": indented, muted, italic text under\n * the ACTIVE working card (latest narration only — replaced, never accumulated).\n */\n@Component({\n standalone: true,\n selector: 'mj-realtime-session-thread',\n imports: [CommonModule, RealtimeDelegationCardComponent],\n templateUrl: './realtime-session-thread.component.html',\n styleUrl: './realtime-session-thread.component.css'\n})\nexport class RealtimeSessionThreadComponent implements OnInit, AfterViewChecked, OnDestroy {\n @ViewChild('scrollAnchor') private scrollAnchor?: ElementRef<HTMLElement>;\n\n /** Display name of the agent (caption avatar / meta line). */\n @Input() AgentName = 'Sage';\n\n /**\n * Display name of the signed-in user for their turns — consistent with the main\n * chat's sender names, and ready for multi-user sessions where \"You\" stops meaning\n * anything. Hosts bind the current user's name; the default keeps old hosts working.\n */\n @Input() UserName = 'You';\n\n /** Shared live-session state, owned by the overlay shell. */\n @Input({ required: true }) State!: RealtimeSessionState;\n\n /** Whether to render caption bubbles (toggled by the controls' captions button). */\n @Input() ShowCaptions = true;\n\n /** Whether developer affordances on delegation cards are revealed (gear-gated). */\n @Input() DevMode = false;\n\n /** Re-emitted from a delegation card's dev \"Open run\" link (the delegated run's ID). */\n @Output() OpenRunRequested = new EventEmitter<string>();\n\n /** Re-emitted from a delegation card's \"View\" artifact chip (focuses the artifact's surface tab). */\n @Output() OpenArtifactRequested = new EventEmitter<ParsedDelegationArtifact>();\n\n /** Re-emitted from a WORKING delegation card's ✕ cancel affordance (the call's ID). */\n @Output() CancelRequested = new EventEmitter<string>();\n\n /** Item count at the last change notification, to auto-scroll only when the list grows. */\n private lastItemCount = 0;\n /** Drives auto-scroll: set whenever the list grows. */\n private pendingScroll = false;\n\n private changedSub?: Subscription;\n private cdr = inject(ChangeDetectorRef);\n\n ngOnInit(): void {\n this.changedSub = this.State.Changed$.subscribe(() => this.onStateChanged());\n this.lastItemCount = this.State.Items.length;\n }\n\n ngAfterViewChecked(): void {\n if (this.pendingScroll) {\n this.pendingScroll = false;\n this.scrollAnchor?.nativeElement.scrollIntoView({ behavior: 'smooth', block: 'end' });\n }\n }\n\n ngOnDestroy(): void {\n this.changedSub?.unsubscribe();\n }\n\n /** track fn for the @for over thread items. */\n public TrackItem(index: number, item: RealtimeThreadItem): string {\n switch (item.Kind) {\n case 'delegation': return `d:${item.Card.CallID}`;\n case 'divider': return `s:${index}`;\n default: return `c:${index}`;\n }\n }\n\n /** True when the live narration note should render under THIS delegation item. */\n public ShowsLiveNote(item: RealtimeThreadItem): boolean {\n return item.Kind === 'delegation'\n && !item.Card.Done\n && this.State.Narration !== null\n && item.Card.CallID === this.State.ActiveCallId;\n }\n\n /** Marks for check on every state change; auto-scrolls when the thread grew. */\n private onStateChanged(): void {\n if (this.State.Items.length > this.lastItemCount) {\n this.pendingScroll = true;\n }\n this.lastItemCount = this.State.Items.length;\n this.cdr.markForCheck();\n }\n}\n","<div class=\"thread\">\n @for (item of State.Items; track TrackItem($index, item)) {\n @switch (item.Kind) {\n @case ('caption') {\n @if (ShowCaptions) {\n <div class=\"turn\" [class.turn--user]=\"item.Role === 'User'\" [class.turn--agent]=\"item.Role === 'Assistant'\">\n <div class=\"turn-avatar\">{{ (item.Role === 'User' ? UserName : AgentName).charAt(0).toUpperCase() }}</div>\n <div class=\"turn-body\">\n <div class=\"turn-meta\">\n @if (item.Role === 'User') {\n <span class=\"typed-tag\">{{ UserName }}</span>\n } @else {\n {{ AgentName }} <span class=\"muted\">· voice</span>\n }\n </div>\n <div class=\"bubble\">{{ item.Text }}</div>\n </div>\n </div>\n }\n }\n @case ('divider') {\n <!-- Session-leg boundary: subtle rule marking a resume / chained leg -->\n <div class=\"thread-divider\" role=\"separator\">\n <span class=\"thread-divider__line\" aria-hidden=\"true\"></span>\n <span class=\"thread-divider__label\">\n <i [class]=\"item.Icon\" aria-hidden=\"true\"></i>\n {{ item.Label }}\n @if (item.At) {\n <span class=\"thread-divider__time\">· {{ item.At | date:'MMM d, h:mm a' }}</span>\n }\n </span>\n @if (item.CloseReason) {\n <span class=\"thread-divider__chip\" title=\"Why the previous session leg ended\">{{ item.CloseReason }}</span>\n }\n <span class=\"thread-divider__line\" aria-hidden=\"true\"></span>\n </div>\n }\n @case ('delegation') {\n <div class=\"delegation-block\">\n <mj-realtime-delegation-card\n [Card]=\"item.Card\"\n [DevMode]=\"DevMode\"\n (OpenRunRequested)=\"OpenRunRequested.emit($event)\"\n (OpenArtifactRequested)=\"OpenArtifactRequested.emit($event)\"\n (CancelRequested)=\"CancelRequested.emit($event)\">\n </mj-realtime-delegation-card>\n @if (ShowsLiveNote(item)) {\n <!-- Ephemeral narration: latest only, never persisted, fades with completion -->\n <div class=\"live-note\" role=\"status\" aria-live=\"polite\">\n <i class=\"fa-solid fa-comment-dots\" aria-hidden=\"true\"></i>\n {{ State.Narration }}\n </div>\n }\n </div>\n }\n }\n } @empty {\n <div class=\"thread-empty\">The live transcript and any delegated work will appear here.</div>\n }\n <div #scrollAnchor></div>\n</div>\n"]}
1
+ {"version":3,"file":"realtime-session-thread.component.js","sourceRoot":"","sources":["../../../../src/lib/components/realtime/realtime-session-thread.component.ts","../../../../src/lib/components/realtime/realtime-session-thread.component.html"],"names":[],"mappings":"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","sourcesContent":["import {\n Component, EventEmitter, Input, Output, ElementRef, ViewChild, AfterViewChecked, OnInit, OnDestroy,\n ChangeDetectorRef, inject\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MarkdownModule } from '@memberjunction/ng-markdown';\nimport { Subscription } from 'rxjs';\nimport { RealtimeSessionState, RealtimeThreadItem } from './realtime-session-state';\nimport { RealtimeDelegationCardComponent } from './realtime-delegation-card.component';\nimport { ParsedDelegationArtifact } from '@memberjunction/realtime-runtime';\n\n/**\n * The unified, chronological live thread for the call overlay: caption bubbles\n * interleaved with delegation cards exactly where they happened.\n *\n * PURELY PRESENTATIONAL over {@link RealtimeSessionState} — the overlay shell owns the\n * state object (which merges the service streams once) and passes it here AND to the\n * activity rail, so there is exactly one copy of the per-CallID merge logic.\n *\n * Also renders the EPHEMERAL narration \"live note\": indented, muted, italic text under\n * the ACTIVE working card (latest narration only — replaced, never accumulated).\n */\n@Component({\n standalone: true,\n selector: 'mj-realtime-session-thread',\n imports: [CommonModule, RealtimeDelegationCardComponent, MarkdownModule],\n templateUrl: './realtime-session-thread.component.html',\n styleUrl: './realtime-session-thread.component.css'\n})\nexport class RealtimeSessionThreadComponent implements OnInit, AfterViewChecked, OnDestroy {\n @ViewChild('scrollAnchor') private scrollAnchor?: ElementRef<HTMLElement>;\n\n /** Display name of the agent (caption avatar / meta line). */\n @Input() AgentName = 'Sage';\n\n /**\n * Display name of the signed-in user for their turns — consistent with the main\n * chat's sender names, and ready for multi-user sessions where \"You\" stops meaning\n * anything. Hosts bind the current user's name; the default keeps old hosts working.\n */\n @Input() UserName = 'You';\n\n /** Shared live-session state, owned by the overlay shell. */\n @Input({ required: true }) State!: RealtimeSessionState;\n\n /** Whether to render caption bubbles (toggled by the controls' captions button). */\n @Input() ShowCaptions = true;\n\n /** Whether developer affordances on delegation cards are revealed (gear-gated). */\n @Input() DevMode = false;\n\n /** Re-emitted from a delegation card's dev \"Open run\" link (the delegated run's ID). */\n @Output() OpenRunRequested = new EventEmitter<string>();\n\n /** Re-emitted from a delegation card's \"View\" artifact chip (focuses the artifact's surface tab). */\n @Output() OpenArtifactRequested = new EventEmitter<ParsedDelegationArtifact>();\n\n /** Re-emitted from a WORKING delegation card's ✕ cancel affordance (the call's ID). */\n @Output() CancelRequested = new EventEmitter<string>();\n\n /** Item count at the last change notification, to auto-scroll only when the list grows. */\n private lastItemCount = 0;\n /** Drives auto-scroll: set whenever the list grows. */\n private pendingScroll = false;\n\n private changedSub?: Subscription;\n private cdr = inject(ChangeDetectorRef, { optional: true });\n\n ngOnInit(): void {\n this.changedSub = this.State.Changed$.subscribe(() => this.onStateChanged());\n this.lastItemCount = this.State.Items.length;\n }\n\n ngAfterViewChecked(): void {\n if (this.pendingScroll) {\n this.pendingScroll = false;\n this.scrollAnchor?.nativeElement.scrollIntoView({ behavior: 'smooth', block: 'end' });\n }\n }\n\n ngOnDestroy(): void {\n this.changedSub?.unsubscribe();\n }\n\n /** track fn for the @for over thread items. */\n public TrackItem(index: number, item: RealtimeThreadItem): string {\n switch (item.Kind) {\n case 'delegation': return `d:${item.Card.CallID}`;\n case 'divider': return `s:${index}`;\n default: return `c:${index}`;\n }\n }\n\n /** True when the live narration note should render under THIS delegation item. */\n public ShowsLiveNote(item: RealtimeThreadItem): boolean {\n return item.Kind === 'delegation'\n && !item.Card.Done\n && this.State.Narration !== null\n && item.Card.CallID === this.State.ActiveCallId;\n }\n\n /** Set of item indices whose long text has been expanded by the user. */\n public ExpandedItems = new Set<number>();\n\n /**\n * Returns true when the caption text is considered a \"long blob\" (>280 chars or >4 lines)\n * that warrants height clamping and an expand/collapse toggle.\n */\n public IsLongText(text: string | null | undefined): boolean {\n if (!text) {\n return false;\n }\n return text.length > 280 || text.split('\\n').length > 4;\n }\n\n /** Returns whether the caption item at the specified index is expanded. */\n public IsExpanded(index: number): boolean {\n return this.ExpandedItems.has(index);\n }\n\n /** Toggles expanded/collapsed state for the caption item at the given index. */\n public ToggleExpanded(index: number, event?: Event): void {\n if (event) {\n event.stopPropagation();\n }\n if (this.ExpandedItems.has(index)) {\n this.ExpandedItems.delete(index);\n } else {\n this.ExpandedItems.add(index);\n }\n this.cdr?.markForCheck();\n }\n\n /**\n * Prepares text for markdown rendering, restoring structure (headings, horizontal rules,\n * bullet items) if newlines were stripped by single-line input paste or speech-to-text.\n */\n public FormatMarkdownText(text: string | null | undefined): string {\n if (!text) {\n return '';\n }\n let cleaned = text;\n // Restore newlines before markdown headings on same line: \"Title ### Heading\" -> \"Title\\n\\n### Heading\"\n cleaned = cleaned.replace(/[ \\t]+(?:—\\s*)?(#{1,6}[ \\t]+)/g, '\\n\\n$1');\n // Restore newlines around horizontal rules on same line: \"Text --- ##\" -> \"Text\\n\\n---\\n\\n##\"\n cleaned = cleaned.replace(/[ \\t]+(?:—\\s*)?(---|___|\\*\\*\\*)[ \\t]*/g, '\\n\\n$1\\n\\n');\n // Restore newlines before bullet items on same line: \"around: - Item 1 - Item 2\" -> \"around:\\n- Item 1\\n- Item 2\"\n cleaned = cleaned.replace(/[ \\t]+-[ \\t]+(?=[A-Za-z0-9\\*])/g, '\\n- ');\n return cleaned;\n }\n\n /** Marks for check on every state change; auto-scrolls when the thread grew. */\n private onStateChanged(): void {\n if (this.State.Items.length > this.lastItemCount) {\n this.pendingScroll = true;\n }\n this.lastItemCount = this.State.Items.length;\n this.cdr?.markForCheck();\n }\n}\n","<div class=\"thread\">\n @for (item of State.Items; track TrackItem($index, item)) {\n @switch (item.Kind) {\n @case ('caption') {\n @if (ShowCaptions) {\n <div class=\"turn\" [class.turn--user]=\"item.Role === 'User'\" [class.turn--agent]=\"item.Role === 'Assistant'\">\n <div class=\"turn-avatar\">{{ (item.Role === 'User' ? UserName : AgentName).charAt(0).toUpperCase() }}</div>\n <div class=\"turn-body\">\n <div class=\"turn-meta\">\n @if (item.Role === 'User') {\n <span class=\"typed-tag\">{{ UserName }}</span>\n } @else {\n {{ AgentName }} <span class=\"muted\">· voice</span>\n }\n </div>\n <div class=\"bubble\" [class.bubble--clamped]=\"IsLongText(item.Text) && !IsExpanded($index)\" [class.bubble--expanded]=\"IsLongText(item.Text) && IsExpanded($index)\">\n <div class=\"bubble-content\" [class.bubble-content--clamped]=\"IsLongText(item.Text) && !IsExpanded($index)\" [class.bubble-content--expanded]=\"IsLongText(item.Text) && IsExpanded($index)\">\n <mj-markdown [data]=\"FormatMarkdownText(item.Text)\" [enableCollapsibleHeadings]=\"true\"></mj-markdown>\n </div>\n @if (IsLongText(item.Text)) {\n <div class=\"bubble-actions\">\n <button\n type=\"button\"\n class=\"bubble-expand-btn\"\n (click)=\"ToggleExpanded($index, $event)\"\n [attr.aria-expanded]=\"IsExpanded($index)\">\n <span>{{ IsExpanded($index) ? 'Show less' : 'Show more' }}</span>\n <i class=\"fa-solid\" [class.fa-chevron-up]=\"IsExpanded($index)\" [class.fa-chevron-down]=\"!IsExpanded($index)\" aria-hidden=\"true\"></i>\n </button>\n </div>\n }\n </div>\n </div>\n </div>\n }\n }\n @case ('divider') {\n <!-- Session-leg boundary: subtle rule marking a resume / chained leg -->\n <div class=\"thread-divider\" role=\"separator\">\n <span class=\"thread-divider__line\" aria-hidden=\"true\"></span>\n <span class=\"thread-divider__label\">\n <i [class]=\"item.Icon\" aria-hidden=\"true\"></i>\n {{ item.Label }}\n @if (item.At) {\n <span class=\"thread-divider__time\">· {{ item.At | date:'MMM d, h:mm a' }}</span>\n }\n </span>\n @if (item.CloseReason) {\n <span class=\"thread-divider__chip\" title=\"Why the previous session leg ended\">{{ item.CloseReason }}</span>\n }\n <span class=\"thread-divider__line\" aria-hidden=\"true\"></span>\n </div>\n }\n @case ('delegation') {\n <div class=\"delegation-block\">\n <mj-realtime-delegation-card\n [Card]=\"item.Card\"\n [DevMode]=\"DevMode\"\n (OpenRunRequested)=\"OpenRunRequested.emit($event)\"\n (OpenArtifactRequested)=\"OpenArtifactRequested.emit($event)\"\n (CancelRequested)=\"CancelRequested.emit($event)\">\n </mj-realtime-delegation-card>\n @if (ShowsLiveNote(item)) {\n <!-- Ephemeral narration: latest only, never persisted, fades with completion -->\n <div class=\"live-note\" role=\"status\" aria-live=\"polite\">\n <i class=\"fa-solid fa-comment-dots\" aria-hidden=\"true\"></i>\n {{ State.Narration }}\n </div>\n }\n </div>\n }\n }\n } @empty {\n <div class=\"thread-empty\">The live transcript and any delegated work will appear here.</div>\n }\n <div #scrollAnchor></div>\n</div>\n"]}
@@ -1,51 +1,67 @@
1
1
  import { EventEmitter } from '@angular/core';
2
- import { RealtimeSessionTimelineGroup, RealtimeSessionTimelineMeta } from '../../utils/realtime-session-timeline';
2
+ import { type RealtimeSessionStatusChip, type RealtimeSessionTimelineGroup, type RealtimeSessionTimelineMeta } from '@memberjunction/conversations-runtime';
3
3
  import * as i0 from "@angular/core";
4
4
  /**
5
- * The ONE timeline element a realtime session collapses to in the standard conversation
6
- * message list (see `BuildConversationTimeline`): a visually distinct card at the
7
- * session's chronological position carrying the session identity (broadcast icon +
8
- * "Realtime session · <agent>"), its time range, a status / close-reason chip when
9
- * known, the visible-turn count, and a one-line preview of the last turn.
5
+ * The ONE timeline element a realtime (voice) session collapses to in the standard conversation
6
+ * message list (see `BuildConversationTimeline`).
10
7
  *
11
- * The card's **Open** button emits {@link OpenRequested} with the session id; the
12
- * message list bubbles it up so the chat area can host the existing SESSION REVIEW
13
- * overlay via `ConversationChatAreaComponent.OpenRealtimeSessionReview` (Resume /
14
- * Close live inside that overlay, unchanged).
8
+ * It is laid out like a chat message rather than a banner. The call icon sits in the avatar column,
9
+ * "Voice call with Sage" and the start time fill the header line, and a bubble carries the status,
10
+ * how long the call ran, how much was said and the last thing said. That keeps the conversation's
11
+ * margins and rhythm, where the old full-width card cut across them.
15
12
  *
16
- * Rendered DYNAMICALLY by `MessageListComponent` (same `createComponent` path the
17
- * message items use) — standalone by design, no module declaration needed.
13
+ * **Review call** (or clicking the bubble) emits {@link OpenRequested} with the session id. The
14
+ * message list bubbles it up so the chat area can host the existing SESSION REVIEW overlay via
15
+ * `ConversationChatAreaComponent.OpenRealtimeSessionReview` (Resume / Close live inside that
16
+ * overlay, unchanged).
17
+ *
18
+ * Rendered DYNAMICALLY by `MessageListComponent` (same `createComponent` path the message items
19
+ * use) — standalone by design, no module declaration needed.
18
20
  */
19
21
  export declare class RealtimeSessionTimelineCardComponent {
20
22
  /** The collapsed session block computed from the conversation's stamped detail rows. */
21
23
  Group: RealtimeSessionTimelineGroup;
22
- /** Optional session-row enrichment (agent name / status / close reason); null degrades gracefully. */
24
+ /** Optional session-row enrichment (agent, user, status, start and close); null degrades gracefully. */
23
25
  Meta: RealtimeSessionTimelineMeta | null;
24
- /** Display name of the signed-in user for the last-turn preview (matches the chat's sender names). */
26
+ /**
27
+ * The signed-in user's id. With it, the quoted line says "You" on the viewer's own call and names
28
+ * the caller on anyone else's, which matters in a conversation several people share.
29
+ */
30
+ CurrentUserID: string | null;
31
+ /**
32
+ * Label for a user's line when the host passes no `CurrentUserID`, and so the card can't tell
33
+ * whose call it was. With `CurrentUserID` set it isn't used: the line says "You", the caller's
34
+ * name, or "Caller" when the session row doesn't say whose call it was.
35
+ */
25
36
  UserName: string;
26
37
  /** Emitted with the `MJ: AI Agent Sessions.ID` when the user asks to open the session review. */
27
38
  OpenRequested: EventEmitter<string>;
28
- /** Card title: "Realtime session · <agent>" when the agent name is known, else the generic label. */
39
+ /** "Voice call with <agent>" when the agent name is known, else "Voice call". */
29
40
  get Title(): string;
30
- /** Whether the start and end fall on the same calendar day (drives the end-time format). */
31
- get SameDayRange(): boolean;
32
- /**
33
- * The status chip label, or null to hide the chip entirely:
34
- * - Closed sessions show the close reason (`Error` / `Explicit` / `Janitor` / `Shutdown`)
35
- * humanized, falling back to "Closed" for legacy rows without one;
36
- * - Active sessions show "Live"; Idle shows "Idle";
37
- * - no meta (lookup unavailable) → no chip.
38
- */
41
+ /** When the call started, shown in the header the way a message shows its time. */
42
+ get StartedAt(): Date | null;
43
+ /** The status label ("Live", "Ended", "Timed out", …), or null to hide the status entirely. */
39
44
  get StatusChip(): string | null;
40
- /** Whether the chip represents an error close (drives the error chip styling). */
45
+ /** What the status means, for styling; null when there is no status to show. */
46
+ get StatusTone(): RealtimeSessionStatusChip['Tone'] | null;
47
+ /** Whether the call ended in an error (drives the error styling). */
41
48
  get IsErrorChip(): boolean;
42
- /** Whether the chip represents a live session (drives the live chip styling). */
49
+ /** Whether the call is still live (drives the live styling). */
43
50
  get IsLiveChip(): boolean;
44
- /** Emits {@link OpenRequested} for the whole-card / Open-button click. */
45
- Open(event?: MouseEvent): void;
46
- /** Human label for the session's close reason ("Closed" when the column is null/unknown). */
47
- private closeReasonLabel;
51
+ /** How long the call ran ("Under a minute", "12 min"), or null while live or unmeasurable. */
52
+ get DurationLabel(): string | null;
53
+ /** "No messages", "1 message", "12 messages". */
54
+ get MessageCountLabel(): string;
55
+ /** Who said the quoted line: the agent by name, "You", or another caller by name. */
56
+ get SpeakerLabel(): string;
57
+ /** The button's label. A live call is still going, so it is viewed rather than reviewed. */
58
+ get ActionLabel(): string;
59
+ /** One sentence a screen reader announces for the whole row. */
60
+ get AccessibleSummary(): string;
61
+ /** Emits {@link OpenRequested} for a click on the bubble or its button. */
62
+ Open(event?: Event): void;
63
+ private get status();
48
64
  static ɵfac: i0.ɵɵFactoryDeclaration<RealtimeSessionTimelineCardComponent, never>;
49
- static ɵcmp: i0.ɵɵComponentDeclaration<RealtimeSessionTimelineCardComponent, "mj-realtime-session-timeline-card", never, { "Group": { "alias": "Group"; "required": true; }; "Meta": { "alias": "Meta"; "required": false; }; "UserName": { "alias": "UserName"; "required": false; }; }, { "OpenRequested": "OpenRequested"; }, never, never, true, never>;
65
+ static ɵcmp: i0.ɵɵComponentDeclaration<RealtimeSessionTimelineCardComponent, "mj-realtime-session-timeline-card", never, { "Group": { "alias": "Group"; "required": true; }; "Meta": { "alias": "Meta"; "required": false; }; "CurrentUserID": { "alias": "CurrentUserID"; "required": false; }; "UserName": { "alias": "UserName"; "required": false; }; }, { "OpenRequested": "OpenRequested"; }, never, never, true, never>;
50
66
  }
51
67
  //# sourceMappingURL=realtime-session-timeline-card.component.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"realtime-session-timeline-card.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/realtime/realtime-session-timeline-card.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,YAAY,EAAiB,MAAM,eAAe,CAAC;AAEvE,OAAO,EAAE,4BAA4B,EAAE,2BAA2B,EAAE,MAAM,uCAAuC,CAAC;;AAElH;;;;;;;;;;;;;;GAcG;AACH,qBAOa,oCAAoC;IAC/C,wFAAwF;IAC7D,KAAK,EAAG,4BAA4B,CAAC;IAEhE,sGAAsG;IAC7F,IAAI,EAAE,2BAA2B,GAAG,IAAI,CAAQ;IAEzD,sGAAsG;IAC7F,QAAQ,SAAS;IAE1B,iGAAiG;IACvF,aAAa,uBAA8B;IAErD,qGAAqG;IACrG,IAAW,KAAK,IAAI,MAAM,CAGzB;IAED,4FAA4F;IAC5F,IAAW,YAAY,IAAI,OAAO,CAOjC;IAED;;;;;;OAMG;IACH,IAAW,UAAU,IAAI,MAAM,GAAG,IAAI,CAWrC;IAED,kFAAkF;IAClF,IAAW,WAAW,IAAI,OAAO,CAEhC;IAED,iFAAiF;IACjF,IAAW,UAAU,IAAI,OAAO,CAE/B;IAED,0EAA0E;IACnE,IAAI,CAAC,KAAK,CAAC,EAAE,UAAU,GAAG,IAAI;IAQrC,6FAA6F;IAC7F,OAAO,CAAC,gBAAgB;yCArEb,oCAAoC;2CAApC,oCAAoC;CAmFhD"}
1
+ {"version":3,"file":"realtime-session-timeline-card.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/realtime/realtime-session-timeline-card.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,YAAY,EAAiB,MAAM,eAAe,CAAC;AAEvE,OAAO,EAOL,KAAK,yBAAyB,EAC9B,KAAK,4BAA4B,EACjC,KAAK,2BAA2B,EACjC,MAAM,uCAAuC,CAAC;;AAG/C;;;;;;;;;;;;;;;;GAgBG;AACH,qBAOa,oCAAoC;IAC/C,wFAAwF;IAC7D,KAAK,EAAG,4BAA4B,CAAC;IAEhE,wGAAwG;IAC/F,IAAI,EAAE,2BAA2B,GAAG,IAAI,CAAQ;IAEzD;;;OAGG;IACM,aAAa,EAAE,MAAM,GAAG,IAAI,CAAQ;IAE7C;;;;OAIG;IACM,QAAQ,SAAS;IAE1B,iGAAiG;IACvF,aAAa,uBAA8B;IAQrD,iFAAiF;IACjF,IAAW,KAAK,IAAI,MAAM,CAEzB;IAED,mFAAmF;IACnF,IAAW,SAAS,IAAI,IAAI,GAAG,IAAI,CAElC;IAED,+FAA+F;IAC/F,IAAW,UAAU,IAAI,MAAM,GAAG,IAAI,CAErC;IAED,gFAAgF;IAChF,IAAW,UAAU,IAAI,yBAAyB,CAAC,MAAM,CAAC,GAAG,IAAI,CAEhE;IAED,qEAAqE;IACrE,IAAW,WAAW,IAAI,OAAO,CAEhC;IAED,gEAAgE;IAChE,IAAW,UAAU,IAAI,OAAO,CAE/B;IAED,8FAA8F;IAC9F,IAAW,aAAa,IAAI,MAAM,GAAG,IAAI,CAExC;IAED,iDAAiD;IACjD,IAAW,iBAAiB,IAAI,MAAM,CAErC;IAED,qFAAqF;IACrF,IAAW,YAAY,IAAI,MAAM,CAEhC;IAED,4FAA4F;IAC5F,IAAW,WAAW,IAAI,MAAM,CAE/B;IAED,gEAAgE;IAChE,IAAW,iBAAiB,IAAI,MAAM,CAErC;IAED,2EAA2E;IACpE,IAAI,CAAC,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI;IAQhC,OAAO,KAAK,MAAM,GAEjB;yCA/FU,oCAAoC;2CAApC,oCAAoC;CAgGhD"}