@memberjunction/ng-conversations 5.40.2 → 5.42.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 (391) 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 +585 -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/collection/collections-full-view.component.d.ts +105 -2
  135. package/dist/lib/components/collection/collections-full-view.component.d.ts.map +1 -1
  136. package/dist/lib/components/collection/collections-full-view.component.js +1378 -489
  137. package/dist/lib/components/collection/collections-full-view.component.js.map +1 -1
  138. package/dist/lib/components/conversation/conversation-chat-area.component.d.ts +209 -3
  139. package/dist/lib/components/conversation/conversation-chat-area.component.d.ts.map +1 -1
  140. package/dist/lib/components/conversation/conversation-chat-area.component.js +924 -350
  141. package/dist/lib/components/conversation/conversation-chat-area.component.js.map +1 -1
  142. package/dist/lib/components/conversation/conversation-list.component.d.ts +98 -5
  143. package/dist/lib/components/conversation/conversation-list.component.d.ts.map +1 -1
  144. package/dist/lib/components/conversation/conversation-list.component.js +1102 -401
  145. package/dist/lib/components/conversation/conversation-list.component.js.map +1 -1
  146. package/dist/lib/components/mention/mention-dropdown.component.js +35 -17
  147. package/dist/lib/components/mention/mention-dropdown.component.js.map +1 -1
  148. package/dist/lib/components/mention/mention-editor.component.d.ts +4 -0
  149. package/dist/lib/components/mention/mention-editor.component.d.ts.map +1 -1
  150. package/dist/lib/components/mention/mention-editor.component.js +43 -19
  151. package/dist/lib/components/mention/mention-editor.component.js.map +1 -1
  152. package/dist/lib/components/message/message-input-box.component.d.ts +17 -1
  153. package/dist/lib/components/message/message-input-box.component.d.ts.map +1 -1
  154. package/dist/lib/components/message/message-input-box.component.js +73 -15
  155. package/dist/lib/components/message/message-input-box.component.js.map +1 -1
  156. package/dist/lib/components/message/message-input.component.d.ts +142 -6
  157. package/dist/lib/components/message/message-input.component.d.ts.map +1 -1
  158. package/dist/lib/components/message/message-input.component.js +328 -82
  159. package/dist/lib/components/message/message-input.component.js.map +1 -1
  160. package/dist/lib/components/message/message-item.component.d.ts +28 -3
  161. package/dist/lib/components/message/message-item.component.d.ts.map +1 -1
  162. package/dist/lib/components/message/message-item.component.js +180 -108
  163. package/dist/lib/components/message/message-item.component.js.map +1 -1
  164. package/dist/lib/components/message/message-list.component.d.ts +81 -2
  165. package/dist/lib/components/message/message-list.component.d.ts.map +1 -1
  166. package/dist/lib/components/message/message-list.component.js +252 -87
  167. package/dist/lib/components/message/message-list.component.js.map +1 -1
  168. package/dist/lib/components/project/project-form-modal.component.d.ts +5 -1
  169. package/dist/lib/components/project/project-form-modal.component.d.ts.map +1 -1
  170. package/dist/lib/components/project/project-form-modal.component.js +104 -85
  171. package/dist/lib/components/project/project-form-modal.component.js.map +1 -1
  172. package/dist/lib/components/realtime/channels/base-realtime-channel-client.d.ts +304 -0
  173. package/dist/lib/components/realtime/channels/base-realtime-channel-client.d.ts.map +1 -0
  174. package/dist/lib/components/realtime/channels/base-realtime-channel-client.js +198 -0
  175. package/dist/lib/components/realtime/channels/base-realtime-channel-client.js.map +1 -0
  176. package/dist/lib/components/realtime/channels/channel-onboarding-panel.component.d.ts +25 -0
  177. package/dist/lib/components/realtime/channels/channel-onboarding-panel.component.d.ts.map +1 -0
  178. package/dist/lib/components/realtime/channels/channel-onboarding-panel.component.js +140 -0
  179. package/dist/lib/components/realtime/channels/channel-onboarding-panel.component.js.map +1 -0
  180. package/dist/lib/components/realtime/channels/realtime-channel-pane.component.d.ts +35 -0
  181. package/dist/lib/components/realtime/channels/realtime-channel-pane.component.d.ts.map +1 -0
  182. package/dist/lib/components/realtime/channels/realtime-channel-pane.component.js +58 -0
  183. package/dist/lib/components/realtime/channels/realtime-channel-pane.component.js.map +1 -0
  184. package/dist/lib/components/realtime/realtime-activity-rail.component.d.ts +63 -0
  185. package/dist/lib/components/realtime/realtime-activity-rail.component.d.ts.map +1 -0
  186. package/dist/lib/components/realtime/realtime-activity-rail.component.js +260 -0
  187. package/dist/lib/components/realtime/realtime-activity-rail.component.js.map +1 -0
  188. package/dist/lib/components/realtime/realtime-agent-banner.component.d.ts +117 -0
  189. package/dist/lib/components/realtime/realtime-agent-banner.component.d.ts.map +1 -0
  190. package/dist/lib/components/realtime/realtime-agent-banner.component.js +504 -0
  191. package/dist/lib/components/realtime/realtime-agent-banner.component.js.map +1 -0
  192. package/dist/lib/components/realtime/realtime-agent-picker.component.d.ts +179 -0
  193. package/dist/lib/components/realtime/realtime-agent-picker.component.d.ts.map +1 -0
  194. package/dist/lib/components/realtime/realtime-agent-picker.component.js +634 -0
  195. package/dist/lib/components/realtime/realtime-agent-picker.component.js.map +1 -0
  196. package/dist/lib/components/realtime/realtime-audio-visuals.d.ts +97 -0
  197. package/dist/lib/components/realtime/realtime-audio-visuals.d.ts.map +1 -0
  198. package/dist/lib/components/realtime/realtime-audio-visuals.js +139 -0
  199. package/dist/lib/components/realtime/realtime-audio-visuals.js.map +1 -0
  200. package/dist/lib/components/realtime/realtime-channel-strip.component.d.ts +29 -0
  201. package/dist/lib/components/realtime/realtime-channel-strip.component.d.ts.map +1 -0
  202. package/dist/lib/components/realtime/realtime-channel-strip.component.js +69 -0
  203. package/dist/lib/components/realtime/realtime-channel-strip.component.js.map +1 -0
  204. package/dist/lib/components/realtime/realtime-composer.component.d.ts +65 -0
  205. package/dist/lib/components/realtime/realtime-composer.component.d.ts.map +1 -0
  206. package/dist/lib/components/realtime/realtime-composer.component.js +256 -0
  207. package/dist/lib/components/realtime/realtime-composer.component.js.map +1 -0
  208. package/dist/lib/components/realtime/realtime-delegation-card.component.d.ts +71 -0
  209. package/dist/lib/components/realtime/realtime-delegation-card.component.d.ts.map +1 -0
  210. package/dist/lib/components/realtime/realtime-delegation-card.component.js +324 -0
  211. package/dist/lib/components/realtime/realtime-delegation-card.component.js.map +1 -0
  212. package/dist/lib/components/realtime/realtime-disclosure.d.ts +135 -0
  213. package/dist/lib/components/realtime/realtime-disclosure.d.ts.map +1 -0
  214. package/dist/lib/components/realtime/realtime-disclosure.js +188 -0
  215. package/dist/lib/components/realtime/realtime-disclosure.js.map +1 -0
  216. package/dist/lib/components/realtime/realtime-session-overlay.component.d.ts +491 -0
  217. package/dist/lib/components/realtime/realtime-session-overlay.component.d.ts.map +1 -0
  218. package/dist/lib/components/realtime/realtime-session-overlay.component.js +1274 -0
  219. package/dist/lib/components/realtime/realtime-session-overlay.component.js.map +1 -0
  220. package/dist/lib/components/realtime/realtime-session-state.d.ts +191 -0
  221. package/dist/lib/components/realtime/realtime-session-state.d.ts.map +1 -0
  222. package/dist/lib/components/realtime/realtime-session-state.js +244 -0
  223. package/dist/lib/components/realtime/realtime-session-state.js.map +1 -0
  224. package/dist/lib/components/realtime/realtime-session-thread.component.d.ts +56 -0
  225. package/dist/lib/components/realtime/realtime-session-thread.component.d.ts.map +1 -0
  226. package/dist/lib/components/realtime/realtime-session-thread.component.js +246 -0
  227. package/dist/lib/components/realtime/realtime-session-thread.component.js.map +1 -0
  228. package/dist/lib/components/realtime/realtime-session-timeline-card.component.d.ts +51 -0
  229. package/dist/lib/components/realtime/realtime-session-timeline-card.component.d.ts.map +1 -0
  230. package/dist/lib/components/realtime/realtime-session-timeline-card.component.js +193 -0
  231. package/dist/lib/components/realtime/realtime-session-timeline-card.component.js.map +1 -0
  232. package/dist/lib/components/realtime/realtime-surface-panel-prefs.d.ts +77 -0
  233. package/dist/lib/components/realtime/realtime-surface-panel-prefs.d.ts.map +1 -0
  234. package/dist/lib/components/realtime/realtime-surface-panel-prefs.js +114 -0
  235. package/dist/lib/components/realtime/realtime-surface-panel-prefs.js.map +1 -0
  236. package/dist/lib/components/realtime/realtime-surface-tabs.component.d.ts +173 -0
  237. package/dist/lib/components/realtime/realtime-surface-tabs.component.d.ts.map +1 -0
  238. package/dist/lib/components/realtime/realtime-surface-tabs.component.js +496 -0
  239. package/dist/lib/components/realtime/realtime-surface-tabs.component.js.map +1 -0
  240. package/dist/lib/components/realtime/realtime-surface-tabs.model.d.ts +181 -0
  241. package/dist/lib/components/realtime/realtime-surface-tabs.model.d.ts.map +1 -0
  242. package/dist/lib/components/realtime/realtime-surface-tabs.model.js +223 -0
  243. package/dist/lib/components/realtime/realtime-surface-tabs.model.js.map +1 -0
  244. package/dist/lib/components/realtime/remote-browser/remote-browser-audio-player.d.ts +163 -0
  245. package/dist/lib/components/realtime/remote-browser/remote-browser-audio-player.d.ts.map +1 -0
  246. package/dist/lib/components/realtime/remote-browser/remote-browser-audio-player.js +309 -0
  247. package/dist/lib/components/realtime/remote-browser/remote-browser-audio-player.js.map +1 -0
  248. package/dist/lib/components/realtime/remote-browser/remote-browser-channel.d.ts +201 -0
  249. package/dist/lib/components/realtime/remote-browser/remote-browser-channel.d.ts.map +1 -0
  250. package/dist/lib/components/realtime/remote-browser/remote-browser-channel.js +681 -0
  251. package/dist/lib/components/realtime/remote-browser/remote-browser-channel.js.map +1 -0
  252. package/dist/lib/components/realtime/remote-browser/remote-browser-surface.component.d.ts +379 -0
  253. package/dist/lib/components/realtime/remote-browser/remote-browser-surface.component.d.ts.map +1 -0
  254. package/dist/lib/components/realtime/remote-browser/remote-browser-surface.component.js +914 -0
  255. package/dist/lib/components/realtime/remote-browser/remote-browser-surface.component.js.map +1 -0
  256. package/dist/lib/components/realtime/remote-browser/remote-browser-tools.d.ts +87 -0
  257. package/dist/lib/components/realtime/remote-browser/remote-browser-tools.d.ts.map +1 -0
  258. package/dist/lib/components/realtime/remote-browser/remote-browser-tools.js +223 -0
  259. package/dist/lib/components/realtime/remote-browser/remote-browser-tools.js.map +1 -0
  260. package/dist/lib/components/realtime/whiteboard/whiteboard-artifact-viewer.component.d.ts +48 -0
  261. package/dist/lib/components/realtime/whiteboard/whiteboard-artifact-viewer.component.d.ts.map +1 -0
  262. package/dist/lib/components/realtime/whiteboard/whiteboard-artifact-viewer.component.js +180 -0
  263. package/dist/lib/components/realtime/whiteboard/whiteboard-artifact-viewer.component.js.map +1 -0
  264. package/dist/lib/components/realtime/whiteboard/whiteboard-channel.d.ts +119 -0
  265. package/dist/lib/components/realtime/whiteboard/whiteboard-channel.d.ts.map +1 -0
  266. package/dist/lib/components/realtime/whiteboard/whiteboard-channel.js +274 -0
  267. package/dist/lib/components/realtime/whiteboard/whiteboard-channel.js.map +1 -0
  268. package/dist/lib/components/slots/mj-chat-agent-presence-default.component.d.ts +11 -0
  269. package/dist/lib/components/slots/mj-chat-agent-presence-default.component.d.ts.map +1 -0
  270. package/dist/lib/components/slots/mj-chat-agent-presence-default.component.js +98 -0
  271. package/dist/lib/components/slots/mj-chat-agent-presence-default.component.js.map +1 -0
  272. package/dist/lib/components/slots/mj-chat-demonstration-surface-default.component.d.ts +9 -0
  273. package/dist/lib/components/slots/mj-chat-demonstration-surface-default.component.d.ts.map +1 -0
  274. package/dist/lib/components/slots/mj-chat-demonstration-surface-default.component.js +35 -0
  275. package/dist/lib/components/slots/mj-chat-demonstration-surface-default.component.js.map +1 -0
  276. package/dist/lib/components/slots/mj-chat-empty-state-default.component.d.ts +28 -0
  277. package/dist/lib/components/slots/mj-chat-empty-state-default.component.d.ts.map +1 -0
  278. package/dist/lib/components/slots/mj-chat-empty-state-default.component.js +104 -0
  279. package/dist/lib/components/slots/mj-chat-empty-state-default.component.js.map +1 -0
  280. package/dist/lib/components/slots/mj-chat-header-default.component.d.ts +11 -0
  281. package/dist/lib/components/slots/mj-chat-header-default.component.d.ts.map +1 -0
  282. package/dist/lib/components/slots/mj-chat-header-default.component.js +103 -0
  283. package/dist/lib/components/slots/mj-chat-header-default.component.js.map +1 -0
  284. package/dist/lib/components/slots/mj-chat-message-bubble-default.component.d.ts +15 -0
  285. package/dist/lib/components/slots/mj-chat-message-bubble-default.component.d.ts.map +1 -0
  286. package/dist/lib/components/slots/mj-chat-message-bubble-default.component.js +73 -0
  287. package/dist/lib/components/slots/mj-chat-message-bubble-default.component.js.map +1 -0
  288. package/dist/lib/components/slots/mj-chat-message-extra-default.component.d.ts +9 -0
  289. package/dist/lib/components/slots/mj-chat-message-extra-default.component.d.ts.map +1 -0
  290. package/dist/lib/components/slots/mj-chat-message-extra-default.component.js +34 -0
  291. package/dist/lib/components/slots/mj-chat-message-extra-default.component.js.map +1 -0
  292. package/dist/lib/components/slots/slot-interfaces.d.ts +95 -0
  293. package/dist/lib/components/slots/slot-interfaces.d.ts.map +1 -0
  294. package/dist/lib/components/slots/slot-interfaces.js +18 -0
  295. package/dist/lib/components/slots/slot-interfaces.js.map +1 -0
  296. package/dist/lib/components/workspace/conversation-workspace.component.d.ts +15 -0
  297. package/dist/lib/components/workspace/conversation-workspace.component.d.ts.map +1 -1
  298. package/dist/lib/components/workspace/conversation-workspace.component.js +41 -12
  299. package/dist/lib/components/workspace/conversation-workspace.component.js.map +1 -1
  300. package/dist/lib/conversations.module.d.ts +12 -1
  301. package/dist/lib/conversations.module.d.ts.map +1 -1
  302. package/dist/lib/conversations.module.js +93 -5
  303. package/dist/lib/conversations.module.js.map +1 -1
  304. package/dist/lib/directives/chat-slot.directive.d.ts +44 -0
  305. package/dist/lib/directives/chat-slot.directive.d.ts.map +1 -0
  306. package/dist/lib/directives/chat-slot.directive.js +54 -0
  307. package/dist/lib/directives/chat-slot.directive.js.map +1 -0
  308. package/dist/lib/events/chat-events.d.ts +137 -0
  309. package/dist/lib/events/chat-events.d.ts.map +1 -0
  310. package/dist/lib/events/chat-events.js +189 -0
  311. package/dist/lib/events/chat-events.js.map +1 -0
  312. package/dist/lib/models/conversation-state.model.d.ts +2 -1
  313. package/dist/lib/models/conversation-state.model.d.ts.map +1 -1
  314. package/dist/lib/models/conversation-state.model.js.map +1 -1
  315. package/dist/lib/services/artifact-state.service.d.ts +1 -1
  316. package/dist/lib/services/artifact-state.service.d.ts.map +1 -1
  317. package/dist/lib/services/artifact-state.service.js +29 -7
  318. package/dist/lib/services/artifact-state.service.js.map +1 -1
  319. package/dist/lib/services/conversation-agent.service.d.ts +60 -74
  320. package/dist/lib/services/conversation-agent.service.d.ts.map +1 -1
  321. package/dist/lib/services/conversation-agent.service.js +100 -313
  322. package/dist/lib/services/conversation-agent.service.js.map +1 -1
  323. package/dist/lib/services/conversation-bridge.service.d.ts +11 -70
  324. package/dist/lib/services/conversation-bridge.service.d.ts.map +1 -1
  325. package/dist/lib/services/conversation-bridge.service.js +51 -85
  326. package/dist/lib/services/conversation-bridge.service.js.map +1 -1
  327. package/dist/lib/services/conversation-naming.d.ts +63 -0
  328. package/dist/lib/services/conversation-naming.d.ts.map +1 -0
  329. package/dist/lib/services/conversation-naming.js +58 -0
  330. package/dist/lib/services/conversation-naming.js.map +1 -0
  331. package/dist/lib/services/conversation-streaming.service.d.ts +24 -154
  332. package/dist/lib/services/conversation-streaming.service.d.ts.map +1 -1
  333. package/dist/lib/services/conversation-streaming.service.js +39 -361
  334. package/dist/lib/services/conversation-streaming.service.js.map +1 -1
  335. package/dist/lib/services/conversations-runtime-bootstrap.service.d.ts +10 -0
  336. package/dist/lib/services/conversations-runtime-bootstrap.service.d.ts.map +1 -0
  337. package/dist/lib/services/conversations-runtime-bootstrap.service.js +104 -0
  338. package/dist/lib/services/conversations-runtime-bootstrap.service.js.map +1 -0
  339. package/dist/lib/services/delegation-result-parser.d.ts +45 -0
  340. package/dist/lib/services/delegation-result-parser.d.ts.map +1 -0
  341. package/dist/lib/services/delegation-result-parser.js +48 -0
  342. package/dist/lib/services/delegation-result-parser.js.map +1 -0
  343. package/dist/lib/services/mention-autocomplete.service.d.ts +19 -4
  344. package/dist/lib/services/mention-autocomplete.service.d.ts.map +1 -1
  345. package/dist/lib/services/mention-autocomplete.service.js +65 -4
  346. package/dist/lib/services/mention-autocomplete.service.js.map +1 -1
  347. package/dist/lib/services/mention-parser.service.d.ts +8 -53
  348. package/dist/lib/services/mention-parser.service.d.ts.map +1 -1
  349. package/dist/lib/services/mention-parser.service.js +32 -243
  350. package/dist/lib/services/mention-parser.service.js.map +1 -1
  351. package/dist/lib/services/narration-template.d.ts +42 -0
  352. package/dist/lib/services/narration-template.d.ts.map +1 -0
  353. package/dist/lib/services/narration-template.js +73 -0
  354. package/dist/lib/services/narration-template.js.map +1 -0
  355. package/dist/lib/services/realtime-pairing.d.ts +121 -0
  356. package/dist/lib/services/realtime-pairing.d.ts.map +1 -0
  357. package/dist/lib/services/realtime-pairing.js +160 -0
  358. package/dist/lib/services/realtime-pairing.js.map +1 -0
  359. package/dist/lib/services/realtime-session-review.service.d.ts +233 -0
  360. package/dist/lib/services/realtime-session-review.service.d.ts.map +1 -0
  361. package/dist/lib/services/realtime-session-review.service.js +417 -0
  362. package/dist/lib/services/realtime-session-review.service.js.map +1 -0
  363. package/dist/lib/services/realtime-session.service.d.ts +739 -0
  364. package/dist/lib/services/realtime-session.service.d.ts.map +1 -0
  365. package/dist/lib/services/realtime-session.service.js +1647 -0
  366. package/dist/lib/services/realtime-session.service.js.map +1 -0
  367. package/dist/lib/services/realtime-sessions-adapter.d.ts +54 -0
  368. package/dist/lib/services/realtime-sessions-adapter.d.ts.map +1 -0
  369. package/dist/lib/services/realtime-sessions-adapter.js +154 -0
  370. package/dist/lib/services/realtime-sessions-adapter.js.map +1 -0
  371. package/dist/lib/services/user-authorization.d.ts +67 -0
  372. package/dist/lib/services/user-authorization.d.ts.map +1 -0
  373. package/dist/lib/services/user-authorization.js +66 -0
  374. package/dist/lib/services/user-authorization.js.map +1 -0
  375. package/dist/lib/utils/realtime-session-timeline.d.ts +84 -0
  376. package/dist/lib/utils/realtime-session-timeline.d.ts.map +1 -0
  377. package/dist/lib/utils/realtime-session-timeline.js +94 -0
  378. package/dist/lib/utils/realtime-session-timeline.js.map +1 -0
  379. package/dist/public-api.d.ts +41 -0
  380. package/dist/public-api.d.ts.map +1 -1
  381. package/dist/public-api.js +50 -0
  382. package/dist/public-api.js.map +1 -1
  383. package/package.json +27 -24
  384. package/dist/__tests__/conversation-bridge.service.test.d.ts +0 -2
  385. package/dist/__tests__/conversation-bridge.service.test.d.ts.map +0 -1
  386. package/dist/__tests__/conversation-bridge.service.test.js +0 -98
  387. package/dist/__tests__/conversation-bridge.service.test.js.map +0 -1
  388. package/dist/__tests__/mention-parser.test.d.ts +0 -2
  389. package/dist/__tests__/mention-parser.test.d.ts.map +0 -1
  390. package/dist/__tests__/mention-parser.test.js +0 -154
  391. package/dist/__tests__/mention-parser.test.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remote-browser-channel.js","sourceRoot":"","sources":["../../../../../src/lib/components/realtime/remote-browser/remote-browser-channel.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Type } from '@angular/core';\nimport type { Subscription } from 'rxjs';\nimport { RegisterClass } from '@memberjunction/global';\nimport { JSONValue, RealtimeToolDefinition } from '@memberjunction/ai';\nimport { BaseRealtimeChannelClient, ChannelOnboardingDetails } from '../channels/base-realtime-channel-client';\nimport { RemoteBrowserHumanInputEvent, RemoteBrowserSnapshotView, RemoteBrowserSurfaceComponent } from './remote-browser-surface.component';\nimport {\n MapToolToAction,\n REMOTE_BROWSER_TOOL_DEFINITIONS,\n REMOTE_BROWSER_TOOL_NAMES,\n REMOTE_BROWSER_TOOL_PREFIX,\n RemoteBrowserAction,\n RemoteBrowserToolArgError,\n} from './remote-browser-tools';\nimport { MediaSourceAudioSink, RemoteBrowserAudioChunkInput, RemoteBrowserAudioPlayer } from './remote-browser-audio-player';\n\n/**\n * GraphQL mutation that drives the SERVER-hosted browser. The channel awaits it for every\n * `browser_*` tool call and feeds the result back to the model.\n */\nconst EXECUTE_REMOTE_BROWSER_ACTION_MUTATION = `\n mutation ExecuteRemoteBrowserAction(\n $agentSessionID: String!, $kind: String!, $url: String, $selector: String,\n $x: Float, $y: Float, $text: String, $key: String,\n $deltaX: Float, $deltaY: Float, $ms: Float\n ) {\n ExecuteRemoteBrowserAction(\n agentSessionID: $agentSessionID, kind: $kind, url: $url, selector: $selector,\n x: $x, y: $y, text: $text, key: $key,\n deltaX: $deltaX, deltaY: $deltaY, ms: $ms\n ) {\n Success\n CurrentUrl\n Detail\n }\n }\n`;\n\n/** The narrow projection of the `ExecuteRemoteBrowserAction` mutation payload the channel reads. */\ninterface ExecuteRemoteBrowserActionResult {\n ExecuteRemoteBrowserAction: {\n Success: boolean;\n CurrentUrl: string | null;\n Detail: string | null;\n } | null;\n}\n\n/**\n * GOAL mutation — hands a high-level goal to the server's autonomous browser agent (computer-use loop or\n * backend native AI) instead of relaying a granular action. The server plans + executes; we await the\n * terminal outcome. (Live per-step narration is a server-bridged concern; over this client-direct mutation\n * we get the final result.)\n */\nconst EXECUTE_REMOTE_BROWSER_GOAL_MUTATION = `\n mutation ExecuteRemoteBrowserGoal($agentSessionID: String!, $goal: String!, $startUrl: String) {\n ExecuteRemoteBrowserGoal(agentSessionID: $agentSessionID, goal: $goal, startUrl: $startUrl) {\n Success\n GoalRunID\n Strategy\n CurrentUrl\n Status\n StepCount\n Detail\n }\n }\n`;\n\n/**\n * POLL query for the async goal run. `ExecuteRemoteBrowserGoal` STARTS the (potentially multi-minute)\n * goal loop and returns a `GoalRunID` with `Status: 'Running'`; the channel polls this until the run\n * reports a terminal status — so no single request is held open for the whole loop (which would die at\n * a browser/proxy/janitor transport timeout and lose the result).\n */\nconst GET_REMOTE_BROWSER_GOAL_RESULT_QUERY = `\n query GetRemoteBrowserGoalResult($agentSessionID: String!, $goalRunID: String!) {\n GetRemoteBrowserGoalResult(agentSessionID: $agentSessionID, goalRunID: $goalRunID) {\n Success\n GoalRunID\n Strategy\n CurrentUrl\n Status\n StepCount\n Detail\n }\n }\n`;\n\n/** The narrow projection of a goal-result payload (shared by the start mutation + the poll query). */\ninterface RemoteBrowserGoalPayload {\n Success: boolean;\n GoalRunID: string | null;\n Strategy: string | null;\n CurrentUrl: string | null;\n Status: string | null;\n StepCount: number | null;\n Detail: string | null;\n}\n\n/** The narrow projection of the `ExecuteRemoteBrowserGoal` (start) mutation payload the channel reads. */\ninterface ExecuteRemoteBrowserGoalResult {\n ExecuteRemoteBrowserGoal: RemoteBrowserGoalPayload | null;\n}\n\n/** The narrow projection of the `GetRemoteBrowserGoalResult` (poll) query payload the channel reads. */\ninterface GetRemoteBrowserGoalResultPayload {\n GetRemoteBrowserGoalResult: RemoteBrowserGoalPayload | null;\n}\n\n/**\n * GraphQL mutation that asks the server to start PUSHING live CDP screencast frames for the session.\n * Returns `Streaming: true` when the backend supports `ScreenStreaming` and the stream started; the\n * channel then drives the surface's canvas. `Streaming: false` (capability absent / start failed) leaves\n * the surface on its 700ms snapshot poll fallback.\n */\nconst START_SCREENCAST_MUTATION = `\n mutation StartRemoteBrowserScreencast($agentSessionID: String!) {\n StartRemoteBrowserScreencast(agentSessionID: $agentSessionID) {\n Streaming\n }\n }\n`;\n\n/** GraphQL mutation that stops the server-pushed screencast (best-effort teardown). */\nconst STOP_SCREENCAST_MUTATION = `\n mutation StopRemoteBrowserScreencast($agentSessionID: String!) {\n StopRemoteBrowserScreencast(agentSessionID: $agentSessionID)\n }\n`;\n\n/**\n * GraphQL mutation that asks the server to start PUSHING live tab-audio chunks for the session — so a\n * co-agent demoing a video/audio site is HEARD. Returns `Streaming: true` when the backend can capture\n * audio (v1 gates by backend implementation) and the stream started; `Streaming: false` means no audio\n * (capability absent / start failed) and the client simply plays nothing.\n */\nconst START_AUDIO_STREAM_MUTATION = `\n mutation StartRemoteBrowserAudioStream($agentSessionID: String!) {\n StartRemoteBrowserAudioStream(agentSessionID: $agentSessionID) {\n Streaming\n }\n }\n`;\n\n/** GraphQL mutation that stops the server-pushed tab-audio stream (best-effort teardown). */\nconst STOP_AUDIO_STREAM_MUTATION = `\n mutation StopRemoteBrowserAudioStream($agentSessionID: String!) {\n StopRemoteBrowserAudioStream(agentSessionID: $agentSessionID)\n }\n`;\n\n/** The narrow projection of the `StartRemoteBrowserAudioStream` mutation payload the channel reads. */\ninterface StartRemoteBrowserAudioStreamResult {\n StartRemoteBrowserAudioStream: {\n Streaming: boolean;\n } | null;\n}\n\n/**\n * HUMAN-TAKEOVER mutation — relays ONE pointer/keyboard input the user performed on the live canvas into the\n * server-hosted browser (Collaborative control). Best-effort: the server returns `false` when the backend\n * lacks `HumanTakeover` or no live browser exists; the channel doesn't act on the boolean.\n */\nconst RELAY_HUMAN_INPUT_MUTATION = `\n mutation RelayRemoteBrowserHumanInput(\n $agentSessionID: String!, $kind: String!, $x: Float, $y: Float, $button: String, $key: String,\n $text: String, $deltaX: Float, $deltaY: Float, $modifiers: String\n ) {\n RelayRemoteBrowserHumanInput(\n agentSessionID: $agentSessionID, kind: $kind, x: $x, y: $y, button: $button, key: $key,\n text: $text, deltaX: $deltaX, deltaY: $deltaY, modifiers: $modifiers\n )\n }\n`;\n\n/**\n * COPY-OUT query — reads the remote page's current text selection so the surface can write it to the LOCAL\n * clipboard on a `copy` / Cmd+C (the mirror of the `'text'` paste-in path). Returns `''` when nothing is\n * selected, no live browser exists, or the backend lacks `HumanTakeover`.\n */\nconst GET_SELECTION_QUERY = `\n query GetRemoteBrowserSelection($agentSessionID: String!) {\n GetRemoteBrowserSelection(agentSessionID: $agentSessionID) {\n Text\n }\n }\n`;\n\n/** The narrow projection of the `GetRemoteBrowserSelection` query payload the channel reads. */\ninterface GetRemoteBrowserSelectionResult {\n GetRemoteBrowserSelection: {\n Text: string;\n } | null;\n}\n\n/** The narrow projection of the `StartRemoteBrowserScreencast` mutation payload the channel reads. */\ninterface StartRemoteBrowserScreencastResult {\n StartRemoteBrowserScreencast: {\n Streaming: boolean;\n } | null;\n}\n\n/** GraphQL query the surface fetcher runs — the live screenshot + URL of the server browser. */\nconst REMOTE_BROWSER_SNAPSHOT_QUERY = `\n query RemoteBrowserSnapshot($agentSessionID: String!) {\n RemoteBrowserSnapshot(agentSessionID: $agentSessionID) {\n ScreenshotBase64\n CurrentUrl\n }\n }\n`;\n\n/** The narrow projection of the `RemoteBrowserSnapshot` query payload the channel reads. */\ninterface RemoteBrowserSnapshotResult {\n RemoteBrowserSnapshot: RemoteBrowserSnapshotView | null;\n}\n\n/**\n * VISION-QUERY mutation (separate from {@link EXECUTE_REMOTE_BROWSER_ACTION_MUTATION} — this OBSERVES the page,\n * it does not drive it). The server captures the live screenshot and runs a fast vision model over it, so the\n * non-omnimodal voice agent can \"see\" the page: a text description and/or localized elements with pixel\n * centroids. Backs both `browser_DescribePage` (no target) and `browser_LocateElement` (a target description).\n */\nconst INTERPRET_PAGE_MUTATION = `\n mutation InterpretRemoteBrowserPage($agentSessionID: String!, $query: String) {\n InterpretRemoteBrowserPage(agentSessionID: $agentSessionID, query: $query) {\n Description\n Elements {\n Label\n X\n Y\n Confidence\n }\n Detail\n }\n }\n`;\n\n/** One element localized by the visual interpreter — label + pixel centroid + confidence. */\ninterface RemoteBrowserInterpretedElement {\n Label: string;\n X: number;\n Y: number;\n Confidence: number;\n}\n\n/** The narrow projection of the `InterpretRemoteBrowserPage` mutation payload the channel reads. */\ninterface InterpretRemoteBrowserPageResult {\n InterpretRemoteBrowserPage: {\n Description: string | null;\n Elements: RemoteBrowserInterpretedElement[];\n Detail: string | null;\n } | null;\n}\n\n/** The result payload (serialized to JSON) the channel returns to the model per tool call. */\ninterface RemoteBrowserToolResult {\n success: boolean;\n /** The page URL after the action, when the server reported one. */\n currentUrl?: string;\n /** Human-readable detail (e.g. extracted page text for `browser_GetPageText`, or an error). */\n detail?: string;\n /** Error description when `success` is false. */\n error?: string;\n}\n\n/**\n * The REMOTE BROWSER as a pluggable interactive channel — a {@link BaseRealtimeChannelClient}\n * resolved from the `MJ: AI Agent Channels` registry row whose `ClientPluginClass` is\n * `'RealtimeRemoteBrowserChannel'`. One instance per session (ClassFactory-created at session\n * start).\n *\n * Topology (CLIENT-DIRECT, like the whiteboard — the browser just happens to live on the\n * server):\n * - **Action**: the `browser_*` client-executed tool set ({@link REMOTE_BROWSER_TOOL_DEFINITIONS}).\n * {@link ApplyAgentTool} maps a tool call → a normalized {@link RemoteBrowserAction}\n * ({@link MapToolToAction}) and awaits the `ExecuteRemoteBrowserAction` GraphQL mutation\n * (via {@link RealtimeChannelContext.ExecuteServerAction}) to drive the server browser,\n * returning a concise JSON result for the model. Never throws — argument and transport\n * failures map to a `{ success: false, error }` payload.\n * - **Perception**: after a successful action, a `[browser]` context note carries the new\n * page URL so the agent perceives where the page went; the surface independently polls a\n * live screenshot.\n * - **Surface**: {@link RemoteBrowserSurfaceComponent}, created dynamically in the channel\n * tab; the plugin hands it the session's provider + id in {@link BindSurface} so it can\n * poll `RemoteBrowserSnapshot`. HUMAN TAKEOVER is enabled by default (Collaborative): the\n * user can click/type into the live canvas and those events relay to the server browser via\n * {@link RELAY_HUMAN_INPUT_MUTATION} (server-gated on the backend's `HumanTakeover` capability).\n *\n * The channel keeps NO client-side state of record — the browser's state lives entirely on\n * the server — so {@link SerializeState} / {@link RestoreState} use the base no-op behavior.\n */\n@RegisterClass(BaseRealtimeChannelClient, 'RealtimeRemoteBrowserChannel')\nexport class RemoteBrowserChannel extends BaseRealtimeChannelClient<RemoteBrowserSurfaceComponent> {\n /** The live bound surface, when the channel tab's pane is instantiated. */\n private surface: RemoteBrowserSurfaceComponent | null = null;\n\n /** Subscription to the bound surface's `HumanInput` output, torn down on unbind/dispose. */\n private humanInputSub: Subscription | null = null;\n\n /**\n * Whether the server confirmed it is PUSHING screencast frames for this session (`ScreenStreaming`\n * supported). When `true` the surface renders pushed frames on its canvas and skips its poll, and\n * {@link OnScreencastFrame} forwards each pushed frame to it. When `false` the surface keeps polling.\n */\n private streaming = false;\n\n /**\n * Whether the server confirmed it is PUSHING tab-audio chunks for this session (the backend can capture\n * audio). When `true` {@link OnAudioChunk} feeds each pushed chunk to {@link audioPlayer}; when `false`\n * no audio plays.\n */\n private audioStreaming = false;\n\n /** The client-side audio player fed pushed chunks while {@link audioStreaming}; `null` until started. */\n private audioPlayer: RemoteBrowserAudioPlayer | null = null;\n\n /** Subscription to the bound surface's `AudioMutedChange` output (the speaker toggle), torn down on unbind. */\n private audioMutedSub: Subscription | null = null;\n\n /**\n * Poll cadence + deadline for {@link pollGoalResult} (the async `browser_AchieveGoal` result poll).\n * Protected so tests can shrink them; production polls every 2.5s for up to 5 minutes (a goal loop\n * past 5 min keeps running server-side, the model just gets a \"still running\" note).\n */\n protected GoalPollIntervalMs = 2500;\n protected GoalPollTimeoutMs = 5 * 60 * 1000;\n\n public get ChannelName(): string {\n return 'Remote Browser';\n }\n\n public get ToolNamePrefix(): string {\n return REMOTE_BROWSER_TOOL_PREFIX;\n }\n\n public get TabTitle(): string {\n return 'Browser';\n }\n\n public get TabIcon(): string {\n return 'fa-solid fa-globe';\n }\n\n public GetToolDefinitions(): RealtimeToolDefinition[] {\n return REMOTE_BROWSER_TOOL_DEFINITIONS;\n }\n\n public override GetSurfaceComponent(): Type<RemoteBrowserSurfaceComponent> {\n return RemoteBrowserSurfaceComponent;\n }\n\n /** First-run intro shown the first time the user opens the Browser tab (once per user). */\n public override GetOnboardingDetails(): ChannelOnboardingDetails {\n return {\n Heading: 'Remote Browser',\n Description:\n 'The agent drives a live web browser on the server and you can watch it work right here. ' +\n 'You can also grab the wheel: click and type directly on the live page and the agent picks ' +\n 'up right where you left off.',\n Tips: [\n 'Ask the agent to look something up, open a site or fill in a form — it controls the page.',\n 'Click on the live view to take over, then click and type to drive it yourself — the \"You\\'re driving\" badge shows when takeover is active.',\n 'The current page URL is shown so you always know where the agent has navigated.',\n ],\n IconClass: 'fa-solid fa-globe',\n };\n }\n\n /**\n * Wires the dynamically-created surface: hands it a snapshot fetcher closing over the\n * channel context (session id + provider live there), so the surface stays transport-\n * agnostic. Set BEFORE the surface's first change detection (the pane binds synchronously),\n * so its `ngOnInit` poll has the fetcher.\n *\n * Also asks the server to start a live screencast. When the backend supports `ScreenStreaming` the\n * server starts PUSHING frames and reports `Streaming: true`; we flip the surface to canvas mode (its\n * poll is then skipped) and {@link OnScreencastFrame} paints each pushed frame. When the backend lacks\n * the capability (`Streaming: false`) the surface keeps the snapshot poll already running — graceful\n * fallback, no further action.\n *\n * HUMAN TAKEOVER is enabled BY DEFAULT (Collaborative): the surface is flipped `Interactive = true` and\n * its `HumanInput` output subscribed, forwarding each pointer/keyboard event to the server via\n * {@link RELAY_HUMAN_INPUT_MUTATION}. Takeover only takes effect on the canvas (screencast) path; the\n * `<img>` poll fallback stays view-only. The server gates the actual routing on the backend's\n * `HumanTakeover` capability, so this is safe to enable unconditionally.\n */\n public BindSurface(instance: RemoteBrowserSurfaceComponent): void {\n this.surface = instance;\n instance.Fetch = () => this.fetchSnapshot();\n // Copy-out: the surface reads the remote selection through this on a local `copy` and writes it locally.\n instance.FetchSelection = () => this.fetchSelection();\n instance.Interactive = true;\n this.humanInputSub = instance.HumanInput.subscribe((input) => this.relayHumanInput(input));\n this.audioMutedSub = instance.AudioMutedChange.subscribe((muted) => this.audioPlayer?.SetMuted(muted));\n void this.startScreencast(instance);\n void this.startAudioStream(instance);\n }\n\n public override UnbindSurface(): void {\n this.humanInputSub?.unsubscribe();\n this.humanInputSub = null;\n this.audioMutedSub?.unsubscribe();\n this.audioMutedSub = null;\n void this.stopScreencast();\n void this.stopAudioStream();\n this.surface = null;\n }\n\n public override Dispose(): void {\n this.humanInputSub?.unsubscribe();\n this.humanInputSub = null;\n this.audioMutedSub?.unsubscribe();\n this.audioMutedSub = null;\n void this.stopScreencast();\n void this.stopAudioStream();\n super.Dispose();\n }\n\n /**\n * Forwards one PUSHED screencast frame to the bound surface's canvas. Called by the session service\n * when a `RemoteBrowserScreencastFrame` arrives on the push-status stream for THIS session. No-op when\n * the channel isn't streaming or has no bound surface (e.g. the tab pane is collapsed).\n *\n * @param dataBase64 The frame image as raw base64 JPEG (no `data:` prefix).\n */\n public OnScreencastFrame(dataBase64: string): void {\n if (this.streaming) {\n this.surface?.RenderFrame(dataBase64);\n }\n }\n\n /**\n * Feeds one PUSHED tab-audio chunk to the client-side audio player. Called by the session service when a\n * `RemoteBrowserAudioChunk` arrives on the push-status stream for THIS session. No-op when the channel\n * isn't audio-streaming or the player has been torn down.\n *\n * @param chunk The pushed audio chunk (base64 webm-opus + codec/seq metadata).\n */\n public OnAudioChunk(chunk: RemoteBrowserAudioChunkInput): void {\n if (this.audioStreaming) {\n this.audioPlayer?.Enqueue(chunk);\n }\n }\n\n /**\n * Asks the server to start the live screencast and, on success, flips the surface to canvas mode so it\n * stops polling and starts painting pushed frames. Best-effort: a `null`/`Streaming: false` result\n * (capability absent or transport failure) leaves the surface on its poll fallback.\n */\n private async startScreencast(instance: RemoteBrowserSurfaceComponent): Promise<void> {\n const sessionId = this.Context?.AgentSessionID;\n if (!sessionId) {\n return;\n }\n const data = await this.Context?.ExecuteServerAction<StartRemoteBrowserScreencastResult>(START_SCREENCAST_MUTATION, { agentSessionID: sessionId });\n if (data?.StartRemoteBrowserScreencast?.Streaming === true) {\n this.streaming = true;\n instance.Streaming = true;\n }\n }\n\n /**\n * Asks the server to start the live tab-audio stream and, on success, spins up the client-side\n * {@link RemoteBrowserAudioPlayer} (speaker ON by default — the call is the activating user gesture) so\n * pushed chunks play. Best-effort: a `null`/`Streaming: false` result (no audio capability or transport\n * failure) leaves the channel silent with no player.\n *\n * @param instance The bound surface, flipped to show the speaker toggle when audio starts.\n */\n private async startAudioStream(instance: RemoteBrowserSurfaceComponent): Promise<void> {\n const sessionId = this.Context?.AgentSessionID;\n if (!sessionId) {\n return;\n }\n const data = await this.Context?.ExecuteServerAction<StartRemoteBrowserAudioStreamResult>(START_AUDIO_STREAM_MUTATION, { agentSessionID: sessionId });\n if (data?.StartRemoteBrowserAudioStream?.Streaming === true) {\n this.audioStreaming = true;\n this.audioPlayer = new RemoteBrowserAudioPlayer(new MediaSourceAudioSink());\n // Speaker defaults ON; reflect that on the surface so the toggle renders un-muted.\n instance.AudioAvailable = true;\n instance.AudioMuted = false;\n }\n }\n\n /** Asks the server to stop the tab-audio stream (best-effort), disposes the player, and clears state. */\n private async stopAudioStream(): Promise<void> {\n const wasStreaming = this.audioStreaming;\n this.audioStreaming = false;\n this.audioPlayer?.Dispose();\n this.audioPlayer = null;\n const sessionId = this.Context?.AgentSessionID;\n if (!wasStreaming || !sessionId) {\n return;\n }\n await this.Context?.ExecuteServerAction(STOP_AUDIO_STREAM_MUTATION, { agentSessionID: sessionId });\n }\n\n /**\n * Relays ONE human-takeover input from the surface to the server's {@link RELAY_HUMAN_INPUT_MUTATION}.\n * Best-effort and fire-and-forget: never throws, and the boolean result is ignored (the server already\n * gates routing on the backend's `HumanTakeover` capability). No-op when no live session id exists.\n *\n * @param input The flattened pointer/keyboard input the user performed on the live canvas.\n */\n private relayHumanInput(input: RemoteBrowserHumanInputEvent): void {\n const sessionId = this.Context?.AgentSessionID;\n if (!sessionId) {\n return;\n }\n void this.Context?.ExecuteServerAction(RELAY_HUMAN_INPUT_MUTATION, {\n agentSessionID: sessionId,\n kind: input.kind,\n x: input.x ?? null,\n y: input.y ?? null,\n button: input.button ?? null,\n key: input.key ?? null,\n // Paste-in: the `'text'` kind carries the local clipboard text the server inserts into the page.\n text: input.text ?? null,\n deltaX: input.deltaX ?? null,\n deltaY: input.deltaY ?? null,\n // Server expects a comma-separated modifier list (e.g. \"Shift,Control\"); null when none held.\n modifiers: input.modifiers && input.modifiers.length > 0 ? input.modifiers.join(',') : null,\n });\n }\n\n /**\n * Reads the remote page's current selection for COPY-OUT — backs the surface's `FetchSelection`. Awaits\n * the `GetRemoteBrowserSelection` query and returns its text. Best-effort by contract\n * ({@link RemoteBrowserSelectionFetcher}): returns `''` when no session is live or the query fails, so a\n * best-effort copy never throws.\n */\n private async fetchSelection(): Promise<string> {\n const sessionId = this.Context?.AgentSessionID;\n if (!sessionId) {\n return '';\n }\n const data = await this.Context?.ExecuteServerAction<GetRemoteBrowserSelectionResult>(GET_SELECTION_QUERY, { agentSessionID: sessionId });\n return data?.GetRemoteBrowserSelection?.Text ?? '';\n }\n\n /** Asks the server to stop the screencast (best-effort) and clears the streaming flag. */\n private async stopScreencast(): Promise<void> {\n const wasStreaming = this.streaming;\n this.streaming = false;\n const sessionId = this.Context?.AgentSessionID;\n if (!wasStreaming || !sessionId) {\n return;\n }\n await this.Context?.ExecuteServerAction(STOP_SCREENCAST_MUTATION, { agentSessionID: sessionId });\n }\n\n /**\n * Fetches one live snapshot of the server browser for the surface — the PERCEPTION poll.\n * Best-effort by contract ({@link RemoteBrowserSnapshotFetcher}): returns `null` when no\n * session is live or the query fails (the surface keeps its last good frame).\n */\n private async fetchSnapshot(): Promise<RemoteBrowserSnapshotView | null> {\n const sessionId = this.Context?.AgentSessionID;\n if (!sessionId) {\n return null;\n }\n const data = await this.Context?.ExecuteServerAction<RemoteBrowserSnapshotResult>(REMOTE_BROWSER_SNAPSHOT_QUERY, { agentSessionID: sessionId });\n return data?.RemoteBrowserSnapshot ?? null;\n }\n\n /**\n * Executes ONE `browser_*` tool call: maps it to a server action and awaits the\n * `ExecuteRemoteBrowserAction` mutation, then returns a concise JSON result the model reads.\n * On success it also feeds the new page URL to the agent as a `[browser]` context note. Never\n * throws — bad arguments, no live session, and server failures all become a failed-result\n * payload so the model can narrate the problem.\n */\n public async ApplyAgentTool(toolName: string, argsJson: string): Promise<string> {\n // VISION-QUERY branch: the two interpreter tools OBSERVE the page (run a vision model over a screenshot)\n // rather than drive it, so they route to the separate interpret mutation, not MapToolToAction.\n if (toolName === REMOTE_BROWSER_TOOL_NAMES.DescribePage) {\n return this.interpretPage(undefined);\n }\n if (toolName === REMOTE_BROWSER_TOOL_NAMES.AchieveGoal) {\n return this.achieveGoal(argsJson);\n }\n if (toolName === REMOTE_BROWSER_TOOL_NAMES.LocateElement) {\n const description = this.asArgString(this.parseArgs(argsJson)['description']);\n if (!description) {\n return this.fail('browser_LocateElement requires a \"description\" of the element to find.');\n }\n return this.interpretPage(description);\n }\n\n let action: RemoteBrowserAction;\n try {\n action = MapToolToAction(toolName, this.parseArgs(argsJson));\n } catch (error) {\n const message = error instanceof RemoteBrowserToolArgError ? error.message : 'Invalid Remote Browser tool arguments.';\n return this.fail(message);\n }\n\n // Briefly WAIT for the session id rather than failing instantly: the model can fire a tool the\n // first beat it connects, before mintSession binds the id (the \"session id missing\" race).\n const sessionId = await this.ResolveAgentSessionId();\n if (!sessionId) {\n // Diagnostic: distinguishes \"channel never Initialized (no Context)\" from \"session id never\n // resolved within the wait window\" — the two distinct causes of a null id at tool-execution time.\n console.warn('[RemoteBrowser] browser tool invoked but AgentSessionID is null', {\n tool: toolName,\n hasContext: !!this.Context,\n agentSessionID: this.Context?.AgentSessionID ?? null,\n });\n return this.fail('No live browser session is available yet — the realtime session may still be connecting; try again in a moment.');\n }\n\n const data = await this.Context?.ExecuteServerAction<ExecuteRemoteBrowserActionResult>(\n EXECUTE_REMOTE_BROWSER_ACTION_MUTATION,\n this.buildVariables(sessionId, action),\n );\n const result = data?.ExecuteRemoteBrowserAction ?? null;\n if (!result) {\n return this.fail('The browser action could not be executed (no response from the server).');\n }\n if (!result.Success) {\n return this.fail(result.Detail ?? 'The browser action failed.');\n }\n\n if (result.CurrentUrl) {\n // PERCEPTION: tell the agent where the page is now (background — no spoken reply).\n this.Context?.SendContextNote(`[browser] current page: ${result.CurrentUrl}`);\n // In streaming mode the surface's snapshot poll (which carries the URL) is stopped, so push the new\n // URL to the live-view bar directly — otherwise it stays stuck on \"No page loaded yet\".\n this.surface?.SetCurrentUrl(result.CurrentUrl);\n }\n return this.ok(result.CurrentUrl, result.Detail);\n }\n\n /** Builds the flat mutation variables from a normalized action (omitted fields ride as null). */\n private buildVariables(sessionId: string, action: RemoteBrowserAction): Record<string, JSONValue> {\n return {\n agentSessionID: sessionId,\n kind: action.Kind,\n url: action.Url ?? null,\n selector: action.Selector ?? null,\n x: action.X ?? null,\n y: action.Y ?? null,\n text: action.Text ?? null,\n key: action.Key ?? null,\n deltaX: action.DeltaX ?? null,\n deltaY: action.DeltaY ?? null,\n ms: action.Ms ?? null,\n };\n }\n\n /**\n * GOAL path for the `browser_AchieveGoal` tool: hands a high-level goal to the server's autonomous\n * browser agent (computer-use loop / native AI) via {@link EXECUTE_REMOTE_BROWSER_GOAL_MUTATION} and\n * returns a concise result for the model. Never throws — failures map to a `{ success: false }` string.\n *\n * @param argsJson The raw tool-call arguments (`{ goal, startUrl? }`).\n * @returns The model-readable result string.\n */\n private async achieveGoal(argsJson: string): Promise<string> {\n // Wait briefly for the session id (mint/reconnect race) before giving up — see ResolveAgentSessionId.\n const sessionId = await this.ResolveAgentSessionId();\n if (!sessionId) {\n return this.fail('No live browser session is available yet — the realtime session may still be connecting; try again in a moment.');\n }\n const args = this.parseArgs(argsJson);\n const goal = this.asArgString(args['goal']);\n if (!goal) {\n return this.fail('browser_AchieveGoal requires a \"goal\" describing what to accomplish.');\n }\n const startUrl = this.asArgString(args['startUrl']) ?? null;\n\n // START the goal (returns immediately with a GoalRunID) then POLL — a goal loop can run for\n // minutes, far longer than any single request survives, so we never hold one open for the loop.\n const startData = await this.Context?.ExecuteServerAction<ExecuteRemoteBrowserGoalResult>(EXECUTE_REMOTE_BROWSER_GOAL_MUTATION, {\n agentSessionID: sessionId,\n goal,\n startUrl,\n });\n const started = startData?.ExecuteRemoteBrowserGoal ?? null;\n if (!started) {\n return this.fail('The browser goal could not be started (no response from the server).');\n }\n // Defensive: if the server ever returns a terminal status synchronously, use it directly.\n const result = started.Status === 'Running' && started.GoalRunID\n ? await this.pollGoalResult(sessionId, started.GoalRunID)\n : started;\n if (!result) {\n return this.fail('The browser goal is taking longer than expected and could not be confirmed. It may still be running.');\n }\n if (result.CurrentUrl) {\n this.Context?.SendContextNote(`[browser] current page: ${result.CurrentUrl}`);\n this.surface?.SetCurrentUrl(result.CurrentUrl);\n }\n if (!result.Success) {\n return this.fail(result.Detail ?? `The goal could not be completed (${result.Status ?? 'unknown'}).`);\n }\n return this.ok(result.CurrentUrl, result.Detail ?? `Goal completed (${result.Status ?? 'Completed'}, ${result.StepCount ?? 0} steps).`);\n }\n\n /**\n * Polls {@link GET_REMOTE_BROWSER_GOAL_RESULT_QUERY} for a started goal run until it reports a\n * terminal status (anything other than `Running`), then returns that terminal payload. Each poll is\n * a short request, so no transport boundary times out while a long goal loop runs server-side.\n *\n * Returns `null` if the goal is still `Running` after {@link GoalPollTimeoutMs} (the loop keeps\n * running server-side; the caller maps this to a \"still running\" message), the session went away, or\n * the run id is no longer known (`Unknown` — expired/superseded).\n */\n private async pollGoalResult(sessionId: string, goalRunID: string): Promise<RemoteBrowserGoalPayload | null> {\n const interval = Math.max(1, this.GoalPollIntervalMs);\n for (let waited = 0; waited < this.GoalPollTimeoutMs; waited += interval) {\n await new Promise<void>((resolve) => setTimeout(resolve, interval));\n // The session ended mid-goal — stop polling (the live browser is gone).\n if (!this.Context?.AgentSessionID) {\n return null;\n }\n const data = await this.Context.ExecuteServerAction<GetRemoteBrowserGoalResultPayload>(GET_REMOTE_BROWSER_GOAL_RESULT_QUERY, {\n agentSessionID: sessionId,\n goalRunID,\n });\n const payload = data?.GetRemoteBrowserGoalResult ?? null;\n // A transient null (one failed poll) shouldn't abort — keep polling until the deadline.\n if (payload && payload.Status !== 'Running') {\n return payload;\n }\n }\n return null;\n }\n\n /**\n * Runs the VISION-QUERY path for the `browser_DescribePage` / `browser_LocateElement` tools: awaits the\n * `InterpretRemoteBrowserPage` mutation (server captures a screenshot + runs a fast vision model) and returns\n * a concise JSON string the model reads. For a describe (no `query`) it returns `{ description }`; for a locate\n * it returns `{ found, element, all }` so the agent can `browser_Click` the centroid. Never throws — a null\n * session, no response, or a server detail-only result all map to a result string the model can narrate.\n *\n * @param query The visual target to locate, or `undefined` for a plain page description.\n * @returns A JSON string describing the interpretation for the model.\n */\n private async interpretPage(query: string | undefined): Promise<string> {\n // Wait briefly for the session id (mint/reconnect race) before giving up — see ResolveAgentSessionId.\n const sessionId = await this.ResolveAgentSessionId();\n if (!sessionId) {\n console.warn('[RemoteBrowser] interpret tool invoked but AgentSessionID is null', {\n hasContext: !!this.Context,\n agentSessionID: this.Context?.AgentSessionID ?? null,\n });\n return this.fail('No live browser session is available yet — the realtime session may still be connecting; try again in a moment.');\n }\n\n const data = await this.Context?.ExecuteServerAction<InterpretRemoteBrowserPageResult>(INTERPRET_PAGE_MUTATION, {\n agentSessionID: sessionId,\n query: query ?? null,\n });\n const result = data?.InterpretRemoteBrowserPage ?? null;\n if (!result) {\n return this.fail('The page could not be interpreted (no response from the server).');\n }\n\n if (query === undefined) {\n // DescribePage — hand back the description (or the server's detail note when nothing was interpreted).\n return JSON.stringify({ description: result.Description ?? result.Detail ?? null });\n }\n\n // LocateElement — surface whether anything matched, the best match, and all candidates.\n const elements = result.Elements ?? [];\n const best = elements[0];\n return JSON.stringify({\n found: elements.length > 0,\n element: best ? { label: best.Label, x: best.X, y: best.Y } : null,\n all: elements,\n ...(result.Detail ? { detail: result.Detail } : {}),\n });\n }\n\n /** Coerces a parsed tool-arg to a non-empty string, or `undefined` when absent / wrong-typed. */\n private asArgString(value: JSONValue | undefined): string | undefined {\n return typeof value === 'string' && value.trim().length > 0 ? value.trim() : undefined;\n }\n\n /** Parses the tool-args JSON into a plain object; returns `{}` for empty/malformed input. */\n private parseArgs(argsJson: string): Record<string, JSONValue> {\n const trimmed = argsJson?.trim();\n if (!trimmed) {\n return {};\n }\n try {\n const parsed: unknown = JSON.parse(trimmed);\n return parsed !== null && typeof parsed === 'object' && !Array.isArray(parsed) ? (parsed as Record<string, JSONValue>) : {};\n } catch {\n return {};\n }\n }\n\n /** Builds a successful tool-result JSON string for the model. */\n private ok(currentUrl: string | null, detail: string | null): string {\n const result: RemoteBrowserToolResult = { success: true };\n if (currentUrl) {\n result.currentUrl = currentUrl;\n }\n if (detail) {\n result.detail = detail;\n }\n return JSON.stringify(result);\n }\n\n /** Builds a failed tool-result JSON string for the model. */\n private fail(error: string): string {\n const result: RemoteBrowserToolResult = { success: false, error };\n return JSON.stringify(result);\n }\n}\n\n/**\n * Tree-shaking prevention: the Remote Browser channel is resolved dynamically through the\n * ClassFactory (by the registry row's `ClientPluginClass` key), so this static call is what\n * keeps its `@RegisterClass` side effect from being eliminated by the bundler. Called from\n * `conversations.module.ts` alongside {@link LoadRealtimeWhiteboardChannel}.\n */\nexport function LoadRealtimeRemoteBrowserChannel(): void {\n // intentional no-op — the import side effect performs the registration\n}\n"]}
@@ -0,0 +1,379 @@
1
+ import { EventEmitter, OnDestroy, OnInit } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ /** A keyboard modifier held during a relayed human input (Shift-click selection, Ctrl/Cmd+key chords). */
4
+ export type RemoteBrowserModifier = 'Shift' | 'Control' | 'Alt' | 'Meta';
5
+ /**
6
+ * One human-takeover input the surface emits to the channel while the user "drives" the live view.
7
+ * Mirrors the server's `RemoteBrowserHumanInput` union (flattened for transport): pointer
8
+ * moves/clicks/down/up and scrolls carry VIEWPORT coordinates, a scroll also carries wheel deltas, a key
9
+ * carries the pressed key string. Pointer clicks/down/up and keys also carry any held `modifiers`.
10
+ */
11
+ export interface RemoteBrowserHumanInputEvent {
12
+ /** Which input occurred. */
13
+ kind: 'pointer-move' | 'pointer-click' | 'pointer-down' | 'pointer-up' | 'key' | 'text' | 'scroll';
14
+ /** Viewport X (pointer + scroll kinds only). */
15
+ x?: number;
16
+ /** Viewport Y (pointer + scroll kinds only). */
17
+ y?: number;
18
+ /** Mouse button (pointer-click / -down / -up only). */
19
+ button?: 'left' | 'middle' | 'right';
20
+ /** The pressed key (key kind only). */
21
+ key?: string;
22
+ /** The pasted clipboard text (text kind only) — inserted into the remote page's focused element. */
23
+ text?: string;
24
+ /** Horizontal wheel delta in pixels (scroll kind only; positive = right). */
25
+ deltaX?: number;
26
+ /** Vertical wheel delta in pixels (scroll kind only; positive = down). */
27
+ deltaY?: number;
28
+ /** Modifier keys held during the input (pointer-click / -down / -up and key kinds). */
29
+ modifiers?: RemoteBrowserModifier[];
30
+ }
31
+ /**
32
+ * Maps a display-space pointer position on the live canvas to the server browser's VIEWPORT pixel space.
33
+ *
34
+ * The canvas's internal resolution (`canvasWidth`/`canvasHeight`, set from each pushed frame) IS the
35
+ * viewport pixel space; the canvas is displayed scaled to its bounding rect. So a display point maps as
36
+ * `vx = (clientX - rect.left) / rect.width * canvasWidth` (and likewise for y), rounded to ints. Returns
37
+ * `null` for a zero-size rect or un-sized canvas (divide-by-zero / not-ready guard).
38
+ *
39
+ * Pure + framework-free so it's unit-testable without a DOM.
40
+ *
41
+ * @param clientX The pointer's viewport X in the DOM (`event.clientX`).
42
+ * @param clientY The pointer's viewport Y in the DOM (`event.clientY`).
43
+ * @param rect The canvas's bounding rect (`getBoundingClientRect()`).
44
+ * @param canvasWidth The canvas's internal pixel width (= frame/viewport width).
45
+ * @param canvasHeight The canvas's internal pixel height (= frame/viewport height).
46
+ * @returns Integer viewport coordinates, or `null` when mapping isn't possible.
47
+ */
48
+ export declare function MapToViewportCoords(clientX: number, clientY: number, rect: {
49
+ left: number;
50
+ top: number;
51
+ width: number;
52
+ height: number;
53
+ }, canvasWidth: number, canvasHeight: number): {
54
+ x: number;
55
+ y: number;
56
+ } | null;
57
+ /**
58
+ * One snapshot of the server-hosted browser — the shape the surface's {@link RemoteBrowserSurfaceComponent.Fetch}
59
+ * callback resolves to. Mirrors the server's `RemoteBrowserSnapshot` query payload.
60
+ */
61
+ export interface RemoteBrowserSnapshotView {
62
+ /** The current page screenshot as raw base64 PNG, or `null` when none is available yet. */
63
+ ScreenshotBase64: string | null;
64
+ /** The current page URL, or `null` when no page is loaded. */
65
+ CurrentUrl: string | null;
66
+ }
67
+ /**
68
+ * Fetches one {@link RemoteBrowserSnapshotView} from the server. Supplied by the channel
69
+ * plugin (it owns the session id + GraphQL provider). Best-effort by contract: resolves to
70
+ * `null` on any failure rather than throwing, so the surface keeps the last good frame.
71
+ */
72
+ export type RemoteBrowserSnapshotFetcher = () => Promise<RemoteBrowserSnapshotView | null>;
73
+ /**
74
+ * Reads the remote page's CURRENT text selection for copy-out (the mirror of the `'text'` paste-in path).
75
+ * Supplied by the channel plugin (it owns the session id + GraphQL provider). Best-effort by contract:
76
+ * resolves to `''` on any failure / when nothing is selected rather than throwing, so a best-effort copy
77
+ * never breaks the live view.
78
+ */
79
+ export type RemoteBrowserSelectionFetcher = () => Promise<string>;
80
+ /**
81
+ * LIVE REMOTE-BROWSER surface (`mj-realtime-remote-browser-surface`) — the Browser channel
82
+ * tab's pane. It renders the SERVER-hosted browser the agent drives: a refreshing screenshot
83
+ * `<img>` with the current URL above it and a small "live" indicator. The agent's
84
+ * `browser_*` tools mutate the page through the channel plugin; this surface only PERCEIVES
85
+ * it, polling its {@link Fetch} callback every {@link SNAPSHOT_POLL_MS} ms while bound.
86
+ *
87
+ * The surface is transport-agnostic — it never touches GraphQL directly. The channel plugin
88
+ * wires the {@link Fetch} callback (closing over the session id + provider) in `BindSurface`
89
+ * before the surface's first change detection, so the `ngOnInit` poll has it. Polling stops
90
+ * in `ngOnDestroy` (pane collapsed / overlay torn down) so no traffic continues after unbind.
91
+ * View-only in v1 — there is no takeover input.
92
+ *
93
+ * ### Two render paths: pushed screencast (preferred) vs. snapshot poll (fallback)
94
+ * When the backend advertises the `ScreenStreaming` capability, the server PUSHES encoded CDP
95
+ * frames and the channel plugin sets {@link Streaming} = `true`. In that mode the surface paints
96
+ * each frame onto a `<canvas>` via {@link RenderFrame} and DOES NOT start the poll. When streaming
97
+ * is off (capability absent or start failed) the original behavior is unchanged: the surface polls
98
+ * {@link Fetch} every {@link SNAPSHOT_POLL_MS} ms and renders the screenshot `<img>`.
99
+ */
100
+ export declare class RemoteBrowserSurfaceComponent implements OnInit, OnDestroy {
101
+ /** Snapshot fetcher supplied by the channel plugin (closes over the session id + provider). */
102
+ Fetch: RemoteBrowserSnapshotFetcher | null;
103
+ /**
104
+ * Selection fetcher for copy-out, supplied by the channel plugin (closes over the session id + provider).
105
+ * On a local `copy` / Cmd+C over the live canvas the surface calls this to read the remote page's
106
+ * selection, then writes it to the local clipboard. Best-effort: when unset or it resolves to `''`, the
107
+ * copy is a no-op (the local clipboard is left untouched).
108
+ */
109
+ FetchSelection: RemoteBrowserSelectionFetcher | null;
110
+ /**
111
+ * Whether the server is PUSHING live screencast frames for this session (the backend advertised the
112
+ * `ScreenStreaming` capability and the start succeeded). When `true` the surface paints pushed frames
113
+ * onto its `<canvas>` via {@link RenderFrame} and does NOT poll; when `false` it uses the snapshot
114
+ * `<img>` poll fallback. Set by the channel plugin in `BindSurface` from the start-screencast result.
115
+ *
116
+ * The start-screencast result is async, so this may flip to `true` AFTER `ngOnInit` has already begun
117
+ * polling — the setter tears the poll down in that case so the two render paths never run at once.
118
+ */
119
+ set Streaming(value: boolean);
120
+ get Streaming(): boolean;
121
+ private _streaming;
122
+ /**
123
+ * Whether HUMAN TAKEOVER is enabled — the user watching the live view can click/type into the page and
124
+ * those events are relayed into the server browser (Collaborative control). Takeover only attaches to the
125
+ * canvas render path (pushed screencast); the `<img>` poll fallback stays view-only. When enabled while
126
+ * already streaming the setter attaches listeners; flipping it off (or streaming off) detaches them.
127
+ */
128
+ set Interactive(value: boolean);
129
+ get Interactive(): boolean;
130
+ private _interactive;
131
+ /** Emits each human-takeover input (pointer move/click, key) the user performs on the live canvas. */
132
+ HumanInput: EventEmitter<RemoteBrowserHumanInputEvent>;
133
+ /**
134
+ * Whether the live tab-audio stream is available — the channel sets this `true` when the server confirms
135
+ * it is pushing audio. Drives whether the speaker toggle renders in the live-view bar.
136
+ */
137
+ AudioAvailable: boolean;
138
+ /**
139
+ * Whether tab audio is currently muted. Two-way: the channel sets the initial value (un-muted when audio
140
+ * starts) and the toggle updates it; {@link AudioMutedChange} relays each user change to the channel,
141
+ * which mutes/unmutes the player.
142
+ */
143
+ AudioMuted: boolean;
144
+ /** Emits the new muted state each time the user toggles the speaker (two-way `AudioMuted`). */
145
+ AudioMutedChange: EventEmitter<boolean>;
146
+ /** Toggles the speaker mute state and relays it to the channel (which mutes/unmutes the audio player). */
147
+ ToggleAudioMuted(): void;
148
+ /** True when takeover is both enabled AND on the canvas path — drives the cursor + "driving" pill. */
149
+ get CanTakeOver(): boolean;
150
+ /**
151
+ * True while the user is actively driving the remote browser with the keyboard — the takeover canvas
152
+ * holds focus. The host overlay reads this to stand down its own global keyboard shortcuts (e.g.
153
+ * T-to-type opening the local composer) so keystrokes go to the remote page, not the local input.
154
+ */
155
+ get IsCapturingInput(): boolean;
156
+ /** The current screenshot as a `data:` URL, or `null` before the first snapshot arrives. */
157
+ ScreenshotDataUrl: string | null;
158
+ /** The current page URL reported by the server, or `null` when none. */
159
+ CurrentUrl: string | null;
160
+ /** Whether at least one pushed screencast frame has been painted (drives the canvas placeholder). */
161
+ HasFrame: boolean;
162
+ /** The canvas the pushed screencast frames are painted onto (present only while {@link Streaming}). */
163
+ private frameCanvas?;
164
+ /** The transparent overlay the synthetic cursor is drawn onto (present only while {@link CanTakeOver}). */
165
+ private cursorCanvas?;
166
+ /** Whether at least one screenshot OR frame has been rendered (drives the "Live" indicator). */
167
+ get HasSnapshot(): boolean;
168
+ private readonly cdr;
169
+ private readonly zone;
170
+ /** Active poll timer; `null` when polling is stopped. */
171
+ private pollTimer;
172
+ /** Guards against overlapping polls when a request runs longer than the interval. */
173
+ private polling;
174
+ /** Set on destroy so an in-flight poll's late resolution doesn't touch a torn-down view. */
175
+ private destroyed;
176
+ /** Reused decode target for pushed frames — avoids allocating an `Image` per frame. */
177
+ private readonly frameImage;
178
+ /** The most recent un-painted frame data URL, drained on the next animation frame (drop-old coalescing). */
179
+ private pendingFrameDataUrl;
180
+ /** True while a paint is scheduled, so rapid frames coalesce to one `requestAnimationFrame`. */
181
+ private framePaintScheduled;
182
+ /** The canvas element takeover listeners are currently bound to, or `null` when detached. */
183
+ private takeoverCanvas;
184
+ /** Timestamp (ms) of the last forwarded pointer-move, for throttling the high-frequency stream. */
185
+ private lastPointerMoveAt;
186
+ /** Timestamp (ms) of the last forwarded scroll, for throttling the high-frequency wheel stream. */
187
+ private lastScrollAt;
188
+ /** Horizontal wheel delta accumulated since the last forwarded scroll (coalesced across throttled events). */
189
+ private pendingScrollDeltaX;
190
+ /** Vertical wheel delta accumulated since the last forwarded scroll (coalesced across throttled events). */
191
+ private pendingScrollDeltaY;
192
+ /** Last canvas-relative mouse position in VIEWPORT pixel space, or `null` when the pointer is off-canvas. */
193
+ private cursorViewportPoint;
194
+ /** True while a synthetic-cursor repaint is queued, so rapid moves coalesce to one `requestAnimationFrame`. */
195
+ private cursorPaintScheduled;
196
+ /**
197
+ * True while the user is mid-drag on the canvas (a `mousedown` not yet released) — drives forwarding
198
+ * intermediate moves as a drag and emitting the closing `pointer-up`. Click-drag text selection relies on
199
+ * this so the drag relays as down → moves → up rather than a single discrete click.
200
+ */
201
+ private dragging;
202
+ /**
203
+ * True when the most recent `mousedown`→`mouseup` actually MOVED (a real drag), so the synthetic `click`
204
+ * the browser fires right after should be suppressed — the drag's down/move/up already conveyed the intent,
205
+ * and a trailing click would collapse a just-made text selection.
206
+ */
207
+ private suppressNextClick;
208
+ /** Viewport point of the active drag's mousedown, used to tell a real drag from a stationary click. */
209
+ private dragStartPoint;
210
+ /**
211
+ * True while the takeover canvas currently HOLDS keyboard focus. The host overlay reads this (via
212
+ * {@link IsCapturingInput}) to suppress its own global key shortcuts (e.g. T-to-type) so the user's
213
+ * keystrokes land in the remote browser, not the local composer — fixing the "greedy textbox" focus theft.
214
+ */
215
+ private surfaceFocused;
216
+ /** Bound handlers — stored so the exact same references can be removed on detach. */
217
+ private readonly onCanvasMouseMove;
218
+ private readonly onCanvasMouseDown;
219
+ private readonly onCanvasMouseUp;
220
+ private readonly onCanvasClick;
221
+ private readonly onCanvasKeyDown;
222
+ private readonly onCanvasPaste;
223
+ private readonly onCanvasCopy;
224
+ private readonly onCanvasMouseLeave;
225
+ private readonly onCanvasWheel;
226
+ private readonly onCanvasFocus;
227
+ private readonly onCanvasBlur;
228
+ ngOnInit(): void;
229
+ ngOnDestroy(): void;
230
+ /** Starts the interval poll OUTSIDE Angular's zone so it doesn't trigger CD on every tick. */
231
+ private startPolling;
232
+ /** Stops the interval poll (no further snapshot requests are issued). */
233
+ private stopPolling;
234
+ /**
235
+ * Fetches one snapshot and applies it to the view. Best-effort: the fetcher resolves to
236
+ * `null` on failure (the prior frame stays on screen) so a single failed poll never breaks
237
+ * the live view. Skips when a prior poll is still in flight, the fetcher isn't wired, or
238
+ * after destroy.
239
+ */
240
+ private pollOnce;
241
+ /** Applies a fetched snapshot to the view fields and triggers OnPush change detection. */
242
+ private applySnapshot;
243
+ /**
244
+ * Paints one PUSHED screencast frame (base64 JPEG) onto the canvas. Called by the channel plugin for
245
+ * each frame the server pushes while {@link Streaming}. Coalesces a burst of frames to one paint per
246
+ * animation frame (the newest wins) so a fast stream never floods the main thread, and reuses a single
247
+ * `Image` decode target to avoid per-frame allocation. No-op after destroy or when not in streaming mode.
248
+ *
249
+ * @param dataBase64 The frame image as raw base64 JPEG (no `data:` prefix).
250
+ */
251
+ RenderFrame(dataBase64: string): void;
252
+ /**
253
+ * Updates the URL shown above the live view. In streaming (canvas) mode the snapshot poll is stopped, so
254
+ * the channel pushes the current URL here after a navigation/action reports one — otherwise the bar would
255
+ * stay stuck on "No page loaded yet" even though the page is live. No-op for an unchanged / empty value.
256
+ *
257
+ * @param url The current page URL, or null/empty to leave the bar unchanged.
258
+ */
259
+ SetCurrentUrl(url: string | null | undefined): void;
260
+ /** Drains the most recent pending frame onto the canvas (drop-old coalescing target). */
261
+ private paintPendingFrame;
262
+ /** Draws the decoded frame image onto the canvas, sizing the canvas to the frame on the first paint. */
263
+ private drawFrameImage;
264
+ /**
265
+ * Attaches or detaches the canvas takeover listeners so they're bound exactly when takeover is live —
266
+ * {@link CanTakeOver} is true AND the canvas element exists. Idempotent: re-binds only when the target
267
+ * canvas changed, detaches when the conditions no longer hold. Safe to call from any state-flip path
268
+ * (the `Interactive`/`Streaming` setters, the first-frame paint, destroy).
269
+ */
270
+ private syncTakeoverListeners;
271
+ /** Binds the pointer/keyboard/wheel listeners to the canvas OUTSIDE the zone (mousemove/wheel are high-frequency). */
272
+ private attachTakeoverListeners;
273
+ /** Removes the listeners from the currently-bound canvas (no-op when none are bound) and clears the cursor. */
274
+ private detachTakeoverListeners;
275
+ /**
276
+ * Pointer-move → tracks the cursor for the synthetic-cursor overlay (every move, immediate, no
277
+ * round-trip) AND emits a throttled viewport-mapped move to the server. Runs outside the zone (no CD
278
+ * per move).
279
+ */
280
+ private handlePointerMove;
281
+ /** Mouse leaves the canvas → hide the synthetic cursor (nothing to relay). */
282
+ private handleMouseLeave;
283
+ /**
284
+ * Wheel/trackpad/Magic-Mouse scroll over the canvas → forwards a viewport-mapped scroll to the server.
285
+ * Calls `preventDefault` so the host page doesn't scroll while the user drives the live page. Throttled
286
+ * to {@link SCROLL_THROTTLE_MS}, coalescing the skipped deltas so no scroll distance is lost.
287
+ */
288
+ private handleWheel;
289
+ /**
290
+ * Mouse-down on the canvas → focuses the canvas (so subsequent keys are captured) and BEGINS a drag:
291
+ * emits a `pointer-down` and arms drag mode so the following moves relay as drag motion and the matching
292
+ * `pointer-up` closes it. This is what makes click-drag text selection work (rather than a discrete click).
293
+ */
294
+ private handlePointerDown;
295
+ /**
296
+ * Mouse-up on the canvas → closes a drag with a `pointer-up` at the release point, disarming drag mode.
297
+ * If the pointer actually moved between down and up, marks the following synthetic `click` to be suppressed
298
+ * (so the drag selection isn't immediately collapsed by a trailing click).
299
+ */
300
+ private handlePointerUp;
301
+ /**
302
+ * Click → emits a viewport-mapped click WITH any held modifiers (e.g. Shift-click text selection). The
303
+ * server browser receives the press/release of a drag via {@link handlePointerDown}/{@link handlePointerUp};
304
+ * a plain click (down+up with no motion) still fires this `click` event, so a simple click relays as one
305
+ * click action — but we skip emitting it when it terminates a real drag (where down/up already covered it).
306
+ */
307
+ private handlePointerClick;
308
+ /**
309
+ * Keydown → forwards printable keys, a curated set of control keys ({@link FORWARDED_CONTROL_KEYS}), AND
310
+ * any key combined with a Ctrl/Cmd/Alt modifier (so combos like Ctrl/Cmd+A select-all, Cmd+C/Cmd+V relay).
311
+ * Calls `preventDefault` + `stopPropagation` ONLY on forwarded keys, so (a) the host app keeps its own
312
+ * shortcuts on un-forwarded keys and (b) forwarded keys never bubble to the host overlay's global shortcuts
313
+ * (the T-to-type focus-steal). Lone modifier keys are never forwarded — they ride as `modifiers` on the
314
+ * next key/click.
315
+ */
316
+ private handleKeyDown;
317
+ /**
318
+ * Paste-in: a local `paste` (Cmd/Ctrl+V or context-menu paste) over the canvas → reads the LOCAL clipboard
319
+ * text and relays it as a `'text'` human input, which the server inserts into the remote page's focused
320
+ * element (the VNC/remote-desktop paste model — no remote-clipboard sync). `preventDefault` keeps the host
321
+ * app from also acting on the paste; empty/non-text clipboards are a no-op.
322
+ */
323
+ private handlePaste;
324
+ /**
325
+ * Copy-out: a local `copy` (Cmd/Ctrl+C or context-menu copy) over the canvas → reads the REMOTE page's
326
+ * current selection via {@link FetchSelection} and writes it to the LOCAL clipboard (the mirror of paste-in).
327
+ * `preventDefault` stops the host app from copying its own empty selection. Best-effort throughout: when the
328
+ * fetcher is unwired, resolves to `''`, or `navigator.clipboard` is unavailable / denies permission, the copy
329
+ * is silently a no-op — it never throws and never breaks the live view.
330
+ */
331
+ private handleCopy;
332
+ /**
333
+ * Collects the modifier keys currently held during a DOM mouse/keyboard event into the relayed
334
+ * {@link RemoteBrowserModifier} list (empty when none are held).
335
+ *
336
+ * @param event The DOM event whose modifier flags to read.
337
+ * @returns The held modifiers, in a stable order.
338
+ */
339
+ private collectModifiers;
340
+ /** Re-enters the zone to emit one human input (so subscribers see it inside Angular). */
341
+ private emitInput;
342
+ /**
343
+ * Maps a DOM pointer event on the live canvas to VIEWPORT coordinates via {@link MapToViewportCoords}
344
+ * (the pure, unit-tested mapping). Returns `null` when no canvas is bound or mapping isn't possible yet.
345
+ *
346
+ * @param event The pointer event on the canvas.
347
+ * @returns The integer viewport coordinates, or `null` when mapping isn't possible yet.
348
+ */
349
+ private toViewportCoords;
350
+ /**
351
+ * Schedules a synthetic-cursor repaint on the next animation frame, coalescing a burst of moves to one
352
+ * paint (the newest position wins). Runs outside the zone — drawing the cursor never triggers Angular CD.
353
+ */
354
+ private scheduleCursorPaint;
355
+ /**
356
+ * Draws (or clears) the synthetic cursor on the overlay canvas at {@link cursorViewportPoint}. The overlay
357
+ * shares the frame canvas's internal resolution (sized here to match), so a point drawn at viewport coords
358
+ * aligns exactly with the page underneath. A small brand-tinted ring with a center dot reads as a pointer
359
+ * without obscuring what it's over. No-op after destroy or when the overlay isn't mounted.
360
+ */
361
+ private paintSyntheticCursor;
362
+ /** Clears the synthetic-cursor overlay (e.g. on detach). No-op when the overlay isn't mounted. */
363
+ private clearSyntheticCursor;
364
+ /**
365
+ * Resolves a CSS custom property (design token) to its computed color value off the host element, so the
366
+ * canvas-drawn cursor honors theming. Falls back to the supplied default when the token is unset or the
367
+ * host isn't measurable.
368
+ *
369
+ * @param token The CSS custom property name (e.g. `'--mj-brand-primary'`).
370
+ * @param fallback The color to use when the token resolves empty.
371
+ * @returns The resolved color string.
372
+ */
373
+ private resolveCssColor;
374
+ /** Maps a DOM `MouseEvent.button` (0/1/2) to the relayed button union, defaulting to `'left'`. */
375
+ private mapButton;
376
+ static ɵfac: i0.ɵɵFactoryDeclaration<RemoteBrowserSurfaceComponent, never>;
377
+ static ɵcmp: i0.ɵɵComponentDeclaration<RemoteBrowserSurfaceComponent, "mj-realtime-remote-browser-surface", never, { "Fetch": { "alias": "Fetch"; "required": false; }; "FetchSelection": { "alias": "FetchSelection"; "required": false; }; "Streaming": { "alias": "Streaming"; "required": false; }; "Interactive": { "alias": "Interactive"; "required": false; }; "AudioAvailable": { "alias": "AudioAvailable"; "required": false; }; "AudioMuted": { "alias": "AudioMuted"; "required": false; }; }, { "HumanInput": "HumanInput"; "AudioMutedChange": "AudioMutedChange"; }, never, never, true, never>;
378
+ }
379
+ //# sourceMappingURL=remote-browser-surface.component.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remote-browser-surface.component.d.ts","sourceRoot":"","sources":["../../../../../src/lib/components/realtime/remote-browser/remote-browser-surface.component.ts"],"names":[],"mappings":"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"}