@memberjunction/ng-conversations 6.2.0-edge.3 → 6.2.0-edge.5

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 (318) hide show
  1. package/README.md +33 -7
  2. package/dist/lib/components/collection/collection-view.component.d.ts.map +1 -1
  3. package/dist/lib/components/collection/collection-view.component.js +1 -0
  4. package/dist/lib/components/collection/collection-view.component.js.map +1 -1
  5. package/dist/lib/components/composer/ai-composer.component.d.ts +14 -2
  6. package/dist/lib/components/composer/ai-composer.component.d.ts.map +1 -1
  7. package/dist/lib/components/composer/ai-composer.component.js +35 -4
  8. package/dist/lib/components/composer/ai-composer.component.js.map +1 -1
  9. package/dist/lib/components/conversation/conversation-agent-picker.component.d.ts +1 -1
  10. package/dist/lib/components/conversation/conversation-agent-picker.component.js +3 -3
  11. package/dist/lib/components/conversation/conversation-agent-picker.component.js.map +1 -1
  12. package/dist/lib/components/conversation/conversation-chat-area.component.d.ts +651 -53
  13. package/dist/lib/components/conversation/conversation-chat-area.component.d.ts.map +1 -1
  14. package/dist/lib/components/conversation/conversation-chat-area.component.js +3002 -661
  15. package/dist/lib/components/conversation/conversation-chat-area.component.js.map +1 -1
  16. package/dist/lib/components/conversation/forks-popover.component.d.ts +37 -0
  17. package/dist/lib/components/conversation/forks-popover.component.d.ts.map +1 -0
  18. package/dist/lib/components/conversation/forks-popover.component.js +164 -0
  19. package/dist/lib/components/conversation/forks-popover.component.js.map +1 -0
  20. package/dist/lib/components/export/export-modal.component.d.ts +7 -2
  21. package/dist/lib/components/export/export-modal.component.d.ts.map +1 -1
  22. package/dist/lib/components/export/export-modal.component.js +16 -3
  23. package/dist/lib/components/export/export-modal.component.js.map +1 -1
  24. package/dist/lib/components/message/conversation-message-rating.component.d.ts.map +1 -1
  25. package/dist/lib/components/message/conversation-message-rating.component.js +11 -9
  26. package/dist/lib/components/message/conversation-message-rating.component.js.map +1 -1
  27. package/dist/lib/components/message/message-input.component.d.ts +96 -11
  28. package/dist/lib/components/message/message-input.component.d.ts.map +1 -1
  29. package/dist/lib/components/message/message-input.component.js +253 -112
  30. package/dist/lib/components/message/message-input.component.js.map +1 -1
  31. package/dist/lib/components/message/message-item.component.d.ts +304 -16
  32. package/dist/lib/components/message/message-item.component.d.ts.map +1 -1
  33. package/dist/lib/components/message/message-item.component.js +2029 -363
  34. package/dist/lib/components/message/message-item.component.js.map +1 -1
  35. package/dist/lib/components/message/message-list.component.d.ts +101 -22
  36. package/dist/lib/components/message/message-list.component.d.ts.map +1 -1
  37. package/dist/lib/components/message/message-list.component.js +326 -55
  38. package/dist/lib/components/message/message-list.component.js.map +1 -1
  39. package/dist/lib/components/realtime/avatar/realtime-avatar-channel.d.ts +34 -0
  40. package/dist/lib/components/realtime/avatar/realtime-avatar-channel.d.ts.map +1 -0
  41. package/dist/lib/components/realtime/avatar/realtime-avatar-channel.js +75 -0
  42. package/dist/lib/components/realtime/avatar/realtime-avatar-channel.js.map +1 -0
  43. package/dist/lib/components/realtime/avatar/realtime-avatar-surface.component.d.ts +80 -0
  44. package/dist/lib/components/realtime/avatar/realtime-avatar-surface.component.d.ts.map +1 -0
  45. package/dist/lib/components/realtime/avatar/realtime-avatar-surface.component.js +202 -0
  46. package/dist/lib/components/realtime/avatar/realtime-avatar-surface.component.js.map +1 -0
  47. package/dist/lib/components/realtime/capture/realtime-camera-check-card.component.d.ts +45 -0
  48. package/dist/lib/components/realtime/capture/realtime-camera-check-card.component.d.ts.map +1 -0
  49. package/dist/lib/components/realtime/capture/realtime-camera-check-card.component.js +123 -0
  50. package/dist/lib/components/realtime/capture/realtime-camera-check-card.component.js.map +1 -0
  51. package/dist/lib/components/realtime/capture/realtime-capture-channel.d.ts +90 -0
  52. package/dist/lib/components/realtime/capture/realtime-capture-channel.d.ts.map +1 -0
  53. package/dist/lib/components/realtime/capture/realtime-capture-channel.js +223 -0
  54. package/dist/lib/components/realtime/capture/realtime-capture-channel.js.map +1 -0
  55. package/dist/lib/components/realtime/capture/realtime-capture-model.d.ts +98 -0
  56. package/dist/lib/components/realtime/capture/realtime-capture-model.d.ts.map +1 -0
  57. package/dist/lib/components/realtime/capture/realtime-capture-model.js +161 -0
  58. package/dist/lib/components/realtime/capture/realtime-capture-model.js.map +1 -0
  59. package/dist/lib/components/realtime/capture/realtime-capture-surface.component.d.ts +48 -0
  60. package/dist/lib/components/realtime/capture/realtime-capture-surface.component.d.ts.map +1 -0
  61. package/dist/lib/components/realtime/capture/realtime-capture-surface.component.js +205 -0
  62. package/dist/lib/components/realtime/capture/realtime-capture-surface.component.js.map +1 -0
  63. package/dist/lib/components/realtime/channels/client-context-channel.d.ts +19 -2
  64. package/dist/lib/components/realtime/channels/client-context-channel.d.ts.map +1 -1
  65. package/dist/lib/components/realtime/channels/client-context-channel.js +83 -9
  66. package/dist/lib/components/realtime/channels/client-context-channel.js.map +1 -1
  67. package/dist/lib/components/realtime/channels/realtime-channel-pane.component.d.ts +30 -9
  68. package/dist/lib/components/realtime/channels/realtime-channel-pane.component.d.ts.map +1 -1
  69. package/dist/lib/components/realtime/channels/realtime-channel-pane.component.js +78 -14
  70. package/dist/lib/components/realtime/channels/realtime-channel-pane.component.js.map +1 -1
  71. package/dist/lib/components/realtime/identity-verification/identity-verification-channel.d.ts +71 -0
  72. package/dist/lib/components/realtime/identity-verification/identity-verification-channel.d.ts.map +1 -0
  73. package/dist/lib/components/realtime/identity-verification/identity-verification-channel.js +259 -0
  74. package/dist/lib/components/realtime/identity-verification/identity-verification-channel.js.map +1 -0
  75. package/dist/lib/components/realtime/identity-verification/identity-verification-model.d.ts +129 -0
  76. package/dist/lib/components/realtime/identity-verification/identity-verification-model.d.ts.map +1 -0
  77. package/dist/lib/components/realtime/identity-verification/identity-verification-model.js +373 -0
  78. package/dist/lib/components/realtime/identity-verification/identity-verification-model.js.map +1 -0
  79. package/dist/lib/components/realtime/identity-verification/identity-verification-surface.component.d.ts +77 -0
  80. package/dist/lib/components/realtime/identity-verification/identity-verification-surface.component.d.ts.map +1 -0
  81. package/dist/lib/components/realtime/identity-verification/identity-verification-surface.component.js +420 -0
  82. package/dist/lib/components/realtime/identity-verification/identity-verification-surface.component.js.map +1 -0
  83. package/dist/lib/components/realtime/interactive-component/component-contract.d.ts +83 -0
  84. package/dist/lib/components/realtime/interactive-component/component-contract.d.ts.map +1 -0
  85. package/dist/lib/components/realtime/interactive-component/component-contract.js +292 -0
  86. package/dist/lib/components/realtime/interactive-component/component-contract.js.map +1 -0
  87. package/dist/lib/components/realtime/interactive-component/component-data-state.d.ts +39 -0
  88. package/dist/lib/components/realtime/interactive-component/component-data-state.d.ts.map +1 -0
  89. package/dist/lib/components/realtime/interactive-component/component-data-state.js +152 -0
  90. package/dist/lib/components/realtime/interactive-component/component-data-state.js.map +1 -0
  91. package/dist/lib/components/realtime/interactive-component/component-instance-engine.d.ts +109 -0
  92. package/dist/lib/components/realtime/interactive-component/component-instance-engine.d.ts.map +1 -0
  93. package/dist/lib/components/realtime/interactive-component/component-instance-engine.js +146 -0
  94. package/dist/lib/components/realtime/interactive-component/component-instance-engine.js.map +1 -0
  95. package/dist/lib/components/realtime/interactive-component/component-spec-content.d.ts +19 -0
  96. package/dist/lib/components/realtime/interactive-component/component-spec-content.d.ts.map +1 -0
  97. package/dist/lib/components/realtime/interactive-component/component-spec-content.js +39 -0
  98. package/dist/lib/components/realtime/interactive-component/component-spec-content.js.map +1 -0
  99. package/dist/lib/components/realtime/interactive-component/interactive-component-channel.d.ts +183 -0
  100. package/dist/lib/components/realtime/interactive-component/interactive-component-channel.d.ts.map +1 -0
  101. package/dist/lib/components/realtime/interactive-component/interactive-component-channel.js +761 -0
  102. package/dist/lib/components/realtime/interactive-component/interactive-component-channel.js.map +1 -0
  103. package/dist/lib/components/realtime/interactive-component/interactive-component-config.d.ts +25 -0
  104. package/dist/lib/components/realtime/interactive-component/interactive-component-config.d.ts.map +1 -0
  105. package/dist/lib/components/realtime/interactive-component/interactive-component-config.js +57 -0
  106. package/dist/lib/components/realtime/interactive-component/interactive-component-config.js.map +1 -0
  107. package/dist/lib/components/realtime/interactive-component/interactive-component-host.component.d.ts +40 -0
  108. package/dist/lib/components/realtime/interactive-component/interactive-component-host.component.d.ts.map +1 -0
  109. package/dist/lib/components/realtime/interactive-component/interactive-component-host.component.js +97 -0
  110. package/dist/lib/components/realtime/interactive-component/interactive-component-host.component.js.map +1 -0
  111. package/dist/lib/components/realtime/interactive-component/interactive-component-types.d.ts +144 -0
  112. package/dist/lib/components/realtime/interactive-component/interactive-component-types.d.ts.map +1 -0
  113. package/dist/lib/components/realtime/interactive-component/interactive-component-types.js +57 -0
  114. package/dist/lib/components/realtime/interactive-component/interactive-component-types.js.map +1 -0
  115. package/dist/lib/components/realtime/interactive-component/react-component-handle.d.ts +36 -0
  116. package/dist/lib/components/realtime/interactive-component/react-component-handle.d.ts.map +1 -0
  117. package/dist/lib/components/realtime/interactive-component/react-component-handle.js +55 -0
  118. package/dist/lib/components/realtime/interactive-component/react-component-handle.js.map +1 -0
  119. package/dist/lib/components/realtime/interactive-component/realtime-interactive-component-surface.component.d.ts +55 -0
  120. package/dist/lib/components/realtime/interactive-component/realtime-interactive-component-surface.component.d.ts.map +1 -0
  121. package/dist/lib/components/realtime/interactive-component/realtime-interactive-component-surface.component.js +210 -0
  122. package/dist/lib/components/realtime/interactive-component/realtime-interactive-component-surface.component.js.map +1 -0
  123. package/dist/lib/components/realtime/interactive-component/run-view-component-artifact-source.d.ts +32 -0
  124. package/dist/lib/components/realtime/interactive-component/run-view-component-artifact-source.d.ts.map +1 -0
  125. package/dist/lib/components/realtime/interactive-component/run-view-component-artifact-source.js +90 -0
  126. package/dist/lib/components/realtime/interactive-component/run-view-component-artifact-source.js.map +1 -0
  127. package/dist/lib/components/realtime/media/media-channel.d.ts +7 -0
  128. package/dist/lib/components/realtime/media/media-channel.d.ts.map +1 -1
  129. package/dist/lib/components/realtime/media/media-channel.js +28 -1
  130. package/dist/lib/components/realtime/media/media-channel.js.map +1 -1
  131. package/dist/lib/components/realtime/realtime-agent-banner.component.d.ts +8 -1
  132. package/dist/lib/components/realtime/realtime-agent-banner.component.d.ts.map +1 -1
  133. package/dist/lib/components/realtime/realtime-agent-banner.component.js +89 -71
  134. package/dist/lib/components/realtime/realtime-agent-banner.component.js.map +1 -1
  135. package/dist/lib/components/realtime/realtime-agent-orb.component.d.ts +21 -0
  136. package/dist/lib/components/realtime/realtime-agent-orb.component.d.ts.map +1 -0
  137. package/dist/lib/components/realtime/realtime-agent-orb.component.js +49 -0
  138. package/dist/lib/components/realtime/realtime-agent-orb.component.js.map +1 -0
  139. package/dist/lib/components/realtime/realtime-agent-picker.component.d.ts +44 -11
  140. package/dist/lib/components/realtime/realtime-agent-picker.component.d.ts.map +1 -1
  141. package/dist/lib/components/realtime/realtime-agent-picker.component.js +162 -50
  142. package/dist/lib/components/realtime/realtime-agent-picker.component.js.map +1 -1
  143. package/dist/lib/components/realtime/realtime-audio-visuals.d.ts +8 -2
  144. package/dist/lib/components/realtime/realtime-audio-visuals.d.ts.map +1 -1
  145. package/dist/lib/components/realtime/realtime-audio-visuals.js +14 -18
  146. package/dist/lib/components/realtime/realtime-audio-visuals.js.map +1 -1
  147. package/dist/lib/components/realtime/realtime-composer.component.d.ts +42 -2
  148. package/dist/lib/components/realtime/realtime-composer.component.d.ts.map +1 -1
  149. package/dist/lib/components/realtime/realtime-composer.component.js +137 -102
  150. package/dist/lib/components/realtime/realtime-composer.component.js.map +1 -1
  151. package/dist/lib/components/realtime/realtime-perception-chip.component.d.ts +71 -0
  152. package/dist/lib/components/realtime/realtime-perception-chip.component.d.ts.map +1 -0
  153. package/dist/lib/components/realtime/realtime-perception-chip.component.js +221 -0
  154. package/dist/lib/components/realtime/realtime-perception-chip.component.js.map +1 -0
  155. package/dist/lib/components/realtime/realtime-session-overlay.component.d.ts +264 -22
  156. package/dist/lib/components/realtime/realtime-session-overlay.component.d.ts.map +1 -1
  157. package/dist/lib/components/realtime/realtime-session-overlay.component.js +851 -135
  158. package/dist/lib/components/realtime/realtime-session-overlay.component.js.map +1 -1
  159. package/dist/lib/components/realtime/realtime-surface-placement-prefs.d.ts +14 -0
  160. package/dist/lib/components/realtime/realtime-surface-placement-prefs.d.ts.map +1 -0
  161. package/dist/lib/components/realtime/realtime-surface-placement-prefs.js +14 -0
  162. package/dist/lib/components/realtime/realtime-surface-placement-prefs.js.map +1 -0
  163. package/dist/lib/components/realtime/realtime-surface-stage.model.d.ts +74 -0
  164. package/dist/lib/components/realtime/realtime-surface-stage.model.d.ts.map +1 -0
  165. package/dist/lib/components/realtime/realtime-surface-stage.model.js +171 -0
  166. package/dist/lib/components/realtime/realtime-surface-stage.model.js.map +1 -0
  167. package/dist/lib/components/realtime/realtime-surface-tabs.component.d.ts +71 -13
  168. package/dist/lib/components/realtime/realtime-surface-tabs.component.d.ts.map +1 -1
  169. package/dist/lib/components/realtime/realtime-surface-tabs.component.js +232 -73
  170. package/dist/lib/components/realtime/realtime-surface-tabs.component.js.map +1 -1
  171. package/dist/lib/components/realtime/realtime-surface-tabs.model.d.ts +5 -0
  172. package/dist/lib/components/realtime/realtime-surface-tabs.model.d.ts.map +1 -1
  173. package/dist/lib/components/realtime/realtime-surface-tabs.model.js +8 -0
  174. package/dist/lib/components/realtime/realtime-surface-tabs.model.js.map +1 -1
  175. package/dist/lib/components/realtime/realtime-ui-config.d.ts +12 -2
  176. package/dist/lib/components/realtime/realtime-ui-config.d.ts.map +1 -1
  177. package/dist/lib/components/realtime/realtime-ui-config.js +5 -1
  178. package/dist/lib/components/realtime/realtime-ui-config.js.map +1 -1
  179. package/dist/lib/components/realtime/remote-browser/remote-browser-channel.d.ts +10 -1
  180. package/dist/lib/components/realtime/remote-browser/remote-browser-channel.d.ts.map +1 -1
  181. package/dist/lib/components/realtime/remote-browser/remote-browser-channel.js +42 -2
  182. package/dist/lib/components/realtime/remote-browser/remote-browser-channel.js.map +1 -1
  183. package/dist/lib/components/realtime/remote-browser/remote-browser-surface.component.d.ts +20 -3
  184. package/dist/lib/components/realtime/remote-browser/remote-browser-surface.component.d.ts.map +1 -1
  185. package/dist/lib/components/realtime/remote-browser/remote-browser-surface.component.js +44 -10
  186. package/dist/lib/components/realtime/remote-browser/remote-browser-surface.component.js.map +1 -1
  187. package/dist/lib/components/realtime/whiteboard/whiteboard-channel.d.ts +28 -44
  188. package/dist/lib/components/realtime/whiteboard/whiteboard-channel.d.ts.map +1 -1
  189. package/dist/lib/components/realtime/whiteboard/whiteboard-channel.js +76 -162
  190. package/dist/lib/components/realtime/whiteboard/whiteboard-channel.js.map +1 -1
  191. package/dist/lib/components/search/search-panel.component.d.ts +2 -0
  192. package/dist/lib/components/search/search-panel.component.d.ts.map +1 -1
  193. package/dist/lib/components/search/search-panel.component.js +25 -12
  194. package/dist/lib/components/search/search-panel.component.js.map +1 -1
  195. package/dist/lib/components/sidebar/routines-section.component.js +1 -1
  196. package/dist/lib/components/sidebar/routines-section.component.js.map +1 -1
  197. package/dist/lib/components/task/tasks-full-view.component.d.ts +152 -31
  198. package/dist/lib/components/task/tasks-full-view.component.d.ts.map +1 -1
  199. package/dist/lib/components/task/tasks-full-view.component.js +2227 -214
  200. package/dist/lib/components/task/tasks-full-view.component.js.map +1 -1
  201. package/dist/lib/components/tasks/tasks-dropdown.component.js +4 -4
  202. package/dist/lib/components/tasks/tasks-dropdown.component.js.map +1 -1
  203. package/dist/lib/components/workspace/conversation-workspace.component.d.ts +33 -32
  204. package/dist/lib/components/workspace/conversation-workspace.component.d.ts.map +1 -1
  205. package/dist/lib/components/workspace/conversation-workspace.component.js +72 -88
  206. package/dist/lib/components/workspace/conversation-workspace.component.js.map +1 -1
  207. package/dist/lib/conversations.module.d.ts +30 -29
  208. package/dist/lib/conversations.module.d.ts.map +1 -1
  209. package/dist/lib/conversations.module.js +27 -5
  210. package/dist/lib/conversations.module.js.map +1 -1
  211. package/dist/lib/events/chat-events.d.ts +25 -0
  212. package/dist/lib/events/chat-events.d.ts.map +1 -1
  213. package/dist/lib/events/chat-events.js +36 -0
  214. package/dist/lib/events/chat-events.js.map +1 -1
  215. package/dist/lib/models/agent-turn.model.d.ts +5 -0
  216. package/dist/lib/models/agent-turn.model.d.ts.map +1 -1
  217. package/dist/lib/models/agent-turn.model.js.map +1 -1
  218. package/dist/lib/services/agent-state.service.d.ts +34 -8
  219. package/dist/lib/services/agent-state.service.d.ts.map +1 -1
  220. package/dist/lib/services/agent-state.service.js +90 -37
  221. package/dist/lib/services/agent-state.service.js.map +1 -1
  222. package/dist/lib/services/artifact-state.service.d.ts +0 -9
  223. package/dist/lib/services/artifact-state.service.d.ts.map +1 -1
  224. package/dist/lib/services/artifact-state.service.js +1 -32
  225. package/dist/lib/services/artifact-state.service.js.map +1 -1
  226. package/dist/lib/services/browser-realtime-media-host.d.ts +19 -7
  227. package/dist/lib/services/browser-realtime-media-host.d.ts.map +1 -1
  228. package/dist/lib/services/browser-realtime-media-host.js +21 -72
  229. package/dist/lib/services/browser-realtime-media-host.js.map +1 -1
  230. package/dist/lib/services/conversation-agent.service.d.ts +48 -16
  231. package/dist/lib/services/conversation-agent.service.d.ts.map +1 -1
  232. package/dist/lib/services/conversation-agent.service.js +110 -35
  233. package/dist/lib/services/conversation-agent.service.js.map +1 -1
  234. package/dist/lib/services/conversation-detail-window.store.d.ts +22 -4
  235. package/dist/lib/services/conversation-detail-window.store.d.ts.map +1 -1
  236. package/dist/lib/services/conversation-detail-window.store.js +50 -9
  237. package/dist/lib/services/conversation-detail-window.store.js.map +1 -1
  238. package/dist/lib/services/conversation-naming.d.ts +72 -22
  239. package/dist/lib/services/conversation-naming.d.ts.map +1 -1
  240. package/dist/lib/services/conversation-naming.js +93 -12
  241. package/dist/lib/services/conversation-naming.js.map +1 -1
  242. package/dist/lib/services/conversation-tasks-filter.d.ts +15 -0
  243. package/dist/lib/services/conversation-tasks-filter.d.ts.map +1 -0
  244. package/dist/lib/services/conversation-tasks-filter.js +69 -0
  245. package/dist/lib/services/conversation-tasks-filter.js.map +1 -0
  246. package/dist/lib/services/data-cache.service.d.ts +13 -5
  247. package/dist/lib/services/data-cache.service.d.ts.map +1 -1
  248. package/dist/lib/services/data-cache.service.js +39 -19
  249. package/dist/lib/services/data-cache.service.js.map +1 -1
  250. package/dist/lib/services/export.service.d.ts +26 -9
  251. package/dist/lib/services/export.service.d.ts.map +1 -1
  252. package/dist/lib/services/export.service.js +61 -18
  253. package/dist/lib/services/export.service.js.map +1 -1
  254. package/dist/lib/services/realtime-audio-recorder.d.ts +115 -79
  255. package/dist/lib/services/realtime-audio-recorder.d.ts.map +1 -1
  256. package/dist/lib/services/realtime-audio-recorder.js +273 -186
  257. package/dist/lib/services/realtime-audio-recorder.js.map +1 -1
  258. package/dist/lib/services/realtime-pairing.d.ts +10 -5
  259. package/dist/lib/services/realtime-pairing.d.ts.map +1 -1
  260. package/dist/lib/services/realtime-pairing.js +15 -6
  261. package/dist/lib/services/realtime-pairing.js.map +1 -1
  262. package/dist/lib/services/realtime-session.service.d.ts +31 -2
  263. package/dist/lib/services/realtime-session.service.d.ts.map +1 -1
  264. package/dist/lib/services/realtime-session.service.js +34 -2
  265. package/dist/lib/services/realtime-session.service.js.map +1 -1
  266. package/dist/lib/services/recording/libopus-wasm-binary.d.ts +3 -0
  267. package/dist/lib/services/recording/libopus-wasm-binary.d.ts.map +1 -0
  268. package/dist/lib/services/recording/libopus-wasm-binary.js +489 -0
  269. package/dist/lib/services/recording/libopus-wasm-binary.js.map +1 -0
  270. package/dist/lib/services/recording/libopus-worker-source.d.ts +48 -0
  271. package/dist/lib/services/recording/libopus-worker-source.d.ts.map +1 -0
  272. package/dist/lib/services/recording/libopus-worker-source.js +170 -0
  273. package/dist/lib/services/recording/libopus-worker-source.js.map +1 -0
  274. package/dist/lib/services/recording/linear-resampler.d.ts +45 -0
  275. package/dist/lib/services/recording/linear-resampler.d.ts.map +1 -0
  276. package/dist/lib/services/recording/linear-resampler.js +85 -0
  277. package/dist/lib/services/recording/linear-resampler.js.map +1 -0
  278. package/dist/lib/services/recording/opus-packet-encoder.d.ts +50 -0
  279. package/dist/lib/services/recording/opus-packet-encoder.d.ts.map +1 -0
  280. package/dist/lib/services/recording/opus-packet-encoder.js +41 -0
  281. package/dist/lib/services/recording/opus-packet-encoder.js.map +1 -0
  282. package/dist/lib/services/recording/wasm-opus-encoder.d.ts +86 -0
  283. package/dist/lib/services/recording/wasm-opus-encoder.d.ts.map +1 -0
  284. package/dist/lib/services/recording/wasm-opus-encoder.js +232 -0
  285. package/dist/lib/services/recording/wasm-opus-encoder.js.map +1 -0
  286. package/dist/lib/services/recording/webcodecs-opus-encoder.d.ts +39 -0
  287. package/dist/lib/services/recording/webcodecs-opus-encoder.d.ts.map +1 -0
  288. package/dist/lib/services/recording/webcodecs-opus-encoder.js +101 -0
  289. package/dist/lib/services/recording/webcodecs-opus-encoder.js.map +1 -0
  290. package/dist/lib/services/search.service.d.ts +7 -2
  291. package/dist/lib/services/search.service.d.ts.map +1 -1
  292. package/dist/lib/services/search.service.js +16 -20
  293. package/dist/lib/services/search.service.js.map +1 -1
  294. package/dist/lib/utils/conversation-branching.d.ts +4 -0
  295. package/dist/lib/utils/conversation-branching.d.ts.map +1 -0
  296. package/dist/lib/utils/conversation-branching.js +5 -0
  297. package/dist/lib/utils/conversation-branching.js.map +1 -0
  298. package/dist/lib/utils/conversation-forks.d.ts +315 -0
  299. package/dist/lib/utils/conversation-forks.d.ts.map +1 -0
  300. package/dist/lib/utils/conversation-forks.js +456 -0
  301. package/dist/lib/utils/conversation-forks.js.map +1 -0
  302. package/dist/lib/utils/distinct-artifacts.d.ts +9 -3
  303. package/dist/lib/utils/distinct-artifacts.d.ts.map +1 -1
  304. package/dist/lib/utils/distinct-artifacts.js +24 -5
  305. package/dist/lib/utils/distinct-artifacts.js.map +1 -1
  306. package/dist/public-api.d.ts +23 -1
  307. package/dist/public-api.d.ts.map +1 -1
  308. package/dist/public-api.js +30 -1
  309. package/dist/public-api.js.map +1 -1
  310. package/package.json +37 -33
  311. package/dist/lib/components/thread/thread-panel.component.d.ts +0 -126
  312. package/dist/lib/components/thread/thread-panel.component.d.ts.map +0 -1
  313. package/dist/lib/components/thread/thread-panel.component.js +0 -440
  314. package/dist/lib/components/thread/thread-panel.component.js.map +0 -1
  315. package/dist/lib/services/realtime-pcm-wav.d.ts +0 -79
  316. package/dist/lib/services/realtime-pcm-wav.d.ts.map +0 -1
  317. package/dist/lib/services/realtime-pcm-wav.js +0 -213
  318. package/dist/lib/services/realtime-pcm-wav.js.map +0 -1
@@ -0,0 +1,57 @@
1
+ /**
2
+ * @fileoverview Shared vocabulary of the **Interactive Component realtime channel**: names, the
3
+ * channel's configuration, the artifact source port and the handle a rendered component exposes.
4
+ *
5
+ * Everything in this file is framework-free (no Angular, no DOM), so the channel's logic can be
6
+ * tested without a browser and reused by a host that renders components some other way.
7
+ *
8
+ * @module @memberjunction/ng-conversations
9
+ */
10
+ /** The channel's key: the `target.channel` an agent addresses. */
11
+ export const INTERACTIVE_COMPONENT_CHANNEL_KEY = 'InteractiveComponent';
12
+ /** The `ClientPluginClass` of the channel's `MJ: AI Agent Channels` row (its ClassFactory key). */
13
+ export const INTERACTIVE_COMPONENT_CLIENT_PLUGIN_CLASS = 'RealtimeInteractiveComponentChannel';
14
+ /** The `ServerPluginClass` of the channel's `MJ: AI Agent Channels` row. */
15
+ export const INTERACTIVE_COMPONENT_SERVER_PLUGIN_CLASS = 'InteractiveComponentChannelServer';
16
+ /** The verbs every instance has, whatever its spec says. `open` is the dispatcher's reserved action, not a verb. */
17
+ export const BUILTIN_VERBS = {
18
+ /** Swap an open instance to another version of its own artifact. */
19
+ ShowVersion: 'show_version',
20
+ /** Close an instance. */
21
+ Close: 'close',
22
+ };
23
+ /**
24
+ * The verbs derived from a spec's *standard* methods. Their names are reserved: a custom method that
25
+ * collides with one is exposed as `custom_<name>` instead (see `DeriveComponentContract`).
26
+ */
27
+ export const STANDARD_VERBS = {
28
+ Refresh: 'refresh',
29
+ Print: 'print',
30
+ Validate: 'validate',
31
+ IsDirty: 'is_dirty',
32
+ Reset: 'reset',
33
+ ScrollTo: 'scroll_to',
34
+ Focus: 'focus',
35
+ GetDataState: 'get_data_state',
36
+ };
37
+ /** The highest `maxInstances` an operator may configure. */
38
+ export const MAX_INSTANCES_CEILING = 8;
39
+ /** The configuration used when none is supplied. */
40
+ export const DEFAULT_INTERACTIVE_COMPONENT_CONFIG = Object.freeze({
41
+ AutoOpenDelegatedComponents: false,
42
+ SwapToNewerVersions: true,
43
+ MaxInstances: 4,
44
+ MaxStateRows: 25,
45
+ MaxStateChars: 6000,
46
+ });
47
+ /** An artifact load that failed, thrown by an {@link IComponentArtifactSource}. */
48
+ export class ComponentArtifactError extends Error {
49
+ Code;
50
+ /** @param Code A stable machine-readable reason. @param message A sentence the model can read. */
51
+ constructor(Code, message) {
52
+ super(message);
53
+ this.Code = Code;
54
+ this.name = 'ComponentArtifactError';
55
+ }
56
+ }
57
+ //# sourceMappingURL=interactive-component-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interactive-component-types.js","sourceRoot":"","sources":["../../../../../src/lib/components/realtime/interactive-component/interactive-component-types.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,kEAAkE;AAClE,MAAM,CAAC,MAAM,iCAAiC,GAAG,sBAAsB,CAAC;AAExE,mGAAmG;AACnG,MAAM,CAAC,MAAM,yCAAyC,GAAG,qCAAqC,CAAC;AAE/F,4EAA4E;AAC5E,MAAM,CAAC,MAAM,yCAAyC,GAAG,mCAAmC,CAAC;AAE7F,oHAAoH;AACpH,MAAM,CAAC,MAAM,aAAa,GAAG;IACzB,oEAAoE;IACpE,WAAW,EAAE,cAAc;IAC3B,yBAAyB;IACzB,KAAK,EAAE,OAAO;CACR,CAAC;AAEX;;;GAGG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG;IAC1B,OAAO,EAAE,SAAS;IAClB,KAAK,EAAE,OAAO;IACd,QAAQ,EAAE,UAAU;IACpB,OAAO,EAAE,UAAU;IACnB,KAAK,EAAE,OAAO;IACd,QAAQ,EAAE,WAAW;IACrB,KAAK,EAAE,OAAO;IACd,YAAY,EAAE,gBAAgB;CACxB,CAAC;AA4BX,4DAA4D;AAC5D,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC;AAEvC,oDAAoD;AACpD,MAAM,CAAC,MAAM,oCAAoC,GAAyC,MAAM,CAAC,MAAM,CAAC;IACpG,2BAA2B,EAAE,KAAK;IAClC,mBAAmB,EAAE,IAAI;IACzB,YAAY,EAAE,CAAC;IACf,YAAY,EAAE,EAAE;IAChB,aAAa,EAAE,IAAI;CACtB,CAAC,CAAC;AAmBH,mFAAmF;AACnF,MAAM,OAAO,sBAAuB,SAAQ,KAAK;IAGzB;IAFpB,kGAAkG;IAClG,YACoB,IAAgC,EAChD,OAAe;QAEf,KAAK,CAAC,OAAO,CAAC,CAAC;QAHC,SAAI,GAAJ,IAAI,CAA4B;QAIhD,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC;IACzC,CAAC;CACJ","sourcesContent":["/**\n * @fileoverview Shared vocabulary of the **Interactive Component realtime channel**: names, the\n * channel's configuration, the artifact source port and the handle a rendered component exposes.\n *\n * Everything in this file is framework-free (no Angular, no DOM), so the channel's logic can be\n * tested without a browser and reused by a host that renders components some other way.\n *\n * @module @memberjunction/ng-conversations\n */\n\nimport type { ComponentSpec } from '@memberjunction/interactive-component-types';\n\n/** The channel's key: the `target.channel` an agent addresses. */\nexport const INTERACTIVE_COMPONENT_CHANNEL_KEY = 'InteractiveComponent';\n\n/** The `ClientPluginClass` of the channel's `MJ: AI Agent Channels` row (its ClassFactory key). */\nexport const INTERACTIVE_COMPONENT_CLIENT_PLUGIN_CLASS = 'RealtimeInteractiveComponentChannel';\n\n/** The `ServerPluginClass` of the channel's `MJ: AI Agent Channels` row. */\nexport const INTERACTIVE_COMPONENT_SERVER_PLUGIN_CLASS = 'InteractiveComponentChannelServer';\n\n/** The verbs every instance has, whatever its spec says. `open` is the dispatcher's reserved action, not a verb. */\nexport const BUILTIN_VERBS = {\n /** Swap an open instance to another version of its own artifact. */\n ShowVersion: 'show_version',\n /** Close an instance. */\n Close: 'close',\n} as const;\n\n/**\n * The verbs derived from a spec's *standard* methods. Their names are reserved: a custom method that\n * collides with one is exposed as `custom_<name>` instead (see `DeriveComponentContract`).\n */\nexport const STANDARD_VERBS = {\n Refresh: 'refresh',\n Print: 'print',\n Validate: 'validate',\n IsDirty: 'is_dirty',\n Reset: 'reset',\n ScrollTo: 'scroll_to',\n Focus: 'focus',\n GetDataState: 'get_data_state',\n} as const;\n\n/** Where in the channel's life a version swap came from. */\nexport type ComponentVersionChangeReason = 'agent' | 'newer-version';\n\n/**\n * Per-channel configuration read from `channels.config.InteractiveComponent` in the config cascade.\n * It is operator-authored JSON of unknown shape, so every member is validated by `ParseInteractiveComponentConfig`;\n * these are the resolved, always-valid values.\n */\nexport interface InteractiveComponentConfig {\n /**\n * Whether component artifacts produced by a delegated run (the agent asked Skip or Sage to build\n * something) are opened automatically. Off by default: the channel is opt-in, and so is the behavior of\n * a tab appearing by itself. The channel cannot tell a component from another kind of artifact until it\n * has loaded it, so with this on it is mounted for ANY delegated artifact and ignores those that are not components.\n */\n AutoOpenDelegatedComponents: boolean;\n /** Whether a newer version of an artifact that is already open replaces it in place (default `true`); when `false` the agent is only told one exists. */\n SwapToNewerVersions: boolean;\n /** How many components may be open at once (1 to {@link MAX_INSTANCES_CEILING}; default 4). */\n MaxInstances: number;\n /** The most data rows per table described to the model (default 25). */\n MaxStateRows: number;\n /** The most characters of data-state JSON described to the model per component (default 6000). */\n MaxStateChars: number;\n}\n\n/** The highest `maxInstances` an operator may configure. */\nexport const MAX_INSTANCES_CEILING = 8;\n\n/** The configuration used when none is supplied. */\nexport const DEFAULT_INTERACTIVE_COMPONENT_CONFIG: Readonly<InteractiveComponentConfig> = Object.freeze({\n AutoOpenDelegatedComponents: false,\n SwapToNewerVersions: true,\n MaxInstances: 4,\n MaxStateRows: 25,\n MaxStateChars: 6000,\n});\n\n/** A component artifact version, loaded and parsed, ready to render. */\nexport interface ResolvedComponentArtifact {\n /** The `MJ: Artifacts` id. */\n ArtifactID: string;\n /** The `MJ: Artifact Versions` id this was loaded from. */\n VersionID: string;\n /** The version number within the artifact. */\n VersionNumber: number;\n /** Display name (the version's name, else the artifact's, else the spec's). */\n Name: string;\n /** The parsed component specification. */\n Spec: ComponentSpec;\n}\n\n/** Why an artifact could not be loaded; each maps to a message the model can act on. */\nexport type ComponentArtifactErrorCode = 'invalid_id' | 'not_found' | 'access_denied' | 'not_a_component' | 'unreadable' | 'load_failed';\n\n/** An artifact load that failed, thrown by an {@link IComponentArtifactSource}. */\nexport class ComponentArtifactError extends Error {\n /** @param Code A stable machine-readable reason. @param message A sentence the model can read. */\n public constructor(\n public readonly Code: ComponentArtifactErrorCode,\n message: string\n ) {\n super(message);\n this.name = 'ComponentArtifactError';\n }\n}\n\n/**\n * Loads component artifacts. The channel only ever asks this port, so what \"the user's own access\" means\n * (the user's own session, their read permission on the artifact) is the implementation's concern and the\n * channel is testable without a database.\n *\n * Implementations throw {@link ComponentArtifactError} for anything the agent can be told.\n */\nexport interface IComponentArtifactSource {\n /** Loads one specific version. */\n LoadVersion(versionId: string): Promise<ResolvedComponentArtifact>;\n /** Loads an artifact's latest version. */\n LoadLatest(artifactId: string): Promise<ResolvedComponentArtifact>;\n}\n\n/**\n * What the channel can do to a rendered component. The Angular host component implements it over\n * `mj-react-component`; tests implement it over a fake. Every member must tolerate being called before the\n * component finished initializing (return `undefined`/`false`, never throw).\n */\nexport interface IInteractiveComponentHandle {\n /** Whether the component has finished initializing and can be driven. */\n readonly IsReady: boolean;\n /** Whether the component implements `methodName`. */\n HasMethod(methodName: string): boolean;\n /** Calls one of the component's methods with positional arguments; resolves with its (possibly async) result. */\n InvokeMethod(methodName: string, args: readonly unknown[]): Promise<unknown>;\n /** The component's current data state (`getCurrentDataState`, or what it fetched), if it has one. */\n GetCurrentDataState(): object | undefined;\n /** Re-fetches / re-renders the component. */\n Refresh(): void;\n /** Prints the component. */\n Print(): void;\n /** `validate()`: a boolean or a validation result. */\n Validate(): unknown;\n /** `isDirty()`. */\n IsDirty(): boolean;\n /** `reset()`. */\n Reset(): void;\n /** `scrollTo(target)`. */\n ScrollTo(target: string | { top?: number; left?: number }): void;\n /** `focus(target?)`. */\n Focus(target?: string): void;\n}\n\n/** Something the user did inside a rendered component, reported by the host to the channel. */\nexport interface ComponentActivity {\n /**\n * `'event'` for a component event (the spec's `events`), `'state'` for a state change, `'initialized'` when it\n * finished loading, `'selected'` when the user switched to this component's tab, `'closed'` when the user closed it.\n */\n Kind: 'event' | 'state' | 'initialized' | 'selected' | 'closed';\n /** The event type or state path. */\n Name?: string;\n /** The event payload or new state value (already untyped JSON-ish; the channel bounds it). */\n Payload?: unknown;\n}\n"]}
@@ -0,0 +1,36 @@
1
+ import type { MJReactComponent } from '@memberjunction/ng-react';
2
+ import type { IInteractiveComponentHandle } from './interactive-component-types';
3
+ /**
4
+ * An {@link IInteractiveComponentHandle} over a rendered `mj-react-component`: the channel's only way to drive the
5
+ * component, kept as a thin adapter so the channel never touches Angular or React.
6
+ */
7
+ export declare class ReactComponentHandle implements IInteractiveComponentHandle {
8
+ private readonly react;
9
+ readonly IsReady: boolean;
10
+ /** @param react The rendered component. @param IsReady Whether it has finished initializing (a handle is created once it has). */
11
+ constructor(react: MJReactComponent, IsReady?: boolean);
12
+ /** @inheritdoc */
13
+ HasMethod(methodName: string): boolean;
14
+ /** @inheritdoc */
15
+ InvokeMethod(methodName: string, args: readonly unknown[]): Promise<unknown>;
16
+ /** @inheritdoc */
17
+ GetCurrentDataState(): object | undefined;
18
+ /** @inheritdoc */
19
+ Refresh(): void;
20
+ /** @inheritdoc */
21
+ Print(): void;
22
+ /** @inheritdoc */
23
+ Validate(): unknown;
24
+ /** @inheritdoc */
25
+ IsDirty(): boolean;
26
+ /** @inheritdoc */
27
+ Reset(): void;
28
+ /** @inheritdoc */
29
+ ScrollTo(target: string | {
30
+ top?: number;
31
+ left?: number;
32
+ }): void;
33
+ /** @inheritdoc */
34
+ Focus(target?: string): void;
35
+ }
36
+ //# sourceMappingURL=react-component-handle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"react-component-handle.d.ts","sourceRoot":"","sources":["../../../../../src/lib/components/realtime/interactive-component/react-component-handle.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,+BAA+B,CAAC;AAEjF;;;GAGG;AACH,qBAAa,oBAAqB,YAAW,2BAA2B;IAGhE,OAAO,CAAC,QAAQ,CAAC,KAAK;aACN,OAAO,EAAE,OAAO;IAHpC,kIAAkI;gBAE7G,KAAK,EAAE,gBAAgB,EACxB,OAAO,GAAE,OAAc;IAG3C,kBAAkB;IACX,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO;IAI7C,kBAAkB;IACX,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,OAAO,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC;IAKnF,kBAAkB;IACX,mBAAmB,IAAI,MAAM,GAAG,SAAS;IAIhD,kBAAkB;IACX,OAAO,IAAI,IAAI;IAItB,kBAAkB;IACX,KAAK,IAAI,IAAI;IAIpB,kBAAkB;IACX,QAAQ,IAAI,OAAO;IAI1B,kBAAkB;IACX,OAAO,IAAI,OAAO;IAIzB,kBAAkB;IACX,KAAK,IAAI,IAAI;IAIpB,kBAAkB;IACX,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAIvE,kBAAkB;IACX,KAAK,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI;CAGtC"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * An {@link IInteractiveComponentHandle} over a rendered `mj-react-component`: the channel's only way to drive the
3
+ * component, kept as a thin adapter so the channel never touches Angular or React.
4
+ */
5
+ export class ReactComponentHandle {
6
+ react;
7
+ IsReady;
8
+ /** @param react The rendered component. @param IsReady Whether it has finished initializing (a handle is created once it has). */
9
+ constructor(react, IsReady = true) {
10
+ this.react = react;
11
+ this.IsReady = IsReady;
12
+ }
13
+ /** @inheritdoc */
14
+ HasMethod(methodName) {
15
+ return this.react.HasMethod(methodName);
16
+ }
17
+ /** @inheritdoc */
18
+ InvokeMethod(methodName, args) {
19
+ // A custom method may be sync or async; the channel awaits either.
20
+ return Promise.resolve(this.react.InvokeMethod(methodName, ...args));
21
+ }
22
+ /** @inheritdoc */
23
+ GetCurrentDataState() {
24
+ return this.react.GetCurrentDataState();
25
+ }
26
+ /** @inheritdoc */
27
+ Refresh() {
28
+ this.react.Refresh();
29
+ }
30
+ /** @inheritdoc */
31
+ Print() {
32
+ this.react.Print();
33
+ }
34
+ /** @inheritdoc */
35
+ Validate() {
36
+ return this.react.validate();
37
+ }
38
+ /** @inheritdoc */
39
+ IsDirty() {
40
+ return this.react.IsDirty();
41
+ }
42
+ /** @inheritdoc */
43
+ Reset() {
44
+ this.react.Reset();
45
+ }
46
+ /** @inheritdoc */
47
+ ScrollTo(target) {
48
+ this.react.ScrollTo(target);
49
+ }
50
+ /** @inheritdoc */
51
+ Focus(target) {
52
+ this.react.Focus(target);
53
+ }
54
+ }
55
+ //# sourceMappingURL=react-component-handle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"react-component-handle.js","sourceRoot":"","sources":["../../../../../src/lib/components/realtime/interactive-component/react-component-handle.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,MAAM,OAAO,oBAAoB;IAGR;IACD;IAHpB,kIAAkI;IAClI,YACqB,KAAuB,EACxB,UAAmB,IAAI;QADtB,UAAK,GAAL,KAAK,CAAkB;QACxB,YAAO,GAAP,OAAO,CAAgB;IACxC,CAAC;IAEJ,kBAAkB;IACX,SAAS,CAAC,UAAkB;QAC/B,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;IAC5C,CAAC;IAED,kBAAkB;IACX,YAAY,CAAC,UAAkB,EAAE,IAAwB;QAC5D,mEAAmE;QACnE,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,UAAU,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;IACzE,CAAC;IAED,kBAAkB;IACX,mBAAmB;QACtB,OAAO,IAAI,CAAC,KAAK,CAAC,mBAAmB,EAAE,CAAC;IAC5C,CAAC;IAED,kBAAkB;IACX,OAAO;QACV,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;IACzB,CAAC;IAED,kBAAkB;IACX,KAAK;QACR,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;IAED,kBAAkB;IACX,QAAQ;QACX,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;IACjC,CAAC;IAED,kBAAkB;IACX,OAAO;QACV,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;IAChC,CAAC;IAED,kBAAkB;IACX,KAAK;QACR,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;IAED,kBAAkB;IACX,QAAQ,CAAC,MAAgD;QAC5D,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAChC,CAAC;IAED,kBAAkB;IACX,KAAK,CAAC,MAAe;QACxB,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC7B,CAAC;CACJ","sourcesContent":["import type { MJReactComponent } from '@memberjunction/ng-react';\nimport type { IInteractiveComponentHandle } from './interactive-component-types';\n\n/**\n * An {@link IInteractiveComponentHandle} over a rendered `mj-react-component`: the channel's only way to drive the\n * component, kept as a thin adapter so the channel never touches Angular or React.\n */\nexport class ReactComponentHandle implements IInteractiveComponentHandle {\n /** @param react The rendered component. @param IsReady Whether it has finished initializing (a handle is created once it has). */\n public constructor(\n private readonly react: MJReactComponent,\n public readonly IsReady: boolean = true\n ) {}\n\n /** @inheritdoc */\n public HasMethod(methodName: string): boolean {\n return this.react.HasMethod(methodName);\n }\n\n /** @inheritdoc */\n public InvokeMethod(methodName: string, args: readonly unknown[]): Promise<unknown> {\n // A custom method may be sync or async; the channel awaits either.\n return Promise.resolve(this.react.InvokeMethod(methodName, ...args));\n }\n\n /** @inheritdoc */\n public GetCurrentDataState(): object | undefined {\n return this.react.GetCurrentDataState();\n }\n\n /** @inheritdoc */\n public Refresh(): void {\n this.react.Refresh();\n }\n\n /** @inheritdoc */\n public Print(): void {\n this.react.Print();\n }\n\n /** @inheritdoc */\n public Validate(): unknown {\n return this.react.validate();\n }\n\n /** @inheritdoc */\n public IsDirty(): boolean {\n return this.react.IsDirty();\n }\n\n /** @inheritdoc */\n public Reset(): void {\n this.react.Reset();\n }\n\n /** @inheritdoc */\n public ScrollTo(target: string | { top?: number; left?: number }): void {\n this.react.ScrollTo(target);\n }\n\n /** @inheritdoc */\n public Focus(target?: string): void {\n this.react.Focus(target);\n }\n}\n"]}
@@ -0,0 +1,55 @@
1
+ import { OnDestroy, OnInit } from '@angular/core';
2
+ import { BaseAngularComponent } from '@memberjunction/ng-base-types';
3
+ import { ComponentInstanceEngine, type ComponentInstanceRecord } from './component-instance-engine';
4
+ import type { ComponentActivity, IInteractiveComponentHandle } from './interactive-component-types';
5
+ import * as i0 from "@angular/core";
6
+ /**
7
+ * The LIVE surface of the Interactive Component channel (`mj-realtime-interactive-component-surface`): one tab per
8
+ * open component and the active component's pane under it. Every open component stays mounted (hidden when not
9
+ * active) so switching tabs never loses what the user was doing in one.
10
+ *
11
+ * Purely a view of the channel's {@link ComponentInstanceEngine}: the agent's actions mutate the engine through the
12
+ * channel, and this re-renders. What the user does (selecting a tab, closing one, anything inside a component) is
13
+ * reported back through {@link ActivityHandler}.
14
+ */
15
+ export declare class RealtimeInteractiveComponentSurfaceComponent extends BaseAngularComponent implements OnInit, OnDestroy {
16
+ private _engine;
17
+ /** The channel's instance engine (set by the channel's `BindSurface` before first change detection). */
18
+ set Engine(value: ComponentInstanceEngine | null);
19
+ get Engine(): ComponentInstanceEngine | null;
20
+ /** Display name of the agent fronting the session, for the empty-state copy. */
21
+ AgentName: string;
22
+ /** Reports what the user does (tab selection, closing a tab, activity inside a component) to the channel. */
23
+ ActivityHandler: ((instanceId: string, activity: ComponentActivity) => void) | null;
24
+ /** The open components, in open order. */
25
+ Instances: readonly ComponentInstanceRecord[];
26
+ /** The id of the component the user is looking at. */
27
+ ActiveID: string | null;
28
+ /** The component the user is looking at, or `null`. */
29
+ get ActiveRecord(): ComponentInstanceRecord | null;
30
+ private readonly cdr;
31
+ private readonly elementRef;
32
+ private subscription;
33
+ ngOnInit(): void;
34
+ ngOnDestroy(): void;
35
+ /** The active component's pane element, for frame capture; `null` when nothing is open. */
36
+ GetActiveElement(): HTMLElement | null;
37
+ /** Tab click. */
38
+ SelectTab(instanceId: string): void;
39
+ /** The close button: closes the component the user is looking at. */
40
+ CloseTab(event: Event, instanceId: string): void;
41
+ /** Keyboard navigation along the tab list (left/right/home/end), as the tabs pattern expects. */
42
+ OnTabKeydown(event: KeyboardEvent, index: number): void;
43
+ /** A component's live handle appeared (or went away while a new version loads). */
44
+ OnHandleChange(instanceId: string, handle: IInteractiveComponentHandle | null): void;
45
+ /** Something happened inside a component. */
46
+ OnActivity(instanceId: string, activity: ComponentActivity): void;
47
+ /** `track` function: instances are identified by id across version swaps. */
48
+ TrackByInstance(_index: number, record: ComponentInstanceRecord): string;
49
+ /** (Re)subscribes to the engine and pulls its current state. */
50
+ private resubscribe;
51
+ private refresh;
52
+ static ɵfac: i0.ɵɵFactoryDeclaration<RealtimeInteractiveComponentSurfaceComponent, never>;
53
+ static ɵcmp: i0.ɵɵComponentDeclaration<RealtimeInteractiveComponentSurfaceComponent, "mj-realtime-interactive-component-surface", never, { "Engine": { "alias": "Engine"; "required": false; }; "AgentName": { "alias": "AgentName"; "required": false; }; }, {}, never, never, true, never>;
54
+ }
55
+ //# sourceMappingURL=realtime-interactive-component-surface.component.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"realtime-interactive-component-surface.component.d.ts","sourceRoot":"","sources":["../../../../../src/lib/components/realtime/interactive-component/realtime-interactive-component-surface.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4E,SAAS,EAAE,MAAM,EAAU,MAAM,eAAe,CAAC;AAEpI,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAErE,OAAO,EAAE,uBAAuB,EAAE,KAAK,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AACpG,OAAO,KAAK,EAAE,iBAAiB,EAAE,2BAA2B,EAAE,MAAM,+BAA+B,CAAC;;AAEpG;;;;;;;;GAQG;AACH,qBAQa,4CAA6C,SAAQ,oBAAqB,YAAW,MAAM,EAAE,SAAS;IACjH,OAAO,CAAC,OAAO,CAAwC;IAEvD,wGAAwG;IACxG,IACW,MAAM,CAAC,KAAK,EAAE,uBAAuB,GAAG,IAAI,EAMtD;IACD,IAAW,MAAM,IAAI,uBAAuB,GAAG,IAAI,CAElD;IAED,gFAAgF;IAChE,SAAS,SAAe;IAExC,6GAA6G;IACtG,eAAe,EAAE,CAAC,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,iBAAiB,KAAK,IAAI,CAAC,GAAG,IAAI,CAAQ;IAElG,0CAA0C;IACnC,SAAS,EAAE,SAAS,uBAAuB,EAAE,CAAM;IAE1D,sDAAsD;IAC/C,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAQ;IAEtC,uDAAuD;IACvD,IAAW,YAAY,IAAI,uBAAuB,GAAG,IAAI,CAExD;IAED,OAAO,CAAC,QAAQ,CAAC,GAAG,CAA6B;IACjD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA+C;IAC1E,OAAO,CAAC,YAAY,CAA6B;IAEjD,QAAQ,IAAI,IAAI;IAIhB,WAAW,IAAI,IAAI;IAKnB,2FAA2F;IACpF,gBAAgB,IAAI,WAAW,GAAG,IAAI;IAO7C,iBAAiB;IACV,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAQ1C,qEAAqE;IAC9D,QAAQ,CAAC,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI;IASvD,iGAAiG;IAC1F,YAAY,CAAC,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAW9D,mFAAmF;IAC5E,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,2BAA2B,GAAG,IAAI,GAAG,IAAI;IAI3F,6CAA6C;IACtC,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,iBAAiB,GAAG,IAAI;IAIxE,6EAA6E;IACtE,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,uBAAuB,GAAG,MAAM;IAI/E,gEAAgE;IAChE,OAAO,CAAC,WAAW;IASnB,OAAO,CAAC,OAAO;yCA9GJ,4CAA4C;2CAA5C,4CAA4C;CAmHxD"}
@@ -0,0 +1,210 @@
1
+ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, Input, inject } from '@angular/core';
2
+ import { BaseAngularComponent } from '@memberjunction/ng-base-types';
3
+ import { InteractiveComponentHostComponent } from './interactive-component-host.component';
4
+ import * as i0 from "@angular/core";
5
+ function RealtimeInteractiveComponentSurfaceComponent_Conditional_1_Template(rf, ctx) { if (rf & 1) {
6
+ i0.ɵɵelementStart(0, "div", 1);
7
+ i0.ɵɵelement(1, "i", 2);
8
+ i0.ɵɵelementStart(2, "p", 3);
9
+ i0.ɵɵtext(3, "No component open");
10
+ i0.ɵɵelementEnd();
11
+ i0.ɵɵelementStart(4, "p", 4);
12
+ i0.ɵɵtext(5);
13
+ i0.ɵɵelementEnd()();
14
+ } if (rf & 2) {
15
+ const ctx_r0 = i0.ɵɵnextContext();
16
+ i0.ɵɵadvance(5);
17
+ i0.ɵɵtextInterpolate1("", ctx_r0.AgentName, " can open an interactive component here during the conversation.");
18
+ } }
19
+ function RealtimeInteractiveComponentSurfaceComponent_Conditional_2_For_3_Template(rf, ctx) { if (rf & 1) {
20
+ const _r2 = i0.ɵɵgetCurrentView();
21
+ i0.ɵɵelementStart(0, "button", 11);
22
+ i0.ɵɵlistener("click", function RealtimeInteractiveComponentSurfaceComponent_Conditional_2_For_3_Template_button_click_0_listener() { const record_r3 = i0.ɵɵrestoreView(_r2).$implicit; const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.SelectTab(record_r3.InstanceID)); })("keydown", function RealtimeInteractiveComponentSurfaceComponent_Conditional_2_For_3_Template_button_keydown_0_listener($event) { const ɵ$index_19_r4 = i0.ɵɵrestoreView(_r2).$index; const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.OnTabKeydown($event, ɵ$index_19_r4)); });
23
+ i0.ɵɵelement(1, "i", 12);
24
+ i0.ɵɵelementStart(2, "span", 13);
25
+ i0.ɵɵtext(3);
26
+ i0.ɵɵelementEnd();
27
+ i0.ɵɵelementStart(4, "span", 14);
28
+ i0.ɵɵtext(5);
29
+ i0.ɵɵelementEnd()();
30
+ } if (rf & 2) {
31
+ const record_r3 = ctx.$implicit;
32
+ const ctx_r0 = i0.ɵɵnextContext(2);
33
+ i0.ɵɵclassProp("ic-tab--active", record_r3.InstanceID === ctx_r0.ActiveID);
34
+ i0.ɵɵproperty("title", record_r3.Artifact.Name);
35
+ i0.ɵɵattribute("aria-selected", record_r3.InstanceID === ctx_r0.ActiveID)("tabindex", record_r3.InstanceID === ctx_r0.ActiveID ? 0 : -1);
36
+ i0.ɵɵadvance(3);
37
+ i0.ɵɵtextInterpolate(record_r3.Artifact.Name);
38
+ i0.ɵɵadvance(2);
39
+ i0.ɵɵtextInterpolate1("v", record_r3.Artifact.VersionNumber);
40
+ } }
41
+ function RealtimeInteractiveComponentSurfaceComponent_Conditional_2_Conditional_4_Template(rf, ctx) { if (rf & 1) {
42
+ const _r5 = i0.ɵɵgetCurrentView();
43
+ i0.ɵɵelementStart(0, "button", 15);
44
+ i0.ɵɵlistener("click", function RealtimeInteractiveComponentSurfaceComponent_Conditional_2_Conditional_4_Template_button_click_0_listener($event) { const active_r6 = i0.ɵɵrestoreView(_r5); const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.CloseTab($event, active_r6.InstanceID)); });
45
+ i0.ɵɵelement(1, "i", 16);
46
+ i0.ɵɵelementEnd();
47
+ } if (rf & 2) {
48
+ const active_r6 = ctx;
49
+ i0.ɵɵproperty("title", "Close " + active_r6.Artifact.Name);
50
+ i0.ɵɵattribute("aria-label", "Close " + active_r6.Artifact.Name);
51
+ } }
52
+ function RealtimeInteractiveComponentSurfaceComponent_Conditional_2_For_7_Template(rf, ctx) { if (rf & 1) {
53
+ const _r7 = i0.ɵɵgetCurrentView();
54
+ i0.ɵɵelementStart(0, "div", 10)(1, "mj-interactive-component-host", 17);
55
+ i0.ɵɵlistener("Activity", function RealtimeInteractiveComponentSurfaceComponent_Conditional_2_For_7_Template_mj_interactive_component_host_Activity_1_listener($event) { const record_r8 = i0.ɵɵrestoreView(_r7).$implicit; const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.OnActivity(record_r8.InstanceID, $event)); })("HandleChange", function RealtimeInteractiveComponentSurfaceComponent_Conditional_2_For_7_Template_mj_interactive_component_host_HandleChange_1_listener($event) { const record_r8 = i0.ɵɵrestoreView(_r7).$implicit; const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.OnHandleChange(record_r8.InstanceID, $event)); });
56
+ i0.ɵɵelementEnd()();
57
+ } if (rf & 2) {
58
+ const record_r8 = ctx.$implicit;
59
+ const ctx_r0 = i0.ɵɵnextContext(2);
60
+ i0.ɵɵproperty("hidden", record_r8.InstanceID !== ctx_r0.ActiveID);
61
+ i0.ɵɵattribute("data-instance", record_r8.InstanceID)("aria-label", record_r8.Artifact.Name);
62
+ i0.ɵɵadvance();
63
+ i0.ɵɵproperty("Spec", record_r8.Artifact.Spec)("Inputs", record_r8.Inputs)("Provider", ctx_r0.Provider);
64
+ } }
65
+ function RealtimeInteractiveComponentSurfaceComponent_Conditional_2_Template(rf, ctx) { if (rf & 1) {
66
+ i0.ɵɵelementStart(0, "div", 5)(1, "div", 6);
67
+ i0.ɵɵrepeaterCreate(2, RealtimeInteractiveComponentSurfaceComponent_Conditional_2_For_3_Template, 6, 7, "button", 7, i0.ɵɵcomponentInstance().TrackByInstance, true);
68
+ i0.ɵɵelementEnd();
69
+ i0.ɵɵconditionalCreate(4, RealtimeInteractiveComponentSurfaceComponent_Conditional_2_Conditional_4_Template, 2, 2, "button", 8);
70
+ i0.ɵɵelementEnd();
71
+ i0.ɵɵelementStart(5, "div", 9);
72
+ i0.ɵɵrepeaterCreate(6, RealtimeInteractiveComponentSurfaceComponent_Conditional_2_For_7_Template, 2, 6, "div", 10, i0.ɵɵcomponentInstance().TrackByInstance, true);
73
+ i0.ɵɵelementEnd();
74
+ } if (rf & 2) {
75
+ let tmp_2_0;
76
+ const ctx_r0 = i0.ɵɵnextContext();
77
+ i0.ɵɵadvance(2);
78
+ i0.ɵɵrepeater(ctx_r0.Instances);
79
+ i0.ɵɵadvance(2);
80
+ i0.ɵɵconditional((tmp_2_0 = ctx_r0.ActiveRecord) ? 4 : -1, tmp_2_0);
81
+ i0.ɵɵadvance(2);
82
+ i0.ɵɵrepeater(ctx_r0.Instances);
83
+ } }
84
+ /**
85
+ * The LIVE surface of the Interactive Component channel (`mj-realtime-interactive-component-surface`): one tab per
86
+ * open component and the active component's pane under it. Every open component stays mounted (hidden when not
87
+ * active) so switching tabs never loses what the user was doing in one.
88
+ *
89
+ * Purely a view of the channel's {@link ComponentInstanceEngine}: the agent's actions mutate the engine through the
90
+ * channel, and this re-renders. What the user does (selecting a tab, closing one, anything inside a component) is
91
+ * reported back through {@link ActivityHandler}.
92
+ */
93
+ export class RealtimeInteractiveComponentSurfaceComponent extends BaseAngularComponent {
94
+ _engine = null;
95
+ /** The channel's instance engine (set by the channel's `BindSurface` before first change detection). */
96
+ set Engine(value) {
97
+ if (value === this._engine) {
98
+ return;
99
+ }
100
+ this._engine = value;
101
+ this.resubscribe();
102
+ }
103
+ get Engine() {
104
+ return this._engine;
105
+ }
106
+ /** Display name of the agent fronting the session, for the empty-state copy. */
107
+ AgentName = 'The agent';
108
+ /** Reports what the user does (tab selection, closing a tab, activity inside a component) to the channel. */
109
+ ActivityHandler = null;
110
+ /** The open components, in open order. */
111
+ Instances = [];
112
+ /** The id of the component the user is looking at. */
113
+ ActiveID = null;
114
+ /** The component the user is looking at, or `null`. */
115
+ get ActiveRecord() {
116
+ return this.Instances.find((r) => r.InstanceID === this.ActiveID) ?? null;
117
+ }
118
+ cdr = inject(ChangeDetectorRef);
119
+ elementRef = inject(ElementRef);
120
+ subscription = null;
121
+ ngOnInit() {
122
+ this.resubscribe();
123
+ }
124
+ ngOnDestroy() {
125
+ this.subscription?.unsubscribe();
126
+ this.subscription = null;
127
+ }
128
+ /** The active component's pane element, for frame capture; `null` when nothing is open. */
129
+ GetActiveElement() {
130
+ if (this.ActiveID === null) {
131
+ return null;
132
+ }
133
+ return this.elementRef.nativeElement.querySelector(`[data-instance="${this.ActiveID}"]`);
134
+ }
135
+ /** Tab click. */
136
+ SelectTab(instanceId) {
137
+ if (this.ActivityHandler) {
138
+ this.ActivityHandler(instanceId, { Kind: 'selected' });
139
+ }
140
+ else {
141
+ this._engine?.SetActive(instanceId);
142
+ }
143
+ }
144
+ /** The close button: closes the component the user is looking at. */
145
+ CloseTab(event, instanceId) {
146
+ event.stopPropagation();
147
+ if (this.ActivityHandler) {
148
+ this.ActivityHandler(instanceId, { Kind: 'closed' });
149
+ }
150
+ else {
151
+ this._engine?.Remove(instanceId);
152
+ }
153
+ }
154
+ /** Keyboard navigation along the tab list (left/right/home/end), as the tabs pattern expects. */
155
+ OnTabKeydown(event, index) {
156
+ const last = this.Instances.length - 1;
157
+ const targets = { ArrowRight: Math.min(index + 1, last), ArrowLeft: Math.max(index - 1, 0), Home: 0, End: last };
158
+ const next = targets[event.key];
159
+ if (next === undefined) {
160
+ return;
161
+ }
162
+ event.preventDefault();
163
+ this.SelectTab(this.Instances[next].InstanceID);
164
+ }
165
+ /** A component's live handle appeared (or went away while a new version loads). */
166
+ OnHandleChange(instanceId, handle) {
167
+ this._engine?.AttachHandle(instanceId, handle);
168
+ }
169
+ /** Something happened inside a component. */
170
+ OnActivity(instanceId, activity) {
171
+ this.ActivityHandler?.(instanceId, activity);
172
+ }
173
+ /** `track` function: instances are identified by id across version swaps. */
174
+ TrackByInstance(_index, record) {
175
+ return record.InstanceID;
176
+ }
177
+ /** (Re)subscribes to the engine and pulls its current state. */
178
+ resubscribe() {
179
+ this.subscription?.unsubscribe();
180
+ this.subscription = null;
181
+ this.refresh();
182
+ if (this._engine) {
183
+ this.subscription = this._engine.Changed$.subscribe(() => this.refresh());
184
+ }
185
+ }
186
+ refresh() {
187
+ this.Instances = this._engine ? this._engine.Instances : [];
188
+ this.ActiveID = this._engine ? this._engine.ActiveID : null;
189
+ this.cdr.markForCheck();
190
+ }
191
+ static ɵfac = /*@__PURE__*/ (() => { let ɵRealtimeInteractiveComponentSurfaceComponent_BaseFactory; return function RealtimeInteractiveComponentSurfaceComponent_Factory(__ngFactoryType__) { return (ɵRealtimeInteractiveComponentSurfaceComponent_BaseFactory || (ɵRealtimeInteractiveComponentSurfaceComponent_BaseFactory = i0.ɵɵgetInheritedFactory(RealtimeInteractiveComponentSurfaceComponent)))(__ngFactoryType__ || RealtimeInteractiveComponentSurfaceComponent); }; })();
192
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: RealtimeInteractiveComponentSurfaceComponent, selectors: [["mj-realtime-interactive-component-surface"]], inputs: { Engine: "Engine", AgentName: "AgentName" }, features: [i0.ɵɵInheritDefinitionFeature], decls: 3, vars: 1, consts: [[1, "ic-surface"], [1, "ic-empty"], ["aria-hidden", "true", 1, "fa-solid", "fa-cubes", "ic-empty__icon"], [1, "ic-empty__title"], [1, "ic-empty__hint"], [1, "ic-tabbar"], ["role", "tablist", "aria-label", "Open components", 1, "ic-tabs"], ["type", "button", "role", "tab", 1, "ic-tab", 3, "ic-tab--active", "title"], ["type", "button", 1, "ic-close", 3, "title"], [1, "ic-panes"], ["role", "tabpanel", 1, "ic-pane", 3, "hidden"], ["type", "button", "role", "tab", 1, "ic-tab", 3, "click", "keydown", "title"], ["aria-hidden", "true", 1, "fa-solid", "fa-cube", "ic-tab__icon"], [1, "ic-tab__name"], [1, "ic-tab__version"], ["type", "button", 1, "ic-close", 3, "click", "title"], ["aria-hidden", "true", 1, "fa-solid", "fa-xmark"], [3, "Activity", "HandleChange", "Spec", "Inputs", "Provider"]], template: function RealtimeInteractiveComponentSurfaceComponent_Template(rf, ctx) { if (rf & 1) {
193
+ i0.ɵɵelementStart(0, "div", 0);
194
+ i0.ɵɵconditionalCreate(1, RealtimeInteractiveComponentSurfaceComponent_Conditional_1_Template, 6, 1, "div", 1)(2, RealtimeInteractiveComponentSurfaceComponent_Conditional_2_Template, 8, 1);
195
+ i0.ɵɵelementEnd();
196
+ } if (rf & 2) {
197
+ i0.ɵɵadvance();
198
+ i0.ɵɵconditional(ctx.Instances.length === 0 ? 1 : 2);
199
+ } }, dependencies: [InteractiveComponentHostComponent], styles: ["[_nghost-%COMP%] {\n display: block;\n height: 100%;\n min-height: 0;\n}\n\n.ic-surface[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: 0;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n}\n\n.ic-tabbar[_ngcontent-%COMP%] {\n display: flex;\n align-items: stretch;\n flex: 0 0 auto;\n border-bottom: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-card);\n}\n\n.ic-tabs[_ngcontent-%COMP%] {\n display: flex;\n flex: 1 1 auto;\n gap: 2px;\n min-width: 0;\n overflow-x: auto;\n padding: 0 8px;\n}\n\n.ic-tab[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n max-width: 240px;\n padding: 8px 10px;\n border: 0;\n border-bottom: 2px solid transparent;\n background: transparent;\n color: var(--mj-text-secondary);\n font: inherit;\n white-space: nowrap;\n cursor: pointer;\n}\n\n.ic-tab[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.ic-tab[_ngcontent-%COMP%]:focus-visible {\n outline: 2px solid var(--mj-border-focus);\n outline-offset: -2px;\n}\n\n.ic-tab--active[_ngcontent-%COMP%] {\n color: var(--mj-text-primary);\n border-bottom-color: var(--mj-brand-primary);\n}\n\n.ic-tab__name[_ngcontent-%COMP%] {\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.ic-tab__version[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-muted);\n}\n\n.ic-close[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex: 0 0 auto;\n width: 36px;\n border: 0;\n background: transparent;\n color: var(--mj-text-muted);\n cursor: pointer;\n}\n\n.ic-close[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-active);\n color: var(--mj-text-primary);\n}\n\n.ic-close[_ngcontent-%COMP%]:focus-visible {\n outline: 2px solid var(--mj-border-focus);\n outline-offset: -2px;\n}\n\n.ic-panes[_ngcontent-%COMP%] {\n flex: 1 1 auto;\n min-height: 0;\n position: relative;\n}\n\n.ic-pane[_ngcontent-%COMP%] {\n height: 100%;\n min-height: 0;\n}\n\n.ic-pane[hidden][_ngcontent-%COMP%] {\n display: none;\n}\n\n.ic-empty[_ngcontent-%COMP%] {\n display: flex;\n flex: 1 1 auto;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 4px;\n padding: 24px;\n text-align: center;\n color: var(--mj-text-muted);\n}\n\n.ic-empty__icon[_ngcontent-%COMP%] {\n font-size: 28px;\n}\n\n.ic-empty__title[_ngcontent-%COMP%] {\n margin: 8px 0 0;\n font-weight: 600;\n color: var(--mj-text-secondary);\n}\n\n.ic-empty__hint[_ngcontent-%COMP%] {\n margin: 0;\n}"], changeDetection: 0 });
200
+ }
201
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(RealtimeInteractiveComponentSurfaceComponent, [{
202
+ type: Component,
203
+ args: [{ standalone: true, selector: 'mj-realtime-interactive-component-surface', imports: [InteractiveComponentHostComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"ic-surface\">\n @if (Instances.length === 0) {\n <div class=\"ic-empty\">\n <i class=\"fa-solid fa-cubes ic-empty__icon\" aria-hidden=\"true\"></i>\n <p class=\"ic-empty__title\">No component open</p>\n <p class=\"ic-empty__hint\">{{ AgentName }} can open an interactive component here during the conversation.</p>\n </div>\n } @else {\n <div class=\"ic-tabbar\">\n <div class=\"ic-tabs\" role=\"tablist\" aria-label=\"Open components\">\n @for (record of Instances; track TrackByInstance($index, record); let i = $index) {\n <button\n type=\"button\"\n class=\"ic-tab\"\n role=\"tab\"\n [class.ic-tab--active]=\"record.InstanceID === ActiveID\"\n [attr.aria-selected]=\"record.InstanceID === ActiveID\"\n [attr.tabindex]=\"record.InstanceID === ActiveID ? 0 : -1\"\n [title]=\"record.Artifact.Name\"\n (click)=\"SelectTab(record.InstanceID)\"\n (keydown)=\"OnTabKeydown($event, i)\"\n >\n <i class=\"fa-solid fa-cube ic-tab__icon\" aria-hidden=\"true\"></i>\n <span class=\"ic-tab__name\">{{ record.Artifact.Name }}</span>\n <span class=\"ic-tab__version\">v{{ record.Artifact.VersionNumber }}</span>\n </button>\n }\n </div>\n @if (ActiveRecord; as active) {\n <button\n type=\"button\"\n class=\"ic-close\"\n [attr.aria-label]=\"'Close ' + active.Artifact.Name\"\n [title]=\"'Close ' + active.Artifact.Name\"\n (click)=\"CloseTab($event, active.InstanceID)\"\n >\n <i class=\"fa-solid fa-xmark\" aria-hidden=\"true\"></i>\n </button>\n }\n </div>\n <div class=\"ic-panes\">\n @for (record of Instances; track TrackByInstance($index, record)) {\n <div\n class=\"ic-pane\"\n role=\"tabpanel\"\n [hidden]=\"record.InstanceID !== ActiveID\"\n [attr.data-instance]=\"record.InstanceID\"\n [attr.aria-label]=\"record.Artifact.Name\"\n >\n <mj-interactive-component-host\n [Spec]=\"record.Artifact.Spec\"\n [Inputs]=\"record.Inputs\"\n [Provider]=\"Provider\"\n (Activity)=\"OnActivity(record.InstanceID, $event)\"\n (HandleChange)=\"OnHandleChange(record.InstanceID, $event)\"\n ></mj-interactive-component-host>\n </div>\n }\n </div>\n }\n</div>\n", styles: [":host {\n display: block;\n height: 100%;\n min-height: 0;\n}\n\n.ic-surface {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: 0;\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n}\n\n.ic-tabbar {\n display: flex;\n align-items: stretch;\n flex: 0 0 auto;\n border-bottom: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-card);\n}\n\n.ic-tabs {\n display: flex;\n flex: 1 1 auto;\n gap: 2px;\n min-width: 0;\n overflow-x: auto;\n padding: 0 8px;\n}\n\n.ic-tab {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n max-width: 240px;\n padding: 8px 10px;\n border: 0;\n border-bottom: 2px solid transparent;\n background: transparent;\n color: var(--mj-text-secondary);\n font: inherit;\n white-space: nowrap;\n cursor: pointer;\n}\n\n.ic-tab:hover {\n background: var(--mj-bg-surface-hover);\n}\n\n.ic-tab:focus-visible {\n outline: 2px solid var(--mj-border-focus);\n outline-offset: -2px;\n}\n\n.ic-tab--active {\n color: var(--mj-text-primary);\n border-bottom-color: var(--mj-brand-primary);\n}\n\n.ic-tab__name {\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.ic-tab__version {\n font-size: 11px;\n color: var(--mj-text-muted);\n}\n\n.ic-close {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex: 0 0 auto;\n width: 36px;\n border: 0;\n background: transparent;\n color: var(--mj-text-muted);\n cursor: pointer;\n}\n\n.ic-close:hover {\n background: var(--mj-bg-surface-active);\n color: var(--mj-text-primary);\n}\n\n.ic-close:focus-visible {\n outline: 2px solid var(--mj-border-focus);\n outline-offset: -2px;\n}\n\n.ic-panes {\n flex: 1 1 auto;\n min-height: 0;\n position: relative;\n}\n\n.ic-pane {\n height: 100%;\n min-height: 0;\n}\n\n.ic-pane[hidden] {\n display: none;\n}\n\n.ic-empty {\n display: flex;\n flex: 1 1 auto;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 4px;\n padding: 24px;\n text-align: center;\n color: var(--mj-text-muted);\n}\n\n.ic-empty__icon {\n font-size: 28px;\n}\n\n.ic-empty__title {\n margin: 8px 0 0;\n font-weight: 600;\n color: var(--mj-text-secondary);\n}\n\n.ic-empty__hint {\n margin: 0;\n}\n"] }]
204
+ }], null, { Engine: [{
205
+ type: Input
206
+ }], AgentName: [{
207
+ type: Input
208
+ }] }); })();
209
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(RealtimeInteractiveComponentSurfaceComponent, { className: "RealtimeInteractiveComponentSurfaceComponent", filePath: "src/lib/components/realtime/interactive-component/realtime-interactive-component-surface.component.ts", lineNumber: 25 }); })();
210
+ //# sourceMappingURL=realtime-interactive-component-surface.component.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"realtime-interactive-component-surface.component.js","sourceRoot":"","sources":["../../../../../src/lib/components/realtime/interactive-component/realtime-interactive-component-surface.component.ts","../../../../../src/lib/components/realtime/interactive-component/realtime-interactive-component-surface.component.html"],"names":[],"mappings":"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","sourcesContent":["import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, Input, OnDestroy, OnInit, inject } from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\nimport { InteractiveComponentHostComponent } from './interactive-component-host.component';\nimport { ComponentInstanceEngine, type ComponentInstanceRecord } from './component-instance-engine';\nimport type { ComponentActivity, IInteractiveComponentHandle } from './interactive-component-types';\n\n/**\n * The LIVE surface of the Interactive Component channel (`mj-realtime-interactive-component-surface`): one tab per\n * open component and the active component's pane under it. Every open component stays mounted (hidden when not\n * active) so switching tabs never loses what the user was doing in one.\n *\n * Purely a view of the channel's {@link ComponentInstanceEngine}: the agent's actions mutate the engine through the\n * channel, and this re-renders. What the user does (selecting a tab, closing one, anything inside a component) is\n * reported back through {@link ActivityHandler}.\n */\n@Component({\n standalone: true,\n selector: 'mj-realtime-interactive-component-surface',\n imports: [InteractiveComponentHostComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './realtime-interactive-component-surface.component.html',\n styleUrls: ['./realtime-interactive-component-surface.component.css'],\n})\nexport class RealtimeInteractiveComponentSurfaceComponent extends BaseAngularComponent implements OnInit, OnDestroy {\n private _engine: ComponentInstanceEngine | null = null;\n\n /** The channel's instance engine (set by the channel's `BindSurface` before first change detection). */\n @Input()\n public set Engine(value: ComponentInstanceEngine | null) {\n if (value === this._engine) {\n return;\n }\n this._engine = value;\n this.resubscribe();\n }\n public get Engine(): ComponentInstanceEngine | null {\n return this._engine;\n }\n\n /** Display name of the agent fronting the session, for the empty-state copy. */\n @Input() public AgentName = 'The agent';\n\n /** Reports what the user does (tab selection, closing a tab, activity inside a component) to the channel. */\n public ActivityHandler: ((instanceId: string, activity: ComponentActivity) => void) | null = null;\n\n /** The open components, in open order. */\n public Instances: readonly ComponentInstanceRecord[] = [];\n\n /** The id of the component the user is looking at. */\n public ActiveID: string | null = null;\n\n /** The component the user is looking at, or `null`. */\n public get ActiveRecord(): ComponentInstanceRecord | null {\n return this.Instances.find((r) => r.InstanceID === this.ActiveID) ?? null;\n }\n\n private readonly cdr = inject(ChangeDetectorRef);\n private readonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n private subscription: Subscription | null = null;\n\n ngOnInit(): void {\n this.resubscribe();\n }\n\n ngOnDestroy(): void {\n this.subscription?.unsubscribe();\n this.subscription = null;\n }\n\n /** The active component's pane element, for frame capture; `null` when nothing is open. */\n public GetActiveElement(): HTMLElement | null {\n if (this.ActiveID === null) {\n return null;\n }\n return this.elementRef.nativeElement.querySelector<HTMLElement>(`[data-instance=\"${this.ActiveID}\"]`);\n }\n\n /** Tab click. */\n public SelectTab(instanceId: string): void {\n if (this.ActivityHandler) {\n this.ActivityHandler(instanceId, { Kind: 'selected' });\n } else {\n this._engine?.SetActive(instanceId);\n }\n }\n\n /** The close button: closes the component the user is looking at. */\n public CloseTab(event: Event, instanceId: string): void {\n event.stopPropagation();\n if (this.ActivityHandler) {\n this.ActivityHandler(instanceId, { Kind: 'closed' });\n } else {\n this._engine?.Remove(instanceId);\n }\n }\n\n /** Keyboard navigation along the tab list (left/right/home/end), as the tabs pattern expects. */\n public OnTabKeydown(event: KeyboardEvent, index: number): void {\n const last = this.Instances.length - 1;\n const targets: Record<string, number> = { ArrowRight: Math.min(index + 1, last), ArrowLeft: Math.max(index - 1, 0), Home: 0, End: last };\n const next = targets[event.key];\n if (next === undefined) {\n return;\n }\n event.preventDefault();\n this.SelectTab(this.Instances[next].InstanceID);\n }\n\n /** A component's live handle appeared (or went away while a new version loads). */\n public OnHandleChange(instanceId: string, handle: IInteractiveComponentHandle | null): void {\n this._engine?.AttachHandle(instanceId, handle);\n }\n\n /** Something happened inside a component. */\n public OnActivity(instanceId: string, activity: ComponentActivity): void {\n this.ActivityHandler?.(instanceId, activity);\n }\n\n /** `track` function: instances are identified by id across version swaps. */\n public TrackByInstance(_index: number, record: ComponentInstanceRecord): string {\n return record.InstanceID;\n }\n\n /** (Re)subscribes to the engine and pulls its current state. */\n private resubscribe(): void {\n this.subscription?.unsubscribe();\n this.subscription = null;\n this.refresh();\n if (this._engine) {\n this.subscription = this._engine.Changed$.subscribe(() => this.refresh());\n }\n }\n\n private refresh(): void {\n this.Instances = this._engine ? this._engine.Instances : [];\n this.ActiveID = this._engine ? this._engine.ActiveID : null;\n this.cdr.markForCheck();\n }\n}\n","<div class=\"ic-surface\">\n @if (Instances.length === 0) {\n <div class=\"ic-empty\">\n <i class=\"fa-solid fa-cubes ic-empty__icon\" aria-hidden=\"true\"></i>\n <p class=\"ic-empty__title\">No component open</p>\n <p class=\"ic-empty__hint\">{{ AgentName }} can open an interactive component here during the conversation.</p>\n </div>\n } @else {\n <div class=\"ic-tabbar\">\n <div class=\"ic-tabs\" role=\"tablist\" aria-label=\"Open components\">\n @for (record of Instances; track TrackByInstance($index, record); let i = $index) {\n <button\n type=\"button\"\n class=\"ic-tab\"\n role=\"tab\"\n [class.ic-tab--active]=\"record.InstanceID === ActiveID\"\n [attr.aria-selected]=\"record.InstanceID === ActiveID\"\n [attr.tabindex]=\"record.InstanceID === ActiveID ? 0 : -1\"\n [title]=\"record.Artifact.Name\"\n (click)=\"SelectTab(record.InstanceID)\"\n (keydown)=\"OnTabKeydown($event, i)\"\n >\n <i class=\"fa-solid fa-cube ic-tab__icon\" aria-hidden=\"true\"></i>\n <span class=\"ic-tab__name\">{{ record.Artifact.Name }}</span>\n <span class=\"ic-tab__version\">v{{ record.Artifact.VersionNumber }}</span>\n </button>\n }\n </div>\n @if (ActiveRecord; as active) {\n <button\n type=\"button\"\n class=\"ic-close\"\n [attr.aria-label]=\"'Close ' + active.Artifact.Name\"\n [title]=\"'Close ' + active.Artifact.Name\"\n (click)=\"CloseTab($event, active.InstanceID)\"\n >\n <i class=\"fa-solid fa-xmark\" aria-hidden=\"true\"></i>\n </button>\n }\n </div>\n <div class=\"ic-panes\">\n @for (record of Instances; track TrackByInstance($index, record)) {\n <div\n class=\"ic-pane\"\n role=\"tabpanel\"\n [hidden]=\"record.InstanceID !== ActiveID\"\n [attr.data-instance]=\"record.InstanceID\"\n [attr.aria-label]=\"record.Artifact.Name\"\n >\n <mj-interactive-component-host\n [Spec]=\"record.Artifact.Spec\"\n [Inputs]=\"record.Inputs\"\n [Provider]=\"Provider\"\n (Activity)=\"OnActivity(record.InstanceID, $event)\"\n (HandleChange)=\"OnHandleChange(record.InstanceID, $event)\"\n ></mj-interactive-component-host>\n </div>\n }\n </div>\n }\n</div>\n"]}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * @fileoverview The database-backed {@link IComponentArtifactSource}: loads component artifacts through the
3
+ * SESSION'S OWN provider and the signed-in user's own read access.
4
+ *
5
+ * Nothing here widens access. The channel runs in the user's browser, the provider is the one that
6
+ * authenticates their session, and an artifact is loaded only if the user may read it by the same rules the
7
+ * rest of the conversation UI applies (owner, an explicit grant, or a collection they can read).
8
+ *
9
+ * @module @memberjunction/ng-conversations
10
+ */
11
+ import { IMetadataProvider, UserInfo } from '@memberjunction/core';
12
+ import { type IComponentArtifactSource, type ResolvedComponentArtifact } from './interactive-component-types';
13
+ /** Loads component artifacts with the user's own access. */
14
+ export declare class RunViewComponentArtifactSource implements IComponentArtifactSource {
15
+ private readonly provider;
16
+ private readonly user;
17
+ private readonly permissions;
18
+ /**
19
+ * @param provider The session's metadata provider (the one that authenticates the user).
20
+ * @param user The signed-in user.
21
+ */
22
+ constructor(provider: IMetadataProvider, user: UserInfo);
23
+ /** @inheritdoc */
24
+ LoadVersion(versionId: string): Promise<ResolvedComponentArtifact>;
25
+ /** @inheritdoc */
26
+ LoadLatest(artifactId: string): Promise<ResolvedComponentArtifact>;
27
+ /** Loads one row by filter, mapping an empty result to `not_found` and a failed query to `load_failed`. */
28
+ private queryOne;
29
+ /** Checks access and type, then parses the content. */
30
+ private resolve;
31
+ }
32
+ //# sourceMappingURL=run-view-component-artifact-source.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-view-component-artifact-source.d.ts","sourceRoot":"","sources":["../../../../../src/lib/components/realtime/interactive-component/run-view-component-artifact-source.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,iBAAiB,EAAqB,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAMtF,OAAO,EAEH,KAAK,wBAAwB,EAC7B,KAAK,yBAAyB,EACjC,MAAM,+BAA+B,CAAC;AAiBvC,4DAA4D;AAC5D,qBAAa,8BAA+B,YAAW,wBAAwB;IAQvE,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,IAAI;IARzB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA4B;IAExD;;;OAGG;gBAEkB,QAAQ,EAAE,iBAAiB,EAC3B,IAAI,EAAE,QAAQ;IAMnC,kBAAkB;IACL,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,yBAAyB,CAAC;IAM/E,kBAAkB;IACL,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,yBAAyB,CAAC;IAW/E,2GAA2G;YAC7F,QAAQ;IAgBtB,uDAAuD;YACzC,OAAO;CAmBxB"}