@memberjunction/ng-conversations 5.40.2 → 5.41.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (378) hide show
  1. package/README.md +57 -0
  2. package/dist/__tests__/channel-optional-surface.test.d.ts +2 -0
  3. package/dist/__tests__/channel-optional-surface.test.d.ts.map +1 -0
  4. package/dist/__tests__/channel-optional-surface.test.js +53 -0
  5. package/dist/__tests__/channel-optional-surface.test.js.map +1 -0
  6. package/dist/__tests__/chat-events.test.d.ts +14 -0
  7. package/dist/__tests__/chat-events.test.d.ts.map +1 -0
  8. package/dist/__tests__/chat-events.test.js +109 -0
  9. package/dist/__tests__/chat-events.test.js.map +1 -0
  10. package/dist/__tests__/conversation-naming.test.d.ts +2 -0
  11. package/dist/__tests__/conversation-naming.test.d.ts.map +1 -0
  12. package/dist/__tests__/conversation-naming.test.js +110 -0
  13. package/dist/__tests__/conversation-naming.test.js.map +1 -0
  14. package/dist/__tests__/delegation-result-parser.test.d.ts +2 -0
  15. package/dist/__tests__/delegation-result-parser.test.d.ts.map +1 -0
  16. package/dist/__tests__/delegation-result-parser.test.js +107 -0
  17. package/dist/__tests__/delegation-result-parser.test.js.map +1 -0
  18. package/dist/__tests__/event-wiring.test.d.ts +15 -0
  19. package/dist/__tests__/event-wiring.test.d.ts.map +1 -0
  20. package/dist/__tests__/event-wiring.test.js +100 -0
  21. package/dist/__tests__/event-wiring.test.js.map +1 -0
  22. package/dist/__tests__/narration-template.test.d.ts +2 -0
  23. package/dist/__tests__/narration-template.test.d.ts.map +1 -0
  24. package/dist/__tests__/narration-template.test.js +76 -0
  25. package/dist/__tests__/narration-template.test.js.map +1 -0
  26. package/dist/__tests__/realtime-agent-picker-models.test.d.ts +2 -0
  27. package/dist/__tests__/realtime-agent-picker-models.test.d.ts.map +1 -0
  28. package/dist/__tests__/realtime-agent-picker-models.test.js +49 -0
  29. package/dist/__tests__/realtime-agent-picker-models.test.js.map +1 -0
  30. package/dist/__tests__/realtime-audio-visuals.test.d.ts +2 -0
  31. package/dist/__tests__/realtime-audio-visuals.test.d.ts.map +1 -0
  32. package/dist/__tests__/realtime-audio-visuals.test.js +123 -0
  33. package/dist/__tests__/realtime-audio-visuals.test.js.map +1 -0
  34. package/dist/__tests__/realtime-delegation-card-cancel.test.d.ts +2 -0
  35. package/dist/__tests__/realtime-delegation-card-cancel.test.d.ts.map +1 -0
  36. package/dist/__tests__/realtime-delegation-card-cancel.test.js +48 -0
  37. package/dist/__tests__/realtime-delegation-card-cancel.test.js.map +1 -0
  38. package/dist/__tests__/realtime-disclosure.test.d.ts +2 -0
  39. package/dist/__tests__/realtime-disclosure.test.d.ts.map +1 -0
  40. package/dist/__tests__/realtime-disclosure.test.js +164 -0
  41. package/dist/__tests__/realtime-disclosure.test.js.map +1 -0
  42. package/dist/__tests__/realtime-pairing.test.d.ts +2 -0
  43. package/dist/__tests__/realtime-pairing.test.d.ts.map +1 -0
  44. package/dist/__tests__/realtime-pairing.test.js +207 -0
  45. package/dist/__tests__/realtime-pairing.test.js.map +1 -0
  46. package/dist/__tests__/realtime-review-lifecycle.test.d.ts +2 -0
  47. package/dist/__tests__/realtime-review-lifecycle.test.d.ts.map +1 -0
  48. package/dist/__tests__/realtime-review-lifecycle.test.js +154 -0
  49. package/dist/__tests__/realtime-review-lifecycle.test.js.map +1 -0
  50. package/dist/__tests__/realtime-session-cancel-usage.test.d.ts +2 -0
  51. package/dist/__tests__/realtime-session-cancel-usage.test.d.ts.map +1 -0
  52. package/dist/__tests__/realtime-session-cancel-usage.test.js +230 -0
  53. package/dist/__tests__/realtime-session-cancel-usage.test.js.map +1 -0
  54. package/dist/__tests__/realtime-session-channels.test.d.ts +2 -0
  55. package/dist/__tests__/realtime-session-channels.test.d.ts.map +1 -0
  56. package/dist/__tests__/realtime-session-channels.test.js +252 -0
  57. package/dist/__tests__/realtime-session-channels.test.js.map +1 -0
  58. package/dist/__tests__/realtime-session-client-tools.test.d.ts +2 -0
  59. package/dist/__tests__/realtime-session-client-tools.test.d.ts.map +1 -0
  60. package/dist/__tests__/realtime-session-client-tools.test.js +103 -0
  61. package/dist/__tests__/realtime-session-client-tools.test.js.map +1 -0
  62. package/dist/__tests__/realtime-session-minimized.test.d.ts +2 -0
  63. package/dist/__tests__/realtime-session-minimized.test.d.ts.map +1 -0
  64. package/dist/__tests__/realtime-session-minimized.test.js +32 -0
  65. package/dist/__tests__/realtime-session-minimized.test.js.map +1 -0
  66. package/dist/__tests__/realtime-session-mint.test.d.ts +2 -0
  67. package/dist/__tests__/realtime-session-mint.test.d.ts.map +1 -0
  68. package/dist/__tests__/realtime-session-mint.test.js +69 -0
  69. package/dist/__tests__/realtime-session-mint.test.js.map +1 -0
  70. package/dist/__tests__/realtime-session-policy.test.d.ts +2 -0
  71. package/dist/__tests__/realtime-session-policy.test.d.ts.map +1 -0
  72. package/dist/__tests__/realtime-session-policy.test.js +303 -0
  73. package/dist/__tests__/realtime-session-policy.test.js.map +1 -0
  74. package/dist/__tests__/realtime-session-review.service.test.d.ts +2 -0
  75. package/dist/__tests__/realtime-session-review.service.test.d.ts.map +1 -0
  76. package/dist/__tests__/realtime-session-review.service.test.js +743 -0
  77. package/dist/__tests__/realtime-session-review.service.test.js.map +1 -0
  78. package/dist/__tests__/realtime-session-state.test.d.ts +2 -0
  79. package/dist/__tests__/realtime-session-state.test.d.ts.map +1 -0
  80. package/dist/__tests__/realtime-session-state.test.js +83 -0
  81. package/dist/__tests__/realtime-session-state.test.js.map +1 -0
  82. package/dist/__tests__/realtime-session-timeline-card.test.d.ts +2 -0
  83. package/dist/__tests__/realtime-session-timeline-card.test.d.ts.map +1 -0
  84. package/dist/__tests__/realtime-session-timeline-card.test.js +106 -0
  85. package/dist/__tests__/realtime-session-timeline-card.test.js.map +1 -0
  86. package/dist/__tests__/realtime-session-timeline.test.d.ts +2 -0
  87. package/dist/__tests__/realtime-session-timeline.test.d.ts.map +1 -0
  88. package/dist/__tests__/realtime-session-timeline.test.js +142 -0
  89. package/dist/__tests__/realtime-session-timeline.test.js.map +1 -0
  90. package/dist/__tests__/realtime-sessions-adapter.test.d.ts +19 -0
  91. package/dist/__tests__/realtime-sessions-adapter.test.d.ts.map +1 -0
  92. package/dist/__tests__/realtime-sessions-adapter.test.js +188 -0
  93. package/dist/__tests__/realtime-sessions-adapter.test.js.map +1 -0
  94. package/dist/__tests__/realtime-surface-panel-prefs.test.d.ts +2 -0
  95. package/dist/__tests__/realtime-surface-panel-prefs.test.d.ts.map +1 -0
  96. package/dist/__tests__/realtime-surface-panel-prefs.test.js +100 -0
  97. package/dist/__tests__/realtime-surface-panel-prefs.test.js.map +1 -0
  98. package/dist/__tests__/realtime-surface-tabs-model.test.d.ts +2 -0
  99. package/dist/__tests__/realtime-surface-tabs-model.test.d.ts.map +1 -0
  100. package/dist/__tests__/realtime-surface-tabs-model.test.js +193 -0
  101. package/dist/__tests__/realtime-surface-tabs-model.test.js.map +1 -0
  102. package/dist/__tests__/remote-browser-audio-player.test.d.ts +2 -0
  103. package/dist/__tests__/remote-browser-audio-player.test.d.ts.map +1 -0
  104. package/dist/__tests__/remote-browser-audio-player.test.js +137 -0
  105. package/dist/__tests__/remote-browser-audio-player.test.js.map +1 -0
  106. package/dist/__tests__/remote-browser-channel.test.d.ts +2 -0
  107. package/dist/__tests__/remote-browser-channel.test.d.ts.map +1 -0
  108. package/dist/__tests__/remote-browser-channel.test.js +423 -0
  109. package/dist/__tests__/remote-browser-channel.test.js.map +1 -0
  110. package/dist/__tests__/slot-defaults.test.d.ts +24 -0
  111. package/dist/__tests__/slot-defaults.test.d.ts.map +1 -0
  112. package/dist/__tests__/slot-defaults.test.js +63 -0
  113. package/dist/__tests__/slot-defaults.test.js.map +1 -0
  114. package/dist/__tests__/user-authorization.test.d.ts +2 -0
  115. package/dist/__tests__/user-authorization.test.d.ts.map +1 -0
  116. package/dist/__tests__/user-authorization.test.js +97 -0
  117. package/dist/__tests__/user-authorization.test.js.map +1 -0
  118. package/dist/__tests__/voice-session-narration.test.d.ts +2 -0
  119. package/dist/__tests__/voice-session-narration.test.d.ts.map +1 -0
  120. package/dist/__tests__/voice-session-narration.test.js +609 -0
  121. package/dist/__tests__/voice-session-narration.test.js.map +1 -0
  122. package/dist/__tests__/whiteboard-artifact-viewer.test.d.ts +2 -0
  123. package/dist/__tests__/whiteboard-artifact-viewer.test.d.ts.map +1 -0
  124. package/dist/__tests__/whiteboard-artifact-viewer.test.js +101 -0
  125. package/dist/__tests__/whiteboard-artifact-viewer.test.js.map +1 -0
  126. package/dist/__tests__/whiteboard-channel.test.d.ts +2 -0
  127. package/dist/__tests__/whiteboard-channel.test.d.ts.map +1 -0
  128. package/dist/__tests__/whiteboard-channel.test.js +260 -0
  129. package/dist/__tests__/whiteboard-channel.test.js.map +1 -0
  130. package/dist/__tests__/whiteboard-restore-state.test.d.ts +2 -0
  131. package/dist/__tests__/whiteboard-restore-state.test.d.ts.map +1 -0
  132. package/dist/__tests__/whiteboard-restore-state.test.js +108 -0
  133. package/dist/__tests__/whiteboard-restore-state.test.js.map +1 -0
  134. package/dist/lib/components/conversation/conversation-chat-area.component.d.ts +205 -3
  135. package/dist/lib/components/conversation/conversation-chat-area.component.d.ts.map +1 -1
  136. package/dist/lib/components/conversation/conversation-chat-area.component.js +911 -342
  137. package/dist/lib/components/conversation/conversation-chat-area.component.js.map +1 -1
  138. package/dist/lib/components/mention/mention-dropdown.component.js +35 -17
  139. package/dist/lib/components/mention/mention-dropdown.component.js.map +1 -1
  140. package/dist/lib/components/mention/mention-editor.component.d.ts +4 -0
  141. package/dist/lib/components/mention/mention-editor.component.d.ts.map +1 -1
  142. package/dist/lib/components/mention/mention-editor.component.js +43 -19
  143. package/dist/lib/components/mention/mention-editor.component.js.map +1 -1
  144. package/dist/lib/components/message/message-input-box.component.d.ts +17 -1
  145. package/dist/lib/components/message/message-input-box.component.d.ts.map +1 -1
  146. package/dist/lib/components/message/message-input-box.component.js +73 -15
  147. package/dist/lib/components/message/message-input-box.component.js.map +1 -1
  148. package/dist/lib/components/message/message-input.component.d.ts +142 -6
  149. package/dist/lib/components/message/message-input.component.d.ts.map +1 -1
  150. package/dist/lib/components/message/message-input.component.js +328 -82
  151. package/dist/lib/components/message/message-input.component.js.map +1 -1
  152. package/dist/lib/components/message/message-item.component.d.ts +28 -3
  153. package/dist/lib/components/message/message-item.component.d.ts.map +1 -1
  154. package/dist/lib/components/message/message-item.component.js +180 -108
  155. package/dist/lib/components/message/message-item.component.js.map +1 -1
  156. package/dist/lib/components/message/message-list.component.d.ts +81 -2
  157. package/dist/lib/components/message/message-list.component.d.ts.map +1 -1
  158. package/dist/lib/components/message/message-list.component.js +252 -87
  159. package/dist/lib/components/message/message-list.component.js.map +1 -1
  160. package/dist/lib/components/realtime/channels/base-realtime-channel-client.d.ts +282 -0
  161. package/dist/lib/components/realtime/channels/base-realtime-channel-client.d.ts.map +1 -0
  162. package/dist/lib/components/realtime/channels/base-realtime-channel-client.js +158 -0
  163. package/dist/lib/components/realtime/channels/base-realtime-channel-client.js.map +1 -0
  164. package/dist/lib/components/realtime/channels/channel-onboarding-panel.component.d.ts +25 -0
  165. package/dist/lib/components/realtime/channels/channel-onboarding-panel.component.d.ts.map +1 -0
  166. package/dist/lib/components/realtime/channels/channel-onboarding-panel.component.js +140 -0
  167. package/dist/lib/components/realtime/channels/channel-onboarding-panel.component.js.map +1 -0
  168. package/dist/lib/components/realtime/channels/realtime-channel-pane.component.d.ts +35 -0
  169. package/dist/lib/components/realtime/channels/realtime-channel-pane.component.d.ts.map +1 -0
  170. package/dist/lib/components/realtime/channels/realtime-channel-pane.component.js +58 -0
  171. package/dist/lib/components/realtime/channels/realtime-channel-pane.component.js.map +1 -0
  172. package/dist/lib/components/realtime/realtime-activity-rail.component.d.ts +63 -0
  173. package/dist/lib/components/realtime/realtime-activity-rail.component.d.ts.map +1 -0
  174. package/dist/lib/components/realtime/realtime-activity-rail.component.js +260 -0
  175. package/dist/lib/components/realtime/realtime-activity-rail.component.js.map +1 -0
  176. package/dist/lib/components/realtime/realtime-agent-banner.component.d.ts +117 -0
  177. package/dist/lib/components/realtime/realtime-agent-banner.component.d.ts.map +1 -0
  178. package/dist/lib/components/realtime/realtime-agent-banner.component.js +504 -0
  179. package/dist/lib/components/realtime/realtime-agent-banner.component.js.map +1 -0
  180. package/dist/lib/components/realtime/realtime-agent-picker.component.d.ts +168 -0
  181. package/dist/lib/components/realtime/realtime-agent-picker.component.d.ts.map +1 -0
  182. package/dist/lib/components/realtime/realtime-agent-picker.component.js +556 -0
  183. package/dist/lib/components/realtime/realtime-agent-picker.component.js.map +1 -0
  184. package/dist/lib/components/realtime/realtime-audio-visuals.d.ts +97 -0
  185. package/dist/lib/components/realtime/realtime-audio-visuals.d.ts.map +1 -0
  186. package/dist/lib/components/realtime/realtime-audio-visuals.js +139 -0
  187. package/dist/lib/components/realtime/realtime-audio-visuals.js.map +1 -0
  188. package/dist/lib/components/realtime/realtime-channel-strip.component.d.ts +29 -0
  189. package/dist/lib/components/realtime/realtime-channel-strip.component.d.ts.map +1 -0
  190. package/dist/lib/components/realtime/realtime-channel-strip.component.js +69 -0
  191. package/dist/lib/components/realtime/realtime-channel-strip.component.js.map +1 -0
  192. package/dist/lib/components/realtime/realtime-composer.component.d.ts +65 -0
  193. package/dist/lib/components/realtime/realtime-composer.component.d.ts.map +1 -0
  194. package/dist/lib/components/realtime/realtime-composer.component.js +256 -0
  195. package/dist/lib/components/realtime/realtime-composer.component.js.map +1 -0
  196. package/dist/lib/components/realtime/realtime-delegation-card.component.d.ts +71 -0
  197. package/dist/lib/components/realtime/realtime-delegation-card.component.d.ts.map +1 -0
  198. package/dist/lib/components/realtime/realtime-delegation-card.component.js +324 -0
  199. package/dist/lib/components/realtime/realtime-delegation-card.component.js.map +1 -0
  200. package/dist/lib/components/realtime/realtime-disclosure.d.ts +135 -0
  201. package/dist/lib/components/realtime/realtime-disclosure.d.ts.map +1 -0
  202. package/dist/lib/components/realtime/realtime-disclosure.js +188 -0
  203. package/dist/lib/components/realtime/realtime-disclosure.js.map +1 -0
  204. package/dist/lib/components/realtime/realtime-session-overlay.component.d.ts +491 -0
  205. package/dist/lib/components/realtime/realtime-session-overlay.component.d.ts.map +1 -0
  206. package/dist/lib/components/realtime/realtime-session-overlay.component.js +1274 -0
  207. package/dist/lib/components/realtime/realtime-session-overlay.component.js.map +1 -0
  208. package/dist/lib/components/realtime/realtime-session-state.d.ts +191 -0
  209. package/dist/lib/components/realtime/realtime-session-state.d.ts.map +1 -0
  210. package/dist/lib/components/realtime/realtime-session-state.js +244 -0
  211. package/dist/lib/components/realtime/realtime-session-state.js.map +1 -0
  212. package/dist/lib/components/realtime/realtime-session-thread.component.d.ts +56 -0
  213. package/dist/lib/components/realtime/realtime-session-thread.component.d.ts.map +1 -0
  214. package/dist/lib/components/realtime/realtime-session-thread.component.js +246 -0
  215. package/dist/lib/components/realtime/realtime-session-thread.component.js.map +1 -0
  216. package/dist/lib/components/realtime/realtime-session-timeline-card.component.d.ts +51 -0
  217. package/dist/lib/components/realtime/realtime-session-timeline-card.component.d.ts.map +1 -0
  218. package/dist/lib/components/realtime/realtime-session-timeline-card.component.js +193 -0
  219. package/dist/lib/components/realtime/realtime-session-timeline-card.component.js.map +1 -0
  220. package/dist/lib/components/realtime/realtime-surface-panel-prefs.d.ts +77 -0
  221. package/dist/lib/components/realtime/realtime-surface-panel-prefs.d.ts.map +1 -0
  222. package/dist/lib/components/realtime/realtime-surface-panel-prefs.js +114 -0
  223. package/dist/lib/components/realtime/realtime-surface-panel-prefs.js.map +1 -0
  224. package/dist/lib/components/realtime/realtime-surface-tabs.component.d.ts +173 -0
  225. package/dist/lib/components/realtime/realtime-surface-tabs.component.d.ts.map +1 -0
  226. package/dist/lib/components/realtime/realtime-surface-tabs.component.js +496 -0
  227. package/dist/lib/components/realtime/realtime-surface-tabs.component.js.map +1 -0
  228. package/dist/lib/components/realtime/realtime-surface-tabs.model.d.ts +181 -0
  229. package/dist/lib/components/realtime/realtime-surface-tabs.model.d.ts.map +1 -0
  230. package/dist/lib/components/realtime/realtime-surface-tabs.model.js +223 -0
  231. package/dist/lib/components/realtime/realtime-surface-tabs.model.js.map +1 -0
  232. package/dist/lib/components/realtime/remote-browser/remote-browser-audio-player.d.ts +163 -0
  233. package/dist/lib/components/realtime/remote-browser/remote-browser-audio-player.d.ts.map +1 -0
  234. package/dist/lib/components/realtime/remote-browser/remote-browser-audio-player.js +309 -0
  235. package/dist/lib/components/realtime/remote-browser/remote-browser-audio-player.js.map +1 -0
  236. package/dist/lib/components/realtime/remote-browser/remote-browser-channel.d.ts +168 -0
  237. package/dist/lib/components/realtime/remote-browser/remote-browser-channel.d.ts.map +1 -0
  238. package/dist/lib/components/realtime/remote-browser/remote-browser-channel.js +524 -0
  239. package/dist/lib/components/realtime/remote-browser/remote-browser-channel.js.map +1 -0
  240. package/dist/lib/components/realtime/remote-browser/remote-browser-surface.component.d.ts +346 -0
  241. package/dist/lib/components/realtime/remote-browser/remote-browser-surface.component.d.ts.map +1 -0
  242. package/dist/lib/components/realtime/remote-browser/remote-browser-surface.component.js +851 -0
  243. package/dist/lib/components/realtime/remote-browser/remote-browser-surface.component.js.map +1 -0
  244. package/dist/lib/components/realtime/remote-browser/remote-browser-tools.d.ts +86 -0
  245. package/dist/lib/components/realtime/remote-browser/remote-browser-tools.d.ts.map +1 -0
  246. package/dist/lib/components/realtime/remote-browser/remote-browser-tools.js +210 -0
  247. package/dist/lib/components/realtime/remote-browser/remote-browser-tools.js.map +1 -0
  248. package/dist/lib/components/realtime/whiteboard/whiteboard-artifact-viewer.component.d.ts +48 -0
  249. package/dist/lib/components/realtime/whiteboard/whiteboard-artifact-viewer.component.d.ts.map +1 -0
  250. package/dist/lib/components/realtime/whiteboard/whiteboard-artifact-viewer.component.js +180 -0
  251. package/dist/lib/components/realtime/whiteboard/whiteboard-artifact-viewer.component.js.map +1 -0
  252. package/dist/lib/components/realtime/whiteboard/whiteboard-channel.d.ts +119 -0
  253. package/dist/lib/components/realtime/whiteboard/whiteboard-channel.d.ts.map +1 -0
  254. package/dist/lib/components/realtime/whiteboard/whiteboard-channel.js +274 -0
  255. package/dist/lib/components/realtime/whiteboard/whiteboard-channel.js.map +1 -0
  256. package/dist/lib/components/slots/mj-chat-agent-presence-default.component.d.ts +11 -0
  257. package/dist/lib/components/slots/mj-chat-agent-presence-default.component.d.ts.map +1 -0
  258. package/dist/lib/components/slots/mj-chat-agent-presence-default.component.js +98 -0
  259. package/dist/lib/components/slots/mj-chat-agent-presence-default.component.js.map +1 -0
  260. package/dist/lib/components/slots/mj-chat-demonstration-surface-default.component.d.ts +9 -0
  261. package/dist/lib/components/slots/mj-chat-demonstration-surface-default.component.d.ts.map +1 -0
  262. package/dist/lib/components/slots/mj-chat-demonstration-surface-default.component.js +35 -0
  263. package/dist/lib/components/slots/mj-chat-demonstration-surface-default.component.js.map +1 -0
  264. package/dist/lib/components/slots/mj-chat-empty-state-default.component.d.ts +28 -0
  265. package/dist/lib/components/slots/mj-chat-empty-state-default.component.d.ts.map +1 -0
  266. package/dist/lib/components/slots/mj-chat-empty-state-default.component.js +104 -0
  267. package/dist/lib/components/slots/mj-chat-empty-state-default.component.js.map +1 -0
  268. package/dist/lib/components/slots/mj-chat-header-default.component.d.ts +11 -0
  269. package/dist/lib/components/slots/mj-chat-header-default.component.d.ts.map +1 -0
  270. package/dist/lib/components/slots/mj-chat-header-default.component.js +103 -0
  271. package/dist/lib/components/slots/mj-chat-header-default.component.js.map +1 -0
  272. package/dist/lib/components/slots/mj-chat-message-bubble-default.component.d.ts +15 -0
  273. package/dist/lib/components/slots/mj-chat-message-bubble-default.component.d.ts.map +1 -0
  274. package/dist/lib/components/slots/mj-chat-message-bubble-default.component.js +73 -0
  275. package/dist/lib/components/slots/mj-chat-message-bubble-default.component.js.map +1 -0
  276. package/dist/lib/components/slots/mj-chat-message-extra-default.component.d.ts +9 -0
  277. package/dist/lib/components/slots/mj-chat-message-extra-default.component.d.ts.map +1 -0
  278. package/dist/lib/components/slots/mj-chat-message-extra-default.component.js +34 -0
  279. package/dist/lib/components/slots/mj-chat-message-extra-default.component.js.map +1 -0
  280. package/dist/lib/components/slots/slot-interfaces.d.ts +95 -0
  281. package/dist/lib/components/slots/slot-interfaces.d.ts.map +1 -0
  282. package/dist/lib/components/slots/slot-interfaces.js +18 -0
  283. package/dist/lib/components/slots/slot-interfaces.js.map +1 -0
  284. package/dist/lib/components/workspace/conversation-workspace.component.d.ts +11 -0
  285. package/dist/lib/components/workspace/conversation-workspace.component.d.ts.map +1 -1
  286. package/dist/lib/components/workspace/conversation-workspace.component.js +28 -4
  287. package/dist/lib/components/workspace/conversation-workspace.component.js.map +1 -1
  288. package/dist/lib/conversations.module.d.ts +12 -1
  289. package/dist/lib/conversations.module.d.ts.map +1 -1
  290. package/dist/lib/conversations.module.js +93 -5
  291. package/dist/lib/conversations.module.js.map +1 -1
  292. package/dist/lib/directives/chat-slot.directive.d.ts +44 -0
  293. package/dist/lib/directives/chat-slot.directive.d.ts.map +1 -0
  294. package/dist/lib/directives/chat-slot.directive.js +54 -0
  295. package/dist/lib/directives/chat-slot.directive.js.map +1 -0
  296. package/dist/lib/events/chat-events.d.ts +137 -0
  297. package/dist/lib/events/chat-events.d.ts.map +1 -0
  298. package/dist/lib/events/chat-events.js +189 -0
  299. package/dist/lib/events/chat-events.js.map +1 -0
  300. package/dist/lib/models/conversation-state.model.d.ts +2 -1
  301. package/dist/lib/models/conversation-state.model.d.ts.map +1 -1
  302. package/dist/lib/models/conversation-state.model.js.map +1 -1
  303. package/dist/lib/services/artifact-state.service.d.ts.map +1 -1
  304. package/dist/lib/services/artifact-state.service.js +23 -6
  305. package/dist/lib/services/artifact-state.service.js.map +1 -1
  306. package/dist/lib/services/conversation-agent.service.d.ts +60 -74
  307. package/dist/lib/services/conversation-agent.service.d.ts.map +1 -1
  308. package/dist/lib/services/conversation-agent.service.js +100 -313
  309. package/dist/lib/services/conversation-agent.service.js.map +1 -1
  310. package/dist/lib/services/conversation-bridge.service.d.ts +11 -70
  311. package/dist/lib/services/conversation-bridge.service.d.ts.map +1 -1
  312. package/dist/lib/services/conversation-bridge.service.js +51 -85
  313. package/dist/lib/services/conversation-bridge.service.js.map +1 -1
  314. package/dist/lib/services/conversation-naming.d.ts +63 -0
  315. package/dist/lib/services/conversation-naming.d.ts.map +1 -0
  316. package/dist/lib/services/conversation-naming.js +58 -0
  317. package/dist/lib/services/conversation-naming.js.map +1 -0
  318. package/dist/lib/services/conversation-streaming.service.d.ts +24 -154
  319. package/dist/lib/services/conversation-streaming.service.d.ts.map +1 -1
  320. package/dist/lib/services/conversation-streaming.service.js +39 -361
  321. package/dist/lib/services/conversation-streaming.service.js.map +1 -1
  322. package/dist/lib/services/conversations-runtime-bootstrap.service.d.ts +10 -0
  323. package/dist/lib/services/conversations-runtime-bootstrap.service.d.ts.map +1 -0
  324. package/dist/lib/services/conversations-runtime-bootstrap.service.js +104 -0
  325. package/dist/lib/services/conversations-runtime-bootstrap.service.js.map +1 -0
  326. package/dist/lib/services/delegation-result-parser.d.ts +45 -0
  327. package/dist/lib/services/delegation-result-parser.d.ts.map +1 -0
  328. package/dist/lib/services/delegation-result-parser.js +48 -0
  329. package/dist/lib/services/delegation-result-parser.js.map +1 -0
  330. package/dist/lib/services/mention-autocomplete.service.d.ts +19 -4
  331. package/dist/lib/services/mention-autocomplete.service.d.ts.map +1 -1
  332. package/dist/lib/services/mention-autocomplete.service.js +65 -4
  333. package/dist/lib/services/mention-autocomplete.service.js.map +1 -1
  334. package/dist/lib/services/mention-parser.service.d.ts +8 -53
  335. package/dist/lib/services/mention-parser.service.d.ts.map +1 -1
  336. package/dist/lib/services/mention-parser.service.js +32 -243
  337. package/dist/lib/services/mention-parser.service.js.map +1 -1
  338. package/dist/lib/services/narration-template.d.ts +42 -0
  339. package/dist/lib/services/narration-template.d.ts.map +1 -0
  340. package/dist/lib/services/narration-template.js +73 -0
  341. package/dist/lib/services/narration-template.js.map +1 -0
  342. package/dist/lib/services/realtime-pairing.d.ts +120 -0
  343. package/dist/lib/services/realtime-pairing.d.ts.map +1 -0
  344. package/dist/lib/services/realtime-pairing.js +150 -0
  345. package/dist/lib/services/realtime-pairing.js.map +1 -0
  346. package/dist/lib/services/realtime-session-review.service.d.ts +233 -0
  347. package/dist/lib/services/realtime-session-review.service.d.ts.map +1 -0
  348. package/dist/lib/services/realtime-session-review.service.js +417 -0
  349. package/dist/lib/services/realtime-session-review.service.js.map +1 -0
  350. package/dist/lib/services/realtime-session.service.d.ts +739 -0
  351. package/dist/lib/services/realtime-session.service.d.ts.map +1 -0
  352. package/dist/lib/services/realtime-session.service.js +1647 -0
  353. package/dist/lib/services/realtime-session.service.js.map +1 -0
  354. package/dist/lib/services/realtime-sessions-adapter.d.ts +54 -0
  355. package/dist/lib/services/realtime-sessions-adapter.d.ts.map +1 -0
  356. package/dist/lib/services/realtime-sessions-adapter.js +154 -0
  357. package/dist/lib/services/realtime-sessions-adapter.js.map +1 -0
  358. package/dist/lib/services/user-authorization.d.ts +67 -0
  359. package/dist/lib/services/user-authorization.d.ts.map +1 -0
  360. package/dist/lib/services/user-authorization.js +66 -0
  361. package/dist/lib/services/user-authorization.js.map +1 -0
  362. package/dist/lib/utils/realtime-session-timeline.d.ts +84 -0
  363. package/dist/lib/utils/realtime-session-timeline.d.ts.map +1 -0
  364. package/dist/lib/utils/realtime-session-timeline.js +94 -0
  365. package/dist/lib/utils/realtime-session-timeline.js.map +1 -0
  366. package/dist/public-api.d.ts +41 -0
  367. package/dist/public-api.d.ts.map +1 -1
  368. package/dist/public-api.js +50 -0
  369. package/dist/public-api.js.map +1 -1
  370. package/package.json +27 -24
  371. package/dist/__tests__/conversation-bridge.service.test.d.ts +0 -2
  372. package/dist/__tests__/conversation-bridge.service.test.d.ts.map +0 -1
  373. package/dist/__tests__/conversation-bridge.service.test.js +0 -98
  374. package/dist/__tests__/conversation-bridge.service.test.js.map +0 -1
  375. package/dist/__tests__/mention-parser.test.d.ts +0 -2
  376. package/dist/__tests__/mention-parser.test.d.ts.map +0 -1
  377. package/dist/__tests__/mention-parser.test.js +0 -154
  378. package/dist/__tests__/mention-parser.test.js.map +0 -1
@@ -0,0 +1,504 @@
1
+ import { Component, EventEmitter, HostListener, Input, Output } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "@angular/common";
5
+ const _forTrack0 = ($index, $item) => $item.Key;
6
+ function RealtimeAgentBannerComponent_Conditional_1_Conditional_7_Template(rf, ctx) { if (rf & 1) {
7
+ i0.ɵɵelementStart(0, "span", 6);
8
+ i0.ɵɵtext(1);
9
+ i0.ɵɵelementEnd();
10
+ } if (rf & 2) {
11
+ const ctx_r1 = i0.ɵɵnextContext(2);
12
+ i0.ɵɵadvance();
13
+ i0.ɵɵtextInterpolate(ctx_r1.ReviewRangeLabel);
14
+ } }
15
+ function RealtimeAgentBannerComponent_Conditional_1_Conditional_8_Template(rf, ctx) { if (rf & 1) {
16
+ i0.ɵɵelementStart(0, "span", 7);
17
+ i0.ɵɵtext(1);
18
+ i0.ɵɵelementEnd();
19
+ } if (rf & 2) {
20
+ const ctx_r1 = i0.ɵɵnextContext(2);
21
+ i0.ɵɵproperty("title", "Close reason: " + ctx_r1.ReviewCloseReason);
22
+ i0.ɵɵadvance();
23
+ i0.ɵɵtextInterpolate(ctx_r1.ReviewCloseReasonLabel);
24
+ } }
25
+ function RealtimeAgentBannerComponent_Conditional_1_Conditional_9_Template(rf, ctx) { if (rf & 1) {
26
+ const _r3 = i0.ɵɵgetCurrentView();
27
+ i0.ɵɵelementStart(0, "button", 17);
28
+ i0.ɵɵlistener("click", function RealtimeAgentBannerComponent_Conditional_1_Conditional_9_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OpenSession()); });
29
+ i0.ɵɵelement(1, "i", 18);
30
+ i0.ɵɵelementStart(2, "span");
31
+ i0.ɵɵtext(3, "Open session");
32
+ i0.ɵɵelementEnd()();
33
+ } }
34
+ function RealtimeAgentBannerComponent_Conditional_1_Template(rf, ctx) { if (rf & 1) {
35
+ const _r1 = i0.ɵɵgetCurrentView();
36
+ i0.ɵɵelement(0, "div", 1);
37
+ i0.ɵɵelementStart(1, "div", 2)(2, "span", 3);
38
+ i0.ɵɵtext(3);
39
+ i0.ɵɵelementEnd();
40
+ i0.ɵɵelementStart(4, "span", 4);
41
+ i0.ɵɵelement(5, "i", 5);
42
+ i0.ɵɵtext(6, " Session review");
43
+ i0.ɵɵelementEnd();
44
+ i0.ɵɵconditionalCreate(7, RealtimeAgentBannerComponent_Conditional_1_Conditional_7_Template, 2, 1, "span", 6);
45
+ i0.ɵɵconditionalCreate(8, RealtimeAgentBannerComponent_Conditional_1_Conditional_8_Template, 2, 2, "span", 7);
46
+ i0.ɵɵconditionalCreate(9, RealtimeAgentBannerComponent_Conditional_1_Conditional_9_Template, 4, 0, "button", 8);
47
+ i0.ɵɵelementEnd();
48
+ i0.ɵɵelementStart(10, "div", 9);
49
+ i0.ɵɵelement(11, "i", 10);
50
+ i0.ɵɵelementStart(12, "span", 11);
51
+ i0.ɵɵtext(13, "Reviewing past session");
52
+ i0.ɵɵelementEnd()();
53
+ i0.ɵɵelementStart(14, "div", 12)(15, "button", 13);
54
+ i0.ɵɵlistener("click", function RealtimeAgentBannerComponent_Conditional_1_Template_button_click_15_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.StartLiveRequested.emit()); });
55
+ i0.ɵɵelement(16, "i", 14);
56
+ i0.ɵɵelementStart(17, "span");
57
+ i0.ɵɵtext(18, "Start live session");
58
+ i0.ɵɵelementEnd()();
59
+ i0.ɵɵelementStart(19, "button", 15);
60
+ i0.ɵɵlistener("click", function RealtimeAgentBannerComponent_Conditional_1_Template_button_click_19_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.CloseRequested.emit()); });
61
+ i0.ɵɵelement(20, "i", 16);
62
+ i0.ɵɵelementEnd()();
63
+ } if (rf & 2) {
64
+ const ctx_r1 = i0.ɵɵnextContext();
65
+ i0.ɵɵadvance(3);
66
+ i0.ɵɵtextInterpolate1("Voice for ", ctx_r1.AgentName);
67
+ i0.ɵɵadvance(4);
68
+ i0.ɵɵconditional(ctx_r1.ReviewRangeLabel ? 7 : -1);
69
+ i0.ɵɵadvance();
70
+ i0.ɵɵconditional(ctx_r1.ReviewCloseReasonLabel ? 8 : -1);
71
+ i0.ɵɵadvance();
72
+ i0.ɵɵconditional(ctx_r1.ShowOpenSession ? 9 : -1);
73
+ } }
74
+ function RealtimeAgentBannerComponent_Conditional_2_Conditional_11_Template(rf, ctx) { if (rf & 1) {
75
+ i0.ɵɵelementStart(0, "span", 23);
76
+ i0.ɵɵtext(1);
77
+ i0.ɵɵelementEnd();
78
+ } if (rf & 2) {
79
+ const ctx_r1 = i0.ɵɵnextContext(2);
80
+ i0.ɵɵproperty("title", "Realtime voice model: " + ctx_r1.ModelName);
81
+ i0.ɵɵadvance();
82
+ i0.ɵɵtextInterpolate1("\u00B7 ", ctx_r1.ModelName);
83
+ } }
84
+ function RealtimeAgentBannerComponent_Conditional_2_Conditional_12_Template(rf, ctx) { if (rf & 1) {
85
+ const _r4 = i0.ɵɵgetCurrentView();
86
+ i0.ɵɵelementStart(0, "button", 17);
87
+ i0.ɵɵlistener("click", function RealtimeAgentBannerComponent_Conditional_2_Conditional_12_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OpenSession()); });
88
+ i0.ɵɵelement(1, "i", 18);
89
+ i0.ɵɵelementStart(2, "span");
90
+ i0.ɵɵtext(3, "Open session");
91
+ i0.ɵɵelementEnd()();
92
+ } }
93
+ function RealtimeAgentBannerComponent_Conditional_2_Conditional_14_Template(rf, ctx) { if (rf & 1) {
94
+ i0.ɵɵelement(0, "i", 25);
95
+ } }
96
+ function RealtimeAgentBannerComponent_Conditional_2_Conditional_15_Template(rf, ctx) { if (rf & 1) {
97
+ i0.ɵɵelementStart(0, "div", 33);
98
+ i0.ɵɵelement(1, "span")(2, "span")(3, "span")(4, "span")(5, "span")(6, "span")(7, "span")(8, "span");
99
+ i0.ɵɵelementEnd();
100
+ } if (rf & 2) {
101
+ const ctx_r1 = i0.ɵɵnextContext(2);
102
+ i0.ɵɵclassProp("waveform--idle", ctx_r1.State !== "speaking");
103
+ } }
104
+ function RealtimeAgentBannerComponent_Conditional_2_Conditional_19_Template(rf, ctx) { if (rf & 1) {
105
+ const _r5 = i0.ɵɵgetCurrentView();
106
+ i0.ɵɵelementStart(0, "button", 34);
107
+ i0.ɵɵlistener("click", function RealtimeAgentBannerComponent_Conditional_2_Conditional_19_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.PureAudioRequested.emit()); });
108
+ i0.ɵɵelement(1, "i", 35);
109
+ i0.ɵɵelementEnd();
110
+ } }
111
+ function RealtimeAgentBannerComponent_Conditional_2_Conditional_20_Template(rf, ctx) { if (rf & 1) {
112
+ const _r6 = i0.ɵɵgetCurrentView();
113
+ i0.ɵɵelementStart(0, "button", 36);
114
+ i0.ɵɵlistener("click", function RealtimeAgentBannerComponent_Conditional_2_Conditional_20_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r6); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.ToggleCaptions()); });
115
+ i0.ɵɵelement(1, "i", 37);
116
+ i0.ɵɵelementEnd();
117
+ } if (rf & 2) {
118
+ const ctx_r1 = i0.ɵɵnextContext(2);
119
+ i0.ɵɵclassProp("iconb--on", ctx_r1.CaptionsOn);
120
+ i0.ɵɵproperty("title", ctx_r1.CaptionsOn ? "Hide captions" : "Show captions");
121
+ i0.ɵɵattribute("aria-pressed", ctx_r1.CaptionsOn);
122
+ } }
123
+ function RealtimeAgentBannerComponent_Conditional_2_Conditional_21_Template(rf, ctx) { if (rf & 1) {
124
+ const _r7 = i0.ɵɵgetCurrentView();
125
+ i0.ɵɵelementStart(0, "button", 38);
126
+ i0.ɵɵlistener("click", function RealtimeAgentBannerComponent_Conditional_2_Conditional_21_Template_button_click_0_listener($event) { i0.ɵɵrestoreView(_r7); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.ToggleGear($event)); });
127
+ i0.ɵɵelement(1, "i", 39);
128
+ i0.ɵɵelementEnd();
129
+ } if (rf & 2) {
130
+ const ctx_r1 = i0.ɵɵnextContext(2);
131
+ i0.ɵɵclassProp("iconb--on", ctx_r1.GearOpen || ctx_r1.DevMode);
132
+ i0.ɵɵattribute("aria-expanded", ctx_r1.GearOpen);
133
+ } }
134
+ function RealtimeAgentBannerComponent_Conditional_2_Conditional_22_Template(rf, ctx) { if (rf & 1) {
135
+ const _r8 = i0.ɵɵgetCurrentView();
136
+ i0.ɵɵelementStart(0, "button", 40);
137
+ i0.ɵɵlistener("click", function RealtimeAgentBannerComponent_Conditional_2_Conditional_22_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r8); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.MinimizeRequested.emit()); });
138
+ i0.ɵɵelement(1, "i", 41);
139
+ i0.ɵɵelementEnd();
140
+ } }
141
+ function RealtimeAgentBannerComponent_Conditional_2_Conditional_23_Template(rf, ctx) { if (rf & 1) {
142
+ const _r9 = i0.ɵɵgetCurrentView();
143
+ i0.ɵɵelement(0, "span", 42);
144
+ i0.ɵɵelementStart(1, "button", 43);
145
+ i0.ɵɵlistener("click", function RealtimeAgentBannerComponent_Conditional_2_Conditional_23_Template_button_click_1_listener() { i0.ɵɵrestoreView(_r9); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.EndRequested.emit()); });
146
+ i0.ɵɵelement(2, "i", 44);
147
+ i0.ɵɵelementStart(3, "span");
148
+ i0.ɵɵtext(4, "End call");
149
+ i0.ɵɵelementEnd()();
150
+ } }
151
+ function RealtimeAgentBannerComponent_Conditional_2_Conditional_24_For_8_Template(rf, ctx) { if (rf & 1) {
152
+ const _r11 = i0.ɵɵgetCurrentView();
153
+ i0.ɵɵelementStart(0, "button", 55);
154
+ i0.ɵɵlistener("click", function RealtimeAgentBannerComponent_Conditional_2_Conditional_24_For_8_Template_button_click_0_listener() { const d_r12 = i0.ɵɵrestoreView(_r11).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.SelectDensity(d_r12.Key)); });
155
+ i0.ɵɵtext(1);
156
+ i0.ɵɵelementEnd();
157
+ } if (rf & 2) {
158
+ const d_r12 = ctx.$implicit;
159
+ const ctx_r1 = i0.ɵɵnextContext(3);
160
+ i0.ɵɵclassProp("on", ctx_r1.Density === d_r12.Key);
161
+ i0.ɵɵattribute("aria-checked", ctx_r1.Density === d_r12.Key);
162
+ i0.ɵɵadvance();
163
+ i0.ɵɵtextInterpolate(d_r12.Label);
164
+ } }
165
+ function RealtimeAgentBannerComponent_Conditional_2_Conditional_24_Template(rf, ctx) { if (rf & 1) {
166
+ const _r10 = i0.ɵɵgetCurrentView();
167
+ i0.ɵɵelementStart(0, "div", 45);
168
+ i0.ɵɵlistener("click", function RealtimeAgentBannerComponent_Conditional_2_Conditional_24_Template_div_click_0_listener($event) { i0.ɵɵrestoreView(_r10); return i0.ɵɵresetView($event.stopPropagation()); });
169
+ i0.ɵɵelementStart(1, "div", 46);
170
+ i0.ɵɵtext(2, "Interface");
171
+ i0.ɵɵelementEnd();
172
+ i0.ɵɵelementStart(3, "div", 47)(4, "span", 48);
173
+ i0.ɵɵtext(5, "Density");
174
+ i0.ɵɵelementEnd();
175
+ i0.ɵɵelementStart(6, "div", 49);
176
+ i0.ɵɵrepeaterCreate(7, RealtimeAgentBannerComponent_Conditional_2_Conditional_24_For_8_Template, 2, 4, "button", 50, _forTrack0);
177
+ i0.ɵɵelementEnd()();
178
+ i0.ɵɵelementStart(9, "div", 51);
179
+ i0.ɵɵtext(10, "Simple returns to the pure-audio surface. Auto grows the console as you use it.");
180
+ i0.ɵɵelementEnd();
181
+ i0.ɵɵelement(11, "div", 52);
182
+ i0.ɵɵelementStart(12, "button", 53);
183
+ i0.ɵɵlistener("click", function RealtimeAgentBannerComponent_Conditional_2_Conditional_24_Template_button_click_12_listener() { i0.ɵɵrestoreView(_r10); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.ToggleDev()); });
184
+ i0.ɵɵelement(13, "i", 54);
185
+ i0.ɵɵtext(14);
186
+ i0.ɵɵelementEnd()();
187
+ } if (rf & 2) {
188
+ const ctx_r1 = i0.ɵɵnextContext(2);
189
+ i0.ɵɵadvance(7);
190
+ i0.ɵɵrepeater(ctx_r1.Densities);
191
+ i0.ɵɵadvance(5);
192
+ i0.ɵɵattribute("aria-pressed", ctx_r1.DevMode);
193
+ i0.ɵɵadvance();
194
+ i0.ɵɵproperty("ngClass", ctx_r1.DevMode ? "fa-toggle-on" : "fa-toggle-off");
195
+ i0.ɵɵadvance();
196
+ i0.ɵɵtextInterpolate1(" Developer links ", ctx_r1.DevMode ? "on" : "off", " ");
197
+ } }
198
+ function RealtimeAgentBannerComponent_Conditional_2_Template(rf, ctx) { if (rf & 1) {
199
+ i0.ɵɵelement(0, "div", 19);
200
+ i0.ɵɵelementStart(1, "div", 2)(2, "span", 3);
201
+ i0.ɵɵtext(3);
202
+ i0.ɵɵelementEnd();
203
+ i0.ɵɵelementStart(4, "span", 20);
204
+ i0.ɵɵelement(5, "i", 21);
205
+ i0.ɵɵtext(6, " Co-Agent");
206
+ i0.ɵɵelementEnd();
207
+ i0.ɵɵelementStart(7, "span", 22);
208
+ i0.ɵɵtext(8, "speaking as ");
209
+ i0.ɵɵelementStart(9, "b");
210
+ i0.ɵɵtext(10);
211
+ i0.ɵɵelementEnd()();
212
+ i0.ɵɵconditionalCreate(11, RealtimeAgentBannerComponent_Conditional_2_Conditional_11_Template, 2, 2, "span", 23);
213
+ i0.ɵɵconditionalCreate(12, RealtimeAgentBannerComponent_Conditional_2_Conditional_12_Template, 4, 0, "button", 8);
214
+ i0.ɵɵelementEnd();
215
+ i0.ɵɵelementStart(13, "div", 24);
216
+ i0.ɵɵconditionalCreate(14, RealtimeAgentBannerComponent_Conditional_2_Conditional_14_Template, 1, 0, "i", 25)(15, RealtimeAgentBannerComponent_Conditional_2_Conditional_15_Template, 9, 2, "div", 26);
217
+ i0.ɵɵelementStart(16, "span", 27);
218
+ i0.ɵɵtext(17);
219
+ i0.ɵɵelementEnd()();
220
+ i0.ɵɵelementStart(18, "div", 12);
221
+ i0.ɵɵconditionalCreate(19, RealtimeAgentBannerComponent_Conditional_2_Conditional_19_Template, 2, 0, "button", 28);
222
+ i0.ɵɵconditionalCreate(20, RealtimeAgentBannerComponent_Conditional_2_Conditional_20_Template, 2, 4, "button", 29);
223
+ i0.ɵɵconditionalCreate(21, RealtimeAgentBannerComponent_Conditional_2_Conditional_21_Template, 2, 3, "button", 30);
224
+ i0.ɵɵconditionalCreate(22, RealtimeAgentBannerComponent_Conditional_2_Conditional_22_Template, 2, 0, "button", 31);
225
+ i0.ɵɵconditionalCreate(23, RealtimeAgentBannerComponent_Conditional_2_Conditional_23_Template, 5, 0);
226
+ i0.ɵɵelementEnd();
227
+ i0.ɵɵconditionalCreate(24, RealtimeAgentBannerComponent_Conditional_2_Conditional_24_Template, 15, 3, "div", 32);
228
+ } if (rf & 2) {
229
+ const ctx_r1 = i0.ɵɵnextContext();
230
+ i0.ɵɵattribute("data-state", ctx_r1.OrbState(ctx_r1.State));
231
+ i0.ɵɵadvance(3);
232
+ i0.ɵɵtextInterpolate1("Voice for ", ctx_r1.AgentName);
233
+ i0.ɵɵadvance(7);
234
+ i0.ɵɵtextInterpolate(ctx_r1.AgentName);
235
+ i0.ɵɵadvance();
236
+ i0.ɵɵconditional(ctx_r1.ModelName ? 11 : -1);
237
+ i0.ɵɵadvance();
238
+ i0.ɵɵconditional(ctx_r1.ShowOpenSession ? 12 : -1);
239
+ i0.ɵɵadvance();
240
+ i0.ɵɵclassProp("banner__state--busy", ctx_r1.IsBusy(ctx_r1.State));
241
+ i0.ɵɵadvance();
242
+ i0.ɵɵconditional(ctx_r1.IsBusy(ctx_r1.State) ? 14 : 15);
243
+ i0.ɵɵadvance(3);
244
+ i0.ɵɵtextInterpolate(ctx_r1.StateLabel(ctx_r1.State));
245
+ i0.ɵɵadvance(2);
246
+ i0.ɵɵconditional(ctx_r1.ShowPureAudio ? 19 : -1);
247
+ i0.ɵɵadvance();
248
+ i0.ɵɵconditional(ctx_r1.ShowCaptionsControl ? 20 : -1);
249
+ i0.ɵɵadvance();
250
+ i0.ɵɵconditional(ctx_r1.ShowGear ? 21 : -1);
251
+ i0.ɵɵadvance();
252
+ i0.ɵɵconditional(ctx_r1.ShowMinimize ? 22 : -1);
253
+ i0.ɵɵadvance();
254
+ i0.ɵɵconditional(ctx_r1.ShowEnd ? 23 : -1);
255
+ i0.ɵɵadvance();
256
+ i0.ɵɵconditional(ctx_r1.GearOpen ? 24 : -1);
257
+ } }
258
+ /**
259
+ * The call overlay's UNIFIED APP-BAR (per Redesign A — `plans/realtime/mockups/redesign-a.html`):
260
+ * ONE header that owns identity, state, and every session action.
261
+ *
262
+ * - LEFT: the glowing agent orb (motion = turn-state), agent name + "Co-Agent" badge,
263
+ * "speaking as" subline (+ subtle realtime-model suffix), and the state pill that swaps
264
+ * between a waveform (speaking/listening) and a spinner (connecting/thinking).
265
+ * - RIGHT (live): the disclosure-gated action cluster — Captions toggle (level 1+), the
266
+ * gear (level 2+, opens a popover hosting the Simple/Standard/Pro/Auto INTERFACE DENSITY
267
+ * control — the progressive-disclosure escape hatch — plus the developer-links toggle),
268
+ * Minimize (hide the call view, call stays live), and the End-call pill (level 2+; below
269
+ * that the phone-call strip's big End control owns ending).
270
+ * - RIGHT (review): "Start live session" (resume, affirmative leads) + Close — the
271
+ * review session's exit lives up here in the header bar, not floating in the body.
272
+ *
273
+ * Which controls render is decided by the OVERLAY (it owns the disclosure model) and
274
+ * passed down as booleans — this component stays purely presentational.
275
+ */
276
+ export class RealtimeAgentBannerComponent {
277
+ /** Current connection / turn state — drives the orb animation + state label. */
278
+ State;
279
+ /** Display name of the agent the voice session fronts (e.g. "Sage"). */
280
+ AgentName = 'the agent';
281
+ /**
282
+ * Display name of the realtime model the live session runs on (e.g. "GPT Realtime 2").
283
+ * Rendered as a subtle suffix in the identity line; hidden when null/empty.
284
+ */
285
+ ModelName = null;
286
+ /** Whether developer affordances (the "Open session" link) are revealed (gear-gated). */
287
+ DevMode = false;
288
+ /** ID of the server-side agent session record (`MJ: AI Agent Sessions`), when known. */
289
+ SessionID = null;
290
+ /**
291
+ * SESSION REVIEW presentation: the banner shows the past session's identity
292
+ * (review badge, started→closed range, close-reason chip) instead of live turn-state,
293
+ * and the action cluster swaps to Start-live + Close.
294
+ */
295
+ ReviewMode = false;
296
+ /** When reviewing: when the past session started (`__mj_CreatedAt`). */
297
+ ReviewStartedAt = null;
298
+ /** When reviewing: when the past session closed (null while it is still open). */
299
+ ReviewClosedAt = null;
300
+ /** When reviewing: why the past session closed (`Explicit` | `Janitor` | `Shutdown` | `Error`), when known. */
301
+ ReviewCloseReason = null;
302
+ // ── App-bar action cluster (disclosure-gated by the overlay) ────────────────
303
+ /** Whether captions are currently shown (active state on the captions control). */
304
+ CaptionsOn = true;
305
+ /** Whether the captions control renders (disclosure level 1+). */
306
+ ShowCaptionsControl = false;
307
+ /** Whether the gear (density escape hatch + dev toggle) renders (disclosure level 2+). */
308
+ ShowGear = false;
309
+ /** Whether the End-call pill renders here (level 2+; the strip's big End owns it below). */
310
+ ShowEnd = false;
311
+ /** Whether the Minimize control renders (live sessions only). */
312
+ ShowMinimize = false;
313
+ /** Whether the "Return to pure audio" control renders (live + disclosure level above 0). */
314
+ ShowPureAudio = false;
315
+ /** The user's current interface-density override (selected state in the gear popover). */
316
+ Density = 'auto';
317
+ /** Emitted with the session record's ID when the dev "Open session" link is clicked. */
318
+ OpenSessionRequested = new EventEmitter();
319
+ /** Emitted when the user toggles captions; the overlay flips its caption state. */
320
+ CaptionsToggled = new EventEmitter();
321
+ /** Emitted when the user toggles developer links from the gear popover. */
322
+ DevModeToggled = new EventEmitter();
323
+ /** Emitted when the user picks an interface density in the gear popover. */
324
+ DensityChanged = new EventEmitter();
325
+ /** Emitted when the user minimizes the call view (the call stays live). */
326
+ MinimizeRequested = new EventEmitter();
327
+ /** Emitted when the user asks to return to the pure-audio surface (level 0, this session). */
328
+ PureAudioRequested = new EventEmitter();
329
+ /** Emitted when the user ends the call from the app-bar's End pill. */
330
+ EndRequested = new EventEmitter();
331
+ /** Review only: the user asked to RESUME the reviewed session as a new live call. */
332
+ StartLiveRequested = new EventEmitter();
333
+ /** Review only: the user asked to close the review and return to the conversation. */
334
+ CloseRequested = new EventEmitter();
335
+ /** Whether the gear popover is open (closed by any outside click). */
336
+ GearOpen = false;
337
+ /** The density choices the gear popover offers, in display order. */
338
+ Densities = [
339
+ { Key: 'simple', Label: 'Simple' },
340
+ { Key: 'standard', Label: 'Standard' },
341
+ { Key: 'pro', Label: 'Pro' },
342
+ { Key: 'auto', Label: 'Auto' }
343
+ ];
344
+ /** True when the dev "Open session" link should render (gear on + session id known). */
345
+ get ShowOpenSession() {
346
+ return this.DevMode && !!this.SessionID;
347
+ }
348
+ /** Emits the open-session request for the live agent session record. */
349
+ OpenSession() {
350
+ if (this.SessionID) {
351
+ this.OpenSessionRequested.emit(this.SessionID);
352
+ }
353
+ }
354
+ /** Toggles the captions control and notifies the overlay. */
355
+ ToggleCaptions() {
356
+ this.CaptionsOn = !this.CaptionsOn;
357
+ this.CaptionsToggled.emit(this.CaptionsOn);
358
+ }
359
+ /** Opens/closes the gear popover (stops propagation so the outside-click close skips it). */
360
+ ToggleGear(event) {
361
+ event.stopPropagation();
362
+ this.GearOpen = !this.GearOpen;
363
+ }
364
+ /** Any outside click closes the gear popover. */
365
+ OnDocumentClick() {
366
+ if (this.GearOpen) {
367
+ this.GearOpen = false;
368
+ }
369
+ }
370
+ /** Gear popover: pick an interface density (the overlay applies + persists it). */
371
+ SelectDensity(density) {
372
+ this.DensityChanged.emit(density);
373
+ }
374
+ /** Gear popover: toggle developer links. */
375
+ ToggleDev() {
376
+ this.DevMode = !this.DevMode;
377
+ this.DevModeToggled.emit(this.DevMode);
378
+ }
379
+ /** The review banner's "started → closed" time-range label (empty when the start is unknown). */
380
+ get ReviewRangeLabel() {
381
+ if (!this.ReviewStartedAt) {
382
+ return '';
383
+ }
384
+ const start = this.formatStamp(this.ReviewStartedAt);
385
+ if (!this.ReviewClosedAt) {
386
+ return start;
387
+ }
388
+ return `${start} → ${this.formatStamp(this.ReviewClosedAt, this.ReviewStartedAt)}`;
389
+ }
390
+ /** Human label for the close-reason chip (empty hides the chip). */
391
+ get ReviewCloseReasonLabel() {
392
+ switch (this.ReviewCloseReason) {
393
+ case 'Explicit': return 'Ended by user';
394
+ case 'Janitor': return 'Closed by janitor';
395
+ case 'Shutdown': return 'Closed at shutdown';
396
+ case 'Error': return 'Ended with error';
397
+ default: return '';
398
+ }
399
+ }
400
+ /** Compact date+time stamp; same-day end stamps drop the redundant date part. */
401
+ formatStamp(date, sameDayAs) {
402
+ const time = date.toLocaleTimeString([], { hour: 'numeric', minute: '2-digit' }).toLowerCase();
403
+ if (sameDayAs && date.toDateString() === sameDayAs.toDateString()) {
404
+ return time;
405
+ }
406
+ return `${date.toLocaleDateString([], { month: 'short', day: 'numeric' })}, ${time}`;
407
+ }
408
+ /** Maps the realtime state to the orb's `data-state` (the orb only models active turn-states). */
409
+ OrbState(state) {
410
+ switch (state) {
411
+ case 'speaking': return 'speaking';
412
+ case 'thinking': return 'thinking';
413
+ default: return 'listening';
414
+ }
415
+ }
416
+ /** Human-readable state label, agent-aware where it reads better. */
417
+ StateLabel(state) {
418
+ switch (state) {
419
+ case 'connecting': return 'Connecting…';
420
+ case 'listening': return 'Listening';
421
+ case 'speaking': return `${this.AgentName} is speaking…`;
422
+ case 'thinking': return 'Working on it…';
423
+ case 'error': return 'Connection error';
424
+ case 'closed': return 'Call ended';
425
+ default: return '';
426
+ }
427
+ }
428
+ /** True while the state pill should show a spinner instead of the waveform. */
429
+ IsBusy(state) {
430
+ return state === 'connecting' || state === 'thinking';
431
+ }
432
+ static ɵfac = function RealtimeAgentBannerComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || RealtimeAgentBannerComponent)(); };
433
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: RealtimeAgentBannerComponent, selectors: [["mj-realtime-agent-banner"]], hostBindings: function RealtimeAgentBannerComponent_HostBindings(rf, ctx) { if (rf & 1) {
434
+ i0.ɵɵlistener("click", function RealtimeAgentBannerComponent_click_HostBindingHandler() { return ctx.OnDocumentClick(); }, i0.ɵɵresolveDocument);
435
+ } }, inputs: { State: "State", AgentName: "AgentName", ModelName: "ModelName", DevMode: "DevMode", SessionID: "SessionID", ReviewMode: "ReviewMode", ReviewStartedAt: "ReviewStartedAt", ReviewClosedAt: "ReviewClosedAt", ReviewCloseReason: "ReviewCloseReason", CaptionsOn: "CaptionsOn", ShowCaptionsControl: "ShowCaptionsControl", ShowGear: "ShowGear", ShowEnd: "ShowEnd", ShowMinimize: "ShowMinimize", ShowPureAudio: "ShowPureAudio", Density: "Density" }, outputs: { OpenSessionRequested: "OpenSessionRequested", CaptionsToggled: "CaptionsToggled", DevModeToggled: "DevModeToggled", DensityChanged: "DensityChanged", MinimizeRequested: "MinimizeRequested", PureAudioRequested: "PureAudioRequested", EndRequested: "EndRequested", StartLiveRequested: "StartLiveRequested", CloseRequested: "CloseRequested" }, decls: 3, vars: 3, consts: [[1, "banner"], ["aria-hidden", "true", 1, "agent-orb", "agent-orb--review"], [1, "banner__id"], [1, "banner__name"], [1, "pill", "pill--review"], ["aria-hidden", "true", 1, "fa-solid", "fa-clock-rotate-left"], [1, "banner__for", "banner__range"], [1, "pill", "pill--close-reason", 3, "title"], ["type", "button", "title", "Open the agent session record", 1, "dev-link"], [1, "banner__state", "banner__state--review"], ["aria-hidden", "true", 1, "fa-solid", "fa-box-archive"], [1, "banner__state-label", "banner__state-label--review"], [1, "bar-actions"], ["type", "button", "title", "Resume this session as a new live call", 1, "start-live-pill", 3, "click"], ["aria-hidden", "true", 1, "fa-solid", "fa-phone"], ["type", "button", "title", "Close review", "aria-label", "Close session review", 1, "iconb", 3, "click"], ["aria-hidden", "true", 1, "fa-solid", "fa-xmark"], ["type", "button", "title", "Open the agent session record", 1, "dev-link", 3, "click"], ["aria-hidden", "true", 1, "fa-solid", "fa-arrow-up-right-from-square"], ["aria-hidden", "true", 1, "agent-orb"], [1, "pill", "pill--sage"], ["aria-hidden", "true", 1, "fa-solid", "fa-feather"], [1, "banner__for"], [1, "banner__model", 3, "title"], [1, "banner__state"], ["aria-hidden", "true", 1, "fa-solid", "fa-spinner", "fa-spin"], ["aria-hidden", "true", 1, "waveform", 3, "waveform--idle"], [1, "banner__state-label"], ["type", "button", "title", "Pure audio \u2014 simplest view, just the orb and the voice (sticks until you change it in the gear)", "aria-label", "Switch to the simple pure-audio view", 1, "iconb"], ["type", "button", 1, "iconb", 3, "iconb--on", "title"], ["type", "button", "title", "Interface density & developer links", 1, "iconb", 3, "iconb--on"], ["type", "button", "title", "Hide the call view \u2014 the call stays live", "aria-label", "Minimize the call view", 1, "iconb"], ["role", "menu", "aria-label", "Interface settings", 1, "gear-pop"], ["aria-hidden", "true", 1, "waveform"], ["type", "button", "title", "Pure audio \u2014 simplest view, just the orb and the voice (sticks until you change it in the gear)", "aria-label", "Switch to the simple pure-audio view", 1, "iconb", 3, "click"], ["aria-hidden", "true", 1, "fa-solid", "fa-headphones"], ["type", "button", 1, "iconb", 3, "click", "title"], ["aria-hidden", "true", 1, "fa-solid", "fa-closed-captioning"], ["type", "button", "title", "Interface density & developer links", 1, "iconb", 3, "click"], ["aria-hidden", "true", 1, "fa-solid", "fa-gear"], ["type", "button", "title", "Hide the call view \u2014 the call stays live", "aria-label", "Minimize the call view", 1, "iconb", 3, "click"], ["aria-hidden", "true", 1, "fa-solid", "fa-down-left-and-up-right-to-center"], ["aria-hidden", "true", 1, "bar-sep"], ["type", "button", "title", "End call", "aria-label", "End the call", 1, "end-pill", 3, "click"], ["aria-hidden", "true", 1, "fa-solid", "fa-phone-slash"], ["role", "menu", "aria-label", "Interface settings", 1, "gear-pop", 3, "click"], [1, "gp-h"], [1, "gp-row"], [1, "gp-l"], ["role", "radiogroup", "aria-label", "Interface density", 1, "gp-seg"], ["type", "button", "role", "radio", 3, "on"], [1, "gp-note"], [1, "gp-div"], ["type", "button", 1, "gp-link", 3, "click"], ["aria-hidden", "true", 1, "fa-solid", 3, "ngClass"], ["type", "button", "role", "radio", 3, "click"]], template: function RealtimeAgentBannerComponent_Template(rf, ctx) { if (rf & 1) {
436
+ i0.ɵɵelementStart(0, "div", 0);
437
+ i0.ɵɵconditionalCreate(1, RealtimeAgentBannerComponent_Conditional_1_Template, 21, 4)(2, RealtimeAgentBannerComponent_Conditional_2_Template, 25, 15);
438
+ i0.ɵɵelementEnd();
439
+ } if (rf & 2) {
440
+ i0.ɵɵclassProp("banner--review", ctx.ReviewMode);
441
+ i0.ɵɵadvance();
442
+ i0.ɵɵconditional(ctx.ReviewMode ? 1 : 2);
443
+ } }, dependencies: [CommonModule, i1.NgClass], styles: ["[_nghost-%COMP%] {\n display: block;\n --sage: var(--mj-color-violet-400, #a78bfa);\n --sage-bg: color-mix(in srgb, var(--mj-color-violet-400, #a78bfa) 14%, transparent);\n --sage-border: color-mix(in srgb, var(--mj-color-violet-400, #a78bfa) 45%, transparent);\n}\n\n\n\n\n.banner[_ngcontent-%COMP%] {\n position: relative; \n\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 10px 16px 10px 22px;\n border-bottom: 1px solid var(--mj-border-default);\n background: linear-gradient(180deg, color-mix(in srgb, var(--mj-brand-primary) 10%, transparent), transparent);\n flex-shrink: 0;\n}\n\n.banner__id[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n display: flex;\n align-items: center;\n gap: 8px;\n white-space: nowrap;\n overflow: hidden;\n}\n.banner__name[_ngcontent-%COMP%] {\n font-size: 14.5px;\n font-weight: 700;\n letter-spacing: -0.01em;\n color: var(--mj-text-primary);\n flex-shrink: 0;\n}\n.banner__for[_ngcontent-%COMP%] {\n font-size: 11.5px;\n color: var(--mj-text-muted);\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n flex-shrink: 5; \n\n}\n.banner__for[_ngcontent-%COMP%] b[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary);\n}\n\n\n.banner__model[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-muted);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n flex-shrink: 10; \n\n min-width: 0;\n}\n\n.banner__state[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 4px 12px;\n border-radius: var(--mj-radius-full, 9999px);\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n}\n.banner__state--busy[_ngcontent-%COMP%] {\n background: var(--mj-status-warning-bg);\n border-color: var(--mj-status-warning);\n}\n.banner__state--busy[_ngcontent-%COMP%] .fa-spinner[_ngcontent-%COMP%] {\n color: var(--mj-status-warning);\n}\n.banner__state-label[_ngcontent-%COMP%] {\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-brand-accent, var(--mj-brand-primary));\n}\n.banner__state--busy[_ngcontent-%COMP%] .banner__state-label[_ngcontent-%COMP%] {\n color: var(--mj-status-warning-text, var(--mj-status-warning));\n}\n\n\n\n.agent-orb[_ngcontent-%COMP%] {\n --orb-size: 34px;\n width: var(--orb-size);\n height: var(--orb-size);\n border-radius: 50%;\n position: relative;\n flex-shrink: 0;\n background: radial-gradient(circle at 35% 30%,\n var(--mj-brand-accent, var(--mj-brand-primary)),\n var(--mj-brand-primary) 60%,\n var(--mj-brand-primary-active, var(--mj-brand-primary)));\n box-shadow:\n 0 0 0 6px color-mix(in srgb, var(--mj-brand-primary) 12%, transparent),\n 0 0 30px color-mix(in srgb, var(--mj-brand-primary) 45%, transparent);\n}\n.agent-orb[_ngcontent-%COMP%]::after {\n content: \"\";\n position: absolute;\n inset: -4px;\n border-radius: 50%;\n border: 2px solid color-mix(in srgb, var(--mj-brand-accent, var(--mj-brand-primary)) 40%, transparent);\n animation: _ngcontent-%COMP%_orb-ring 2.4s ease-out infinite;\n}\n.agent-orb[data-state=\"speaking\"][_ngcontent-%COMP%] {\n animation: _ngcontent-%COMP%_orb-bob 0.9s ease-in-out infinite;\n}\n.agent-orb[data-state=\"listening\"][_ngcontent-%COMP%] {\n box-shadow:\n 0 0 0 6px color-mix(in srgb, var(--mj-status-success) 16%, transparent),\n 0 0 30px color-mix(in srgb, var(--mj-status-success) 40%, transparent);\n background: radial-gradient(circle at 35% 30%,\n color-mix(in srgb, var(--mj-status-success) 60%, white), var(--mj-brand-primary) 65%);\n}\n.agent-orb[data-state=\"thinking\"][_ngcontent-%COMP%] {\n box-shadow:\n 0 0 0 6px color-mix(in srgb, var(--mj-status-warning) 14%, transparent),\n 0 0 26px color-mix(in srgb, var(--mj-status-warning) 35%, transparent);\n}\n\n@keyframes _ngcontent-%COMP%_orb-ring { 0% { transform: scale(1); opacity: .6 } 100% { transform: scale(1.5); opacity: 0 } }\n@keyframes _ngcontent-%COMP%_orb-bob { 0%, 100% { transform: translateY(0) } 50% { transform: translateY(-3px) } }\n\n\n\n\n\n\n\n.call-overlay[data-audio-live='true'][_nghost-%COMP%] .agent-orb[_ngcontent-%COMP%]:not(.agent-orb--review), .call-overlay[data-audio-live='true'] [_nghost-%COMP%] .agent-orb[_ngcontent-%COMP%]:not(.agent-orb--review) {\n animation: none;\n transform: scale(calc(1 + var(--voice-out, 0) * 0.14));\n transition: transform 70ms linear;\n}\n.call-overlay[data-audio-live='true'][_nghost-%COMP%] .agent-orb[_ngcontent-%COMP%]:not(.agent-orb--review)::after, .call-overlay[data-audio-live='true'] [_nghost-%COMP%] .agent-orb[_ngcontent-%COMP%]:not(.agent-orb--review)::after {\n animation: none;\n opacity: calc(0.15 + var(--voice-out, 0) * 0.85);\n}\n.call-overlay[data-audio-live='true'][data-voice-dir='user'][_nghost-%COMP%] .agent-orb[_ngcontent-%COMP%]:not(.agent-orb--review), .call-overlay[data-audio-live='true'][data-voice-dir='user'] [_nghost-%COMP%] .agent-orb[_ngcontent-%COMP%]:not(.agent-orb--review) {\n box-shadow:\n 0 0 0 6px color-mix(in srgb, var(--mj-status-success) 16%, transparent),\n 0 0 30px color-mix(in srgb, var(--mj-status-success) 40%, transparent);\n background: radial-gradient(circle at 35% 30%,\n color-mix(in srgb, var(--mj-status-success) 60%, white), var(--mj-brand-primary) 65%);\n}\n\n\n\n.waveform[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 3px;\n height: 18px;\n}\n.waveform[_ngcontent-%COMP%] span[_ngcontent-%COMP%] {\n width: 3px;\n border-radius: 3px;\n background: var(--mj-brand-primary);\n animation: _ngcontent-%COMP%_wave 1.1s ease-in-out infinite;\n}\n.waveform[_ngcontent-%COMP%] span[_ngcontent-%COMP%]:nth-child(1) { height: 30%; animation-delay: 0s }\n.waveform[_ngcontent-%COMP%] span[_ngcontent-%COMP%]:nth-child(2) { height: 65%; animation-delay: .1s }\n.waveform[_ngcontent-%COMP%] span[_ngcontent-%COMP%]:nth-child(3) { height: 100%; animation-delay: .2s }\n.waveform[_ngcontent-%COMP%] span[_ngcontent-%COMP%]:nth-child(4) { height: 55%; animation-delay: .3s }\n.waveform[_ngcontent-%COMP%] span[_ngcontent-%COMP%]:nth-child(5) { height: 85%; animation-delay: .15s }\n.waveform[_ngcontent-%COMP%] span[_ngcontent-%COMP%]:nth-child(6) { height: 40%; animation-delay: .25s }\n.waveform[_ngcontent-%COMP%] span[_ngcontent-%COMP%]:nth-child(7) { height: 70%; animation-delay: .05s }\n.waveform[_ngcontent-%COMP%] span[_ngcontent-%COMP%]:nth-child(8) { height: 35%; animation-delay: .35s }\n.waveform--idle[_ngcontent-%COMP%] span[_ngcontent-%COMP%] {\n animation: none;\n height: 18% !important;\n background: var(--mj-text-disabled);\n}\n@keyframes _ngcontent-%COMP%_wave { 0%, 100% { transform: scaleY(.4) } 50% { transform: scaleY(1) } }\n\n.pill[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 3px 10px;\n border-radius: var(--mj-radius-full, 9999px);\n font-size: 11.5px;\n font-weight: 600;\n border: 1px solid transparent;\n line-height: 1.4;\n}\n.pill[_ngcontent-%COMP%] i[_ngcontent-%COMP%] { font-size: 10px; }\n.pill--sage[_ngcontent-%COMP%] {\n background: var(--sage-bg);\n color: var(--mj-color-violet-300, var(--mj-text-secondary));\n border-color: var(--sage-border);\n}\n\n\n\n.banner--review[_ngcontent-%COMP%] {\n background: linear-gradient(180deg, color-mix(in srgb, var(--mj-text-muted) 10%, transparent), transparent);\n}\n\n\n.agent-orb--review[_ngcontent-%COMP%] {\n box-shadow: 0 0 0 6px color-mix(in srgb, var(--mj-text-muted) 12%, transparent);\n background: radial-gradient(circle at 35% 30%,\n color-mix(in srgb, var(--mj-text-muted) 55%, var(--mj-bg-surface)),\n var(--mj-text-muted) 65%);\n}\n.agent-orb--review[_ngcontent-%COMP%]::after {\n animation: none;\n border-color: color-mix(in srgb, var(--mj-text-muted) 30%, transparent);\n}\n.pill--review[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n color: var(--mj-text-link, var(--mj-brand-primary));\n border-color: color-mix(in srgb, var(--mj-brand-primary) 35%, transparent);\n}\n.pill--close-reason[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n border-color: var(--mj-border-default);\n}\n.banner__range[_ngcontent-%COMP%] {\n flex-shrink: 3;\n}\n.banner__state--review[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-card);\n}\n.banner__state--review[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-muted);\n}\n.banner__state-label--review[_ngcontent-%COMP%] {\n color: var(--mj-text-secondary);\n}\n\n\n\n.dev-link[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 3px 9px;\n border-radius: var(--mj-radius-full, 9999px);\n border: 1px dashed var(--mj-border-strong);\n background: transparent;\n color: var(--mj-text-muted);\n font-family: inherit;\n font-size: 10.5px;\n font-weight: 700;\n white-space: nowrap;\n cursor: pointer;\n transition: color 140ms ease, border-color 140ms ease, background 140ms ease;\n}\n.dev-link[_ngcontent-%COMP%]:hover {\n color: var(--mj-text-link, var(--mj-brand-primary));\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, transparent);\n}\n.dev-link[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 9px;\n}\n\n\n\n.bar-actions[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n flex-shrink: 0;\n}\n.iconb[_ngcontent-%COMP%] {\n width: 34px;\n height: 34px;\n border-radius: var(--mj-radius-md, 8px);\n display: grid;\n place-items: center;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-secondary);\n cursor: pointer;\n font-size: 13px;\n transition: all 140ms ease;\n}\n.iconb[_ngcontent-%COMP%]:hover {\n color: var(--mj-text-primary);\n border-color: var(--mj-border-strong);\n background: var(--mj-bg-surface-hover);\n}\n.iconb--on[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 16%, transparent);\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-accent, var(--mj-brand-primary));\n}\n.bar-sep[_ngcontent-%COMP%] {\n width: 1px;\n height: 26px;\n background: var(--mj-border-default);\n}\n.end-pill[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 9px;\n padding: 8px 18px;\n font-family: inherit;\n font-size: 13px;\n font-weight: 700;\n white-space: nowrap;\n border-radius: var(--mj-radius-full, 9999px);\n border: 1px solid var(--mj-status-error);\n background: var(--mj-status-error);\n color: var(--mj-text-inverse, #fff);\n cursor: pointer;\n box-shadow: 0 4px 16px color-mix(in srgb, var(--mj-status-error) 35%, transparent);\n transition: filter 140ms ease;\n}\n.end-pill[_ngcontent-%COMP%]:hover {\n filter: brightness(0.92);\n}\n.start-live-pill[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 9px;\n padding: 8px 18px;\n font-family: inherit;\n font-size: 13px;\n font-weight: 700;\n white-space: nowrap;\n border-radius: var(--mj-radius-full, 9999px);\n border: 1px solid var(--mj-brand-primary);\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse, #fff);\n cursor: pointer;\n box-shadow: 0 4px 16px color-mix(in srgb, var(--mj-brand-primary) 35%, transparent);\n transition: filter 140ms ease;\n}\n.start-live-pill[_ngcontent-%COMP%]:hover {\n filter: brightness(1.05);\n}\n\n\n\n.gear-pop[_ngcontent-%COMP%] {\n position: absolute;\n top: calc(100% + 8px);\n right: 14px;\n z-index: 70;\n width: 268px;\n border: 1px solid var(--mj-border-strong);\n border-radius: var(--mj-radius-lg, 12px);\n background: var(--mj-bg-surface-elevated);\n box-shadow: var(--mj-shadow-xl, 0 12px 32px rgba(0, 0, 0, 0.18));\n padding: 12px 14px 10px;\n animation: _ngcontent-%COMP%_gear-pop-in 160ms ease;\n}\n@keyframes _ngcontent-%COMP%_gear-pop-in {\n from { opacity: 0; transform: translateY(-4px); }\n to { opacity: 1; transform: translateY(0); }\n}\n.gp-h[_ngcontent-%COMP%] {\n font-size: 10.5px;\n font-weight: 800;\n text-transform: uppercase;\n letter-spacing: 0.06em;\n color: var(--mj-text-muted);\n margin-bottom: 9px;\n}\n.gp-row[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n}\n.gp-l[_ngcontent-%COMP%] {\n font-size: 12px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n}\n.gp-seg[_ngcontent-%COMP%] {\n display: inline-flex;\n flex: 1;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md, 8px);\n background: var(--mj-bg-surface);\n padding: 2px;\n gap: 2px;\n}\n.gp-seg[_ngcontent-%COMP%] button[_ngcontent-%COMP%] {\n flex: 1;\n border: 0;\n background: transparent;\n color: var(--mj-text-muted);\n font-family: inherit;\n font-size: 11px;\n font-weight: 700;\n padding: 4px 0;\n border-radius: 6px;\n cursor: pointer;\n transition: all 120ms ease;\n}\n.gp-seg[_ngcontent-%COMP%] button.on[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse, #fff);\n}\n.gp-note[_ngcontent-%COMP%] {\n font-size: 10.5px;\n color: var(--mj-text-muted);\n line-height: 1.45;\n margin-top: 8px;\n}\n.gp-div[_ngcontent-%COMP%] {\n height: 1px;\n background: var(--mj-border-default);\n margin: 10px -14px;\n}\n.gp-link[_ngcontent-%COMP%] {\n display: flex;\n width: 100%;\n align-items: center;\n gap: 9px;\n padding: 6px 2px;\n border: 0;\n background: transparent;\n color: var(--mj-text-secondary);\n font-family: inherit;\n font-size: 12px;\n font-weight: 600;\n cursor: pointer;\n text-align: left;\n}\n.gp-link[_ngcontent-%COMP%]:hover {\n color: var(--mj-text-primary);\n}\n.gp-link[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n width: 16px;\n text-align: center;\n font-size: 13px;\n color: var(--mj-text-muted);\n}\n.gp-link[_ngcontent-%COMP%]:hover i[_ngcontent-%COMP%] {\n color: var(--mj-brand-accent, var(--mj-brand-primary));\n}"] });
444
+ }
445
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(RealtimeAgentBannerComponent, [{
446
+ type: Component,
447
+ args: [{ standalone: true, selector: 'mj-realtime-agent-banner', imports: [CommonModule], template: "<div class=\"banner\" [class.banner--review]=\"ReviewMode\">\n @if (ReviewMode) {\n <!-- SESSION REVIEW: static orb \u00B7 name \u00B7 review badge \u00B7 started\u2192closed \u00B7 close-reason chip,\n with the review's exit actions up here in the header bar (Start live leads, Close trails). -->\n <div class=\"agent-orb agent-orb--review\" aria-hidden=\"true\"></div>\n\n <div class=\"banner__id\">\n <span class=\"banner__name\">Voice for {{ AgentName }}</span>\n <span class=\"pill pill--review\"><i class=\"fa-solid fa-clock-rotate-left\" aria-hidden=\"true\"></i> Session review</span>\n @if (ReviewRangeLabel) {\n <span class=\"banner__for banner__range\">{{ ReviewRangeLabel }}</span>\n }\n @if (ReviewCloseReasonLabel) {\n <span class=\"pill pill--close-reason\" [title]=\"'Close reason: ' + ReviewCloseReason\">{{ ReviewCloseReasonLabel }}</span>\n }\n @if (ShowOpenSession) {\n <button type=\"button\" class=\"dev-link\" (click)=\"OpenSession()\"\n title=\"Open the agent session record\">\n <i class=\"fa-solid fa-arrow-up-right-from-square\" aria-hidden=\"true\"></i>\n <span>Open session</span>\n </button>\n }\n </div>\n\n <div class=\"banner__state banner__state--review\">\n <i class=\"fa-solid fa-box-archive\" aria-hidden=\"true\"></i>\n <span class=\"banner__state-label banner__state-label--review\">Reviewing past session</span>\n </div>\n\n <div class=\"bar-actions\">\n <button type=\"button\" class=\"start-live-pill\" (click)=\"StartLiveRequested.emit()\"\n title=\"Resume this session as a new live call\">\n <i class=\"fa-solid fa-phone\" aria-hidden=\"true\"></i>\n <span>Start live session</span>\n </button>\n <button type=\"button\" class=\"iconb\" (click)=\"CloseRequested.emit()\"\n title=\"Close review\" aria-label=\"Close session review\">\n <i class=\"fa-solid fa-xmark\" aria-hidden=\"true\"></i>\n </button>\n </div>\n } @else {\n <div class=\"agent-orb\" [attr.data-state]=\"OrbState(State)\" aria-hidden=\"true\"></div>\n\n <div class=\"banner__id\">\n <span class=\"banner__name\">Voice for {{ AgentName }}</span>\n <span class=\"pill pill--sage\"><i class=\"fa-solid fa-feather\" aria-hidden=\"true\"></i> Co-Agent</span>\n <span class=\"banner__for\">speaking as <b>{{ AgentName }}</b></span>\n @if (ModelName) {\n <span class=\"banner__model\" [title]=\"'Realtime voice model: ' + ModelName\">\u00B7 {{ ModelName }}</span>\n }\n @if (ShowOpenSession) {\n <button type=\"button\" class=\"dev-link\" (click)=\"OpenSession()\"\n title=\"Open the agent session record\">\n <i class=\"fa-solid fa-arrow-up-right-from-square\" aria-hidden=\"true\"></i>\n <span>Open session</span>\n </button>\n }\n </div>\n\n <div class=\"banner__state\" [class.banner__state--busy]=\"IsBusy(State)\">\n @if (IsBusy(State)) {\n <i class=\"fa-solid fa-spinner fa-spin\" aria-hidden=\"true\"></i>\n } @else {\n <div class=\"waveform\" [class.waveform--idle]=\"State !== 'speaking'\" aria-hidden=\"true\">\n <span></span><span></span><span></span><span></span>\n <span></span><span></span><span></span><span></span>\n </div>\n }\n <span class=\"banner__state-label\">{{ StateLabel(State) }}</span>\n </div>\n\n <!-- Disclosure-gated app-bar action cluster (the overlay decides what renders). -->\n <div class=\"bar-actions\">\n @if (ShowPureAudio) {\n <button type=\"button\" class=\"iconb\" (click)=\"PureAudioRequested.emit()\"\n title=\"Pure audio \u2014 simplest view, just the orb and the voice (sticks until you change it in the gear)\"\n aria-label=\"Switch to the simple pure-audio view\">\n <i class=\"fa-solid fa-headphones\" aria-hidden=\"true\"></i>\n </button>\n }\n @if (ShowCaptionsControl) {\n <button type=\"button\" class=\"iconb\" [class.iconb--on]=\"CaptionsOn\"\n (click)=\"ToggleCaptions()\"\n [title]=\"CaptionsOn ? 'Hide captions' : 'Show captions'\"\n [attr.aria-pressed]=\"CaptionsOn\">\n <i class=\"fa-solid fa-closed-captioning\" aria-hidden=\"true\"></i>\n </button>\n }\n @if (ShowGear) {\n <button type=\"button\" class=\"iconb\" [class.iconb--on]=\"GearOpen || DevMode\"\n (click)=\"ToggleGear($event)\"\n title=\"Interface density &amp; developer links\"\n [attr.aria-expanded]=\"GearOpen\">\n <i class=\"fa-solid fa-gear\" aria-hidden=\"true\"></i>\n </button>\n }\n @if (ShowMinimize) {\n <button type=\"button\" class=\"iconb\" (click)=\"MinimizeRequested.emit()\"\n title=\"Hide the call view \u2014 the call stays live\"\n aria-label=\"Minimize the call view\">\n <i class=\"fa-solid fa-down-left-and-up-right-to-center\" aria-hidden=\"true\"></i>\n </button>\n }\n @if (ShowEnd) {\n <span class=\"bar-sep\" aria-hidden=\"true\"></span>\n <button type=\"button\" class=\"end-pill\" (click)=\"EndRequested.emit()\"\n title=\"End call\" aria-label=\"End the call\">\n <i class=\"fa-solid fa-phone-slash\" aria-hidden=\"true\"></i>\n <span>End call</span>\n </button>\n }\n </div>\n\n <!-- Gear popover: interface density (the disclosure escape hatch) + developer links. -->\n @if (GearOpen) {\n <div class=\"gear-pop\" (click)=\"$event.stopPropagation()\" role=\"menu\" aria-label=\"Interface settings\">\n <div class=\"gp-h\">Interface</div>\n <div class=\"gp-row\">\n <span class=\"gp-l\">Density</span>\n <div class=\"gp-seg\" role=\"radiogroup\" aria-label=\"Interface density\">\n @for (d of Densities; track d.Key) {\n <button type=\"button\" [class.on]=\"Density === d.Key\"\n (click)=\"SelectDensity(d.Key)\"\n [attr.aria-checked]=\"Density === d.Key\" role=\"radio\">{{ d.Label }}</button>\n }\n </div>\n </div>\n <div class=\"gp-note\">Simple returns to the pure-audio surface. Auto grows the console as you use it.</div>\n <div class=\"gp-div\"></div>\n <button type=\"button\" class=\"gp-link\" (click)=\"ToggleDev()\" [attr.aria-pressed]=\"DevMode\">\n <i class=\"fa-solid\" [ngClass]=\"DevMode ? 'fa-toggle-on' : 'fa-toggle-off'\" aria-hidden=\"true\"></i>\n Developer links {{ DevMode ? 'on' : 'off' }}\n </button>\n </div>\n }\n }\n</div>\n", styles: [":host {\n display: block;\n --sage: var(--mj-color-violet-400, #a78bfa);\n --sage-bg: color-mix(in srgb, var(--mj-color-violet-400, #a78bfa) 14%, transparent);\n --sage-border: color-mix(in srgb, var(--mj-color-violet-400, #a78bfa) 45%, transparent);\n}\n\n/* The UNIFIED APP-BAR (Redesign A): orb \u00B7 name \u00B7 Co-Agent pill \u00B7 \"speaking as\" \u00B7\n state pill \u00B7 disclosure-gated action cluster (captions / gear / minimize / End). */\n.banner {\n position: relative; /* anchors the gear popover */\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 10px 16px 10px 22px;\n border-bottom: 1px solid var(--mj-border-default);\n background: linear-gradient(180deg, color-mix(in srgb, var(--mj-brand-primary) 10%, transparent), transparent);\n flex-shrink: 0;\n}\n\n.banner__id {\n flex: 1;\n min-width: 0;\n display: flex;\n align-items: center;\n gap: 8px;\n white-space: nowrap;\n overflow: hidden;\n}\n.banner__name {\n font-size: 14.5px;\n font-weight: 700;\n letter-spacing: -0.01em;\n color: var(--mj-text-primary);\n flex-shrink: 0;\n}\n.banner__for {\n font-size: 11.5px;\n color: var(--mj-text-muted);\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n flex-shrink: 5; /* gives way before the name/pill, after the model suffix */\n}\n.banner__for b {\n color: var(--mj-text-secondary);\n}\n/* Subtle realtime-model suffix (e.g. \"\u00B7 GPT Realtime 2\") in the identity line. */\n.banner__model {\n font-size: 11px;\n color: var(--mj-text-muted);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n flex-shrink: 10; /* first to give way when the banner narrows */\n min-width: 0;\n}\n\n.banner__state {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 4px 12px;\n border-radius: var(--mj-radius-full, 9999px);\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n}\n.banner__state--busy {\n background: var(--mj-status-warning-bg);\n border-color: var(--mj-status-warning);\n}\n.banner__state--busy .fa-spinner {\n color: var(--mj-status-warning);\n}\n.banner__state-label {\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-brand-accent, var(--mj-brand-primary));\n}\n.banner__state--busy .banner__state-label {\n color: var(--mj-status-warning-text, var(--mj-status-warning));\n}\n\n/* ---------- Glowing agent orb ---------- */\n.agent-orb {\n --orb-size: 34px;\n width: var(--orb-size);\n height: var(--orb-size);\n border-radius: 50%;\n position: relative;\n flex-shrink: 0;\n background: radial-gradient(circle at 35% 30%,\n var(--mj-brand-accent, var(--mj-brand-primary)),\n var(--mj-brand-primary) 60%,\n var(--mj-brand-primary-active, var(--mj-brand-primary)));\n box-shadow:\n 0 0 0 6px color-mix(in srgb, var(--mj-brand-primary) 12%, transparent),\n 0 0 30px color-mix(in srgb, var(--mj-brand-primary) 45%, transparent);\n}\n.agent-orb::after {\n content: \"\";\n position: absolute;\n inset: -4px;\n border-radius: 50%;\n border: 2px solid color-mix(in srgb, var(--mj-brand-accent, var(--mj-brand-primary)) 40%, transparent);\n animation: orb-ring 2.4s ease-out infinite;\n}\n.agent-orb[data-state=\"speaking\"] {\n animation: orb-bob 0.9s ease-in-out infinite;\n}\n.agent-orb[data-state=\"listening\"] {\n box-shadow:\n 0 0 0 6px color-mix(in srgb, var(--mj-status-success) 16%, transparent),\n 0 0 30px color-mix(in srgb, var(--mj-status-success) 40%, transparent);\n background: radial-gradient(circle at 35% 30%,\n color-mix(in srgb, var(--mj-status-success) 60%, white), var(--mj-brand-primary) 65%);\n}\n.agent-orb[data-state=\"thinking\"] {\n box-shadow:\n 0 0 0 6px color-mix(in srgb, var(--mj-status-warning) 14%, transparent),\n 0 0 26px color-mix(in srgb, var(--mj-status-warning) 35%, transparent);\n}\n\n@keyframes orb-ring { 0% { transform: scale(1); opacity: .6 } 100% { transform: scale(1.5); opacity: 0 } }\n@keyframes orb-bob { 0%, 100% { transform: translateY(0) } 50% { transform: translateY(-3px) } }\n\n/* ---------- Audio-reactive mode ----------\n The overlay's rAF meter loop writes --voice-out / --voice-in + data attributes on\n .call-overlay; custom properties INHERIT into this component and :host-context()\n reaches the ancestor's attributes \u2014 so the app-bar orb rides the SAME live signal as\n the hero (scaled subtler at app-bar size). Un-metered sessions keep the keyframes. */\n:host-context(.call-overlay[data-audio-live='true']) .agent-orb:not(.agent-orb--review) {\n animation: none;\n transform: scale(calc(1 + var(--voice-out, 0) * 0.14));\n transition: transform 70ms linear;\n}\n:host-context(.call-overlay[data-audio-live='true']) .agent-orb:not(.agent-orb--review)::after {\n animation: none;\n opacity: calc(0.15 + var(--voice-out, 0) * 0.85);\n}\n:host-context(.call-overlay[data-audio-live='true'][data-voice-dir='user']) .agent-orb:not(.agent-orb--review) {\n box-shadow:\n 0 0 0 6px color-mix(in srgb, var(--mj-status-success) 16%, transparent),\n 0 0 30px color-mix(in srgb, var(--mj-status-success) 40%, transparent);\n background: radial-gradient(circle at 35% 30%,\n color-mix(in srgb, var(--mj-status-success) 60%, white), var(--mj-brand-primary) 65%);\n}\n\n/* ---------- Voice activity waveform ---------- */\n.waveform {\n display: flex;\n align-items: center;\n gap: 3px;\n height: 18px;\n}\n.waveform span {\n width: 3px;\n border-radius: 3px;\n background: var(--mj-brand-primary);\n animation: wave 1.1s ease-in-out infinite;\n}\n.waveform span:nth-child(1) { height: 30%; animation-delay: 0s }\n.waveform span:nth-child(2) { height: 65%; animation-delay: .1s }\n.waveform span:nth-child(3) { height: 100%; animation-delay: .2s }\n.waveform span:nth-child(4) { height: 55%; animation-delay: .3s }\n.waveform span:nth-child(5) { height: 85%; animation-delay: .15s }\n.waveform span:nth-child(6) { height: 40%; animation-delay: .25s }\n.waveform span:nth-child(7) { height: 70%; animation-delay: .05s }\n.waveform span:nth-child(8) { height: 35%; animation-delay: .35s }\n.waveform--idle span {\n animation: none;\n height: 18% !important;\n background: var(--mj-text-disabled);\n}\n@keyframes wave { 0%, 100% { transform: scaleY(.4) } 50% { transform: scaleY(1) } }\n\n.pill {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 3px 10px;\n border-radius: var(--mj-radius-full, 9999px);\n font-size: 11.5px;\n font-weight: 600;\n border: 1px solid transparent;\n line-height: 1.4;\n}\n.pill i { font-size: 10px; }\n.pill--sage {\n background: var(--sage-bg);\n color: var(--mj-color-violet-300, var(--mj-text-secondary));\n border-color: var(--sage-border);\n}\n\n/* ---------- Session review variant ---------- */\n.banner--review {\n background: linear-gradient(180deg, color-mix(in srgb, var(--mj-text-muted) 10%, transparent), transparent);\n}\n/* Static orb: no pulse ring, dimmed glow \u2014 the session is history, nothing is live. */\n.agent-orb--review {\n box-shadow: 0 0 0 6px color-mix(in srgb, var(--mj-text-muted) 12%, transparent);\n background: radial-gradient(circle at 35% 30%,\n color-mix(in srgb, var(--mj-text-muted) 55%, var(--mj-bg-surface)),\n var(--mj-text-muted) 65%);\n}\n.agent-orb--review::after {\n animation: none;\n border-color: color-mix(in srgb, var(--mj-text-muted) 30%, transparent);\n}\n.pill--review {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n color: var(--mj-text-link, var(--mj-brand-primary));\n border-color: color-mix(in srgb, var(--mj-brand-primary) 35%, transparent);\n}\n.pill--close-reason {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n border-color: var(--mj-border-default);\n}\n.banner__range {\n flex-shrink: 3;\n}\n.banner__state--review {\n background: var(--mj-bg-surface-card);\n}\n.banner__state--review i {\n font-size: 11px;\n color: var(--mj-text-muted);\n}\n.banner__state-label--review {\n color: var(--mj-text-secondary);\n}\n\n/* Gear-gated developer link to the live agent session record */\n.dev-link {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 3px 9px;\n border-radius: var(--mj-radius-full, 9999px);\n border: 1px dashed var(--mj-border-strong);\n background: transparent;\n color: var(--mj-text-muted);\n font-family: inherit;\n font-size: 10.5px;\n font-weight: 700;\n white-space: nowrap;\n cursor: pointer;\n transition: color 140ms ease, border-color 140ms ease, background 140ms ease;\n}\n.dev-link:hover {\n color: var(--mj-text-link, var(--mj-brand-primary));\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, transparent);\n}\n.dev-link i {\n font-size: 9px;\n}\n\n/* ---------- App-bar action cluster (disclosure-gated; Redesign A) ---------- */\n.bar-actions {\n display: flex;\n align-items: center;\n gap: 8px;\n flex-shrink: 0;\n}\n.iconb {\n width: 34px;\n height: 34px;\n border-radius: var(--mj-radius-md, 8px);\n display: grid;\n place-items: center;\n border: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-secondary);\n cursor: pointer;\n font-size: 13px;\n transition: all 140ms ease;\n}\n.iconb:hover {\n color: var(--mj-text-primary);\n border-color: var(--mj-border-strong);\n background: var(--mj-bg-surface-hover);\n}\n.iconb--on {\n background: color-mix(in srgb, var(--mj-brand-primary) 16%, transparent);\n border-color: var(--mj-brand-primary);\n color: var(--mj-brand-accent, var(--mj-brand-primary));\n}\n.bar-sep {\n width: 1px;\n height: 26px;\n background: var(--mj-border-default);\n}\n.end-pill {\n display: inline-flex;\n align-items: center;\n gap: 9px;\n padding: 8px 18px;\n font-family: inherit;\n font-size: 13px;\n font-weight: 700;\n white-space: nowrap;\n border-radius: var(--mj-radius-full, 9999px);\n border: 1px solid var(--mj-status-error);\n background: var(--mj-status-error);\n color: var(--mj-text-inverse, #fff);\n cursor: pointer;\n box-shadow: 0 4px 16px color-mix(in srgb, var(--mj-status-error) 35%, transparent);\n transition: filter 140ms ease;\n}\n.end-pill:hover {\n filter: brightness(0.92);\n}\n.start-live-pill {\n display: inline-flex;\n align-items: center;\n gap: 9px;\n padding: 8px 18px;\n font-family: inherit;\n font-size: 13px;\n font-weight: 700;\n white-space: nowrap;\n border-radius: var(--mj-radius-full, 9999px);\n border: 1px solid var(--mj-brand-primary);\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse, #fff);\n cursor: pointer;\n box-shadow: 0 4px 16px color-mix(in srgb, var(--mj-brand-primary) 35%, transparent);\n transition: filter 140ms ease;\n}\n.start-live-pill:hover {\n filter: brightness(1.05);\n}\n\n/* ---------- Gear popover: density escape hatch + developer links ---------- */\n.gear-pop {\n position: absolute;\n top: calc(100% + 8px);\n right: 14px;\n z-index: 70;\n width: 268px;\n border: 1px solid var(--mj-border-strong);\n border-radius: var(--mj-radius-lg, 12px);\n background: var(--mj-bg-surface-elevated);\n box-shadow: var(--mj-shadow-xl, 0 12px 32px rgba(0, 0, 0, 0.18));\n padding: 12px 14px 10px;\n animation: gear-pop-in 160ms ease;\n}\n@keyframes gear-pop-in {\n from { opacity: 0; transform: translateY(-4px); }\n to { opacity: 1; transform: translateY(0); }\n}\n.gp-h {\n font-size: 10.5px;\n font-weight: 800;\n text-transform: uppercase;\n letter-spacing: 0.06em;\n color: var(--mj-text-muted);\n margin-bottom: 9px;\n}\n.gp-row {\n display: flex;\n align-items: center;\n gap: 10px;\n}\n.gp-l {\n font-size: 12px;\n font-weight: 600;\n color: var(--mj-text-secondary);\n}\n.gp-seg {\n display: inline-flex;\n flex: 1;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md, 8px);\n background: var(--mj-bg-surface);\n padding: 2px;\n gap: 2px;\n}\n.gp-seg button {\n flex: 1;\n border: 0;\n background: transparent;\n color: var(--mj-text-muted);\n font-family: inherit;\n font-size: 11px;\n font-weight: 700;\n padding: 4px 0;\n border-radius: 6px;\n cursor: pointer;\n transition: all 120ms ease;\n}\n.gp-seg button.on {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse, #fff);\n}\n.gp-note {\n font-size: 10.5px;\n color: var(--mj-text-muted);\n line-height: 1.45;\n margin-top: 8px;\n}\n.gp-div {\n height: 1px;\n background: var(--mj-border-default);\n margin: 10px -14px;\n}\n.gp-link {\n display: flex;\n width: 100%;\n align-items: center;\n gap: 9px;\n padding: 6px 2px;\n border: 0;\n background: transparent;\n color: var(--mj-text-secondary);\n font-family: inherit;\n font-size: 12px;\n font-weight: 600;\n cursor: pointer;\n text-align: left;\n}\n.gp-link:hover {\n color: var(--mj-text-primary);\n}\n.gp-link i {\n width: 16px;\n text-align: center;\n font-size: 13px;\n color: var(--mj-text-muted);\n}\n.gp-link:hover i {\n color: var(--mj-brand-accent, var(--mj-brand-primary));\n}\n"] }]
448
+ }], null, { State: [{
449
+ type: Input,
450
+ args: [{ required: true }]
451
+ }], AgentName: [{
452
+ type: Input
453
+ }], ModelName: [{
454
+ type: Input
455
+ }], DevMode: [{
456
+ type: Input
457
+ }], SessionID: [{
458
+ type: Input
459
+ }], ReviewMode: [{
460
+ type: Input
461
+ }], ReviewStartedAt: [{
462
+ type: Input
463
+ }], ReviewClosedAt: [{
464
+ type: Input
465
+ }], ReviewCloseReason: [{
466
+ type: Input
467
+ }], CaptionsOn: [{
468
+ type: Input
469
+ }], ShowCaptionsControl: [{
470
+ type: Input
471
+ }], ShowGear: [{
472
+ type: Input
473
+ }], ShowEnd: [{
474
+ type: Input
475
+ }], ShowMinimize: [{
476
+ type: Input
477
+ }], ShowPureAudio: [{
478
+ type: Input
479
+ }], Density: [{
480
+ type: Input
481
+ }], OpenSessionRequested: [{
482
+ type: Output
483
+ }], CaptionsToggled: [{
484
+ type: Output
485
+ }], DevModeToggled: [{
486
+ type: Output
487
+ }], DensityChanged: [{
488
+ type: Output
489
+ }], MinimizeRequested: [{
490
+ type: Output
491
+ }], PureAudioRequested: [{
492
+ type: Output
493
+ }], EndRequested: [{
494
+ type: Output
495
+ }], StartLiveRequested: [{
496
+ type: Output
497
+ }], CloseRequested: [{
498
+ type: Output
499
+ }], OnDocumentClick: [{
500
+ type: HostListener,
501
+ args: ['document:click']
502
+ }] }); })();
503
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(RealtimeAgentBannerComponent, { className: "RealtimeAgentBannerComponent", filePath: "src/lib/components/realtime/realtime-agent-banner.component.ts", lineNumber: 31 }); })();
504
+ //# sourceMappingURL=realtime-agent-banner.component.js.map