@memberjunction/ng-conversations 5.40.1 → 5.41.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (378) hide show
  1. package/README.md +57 -0
  2. package/dist/__tests__/channel-optional-surface.test.d.ts +2 -0
  3. package/dist/__tests__/channel-optional-surface.test.d.ts.map +1 -0
  4. package/dist/__tests__/channel-optional-surface.test.js +53 -0
  5. package/dist/__tests__/channel-optional-surface.test.js.map +1 -0
  6. package/dist/__tests__/chat-events.test.d.ts +14 -0
  7. package/dist/__tests__/chat-events.test.d.ts.map +1 -0
  8. package/dist/__tests__/chat-events.test.js +109 -0
  9. package/dist/__tests__/chat-events.test.js.map +1 -0
  10. package/dist/__tests__/conversation-naming.test.d.ts +2 -0
  11. package/dist/__tests__/conversation-naming.test.d.ts.map +1 -0
  12. package/dist/__tests__/conversation-naming.test.js +110 -0
  13. package/dist/__tests__/conversation-naming.test.js.map +1 -0
  14. package/dist/__tests__/delegation-result-parser.test.d.ts +2 -0
  15. package/dist/__tests__/delegation-result-parser.test.d.ts.map +1 -0
  16. package/dist/__tests__/delegation-result-parser.test.js +107 -0
  17. package/dist/__tests__/delegation-result-parser.test.js.map +1 -0
  18. package/dist/__tests__/event-wiring.test.d.ts +15 -0
  19. package/dist/__tests__/event-wiring.test.d.ts.map +1 -0
  20. package/dist/__tests__/event-wiring.test.js +100 -0
  21. package/dist/__tests__/event-wiring.test.js.map +1 -0
  22. package/dist/__tests__/narration-template.test.d.ts +2 -0
  23. package/dist/__tests__/narration-template.test.d.ts.map +1 -0
  24. package/dist/__tests__/narration-template.test.js +76 -0
  25. package/dist/__tests__/narration-template.test.js.map +1 -0
  26. package/dist/__tests__/realtime-agent-picker-models.test.d.ts +2 -0
  27. package/dist/__tests__/realtime-agent-picker-models.test.d.ts.map +1 -0
  28. package/dist/__tests__/realtime-agent-picker-models.test.js +49 -0
  29. package/dist/__tests__/realtime-agent-picker-models.test.js.map +1 -0
  30. package/dist/__tests__/realtime-audio-visuals.test.d.ts +2 -0
  31. package/dist/__tests__/realtime-audio-visuals.test.d.ts.map +1 -0
  32. package/dist/__tests__/realtime-audio-visuals.test.js +123 -0
  33. package/dist/__tests__/realtime-audio-visuals.test.js.map +1 -0
  34. package/dist/__tests__/realtime-delegation-card-cancel.test.d.ts +2 -0
  35. package/dist/__tests__/realtime-delegation-card-cancel.test.d.ts.map +1 -0
  36. package/dist/__tests__/realtime-delegation-card-cancel.test.js +48 -0
  37. package/dist/__tests__/realtime-delegation-card-cancel.test.js.map +1 -0
  38. package/dist/__tests__/realtime-disclosure.test.d.ts +2 -0
  39. package/dist/__tests__/realtime-disclosure.test.d.ts.map +1 -0
  40. package/dist/__tests__/realtime-disclosure.test.js +164 -0
  41. package/dist/__tests__/realtime-disclosure.test.js.map +1 -0
  42. package/dist/__tests__/realtime-pairing.test.d.ts +2 -0
  43. package/dist/__tests__/realtime-pairing.test.d.ts.map +1 -0
  44. package/dist/__tests__/realtime-pairing.test.js +207 -0
  45. package/dist/__tests__/realtime-pairing.test.js.map +1 -0
  46. package/dist/__tests__/realtime-review-lifecycle.test.d.ts +2 -0
  47. package/dist/__tests__/realtime-review-lifecycle.test.d.ts.map +1 -0
  48. package/dist/__tests__/realtime-review-lifecycle.test.js +154 -0
  49. package/dist/__tests__/realtime-review-lifecycle.test.js.map +1 -0
  50. package/dist/__tests__/realtime-session-cancel-usage.test.d.ts +2 -0
  51. package/dist/__tests__/realtime-session-cancel-usage.test.d.ts.map +1 -0
  52. package/dist/__tests__/realtime-session-cancel-usage.test.js +230 -0
  53. package/dist/__tests__/realtime-session-cancel-usage.test.js.map +1 -0
  54. package/dist/__tests__/realtime-session-channels.test.d.ts +2 -0
  55. package/dist/__tests__/realtime-session-channels.test.d.ts.map +1 -0
  56. package/dist/__tests__/realtime-session-channels.test.js +252 -0
  57. package/dist/__tests__/realtime-session-channels.test.js.map +1 -0
  58. package/dist/__tests__/realtime-session-client-tools.test.d.ts +2 -0
  59. package/dist/__tests__/realtime-session-client-tools.test.d.ts.map +1 -0
  60. package/dist/__tests__/realtime-session-client-tools.test.js +103 -0
  61. package/dist/__tests__/realtime-session-client-tools.test.js.map +1 -0
  62. package/dist/__tests__/realtime-session-minimized.test.d.ts +2 -0
  63. package/dist/__tests__/realtime-session-minimized.test.d.ts.map +1 -0
  64. package/dist/__tests__/realtime-session-minimized.test.js +32 -0
  65. package/dist/__tests__/realtime-session-minimized.test.js.map +1 -0
  66. package/dist/__tests__/realtime-session-mint.test.d.ts +2 -0
  67. package/dist/__tests__/realtime-session-mint.test.d.ts.map +1 -0
  68. package/dist/__tests__/realtime-session-mint.test.js +69 -0
  69. package/dist/__tests__/realtime-session-mint.test.js.map +1 -0
  70. package/dist/__tests__/realtime-session-policy.test.d.ts +2 -0
  71. package/dist/__tests__/realtime-session-policy.test.d.ts.map +1 -0
  72. package/dist/__tests__/realtime-session-policy.test.js +303 -0
  73. package/dist/__tests__/realtime-session-policy.test.js.map +1 -0
  74. package/dist/__tests__/realtime-session-review.service.test.d.ts +2 -0
  75. package/dist/__tests__/realtime-session-review.service.test.d.ts.map +1 -0
  76. package/dist/__tests__/realtime-session-review.service.test.js +743 -0
  77. package/dist/__tests__/realtime-session-review.service.test.js.map +1 -0
  78. package/dist/__tests__/realtime-session-state.test.d.ts +2 -0
  79. package/dist/__tests__/realtime-session-state.test.d.ts.map +1 -0
  80. package/dist/__tests__/realtime-session-state.test.js +83 -0
  81. package/dist/__tests__/realtime-session-state.test.js.map +1 -0
  82. package/dist/__tests__/realtime-session-timeline-card.test.d.ts +2 -0
  83. package/dist/__tests__/realtime-session-timeline-card.test.d.ts.map +1 -0
  84. package/dist/__tests__/realtime-session-timeline-card.test.js +106 -0
  85. package/dist/__tests__/realtime-session-timeline-card.test.js.map +1 -0
  86. package/dist/__tests__/realtime-session-timeline.test.d.ts +2 -0
  87. package/dist/__tests__/realtime-session-timeline.test.d.ts.map +1 -0
  88. package/dist/__tests__/realtime-session-timeline.test.js +142 -0
  89. package/dist/__tests__/realtime-session-timeline.test.js.map +1 -0
  90. package/dist/__tests__/realtime-sessions-adapter.test.d.ts +19 -0
  91. package/dist/__tests__/realtime-sessions-adapter.test.d.ts.map +1 -0
  92. package/dist/__tests__/realtime-sessions-adapter.test.js +188 -0
  93. package/dist/__tests__/realtime-sessions-adapter.test.js.map +1 -0
  94. package/dist/__tests__/realtime-surface-panel-prefs.test.d.ts +2 -0
  95. package/dist/__tests__/realtime-surface-panel-prefs.test.d.ts.map +1 -0
  96. package/dist/__tests__/realtime-surface-panel-prefs.test.js +100 -0
  97. package/dist/__tests__/realtime-surface-panel-prefs.test.js.map +1 -0
  98. package/dist/__tests__/realtime-surface-tabs-model.test.d.ts +2 -0
  99. package/dist/__tests__/realtime-surface-tabs-model.test.d.ts.map +1 -0
  100. package/dist/__tests__/realtime-surface-tabs-model.test.js +193 -0
  101. package/dist/__tests__/realtime-surface-tabs-model.test.js.map +1 -0
  102. package/dist/__tests__/remote-browser-audio-player.test.d.ts +2 -0
  103. package/dist/__tests__/remote-browser-audio-player.test.d.ts.map +1 -0
  104. package/dist/__tests__/remote-browser-audio-player.test.js +137 -0
  105. package/dist/__tests__/remote-browser-audio-player.test.js.map +1 -0
  106. package/dist/__tests__/remote-browser-channel.test.d.ts +2 -0
  107. package/dist/__tests__/remote-browser-channel.test.d.ts.map +1 -0
  108. package/dist/__tests__/remote-browser-channel.test.js +423 -0
  109. package/dist/__tests__/remote-browser-channel.test.js.map +1 -0
  110. package/dist/__tests__/slot-defaults.test.d.ts +24 -0
  111. package/dist/__tests__/slot-defaults.test.d.ts.map +1 -0
  112. package/dist/__tests__/slot-defaults.test.js +63 -0
  113. package/dist/__tests__/slot-defaults.test.js.map +1 -0
  114. package/dist/__tests__/user-authorization.test.d.ts +2 -0
  115. package/dist/__tests__/user-authorization.test.d.ts.map +1 -0
  116. package/dist/__tests__/user-authorization.test.js +97 -0
  117. package/dist/__tests__/user-authorization.test.js.map +1 -0
  118. package/dist/__tests__/voice-session-narration.test.d.ts +2 -0
  119. package/dist/__tests__/voice-session-narration.test.d.ts.map +1 -0
  120. package/dist/__tests__/voice-session-narration.test.js +609 -0
  121. package/dist/__tests__/voice-session-narration.test.js.map +1 -0
  122. package/dist/__tests__/whiteboard-artifact-viewer.test.d.ts +2 -0
  123. package/dist/__tests__/whiteboard-artifact-viewer.test.d.ts.map +1 -0
  124. package/dist/__tests__/whiteboard-artifact-viewer.test.js +101 -0
  125. package/dist/__tests__/whiteboard-artifact-viewer.test.js.map +1 -0
  126. package/dist/__tests__/whiteboard-channel.test.d.ts +2 -0
  127. package/dist/__tests__/whiteboard-channel.test.d.ts.map +1 -0
  128. package/dist/__tests__/whiteboard-channel.test.js +260 -0
  129. package/dist/__tests__/whiteboard-channel.test.js.map +1 -0
  130. package/dist/__tests__/whiteboard-restore-state.test.d.ts +2 -0
  131. package/dist/__tests__/whiteboard-restore-state.test.d.ts.map +1 -0
  132. package/dist/__tests__/whiteboard-restore-state.test.js +108 -0
  133. package/dist/__tests__/whiteboard-restore-state.test.js.map +1 -0
  134. package/dist/lib/components/conversation/conversation-chat-area.component.d.ts +205 -3
  135. package/dist/lib/components/conversation/conversation-chat-area.component.d.ts.map +1 -1
  136. package/dist/lib/components/conversation/conversation-chat-area.component.js +911 -342
  137. package/dist/lib/components/conversation/conversation-chat-area.component.js.map +1 -1
  138. package/dist/lib/components/mention/mention-dropdown.component.js +35 -17
  139. package/dist/lib/components/mention/mention-dropdown.component.js.map +1 -1
  140. package/dist/lib/components/mention/mention-editor.component.d.ts +4 -0
  141. package/dist/lib/components/mention/mention-editor.component.d.ts.map +1 -1
  142. package/dist/lib/components/mention/mention-editor.component.js +43 -19
  143. package/dist/lib/components/mention/mention-editor.component.js.map +1 -1
  144. package/dist/lib/components/message/message-input-box.component.d.ts +17 -1
  145. package/dist/lib/components/message/message-input-box.component.d.ts.map +1 -1
  146. package/dist/lib/components/message/message-input-box.component.js +73 -15
  147. package/dist/lib/components/message/message-input-box.component.js.map +1 -1
  148. package/dist/lib/components/message/message-input.component.d.ts +142 -6
  149. package/dist/lib/components/message/message-input.component.d.ts.map +1 -1
  150. package/dist/lib/components/message/message-input.component.js +328 -82
  151. package/dist/lib/components/message/message-input.component.js.map +1 -1
  152. package/dist/lib/components/message/message-item.component.d.ts +28 -3
  153. package/dist/lib/components/message/message-item.component.d.ts.map +1 -1
  154. package/dist/lib/components/message/message-item.component.js +180 -108
  155. package/dist/lib/components/message/message-item.component.js.map +1 -1
  156. package/dist/lib/components/message/message-list.component.d.ts +81 -2
  157. package/dist/lib/components/message/message-list.component.d.ts.map +1 -1
  158. package/dist/lib/components/message/message-list.component.js +252 -87
  159. package/dist/lib/components/message/message-list.component.js.map +1 -1
  160. package/dist/lib/components/realtime/channels/base-realtime-channel-client.d.ts +282 -0
  161. package/dist/lib/components/realtime/channels/base-realtime-channel-client.d.ts.map +1 -0
  162. package/dist/lib/components/realtime/channels/base-realtime-channel-client.js +158 -0
  163. package/dist/lib/components/realtime/channels/base-realtime-channel-client.js.map +1 -0
  164. package/dist/lib/components/realtime/channels/channel-onboarding-panel.component.d.ts +25 -0
  165. package/dist/lib/components/realtime/channels/channel-onboarding-panel.component.d.ts.map +1 -0
  166. package/dist/lib/components/realtime/channels/channel-onboarding-panel.component.js +140 -0
  167. package/dist/lib/components/realtime/channels/channel-onboarding-panel.component.js.map +1 -0
  168. package/dist/lib/components/realtime/channels/realtime-channel-pane.component.d.ts +35 -0
  169. package/dist/lib/components/realtime/channels/realtime-channel-pane.component.d.ts.map +1 -0
  170. package/dist/lib/components/realtime/channels/realtime-channel-pane.component.js +58 -0
  171. package/dist/lib/components/realtime/channels/realtime-channel-pane.component.js.map +1 -0
  172. package/dist/lib/components/realtime/realtime-activity-rail.component.d.ts +63 -0
  173. package/dist/lib/components/realtime/realtime-activity-rail.component.d.ts.map +1 -0
  174. package/dist/lib/components/realtime/realtime-activity-rail.component.js +260 -0
  175. package/dist/lib/components/realtime/realtime-activity-rail.component.js.map +1 -0
  176. package/dist/lib/components/realtime/realtime-agent-banner.component.d.ts +117 -0
  177. package/dist/lib/components/realtime/realtime-agent-banner.component.d.ts.map +1 -0
  178. package/dist/lib/components/realtime/realtime-agent-banner.component.js +504 -0
  179. package/dist/lib/components/realtime/realtime-agent-banner.component.js.map +1 -0
  180. package/dist/lib/components/realtime/realtime-agent-picker.component.d.ts +168 -0
  181. package/dist/lib/components/realtime/realtime-agent-picker.component.d.ts.map +1 -0
  182. package/dist/lib/components/realtime/realtime-agent-picker.component.js +556 -0
  183. package/dist/lib/components/realtime/realtime-agent-picker.component.js.map +1 -0
  184. package/dist/lib/components/realtime/realtime-audio-visuals.d.ts +97 -0
  185. package/dist/lib/components/realtime/realtime-audio-visuals.d.ts.map +1 -0
  186. package/dist/lib/components/realtime/realtime-audio-visuals.js +139 -0
  187. package/dist/lib/components/realtime/realtime-audio-visuals.js.map +1 -0
  188. package/dist/lib/components/realtime/realtime-channel-strip.component.d.ts +29 -0
  189. package/dist/lib/components/realtime/realtime-channel-strip.component.d.ts.map +1 -0
  190. package/dist/lib/components/realtime/realtime-channel-strip.component.js +69 -0
  191. package/dist/lib/components/realtime/realtime-channel-strip.component.js.map +1 -0
  192. package/dist/lib/components/realtime/realtime-composer.component.d.ts +65 -0
  193. package/dist/lib/components/realtime/realtime-composer.component.d.ts.map +1 -0
  194. package/dist/lib/components/realtime/realtime-composer.component.js +256 -0
  195. package/dist/lib/components/realtime/realtime-composer.component.js.map +1 -0
  196. package/dist/lib/components/realtime/realtime-delegation-card.component.d.ts +71 -0
  197. package/dist/lib/components/realtime/realtime-delegation-card.component.d.ts.map +1 -0
  198. package/dist/lib/components/realtime/realtime-delegation-card.component.js +324 -0
  199. package/dist/lib/components/realtime/realtime-delegation-card.component.js.map +1 -0
  200. package/dist/lib/components/realtime/realtime-disclosure.d.ts +135 -0
  201. package/dist/lib/components/realtime/realtime-disclosure.d.ts.map +1 -0
  202. package/dist/lib/components/realtime/realtime-disclosure.js +188 -0
  203. package/dist/lib/components/realtime/realtime-disclosure.js.map +1 -0
  204. package/dist/lib/components/realtime/realtime-session-overlay.component.d.ts +491 -0
  205. package/dist/lib/components/realtime/realtime-session-overlay.component.d.ts.map +1 -0
  206. package/dist/lib/components/realtime/realtime-session-overlay.component.js +1274 -0
  207. package/dist/lib/components/realtime/realtime-session-overlay.component.js.map +1 -0
  208. package/dist/lib/components/realtime/realtime-session-state.d.ts +191 -0
  209. package/dist/lib/components/realtime/realtime-session-state.d.ts.map +1 -0
  210. package/dist/lib/components/realtime/realtime-session-state.js +244 -0
  211. package/dist/lib/components/realtime/realtime-session-state.js.map +1 -0
  212. package/dist/lib/components/realtime/realtime-session-thread.component.d.ts +56 -0
  213. package/dist/lib/components/realtime/realtime-session-thread.component.d.ts.map +1 -0
  214. package/dist/lib/components/realtime/realtime-session-thread.component.js +246 -0
  215. package/dist/lib/components/realtime/realtime-session-thread.component.js.map +1 -0
  216. package/dist/lib/components/realtime/realtime-session-timeline-card.component.d.ts +51 -0
  217. package/dist/lib/components/realtime/realtime-session-timeline-card.component.d.ts.map +1 -0
  218. package/dist/lib/components/realtime/realtime-session-timeline-card.component.js +193 -0
  219. package/dist/lib/components/realtime/realtime-session-timeline-card.component.js.map +1 -0
  220. package/dist/lib/components/realtime/realtime-surface-panel-prefs.d.ts +77 -0
  221. package/dist/lib/components/realtime/realtime-surface-panel-prefs.d.ts.map +1 -0
  222. package/dist/lib/components/realtime/realtime-surface-panel-prefs.js +114 -0
  223. package/dist/lib/components/realtime/realtime-surface-panel-prefs.js.map +1 -0
  224. package/dist/lib/components/realtime/realtime-surface-tabs.component.d.ts +173 -0
  225. package/dist/lib/components/realtime/realtime-surface-tabs.component.d.ts.map +1 -0
  226. package/dist/lib/components/realtime/realtime-surface-tabs.component.js +496 -0
  227. package/dist/lib/components/realtime/realtime-surface-tabs.component.js.map +1 -0
  228. package/dist/lib/components/realtime/realtime-surface-tabs.model.d.ts +181 -0
  229. package/dist/lib/components/realtime/realtime-surface-tabs.model.d.ts.map +1 -0
  230. package/dist/lib/components/realtime/realtime-surface-tabs.model.js +223 -0
  231. package/dist/lib/components/realtime/realtime-surface-tabs.model.js.map +1 -0
  232. package/dist/lib/components/realtime/remote-browser/remote-browser-audio-player.d.ts +163 -0
  233. package/dist/lib/components/realtime/remote-browser/remote-browser-audio-player.d.ts.map +1 -0
  234. package/dist/lib/components/realtime/remote-browser/remote-browser-audio-player.js +309 -0
  235. package/dist/lib/components/realtime/remote-browser/remote-browser-audio-player.js.map +1 -0
  236. package/dist/lib/components/realtime/remote-browser/remote-browser-channel.d.ts +168 -0
  237. package/dist/lib/components/realtime/remote-browser/remote-browser-channel.d.ts.map +1 -0
  238. package/dist/lib/components/realtime/remote-browser/remote-browser-channel.js +524 -0
  239. package/dist/lib/components/realtime/remote-browser/remote-browser-channel.js.map +1 -0
  240. package/dist/lib/components/realtime/remote-browser/remote-browser-surface.component.d.ts +346 -0
  241. package/dist/lib/components/realtime/remote-browser/remote-browser-surface.component.d.ts.map +1 -0
  242. package/dist/lib/components/realtime/remote-browser/remote-browser-surface.component.js +851 -0
  243. package/dist/lib/components/realtime/remote-browser/remote-browser-surface.component.js.map +1 -0
  244. package/dist/lib/components/realtime/remote-browser/remote-browser-tools.d.ts +86 -0
  245. package/dist/lib/components/realtime/remote-browser/remote-browser-tools.d.ts.map +1 -0
  246. package/dist/lib/components/realtime/remote-browser/remote-browser-tools.js +210 -0
  247. package/dist/lib/components/realtime/remote-browser/remote-browser-tools.js.map +1 -0
  248. package/dist/lib/components/realtime/whiteboard/whiteboard-artifact-viewer.component.d.ts +48 -0
  249. package/dist/lib/components/realtime/whiteboard/whiteboard-artifact-viewer.component.d.ts.map +1 -0
  250. package/dist/lib/components/realtime/whiteboard/whiteboard-artifact-viewer.component.js +180 -0
  251. package/dist/lib/components/realtime/whiteboard/whiteboard-artifact-viewer.component.js.map +1 -0
  252. package/dist/lib/components/realtime/whiteboard/whiteboard-channel.d.ts +119 -0
  253. package/dist/lib/components/realtime/whiteboard/whiteboard-channel.d.ts.map +1 -0
  254. package/dist/lib/components/realtime/whiteboard/whiteboard-channel.js +274 -0
  255. package/dist/lib/components/realtime/whiteboard/whiteboard-channel.js.map +1 -0
  256. package/dist/lib/components/slots/mj-chat-agent-presence-default.component.d.ts +11 -0
  257. package/dist/lib/components/slots/mj-chat-agent-presence-default.component.d.ts.map +1 -0
  258. package/dist/lib/components/slots/mj-chat-agent-presence-default.component.js +98 -0
  259. package/dist/lib/components/slots/mj-chat-agent-presence-default.component.js.map +1 -0
  260. package/dist/lib/components/slots/mj-chat-demonstration-surface-default.component.d.ts +9 -0
  261. package/dist/lib/components/slots/mj-chat-demonstration-surface-default.component.d.ts.map +1 -0
  262. package/dist/lib/components/slots/mj-chat-demonstration-surface-default.component.js +35 -0
  263. package/dist/lib/components/slots/mj-chat-demonstration-surface-default.component.js.map +1 -0
  264. package/dist/lib/components/slots/mj-chat-empty-state-default.component.d.ts +28 -0
  265. package/dist/lib/components/slots/mj-chat-empty-state-default.component.d.ts.map +1 -0
  266. package/dist/lib/components/slots/mj-chat-empty-state-default.component.js +104 -0
  267. package/dist/lib/components/slots/mj-chat-empty-state-default.component.js.map +1 -0
  268. package/dist/lib/components/slots/mj-chat-header-default.component.d.ts +11 -0
  269. package/dist/lib/components/slots/mj-chat-header-default.component.d.ts.map +1 -0
  270. package/dist/lib/components/slots/mj-chat-header-default.component.js +103 -0
  271. package/dist/lib/components/slots/mj-chat-header-default.component.js.map +1 -0
  272. package/dist/lib/components/slots/mj-chat-message-bubble-default.component.d.ts +15 -0
  273. package/dist/lib/components/slots/mj-chat-message-bubble-default.component.d.ts.map +1 -0
  274. package/dist/lib/components/slots/mj-chat-message-bubble-default.component.js +73 -0
  275. package/dist/lib/components/slots/mj-chat-message-bubble-default.component.js.map +1 -0
  276. package/dist/lib/components/slots/mj-chat-message-extra-default.component.d.ts +9 -0
  277. package/dist/lib/components/slots/mj-chat-message-extra-default.component.d.ts.map +1 -0
  278. package/dist/lib/components/slots/mj-chat-message-extra-default.component.js +34 -0
  279. package/dist/lib/components/slots/mj-chat-message-extra-default.component.js.map +1 -0
  280. package/dist/lib/components/slots/slot-interfaces.d.ts +95 -0
  281. package/dist/lib/components/slots/slot-interfaces.d.ts.map +1 -0
  282. package/dist/lib/components/slots/slot-interfaces.js +18 -0
  283. package/dist/lib/components/slots/slot-interfaces.js.map +1 -0
  284. package/dist/lib/components/workspace/conversation-workspace.component.d.ts +11 -0
  285. package/dist/lib/components/workspace/conversation-workspace.component.d.ts.map +1 -1
  286. package/dist/lib/components/workspace/conversation-workspace.component.js +28 -4
  287. package/dist/lib/components/workspace/conversation-workspace.component.js.map +1 -1
  288. package/dist/lib/conversations.module.d.ts +12 -1
  289. package/dist/lib/conversations.module.d.ts.map +1 -1
  290. package/dist/lib/conversations.module.js +93 -5
  291. package/dist/lib/conversations.module.js.map +1 -1
  292. package/dist/lib/directives/chat-slot.directive.d.ts +44 -0
  293. package/dist/lib/directives/chat-slot.directive.d.ts.map +1 -0
  294. package/dist/lib/directives/chat-slot.directive.js +54 -0
  295. package/dist/lib/directives/chat-slot.directive.js.map +1 -0
  296. package/dist/lib/events/chat-events.d.ts +137 -0
  297. package/dist/lib/events/chat-events.d.ts.map +1 -0
  298. package/dist/lib/events/chat-events.js +189 -0
  299. package/dist/lib/events/chat-events.js.map +1 -0
  300. package/dist/lib/models/conversation-state.model.d.ts +2 -1
  301. package/dist/lib/models/conversation-state.model.d.ts.map +1 -1
  302. package/dist/lib/models/conversation-state.model.js.map +1 -1
  303. package/dist/lib/services/artifact-state.service.d.ts.map +1 -1
  304. package/dist/lib/services/artifact-state.service.js +23 -6
  305. package/dist/lib/services/artifact-state.service.js.map +1 -1
  306. package/dist/lib/services/conversation-agent.service.d.ts +60 -74
  307. package/dist/lib/services/conversation-agent.service.d.ts.map +1 -1
  308. package/dist/lib/services/conversation-agent.service.js +100 -313
  309. package/dist/lib/services/conversation-agent.service.js.map +1 -1
  310. package/dist/lib/services/conversation-bridge.service.d.ts +11 -70
  311. package/dist/lib/services/conversation-bridge.service.d.ts.map +1 -1
  312. package/dist/lib/services/conversation-bridge.service.js +51 -85
  313. package/dist/lib/services/conversation-bridge.service.js.map +1 -1
  314. package/dist/lib/services/conversation-naming.d.ts +63 -0
  315. package/dist/lib/services/conversation-naming.d.ts.map +1 -0
  316. package/dist/lib/services/conversation-naming.js +58 -0
  317. package/dist/lib/services/conversation-naming.js.map +1 -0
  318. package/dist/lib/services/conversation-streaming.service.d.ts +24 -154
  319. package/dist/lib/services/conversation-streaming.service.d.ts.map +1 -1
  320. package/dist/lib/services/conversation-streaming.service.js +39 -361
  321. package/dist/lib/services/conversation-streaming.service.js.map +1 -1
  322. package/dist/lib/services/conversations-runtime-bootstrap.service.d.ts +10 -0
  323. package/dist/lib/services/conversations-runtime-bootstrap.service.d.ts.map +1 -0
  324. package/dist/lib/services/conversations-runtime-bootstrap.service.js +104 -0
  325. package/dist/lib/services/conversations-runtime-bootstrap.service.js.map +1 -0
  326. package/dist/lib/services/delegation-result-parser.d.ts +45 -0
  327. package/dist/lib/services/delegation-result-parser.d.ts.map +1 -0
  328. package/dist/lib/services/delegation-result-parser.js +48 -0
  329. package/dist/lib/services/delegation-result-parser.js.map +1 -0
  330. package/dist/lib/services/mention-autocomplete.service.d.ts +19 -4
  331. package/dist/lib/services/mention-autocomplete.service.d.ts.map +1 -1
  332. package/dist/lib/services/mention-autocomplete.service.js +65 -4
  333. package/dist/lib/services/mention-autocomplete.service.js.map +1 -1
  334. package/dist/lib/services/mention-parser.service.d.ts +8 -53
  335. package/dist/lib/services/mention-parser.service.d.ts.map +1 -1
  336. package/dist/lib/services/mention-parser.service.js +32 -243
  337. package/dist/lib/services/mention-parser.service.js.map +1 -1
  338. package/dist/lib/services/narration-template.d.ts +42 -0
  339. package/dist/lib/services/narration-template.d.ts.map +1 -0
  340. package/dist/lib/services/narration-template.js +73 -0
  341. package/dist/lib/services/narration-template.js.map +1 -0
  342. package/dist/lib/services/realtime-pairing.d.ts +120 -0
  343. package/dist/lib/services/realtime-pairing.d.ts.map +1 -0
  344. package/dist/lib/services/realtime-pairing.js +150 -0
  345. package/dist/lib/services/realtime-pairing.js.map +1 -0
  346. package/dist/lib/services/realtime-session-review.service.d.ts +233 -0
  347. package/dist/lib/services/realtime-session-review.service.d.ts.map +1 -0
  348. package/dist/lib/services/realtime-session-review.service.js +417 -0
  349. package/dist/lib/services/realtime-session-review.service.js.map +1 -0
  350. package/dist/lib/services/realtime-session.service.d.ts +739 -0
  351. package/dist/lib/services/realtime-session.service.d.ts.map +1 -0
  352. package/dist/lib/services/realtime-session.service.js +1647 -0
  353. package/dist/lib/services/realtime-session.service.js.map +1 -0
  354. package/dist/lib/services/realtime-sessions-adapter.d.ts +54 -0
  355. package/dist/lib/services/realtime-sessions-adapter.d.ts.map +1 -0
  356. package/dist/lib/services/realtime-sessions-adapter.js +154 -0
  357. package/dist/lib/services/realtime-sessions-adapter.js.map +1 -0
  358. package/dist/lib/services/user-authorization.d.ts +67 -0
  359. package/dist/lib/services/user-authorization.d.ts.map +1 -0
  360. package/dist/lib/services/user-authorization.js +66 -0
  361. package/dist/lib/services/user-authorization.js.map +1 -0
  362. package/dist/lib/utils/realtime-session-timeline.d.ts +84 -0
  363. package/dist/lib/utils/realtime-session-timeline.d.ts.map +1 -0
  364. package/dist/lib/utils/realtime-session-timeline.js +94 -0
  365. package/dist/lib/utils/realtime-session-timeline.js.map +1 -0
  366. package/dist/public-api.d.ts +41 -0
  367. package/dist/public-api.d.ts.map +1 -1
  368. package/dist/public-api.js +50 -0
  369. package/dist/public-api.js.map +1 -1
  370. package/package.json +27 -24
  371. package/dist/__tests__/conversation-bridge.service.test.d.ts +0 -2
  372. package/dist/__tests__/conversation-bridge.service.test.d.ts.map +0 -1
  373. package/dist/__tests__/conversation-bridge.service.test.js +0 -98
  374. package/dist/__tests__/conversation-bridge.service.test.js.map +0 -1
  375. package/dist/__tests__/mention-parser.test.d.ts +0 -2
  376. package/dist/__tests__/mention-parser.test.d.ts.map +0 -1
  377. package/dist/__tests__/mention-parser.test.js +0 -154
  378. package/dist/__tests__/mention-parser.test.js.map +0 -1
@@ -0,0 +1,556 @@
1
+ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, EventEmitter, HostListener, Input, Output, ViewChild, inject, } from '@angular/core';
2
+ import { MJButtonDirective } from '@memberjunction/ng-ui-components';
3
+ import { UUIDsEqual } from '@memberjunction/global';
4
+ import { AIEngineBase } from '@memberjunction/ai-engine-base';
5
+ import { BaseAngularComponent } from '@memberjunction/ng-base-types';
6
+ import { REALTIME_ADVANCED_SESSION_CONTROLS, UserHoldsAuthorization } from '../../services/user-authorization';
7
+ import { BuildRealtimeModelOptions, ConstrainTargetsToPairings, DefaultPairedTargetId, LoadCoAgentPairings, } from '../../services/realtime-pairing';
8
+ import * as i0 from "@angular/core";
9
+ const _c0 = ["searchInput"];
10
+ const _forTrack0 = ($index, $item) => $item.ID;
11
+ function RealtimeAgentPickerComponent_Conditional_5_For_10_Template(rf, ctx) { if (rf & 1) {
12
+ i0.ɵɵelementStart(0, "option", 20);
13
+ i0.ɵɵtext(1);
14
+ i0.ɵɵelementEnd();
15
+ } if (rf & 2) {
16
+ const coAgent_r5 = ctx.$implicit;
17
+ i0.ɵɵproperty("value", coAgent_r5.ID);
18
+ i0.ɵɵadvance();
19
+ i0.ɵɵtextInterpolate(coAgent_r5.Name);
20
+ } }
21
+ function RealtimeAgentPickerComponent_Conditional_5_Template(rf, ctx) { if (rf & 1) {
22
+ const _r2 = i0.ɵɵgetCurrentView();
23
+ i0.ɵɵelementStart(0, "div", 6)(1, "label", 16);
24
+ i0.ɵɵelement(2, "i", 17);
25
+ i0.ɵɵelementStart(3, "span");
26
+ i0.ɵɵtext(4, "Co-agent");
27
+ i0.ɵɵelementEnd()();
28
+ i0.ɵɵelementStart(5, "select", 18, 1);
29
+ 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)); });
30
+ i0.ɵɵelementStart(7, "option", 19);
31
+ i0.ɵɵtext(8, "Auto (recommended)");
32
+ i0.ɵɵelementEnd();
33
+ i0.ɵɵrepeaterCreate(9, RealtimeAgentPickerComponent_Conditional_5_For_10_Template, 2, 2, "option", 20, _forTrack0);
34
+ i0.ɵɵelementEnd()();
35
+ } if (rf & 2) {
36
+ const ctx_r3 = i0.ɵɵnextContext();
37
+ i0.ɵɵadvance(5);
38
+ i0.ɵɵproperty("value", ctx_r3.SelectedCoAgentId ?? "");
39
+ i0.ɵɵadvance(4);
40
+ i0.ɵɵrepeater(ctx_r3.CoAgents);
41
+ } }
42
+ function RealtimeAgentPickerComponent_Conditional_11_Template(rf, ctx) { if (rf & 1) {
43
+ i0.ɵɵelementStart(0, "div", 11);
44
+ i0.ɵɵtext(1);
45
+ i0.ɵɵelementEnd();
46
+ } if (rf & 2) {
47
+ const ctx_r3 = i0.ɵɵnextContext();
48
+ i0.ɵɵadvance();
49
+ i0.ɵɵtextInterpolate(ctx_r3.IsConstrainedByPairings ? "No paired agents available" : "No matching agents");
50
+ } }
51
+ function RealtimeAgentPickerComponent_Conditional_12_For_1_Conditional_4_Template(rf, ctx) { if (rf & 1) {
52
+ i0.ɵɵelementStart(0, "span", 24);
53
+ i0.ɵɵtext(1, "default");
54
+ i0.ɵɵelementEnd();
55
+ } }
56
+ function RealtimeAgentPickerComponent_Conditional_12_For_1_Template(rf, ctx) { if (rf & 1) {
57
+ const _r7 = i0.ɵɵgetCurrentView();
58
+ i0.ɵɵelementStart(0, "button", 22);
59
+ 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)); });
60
+ i0.ɵɵelement(1, "i");
61
+ i0.ɵɵelementStart(2, "span", 23);
62
+ i0.ɵɵtext(3);
63
+ i0.ɵɵelementEnd();
64
+ i0.ɵɵconditionalCreate(4, RealtimeAgentPickerComponent_Conditional_12_For_1_Conditional_4_Template, 2, 0, "span", 24);
65
+ i0.ɵɵelementEnd();
66
+ } if (rf & 2) {
67
+ const agent_r8 = ctx.$implicit;
68
+ const ctx_r3 = i0.ɵɵnextContext(2);
69
+ i0.ɵɵclassProp("mj-voice-picker__item--selected", ctx_r3.IsSelected(agent_r8));
70
+ i0.ɵɵproperty("title", agent_r8.Description || agent_r8.Name);
71
+ i0.ɵɵadvance();
72
+ i0.ɵɵclassMap(ctx_r3.IconClassFor(agent_r8));
73
+ i0.ɵɵadvance(2);
74
+ i0.ɵɵtextInterpolate(agent_r8.Name);
75
+ i0.ɵɵadvance();
76
+ i0.ɵɵconditional(ctx_r3.IsDefaultChoice(agent_r8) ? 4 : -1);
77
+ } }
78
+ function RealtimeAgentPickerComponent_Conditional_12_Template(rf, ctx) { if (rf & 1) {
79
+ i0.ɵɵrepeaterCreate(0, RealtimeAgentPickerComponent_Conditional_12_For_1_Template, 5, 7, "button", 21, _forTrack0);
80
+ } if (rf & 2) {
81
+ const ctx_r3 = i0.ɵɵnextContext();
82
+ i0.ɵɵrepeater(ctx_r3.FilteredAgents);
83
+ } }
84
+ function RealtimeAgentPickerComponent_Conditional_13_For_10_Template(rf, ctx) { if (rf & 1) {
85
+ i0.ɵɵelementStart(0, "option", 20);
86
+ i0.ɵɵtext(1);
87
+ i0.ɵɵelementEnd();
88
+ } if (rf & 2) {
89
+ const model_r11 = ctx.$implicit;
90
+ i0.ɵɵproperty("value", model_r11.ID);
91
+ i0.ɵɵadvance();
92
+ i0.ɵɵtextInterpolate(model_r11.Name);
93
+ } }
94
+ function RealtimeAgentPickerComponent_Conditional_13_Template(rf, ctx) { if (rf & 1) {
95
+ const _r9 = i0.ɵɵgetCurrentView();
96
+ i0.ɵɵelementStart(0, "div", 12)(1, "label", 25);
97
+ i0.ɵɵelement(2, "i", 26);
98
+ i0.ɵɵelementStart(3, "span");
99
+ i0.ɵɵtext(4, "Voice model");
100
+ i0.ɵɵelementEnd()();
101
+ i0.ɵɵelementStart(5, "select", 27, 2);
102
+ 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)); });
103
+ i0.ɵɵelementStart(7, "option", 19);
104
+ i0.ɵɵtext(8, "Auto (recommended)");
105
+ i0.ɵɵelementEnd();
106
+ i0.ɵɵrepeaterCreate(9, RealtimeAgentPickerComponent_Conditional_13_For_10_Template, 2, 2, "option", 20, _forTrack0);
107
+ i0.ɵɵelementEnd()();
108
+ } if (rf & 2) {
109
+ const ctx_r3 = i0.ɵɵnextContext();
110
+ i0.ɵɵadvance(5);
111
+ i0.ɵɵproperty("value", ctx_r3.SelectedModelId ?? "");
112
+ i0.ɵɵadvance(4);
113
+ i0.ɵɵrepeater(ctx_r3.Models);
114
+ } }
115
+ /**
116
+ * Compact anchored popover that lets the user choose WHICH agent a realtime
117
+ * voice call should front — shown by {@link MessageInputComponent} when the
118
+ * phone button is clicked on a conversation with **no prior agent
119
+ * participation** (new / empty conversation), and on demand via the caret
120
+ * button next to the phone (any conversation), where it doubles as the way
121
+ * to pick a specific **co-agent** (the Realtime-type agent that voices the
122
+ * call) and — for authorized users — a specific **voice model**. The plain
123
+ * phone click on an existing conversation keeps its friction-free "call the
124
+ * resolved agent immediately" behavior.
125
+ *
126
+ * Mostly dumb: the host supplies the agent list (the same cached set the
127
+ * @mention autocomplete / routing logic uses), the Realtime-type co-agent
128
+ * candidates (filtered from that same set), and the defaults to preselect;
129
+ * the picker emits the user's choice. The data it loads itself:
130
+ * - the compact "Voice model" option list (active Realtime models via a
131
+ * narrow RunView) — loaded and rendered ONLY when the current user holds
132
+ * the `Realtime: Advanced Session Controls` authorization (pure UX
133
+ * disclosure; the server enforces the authorization on the mint), and
134
+ * - the chosen co-agent's pairing rows (`MJ: AI Agent Co Agents`, Active 'CoAgent'-type rows): a
135
+ * co-agent with pairing rows may only front its paired targets, so the
136
+ * agent list constrains to those rows (Sequence order) with the IsDefault
137
+ * row preselected; a co-agent with zero rows is universal and the list is
138
+ * untouched.
139
+ *
140
+ * It does NOT persist anything (the host persists the co-agent preference
141
+ * via `UserInfoEngine`; `mj-conversation-agent-picker` pins
142
+ * `MJConversationEntity.DefaultAgentID` — different jobs, which is why this
143
+ * is a separate component).
144
+ *
145
+ * Anchors itself bottom-right above the composer — the host's
146
+ * `.message-input-wrapper` is `position: relative`.
147
+ */
148
+ export class RealtimeAgentPickerComponent extends BaseAngularComponent {
149
+ /** Agents the user can call — same cached set the @mention / routing logic uses. */
150
+ Agents = [];
151
+ /** The agent the default resolution would pick — preselected and listed first. */
152
+ DefaultAgentId = null;
153
+ /**
154
+ * The ACTIVE Realtime-type co-agent candidates the user can run (host-filtered from
155
+ * the same cached, run-permission-filtered agent set as {@link Agents}). The co-agent
156
+ * selector renders only when MORE THAN ONE candidate exists — with zero or one
157
+ * there's nothing meaningful to choose and the server's resolution chain applies.
158
+ */
159
+ CoAgents = [];
160
+ /**
161
+ * The user's persisted co-agent preference (host-loaded via `UserInfoEngine`) —
162
+ * preselected in the co-agent selector when it's still a valid candidate.
163
+ */
164
+ DefaultCoAgentId = null;
165
+ /** Emitted with the chosen agent + optional explicit voice model / co-agent when the user confirms. */
166
+ AgentPicked = new EventEmitter();
167
+ /** Emitted when the user dismisses without starting a call. */
168
+ Cancelled = new EventEmitter();
169
+ searchInput;
170
+ SearchText = '';
171
+ SelectedAgentId = null;
172
+ /** Active Realtime models the model selector offers (loaded only for authorized users). */
173
+ Models = [];
174
+ /** The explicitly chosen voice model id, or `null` for "Auto (recommended)" (the default). */
175
+ SelectedModelId = null;
176
+ /** The explicitly chosen co-agent id, or `null` for "Auto (recommended)" (the server's chain). */
177
+ SelectedCoAgentId = null;
178
+ /**
179
+ * Whether the current user holds the `Realtime: Advanced Session Controls`
180
+ * authorization. Gates the voice-model selector (and any future config-override
181
+ * controls) — pure disclosure; the server enforces the authorization on the mint.
182
+ */
183
+ CanOverrideSessionConfig = false;
184
+ /** The selected co-agent's pairing rows; empty = universal co-agent (no constraint). */
185
+ Pairings = [];
186
+ // Template helper — expose the shared UUID comparator to the view.
187
+ UUIDsEqual = UUIDsEqual;
188
+ cdr = inject(ChangeDetectorRef);
189
+ elementRef = inject(ElementRef);
190
+ /** Monotonic guard so a stale pairing load can't clobber a newer co-agent choice. */
191
+ pairingLoadToken = 0;
192
+ /** Co-agent selector visibility: only when there is a real choice to make. */
193
+ get ShowCoAgentSelect() {
194
+ return this.CoAgents.length > 1;
195
+ }
196
+ /** True while the agent list is constrained to the selected co-agent's paired targets. */
197
+ get IsConstrainedByPairings() {
198
+ return this.Pairings.length > 0;
199
+ }
200
+ ngOnInit() {
201
+ const initial = this.DefaultAgentId && this.findAgent(this.DefaultAgentId)
202
+ ? this.DefaultAgentId
203
+ : this.FilteredAgents[0]?.ID ?? null;
204
+ this.SelectedAgentId = initial;
205
+ this.CanOverrideSessionConfig = UserHoldsAuthorization(this.ProviderToUse?.CurrentUser, REALTIME_ADVANCED_SESSION_CONTROLS, this.ProviderToUse);
206
+ if (this.CanOverrideSessionConfig) {
207
+ void this.loadVoiceModels();
208
+ }
209
+ // Preselect the persisted co-agent preference when it's still a valid candidate.
210
+ if (this.DefaultCoAgentId && this.CoAgents.some(a => UUIDsEqual(a.ID, this.DefaultCoAgentId))) {
211
+ this.SelectedCoAgentId = this.DefaultCoAgentId;
212
+ void this.reloadPairings();
213
+ }
214
+ }
215
+ /**
216
+ * Loads the "Voice model" options: active models whose type is `Realtime`, filtered from
217
+ * {@link AIEngineBase}'s already-cached `Models` (provider-scoped engine instance, lazy
218
+ * `Config` — no RunView round-trip). Called ONLY for users who hold the
219
+ * advanced-session-controls authorization. Tolerant — a failure simply leaves
220
+ * the selector hidden (the server's automatic selection still applies).
221
+ */
222
+ async loadVoiceModels() {
223
+ try {
224
+ const engine = AIEngineBase.GetProviderInstance(this.ProviderToUse, AIEngineBase);
225
+ await engine.Config(false, undefined, this.ProviderToUse);
226
+ this.Models = BuildRealtimeModelOptions(engine.Models ?? []);
227
+ }
228
+ catch (error) {
229
+ console.error('[RealtimeAgentPicker] Failed to load realtime models:', error);
230
+ this.Models = [];
231
+ }
232
+ this.cdr.markForCheck();
233
+ }
234
+ /** Records the voice-model choice (`''` = Auto → `null`). */
235
+ OnModelChange(value) {
236
+ this.SelectedModelId = value && value.length > 0 ? value : null;
237
+ this.cdr.markForCheck();
238
+ }
239
+ /** Records the co-agent choice (`''` = Auto → `null`) and refreshes the pairing constraint. */
240
+ OnCoAgentChange(value) {
241
+ this.SelectedCoAgentId = value && value.length > 0 ? value : null;
242
+ void this.reloadPairings();
243
+ }
244
+ /**
245
+ * Loads the selected co-agent's pairing rows and re-applies the target constraint:
246
+ * with rows present, the agent list narrows to the paired targets (Sequence order)
247
+ * and the IsDefault row's target is preselected; with zero rows (or Auto co-agent)
248
+ * the list returns to the unconstrained default. Guarded against stale loads when
249
+ * the user changes co-agents quickly.
250
+ */
251
+ async reloadPairings() {
252
+ const token = ++this.pairingLoadToken;
253
+ const coAgentId = this.SelectedCoAgentId;
254
+ const pairings = coAgentId ? await LoadCoAgentPairings(this.ProviderToUse, coAgentId) : [];
255
+ if (token !== this.pairingLoadToken) {
256
+ return; // a newer co-agent choice superseded this load
257
+ }
258
+ this.Pairings = pairings;
259
+ this.ensureSelectionVisible();
260
+ this.cdr.markForCheck();
261
+ }
262
+ /**
263
+ * Keeps the target selection coherent after the visible list changes: prefers the
264
+ * pairing default (when constrained), then the host default, then keeps the current
265
+ * selection when still visible, then the first visible row.
266
+ */
267
+ ensureSelectionVisible() {
268
+ const visible = this.FilteredAgents;
269
+ if (this.IsConstrainedByPairings) {
270
+ const pairedDefault = DefaultPairedTargetId(this.Pairings);
271
+ if (pairedDefault && visible.some(a => UUIDsEqual(a.ID, pairedDefault))) {
272
+ this.SelectedAgentId = pairedDefault;
273
+ return;
274
+ }
275
+ }
276
+ if (this.SelectedAgentId && visible.some(a => UUIDsEqual(a.ID, this.SelectedAgentId))) {
277
+ return; // current selection still valid
278
+ }
279
+ if (this.DefaultAgentId && visible.some(a => UUIDsEqual(a.ID, this.DefaultAgentId))) {
280
+ this.SelectedAgentId = this.DefaultAgentId;
281
+ return;
282
+ }
283
+ this.SelectedAgentId = visible[0]?.ID ?? null;
284
+ }
285
+ ngAfterViewInit() {
286
+ // Microtask so focus lands after the popover renders without
287
+ // triggering ExpressionChangedAfterItHasBeenChecked.
288
+ Promise.resolve().then(() => this.searchInput?.nativeElement.focus());
289
+ }
290
+ /**
291
+ * The visible target list: pairing-constrained first (a co-agent WITH pairing rows may
292
+ * only front its paired targets, kept in pairing Sequence order), then search-filtered.
293
+ * Unconstrained lists keep the default-first + alphabetical ordering.
294
+ */
295
+ get FilteredAgents() {
296
+ const base = ConstrainTargetsToPairings(this.Agents, this.Pairings);
297
+ const needle = this.SearchText.trim().toLowerCase();
298
+ const filtered = base.filter(a => !needle || (a.Name ?? '').toLowerCase().includes(needle));
299
+ if (this.IsConstrainedByPairings) {
300
+ return filtered; // pairing Sequence order is the canonical order
301
+ }
302
+ return filtered.sort((a, b) => {
303
+ const aDefault = this.isDefault(a) ? 0 : 1;
304
+ const bDefault = this.isDefault(b) ? 0 : 1;
305
+ if (aDefault !== bDefault)
306
+ return aDefault - bDefault;
307
+ return (a.Name ?? '').localeCompare(b.Name ?? '');
308
+ });
309
+ }
310
+ get SelectedAgent() {
311
+ return this.SelectedAgentId ? this.findAgent(this.SelectedAgentId) : null;
312
+ }
313
+ IsSelected(agent) {
314
+ return !!this.SelectedAgentId && UUIDsEqual(agent.ID, this.SelectedAgentId);
315
+ }
316
+ /**
317
+ * Whether `agent` carries the "default" badge: under a pairing constraint that's the
318
+ * co-agent's IsDefault target; otherwise the host-resolved default agent.
319
+ */
320
+ IsDefaultChoice(agent) {
321
+ if (this.IsConstrainedByPairings) {
322
+ const pairedDefault = DefaultPairedTargetId(this.Pairings);
323
+ return !!pairedDefault && UUIDsEqual(agent.ID, pairedDefault);
324
+ }
325
+ return this.isDefault(agent);
326
+ }
327
+ IconClassFor(agent) {
328
+ return agent.IconClass?.trim() || 'fa-solid fa-robot';
329
+ }
330
+ OnSearchInput(value) {
331
+ this.SearchText = value;
332
+ // Keep the selection on a visible row.
333
+ const visible = this.FilteredAgents;
334
+ if (!visible.some(a => this.IsSelected(a))) {
335
+ this.SelectedAgentId = visible[0]?.ID ?? null;
336
+ }
337
+ this.cdr.markForCheck();
338
+ }
339
+ /** Arrow-key navigation through the filtered list. */
340
+ MoveSelection(delta) {
341
+ const visible = this.FilteredAgents;
342
+ if (visible.length === 0)
343
+ return;
344
+ const currentIndex = visible.findIndex(a => this.IsSelected(a));
345
+ const nextIndex = currentIndex < 0
346
+ ? 0
347
+ : Math.min(visible.length - 1, Math.max(0, currentIndex + delta));
348
+ this.SelectedAgentId = visible[nextIndex].ID;
349
+ this.cdr.markForCheck();
350
+ }
351
+ Select(agent) {
352
+ this.SelectedAgentId = agent.ID;
353
+ this.cdr.markForCheck();
354
+ }
355
+ /** Confirm a specific agent immediately (double-click shortcut). */
356
+ Pick(agent) {
357
+ this.AgentPicked.emit(this.buildPick(agent));
358
+ }
359
+ StartCall() {
360
+ const agent = this.SelectedAgent;
361
+ if (agent) {
362
+ this.AgentPicked.emit(this.buildPick(agent));
363
+ }
364
+ }
365
+ Cancel() {
366
+ this.Cancelled.emit();
367
+ }
368
+ /** Dismiss when the user clicks anywhere outside the popover. (The phone
369
+ * button that opens it stops propagation, so the opening click never
370
+ * reaches this handler.) */
371
+ OnDocumentClick(event) {
372
+ if (!this.elementRef.nativeElement.contains(event.target)) {
373
+ this.Cancelled.emit();
374
+ }
375
+ }
376
+ OnEscape() {
377
+ this.Cancelled.emit();
378
+ }
379
+ /**
380
+ * Assembles the emitted pick. The model preference is hard-gated on the
381
+ * authorization here (defense in depth — unauthorized users never see the selector,
382
+ * so `SelectedModelId` should already be null).
383
+ */
384
+ buildPick(agent) {
385
+ return {
386
+ Agent: agent,
387
+ PreferredModelId: this.CanOverrideSessionConfig ? this.SelectedModelId : null,
388
+ CoAgentId: this.SelectedCoAgentId
389
+ };
390
+ }
391
+ isDefault(agent) {
392
+ return !!this.DefaultAgentId && UUIDsEqual(agent.ID, this.DefaultAgentId);
393
+ }
394
+ findAgent(id) {
395
+ return this.Agents.find(a => UUIDsEqual(a.ID, id)) ?? null;
396
+ }
397
+ static ɵfac = /*@__PURE__*/ (() => { let ɵRealtimeAgentPickerComponent_BaseFactory; return function RealtimeAgentPickerComponent_Factory(__ngFactoryType__) { return (ɵRealtimeAgentPickerComponent_BaseFactory || (ɵRealtimeAgentPickerComponent_BaseFactory = i0.ɵɵgetInheritedFactory(RealtimeAgentPickerComponent)))(__ngFactoryType__ || RealtimeAgentPickerComponent); }; })();
398
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: RealtimeAgentPickerComponent, selectors: [["mj-realtime-agent-picker"]], viewQuery: function RealtimeAgentPickerComponent_Query(rf, ctx) { if (rf & 1) {
399
+ i0.ɵɵviewQuery(_c0, 5);
400
+ } if (rf & 2) {
401
+ let _t;
402
+ i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.searchInput = _t.first);
403
+ } }, hostBindings: function RealtimeAgentPickerComponent_HostBindings(rf, ctx) { if (rf & 1) {
404
+ 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);
405
+ } }, 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", ""], [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__select-row", "mj-voice-picker__select-row--model"], [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"], ["for", "mjVoiceModelSelect", 1, "mj-voice-picker__select-label"], [1, "fa-solid", "fa-microchip"], ["id", "mjVoiceModelSelect", 1, "mj-voice-picker__select", 3, "change", "value"]], template: function RealtimeAgentPickerComponent_Template(rf, ctx) { if (rf & 1) {
406
+ const _r1 = i0.ɵɵgetCurrentView();
407
+ i0.ɵɵelementStart(0, "div", 3);
408
+ i0.ɵɵlistener("click", function RealtimeAgentPickerComponent_Template_div_click_0_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView($event.stopPropagation()); });
409
+ i0.ɵɵelementStart(1, "div", 4);
410
+ i0.ɵɵelement(2, "i", 5);
411
+ i0.ɵɵelementStart(3, "span");
412
+ i0.ɵɵtext(4, "Start a voice call with\u2026");
413
+ i0.ɵɵelementEnd()();
414
+ i0.ɵɵconditionalCreate(5, RealtimeAgentPickerComponent_Conditional_5_Template, 11, 1, "div", 6);
415
+ i0.ɵɵelementStart(6, "div", 7);
416
+ i0.ɵɵelement(7, "i", 8);
417
+ i0.ɵɵelementStart(8, "input", 9, 0);
418
+ i0.ɵɵlistener("input", function RealtimeAgentPickerComponent_Template_input_input_8_listener() { i0.ɵɵrestoreView(_r1); const searchInput_r6 = i0.ɵɵreference(9); return i0.ɵɵresetView(ctx.OnSearchInput(searchInput_r6.value)); })("keydown.enter", function RealtimeAgentPickerComponent_Template_input_keydown_enter_8_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.StartCall()); })("keydown.arrowdown", function RealtimeAgentPickerComponent_Template_input_keydown_arrowdown_8_listener($event) { i0.ɵɵrestoreView(_r1); ctx.MoveSelection(1); return i0.ɵɵresetView($event.preventDefault()); })("keydown.arrowup", function RealtimeAgentPickerComponent_Template_input_keydown_arrowup_8_listener($event) { i0.ɵɵrestoreView(_r1); ctx.MoveSelection(-1); return i0.ɵɵresetView($event.preventDefault()); });
419
+ i0.ɵɵelementEnd()();
420
+ i0.ɵɵelementStart(10, "div", 10);
421
+ i0.ɵɵconditionalCreate(11, RealtimeAgentPickerComponent_Conditional_11_Template, 2, 1, "div", 11)(12, RealtimeAgentPickerComponent_Conditional_12_Template, 2, 0);
422
+ i0.ɵɵelementEnd();
423
+ i0.ɵɵconditionalCreate(13, RealtimeAgentPickerComponent_Conditional_13_Template, 11, 1, "div", 12);
424
+ i0.ɵɵelementStart(14, "div", 13)(15, "button", 14);
425
+ i0.ɵɵlistener("click", function RealtimeAgentPickerComponent_Template_button_click_15_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.StartCall()); });
426
+ i0.ɵɵelement(16, "i", 5);
427
+ i0.ɵɵtext(17, " Start ");
428
+ i0.ɵɵelementEnd();
429
+ i0.ɵɵelementStart(18, "button", 15);
430
+ i0.ɵɵlistener("click", function RealtimeAgentPickerComponent_Template_button_click_18_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.Cancel()); });
431
+ i0.ɵɵtext(19, "Cancel");
432
+ i0.ɵɵelementEnd()()();
433
+ } if (rf & 2) {
434
+ i0.ɵɵadvance(5);
435
+ i0.ɵɵconditional(ctx.ShowCoAgentSelect ? 5 : -1);
436
+ i0.ɵɵadvance(3);
437
+ i0.ɵɵproperty("value", ctx.SearchText);
438
+ i0.ɵɵadvance(3);
439
+ i0.ɵɵconditional(ctx.FilteredAgents.length === 0 ? 11 : 12);
440
+ i0.ɵɵadvance(2);
441
+ i0.ɵɵconditional(ctx.CanOverrideSessionConfig && ctx.Models.length > 0 ? 13 : -1);
442
+ i0.ɵɵadvance(2);
443
+ i0.ɵɵproperty("disabled", !ctx.SelectedAgent);
444
+ } }, 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 });
445
+ }
446
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(RealtimeAgentPickerComponent, [{
447
+ type: Component,
448
+ args: [{ standalone: true, selector: 'mj-realtime-agent-picker', imports: [MJButtonDirective], changeDetection: ChangeDetectionStrategy.OnPush, template: `
449
+ <div class="mj-voice-picker" (click)="$event.stopPropagation()">
450
+ <div class="mj-voice-picker__header">
451
+ <i class="fa-solid fa-phone"></i>
452
+ <span>Start a voice call with…</span>
453
+ </div>
454
+ @if (ShowCoAgentSelect) {
455
+ <div class="mj-voice-picker__select-row">
456
+ <label class="mj-voice-picker__select-label" for="mjVoiceCoAgentSelect">
457
+ <i class="fa-solid fa-headset"></i>
458
+ <span>Co-agent</span>
459
+ </label>
460
+ <select
461
+ #coAgentSelect
462
+ id="mjVoiceCoAgentSelect"
463
+ class="mj-voice-picker__select"
464
+ [value]="SelectedCoAgentId ?? ''"
465
+ (change)="OnCoAgentChange(coAgentSelect.value)">
466
+ <option value="">Auto (recommended)</option>
467
+ @for (coAgent of CoAgents; track coAgent.ID) {
468
+ <option [value]="coAgent.ID">{{ coAgent.Name }}</option>
469
+ }
470
+ </select>
471
+ </div>
472
+ }
473
+ <div class="mj-voice-picker__search">
474
+ <i class="fa-solid fa-magnifying-glass"></i>
475
+ <input
476
+ #searchInput
477
+ type="text"
478
+ placeholder="Search agents"
479
+ [value]="SearchText"
480
+ (input)="OnSearchInput(searchInput.value)"
481
+ (keydown.enter)="StartCall()"
482
+ (keydown.arrowdown)="MoveSelection(1); $event.preventDefault()"
483
+ (keydown.arrowup)="MoveSelection(-1); $event.preventDefault()" />
484
+ </div>
485
+ <div class="mj-voice-picker__list">
486
+ @if (FilteredAgents.length === 0) {
487
+ <div class="mj-voice-picker__empty">{{ IsConstrainedByPairings ? 'No paired agents available' : 'No matching agents' }}</div>
488
+ } @else {
489
+ @for (agent of FilteredAgents; track agent.ID) {
490
+ <button
491
+ type="button"
492
+ class="mj-voice-picker__item"
493
+ [class.mj-voice-picker__item--selected]="IsSelected(agent)"
494
+ [title]="agent.Description || agent.Name"
495
+ (click)="Select(agent)"
496
+ (dblclick)="Pick(agent)">
497
+ <i [class]="IconClassFor(agent)"></i>
498
+ <span class="mj-voice-picker__item-name">{{ agent.Name }}</span>
499
+ @if (IsDefaultChoice(agent)) {
500
+ <span class="mj-voice-picker__default-badge">default</span>
501
+ }
502
+ </button>
503
+ }
504
+ }
505
+ </div>
506
+ @if (CanOverrideSessionConfig && Models.length > 0) {
507
+ <div class="mj-voice-picker__select-row mj-voice-picker__select-row--model">
508
+ <label class="mj-voice-picker__select-label" for="mjVoiceModelSelect">
509
+ <i class="fa-solid fa-microchip"></i>
510
+ <span>Voice model</span>
511
+ </label>
512
+ <select
513
+ #modelSelect
514
+ id="mjVoiceModelSelect"
515
+ class="mj-voice-picker__select"
516
+ [value]="SelectedModelId ?? ''"
517
+ (change)="OnModelChange(modelSelect.value)">
518
+ <option value="">Auto (recommended)</option>
519
+ @for (model of Models; track model.ID) {
520
+ <option [value]="model.ID">{{ model.Name }}</option>
521
+ }
522
+ </select>
523
+ </div>
524
+ }
525
+ <div class="mj-voice-picker__footer">
526
+ <button mjButton variant="primary" size="sm" [disabled]="!SelectedAgent" (click)="StartCall()">
527
+ <i class="fa-solid fa-phone"></i> Start
528
+ </button>
529
+ <button mjButton variant="outline" size="sm" (click)="Cancel()">Cancel</button>
530
+ </div>
531
+ </div>
532
+ `, 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 "] }]
533
+ }], null, { Agents: [{
534
+ type: Input
535
+ }], DefaultAgentId: [{
536
+ type: Input
537
+ }], CoAgents: [{
538
+ type: Input
539
+ }], DefaultCoAgentId: [{
540
+ type: Input
541
+ }], AgentPicked: [{
542
+ type: Output
543
+ }], Cancelled: [{
544
+ type: Output
545
+ }], searchInput: [{
546
+ type: ViewChild,
547
+ args: ['searchInput']
548
+ }], OnDocumentClick: [{
549
+ type: HostListener,
550
+ args: ['document:click', ['$event']]
551
+ }], OnEscape: [{
552
+ type: HostListener,
553
+ args: ['document:keydown.escape']
554
+ }] }); })();
555
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(RealtimeAgentPickerComponent, { className: "RealtimeAgentPickerComponent", filePath: "src/lib/components/realtime/realtime-agent-picker.component.ts", lineNumber: 272 }); })();
556
+ //# sourceMappingURL=realtime-agent-picker.component.js.map