@memberjunction/ng-conversations 5.43.0 → 5.45.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (405) hide show
  1. package/dist/lib/components/active-tasks/active-tasks-panel.component.d.ts +0 -1
  2. package/dist/lib/components/active-tasks/active-tasks-panel.component.d.ts.map +1 -1
  3. package/dist/lib/components/active-tasks/active-tasks-panel.component.js +56 -52
  4. package/dist/lib/components/active-tasks/active-tasks-panel.component.js.map +1 -1
  5. package/dist/lib/components/artifact/artifact-share-modal.component.d.ts +3 -1
  6. package/dist/lib/components/artifact/artifact-share-modal.component.d.ts.map +1 -1
  7. package/dist/lib/components/artifact/artifact-share-modal.component.js +52 -52
  8. package/dist/lib/components/artifact/artifact-share-modal.component.js.map +1 -1
  9. package/dist/lib/components/collection/collection-form-modal.component.d.ts.map +1 -1
  10. package/dist/lib/components/collection/collection-form-modal.component.js +10 -14
  11. package/dist/lib/components/collection/collection-form-modal.component.js.map +1 -1
  12. package/dist/lib/components/collection/collection-share-modal.component.d.ts +3 -1
  13. package/dist/lib/components/collection/collection-share-modal.component.d.ts.map +1 -1
  14. package/dist/lib/components/collection/collection-share-modal.component.js +56 -56
  15. package/dist/lib/components/collection/collection-share-modal.component.js.map +1 -1
  16. package/dist/lib/components/collection/collection-tree.component.d.ts +3 -1
  17. package/dist/lib/components/collection/collection-tree.component.d.ts.map +1 -1
  18. package/dist/lib/components/collection/collection-tree.component.js +10 -7
  19. package/dist/lib/components/collection/collection-tree.component.js.map +1 -1
  20. package/dist/lib/components/collection/collection-view.component.d.ts +3 -1
  21. package/dist/lib/components/collection/collection-view.component.d.ts.map +1 -1
  22. package/dist/lib/components/collection/collection-view.component.js +29 -41
  23. package/dist/lib/components/collection/collection-view.component.js.map +1 -1
  24. package/dist/lib/components/collection/collections-full-view.component.d.ts +4 -0
  25. package/dist/lib/components/collection/collections-full-view.component.d.ts.map +1 -1
  26. package/dist/lib/components/collection/collections-full-view.component.js +134 -166
  27. package/dist/lib/components/collection/collections-full-view.component.js.map +1 -1
  28. package/dist/lib/components/composer/ai-composer.component.d.ts +103 -0
  29. package/dist/lib/components/composer/ai-composer.component.d.ts.map +1 -0
  30. package/dist/lib/components/composer/ai-composer.component.js +263 -0
  31. package/dist/lib/components/composer/ai-composer.component.js.map +1 -0
  32. package/dist/lib/components/conversation/conversation-chat-area.component.d.ts +76 -12
  33. package/dist/lib/components/conversation/conversation-chat-area.component.d.ts.map +1 -1
  34. package/dist/lib/components/conversation/conversation-chat-area.component.js +522 -158
  35. package/dist/lib/components/conversation/conversation-chat-area.component.js.map +1 -1
  36. package/dist/lib/components/conversation/conversation-empty-state.component.d.ts +1 -1
  37. package/dist/lib/components/conversation/conversation-empty-state.component.d.ts.map +1 -1
  38. package/dist/lib/components/conversation/conversation-empty-state.component.js.map +1 -1
  39. package/dist/lib/components/conversation/pinned-messages-panel.component.js +6 -9
  40. package/dist/lib/components/conversation/pinned-messages-panel.component.js.map +1 -1
  41. package/dist/lib/components/library/library-full-view.component.d.ts.map +1 -1
  42. package/dist/lib/components/library/library-full-view.component.js +20 -24
  43. package/dist/lib/components/library/library-full-view.component.js.map +1 -1
  44. package/dist/lib/components/members/members-modal.component.d.ts.map +1 -1
  45. package/dist/lib/components/members/members-modal.component.js +10 -11
  46. package/dist/lib/components/members/members-modal.component.js.map +1 -1
  47. package/dist/lib/components/message/message-input.component.d.ts +87 -23
  48. package/dist/lib/components/message/message-input.component.d.ts.map +1 -1
  49. package/dist/lib/components/message/message-input.component.js +245 -158
  50. package/dist/lib/components/message/message-input.component.js.map +1 -1
  51. package/dist/lib/components/message/message-item.component.d.ts +11 -3
  52. package/dist/lib/components/message/message-item.component.d.ts.map +1 -1
  53. package/dist/lib/components/message/message-item.component.js +73 -21
  54. package/dist/lib/components/message/message-item.component.js.map +1 -1
  55. package/dist/lib/components/message/message-list.component.js +6 -9
  56. package/dist/lib/components/message/message-list.component.js.map +1 -1
  57. package/dist/lib/components/overlay/chat-overlay.component.d.ts +4 -1
  58. package/dist/lib/components/overlay/chat-overlay.component.d.ts.map +1 -1
  59. package/dist/lib/components/overlay/chat-overlay.component.js +9 -4
  60. package/dist/lib/components/overlay/chat-overlay.component.js.map +1 -1
  61. package/dist/lib/components/realtime/channels/base-realtime-channel-client.d.ts +45 -0
  62. package/dist/lib/components/realtime/channels/base-realtime-channel-client.d.ts.map +1 -1
  63. package/dist/lib/components/realtime/channels/base-realtime-channel-client.js +10 -0
  64. package/dist/lib/components/realtime/channels/base-realtime-channel-client.js.map +1 -1
  65. package/dist/lib/components/realtime/channels/client-context-channel.d.ts +46 -0
  66. package/dist/lib/components/realtime/channels/client-context-channel.d.ts.map +1 -0
  67. package/dist/lib/components/realtime/channels/client-context-channel.js +174 -0
  68. package/dist/lib/components/realtime/channels/client-context-channel.js.map +1 -0
  69. package/dist/lib/components/realtime/evidence-playback/realtime-evidence-playback.component.d.ts +123 -0
  70. package/dist/lib/components/realtime/evidence-playback/realtime-evidence-playback.component.d.ts.map +1 -0
  71. package/dist/lib/components/realtime/evidence-playback/realtime-evidence-playback.component.js +397 -0
  72. package/dist/lib/components/realtime/evidence-playback/realtime-evidence-playback.component.js.map +1 -0
  73. package/dist/lib/components/realtime/media/media-channel-state.d.ts +103 -0
  74. package/dist/lib/components/realtime/media/media-channel-state.d.ts.map +1 -0
  75. package/dist/lib/components/realtime/media/media-channel-state.js +143 -0
  76. package/dist/lib/components/realtime/media/media-channel-state.js.map +1 -0
  77. package/dist/lib/components/realtime/media/media-channel-tools.d.ts +24 -0
  78. package/dist/lib/components/realtime/media/media-channel-tools.d.ts.map +1 -0
  79. package/dist/lib/components/realtime/media/media-channel-tools.js +107 -0
  80. package/dist/lib/components/realtime/media/media-channel-tools.js.map +1 -0
  81. package/dist/lib/components/realtime/media/media-channel.d.ts +89 -0
  82. package/dist/lib/components/realtime/media/media-channel.d.ts.map +1 -0
  83. package/dist/lib/components/realtime/media/media-channel.js +253 -0
  84. package/dist/lib/components/realtime/media/media-channel.js.map +1 -0
  85. package/dist/lib/components/realtime/media/realtime-media-surface.component.d.ts +141 -0
  86. package/dist/lib/components/realtime/media/realtime-media-surface.component.d.ts.map +1 -0
  87. package/dist/lib/components/realtime/media/realtime-media-surface.component.js +574 -0
  88. package/dist/lib/components/realtime/media/realtime-media-surface.component.js.map +1 -0
  89. package/dist/lib/components/realtime/realtime-activity-rail.component.d.ts +59 -14
  90. package/dist/lib/components/realtime/realtime-activity-rail.component.d.ts.map +1 -1
  91. package/dist/lib/components/realtime/realtime-activity-rail.component.js +277 -74
  92. package/dist/lib/components/realtime/realtime-activity-rail.component.js.map +1 -1
  93. package/dist/lib/components/realtime/realtime-agent-banner.component.d.ts +28 -27
  94. package/dist/lib/components/realtime/realtime-agent-banner.component.d.ts.map +1 -1
  95. package/dist/lib/components/realtime/realtime-agent-banner.component.js +144 -143
  96. package/dist/lib/components/realtime/realtime-agent-banner.component.js.map +1 -1
  97. package/dist/lib/components/realtime/realtime-agent-picker.component.d.ts +12 -0
  98. package/dist/lib/components/realtime/realtime-agent-picker.component.d.ts.map +1 -1
  99. package/dist/lib/components/realtime/realtime-agent-picker.component.js +105 -43
  100. package/dist/lib/components/realtime/realtime-agent-picker.component.js.map +1 -1
  101. package/dist/lib/components/realtime/realtime-audio-visuals.d.ts +2 -2
  102. package/dist/lib/components/realtime/realtime-audio-visuals.d.ts.map +1 -1
  103. package/dist/lib/components/realtime/realtime-audio-visuals.js.map +1 -1
  104. package/dist/lib/components/realtime/realtime-composer.component.d.ts +41 -7
  105. package/dist/lib/components/realtime/realtime-composer.component.d.ts.map +1 -1
  106. package/dist/lib/components/realtime/realtime-composer.component.js +216 -102
  107. package/dist/lib/components/realtime/realtime-composer.component.js.map +1 -1
  108. package/dist/lib/components/realtime/realtime-delegation-card.component.d.ts +0 -2
  109. package/dist/lib/components/realtime/realtime-delegation-card.component.d.ts.map +1 -1
  110. package/dist/lib/components/realtime/realtime-delegation-card.component.js +67 -71
  111. package/dist/lib/components/realtime/realtime-delegation-card.component.js.map +1 -1
  112. package/dist/lib/components/realtime/realtime-session-overlay.component.d.ts +364 -44
  113. package/dist/lib/components/realtime/realtime-session-overlay.component.d.ts.map +1 -1
  114. package/dist/lib/components/realtime/realtime-session-overlay.component.js +839 -153
  115. package/dist/lib/components/realtime/realtime-session-overlay.component.js.map +1 -1
  116. package/dist/lib/components/realtime/realtime-session-state.d.ts +5 -5
  117. package/dist/lib/components/realtime/realtime-session-state.d.ts.map +1 -1
  118. package/dist/lib/components/realtime/realtime-session-state.js.map +1 -1
  119. package/dist/lib/components/realtime/realtime-surface-tab-style.d.ts +70 -0
  120. package/dist/lib/components/realtime/realtime-surface-tab-style.d.ts.map +1 -0
  121. package/dist/lib/components/realtime/realtime-surface-tab-style.js +115 -0
  122. package/dist/lib/components/realtime/realtime-surface-tab-style.js.map +1 -0
  123. package/dist/lib/components/realtime/realtime-surface-tabs.component.d.ts +55 -57
  124. package/dist/lib/components/realtime/realtime-surface-tabs.component.d.ts.map +1 -1
  125. package/dist/lib/components/realtime/realtime-surface-tabs.component.js +165 -143
  126. package/dist/lib/components/realtime/realtime-surface-tabs.component.js.map +1 -1
  127. package/dist/lib/components/realtime/realtime-surface-tabs.model.d.ts +80 -71
  128. package/dist/lib/components/realtime/realtime-surface-tabs.model.d.ts.map +1 -1
  129. package/dist/lib/components/realtime/realtime-surface-tabs.model.js +83 -113
  130. package/dist/lib/components/realtime/realtime-surface-tabs.model.js.map +1 -1
  131. package/dist/lib/components/realtime/realtime-ui-config.d.ts +270 -0
  132. package/dist/lib/components/realtime/realtime-ui-config.d.ts.map +1 -0
  133. package/dist/lib/components/realtime/realtime-ui-config.js +212 -0
  134. package/dist/lib/components/realtime/realtime-ui-config.js.map +1 -0
  135. package/dist/lib/components/search/search-panel.component.d.ts +2 -0
  136. package/dist/lib/components/search/search-panel.component.d.ts.map +1 -1
  137. package/dist/lib/components/search/search-panel.component.js +92 -101
  138. package/dist/lib/components/search/search-panel.component.js.map +1 -1
  139. package/dist/lib/components/share/share-modal.component.d.ts.map +1 -1
  140. package/dist/lib/components/share/share-modal.component.js +10 -11
  141. package/dist/lib/components/share/share-modal.component.js.map +1 -1
  142. package/dist/lib/components/shared/user-picker.component.d.ts.map +1 -1
  143. package/dist/lib/components/shared/user-picker.component.js +12 -15
  144. package/dist/lib/components/shared/user-picker.component.js.map +1 -1
  145. package/dist/lib/components/sidebar/conversation-sidebar.component.d.ts +11 -3
  146. package/dist/lib/components/sidebar/conversation-sidebar.component.d.ts.map +1 -1
  147. package/dist/lib/components/sidebar/conversation-sidebar.component.js +34 -10
  148. package/dist/lib/components/sidebar/conversation-sidebar.component.js.map +1 -1
  149. package/dist/lib/components/sidebar/routines-section.component.d.ts +73 -0
  150. package/dist/lib/components/sidebar/routines-section.component.d.ts.map +1 -0
  151. package/dist/lib/components/sidebar/routines-section.component.js +211 -0
  152. package/dist/lib/components/sidebar/routines-section.component.js.map +1 -0
  153. package/dist/lib/components/tasks/tasks-dropdown.component.d.ts +12 -0
  154. package/dist/lib/components/tasks/tasks-dropdown.component.d.ts.map +1 -1
  155. package/dist/lib/components/tasks/tasks-dropdown.component.js +37 -1
  156. package/dist/lib/components/tasks/tasks-dropdown.component.js.map +1 -1
  157. package/dist/lib/components/workspace/conversation-workspace.component.d.ts +16 -5
  158. package/dist/lib/components/workspace/conversation-workspace.component.d.ts.map +1 -1
  159. package/dist/lib/components/workspace/conversation-workspace.component.js +51 -31
  160. package/dist/lib/components/workspace/conversation-workspace.component.js.map +1 -1
  161. package/dist/lib/composer-plugins/agent-mention.provider.d.ts +16 -0
  162. package/dist/lib/composer-plugins/agent-mention.provider.d.ts.map +1 -0
  163. package/dist/lib/composer-plugins/agent-mention.provider.js +28 -0
  164. package/dist/lib/composer-plugins/agent-mention.provider.js.map +1 -0
  165. package/dist/lib/composer-plugins/base-conversation-mention.provider.d.ts +20 -0
  166. package/dist/lib/composer-plugins/base-conversation-mention.provider.d.ts.map +1 -0
  167. package/dist/lib/composer-plugins/base-conversation-mention.provider.js +32 -0
  168. package/dist/lib/composer-plugins/base-conversation-mention.provider.js.map +1 -0
  169. package/dist/lib/composer-plugins/load-composer-plugins.d.ts +9 -0
  170. package/dist/lib/composer-plugins/load-composer-plugins.d.ts.map +1 -0
  171. package/dist/lib/composer-plugins/load-composer-plugins.js +17 -0
  172. package/dist/lib/composer-plugins/load-composer-plugins.js.map +1 -0
  173. package/dist/lib/composer-plugins/record-mention.provider.d.ts +14 -0
  174. package/dist/lib/composer-plugins/record-mention.provider.d.ts.map +1 -0
  175. package/dist/lib/composer-plugins/record-mention.provider.js +26 -0
  176. package/dist/lib/composer-plugins/record-mention.provider.js.map +1 -0
  177. package/dist/lib/composer-plugins/skill-command.provider.d.ts +15 -0
  178. package/dist/lib/composer-plugins/skill-command.provider.d.ts.map +1 -0
  179. package/dist/lib/composer-plugins/skill-command.provider.js +27 -0
  180. package/dist/lib/composer-plugins/skill-command.provider.js.map +1 -0
  181. package/dist/lib/conversations.module.d.ts +68 -64
  182. package/dist/lib/conversations.module.d.ts.map +1 -1
  183. package/dist/lib/conversations.module.js +69 -18
  184. package/dist/lib/conversations.module.js.map +1 -1
  185. package/dist/lib/models/conversation-state.model.d.ts +6 -3
  186. package/dist/lib/models/conversation-state.model.d.ts.map +1 -1
  187. package/dist/lib/models/conversation-state.model.js.map +1 -1
  188. package/dist/lib/services/conversation-agent.service.d.ts +9 -2
  189. package/dist/lib/services/conversation-agent.service.d.ts.map +1 -1
  190. package/dist/lib/services/conversation-agent.service.js +26 -2
  191. package/dist/lib/services/conversation-agent.service.js.map +1 -1
  192. package/dist/lib/services/conversation-attachment.service.d.ts +1 -1
  193. package/dist/lib/services/conversation-attachment.service.d.ts.map +1 -1
  194. package/dist/lib/services/conversation-attachment.service.js.map +1 -1
  195. package/dist/lib/services/mention-autocomplete.service.d.ts +42 -19
  196. package/dist/lib/services/mention-autocomplete.service.d.ts.map +1 -1
  197. package/dist/lib/services/mention-autocomplete.service.js +113 -18
  198. package/dist/lib/services/mention-autocomplete.service.js.map +1 -1
  199. package/dist/lib/services/realtime-audio-recorder.d.ts +143 -0
  200. package/dist/lib/services/realtime-audio-recorder.d.ts.map +1 -0
  201. package/dist/lib/services/realtime-audio-recorder.js +379 -0
  202. package/dist/lib/services/realtime-audio-recorder.js.map +1 -0
  203. package/dist/lib/services/realtime-pcm-wav.d.ts +75 -0
  204. package/dist/lib/services/realtime-pcm-wav.d.ts.map +1 -0
  205. package/dist/lib/services/realtime-pcm-wav.js +205 -0
  206. package/dist/lib/services/realtime-pcm-wav.js.map +1 -0
  207. package/dist/lib/services/realtime-session-review.service.d.ts +28 -1
  208. package/dist/lib/services/realtime-session-review.service.d.ts.map +1 -1
  209. package/dist/lib/services/realtime-session-review.service.js +12 -3
  210. package/dist/lib/services/realtime-session-review.service.js.map +1 -1
  211. package/dist/lib/services/realtime-session.service.d.ts +210 -20
  212. package/dist/lib/services/realtime-session.service.d.ts.map +1 -1
  213. package/dist/lib/services/realtime-session.service.js +452 -21
  214. package/dist/lib/services/realtime-session.service.js.map +1 -1
  215. package/dist/lib/services/realtime-sessions-adapter.js +1 -1
  216. package/dist/lib/services/realtime-sessions-adapter.js.map +1 -1
  217. package/dist/lib/services/ui-command-handler.service.d.ts +7 -2
  218. package/dist/lib/services/ui-command-handler.service.d.ts.map +1 -1
  219. package/dist/lib/services/ui-command-handler.service.js +6 -2
  220. package/dist/lib/services/ui-command-handler.service.js.map +1 -1
  221. package/dist/lib/utils/plan-mode-preference.d.ts +62 -0
  222. package/dist/lib/utils/plan-mode-preference.d.ts.map +1 -0
  223. package/dist/lib/utils/plan-mode-preference.js +130 -0
  224. package/dist/lib/utils/plan-mode-preference.js.map +1 -0
  225. package/dist/public-api.d.ts +29 -3
  226. package/dist/public-api.d.ts.map +1 -1
  227. package/dist/public-api.js +46 -3
  228. package/dist/public-api.js.map +1 -1
  229. package/package.json +30 -26
  230. package/dist/__tests__/attachment-badge.test.d.ts +0 -2
  231. package/dist/__tests__/attachment-badge.test.d.ts.map +0 -1
  232. package/dist/__tests__/attachment-badge.test.js +0 -66
  233. package/dist/__tests__/attachment-badge.test.js.map +0 -1
  234. package/dist/__tests__/channel-optional-surface.test.d.ts +0 -2
  235. package/dist/__tests__/channel-optional-surface.test.d.ts.map +0 -1
  236. package/dist/__tests__/channel-optional-surface.test.js +0 -53
  237. package/dist/__tests__/channel-optional-surface.test.js.map +0 -1
  238. package/dist/__tests__/chat-events.test.d.ts +0 -14
  239. package/dist/__tests__/chat-events.test.d.ts.map +0 -1
  240. package/dist/__tests__/chat-events.test.js +0 -109
  241. package/dist/__tests__/chat-events.test.js.map +0 -1
  242. package/dist/__tests__/collections-full-view.test.d.ts +0 -2
  243. package/dist/__tests__/collections-full-view.test.d.ts.map +0 -1
  244. package/dist/__tests__/collections-full-view.test.js +0 -225
  245. package/dist/__tests__/collections-full-view.test.js.map +0 -1
  246. package/dist/__tests__/conversation-cache.test.d.ts +0 -2
  247. package/dist/__tests__/conversation-cache.test.d.ts.map +0 -1
  248. package/dist/__tests__/conversation-cache.test.js +0 -233
  249. package/dist/__tests__/conversation-cache.test.js.map +0 -1
  250. package/dist/__tests__/conversation-naming.test.d.ts +0 -2
  251. package/dist/__tests__/conversation-naming.test.d.ts.map +0 -1
  252. package/dist/__tests__/conversation-naming.test.js +0 -110
  253. package/dist/__tests__/conversation-naming.test.js.map +0 -1
  254. package/dist/__tests__/delegation-result-parser.test.d.ts +0 -2
  255. package/dist/__tests__/delegation-result-parser.test.d.ts.map +0 -1
  256. package/dist/__tests__/delegation-result-parser.test.js +0 -107
  257. package/dist/__tests__/delegation-result-parser.test.js.map +0 -1
  258. package/dist/__tests__/distinct-artifacts.test.d.ts +0 -2
  259. package/dist/__tests__/distinct-artifacts.test.d.ts.map +0 -1
  260. package/dist/__tests__/distinct-artifacts.test.js +0 -56
  261. package/dist/__tests__/distinct-artifacts.test.js.map +0 -1
  262. package/dist/__tests__/event-wiring.test.d.ts +0 -15
  263. package/dist/__tests__/event-wiring.test.d.ts.map +0 -1
  264. package/dist/__tests__/event-wiring.test.js +0 -100
  265. package/dist/__tests__/event-wiring.test.js.map +0 -1
  266. package/dist/__tests__/index.test.d.ts +0 -2
  267. package/dist/__tests__/index.test.d.ts.map +0 -1
  268. package/dist/__tests__/index.test.js +0 -7
  269. package/dist/__tests__/index.test.js.map +0 -1
  270. package/dist/__tests__/narration-template.test.d.ts +0 -2
  271. package/dist/__tests__/narration-template.test.d.ts.map +0 -1
  272. package/dist/__tests__/narration-template.test.js +0 -76
  273. package/dist/__tests__/narration-template.test.js.map +0 -1
  274. package/dist/__tests__/notification-model.test.d.ts +0 -2
  275. package/dist/__tests__/notification-model.test.d.ts.map +0 -1
  276. package/dist/__tests__/notification-model.test.js +0 -68
  277. package/dist/__tests__/notification-model.test.js.map +0 -1
  278. package/dist/__tests__/realtime-agent-picker-models.test.d.ts +0 -2
  279. package/dist/__tests__/realtime-agent-picker-models.test.d.ts.map +0 -1
  280. package/dist/__tests__/realtime-agent-picker-models.test.js +0 -49
  281. package/dist/__tests__/realtime-agent-picker-models.test.js.map +0 -1
  282. package/dist/__tests__/realtime-audio-visuals.test.d.ts +0 -2
  283. package/dist/__tests__/realtime-audio-visuals.test.d.ts.map +0 -1
  284. package/dist/__tests__/realtime-audio-visuals.test.js +0 -123
  285. package/dist/__tests__/realtime-audio-visuals.test.js.map +0 -1
  286. package/dist/__tests__/realtime-delegation-card-cancel.test.d.ts +0 -2
  287. package/dist/__tests__/realtime-delegation-card-cancel.test.d.ts.map +0 -1
  288. package/dist/__tests__/realtime-delegation-card-cancel.test.js +0 -48
  289. package/dist/__tests__/realtime-delegation-card-cancel.test.js.map +0 -1
  290. package/dist/__tests__/realtime-disclosure.test.d.ts +0 -2
  291. package/dist/__tests__/realtime-disclosure.test.d.ts.map +0 -1
  292. package/dist/__tests__/realtime-disclosure.test.js +0 -164
  293. package/dist/__tests__/realtime-disclosure.test.js.map +0 -1
  294. package/dist/__tests__/realtime-pairing.test.d.ts +0 -2
  295. package/dist/__tests__/realtime-pairing.test.d.ts.map +0 -1
  296. package/dist/__tests__/realtime-pairing.test.js +0 -207
  297. package/dist/__tests__/realtime-pairing.test.js.map +0 -1
  298. package/dist/__tests__/realtime-review-lifecycle.test.d.ts +0 -2
  299. package/dist/__tests__/realtime-review-lifecycle.test.d.ts.map +0 -1
  300. package/dist/__tests__/realtime-review-lifecycle.test.js +0 -154
  301. package/dist/__tests__/realtime-review-lifecycle.test.js.map +0 -1
  302. package/dist/__tests__/realtime-session-cancel-usage.test.d.ts +0 -2
  303. package/dist/__tests__/realtime-session-cancel-usage.test.d.ts.map +0 -1
  304. package/dist/__tests__/realtime-session-cancel-usage.test.js +0 -230
  305. package/dist/__tests__/realtime-session-cancel-usage.test.js.map +0 -1
  306. package/dist/__tests__/realtime-session-channels.test.d.ts +0 -2
  307. package/dist/__tests__/realtime-session-channels.test.d.ts.map +0 -1
  308. package/dist/__tests__/realtime-session-channels.test.js +0 -252
  309. package/dist/__tests__/realtime-session-channels.test.js.map +0 -1
  310. package/dist/__tests__/realtime-session-client-tools.test.d.ts +0 -2
  311. package/dist/__tests__/realtime-session-client-tools.test.d.ts.map +0 -1
  312. package/dist/__tests__/realtime-session-client-tools.test.js +0 -103
  313. package/dist/__tests__/realtime-session-client-tools.test.js.map +0 -1
  314. package/dist/__tests__/realtime-session-minimized.test.d.ts +0 -2
  315. package/dist/__tests__/realtime-session-minimized.test.d.ts.map +0 -1
  316. package/dist/__tests__/realtime-session-minimized.test.js +0 -32
  317. package/dist/__tests__/realtime-session-minimized.test.js.map +0 -1
  318. package/dist/__tests__/realtime-session-mint.test.d.ts +0 -2
  319. package/dist/__tests__/realtime-session-mint.test.d.ts.map +0 -1
  320. package/dist/__tests__/realtime-session-mint.test.js +0 -69
  321. package/dist/__tests__/realtime-session-mint.test.js.map +0 -1
  322. package/dist/__tests__/realtime-session-policy.test.d.ts +0 -2
  323. package/dist/__tests__/realtime-session-policy.test.d.ts.map +0 -1
  324. package/dist/__tests__/realtime-session-policy.test.js +0 -303
  325. package/dist/__tests__/realtime-session-policy.test.js.map +0 -1
  326. package/dist/__tests__/realtime-session-review.service.test.d.ts +0 -2
  327. package/dist/__tests__/realtime-session-review.service.test.d.ts.map +0 -1
  328. package/dist/__tests__/realtime-session-review.service.test.js +0 -743
  329. package/dist/__tests__/realtime-session-review.service.test.js.map +0 -1
  330. package/dist/__tests__/realtime-session-state.test.d.ts +0 -2
  331. package/dist/__tests__/realtime-session-state.test.d.ts.map +0 -1
  332. package/dist/__tests__/realtime-session-state.test.js +0 -83
  333. package/dist/__tests__/realtime-session-state.test.js.map +0 -1
  334. package/dist/__tests__/realtime-session-timeline-card.test.d.ts +0 -2
  335. package/dist/__tests__/realtime-session-timeline-card.test.d.ts.map +0 -1
  336. package/dist/__tests__/realtime-session-timeline-card.test.js +0 -106
  337. package/dist/__tests__/realtime-session-timeline-card.test.js.map +0 -1
  338. package/dist/__tests__/realtime-session-timeline.test.d.ts +0 -2
  339. package/dist/__tests__/realtime-session-timeline.test.d.ts.map +0 -1
  340. package/dist/__tests__/realtime-session-timeline.test.js +0 -142
  341. package/dist/__tests__/realtime-session-timeline.test.js.map +0 -1
  342. package/dist/__tests__/realtime-sessions-adapter.test.d.ts +0 -19
  343. package/dist/__tests__/realtime-sessions-adapter.test.d.ts.map +0 -1
  344. package/dist/__tests__/realtime-sessions-adapter.test.js +0 -188
  345. package/dist/__tests__/realtime-sessions-adapter.test.js.map +0 -1
  346. package/dist/__tests__/realtime-surface-panel-prefs.test.d.ts +0 -2
  347. package/dist/__tests__/realtime-surface-panel-prefs.test.d.ts.map +0 -1
  348. package/dist/__tests__/realtime-surface-panel-prefs.test.js +0 -100
  349. package/dist/__tests__/realtime-surface-panel-prefs.test.js.map +0 -1
  350. package/dist/__tests__/realtime-surface-tabs-model.test.d.ts +0 -2
  351. package/dist/__tests__/realtime-surface-tabs-model.test.d.ts.map +0 -1
  352. package/dist/__tests__/realtime-surface-tabs-model.test.js +0 -193
  353. package/dist/__tests__/realtime-surface-tabs-model.test.js.map +0 -1
  354. package/dist/__tests__/remote-browser-audio-player.test.d.ts +0 -2
  355. package/dist/__tests__/remote-browser-audio-player.test.d.ts.map +0 -1
  356. package/dist/__tests__/remote-browser-audio-player.test.js +0 -137
  357. package/dist/__tests__/remote-browser-audio-player.test.js.map +0 -1
  358. package/dist/__tests__/remote-browser-channel.test.d.ts +0 -2
  359. package/dist/__tests__/remote-browser-channel.test.d.ts.map +0 -1
  360. package/dist/__tests__/remote-browser-channel.test.js +0 -585
  361. package/dist/__tests__/remote-browser-channel.test.js.map +0 -1
  362. package/dist/__tests__/search-service.test.d.ts +0 -2
  363. package/dist/__tests__/search-service.test.d.ts.map +0 -1
  364. package/dist/__tests__/search-service.test.js +0 -114
  365. package/dist/__tests__/search-service.test.js.map +0 -1
  366. package/dist/__tests__/slot-defaults.test.d.ts +0 -24
  367. package/dist/__tests__/slot-defaults.test.d.ts.map +0 -1
  368. package/dist/__tests__/slot-defaults.test.js +0 -63
  369. package/dist/__tests__/slot-defaults.test.js.map +0 -1
  370. package/dist/__tests__/toast-service.test.d.ts +0 -2
  371. package/dist/__tests__/toast-service.test.d.ts.map +0 -1
  372. package/dist/__tests__/toast-service.test.js +0 -143
  373. package/dist/__tests__/toast-service.test.js.map +0 -1
  374. package/dist/__tests__/user-authorization.test.d.ts +0 -2
  375. package/dist/__tests__/user-authorization.test.d.ts.map +0 -1
  376. package/dist/__tests__/user-authorization.test.js +0 -97
  377. package/dist/__tests__/user-authorization.test.js.map +0 -1
  378. package/dist/__tests__/voice-session-narration.test.d.ts +0 -2
  379. package/dist/__tests__/voice-session-narration.test.d.ts.map +0 -1
  380. package/dist/__tests__/voice-session-narration.test.js +0 -609
  381. package/dist/__tests__/voice-session-narration.test.js.map +0 -1
  382. package/dist/__tests__/whiteboard-artifact-viewer.test.d.ts +0 -2
  383. package/dist/__tests__/whiteboard-artifact-viewer.test.d.ts.map +0 -1
  384. package/dist/__tests__/whiteboard-artifact-viewer.test.js +0 -101
  385. package/dist/__tests__/whiteboard-artifact-viewer.test.js.map +0 -1
  386. package/dist/__tests__/whiteboard-channel.test.d.ts +0 -2
  387. package/dist/__tests__/whiteboard-channel.test.d.ts.map +0 -1
  388. package/dist/__tests__/whiteboard-channel.test.js +0 -260
  389. package/dist/__tests__/whiteboard-channel.test.js.map +0 -1
  390. package/dist/__tests__/whiteboard-restore-state.test.d.ts +0 -2
  391. package/dist/__tests__/whiteboard-restore-state.test.d.ts.map +0 -1
  392. package/dist/__tests__/whiteboard-restore-state.test.js +0 -108
  393. package/dist/__tests__/whiteboard-restore-state.test.js.map +0 -1
  394. package/dist/lib/components/mention/mention-dropdown.component.d.ts +0 -53
  395. package/dist/lib/components/mention/mention-dropdown.component.d.ts.map +0 -1
  396. package/dist/lib/components/mention/mention-dropdown.component.js +0 -276
  397. package/dist/lib/components/mention/mention-dropdown.component.js.map +0 -1
  398. package/dist/lib/components/mention/mention-editor.component.d.ts +0 -256
  399. package/dist/lib/components/mention/mention-editor.component.d.ts.map +0 -1
  400. package/dist/lib/components/mention/mention-editor.component.js +0 -1233
  401. package/dist/lib/components/mention/mention-editor.component.js.map +0 -1
  402. package/dist/lib/components/message/message-input-box.component.d.ts +0 -137
  403. package/dist/lib/components/message/message-input-box.component.d.ts.map +0 -1
  404. package/dist/lib/components/message/message-input-box.component.js +0 -321
  405. package/dist/lib/components/message/message-input-box.component.js.map +0 -1
@@ -1,110 +0,0 @@
1
- /**
2
- * Unit tests for the SHARED conversation auto-naming helper — the single
3
- * implementation behind both the composer's first-message naming and the realtime
4
- * session path (sessions that created their own conversation name it on call end).
5
- */
6
- import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
7
- import { AIEngineBase } from '@memberjunction/ai-engine-base';
8
- import { ConversationEngine } from '@memberjunction/core-entities';
9
- import { GenerateAndApplyConversationName, NAME_CONVERSATION_PROMPT } from '../lib/services/conversation-naming';
10
- const USER = { ID: 'user-1' };
11
- const PROVIDER = {};
12
- describe('GenerateAndApplyConversationName', () => {
13
- let saveSpy;
14
- beforeEach(() => {
15
- vi.spyOn(AIEngineBase.Instance, 'Config').mockResolvedValue(undefined);
16
- vi.spyOn(AIEngineBase.Instance, 'Prompts', 'get').mockReturnValue([
17
- { ID: 'prompt-1', Name: NAME_CONVERSATION_PROMPT }
18
- ]);
19
- saveSpy = vi.spyOn(ConversationEngine.Instance, 'SaveConversation').mockResolvedValue(true);
20
- });
21
- afterEach(() => {
22
- vi.restoreAllMocks();
23
- });
24
- it('runs the Name Conversation prompt, saves the parsed name + description, and returns them', async () => {
25
- const runPrompt = vi.fn().mockResolvedValue({
26
- success: true,
27
- parsedResult: { name: 'Ottawa Weather Briefing', description: 'Weather and stocks' }
28
- });
29
- const result = await GenerateAndApplyConversationName({
30
- ConversationId: 'conv-1',
31
- MessageText: 'whats the weather in ottawa?',
32
- Provider: PROVIDER,
33
- CurrentUser: USER,
34
- RunPrompt: runPrompt
35
- });
36
- expect(runPrompt).toHaveBeenCalledWith('prompt-1', 'whats the weather in ottawa?');
37
- expect(saveSpy).toHaveBeenCalledWith('conv-1', { Name: 'Ottawa Weather Briefing', Description: 'Weather and stocks' }, USER);
38
- expect(result).toEqual({ Name: 'Ottawa Weather Briefing', Description: 'Weather and stocks' });
39
- });
40
- it('parses fenced raw output when parsedResult is absent', async () => {
41
- const result = await GenerateAndApplyConversationName({
42
- ConversationId: 'conv-2',
43
- MessageText: 'hello',
44
- Provider: PROVIDER,
45
- CurrentUser: USER,
46
- RunPrompt: vi.fn().mockResolvedValue({
47
- success: true,
48
- output: '```json\n{"name":"Quick Hello"}\n```'
49
- })
50
- });
51
- expect(result).toEqual({ Name: 'Quick Hello', Description: '' });
52
- expect(saveSpy).toHaveBeenCalledWith('conv-2', { Name: 'Quick Hello', Description: '' }, USER);
53
- });
54
- it('returns null (no save) on timeout — the conversation keeps its default name', async () => {
55
- vi.useFakeTimers();
56
- const never = new Promise(() => undefined);
57
- const pending = GenerateAndApplyConversationName({
58
- ConversationId: 'conv-3',
59
- MessageText: 'slow',
60
- Provider: PROVIDER,
61
- CurrentUser: USER,
62
- TimeoutMs: 5000,
63
- RunPrompt: vi.fn().mockReturnValue(never)
64
- });
65
- await vi.advanceTimersByTimeAsync(5001);
66
- const result = await pending;
67
- vi.useRealTimers();
68
- expect(result).toBeNull();
69
- expect(saveSpy).not.toHaveBeenCalled();
70
- });
71
- it('returns null when the Name Conversation prompt is not seeded', async () => {
72
- vi.spyOn(AIEngineBase.Instance, 'Prompts', 'get').mockReturnValue([]);
73
- const result = await GenerateAndApplyConversationName({
74
- ConversationId: 'conv-4',
75
- MessageText: 'x',
76
- Provider: PROVIDER,
77
- CurrentUser: USER,
78
- RunPrompt: vi.fn()
79
- });
80
- expect(result).toBeNull();
81
- });
82
- it.each([
83
- ['failed run', { success: false }],
84
- ['empty result', null],
85
- ['unparseable output', { success: true, output: 'not json at all {{{' }],
86
- ['parsed without a name', { success: true, parsedResult: { description: 'only desc' } }]
87
- ])('returns null (no save) for %s', async (_label, runResult) => {
88
- const result = await GenerateAndApplyConversationName({
89
- ConversationId: 'conv-5',
90
- MessageText: 'x',
91
- Provider: PROVIDER,
92
- CurrentUser: USER,
93
- RunPrompt: vi.fn().mockResolvedValue(runResult)
94
- });
95
- expect(result).toBeNull();
96
- expect(saveSpy).not.toHaveBeenCalled();
97
- });
98
- it('returns null when the save fails (name generated but not applied)', async () => {
99
- saveSpy.mockResolvedValue(false);
100
- const result = await GenerateAndApplyConversationName({
101
- ConversationId: 'conv-6',
102
- MessageText: 'x',
103
- Provider: PROVIDER,
104
- CurrentUser: USER,
105
- RunPrompt: vi.fn().mockResolvedValue({ success: true, parsedResult: { name: 'N' } })
106
- });
107
- expect(result).toBeNull();
108
- });
109
- });
110
- //# sourceMappingURL=conversation-naming.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"conversation-naming.test.js","sourceRoot":"","sources":["../../src/__tests__/conversation-naming.test.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Unit tests for the SHARED conversation auto-naming helper — the single\n * implementation behind both the composer's first-message naming and the realtime\n * session path (sessions that created their own conversation name it on call end).\n */\nimport { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';\nimport { UserInfo } from '@memberjunction/core';\nimport { GraphQLDataProvider } from '@memberjunction/graphql-dataprovider';\nimport { AIEngineBase } from '@memberjunction/ai-engine-base';\nimport { ConversationEngine } from '@memberjunction/core-entities';\nimport { GenerateAndApplyConversationName, NAME_CONVERSATION_PROMPT } from '../lib/services/conversation-naming';\n\nconst USER = { ID: 'user-1' } as unknown as UserInfo;\nconst PROVIDER = {} as unknown as GraphQLDataProvider;\n\ndescribe('GenerateAndApplyConversationName', () => {\n let saveSpy: ReturnType<typeof vi.spyOn>;\n\n beforeEach(() => {\n vi.spyOn(AIEngineBase.Instance, 'Config').mockResolvedValue(undefined as never);\n vi.spyOn(AIEngineBase.Instance, 'Prompts', 'get').mockReturnValue([\n { ID: 'prompt-1', Name: NAME_CONVERSATION_PROMPT }\n ] as never);\n saveSpy = vi.spyOn(ConversationEngine.Instance, 'SaveConversation').mockResolvedValue(true as never);\n });\n\n afterEach(() => {\n vi.restoreAllMocks();\n });\n\n it('runs the Name Conversation prompt, saves the parsed name + description, and returns them', async () => {\n const runPrompt = vi.fn().mockResolvedValue({\n success: true,\n parsedResult: { name: 'Ottawa Weather Briefing', description: 'Weather and stocks' }\n });\n\n const result = await GenerateAndApplyConversationName({\n ConversationId: 'conv-1',\n MessageText: 'whats the weather in ottawa?',\n Provider: PROVIDER,\n CurrentUser: USER,\n RunPrompt: runPrompt\n });\n\n expect(runPrompt).toHaveBeenCalledWith('prompt-1', 'whats the weather in ottawa?');\n expect(saveSpy).toHaveBeenCalledWith(\n 'conv-1',\n { Name: 'Ottawa Weather Briefing', Description: 'Weather and stocks' },\n USER\n );\n expect(result).toEqual({ Name: 'Ottawa Weather Briefing', Description: 'Weather and stocks' });\n });\n\n it('parses fenced raw output when parsedResult is absent', async () => {\n const result = await GenerateAndApplyConversationName({\n ConversationId: 'conv-2',\n MessageText: 'hello',\n Provider: PROVIDER,\n CurrentUser: USER,\n RunPrompt: vi.fn().mockResolvedValue({\n success: true,\n output: '```json\\n{\"name\":\"Quick Hello\"}\\n```'\n })\n });\n\n expect(result).toEqual({ Name: 'Quick Hello', Description: '' });\n expect(saveSpy).toHaveBeenCalledWith('conv-2', { Name: 'Quick Hello', Description: '' }, USER);\n });\n\n it('returns null (no save) on timeout — the conversation keeps its default name', async () => {\n vi.useFakeTimers();\n const never = new Promise<never>(() => undefined);\n const pending = GenerateAndApplyConversationName({\n ConversationId: 'conv-3',\n MessageText: 'slow',\n Provider: PROVIDER,\n CurrentUser: USER,\n TimeoutMs: 5000,\n RunPrompt: vi.fn().mockReturnValue(never)\n });\n await vi.advanceTimersByTimeAsync(5001);\n const result = await pending;\n vi.useRealTimers();\n\n expect(result).toBeNull();\n expect(saveSpy).not.toHaveBeenCalled();\n });\n\n it('returns null when the Name Conversation prompt is not seeded', async () => {\n vi.spyOn(AIEngineBase.Instance, 'Prompts', 'get').mockReturnValue([] as never);\n const result = await GenerateAndApplyConversationName({\n ConversationId: 'conv-4',\n MessageText: 'x',\n Provider: PROVIDER,\n CurrentUser: USER,\n RunPrompt: vi.fn()\n });\n expect(result).toBeNull();\n });\n\n it.each([\n ['failed run', { success: false }],\n ['empty result', null],\n ['unparseable output', { success: true, output: 'not json at all {{{' }],\n ['parsed without a name', { success: true, parsedResult: { description: 'only desc' } }]\n ])('returns null (no save) for %s', async (_label, runResult) => {\n const result = await GenerateAndApplyConversationName({\n ConversationId: 'conv-5',\n MessageText: 'x',\n Provider: PROVIDER,\n CurrentUser: USER,\n RunPrompt: vi.fn().mockResolvedValue(runResult)\n });\n expect(result).toBeNull();\n expect(saveSpy).not.toHaveBeenCalled();\n });\n\n it('returns null when the save fails (name generated but not applied)', async () => {\n saveSpy.mockResolvedValue(false as never);\n const result = await GenerateAndApplyConversationName({\n ConversationId: 'conv-6',\n MessageText: 'x',\n Provider: PROVIDER,\n CurrentUser: USER,\n RunPrompt: vi.fn().mockResolvedValue({ success: true, parsedResult: { name: 'N' } })\n });\n expect(result).toBeNull();\n });\n});\n"]}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=delegation-result-parser.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"delegation-result-parser.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/delegation-result-parser.test.ts"],"names":[],"mappings":""}
@@ -1,107 +0,0 @@
1
- import { describe, it, expect } from 'vitest';
2
- import { ParseDelegationResultJson } from '../lib/services/delegation-result-parser';
3
- describe('ParseDelegationResultJson', () => {
4
- it('parses a successful result with a runId', () => {
5
- const parsed = ParseDelegationResultJson(JSON.stringify({ success: true, output: 'all done', runId: 'run-123' }));
6
- expect(parsed).toEqual({ Success: true, Output: 'all done', RunID: 'run-123' });
7
- });
8
- it('parses a successful result without a runId (RunID undefined)', () => {
9
- const parsed = ParseDelegationResultJson(JSON.stringify({ success: true, output: 'all done' }));
10
- expect(parsed.Success).toBe(true);
11
- expect(parsed.Output).toBe('all done');
12
- expect(parsed.RunID).toBeUndefined();
13
- });
14
- it('ignores an empty-string runId', () => {
15
- const parsed = ParseDelegationResultJson(JSON.stringify({ success: true, output: 'x', runId: '' }));
16
- expect(parsed.RunID).toBeUndefined();
17
- });
18
- it('parses the structured error shape ({success:false, error})', () => {
19
- const parsed = ParseDelegationResultJson(JSON.stringify({ success: false, error: 'boom' }));
20
- expect(parsed).toEqual({ Success: false, Output: 'boom', RunID: undefined });
21
- });
22
- it('still carries runId on a failed result that reported one', () => {
23
- const parsed = ParseDelegationResultJson(JSON.stringify({ success: false, error: 'boom', runId: 'run-9' }));
24
- expect(parsed.Success).toBe(false);
25
- expect(parsed.RunID).toBe('run-9');
26
- });
27
- it('treats success as true unless explicitly false', () => {
28
- const parsed = ParseDelegationResultJson(JSON.stringify({ output: 'no flag' }));
29
- expect(parsed.Success).toBe(true);
30
- expect(parsed.Output).toBe('no flag');
31
- });
32
- it('surfaces a non-JSON payload as the raw output (success assumed)', () => {
33
- const parsed = ParseDelegationResultJson('plain text result');
34
- expect(parsed).toEqual({ Success: true, Output: 'plain text result' });
35
- });
36
- it('prefers output over error when both are present', () => {
37
- const parsed = ParseDelegationResultJson(JSON.stringify({ success: false, output: 'partial', error: 'late failure' }));
38
- expect(parsed.Output).toBe('partial');
39
- });
40
- describe('artifacts', () => {
41
- it('parses artifacts into PascalCase entries', () => {
42
- const parsed = ParseDelegationResultJson(JSON.stringify({
43
- success: true,
44
- output: 'done',
45
- runId: 'run-1',
46
- artifacts: [{ artifactId: 'a-1', artifactVersionId: 'av-1', name: 'Weather Report' }]
47
- }));
48
- expect(parsed.Artifacts).toEqual([
49
- { ArtifactID: 'a-1', ArtifactVersionID: 'av-1', Name: 'Weather Report' }
50
- ]);
51
- });
52
- it('leaves Artifacts undefined when the field is absent', () => {
53
- const parsed = ParseDelegationResultJson(JSON.stringify({ success: true, output: 'done' }));
54
- expect(parsed.Artifacts).toBeUndefined();
55
- });
56
- it('leaves Artifacts undefined for an empty array', () => {
57
- const parsed = ParseDelegationResultJson(JSON.stringify({ success: true, output: 'done', artifacts: [] }));
58
- expect(parsed.Artifacts).toBeUndefined();
59
- });
60
- it('leaves Artifacts undefined when the field is not an array', () => {
61
- const parsed = ParseDelegationResultJson(JSON.stringify({ success: true, output: 'done', artifacts: 'nope' }));
62
- expect(parsed.Artifacts).toBeUndefined();
63
- });
64
- it('drops malformed entries (missing ids) and keeps valid ones', () => {
65
- const parsed = ParseDelegationResultJson(JSON.stringify({
66
- success: true,
67
- output: 'done',
68
- artifacts: [
69
- { artifactId: 'a-1' }, // no version id → dropped
70
- { artifactVersionId: 'av-2' }, // no artifact id → dropped
71
- { artifactId: 42, artifactVersionId: 'av-3' }, // non-string id → dropped
72
- { artifactId: 'a-4', artifactVersionId: 'av-4', name: 'Kept' }
73
- ]
74
- }));
75
- expect(parsed.Artifacts).toEqual([{ ArtifactID: 'a-4', ArtifactVersionID: 'av-4', Name: 'Kept' }]);
76
- });
77
- it('falls back to "Artifact" for a missing or blank name', () => {
78
- const parsed = ParseDelegationResultJson(JSON.stringify({
79
- success: true,
80
- output: 'done',
81
- artifacts: [
82
- { artifactId: 'a-1', artifactVersionId: 'av-1' },
83
- { artifactId: 'a-2', artifactVersionId: 'av-2', name: ' ' }
84
- ]
85
- }));
86
- expect(parsed.Artifacts?.map(a => a.Name)).toEqual(['Artifact', 'Artifact']);
87
- });
88
- it('trims artifact names', () => {
89
- const parsed = ParseDelegationResultJson(JSON.stringify({
90
- success: true,
91
- output: 'done',
92
- artifacts: [{ artifactId: 'a-1', artifactVersionId: 'av-1', name: ' Q3 Summary ' }]
93
- }));
94
- expect(parsed.Artifacts?.[0].Name).toBe('Q3 Summary');
95
- });
96
- it('still carries artifacts on a failed result that reported them', () => {
97
- const parsed = ParseDelegationResultJson(JSON.stringify({
98
- success: false,
99
- error: 'partial failure',
100
- artifacts: [{ artifactId: 'a-1', artifactVersionId: 'av-1', name: 'Partial' }]
101
- }));
102
- expect(parsed.Success).toBe(false);
103
- expect(parsed.Artifacts).toHaveLength(1);
104
- });
105
- });
106
- });
107
- //# sourceMappingURL=delegation-result-parser.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"delegation-result-parser.test.js","sourceRoot":"","sources":["../../src/__tests__/delegation-result-parser.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { describe, it, expect } from 'vitest';\nimport { ParseDelegationResultJson } from '../lib/services/delegation-result-parser';\n\ndescribe('ParseDelegationResultJson', () => {\n it('parses a successful result with a runId', () => {\n const parsed = ParseDelegationResultJson(JSON.stringify({ success: true, output: 'all done', runId: 'run-123' }));\n expect(parsed).toEqual({ Success: true, Output: 'all done', RunID: 'run-123' });\n });\n\n it('parses a successful result without a runId (RunID undefined)', () => {\n const parsed = ParseDelegationResultJson(JSON.stringify({ success: true, output: 'all done' }));\n expect(parsed.Success).toBe(true);\n expect(parsed.Output).toBe('all done');\n expect(parsed.RunID).toBeUndefined();\n });\n\n it('ignores an empty-string runId', () => {\n const parsed = ParseDelegationResultJson(JSON.stringify({ success: true, output: 'x', runId: '' }));\n expect(parsed.RunID).toBeUndefined();\n });\n\n it('parses the structured error shape ({success:false, error})', () => {\n const parsed = ParseDelegationResultJson(JSON.stringify({ success: false, error: 'boom' }));\n expect(parsed).toEqual({ Success: false, Output: 'boom', RunID: undefined });\n });\n\n it('still carries runId on a failed result that reported one', () => {\n const parsed = ParseDelegationResultJson(JSON.stringify({ success: false, error: 'boom', runId: 'run-9' }));\n expect(parsed.Success).toBe(false);\n expect(parsed.RunID).toBe('run-9');\n });\n\n it('treats success as true unless explicitly false', () => {\n const parsed = ParseDelegationResultJson(JSON.stringify({ output: 'no flag' }));\n expect(parsed.Success).toBe(true);\n expect(parsed.Output).toBe('no flag');\n });\n\n it('surfaces a non-JSON payload as the raw output (success assumed)', () => {\n const parsed = ParseDelegationResultJson('plain text result');\n expect(parsed).toEqual({ Success: true, Output: 'plain text result' });\n });\n\n it('prefers output over error when both are present', () => {\n const parsed = ParseDelegationResultJson(JSON.stringify({ success: false, output: 'partial', error: 'late failure' }));\n expect(parsed.Output).toBe('partial');\n });\n\n describe('artifacts', () => {\n it('parses artifacts into PascalCase entries', () => {\n const parsed = ParseDelegationResultJson(JSON.stringify({\n success: true,\n output: 'done',\n runId: 'run-1',\n artifacts: [{ artifactId: 'a-1', artifactVersionId: 'av-1', name: 'Weather Report' }]\n }));\n expect(parsed.Artifacts).toEqual([\n { ArtifactID: 'a-1', ArtifactVersionID: 'av-1', Name: 'Weather Report' }\n ]);\n });\n\n it('leaves Artifacts undefined when the field is absent', () => {\n const parsed = ParseDelegationResultJson(JSON.stringify({ success: true, output: 'done' }));\n expect(parsed.Artifacts).toBeUndefined();\n });\n\n it('leaves Artifacts undefined for an empty array', () => {\n const parsed = ParseDelegationResultJson(JSON.stringify({ success: true, output: 'done', artifacts: [] }));\n expect(parsed.Artifacts).toBeUndefined();\n });\n\n it('leaves Artifacts undefined when the field is not an array', () => {\n const parsed = ParseDelegationResultJson(JSON.stringify({ success: true, output: 'done', artifacts: 'nope' }));\n expect(parsed.Artifacts).toBeUndefined();\n });\n\n it('drops malformed entries (missing ids) and keeps valid ones', () => {\n const parsed = ParseDelegationResultJson(JSON.stringify({\n success: true,\n output: 'done',\n artifacts: [\n { artifactId: 'a-1' }, // no version id → dropped\n { artifactVersionId: 'av-2' }, // no artifact id → dropped\n { artifactId: 42, artifactVersionId: 'av-3' }, // non-string id → dropped\n { artifactId: 'a-4', artifactVersionId: 'av-4', name: 'Kept' }\n ]\n }));\n expect(parsed.Artifacts).toEqual([{ ArtifactID: 'a-4', ArtifactVersionID: 'av-4', Name: 'Kept' }]);\n });\n\n it('falls back to \"Artifact\" for a missing or blank name', () => {\n const parsed = ParseDelegationResultJson(JSON.stringify({\n success: true,\n output: 'done',\n artifacts: [\n { artifactId: 'a-1', artifactVersionId: 'av-1' },\n { artifactId: 'a-2', artifactVersionId: 'av-2', name: ' ' }\n ]\n }));\n expect(parsed.Artifacts?.map(a => a.Name)).toEqual(['Artifact', 'Artifact']);\n });\n\n it('trims artifact names', () => {\n const parsed = ParseDelegationResultJson(JSON.stringify({\n success: true,\n output: 'done',\n artifacts: [{ artifactId: 'a-1', artifactVersionId: 'av-1', name: ' Q3 Summary ' }]\n }));\n expect(parsed.Artifacts?.[0].Name).toBe('Q3 Summary');\n });\n\n it('still carries artifacts on a failed result that reported them', () => {\n const parsed = ParseDelegationResultJson(JSON.stringify({\n success: false,\n error: 'partial failure',\n artifacts: [{ artifactId: 'a-1', artifactVersionId: 'av-1', name: 'Partial' }]\n }));\n expect(parsed.Success).toBe(false);\n expect(parsed.Artifacts).toHaveLength(1);\n });\n });\n});\n"]}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=distinct-artifacts.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"distinct-artifacts.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/distinct-artifacts.test.ts"],"names":[],"mappings":""}
@@ -1,56 +0,0 @@
1
- import { describe, it, expect } from 'vitest';
2
- import { selectDistinctLatestArtifacts } from '../lib/utils/distinct-artifacts';
3
- /**
4
- * Regression guard for the bug where a message carrying TWO distinct artifacts
5
- * (e.g. a research report + a standalone generated infographic) only ever showed
6
- * ONE of them — the message list previously displayed `artifactList[length - 1]`,
7
- * silently hiding the report behind the image. The fix surfaces every distinct
8
- * artifact (latest version each); these tests lock that behavior in.
9
- */
10
- describe('selectDistinctLatestArtifacts', () => {
11
- const make = (artifactId, versionNumber, tag = '') => ({ artifactId, versionNumber, tag });
12
- it('returns an empty array for empty input', () => {
13
- expect(selectDistinctLatestArtifacts([])).toEqual([]);
14
- });
15
- it('keeps BOTH distinct artifacts (the report-hidden-behind-image bug)', () => {
16
- const report = make('report-id', 1, 'report');
17
- const image = make('image-id', 1, 'image');
18
- const result = selectDistinctLatestArtifacts([report, image]);
19
- expect(result).toHaveLength(2);
20
- expect(result.map(r => r.artifactId)).toEqual(['report-id', 'image-id']);
21
- });
22
- it('collapses multiple versions of the SAME artifact to the latest', () => {
23
- const v1 = make('a', 1, 'v1');
24
- const v2 = make('a', 2, 'v2');
25
- const v3 = make('a', 3, 'v3');
26
- const result = selectDistinctLatestArtifacts([v1, v3, v2]);
27
- expect(result).toHaveLength(1);
28
- expect(result[0].versionNumber).toBe(3);
29
- expect(result[0].tag).toBe('v3');
30
- });
31
- it('handles a mix: distinct artifacts each collapsed to their latest version', () => {
32
- const reportV1 = make('report', 1, 'r1');
33
- const reportV2 = make('report', 2, 'r2');
34
- const image = make('image', 1, 'img');
35
- const result = selectDistinctLatestArtifacts([reportV1, image, reportV2]);
36
- expect(result).toHaveLength(2);
37
- const byId = Object.fromEntries(result.map(r => [r.artifactId, r]));
38
- expect(byId['report'].versionNumber).toBe(2);
39
- expect(byId['report'].tag).toBe('r2');
40
- expect(byId['image'].versionNumber).toBe(1);
41
- });
42
- it('preserves first-seen ordering of distinct artifacts', () => {
43
- const image = make('image', 1);
44
- const report = make('report', 1);
45
- // image seen first → image stays first even though report has a later update
46
- const result = selectDistinctLatestArtifacts([image, report, make('report', 2)]);
47
- expect(result.map(r => r.artifactId)).toEqual(['image', 'report']);
48
- });
49
- it('does not mutate the input array', () => {
50
- const input = [make('a', 1), make('a', 2), make('b', 1)];
51
- const copy = [...input];
52
- selectDistinctLatestArtifacts(input);
53
- expect(input).toEqual(copy);
54
- });
55
- });
56
- //# sourceMappingURL=distinct-artifacts.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"distinct-artifacts.test.js","sourceRoot":"","sources":["../../src/__tests__/distinct-artifacts.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { describe, it, expect } from 'vitest';\nimport { selectDistinctLatestArtifacts } from '../lib/utils/distinct-artifacts';\n\n/**\n * Regression guard for the bug where a message carrying TWO distinct artifacts\n * (e.g. a research report + a standalone generated infographic) only ever showed\n * ONE of them — the message list previously displayed `artifactList[length - 1]`,\n * silently hiding the report behind the image. The fix surfaces every distinct\n * artifact (latest version each); these tests lock that behavior in.\n */\ndescribe('selectDistinctLatestArtifacts', () => {\n const make = (artifactId: string, versionNumber: number, tag = '') =>\n ({ artifactId, versionNumber, tag });\n\n it('returns an empty array for empty input', () => {\n expect(selectDistinctLatestArtifacts([])).toEqual([]);\n });\n\n it('keeps BOTH distinct artifacts (the report-hidden-behind-image bug)', () => {\n const report = make('report-id', 1, 'report');\n const image = make('image-id', 1, 'image');\n const result = selectDistinctLatestArtifacts([report, image]);\n\n expect(result).toHaveLength(2);\n expect(result.map(r => r.artifactId)).toEqual(['report-id', 'image-id']);\n });\n\n it('collapses multiple versions of the SAME artifact to the latest', () => {\n const v1 = make('a', 1, 'v1');\n const v2 = make('a', 2, 'v2');\n const v3 = make('a', 3, 'v3');\n const result = selectDistinctLatestArtifacts([v1, v3, v2]);\n\n expect(result).toHaveLength(1);\n expect(result[0].versionNumber).toBe(3);\n expect(result[0].tag).toBe('v3');\n });\n\n it('handles a mix: distinct artifacts each collapsed to their latest version', () => {\n const reportV1 = make('report', 1, 'r1');\n const reportV2 = make('report', 2, 'r2');\n const image = make('image', 1, 'img');\n const result = selectDistinctLatestArtifacts([reportV1, image, reportV2]);\n\n expect(result).toHaveLength(2);\n const byId = Object.fromEntries(result.map(r => [r.artifactId, r]));\n expect(byId['report'].versionNumber).toBe(2);\n expect(byId['report'].tag).toBe('r2');\n expect(byId['image'].versionNumber).toBe(1);\n });\n\n it('preserves first-seen ordering of distinct artifacts', () => {\n const image = make('image', 1);\n const report = make('report', 1);\n // image seen first → image stays first even though report has a later update\n const result = selectDistinctLatestArtifacts([image, report, make('report', 2)]);\n expect(result.map(r => r.artifactId)).toEqual(['image', 'report']);\n });\n\n it('does not mutate the input array', () => {\n const input = [make('a', 1), make('a', 2), make('b', 1)];\n const copy = [...input];\n selectDistinctLatestArtifacts(input);\n expect(input).toEqual(copy);\n });\n});\n"]}
@@ -1,15 +0,0 @@
1
- /**
2
- * @fileoverview Tests for the Before/After cancelable event wiring.
3
- *
4
- * Covers the cancel semantics of `BeforeAgentTurnEventArgs` and
5
- * `BeforeResponseFormSubmittedEventArgs` — the contracts the wiring relies on.
6
- * The full Angular emit-then-react flow (subscribing on the EventEmitter and
7
- * having the synchronous cancel propagate through component event re-emit
8
- * bindings) is integration territory that needs TestBed + DOM, but the
9
- * per-event contract — "Cancel = false by default, flip to true halts the
10
- * default behavior, payload fields round-trip" — is what the firing code in
11
- * message-input + message-item actually depends on. Tested without Angular
12
- * instantiation here so it runs fast and stays decoupled from the framework.
13
- */
14
- export {};
15
- //# sourceMappingURL=event-wiring.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"event-wiring.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/event-wiring.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG"}
@@ -1,100 +0,0 @@
1
- /**
2
- * @fileoverview Tests for the Before/After cancelable event wiring.
3
- *
4
- * Covers the cancel semantics of `BeforeAgentTurnEventArgs` and
5
- * `BeforeResponseFormSubmittedEventArgs` — the contracts the wiring relies on.
6
- * The full Angular emit-then-react flow (subscribing on the EventEmitter and
7
- * having the synchronous cancel propagate through component event re-emit
8
- * bindings) is integration territory that needs TestBed + DOM, but the
9
- * per-event contract — "Cancel = false by default, flip to true halts the
10
- * default behavior, payload fields round-trip" — is what the firing code in
11
- * message-input + message-item actually depends on. Tested without Angular
12
- * instantiation here so it runs fast and stays decoupled from the framework.
13
- */
14
- import { describe, it, expect } from 'vitest';
15
- import { BeforeAgentTurnEventArgs, AfterAgentTurnEventArgs, BeforeResponseFormSubmittedEventArgs, AfterResponseFormSubmittedEventArgs, } from '../lib/events/chat-events';
16
- describe('Before/After event wiring contracts', () => {
17
- describe('BeforeAgentTurnEventArgs (wired in message-input.component)', () => {
18
- it('defaults Cancel to false — agent turn proceeds when no listener intervenes', () => {
19
- const e = new BeforeAgentTurnEventArgs('conv-1', 'hello', 'app-1');
20
- expect(e.Cancel).toBe(false);
21
- });
22
- it('lets a listener flip Cancel to true — wiring should bail before processMessage', () => {
23
- const e = new BeforeAgentTurnEventArgs('conv-1', 'hello', null);
24
- // Listener simulation
25
- e.Cancel = true;
26
- e.CancelReason = 'rate-limited';
27
- expect(e.Cancel).toBe(true);
28
- expect(e.CancelReason).toBe('rate-limited');
29
- });
30
- it('payload fields round-trip — listeners can read what was emitted', () => {
31
- const e = new BeforeAgentTurnEventArgs('conv-xyz', 'send me data', 'app-abc');
32
- expect(e.ConversationId).toBe('conv-xyz');
33
- expect(e.MessageText).toBe('send me data');
34
- expect(e.ApplicationId).toBe('app-abc');
35
- });
36
- it('null applicationId is preserved (surfaces with no app context)', () => {
37
- const e = new BeforeAgentTurnEventArgs('conv-1', 'hi', null);
38
- expect(e.ApplicationId).toBeNull();
39
- });
40
- it('default applicationId is null when omitted (constructor default)', () => {
41
- const e = new BeforeAgentTurnEventArgs('conv-1', 'hi');
42
- expect(e.ApplicationId).toBeNull();
43
- });
44
- });
45
- describe('AfterAgentTurnEventArgs (wired in message-input.component)', () => {
46
- it('carries the agent run id and result payload as readonly fields', () => {
47
- const result = { success: true, executionTimeMs: 123 };
48
- const e = new AfterAgentTurnEventArgs('conv-1', 'run-abc', result);
49
- expect(e.ConversationId).toBe('conv-1');
50
- expect(e.AgentRunId).toBe('run-abc');
51
- expect(e.Result).toBe(result);
52
- });
53
- });
54
- describe('BeforeResponseFormSubmittedEventArgs (wired in message-item.component)', () => {
55
- it('defaults Cancel to false — form submission proceeds when no listener intervenes', () => {
56
- const e = new BeforeResponseFormSubmittedEventArgs('msg-1', { q1: 'yes' });
57
- expect(e.Cancel).toBe(false);
58
- });
59
- it('lets a listener flip Cancel to true — wiring should skip suggestedResponseSelected emit', () => {
60
- const e = new BeforeResponseFormSubmittedEventArgs('msg-1', { q1: 'yes' });
61
- e.Cancel = true;
62
- e.CancelReason = 'validation failed';
63
- expect(e.Cancel).toBe(true);
64
- expect(e.CancelReason).toBe('validation failed');
65
- });
66
- it('uses the message ID as the form id (stable per-message identifier)', () => {
67
- const e = new BeforeResponseFormSubmittedEventArgs('msg-xyz', {});
68
- expect(e.FormId).toBe('msg-xyz');
69
- });
70
- it('carries the submitted values map as a readonly field', () => {
71
- const vals = { feedback: 'great', rating: 5, agree: true };
72
- const e = new BeforeResponseFormSubmittedEventArgs('msg-1', vals);
73
- expect(e.Values).toEqual(vals);
74
- });
75
- });
76
- describe('AfterResponseFormSubmittedEventArgs (wired in message-item.component)', () => {
77
- it('mirrors the Before event payload (form id + values)', () => {
78
- const vals = { feedback: 'great', rating: 5 };
79
- const before = new BeforeResponseFormSubmittedEventArgs('msg-1', vals);
80
- const after = new AfterResponseFormSubmittedEventArgs(before.FormId, before.Values);
81
- expect(after.FormId).toBe('msg-1');
82
- expect(after.Values).toEqual(vals);
83
- });
84
- });
85
- describe('wiring assumptions (documenting the firing-code contract)', () => {
86
- it('cancel semantics are synchronous — flipping Cancel inside the same call is sufficient', () => {
87
- // The message-input + message-item firing code calls .emit(event), then checks
88
- // event.Cancel BEFORE proceeding. This is correct because Angular's EventEmitter
89
- // is synchronous by default (extends Subject), so all subscribers run before
90
- // .emit() returns. Verify the contract: mutations to the event during a
91
- // synchronous "listener" are visible after the synchronous call chain returns.
92
- const e = new BeforeAgentTurnEventArgs('conv-1', 'hi');
93
- (function listener(eventArgs) {
94
- eventArgs.Cancel = true;
95
- })(e);
96
- expect(e.Cancel).toBe(true);
97
- });
98
- });
99
- });
100
- //# sourceMappingURL=event-wiring.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"event-wiring.test.js","sourceRoot":"","sources":["../../src/__tests__/event-wiring.test.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @fileoverview Tests for the Before/After cancelable event wiring.\n *\n * Covers the cancel semantics of `BeforeAgentTurnEventArgs` and\n * `BeforeResponseFormSubmittedEventArgs` — the contracts the wiring relies on.\n * The full Angular emit-then-react flow (subscribing on the EventEmitter and\n * having the synchronous cancel propagate through component event re-emit\n * bindings) is integration territory that needs TestBed + DOM, but the\n * per-event contract — \"Cancel = false by default, flip to true halts the\n * default behavior, payload fields round-trip\" — is what the firing code in\n * message-input + message-item actually depends on. Tested without Angular\n * instantiation here so it runs fast and stays decoupled from the framework.\n */\n\nimport { describe, it, expect } from 'vitest';\n\nimport {\n BeforeAgentTurnEventArgs,\n AfterAgentTurnEventArgs,\n BeforeResponseFormSubmittedEventArgs,\n AfterResponseFormSubmittedEventArgs,\n} from '../lib/events/chat-events';\n\ndescribe('Before/After event wiring contracts', () => {\n describe('BeforeAgentTurnEventArgs (wired in message-input.component)', () => {\n it('defaults Cancel to false — agent turn proceeds when no listener intervenes', () => {\n const e = new BeforeAgentTurnEventArgs('conv-1', 'hello', 'app-1');\n expect(e.Cancel).toBe(false);\n });\n\n it('lets a listener flip Cancel to true — wiring should bail before processMessage', () => {\n const e = new BeforeAgentTurnEventArgs('conv-1', 'hello', null);\n // Listener simulation\n e.Cancel = true;\n e.CancelReason = 'rate-limited';\n expect(e.Cancel).toBe(true);\n expect(e.CancelReason).toBe('rate-limited');\n });\n\n it('payload fields round-trip — listeners can read what was emitted', () => {\n const e = new BeforeAgentTurnEventArgs('conv-xyz', 'send me data', 'app-abc');\n expect(e.ConversationId).toBe('conv-xyz');\n expect(e.MessageText).toBe('send me data');\n expect(e.ApplicationId).toBe('app-abc');\n });\n\n it('null applicationId is preserved (surfaces with no app context)', () => {\n const e = new BeforeAgentTurnEventArgs('conv-1', 'hi', null);\n expect(e.ApplicationId).toBeNull();\n });\n\n it('default applicationId is null when omitted (constructor default)', () => {\n const e = new BeforeAgentTurnEventArgs('conv-1', 'hi');\n expect(e.ApplicationId).toBeNull();\n });\n });\n\n describe('AfterAgentTurnEventArgs (wired in message-input.component)', () => {\n it('carries the agent run id and result payload as readonly fields', () => {\n const result = { success: true, executionTimeMs: 123 } as never;\n const e = new AfterAgentTurnEventArgs('conv-1', 'run-abc', result);\n expect(e.ConversationId).toBe('conv-1');\n expect(e.AgentRunId).toBe('run-abc');\n expect(e.Result).toBe(result);\n });\n });\n\n describe('BeforeResponseFormSubmittedEventArgs (wired in message-item.component)', () => {\n it('defaults Cancel to false — form submission proceeds when no listener intervenes', () => {\n const e = new BeforeResponseFormSubmittedEventArgs('msg-1', { q1: 'yes' });\n expect(e.Cancel).toBe(false);\n });\n\n it('lets a listener flip Cancel to true — wiring should skip suggestedResponseSelected emit', () => {\n const e = new BeforeResponseFormSubmittedEventArgs('msg-1', { q1: 'yes' });\n e.Cancel = true;\n e.CancelReason = 'validation failed';\n expect(e.Cancel).toBe(true);\n expect(e.CancelReason).toBe('validation failed');\n });\n\n it('uses the message ID as the form id (stable per-message identifier)', () => {\n const e = new BeforeResponseFormSubmittedEventArgs('msg-xyz', {});\n expect(e.FormId).toBe('msg-xyz');\n });\n\n it('carries the submitted values map as a readonly field', () => {\n const vals = { feedback: 'great', rating: 5, agree: true };\n const e = new BeforeResponseFormSubmittedEventArgs('msg-1', vals);\n expect(e.Values).toEqual(vals);\n });\n });\n\n describe('AfterResponseFormSubmittedEventArgs (wired in message-item.component)', () => {\n it('mirrors the Before event payload (form id + values)', () => {\n const vals = { feedback: 'great', rating: 5 };\n const before = new BeforeResponseFormSubmittedEventArgs('msg-1', vals);\n const after = new AfterResponseFormSubmittedEventArgs(before.FormId, before.Values);\n expect(after.FormId).toBe('msg-1');\n expect(after.Values).toEqual(vals);\n });\n });\n\n describe('wiring assumptions (documenting the firing-code contract)', () => {\n it('cancel semantics are synchronous — flipping Cancel inside the same call is sufficient', () => {\n // The message-input + message-item firing code calls .emit(event), then checks\n // event.Cancel BEFORE proceeding. This is correct because Angular's EventEmitter\n // is synchronous by default (extends Subject), so all subscribers run before\n // .emit() returns. Verify the contract: mutations to the event during a\n // synchronous \"listener\" are visible after the synchronous call chain returns.\n const e = new BeforeAgentTurnEventArgs('conv-1', 'hi');\n (function listener(eventArgs: BeforeAgentTurnEventArgs) {\n eventArgs.Cancel = true;\n })(e);\n expect(e.Cancel).toBe(true);\n });\n });\n});\n"]}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=index.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/index.test.ts"],"names":[],"mappings":""}
@@ -1,7 +0,0 @@
1
- import { describe, it, expect } from 'vitest';
2
- describe('@memberjunction/ng-conversations', () => {
3
- it('should have a passing test', () => {
4
- expect(true).toBe(true);
5
- });
6
- });
7
- //# sourceMappingURL=index.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.test.js","sourceRoot":"","sources":["../../src/__tests__/index.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAE9C,QAAQ,CAAC,kCAAkC,EAAE,GAAG,EAAE;IAChD,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import { describe, it, expect } from 'vitest';\n\ndescribe('@memberjunction/ng-conversations', () => {\n it('should have a passing test', () => {\n expect(true).toBe(true);\n });\n});\n"]}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=narration-template.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"narration-template.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/narration-template.test.ts"],"names":[],"mappings":""}
@@ -1,76 +0,0 @@
1
- /**
2
- * Unit tests for the pure narration-template helpers used by RealtimeSessionService — the DB-driven
3
- * `{{ progressMessage }}` / `{{ priorNarrations }}` / `{{ updateNumber }}` substitution plus the
4
- * built-in fallback for deployments that haven't synced the
5
- * `Realtime Co-Agent - Progress Narration` prompt.
6
- */
7
- import { describe, it, expect } from 'vitest';
8
- import { BuildNarrationInstructions, DefaultNarrationInstructions } from '../lib/services/narration-template';
9
- describe('DefaultNarrationInstructions', () => {
10
- it('embeds the progress digest and keeps the first-person + variation rules', () => {
11
- const out = DefaultNarrationInstructions('Analyzing the request');
12
- expect(out).toContain('Analyzing the request');
13
- expect(out).toContain('FIRST PERSON');
14
- expect(out).toContain('VARY the');
15
- expect(out).toContain('must not be the subject');
16
- expect(out).toContain('Never repeat');
17
- });
18
- it('numbers the update and reports no prior narrations on the first update', () => {
19
- const out = DefaultNarrationInstructions('Fetching', { UpdateNumber: 1 });
20
- expect(out).toContain('update #1');
21
- expect(out).toContain('first spoken update');
22
- });
23
- it('chains prior spoken narrations so the model can build on them', () => {
24
- const out = DefaultNarrationInstructions('Fetching', {
25
- UpdateNumber: 3,
26
- PriorNarrations: ["I'm pulling that up now", 'Got the first batch']
27
- });
28
- expect(out).toContain('update #3');
29
- expect(out).toContain(`- "I'm pulling that up now"`);
30
- expect(out).toContain('- "Got the first batch"');
31
- });
32
- });
33
- describe('BuildNarrationInstructions', () => {
34
- it('substitutes {{ progressMessage }} (spaced token) everywhere it appears', () => {
35
- const template = 'Progress: "{{ progressMessage }}". Repeat: {{ progressMessage }}.';
36
- const out = BuildNarrationInstructions(template, 'Fetching records');
37
- expect(out).toBe('Progress: "Fetching records". Repeat: Fetching records.');
38
- });
39
- it('tolerates the no-spaces {{progressMessage}} variant', () => {
40
- const out = BuildNarrationInstructions('Now: {{progressMessage}}!', 'Running the query');
41
- expect(out).toBe('Now: Running the query!');
42
- });
43
- it('substitutes a mix of both token variants', () => {
44
- const out = BuildNarrationInstructions('A {{ progressMessage }} B {{progressMessage}}', 'x');
45
- expect(out).toBe('A x B x');
46
- });
47
- it('substitutes {{ updateNumber }} and {{ priorNarrations }}', () => {
48
- const template = 'Update #{{ updateNumber }}. Said before:\n{{ priorNarrations }}';
49
- const out = BuildNarrationInstructions(template, 'x', {
50
- UpdateNumber: 2,
51
- PriorNarrations: ['First thing I said']
52
- });
53
- expect(out).toBe('Update #2. Said before:\n- "First thing I said"');
54
- });
55
- it('renders a friendly "nothing yet" for {{ priorNarrations }} on the first update', () => {
56
- const out = BuildNarrationInstructions('Prior: {{ priorNarrations }}', 'x');
57
- expect(out).toContain('first spoken update');
58
- });
59
- it('defaults {{ updateNumber }} to 1 when no options are given', () => {
60
- const out = BuildNarrationInstructions('N={{updateNumber}}', 'x');
61
- expect(out).toBe('N=1');
62
- });
63
- it('falls back to the built-in wording when the template is null', () => {
64
- const out = BuildNarrationInstructions(null, 'Analyzing the request', { UpdateNumber: 2 });
65
- expect(out).toBe(DefaultNarrationInstructions('Analyzing the request', { UpdateNumber: 2 }));
66
- });
67
- it('falls back to the built-in wording when the template is blank', () => {
68
- const out = BuildNarrationInstructions(' ', 'Analyzing the request');
69
- expect(out).toBe(DefaultNarrationInstructions('Analyzing the request'));
70
- });
71
- it('returns a template without tokens unchanged (no accidental injection)', () => {
72
- const out = BuildNarrationInstructions('Say something brief.', 'ignored');
73
- expect(out).toBe('Say something brief.');
74
- });
75
- });
76
- //# sourceMappingURL=narration-template.test.js.map