@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-surface-tabs.component.js","sourceRoot":"","sources":["../../../../src/lib/components/realtime/realtime-surface-tabs.component.ts","../../../../src/lib/components/realtime/realtime-surface-tabs.component.html"],"names":[],"mappings":"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","sourcesContent":["import {\n Component, EventEmitter, Input, Output, OnInit, OnDestroy, ChangeDetectorRef, inject\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { Subscription } from 'rxjs';\nimport { UserInfo } from '@memberjunction/core';\nimport { UserInfoEngine } from '@memberjunction/core-entities';\nimport { ArtifactsModule } from '@memberjunction/ng-artifacts';\nimport { RealtimeSessionState } from './realtime-session-state';\nimport { RealtimeActivityRailComponent } from './realtime-activity-rail.component';\nimport { RealtimeChannelPaneComponent } from './channels/realtime-channel-pane.component';\nimport { ChannelOnboardingPanelComponent } from './channels/channel-onboarding-panel.component';\nimport { ChannelOnboardingDetails } from './channels/base-realtime-channel-client';\nimport {\n RealtimeSurfaceTabsModel, RealtimeSurfaceTab, RealtimeChannelTabRegistration\n} from './realtime-surface-tabs.model';\nimport { ParsedDelegationArtifact } from '../../services/delegation-result-parser';\n\n/**\n * User-settings key (NOT localStorage — see `UserInfoEngine`) under which the per-user \"which\n * channel intros have been seen\" map is persisted: a JSON object of `{ [channelName]: true }`,\n * so the first-run onboarding for each interactive channel shows exactly once per user and\n * follows them across devices.\n */\nconst CHANNEL_ONBOARDING_SEEN_SETTING_KEY = 'mj.realtimeChannels.onboardingSeen.v1';\n\n/**\n * The call overlay's TABBED SURFACE PANEL (the right panel) — per the approved\n * `plans/realtime/mockups/whiteboard.html` mockup:\n *\n * - **Activity** — always the first tab; hosts the existing\n * {@link RealtimeActivityRailComponent} unchanged (in `Embedded` mode, since this panel\n * owns the chrome + collapse).\n * - **One tab per artifact** produced by delegated runs: when a delegation result carries\n * artifacts, a tab is auto-opened, FOCUSED, and briefly flashed violet. The pane reuses\n * the standard `mj-artifact-viewer-panel` (read-only embed: no header/tabs/actions),\n * loading by ArtifactID — the latest version, i.e. the one the run just produced.\n * - **Channel tabs** — rendered ONLY once a channel registers via\n * {@link RegisterChannelTab}. The overlay shell registers one per registry-resolved\n * {@link BaseRealtimeChannelClient} plugin; the pane creates the plugin's surface\n * component dynamically (via `mj-realtime-channel-pane`). Until a registration supplies\n * a plugin (or legacy template), the pane shows the \"coming online…\" placeholder;\n * re-registering the same key swaps the real surface in.\n *\n * Panes are kept ALIVE while hidden (CSS `display:none`, mirroring the mockup's\n * `.s-pane.active`) so switching tabs never reloads an artifact or resets the rail.\n * The whole panel collapses to a slim strip via the chevron at the tab strip's end —\n * the collapse-to-strip behavior that used to live on the rail, lifted to the panel.\n *\n * SIZING IS EXTERNAL: the overlay shell hosts this panel in a fixed-width flex item\n * and owns the width (user drag via the resize handle + persisted preference +\n * default tiers). This panel just fills it and REPORTS the layout signals the shell sizes from:\n * {@link CollapsedChange} (slim-strip toggle) and {@link WideChanged} (a content tab\n * is focused → the default width tier widens).\n */\n@Component({\n standalone: true,\n selector: 'mj-realtime-surface-tabs',\n imports: [\n CommonModule, ArtifactsModule, RealtimeActivityRailComponent, RealtimeChannelPaneComponent,\n ChannelOnboardingPanelComponent\n ],\n templateUrl: './realtime-surface-tabs.component.html',\n styleUrl: './realtime-surface-tabs.component.css'\n})\nexport class RealtimeSurfaceTabsComponent implements OnInit, OnDestroy {\n /** How long a just-arrived tab keeps its violet flash highlight. */\n private static readonly FlashDurationMs = 1400;\n\n /** Shared live-session state, owned by the overlay shell (feeds the Activity rail). */\n @Input({ required: true }) State!: RealtimeSessionState;\n\n /** Whether developer affordances (\"Open run\" links) are revealed (gear-gated). */\n @Input() DevMode = false;\n\n /**\n * FILL presentation: the panel stretches to the overlay's full width (the board-focus\n * layout, where the main call column is hidden and a channel surface owns the screen).\n * Bound by the overlay shell; overrides the normal / wide width tiers.\n */\n @Input() Fill = false;\n\n /** The signed-in user, threaded to the artifact viewer panel. */\n @Input() CurrentUser: UserInfo | null = null;\n\n /** The active environment id, threaded to the artifact viewer panel. */\n @Input() EnvironmentID = '';\n\n /** Re-emitted from the Activity rail's dev \"Open run\" links. */\n @Output() OpenRunRequested = new EventEmitter<string>();\n\n /**\n * Emitted when the panel toggles between expanded and the slim collapsed strip —\n * the overlay shell resizes this panel's split area to the strip width.\n */\n @Output() CollapsedChange = new EventEmitter<boolean>();\n\n /**\n * Emitted when {@link IsWide} flips (a content tab gained / lost focus) — the\n * overlay shell widens the panel's DEFAULT split-area size while wide (only when\n * the user has never dragged an explicit width).\n */\n @Output() WideChanged = new EventEmitter<boolean>();\n\n /** The panel's tab state (add / focus / dedupe / flash) — see the model for the rules. */\n public readonly Model = new RealtimeSurfaceTabsModel();\n\n /** Whether the panel is collapsed to its slim strip. */\n public Collapsed = false;\n\n /** Artifact version ids already turned into tabs (guards the State rescan). */\n private tabbedVersionIds = new Set<string>();\n private flashTimer: ReturnType<typeof setTimeout> | null = null;\n private subs: Subscription[] = [];\n private lastWide = false;\n private cdr = inject(ChangeDetectorRef);\n\n /**\n * The channel whose first-run intro is currently being shown (its `ChannelName`), or `null`\n * when no intro is up. Set when the user opens a channel tab they've never seen the intro\n * for; cleared on dismiss. Only one intro shows at a time (the active channel's).\n */\n private onboardingChannelName: string | null = null;\n /** The intro content for {@link onboardingChannelName}, mirrored for the template binding. */\n public OnboardingContent: ChannelOnboardingDetails | null = null;\n\n /** The currently focused tab. */\n public get ActiveTab(): RealtimeSurfaceTab {\n return this.Model.ActiveTab;\n }\n\n /** Wide presentation when a content tab (artifact / channel) is focused. */\n public get IsWide(): boolean {\n return !this.Collapsed && this.ActiveTab.Kind !== 'activity';\n }\n\n ngOnInit(): void {\n this.subs.push(\n this.State.Changed$.subscribe(() => this.onStateChanged()),\n this.Model.Changed$.subscribe(() => this.onModelChanged())\n );\n this.syncArtifactTabs();\n }\n\n ngOnDestroy(): void {\n for (const s of this.subs) {\n s.unsubscribe();\n }\n this.subs = [];\n if (this.flashTimer) {\n clearTimeout(this.flashTimer);\n this.flashTimer = null;\n }\n }\n\n /** Toggle the panel between expanded and slim-collapsed. */\n public ToggleCollapsed(): void {\n this.setCollapsed(!this.Collapsed);\n }\n\n /** Collapse-state transitions funnel through here so the shell always hears about them. */\n private setCollapsed(value: boolean): void {\n if (this.Collapsed !== value) {\n this.Collapsed = value;\n this.CollapsedChange.emit(value);\n this.syncWide();\n }\n }\n\n /** Emits {@link WideChanged} when the wide tier flips (content tab focus / collapse). */\n private syncWide(): void {\n const wide = this.IsWide;\n if (wide !== this.lastWide) {\n this.lastWide = wide;\n this.WideChanged.emit(wide);\n }\n }\n\n /** track fn for the @for over tabs. */\n public TrackTab(index: number, tab: RealtimeSurfaceTab): string {\n return tab.Key;\n }\n\n /**\n * Focuses (opening if needed) the tab for an artifact — the \"View →\" affordance target\n * on done delegation cards and rail entries. Expands the panel if it was collapsed.\n */\n public FocusArtifact(artifact: ParsedDelegationArtifact): void {\n this.tabbedVersionIds.add(artifact.ArtifactVersionID);\n this.Model.OpenArtifactTab(artifact, true);\n this.setCollapsed(false);\n this.cdr.markForCheck();\n }\n\n /**\n * Registers (or updates) an interactive-channel tab — one per registry-resolved channel\n * plugin, forwarded from `RealtimeSessionOverlayComponent.RegisterChannelTab`.\n */\n public RegisterChannelTab(registration: RealtimeChannelTabRegistration): void {\n // Microtask defer: the overlay forwards this while handling agent/channel activity, which can\n // land mid change-detection. Adding a tab to Model.Tabs synchronously then trips NG0100 on the\n // tab-strip bindings (s-tab--active). A microtask lands the mutation in a fresh CD turn —\n // imperceptible for an async reveal, and ordered with any follow-on RevealChannel.\n Promise.resolve().then(() => {\n this.Model.RegisterChannelTab(registration);\n this.cdr.markForCheck();\n });\n }\n\n /**\n * AUTO-REVEALS a channel surface the moment the agent first acts on it: expands the\n * panel if collapsed, focuses the channel's tab and flashes it violet — so the user\n * discovers the whiteboard (or any channel) exists the instant it comes alive,\n * instead of having to find the tab themselves. No-op for unknown keys.\n */\n public RevealChannel(key: string): void {\n // Microtask defer (same NG0100 reason as RegisterChannelTab): the agent-activity reveal mutates\n // ActiveKey/FlashKey, which feed the tab-strip class bindings; doing it mid-CD trips the\n // ExpressionChanged check. Deferring lands it in a fresh CD turn and stays ordered after any\n // RegisterChannelTab queued just before it.\n Promise.resolve().then(() => {\n this.setCollapsed(false);\n this.Model.Focus(key);\n this.Model.FlashTab(key);\n this.cdr.markForCheck();\n });\n }\n\n /**\n * Removes a tab from the panel (Activity is irremovable; focus falls back to Activity —\n * see {@link RealtimeSurfaceTabsModel.RemoveTab}). Used by the overlay shell on a\n * review→live continuation whose live channel set resolved WITHOUT the channel a stale\n * review tab represents (e.g. no Whiteboard channel → drop the read-only review board tab).\n *\n * @returns `true` when a tab was removed.\n */\n public RemoveTab(key: string): boolean {\n const removed = this.Model.RemoveTab(key);\n if (removed) {\n this.cdr.markForCheck();\n }\n return removed;\n }\n\n /**\n * Registers an artifact tab WITHOUT stealing focus (default) — the SESSION REVIEW /\n * resume-carryover path, where a reviewed session's (and its prior legs') history\n * artifacts are surfaced as tabs the user can visit, as opposed to the live\n * auto-open-on-arrival behavior. Idempotent per artifact version; the registered tab\n * survives the review→live transition (tabs are never cleared on resume).\n */\n public RegisterArtifactTab(artifact: ParsedDelegationArtifact, focus: boolean = false): void {\n this.tabbedVersionIds.add(artifact.ArtifactVersionID);\n // History carryover is context, not news — never marked unseen (no glow).\n this.Model.OpenArtifactTab(artifact, focus, false);\n this.cdr.markForCheck();\n }\n\n /** On session-state changes: open tabs for newly-arrived artifacts, then re-render. */\n private onStateChanged(): void {\n this.syncArtifactTabs();\n this.cdr.markForCheck();\n }\n\n /** On model changes: schedule the flash clear, report a wide-tier flip, re-render. */\n private onModelChanged(): void {\n this.scheduleFlashClear();\n this.syncWide();\n this.evaluateOnboarding();\n this.cdr.markForCheck();\n }\n\n /**\n * Decides whether the first-run channel intro should be visible for the ACTIVE tab: shows it\n * the first time the user opens (focuses) a channel tab whose plugin supplies onboarding and\n * which this user hasn't dismissed before. Re-runs on every model change so switching away\n * from a channel tab tears the intro down (only the active channel's intro is ever up).\n */\n private evaluateOnboarding(): void {\n const tab = this.ActiveTab;\n const plugin = tab.Kind === 'channel' ? tab.Data?.Plugin ?? null : null;\n const details = plugin?.GetOnboardingDetails() ?? null;\n if (!plugin || !details || this.HasSeenOnboarding(plugin.ChannelName)) {\n this.onboardingChannelName = null;\n this.OnboardingContent = null;\n return;\n }\n this.onboardingChannelName = plugin.ChannelName;\n this.OnboardingContent = details;\n }\n\n /**\n * Dismisses the current channel intro: marks that channel seen for this user (persisted via\n * `UserInfoEngine`, debounced — NOT localStorage) and hides the panel so it never re-appears.\n */\n public DismissOnboarding(): void {\n const channelName = this.onboardingChannelName;\n this.onboardingChannelName = null;\n this.OnboardingContent = null;\n if (channelName) {\n this.markOnboardingSeen(channelName);\n }\n this.cdr.markForCheck();\n }\n\n /** Reads the per-user seen-map and reports whether this channel's intro has been dismissed. */\n private HasSeenOnboarding(channelName: string): boolean {\n return this.readOnboardingSeen()[channelName] === true;\n }\n\n /** Persists `channelName` into the per-user seen-map (merge + debounced save). */\n private markOnboardingSeen(channelName: string): void {\n const map = this.readOnboardingSeen();\n if (map[channelName] === true) {\n return;\n }\n map[channelName] = true;\n UserInfoEngine.Instance.SetSettingDebounced(CHANNEL_ONBOARDING_SEEN_SETTING_KEY, JSON.stringify(map));\n }\n\n /** Reads + parses the per-user seen-map setting (tolerant: malformed / unset → empty map). */\n private readOnboardingSeen(): Record<string, boolean> {\n const raw = UserInfoEngine.Instance.GetSetting(CHANNEL_ONBOARDING_SEEN_SETTING_KEY);\n if (!raw) {\n return {};\n }\n try {\n const parsed: unknown = JSON.parse(raw);\n return parsed !== null && typeof parsed === 'object' && !Array.isArray(parsed)\n ? (parsed as Record<string, boolean>)\n : {};\n } catch {\n return {};\n }\n }\n\n /**\n * Scans the session's delegation cards for artifacts that don't have a tab yet and\n * adds one per artifact — UNFOCUSED, with the brief violet flash plus the persistent\n * unseen glow. Per product direction a finished artifact never steals the screen\n * (only the agent's first channel activity auto-reveals); the glowing tab is the\n * invitation, the user opens it when they want it.\n */\n private syncArtifactTabs(): void {\n for (const card of this.State.Cards) {\n if (!card.Done || !card.Artifacts) {\n continue;\n }\n for (const artifact of card.Artifacts) {\n if (this.tabbedVersionIds.has(artifact.ArtifactVersionID)) {\n continue;\n }\n this.tabbedVersionIds.add(artifact.ArtifactVersionID);\n this.Model.OpenArtifactTab(artifact, false);\n }\n }\n }\n\n /**\n * Focuses the FIRST tab in the strip — channels lead, so a Details peek lands on the\n * marquee surface (e.g. the Whiteboard) when one exists, else on Activity.\n */\n public FocusFirstTab(): void {\n const first = this.Model.Tabs[0];\n if (first) {\n this.Model.Focus(first.Key);\n this.cdr.markForCheck();\n }\n }\n\n /** Clears the model's flash highlight after a beat (one timer; latest flash wins). */\n private scheduleFlashClear(): void {\n if (this.Model.FlashKey === null) {\n return;\n }\n if (this.flashTimer) {\n clearTimeout(this.flashTimer);\n }\n this.flashTimer = setTimeout(() => {\n this.flashTimer = null;\n this.Model.ClearFlash();\n }, RealtimeSurfaceTabsComponent.FlashDurationMs);\n }\n}\n","<!-- SIZING IS EXTERNAL: the overlay hosts this panel inside a fixed-width flex item and\n owns its width (drag, persistence, default tiers) — the panel just fills it. -->\n<aside class=\"surface\"\n [class.surface--collapsed]=\"Collapsed\"\n [class.surface--fill]=\"Fill && !Collapsed\"\n aria-label=\"Session surfaces\">\n\n @if (Collapsed) {\n <!-- Slim strip: the panel's collapse target (lifted from the old rail behavior) -->\n <div class=\"surface__strip\">\n <button type=\"button\"\n class=\"surface__toggle\"\n (click)=\"ToggleCollapsed()\"\n title=\"Show session panel\"\n aria-expanded=\"false\">\n <i class=\"fa-solid fa-chevron-left\" aria-hidden=\"true\"></i>\n </button>\n <i class=\"fa-solid fa-list-check surface__strip-icon\" aria-hidden=\"true\" title=\"Session activity\"></i>\n </div>\n } @else {\n <!-- Tab strip: Activity | artifact tabs… | channel tabs… -->\n <div class=\"surface-tabs\" role=\"tablist\">\n @for (tab of Model.Tabs; track TrackTab($index, tab)) {\n <button type=\"button\"\n class=\"s-tab\"\n role=\"tab\"\n [class.s-tab--active]=\"tab.Key === Model.ActiveKey\"\n [class.s-tab--flash]=\"tab.Key === Model.FlashKey\"\n [class.s-tab--unseen]=\"Model.IsUnseen(tab.Key)\"\n [attr.aria-selected]=\"tab.Key === Model.ActiveKey\"\n [title]=\"Model.IsUnseen(tab.Key) ? tab.Title + ' (new)' : tab.Title\"\n (click)=\"Model.Focus(tab.Key)\">\n <i [class]=\"tab.Icon\" aria-hidden=\"true\"></i>\n <span class=\"s-tab__title\">{{ tab.Title }}</span>\n @if (Model.IsUnseen(tab.Key)) {\n <span class=\"s-tab__unseen-dot\" aria-hidden=\"true\"></span>\n }\n </button>\n }\n <div class=\"tabs-end\">\n <button type=\"button\"\n class=\"surface__toggle\"\n (click)=\"ToggleCollapsed()\"\n title=\"Hide session panel\"\n aria-expanded=\"true\">\n <i class=\"fa-solid fa-chevron-right\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n\n <!-- Panes: ALL kept alive; only the active one is displayed (mirrors the mockup) -->\n @for (tab of Model.Tabs; track TrackTab($index, tab)) {\n <div class=\"s-pane\" [class.s-pane--active]=\"tab.Key === Model.ActiveKey\" role=\"tabpanel\">\n @switch (tab.Kind) {\n @case ('activity') {\n <mj-realtime-activity-rail\n [State]=\"State\"\n [DevMode]=\"DevMode\"\n [Embedded]=\"true\"\n (OpenRunRequested)=\"OpenRunRequested.emit($event)\"\n (OpenArtifactRequested)=\"FocusArtifact($event)\">\n </mj-realtime-activity-rail>\n }\n @case ('artifact') {\n @if (tab.Data?.Artifact; as artifact) {\n <div class=\"artifact-pane\">\n <mj-artifact-viewer-panel\n [artifactId]=\"artifact.ArtifactID\"\n [currentUser]=\"CurrentUser!\"\n [environmentId]=\"EnvironmentID\"\n [showHeader]=\"false\"\n [showTabs]=\"false\"\n [showSaveToCollection]=\"false\"\n [showCloseButton]=\"false\"\n [showMaximizeButton]=\"false\">\n </mj-artifact-viewer-panel>\n </div>\n }\n }\n @case ('channel') {\n @if (tab.Data?.Plugin; as plugin) {\n <!-- Registry-resolved channel: the pane host creates the plugin's surface\n component dynamically and hands the instance back for binding -->\n <mj-realtime-channel-pane [Plugin]=\"plugin\"></mj-realtime-channel-pane>\n <!-- First-run intro: overlaid over the active channel pane the first time this user\n opens it; the pane host renders display:none + a sibling surface, so the overlay\n sits here (inside the positioned .s-pane) rather than inside the pane host. -->\n @if (tab.Key === Model.ActiveKey && OnboardingContent) {\n <mj-channel-onboarding-panel\n [Content]=\"OnboardingContent\"\n (Dismissed)=\"DismissOnboarding()\">\n </mj-channel-onboarding-panel>\n }\n } @else if (tab.Data?.Content; as content) {\n <ng-container [ngTemplateOutlet]=\"content\"></ng-container>\n } @else {\n <!-- Placeholder until the channel registration supplies a plugin / template -->\n <div class=\"channel-placeholder\" role=\"status\">\n <i class=\"fa-solid fa-chalkboard\" aria-hidden=\"true\"></i>\n <span>{{ tab.Title }} coming online…</span>\n </div>\n }\n }\n }\n </div>\n }\n }\n</aside>\n"]}
1
+ {"version":3,"file":"realtime-surface-tabs.component.js","sourceRoot":"","sources":["../../../../src/lib/components/realtime/realtime-surface-tabs.component.ts","../../../../src/lib/components/realtime/realtime-surface-tabs.component.html"],"names":[],"mappings":"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","sourcesContent":["import {\n Component, EventEmitter, Input, Output, OnInit, OnDestroy, ChangeDetectorRef, ViewChild, inject\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { Subscription } from 'rxjs';\nimport { UserInfo } from '@memberjunction/core';\nimport { UserInfoEngine } from '@memberjunction/core-entities';\nimport { ArtifactsModule } from '@memberjunction/ng-artifacts';\nimport { RealtimeSessionState } from './realtime-session-state';\nimport { RealtimeActivityRailComponent } from './realtime-activity-rail.component';\nimport { RealtimeChannelPaneComponent } from './channels/realtime-channel-pane.component';\nimport { ChannelOnboardingPanelComponent } from './channels/channel-onboarding-panel.component';\nimport { ChannelOnboardingDetails } from './channels/base-realtime-channel-client';\nimport {\n RealtimeSurfaceTabsModel, RealtimeSurfaceTab, RealtimeChannelTabRegistration\n} from './realtime-surface-tabs.model';\nimport { ParsedDelegationArtifact } from '../../services/delegation-result-parser';\n\n/**\n * User-settings key (NOT localStorage — see `UserInfoEngine`) under which the per-user \"which\n * channel intros have been seen\" map is persisted: a JSON object of `{ [channelName]: true }`,\n * so the first-run onboarding for each interactive channel shows exactly once per user and\n * follows them across devices.\n */\nconst CHANNEL_ONBOARDING_SEEN_SETTING_KEY = 'mj.realtimeChannels.onboardingSeen.v1';\n\n/**\n * The call overlay's TABBED SURFACE PANEL (the right panel) — decluttered redesign:\n *\n * - **Channel tabs** (LEFT cluster) — one per channel that has come into play. The whiteboard\n * tabs immediately at session start; every other channel tabs only once the agent first\n * USES it. Each carries a distinct accent color + its plugin icon. The pane creates the\n * plugin's surface component dynamically (via `mj-realtime-channel-pane`); a placeholder\n * shows the \"coming online…\" state until a plugin/template is supplied.\n * - **Activity** (RIGHT-aligned, pinned LAST) — gated: appears only once ≥1 agent run has\n * occurred (or in review mode). Hosts {@link RealtimeActivityRailComponent}, which now also\n * renders inline artifact previews and a split-pane artifact viewer. Styled distinctly from\n * channel tabs (activity-pulse icon + its own accent) and separated from the channel cluster\n * by a flex spacer.\n *\n * Artifacts NO LONGER get their own tab — they live inside the Activity tab (cleaner than a\n * row of per-artifact tabs).\n *\n * Panes are kept ALIVE while hidden (CSS `display:none`) so switching tabs never reloads a\n * channel surface or resets the rail. The whole panel collapses to a slim strip via the chevron.\n *\n * SIZING IS EXTERNAL: the overlay shell hosts this panel in a fixed-width flex item and owns\n * the width. This panel just fills it and REPORTS the layout signals the shell sizes from:\n * {@link CollapsedChange} (slim-strip toggle) and {@link WideChanged} (a channel tab is focused\n * → the default width tier widens).\n */\n@Component({\n standalone: true,\n selector: 'mj-realtime-surface-tabs',\n imports: [\n CommonModule, ArtifactsModule, RealtimeActivityRailComponent, RealtimeChannelPaneComponent,\n ChannelOnboardingPanelComponent\n ],\n templateUrl: './realtime-surface-tabs.component.html',\n styleUrl: './realtime-surface-tabs.component.css'\n})\nexport class RealtimeSurfaceTabsComponent implements OnInit, OnDestroy {\n /** How long a just-revealed channel tab keeps its flash highlight. */\n private static readonly FlashDurationMs = 1400;\n\n /** Shared live-session state, owned by the overlay shell (feeds the Activity rail). */\n @Input({ required: true }) State!: RealtimeSessionState;\n\n /** Whether developer affordances (\"Open run\" links) are revealed (gear-gated). */\n @Input() DevMode = false;\n\n /**\n * FILL presentation: the panel stretches to the overlay's full width (the board-focus\n * layout, where the main call column is hidden and a channel surface owns the screen).\n * Bound by the overlay shell; overrides the normal / wide width tiers.\n */\n @Input() Fill = false;\n\n /** The signed-in user, threaded to the artifact viewer panel. */\n @Input() CurrentUser: UserInfo | null = null;\n\n /** The active environment id, threaded to the artifact viewer panel. */\n @Input() EnvironmentID = '';\n\n /**\n * Extra (review-carryover) artifacts to surface in the Activity tab, NOT tied to a live\n * activity card. Forwarded to the rail's \"Session artifacts\" group. Empty for a live session.\n */\n @Input() ExtraArtifacts: ParsedDelegationArtifact[] = [];\n\n /**\n * Whether the gated Activity tab should be shown — driven by the overlay shell once ≥1\n * agent run has occurred (or in review mode). A getter/setter so a late \"first run\" flips\n * the tab into the strip reactively.\n */\n private _showActivityTab = false;\n @Input()\n set ShowActivityTab(value: boolean) {\n if (value !== this._showActivityTab) {\n this._showActivityTab = value;\n this.Model.SetShowActivityTab(value);\n this.cdr.markForCheck();\n }\n }\n get ShowActivityTab(): boolean {\n return this._showActivityTab;\n }\n\n /** Re-emitted from the Activity rail's dev \"Open run\" links. */\n @Output() OpenRunRequested = new EventEmitter<string>();\n\n /**\n * Emitted when the panel toggles between expanded and the slim collapsed strip —\n * the overlay shell resizes this panel's split area to the strip width.\n */\n @Output() CollapsedChange = new EventEmitter<boolean>();\n\n /**\n * Emitted when {@link IsWide} flips (a channel tab gained / lost focus) — the\n * overlay shell widens the panel's DEFAULT split-area size while wide (only when\n * the user has never dragged an explicit width).\n */\n @Output() WideChanged = new EventEmitter<boolean>();\n\n /** The panel's tab state (add / focus / dedupe / flash) — see the model for the rules. */\n public readonly Model = new RealtimeSurfaceTabsModel();\n\n /** Whether the panel is collapsed to its slim strip. */\n public Collapsed = false;\n\n /** The embedded Activity rail (owns the inline artifact previews + the split-pane viewer). */\n @ViewChild(RealtimeActivityRailComponent) private activityRail?: RealtimeActivityRailComponent;\n\n private flashTimer: ReturnType<typeof setTimeout> | null = null;\n private subs: Subscription[] = [];\n private lastWide = false;\n private cdr = inject(ChangeDetectorRef);\n\n /**\n * The channel whose first-run intro is currently being shown (its `ChannelName`), or `null`\n * when no intro is up. Set when the user opens a channel tab they've never seen the intro\n * for; cleared on dismiss. Only one intro shows at a time (the active channel's).\n */\n private onboardingChannelName: string | null = null;\n /** The intro content for {@link onboardingChannelName}, mirrored for the template binding. */\n public OnboardingContent: ChannelOnboardingDetails | null = null;\n\n /** The currently focused tab. */\n public get ActiveTab(): RealtimeSurfaceTab {\n return this.Model.ActiveTab;\n }\n\n /** Wide presentation when a channel tab is focused (the Activity tab keeps the normal tier). */\n public get IsWide(): boolean {\n return !this.Collapsed && this.ActiveTab.Kind === 'channel';\n }\n\n ngOnInit(): void {\n this.subs.push(\n this.Model.Changed$.subscribe(() => this.onModelChanged())\n );\n }\n\n ngOnDestroy(): void {\n for (const s of this.subs) {\n s.unsubscribe();\n }\n this.subs = [];\n if (this.flashTimer) {\n clearTimeout(this.flashTimer);\n this.flashTimer = null;\n }\n }\n\n /** Toggle the panel between expanded and slim-collapsed. */\n public ToggleCollapsed(): void {\n this.setCollapsed(!this.Collapsed);\n }\n\n /** Collapse-state transitions funnel through here so the shell always hears about them. */\n private setCollapsed(value: boolean): void {\n if (this.Collapsed !== value) {\n this.Collapsed = value;\n this.CollapsedChange.emit(value);\n this.syncWide();\n }\n }\n\n /** Emits {@link WideChanged} when the wide tier flips (channel tab focus / collapse). */\n private syncWide(): void {\n const wide = this.IsWide;\n if (wide !== this.lastWide) {\n this.lastWide = wide;\n this.WideChanged.emit(wide);\n }\n }\n\n /** track fn for the @for over tabs. */\n public TrackTab(index: number, tab: RealtimeSurfaceTab): string {\n return tab.Key;\n }\n\n /**\n * Focuses the Activity tab and opens the given artifact in the rail's split-pane viewer —\n * the \"View →\" affordance target on done delegation cards / thread entries. Expands the\n * panel if it was collapsed. Replaces the old \"open a tab per artifact\" behavior.\n */\n public FocusArtifact(artifact: ParsedDelegationArtifact): void {\n this.setCollapsed(false);\n // An artifact implies a run happened — ensure the Activity tab is present before focusing it.\n this.Model.SetShowActivityTab(true);\n this.Model.Focus(RealtimeSurfaceTabsModel.ActivityTabKey);\n // The rail may not be created yet (panel just expanded) — defer so it exists.\n if (this.activityRail) {\n this.activityRail.OpenArtifact(artifact);\n } else {\n setTimeout(() => this.activityRail?.OpenArtifact(artifact));\n }\n this.cdr.markForCheck();\n }\n\n /**\n * Registers (or updates) an interactive-channel tab — one per used channel plugin,\n * forwarded from `RealtimeSessionOverlayComponent.RegisterChannelTab`.\n */\n public RegisterChannelTab(registration: RealtimeChannelTabRegistration): void {\n // Microtask defer: the overlay forwards this while handling agent/channel activity, which can\n // land mid change-detection. Adding a tab to Model synchronously then trips NG0100 on the\n // tab-strip bindings (s-tab--active). A microtask lands the mutation in a fresh CD turn —\n // imperceptible for an async reveal, and ordered with any follow-on RevealChannel.\n Promise.resolve().then(() => {\n this.Model.RegisterChannelTab(registration);\n this.cdr.markForCheck();\n });\n }\n\n /**\n * AUTO-REVEALS a channel surface the moment the agent first acts on it: expands the\n * panel if collapsed, focuses the channel's tab and flashes it — so the user discovers\n * the whiteboard (or any channel) exists the instant it comes alive. No-op for unknown keys.\n */\n public RevealChannel(key: string): void {\n // Microtask defer (same NG0100 reason as RegisterChannelTab): the agent-activity reveal mutates\n // ActiveKey/FlashKey, which feed the tab-strip class bindings; doing it mid-CD trips the\n // ExpressionChanged check. Deferring lands it in a fresh CD turn and stays ordered after any\n // RegisterChannelTab queued just before it.\n Promise.resolve().then(() => {\n this.setCollapsed(false);\n this.Model.Focus(key);\n this.Model.FlashTab(key);\n this.cdr.markForCheck();\n });\n }\n\n /**\n * Removes a tab from the panel (Activity is irremovable; focus falls back per the model's\n * rules). Used by the overlay shell on a review→live continuation whose live channel set\n * resolved WITHOUT the channel a stale review tab represents (e.g. no Whiteboard channel →\n * drop the read-only review board tab).\n *\n * @returns `true` when a tab was removed.\n */\n public RemoveTab(key: string): boolean {\n const removed = this.Model.RemoveTab(key);\n if (removed) {\n this.cdr.markForCheck();\n }\n return removed;\n }\n\n /**\n * Registers the reviewed chain's history artifacts so they surface inside the Activity tab.\n * In the redesign there are no per-artifact tabs — the rail picks artifacts up from the\n * session state's cards, so this only needs to ensure the Activity tab is shown (review\n * mode always shows it) and, when `focus` is set, open the artifact in the split viewer.\n */\n public RegisterArtifactTab(artifact: ParsedDelegationArtifact, focus: boolean = false): void {\n this.Model.SetShowActivityTab(true);\n if (focus) {\n this.FocusArtifact(artifact);\n }\n this.cdr.markForCheck();\n }\n\n /** On model changes: schedule the flash clear, report a wide-tier flip, re-render. */\n private onModelChanged(): void {\n this.scheduleFlashClear();\n this.syncWide();\n this.evaluateOnboarding();\n this.cdr.markForCheck();\n }\n\n /**\n * Decides whether the first-run channel intro should be visible for the ACTIVE tab: shows it\n * the first time the user opens (focuses) a channel tab whose plugin supplies onboarding and\n * which this user hasn't dismissed before. Re-runs on every model change so switching away\n * from a channel tab tears the intro down (only the active channel's intro is ever up).\n */\n private evaluateOnboarding(): void {\n const tab = this.ActiveTab;\n const plugin = tab.Kind === 'channel' ? tab.Data?.Plugin ?? null : null;\n const details = plugin?.GetOnboardingDetails() ?? null;\n if (!plugin || !details || this.HasSeenOnboarding(plugin.ChannelName)) {\n this.onboardingChannelName = null;\n this.OnboardingContent = null;\n return;\n }\n this.onboardingChannelName = plugin.ChannelName;\n this.OnboardingContent = details;\n }\n\n /**\n * Dismisses the current channel intro: marks that channel seen for this user (persisted via\n * `UserInfoEngine`, debounced — NOT localStorage) and hides the panel so it never re-appears.\n */\n public DismissOnboarding(): void {\n const channelName = this.onboardingChannelName;\n this.onboardingChannelName = null;\n this.OnboardingContent = null;\n if (channelName) {\n this.markOnboardingSeen(channelName);\n }\n this.cdr.markForCheck();\n }\n\n /** Reads the per-user seen-map and reports whether this channel's intro has been dismissed. */\n private HasSeenOnboarding(channelName: string): boolean {\n return this.readOnboardingSeen()[channelName] === true;\n }\n\n /** Persists `channelName` into the per-user seen-map (merge + debounced save). */\n private markOnboardingSeen(channelName: string): void {\n const map = this.readOnboardingSeen();\n if (map[channelName] === true) {\n return;\n }\n map[channelName] = true;\n UserInfoEngine.Instance.SetSettingDebounced(CHANNEL_ONBOARDING_SEEN_SETTING_KEY, JSON.stringify(map));\n }\n\n /** Reads + parses the per-user seen-map setting (tolerant: malformed / unset → empty map). */\n private readOnboardingSeen(): Record<string, boolean> {\n const raw = UserInfoEngine.Instance.GetSetting(CHANNEL_ONBOARDING_SEEN_SETTING_KEY);\n if (!raw) {\n return {};\n }\n try {\n const parsed: unknown = JSON.parse(raw);\n return parsed !== null && typeof parsed === 'object' && !Array.isArray(parsed)\n ? (parsed as Record<string, boolean>)\n : {};\n } catch {\n return {};\n }\n }\n\n /**\n * Focuses the FIRST tab in the strip — channels lead, so a Details peek lands on the\n * marquee surface (e.g. the Whiteboard) when one exists, else on Activity.\n */\n public FocusFirstTab(): void {\n const first = this.Model.Tabs[0];\n if (first) {\n this.Model.Focus(first.Key);\n this.cdr.markForCheck();\n }\n }\n\n /** Clears the model's flash highlight after a beat (one timer; latest flash wins). */\n private scheduleFlashClear(): void {\n if (this.Model.FlashKey === null) {\n return;\n }\n if (this.flashTimer) {\n clearTimeout(this.flashTimer);\n }\n this.flashTimer = setTimeout(() => {\n this.flashTimer = null;\n this.Model.ClearFlash();\n }, RealtimeSurfaceTabsComponent.FlashDurationMs);\n }\n}\n","<!-- SIZING IS EXTERNAL: the overlay hosts this panel inside a fixed-width flex item and\n owns its width (drag, persistence, default tiers) — the panel just fills it. -->\n<aside class=\"surface\"\n [class.surface--collapsed]=\"Collapsed\"\n [class.surface--fill]=\"Fill && !Collapsed\"\n aria-label=\"Session surfaces\">\n\n @if (Collapsed) {\n <!-- Slim strip: the panel's collapse target -->\n <div class=\"surface__strip\">\n <button type=\"button\"\n class=\"surface__toggle\"\n (click)=\"ToggleCollapsed()\"\n title=\"Show session panel\"\n aria-expanded=\"false\">\n <i class=\"fa-solid fa-chevron-left\" aria-hidden=\"true\"></i>\n </button>\n <i class=\"fa-solid fa-wave-square surface__strip-icon\" aria-hidden=\"true\" title=\"Session activity\"></i>\n </div>\n } @else {\n <!-- Tab strip: channel tabs (left cluster) … | spacer | Activity (right-aligned) -->\n <div class=\"surface-tabs\" role=\"tablist\">\n @for (tab of Model.Tabs; track TrackTab($index, tab)) {\n @if (tab.Kind === 'activity') {\n <!-- Flex spacer pushes the Activity tab to the far right -->\n <span class=\"tabs-spacer\" aria-hidden=\"true\"></span>\n }\n <button type=\"button\"\n class=\"s-tab\"\n role=\"tab\"\n [class.s-tab--activity]=\"tab.Kind === 'activity'\"\n [class.s-tab--channel]=\"tab.Kind === 'channel'\"\n [class.s-tab--active]=\"tab.Key === Model.ActiveKey\"\n [class.s-tab--flash]=\"tab.Key === Model.FlashKey\"\n [style.--tab-accent]=\"tab.Color || null\"\n [attr.aria-selected]=\"tab.Key === Model.ActiveKey\"\n [title]=\"tab.Title\"\n (click)=\"Model.Focus(tab.Key)\">\n @if (tab.Kind === 'channel') {\n <span class=\"s-tab__dot\" aria-hidden=\"true\"></span>\n }\n <i [class]=\"tab.Icon\" aria-hidden=\"true\"></i>\n <span class=\"s-tab__title\">{{ tab.Title }}</span>\n @if (tab.Kind === 'activity' && State.Cards.length > 0) {\n <span class=\"s-tab__badge\" aria-hidden=\"true\">{{ State.Cards.length }}</span>\n }\n </button>\n }\n <div class=\"tabs-end\">\n <button type=\"button\"\n class=\"surface__toggle\"\n (click)=\"ToggleCollapsed()\"\n title=\"Hide session panel\"\n aria-expanded=\"true\">\n <i class=\"fa-solid fa-chevron-right\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n\n <!-- Panes: ALL kept alive; only the active one is displayed -->\n @for (tab of Model.Tabs; track TrackTab($index, tab)) {\n <div class=\"s-pane\" [class.s-pane--active]=\"tab.Key === Model.ActiveKey\" role=\"tabpanel\">\n @switch (tab.Kind) {\n @case ('activity') {\n <mj-realtime-activity-rail\n [State]=\"State\"\n [DevMode]=\"DevMode\"\n [Embedded]=\"true\"\n [CurrentUser]=\"CurrentUser\"\n [EnvironmentID]=\"EnvironmentID\"\n [ExtraArtifacts]=\"ExtraArtifacts\"\n (OpenRunRequested)=\"OpenRunRequested.emit($event)\">\n </mj-realtime-activity-rail>\n }\n @case ('channel') {\n @if (tab.Data?.Plugin; as plugin) {\n <!-- Registry-resolved channel: the pane host creates the plugin's surface\n component dynamically and hands the instance back for binding -->\n <mj-realtime-channel-pane [Plugin]=\"plugin\"></mj-realtime-channel-pane>\n <!-- First-run intro: overlaid over the active channel pane the first time this user\n opens it; the pane host renders display:none + a sibling surface, so the overlay\n sits here (inside the positioned .s-pane) rather than inside the pane host. -->\n @if (tab.Key === Model.ActiveKey && OnboardingContent) {\n <mj-channel-onboarding-panel\n [Content]=\"OnboardingContent\"\n (Dismissed)=\"DismissOnboarding()\">\n </mj-channel-onboarding-panel>\n }\n } @else if (tab.Data?.Content; as content) {\n <ng-container [ngTemplateOutlet]=\"content\"></ng-container>\n } @else {\n <!-- Placeholder until the channel registration supplies a plugin / template -->\n <div class=\"channel-placeholder\" role=\"status\">\n <i class=\"fa-solid fa-chalkboard\" aria-hidden=\"true\"></i>\n <span>{{ tab.Title }} coming online…</span>\n </div>\n }\n }\n }\n </div>\n }\n\n @if (Model.Tabs.length === 0) {\n <!-- Nothing in play yet (idle voice-first session): a gentle hint, not an empty grid -->\n <div class=\"surface__empty\" role=\"status\">\n <i class=\"fa-solid fa-wave-square\" aria-hidden=\"true\"></i>\n <span>Surfaces appear here as the call gets going.</span>\n </div>\n }\n }\n</aside>\n"]}
@@ -1,24 +1,27 @@
1
1
  import { Subject } from 'rxjs';
2
2
  import type { TemplateRef } from '@angular/core';
3
3
  import type { BaseRealtimeChannelClient } from './channels/base-realtime-channel-client';
4
- import { ParsedDelegationArtifact } from '../../services/delegation-result-parser';
5
4
  /**
6
5
  * The kind of a surface-panel tab:
7
- * - `activity` — the always-present first tab hosting the session activity rail.
8
- * - `artifact` one tab per artifact produced by a delegated run (auto-opened on arrival).
6
+ * - `activity` — the session-activity tab (pinned LAST, right-aligned). Hosts the activity
7
+ * rail AND, since the artifact redesign, the inline artifact previews + the split-pane
8
+ * artifact viewer. Shown only once ≥1 agent run has occurred (see
9
+ * {@link RealtimeSurfaceTabsModel.SetShowActivityTab}).
9
10
  * - `channel` — an interactive-channel surface (e.g. the Whiteboard). Registered per
10
- * registry-resolved plugin via {@link RealtimeSurfaceTabsModel.RegisterChannelTab};
11
- * renders the plugin's dynamically-created surface component (or a registered template
12
- * for legacy/template-based panes), with the "coming online…" placeholder until either
11
+ * used channel via {@link RealtimeSurfaceTabsModel.RegisterChannelTab}; renders the
12
+ * plugin's dynamically-created surface component (or a registered template for
13
+ * legacy/template-based panes), with the "coming online…" placeholder until either
13
14
  * is supplied.
15
+ *
16
+ * NOTE: artifacts NO LONGER get their own tab. A delegated run's artifacts now render
17
+ * INSIDE the Activity tab (inline previews + an `as-split` viewer pane) — see
18
+ * `RealtimeActivityRailComponent`.
14
19
  */
15
- export type RealtimeSurfaceTabKind = 'activity' | 'artifact' | 'channel';
20
+ export type RealtimeSurfaceTabKind = 'activity' | 'channel';
16
21
  /**
17
22
  * Per-kind payload carried on a {@link RealtimeSurfaceTab}.
18
23
  */
19
24
  export interface RealtimeSurfaceTabData {
20
- /** For `artifact` tabs: the artifact this tab views (loaded by ArtifactID, latest version). */
21
- Artifact?: ParsedDelegationArtifact;
22
25
  /**
23
26
  * For `channel` tabs: the channel PLUGIN whose surface component the pane creates
24
27
  * dynamically (and binds back to the plugin) — the registry-driven path every real
@@ -33,26 +36,31 @@ export interface RealtimeSurfaceTabData {
33
36
  Content?: TemplateRef<unknown>;
34
37
  }
35
38
  /**
36
- * One tab on the call overlay's tabbed surface panel (the right panel): Activity, an
37
- * artifact viewer, or an interactive-channel surface.
39
+ * One tab on the call overlay's tabbed surface panel (the right panel): a channel surface
40
+ * (left cluster) or the session-activity tab (right-aligned).
38
41
  */
39
42
  export interface RealtimeSurfaceTab {
40
- /** Stable unique key (`activity`, `artifact:<versionId>`, or the channel's registered key). */
43
+ /** Stable unique key (`activity`, or the channel's registered key). */
41
44
  Key: string;
42
- /** Tab strip label (artifact tabs use the artifact's name). */
45
+ /** Tab strip label (channel name, or "Activity"). */
43
46
  Title: string;
44
- /** Font Awesome icon class for the tab strip (e.g. `fa-solid fa-file-lines`). */
47
+ /** Font Awesome icon class for the tab strip (e.g. `fa-solid fa-chalkboard`). */
45
48
  Icon: string;
46
49
  /** What the tab renders. */
47
50
  Kind: RealtimeSurfaceTabKind;
51
+ /**
52
+ * Accent color for the tab's dot + active underline. Channel tabs carry a distinct color
53
+ * (plugin-supplied or a deterministic hash of the name); the Activity tab uses its own
54
+ * fixed accent in CSS, so its `Color` is left undefined.
55
+ */
56
+ Color?: string;
48
57
  /** Kind-specific payload. */
49
58
  Data?: RealtimeSurfaceTabData;
50
59
  }
51
60
  /**
52
61
  * Registration for an interactive-channel tab. The overlay shell registers one per
53
- * registry-resolved channel plugin (supplying {@link Plugin}); supplying {@link Plugin}
54
- * or {@link Content} later under the same `Key` upgrades a placeholder tab to the real
55
- * surface.
62
+ * USED channel plugin (supplying {@link Plugin}); supplying {@link Plugin} or
63
+ * {@link Content} later under the same `Key` upgrades a placeholder tab to the real surface.
56
64
  */
57
65
  export interface RealtimeChannelTabRegistration {
58
66
  /** Stable channel key (the plugin's `ChannelName`, e.g. `Whiteboard`). Re-registering the same key updates the tab. */
@@ -61,6 +69,11 @@ export interface RealtimeChannelTabRegistration {
61
69
  Title: string;
62
70
  /** Font Awesome icon class (e.g. `fa-solid fa-chalkboard`). */
63
71
  Icon: string;
72
+ /**
73
+ * Optional explicit accent color for the tab. When omitted, a deterministic color is
74
+ * derived from {@link Key} so every channel tab still reads as a distinct surface.
75
+ */
76
+ Color?: string | null;
64
77
  /** The channel plugin whose surface the pane creates + binds. Preferred over {@link Content}. */
65
78
  Plugin?: BaseRealtimeChannelClient;
66
79
  /** A template-based pane body (legacy/bespoke panes). Omit both to show the "coming online…" placeholder. */
@@ -70,87 +83,85 @@ export interface RealtimeChannelTabRegistration {
70
83
  }
71
84
  /**
72
85
  * Framework-free state for the call overlay's tabbed surface panel: the ordered tab list
73
- * (CHANNEL tabs first — the marquee surfaces then artifact tabs in arrival order, with
74
- * Activity pinned LAST), the active tab, the transient "flash" highlight for a
75
- * just-arrived tab, and the persistent UNSEEN glow for content that arrived without
76
- * stealing focus (an artifact tab glows until the user visits it).
86
+ * (CHANNEL tabs first — the marquee surfaces, left cluster with the session-activity tab
87
+ * pinned LAST and right-aligned by the strip), the active tab, and the transient "flash"
88
+ * highlight for a just-revealed channel tab.
89
+ *
90
+ * The Activity tab is GATED: it isn't listed until {@link SetShowActivityTab}(true) — i.e.
91
+ * once ≥1 agent run has occurred (or in review mode). Channel tabs appear only as channels
92
+ * come into play (the whiteboard up-front; every other channel on first use), so an
93
+ * idle voice-first session shows an empty/near-empty strip rather than a row of unused tabs.
77
94
  *
78
95
  * Owned by `RealtimeSurfaceTabsComponent`; kept free of Angular runtime imports so the
79
- * add / focus / dedupe / flash / unseen logic is unit-testable in isolation. All
80
- * collections are REPLACED (never mutated) on change, and every change emits {@link Changed$}.
96
+ * add / focus / dedupe / flash logic is unit-testable in isolation. All collections are
97
+ * REPLACED (never mutated) on change, and every change emits {@link Changed$}.
81
98
  */
82
99
  export declare class RealtimeSurfaceTabsModel {
83
- /** The fixed key of the always-present Activity tab (pinned as the LAST tab). */
100
+ /** The fixed key of the session-activity tab (pinned LAST, right-aligned). */
84
101
  static readonly ActivityTabKey = "activity";
85
- /** The ordered tabs (channels… · artifacts… · Activity last). Replaced immutably on every change. */
86
- Tabs: RealtimeSurfaceTab[];
102
+ /** The activity tab definition, appended last whenever {@link showActivity} is true. */
103
+ private static readonly ActivityTab;
104
+ /** Channel tabs (left cluster), in registration order. Replaced immutably on change. */
105
+ private channelTabs;
106
+ /** Whether the gated Activity tab is currently shown (≥1 agent run, or review mode). */
107
+ private showActivity;
87
108
  /** Key of the currently focused tab. */
88
109
  ActiveKey: string;
89
110
  /**
90
- * Key of the tab currently "flashing" (the brief violet highlight a just-arrived
91
- * artifact tab gets, per the mockup). Cleared by the owning component after a beat
92
- * via {@link ClearFlash}.
111
+ * Key of the tab currently "flashing" (the brief highlight a just-revealed channel tab
112
+ * gets when the agent first acts on it). Cleared by the owning component after a beat via
113
+ * {@link ClearFlash}.
93
114
  */
94
115
  FlashKey: string | null;
95
- /**
96
- * Tabs holding content the user hasn't visited yet (the persistent glow): an artifact
97
- * tab that arrived WITHOUT stealing focus stays marked until it is focused. Replaced
98
- * immutably on change.
99
- */
100
- private unseenKeys;
101
116
  /** Emits after every model change so the owning component can mark for check. */
102
117
  readonly Changed$: Subject<void>;
103
- /** The currently focused tab (always resolvable — Activity is never removed). */
118
+ /**
119
+ * The ordered tabs: channel tabs (left), then the Activity tab LAST when shown. The strip
120
+ * right-aligns the Activity tab via a flex spacer, so this order also matches reading order.
121
+ */
122
+ get Tabs(): RealtimeSurfaceTab[];
123
+ /** Whether the Activity tab is currently part of the strip. */
124
+ get IsActivityShown(): boolean;
125
+ /**
126
+ * The currently focused tab. Resolves to the active key when it still exists, else falls
127
+ * back to the Activity tab (when shown), else the first channel tab, else the Activity tab
128
+ * definition (so a consumer always has SOMETHING to render even on an empty strip).
129
+ */
104
130
  get ActiveTab(): RealtimeSurfaceTab;
105
- /** True while the tab with `key` holds content the user hasn't visited (glow state). */
106
- IsUnseen(key: string): boolean;
107
- /** The stable tab key for an artifact (one tab per produced artifact VERSION). */
108
- static ArtifactTabKey(artifact: ParsedDelegationArtifact): string;
109
131
  /**
110
- * Opens (or re-focuses) the tab for an artifact a delegated run produced.
111
- *
112
- * First arrival: inserts an `artifact` tab AFTER existing channel/artifact tabs but
113
- * BEFORE the pinned-last Activity tab, marks it as the {@link FlashKey}, and — unless
114
- * `focus` is true — leaves focus alone and marks the tab UNSEEN (it glows until
115
- * visited; per product direction a finished artifact never steals the screen, only the
116
- * agent's first channel activity does). Subsequent calls for the same artifact version
117
- * just (optionally) focus the existing tab — no duplicate, no re-flash.
132
+ * Shows or hides the gated Activity tab. Turning it ON when an empty strip was implicitly
133
+ * focusing Activity keeps focus on Activity; turning it OFF while it was focused falls
134
+ * focus back to the first channel tab (if any). No-op (no emission) when unchanged.
118
135
  *
119
- * @param artifact The produced artifact (id + version id + display name).
120
- * @param focus Whether to focus the tab (default `false` — glow, don't grab).
121
- * @param markUnseen Whether an unfocused first arrival glows (default `true`). Pass
122
- * `false` for HISTORY artifacts (session-review carryover) — they're context, not news.
123
- * @returns The (new or existing) tab.
136
+ * @param show Whether ≥1 agent run has occurred (or review mode) the gate.
124
137
  */
125
- OpenArtifactTab(artifact: ParsedDelegationArtifact, focus?: boolean, markUnseen?: boolean): RealtimeSurfaceTab;
138
+ SetShowActivityTab(show: boolean): void;
126
139
  /**
127
140
  * Registers (or updates) an interactive-channel tab. Re-registering an existing key
128
- * replaces its title/icon/plugin/content in place (this is how a placeholder upgrades
129
- * to the real surface once the channel comes online). New channel tabs lead the strip
130
- * (before artifact tabs and the pinned-last Activity tab) the marquee surfaces.
141
+ * replaces its title/icon/color/plugin/content in place (this is how a placeholder
142
+ * upgrades to the real surface once the channel comes online). New channel tabs join the
143
+ * left cluster in registration order. A registration without an explicit {@link
144
+ * RealtimeChannelTabRegistration.Color} gets a deterministic color from its key.
131
145
  *
132
146
  * @param registration The channel tab registration.
133
147
  * @returns The (new or updated) tab.
134
148
  */
135
149
  RegisterChannelTab(registration: RealtimeChannelTabRegistration): RealtimeSurfaceTab;
136
- /** Focuses the tab with `key` (no-op when it doesn't exist); visiting clears its unseen glow. */
150
+ /** Focuses the tab with `key` (no-op when it doesn't exist or is already active). */
137
151
  Focus(key: string): void;
138
- /** The index of the pinned-last Activity tab (insertion boundary for content tabs). */
139
- private activityIndex;
140
- /** Clears a tab's unseen glow (no emission of its own — callers emit). */
141
- private markSeen;
142
152
  /**
143
- * Marks the tab with `key` as the {@link FlashKey} (the brief violet "just arrived"
144
- * highlight) WITHOUT changing focus — used by the auto-reveal path when the agent first
145
- * acts on a channel, so the user's eye lands on the tab that just came alive. No-op for
146
- * unknown keys; the owning component clears it after a beat via {@link ClearFlash}.
153
+ * Marks the tab with `key` as the {@link FlashKey} (the brief "just arrived" highlight)
154
+ * WITHOUT changing focus — used by the auto-reveal path when the agent first acts on a
155
+ * channel, so the user's eye lands on the tab that just came alive. No-op for unknown
156
+ * keys; the owning component clears it after a beat via {@link ClearFlash}.
147
157
  */
148
158
  FlashTab(key: string): void;
149
159
  /**
150
- * Removes the tab with `key`. Rules:
151
- * - the Activity tab is IRREMOVABLE (always the panel's first tab) — removing it is a no-op;
160
+ * Removes the channel tab with `key`. Rules:
161
+ * - the Activity tab is IRREMOVABLE — removing it is a no-op;
152
162
  * - an unknown key is a no-op (returns `false`);
153
- * - when the removed tab was focused, focus falls back to the Activity tab;
163
+ * - when the removed tab was focused, focus falls back to the Activity tab (if shown),
164
+ * else the first remaining channel tab;
154
165
  * - a pending flash on the removed tab is cleaned up so the highlight can't dangle.
155
166
  *
156
167
  * @param key The tab key to remove.
@@ -171,8 +182,6 @@ export declare class RealtimeSurfaceTabsModel {
171
182
  * - the live session's resolved channel set has NO Whiteboard channel — when it HAS one, the
172
183
  * live plugin re-registers the same tab key and upgrades the pane in place instead.
173
184
  *
174
- * Review ARTIFACT tabs are deliberately NOT removed — they are wanted carryover.
175
- *
176
185
  * Kept framework-free (like the model) so the rule is unit-testable in isolation.
177
186
  */
178
187
  export declare function ShouldRemoveReviewWhiteboardTab(liveSessionActive: boolean, reviewWhiteboardTabRegistered: boolean, liveChannels: ReadonlyArray<{
@@ -1 +1 @@
1
- {"version":3,"file":"realtime-surface-tabs.model.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/realtime/realtime-surface-tabs.model.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"realtime-surface-tabs.model.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/realtime/realtime-surface-tabs.model.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,yCAAyC,CAAC;AAGzF;;;;;;;;;;;;;;;GAeG;AACH,MAAM,MAAM,sBAAsB,GAAG,UAAU,GAAG,SAAS,CAAC;AAE5D;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC;;;;OAIG;IACH,MAAM,CAAC,EAAE,yBAAyB,CAAC;IACnC;;;;OAIG;IACH,OAAO,CAAC,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;CAChC;AAED;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IACjC,uEAAuE;IACvE,GAAG,EAAE,MAAM,CAAC;IACZ,qDAAqD;IACrD,KAAK,EAAE,MAAM,CAAC;IACd,iFAAiF;IACjF,IAAI,EAAE,MAAM,CAAC;IACb,4BAA4B;IAC5B,IAAI,EAAE,sBAAsB,CAAC;IAC7B;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,6BAA6B;IAC7B,IAAI,CAAC,EAAE,sBAAsB,CAAC;CAC/B;AAED;;;;GAIG;AACH,MAAM,WAAW,8BAA8B;IAC7C,uHAAuH;IACvH,GAAG,EAAE,MAAM,CAAC;IACZ,2CAA2C;IAC3C,KAAK,EAAE,MAAM,CAAC;IACd,+DAA+D;IAC/D,IAAI,EAAE,MAAM,CAAC;IACb;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,iGAAiG;IACjG,MAAM,CAAC,EAAE,yBAAyB,CAAC;IACnC,6GAA6G;IAC7G,OAAO,CAAC,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;IAC/B,sEAAsE;IACtE,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;;;;;;;;;;;;;GAcG;AACH,qBAAa,wBAAwB;IACnC,8EAA8E;IAC9E,gBAAuB,cAAc,cAAc;IAEnD,wFAAwF;IACxF,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAKjC;IAEF,wFAAwF;IACxF,OAAO,CAAC,WAAW,CAA4B;IAE/C,wFAAwF;IACxF,OAAO,CAAC,YAAY,CAAS;IAE7B,wCAAwC;IACjC,SAAS,EAAE,MAAM,CAA2C;IAEnE;;;;OAIG;IACI,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAQ;IAEtC,iFAAiF;IACjF,SAAgB,QAAQ,gBAAuB;IAE/C;;;OAGG;IACH,IAAW,IAAI,IAAI,kBAAkB,EAAE,CAItC;IAED,+DAA+D;IAC/D,IAAW,eAAe,IAAI,OAAO,CAEpC;IAED;;;;OAIG;IACH,IAAW,SAAS,IAAI,kBAAkB,CAMzC;IAED;;;;;;OAMG;IACI,kBAAkB,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI;IAW9C;;;;;;;;;OASG;IACI,kBAAkB,CAAC,YAAY,EAAE,8BAA8B,GAAG,kBAAkB;IAwB3F,qFAAqF;IAC9E,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAQ/B;;;;;OAKG;IACI,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAQlC;;;;;;;;;;OAUG;IACI,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAiBtC,mFAAmF;IAC5E,UAAU,IAAI,IAAI;CAM1B;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,+BAA+B,CAC7C,iBAAiB,EAAE,OAAO,EAC1B,6BAA6B,EAAE,OAAO,EACtC,YAAY,EAAE,aAAa,CAAC;IAAE,WAAW,EAAE,MAAM,CAAA;CAAE,CAAC,GACnD,OAAO,CAKT"}