@memberjunction/ng-conversations 5.43.0 → 5.44.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (351) hide show
  1. package/dist/lib/components/active-tasks/active-tasks-panel.component.d.ts +0 -1
  2. package/dist/lib/components/active-tasks/active-tasks-panel.component.d.ts.map +1 -1
  3. package/dist/lib/components/active-tasks/active-tasks-panel.component.js +56 -52
  4. package/dist/lib/components/active-tasks/active-tasks-panel.component.js.map +1 -1
  5. package/dist/lib/components/artifact/artifact-share-modal.component.js +37 -41
  6. package/dist/lib/components/artifact/artifact-share-modal.component.js.map +1 -1
  7. package/dist/lib/components/collection/collection-form-modal.component.d.ts.map +1 -1
  8. package/dist/lib/components/collection/collection-form-modal.component.js +10 -14
  9. package/dist/lib/components/collection/collection-form-modal.component.js.map +1 -1
  10. package/dist/lib/components/collection/collection-share-modal.component.js +41 -45
  11. package/dist/lib/components/collection/collection-share-modal.component.js.map +1 -1
  12. package/dist/lib/components/collection/collection-view.component.d.ts.map +1 -1
  13. package/dist/lib/components/collection/collection-view.component.js +22 -36
  14. package/dist/lib/components/collection/collection-view.component.js.map +1 -1
  15. package/dist/lib/components/collection/collections-full-view.component.d.ts +4 -0
  16. package/dist/lib/components/collection/collections-full-view.component.d.ts.map +1 -1
  17. package/dist/lib/components/collection/collections-full-view.component.js +134 -166
  18. package/dist/lib/components/collection/collections-full-view.component.js.map +1 -1
  19. package/dist/lib/components/conversation/conversation-chat-area.component.d.ts +73 -8
  20. package/dist/lib/components/conversation/conversation-chat-area.component.d.ts.map +1 -1
  21. package/dist/lib/components/conversation/conversation-chat-area.component.js +487 -123
  22. package/dist/lib/components/conversation/conversation-chat-area.component.js.map +1 -1
  23. package/dist/lib/components/conversation/pinned-messages-panel.component.js +6 -9
  24. package/dist/lib/components/conversation/pinned-messages-panel.component.js.map +1 -1
  25. package/dist/lib/components/library/library-full-view.component.d.ts.map +1 -1
  26. package/dist/lib/components/library/library-full-view.component.js +20 -24
  27. package/dist/lib/components/library/library-full-view.component.js.map +1 -1
  28. package/dist/lib/components/members/members-modal.component.d.ts.map +1 -1
  29. package/dist/lib/components/members/members-modal.component.js +10 -11
  30. package/dist/lib/components/members/members-modal.component.js.map +1 -1
  31. package/dist/lib/components/mention/mention-dropdown.component.js +49 -28
  32. package/dist/lib/components/mention/mention-dropdown.component.js.map +1 -1
  33. package/dist/lib/components/mention/mention-editor.component.d.ts.map +1 -1
  34. package/dist/lib/components/mention/mention-editor.component.js +24 -10
  35. package/dist/lib/components/mention/mention-editor.component.js.map +1 -1
  36. package/dist/lib/components/message/message-input-box.component.d.ts +11 -16
  37. package/dist/lib/components/message/message-input-box.component.d.ts.map +1 -1
  38. package/dist/lib/components/message/message-input-box.component.js +52 -46
  39. package/dist/lib/components/message/message-input-box.component.js.map +1 -1
  40. package/dist/lib/components/message/message-input.component.d.ts +83 -18
  41. package/dist/lib/components/message/message-input.component.d.ts.map +1 -1
  42. package/dist/lib/components/message/message-input.component.js +238 -151
  43. package/dist/lib/components/message/message-input.component.js.map +1 -1
  44. package/dist/lib/components/message/message-item.component.d.ts +10 -1
  45. package/dist/lib/components/message/message-item.component.d.ts.map +1 -1
  46. package/dist/lib/components/message/message-item.component.js +67 -15
  47. package/dist/lib/components/message/message-item.component.js.map +1 -1
  48. package/dist/lib/components/message/message-list.component.js +6 -9
  49. package/dist/lib/components/message/message-list.component.js.map +1 -1
  50. package/dist/lib/components/overlay/chat-overlay.component.d.ts +3 -0
  51. package/dist/lib/components/overlay/chat-overlay.component.d.ts.map +1 -1
  52. package/dist/lib/components/overlay/chat-overlay.component.js +9 -4
  53. package/dist/lib/components/overlay/chat-overlay.component.js.map +1 -1
  54. package/dist/lib/components/realtime/channels/base-realtime-channel-client.d.ts +45 -0
  55. package/dist/lib/components/realtime/channels/base-realtime-channel-client.d.ts.map +1 -1
  56. package/dist/lib/components/realtime/channels/base-realtime-channel-client.js +10 -0
  57. package/dist/lib/components/realtime/channels/base-realtime-channel-client.js.map +1 -1
  58. package/dist/lib/components/realtime/channels/client-context-channel.d.ts +46 -0
  59. package/dist/lib/components/realtime/channels/client-context-channel.d.ts.map +1 -0
  60. package/dist/lib/components/realtime/channels/client-context-channel.js +174 -0
  61. package/dist/lib/components/realtime/channels/client-context-channel.js.map +1 -0
  62. package/dist/lib/components/realtime/evidence-playback/realtime-evidence-playback.component.d.ts +123 -0
  63. package/dist/lib/components/realtime/evidence-playback/realtime-evidence-playback.component.d.ts.map +1 -0
  64. package/dist/lib/components/realtime/evidence-playback/realtime-evidence-playback.component.js +397 -0
  65. package/dist/lib/components/realtime/evidence-playback/realtime-evidence-playback.component.js.map +1 -0
  66. package/dist/lib/components/realtime/media/media-channel-state.d.ts +103 -0
  67. package/dist/lib/components/realtime/media/media-channel-state.d.ts.map +1 -0
  68. package/dist/lib/components/realtime/media/media-channel-state.js +143 -0
  69. package/dist/lib/components/realtime/media/media-channel-state.js.map +1 -0
  70. package/dist/lib/components/realtime/media/media-channel-tools.d.ts +24 -0
  71. package/dist/lib/components/realtime/media/media-channel-tools.d.ts.map +1 -0
  72. package/dist/lib/components/realtime/media/media-channel-tools.js +107 -0
  73. package/dist/lib/components/realtime/media/media-channel-tools.js.map +1 -0
  74. package/dist/lib/components/realtime/media/media-channel.d.ts +89 -0
  75. package/dist/lib/components/realtime/media/media-channel.d.ts.map +1 -0
  76. package/dist/lib/components/realtime/media/media-channel.js +253 -0
  77. package/dist/lib/components/realtime/media/media-channel.js.map +1 -0
  78. package/dist/lib/components/realtime/media/realtime-media-surface.component.d.ts +141 -0
  79. package/dist/lib/components/realtime/media/realtime-media-surface.component.d.ts.map +1 -0
  80. package/dist/lib/components/realtime/media/realtime-media-surface.component.js +574 -0
  81. package/dist/lib/components/realtime/media/realtime-media-surface.component.js.map +1 -0
  82. package/dist/lib/components/realtime/realtime-activity-rail.component.d.ts +59 -14
  83. package/dist/lib/components/realtime/realtime-activity-rail.component.d.ts.map +1 -1
  84. package/dist/lib/components/realtime/realtime-activity-rail.component.js +277 -74
  85. package/dist/lib/components/realtime/realtime-activity-rail.component.js.map +1 -1
  86. package/dist/lib/components/realtime/realtime-agent-banner.component.d.ts +28 -27
  87. package/dist/lib/components/realtime/realtime-agent-banner.component.d.ts.map +1 -1
  88. package/dist/lib/components/realtime/realtime-agent-banner.component.js +144 -143
  89. package/dist/lib/components/realtime/realtime-agent-banner.component.js.map +1 -1
  90. package/dist/lib/components/realtime/realtime-agent-picker.component.d.ts +12 -0
  91. package/dist/lib/components/realtime/realtime-agent-picker.component.d.ts.map +1 -1
  92. package/dist/lib/components/realtime/realtime-agent-picker.component.js +105 -43
  93. package/dist/lib/components/realtime/realtime-agent-picker.component.js.map +1 -1
  94. package/dist/lib/components/realtime/realtime-audio-visuals.d.ts +2 -2
  95. package/dist/lib/components/realtime/realtime-audio-visuals.d.ts.map +1 -1
  96. package/dist/lib/components/realtime/realtime-audio-visuals.js.map +1 -1
  97. package/dist/lib/components/realtime/realtime-composer.component.d.ts +41 -7
  98. package/dist/lib/components/realtime/realtime-composer.component.d.ts.map +1 -1
  99. package/dist/lib/components/realtime/realtime-composer.component.js +216 -102
  100. package/dist/lib/components/realtime/realtime-composer.component.js.map +1 -1
  101. package/dist/lib/components/realtime/realtime-delegation-card.component.d.ts +0 -2
  102. package/dist/lib/components/realtime/realtime-delegation-card.component.d.ts.map +1 -1
  103. package/dist/lib/components/realtime/realtime-delegation-card.component.js +67 -71
  104. package/dist/lib/components/realtime/realtime-delegation-card.component.js.map +1 -1
  105. package/dist/lib/components/realtime/realtime-session-overlay.component.d.ts +364 -44
  106. package/dist/lib/components/realtime/realtime-session-overlay.component.d.ts.map +1 -1
  107. package/dist/lib/components/realtime/realtime-session-overlay.component.js +839 -153
  108. package/dist/lib/components/realtime/realtime-session-overlay.component.js.map +1 -1
  109. package/dist/lib/components/realtime/realtime-session-state.d.ts +5 -5
  110. package/dist/lib/components/realtime/realtime-session-state.d.ts.map +1 -1
  111. package/dist/lib/components/realtime/realtime-session-state.js.map +1 -1
  112. package/dist/lib/components/realtime/realtime-surface-tab-style.d.ts +70 -0
  113. package/dist/lib/components/realtime/realtime-surface-tab-style.d.ts.map +1 -0
  114. package/dist/lib/components/realtime/realtime-surface-tab-style.js +115 -0
  115. package/dist/lib/components/realtime/realtime-surface-tab-style.js.map +1 -0
  116. package/dist/lib/components/realtime/realtime-surface-tabs.component.d.ts +55 -57
  117. package/dist/lib/components/realtime/realtime-surface-tabs.component.d.ts.map +1 -1
  118. package/dist/lib/components/realtime/realtime-surface-tabs.component.js +165 -143
  119. package/dist/lib/components/realtime/realtime-surface-tabs.component.js.map +1 -1
  120. package/dist/lib/components/realtime/realtime-surface-tabs.model.d.ts +80 -71
  121. package/dist/lib/components/realtime/realtime-surface-tabs.model.d.ts.map +1 -1
  122. package/dist/lib/components/realtime/realtime-surface-tabs.model.js +83 -113
  123. package/dist/lib/components/realtime/realtime-surface-tabs.model.js.map +1 -1
  124. package/dist/lib/components/realtime/realtime-ui-config.d.ts +270 -0
  125. package/dist/lib/components/realtime/realtime-ui-config.d.ts.map +1 -0
  126. package/dist/lib/components/realtime/realtime-ui-config.js +212 -0
  127. package/dist/lib/components/realtime/realtime-ui-config.js.map +1 -0
  128. package/dist/lib/components/search/search-panel.component.d.ts +2 -0
  129. package/dist/lib/components/search/search-panel.component.d.ts.map +1 -1
  130. package/dist/lib/components/search/search-panel.component.js +92 -101
  131. package/dist/lib/components/search/search-panel.component.js.map +1 -1
  132. package/dist/lib/components/share/share-modal.component.d.ts.map +1 -1
  133. package/dist/lib/components/share/share-modal.component.js +10 -11
  134. package/dist/lib/components/share/share-modal.component.js.map +1 -1
  135. package/dist/lib/components/shared/user-picker.component.d.ts.map +1 -1
  136. package/dist/lib/components/shared/user-picker.component.js +12 -15
  137. package/dist/lib/components/shared/user-picker.component.js.map +1 -1
  138. package/dist/lib/components/workspace/conversation-workspace.component.d.ts +5 -0
  139. package/dist/lib/components/workspace/conversation-workspace.component.d.ts.map +1 -1
  140. package/dist/lib/components/workspace/conversation-workspace.component.js +18 -7
  141. package/dist/lib/components/workspace/conversation-workspace.component.js.map +1 -1
  142. package/dist/lib/conversations.module.d.ts +29 -26
  143. package/dist/lib/conversations.module.d.ts.map +1 -1
  144. package/dist/lib/conversations.module.js +37 -6
  145. package/dist/lib/conversations.module.js.map +1 -1
  146. package/dist/lib/models/conversation-state.model.d.ts +6 -3
  147. package/dist/lib/models/conversation-state.model.d.ts.map +1 -1
  148. package/dist/lib/models/conversation-state.model.js.map +1 -1
  149. package/dist/lib/services/conversation-agent.service.d.ts +2 -2
  150. package/dist/lib/services/conversation-agent.service.d.ts.map +1 -1
  151. package/dist/lib/services/conversation-agent.service.js +6 -2
  152. package/dist/lib/services/conversation-agent.service.js.map +1 -1
  153. package/dist/lib/services/mention-autocomplete.service.d.ts +17 -1
  154. package/dist/lib/services/mention-autocomplete.service.d.ts.map +1 -1
  155. package/dist/lib/services/mention-autocomplete.service.js +58 -2
  156. package/dist/lib/services/mention-autocomplete.service.js.map +1 -1
  157. package/dist/lib/services/realtime-audio-recorder.d.ts +143 -0
  158. package/dist/lib/services/realtime-audio-recorder.d.ts.map +1 -0
  159. package/dist/lib/services/realtime-audio-recorder.js +379 -0
  160. package/dist/lib/services/realtime-audio-recorder.js.map +1 -0
  161. package/dist/lib/services/realtime-pcm-wav.d.ts +75 -0
  162. package/dist/lib/services/realtime-pcm-wav.d.ts.map +1 -0
  163. package/dist/lib/services/realtime-pcm-wav.js +205 -0
  164. package/dist/lib/services/realtime-pcm-wav.js.map +1 -0
  165. package/dist/lib/services/realtime-session-review.service.d.ts +28 -1
  166. package/dist/lib/services/realtime-session-review.service.d.ts.map +1 -1
  167. package/dist/lib/services/realtime-session-review.service.js +12 -3
  168. package/dist/lib/services/realtime-session-review.service.js.map +1 -1
  169. package/dist/lib/services/realtime-session.service.d.ts +210 -20
  170. package/dist/lib/services/realtime-session.service.d.ts.map +1 -1
  171. package/dist/lib/services/realtime-session.service.js +452 -21
  172. package/dist/lib/services/realtime-session.service.js.map +1 -1
  173. package/dist/lib/services/realtime-sessions-adapter.js +1 -1
  174. package/dist/lib/services/realtime-sessions-adapter.js.map +1 -1
  175. package/dist/lib/services/ui-command-handler.service.d.ts +7 -2
  176. package/dist/lib/services/ui-command-handler.service.d.ts.map +1 -1
  177. package/dist/lib/services/ui-command-handler.service.js +6 -2
  178. package/dist/lib/services/ui-command-handler.service.js.map +1 -1
  179. package/dist/lib/utils/plan-mode-preference.d.ts +62 -0
  180. package/dist/lib/utils/plan-mode-preference.d.ts.map +1 -0
  181. package/dist/lib/utils/plan-mode-preference.js +130 -0
  182. package/dist/lib/utils/plan-mode-preference.js.map +1 -0
  183. package/dist/public-api.d.ts +6 -0
  184. package/dist/public-api.d.ts.map +1 -1
  185. package/dist/public-api.js +8 -0
  186. package/dist/public-api.js.map +1 -1
  187. package/package.json +28 -26
  188. package/dist/__tests__/attachment-badge.test.d.ts +0 -2
  189. package/dist/__tests__/attachment-badge.test.d.ts.map +0 -1
  190. package/dist/__tests__/attachment-badge.test.js +0 -66
  191. package/dist/__tests__/attachment-badge.test.js.map +0 -1
  192. package/dist/__tests__/channel-optional-surface.test.d.ts +0 -2
  193. package/dist/__tests__/channel-optional-surface.test.d.ts.map +0 -1
  194. package/dist/__tests__/channel-optional-surface.test.js +0 -53
  195. package/dist/__tests__/channel-optional-surface.test.js.map +0 -1
  196. package/dist/__tests__/chat-events.test.d.ts +0 -14
  197. package/dist/__tests__/chat-events.test.d.ts.map +0 -1
  198. package/dist/__tests__/chat-events.test.js +0 -109
  199. package/dist/__tests__/chat-events.test.js.map +0 -1
  200. package/dist/__tests__/collections-full-view.test.d.ts +0 -2
  201. package/dist/__tests__/collections-full-view.test.d.ts.map +0 -1
  202. package/dist/__tests__/collections-full-view.test.js +0 -225
  203. package/dist/__tests__/collections-full-view.test.js.map +0 -1
  204. package/dist/__tests__/conversation-cache.test.d.ts +0 -2
  205. package/dist/__tests__/conversation-cache.test.d.ts.map +0 -1
  206. package/dist/__tests__/conversation-cache.test.js +0 -233
  207. package/dist/__tests__/conversation-cache.test.js.map +0 -1
  208. package/dist/__tests__/conversation-naming.test.d.ts +0 -2
  209. package/dist/__tests__/conversation-naming.test.d.ts.map +0 -1
  210. package/dist/__tests__/conversation-naming.test.js +0 -110
  211. package/dist/__tests__/conversation-naming.test.js.map +0 -1
  212. package/dist/__tests__/delegation-result-parser.test.d.ts +0 -2
  213. package/dist/__tests__/delegation-result-parser.test.d.ts.map +0 -1
  214. package/dist/__tests__/delegation-result-parser.test.js +0 -107
  215. package/dist/__tests__/delegation-result-parser.test.js.map +0 -1
  216. package/dist/__tests__/distinct-artifacts.test.d.ts +0 -2
  217. package/dist/__tests__/distinct-artifacts.test.d.ts.map +0 -1
  218. package/dist/__tests__/distinct-artifacts.test.js +0 -56
  219. package/dist/__tests__/distinct-artifacts.test.js.map +0 -1
  220. package/dist/__tests__/event-wiring.test.d.ts +0 -15
  221. package/dist/__tests__/event-wiring.test.d.ts.map +0 -1
  222. package/dist/__tests__/event-wiring.test.js +0 -100
  223. package/dist/__tests__/event-wiring.test.js.map +0 -1
  224. package/dist/__tests__/index.test.d.ts +0 -2
  225. package/dist/__tests__/index.test.d.ts.map +0 -1
  226. package/dist/__tests__/index.test.js +0 -7
  227. package/dist/__tests__/index.test.js.map +0 -1
  228. package/dist/__tests__/narration-template.test.d.ts +0 -2
  229. package/dist/__tests__/narration-template.test.d.ts.map +0 -1
  230. package/dist/__tests__/narration-template.test.js +0 -76
  231. package/dist/__tests__/narration-template.test.js.map +0 -1
  232. package/dist/__tests__/notification-model.test.d.ts +0 -2
  233. package/dist/__tests__/notification-model.test.d.ts.map +0 -1
  234. package/dist/__tests__/notification-model.test.js +0 -68
  235. package/dist/__tests__/notification-model.test.js.map +0 -1
  236. package/dist/__tests__/realtime-agent-picker-models.test.d.ts +0 -2
  237. package/dist/__tests__/realtime-agent-picker-models.test.d.ts.map +0 -1
  238. package/dist/__tests__/realtime-agent-picker-models.test.js +0 -49
  239. package/dist/__tests__/realtime-agent-picker-models.test.js.map +0 -1
  240. package/dist/__tests__/realtime-audio-visuals.test.d.ts +0 -2
  241. package/dist/__tests__/realtime-audio-visuals.test.d.ts.map +0 -1
  242. package/dist/__tests__/realtime-audio-visuals.test.js +0 -123
  243. package/dist/__tests__/realtime-audio-visuals.test.js.map +0 -1
  244. package/dist/__tests__/realtime-delegation-card-cancel.test.d.ts +0 -2
  245. package/dist/__tests__/realtime-delegation-card-cancel.test.d.ts.map +0 -1
  246. package/dist/__tests__/realtime-delegation-card-cancel.test.js +0 -48
  247. package/dist/__tests__/realtime-delegation-card-cancel.test.js.map +0 -1
  248. package/dist/__tests__/realtime-disclosure.test.d.ts +0 -2
  249. package/dist/__tests__/realtime-disclosure.test.d.ts.map +0 -1
  250. package/dist/__tests__/realtime-disclosure.test.js +0 -164
  251. package/dist/__tests__/realtime-disclosure.test.js.map +0 -1
  252. package/dist/__tests__/realtime-pairing.test.d.ts +0 -2
  253. package/dist/__tests__/realtime-pairing.test.d.ts.map +0 -1
  254. package/dist/__tests__/realtime-pairing.test.js +0 -207
  255. package/dist/__tests__/realtime-pairing.test.js.map +0 -1
  256. package/dist/__tests__/realtime-review-lifecycle.test.d.ts +0 -2
  257. package/dist/__tests__/realtime-review-lifecycle.test.d.ts.map +0 -1
  258. package/dist/__tests__/realtime-review-lifecycle.test.js +0 -154
  259. package/dist/__tests__/realtime-review-lifecycle.test.js.map +0 -1
  260. package/dist/__tests__/realtime-session-cancel-usage.test.d.ts +0 -2
  261. package/dist/__tests__/realtime-session-cancel-usage.test.d.ts.map +0 -1
  262. package/dist/__tests__/realtime-session-cancel-usage.test.js +0 -230
  263. package/dist/__tests__/realtime-session-cancel-usage.test.js.map +0 -1
  264. package/dist/__tests__/realtime-session-channels.test.d.ts +0 -2
  265. package/dist/__tests__/realtime-session-channels.test.d.ts.map +0 -1
  266. package/dist/__tests__/realtime-session-channels.test.js +0 -252
  267. package/dist/__tests__/realtime-session-channels.test.js.map +0 -1
  268. package/dist/__tests__/realtime-session-client-tools.test.d.ts +0 -2
  269. package/dist/__tests__/realtime-session-client-tools.test.d.ts.map +0 -1
  270. package/dist/__tests__/realtime-session-client-tools.test.js +0 -103
  271. package/dist/__tests__/realtime-session-client-tools.test.js.map +0 -1
  272. package/dist/__tests__/realtime-session-minimized.test.d.ts +0 -2
  273. package/dist/__tests__/realtime-session-minimized.test.d.ts.map +0 -1
  274. package/dist/__tests__/realtime-session-minimized.test.js +0 -32
  275. package/dist/__tests__/realtime-session-minimized.test.js.map +0 -1
  276. package/dist/__tests__/realtime-session-mint.test.d.ts +0 -2
  277. package/dist/__tests__/realtime-session-mint.test.d.ts.map +0 -1
  278. package/dist/__tests__/realtime-session-mint.test.js +0 -69
  279. package/dist/__tests__/realtime-session-mint.test.js.map +0 -1
  280. package/dist/__tests__/realtime-session-policy.test.d.ts +0 -2
  281. package/dist/__tests__/realtime-session-policy.test.d.ts.map +0 -1
  282. package/dist/__tests__/realtime-session-policy.test.js +0 -303
  283. package/dist/__tests__/realtime-session-policy.test.js.map +0 -1
  284. package/dist/__tests__/realtime-session-review.service.test.d.ts +0 -2
  285. package/dist/__tests__/realtime-session-review.service.test.d.ts.map +0 -1
  286. package/dist/__tests__/realtime-session-review.service.test.js +0 -743
  287. package/dist/__tests__/realtime-session-review.service.test.js.map +0 -1
  288. package/dist/__tests__/realtime-session-state.test.d.ts +0 -2
  289. package/dist/__tests__/realtime-session-state.test.d.ts.map +0 -1
  290. package/dist/__tests__/realtime-session-state.test.js +0 -83
  291. package/dist/__tests__/realtime-session-state.test.js.map +0 -1
  292. package/dist/__tests__/realtime-session-timeline-card.test.d.ts +0 -2
  293. package/dist/__tests__/realtime-session-timeline-card.test.d.ts.map +0 -1
  294. package/dist/__tests__/realtime-session-timeline-card.test.js +0 -106
  295. package/dist/__tests__/realtime-session-timeline-card.test.js.map +0 -1
  296. package/dist/__tests__/realtime-session-timeline.test.d.ts +0 -2
  297. package/dist/__tests__/realtime-session-timeline.test.d.ts.map +0 -1
  298. package/dist/__tests__/realtime-session-timeline.test.js +0 -142
  299. package/dist/__tests__/realtime-session-timeline.test.js.map +0 -1
  300. package/dist/__tests__/realtime-sessions-adapter.test.d.ts +0 -19
  301. package/dist/__tests__/realtime-sessions-adapter.test.d.ts.map +0 -1
  302. package/dist/__tests__/realtime-sessions-adapter.test.js +0 -188
  303. package/dist/__tests__/realtime-sessions-adapter.test.js.map +0 -1
  304. package/dist/__tests__/realtime-surface-panel-prefs.test.d.ts +0 -2
  305. package/dist/__tests__/realtime-surface-panel-prefs.test.d.ts.map +0 -1
  306. package/dist/__tests__/realtime-surface-panel-prefs.test.js +0 -100
  307. package/dist/__tests__/realtime-surface-panel-prefs.test.js.map +0 -1
  308. package/dist/__tests__/realtime-surface-tabs-model.test.d.ts +0 -2
  309. package/dist/__tests__/realtime-surface-tabs-model.test.d.ts.map +0 -1
  310. package/dist/__tests__/realtime-surface-tabs-model.test.js +0 -193
  311. package/dist/__tests__/realtime-surface-tabs-model.test.js.map +0 -1
  312. package/dist/__tests__/remote-browser-audio-player.test.d.ts +0 -2
  313. package/dist/__tests__/remote-browser-audio-player.test.d.ts.map +0 -1
  314. package/dist/__tests__/remote-browser-audio-player.test.js +0 -137
  315. package/dist/__tests__/remote-browser-audio-player.test.js.map +0 -1
  316. package/dist/__tests__/remote-browser-channel.test.d.ts +0 -2
  317. package/dist/__tests__/remote-browser-channel.test.d.ts.map +0 -1
  318. package/dist/__tests__/remote-browser-channel.test.js +0 -585
  319. package/dist/__tests__/remote-browser-channel.test.js.map +0 -1
  320. package/dist/__tests__/search-service.test.d.ts +0 -2
  321. package/dist/__tests__/search-service.test.d.ts.map +0 -1
  322. package/dist/__tests__/search-service.test.js +0 -114
  323. package/dist/__tests__/search-service.test.js.map +0 -1
  324. package/dist/__tests__/slot-defaults.test.d.ts +0 -24
  325. package/dist/__tests__/slot-defaults.test.d.ts.map +0 -1
  326. package/dist/__tests__/slot-defaults.test.js +0 -63
  327. package/dist/__tests__/slot-defaults.test.js.map +0 -1
  328. package/dist/__tests__/toast-service.test.d.ts +0 -2
  329. package/dist/__tests__/toast-service.test.d.ts.map +0 -1
  330. package/dist/__tests__/toast-service.test.js +0 -143
  331. package/dist/__tests__/toast-service.test.js.map +0 -1
  332. package/dist/__tests__/user-authorization.test.d.ts +0 -2
  333. package/dist/__tests__/user-authorization.test.d.ts.map +0 -1
  334. package/dist/__tests__/user-authorization.test.js +0 -97
  335. package/dist/__tests__/user-authorization.test.js.map +0 -1
  336. package/dist/__tests__/voice-session-narration.test.d.ts +0 -2
  337. package/dist/__tests__/voice-session-narration.test.d.ts.map +0 -1
  338. package/dist/__tests__/voice-session-narration.test.js +0 -609
  339. package/dist/__tests__/voice-session-narration.test.js.map +0 -1
  340. package/dist/__tests__/whiteboard-artifact-viewer.test.d.ts +0 -2
  341. package/dist/__tests__/whiteboard-artifact-viewer.test.d.ts.map +0 -1
  342. package/dist/__tests__/whiteboard-artifact-viewer.test.js +0 -101
  343. package/dist/__tests__/whiteboard-artifact-viewer.test.js.map +0 -1
  344. package/dist/__tests__/whiteboard-channel.test.d.ts +0 -2
  345. package/dist/__tests__/whiteboard-channel.test.d.ts.map +0 -1
  346. package/dist/__tests__/whiteboard-channel.test.js +0 -260
  347. package/dist/__tests__/whiteboard-channel.test.js.map +0 -1
  348. package/dist/__tests__/whiteboard-restore-state.test.d.ts +0 -2
  349. package/dist/__tests__/whiteboard-restore-state.test.d.ts.map +0 -1
  350. package/dist/__tests__/whiteboard-restore-state.test.js +0 -108
  351. package/dist/__tests__/whiteboard-restore-state.test.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"realtime-agent-banner.component.js","sourceRoot":"","sources":["../../../../src/lib/components/realtime/realtime-agent-banner.component.ts","../../../../src/lib/components/realtime/realtime-agent-banner.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, EventEmitter, HostListener, Input, Output } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { VoiceConnectionState } from '../../services/realtime-session.service';\nimport { RealtimeUxDensity } from './realtime-disclosure';\n\n/**\n * The call overlay's UNIFIED APP-BAR (per Redesign A — `plans/realtime/mockups/redesign-a.html`):\n * ONE header that owns identity, state, and every session action.\n *\n * - LEFT: the glowing agent orb (motion = turn-state), agent name + \"Co-Agent\" badge,\n * \"speaking as\" subline (+ subtle realtime-model suffix), and the state pill that swaps\n * between a waveform (speaking/listening) and a spinner (connecting/thinking).\n * - RIGHT (live): the disclosure-gated action cluster — Captions toggle (level 1+), the\n * gear (level 2+, opens a popover hosting the Simple/Standard/Pro/Auto INTERFACE DENSITY\n * control — the progressive-disclosure escape hatch — plus the developer-links toggle),\n * Minimize (hide the call view, call stays live), and the End-call pill (level 2+; below\n * that the phone-call strip's big End control owns ending).\n * - RIGHT (review): \"Start live session\" (resume, affirmative leads) + Close — the\n * review session's exit lives up here in the header bar, not floating in the body.\n *\n * Which controls render is decided by the OVERLAY (it owns the disclosure model) and\n * passed down as booleans — this component stays purely presentational.\n */\n@Component({\n standalone: true,\n selector: 'mj-realtime-agent-banner',\n imports: [CommonModule],\n templateUrl: './realtime-agent-banner.component.html',\n styleUrl: './realtime-agent-banner.component.css'\n})\nexport class RealtimeAgentBannerComponent {\n /** Current connection / turn state — drives the orb animation + state label. */\n @Input({ required: true }) State!: VoiceConnectionState;\n\n /** Display name of the agent the voice session fronts (e.g. \"Sage\"). */\n @Input() AgentName = 'the agent';\n\n /**\n * Display name of the realtime model the live session runs on (e.g. \"GPT Realtime 2\").\n * Rendered as a subtle suffix in the identity line; hidden when null/empty.\n */\n @Input() ModelName: string | null = null;\n\n /** Whether developer affordances (the \"Open session\" link) are revealed (gear-gated). */\n @Input() DevMode = false;\n\n /** ID of the server-side agent session record (`MJ: AI Agent Sessions`), when known. */\n @Input() SessionID: string | null = null;\n\n /**\n * SESSION REVIEW presentation: the banner shows the past session's identity\n * (review badge, started→closed range, close-reason chip) instead of live turn-state,\n * and the action cluster swaps to Start-live + Close.\n */\n @Input() ReviewMode = false;\n\n /** When reviewing: when the past session started (`__mj_CreatedAt`). */\n @Input() ReviewStartedAt: Date | null = null;\n\n /** When reviewing: when the past session closed (null while it is still open). */\n @Input() ReviewClosedAt: Date | null = null;\n\n /** When reviewing: why the past session closed (`Explicit` | `Janitor` | `Shutdown` | `Error`), when known. */\n @Input() ReviewCloseReason: string | null = null;\n\n // ── App-bar action cluster (disclosure-gated by the overlay) ────────────────\n\n /** Whether captions are currently shown (active state on the captions control). */\n @Input() CaptionsOn = true;\n\n /** Whether the captions control renders (disclosure level 1+). */\n @Input() ShowCaptionsControl = false;\n\n /** Whether the gear (density escape hatch + dev toggle) renders (disclosure level 2+). */\n @Input() ShowGear = false;\n\n /** Whether the End-call pill renders here (level 2+; the strip's big End owns it below). */\n @Input() ShowEnd = false;\n\n /** Whether the Minimize control renders (live sessions only). */\n @Input() ShowMinimize = false;\n\n /** Whether the \"Return to pure audio\" control renders (live + disclosure level above 0). */\n @Input() ShowPureAudio = false;\n\n /** The user's current interface-density override (selected state in the gear popover). */\n @Input() Density: RealtimeUxDensity = 'auto';\n\n /** Emitted with the session record's ID when the dev \"Open session\" link is clicked. */\n @Output() OpenSessionRequested = new EventEmitter<string>();\n\n /** Emitted when the user toggles captions; the overlay flips its caption state. */\n @Output() CaptionsToggled = new EventEmitter<boolean>();\n\n /** Emitted when the user toggles developer links from the gear popover. */\n @Output() DevModeToggled = new EventEmitter<boolean>();\n\n /** Emitted when the user picks an interface density in the gear popover. */\n @Output() DensityChanged = new EventEmitter<RealtimeUxDensity>();\n\n /** Emitted when the user minimizes the call view (the call stays live). */\n @Output() MinimizeRequested = new EventEmitter<void>();\n\n /** Emitted when the user asks to return to the pure-audio surface (level 0, this session). */\n @Output() PureAudioRequested = new EventEmitter<void>();\n\n /** Emitted when the user ends the call from the app-bar's End pill. */\n @Output() EndRequested = new EventEmitter<void>();\n\n /** Review only: the user asked to RESUME the reviewed session as a new live call. */\n @Output() StartLiveRequested = new EventEmitter<void>();\n\n /** Review only: the user asked to close the review and return to the conversation. */\n @Output() CloseRequested = new EventEmitter<void>();\n\n /** Whether the gear popover is open (closed by any outside click). */\n public GearOpen = false;\n\n /** The density choices the gear popover offers, in display order. */\n public readonly Densities: ReadonlyArray<{ Key: RealtimeUxDensity; Label: string }> = [\n { Key: 'simple', Label: 'Simple' },\n { Key: 'standard', Label: 'Standard' },\n { Key: 'pro', Label: 'Pro' },\n { Key: 'auto', Label: 'Auto' }\n ];\n\n /** True when the dev \"Open session\" link should render (gear on + session id known). */\n public get ShowOpenSession(): boolean {\n return this.DevMode && !!this.SessionID;\n }\n\n /** Emits the open-session request for the live agent session record. */\n public OpenSession(): void {\n if (this.SessionID) {\n this.OpenSessionRequested.emit(this.SessionID);\n }\n }\n\n /** Toggles the captions control and notifies the overlay. */\n public ToggleCaptions(): void {\n this.CaptionsOn = !this.CaptionsOn;\n this.CaptionsToggled.emit(this.CaptionsOn);\n }\n\n /** Opens/closes the gear popover (stops propagation so the outside-click close skips it). */\n public ToggleGear(event: MouseEvent): void {\n event.stopPropagation();\n this.GearOpen = !this.GearOpen;\n }\n\n /** Any outside click closes the gear popover. */\n @HostListener('document:click')\n public OnDocumentClick(): void {\n if (this.GearOpen) {\n this.GearOpen = false;\n }\n }\n\n /** Gear popover: pick an interface density (the overlay applies + persists it). */\n public SelectDensity(density: RealtimeUxDensity): void {\n this.DensityChanged.emit(density);\n }\n\n /** Gear popover: toggle developer links. */\n public ToggleDev(): void {\n this.DevMode = !this.DevMode;\n this.DevModeToggled.emit(this.DevMode);\n }\n\n /** The review banner's \"started → closed\" time-range label (empty when the start is unknown). */\n public get ReviewRangeLabel(): string {\n if (!this.ReviewStartedAt) {\n return '';\n }\n const start = this.formatStamp(this.ReviewStartedAt);\n if (!this.ReviewClosedAt) {\n return start;\n }\n return `${start} → ${this.formatStamp(this.ReviewClosedAt, this.ReviewStartedAt)}`;\n }\n\n /** Human label for the close-reason chip (empty hides the chip). */\n public get ReviewCloseReasonLabel(): string {\n switch (this.ReviewCloseReason) {\n case 'Explicit': return 'Ended by user';\n case 'Janitor': return 'Closed by janitor';\n case 'Shutdown': return 'Closed at shutdown';\n case 'Error': return 'Ended with error';\n default: return '';\n }\n }\n\n /** Compact date+time stamp; same-day end stamps drop the redundant date part. */\n private formatStamp(date: Date, sameDayAs?: Date | null): string {\n const time = date.toLocaleTimeString([], { hour: 'numeric', minute: '2-digit' }).toLowerCase();\n if (sameDayAs && date.toDateString() === sameDayAs.toDateString()) {\n return time;\n }\n return `${date.toLocaleDateString([], { month: 'short', day: 'numeric' })}, ${time}`;\n }\n\n /** Maps the realtime state to the orb's `data-state` (the orb only models active turn-states). */\n public OrbState(state: VoiceConnectionState): 'speaking' | 'listening' | 'thinking' {\n switch (state) {\n case 'speaking': return 'speaking';\n case 'thinking': return 'thinking';\n default: return 'listening';\n }\n }\n\n /** Human-readable state label, agent-aware where it reads better. */\n public StateLabel(state: VoiceConnectionState): string {\n switch (state) {\n case 'connecting': return 'Connecting…';\n case 'listening': return 'Listening';\n case 'speaking': return `${this.AgentName} is speaking…`;\n case 'thinking': return 'Working on it…';\n case 'error': return 'Connection error';\n case 'closed': return 'Call ended';\n default: return '';\n }\n }\n\n /** True while the state pill should show a spinner instead of the waveform. */\n public IsBusy(state: VoiceConnectionState): boolean {\n return state === 'connecting' || state === 'thinking';\n }\n}\n","<div class=\"banner\" [class.banner--review]=\"ReviewMode\">\n @if (ReviewMode) {\n <!-- SESSION REVIEW: static orb · name · review badge · started→closed · 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\">· {{ 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 — 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 — 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"]}
1
+ {"version":3,"file":"realtime-agent-banner.component.js","sourceRoot":"","sources":["../../../../src/lib/components/realtime/realtime-agent-banner.component.ts","../../../../src/lib/components/realtime/realtime-agent-banner.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, EventEmitter, HostListener, Input, Output } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { RealtimeConnectionState } from '../../services/realtime-session.service';\nimport { RealtimeUxDensity } from './realtime-disclosure';\n\n/**\n * The call overlay's UNIFIED APP-BAR (per Redesign A — `plans/realtime/mockups/redesign-a.html`):\n * ONE header that owns identity, state, and every session action.\n *\n * - LEFT: the glowing agent orb (motion = turn-state), agent name + \"Co-Agent\" badge,\n * \"speaking as\" subline (+ subtle realtime-model suffix), and the state pill that swaps\n * between a waveform (speaking/listening) and a spinner (connecting/thinking).\n * - RIGHT (live): STATE + WINDOW-CHROME only — the gear (level 2+, opens a popover hosting the\n * Simple/Standard/Pro/Auto INTERFACE DENSITY control — the progressive-disclosure escape hatch,\n * where Simple IS the pure-audio surface — plus the developer-links toggle) and Minimize (hide\n * the call view, call stays live). Call actions (Mute / Captions / Details / Type / End) live in\n * the bottom dock, the single home for each; Captions & End used to duplicate here and were\n * removed, and the standalone pure-audio headphones was folded into the gear's Density = Simple.\n * - RIGHT (review): \"Start live session\" (resume, affirmative leads) + Close — the\n * review session's exit lives up here in the header bar, not floating in the body.\n *\n * Which controls render is decided by the OVERLAY (it owns the disclosure model) and\n * passed down as booleans — this component stays purely presentational.\n */\n@Component({\n standalone: true,\n selector: 'mj-realtime-agent-banner',\n imports: [CommonModule],\n templateUrl: './realtime-agent-banner.component.html',\n styleUrl: './realtime-agent-banner.component.css'\n})\nexport class RealtimeAgentBannerComponent {\n /** Current connection / turn state — drives the orb animation + state label. */\n @Input({ required: true }) State!: RealtimeConnectionState;\n\n /**\n * COMPACT (orb/overlay) presentation: collapse the app-bar to a minimal identity + state\n * row. The duplicate orb, the redundant state pill, and the headphones / gear / expand\n * controls are dropped — the body already shows the big orb + name + state, and the lean\n * bottom dock (Mute / End / •••) owns the session actions. Minimize stays reachable so the\n * user can hide the call without ending it. Fed from the overlay's resolved `Ui.compact`.\n * Default `false` (the full console banner is unchanged).\n */\n @Input() Compact = false;\n\n /** Display name of the agent the voice session fronts (e.g. \"Sage\"). */\n @Input() AgentName = 'the agent';\n\n /**\n * Display name of the realtime model the live session runs on (e.g. \"GPT Realtime 2\").\n * Rendered as a subtle suffix in the identity line; hidden when null/empty.\n */\n @Input() ModelName: string | null = null;\n\n /** Whether developer affordances (the \"Open session\" link) are revealed (gear-gated). */\n @Input() DevMode = false;\n\n /** ID of the server-side agent session record (`MJ: AI Agent Sessions`), when known. */\n @Input() SessionID: string | null = null;\n\n /**\n * SESSION REVIEW presentation: the banner shows the past session's identity\n * (review badge, started→closed range, close-reason chip) instead of live turn-state,\n * and the action cluster swaps to Start-live + Close.\n */\n @Input() ReviewMode = false;\n\n /** When reviewing: when the past session started (`__mj_CreatedAt`). */\n @Input() ReviewStartedAt: Date | null = null;\n\n /** When reviewing: when the past session closed (null while it is still open). */\n @Input() ReviewClosedAt: Date | null = null;\n\n /** When reviewing: why the past session closed (`Explicit` | `Janitor` | `Shutdown` | `Error`), when known. */\n @Input() ReviewCloseReason: string | null = null;\n\n // ── App-bar action cluster (disclosure-gated by the overlay) ────────────────\n // STATE + WINDOW-CHROME only. Captions & End were removed (they duplicated the bottom dock's\n // controls — one home per control), and \"pure audio\" was folded into the gear's Density = Simple.\n\n /** Whether the gear (density escape hatch + dev toggle) renders (disclosure level 2+). */\n @Input() ShowGear = false;\n\n /**\n * Whether the interface-density segmented control renders inside the gear popover.\n * Default `true` (historical behaviour); a host may hide it via the overlay's\n * `[ShowDensityPicker]` input. The gear itself (and its developer-links toggle) still\n * renders when {@link ShowGear} is true even if the density picker is hidden.\n */\n @Input() ShowDensityPicker = true;\n\n /** Whether the Minimize control renders (live sessions only). */\n @Input() ShowMinimize = false;\n\n /** The user's current interface-density override (selected state in the gear popover). */\n @Input() Density: RealtimeUxDensity = 'auto';\n\n /** Emitted with the session record's ID when the dev \"Open session\" link is clicked. */\n @Output() OpenSessionRequested = new EventEmitter<string>();\n\n /** Emitted when the user toggles developer links from the gear popover. */\n @Output() DevModeToggled = new EventEmitter<boolean>();\n\n /** Emitted when the user picks an interface density in the gear popover. */\n @Output() DensityChanged = new EventEmitter<RealtimeUxDensity>();\n\n /** Emitted when the user minimizes the call view (the call stays live). */\n @Output() MinimizeRequested = new EventEmitter<void>();\n\n /** Review only: the user asked to RESUME the reviewed session as a new live call. */\n @Output() StartLiveRequested = new EventEmitter<void>();\n\n /** Review only: the user asked to close the review and return to the conversation. */\n @Output() CloseRequested = new EventEmitter<void>();\n\n /** Whether the gear popover is open (closed by any outside click). */\n public GearOpen = false;\n\n /** The density choices the gear popover offers, in display order. */\n public readonly Densities: ReadonlyArray<{ Key: RealtimeUxDensity; Label: string }> = [\n { Key: 'simple', Label: 'Simple' },\n { Key: 'standard', Label: 'Standard' },\n { Key: 'pro', Label: 'Pro' },\n { Key: 'auto', Label: 'Auto' }\n ];\n\n /** True when the dev \"Open session\" link should render (gear on + session id known). */\n public get ShowOpenSession(): boolean {\n return this.DevMode && !!this.SessionID;\n }\n\n /** Emits the open-session request for the live agent session record. */\n public OpenSession(): void {\n if (this.SessionID) {\n this.OpenSessionRequested.emit(this.SessionID);\n }\n }\n\n /** Opens/closes the gear popover (stops propagation so the outside-click close skips it). */\n public ToggleGear(event: MouseEvent): void {\n event.stopPropagation();\n this.GearOpen = !this.GearOpen;\n }\n\n /** Any outside click closes the gear popover. */\n @HostListener('document:click')\n public OnDocumentClick(): void {\n if (this.GearOpen) {\n this.GearOpen = false;\n }\n }\n\n /** Gear popover: pick an interface density (the overlay applies + persists it). */\n public SelectDensity(density: RealtimeUxDensity): void {\n this.DensityChanged.emit(density);\n }\n\n /** Gear popover: toggle developer links. */\n public ToggleDev(): void {\n this.DevMode = !this.DevMode;\n this.DevModeToggled.emit(this.DevMode);\n }\n\n /** The review banner's \"started → closed\" time-range label (empty when the start is unknown). */\n public get ReviewRangeLabel(): string {\n if (!this.ReviewStartedAt) {\n return '';\n }\n const start = this.formatStamp(this.ReviewStartedAt);\n if (!this.ReviewClosedAt) {\n return start;\n }\n return `${start} → ${this.formatStamp(this.ReviewClosedAt, this.ReviewStartedAt)}`;\n }\n\n /** Human label for the close-reason chip (empty hides the chip). */\n public get ReviewCloseReasonLabel(): string {\n switch (this.ReviewCloseReason) {\n case 'Explicit': return 'Ended by user';\n case 'Janitor': return 'Closed by janitor';\n case 'Shutdown': return 'Closed at shutdown';\n case 'Error': return 'Ended with error';\n default: return '';\n }\n }\n\n /** Compact date+time stamp; same-day end stamps drop the redundant date part. */\n private formatStamp(date: Date, sameDayAs?: Date | null): string {\n const time = date.toLocaleTimeString([], { hour: 'numeric', minute: '2-digit' }).toLowerCase();\n if (sameDayAs && date.toDateString() === sameDayAs.toDateString()) {\n return time;\n }\n return `${date.toLocaleDateString([], { month: 'short', day: 'numeric' })}, ${time}`;\n }\n\n /** Maps the realtime state to the orb's `data-state` (the orb only models active turn-states). */\n public OrbState(state: RealtimeConnectionState): 'speaking' | 'listening' | 'thinking' {\n switch (state) {\n case 'speaking': return 'speaking';\n case 'thinking': return 'thinking';\n default: return 'listening';\n }\n }\n\n /** Human-readable state label, agent-aware where it reads better. */\n public StateLabel(state: RealtimeConnectionState): string {\n switch (state) {\n case 'connecting': return 'Connecting…';\n case 'listening': return 'Listening';\n case 'speaking': return `${this.AgentName} is speaking…`;\n case 'thinking': return 'Working on it…';\n case 'error': return 'Connection error';\n case 'closed': return 'Call ended';\n default: return '';\n }\n }\n\n /** True while the state pill should show a spinner instead of the waveform. */\n public IsBusy(state: RealtimeConnectionState): boolean {\n return state === 'connecting' || state === 'thinking';\n }\n}\n","<div class=\"banner\" [class.banner--review]=\"ReviewMode\" [class.banner--compact]=\"Compact && !ReviewMode\">\n @if (ReviewMode) {\n <!-- SESSION REVIEW: static orb · name · review badge · started→closed · 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 if (Compact) {\n <!-- COMPACT (Calm Orb · overlay): a tiny identity + state row only. No duplicate orb,\n no state pill, no headphones / gear / expand — the body shows the big orb + name +\n state, and the lean dock owns the actions. Minimize stays reachable here. -->\n <div class=\"banner__id banner__id--compact\">\n <span class=\"banner__avatar\" aria-hidden=\"true\">{{ AgentName.charAt(0) }}</span>\n <span class=\"banner__name banner__name--compact\">{{ AgentName }}</span>\n <span class=\"banner__state-chip\">\n @if (IsBusy(State)) {\n <i class=\"fa-solid fa-spinner fa-spin\" aria-hidden=\"true\"></i>\n } @else {\n <span class=\"banner__state-dot\" [attr.data-state]=\"OrbState(State)\" aria-hidden=\"true\"></span>\n }\n <span class=\"banner__state-chip-label\">{{ StateLabel(State) }}</span>\n </span>\n </div>\n\n @if (ShowMinimize) {\n <button type=\"button\" class=\"iconb banner__minimize--compact\" (click)=\"MinimizeRequested.emit()\"\n title=\"Hide the call view — the call stays live\"\n aria-label=\"Minimize the call view\">\n <i class=\"fa-solid fa-minus\" aria-hidden=\"true\"></i>\n </button>\n }\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\">· {{ 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: STATE + WINDOW-CHROME only. Call actions\n (Mute / Captions / Details / Type / End) live in the bottom dock — the single home for\n each control. Captions & End were removed from here (they were exact duplicates of the\n dock's), and the standalone \"pure audio\" headphones was folded into the gear's Density =\n Simple. What remains up here is non-duplicated chrome: the gear (density + dev links) and\n Minimize. -->\n <div class=\"bar-actions\">\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 — 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 </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 @if (ShowDensityPicker) {\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 }\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"]}
@@ -21,6 +21,8 @@ export interface RealtimeAgentPick {
21
21
  PreferredVoice: string | null;
22
22
  /** Explicit co-agent id (`MJ: AI Agents.ID`, Realtime type), or `null` for the server's resolution chain. */
23
23
  CoAgentId: string | null;
24
+ /** Whether the user consented to recording this call (mic + agent audio). */
25
+ RecordingConsent: boolean;
24
26
  }
25
27
  /**
26
28
  * Compact anchored popover that lets the user choose WHICH agent a realtime
@@ -91,6 +93,12 @@ export declare class RealtimeAgentPickerComponent extends BaseAngularComponent i
91
93
  get SelectedModelVoices(): RealtimeVoiceOption[];
92
94
  /** The explicitly chosen co-agent id, or `null` for "Auto (recommended)" (the server's chain). */
93
95
  SelectedCoAgentId: string | null;
96
+ /**
97
+ * Whether the user has opted to record this call (mic + agent audio). Loaded from the
98
+ * per-user persisted preference (`mj.realtimeVoice.recordingConsent.v1`) on init and
99
+ * persisted cross-device on change. Defaults to off.
100
+ */
101
+ RecordingConsent: boolean;
94
102
  /**
95
103
  * Whether the current user holds the `Realtime: Advanced Session Controls`
96
104
  * authorization. Gates the voice-model selector (and any future config-override
@@ -109,6 +117,10 @@ export declare class RealtimeAgentPickerComponent extends BaseAngularComponent i
109
117
  /** True while the agent list is constrained to the selected co-agent's paired targets. */
110
118
  get IsConstrainedByPairings(): boolean;
111
119
  ngOnInit(): void;
120
+ /** Reads the per-user recording-consent preference (defensive: any failure → off). */
121
+ private readPersistedRecordingConsent;
122
+ /** Records + persists (cross-device, debounced) the user's recording-consent choice. */
123
+ OnRecordingConsentChange(checked: boolean): void;
112
124
  /**
113
125
  * Loads the "Voice model" options: active models whose type is `Realtime`, filtered from
114
126
  * {@link AIEngineBase}'s already-cached `Models` (provider-scoped engine instance, lazy
@@ -1 +1 @@
1
- {"version":3,"file":"realtime-agent-picker.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/realtime/realtime-agent-picker.component.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"realtime-agent-picker.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/realtime/realtime-agent-picker.component.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,7 @@ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, Even
2
2
  import { MJButtonDirective } from '@memberjunction/ng-ui-components';
3
3
  import { UUIDsEqual } from '@memberjunction/global';
4
4
  import { AIEngineBase } from '@memberjunction/ai-engine-base';
5
+ import { UserInfoEngine } from '@memberjunction/core-entities';
5
6
  import { BaseAngularComponent } from '@memberjunction/ng-base-types';
6
7
  import { REALTIME_ADVANCED_SESSION_CONTROLS, UserHoldsAuthorization } from '../../services/user-authorization';
7
8
  import { BuildRealtimeModelOptions, ConstrainTargetsToPairings, DefaultPairedTargetId, LoadCoAgentPairings, } from '../../services/realtime-pairing';
@@ -10,7 +11,7 @@ import * as i0 from "@angular/core";
10
11
  const _c0 = ["searchInput"];
11
12
  const _forTrack0 = ($index, $item) => $item.ID;
12
13
  function RealtimeAgentPickerComponent_Conditional_5_For_10_Template(rf, ctx) { if (rf & 1) {
13
- i0.ɵɵelementStart(0, "option", 20);
14
+ i0.ɵɵelementStart(0, "option", 27);
14
15
  i0.ɵɵtext(1);
15
16
  i0.ɵɵelementEnd();
16
17
  } if (rf & 2) {
@@ -21,17 +22,17 @@ function RealtimeAgentPickerComponent_Conditional_5_For_10_Template(rf, ctx) { i
21
22
  } }
22
23
  function RealtimeAgentPickerComponent_Conditional_5_Template(rf, ctx) { if (rf & 1) {
23
24
  const _r2 = i0.ɵɵgetCurrentView();
24
- i0.ɵɵelementStart(0, "div", 7)(1, "label", 16);
25
- i0.ɵɵelement(2, "i", 17);
25
+ i0.ɵɵelementStart(0, "div", 7)(1, "label", 23);
26
+ i0.ɵɵelement(2, "i", 24);
26
27
  i0.ɵɵelementStart(3, "span");
27
28
  i0.ɵɵtext(4, "Co-agent");
28
29
  i0.ɵɵelementEnd()();
29
- i0.ɵɵelementStart(5, "select", 18, 1);
30
+ i0.ɵɵelementStart(5, "select", 25, 1);
30
31
  i0.ɵɵlistener("change", function RealtimeAgentPickerComponent_Conditional_5_Template_select_change_5_listener() { i0.ɵɵrestoreView(_r2); const coAgentSelect_r3 = i0.ɵɵreference(6); const ctx_r3 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r3.OnCoAgentChange(coAgentSelect_r3.value)); });
31
- i0.ɵɵelementStart(7, "option", 19);
32
+ i0.ɵɵelementStart(7, "option", 26);
32
33
  i0.ɵɵtext(8, "Auto (recommended)");
33
34
  i0.ɵɵelementEnd();
34
- i0.ɵɵrepeaterCreate(9, RealtimeAgentPickerComponent_Conditional_5_For_10_Template, 2, 2, "option", 20, _forTrack0);
35
+ i0.ɵɵrepeaterCreate(9, RealtimeAgentPickerComponent_Conditional_5_For_10_Template, 2, 2, "option", 27, _forTrack0);
35
36
  i0.ɵɵelementEnd()();
36
37
  } if (rf & 2) {
37
38
  const ctx_r3 = i0.ɵɵnextContext();
@@ -50,19 +51,19 @@ function RealtimeAgentPickerComponent_Conditional_11_Template(rf, ctx) { if (rf
50
51
  i0.ɵɵtextInterpolate(ctx_r3.IsConstrainedByPairings ? "No paired agents available" : "No matching agents");
51
52
  } }
52
53
  function RealtimeAgentPickerComponent_Conditional_12_For_1_Conditional_4_Template(rf, ctx) { if (rf & 1) {
53
- i0.ɵɵelementStart(0, "span", 24);
54
+ i0.ɵɵelementStart(0, "span", 31);
54
55
  i0.ɵɵtext(1, "default");
55
56
  i0.ɵɵelementEnd();
56
57
  } }
57
58
  function RealtimeAgentPickerComponent_Conditional_12_For_1_Template(rf, ctx) { if (rf & 1) {
58
59
  const _r7 = i0.ɵɵgetCurrentView();
59
- i0.ɵɵelementStart(0, "button", 22);
60
+ i0.ɵɵelementStart(0, "button", 29);
60
61
  i0.ɵɵlistener("click", function RealtimeAgentPickerComponent_Conditional_12_For_1_Template_button_click_0_listener() { const agent_r8 = i0.ɵɵrestoreView(_r7).$implicit; const ctx_r3 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r3.Select(agent_r8)); })("dblclick", function RealtimeAgentPickerComponent_Conditional_12_For_1_Template_button_dblclick_0_listener() { const agent_r8 = i0.ɵɵrestoreView(_r7).$implicit; const ctx_r3 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r3.Pick(agent_r8)); });
61
62
  i0.ɵɵelement(1, "i");
62
- i0.ɵɵelementStart(2, "span", 23);
63
+ i0.ɵɵelementStart(2, "span", 30);
63
64
  i0.ɵɵtext(3);
64
65
  i0.ɵɵelementEnd();
65
- i0.ɵɵconditionalCreate(4, RealtimeAgentPickerComponent_Conditional_12_For_1_Conditional_4_Template, 2, 0, "span", 24);
66
+ i0.ɵɵconditionalCreate(4, RealtimeAgentPickerComponent_Conditional_12_For_1_Conditional_4_Template, 2, 0, "span", 31);
66
67
  i0.ɵɵelementEnd();
67
68
  } if (rf & 2) {
68
69
  const agent_r8 = ctx.$implicit;
@@ -77,13 +78,13 @@ function RealtimeAgentPickerComponent_Conditional_12_For_1_Template(rf, ctx) { i
77
78
  i0.ɵɵconditional(ctx_r3.IsDefaultChoice(agent_r8) ? 4 : -1);
78
79
  } }
79
80
  function RealtimeAgentPickerComponent_Conditional_12_Template(rf, ctx) { if (rf & 1) {
80
- i0.ɵɵrepeaterCreate(0, RealtimeAgentPickerComponent_Conditional_12_For_1_Template, 5, 7, "button", 21, _forTrack0);
81
+ i0.ɵɵrepeaterCreate(0, RealtimeAgentPickerComponent_Conditional_12_For_1_Template, 5, 7, "button", 28, _forTrack0);
81
82
  } if (rf & 2) {
82
83
  const ctx_r3 = i0.ɵɵnextContext();
83
84
  i0.ɵɵrepeater(ctx_r3.FilteredAgents);
84
85
  } }
85
86
  function RealtimeAgentPickerComponent_Conditional_13_For_10_Template(rf, ctx) { if (rf & 1) {
86
- i0.ɵɵelementStart(0, "option", 20);
87
+ i0.ɵɵelementStart(0, "option", 27);
87
88
  i0.ɵɵtext(1);
88
89
  i0.ɵɵelementEnd();
89
90
  } if (rf & 2) {
@@ -93,7 +94,7 @@ function RealtimeAgentPickerComponent_Conditional_13_For_10_Template(rf, ctx) {
93
94
  i0.ɵɵtextInterpolate(model_r11.Name);
94
95
  } }
95
96
  function RealtimeAgentPickerComponent_Conditional_13_Conditional_11_For_10_Template(rf, ctx) { if (rf & 1) {
96
- i0.ɵɵelementStart(0, "option", 20);
97
+ i0.ɵɵelementStart(0, "option", 27);
97
98
  i0.ɵɵtext(1);
98
99
  i0.ɵɵelementEnd();
99
100
  } if (rf & 2) {
@@ -104,17 +105,17 @@ function RealtimeAgentPickerComponent_Conditional_13_Conditional_11_For_10_Templ
104
105
  } }
105
106
  function RealtimeAgentPickerComponent_Conditional_13_Conditional_11_Template(rf, ctx) { if (rf & 1) {
106
107
  const _r12 = i0.ɵɵgetCurrentView();
107
- i0.ɵɵelementStart(0, "div", 25)(1, "label", 29);
108
- i0.ɵɵelement(2, "i", 30);
108
+ i0.ɵɵelementStart(0, "div", 32)(1, "label", 36);
109
+ i0.ɵɵelement(2, "i", 37);
109
110
  i0.ɵɵelementStart(3, "span");
110
111
  i0.ɵɵtext(4, "Voice");
111
112
  i0.ɵɵelementEnd()();
112
- i0.ɵɵelementStart(5, "select", 31, 3);
113
+ i0.ɵɵelementStart(5, "select", 38, 3);
113
114
  i0.ɵɵlistener("change", function RealtimeAgentPickerComponent_Conditional_13_Conditional_11_Template_select_change_5_listener() { i0.ɵɵrestoreView(_r12); const voiceSelect_r13 = i0.ɵɵreference(6); const ctx_r3 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r3.OnVoiceChange(voiceSelect_r13.value)); });
114
- i0.ɵɵelementStart(7, "option", 19);
115
+ i0.ɵɵelementStart(7, "option", 26);
115
116
  i0.ɵɵtext(8, "Default");
116
117
  i0.ɵɵelementEnd();
117
- i0.ɵɵrepeaterCreate(9, RealtimeAgentPickerComponent_Conditional_13_Conditional_11_For_10_Template, 2, 2, "option", 20, _forTrack0);
118
+ i0.ɵɵrepeaterCreate(9, RealtimeAgentPickerComponent_Conditional_13_Conditional_11_For_10_Template, 2, 2, "option", 27, _forTrack0);
118
119
  i0.ɵɵelementEnd()();
119
120
  } if (rf & 2) {
120
121
  const ctx_r3 = i0.ɵɵnextContext(2);
@@ -125,19 +126,19 @@ function RealtimeAgentPickerComponent_Conditional_13_Conditional_11_Template(rf,
125
126
  } }
126
127
  function RealtimeAgentPickerComponent_Conditional_13_Template(rf, ctx) { if (rf & 1) {
127
128
  const _r9 = i0.ɵɵgetCurrentView();
128
- i0.ɵɵelementStart(0, "div", 25)(1, "label", 26);
129
- i0.ɵɵelement(2, "i", 27);
129
+ i0.ɵɵelementStart(0, "div", 32)(1, "label", 33);
130
+ i0.ɵɵelement(2, "i", 34);
130
131
  i0.ɵɵelementStart(3, "span");
131
132
  i0.ɵɵtext(4, "Voice model");
132
133
  i0.ɵɵelementEnd()();
133
- i0.ɵɵelementStart(5, "select", 28, 2);
134
+ i0.ɵɵelementStart(5, "select", 35, 2);
134
135
  i0.ɵɵlistener("change", function RealtimeAgentPickerComponent_Conditional_13_Template_select_change_5_listener() { i0.ɵɵrestoreView(_r9); const modelSelect_r10 = i0.ɵɵreference(6); const ctx_r3 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r3.OnModelChange(modelSelect_r10.value)); });
135
- i0.ɵɵelementStart(7, "option", 19);
136
+ i0.ɵɵelementStart(7, "option", 26);
136
137
  i0.ɵɵtext(8, "Auto (recommended)");
137
138
  i0.ɵɵelementEnd();
138
- i0.ɵɵrepeaterCreate(9, RealtimeAgentPickerComponent_Conditional_13_For_10_Template, 2, 2, "option", 20, _forTrack0);
139
+ i0.ɵɵrepeaterCreate(9, RealtimeAgentPickerComponent_Conditional_13_For_10_Template, 2, 2, "option", 27, _forTrack0);
139
140
  i0.ɵɵelementEnd()();
140
- i0.ɵɵconditionalCreate(11, RealtimeAgentPickerComponent_Conditional_13_Conditional_11_Template, 11, 1, "div", 25);
141
+ i0.ɵɵconditionalCreate(11, RealtimeAgentPickerComponent_Conditional_13_Conditional_11_Template, 11, 1, "div", 32);
141
142
  } if (rf & 2) {
142
143
  const ctx_r3 = i0.ɵɵnextContext();
143
144
  i0.ɵɵadvance(5);
@@ -147,6 +148,8 @@ function RealtimeAgentPickerComponent_Conditional_13_Template(rf, ctx) { if (rf
147
148
  i0.ɵɵadvance(2);
148
149
  i0.ɵɵconditional(ctx_r3.SelectedModelVoices.length ? 11 : -1);
149
150
  } }
151
+ /** `MJ: User Settings` key for the per-user "record this call" consent toggle (string `'true'`/`'false'`). */
152
+ const RECORDING_CONSENT_KEY = 'mj.realtimeVoice.recordingConsent.v1';
150
153
  /**
151
154
  * Compact anchored popover that lets the user choose WHICH agent a realtime
152
155
  * voice call should front — shown by {@link MessageInputComponent} when the
@@ -218,6 +221,12 @@ export class RealtimeAgentPickerComponent extends BaseAngularComponent {
218
221
  }
219
222
  /** The explicitly chosen co-agent id, or `null` for "Auto (recommended)" (the server's chain). */
220
223
  SelectedCoAgentId = null;
224
+ /**
225
+ * Whether the user has opted to record this call (mic + agent audio). Loaded from the
226
+ * per-user persisted preference (`mj.realtimeVoice.recordingConsent.v1`) on init and
227
+ * persisted cross-device on change. Defaults to off.
228
+ */
229
+ RecordingConsent = false;
221
230
  /**
222
231
  * Whether the current user holds the `Realtime: Advanced Session Controls`
223
232
  * authorization. Gates the voice-model selector (and any future config-override
@@ -254,6 +263,27 @@ export class RealtimeAgentPickerComponent extends BaseAngularComponent {
254
263
  this.SelectedCoAgentId = this.DefaultCoAgentId;
255
264
  void this.reloadPairings();
256
265
  }
266
+ this.RecordingConsent = this.readPersistedRecordingConsent();
267
+ }
268
+ /** Reads the per-user recording-consent preference (defensive: any failure → off). */
269
+ readPersistedRecordingConsent() {
270
+ try {
271
+ return UserInfoEngine.Instance.GetSetting(RECORDING_CONSENT_KEY) === 'true';
272
+ }
273
+ catch {
274
+ return false;
275
+ }
276
+ }
277
+ /** Records + persists (cross-device, debounced) the user's recording-consent choice. */
278
+ OnRecordingConsentChange(checked) {
279
+ this.RecordingConsent = checked;
280
+ try {
281
+ UserInfoEngine.Instance.SetSettingDebounced(RECORDING_CONSENT_KEY, String(checked));
282
+ }
283
+ catch (error) {
284
+ console.warn('[RealtimeAgentPicker] Failed to persist recording consent:', error);
285
+ }
286
+ this.cdr.markForCheck();
257
287
  }
258
288
  /**
259
289
  * Loads the "Voice model" options: active models whose type is `Realtime`, filtered from
@@ -444,7 +474,8 @@ export class RealtimeAgentPickerComponent extends BaseAngularComponent {
444
474
  Agent: agent,
445
475
  PreferredModelId: this.CanOverrideSessionConfig ? this.SelectedModelId : null,
446
476
  PreferredVoice: this.CanOverrideSessionConfig ? this.SelectedVoiceId : null,
447
- CoAgentId: this.SelectedCoAgentId
477
+ CoAgentId: this.SelectedCoAgentId,
478
+ RecordingConsent: this.RecordingConsent
448
479
  };
449
480
  }
450
481
  isDefault(agent) {
@@ -461,7 +492,7 @@ export class RealtimeAgentPickerComponent extends BaseAngularComponent {
461
492
  i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.searchInput = _t.first);
462
493
  } }, hostBindings: function RealtimeAgentPickerComponent_HostBindings(rf, ctx) { if (rf & 1) {
463
494
  i0.ɵɵlistener("click", function RealtimeAgentPickerComponent_click_HostBindingHandler($event) { return ctx.OnDocumentClick($event); }, i0.ɵɵresolveDocument)("keydown.escape", function RealtimeAgentPickerComponent_keydown_escape_HostBindingHandler() { return ctx.OnEscape(); }, i0.ɵɵresolveDocument);
464
- } }, inputs: { Agents: "Agents", DefaultAgentId: "DefaultAgentId", CoAgents: "CoAgents", DefaultCoAgentId: "DefaultCoAgentId" }, outputs: { AgentPicked: "AgentPicked", Cancelled: "Cancelled" }, features: [i0.ɵɵInheritDefinitionFeature], decls: 20, vars: 5, consts: [["searchInput", ""], ["coAgentSelect", ""], ["modelSelect", ""], ["voiceSelect", ""], [1, "mj-voice-picker", 3, "click"], [1, "mj-voice-picker__header"], [1, "fa-solid", "fa-phone"], [1, "mj-voice-picker__select-row"], [1, "mj-voice-picker__search"], [1, "fa-solid", "fa-magnifying-glass"], ["type", "text", "placeholder", "Search agents", 3, "input", "keydown.enter", "keydown.arrowdown", "keydown.arrowup", "value"], [1, "mj-voice-picker__list"], [1, "mj-voice-picker__empty"], [1, "mj-voice-picker__footer"], ["mjButton", "", "variant", "primary", "size", "sm", 3, "click", "disabled"], ["mjButton", "", "variant", "outline", "size", "sm", 3, "click"], ["for", "mjVoiceCoAgentSelect", 1, "mj-voice-picker__select-label"], [1, "fa-solid", "fa-headset"], ["id", "mjVoiceCoAgentSelect", 1, "mj-voice-picker__select", 3, "change", "value"], ["value", ""], [3, "value"], ["type", "button", 1, "mj-voice-picker__item", 3, "mj-voice-picker__item--selected", "title"], ["type", "button", 1, "mj-voice-picker__item", 3, "click", "dblclick", "title"], [1, "mj-voice-picker__item-name"], [1, "mj-voice-picker__default-badge"], [1, "mj-voice-picker__select-row", "mj-voice-picker__select-row--model"], ["for", "mjVoiceModelSelect", 1, "mj-voice-picker__select-label"], [1, "fa-solid", "fa-microchip"], ["id", "mjVoiceModelSelect", 1, "mj-voice-picker__select", 3, "change", "value"], ["for", "mjVoiceVoiceSelect", 1, "mj-voice-picker__select-label"], [1, "fa-solid", "fa-waveform-lines"], ["id", "mjVoiceVoiceSelect", 1, "mj-voice-picker__select", 3, "change", "value"]], template: function RealtimeAgentPickerComponent_Template(rf, ctx) { if (rf & 1) {
495
+ } }, inputs: { Agents: "Agents", DefaultAgentId: "DefaultAgentId", CoAgents: "CoAgents", DefaultCoAgentId: "DefaultCoAgentId" }, outputs: { AgentPicked: "AgentPicked", Cancelled: "Cancelled" }, features: [i0.ɵɵInheritDefinitionFeature], decls: 30, vars: 6, consts: [["searchInput", ""], ["coAgentSelect", ""], ["modelSelect", ""], ["voiceSelect", ""], [1, "mj-voice-picker", 3, "click"], [1, "mj-voice-picker__header"], [1, "fa-solid", "fa-phone"], [1, "mj-voice-picker__select-row"], [1, "mj-voice-picker__search"], [1, "fa-solid", "fa-magnifying-glass"], ["type", "text", "placeholder", "Search agents", 3, "input", "keydown.enter", "keydown.arrowdown", "keydown.arrowup", "value"], [1, "mj-voice-picker__list"], [1, "mj-voice-picker__empty"], [1, "mj-voice-picker__record-row"], [1, "mj-voice-picker__record-label"], [1, "fa-solid", "fa-microphone"], [1, "mj-voice-picker__record-copy"], [1, "mj-voice-picker__switch"], ["type", "checkbox", "aria-label", "Record this call (audio stored securely)", 3, "change", "checked"], [1, "mj-voice-picker__switch-track"], [1, "mj-voice-picker__footer"], ["mjButton", "", "variant", "primary", "size", "sm", 3, "click", "disabled"], ["mjButton", "", "variant", "outline", "size", "sm", 3, "click"], ["for", "mjRealtimeCoAgentSelect", 1, "mj-voice-picker__select-label"], [1, "fa-solid", "fa-headset"], ["id", "mjRealtimeCoAgentSelect", 1, "mj-voice-picker__select", 3, "change", "value"], ["value", ""], [3, "value"], ["type", "button", 1, "mj-voice-picker__item", 3, "mj-voice-picker__item--selected", "title"], ["type", "button", 1, "mj-voice-picker__item", 3, "click", "dblclick", "title"], [1, "mj-voice-picker__item-name"], [1, "mj-voice-picker__default-badge"], [1, "mj-voice-picker__select-row", "mj-voice-picker__select-row--model"], ["for", "mjRealtimeModelSelect", 1, "mj-voice-picker__select-label"], [1, "fa-solid", "fa-microchip"], ["id", "mjRealtimeModelSelect", 1, "mj-voice-picker__select", 3, "change", "value"], ["for", "mjRealtimeVoiceSelect", 1, "mj-voice-picker__select-label"], [1, "fa-solid", "fa-waveform-lines"], ["id", "mjRealtimeVoiceSelect", 1, "mj-voice-picker__select", 3, "change", "value"]], template: function RealtimeAgentPickerComponent_Template(rf, ctx) { if (rf & 1) {
465
496
  const _r1 = i0.ɵɵgetCurrentView();
466
497
  i0.ɵɵelementStart(0, "div", 4);
467
498
  i0.ɵɵlistener("click", function RealtimeAgentPickerComponent_Template_div_click_0_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView($event.stopPropagation()); });
@@ -480,14 +511,26 @@ export class RealtimeAgentPickerComponent extends BaseAngularComponent {
480
511
  i0.ɵɵconditionalCreate(11, RealtimeAgentPickerComponent_Conditional_11_Template, 2, 1, "div", 12)(12, RealtimeAgentPickerComponent_Conditional_12_Template, 2, 0);
481
512
  i0.ɵɵelementEnd();
482
513
  i0.ɵɵconditionalCreate(13, RealtimeAgentPickerComponent_Conditional_13_Template, 12, 2);
483
- i0.ɵɵelementStart(14, "div", 13)(15, "button", 14);
484
- i0.ɵɵlistener("click", function RealtimeAgentPickerComponent_Template_button_click_15_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.StartCall()); });
485
- i0.ɵɵelement(16, "i", 6);
486
- i0.ɵɵtext(17, " Start ");
514
+ i0.ɵɵelementStart(14, "div", 13)(15, "span", 14);
515
+ i0.ɵɵelement(16, "i", 15);
516
+ i0.ɵɵelementStart(17, "span", 16);
517
+ i0.ɵɵtext(18, " Record this call ");
518
+ i0.ɵɵelementStart(19, "small");
519
+ i0.ɵɵtext(20, "Audio stored securely");
520
+ i0.ɵɵelementEnd()()();
521
+ i0.ɵɵelementStart(21, "label", 17)(22, "input", 18);
522
+ i0.ɵɵlistener("change", function RealtimeAgentPickerComponent_Template_input_change_22_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.OnRecordingConsentChange($event.target.checked)); });
487
523
  i0.ɵɵelementEnd();
488
- i0.ɵɵelementStart(18, "button", 15);
489
- i0.ɵɵlistener("click", function RealtimeAgentPickerComponent_Template_button_click_18_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.Cancel()); });
490
- i0.ɵɵtext(19, "Cancel");
524
+ i0.ɵɵelement(23, "span", 19);
525
+ i0.ɵɵelementEnd()();
526
+ i0.ɵɵelementStart(24, "div", 20)(25, "button", 21);
527
+ i0.ɵɵlistener("click", function RealtimeAgentPickerComponent_Template_button_click_25_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.StartCall()); });
528
+ i0.ɵɵelement(26, "i", 6);
529
+ i0.ɵɵtext(27, " Start ");
530
+ i0.ɵɵelementEnd();
531
+ i0.ɵɵelementStart(28, "button", 22);
532
+ i0.ɵɵlistener("click", function RealtimeAgentPickerComponent_Template_button_click_28_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.Cancel()); });
533
+ i0.ɵɵtext(29, "Cancel");
491
534
  i0.ɵɵelementEnd()()();
492
535
  } if (rf & 2) {
493
536
  i0.ɵɵadvance(5);
@@ -498,9 +541,11 @@ export class RealtimeAgentPickerComponent extends BaseAngularComponent {
498
541
  i0.ɵɵconditional(ctx.FilteredAgents.length === 0 ? 11 : 12);
499
542
  i0.ɵɵadvance(2);
500
543
  i0.ɵɵconditional(ctx.CanOverrideSessionConfig && ctx.Models.length > 0 ? 13 : -1);
501
- i0.ɵɵadvance(2);
544
+ i0.ɵɵadvance(9);
545
+ i0.ɵɵproperty("checked", ctx.RecordingConsent);
546
+ i0.ɵɵadvance(3);
502
547
  i0.ɵɵproperty("disabled", !ctx.SelectedAgent);
503
- } }, dependencies: [MJButtonDirective], styles: ["[_nghost-%COMP%] {\n position: absolute;\n bottom: calc(100% + 8px);\n right: 8px;\n z-index: 60;\n }\n .mj-voice-picker[_ngcontent-%COMP%] {\n width: 300px;\n display: flex; flex-direction: column;\n background: var(--mj-bg-surface-elevated);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n box-shadow: 0 8px 24px rgba(0, 0, 0, 0.16);\n overflow: hidden;\n }\n .mj-voice-picker__header[_ngcontent-%COMP%] {\n display: flex; align-items: center; gap: 8px;\n padding: 10px 12px 8px;\n font-size: 13px; font-weight: 600;\n color: var(--mj-text-primary);\n }\n .mj-voice-picker__header[_ngcontent-%COMP%] i[_ngcontent-%COMP%] { color: var(--mj-brand-primary); }\n .mj-voice-picker__search[_ngcontent-%COMP%] {\n display: flex; align-items: center; gap: 8px;\n margin: 0 12px 8px;\n padding: 0 10px;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 6px;\n }\n .mj-voice-picker__search[_ngcontent-%COMP%] i[_ngcontent-%COMP%] { font-size: 12px; color: var(--mj-text-muted); }\n .mj-voice-picker__search[_ngcontent-%COMP%] input[_ngcontent-%COMP%] {\n flex: 1; min-width: 0;\n padding: 7px 0;\n background: transparent; border: none; outline: none;\n font-size: 13px; color: var(--mj-text-primary);\n }\n .mj-voice-picker__search[_ngcontent-%COMP%] input[_ngcontent-%COMP%]::placeholder { color: var(--mj-text-disabled); }\n .mj-voice-picker__search[_ngcontent-%COMP%]:focus-within { border-color: var(--mj-border-focus); }\n .mj-voice-picker__list[_ngcontent-%COMP%] {\n max-height: 220px; overflow-y: auto;\n border-top: 1px solid var(--mj-border-subtle);\n border-bottom: 1px solid var(--mj-border-subtle);\n padding: 4px 0;\n }\n .mj-voice-picker__item[_ngcontent-%COMP%] {\n display: flex; align-items: center; gap: 8px; width: 100%;\n padding: 7px 12px;\n background: transparent; border: none; cursor: pointer;\n color: var(--mj-text-primary); font-size: 13px; text-align: left;\n }\n .mj-voice-picker__item[_ngcontent-%COMP%] i[_ngcontent-%COMP%] { width: 16px; text-align: center; color: var(--mj-text-secondary); }\n .mj-voice-picker__item[_ngcontent-%COMP%]:hover { background: var(--mj-bg-surface-hover); }\n .mj-voice-picker__item--selected[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n }\n .mj-voice-picker__item--selected[_ngcontent-%COMP%] i[_ngcontent-%COMP%] { color: var(--mj-brand-primary); }\n .mj-voice-picker__item-name[_ngcontent-%COMP%] {\n flex: 1; min-width: 0;\n overflow: hidden; text-overflow: ellipsis; white-space: nowrap;\n }\n .mj-voice-picker__default-badge[_ngcontent-%COMP%] {\n flex-shrink: 0;\n padding: 1px 6px;\n border-radius: 999px;\n font-size: 10px; text-transform: uppercase; letter-spacing: 0.04em;\n color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, transparent);\n }\n .mj-voice-picker__empty[_ngcontent-%COMP%] {\n padding: 12px; font-size: 12px; color: var(--mj-text-muted); text-align: center;\n }\n .mj-voice-picker__select-row[_ngcontent-%COMP%] {\n display: flex; align-items: center; gap: 8px;\n padding: 0 12px 8px;\n }\n .mj-voice-picker__select-row--model[_ngcontent-%COMP%] {\n padding: 8px 12px 0;\n }\n .mj-voice-picker__select-label[_ngcontent-%COMP%] {\n display: flex; align-items: center; gap: 6px;\n flex-shrink: 0;\n font-size: 12px; color: var(--mj-text-secondary);\n }\n .mj-voice-picker__select-label[_ngcontent-%COMP%] i[_ngcontent-%COMP%] { font-size: 11px; color: var(--mj-text-muted); }\n .mj-voice-picker__select[_ngcontent-%COMP%] {\n flex: 1; min-width: 0;\n padding: 5px 8px;\n font-size: 12px;\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 6px;\n outline: none;\n }\n .mj-voice-picker__select[_ngcontent-%COMP%]:focus { border-color: var(--mj-border-focus); }\n .mj-voice-picker__footer[_ngcontent-%COMP%] {\n display: flex; align-items: center; gap: 8px;\n padding: 10px 12px;\n }"], changeDetection: 0 });
548
+ } }, dependencies: [MJButtonDirective], styles: ["[_nghost-%COMP%] {\n \n\n\n\n\n\n display: block;\n max-height: min(440px, calc(100vh - 24px));\n }\n .mj-voice-picker[_ngcontent-%COMP%] {\n width: 300px;\n max-width: calc(100vw - 24px);\n display: flex; flex-direction: column;\n \n\n\n max-height: min(440px, calc(100vh - 120px));\n background: var(--mj-bg-surface-elevated);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n box-shadow: 0 8px 24px rgba(0, 0, 0, 0.16);\n overflow: hidden;\n }\n .mj-voice-picker__header[_ngcontent-%COMP%] {\n display: flex; align-items: center; gap: 8px;\n padding: 10px 12px 8px;\n font-size: 13px; font-weight: 600;\n color: var(--mj-text-primary);\n }\n .mj-voice-picker__header[_ngcontent-%COMP%] i[_ngcontent-%COMP%] { color: var(--mj-brand-primary); }\n .mj-voice-picker__search[_ngcontent-%COMP%] {\n display: flex; align-items: center; gap: 8px;\n margin: 0 12px 8px;\n padding: 0 10px;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 6px;\n }\n .mj-voice-picker__search[_ngcontent-%COMP%] i[_ngcontent-%COMP%] { font-size: 12px; color: var(--mj-text-muted); }\n .mj-voice-picker__search[_ngcontent-%COMP%] input[_ngcontent-%COMP%] {\n flex: 1; min-width: 0;\n padding: 7px 0;\n background: transparent; border: none; outline: none;\n font-size: 13px; color: var(--mj-text-primary);\n }\n .mj-voice-picker__search[_ngcontent-%COMP%] input[_ngcontent-%COMP%]::placeholder { color: var(--mj-text-disabled); }\n .mj-voice-picker__search[_ngcontent-%COMP%]:focus-within { border-color: var(--mj-border-focus); }\n .mj-voice-picker__list[_ngcontent-%COMP%] {\n \n\n\n\n\n flex: 1 1 auto;\n min-height: 0;\n max-height: 220px; overflow-y: auto;\n border-top: 1px solid var(--mj-border-subtle);\n border-bottom: 1px solid var(--mj-border-subtle);\n padding: 4px 0;\n }\n \n\n .mj-voice-picker__header[_ngcontent-%COMP%], \n .mj-voice-picker__search[_ngcontent-%COMP%], \n .mj-voice-picker__select-row[_ngcontent-%COMP%], \n .mj-voice-picker__record-row[_ngcontent-%COMP%], \n .mj-voice-picker__footer[_ngcontent-%COMP%] { flex-shrink: 0; }\n .mj-voice-picker__item[_ngcontent-%COMP%] {\n display: flex; align-items: center; gap: 8px; width: 100%;\n padding: 7px 12px;\n background: transparent; border: none; cursor: pointer;\n color: var(--mj-text-primary); font-size: 13px; text-align: left;\n }\n .mj-voice-picker__item[_ngcontent-%COMP%] i[_ngcontent-%COMP%] { width: 16px; text-align: center; color: var(--mj-text-secondary); }\n .mj-voice-picker__item[_ngcontent-%COMP%]:hover { background: var(--mj-bg-surface-hover); }\n .mj-voice-picker__item--selected[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n }\n .mj-voice-picker__item--selected[_ngcontent-%COMP%] i[_ngcontent-%COMP%] { color: var(--mj-brand-primary); }\n .mj-voice-picker__item-name[_ngcontent-%COMP%] {\n flex: 1; min-width: 0;\n overflow: hidden; text-overflow: ellipsis; white-space: nowrap;\n }\n .mj-voice-picker__default-badge[_ngcontent-%COMP%] {\n flex-shrink: 0;\n padding: 1px 6px;\n border-radius: 999px;\n font-size: 10px; text-transform: uppercase; letter-spacing: 0.04em;\n color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, transparent);\n }\n .mj-voice-picker__empty[_ngcontent-%COMP%] {\n padding: 12px; font-size: 12px; color: var(--mj-text-muted); text-align: center;\n }\n .mj-voice-picker__select-row[_ngcontent-%COMP%] {\n display: flex; align-items: center; gap: 8px;\n padding: 0 12px 8px;\n }\n .mj-voice-picker__select-row--model[_ngcontent-%COMP%] {\n padding: 8px 12px 0;\n }\n .mj-voice-picker__select-label[_ngcontent-%COMP%] {\n display: flex; align-items: center; gap: 6px;\n flex-shrink: 0;\n font-size: 12px; color: var(--mj-text-secondary);\n }\n .mj-voice-picker__select-label[_ngcontent-%COMP%] i[_ngcontent-%COMP%] { font-size: 11px; color: var(--mj-text-muted); }\n .mj-voice-picker__select[_ngcontent-%COMP%] {\n flex: 1; min-width: 0;\n padding: 5px 8px;\n font-size: 12px;\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 6px;\n outline: none;\n }\n .mj-voice-picker__select[_ngcontent-%COMP%]:focus { border-color: var(--mj-border-focus); }\n .mj-voice-picker__record-row[_ngcontent-%COMP%] {\n display: flex; align-items: center; justify-content: space-between; gap: 10px;\n margin: 10px 12px 2px;\n padding: 10px 0 2px;\n border-top: 1px solid var(--mj-border-subtle);\n }\n .mj-voice-picker__record-label[_ngcontent-%COMP%] {\n display: flex; align-items: center; gap: 8px;\n font-size: 12px; color: var(--mj-text-secondary);\n }\n .mj-voice-picker__record-label[_ngcontent-%COMP%] > i[_ngcontent-%COMP%] { font-size: 12px; color: var(--mj-text-muted); }\n .mj-voice-picker__record-copy[_ngcontent-%COMP%] { display: flex; flex-direction: column; line-height: 1.3; }\n .mj-voice-picker__record-copy[_ngcontent-%COMP%] small[_ngcontent-%COMP%] { font-size: 10px; color: var(--mj-text-muted); }\n .mj-voice-picker__switch[_ngcontent-%COMP%] { position: relative; flex-shrink: 0; display: inline-flex; cursor: pointer; }\n .mj-voice-picker__switch[_ngcontent-%COMP%] input[_ngcontent-%COMP%] {\n position: absolute; inset: 0; width: 100%; height: 100%; margin: 0; opacity: 0; cursor: pointer;\n }\n .mj-voice-picker__switch-track[_ngcontent-%COMP%] {\n position: relative; width: 34px; height: 18px; border-radius: 999px;\n background: var(--mj-border-strong); transition: background 150ms ease;\n }\n .mj-voice-picker__switch-track[_ngcontent-%COMP%]::after {\n content: ''; position: absolute; top: 2px; left: 2px;\n width: 14px; height: 14px; border-radius: 50%;\n background: var(--mj-bg-surface); box-shadow: 0 1px 2px rgba(0, 0, 0, 0.25);\n transition: transform 150ms ease;\n }\n .mj-voice-picker__switch[_ngcontent-%COMP%] input[_ngcontent-%COMP%]:checked + .mj-voice-picker__switch-track[_ngcontent-%COMP%] { background: var(--mj-brand-primary); }\n .mj-voice-picker__switch[_ngcontent-%COMP%] input[_ngcontent-%COMP%]:checked + .mj-voice-picker__switch-track[_ngcontent-%COMP%]::after { transform: translateX(16px); }\n .mj-voice-picker__switch[_ngcontent-%COMP%] input[_ngcontent-%COMP%]:focus-visible + .mj-voice-picker__switch-track[_ngcontent-%COMP%] {\n outline: 2px solid var(--mj-border-focus); outline-offset: 2px;\n }\n @media (prefers-reduced-motion: reduce) {\n .mj-voice-picker__switch-track[_ngcontent-%COMP%], .mj-voice-picker__switch-track[_ngcontent-%COMP%]::after { transition: none; }\n }\n .mj-voice-picker__footer[_ngcontent-%COMP%] {\n display: flex; align-items: center; gap: 8px;\n padding: 10px 12px;\n }"], changeDetection: 0 });
504
549
  }
505
550
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(RealtimeAgentPickerComponent, [{
506
551
  type: Component,
@@ -512,13 +557,13 @@ export class RealtimeAgentPickerComponent extends BaseAngularComponent {
512
557
  </div>
513
558
  @if (ShowCoAgentSelect) {
514
559
  <div class="mj-voice-picker__select-row">
515
- <label class="mj-voice-picker__select-label" for="mjVoiceCoAgentSelect">
560
+ <label class="mj-voice-picker__select-label" for="mjRealtimeCoAgentSelect">
516
561
  <i class="fa-solid fa-headset"></i>
517
562
  <span>Co-agent</span>
518
563
  </label>
519
564
  <select
520
565
  #coAgentSelect
521
- id="mjVoiceCoAgentSelect"
566
+ id="mjRealtimeCoAgentSelect"
522
567
  class="mj-voice-picker__select"
523
568
  [value]="SelectedCoAgentId ?? ''"
524
569
  (change)="OnCoAgentChange(coAgentSelect.value)">
@@ -564,13 +609,13 @@ export class RealtimeAgentPickerComponent extends BaseAngularComponent {
564
609
  </div>
565
610
  @if (CanOverrideSessionConfig && Models.length > 0) {
566
611
  <div class="mj-voice-picker__select-row mj-voice-picker__select-row--model">
567
- <label class="mj-voice-picker__select-label" for="mjVoiceModelSelect">
612
+ <label class="mj-voice-picker__select-label" for="mjRealtimeModelSelect">
568
613
  <i class="fa-solid fa-microchip"></i>
569
614
  <span>Voice model</span>
570
615
  </label>
571
616
  <select
572
617
  #modelSelect
573
- id="mjVoiceModelSelect"
618
+ id="mjRealtimeModelSelect"
574
619
  class="mj-voice-picker__select"
575
620
  [value]="SelectedModelId ?? ''"
576
621
  (change)="OnModelChange(modelSelect.value)">
@@ -582,13 +627,13 @@ export class RealtimeAgentPickerComponent extends BaseAngularComponent {
582
627
  </div>
583
628
  @if (SelectedModelVoices.length) {
584
629
  <div class="mj-voice-picker__select-row mj-voice-picker__select-row--model">
585
- <label class="mj-voice-picker__select-label" for="mjVoiceVoiceSelect">
630
+ <label class="mj-voice-picker__select-label" for="mjRealtimeVoiceSelect">
586
631
  <i class="fa-solid fa-waveform-lines"></i>
587
632
  <span>Voice</span>
588
633
  </label>
589
634
  <select
590
635
  #voiceSelect
591
- id="mjVoiceVoiceSelect"
636
+ id="mjRealtimeVoiceSelect"
592
637
  class="mj-voice-picker__select"
593
638
  [value]="SelectedVoiceId ?? ''"
594
639
  (change)="OnVoiceChange(voiceSelect.value)">
@@ -600,6 +645,23 @@ export class RealtimeAgentPickerComponent extends BaseAngularComponent {
600
645
  </div>
601
646
  }
602
647
  }
648
+ <div class="mj-voice-picker__record-row">
649
+ <span class="mj-voice-picker__record-label">
650
+ <i class="fa-solid fa-microphone"></i>
651
+ <span class="mj-voice-picker__record-copy">
652
+ Record this call
653
+ <small>Audio stored securely</small>
654
+ </span>
655
+ </span>
656
+ <label class="mj-voice-picker__switch">
657
+ <input
658
+ type="checkbox"
659
+ [checked]="RecordingConsent"
660
+ (change)="OnRecordingConsentChange($any($event.target).checked)"
661
+ aria-label="Record this call (audio stored securely)" />
662
+ <span class="mj-voice-picker__switch-track"></span>
663
+ </label>
664
+ </div>
603
665
  <div class="mj-voice-picker__footer">
604
666
  <button mjButton variant="primary" size="sm" [disabled]="!SelectedAgent" (click)="StartCall()">
605
667
  <i class="fa-solid fa-phone"></i> Start
@@ -607,7 +669,7 @@ export class RealtimeAgentPickerComponent extends BaseAngularComponent {
607
669
  <button mjButton variant="outline" size="sm" (click)="Cancel()">Cancel</button>
608
670
  </div>
609
671
  </div>
610
- `, styles: ["\n :host {\n position: absolute;\n bottom: calc(100% + 8px);\n right: 8px;\n z-index: 60;\n }\n .mj-voice-picker {\n width: 300px;\n display: flex; flex-direction: column;\n background: var(--mj-bg-surface-elevated);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n box-shadow: 0 8px 24px rgba(0, 0, 0, 0.16);\n overflow: hidden;\n }\n .mj-voice-picker__header {\n display: flex; align-items: center; gap: 8px;\n padding: 10px 12px 8px;\n font-size: 13px; font-weight: 600;\n color: var(--mj-text-primary);\n }\n .mj-voice-picker__header i { color: var(--mj-brand-primary); }\n .mj-voice-picker__search {\n display: flex; align-items: center; gap: 8px;\n margin: 0 12px 8px;\n padding: 0 10px;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 6px;\n }\n .mj-voice-picker__search i { font-size: 12px; color: var(--mj-text-muted); }\n .mj-voice-picker__search input {\n flex: 1; min-width: 0;\n padding: 7px 0;\n background: transparent; border: none; outline: none;\n font-size: 13px; color: var(--mj-text-primary);\n }\n .mj-voice-picker__search input::placeholder { color: var(--mj-text-disabled); }\n .mj-voice-picker__search:focus-within { border-color: var(--mj-border-focus); }\n .mj-voice-picker__list {\n max-height: 220px; overflow-y: auto;\n border-top: 1px solid var(--mj-border-subtle);\n border-bottom: 1px solid var(--mj-border-subtle);\n padding: 4px 0;\n }\n .mj-voice-picker__item {\n display: flex; align-items: center; gap: 8px; width: 100%;\n padding: 7px 12px;\n background: transparent; border: none; cursor: pointer;\n color: var(--mj-text-primary); font-size: 13px; text-align: left;\n }\n .mj-voice-picker__item i { width: 16px; text-align: center; color: var(--mj-text-secondary); }\n .mj-voice-picker__item:hover { background: var(--mj-bg-surface-hover); }\n .mj-voice-picker__item--selected {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n }\n .mj-voice-picker__item--selected i { color: var(--mj-brand-primary); }\n .mj-voice-picker__item-name {\n flex: 1; min-width: 0;\n overflow: hidden; text-overflow: ellipsis; white-space: nowrap;\n }\n .mj-voice-picker__default-badge {\n flex-shrink: 0;\n padding: 1px 6px;\n border-radius: 999px;\n font-size: 10px; text-transform: uppercase; letter-spacing: 0.04em;\n color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, transparent);\n }\n .mj-voice-picker__empty {\n padding: 12px; font-size: 12px; color: var(--mj-text-muted); text-align: center;\n }\n .mj-voice-picker__select-row {\n display: flex; align-items: center; gap: 8px;\n padding: 0 12px 8px;\n }\n .mj-voice-picker__select-row--model {\n padding: 8px 12px 0;\n }\n .mj-voice-picker__select-label {\n display: flex; align-items: center; gap: 6px;\n flex-shrink: 0;\n font-size: 12px; color: var(--mj-text-secondary);\n }\n .mj-voice-picker__select-label i { font-size: 11px; color: var(--mj-text-muted); }\n .mj-voice-picker__select {\n flex: 1; min-width: 0;\n padding: 5px 8px;\n font-size: 12px;\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 6px;\n outline: none;\n }\n .mj-voice-picker__select:focus { border-color: var(--mj-border-focus); }\n .mj-voice-picker__footer {\n display: flex; align-items: center; gap: 8px;\n padding: 10px 12px;\n }\n "] }]
672
+ `, styles: ["\n :host {\n /* Rendered inside a body-level CDK connected overlay (see message-input) \u2014 CDK\n owns the positioning + z-index, so the host is just a plain block. The height\n cap keeps the popover from growing past the viewport; the agent list inside\n scrolls when content exceeds it. CDK's push keeps it on-screen, and because\n it lives at the body level it can never be clipped by the chat overlay border. */\n display: block;\n max-height: min(440px, calc(100vh - 24px));\n }\n .mj-voice-picker {\n width: 300px;\n max-width: calc(100vw - 24px);\n display: flex; flex-direction: column;\n /* Match the host cap so the inner flex column knows its bound and lets the agent\n list ('mj-voice-picker__list') take the remaining space + scroll. */\n max-height: min(440px, calc(100vh - 120px));\n background: var(--mj-bg-surface-elevated);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n box-shadow: 0 8px 24px rgba(0, 0, 0, 0.16);\n overflow: hidden;\n }\n .mj-voice-picker__header {\n display: flex; align-items: center; gap: 8px;\n padding: 10px 12px 8px;\n font-size: 13px; font-weight: 600;\n color: var(--mj-text-primary);\n }\n .mj-voice-picker__header i { color: var(--mj-brand-primary); }\n .mj-voice-picker__search {\n display: flex; align-items: center; gap: 8px;\n margin: 0 12px 8px;\n padding: 0 10px;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 6px;\n }\n .mj-voice-picker__search i { font-size: 12px; color: var(--mj-text-muted); }\n .mj-voice-picker__search input {\n flex: 1; min-width: 0;\n padding: 7px 0;\n background: transparent; border: none; outline: none;\n font-size: 13px; color: var(--mj-text-primary);\n }\n .mj-voice-picker__search input::placeholder { color: var(--mj-text-disabled); }\n .mj-voice-picker__search:focus-within { border-color: var(--mj-border-focus); }\n .mj-voice-picker__list {\n /* The agent list is the flexible region: it scrolls internally and gives way\n first when the whole popup is capped to the overlay height. min-height:0 lets\n it actually shrink inside the flex column; the 220px max keeps it tidy when\n there's plenty of room. */\n flex: 1 1 auto;\n min-height: 0;\n max-height: 220px; overflow-y: auto;\n border-top: 1px solid var(--mj-border-subtle);\n border-bottom: 1px solid var(--mj-border-subtle);\n padding: 4px 0;\n }\n /* Keep the chrome around the list from collapsing when the popup is height-capped. */\n .mj-voice-picker__header,\n .mj-voice-picker__search,\n .mj-voice-picker__select-row,\n .mj-voice-picker__record-row,\n .mj-voice-picker__footer { flex-shrink: 0; }\n .mj-voice-picker__item {\n display: flex; align-items: center; gap: 8px; width: 100%;\n padding: 7px 12px;\n background: transparent; border: none; cursor: pointer;\n color: var(--mj-text-primary); font-size: 13px; text-align: left;\n }\n .mj-voice-picker__item i { width: 16px; text-align: center; color: var(--mj-text-secondary); }\n .mj-voice-picker__item:hover { background: var(--mj-bg-surface-hover); }\n .mj-voice-picker__item--selected {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n }\n .mj-voice-picker__item--selected i { color: var(--mj-brand-primary); }\n .mj-voice-picker__item-name {\n flex: 1; min-width: 0;\n overflow: hidden; text-overflow: ellipsis; white-space: nowrap;\n }\n .mj-voice-picker__default-badge {\n flex-shrink: 0;\n padding: 1px 6px;\n border-radius: 999px;\n font-size: 10px; text-transform: uppercase; letter-spacing: 0.04em;\n color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, transparent);\n }\n .mj-voice-picker__empty {\n padding: 12px; font-size: 12px; color: var(--mj-text-muted); text-align: center;\n }\n .mj-voice-picker__select-row {\n display: flex; align-items: center; gap: 8px;\n padding: 0 12px 8px;\n }\n .mj-voice-picker__select-row--model {\n padding: 8px 12px 0;\n }\n .mj-voice-picker__select-label {\n display: flex; align-items: center; gap: 6px;\n flex-shrink: 0;\n font-size: 12px; color: var(--mj-text-secondary);\n }\n .mj-voice-picker__select-label i { font-size: 11px; color: var(--mj-text-muted); }\n .mj-voice-picker__select {\n flex: 1; min-width: 0;\n padding: 5px 8px;\n font-size: 12px;\n color: var(--mj-text-primary);\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-subtle);\n border-radius: 6px;\n outline: none;\n }\n .mj-voice-picker__select:focus { border-color: var(--mj-border-focus); }\n .mj-voice-picker__record-row {\n display: flex; align-items: center; justify-content: space-between; gap: 10px;\n margin: 10px 12px 2px;\n padding: 10px 0 2px;\n border-top: 1px solid var(--mj-border-subtle);\n }\n .mj-voice-picker__record-label {\n display: flex; align-items: center; gap: 8px;\n font-size: 12px; color: var(--mj-text-secondary);\n }\n .mj-voice-picker__record-label > i { font-size: 12px; color: var(--mj-text-muted); }\n .mj-voice-picker__record-copy { display: flex; flex-direction: column; line-height: 1.3; }\n .mj-voice-picker__record-copy small { font-size: 10px; color: var(--mj-text-muted); }\n .mj-voice-picker__switch { position: relative; flex-shrink: 0; display: inline-flex; cursor: pointer; }\n .mj-voice-picker__switch input {\n position: absolute; inset: 0; width: 100%; height: 100%; margin: 0; opacity: 0; cursor: pointer;\n }\n .mj-voice-picker__switch-track {\n position: relative; width: 34px; height: 18px; border-radius: 999px;\n background: var(--mj-border-strong); transition: background 150ms ease;\n }\n .mj-voice-picker__switch-track::after {\n content: ''; position: absolute; top: 2px; left: 2px;\n width: 14px; height: 14px; border-radius: 50%;\n background: var(--mj-bg-surface); box-shadow: 0 1px 2px rgba(0, 0, 0, 0.25);\n transition: transform 150ms ease;\n }\n .mj-voice-picker__switch input:checked + .mj-voice-picker__switch-track { background: var(--mj-brand-primary); }\n .mj-voice-picker__switch input:checked + .mj-voice-picker__switch-track::after { transform: translateX(16px); }\n .mj-voice-picker__switch input:focus-visible + .mj-voice-picker__switch-track {\n outline: 2px solid var(--mj-border-focus); outline-offset: 2px;\n }\n @media (prefers-reduced-motion: reduce) {\n .mj-voice-picker__switch-track, .mj-voice-picker__switch-track::after { transition: none; }\n }\n .mj-voice-picker__footer {\n display: flex; align-items: center; gap: 8px;\n padding: 10px 12px;\n }\n "] }]
611
673
  }], null, { Agents: [{
612
674
  type: Input
613
675
  }], DefaultAgentId: [{
@@ -630,5 +692,5 @@ export class RealtimeAgentPickerComponent extends BaseAngularComponent {
630
692
  type: HostListener,
631
693
  args: ['document:keydown.escape']
632
694
  }] }); })();
633
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(RealtimeAgentPickerComponent, { className: "RealtimeAgentPickerComponent", filePath: "src/lib/components/realtime/realtime-agent-picker.component.ts", lineNumber: 294 }); })();
695
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(RealtimeAgentPickerComponent, { className: "RealtimeAgentPickerComponent", filePath: "src/lib/components/realtime/realtime-agent-picker.component.ts", lineNumber: 371 }); })();
634
696
  //# sourceMappingURL=realtime-agent-picker.component.js.map