@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,158 @@
1
+ /**
2
+ * Base class for CLIENT-SIDE interactive-channel plugins (per
3
+ * `plans/ai-agent-sessions.md` → "Interactive Channels" / "Pluggable Channel Interfaces").
4
+ *
5
+ * An interactive channel is a bidirectional surface the session's single realtime agent
6
+ * both PERCEIVES and ACTS UPON (whiteboard, shared doc, map, …). A concrete plugin
7
+ * contributes everything the channel needs, so the session service / call overlay carry
8
+ * ZERO channel-specific wiring:
9
+ *
10
+ * 1. a CLIENT-EXECUTED TOOL SET ({@link GetToolDefinitions}, declared to the realtime
11
+ * model at session mint) plus the local executor ({@link ApplyAgentTool}) the host
12
+ * routes `{@link ToolNamePrefix}*` calls to — the ACTION direction;
13
+ * 2. a STATE→CONTEXT SERIALIZER policy — the plugin owns its state engine and pushes
14
+ * coalesced deltas through {@link RealtimeChannelContext.SendContextNote} — the
15
+ * PERCEPTION direction;
16
+ * 3. an OPTIONAL ANGULAR SURFACE ({@link GetSurfaceComponent}) the overlay creates dynamically
17
+ * in a channel tab, handed back through {@link BindSurface} so the plugin wires its own
18
+ * inputs/outputs (the host never knows the component's API). A channel may be **server-only**
19
+ * (no rendered surface) — e.g. a bridge-contributed meeting-controls or native-whiteboard
20
+ * channel whose surface lives on the external platform, not in MJ. Such a channel returns
21
+ * `null` from {@link GetSurfaceComponent} ({@link HasSurface} is `false`) and the overlay
22
+ * simply skips its tab while still wiring its tools + perception;
23
+ * 4. a STATE OF RECORD ({@link SerializeState}, persisted via
24
+ * {@link RealtimeChannelContext.RequestSave} under {@link ChannelName}).
25
+ *
26
+ * ### Registration & resolution (mirrors the realtime model drivers)
27
+ * Concrete plugins are `@RegisterClass(BaseRealtimeChannelClient, '<ClientPluginClass>')`
28
+ * and are resolved at session start from the `MJ: AI Agent Channels` registry: each ACTIVE
29
+ * row's `ClientPluginClass` is the ClassFactory key (exactly how `BaseRealtimeClient`
30
+ * drivers resolve by provider key). Ship a `Load<YourChannel>()` no-op alongside the class
31
+ * and call it from a static code path to defeat tree-shaking.
32
+ *
33
+ * ### Lifecycle — ONE INSTANCE PER SESSION (not a singleton)
34
+ * `ClassFactory.CreateInstance` → {@link Initialize}(ctx) → zero or more
35
+ * {@link BindSurface}/{@link UnbindSurface} cycles (the surface pane is created/destroyed
36
+ * with the overlay's tab panel, e.g. collapse/expand) → {@link Dispose} at teardown.
37
+ * {@link ApplyAgentTool} MUST work with NO surface bound (apply to the state engine
38
+ * directly; skip the UI garnish) — tool calls can arrive while the panel is collapsed.
39
+ *
40
+ * @typeParam TSurface The plugin's Angular surface component type. The host only ever
41
+ * sees the default (`object`) — the typed parameter exists so concrete plugins get a
42
+ * fully typed {@link BindSurface} without casts.
43
+ */
44
+ export class BaseRealtimeChannelClient {
45
+ /**
46
+ * The host context, available from {@link Initialize} until {@link Dispose}.
47
+ * `null` outside that window — guard with `?.` in any code that can run early/late.
48
+ */
49
+ Context = null;
50
+ /**
51
+ * The Angular component the overlay creates dynamically as this channel's tab pane, or `null`
52
+ * for a **server-only** channel that renders no MJ surface (its surface, if any, lives on the
53
+ * external platform — e.g. a bridge-contributed native whiteboard or meeting-controls channel).
54
+ *
55
+ * When this returns `null`, the overlay renders NO tab for the channel and never calls
56
+ * {@link BindSurface}/{@link UnbindSurface} — but the channel's tools ({@link GetToolDefinitions} /
57
+ * {@link ApplyAgentTool}) and perception ({@link RealtimeChannelContext.SendContextNote}) still run.
58
+ * A created surface instance is handed straight back via {@link BindSurface}; the host treats it as
59
+ * opaque.
60
+ *
61
+ * Default: `null` (server-only). A channel with a rendered surface overrides this to return its
62
+ * component type.
63
+ */
64
+ GetSurfaceComponent() {
65
+ return null;
66
+ }
67
+ /**
68
+ * Whether this channel has a rendered MJ surface ({@link GetSurfaceComponent} returns non-null).
69
+ * The overlay uses this to decide whether to register a surface tab; server-only channels are
70
+ * `false`. Override only if surface availability must be decided WITHOUT constructing the type
71
+ * (the default calls {@link GetSurfaceComponent} once).
72
+ */
73
+ HasSurface() {
74
+ return this.GetSurfaceComponent() != null;
75
+ }
76
+ /**
77
+ * The channel's FIRST-RUN INTRO content, or `null` when the channel offers no onboarding.
78
+ * The overlay shows this once per channel per user — the first time the user opens this
79
+ * channel's surface tab — and remembers "seen" via the user's settings (NOT localStorage),
80
+ * so it never re-appears on later sessions or other devices.
81
+ *
82
+ * Default: `null` (no intro). The base Voice/text channel has no plugin at all, so it never
83
+ * shows an intro; an interactive channel with a surface worth explaining (whiteboard, remote
84
+ * browser, …) overrides this to return its {@link ChannelOnboardingDetails}. A plugin that
85
+ * doesn't override it simply shows nothing — onboarding is strictly opt-in.
86
+ */
87
+ GetOnboardingDetails() {
88
+ return null;
89
+ }
90
+ /**
91
+ * Called by the host when the surface component is being destroyed (tab panel
92
+ * collapsed / overlay torn down). Drop the instance reference and unsubscribe any
93
+ * output subscriptions — after this, {@link ApplyAgentTool} runs in its no-surface
94
+ * mode. Default: no-op.
95
+ */
96
+ UnbindSurface() {
97
+ // default: nothing to release
98
+ }
99
+ /**
100
+ * Binds the host context and invokes the {@link OnInitialize} hook. Called exactly once
101
+ * per session, right after ClassFactory instantiation and before any tool call or
102
+ * surface bind.
103
+ */
104
+ Initialize(ctx) {
105
+ this.Context = ctx;
106
+ this.OnInitialize();
107
+ }
108
+ /**
109
+ * Subclass hook invoked from {@link Initialize} once {@link Context} is bound — wire
110
+ * state-engine subscriptions (e.g. state change → `Context.RequestSave(...)`) here.
111
+ * Default: no-op.
112
+ */
113
+ OnInitialize() {
114
+ // default: nothing to initialize
115
+ }
116
+ /**
117
+ * Serializes the channel's current state of record (the payload persisted on the
118
+ * session's channel row), or `null` when the channel keeps no persistent state.
119
+ * Default: `null`.
120
+ */
121
+ SerializeState() {
122
+ return null;
123
+ }
124
+ /**
125
+ * Restores a PRIOR session's saved channel state (the payload a previous session
126
+ * persisted via {@link SerializeState} / {@link RealtimeChannelContext.RequestSave}).
127
+ * Invoked by the session host AFTER {@link Initialize} and BEFORE any surface binding,
128
+ * when a prior session's saved state exists for this channel.
129
+ *
130
+ * Returns `true` when the state was applied; `false` when the channel ignored it —
131
+ * either because it keeps no persistent state (this default) or because the payload was
132
+ * malformed/incompatible. Implementations MUST be tolerant: never throw on bad input,
133
+ * just return `false` and start fresh.
134
+ */
135
+ RestoreState(stateJson) {
136
+ return false;
137
+ }
138
+ /**
139
+ * The focus pill's "exit" affordance, routed by the overlay to the channel that holds
140
+ * focus. Implementations should leave focus mode through their OWN surface (so surface
141
+ * toggles stay in sync), ultimately emitting `Context.SetFocusMode(false)`. The overlay
142
+ * defensively clears its layout flag as well, so a no-op default is safe.
143
+ */
144
+ RequestFocusExit() {
145
+ // default: the overlay's defensive clear handles it
146
+ }
147
+ /**
148
+ * Tears the plugin down at session end: release the surface binding, unsubscribe
149
+ * state-engine subscriptions, then drop the context. Subclasses overriding this MUST
150
+ * call `super.Dispose()`. Any final state save has already been flushed by the host
151
+ * (the debounced {@link RealtimeChannelContext.RequestSave} pipeline) before disposal.
152
+ */
153
+ Dispose() {
154
+ this.UnbindSurface();
155
+ this.Context = null;
156
+ }
157
+ }
158
+ //# sourceMappingURL=base-realtime-channel-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-realtime-channel-client.js","sourceRoot":"","sources":["../../../../../src/lib/components/realtime/channels/base-realtime-channel-client.ts"],"names":[],"mappings":"AAmHA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AACH,MAAM,OAAgB,yBAAyB;IAC7C;;;OAGG;IACO,OAAO,GAAkC,IAAI,CAAC;IAwCxD;;;;;;;;;;;;;OAaG;IACI,mBAAmB;QACxB,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;OAKG;IACI,UAAU;QACf,OAAO,IAAI,CAAC,mBAAmB,EAAE,IAAI,IAAI,CAAC;IAC5C,CAAC;IAED;;;;;;;;;;OAUG;IACI,oBAAoB;QACzB,OAAO,IAAI,CAAC;IACd,CAAC;IAYD;;;;;OAKG;IACI,aAAa;QAClB,8BAA8B;IAChC,CAAC;IAED;;;;OAIG;IACI,UAAU,CAAC,GAA2B;QAC3C,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC;QACnB,IAAI,CAAC,YAAY,EAAE,CAAC;IACtB,CAAC;IAED;;;;OAIG;IACO,YAAY;QACpB,iCAAiC;IACnC,CAAC;IAED;;;;OAIG;IACI,cAAc;QACnB,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;;;;;;OAUG;IACI,YAAY,CAAC,SAAiB;QACnC,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;;;;OAKG;IACI,gBAAgB;QACrB,oDAAoD;IACtD,CAAC;IAED;;;;;OAKG;IACI,OAAO;QACZ,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;IACtB,CAAC;CACF","sourcesContent":["import type { Type } from '@angular/core';\nimport { JSONValue, RealtimeToolDefinition } from '@memberjunction/ai';\n\n/**\n * Host services handed to a {@link BaseRealtimeChannelClient} at {@link BaseRealtimeChannelClient.Initialize}.\n *\n * The context is the plugin's ONLY line back to the live session — channels never talk to\n * `RealtimeSessionService` (or any host component) directly, which is what keeps them drop-in\n * plugins. Every member is host-implemented:\n *\n * - the SESSION SERVICE supplies {@link SendContextNote} (perception feed into the live\n * model), {@link RequestSave} (debounced state-of-record persistence onto the session's\n * `MJ: AI Agent Session Channels` row) and {@link AgentName};\n * - the OVERLAY SHELL wires {@link SetFocusMode} (through the service's focus stream) so a\n * channel surface can request the focus layout — main call column collapsed, surface\n * panel filling the overlay, floating call pill riding on top.\n */\nexport interface RealtimeChannelContext {\n /** Display name of the agent the live session fronts (e.g. `\"Sage\"`), fixed at session start. */\n AgentName: string;\n\n /**\n * Feeds a background context note into the live realtime model (no spoken reply is\n * requested) — the PERCEPTION direction of the channel: serialized state deltas flow here\n * so the agent stays aware of what's on the surface. No-op when the session isn't live.\n */\n SendContextNote(text: string): void;\n\n /**\n * Asks the host to persist `stateJson` as this channel's state of record. The host\n * DEBOUNCES (a change burst becomes one save) and flushes any pending save at session\n * teardown — the plugin just calls this on every state mutation and never schedules\n * timers itself. Best-effort: persistence failures are logged host-side, never thrown.\n */\n RequestSave(stateJson: string): void;\n\n /**\n * Requests (or releases) the FOCUS layout for this channel's surface: the overlay\n * collapses the main call column so the surface owns the screen, with a compact floating\n * call pill keeping mute / thread / end reachable. Any channel may request it; the host\n * tracks which channel holds focus and routes the pill's \"exit\" back to it via\n * {@link BaseRealtimeChannelClient.RequestFocusExit}.\n */\n SetFocusMode(on: boolean): void;\n\n /**\n * Asks the live model to SPEAK a response to the supplied instructions RIGHT NOW —\n * the channel's \"react to this\" path, e.g. a widget submission the user expects an\n * audible reaction to ({@link SendContextNote} deliberately never triggers speech).\n * Rides the realtime client's spoken-update channel, so on some providers the spoken\n * reply is narration-kind (ephemeral, not persisted as a caption). OPTIONAL member:\n * older host contexts may not supply it — plugins must call it null-safely.\n */\n RequestSpokenResponse?(instructions: string): void;\n\n /**\n * Persists a snapshot of the channel's state as a first-class versioned artifact\n * (`MJ: Artifacts` + version, linked into conversation history when possible) — e.g. the\n * whiteboard's \"Save to artifacts\". Distinct from {@link RealtimeChannelContext.RequestSave},\n * which maintains the session's rolling state of record. Best-effort: resolves to the\n * created Artifact ID, or `null` on failure (logged host-side, never thrown). Works during\n * the call AND right after it ends (the host retains the session id for late saves).\n */\n SaveAsArtifact(name: string, contentJson: string): Promise<string | null>;\n\n /**\n * The live `MJ: AI Agent Sessions` id this channel belongs to, or `null` before the\n * session has minted / after it has torn down. A channel whose tools or surface drive a\n * SERVER-SIDE resource (e.g. the Remote Browser channel's server-hosted browser) passes\n * this as the `agentSessionID` argument to its own GraphQL resolvers via\n * {@link ExecuteServerAction}. Most channels (whiteboard, shared doc) keep all state\n * client-side and never read it.\n */\n AgentSessionID: string | null;\n\n /**\n * Executes a CHANNEL-SPECIFIC GraphQL operation against the session's MJ server — the\n * escape hatch for channels backed by a SERVER-SIDE resource that the generic\n * {@link RequestSave} / {@link SaveAsArtifact} contract doesn't cover (e.g. the Remote\n * Browser channel driving a server-hosted browser through its own\n * `ExecuteRemoteBrowserAction` mutation + `RemoteBrowserSnapshot` query).\n *\n * The host runs the operation through the SAME provider the live session uses, so the\n * request rides the authenticated session. Best-effort and tolerant: a transport or\n * server error resolves to `null` (logged host-side) rather than throwing, so a channel\n * can map the failure to a model-readable result string without `try/catch`.\n *\n * @typeParam TResult The expected shape of the GraphQL operation's data payload.\n * @param query The GraphQL query/mutation document.\n * @param variables The operation variables (all JSON-serializable).\n * @returns The operation's `data` payload, or `null` on any failure / when no session is live.\n */\n ExecuteServerAction<TResult>(query: string, variables: Record<string, JSONValue>): Promise<TResult | null>;\n}\n\n/**\n * The first-run INTRO content for an interactive channel — the concise \"what is this surface\n * and how do I use it\" copy the overlay shows the very first time a user opens this channel's\n * tab (persisted \"seen\" per user, so it's shown ONCE per channel per user).\n *\n * A channel opts in by overriding {@link BaseRealtimeChannelClient.GetOnboardingDetails}; the\n * default returns `null`, so the base Voice/text channel (which has no plugin at all) AND any\n * plugin that doesn't override it show nothing.\n */\nexport interface ChannelOnboardingDetails {\n /** Short title, usually the surface name (e.g. `\"Whiteboard\"`). */\n Heading: string;\n /** One or two sentences: what the surface is and what the user can expect to see on it. */\n Description: string;\n /** Optional quick-tip bullets (kept to 2-3 short, scannable lines). */\n Tips?: string[];\n /** Optional Font Awesome icon class for the intro panel (e.g. `'fa-solid fa-chalkboard'`). */\n IconClass?: string;\n}\n\n/**\n * Base class for CLIENT-SIDE interactive-channel plugins (per\n * `plans/ai-agent-sessions.md` → \"Interactive Channels\" / \"Pluggable Channel Interfaces\").\n *\n * An interactive channel is a bidirectional surface the session's single realtime agent\n * both PERCEIVES and ACTS UPON (whiteboard, shared doc, map, …). A concrete plugin\n * contributes everything the channel needs, so the session service / call overlay carry\n * ZERO channel-specific wiring:\n *\n * 1. a CLIENT-EXECUTED TOOL SET ({@link GetToolDefinitions}, declared to the realtime\n * model at session mint) plus the local executor ({@link ApplyAgentTool}) the host\n * routes `{@link ToolNamePrefix}*` calls to — the ACTION direction;\n * 2. a STATE→CONTEXT SERIALIZER policy — the plugin owns its state engine and pushes\n * coalesced deltas through {@link RealtimeChannelContext.SendContextNote} — the\n * PERCEPTION direction;\n * 3. an OPTIONAL ANGULAR SURFACE ({@link GetSurfaceComponent}) the overlay creates dynamically\n * in a channel tab, handed back through {@link BindSurface} so the plugin wires its own\n * inputs/outputs (the host never knows the component's API). A channel may be **server-only**\n * (no rendered surface) — e.g. a bridge-contributed meeting-controls or native-whiteboard\n * channel whose surface lives on the external platform, not in MJ. Such a channel returns\n * `null` from {@link GetSurfaceComponent} ({@link HasSurface} is `false`) and the overlay\n * simply skips its tab while still wiring its tools + perception;\n * 4. a STATE OF RECORD ({@link SerializeState}, persisted via\n * {@link RealtimeChannelContext.RequestSave} under {@link ChannelName}).\n *\n * ### Registration & resolution (mirrors the realtime model drivers)\n * Concrete plugins are `@RegisterClass(BaseRealtimeChannelClient, '<ClientPluginClass>')`\n * and are resolved at session start from the `MJ: AI Agent Channels` registry: each ACTIVE\n * row's `ClientPluginClass` is the ClassFactory key (exactly how `BaseRealtimeClient`\n * drivers resolve by provider key). Ship a `Load<YourChannel>()` no-op alongside the class\n * and call it from a static code path to defeat tree-shaking.\n *\n * ### Lifecycle — ONE INSTANCE PER SESSION (not a singleton)\n * `ClassFactory.CreateInstance` → {@link Initialize}(ctx) → zero or more\n * {@link BindSurface}/{@link UnbindSurface} cycles (the surface pane is created/destroyed\n * with the overlay's tab panel, e.g. collapse/expand) → {@link Dispose} at teardown.\n * {@link ApplyAgentTool} MUST work with NO surface bound (apply to the state engine\n * directly; skip the UI garnish) — tool calls can arrive while the panel is collapsed.\n *\n * @typeParam TSurface The plugin's Angular surface component type. The host only ever\n * sees the default (`object`) — the typed parameter exists so concrete plugins get a\n * fully typed {@link BindSurface} without casts.\n */\nexport abstract class BaseRealtimeChannelClient<TSurface extends object = object> {\n /**\n * The host context, available from {@link Initialize} until {@link Dispose}.\n * `null` outside that window — guard with `?.` in any code that can run early/late.\n */\n protected Context: RealtimeChannelContext | null = null;\n\n /**\n * The channel definition name — MUST match the `MJ: AI Agent Channels` row's `Name`\n * (e.g. `'Whiteboard'`). Used as the persistence key for {@link SerializeState} saves\n * and as the channel tab's stable key.\n */\n public abstract get ChannelName(): string;\n\n /**\n * The shared name prefix of every tool this channel exposes (e.g. `'Whiteboard_'`).\n * The host registers ONE local-execution route per plugin: tool calls whose name starts\n * with this prefix go to {@link ApplyAgentTool} instead of the server relay.\n */\n public abstract get ToolNamePrefix(): string;\n\n /** Label for the channel's tab on the overlay's surface panel (e.g. `'Whiteboard'`). */\n public abstract get TabTitle(): string;\n\n /** Font Awesome icon class for the channel's tab (e.g. `'fa-solid fa-chalkboard'`). */\n public abstract get TabIcon(): string;\n\n /**\n * The channel's CLIENT-EXECUTED tool declarations, aggregated by the session service\n * into the `clientTools` set declared to the realtime model at session mint. The server\n * only DECLARES these — execution stays in the browser via {@link ApplyAgentTool}.\n */\n public abstract GetToolDefinitions(): RealtimeToolDefinition[];\n\n /**\n * Executes ONE agent tool call locally (the ACTION direction) and returns the result\n * JSON string fed back to the model as the `tool_response`. Called for every tool whose\n * name starts with {@link ToolNamePrefix}. Must work both WITH a bound surface (apply +\n * UI garnish) and WITHOUT one (apply to the state engine directly — the tab pane may not\n * exist, e.g. the surface panel is collapsed). Should not throw: return a\n * `{ success: false, error }` payload so the model can narrate the failure (the host\n * additionally wraps anything thrown).\n */\n public abstract ApplyAgentTool(toolName: string, argsJson: string): string | Promise<string>;\n\n /**\n * The Angular component the overlay creates dynamically as this channel's tab pane, or `null`\n * for a **server-only** channel that renders no MJ surface (its surface, if any, lives on the\n * external platform — e.g. a bridge-contributed native whiteboard or meeting-controls channel).\n *\n * When this returns `null`, the overlay renders NO tab for the channel and never calls\n * {@link BindSurface}/{@link UnbindSurface} — but the channel's tools ({@link GetToolDefinitions} /\n * {@link ApplyAgentTool}) and perception ({@link RealtimeChannelContext.SendContextNote}) still run.\n * A created surface instance is handed straight back via {@link BindSurface}; the host treats it as\n * opaque.\n *\n * Default: `null` (server-only). A channel with a rendered surface overrides this to return its\n * component type.\n */\n public GetSurfaceComponent(): Type<TSurface> | null {\n return null;\n }\n\n /**\n * Whether this channel has a rendered MJ surface ({@link GetSurfaceComponent} returns non-null).\n * The overlay uses this to decide whether to register a surface tab; server-only channels are\n * `false`. Override only if surface availability must be decided WITHOUT constructing the type\n * (the default calls {@link GetSurfaceComponent} once).\n */\n public HasSurface(): boolean {\n return this.GetSurfaceComponent() != null;\n }\n\n /**\n * The channel's FIRST-RUN INTRO content, or `null` when the channel offers no onboarding.\n * The overlay shows this once per channel per user — the first time the user opens this\n * channel's surface tab — and remembers \"seen\" via the user's settings (NOT localStorage),\n * so it never re-appears on later sessions or other devices.\n *\n * Default: `null` (no intro). The base Voice/text channel has no plugin at all, so it never\n * shows an intro; an interactive channel with a surface worth explaining (whiteboard, remote\n * browser, …) overrides this to return its {@link ChannelOnboardingDetails}. A plugin that\n * doesn't override it simply shows nothing — onboarding is strictly opt-in.\n */\n public GetOnboardingDetails(): ChannelOnboardingDetails | null {\n return null;\n }\n\n /**\n * Called by the host right after it created the surface component (and BEFORE the\n * component's first change detection, so inputs set here are visible in its `ngOnInit`).\n * The plugin — which knows its own component type — sets inputs (state engine, agent\n * name, …) and subscribes outputs here, wiring perception/garnish flows back through\n * {@link Context}. May be called again with a NEW instance after an\n * {@link UnbindSurface} (the pane is destroyed/recreated with the tab panel).\n */\n public abstract BindSurface(instance: TSurface): void;\n\n /**\n * Called by the host when the surface component is being destroyed (tab panel\n * collapsed / overlay torn down). Drop the instance reference and unsubscribe any\n * output subscriptions — after this, {@link ApplyAgentTool} runs in its no-surface\n * mode. Default: no-op.\n */\n public UnbindSurface(): void {\n // default: nothing to release\n }\n\n /**\n * Binds the host context and invokes the {@link OnInitialize} hook. Called exactly once\n * per session, right after ClassFactory instantiation and before any tool call or\n * surface bind.\n */\n public Initialize(ctx: RealtimeChannelContext): void {\n this.Context = ctx;\n this.OnInitialize();\n }\n\n /**\n * Subclass hook invoked from {@link Initialize} once {@link Context} is bound — wire\n * state-engine subscriptions (e.g. state change → `Context.RequestSave(...)`) here.\n * Default: no-op.\n */\n protected OnInitialize(): void {\n // default: nothing to initialize\n }\n\n /**\n * Serializes the channel's current state of record (the payload persisted on the\n * session's channel row), or `null` when the channel keeps no persistent state.\n * Default: `null`.\n */\n public SerializeState(): string | null {\n return null;\n }\n\n /**\n * Restores a PRIOR session's saved channel state (the payload a previous session\n * persisted via {@link SerializeState} / {@link RealtimeChannelContext.RequestSave}).\n * Invoked by the session host AFTER {@link Initialize} and BEFORE any surface binding,\n * when a prior session's saved state exists for this channel.\n *\n * Returns `true` when the state was applied; `false` when the channel ignored it —\n * either because it keeps no persistent state (this default) or because the payload was\n * malformed/incompatible. Implementations MUST be tolerant: never throw on bad input,\n * just return `false` and start fresh.\n */\n public RestoreState(stateJson: string): boolean {\n return false;\n }\n\n /**\n * The focus pill's \"exit\" affordance, routed by the overlay to the channel that holds\n * focus. Implementations should leave focus mode through their OWN surface (so surface\n * toggles stay in sync), ultimately emitting `Context.SetFocusMode(false)`. The overlay\n * defensively clears its layout flag as well, so a no-op default is safe.\n */\n public RequestFocusExit(): void {\n // default: the overlay's defensive clear handles it\n }\n\n /**\n * Tears the plugin down at session end: release the surface binding, unsubscribe\n * state-engine subscriptions, then drop the context. Subclasses overriding this MUST\n * call `super.Dispose()`. Any final state save has already been flushed by the host\n * (the debounced {@link RealtimeChannelContext.RequestSave} pipeline) before disposal.\n */\n public Dispose(): void {\n this.UnbindSurface();\n this.Context = null;\n }\n}\n"]}
@@ -0,0 +1,25 @@
1
+ import { EventEmitter } from '@angular/core';
2
+ import { ChannelOnboardingDetails } from './base-realtime-channel-client';
3
+ import * as i0 from "@angular/core";
4
+ /**
5
+ * The FIRST-RUN INTRO overlay for an interactive channel — a generic, channel-agnostic card
6
+ * the surface panel floats over a channel's pane the very first time a user opens that channel
7
+ * (whiteboard, remote browser, …). It renders whatever {@link ChannelOnboardingDetails} the
8
+ * channel plugin supplied (icon · heading · description · optional tips) and a single "Got it"
9
+ * action plus a small ✕ — both emit {@link Dismissed}, which the host uses to mark the channel
10
+ * seen (per user, via the user's settings) and hide the panel.
11
+ *
12
+ * This component owns NO persistence or channel knowledge: it's a pure presenter wired by
13
+ * `RealtimeSurfaceTabsComponent`, so it stays reusable for any current or future channel. When
14
+ * {@link Content} is `null` it renders nothing (the host already gates on that, but the guard
15
+ * keeps the component safe to drop in unconditionally).
16
+ */
17
+ export declare class ChannelOnboardingPanelComponent {
18
+ /** The intro content to present, or `null` to render nothing. */
19
+ Content: ChannelOnboardingDetails | null;
20
+ /** Emitted when the user dismisses the intro (the "Got it" button or the ✕). */
21
+ Dismissed: EventEmitter<void>;
22
+ static ɵfac: i0.ɵɵFactoryDeclaration<ChannelOnboardingPanelComponent, never>;
23
+ static ɵcmp: i0.ɵɵComponentDeclaration<ChannelOnboardingPanelComponent, "mj-channel-onboarding-panel", never, { "Content": { "alias": "Content"; "required": false; }; }, { "Dismissed": "Dismissed"; }, never, never, true, never>;
24
+ }
25
+ //# sourceMappingURL=channel-onboarding-panel.component.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"channel-onboarding-panel.component.d.ts","sourceRoot":"","sources":["../../../../../src/lib/components/realtime/channels/channel-onboarding-panel.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,YAAY,EAAiB,MAAM,eAAe,CAAC;AAEvE,OAAO,EAAE,wBAAwB,EAAE,MAAM,gCAAgC,CAAC;;AAE1E;;;;;;;;;;;;GAYG;AACH,qBAgJa,+BAA+B;IAC1C,iEAAiE;IACxD,OAAO,EAAE,wBAAwB,GAAG,IAAI,CAAQ;IAEzD,gFAAgF;IACtE,SAAS,qBAA4B;yCALpC,+BAA+B;2CAA/B,+BAA+B;CAM3C"}
@@ -0,0 +1,140 @@
1
+ import { Component, EventEmitter, Input, Output } from '@angular/core';
2
+ import { MJButtonDirective } from '@memberjunction/ng-ui-components';
3
+ import * as i0 from "@angular/core";
4
+ function ChannelOnboardingPanelComponent_Conditional_0_Conditional_4_Template(rf, ctx) { if (rf & 1) {
5
+ i0.ɵɵelementStart(0, "div", 4);
6
+ i0.ɵɵelement(1, "i");
7
+ i0.ɵɵelementEnd();
8
+ } if (rf & 2) {
9
+ const content_r3 = i0.ɵɵnextContext();
10
+ i0.ɵɵadvance();
11
+ i0.ɵɵclassMap(content_r3.IconClass);
12
+ } }
13
+ function ChannelOnboardingPanelComponent_Conditional_0_Conditional_9_For_2_Template(rf, ctx) { if (rf & 1) {
14
+ i0.ɵɵelementStart(0, "li", 10);
15
+ i0.ɵɵelement(1, "i", 11);
16
+ i0.ɵɵelementStart(2, "span");
17
+ i0.ɵɵtext(3);
18
+ i0.ɵɵelementEnd()();
19
+ } if (rf & 2) {
20
+ const tip_r4 = ctx.$implicit;
21
+ i0.ɵɵadvance(3);
22
+ i0.ɵɵtextInterpolate(tip_r4);
23
+ } }
24
+ function ChannelOnboardingPanelComponent_Conditional_0_Conditional_9_Template(rf, ctx) { if (rf & 1) {
25
+ i0.ɵɵelementStart(0, "ul", 7);
26
+ i0.ɵɵrepeaterCreate(1, ChannelOnboardingPanelComponent_Conditional_0_Conditional_9_For_2_Template, 4, 1, "li", 10, i0.ɵɵrepeaterTrackByIdentity);
27
+ i0.ɵɵelementEnd();
28
+ } if (rf & 2) {
29
+ const content_r3 = i0.ɵɵnextContext();
30
+ i0.ɵɵadvance();
31
+ i0.ɵɵrepeater(content_r3.Tips);
32
+ } }
33
+ function ChannelOnboardingPanelComponent_Conditional_0_Template(rf, ctx) { if (rf & 1) {
34
+ const _r1 = i0.ɵɵgetCurrentView();
35
+ i0.ɵɵelementStart(0, "div", 0)(1, "div", 1)(2, "button", 2);
36
+ i0.ɵɵlistener("click", function ChannelOnboardingPanelComponent_Conditional_0_Template_button_click_2_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.Dismissed.emit()); });
37
+ i0.ɵɵelement(3, "i", 3);
38
+ i0.ɵɵelementEnd();
39
+ i0.ɵɵconditionalCreate(4, ChannelOnboardingPanelComponent_Conditional_0_Conditional_4_Template, 2, 2, "div", 4);
40
+ i0.ɵɵelementStart(5, "h3", 5);
41
+ i0.ɵɵtext(6);
42
+ i0.ɵɵelementEnd();
43
+ i0.ɵɵelementStart(7, "p", 6);
44
+ i0.ɵɵtext(8);
45
+ i0.ɵɵelementEnd();
46
+ i0.ɵɵconditionalCreate(9, ChannelOnboardingPanelComponent_Conditional_0_Conditional_9_Template, 3, 0, "ul", 7);
47
+ i0.ɵɵelementStart(10, "div", 8)(11, "button", 9);
48
+ i0.ɵɵlistener("click", function ChannelOnboardingPanelComponent_Conditional_0_Template_button_click_11_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.Dismissed.emit()); });
49
+ i0.ɵɵtext(12, " Got it ");
50
+ i0.ɵɵelementEnd()()()();
51
+ } if (rf & 2) {
52
+ const content_r3 = ctx;
53
+ i0.ɵɵattribute("aria-label", content_r3.Heading);
54
+ i0.ɵɵadvance(4);
55
+ i0.ɵɵconditional(content_r3.IconClass ? 4 : -1);
56
+ i0.ɵɵadvance(2);
57
+ i0.ɵɵtextInterpolate(content_r3.Heading);
58
+ i0.ɵɵadvance(2);
59
+ i0.ɵɵtextInterpolate(content_r3.Description);
60
+ i0.ɵɵadvance();
61
+ i0.ɵɵconditional((content_r3.Tips == null ? null : content_r3.Tips.length) ? 9 : -1);
62
+ i0.ɵɵadvance(2);
63
+ i0.ɵɵproperty("variant", "primary");
64
+ } }
65
+ /**
66
+ * The FIRST-RUN INTRO overlay for an interactive channel — a generic, channel-agnostic card
67
+ * the surface panel floats over a channel's pane the very first time a user opens that channel
68
+ * (whiteboard, remote browser, …). It renders whatever {@link ChannelOnboardingDetails} the
69
+ * channel plugin supplied (icon · heading · description · optional tips) and a single "Got it"
70
+ * action plus a small ✕ — both emit {@link Dismissed}, which the host uses to mark the channel
71
+ * seen (per user, via the user's settings) and hide the panel.
72
+ *
73
+ * This component owns NO persistence or channel knowledge: it's a pure presenter wired by
74
+ * `RealtimeSurfaceTabsComponent`, so it stays reusable for any current or future channel. When
75
+ * {@link Content} is `null` it renders nothing (the host already gates on that, but the guard
76
+ * keeps the component safe to drop in unconditionally).
77
+ */
78
+ export class ChannelOnboardingPanelComponent {
79
+ /** The intro content to present, or `null` to render nothing. */
80
+ Content = null;
81
+ /** Emitted when the user dismisses the intro (the "Got it" button or the ✕). */
82
+ Dismissed = new EventEmitter();
83
+ static ɵfac = function ChannelOnboardingPanelComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || ChannelOnboardingPanelComponent)(); };
84
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ChannelOnboardingPanelComponent, selectors: [["mj-channel-onboarding-panel"]], inputs: { Content: "Content" }, outputs: { Dismissed: "Dismissed" }, decls: 1, vars: 1, consts: [["role", "dialog", "aria-modal", "false", 1, "onboarding"], [1, "onboarding__card"], ["type", "button", "title", "Dismiss", "aria-label", "Dismiss", 1, "onboarding__close", 3, "click"], ["aria-hidden", "true", 1, "fa-solid", "fa-xmark"], ["aria-hidden", "true", 1, "onboarding__icon"], [1, "onboarding__heading"], [1, "onboarding__description"], [1, "onboarding__tips"], [1, "onboarding__actions"], ["mjButton", "", "type", "button", 3, "click", "variant"], [1, "onboarding__tip"], ["aria-hidden", "true", 1, "fa-solid", "fa-check"]], template: function ChannelOnboardingPanelComponent_Template(rf, ctx) { if (rf & 1) {
85
+ i0.ɵɵconditionalCreate(0, ChannelOnboardingPanelComponent_Conditional_0_Template, 13, 6, "div", 0);
86
+ } if (rf & 2) {
87
+ let tmp_0_0;
88
+ i0.ɵɵconditional((tmp_0_0 = ctx.Content) ? 0 : -1, tmp_0_0);
89
+ } }, dependencies: [MJButtonDirective], styles: ["[_nghost-%COMP%] {\n position: absolute;\n inset: 0;\n display: block;\n z-index: 5;\n }\n .onboarding[_ngcontent-%COMP%] {\n position: absolute;\n inset: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 1.5rem;\n \n\n background: color-mix(in srgb, var(--mj-bg-overlay) 55%, transparent);\n }\n .onboarding__card[_ngcontent-%COMP%] {\n position: relative;\n width: 100%;\n max-width: 24rem;\n padding: 1.75rem 1.5rem 1.5rem;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-lg, 12px);\n background: var(--mj-bg-surface);\n box-shadow: 0 12px 32px color-mix(in srgb, var(--mj-bg-overlay) 35%, transparent);\n text-align: center;\n }\n .onboarding__close[_ngcontent-%COMP%] {\n position: absolute;\n top: 0.5rem;\n right: 0.5rem;\n width: 1.75rem;\n height: 1.75rem;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n border: none;\n border-radius: var(--mj-radius-full, 999px);\n background: transparent;\n color: var(--mj-text-muted);\n cursor: pointer;\n transition: background 0.15s ease, color 0.15s ease;\n }\n .onboarding__close[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n }\n .onboarding__icon[_ngcontent-%COMP%] {\n width: 3rem;\n height: 3rem;\n margin: 0 auto 0.75rem;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n border-radius: var(--mj-radius-full, 999px);\n font-size: 1.35rem;\n color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface-card));\n }\n .onboarding__heading[_ngcontent-%COMP%] {\n margin: 0 0 0.4rem;\n font-size: 1.15rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n }\n .onboarding__description[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 0.9rem;\n line-height: 1.45;\n color: var(--mj-text-secondary);\n }\n .onboarding__tips[_ngcontent-%COMP%] {\n margin: 1rem 0 0;\n padding: 0;\n list-style: none;\n text-align: left;\n }\n .onboarding__tip[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: 0.5rem;\n padding: 0.3rem 0;\n font-size: 0.85rem;\n line-height: 1.4;\n color: var(--mj-text-secondary);\n }\n .onboarding__tip[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n margin-top: 0.18rem;\n font-size: 0.75rem;\n color: var(--mj-brand-primary);\n }\n .onboarding__actions[_ngcontent-%COMP%] {\n margin-top: 1.25rem;\n display: flex;\n justify-content: center;\n }"] });
90
+ }
91
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ChannelOnboardingPanelComponent, [{
92
+ type: Component,
93
+ args: [{ standalone: true, selector: 'mj-channel-onboarding-panel', imports: [MJButtonDirective], template: `
94
+ @if (Content; as content) {
95
+ <div class="onboarding" role="dialog" aria-modal="false" [attr.aria-label]="content.Heading">
96
+ <div class="onboarding__card">
97
+ <button type="button"
98
+ class="onboarding__close"
99
+ (click)="Dismissed.emit()"
100
+ title="Dismiss"
101
+ aria-label="Dismiss">
102
+ <i class="fa-solid fa-xmark" aria-hidden="true"></i>
103
+ </button>
104
+
105
+ @if (content.IconClass) {
106
+ <div class="onboarding__icon" aria-hidden="true">
107
+ <i [class]="content.IconClass"></i>
108
+ </div>
109
+ }
110
+
111
+ <h3 class="onboarding__heading">{{ content.Heading }}</h3>
112
+ <p class="onboarding__description">{{ content.Description }}</p>
113
+
114
+ @if (content.Tips?.length) {
115
+ <ul class="onboarding__tips">
116
+ @for (tip of content.Tips; track tip) {
117
+ <li class="onboarding__tip">
118
+ <i class="fa-solid fa-check" aria-hidden="true"></i>
119
+ <span>{{ tip }}</span>
120
+ </li>
121
+ }
122
+ </ul>
123
+ }
124
+
125
+ <div class="onboarding__actions">
126
+ <button mjButton [variant]="'primary'" type="button" (click)="Dismissed.emit()">
127
+ Got it
128
+ </button>
129
+ </div>
130
+ </div>
131
+ </div>
132
+ }
133
+ `, styles: ["\n :host {\n position: absolute;\n inset: 0;\n display: block;\n z-index: 5;\n }\n .onboarding {\n position: absolute;\n inset: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 1.5rem;\n /* Translucent backdrop over the channel pane \u2014 token-derived, no hardcoded colors. */\n background: color-mix(in srgb, var(--mj-bg-overlay) 55%, transparent);\n }\n .onboarding__card {\n position: relative;\n width: 100%;\n max-width: 24rem;\n padding: 1.75rem 1.5rem 1.5rem;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-lg, 12px);\n background: var(--mj-bg-surface);\n box-shadow: 0 12px 32px color-mix(in srgb, var(--mj-bg-overlay) 35%, transparent);\n text-align: center;\n }\n .onboarding__close {\n position: absolute;\n top: 0.5rem;\n right: 0.5rem;\n width: 1.75rem;\n height: 1.75rem;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n border: none;\n border-radius: var(--mj-radius-full, 999px);\n background: transparent;\n color: var(--mj-text-muted);\n cursor: pointer;\n transition: background 0.15s ease, color 0.15s ease;\n }\n .onboarding__close:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n }\n .onboarding__icon {\n width: 3rem;\n height: 3rem;\n margin: 0 auto 0.75rem;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n border-radius: var(--mj-radius-full, 999px);\n font-size: 1.35rem;\n color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface-card));\n }\n .onboarding__heading {\n margin: 0 0 0.4rem;\n font-size: 1.15rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n }\n .onboarding__description {\n margin: 0;\n font-size: 0.9rem;\n line-height: 1.45;\n color: var(--mj-text-secondary);\n }\n .onboarding__tips {\n margin: 1rem 0 0;\n padding: 0;\n list-style: none;\n text-align: left;\n }\n .onboarding__tip {\n display: flex;\n align-items: flex-start;\n gap: 0.5rem;\n padding: 0.3rem 0;\n font-size: 0.85rem;\n line-height: 1.4;\n color: var(--mj-text-secondary);\n }\n .onboarding__tip i {\n margin-top: 0.18rem;\n font-size: 0.75rem;\n color: var(--mj-brand-primary);\n }\n .onboarding__actions {\n margin-top: 1.25rem;\n display: flex;\n justify-content: center;\n }\n "] }]
134
+ }], null, { Content: [{
135
+ type: Input
136
+ }], Dismissed: [{
137
+ type: Output
138
+ }] }); })();
139
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ChannelOnboardingPanelComponent, { className: "ChannelOnboardingPanelComponent", filePath: "src/lib/components/realtime/channels/channel-onboarding-panel.component.ts", lineNumber: 162 }); })();
140
+ //# sourceMappingURL=channel-onboarding-panel.component.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"channel-onboarding-panel.component.js","sourceRoot":"","sources":["../../../../../src/lib/components/realtime/channels/channel-onboarding-panel.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;;;IAiCzD,8BAAiD;IAC/C,oBAAmC;IACrC,iBAAM;;;IADD,cAA2B;IAA3B,mCAA2B;;;IAU5B,8BAA4B;IAC1B,wBAAoD;IACpD,4BAAM;IAAA,YAAS;IACjB,AADiB,iBAAO,EACnB;;;IADG,eAAS;IAAT,4BAAS;;;IAJrB,6BAA6B;IAC3B,gJAKC;IACH,iBAAK;;;IANH,cAKC;IALD,8BAKC;;;;IAxBL,AADF,AADF,8BAA6F,aAC7D,gBAKC;IAFrB,mMAAS,uBAAgB,KAAC;IAGhC,uBAAoD;IACtD,iBAAS;IAET,+GAAyB;IAMzB,6BAAgC;IAAA,YAAqB;IAAA,iBAAK;IAC1D,4BAAmC;IAAA,YAAyB;IAAA,iBAAI;IAEhE,8GAA4B;IAY1B,AADF,+BAAiC,iBACiD;IAA3B,oMAAS,uBAAgB,KAAC;IAC7E,yBACF;IAGN,AADE,AADE,AADE,iBAAS,EACL,EACF,EACF;;;;IA1BF,eAIC;IAJD,+CAIC;IAE+B,eAAqB;IAArB,wCAAqB;IAClB,eAAyB;IAAzB,4CAAyB;IAE5D,cASC;IATD,oFASC;IAGkB,eAAqB;IAArB,mCAAqB;;AAlDlD;;;;;;;;;;;;GAYG;AAiJH,MAAM,OAAO,+BAA+B;IAC1C,iEAAiE;IACxD,OAAO,GAAoC,IAAI,CAAC;IAEzD,gFAAgF;IACtE,SAAS,GAAG,IAAI,YAAY,EAAQ,CAAC;yHALpC,+BAA+B;6DAA/B,+BAA+B;YA3IxC,kGAA2B;;;YAA3B,2DAsCC;4BAxCO,iBAAiB;;iFA6IhB,+BAA+B;cAhJ3C,SAAS;6BACI,IAAI,YACN,6BAA6B,WAC9B,CAAC,iBAAiB,CAAC,YAClB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCT;;kBAsGA,KAAK;;kBAGL,MAAM;;kFALI,+BAA+B","sourcesContent":["import { Component, EventEmitter, Input, Output } from '@angular/core';\nimport { MJButtonDirective } from '@memberjunction/ng-ui-components';\nimport { ChannelOnboardingDetails } from './base-realtime-channel-client';\n\n/**\n * The FIRST-RUN INTRO overlay for an interactive channel — a generic, channel-agnostic card\n * the surface panel floats over a channel's pane the very first time a user opens that channel\n * (whiteboard, remote browser, …). It renders whatever {@link ChannelOnboardingDetails} the\n * channel plugin supplied (icon · heading · description · optional tips) and a single \"Got it\"\n * action plus a small ✕ — both emit {@link Dismissed}, which the host uses to mark the channel\n * seen (per user, via the user's settings) and hide the panel.\n *\n * This component owns NO persistence or channel knowledge: it's a pure presenter wired by\n * `RealtimeSurfaceTabsComponent`, so it stays reusable for any current or future channel. When\n * {@link Content} is `null` it renders nothing (the host already gates on that, but the guard\n * keeps the component safe to drop in unconditionally).\n */\n@Component({\n standalone: true,\n selector: 'mj-channel-onboarding-panel',\n imports: [MJButtonDirective],\n template: `\n @if (Content; as content) {\n <div class=\"onboarding\" role=\"dialog\" aria-modal=\"false\" [attr.aria-label]=\"content.Heading\">\n <div class=\"onboarding__card\">\n <button type=\"button\"\n class=\"onboarding__close\"\n (click)=\"Dismissed.emit()\"\n title=\"Dismiss\"\n aria-label=\"Dismiss\">\n <i class=\"fa-solid fa-xmark\" aria-hidden=\"true\"></i>\n </button>\n\n @if (content.IconClass) {\n <div class=\"onboarding__icon\" aria-hidden=\"true\">\n <i [class]=\"content.IconClass\"></i>\n </div>\n }\n\n <h3 class=\"onboarding__heading\">{{ content.Heading }}</h3>\n <p class=\"onboarding__description\">{{ content.Description }}</p>\n\n @if (content.Tips?.length) {\n <ul class=\"onboarding__tips\">\n @for (tip of content.Tips; track tip) {\n <li class=\"onboarding__tip\">\n <i class=\"fa-solid fa-check\" aria-hidden=\"true\"></i>\n <span>{{ tip }}</span>\n </li>\n }\n </ul>\n }\n\n <div class=\"onboarding__actions\">\n <button mjButton [variant]=\"'primary'\" type=\"button\" (click)=\"Dismissed.emit()\">\n Got it\n </button>\n </div>\n </div>\n </div>\n }\n `,\n styles: [`\n :host {\n position: absolute;\n inset: 0;\n display: block;\n z-index: 5;\n }\n .onboarding {\n position: absolute;\n inset: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 1.5rem;\n /* Translucent backdrop over the channel pane — token-derived, no hardcoded colors. */\n background: color-mix(in srgb, var(--mj-bg-overlay) 55%, transparent);\n }\n .onboarding__card {\n position: relative;\n width: 100%;\n max-width: 24rem;\n padding: 1.75rem 1.5rem 1.5rem;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-lg, 12px);\n background: var(--mj-bg-surface);\n box-shadow: 0 12px 32px color-mix(in srgb, var(--mj-bg-overlay) 35%, transparent);\n text-align: center;\n }\n .onboarding__close {\n position: absolute;\n top: 0.5rem;\n right: 0.5rem;\n width: 1.75rem;\n height: 1.75rem;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n border: none;\n border-radius: var(--mj-radius-full, 999px);\n background: transparent;\n color: var(--mj-text-muted);\n cursor: pointer;\n transition: background 0.15s ease, color 0.15s ease;\n }\n .onboarding__close:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n }\n .onboarding__icon {\n width: 3rem;\n height: 3rem;\n margin: 0 auto 0.75rem;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n border-radius: var(--mj-radius-full, 999px);\n font-size: 1.35rem;\n color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface-card));\n }\n .onboarding__heading {\n margin: 0 0 0.4rem;\n font-size: 1.15rem;\n font-weight: 600;\n color: var(--mj-text-primary);\n }\n .onboarding__description {\n margin: 0;\n font-size: 0.9rem;\n line-height: 1.45;\n color: var(--mj-text-secondary);\n }\n .onboarding__tips {\n margin: 1rem 0 0;\n padding: 0;\n list-style: none;\n text-align: left;\n }\n .onboarding__tip {\n display: flex;\n align-items: flex-start;\n gap: 0.5rem;\n padding: 0.3rem 0;\n font-size: 0.85rem;\n line-height: 1.4;\n color: var(--mj-text-secondary);\n }\n .onboarding__tip i {\n margin-top: 0.18rem;\n font-size: 0.75rem;\n color: var(--mj-brand-primary);\n }\n .onboarding__actions {\n margin-top: 1.25rem;\n display: flex;\n justify-content: center;\n }\n `]\n})\nexport class ChannelOnboardingPanelComponent {\n /** The intro content to present, or `null` to render nothing. */\n @Input() Content: ChannelOnboardingDetails | null = null;\n\n /** Emitted when the user dismisses the intro (the \"Got it\" button or the ✕). */\n @Output() Dismissed = new EventEmitter<void>();\n}\n"]}
@@ -0,0 +1,35 @@
1
+ import { OnDestroy, OnInit } from '@angular/core';
2
+ import { BaseRealtimeChannelClient } from './base-realtime-channel-client';
3
+ import * as i0 from "@angular/core";
4
+ /**
5
+ * Generic pane host for an interactive channel's surface inside the overlay's tabbed
6
+ * surface panel. Given the per-session channel {@link Plugin}, it:
7
+ *
8
+ * 1. dynamically creates the plugin's surface component
9
+ * ({@link BaseRealtimeChannelClient.GetSurfaceComponent}) into its own view container;
10
+ * 2. immediately hands the created instance to
11
+ * {@link BaseRealtimeChannelClient.BindSurface} — synchronously, BEFORE the surface's
12
+ * first change detection, so inputs the plugin sets are visible in its `ngOnInit`;
13
+ * 3. notifies {@link BaseRealtimeChannelClient.UnbindSurface} when the pane is destroyed
14
+ * (panel collapsed / overlay torn down), flipping the plugin back into its
15
+ * no-surface tool-execution mode.
16
+ *
17
+ * This is how channel surfaces render with ZERO channel-specific wiring in the overlay:
18
+ * the host never knows the surface component's type or API — the plugin wires its own
19
+ * inputs/outputs in `BindSurface`.
20
+ *
21
+ * The created component is inserted as a SIBLING of this host element (standard
22
+ * `ViewContainerRef` semantics), so it participates directly in the pane's flex layout;
23
+ * the host element itself renders nothing (`display: none`).
24
+ */
25
+ export declare class RealtimeChannelPaneComponent implements OnInit, OnDestroy {
26
+ /** The per-session channel plugin whose surface this pane hosts. */
27
+ Plugin: BaseRealtimeChannelClient;
28
+ private viewContainer;
29
+ private surfaceRef;
30
+ ngOnInit(): void;
31
+ ngOnDestroy(): void;
32
+ static ɵfac: i0.ɵɵFactoryDeclaration<RealtimeChannelPaneComponent, never>;
33
+ static ɵcmp: i0.ɵɵComponentDeclaration<RealtimeChannelPaneComponent, "mj-realtime-channel-pane", never, { "Plugin": { "alias": "Plugin"; "required": true; }; }, {}, never, never, true, never>;
34
+ }
35
+ //# sourceMappingURL=realtime-channel-pane.component.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"realtime-channel-pane.component.d.ts","sourceRoot":"","sources":["../../../../../src/lib/components/realtime/channels/realtime-channel-pane.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkC,SAAS,EAAE,MAAM,EAA4B,MAAM,eAAe,CAAC;AAC5G,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;;AAE3E;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,qBAMa,4BAA6B,YAAW,MAAM,EAAE,SAAS;IACpE,oEAAoE;IACzC,MAAM,EAAG,yBAAyB,CAAC;IAE9D,OAAO,CAAC,aAAa,CAA4B;IACjD,OAAO,CAAC,UAAU,CAAqC;IAEvD,QAAQ,IAAI,IAAI;IAchB,WAAW,IAAI,IAAI;yCArBR,4BAA4B;2CAA5B,4BAA4B;CA0BxC"}
@@ -0,0 +1,58 @@
1
+ import { Component, Input, ViewContainerRef, inject } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ /**
4
+ * Generic pane host for an interactive channel's surface inside the overlay's tabbed
5
+ * surface panel. Given the per-session channel {@link Plugin}, it:
6
+ *
7
+ * 1. dynamically creates the plugin's surface component
8
+ * ({@link BaseRealtimeChannelClient.GetSurfaceComponent}) into its own view container;
9
+ * 2. immediately hands the created instance to
10
+ * {@link BaseRealtimeChannelClient.BindSurface} — synchronously, BEFORE the surface's
11
+ * first change detection, so inputs the plugin sets are visible in its `ngOnInit`;
12
+ * 3. notifies {@link BaseRealtimeChannelClient.UnbindSurface} when the pane is destroyed
13
+ * (panel collapsed / overlay torn down), flipping the plugin back into its
14
+ * no-surface tool-execution mode.
15
+ *
16
+ * This is how channel surfaces render with ZERO channel-specific wiring in the overlay:
17
+ * the host never knows the surface component's type or API — the plugin wires its own
18
+ * inputs/outputs in `BindSurface`.
19
+ *
20
+ * The created component is inserted as a SIBLING of this host element (standard
21
+ * `ViewContainerRef` semantics), so it participates directly in the pane's flex layout;
22
+ * the host element itself renders nothing (`display: none`).
23
+ */
24
+ export class RealtimeChannelPaneComponent {
25
+ /** The per-session channel plugin whose surface this pane hosts. */
26
+ Plugin;
27
+ viewContainer = inject(ViewContainerRef);
28
+ surfaceRef = null;
29
+ ngOnInit() {
30
+ // Server-only channels have no surface (GetSurfaceComponent === null). The overlay should not
31
+ // register a pane for them, but guard here too so a stray registration never crashes the panel.
32
+ const surface = this.Plugin.GetSurfaceComponent();
33
+ if (!surface) {
34
+ return;
35
+ }
36
+ this.surfaceRef = this.viewContainer.createComponent(surface);
37
+ // Bind BEFORE the created component's first change detection — inputs the plugin sets
38
+ // here are in place when the surface's ngOnInit runs.
39
+ this.Plugin.BindSurface(this.surfaceRef.instance);
40
+ this.surfaceRef.changeDetectorRef.markForCheck();
41
+ }
42
+ ngOnDestroy() {
43
+ this.Plugin.UnbindSurface();
44
+ this.surfaceRef?.destroy();
45
+ this.surfaceRef = null;
46
+ }
47
+ static ɵfac = function RealtimeChannelPaneComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || RealtimeChannelPaneComponent)(); };
48
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: RealtimeChannelPaneComponent, selectors: [["mj-realtime-channel-pane"]], inputs: { Plugin: "Plugin" }, decls: 0, vars: 0, template: function RealtimeChannelPaneComponent_Template(rf, ctx) { }, styles: ["[_nghost-%COMP%] { display: none; }"] });
49
+ }
50
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(RealtimeChannelPaneComponent, [{
51
+ type: Component,
52
+ args: [{ standalone: true, selector: 'mj-realtime-channel-pane', template: '', styles: [":host { display: none; }"] }]
53
+ }], null, { Plugin: [{
54
+ type: Input,
55
+ args: [{ required: true }]
56
+ }] }); })();
57
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(RealtimeChannelPaneComponent, { className: "RealtimeChannelPaneComponent", filePath: "src/lib/components/realtime/channels/realtime-channel-pane.component.ts", lineNumber: 31 }); })();
58
+ //# sourceMappingURL=realtime-channel-pane.component.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"realtime-channel-pane.component.js","sourceRoot":"","sources":["../../../../../src/lib/components/realtime/channels/realtime-channel-pane.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAgB,KAAK,EAAqB,gBAAgB,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;;AAG5G;;;;;;;;;;;;;;;;;;;;GAoBG;AAOH,MAAM,OAAO,4BAA4B;IACvC,oEAAoE;IACzC,MAAM,CAA6B;IAEtD,aAAa,GAAG,MAAM,CAAC,gBAAgB,CAAC,CAAC;IACzC,UAAU,GAAgC,IAAI,CAAC;IAEvD,QAAQ;QACN,8FAA8F;QAC9F,gGAAgG;QAChG,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,mBAAmB,EAAE,CAAC;QAClD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO;QACT,CAAC;QACD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;QAC9D,sFAAsF;QACtF,sDAAsD;QACtD,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QAClD,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,YAAY,EAAE,CAAC;IACnD,CAAC;IAED,WAAW;QACT,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;QAC5B,IAAI,CAAC,UAAU,EAAE,OAAO,EAAE,CAAC;QAC3B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;IACzB,CAAC;sHAzBU,4BAA4B;6DAA5B,4BAA4B;;iFAA5B,4BAA4B;cANxC,SAAS;6BACI,IAAI,YACN,0BAA0B,YAC1B,EAAE;;kBAKX,KAAK;mBAAC,EAAE,QAAQ,EAAE,IAAI,EAAE;;kFAFd,4BAA4B","sourcesContent":["import { Component, ComponentRef, Input, OnDestroy, OnInit, ViewContainerRef, inject } from '@angular/core';\nimport { BaseRealtimeChannelClient } from './base-realtime-channel-client';\n\n/**\n * Generic pane host for an interactive channel's surface inside the overlay's tabbed\n * surface panel. Given the per-session channel {@link Plugin}, it:\n *\n * 1. dynamically creates the plugin's surface component\n * ({@link BaseRealtimeChannelClient.GetSurfaceComponent}) into its own view container;\n * 2. immediately hands the created instance to\n * {@link BaseRealtimeChannelClient.BindSurface} — synchronously, BEFORE the surface's\n * first change detection, so inputs the plugin sets are visible in its `ngOnInit`;\n * 3. notifies {@link BaseRealtimeChannelClient.UnbindSurface} when the pane is destroyed\n * (panel collapsed / overlay torn down), flipping the plugin back into its\n * no-surface tool-execution mode.\n *\n * This is how channel surfaces render with ZERO channel-specific wiring in the overlay:\n * the host never knows the surface component's type or API — the plugin wires its own\n * inputs/outputs in `BindSurface`.\n *\n * The created component is inserted as a SIBLING of this host element (standard\n * `ViewContainerRef` semantics), so it participates directly in the pane's flex layout;\n * the host element itself renders nothing (`display: none`).\n */\n@Component({\n standalone: true,\n selector: 'mj-realtime-channel-pane',\n template: '',\n styles: [':host { display: none; }']\n})\nexport class RealtimeChannelPaneComponent implements OnInit, OnDestroy {\n /** The per-session channel plugin whose surface this pane hosts. */\n @Input({ required: true }) Plugin!: BaseRealtimeChannelClient;\n\n private viewContainer = inject(ViewContainerRef);\n private surfaceRef: ComponentRef<object> | null = null;\n\n ngOnInit(): void {\n // Server-only channels have no surface (GetSurfaceComponent === null). The overlay should not\n // register a pane for them, but guard here too so a stray registration never crashes the panel.\n const surface = this.Plugin.GetSurfaceComponent();\n if (!surface) {\n return;\n }\n this.surfaceRef = this.viewContainer.createComponent(surface);\n // Bind BEFORE the created component's first change detection — inputs the plugin sets\n // here are in place when the surface's ngOnInit runs.\n this.Plugin.BindSurface(this.surfaceRef.instance);\n this.surfaceRef.changeDetectorRef.markForCheck();\n }\n\n ngOnDestroy(): void {\n this.Plugin.UnbindSurface();\n this.surfaceRef?.destroy();\n this.surfaceRef = null;\n }\n}\n"]}
@@ -0,0 +1,63 @@
1
+ import { EventEmitter, OnInit, OnDestroy } from '@angular/core';
2
+ import { RealtimeSessionState, RealtimeDelegationCardVM } from './realtime-session-state';
3
+ import { ParsedDelegationArtifact } from '../../services/delegation-result-parser';
4
+ import * as i0 from "@angular/core";
5
+ /**
6
+ * The "Session activity" RIGHT RAIL of the call overlay: a compact, newest-first list
7
+ * of EVERY tool/agent call of the session — so parallel/multiple delegations live here
8
+ * and the conversation thread stays clean.
9
+ *
10
+ * Each entry shows agent name, status (Running w/ spinner | Done | Failed), the latest
11
+ * friendly step label, elapsed time for finished work, and a one-line result preview
12
+ * for done items. Active items are emphasized; finished items are dimmed.
13
+ *
14
+ * Collapsible via the chevron in its header (collapses to a slim toggle strip).
15
+ * Presentational over the same {@link RealtimeSessionState} the thread renders —
16
+ * no subscriptions of its own beyond the state's change notifications.
17
+ */
18
+ export declare class RealtimeActivityRailComponent implements OnInit, OnDestroy {
19
+ /** Maximum characters of the result preview in a done card. */
20
+ private static readonly PreviewMaxChars;
21
+ /** Shared live-session state, owned by the overlay shell. */
22
+ State: RealtimeSessionState;
23
+ /** Whether developer affordances ("Open run" links) are revealed (gear-gated). */
24
+ DevMode: boolean;
25
+ /**
26
+ * EMBEDDED mode: the rail renders as the content of the surface panel's Activity tab —
27
+ * its own header/collapse chrome is hidden (the panel's tab strip owns collapse) and it
28
+ * stretches to the pane's full width. Default `false` keeps the original standalone
29
+ * right-rail presentation for any other consumer.
30
+ */
31
+ Embedded: boolean;
32
+ /** Emitted with the delegated run's ID when an entry's dev "Open run" link is clicked. */
33
+ OpenRunRequested: EventEmitter<string>;
34
+ /** Emitted when an entry's "View" artifact chip is clicked (focuses the artifact's tab). */
35
+ OpenArtifactRequested: EventEmitter<ParsedDelegationArtifact>;
36
+ /** Whether the rail is collapsed to its slim toggle strip. */
37
+ Collapsed: boolean;
38
+ private changedSub?;
39
+ private cdr;
40
+ ngOnInit(): void;
41
+ ngOnDestroy(): void;
42
+ /** Toggle the rail between expanded and slim-collapsed. */
43
+ Toggle(): void;
44
+ /** track fn for the @for over cards. */
45
+ TrackCard(index: number, card: RealtimeDelegationCardVM): string;
46
+ /** Friendly label of the card's latest step. */
47
+ StepLabel(card: RealtimeDelegationCardVM): string;
48
+ /** Elapsed duration for finished work ("8s", "1m 04s"); null while running (kept cheap). */
49
+ Elapsed(card: RealtimeDelegationCardVM): string | null;
50
+ /** True when the dev "Open run" link should render for this card (gear on + run id known). */
51
+ ShowOpenRun(card: RealtimeDelegationCardVM): boolean;
52
+ /** Emits the open-run request for the card's delegated run. */
53
+ OpenRun(card: RealtimeDelegationCardVM): void;
54
+ /** The artifacts a done card carries (empty array when none — keeps the template simple). */
55
+ CardArtifacts(card: RealtimeDelegationCardVM): ParsedDelegationArtifact[];
56
+ /** Emits the open-artifact request for a card's produced artifact. */
57
+ OpenArtifact(artifact: ParsedDelegationArtifact): void;
58
+ /** One-line result preview for done items. */
59
+ Preview(card: RealtimeDelegationCardVM): string;
60
+ static ɵfac: i0.ɵɵFactoryDeclaration<RealtimeActivityRailComponent, never>;
61
+ static ɵcmp: i0.ɵɵComponentDeclaration<RealtimeActivityRailComponent, "mj-realtime-activity-rail", never, { "State": { "alias": "State"; "required": true; }; "DevMode": { "alias": "DevMode"; "required": false; }; "Embedded": { "alias": "Embedded"; "required": false; }; }, { "OpenRunRequested": "OpenRunRequested"; "OpenArtifactRequested": "OpenArtifactRequested"; }, never, never, true, never>;
62
+ }
63
+ //# sourceMappingURL=realtime-activity-rail.component.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"realtime-activity-rail.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/realtime/realtime-activity-rail.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,YAAY,EAAiB,MAAM,EAAE,SAAS,EAA6B,MAAM,eAAe,CAAC;AAGrH,OAAO,EACL,oBAAoB,EAAE,wBAAwB,EAC/C,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,wBAAwB,EAAE,MAAM,yCAAyC,CAAC;;AAEnF;;;;;;;;;;;;GAYG;AACH,qBAOa,6BAA8B,YAAW,MAAM,EAAE,SAAS;IACrE,+DAA+D;IAC/D,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAM;IAE7C,6DAA6D;IAClC,KAAK,EAAG,oBAAoB,CAAC;IAExD,kFAAkF;IACzE,OAAO,UAAS;IAEzB;;;;;OAKG;IACM,QAAQ,UAAS;IAE1B,0FAA0F;IAChF,gBAAgB,uBAA8B;IAExD,4FAA4F;IAClF,qBAAqB,yCAAgD;IAE/E,8DAA8D;IACvD,SAAS,UAAS;IAEzB,OAAO,CAAC,UAAU,CAAC,CAAe;IAClC,OAAO,CAAC,GAAG,CAA6B;IAExC,QAAQ,IAAI,IAAI;IAIhB,WAAW,IAAI,IAAI;IAInB,2DAA2D;IACpD,MAAM,IAAI,IAAI;IAIrB,wCAAwC;IACjC,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,wBAAwB,GAAG,MAAM;IAIvE,gDAAgD;IACzC,SAAS,CAAC,IAAI,EAAE,wBAAwB,GAAG,MAAM;IAIxD,4FAA4F;IACrF,OAAO,CAAC,IAAI,EAAE,wBAAwB,GAAG,MAAM,GAAG,IAAI;IAO7D,8FAA8F;IACvF,WAAW,CAAC,IAAI,EAAE,wBAAwB,GAAG,OAAO;IAI3D,+DAA+D;IACxD,OAAO,CAAC,IAAI,EAAE,wBAAwB,GAAG,IAAI;IAMpD,6FAA6F;IACtF,aAAa,CAAC,IAAI,EAAE,wBAAwB,GAAG,wBAAwB,EAAE;IAIhF,sEAAsE;IAC/D,YAAY,CAAC,QAAQ,EAAE,wBAAwB,GAAG,IAAI;IAI7D,8CAA8C;IACvC,OAAO,CAAC,IAAI,EAAE,wBAAwB,GAAG,MAAM;yCApF3C,6BAA6B;2CAA7B,6BAA6B;CAyFzC"}