@memberjunction/ng-conversations 6.2.0-edge.0 → 6.2.0-edge.1

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 (343) hide show
  1. package/README.md +35 -2
  2. package/dist/lib/components/active-tasks/active-tasks-panel.component.d.ts +19 -3
  3. package/dist/lib/components/active-tasks/active-tasks-panel.component.d.ts.map +1 -1
  4. package/dist/lib/components/active-tasks/active-tasks-panel.component.js +39 -7
  5. package/dist/lib/components/active-tasks/active-tasks-panel.component.js.map +1 -1
  6. package/dist/lib/components/agent/active-agent-indicator.component.d.ts +74 -6
  7. package/dist/lib/components/agent/active-agent-indicator.component.d.ts.map +1 -1
  8. package/dist/lib/components/agent/active-agent-indicator.component.js +111 -21
  9. package/dist/lib/components/agent/active-agent-indicator.component.js.map +1 -1
  10. package/dist/lib/components/agent/agent-process-panel.component.d.ts +31 -5
  11. package/dist/lib/components/agent/agent-process-panel.component.d.ts.map +1 -1
  12. package/dist/lib/components/agent/agent-process-panel.component.js +71 -15
  13. package/dist/lib/components/agent/agent-process-panel.component.js.map +1 -1
  14. package/dist/lib/components/artifact/artifact-share-modal.component.d.ts +65 -9
  15. package/dist/lib/components/artifact/artifact-share-modal.component.d.ts.map +1 -1
  16. package/dist/lib/components/artifact/artifact-share-modal.component.js +169 -57
  17. package/dist/lib/components/artifact/artifact-share-modal.component.js.map +1 -1
  18. package/dist/lib/components/attachment/image-viewer.component.d.ts +77 -11
  19. package/dist/lib/components/attachment/image-viewer.component.d.ts.map +1 -1
  20. package/dist/lib/components/attachment/image-viewer.component.js +181 -47
  21. package/dist/lib/components/attachment/image-viewer.component.js.map +1 -1
  22. package/dist/lib/components/collection/artifact-collection-picker-modal.component.d.ts +129 -19
  23. package/dist/lib/components/collection/artifact-collection-picker-modal.component.d.ts.map +1 -1
  24. package/dist/lib/components/collection/artifact-collection-picker-modal.component.js +350 -116
  25. package/dist/lib/components/collection/artifact-collection-picker-modal.component.js.map +1 -1
  26. package/dist/lib/components/collection/artifact-create-modal.component.d.ts +60 -8
  27. package/dist/lib/components/collection/artifact-create-modal.component.d.ts.map +1 -1
  28. package/dist/lib/components/collection/artifact-create-modal.component.js +130 -46
  29. package/dist/lib/components/collection/artifact-create-modal.component.js.map +1 -1
  30. package/dist/lib/components/collection/collection-artifact-card.component.d.ts +63 -3
  31. package/dist/lib/components/collection/collection-artifact-card.component.d.ts.map +1 -1
  32. package/dist/lib/components/collection/collection-artifact-card.component.js +113 -19
  33. package/dist/lib/components/collection/collection-artifact-card.component.js.map +1 -1
  34. package/dist/lib/components/collection/collection-form-modal.component.d.ts +54 -8
  35. package/dist/lib/components/collection/collection-form-modal.component.d.ts.map +1 -1
  36. package/dist/lib/components/collection/collection-form-modal.component.js +130 -46
  37. package/dist/lib/components/collection/collection-form-modal.component.js.map +1 -1
  38. package/dist/lib/components/collection/collection-share-modal.component.d.ts +70 -10
  39. package/dist/lib/components/collection/collection-share-modal.component.d.ts.map +1 -1
  40. package/dist/lib/components/collection/collection-share-modal.component.js +175 -53
  41. package/dist/lib/components/collection/collection-share-modal.component.js.map +1 -1
  42. package/dist/lib/components/collection/collection-tree.component.d.ts +89 -9
  43. package/dist/lib/components/collection/collection-tree.component.d.ts.map +1 -1
  44. package/dist/lib/components/collection/collection-tree.component.js +220 -70
  45. package/dist/lib/components/collection/collection-tree.component.js.map +1 -1
  46. package/dist/lib/components/collection/collection-view.component.d.ts +89 -11
  47. package/dist/lib/components/collection/collection-view.component.d.ts.map +1 -1
  48. package/dist/lib/components/collection/collection-view.component.js +154 -40
  49. package/dist/lib/components/collection/collection-view.component.js.map +1 -1
  50. package/dist/lib/components/collection/collections-full-view.component.d.ts +390 -38
  51. package/dist/lib/components/collection/collections-full-view.component.d.ts.map +1 -1
  52. package/dist/lib/components/collection/collections-full-view.component.js +951 -367
  53. package/dist/lib/components/collection/collections-full-view.component.js.map +1 -1
  54. package/dist/lib/components/composer/ai-composer.component.d.ts +213 -18
  55. package/dist/lib/components/composer/ai-composer.component.d.ts.map +1 -1
  56. package/dist/lib/components/composer/ai-composer.component.js +388 -44
  57. package/dist/lib/components/composer/ai-composer.component.js.map +1 -1
  58. package/dist/lib/components/conversation/conversation-agent-picker.component.d.ts +12 -1
  59. package/dist/lib/components/conversation/conversation-agent-picker.component.d.ts.map +1 -1
  60. package/dist/lib/components/conversation/conversation-agent-picker.component.js +26 -4
  61. package/dist/lib/components/conversation/conversation-agent-picker.component.js.map +1 -1
  62. package/dist/lib/components/conversation/conversation-chat-area.component.d.ts +1090 -123
  63. package/dist/lib/components/conversation/conversation-chat-area.component.d.ts.map +1 -1
  64. package/dist/lib/components/conversation/conversation-chat-area.component.js +2399 -706
  65. package/dist/lib/components/conversation/conversation-chat-area.component.js.map +1 -1
  66. package/dist/lib/components/conversation/conversation-empty-state.component.d.ts +139 -19
  67. package/dist/lib/components/conversation/conversation-empty-state.component.d.ts.map +1 -1
  68. package/dist/lib/components/conversation/conversation-empty-state.component.js +296 -59
  69. package/dist/lib/components/conversation/conversation-empty-state.component.js.map +1 -1
  70. package/dist/lib/components/conversation/conversation-list.component.d.ts +579 -78
  71. package/dist/lib/components/conversation/conversation-list.component.d.ts.map +1 -1
  72. package/dist/lib/components/conversation/conversation-list.component.js +2322 -823
  73. package/dist/lib/components/conversation/conversation-list.component.js.map +1 -1
  74. package/dist/lib/components/conversation/pinned-messages-panel.component.d.ts +40 -4
  75. package/dist/lib/components/conversation/pinned-messages-panel.component.d.ts.map +1 -1
  76. package/dist/lib/components/conversation/pinned-messages-panel.component.js +72 -14
  77. package/dist/lib/components/conversation/pinned-messages-panel.component.js.map +1 -1
  78. package/dist/lib/components/dialogs/input-dialog.component.d.ts +57 -11
  79. package/dist/lib/components/dialogs/input-dialog.component.d.ts.map +1 -1
  80. package/dist/lib/components/dialogs/input-dialog.component.js +128 -16
  81. package/dist/lib/components/dialogs/input-dialog.component.js.map +1 -1
  82. package/dist/lib/components/dialogs/rating-dialog.component.d.ts +68 -10
  83. package/dist/lib/components/dialogs/rating-dialog.component.d.ts.map +1 -1
  84. package/dist/lib/components/dialogs/rating-dialog.component.js +151 -27
  85. package/dist/lib/components/dialogs/rating-dialog.component.js.map +1 -1
  86. package/dist/lib/components/export/export-modal.component.d.ts +84 -10
  87. package/dist/lib/components/export/export-modal.component.d.ts.map +1 -1
  88. package/dist/lib/components/export/export-modal.component.js +173 -49
  89. package/dist/lib/components/export/export-modal.component.js.map +1 -1
  90. package/dist/lib/components/global-tasks/global-tasks-panel.component.d.ts +29 -3
  91. package/dist/lib/components/global-tasks/global-tasks-panel.component.d.ts.map +1 -1
  92. package/dist/lib/components/global-tasks/global-tasks-panel.component.js +58 -12
  93. package/dist/lib/components/global-tasks/global-tasks-panel.component.js.map +1 -1
  94. package/dist/lib/components/library/library-full-view.component.d.ts +57 -8
  95. package/dist/lib/components/library/library-full-view.component.d.ts.map +1 -1
  96. package/dist/lib/components/library/library-full-view.component.js +119 -35
  97. package/dist/lib/components/library/library-full-view.component.js.map +1 -1
  98. package/dist/lib/components/members/members-modal.component.d.ts +76 -10
  99. package/dist/lib/components/members/members-modal.component.d.ts.map +1 -1
  100. package/dist/lib/components/members/members-modal.component.js +164 -50
  101. package/dist/lib/components/members/members-modal.component.js.map +1 -1
  102. package/dist/lib/components/message/actionable-commands.component.d.ts +37 -5
  103. package/dist/lib/components/message/actionable-commands.component.d.ts.map +1 -1
  104. package/dist/lib/components/message/actionable-commands.component.js +82 -16
  105. package/dist/lib/components/message/actionable-commands.component.js.map +1 -1
  106. package/dist/lib/components/message/conversation-message-rating.component.d.ts +46 -10
  107. package/dist/lib/components/message/conversation-message-rating.component.d.ts.map +1 -1
  108. package/dist/lib/components/message/conversation-message-rating.component.js +120 -36
  109. package/dist/lib/components/message/conversation-message-rating.component.js.map +1 -1
  110. package/dist/lib/components/message/message-input.component.d.ts +549 -74
  111. package/dist/lib/components/message/message-input.component.d.ts.map +1 -1
  112. package/dist/lib/components/message/message-input.component.js +1250 -421
  113. package/dist/lib/components/message/message-input.component.js.map +1 -1
  114. package/dist/lib/components/message/message-item.component.d.ts +411 -29
  115. package/dist/lib/components/message/message-item.component.d.ts.map +1 -1
  116. package/dist/lib/components/message/message-item.component.js +896 -222
  117. package/dist/lib/components/message/message-item.component.js.map +1 -1
  118. package/dist/lib/components/message/message-list.component.d.ts +288 -29
  119. package/dist/lib/components/message/message-list.component.d.ts.map +1 -1
  120. package/dist/lib/components/message/message-list.component.js +561 -123
  121. package/dist/lib/components/message/message-list.component.js.map +1 -1
  122. package/dist/lib/components/navigation/conversation-navigation.component.d.ts +64 -5
  123. package/dist/lib/components/navigation/conversation-navigation.component.d.ts.map +1 -1
  124. package/dist/lib/components/navigation/conversation-navigation.component.js +101 -11
  125. package/dist/lib/components/navigation/conversation-navigation.component.js.map +1 -1
  126. package/dist/lib/components/notification/activity-indicator.component.d.ts +6 -2
  127. package/dist/lib/components/notification/activity-indicator.component.d.ts.map +1 -1
  128. package/dist/lib/components/notification/activity-indicator.component.js +13 -3
  129. package/dist/lib/components/notification/activity-indicator.component.js.map +1 -1
  130. package/dist/lib/components/notification/notification-badge.component.d.ts +15 -3
  131. package/dist/lib/components/notification/notification-badge.component.d.ts.map +1 -1
  132. package/dist/lib/components/notification/notification-badge.component.js +36 -8
  133. package/dist/lib/components/notification/notification-badge.component.js.map +1 -1
  134. package/dist/lib/components/overlay/chat-overlay.component.d.ts +1 -1
  135. package/dist/lib/components/overlay/chat-overlay.component.js +4 -4
  136. package/dist/lib/components/overlay/chat-overlay.component.js.map +1 -1
  137. package/dist/lib/components/project/project-form-modal.component.d.ts +93 -11
  138. package/dist/lib/components/project/project-form-modal.component.d.ts.map +1 -1
  139. package/dist/lib/components/project/project-form-modal.component.js +348 -87
  140. package/dist/lib/components/project/project-form-modal.component.js.map +1 -1
  141. package/dist/lib/components/project/project-selector.component.d.ts +78 -8
  142. package/dist/lib/components/project/project-selector.component.d.ts.map +1 -1
  143. package/dist/lib/components/project/project-selector.component.js +177 -46
  144. package/dist/lib/components/project/project-selector.component.js.map +1 -1
  145. package/dist/lib/components/realtime/realtime-activity-rail.component.d.ts +1 -1
  146. package/dist/lib/components/realtime/realtime-activity-rail.component.js +2 -2
  147. package/dist/lib/components/realtime/realtime-activity-rail.component.js.map +1 -1
  148. package/dist/lib/components/realtime/realtime-delegation-card.component.d.ts +1 -1
  149. package/dist/lib/components/realtime/realtime-delegation-card.component.js +2 -2
  150. package/dist/lib/components/realtime/realtime-delegation-card.component.js.map +1 -1
  151. package/dist/lib/components/realtime/realtime-session-overlay.component.d.ts +2 -2
  152. package/dist/lib/components/realtime/realtime-session-overlay.component.js +18 -18
  153. package/dist/lib/components/realtime/realtime-session-overlay.component.js.map +1 -1
  154. package/dist/lib/components/realtime/realtime-session-timeline-card.component.d.ts +47 -23
  155. package/dist/lib/components/realtime/realtime-session-timeline-card.component.d.ts.map +1 -1
  156. package/dist/lib/components/realtime/realtime-session-timeline-card.component.js +136 -92
  157. package/dist/lib/components/realtime/realtime-session-timeline-card.component.js.map +1 -1
  158. package/dist/lib/components/realtime/realtime-surface-tabs.component.d.ts +2 -2
  159. package/dist/lib/components/realtime/realtime-surface-tabs.component.js +4 -4
  160. package/dist/lib/components/realtime/realtime-surface-tabs.component.js.map +1 -1
  161. package/dist/lib/components/realtime/realtime-surface-tabs.model.d.ts +1 -1
  162. package/dist/lib/components/realtime/realtime-surface-tabs.model.js +3 -3
  163. package/dist/lib/components/realtime/realtime-surface-tabs.model.js.map +1 -1
  164. package/dist/lib/components/realtime/realtime-ui-config.d.ts +13 -11
  165. package/dist/lib/components/realtime/realtime-ui-config.d.ts.map +1 -1
  166. package/dist/lib/components/realtime/realtime-ui-config.js +29 -25
  167. package/dist/lib/components/realtime/realtime-ui-config.js.map +1 -1
  168. package/dist/lib/components/realtime/whiteboard/whiteboard-channel.d.ts +3 -1
  169. package/dist/lib/components/realtime/whiteboard/whiteboard-channel.d.ts.map +1 -1
  170. package/dist/lib/components/realtime/whiteboard/whiteboard-channel.js +6 -2
  171. package/dist/lib/components/realtime/whiteboard/whiteboard-channel.js.map +1 -1
  172. package/dist/lib/components/search/search-panel.component.d.ts +133 -22
  173. package/dist/lib/components/search/search-panel.component.d.ts.map +1 -1
  174. package/dist/lib/components/search/search-panel.component.js +312 -83
  175. package/dist/lib/components/search/search-panel.component.js.map +1 -1
  176. package/dist/lib/components/share/share-modal.component.d.ts +69 -9
  177. package/dist/lib/components/share/share-modal.component.d.ts.map +1 -1
  178. package/dist/lib/components/share/share-modal.component.js +139 -31
  179. package/dist/lib/components/share/share-modal.component.js.map +1 -1
  180. package/dist/lib/components/shared/user-picker.component.d.ts +48 -8
  181. package/dist/lib/components/shared/user-picker.component.d.ts.map +1 -1
  182. package/dist/lib/components/shared/user-picker.component.js +110 -30
  183. package/dist/lib/components/shared/user-picker.component.js.map +1 -1
  184. package/dist/lib/components/sidebar/conversation-sidebar.component.d.ts +114 -11
  185. package/dist/lib/components/sidebar/conversation-sidebar.component.d.ts.map +1 -1
  186. package/dist/lib/components/sidebar/conversation-sidebar.component.js +199 -21
  187. package/dist/lib/components/sidebar/conversation-sidebar.component.js.map +1 -1
  188. package/dist/lib/components/sidebar/routines-section.component.d.ts +20 -1
  189. package/dist/lib/components/sidebar/routines-section.component.d.ts.map +1 -1
  190. package/dist/lib/components/sidebar/routines-section.component.js +25 -5
  191. package/dist/lib/components/sidebar/routines-section.component.js.map +1 -1
  192. package/dist/lib/components/slots/slot-interfaces.d.ts +19 -0
  193. package/dist/lib/components/slots/slot-interfaces.d.ts.map +1 -1
  194. package/dist/lib/components/slots/slot-interfaces.js.map +1 -1
  195. package/dist/lib/components/task/tasks-full-view.component.d.ts +95 -13
  196. package/dist/lib/components/task/tasks-full-view.component.d.ts.map +1 -1
  197. package/dist/lib/components/task/tasks-full-view.component.js +223 -75
  198. package/dist/lib/components/task/tasks-full-view.component.js.map +1 -1
  199. package/dist/lib/components/tasks/task-widget.component.d.ts +46 -6
  200. package/dist/lib/components/tasks/task-widget.component.d.ts.map +1 -1
  201. package/dist/lib/components/tasks/task-widget.component.js +100 -16
  202. package/dist/lib/components/tasks/task-widget.component.js.map +1 -1
  203. package/dist/lib/components/tasks/tasks-dropdown.component.d.ts +64 -7
  204. package/dist/lib/components/tasks/tasks-dropdown.component.d.ts.map +1 -1
  205. package/dist/lib/components/tasks/tasks-dropdown.component.js +127 -27
  206. package/dist/lib/components/tasks/tasks-dropdown.component.js.map +1 -1
  207. package/dist/lib/components/thread/thread-panel.component.d.ts +66 -8
  208. package/dist/lib/components/thread/thread-panel.component.d.ts.map +1 -1
  209. package/dist/lib/components/thread/thread-panel.component.js +146 -36
  210. package/dist/lib/components/thread/thread-panel.component.js.map +1 -1
  211. package/dist/lib/components/toast/toast.component.d.ts +11 -1
  212. package/dist/lib/components/toast/toast.component.d.ts.map +1 -1
  213. package/dist/lib/components/toast/toast.component.js +25 -5
  214. package/dist/lib/components/toast/toast.component.js.map +1 -1
  215. package/dist/lib/components/workspace/conversation-workspace.component.d.ts +385 -42
  216. package/dist/lib/components/workspace/conversation-workspace.component.d.ts.map +1 -1
  217. package/dist/lib/components/workspace/conversation-workspace.component.js +887 -291
  218. package/dist/lib/components/workspace/conversation-workspace.component.js.map +1 -1
  219. package/dist/lib/composer-plugins/base-conversation-mention.provider.d.ts +8 -0
  220. package/dist/lib/composer-plugins/base-conversation-mention.provider.d.ts.map +1 -1
  221. package/dist/lib/composer-plugins/base-conversation-mention.provider.js +8 -1
  222. package/dist/lib/composer-plugins/base-conversation-mention.provider.js.map +1 -1
  223. package/dist/lib/directives/chat-slot.directive.d.ts +5 -1
  224. package/dist/lib/directives/chat-slot.directive.d.ts.map +1 -1
  225. package/dist/lib/directives/chat-slot.directive.js.map +1 -1
  226. package/dist/lib/directives/search-shortcut.directive.d.ts +9 -1
  227. package/dist/lib/directives/search-shortcut.directive.d.ts.map +1 -1
  228. package/dist/lib/directives/search-shortcut.directive.js +14 -4
  229. package/dist/lib/directives/search-shortcut.directive.js.map +1 -1
  230. package/dist/lib/events/chat-events.d.ts +34 -7
  231. package/dist/lib/events/chat-events.d.ts.map +1 -1
  232. package/dist/lib/events/chat-events.js +37 -7
  233. package/dist/lib/events/chat-events.js.map +1 -1
  234. package/dist/lib/models/agent-turn.model.d.ts +103 -0
  235. package/dist/lib/models/agent-turn.model.d.ts.map +1 -0
  236. package/dist/lib/models/agent-turn.model.js +12 -0
  237. package/dist/lib/models/agent-turn.model.js.map +1 -0
  238. package/dist/lib/models/collection-view.model.js.map +1 -1
  239. package/dist/lib/models/conversation-state.model.d.ts +8 -0
  240. package/dist/lib/models/conversation-state.model.d.ts.map +1 -1
  241. package/dist/lib/models/conversation-state.model.js.map +1 -1
  242. package/dist/lib/models/lazy-artifact-info.d.ts +44 -12
  243. package/dist/lib/models/lazy-artifact-info.d.ts.map +1 -1
  244. package/dist/lib/models/lazy-artifact-info.js +98 -34
  245. package/dist/lib/models/lazy-artifact-info.js.map +1 -1
  246. package/dist/lib/services/active-tasks.service.d.ts +30 -4
  247. package/dist/lib/services/active-tasks.service.d.ts.map +1 -1
  248. package/dist/lib/services/active-tasks.service.js +71 -19
  249. package/dist/lib/services/active-tasks.service.js.map +1 -1
  250. package/dist/lib/services/agent-state.service.d.ts +17 -1
  251. package/dist/lib/services/agent-state.service.d.ts.map +1 -1
  252. package/dist/lib/services/agent-state.service.js +48 -16
  253. package/dist/lib/services/agent-state.service.js.map +1 -1
  254. package/dist/lib/services/artifact-permission.service.d.ts +39 -0
  255. package/dist/lib/services/artifact-permission.service.d.ts.map +1 -1
  256. package/dist/lib/services/artifact-permission.service.js +152 -17
  257. package/dist/lib/services/artifact-permission.service.js.map +1 -1
  258. package/dist/lib/services/artifact-state.service.d.ts +58 -5
  259. package/dist/lib/services/artifact-state.service.d.ts.map +1 -1
  260. package/dist/lib/services/artifact-state.service.js +135 -35
  261. package/dist/lib/services/artifact-state.service.js.map +1 -1
  262. package/dist/lib/services/collection-permission.service.d.ts +28 -0
  263. package/dist/lib/services/collection-permission.service.d.ts.map +1 -1
  264. package/dist/lib/services/collection-permission.service.js +88 -32
  265. package/dist/lib/services/collection-permission.service.js.map +1 -1
  266. package/dist/lib/services/collection-state.service.d.ts +11 -1
  267. package/dist/lib/services/collection-state.service.d.ts.map +1 -1
  268. package/dist/lib/services/collection-state.service.js +25 -5
  269. package/dist/lib/services/collection-state.service.js.map +1 -1
  270. package/dist/lib/services/conversation-agent.service.d.ts +26 -4
  271. package/dist/lib/services/conversation-agent.service.d.ts.map +1 -1
  272. package/dist/lib/services/conversation-agent.service.js +57 -18
  273. package/dist/lib/services/conversation-agent.service.js.map +1 -1
  274. package/dist/lib/services/conversation-attachment.service.d.ts +17 -0
  275. package/dist/lib/services/conversation-attachment.service.d.ts.map +1 -1
  276. package/dist/lib/services/conversation-attachment.service.js +38 -10
  277. package/dist/lib/services/conversation-attachment.service.js.map +1 -1
  278. package/dist/lib/services/conversation-streaming.service.d.ts +22 -0
  279. package/dist/lib/services/conversation-streaming.service.d.ts.map +1 -1
  280. package/dist/lib/services/conversation-streaming.service.js +50 -10
  281. package/dist/lib/services/conversation-streaming.service.js.map +1 -1
  282. package/dist/lib/services/data-cache.service.d.ts +31 -0
  283. package/dist/lib/services/data-cache.service.d.ts.map +1 -1
  284. package/dist/lib/services/data-cache.service.js +71 -15
  285. package/dist/lib/services/data-cache.service.js.map +1 -1
  286. package/dist/lib/services/dialog.service.d.ts +13 -0
  287. package/dist/lib/services/dialog.service.d.ts.map +1 -1
  288. package/dist/lib/services/dialog.service.js +25 -5
  289. package/dist/lib/services/dialog.service.js.map +1 -1
  290. package/dist/lib/services/export.service.d.ts +2 -0
  291. package/dist/lib/services/export.service.d.ts.map +1 -1
  292. package/dist/lib/services/export.service.js +5 -1
  293. package/dist/lib/services/export.service.js.map +1 -1
  294. package/dist/lib/services/mention-parser.service.d.ts +10 -0
  295. package/dist/lib/services/mention-parser.service.d.ts.map +1 -1
  296. package/dist/lib/services/mention-parser.service.js +25 -5
  297. package/dist/lib/services/mention-parser.service.js.map +1 -1
  298. package/dist/lib/services/notification.service.d.ts +54 -6
  299. package/dist/lib/services/notification.service.d.ts.map +1 -1
  300. package/dist/lib/services/notification.service.js +123 -27
  301. package/dist/lib/services/notification.service.js.map +1 -1
  302. package/dist/lib/services/realtime-audio-recorder.d.ts +4 -4
  303. package/dist/lib/services/realtime-audio-recorder.js +12 -12
  304. package/dist/lib/services/realtime-audio-recorder.js.map +1 -1
  305. package/dist/lib/services/realtime-pcm-wav.d.ts +4 -0
  306. package/dist/lib/services/realtime-pcm-wav.d.ts.map +1 -1
  307. package/dist/lib/services/realtime-pcm-wav.js +10 -2
  308. package/dist/lib/services/realtime-pcm-wav.js.map +1 -1
  309. package/dist/lib/services/search.service.d.ts +42 -9
  310. package/dist/lib/services/search.service.d.ts.map +1 -1
  311. package/dist/lib/services/search.service.js +103 -23
  312. package/dist/lib/services/search.service.js.map +1 -1
  313. package/dist/lib/services/toast.service.d.ts +19 -1
  314. package/dist/lib/services/toast.service.d.ts.map +1 -1
  315. package/dist/lib/services/toast.service.js +45 -9
  316. package/dist/lib/services/toast.service.js.map +1 -1
  317. package/dist/lib/services/ui-command-handler.service.d.ts +16 -2
  318. package/dist/lib/services/ui-command-handler.service.d.ts.map +1 -1
  319. package/dist/lib/services/ui-command-handler.service.js +36 -8
  320. package/dist/lib/services/ui-command-handler.service.js.map +1 -1
  321. package/dist/lib/utils/agent-artifact-summary.d.ts +2 -2
  322. package/dist/lib/utils/agent-artifact-summary.js +3 -3
  323. package/dist/lib/utils/agent-artifact-summary.js.map +1 -1
  324. package/dist/lib/utils/agent-turn-routing.d.ts +69 -0
  325. package/dist/lib/utils/agent-turn-routing.d.ts.map +1 -0
  326. package/dist/lib/utils/agent-turn-routing.js +96 -0
  327. package/dist/lib/utils/agent-turn-routing.js.map +1 -0
  328. package/dist/lib/utils/artifact-panel-action.d.ts +15 -4
  329. package/dist/lib/utils/artifact-panel-action.d.ts.map +1 -1
  330. package/dist/lib/utils/artifact-panel-action.js +10 -2
  331. package/dist/lib/utils/artifact-panel-action.js.map +1 -1
  332. package/dist/lib/utils/distinct-artifacts.d.ts +2 -0
  333. package/dist/lib/utils/distinct-artifacts.d.ts.map +1 -1
  334. package/dist/lib/utils/distinct-artifacts.js +5 -1
  335. package/dist/lib/utils/distinct-artifacts.js.map +1 -1
  336. package/dist/lib/utils/plan-mode-preference.d.ts +2 -2
  337. package/dist/lib/utils/plan-mode-preference.js +6 -6
  338. package/dist/lib/utils/plan-mode-preference.js.map +1 -1
  339. package/dist/public-api.d.ts +3 -0
  340. package/dist/public-api.d.ts.map +1 -1
  341. package/dist/public-api.js +3 -0
  342. package/dist/public-api.js.map +1 -1
  343. package/package.json +32 -32
@@ -1 +1 @@
1
- {"version":3,"file":"whiteboard-channel.d.ts","sourceRoot":"","sources":["../../../../../src/lib/components/realtime/whiteboard/whiteboard-channel.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"whiteboard-channel.d.ts","sourceRoot":"","sources":["../../../../../src/lib/components/realtime/whiteboard/whiteboard-channel.ts"],"names":[],"mappings":"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"}
@@ -34,7 +34,7 @@ function toolSucceeded(result) {
34
34
  * Asynchronously rasterizes an SVG string to a JPEG base64 string (without the `data:image/jpeg;base64,` prefix)
35
35
  * using an offscreen canvas. Returns null in non-DOM environments or when rendering fails.
36
36
  */
37
- export async function rasterizeSvgToJpegBase64(svg, width = 1280, height = 720) {
37
+ export async function RasterizeSvgToJpegBase64(svg, width = 1280, height = 720) {
38
38
  if (typeof document === 'undefined' || typeof Image === 'undefined') {
39
39
  return null;
40
40
  }
@@ -171,7 +171,7 @@ let RealtimeWhiteboardChannel = class RealtimeWhiteboardChannel extends BaseReal
171
171
  }
172
172
  try {
173
173
  const svg = BuildWhiteboardExportSvg(this.State);
174
- return await rasterizeSvgToJpegBase64(svg);
174
+ return await RasterizeSvgToJpegBase64(svg);
175
175
  }
176
176
  catch (err) {
177
177
  console.error('[RealtimeWhiteboardChannel] Failed to export whiteboard frame:', err);
@@ -551,4 +551,8 @@ export { RealtimeWhiteboardChannel };
551
551
  export function LoadRealtimeWhiteboardChannel() {
552
552
  // intentional no-op — the import side effect performs the registration
553
553
  }
554
+ /** @deprecated Use {@link RasterizeSvgToJpegBase64}. */
555
+ export async function rasterizeSvgToJpegBase64(svg, width = 1280, height = 720) {
556
+ return RasterizeSvgToJpegBase64(svg, width, height);
557
+ }
554
558
  //# sourceMappingURL=whiteboard-channel.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"whiteboard-channel.js","sourceRoot":"","sources":["../../../../../src/lib/components/realtime/whiteboard/whiteboard-channel.ts"],"names":[],"mappings":";;;;;;;AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,2BAA2B,EAAkE,MAAM,oBAAoB,CAAC;AACjI,OAAO,EAAE,yBAAyB,EAAyB,MAAM,oCAAoC,CAAC;AACtG,OAAO,EAAE,yBAAyB,EAA4B,MAAM,kCAAkC,CAAC;AACvG,OAAO,EACL,wBAAwB,EAAE,wBAAwB,EAAE,+BAA+B,EAAE,2BAA2B,EAChH,sBAAsB,EAAE,eAAe,EACxC,MAAM,+BAA+B,CAAC;AAEvC;;;;;;;;GAQG;AACH,SAAS,aAAa,CAAC,MAAc;IACnC,IAAI,CAAC;QACH,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC3C,OAAO,MAAM,KAAK,IAAI,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAK,MAAgC,CAAC,OAAO,KAAK,IAAI,CAAC;IAC7G,CAAC;IAAC,MAAM,CAAC;QACP,yFAAyF;QACzF,qFAAqF;QACrF,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAAC,GAAW,EAAE,KAAK,GAAG,IAAI,EAAE,MAAM,GAAG,GAAG;IACpF,IAAI,OAAO,QAAQ,KAAK,WAAW,IAAI,OAAO,KAAK,KAAK,WAAW,EAAE,CAAC;QACpE,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,IAAI,OAAO,CAAgB,CAAC,OAAO,EAAE,EAAE;QAC5C,IAAI,GAAG,GAAkB,IAAI,CAAC;QAC9B,IAAI,KAAK,GAAyC,IAAI,CAAC;QAEvD,MAAM,OAAO,GAAG,GAAG,EAAE;YACnB,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;gBAClB,YAAY,CAAC,KAAK,CAAC,CAAC;gBACpB,KAAK,GAAG,IAAI,CAAC;YACf,CAAC;YACD,IAAI,GAAG,EAAE,CAAC;gBACR,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;gBACzB,GAAG,GAAG,IAAI,CAAC;YACb,CAAC;QACH,CAAC,CAAC;QAEF,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,KAAK,EAAE,CAAC;YACxB,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,6BAA6B,EAAE,CAAC,CAAC;YACzE,GAAG,GAAG,GAAG,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;YAEnC,gGAAgG;YAChG,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;gBACtB,OAAO,CAAC,KAAK,CAAC,sEAAsE,CAAC,CAAC;gBACtF,OAAO,EAAE,CAAC;gBACV,OAAO,CAAC,IAAI,CAAC,CAAC;YAChB,CAAC,EAAE,IAAI,CAAC,CAAC;YAET,GAAG,CAAC,MAAM,GAAG,GAAG,EAAE;gBAChB,IAAI,CAAC;oBACH,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;oBAChD,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC;oBACrB,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC;oBACvB,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;oBACpC,IAAI,CAAC,GAAG,EAAE,CAAC;wBACT,OAAO,EAAE,CAAC;wBACV,OAAO,CAAC,IAAI,CAAC,CAAC;wBACd,OAAO;oBACT,CAAC;oBACD,GAAG,CAAC,SAAS,GAAG,SAAS,CAAC;oBAC1B,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;oBAClC,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;oBACxC,OAAO,EAAE,CAAC;oBACV,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;oBACrD,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;oBACnC,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;gBAC3D,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,OAAO,CAAC,KAAK,CAAC,qEAAqE,EAAE,GAAG,CAAC,CAAC;oBAC1F,OAAO,EAAE,CAAC;oBACV,OAAO,CAAC,IAAI,CAAC,CAAC;gBAChB,CAAC;YACH,CAAC,CAAC;YACF,GAAG,CAAC,OAAO,GAAG,CAAC,GAAG,EAAE,EAAE;gBACpB,OAAO,CAAC,KAAK,CAAC,yEAAyE,EAAE,GAAG,CAAC,CAAC;gBAC9F,OAAO,EAAE,CAAC;gBACV,OAAO,CAAC,IAAI,CAAC,CAAC;YAChB,CAAC,CAAC;YACF,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC;QAChB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,qEAAqE,EAAE,GAAG,CAAC,CAAC;YAC1F,OAAO,EAAE,CAAC;YACV,OAAO,CAAC,IAAI,CAAC,CAAC;QAChB,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,uCAAuC,GAAG,IAAI,CAAC;AAY5D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEI,IAAM,yBAAyB,GAA/B,MAAM,yBAA0B,SAAQ,yBAA0D;;IACvG,qFAAqF;IACrE,KAAK,GAAG,IAAI,eAAe,EAAE,CAAC;IAE9C,2EAA2E;IACnE,IAAI,GAA2C,IAAI,CAAC;IAC5D,4FAA4F;IACpF,WAAW,GAAmB,EAAE,CAAC;IACzC,8EAA8E;IACtE,eAAe,GAAwB,IAAI,CAAC;IACpD,6EAA6E;IACrE,oBAAoB,GAAG,IAAI,GAAG,EAAoC,CAAC;IAC3E,qGAAqG;IAC7F,WAAW,GAAqC,IAAI,CAAC;IAC7D,kFAAkF;IAC1E,iBAAiB,GAAG,CAAC,CAAC;IAE9B,IAAW,WAAW;QACpB,OAAO,YAAY,CAAC;IACtB,CAAC;IAED;;OAEG;IACa,gBAAgB;QAC9B,OAAO,CAAC,2BAA2B,CAAC,CAAC;IACvC,CAAC;IAED;;;OAGG;IACI,KAAK,CAAC,cAAc;QACzB,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YAChB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,wBAAwB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACjD,OAAO,MAAM,wBAAwB,CAAC,GAAG,CAAC,CAAC;QAC7C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,gEAAgE,EAAE,GAAG,CAAC,CAAC;YACrF,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAEO,MAAM,CAAU,6BAA6B,GAAG,IAAI,CAAC;IACrD,MAAM,CAAU,yBAAyB,GAAG,GAAG,CAAC;IAExD,+FAA+F;IAC/F,gGAAgG;IAChG,yFAAyF;IACzF,2FAA2F;IAC3F,4FAA4F;IAC5F,gGAAgG;IAChG,+FAA+F;IAC/F,qFAAqF;IAErF,0FAA0F;IAClF,uBAAuB,GAAyC,IAAI,CAAC;IAC7E,2EAA2E;IACnE,yBAAyB,GAAkB,IAAI,CAAC;IAExD,2EAA2E;IACnE,4BAA4B;QAClC,IAAI,IAAI,CAAC,uBAAuB,IAAI,IAAI,EAAE,CAAC;YACzC,YAAY,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;YAC3C,IAAI,CAAC,uBAAuB,GAAG,IAAI,CAAC;QACtC,CAAC;IACH,CAAC;IAED;;;;OAIG;IACK,2BAA2B;QACjC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC;QACpC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,2BAAyB,CAAC,6BAA6B,CAAC;QACjE,CAAC;QACD,MAAM,MAAM,GAA6B,MAAM,CAAC,iBAAiB,CAAC;QAClE,MAAM,UAAU,GAAG,MAAM,EAAE,IAAI,CAC7B,CAAC,CAAgB,EAAE,EAAE,CACnB,CAAC,CAAC,UAAU,CAAC,QAAQ,KAAK,OAAO;YACjC,CAAC,CAAC,UAAU,CAAC,SAAS,KAAK,SAAS,CACvC,CAAC;QACF,MAAM,IAAI,GAAG,UAAU,EAAE,UAAU,CAAC,IAAI,CAAC;QACzC,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,GAAG,CAAC,EAAE,CAAC;YACzC,OAAO,IAAI,CAAC,GAAG,CACb,2BAAyB,CAAC,yBAAyB,EACnD,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,CACxB,CAAC;QACJ,CAAC;QACD,OAAO,2BAAyB,CAAC,6BAA6B,CAAC;IACjE,CAAC;IAED;;OAEG;IACK,mBAAmB,CAAC,KAAa;QACvC,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACpC,IAAI,CAAC,yBAAyB,GAAG,KAAK,CAAC;QACvC,IAAI,CAAC,iBAAiB,EAAE,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC;IAC7C,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,cAAc;QAC1B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACxC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,kBAAkB,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,CAAC;gBAC7E,OAAO;YACT,CAAC;YAED,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACvB,MAAM,SAAS,GAAG,IAAI,CAAC,2BAA2B,EAAE,CAAC;YACrD,MAAM,OAAO,GAAG,GAAG,GAAG,IAAI,CAAC,iBAAiB,CAAC;YAE7C,IAAI,OAAO,IAAI,SAAS,EAAE,CAAC;gBACzB,IAAI,CAAC,4BAA4B,EAAE,CAAC;gBACpC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;gBAC1C,IAAI,CAAC,KAAK,EAAE,CAAC;oBACX,OAAO;gBACT,CAAC;gBACD,IAAI,KAAK,KAAK,IAAI,CAAC,yBAAyB,EAAE,CAAC;oBAC7C,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;gBAClC,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,+EAA+E;gBAC/E,IAAI,CAAC,IAAI,CAAC,uBAAuB,EAAE,CAAC;oBAClC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC,CAAC;oBAC/C,IAAI,CAAC,uBAAuB,GAAG,UAAU,CAAC,KAAK,IAAI,EAAE;wBACnD,IAAI,CAAC,uBAAuB,GAAG,IAAI,CAAC;wBACpC,IAAI,CAAC;4BACH,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,kBAAkB,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,CAAC;gCAClE,OAAO;4BACT,CAAC;4BACD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;4BAC1C,IAAI,CAAC,KAAK,EAAE,CAAC;gCACX,OAAO;4BACT,CAAC;4BACD,IAAI,KAAK,KAAK,IAAI,CAAC,yBAAyB,EAAE,CAAC;gCAC7C,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;4BAClC,CAAC;wBACH,CAAC;wBAAC,OAAO,GAAG,EAAE,CAAC;4BACb,OAAO,CAAC,KAAK,CAAC,wEAAwE,EAAE,GAAG,CAAC,CAAC;wBAC/F,CAAC;oBACH,CAAC,EAAE,KAAK,CAAC,CAAC;gBACZ,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,sDAAsD,EAAE,GAAG,CAAC,CAAC;QAC7E,CAAC;IACH,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,0BAA0B;QACtC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACxC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,kBAAkB,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,CAAC;gBAC7E,OAAO;YACT,CAAC;YACD,IAAI,CAAC,4BAA4B,EAAE,CAAC;YACpC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;YAC1C,IAAI,KAAK,EAAE,CAAC;gBACV,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;gBAChC,IAAI,CAAC,OAAO,EAAE,eAAe,CAC3B,+HAA+H,CAChI,CAAC;YACJ,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,kEAAkE,EAAE,GAAG,CAAC,CAAC;QACzF,CAAC;IACH,CAAC;IAED,IAAW,cAAc;QACvB,OAAO,sBAAsB,CAAC;IAChC,CAAC;IAED,IAAW,QAAQ;QACjB,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,IAAW,OAAO;QAChB,OAAO,wBAAwB,CAAC;IAClC,CAAC;IAEM,kBAAkB;QACvB,OAAO,2BAA2B,CAAC;IACrC,CAAC;IAEe,mBAAmB;QACjC,OAAO,+BAA+B,CAAC;IACzC,CAAC;IAED,8FAA8F;IAC9E,oBAAoB;QAClC,OAAO;YACL,OAAO,EAAE,YAAY;YACrB,WAAW,EACT,qFAAqF;gBACrF,6FAA6F;YAC/F,IAAI,EAAE;gBACJ,0EAA0E;gBAC1E,qFAAqF;gBACrF,oFAAoF;aACrF;YACD,SAAS,EAAE,wBAAwB;SACpC,CAAC;IACJ,CAAC;IAED,+FAA+F;IAC5E,YAAY;QAC7B,IAAI,CAAC,eAAe,EAAE,WAAW,EAAE,CAAC;QACpC,IAAI,CAAC,4BAA4B,EAAE,CAAC;QACpC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,MAAM,EAAE,EAAE;YAC9D,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;YAC/C,8FAA8F;YAC9F,mEAAmE;YACnE,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM,IAAI,MAAM,CAAC,EAAE,KAAK,SAAS,EAAE,CAAC;gBACxD,KAAK,IAAI,CAAC,cAAc,EAAE,CAAC;YAC7B,CAAC;QACH,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,iBAAiB,EAAE,CAAC;IAC3B,CAAC;IAEe,gBAAgB;QAC9B,IAAI,CAAC,iBAAiB,EAAE,CAAC;IAC3B,CAAC;IAEO,iBAAiB;QACvB,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACtC,IAAI,CAAC,WAAW,GAAG,IAAI,yBAAyB,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;QACrF,CAAC;QACD,IAAI,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,IAAI,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,kBAAkB,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,CAAC;YACnH,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,EAAE,CAAC;QAC7B,CAAC;QACD,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED;;;;OAIG;IACI,WAAW,CAAC,QAAyC;QAC1D,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACzB,IAAI,CAAC,cAAc,EAAE,CAAC;QACtB,IAAI,CAAC,IAAI,GAAG,QAAQ,CAAC;QACrB,QAAQ,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QAC5B,QAAQ,CAAC,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,SAAS,IAAI,OAAO,CAAC;QACxD,IAAI,CAAC,WAAW,CAAC,IAAI;QACnB,4EAA4E;QAC5E,QAAQ,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,SAAiB,EAAE,EAAE;YAClD,kFAAkF;YAClF,gFAAgF;YAChF,6EAA6E;YAC7E,iEAAiE;YACjE,IAAI,CAAC,OAAO,EAAE,eAAe,CAC3B,iFAAiF;gBACjF,mEAAmE,GAAG,SAAS,CAAC,CAAC;QACrF,CAAC,CAAC;QACF,sFAAsF;QACtF,QAAQ,CAAC,SAAS,CAAC,SAAS,CAAC,GAAG,EAAE;YAChC,IAAI,CAAC,OAAO,EAAE,eAAe,CAAC,0CAA0C,CAAC,CAAC;QAC5E,CAAC,CAAC;QACF,+EAA+E;QAC/E,kFAAkF;QAClF,8EAA8E;QAC9E,iCAAiC;QACjC,QAAQ,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,MAAmC,EAAE,EAAE;YACzE,sEAAsE;YACtE,IAAI,CAAC,OAAO,EAAE,eAAe,CAC3B,oDAAoD,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,MAAM,MAAM,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;YAC5G,+EAA+E;YAC/E,gFAAgF;YAChF,6CAA6C;YAC7C,IAAI,CAAC,OAAO,EAAE,qBAAqB,EAAE,CACnC,2DAA2D,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,MAAM,MAAM,MAAM,CAAC,QAAQ,IAAI;gBACjH,sFAAsF,CAAC,CAAC;QAC5F,CAAC,CAAC;QACF,gFAAgF;QAChF,kFAAkF;QAClF,qFAAqF;QACrF,oFAAoF;QACpF,QAAQ,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC,WAA6C,EAAE,EAAE;YACrF,IAAI,CAAC,mBAAmB,CAAC,WAAW,CAAC,CAAC;QACxC,CAAC,CAAC;QACF,qFAAqF;QACrF,QAAQ,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,OAAgB,EAAE,EAAE;YACtD,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,OAAO,CAAC,CAAC;QACtC,CAAC,CAAC;QACF,+EAA+E;QAC/E,QAAQ,CAAC,wBAAwB,CAAC,SAAS,CAAC,GAAG,EAAE;YAC/C,KAAK,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAClC,CAAC,CAAC,CACH,CAAC;IACJ,CAAC;IAEe,aAAa;QAC3B,IAAI,CAAC,cAAc,EAAE,CAAC;IACxB,CAAC;IAED;;;;;;OAMG;IACK,mBAAmB,CAAC,WAA6C;QACvE,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,KAAK,GAAG,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAChE,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,KAAK,KAAK,IAAI,IAAI,GAAG,GAAG,KAAK,CAAC,UAAU,IAAI,uCAAuC,CAAC,EAAE,CAAC;YAC1G,IAAI,CAAC,mBAAmB,CAAC,WAAW,CAAC,CAAC;YACtC,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,WAAW,CAAC,MAAM,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;YACnG,OAAO;QACT,CAAC;QACD,KAAK,CAAC,OAAO,GAAG,WAAW,CAAC,CAAC,gCAAgC;QAC7D,IAAI,KAAK,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;YACzB,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,UAAU,GAAG,uCAAuC,GAAG,GAAG,CAAC,CAAC;YAC3F,KAAK,CAAC,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC5B,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC;gBACnB,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;gBAC9B,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC;gBACrB,IAAI,OAAO,EAAE,CAAC;oBACZ,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;oBAC9B,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;gBACpC,CAAC;YACH,CAAC,EAAE,IAAI,CAAC,CAAC;QACX,CAAC;IACH,CAAC;IAED,mGAAmG;IAC3F,mBAAmB,CAAC,WAA6C;QACvE,IAAI,CAAC,OAAO,EAAE,eAAe,CAC3B,4CAA4C,WAAW,CAAC,KAAK,IAAI,WAAW,CAAC,MAAM,IAAI;YACvF,0EAA0E;YAC1E,4CAA4C,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC;IACvE,CAAC;IAED,0FAA0F;IAClF,yBAAyB;QAC/B,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,oBAAoB,CAAC,MAAM,EAAE,EAAE,CAAC;YACvD,IAAI,KAAK,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;gBACzB,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC;QACD,IAAI,CAAC,oBAAoB,CAAC,KAAK,EAAE,CAAC;IACpC,CAAC;IAED;;;;OAIG;IACK,KAAK,CAAC,mBAAmB;QAC/B,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC;QACzB,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO;QACT,CAAC;QACD,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,IAAI,GAAG,gBAAgB,GAAG,CAAC,kBAAkB,EAAE,IAAI,GAAG,CAAC,kBAAkB,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;QAC9H,MAAM,UAAU,GAAG,MAAM,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;QACvE,IAAI,UAAU,EAAE,CAAC;YACf,GAAG,CAAC,eAAe,CAAC,kEAAkE,IAAI,GAAG,CAAC,CAAC;QACjG,CAAC;IACH,CAAC;IAED;;;;OAIG;IACI,cAAc,CAAC,QAAgB,EAAE,QAAgB;QACtD,IAAI,MAAc,CAAC;QACnB,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACxD,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,wBAAwB,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACpE,CAAC;QACD,8FAA8F;QAC9F,4FAA4F;QAC5F,0FAA0F;QAC1F,8FAA8F;QAC9F,gGAAgG;QAChG,6FAA6F;QAC7F,IAAI,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC;YAC1B,KAAK,IAAI,CAAC,0BAA0B,EAAE,CAAC;QACzC,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,oFAAoF;IACpE,cAAc;QAC5B,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;IAC7B,CAAC;IAED;;;;;OAKG;IACa,YAAY,CAAC,SAAiB;QAC5C,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;IAC5C,CAAC;IAED;;;;OAIG;IACa,gBAAgB;QAC9B,IAAI,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC;YACzB,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;QAC1B,CAAC;IACH,CAAC;IAEe,OAAO;QACrB,IAAI,CAAC,4BAA4B,EAAE,CAAC;QACpC,IAAI,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC;QACzB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,IAAI,CAAC,eAAe,EAAE,WAAW,EAAE,CAAC;QACpC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAC5B,IAAI,CAAC,yBAAyB,GAAG,IAAI,CAAC;QACtC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,yCAAyC;IAC5D,CAAC;IAED,gGAAgG;IACxF,cAAc;QACpB,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACnC,GAAG,CAAC,WAAW,EAAE,CAAC;QACpB,CAAC;QACD,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;QACtB,IAAI,CAAC,yBAAyB,EAAE,CAAC;QACjC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;;AA1bU,yBAAyB;IADrC,aAAa,CAAC,yBAAyB,EAAE,2BAA2B,CAAC;GACzD,yBAAyB,CA2brC;;AAED;;;;;GAKG;AACH,MAAM,UAAU,6BAA6B;IAC3C,uEAAuE;AACzE,CAAC","sourcesContent":["import type { Type } from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport { RegisterClass } from '@memberjunction/global';\nimport { CHANNEL_INBOUND_VIDEO_TRACK, RealtimeToolDefinition, RealtimeTrack, RealtimeTrackDescriptor } from '@memberjunction/ai';\nimport { ChannelInboundVideoBridge, IChannelFrameProvider } from '@memberjunction/ai-realtime-client';\nimport { BaseRealtimeChannelClient, ChannelOnboardingDetails } from '@memberjunction/realtime-runtime';\nimport {\n ApplyWhiteboardAgentTool, BuildWhiteboardExportSvg, RealtimeWhiteboardHostComponent, WHITEBOARD_TOOL_DEFINITIONS,\n WHITEBOARD_TOOL_PREFIX, WhiteboardState, WhiteboardWidgetInteractionEvent, WhiteboardWidgetSubmitEvent\n} from '@memberjunction/ng-whiteboard';\n\n/**\n * Whether a whiteboard tool result reports success.\n *\n * `ApplyWhiteboardAgentTool` returns a JSON `WhiteboardToolResult` string — `{ success: true, … }`\n * or `{ success: false, error }` — for every tool and every failure path. Anything that does not\n * parse as an object with `success === true` is treated as NOT a successful mutation, which is the\n * safe direction: the cost of missing a confirmation frame is one stale picture until the next\n * change, while the cost of a false one is telling the model an edit landed when it did not.\n */\nfunction toolSucceeded(result: string): boolean {\n try {\n const parsed: unknown = JSON.parse(result);\n return parsed !== null && typeof parsed === 'object' && (parsed as { success?: unknown }).success === true;\n } catch {\n // A non-JSON result cannot be confirmed as a mutation — the host returned something this\n // channel does not understand, so it does not get a \"your change is on screen\" note.\n return false;\n }\n}\n\n/**\n * Asynchronously rasterizes an SVG string to a JPEG base64 string (without the `data:image/jpeg;base64,` prefix)\n * using an offscreen canvas. Returns null in non-DOM environments or when rendering fails.\n */\nexport async function rasterizeSvgToJpegBase64(svg: string, width = 1280, height = 720): Promise<string | null> {\n if (typeof document === 'undefined' || typeof Image === 'undefined') {\n return null;\n }\n return new Promise<string | null>((resolve) => {\n let url: string | null = null;\n let timer: ReturnType<typeof setTimeout> | null = null;\n\n const cleanup = () => {\n if (timer != null) {\n clearTimeout(timer);\n timer = null;\n }\n if (url) {\n URL.revokeObjectURL(url);\n url = null;\n }\n };\n\n try {\n const img = new Image();\n const svgBlob = new Blob([svg], { type: 'image/svg+xml;charset=utf-8' });\n url = URL.createObjectURL(svgBlob);\n\n // Capped wait: resolve null and revoke URL if the Image never fires onload or onerror (item 61)\n timer = setTimeout(() => {\n console.error('[RealtimeWhiteboardChannel] SVG rasterization timed out after 5000ms');\n cleanup();\n resolve(null);\n }, 5000);\n\n img.onload = () => {\n try {\n const canvas = document.createElement('canvas');\n canvas.width = width;\n canvas.height = height;\n const ctx = canvas.getContext('2d');\n if (!ctx) {\n cleanup();\n resolve(null);\n return;\n }\n ctx.fillStyle = '#ffffff';\n ctx.fillRect(0, 0, width, height);\n ctx.drawImage(img, 0, 0, width, height);\n cleanup();\n const dataUrl = canvas.toDataURL('image/jpeg', 0.85);\n const comma = dataUrl.indexOf(',');\n resolve(comma >= 0 ? dataUrl.slice(comma + 1) : dataUrl);\n } catch (err) {\n console.error('[RealtimeWhiteboardChannel] Failed to rasterize SVG canvas to JPEG:', err);\n cleanup();\n resolve(null);\n }\n };\n img.onerror = (err) => {\n console.error('[RealtimeWhiteboardChannel] Failed to load SVG image for rasterization:', err);\n cleanup();\n resolve(null);\n };\n img.src = url;\n } catch (err) {\n console.error('[RealtimeWhiteboardChannel] Failed to initialize SVG rasterization:', err);\n cleanup();\n resolve(null);\n }\n });\n}\n\n/**\n * Per-widget throttle window for AMBIENT interaction context notes: at most one note per\n * widget per this many ms — within the window the LATEST summary wins (chatty widgets\n * collapse to one trailing-edge note instead of flooding the model's context).\n */\nexport const WHITEBOARD_INTERACTION_NOTE_THROTTLE_MS = 4000;\n\n/** Per-widget ambient-note throttle bookkeeping. */\ninterface InteractionThrottleEntry {\n /** When this widget's last ambient note was sent (epoch ms). */\n LastSentAt: number;\n /** Trailing-edge timer for a deferred note, or null when the window is idle. */\n Timer: ReturnType<typeof setTimeout> | null;\n /** The latest event received within the open window (sent when the timer fires). */\n Pending: WhiteboardWidgetInteractionEvent | null;\n}\n\n/**\n * The LIVE WHITEBOARD as a pluggable interactive channel — the canonical\n * {@link BaseRealtimeChannelClient} implementation, resolved from the `MJ: AI Agent\n * Channels` registry row whose `ClientPluginClass` is `'RealtimeWhiteboardChannel'`.\n *\n * One instance per session (created via ClassFactory at session start). It owns the\n * board's {@link WhiteboardState} engine and contributes the channel's full contract:\n *\n * - **Action**: the `Whiteboard_*` client-executed tool set\n * ({@link WHITEBOARD_TOOL_DEFINITIONS}); {@link ApplyAgentTool} prefers the BOUND host\n * component (board mutation + violet pop-in / toast / presence-cursor garnish) and\n * falls back to the pure {@link ApplyWhiteboardAgentTool} engine call when no surface\n * is bound (e.g. the surface panel is collapsed) — the channel keeps working, just\n * without the garnish.\n * - **Perception**: {@link BindSurface} subscribes the host's coalesced (750 ms)\n * `SceneDelta` stream and pipes each delta into the live model's context as a\n * `[whiteboard]` background note; the agent-undo toast click flows the same way.\n * - **Surface**: {@link RealtimeWhiteboardHostComponent}, created dynamically by the\n * overlay's channel tab; the host's Focus toggle rides `Context.SetFocusMode` so the\n * shell can collapse/restore the main call column.\n * - **State of record**: every board mutation (user edits AND agent tool calls) requests\n * a save of {@link WhiteboardState.ToJSON} under channel name `'Whiteboard'` — the\n * host debounces and flushes at teardown.\n *\n * A PRIOR session's persisted board is restored through {@link RestoreState} (invoked by\n * the session host after Initialize, before any surface binding): the saved JSON is\n * rehydrated IN PLACE into the same {@link WhiteboardState} instance, so the save\n * subscription and any later surface binding keep pointing at one engine. Malformed or\n * incompatible payloads are tolerated — the board simply starts fresh.\n */\n@RegisterClass(BaseRealtimeChannelClient, 'RealtimeWhiteboardChannel')\nexport class RealtimeWhiteboardChannel extends BaseRealtimeChannelClient<RealtimeWhiteboardHostComponent> implements IChannelFrameProvider {\n /** The board's state of record — created fresh with the plugin (one per session). */\n public readonly State = new WhiteboardState();\n\n /** The live bound surface, when the channel tab's pane is instantiated. */\n private host: RealtimeWhiteboardHostComponent | null = null;\n /** Output subscriptions on the bound surface (SceneDelta / AgentUndo / FocusModeChange). */\n private surfaceSubs: Subscription[] = [];\n /** Board-mutation subscription driving the debounced state-of-record save. */\n private stateChangedSub: Subscription | null = null;\n /** Per-widget ambient-interaction note throttles (ItemID → window state). */\n private interactionThrottles = new Map<string, InteractionThrottleEntry>();\n /** Shared video bridge streaming board frames to the model when the model supports inbound video. */\n private videoBridge: ChannelInboundVideoBridge | null = null;\n /** Pacing timestamp for event-driven visual scene pushes (enforces max 1 fps). */\n private lastPushTimestamp = 0;\n\n public get ChannelName(): string {\n return 'Whiteboard';\n }\n\n /**\n * Sourced tracks: Whiteboard can source inbound video to the model when the model supports it.\n */\n public override GetSourcedTracks(): readonly RealtimeTrackDescriptor[] {\n return [CHANNEL_INBOUND_VIDEO_TRACK];\n }\n\n /**\n * Produces the latest visual scene as a base64-encoded frame for the video bridge.\n * Renders the whiteboard SVG into an offscreen canvas and returns base64 JPEG.\n */\n public async GetLatestFrame(): Promise<string | null> {\n if (!this.State) {\n return null;\n }\n try {\n const svg = BuildWhiteboardExportSvg(this.State);\n return await rasterizeSvgToJpegBase64(svg);\n } catch (err) {\n console.error('[RealtimeWhiteboardChannel] Failed to export whiteboard frame:', err);\n return null;\n }\n }\n\n private static readonly WHITEBOARD_DEFAULT_CADENCE_MS = 1000;\n private static readonly WHITEBOARD_MIN_CADENCE_MS = 250;\n\n // NO liveness heartbeat here, deliberately. This channel is 100% CHANGE-DRIVEN: the only thing\n // that pushes a frame is a board mutation. A periodic keep-alive would have to be driven by its\n // own always-on interval — this channel does no work at all while the board is idle, and\n // resurrecting it every 15 seconds to re-send an unchanged picture is a cost with no shown\n // benefit. (It also cannot be smuggled in via the mutation path: a 15s elapsed-check inside\n // onUserMutation only runs when a mutation arrives, so on an idle board it is never evaluated —\n // which is exactly what the constant this replaced did.) If the inbound video track ever needs\n // keep-alive frames, that belongs on the track or the bridge, once, not per channel.\n\n /** Trailing timer to deliver the settled resting frame after rapid user drawing/edits. */\n private whiteboardTrailingTimer: ReturnType<typeof setTimeout> | null = null;\n /** Last base64 JPEG frame pushed to the bridge, used for deduplication. */\n private lastPushedWhiteboardFrame: string | null = null;\n\n /** Cancels any active trailing-edge settle timer and clears the handle. */\n private clearWhiteboardTrailingTimer(): void {\n if (this.whiteboardTrailingTimer != null) {\n clearTimeout(this.whiteboardTrailingTimer);\n this.whiteboardTrailingTimer = null;\n }\n }\n\n /**\n * Resolves the effective push cadence in milliseconds based on the negotiated inbound video track.\n * Defaults to 1000ms (1 fps ceiling for Gemini Live), but clamps down to a minimum of 250ms (4 fps)\n * if the negotiated track specifies a higher `Rate`.\n */\n private getNegotiatedVideoCadenceMs(): number {\n const client = this.Context?.Client;\n if (!client) {\n return RealtimeWhiteboardChannel.WHITEBOARD_DEFAULT_CADENCE_MS;\n }\n const tracks: readonly RealtimeTrack[] = client.EstablishedTracks;\n const videoTrack = tracks?.find(\n (t: RealtimeTrack) =>\n t.Descriptor.Modality === 'video' &&\n t.Descriptor.Direction === 'inbound'\n );\n const rate = videoTrack?.Descriptor.Rate;\n if (typeof rate === 'number' && rate > 0) {\n return Math.max(\n RealtimeWhiteboardChannel.WHITEBOARD_MIN_CADENCE_MS,\n Math.floor(1000 / rate)\n );\n }\n return RealtimeWhiteboardChannel.WHITEBOARD_DEFAULT_CADENCE_MS;\n }\n\n /**\n * Pushes a frame to the video bridge, updating timestamp and deduplication cache.\n */\n private pushWhiteboardFrame(frame: string): void {\n this.lastPushTimestamp = Date.now();\n this.lastPushedWhiteboardFrame = frame;\n this.ensureVideoBridge()?.PushFrame(frame);\n }\n\n /**\n * Pushes the latest board visual scene when user mutations occur, with dynamic pacing,\n * deduplication, and a trailing-edge settle timer so the model sees the final resting state.\n */\n private async onUserMutation(): Promise<void> {\n try {\n const bridge = this.ensureVideoBridge();\n if (!bridge || !this.Context?.Client?.IsTrackEstablished('video', 'inbound')) {\n return;\n }\n\n const now = Date.now();\n const cadenceMs = this.getNegotiatedVideoCadenceMs();\n const elapsed = now - this.lastPushTimestamp;\n\n if (elapsed >= cadenceMs) {\n this.clearWhiteboardTrailingTimer();\n const frame = await this.GetLatestFrame();\n if (!frame) {\n return;\n }\n if (frame !== this.lastPushedWhiteboardFrame) {\n this.pushWhiteboardFrame(frame);\n }\n } else {\n // Within cooldown window: schedule trailing settle timer if not already armed.\n if (!this.whiteboardTrailingTimer) {\n const delay = Math.max(0, cadenceMs - elapsed);\n this.whiteboardTrailingTimer = setTimeout(async () => {\n this.whiteboardTrailingTimer = null;\n try {\n if (!this.Context?.Client?.IsTrackEstablished('video', 'inbound')) {\n return;\n }\n const frame = await this.GetLatestFrame();\n if (!frame) {\n return;\n }\n if (frame !== this.lastPushedWhiteboardFrame) {\n this.pushWhiteboardFrame(frame);\n }\n } catch (err) {\n console.error('[RealtimeWhiteboardChannel] Error in whiteboard trailing settle timer:', err);\n }\n }, delay);\n }\n }\n } catch (err) {\n console.error('[RealtimeWhiteboardChannel] Error in onUserMutation:', err);\n }\n }\n\n /**\n * Pushes exactly ONE confirmation frame after an agent tool mutates the board, and\n * informs the model context so it does not loop narrating its own change.\n */\n private async pushAgentConfirmationFrame(): Promise<void> {\n try {\n const bridge = this.ensureVideoBridge();\n if (!bridge || !this.Context?.Client?.IsTrackEstablished('video', 'inbound')) {\n return;\n }\n this.clearWhiteboardTrailingTimer();\n const frame = await this.GetLatestFrame();\n if (frame) {\n this.pushWhiteboardFrame(frame);\n this.Context?.SendContextNote(\n '[whiteboard] visual confirmation of your action (background — do NOT narrate or announce your own change; continue naturally)'\n );\n }\n } catch (err) {\n console.error('[RealtimeWhiteboardChannel] Error in pushAgentConfirmationFrame:', err);\n }\n }\n\n public get ToolNamePrefix(): string {\n return WHITEBOARD_TOOL_PREFIX;\n }\n\n public get TabTitle(): string {\n return 'Whiteboard';\n }\n\n public get TabIcon(): string {\n return 'fa-solid fa-chalkboard';\n }\n\n public GetToolDefinitions(): RealtimeToolDefinition[] {\n return WHITEBOARD_TOOL_DEFINITIONS;\n }\n\n public override GetSurfaceComponent(): Type<RealtimeWhiteboardHostComponent> {\n return RealtimeWhiteboardHostComponent;\n }\n\n /** First-run intro shown the first time the user opens the Whiteboard tab (once per user). */\n public override GetOnboardingDetails(): ChannelOnboardingDetails {\n return {\n Heading: 'Whiteboard',\n Description:\n 'A shared canvas the agent can sketch, write and annotate on live during the call — ' +\n 'whatever it draws appears here instantly, and anything you add is something it can see too.',\n Tips: [\n 'Watch the board fill in as you talk — the agent updates it in real time.',\n 'Add your own notes or shapes; the agent perceives your edits and can build on them.',\n 'Use Focus to give the board the whole screen, and save it to artifacts to keep it.'\n ],\n IconClass: 'fa-solid fa-chalkboard'\n };\n }\n\n /** Persist the board (host-debounced) on EVERY board mutation — user edits AND agent tools. */\n protected override OnInitialize(): void {\n this.stateChangedSub?.unsubscribe();\n this.clearWhiteboardTrailingTimer();\n this.stateChangedSub = this.State.Changed$.subscribe((change) => {\n this.Context?.RequestSave(this.State.ToJSON());\n // Only user edits (and scene replacements like undo) drive the user settle-debounce pipeline.\n // Agent edits are confirmed with a single frame in ApplyAgentTool.\n if (change.Author === 'user' || change.Op === 'replace') {\n void this.onUserMutation();\n }\n });\n this.ensureVideoBridge();\n }\n\n public override OnSessionStarted(): void {\n this.ensureVideoBridge();\n }\n\n private ensureVideoBridge(): ChannelInboundVideoBridge | null {\n if (!this.videoBridge && this.Context) {\n this.videoBridge = new ChannelInboundVideoBridge(() => this.Context?.Client, this);\n }\n if (this.videoBridge && !this.videoBridge.IsActive && this.Context?.Client?.IsTrackEstablished('video', 'inbound')) {\n this.videoBridge.Start?.();\n }\n return this.videoBridge;\n }\n\n /**\n * Wires the dynamically-created board host: inputs (shared state engine + agent name)\n * are set BEFORE the component's first change detection, and the perception/garnish\n * outputs are subscribed back into the host context — the overlay never sees any of it.\n */\n public BindSurface(instance: RealtimeWhiteboardHostComponent): void {\n this.ensureVideoBridge();\n this.releaseSurface();\n this.host = instance;\n instance.State = this.State;\n instance.AgentName = this.Context?.AgentName ?? 'Agent';\n this.surfaceSubs.push(\n // The board's coalesced scene delta — the perception feed the agent \"sees\".\n instance.SceneDelta.subscribe((deltaJson: string) => {\n // Background PERCEPTION, not conversation: the model sees every user edit without\n // being told, but must not narrate minor changes — only react when something is\n // significant (or when asked). The etiquette rides in the note itself so any\n // realtime model gets it regardless of system-prompt sync state.\n this.Context?.SendContextNote(\n '[whiteboard] board update (background context — do NOT comment on minor edits; ' +\n 'only mention it if the change is significant to the discussion): ' + deltaJson);\n }),\n // The user clicked Undo on the agent-action toast (the undo already applied locally).\n instance.AgentUndo.subscribe(() => {\n this.Context?.SendContextNote('[whiteboard] user undid your last change');\n }),\n // A sandboxed HTML widget submitted user input (MJWhiteboard.submit) — already\n // validated, size-capped and not canceled (the host's cancelable WidgetSubmitting\n // event ran first). Surface it to the agent so it can react to quiz answers /\n // micro-form input it asked for.\n instance.WidgetSubmitted.subscribe((submit: WhiteboardWidgetSubmitEvent) => {\n // Durable awareness first (the note persists in the model's context)…\n this.Context?.SendContextNote(\n `[whiteboard] the user submitted input in widget \"${submit.Title || submit.ItemID}\": ${submit.DataJson}`);\n // …then make the model REACT — a submission is explicit user input the user is\n // waiting on; without this trigger, SendContextNote alone produces dead silence\n // (\"I clicked Submit and nothing happened\").\n this.Context?.RequestSpokenResponse?.(\n `The user just submitted input in the whiteboard widget \"${submit.Title || submit.ItemID}\": ${submit.DataJson}. ` +\n `React to it now in your own voice — acknowledge their choice and continue naturally.`);\n }),\n // AMBIENT widget telemetry (the injected recorder, NOT widget-authored script):\n // clicks / changes / typing summarized by the board. Pure background perception —\n // throttled per widget so chatty widgets don't flood the model's context, and framed\n // with do-not-respond etiquette (explicit MJWhiteboard.submit input arrives above).\n instance.WidgetInteraction.subscribe((interaction: WhiteboardWidgetInteractionEvent) => {\n this.onWidgetInteraction(interaction);\n }),\n // The board's Focus toggle — ask the shell to collapse/restore the main call column.\n instance.FocusModeChange.subscribe((focused: boolean) => {\n this.Context?.SetFocusMode(focused);\n }),\n // \"Save to artifacts\": snapshot the board as a first-class versioned artifact.\n instance.SaveToArtifactsRequested.subscribe(() => {\n void this.saveBoardAsArtifact();\n })\n );\n }\n\n public override UnbindSurface(): void {\n this.releaseSurface();\n }\n\n /**\n * Routes one ambient widget-interaction batch to the agent as a throttled background\n * context note: outside an open window the note goes out immediately and opens a\n * {@link WHITEBOARD_INTERACTION_NOTE_THROTTLE_MS} window; within the window the LATEST\n * event is stashed and a trailing-edge timer sends it when the window closes (one note\n * per widget per window, latest summary wins).\n */\n private onWidgetInteraction(interaction: WhiteboardWidgetInteractionEvent): void {\n const now = Date.now();\n const entry = this.interactionThrottles.get(interaction.ItemID);\n if (!entry || (entry.Timer === null && now - entry.LastSentAt >= WHITEBOARD_INTERACTION_NOTE_THROTTLE_MS)) {\n this.sendInteractionNote(interaction);\n this.interactionThrottles.set(interaction.ItemID, { LastSentAt: now, Timer: null, Pending: null });\n return;\n }\n entry.Pending = interaction; // latest wins within the window\n if (entry.Timer === null) {\n const wait = Math.max(0, entry.LastSentAt + WHITEBOARD_INTERACTION_NOTE_THROTTLE_MS - now);\n entry.Timer = setTimeout(() => {\n entry.Timer = null;\n const pending = entry.Pending;\n entry.Pending = null;\n if (pending) {\n entry.LastSentAt = Date.now();\n this.sendInteractionNote(pending);\n }\n }, wait);\n }\n }\n\n /** The ambient-note framing: background etiquette rides in the note itself (like scene deltas). */\n private sendInteractionNote(interaction: WhiteboardWidgetInteractionEvent): void {\n this.Context?.SendContextNote(\n `[whiteboard] ambient activity in widget \"${interaction.Title || interaction.ItemID}\" ` +\n '(background — do NOT respond unless it is significant or you are asked; ' +\n `explicit submissions arrive separately): ${interaction.Summary}`);\n }\n\n /** Cancels all pending ambient-note timers and resets the per-widget throttle windows. */\n private clearInteractionThrottles(): void {\n for (const entry of this.interactionThrottles.values()) {\n if (entry.Timer !== null) {\n clearTimeout(entry.Timer);\n }\n }\n this.interactionThrottles.clear();\n }\n\n /**\n * Persists the current board as a `MJ: Artifacts` snapshot via the host context\n * (best-effort; the host logs failures). On success the agent is told via a context\n * note so it can reference the saved artifact naturally.\n */\n private async saveBoardAsArtifact(): Promise<void> {\n const ctx = this.Context;\n if (!ctx) {\n return;\n }\n const now = new Date();\n const name = `Whiteboard — ${now.toLocaleDateString()} ${now.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' })}`;\n const artifactId = await ctx.SaveAsArtifact(name, this.State.ToJSON());\n if (artifactId) {\n ctx.SendContextNote(`[whiteboard] the user saved the current board as the artifact \"${name}\"`);\n }\n }\n\n /**\n * Executes one `Whiteboard_*` tool call LOCALLY. Prefers the live bound host (board\n * mutation + UI garnish); falls back to the pure engine function when no surface is\n * bound so the channel keeps working with the pane collapsed.\n */\n public ApplyAgentTool(toolName: string, argsJson: string): string {\n let result: string;\n if (this.host) {\n result = this.host.ApplyAgentTool(toolName, argsJson);\n } else {\n result = ApplyWhiteboardAgentTool(this.State, toolName, argsJson);\n }\n // A SUCCESSFUL agent tool triggers exactly ONE immediate visual confirmation frame and a note\n // telling the model not to narrate its own change. A FAILED one must trigger neither: every\n // failure path returns `{ success: false, error }` (bad JSON args, unknown tool, per-tool\n // validation), and confirming it would tell the model its edit landed AND instruct it to stay\n // quiet about it — so the failure would vanish from the user's view while the model carried on.\n // It would also push a frame identical to the last one, since a failed tool changes nothing.\n if (toolSucceeded(result)) {\n void this.pushAgentConfirmationFrame();\n }\n return result;\n }\n\n /** The board's serialized state of record (persisted under {@link ChannelName}). */\n public override SerializeState(): string | null {\n return this.State.ToJSON();\n }\n\n /**\n * Rehydrates a prior session's saved board into THIS session's state engine (in place —\n * the {@link State} instance and its subscriptions are preserved). Returns `true` on\n * success; malformed / incompatible JSON returns `false` and the board stays fresh\n * (never throws — {@link WhiteboardState.LoadFromJSON} is tolerant by contract).\n */\n public override RestoreState(stateJson: string): boolean {\n return this.State.LoadFromJSON(stateJson);\n }\n\n /**\n * Exit focus mode THROUGH the bound host (its own Focus button state stays in sync; it\n * re-emits `FocusModeChange(false)` → `Context.SetFocusMode(false)`). When no surface is\n * bound the overlay's defensive flag clear covers it.\n */\n public override RequestFocusExit(): void {\n if (this.host?.FocusMode) {\n this.host.ToggleFocus();\n }\n }\n\n public override Dispose(): void {\n this.clearWhiteboardTrailingTimer();\n this.videoBridge?.Stop();\n this.videoBridge = null;\n this.stateChangedSub?.unsubscribe();\n this.stateChangedSub = null;\n this.lastPushedWhiteboardFrame = null;\n super.Dispose(); // releases the surface binding + context\n }\n\n /** Unsubscribes surface outputs, cancels pending ambient notes and drops the host reference. */\n private releaseSurface(): void {\n for (const sub of this.surfaceSubs) {\n sub.unsubscribe();\n }\n this.surfaceSubs = [];\n this.clearInteractionThrottles();\n this.host = null;\n }\n}\n\n/**\n * Tree-shaking prevention: the whiteboard channel is resolved dynamically through the\n * ClassFactory (by the registry row's `ClientPluginClass` key), so this static call is\n * what keeps its `@RegisterClass` side effect from being eliminated by the bundler.\n * Called by `RealtimeSessionService` alongside the realtime-client driver Load calls.\n */\nexport function LoadRealtimeWhiteboardChannel(): void {\n // intentional no-op — the import side effect performs the registration\n}\n"]}
1
+ {"version":3,"file":"whiteboard-channel.js","sourceRoot":"","sources":["../../../../../src/lib/components/realtime/whiteboard/whiteboard-channel.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Type } from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport { RegisterClass } from '@memberjunction/global';\nimport { CHANNEL_INBOUND_VIDEO_TRACK, RealtimeToolDefinition, RealtimeTrack, RealtimeTrackDescriptor } from '@memberjunction/ai';\nimport { ChannelInboundVideoBridge, IChannelFrameProvider } from '@memberjunction/ai-realtime-client';\nimport { BaseRealtimeChannelClient, ChannelOnboardingDetails } from '@memberjunction/realtime-runtime';\nimport {\n ApplyWhiteboardAgentTool, BuildWhiteboardExportSvg, RealtimeWhiteboardHostComponent, WHITEBOARD_TOOL_DEFINITIONS,\n WHITEBOARD_TOOL_PREFIX, WhiteboardState, WhiteboardWidgetInteractionEvent, WhiteboardWidgetSubmitEvent\n} from '@memberjunction/ng-whiteboard';\n\n/**\n * Whether a whiteboard tool result reports success.\n *\n * `ApplyWhiteboardAgentTool` returns a JSON `WhiteboardToolResult` string — `{ success: true, … }`\n * or `{ success: false, error }` — for every tool and every failure path. Anything that does not\n * parse as an object with `success === true` is treated as NOT a successful mutation, which is the\n * safe direction: the cost of missing a confirmation frame is one stale picture until the next\n * change, while the cost of a false one is telling the model an edit landed when it did not.\n */\nfunction toolSucceeded(result: string): boolean {\n try {\n const parsed: unknown = JSON.parse(result);\n return parsed !== null && typeof parsed === 'object' && (parsed as { success?: unknown }).success === true;\n } catch {\n // A non-JSON result cannot be confirmed as a mutation — the host returned something this\n // channel does not understand, so it does not get a \"your change is on screen\" note.\n return false;\n }\n}\n\n/**\n * Asynchronously rasterizes an SVG string to a JPEG base64 string (without the `data:image/jpeg;base64,` prefix)\n * using an offscreen canvas. Returns null in non-DOM environments or when rendering fails.\n */\nexport async function RasterizeSvgToJpegBase64(svg: string, width = 1280, height = 720): Promise<string | null> {\n if (typeof document === 'undefined' || typeof Image === 'undefined') {\n return null;\n }\n return new Promise<string | null>((resolve) => {\n let url: string | null = null;\n let timer: ReturnType<typeof setTimeout> | null = null;\n\n const cleanup = () => {\n if (timer != null) {\n clearTimeout(timer);\n timer = null;\n }\n if (url) {\n URL.revokeObjectURL(url);\n url = null;\n }\n };\n\n try {\n const img = new Image();\n const svgBlob = new Blob([svg], { type: 'image/svg+xml;charset=utf-8' });\n url = URL.createObjectURL(svgBlob);\n\n // Capped wait: resolve null and revoke URL if the Image never fires onload or onerror (item 61)\n timer = setTimeout(() => {\n console.error('[RealtimeWhiteboardChannel] SVG rasterization timed out after 5000ms');\n cleanup();\n resolve(null);\n }, 5000);\n\n img.onload = () => {\n try {\n const canvas = document.createElement('canvas');\n canvas.width = width;\n canvas.height = height;\n const ctx = canvas.getContext('2d');\n if (!ctx) {\n cleanup();\n resolve(null);\n return;\n }\n ctx.fillStyle = '#ffffff';\n ctx.fillRect(0, 0, width, height);\n ctx.drawImage(img, 0, 0, width, height);\n cleanup();\n const dataUrl = canvas.toDataURL('image/jpeg', 0.85);\n const comma = dataUrl.indexOf(',');\n resolve(comma >= 0 ? dataUrl.slice(comma + 1) : dataUrl);\n } catch (err) {\n console.error('[RealtimeWhiteboardChannel] Failed to rasterize SVG canvas to JPEG:', err);\n cleanup();\n resolve(null);\n }\n };\n img.onerror = (err) => {\n console.error('[RealtimeWhiteboardChannel] Failed to load SVG image for rasterization:', err);\n cleanup();\n resolve(null);\n };\n img.src = url;\n } catch (err) {\n console.error('[RealtimeWhiteboardChannel] Failed to initialize SVG rasterization:', err);\n cleanup();\n resolve(null);\n }\n });\n}\n\n/**\n * Per-widget throttle window for AMBIENT interaction context notes: at most one note per\n * widget per this many ms — within the window the LATEST summary wins (chatty widgets\n * collapse to one trailing-edge note instead of flooding the model's context).\n */\nexport const WHITEBOARD_INTERACTION_NOTE_THROTTLE_MS = 4000;\n\n/** Per-widget ambient-note throttle bookkeeping. */\ninterface InteractionThrottleEntry {\n /** When this widget's last ambient note was sent (epoch ms). */\n LastSentAt: number;\n /** Trailing-edge timer for a deferred note, or null when the window is idle. */\n Timer: ReturnType<typeof setTimeout> | null;\n /** The latest event received within the open window (sent when the timer fires). */\n Pending: WhiteboardWidgetInteractionEvent | null;\n}\n\n/**\n * The LIVE WHITEBOARD as a pluggable interactive channel — the canonical\n * {@link BaseRealtimeChannelClient} implementation, resolved from the `MJ: AI Agent\n * Channels` registry row whose `ClientPluginClass` is `'RealtimeWhiteboardChannel'`.\n *\n * One instance per session (created via ClassFactory at session start). It owns the\n * board's {@link WhiteboardState} engine and contributes the channel's full contract:\n *\n * - **Action**: the `Whiteboard_*` client-executed tool set\n * ({@link WHITEBOARD_TOOL_DEFINITIONS}); {@link ApplyAgentTool} prefers the BOUND host\n * component (board mutation + violet pop-in / toast / presence-cursor garnish) and\n * falls back to the pure {@link ApplyWhiteboardAgentTool} engine call when no surface\n * is bound (e.g. the surface panel is collapsed) — the channel keeps working, just\n * without the garnish.\n * - **Perception**: {@link BindSurface} subscribes the host's coalesced (750 ms)\n * `SceneDelta` stream and pipes each delta into the live model's context as a\n * `[whiteboard]` background note; the agent-undo toast click flows the same way.\n * - **Surface**: {@link RealtimeWhiteboardHostComponent}, created dynamically by the\n * overlay's channel tab; the host's Focus toggle rides `Context.SetFocusMode` so the\n * shell can collapse/restore the main call column.\n * - **State of record**: every board mutation (user edits AND agent tool calls) requests\n * a save of {@link WhiteboardState.ToJSON} under channel name `'Whiteboard'` — the\n * host debounces and flushes at teardown.\n *\n * A PRIOR session's persisted board is restored through {@link RestoreState} (invoked by\n * the session host after Initialize, before any surface binding): the saved JSON is\n * rehydrated IN PLACE into the same {@link WhiteboardState} instance, so the save\n * subscription and any later surface binding keep pointing at one engine. Malformed or\n * incompatible payloads are tolerated — the board simply starts fresh.\n */\n@RegisterClass(BaseRealtimeChannelClient, 'RealtimeWhiteboardChannel')\nexport class RealtimeWhiteboardChannel extends BaseRealtimeChannelClient<RealtimeWhiteboardHostComponent> implements IChannelFrameProvider {\n /** The board's state of record — created fresh with the plugin (one per session). */\n public readonly State = new WhiteboardState();\n\n /** The live bound surface, when the channel tab's pane is instantiated. */\n private host: RealtimeWhiteboardHostComponent | null = null;\n /** Output subscriptions on the bound surface (SceneDelta / AgentUndo / FocusModeChange). */\n private surfaceSubs: Subscription[] = [];\n /** Board-mutation subscription driving the debounced state-of-record save. */\n private stateChangedSub: Subscription | null = null;\n /** Per-widget ambient-interaction note throttles (ItemID → window state). */\n private interactionThrottles = new Map<string, InteractionThrottleEntry>();\n /** Shared video bridge streaming board frames to the model when the model supports inbound video. */\n private videoBridge: ChannelInboundVideoBridge | null = null;\n /** Pacing timestamp for event-driven visual scene pushes (enforces max 1 fps). */\n private lastPushTimestamp = 0;\n\n public get ChannelName(): string {\n return 'Whiteboard';\n }\n\n /**\n * Sourced tracks: Whiteboard can source inbound video to the model when the model supports it.\n */\n public override GetSourcedTracks(): readonly RealtimeTrackDescriptor[] {\n return [CHANNEL_INBOUND_VIDEO_TRACK];\n }\n\n /**\n * Produces the latest visual scene as a base64-encoded frame for the video bridge.\n * Renders the whiteboard SVG into an offscreen canvas and returns base64 JPEG.\n */\n public async GetLatestFrame(): Promise<string | null> {\n if (!this.State) {\n return null;\n }\n try {\n const svg = BuildWhiteboardExportSvg(this.State);\n return await RasterizeSvgToJpegBase64(svg);\n } catch (err) {\n console.error('[RealtimeWhiteboardChannel] Failed to export whiteboard frame:', err);\n return null;\n }\n }\n\n private static readonly WHITEBOARD_DEFAULT_CADENCE_MS = 1000;\n private static readonly WHITEBOARD_MIN_CADENCE_MS = 250;\n\n // NO liveness heartbeat here, deliberately. This channel is 100% CHANGE-DRIVEN: the only thing\n // that pushes a frame is a board mutation. A periodic keep-alive would have to be driven by its\n // own always-on interval — this channel does no work at all while the board is idle, and\n // resurrecting it every 15 seconds to re-send an unchanged picture is a cost with no shown\n // benefit. (It also cannot be smuggled in via the mutation path: a 15s elapsed-check inside\n // onUserMutation only runs when a mutation arrives, so on an idle board it is never evaluated —\n // which is exactly what the constant this replaced did.) If the inbound video track ever needs\n // keep-alive frames, that belongs on the track or the bridge, once, not per channel.\n\n /** Trailing timer to deliver the settled resting frame after rapid user drawing/edits. */\n private whiteboardTrailingTimer: ReturnType<typeof setTimeout> | null = null;\n /** Last base64 JPEG frame pushed to the bridge, used for deduplication. */\n private lastPushedWhiteboardFrame: string | null = null;\n\n /** Cancels any active trailing-edge settle timer and clears the handle. */\n private clearWhiteboardTrailingTimer(): void {\n if (this.whiteboardTrailingTimer != null) {\n clearTimeout(this.whiteboardTrailingTimer);\n this.whiteboardTrailingTimer = null;\n }\n }\n\n /**\n * Resolves the effective push cadence in milliseconds based on the negotiated inbound video track.\n * Defaults to 1000ms (1 fps ceiling for Gemini Live), but clamps down to a minimum of 250ms (4 fps)\n * if the negotiated track specifies a higher `Rate`.\n */\n private getNegotiatedVideoCadenceMs(): number {\n const client = this.Context?.Client;\n if (!client) {\n return RealtimeWhiteboardChannel.WHITEBOARD_DEFAULT_CADENCE_MS;\n }\n const tracks: readonly RealtimeTrack[] = client.EstablishedTracks;\n const videoTrack = tracks?.find(\n (t: RealtimeTrack) =>\n t.Descriptor.Modality === 'video' &&\n t.Descriptor.Direction === 'inbound'\n );\n const rate = videoTrack?.Descriptor.Rate;\n if (typeof rate === 'number' && rate > 0) {\n return Math.max(\n RealtimeWhiteboardChannel.WHITEBOARD_MIN_CADENCE_MS,\n Math.floor(1000 / rate)\n );\n }\n return RealtimeWhiteboardChannel.WHITEBOARD_DEFAULT_CADENCE_MS;\n }\n\n /**\n * Pushes a frame to the video bridge, updating timestamp and deduplication cache.\n */\n private pushWhiteboardFrame(frame: string): void {\n this.lastPushTimestamp = Date.now();\n this.lastPushedWhiteboardFrame = frame;\n this.ensureVideoBridge()?.PushFrame(frame);\n }\n\n /**\n * Pushes the latest board visual scene when user mutations occur, with dynamic pacing,\n * deduplication, and a trailing-edge settle timer so the model sees the final resting state.\n */\n private async onUserMutation(): Promise<void> {\n try {\n const bridge = this.ensureVideoBridge();\n if (!bridge || !this.Context?.Client?.IsTrackEstablished('video', 'inbound')) {\n return;\n }\n\n const now = Date.now();\n const cadenceMs = this.getNegotiatedVideoCadenceMs();\n const elapsed = now - this.lastPushTimestamp;\n\n if (elapsed >= cadenceMs) {\n this.clearWhiteboardTrailingTimer();\n const frame = await this.GetLatestFrame();\n if (!frame) {\n return;\n }\n if (frame !== this.lastPushedWhiteboardFrame) {\n this.pushWhiteboardFrame(frame);\n }\n } else {\n // Within cooldown window: schedule trailing settle timer if not already armed.\n if (!this.whiteboardTrailingTimer) {\n const delay = Math.max(0, cadenceMs - elapsed);\n this.whiteboardTrailingTimer = setTimeout(async () => {\n this.whiteboardTrailingTimer = null;\n try {\n if (!this.Context?.Client?.IsTrackEstablished('video', 'inbound')) {\n return;\n }\n const frame = await this.GetLatestFrame();\n if (!frame) {\n return;\n }\n if (frame !== this.lastPushedWhiteboardFrame) {\n this.pushWhiteboardFrame(frame);\n }\n } catch (err) {\n console.error('[RealtimeWhiteboardChannel] Error in whiteboard trailing settle timer:', err);\n }\n }, delay);\n }\n }\n } catch (err) {\n console.error('[RealtimeWhiteboardChannel] Error in onUserMutation:', err);\n }\n }\n\n /**\n * Pushes exactly ONE confirmation frame after an agent tool mutates the board, and\n * informs the model context so it does not loop narrating its own change.\n */\n private async pushAgentConfirmationFrame(): Promise<void> {\n try {\n const bridge = this.ensureVideoBridge();\n if (!bridge || !this.Context?.Client?.IsTrackEstablished('video', 'inbound')) {\n return;\n }\n this.clearWhiteboardTrailingTimer();\n const frame = await this.GetLatestFrame();\n if (frame) {\n this.pushWhiteboardFrame(frame);\n this.Context?.SendContextNote(\n '[whiteboard] visual confirmation of your action (background — do NOT narrate or announce your own change; continue naturally)'\n );\n }\n } catch (err) {\n console.error('[RealtimeWhiteboardChannel] Error in pushAgentConfirmationFrame:', err);\n }\n }\n\n public get ToolNamePrefix(): string {\n return WHITEBOARD_TOOL_PREFIX;\n }\n\n public get TabTitle(): string {\n return 'Whiteboard';\n }\n\n public get TabIcon(): string {\n return 'fa-solid fa-chalkboard';\n }\n\n public GetToolDefinitions(): RealtimeToolDefinition[] {\n return WHITEBOARD_TOOL_DEFINITIONS;\n }\n\n public override GetSurfaceComponent(): Type<RealtimeWhiteboardHostComponent> {\n return RealtimeWhiteboardHostComponent;\n }\n\n /** First-run intro shown the first time the user opens the Whiteboard tab (once per user). */\n public override GetOnboardingDetails(): ChannelOnboardingDetails {\n return {\n Heading: 'Whiteboard',\n Description:\n 'A shared canvas the agent can sketch, write and annotate on live during the call — ' +\n 'whatever it draws appears here instantly, and anything you add is something it can see too.',\n Tips: [\n 'Watch the board fill in as you talk — the agent updates it in real time.',\n 'Add your own notes or shapes; the agent perceives your edits and can build on them.',\n 'Use Focus to give the board the whole screen, and save it to artifacts to keep it.'\n ],\n IconClass: 'fa-solid fa-chalkboard'\n };\n }\n\n /** Persist the board (host-debounced) on EVERY board mutation — user edits AND agent tools. */\n protected override OnInitialize(): void {\n this.stateChangedSub?.unsubscribe();\n this.clearWhiteboardTrailingTimer();\n this.stateChangedSub = this.State.Changed$.subscribe((change) => {\n this.Context?.RequestSave(this.State.ToJSON());\n // Only user edits (and scene replacements like undo) drive the user settle-debounce pipeline.\n // Agent edits are confirmed with a single frame in ApplyAgentTool.\n if (change.Author === 'user' || change.Op === 'replace') {\n void this.onUserMutation();\n }\n });\n this.ensureVideoBridge();\n }\n\n public override OnSessionStarted(): void {\n this.ensureVideoBridge();\n }\n\n private ensureVideoBridge(): ChannelInboundVideoBridge | null {\n if (!this.videoBridge && this.Context) {\n this.videoBridge = new ChannelInboundVideoBridge(() => this.Context?.Client, this);\n }\n if (this.videoBridge && !this.videoBridge.IsActive && this.Context?.Client?.IsTrackEstablished('video', 'inbound')) {\n this.videoBridge.Start?.();\n }\n return this.videoBridge;\n }\n\n /**\n * Wires the dynamically-created board host: inputs (shared state engine + agent name)\n * are set BEFORE the component's first change detection, and the perception/garnish\n * outputs are subscribed back into the host context — the overlay never sees any of it.\n */\n public BindSurface(instance: RealtimeWhiteboardHostComponent): void {\n this.ensureVideoBridge();\n this.releaseSurface();\n this.host = instance;\n instance.State = this.State;\n instance.AgentName = this.Context?.AgentName ?? 'Agent';\n this.surfaceSubs.push(\n // The board's coalesced scene delta — the perception feed the agent \"sees\".\n instance.SceneDelta.subscribe((deltaJson: string) => {\n // Background PERCEPTION, not conversation: the model sees every user edit without\n // being told, but must not narrate minor changes — only react when something is\n // significant (or when asked). The etiquette rides in the note itself so any\n // realtime model gets it regardless of system-prompt sync state.\n this.Context?.SendContextNote(\n '[whiteboard] board update (background context — do NOT comment on minor edits; ' +\n 'only mention it if the change is significant to the discussion): ' + deltaJson);\n }),\n // The user clicked Undo on the agent-action toast (the undo already applied locally).\n instance.AgentUndo.subscribe(() => {\n this.Context?.SendContextNote('[whiteboard] user undid your last change');\n }),\n // A sandboxed HTML widget submitted user input (MJWhiteboard.submit) — already\n // validated, size-capped and not canceled (the host's cancelable WidgetSubmitting\n // event ran first). Surface it to the agent so it can react to quiz answers /\n // micro-form input it asked for.\n instance.WidgetSubmitted.subscribe((submit: WhiteboardWidgetSubmitEvent) => {\n // Durable awareness first (the note persists in the model's context)…\n this.Context?.SendContextNote(\n `[whiteboard] the user submitted input in widget \"${submit.Title || submit.ItemID}\": ${submit.DataJson}`);\n // …then make the model REACT — a submission is explicit user input the user is\n // waiting on; without this trigger, SendContextNote alone produces dead silence\n // (\"I clicked Submit and nothing happened\").\n this.Context?.RequestSpokenResponse?.(\n `The user just submitted input in the whiteboard widget \"${submit.Title || submit.ItemID}\": ${submit.DataJson}. ` +\n `React to it now in your own voice — acknowledge their choice and continue naturally.`);\n }),\n // AMBIENT widget telemetry (the injected recorder, NOT widget-authored script):\n // clicks / changes / typing summarized by the board. Pure background perception —\n // throttled per widget so chatty widgets don't flood the model's context, and framed\n // with do-not-respond etiquette (explicit MJWhiteboard.submit input arrives above).\n instance.WidgetInteraction.subscribe((interaction: WhiteboardWidgetInteractionEvent) => {\n this.onWidgetInteraction(interaction);\n }),\n // The board's Focus toggle — ask the shell to collapse/restore the main call column.\n instance.FocusModeChange.subscribe((focused: boolean) => {\n this.Context?.SetFocusMode(focused);\n }),\n // \"Save to artifacts\": snapshot the board as a first-class versioned artifact.\n instance.SaveToArtifactsRequested.subscribe(() => {\n void this.saveBoardAsArtifact();\n })\n );\n }\n\n public override UnbindSurface(): void {\n this.releaseSurface();\n }\n\n /**\n * Routes one ambient widget-interaction batch to the agent as a throttled background\n * context note: outside an open window the note goes out immediately and opens a\n * {@link WHITEBOARD_INTERACTION_NOTE_THROTTLE_MS} window; within the window the LATEST\n * event is stashed and a trailing-edge timer sends it when the window closes (one note\n * per widget per window, latest summary wins).\n */\n private onWidgetInteraction(interaction: WhiteboardWidgetInteractionEvent): void {\n const now = Date.now();\n const entry = this.interactionThrottles.get(interaction.ItemID);\n if (!entry || (entry.Timer === null && now - entry.LastSentAt >= WHITEBOARD_INTERACTION_NOTE_THROTTLE_MS)) {\n this.sendInteractionNote(interaction);\n this.interactionThrottles.set(interaction.ItemID, { LastSentAt: now, Timer: null, Pending: null });\n return;\n }\n entry.Pending = interaction; // latest wins within the window\n if (entry.Timer === null) {\n const wait = Math.max(0, entry.LastSentAt + WHITEBOARD_INTERACTION_NOTE_THROTTLE_MS - now);\n entry.Timer = setTimeout(() => {\n entry.Timer = null;\n const pending = entry.Pending;\n entry.Pending = null;\n if (pending) {\n entry.LastSentAt = Date.now();\n this.sendInteractionNote(pending);\n }\n }, wait);\n }\n }\n\n /** The ambient-note framing: background etiquette rides in the note itself (like scene deltas). */\n private sendInteractionNote(interaction: WhiteboardWidgetInteractionEvent): void {\n this.Context?.SendContextNote(\n `[whiteboard] ambient activity in widget \"${interaction.Title || interaction.ItemID}\" ` +\n '(background — do NOT respond unless it is significant or you are asked; ' +\n `explicit submissions arrive separately): ${interaction.Summary}`);\n }\n\n /** Cancels all pending ambient-note timers and resets the per-widget throttle windows. */\n private clearInteractionThrottles(): void {\n for (const entry of this.interactionThrottles.values()) {\n if (entry.Timer !== null) {\n clearTimeout(entry.Timer);\n }\n }\n this.interactionThrottles.clear();\n }\n\n /**\n * Persists the current board as a `MJ: Artifacts` snapshot via the host context\n * (best-effort; the host logs failures). On success the agent is told via a context\n * note so it can reference the saved artifact naturally.\n */\n private async saveBoardAsArtifact(): Promise<void> {\n const ctx = this.Context;\n if (!ctx) {\n return;\n }\n const now = new Date();\n const name = `Whiteboard — ${now.toLocaleDateString()} ${now.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' })}`;\n const artifactId = await ctx.SaveAsArtifact(name, this.State.ToJSON());\n if (artifactId) {\n ctx.SendContextNote(`[whiteboard] the user saved the current board as the artifact \"${name}\"`);\n }\n }\n\n /**\n * Executes one `Whiteboard_*` tool call LOCALLY. Prefers the live bound host (board\n * mutation + UI garnish); falls back to the pure engine function when no surface is\n * bound so the channel keeps working with the pane collapsed.\n */\n public ApplyAgentTool(toolName: string, argsJson: string): string {\n let result: string;\n if (this.host) {\n result = this.host.ApplyAgentTool(toolName, argsJson);\n } else {\n result = ApplyWhiteboardAgentTool(this.State, toolName, argsJson);\n }\n // A SUCCESSFUL agent tool triggers exactly ONE immediate visual confirmation frame and a note\n // telling the model not to narrate its own change. A FAILED one must trigger neither: every\n // failure path returns `{ success: false, error }` (bad JSON args, unknown tool, per-tool\n // validation), and confirming it would tell the model its edit landed AND instruct it to stay\n // quiet about it — so the failure would vanish from the user's view while the model carried on.\n // It would also push a frame identical to the last one, since a failed tool changes nothing.\n if (toolSucceeded(result)) {\n void this.pushAgentConfirmationFrame();\n }\n return result;\n }\n\n /** The board's serialized state of record (persisted under {@link ChannelName}). */\n public override SerializeState(): string | null {\n return this.State.ToJSON();\n }\n\n /**\n * Rehydrates a prior session's saved board into THIS session's state engine (in place —\n * the {@link State} instance and its subscriptions are preserved). Returns `true` on\n * success; malformed / incompatible JSON returns `false` and the board stays fresh\n * (never throws — {@link WhiteboardState.LoadFromJSON} is tolerant by contract).\n */\n public override RestoreState(stateJson: string): boolean {\n return this.State.LoadFromJSON(stateJson);\n }\n\n /**\n * Exit focus mode THROUGH the bound host (its own Focus button state stays in sync; it\n * re-emits `FocusModeChange(false)` → `Context.SetFocusMode(false)`). When no surface is\n * bound the overlay's defensive flag clear covers it.\n */\n public override RequestFocusExit(): void {\n if (this.host?.FocusMode) {\n this.host.ToggleFocus();\n }\n }\n\n public override Dispose(): void {\n this.clearWhiteboardTrailingTimer();\n this.videoBridge?.Stop();\n this.videoBridge = null;\n this.stateChangedSub?.unsubscribe();\n this.stateChangedSub = null;\n this.lastPushedWhiteboardFrame = null;\n super.Dispose(); // releases the surface binding + context\n }\n\n /** Unsubscribes surface outputs, cancels pending ambient notes and drops the host reference. */\n private releaseSurface(): void {\n for (const sub of this.surfaceSubs) {\n sub.unsubscribe();\n }\n this.surfaceSubs = [];\n this.clearInteractionThrottles();\n this.host = null;\n }\n}\n\n/**\n * Tree-shaking prevention: the whiteboard channel is resolved dynamically through the\n * ClassFactory (by the registry row's `ClientPluginClass` key), so this static call is\n * what keeps its `@RegisterClass` side effect from being eliminated by the bundler.\n * Called by `RealtimeSessionService` alongside the realtime-client driver Load calls.\n */\nexport function LoadRealtimeWhiteboardChannel(): void {\n // intentional no-op — the import side effect performs the registration\n}\n\n/** @deprecated Use {@link RasterizeSvgToJpegBase64}. */\nexport async function rasterizeSvgToJpegBase64(svg: string, width = 1280, height = 720): Promise<string | null> {\n return RasterizeSvgToJpegBase64(svg, width, height);\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { OnInit, OnDestroy, EventEmitter, ElementRef } from '@angular/core';
1
+ import { OnInit, OnDestroy, EventEmitter, ElementRef, ChangeDetectorRef } from '@angular/core';
2
2
  import { UserInfo } from '@memberjunction/core';
3
3
  import { SearchService, SearchResult, SearchFilter, GroupedSearchResults, DateRange } from '../../services/search.service';
4
4
  import * as i0 from "@angular/core";
@@ -9,23 +9,108 @@ import * as i0 from "@angular/core";
9
9
  */
10
10
  export declare class SearchPanelComponent implements OnInit, OnDestroy {
11
11
  private searchService;
12
- environmentId: string;
13
- currentUser: UserInfo;
14
- isOpen: boolean;
12
+ private cdr;
13
+ EnvironmentId: string;
14
+ /** @deprecated Use {@link EnvironmentId}. */
15
+ set environmentId(value: string);
16
+ /** @deprecated Use {@link EnvironmentId}. */
17
+ get environmentId(): string;
18
+ CurrentUser: UserInfo;
19
+ /** @deprecated Use {@link CurrentUser}. */
20
+ set currentUser(value: UserInfo);
21
+ /** @deprecated Use {@link CurrentUser}. */
22
+ get currentUser(): UserInfo;
23
+ /** Term to open with, e.g. handed over from a narrower filter the user had already typed. */
24
+ InitialQuery: string;
25
+ /** @deprecated Use {@link InitialQuery}. */
26
+ set initialQuery(value: string);
27
+ /** @deprecated Use {@link InitialQuery}. */
28
+ get initialQuery(): string;
29
+ private _isOpen;
30
+ /**
31
+ * A setter rather than ngOnChanges so only an actual open transition acts — ngOnChanges
32
+ * fires for every input, so a CurrentUser or EnvironmentId re-emit while the panel was
33
+ * open yanked focus back out of whatever field the user was in.
34
+ */
35
+ set IsOpen(value: boolean);
36
+ get IsOpen(): boolean;
37
+ /** @deprecated Use {@link IsOpen}. */
38
+ set isOpen(value: boolean);
39
+ /** @deprecated Use {@link IsOpen}. */
40
+ get isOpen(): boolean;
15
41
  close: EventEmitter<void>;
42
+ ResultSelected: EventEmitter<SearchResult>;
43
+ /**
44
+ * @deprecated Use {@link ResultSelected}.
45
+ *
46
+ * The same emitter under the old binding name, so a template still binding
47
+ * (resultSelected) keeps working. Must stay AFTER ResultSelected: class fields
48
+ * initialise in order, and the other way round this captures undefined.
49
+ */
16
50
  resultSelected: EventEmitter<SearchResult>;
17
- searchInput?: ElementRef<HTMLInputElement>;
18
- searchQuery: string;
19
- activeFilter: SearchFilter;
20
- dateRange: DateRange;
21
- isSearching: boolean;
22
- results: GroupedSearchResults;
23
- recentSearches: string[];
24
- selectedIndex: number;
51
+ SearchInput?: ElementRef<HTMLInputElement>;
52
+ /** @deprecated Use {@link SearchInput}. */
53
+ get searchInput(): ElementRef<HTMLInputElement> | undefined;
54
+ /** @deprecated Use {@link SearchInput}. */
55
+ set searchInput(value: ElementRef<HTMLInputElement> | undefined);
56
+ SearchQuery: string;
57
+ /** @deprecated Use {@link SearchQuery}. */
58
+ get searchQuery(): string;
59
+ /** @deprecated Use {@link SearchQuery}. */
60
+ set searchQuery(value: string);
61
+ ActiveFilter: SearchFilter;
62
+ /** @deprecated Use {@link ActiveFilter}. */
63
+ get activeFilter(): SearchFilter;
64
+ /** @deprecated Use {@link ActiveFilter}. */
65
+ set activeFilter(value: SearchFilter);
66
+ DateRange: DateRange;
67
+ /** @deprecated Use {@link DateRange}. */
68
+ get dateRange(): DateRange;
69
+ /** @deprecated Use {@link DateRange}. */
70
+ set dateRange(value: DateRange);
71
+ IsSearching: boolean;
72
+ /** @deprecated Use {@link IsSearching}. */
73
+ get isSearching(): boolean;
74
+ /** @deprecated Use {@link IsSearching}. */
75
+ set isSearching(value: boolean);
76
+ Results: GroupedSearchResults;
77
+ /** @deprecated Use {@link Results}. */
78
+ get results(): GroupedSearchResults;
79
+ /** @deprecated Use {@link Results}. */
80
+ set results(value: GroupedSearchResults);
81
+ RecentSearches: string[];
82
+ /** @deprecated Use {@link RecentSearches}. */
83
+ get recentSearches(): string[];
84
+ /** @deprecated Use {@link RecentSearches}. */
85
+ set recentSearches(value: string[]);
86
+ SelectedIndex: number;
87
+ /** @deprecated Use {@link SelectedIndex}. */
88
+ get selectedIndex(): number;
89
+ /** @deprecated Use {@link SelectedIndex}. */
90
+ set selectedIndex(value: number);
91
+ /**
92
+ * Flat view of `Results`, rebuilt only on each results emission. The template binds
93
+ * IsResultSelected() once per row, so deriving this on demand allocated a fresh array of
94
+ * every result for every row on every change-detection pass.
95
+ */
96
+ private flatResults;
25
97
  /** Message for the "no results" empty state, echoing the search term. */
26
98
  get NoResultsMessage(): string;
27
99
  private destroy$;
28
- constructor(searchService: SearchService);
100
+ /** True only while ngOnInit subscribes — see applyState(). */
101
+ private initializing;
102
+ constructor(searchService: SearchService, cdr: ChangeDetectorRef);
103
+ /**
104
+ * Apply state from an async emission and render it.
105
+ *
106
+ * The search resolves through the data provider's transport, and that emission does not
107
+ * reliably schedule a change-detection pass: results land on the component while the panel
108
+ * keeps showing the previous state until some DOM event — Enter, a click on the modal,
109
+ * even the blur from clicking into devtools — triggers the next one. detectChanges()
110
+ * checks this view on the spot; markForCheck() would only mark it for a pass that never
111
+ * comes.
112
+ */
113
+ private applyState;
29
114
  ngOnInit(): void;
30
115
  ngOnDestroy(): void;
31
116
  /**
@@ -39,6 +124,8 @@ export declare class SearchPanelComponent implements OnInit, OnDestroy {
39
124
  /**
40
125
  * Handle search input
41
126
  */
127
+ OnSearchInput(): void;
128
+ /** @deprecated Use {@link OnSearchInput}. */
42
129
  onSearchInput(): void;
43
130
  /**
44
131
  * Perform search
@@ -47,27 +134,47 @@ export declare class SearchPanelComponent implements OnInit, OnDestroy {
47
134
  /**
48
135
  * Set search filter
49
136
  */
137
+ SetFilter(filter: SearchFilter): void;
138
+ /** @deprecated Use {@link SetFilter}. */
50
139
  setFilter(filter: SearchFilter): void;
51
140
  /**
52
141
  * Clear search
53
142
  */
143
+ ClearSearch(): void;
144
+ /** @deprecated Use {@link ClearSearch}. */
54
145
  clearSearch(): void;
55
146
  /**
56
147
  * Select a result
57
148
  */
149
+ SelectResult(result: SearchResult): void;
150
+ /** @deprecated Use {@link SelectResult}. */
58
151
  selectResult(result: SearchResult): void;
59
152
  /**
60
153
  * Use recent search
61
154
  */
155
+ UseRecentSearch(query: string): void;
156
+ /** @deprecated Use {@link UseRecentSearch}. */
62
157
  useRecentSearch(query: string): void;
63
158
  /**
64
159
  * Clear recent searches
65
160
  */
161
+ ClearRecentSearches(): void;
162
+ /** @deprecated Use {@link ClearRecentSearches}. */
66
163
  clearRecentSearches(): void;
67
164
  /**
68
165
  * Close panel
69
166
  */
167
+ ClosePanel(): void;
168
+ /** @deprecated Use {@link ClosePanel}. */
70
169
  closePanel(): void;
170
+ /**
171
+ * Seed and focus the box once the panel is open.
172
+ *
173
+ * Deferred to the next task so the @if(IsOpen) view exists (there is no input to focus
174
+ * before it renders) and so every input bound in the same pass has been set — this reads
175
+ * InitialQuery, which the host may bind after IsOpen.
176
+ */
177
+ private onOpened;
71
178
  /**
72
179
  * Focus search input
73
180
  */
@@ -76,41 +183,45 @@ export declare class SearchPanelComponent implements OnInit, OnDestroy {
76
183
  * Handle keyboard navigation
77
184
  */
78
185
  handleKeyboard(event: KeyboardEvent): void;
79
- /**
80
- * Get all results as flat array
81
- */
82
- private getAllResultsFlat;
83
186
  /**
84
187
  * Check if result is selected
85
188
  */
189
+ IsResultSelected(result: SearchResult): boolean;
190
+ /** @deprecated Use {@link IsResultSelected}. */
86
191
  isResultSelected(result: SearchResult): boolean;
87
192
  /**
88
193
  * Get icon for result type
89
194
  */
195
+ GetResultIcon(type: string): string;
196
+ /** @deprecated Use {@link GetResultIcon}. */
90
197
  getResultIcon(type: string): string;
91
198
  /**
92
199
  * Get filter display text
93
200
  */
201
+ GetFilterText(filter: SearchFilter): string;
202
+ /** @deprecated Use {@link GetFilterText}. */
94
203
  getFilterText(filter: SearchFilter): string;
95
204
  /**
96
205
  * Format date for display
97
206
  */
98
207
  formatDate(date: Date): string;
99
208
  /** Highlight matched text in result. Output is bound to `[innerHTML]` in the template. */
209
+ HighlightMatch(text: string, query: string): string;
210
+ /** @deprecated Use {@link HighlightMatch}. */
100
211
  highlightMatch(text: string, query: string): string;
101
212
  /**
102
213
  * Handle date range change
103
214
  */
215
+ OnDateRangeChange(): void;
216
+ /** @deprecated Use {@link OnDateRangeChange}. */
104
217
  onDateRangeChange(): void;
105
218
  /**
106
219
  * Clear date range
107
220
  */
221
+ ClearDateRange(): void;
222
+ /** @deprecated Use {@link ClearDateRange}. */
108
223
  clearDateRange(): void;
109
- /**
110
- * Watch for panel open state changes
111
- */
112
- ngOnChanges(): void;
113
224
  static ɵfac: i0.ɵɵFactoryDeclaration<SearchPanelComponent, never>;
114
- static ɵcmp: i0.ɵɵComponentDeclaration<SearchPanelComponent, "mj-search-panel", never, { "environmentId": { "alias": "environmentId"; "required": false; }; "currentUser": { "alias": "currentUser"; "required": false; }; "isOpen": { "alias": "isOpen"; "required": false; }; }, { "close": "close"; "resultSelected": "resultSelected"; }, never, never, false, never>;
225
+ static ɵcmp: i0.ɵɵComponentDeclaration<SearchPanelComponent, "mj-search-panel", never, { "EnvironmentId": { "alias": "EnvironmentId"; "required": false; }; "environmentId": { "alias": "environmentId"; "required": false; }; "CurrentUser": { "alias": "CurrentUser"; "required": false; }; "currentUser": { "alias": "currentUser"; "required": false; }; "InitialQuery": { "alias": "InitialQuery"; "required": false; }; "initialQuery": { "alias": "initialQuery"; "required": false; }; "IsOpen": { "alias": "IsOpen"; "required": false; }; "isOpen": { "alias": "isOpen"; "required": false; }; }, { "close": "close"; "ResultSelected": "ResultSelected"; "resultSelected": "resultSelected"; }, never, never, false, never>;
115
226
  }
116
227
  //# sourceMappingURL=search-panel.component.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"search-panel.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/search/search-panel.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,MAAM,EACN,SAAS,EAET,YAAY,EAIZ,UAAU,EACX,MAAM,eAAe,CAAC;AAGvB,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAEhD,OAAO,EACL,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,oBAAoB,EACpB,SAAS,EACV,MAAM,+BAA+B,CAAC;;AAEvC;;;;GAIG;AACH,qBAMa,oBAAqB,YAAW,MAAM,EAAE,SAAS;IAgChD,OAAO,CAAC,aAAa;IA/BxB,aAAa,EAAG,MAAM,CAAC;IACvB,WAAW,EAAG,QAAQ,CAAC;IACvB,MAAM,EAAE,OAAO,CAAS;IAEvB,KAAK,qBAA4B;IACjC,cAAc,6BAAoC;IAElC,WAAW,CAAC,EAAE,UAAU,CAAC,gBAAgB,CAAC,CAAC;IAE9D,WAAW,EAAE,MAAM,CAAM;IACzB,YAAY,EAAE,YAAY,CAAS;IACnC,SAAS,EAAE,SAAS,CAA8B;IAClD,WAAW,EAAE,OAAO,CAAS;IAC7B,OAAO,EAAE,oBAAoB,CAOlC;IACK,cAAc,EAAE,MAAM,EAAE,CAAM;IAC9B,aAAa,EAAE,MAAM,CAAM;IAElC,yEAAyE;IACzE,IAAW,gBAAgB,IAAI,MAAM,CAEpC;IAED,OAAO,CAAC,QAAQ,CAAuB;gBAEnB,aAAa,EAAE,aAAa;IAEhD,QAAQ,IAAI,IAAI;IAKhB,WAAW,IAAI,IAAI;IAKnB;;OAEG;IACH,OAAO,CAAC,sBAAsB;IA2B9B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAI1B;;OAEG;IACI,aAAa,IAAI,IAAI;IAQ5B;;OAEG;YACW,aAAa;IAQ3B;;OAEG;IACI,SAAS,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI;IAO5C;;OAEG;IACI,WAAW,IAAI,IAAI;IAM1B;;OAEG;IACI,YAAY,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI;IAK/C;;OAEG;IACI,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAK3C;;OAEG;IACI,mBAAmB,IAAI,IAAI;IAKlC;;OAEG;IACI,UAAU,IAAI,IAAI;IAIzB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAMxB;;OAEG;IAEI,cAAc,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI;IAoCjD;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAUzB;;OAEG;IACI,gBAAgB,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO;IAMtD;;OAEG;IACI,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAiB1C;;OAEG;IACI,aAAa,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM;IAmBlD;;OAEG;IACI,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM;IAarC,0FAA0F;IACnF,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM;IAI1D;;OAEG;IACI,iBAAiB,IAAI,IAAI;IAOhC;;OAEG;IACI,cAAc,IAAI,IAAI;IAQ7B;;OAEG;IACH,WAAW,IAAI,IAAI;yCAvTR,oBAAoB;2CAApB,oBAAoB;CA4ThC"}
1
+ {"version":3,"file":"search-panel.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/search/search-panel.component.ts"],"names":[],"mappings":"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"}