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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (318) hide show
  1. package/README.md +33 -7
  2. package/dist/lib/components/collection/collection-view.component.d.ts.map +1 -1
  3. package/dist/lib/components/collection/collection-view.component.js +1 -0
  4. package/dist/lib/components/collection/collection-view.component.js.map +1 -1
  5. package/dist/lib/components/composer/ai-composer.component.d.ts +14 -2
  6. package/dist/lib/components/composer/ai-composer.component.d.ts.map +1 -1
  7. package/dist/lib/components/composer/ai-composer.component.js +35 -4
  8. package/dist/lib/components/composer/ai-composer.component.js.map +1 -1
  9. package/dist/lib/components/conversation/conversation-agent-picker.component.d.ts +1 -1
  10. package/dist/lib/components/conversation/conversation-agent-picker.component.js +3 -3
  11. package/dist/lib/components/conversation/conversation-agent-picker.component.js.map +1 -1
  12. package/dist/lib/components/conversation/conversation-chat-area.component.d.ts +651 -53
  13. package/dist/lib/components/conversation/conversation-chat-area.component.d.ts.map +1 -1
  14. package/dist/lib/components/conversation/conversation-chat-area.component.js +3002 -661
  15. package/dist/lib/components/conversation/conversation-chat-area.component.js.map +1 -1
  16. package/dist/lib/components/conversation/forks-popover.component.d.ts +37 -0
  17. package/dist/lib/components/conversation/forks-popover.component.d.ts.map +1 -0
  18. package/dist/lib/components/conversation/forks-popover.component.js +164 -0
  19. package/dist/lib/components/conversation/forks-popover.component.js.map +1 -0
  20. package/dist/lib/components/export/export-modal.component.d.ts +7 -2
  21. package/dist/lib/components/export/export-modal.component.d.ts.map +1 -1
  22. package/dist/lib/components/export/export-modal.component.js +16 -3
  23. package/dist/lib/components/export/export-modal.component.js.map +1 -1
  24. package/dist/lib/components/message/conversation-message-rating.component.d.ts.map +1 -1
  25. package/dist/lib/components/message/conversation-message-rating.component.js +11 -9
  26. package/dist/lib/components/message/conversation-message-rating.component.js.map +1 -1
  27. package/dist/lib/components/message/message-input.component.d.ts +96 -11
  28. package/dist/lib/components/message/message-input.component.d.ts.map +1 -1
  29. package/dist/lib/components/message/message-input.component.js +253 -112
  30. package/dist/lib/components/message/message-input.component.js.map +1 -1
  31. package/dist/lib/components/message/message-item.component.d.ts +304 -16
  32. package/dist/lib/components/message/message-item.component.d.ts.map +1 -1
  33. package/dist/lib/components/message/message-item.component.js +2029 -363
  34. package/dist/lib/components/message/message-item.component.js.map +1 -1
  35. package/dist/lib/components/message/message-list.component.d.ts +101 -22
  36. package/dist/lib/components/message/message-list.component.d.ts.map +1 -1
  37. package/dist/lib/components/message/message-list.component.js +326 -55
  38. package/dist/lib/components/message/message-list.component.js.map +1 -1
  39. package/dist/lib/components/realtime/avatar/realtime-avatar-channel.d.ts +34 -0
  40. package/dist/lib/components/realtime/avatar/realtime-avatar-channel.d.ts.map +1 -0
  41. package/dist/lib/components/realtime/avatar/realtime-avatar-channel.js +75 -0
  42. package/dist/lib/components/realtime/avatar/realtime-avatar-channel.js.map +1 -0
  43. package/dist/lib/components/realtime/avatar/realtime-avatar-surface.component.d.ts +80 -0
  44. package/dist/lib/components/realtime/avatar/realtime-avatar-surface.component.d.ts.map +1 -0
  45. package/dist/lib/components/realtime/avatar/realtime-avatar-surface.component.js +202 -0
  46. package/dist/lib/components/realtime/avatar/realtime-avatar-surface.component.js.map +1 -0
  47. package/dist/lib/components/realtime/capture/realtime-camera-check-card.component.d.ts +45 -0
  48. package/dist/lib/components/realtime/capture/realtime-camera-check-card.component.d.ts.map +1 -0
  49. package/dist/lib/components/realtime/capture/realtime-camera-check-card.component.js +123 -0
  50. package/dist/lib/components/realtime/capture/realtime-camera-check-card.component.js.map +1 -0
  51. package/dist/lib/components/realtime/capture/realtime-capture-channel.d.ts +90 -0
  52. package/dist/lib/components/realtime/capture/realtime-capture-channel.d.ts.map +1 -0
  53. package/dist/lib/components/realtime/capture/realtime-capture-channel.js +223 -0
  54. package/dist/lib/components/realtime/capture/realtime-capture-channel.js.map +1 -0
  55. package/dist/lib/components/realtime/capture/realtime-capture-model.d.ts +98 -0
  56. package/dist/lib/components/realtime/capture/realtime-capture-model.d.ts.map +1 -0
  57. package/dist/lib/components/realtime/capture/realtime-capture-model.js +161 -0
  58. package/dist/lib/components/realtime/capture/realtime-capture-model.js.map +1 -0
  59. package/dist/lib/components/realtime/capture/realtime-capture-surface.component.d.ts +48 -0
  60. package/dist/lib/components/realtime/capture/realtime-capture-surface.component.d.ts.map +1 -0
  61. package/dist/lib/components/realtime/capture/realtime-capture-surface.component.js +205 -0
  62. package/dist/lib/components/realtime/capture/realtime-capture-surface.component.js.map +1 -0
  63. package/dist/lib/components/realtime/channels/client-context-channel.d.ts +19 -2
  64. package/dist/lib/components/realtime/channels/client-context-channel.d.ts.map +1 -1
  65. package/dist/lib/components/realtime/channels/client-context-channel.js +83 -9
  66. package/dist/lib/components/realtime/channels/client-context-channel.js.map +1 -1
  67. package/dist/lib/components/realtime/channels/realtime-channel-pane.component.d.ts +30 -9
  68. package/dist/lib/components/realtime/channels/realtime-channel-pane.component.d.ts.map +1 -1
  69. package/dist/lib/components/realtime/channels/realtime-channel-pane.component.js +78 -14
  70. package/dist/lib/components/realtime/channels/realtime-channel-pane.component.js.map +1 -1
  71. package/dist/lib/components/realtime/identity-verification/identity-verification-channel.d.ts +71 -0
  72. package/dist/lib/components/realtime/identity-verification/identity-verification-channel.d.ts.map +1 -0
  73. package/dist/lib/components/realtime/identity-verification/identity-verification-channel.js +259 -0
  74. package/dist/lib/components/realtime/identity-verification/identity-verification-channel.js.map +1 -0
  75. package/dist/lib/components/realtime/identity-verification/identity-verification-model.d.ts +129 -0
  76. package/dist/lib/components/realtime/identity-verification/identity-verification-model.d.ts.map +1 -0
  77. package/dist/lib/components/realtime/identity-verification/identity-verification-model.js +373 -0
  78. package/dist/lib/components/realtime/identity-verification/identity-verification-model.js.map +1 -0
  79. package/dist/lib/components/realtime/identity-verification/identity-verification-surface.component.d.ts +77 -0
  80. package/dist/lib/components/realtime/identity-verification/identity-verification-surface.component.d.ts.map +1 -0
  81. package/dist/lib/components/realtime/identity-verification/identity-verification-surface.component.js +420 -0
  82. package/dist/lib/components/realtime/identity-verification/identity-verification-surface.component.js.map +1 -0
  83. package/dist/lib/components/realtime/interactive-component/component-contract.d.ts +83 -0
  84. package/dist/lib/components/realtime/interactive-component/component-contract.d.ts.map +1 -0
  85. package/dist/lib/components/realtime/interactive-component/component-contract.js +292 -0
  86. package/dist/lib/components/realtime/interactive-component/component-contract.js.map +1 -0
  87. package/dist/lib/components/realtime/interactive-component/component-data-state.d.ts +39 -0
  88. package/dist/lib/components/realtime/interactive-component/component-data-state.d.ts.map +1 -0
  89. package/dist/lib/components/realtime/interactive-component/component-data-state.js +152 -0
  90. package/dist/lib/components/realtime/interactive-component/component-data-state.js.map +1 -0
  91. package/dist/lib/components/realtime/interactive-component/component-instance-engine.d.ts +109 -0
  92. package/dist/lib/components/realtime/interactive-component/component-instance-engine.d.ts.map +1 -0
  93. package/dist/lib/components/realtime/interactive-component/component-instance-engine.js +146 -0
  94. package/dist/lib/components/realtime/interactive-component/component-instance-engine.js.map +1 -0
  95. package/dist/lib/components/realtime/interactive-component/component-spec-content.d.ts +19 -0
  96. package/dist/lib/components/realtime/interactive-component/component-spec-content.d.ts.map +1 -0
  97. package/dist/lib/components/realtime/interactive-component/component-spec-content.js +39 -0
  98. package/dist/lib/components/realtime/interactive-component/component-spec-content.js.map +1 -0
  99. package/dist/lib/components/realtime/interactive-component/interactive-component-channel.d.ts +183 -0
  100. package/dist/lib/components/realtime/interactive-component/interactive-component-channel.d.ts.map +1 -0
  101. package/dist/lib/components/realtime/interactive-component/interactive-component-channel.js +761 -0
  102. package/dist/lib/components/realtime/interactive-component/interactive-component-channel.js.map +1 -0
  103. package/dist/lib/components/realtime/interactive-component/interactive-component-config.d.ts +25 -0
  104. package/dist/lib/components/realtime/interactive-component/interactive-component-config.d.ts.map +1 -0
  105. package/dist/lib/components/realtime/interactive-component/interactive-component-config.js +57 -0
  106. package/dist/lib/components/realtime/interactive-component/interactive-component-config.js.map +1 -0
  107. package/dist/lib/components/realtime/interactive-component/interactive-component-host.component.d.ts +40 -0
  108. package/dist/lib/components/realtime/interactive-component/interactive-component-host.component.d.ts.map +1 -0
  109. package/dist/lib/components/realtime/interactive-component/interactive-component-host.component.js +97 -0
  110. package/dist/lib/components/realtime/interactive-component/interactive-component-host.component.js.map +1 -0
  111. package/dist/lib/components/realtime/interactive-component/interactive-component-types.d.ts +144 -0
  112. package/dist/lib/components/realtime/interactive-component/interactive-component-types.d.ts.map +1 -0
  113. package/dist/lib/components/realtime/interactive-component/interactive-component-types.js +57 -0
  114. package/dist/lib/components/realtime/interactive-component/interactive-component-types.js.map +1 -0
  115. package/dist/lib/components/realtime/interactive-component/react-component-handle.d.ts +36 -0
  116. package/dist/lib/components/realtime/interactive-component/react-component-handle.d.ts.map +1 -0
  117. package/dist/lib/components/realtime/interactive-component/react-component-handle.js +55 -0
  118. package/dist/lib/components/realtime/interactive-component/react-component-handle.js.map +1 -0
  119. package/dist/lib/components/realtime/interactive-component/realtime-interactive-component-surface.component.d.ts +55 -0
  120. package/dist/lib/components/realtime/interactive-component/realtime-interactive-component-surface.component.d.ts.map +1 -0
  121. package/dist/lib/components/realtime/interactive-component/realtime-interactive-component-surface.component.js +210 -0
  122. package/dist/lib/components/realtime/interactive-component/realtime-interactive-component-surface.component.js.map +1 -0
  123. package/dist/lib/components/realtime/interactive-component/run-view-component-artifact-source.d.ts +32 -0
  124. package/dist/lib/components/realtime/interactive-component/run-view-component-artifact-source.d.ts.map +1 -0
  125. package/dist/lib/components/realtime/interactive-component/run-view-component-artifact-source.js +90 -0
  126. package/dist/lib/components/realtime/interactive-component/run-view-component-artifact-source.js.map +1 -0
  127. package/dist/lib/components/realtime/media/media-channel.d.ts +7 -0
  128. package/dist/lib/components/realtime/media/media-channel.d.ts.map +1 -1
  129. package/dist/lib/components/realtime/media/media-channel.js +28 -1
  130. package/dist/lib/components/realtime/media/media-channel.js.map +1 -1
  131. package/dist/lib/components/realtime/realtime-agent-banner.component.d.ts +8 -1
  132. package/dist/lib/components/realtime/realtime-agent-banner.component.d.ts.map +1 -1
  133. package/dist/lib/components/realtime/realtime-agent-banner.component.js +89 -71
  134. package/dist/lib/components/realtime/realtime-agent-banner.component.js.map +1 -1
  135. package/dist/lib/components/realtime/realtime-agent-orb.component.d.ts +21 -0
  136. package/dist/lib/components/realtime/realtime-agent-orb.component.d.ts.map +1 -0
  137. package/dist/lib/components/realtime/realtime-agent-orb.component.js +49 -0
  138. package/dist/lib/components/realtime/realtime-agent-orb.component.js.map +1 -0
  139. package/dist/lib/components/realtime/realtime-agent-picker.component.d.ts +44 -11
  140. package/dist/lib/components/realtime/realtime-agent-picker.component.d.ts.map +1 -1
  141. package/dist/lib/components/realtime/realtime-agent-picker.component.js +162 -50
  142. package/dist/lib/components/realtime/realtime-agent-picker.component.js.map +1 -1
  143. package/dist/lib/components/realtime/realtime-audio-visuals.d.ts +8 -2
  144. package/dist/lib/components/realtime/realtime-audio-visuals.d.ts.map +1 -1
  145. package/dist/lib/components/realtime/realtime-audio-visuals.js +14 -18
  146. package/dist/lib/components/realtime/realtime-audio-visuals.js.map +1 -1
  147. package/dist/lib/components/realtime/realtime-composer.component.d.ts +42 -2
  148. package/dist/lib/components/realtime/realtime-composer.component.d.ts.map +1 -1
  149. package/dist/lib/components/realtime/realtime-composer.component.js +137 -102
  150. package/dist/lib/components/realtime/realtime-composer.component.js.map +1 -1
  151. package/dist/lib/components/realtime/realtime-perception-chip.component.d.ts +71 -0
  152. package/dist/lib/components/realtime/realtime-perception-chip.component.d.ts.map +1 -0
  153. package/dist/lib/components/realtime/realtime-perception-chip.component.js +221 -0
  154. package/dist/lib/components/realtime/realtime-perception-chip.component.js.map +1 -0
  155. package/dist/lib/components/realtime/realtime-session-overlay.component.d.ts +264 -22
  156. package/dist/lib/components/realtime/realtime-session-overlay.component.d.ts.map +1 -1
  157. package/dist/lib/components/realtime/realtime-session-overlay.component.js +851 -135
  158. package/dist/lib/components/realtime/realtime-session-overlay.component.js.map +1 -1
  159. package/dist/lib/components/realtime/realtime-surface-placement-prefs.d.ts +14 -0
  160. package/dist/lib/components/realtime/realtime-surface-placement-prefs.d.ts.map +1 -0
  161. package/dist/lib/components/realtime/realtime-surface-placement-prefs.js +14 -0
  162. package/dist/lib/components/realtime/realtime-surface-placement-prefs.js.map +1 -0
  163. package/dist/lib/components/realtime/realtime-surface-stage.model.d.ts +74 -0
  164. package/dist/lib/components/realtime/realtime-surface-stage.model.d.ts.map +1 -0
  165. package/dist/lib/components/realtime/realtime-surface-stage.model.js +171 -0
  166. package/dist/lib/components/realtime/realtime-surface-stage.model.js.map +1 -0
  167. package/dist/lib/components/realtime/realtime-surface-tabs.component.d.ts +71 -13
  168. package/dist/lib/components/realtime/realtime-surface-tabs.component.d.ts.map +1 -1
  169. package/dist/lib/components/realtime/realtime-surface-tabs.component.js +232 -73
  170. package/dist/lib/components/realtime/realtime-surface-tabs.component.js.map +1 -1
  171. package/dist/lib/components/realtime/realtime-surface-tabs.model.d.ts +5 -0
  172. package/dist/lib/components/realtime/realtime-surface-tabs.model.d.ts.map +1 -1
  173. package/dist/lib/components/realtime/realtime-surface-tabs.model.js +8 -0
  174. package/dist/lib/components/realtime/realtime-surface-tabs.model.js.map +1 -1
  175. package/dist/lib/components/realtime/realtime-ui-config.d.ts +12 -2
  176. package/dist/lib/components/realtime/realtime-ui-config.d.ts.map +1 -1
  177. package/dist/lib/components/realtime/realtime-ui-config.js +5 -1
  178. package/dist/lib/components/realtime/realtime-ui-config.js.map +1 -1
  179. package/dist/lib/components/realtime/remote-browser/remote-browser-channel.d.ts +10 -1
  180. package/dist/lib/components/realtime/remote-browser/remote-browser-channel.d.ts.map +1 -1
  181. package/dist/lib/components/realtime/remote-browser/remote-browser-channel.js +42 -2
  182. package/dist/lib/components/realtime/remote-browser/remote-browser-channel.js.map +1 -1
  183. package/dist/lib/components/realtime/remote-browser/remote-browser-surface.component.d.ts +20 -3
  184. package/dist/lib/components/realtime/remote-browser/remote-browser-surface.component.d.ts.map +1 -1
  185. package/dist/lib/components/realtime/remote-browser/remote-browser-surface.component.js +44 -10
  186. package/dist/lib/components/realtime/remote-browser/remote-browser-surface.component.js.map +1 -1
  187. package/dist/lib/components/realtime/whiteboard/whiteboard-channel.d.ts +28 -44
  188. package/dist/lib/components/realtime/whiteboard/whiteboard-channel.d.ts.map +1 -1
  189. package/dist/lib/components/realtime/whiteboard/whiteboard-channel.js +76 -162
  190. package/dist/lib/components/realtime/whiteboard/whiteboard-channel.js.map +1 -1
  191. package/dist/lib/components/search/search-panel.component.d.ts +2 -0
  192. package/dist/lib/components/search/search-panel.component.d.ts.map +1 -1
  193. package/dist/lib/components/search/search-panel.component.js +25 -12
  194. package/dist/lib/components/search/search-panel.component.js.map +1 -1
  195. package/dist/lib/components/sidebar/routines-section.component.js +1 -1
  196. package/dist/lib/components/sidebar/routines-section.component.js.map +1 -1
  197. package/dist/lib/components/task/tasks-full-view.component.d.ts +152 -31
  198. package/dist/lib/components/task/tasks-full-view.component.d.ts.map +1 -1
  199. package/dist/lib/components/task/tasks-full-view.component.js +2227 -214
  200. package/dist/lib/components/task/tasks-full-view.component.js.map +1 -1
  201. package/dist/lib/components/tasks/tasks-dropdown.component.js +4 -4
  202. package/dist/lib/components/tasks/tasks-dropdown.component.js.map +1 -1
  203. package/dist/lib/components/workspace/conversation-workspace.component.d.ts +33 -32
  204. package/dist/lib/components/workspace/conversation-workspace.component.d.ts.map +1 -1
  205. package/dist/lib/components/workspace/conversation-workspace.component.js +72 -88
  206. package/dist/lib/components/workspace/conversation-workspace.component.js.map +1 -1
  207. package/dist/lib/conversations.module.d.ts +30 -29
  208. package/dist/lib/conversations.module.d.ts.map +1 -1
  209. package/dist/lib/conversations.module.js +27 -5
  210. package/dist/lib/conversations.module.js.map +1 -1
  211. package/dist/lib/events/chat-events.d.ts +25 -0
  212. package/dist/lib/events/chat-events.d.ts.map +1 -1
  213. package/dist/lib/events/chat-events.js +36 -0
  214. package/dist/lib/events/chat-events.js.map +1 -1
  215. package/dist/lib/models/agent-turn.model.d.ts +5 -0
  216. package/dist/lib/models/agent-turn.model.d.ts.map +1 -1
  217. package/dist/lib/models/agent-turn.model.js.map +1 -1
  218. package/dist/lib/services/agent-state.service.d.ts +34 -8
  219. package/dist/lib/services/agent-state.service.d.ts.map +1 -1
  220. package/dist/lib/services/agent-state.service.js +90 -37
  221. package/dist/lib/services/agent-state.service.js.map +1 -1
  222. package/dist/lib/services/artifact-state.service.d.ts +0 -9
  223. package/dist/lib/services/artifact-state.service.d.ts.map +1 -1
  224. package/dist/lib/services/artifact-state.service.js +1 -32
  225. package/dist/lib/services/artifact-state.service.js.map +1 -1
  226. package/dist/lib/services/browser-realtime-media-host.d.ts +19 -7
  227. package/dist/lib/services/browser-realtime-media-host.d.ts.map +1 -1
  228. package/dist/lib/services/browser-realtime-media-host.js +21 -72
  229. package/dist/lib/services/browser-realtime-media-host.js.map +1 -1
  230. package/dist/lib/services/conversation-agent.service.d.ts +48 -16
  231. package/dist/lib/services/conversation-agent.service.d.ts.map +1 -1
  232. package/dist/lib/services/conversation-agent.service.js +110 -35
  233. package/dist/lib/services/conversation-agent.service.js.map +1 -1
  234. package/dist/lib/services/conversation-detail-window.store.d.ts +22 -4
  235. package/dist/lib/services/conversation-detail-window.store.d.ts.map +1 -1
  236. package/dist/lib/services/conversation-detail-window.store.js +50 -9
  237. package/dist/lib/services/conversation-detail-window.store.js.map +1 -1
  238. package/dist/lib/services/conversation-naming.d.ts +72 -22
  239. package/dist/lib/services/conversation-naming.d.ts.map +1 -1
  240. package/dist/lib/services/conversation-naming.js +93 -12
  241. package/dist/lib/services/conversation-naming.js.map +1 -1
  242. package/dist/lib/services/conversation-tasks-filter.d.ts +15 -0
  243. package/dist/lib/services/conversation-tasks-filter.d.ts.map +1 -0
  244. package/dist/lib/services/conversation-tasks-filter.js +69 -0
  245. package/dist/lib/services/conversation-tasks-filter.js.map +1 -0
  246. package/dist/lib/services/data-cache.service.d.ts +13 -5
  247. package/dist/lib/services/data-cache.service.d.ts.map +1 -1
  248. package/dist/lib/services/data-cache.service.js +39 -19
  249. package/dist/lib/services/data-cache.service.js.map +1 -1
  250. package/dist/lib/services/export.service.d.ts +26 -9
  251. package/dist/lib/services/export.service.d.ts.map +1 -1
  252. package/dist/lib/services/export.service.js +61 -18
  253. package/dist/lib/services/export.service.js.map +1 -1
  254. package/dist/lib/services/realtime-audio-recorder.d.ts +115 -79
  255. package/dist/lib/services/realtime-audio-recorder.d.ts.map +1 -1
  256. package/dist/lib/services/realtime-audio-recorder.js +273 -186
  257. package/dist/lib/services/realtime-audio-recorder.js.map +1 -1
  258. package/dist/lib/services/realtime-pairing.d.ts +10 -5
  259. package/dist/lib/services/realtime-pairing.d.ts.map +1 -1
  260. package/dist/lib/services/realtime-pairing.js +15 -6
  261. package/dist/lib/services/realtime-pairing.js.map +1 -1
  262. package/dist/lib/services/realtime-session.service.d.ts +31 -2
  263. package/dist/lib/services/realtime-session.service.d.ts.map +1 -1
  264. package/dist/lib/services/realtime-session.service.js +34 -2
  265. package/dist/lib/services/realtime-session.service.js.map +1 -1
  266. package/dist/lib/services/recording/libopus-wasm-binary.d.ts +3 -0
  267. package/dist/lib/services/recording/libopus-wasm-binary.d.ts.map +1 -0
  268. package/dist/lib/services/recording/libopus-wasm-binary.js +489 -0
  269. package/dist/lib/services/recording/libopus-wasm-binary.js.map +1 -0
  270. package/dist/lib/services/recording/libopus-worker-source.d.ts +48 -0
  271. package/dist/lib/services/recording/libopus-worker-source.d.ts.map +1 -0
  272. package/dist/lib/services/recording/libopus-worker-source.js +170 -0
  273. package/dist/lib/services/recording/libopus-worker-source.js.map +1 -0
  274. package/dist/lib/services/recording/linear-resampler.d.ts +45 -0
  275. package/dist/lib/services/recording/linear-resampler.d.ts.map +1 -0
  276. package/dist/lib/services/recording/linear-resampler.js +85 -0
  277. package/dist/lib/services/recording/linear-resampler.js.map +1 -0
  278. package/dist/lib/services/recording/opus-packet-encoder.d.ts +50 -0
  279. package/dist/lib/services/recording/opus-packet-encoder.d.ts.map +1 -0
  280. package/dist/lib/services/recording/opus-packet-encoder.js +41 -0
  281. package/dist/lib/services/recording/opus-packet-encoder.js.map +1 -0
  282. package/dist/lib/services/recording/wasm-opus-encoder.d.ts +86 -0
  283. package/dist/lib/services/recording/wasm-opus-encoder.d.ts.map +1 -0
  284. package/dist/lib/services/recording/wasm-opus-encoder.js +232 -0
  285. package/dist/lib/services/recording/wasm-opus-encoder.js.map +1 -0
  286. package/dist/lib/services/recording/webcodecs-opus-encoder.d.ts +39 -0
  287. package/dist/lib/services/recording/webcodecs-opus-encoder.d.ts.map +1 -0
  288. package/dist/lib/services/recording/webcodecs-opus-encoder.js +101 -0
  289. package/dist/lib/services/recording/webcodecs-opus-encoder.js.map +1 -0
  290. package/dist/lib/services/search.service.d.ts +7 -2
  291. package/dist/lib/services/search.service.d.ts.map +1 -1
  292. package/dist/lib/services/search.service.js +16 -20
  293. package/dist/lib/services/search.service.js.map +1 -1
  294. package/dist/lib/utils/conversation-branching.d.ts +4 -0
  295. package/dist/lib/utils/conversation-branching.d.ts.map +1 -0
  296. package/dist/lib/utils/conversation-branching.js +5 -0
  297. package/dist/lib/utils/conversation-branching.js.map +1 -0
  298. package/dist/lib/utils/conversation-forks.d.ts +315 -0
  299. package/dist/lib/utils/conversation-forks.d.ts.map +1 -0
  300. package/dist/lib/utils/conversation-forks.js +456 -0
  301. package/dist/lib/utils/conversation-forks.js.map +1 -0
  302. package/dist/lib/utils/distinct-artifacts.d.ts +9 -3
  303. package/dist/lib/utils/distinct-artifacts.d.ts.map +1 -1
  304. package/dist/lib/utils/distinct-artifacts.js +24 -5
  305. package/dist/lib/utils/distinct-artifacts.js.map +1 -1
  306. package/dist/public-api.d.ts +23 -1
  307. package/dist/public-api.d.ts.map +1 -1
  308. package/dist/public-api.js +30 -1
  309. package/dist/public-api.js.map +1 -1
  310. package/package.json +37 -33
  311. package/dist/lib/components/thread/thread-panel.component.d.ts +0 -126
  312. package/dist/lib/components/thread/thread-panel.component.d.ts.map +0 -1
  313. package/dist/lib/components/thread/thread-panel.component.js +0 -440
  314. package/dist/lib/components/thread/thread-panel.component.js.map +0 -1
  315. package/dist/lib/services/realtime-pcm-wav.d.ts +0 -79
  316. package/dist/lib/services/realtime-pcm-wav.d.ts.map +0 -1
  317. package/dist/lib/services/realtime-pcm-wav.js +0 -213
  318. package/dist/lib/services/realtime-pcm-wav.js.map +0 -1
@@ -7,6 +7,7 @@ import { SelectDistinctLatestArtifacts } from '../../utils/distinct-artifacts';
7
7
  import { BuildConversationTimeline } from '../../utils/realtime-session-timeline';
8
8
  import { DEFAULT_TRANSCRIPT_PAGE_SIZE } from '../../utils/conversation-detail-window';
9
9
  import { ResolveDateJumpTarget } from '../../utils/date-jump';
10
+ import { EMPTY_FORK_CHIPS } from '../../utils/conversation-forks';
10
11
  import * as i0 from "@angular/core";
11
12
  import * as i1 from "@memberjunction/ng-ui-components";
12
13
  import * as i2 from "@memberjunction/ng-shared-generic";
@@ -16,29 +17,29 @@ const _c2 = ["olderSentinel"];
16
17
  const _c3 = ["spacerTemplate"];
17
18
  function MessageListComponent_Conditional_2_Template(rf, ctx) { if (rf & 1) {
18
19
  const _r1 = i0.ɵɵgetCurrentView();
19
- i0.ɵɵelementStart(0, "div", 5)(1, "div", 8)(2, "button", 9);
20
+ i0.ɵɵelementStart(0, "div", 5)(1, "div", 7)(2, "button", 8);
20
21
  i0.ɵɵlistener("click", function MessageListComponent_Conditional_2_Template_button_click_2_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.toggleDateNav()); });
21
22
  i0.ɵɵelementStart(3, "span");
22
23
  i0.ɵɵtext(4);
23
24
  i0.ɵɵelementEnd();
24
- i0.ɵɵelement(5, "i", 10);
25
+ i0.ɵɵelement(5, "i", 9);
25
26
  i0.ɵɵelementEnd();
26
- i0.ɵɵelementStart(6, "div", 11)(7, "div", 12);
27
+ i0.ɵɵelementStart(6, "div", 10)(7, "div", 11);
27
28
  i0.ɵɵtext(8, "Jump to...");
28
29
  i0.ɵɵelementEnd();
29
- i0.ɵɵelementStart(9, "div", 13);
30
+ i0.ɵɵelementStart(9, "div", 12);
30
31
  i0.ɵɵlistener("click", function MessageListComponent_Conditional_2_Template_div_click_9_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.jumpToDate("today")); });
31
32
  i0.ɵɵtext(10, "Today");
32
33
  i0.ɵɵelementEnd();
33
- i0.ɵɵelementStart(11, "div", 13);
34
+ i0.ɵɵelementStart(11, "div", 12);
34
35
  i0.ɵɵlistener("click", function MessageListComponent_Conditional_2_Template_div_click_11_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.jumpToDate("yesterday")); });
35
36
  i0.ɵɵtext(12, "Yesterday");
36
37
  i0.ɵɵelementEnd();
37
- i0.ɵɵelementStart(13, "div", 13);
38
+ i0.ɵɵelementStart(13, "div", 12);
38
39
  i0.ɵɵlistener("click", function MessageListComponent_Conditional_2_Template_div_click_13_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.jumpToDate("last-week")); });
39
40
  i0.ɵɵtext(14, "Last week");
40
41
  i0.ɵɵelementEnd();
41
- i0.ɵɵelementStart(15, "div", 13);
42
+ i0.ɵɵelementStart(15, "div", 12);
42
43
  i0.ɵɵlistener("click", function MessageListComponent_Conditional_2_Template_div_click_15_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.jumpToDate("last-month")); });
43
44
  i0.ɵɵtext(16, "Last month");
44
45
  i0.ɵɵelementEnd()()()();
@@ -50,16 +51,16 @@ function MessageListComponent_Conditional_2_Template(rf, ctx) { if (rf & 1) {
50
51
  i0.ɵɵclassProp("show", ctx_r1.showDateNav);
51
52
  } }
52
53
  function MessageListComponent_Conditional_3_Conditional_2_Template(rf, ctx) { if (rf & 1) {
53
- i0.ɵɵelement(0, "mj-loading", 14);
54
+ i0.ɵɵelement(0, "mj-loading", 13);
54
55
  } }
55
56
  function MessageListComponent_Conditional_3_Conditional_3_Template(rf, ctx) { if (rf & 1) {
56
- i0.ɵɵelementStart(0, "span", 15);
57
+ i0.ɵɵelementStart(0, "span", 14);
57
58
  i0.ɵɵtext(1, "Earlier messages");
58
59
  i0.ɵɵelementEnd();
59
60
  } }
60
61
  function MessageListComponent_Conditional_3_Template(rf, ctx) { if (rf & 1) {
61
62
  i0.ɵɵelementStart(0, "div", 6, 3);
62
- i0.ɵɵconditionalCreate(2, MessageListComponent_Conditional_3_Conditional_2_Template, 1, 0, "mj-loading", 14)(3, MessageListComponent_Conditional_3_Conditional_3_Template, 2, 0, "span", 15);
63
+ i0.ɵɵconditionalCreate(2, MessageListComponent_Conditional_3_Conditional_2_Template, 1, 0, "mj-loading", 13)(3, MessageListComponent_Conditional_3_Conditional_3_Template, 2, 0, "span", 14);
63
64
  i0.ɵɵelementEnd();
64
65
  } if (rf & 2) {
65
66
  const ctx_r1 = i0.ɵɵnextContext();
@@ -67,13 +68,32 @@ function MessageListComponent_Conditional_3_Template(rf, ctx) { if (rf & 1) {
67
68
  i0.ɵɵconditional(ctx_r1.IsLoadingOlder ? 2 : 3);
68
69
  } }
69
70
  function MessageListComponent_ng_template_4_Template(rf, ctx) { if (rf & 1) {
70
- i0.ɵɵelement(0, "div", 16);
71
+ i0.ɵɵelement(0, "div", 15);
71
72
  } if (rf & 2) {
72
73
  const height_r3 = ctx.height;
73
74
  i0.ɵɵstyleProp("height", height_r3, "px");
74
75
  } }
76
+ function MessageListComponent_Conditional_8_Conditional_0_Template(rf, ctx) { if (rf & 1) {
77
+ i0.ɵɵelementStart(0, "div", 16);
78
+ i0.ɵɵelement(1, "i", 18);
79
+ i0.ɵɵelementStart(2, "span", 19);
80
+ i0.ɵɵtext(3);
81
+ i0.ɵɵelementEnd();
82
+ i0.ɵɵelement(4, "span", 20);
83
+ i0.ɵɵelementEnd();
84
+ } if (rf & 2) {
85
+ const ctx_r1 = i0.ɵɵnextContext(2);
86
+ i0.ɵɵadvance(3);
87
+ i0.ɵɵtextInterpolate(ctx_r1.EmptyViewMarkerText);
88
+ } }
89
+ function MessageListComponent_Conditional_8_Conditional_1_Template(rf, ctx) { if (rf & 1) {
90
+ i0.ɵɵelement(0, "mj-empty-state", 17);
91
+ } }
75
92
  function MessageListComponent_Conditional_8_Template(rf, ctx) { if (rf & 1) {
76
- i0.ɵɵelement(0, "mj-empty-state", 7);
93
+ i0.ɵɵconditionalCreate(0, MessageListComponent_Conditional_8_Conditional_0_Template, 5, 1, "div", 16)(1, MessageListComponent_Conditional_8_Conditional_1_Template, 1, 0, "mj-empty-state", 17);
94
+ } if (rf & 2) {
95
+ const ctx_r1 = i0.ɵɵnextContext();
96
+ i0.ɵɵconditional(ctx_r1.EmptyViewMarkerText ? 0 : ctx_r1.showEmptyFill ? 1 : -1);
77
97
  } }
78
98
  /**
79
99
  * Container component for displaying a list of messages
@@ -104,6 +124,42 @@ export class MessageListComponent extends BaseAngularComponent {
104
124
  get conversation() {
105
125
  return this.Conversation;
106
126
  }
127
+ /** Fork chips per normalized detail id, from the chat area's fork summaries. A new map is pushed into the items on screen. */
128
+ set ForkChipMap(value) {
129
+ this._forkChipMap = value ?? new Map();
130
+ this.applyForkChips();
131
+ }
132
+ get ForkChipMap() {
133
+ return this._forkChipMap ?? new Map();
134
+ }
135
+ _forkChipMap = new Map();
136
+ /** How a fork view draws its rows; null in Main. A new layout is pushed into the items on screen. */
137
+ set ForkLayout(value) {
138
+ this._forkLayout = value ?? null;
139
+ this.applyForkLayout();
140
+ }
141
+ get ForkLayout() {
142
+ return this._forkLayout ?? null;
143
+ }
144
+ _forkLayout = null;
145
+ /** True when the person may start forks; a new value is pushed into the items on screen. False hides the fork actions. */
146
+ set CanFork(value) {
147
+ this._canFork = value !== false;
148
+ this.applyCanFork();
149
+ }
150
+ get CanFork() {
151
+ return this._canFork !== false;
152
+ }
153
+ _canFork = true;
154
+ /** The latest turn that in-place Edit and Regenerate may change; null when there is none. A new value is pushed into the items on screen. */
155
+ set InPlaceTurn(value) {
156
+ this._inPlaceTurn = value ?? null;
157
+ this.applyInPlaceRoles();
158
+ }
159
+ get InPlaceTurn() {
160
+ return this._inPlaceTurn ?? null;
161
+ }
162
+ _inPlaceTurn = null;
107
163
  CurrentUser;
108
164
  /** @deprecated Use {@link CurrentUser}. */
109
165
  set currentUser(value) {
@@ -213,6 +269,23 @@ export class MessageListComponent extends BaseAngularComponent {
213
269
  return this._readOnly;
214
270
  }
215
271
  _readOnly = false;
272
+ /** Whether message items offer Stop on an in-progress agent reply. Default true. */
273
+ AllowStopRun = true;
274
+ /**
275
+ * How many agent replies are in flight in the open view; items offer their own Stop only above
276
+ * one. Changes mid-session as runs start and finish, so it is restamped onto rendered items.
277
+ */
278
+ set InFlightCount(value) {
279
+ if (value === this._inFlightCount) {
280
+ return;
281
+ }
282
+ this._inFlightCount = value;
283
+ this.restampAssistantIdentity();
284
+ }
285
+ get InFlightCount() {
286
+ return this._inFlightCount;
287
+ }
288
+ _inFlightCount = 0;
216
289
  // ── Windowed-transcript paging state ────────────────────────────────────────
217
290
  // The list renders only the LOADED window, not the whole conversation. These two
218
291
  // describe what lies above it. Unused until the Phase 5 sentinel lands; wired now so
@@ -446,15 +519,26 @@ export class MessageListComponent extends BaseAngularComponent {
446
519
  * initialise in order, and the other way round this captures undefined.
447
520
  */
448
521
  deleteMessage = this.DeleteMessage;
522
+ /** Forwarded from MessageItemComponent: the user asked for a new reply in place of an AI reply. */
523
+ RegenerateRequested = new EventEmitter();
524
+ /** @deprecated Use {@link RegenerateRequested}. Emits with it, for hosts that still bind the old name. */
449
525
  RetryMessage = new EventEmitter();
450
526
  /**
451
- * @deprecated Use {@link RetryMessage}.
527
+ * @deprecated Use {@link RegenerateRequested}.
452
528
  *
453
529
  * The same emitter under the old binding name, so a template still binding
454
530
  * (retryMessage) keeps working. Must stay AFTER RetryMessage: class fields
455
531
  * initialise in order, and the other way round this captures undefined.
456
532
  */
457
533
  retryMessage = this.RetryMessage;
534
+ /** Forwarded from MessageItemComponent: the user edited a message to save as a new fork. */
535
+ EditResendRequested = new EventEmitter();
536
+ /** A chip was clicked in one of the items: a fork to open, or the view and message of an original chip. */
537
+ ForkOpenRequested = new EventEmitter();
538
+ /** An item asked to fork the conversation at its message. */
539
+ ForkRequested = new EventEmitter();
540
+ /** Forwarded from MessageItemComponent: "Save and resend" saved a user message; the host reruns its turn. */
541
+ ResendInPlaceRequested = new EventEmitter();
458
542
  TestFeedbackMessage = new EventEmitter();
459
543
  /**
460
544
  * @deprecated Use {@link TestFeedbackMessage}.
@@ -473,24 +557,6 @@ export class MessageListComponent extends BaseAngularComponent {
473
557
  * initialise in order, and the other way round this captures undefined.
474
558
  */
475
559
  artifactClicked = this.ArtifactClicked;
476
- ReplyInThread = new EventEmitter();
477
- /**
478
- * @deprecated Use {@link ReplyInThread}.
479
- *
480
- * The same emitter under the old binding name, so a template still binding
481
- * (replyInThread) keeps working. Must stay AFTER ReplyInThread: class fields
482
- * initialise in order, and the other way round this captures undefined.
483
- */
484
- replyInThread = this.ReplyInThread;
485
- ViewThread = new EventEmitter();
486
- /**
487
- * @deprecated Use {@link ViewThread}.
488
- *
489
- * The same emitter under the old binding name, so a template still binding
490
- * (viewThread) keeps working. Must stay AFTER ViewThread: class fields
491
- * initialise in order, and the other way round this captures undefined.
492
- */
493
- viewThread = this.ViewThread;
494
560
  MessageEdited = new EventEmitter();
495
561
  /**
496
562
  * @deprecated Use {@link MessageEdited}.
@@ -536,6 +602,13 @@ export class MessageListComponent extends BaseAngularComponent {
536
602
  * initialise in order, and the other way round this captures undefined.
537
603
  */
538
604
  diagnosticRequested = this.DiagnosticRequested; // emits messageId
605
+ /**
606
+ * Relays a message item's `BeforeStopClicked`: fired before an in-progress run is stopped,
607
+ * cancelable by setting `event.Cancel = true`.
608
+ */
609
+ BeforeStopClicked = new EventEmitter();
610
+ /** Relays a message item's uncanceled stop request: the host stops the run behind that AI reply. */
611
+ StopMessage = new EventEmitter();
539
612
  MessagePinToggled = new EventEmitter();
540
613
  /**
541
614
  * @deprecated Use {@link MessagePinToggled}.
@@ -577,6 +650,12 @@ export class MessageListComponent extends BaseAngularComponent {
577
650
  * initialise in order, and the other way round this captures undefined.
578
651
  */
579
652
  afterResponseFormSubmitted = this.AfterResponseFormSubmitted;
653
+ TaskGraphPanelRequested = new EventEmitter();
654
+ /** @deprecated Use {@link TaskGraphPanelRequested}. */
655
+ taskGraphPanelRequested = this.TaskGraphPanelRequested;
656
+ ScrollToMessageRequested = new EventEmitter();
657
+ /** @deprecated Use {@link ScrollToMessageRequested}. */
658
+ scrollToMessageRequested = this.ScrollToMessageRequested;
580
659
  /**
581
660
  * Asks the host to load the next older page. Fired when the "earlier messages"
582
661
  * sentinel scrolls into view — never on a raw scroll event, so a fast scroll costs
@@ -821,7 +900,7 @@ export class MessageListComponent extends BaseAngularComponent {
821
900
  * back to the full path for that one update. A spacer or a session card standing in for the
822
901
  * message is a no-op: the entity holds the text and a remount renders it.
823
902
  */
824
- RefreshRenderedMessage(message) {
903
+ RefreshRenderedMessage(message, options) {
825
904
  const existing = this._renderedMessages.get(this.getMessageKey(message));
826
905
  if (!existing) {
827
906
  return false;
@@ -836,7 +915,10 @@ export class MessageListComponent extends BaseAngularComponent {
836
915
  return true;
837
916
  case 'component':
838
917
  existing.ref.instance.message = message;
839
- existing.ref.instance.IsStreaming = true;
918
+ existing.ref.instance.agentRun = this.AgentRunMap?.get(message.ID) || null;
919
+ if (options?.markStreaming !== false) {
920
+ existing.ref.instance.IsStreaming = true;
921
+ }
840
922
  if (!this.isViewDestroyed(existing.ref.changeDetectorRef)) {
841
923
  existing.ref.changeDetectorRef.detectChanges();
842
924
  }
@@ -938,6 +1020,114 @@ export class MessageListComponent extends BaseAngularComponent {
938
1020
  this.updateMessages(this.messages);
939
1021
  }
940
1022
  }
1023
+ /** The fork marker shown on its own when the view has no rows (a draft fork with no earlier rows); null otherwise. */
1024
+ get EmptyViewMarkerText() {
1025
+ const layout = this.ForkLayout;
1026
+ return layout && !layout.MarkerDetailID ? layout.MarkerText : null;
1027
+ }
1028
+ /** The chips placed under a message. */
1029
+ chipsFor(detailId) {
1030
+ return this.ForkChipMap.get(NormalizeUUID(detailId)) ?? EMPTY_FORK_CHIPS;
1031
+ }
1032
+ /** Pushes the current chips into every rendered message component. */
1033
+ applyForkChips() {
1034
+ for (const [, rendered] of this._renderedMessages ?? new Map()) {
1035
+ if (rendered.kind === 'component') {
1036
+ const instance = rendered.ref.instance;
1037
+ instance.ForkChips = this.chipsFor(instance.message.ID);
1038
+ rendered.ref.changeDetectorRef.markForCheck();
1039
+ }
1040
+ }
1041
+ }
1042
+ /** The rail of a row in the current layout. */
1043
+ railFor(detailId) {
1044
+ const layout = this.ForkLayout;
1045
+ if (!layout) {
1046
+ return null;
1047
+ }
1048
+ return layout.InheritedIDs.has(NormalizeUUID(detailId)) ? 'Inherited' : 'Own';
1049
+ }
1050
+ /** The fork marker under a row in the current layout. */
1051
+ markerFor(detailId) {
1052
+ const layout = this.ForkLayout;
1053
+ return layout?.MarkerDetailID && UUIDsEqual(layout.MarkerDetailID, detailId) ? layout.MarkerText : null;
1054
+ }
1055
+ /** Pushes the current layout into every rendered message component. */
1056
+ applyForkLayout() {
1057
+ for (const [, rendered] of this._renderedMessages ?? new Map()) {
1058
+ if (rendered.kind === 'component') {
1059
+ const instance = rendered.ref.instance;
1060
+ instance.ForkRail = this.railFor(instance.message.ID);
1061
+ instance.ForkMarkerText = this.markerFor(instance.message.ID);
1062
+ rendered.ref.changeDetectorRef.markForCheck();
1063
+ }
1064
+ }
1065
+ }
1066
+ /** The in-place role of a row in the current turn. */
1067
+ inPlaceRoleFor(detailId) {
1068
+ const turn = this.InPlaceTurn;
1069
+ if (!turn) {
1070
+ return null;
1071
+ }
1072
+ if (UUIDsEqual(turn.UserDetailID, detailId)) {
1073
+ return 'User';
1074
+ }
1075
+ return turn.AnswerDetailID && UUIDsEqual(turn.AnswerDetailID, detailId) ? 'Answer' : null;
1076
+ }
1077
+ /** Pushes the in-place roles into every rendered message component. */
1078
+ applyInPlaceRoles() {
1079
+ for (const [, rendered] of this._renderedMessages ?? new Map()) {
1080
+ if (rendered.kind === 'component') {
1081
+ const instance = rendered.ref.instance;
1082
+ instance.InPlaceRole = this.inPlaceRoleFor(instance.message.ID);
1083
+ instance.PendingReplace = this.pendingReplaceFor(instance.message.ID);
1084
+ rendered.ref.changeDetectorRef.markForCheck();
1085
+ }
1086
+ }
1087
+ }
1088
+ /** The message whose inline editor is open; null when none is. */
1089
+ editingDetailId = null;
1090
+ /** True when a message other than `detailId` has its inline editor open. */
1091
+ editOpenElsewhere(detailId) {
1092
+ return this.editingDetailId != null && !UUIDsEqual(this.editingDetailId, detailId);
1093
+ }
1094
+ /** True for the latest turn's answer while its user message is edited with "Save and resend". */
1095
+ pendingReplaceFor(detailId) {
1096
+ const turn = this.InPlaceTurn;
1097
+ return !!turn?.AnswerDetailID && this.editingDetailId != null
1098
+ && UUIDsEqual(this.editingDetailId, turn.UserDetailID) && UUIDsEqual(turn.AnswerDetailID, detailId);
1099
+ }
1100
+ /** A row's inline editor opened or closed: records it and pushes the edit state into every rendered row. */
1101
+ onRowEditingChanged(detailId, open) {
1102
+ if (open) {
1103
+ this.editingDetailId = detailId;
1104
+ }
1105
+ else if (this.editingDetailId != null && UUIDsEqual(this.editingDetailId, detailId)) {
1106
+ this.editingDetailId = null;
1107
+ }
1108
+ this.applyEditState();
1109
+ }
1110
+ /** Pushes the edit state (another row editing, answer pending replace) into every rendered message component. */
1111
+ applyEditState() {
1112
+ for (const [, rendered] of this._renderedMessages ?? new Map()) {
1113
+ if (rendered.kind === 'component') {
1114
+ const instance = rendered.ref.instance;
1115
+ instance.EditOpenElsewhere = this.editOpenElsewhere(instance.message.ID);
1116
+ instance.PendingReplace = this.pendingReplaceFor(instance.message.ID);
1117
+ rendered.ref.changeDetectorRef.markForCheck();
1118
+ }
1119
+ }
1120
+ }
1121
+ /** Pushes {@link CanFork} into every rendered message component. */
1122
+ applyCanFork() {
1123
+ for (const [, rendered] of this._renderedMessages ?? new Map()) {
1124
+ if (rendered.kind === 'component') {
1125
+ const instance = rendered.ref.instance;
1126
+ instance.CanFork = this.CanFork;
1127
+ rendered.ref.changeDetectorRef.markForCheck();
1128
+ }
1129
+ }
1130
+ }
941
1131
  /**
942
1132
  * Re-stamp the assistant-identity overrides onto every already-rendered message
943
1133
  * item. Called from the identity setters (see the inputs above) — items are created
@@ -1179,6 +1369,7 @@ export class MessageListComponent extends BaseAngularComponent {
1179
1369
  this._observedRoot = root;
1180
1370
  }
1181
1371
  ngOnDestroy() {
1372
+ this.detachScrollListener();
1182
1373
  this._olderObserver?.disconnect();
1183
1374
  this._olderObserver = undefined;
1184
1375
  this._spacerObserver?.disconnect();
@@ -1231,12 +1422,19 @@ export class MessageListComponent extends BaseAngularComponent {
1231
1422
  const timeline = BuildConversationTimeline(messages);
1232
1423
  // Remove rendered items (messages AND session blocks) that no longer exist
1233
1424
  const currentKeys = new Set(timeline.map(item => this.getTimelineKey(item)));
1425
+ const editingBefore = this.editingDetailId;
1234
1426
  this._renderedMessages.forEach((entry, key) => {
1235
1427
  if (!currentKeys.has(key)) {
1428
+ if (entry.kind === 'component' && this.editingDetailId != null && UUIDsEqual(entry.ref.instance.message?.ID, this.editingDetailId)) {
1429
+ this.editingDetailId = null;
1430
+ }
1236
1431
  entry.ref.destroy();
1237
1432
  this._renderedMessages.delete(key);
1238
1433
  }
1239
1434
  });
1435
+ if (editingBefore !== this.editingDetailId) {
1436
+ this.applyEditState();
1437
+ }
1240
1438
  // Add or update timeline items in chronological order. `renderMessageItem`
1241
1439
  // internally branches on the slot template (messageRenderer) vs the
1242
1440
  // default MessageItemComponent; `renderSessionBlock` always creates a
@@ -1249,6 +1447,7 @@ export class MessageListComponent extends BaseAngularComponent {
1249
1447
  // components. The tail and any in-progress message are always kept.
1250
1448
  const range = this.computeMountedRange(timeline);
1251
1449
  const lastMessageKey = this.findLastMessageKey(timeline);
1450
+ const lastUserKey = this.findLastUserMessageKey(timeline);
1252
1451
  for (let i = 0; i < timeline.length; i++) {
1253
1452
  const item = timeline[i];
1254
1453
  const mounted = (i >= range.start && i <= range.end)
@@ -1260,7 +1459,8 @@ export class MessageListComponent extends BaseAngularComponent {
1260
1459
  this.renderSessionBlock(item.Group, i);
1261
1460
  }
1262
1461
  else {
1263
- this.renderMessageItem(item.Detail, messages, this.getMessageKey(item.Detail) === lastMessageKey, i);
1462
+ const key = this.getMessageKey(item.Detail);
1463
+ this.renderMessageItem(item.Detail, messages, key === lastMessageKey, key === lastMessageKey || key === lastUserKey, i);
1264
1464
  }
1265
1465
  }
1266
1466
  // Decide where the viewport should end up.
@@ -1554,6 +1754,16 @@ export class MessageListComponent extends BaseAngularComponent {
1554
1754
  }
1555
1755
  return null;
1556
1756
  }
1757
+ /** The render key of the last User message item in the timeline (the latest turn's user message), or null when none. */
1758
+ findLastUserMessageKey(timeline) {
1759
+ for (let i = timeline.length - 1; i >= 0; i--) {
1760
+ const item = timeline[i];
1761
+ if (item.Kind === 'message' && item.Detail.Role === 'User') {
1762
+ return this.getMessageKey(item.Detail);
1763
+ }
1764
+ }
1765
+ return null;
1766
+ }
1557
1767
  /**
1558
1768
  * Creates or updates the ONE timeline card a realtime session collapses to.
1559
1769
  * Click/Open on the card bubbles up via {@link realtimeSessionOpenRequested} so the
@@ -1592,7 +1802,7 @@ export class MessageListComponent extends BaseAngularComponent {
1592
1802
  * dynamic-component path. Both paths flow through the shared
1593
1803
  * `createRenderedEntry` / `updateMessageItemInstance` helpers.
1594
1804
  */
1595
- renderMessageItem(message, messages, isLastMessage, timelineIndex) {
1805
+ renderMessageItem(message, messages, isLastMessage, isLatestTurn, timelineIndex) {
1596
1806
  const key = this.getMessageKey(message);
1597
1807
  // `index` is only used for the `isLastMessage` heuristic inside
1598
1808
  // updateMessageItemInstance — synthesize a value that produces the right
@@ -1610,7 +1820,7 @@ export class MessageListComponent extends BaseAngularComponent {
1610
1820
  }
1611
1821
  if (existing && existing.kind === 'component' && !useCustomRenderer) {
1612
1822
  // Update existing MessageItemComponent in place
1613
- this.updateMessageItemInstance(existing.ref, message, messages, index);
1823
+ this.updateMessageItemInstance(existing.ref, message, messages, index, isLatestTurn);
1614
1824
  return;
1615
1825
  }
1616
1826
  if (existing) {
@@ -1619,14 +1829,14 @@ export class MessageListComponent extends BaseAngularComponent {
1619
1829
  existing.ref.destroy();
1620
1830
  this._renderedMessages.delete(key);
1621
1831
  }
1622
- this.createRenderedEntry(message, messages, index, key, useCustomRenderer, timelineIndex);
1832
+ this.createRenderedEntry(message, messages, index, isLatestTurn, key, useCustomRenderer, timelineIndex);
1623
1833
  }
1624
1834
  /**
1625
1835
  * Updates an existing `MessageItemComponent` in place — used on the default
1626
1836
  * (non-custom-renderer) path when a message's status / artifacts / agent-run /
1627
1837
  * etc. changes mid-stream.
1628
1838
  */
1629
- updateMessageItemInstance(ref, message, messages, index) {
1839
+ updateMessageItemInstance(ref, message, messages, index, isLatestTurn) {
1630
1840
  const instance = ref.instance;
1631
1841
  const previousMessage = instance.message;
1632
1842
  instance.message = message;
@@ -1644,14 +1854,29 @@ export class MessageListComponent extends BaseAngularComponent {
1644
1854
  instance.agentRun = this.AgentRunMap.get(message.ID) || null;
1645
1855
  instance.ratings = this.RatingsMap.get(message.ID);
1646
1856
  instance.attachments = this.AttachmentsMap.get(message.ID) || [];
1857
+ instance.ForkChips = this.chipsFor(message.ID);
1858
+ instance.ForkRail = this.railFor(message.ID);
1859
+ instance.ForkMarkerText = this.markerFor(message.ID);
1860
+ instance.InPlaceRole = this.inPlaceRoleFor(message.ID);
1861
+ this.applyRowTurnState(instance, isLatestTurn);
1647
1862
  // After the inputs above, for the same reason as the create path: this can force a
1648
1863
  // synchronous child pass, which would otherwise paint the previous refresh's agent run,
1649
1864
  // ratings and attachments.
1650
1865
  this.applyArtifactsToInstance(instance, message.ID, ref.changeDetectorRef);
1651
- // Status change requires explicit markForCheck on the OnPush dynamic child.
1866
+ // Status or in-place entity mutations (e.g. message.Load() in handleMessageCompletion)
1867
+ // require explicit detectChanges on the dynamically created MessageItemComponent child.
1652
1868
  if (previousMessage && previousMessage.Status !== message.Status) {
1653
1869
  ref.changeDetectorRef.markForCheck();
1654
1870
  }
1871
+ if (!this.isViewDestroyed(ref.changeDetectorRef)) {
1872
+ ref.changeDetectorRef.detectChanges();
1873
+ }
1874
+ }
1875
+ /** Sets a row's latest-turn flag and its edit state. */
1876
+ applyRowTurnState(instance, isLatestTurn) {
1877
+ instance.IsLatestTurn = isLatestTurn;
1878
+ instance.EditOpenElsewhere = this.editOpenElsewhere(instance.message.ID);
1879
+ instance.PendingReplace = this.pendingReplaceFor(instance.message.ID);
1655
1880
  }
1656
1881
  /**
1657
1882
  * Forward the host-level per-message feature gates onto a MessageItemComponent
@@ -1667,6 +1892,9 @@ export class MessageListComponent extends BaseAngularComponent {
1667
1892
  instance.allowMessageEdit = this.AllowMessageEdit;
1668
1893
  instance.allowMessageDelete = this.AllowMessageDelete;
1669
1894
  instance.ReadOnly = this.ReadOnly;
1895
+ instance.AllowStopRun = this.AllowStopRun;
1896
+ instance.InFlightCount = this.InFlightCount;
1897
+ instance.CanFork = this.CanFork;
1670
1898
  instance.assistantDisplayName = this.AssistantDisplayName;
1671
1899
  instance.assistantAvatarUrl = this.AssistantAvatarUrl;
1672
1900
  }
@@ -1676,7 +1904,7 @@ export class MessageListComponent extends BaseAngularComponent {
1676
1904
  * Stores the entry in `_renderedMessages` and stamps a back-reference on the
1677
1905
  * message entity.
1678
1906
  */
1679
- createRenderedEntry(message, messages, index, key, useCustomRenderer, timelineIndex) {
1907
+ createRenderedEntry(message, messages, index, isLatestTurn, key, useCustomRenderer, timelineIndex) {
1680
1908
  if (useCustomRenderer && this.MessageRendererTemplate) {
1681
1909
  // The slot directive carries TemplateRef<unknown>; assert the contract here
1682
1910
  // (consumers' `let-message` bindings consume the message context shape below).
@@ -1701,9 +1929,24 @@ export class MessageListComponent extends BaseAngularComponent {
1701
1929
  instance.agentRun = this.AgentRunMap.get(message.ID) || null;
1702
1930
  instance.ratings = this.RatingsMap.get(message.ID);
1703
1931
  instance.attachments = this.AttachmentsMap.get(message.ID) || [];
1932
+ instance.ForkChips = this.chipsFor(message.ID);
1933
+ instance.ForkRail = this.railFor(message.ID);
1934
+ instance.ForkMarkerText = this.markerFor(message.ID);
1935
+ instance.InPlaceRole = this.inPlaceRoleFor(message.ID);
1936
+ this.applyRowTurnState(instance, isLatestTurn);
1937
+ instance.EditingChanged.subscribe((open) => this.onRowEditingChanged(instance.message.ID, open));
1938
+ instance.EditResendRequested.subscribe((e) => this.EditResendRequested.emit(e));
1939
+ instance.ForkOpenRequested.subscribe((e) => this.ForkOpenRequested.emit(e));
1940
+ instance.ForkRequested.subscribe((m) => this.ForkRequested.emit(m));
1941
+ instance.ResendInPlaceRequested.subscribe((m) => this.ResendInPlaceRequested.emit(m));
1704
1942
  instance.editClicked.subscribe((msg) => this.EditMessage.emit(msg));
1705
1943
  instance.deleteClicked.subscribe((msg) => this.DeleteMessage.emit(msg));
1706
- instance.retryClicked.subscribe((msg) => this.RetryMessage.emit(msg));
1944
+ instance.RegenerateRequested.subscribe((msg) => {
1945
+ this.RegenerateRequested.emit(msg);
1946
+ this.RetryMessage.emit(msg);
1947
+ });
1948
+ instance.BeforeStopClicked.subscribe((e) => this.BeforeStopClicked.emit(e));
1949
+ instance.StopRequested.subscribe((msg) => this.StopMessage.emit(msg));
1707
1950
  instance.testFeedbackClicked.subscribe((msg) => this.TestFeedbackMessage.emit(msg));
1708
1951
  instance.artifactClicked.subscribe((data) => this.ArtifactClicked.emit(data));
1709
1952
  instance.messageEdited.subscribe((msg) => this.MessageEdited.emit(msg));
@@ -1715,6 +1958,8 @@ export class MessageListComponent extends BaseAngularComponent {
1715
1958
  instance.messagePinToggled.subscribe((msg) => this.MessagePinToggled.emit(msg));
1716
1959
  instance.beforeResponseFormSubmitted.subscribe((e) => this.BeforeResponseFormSubmitted.emit(e));
1717
1960
  instance.afterResponseFormSubmitted.subscribe((e) => this.AfterResponseFormSubmitted.emit(e));
1961
+ instance.TaskGraphPanelRequested.subscribe((data) => this.TaskGraphPanelRequested.emit(data));
1962
+ instance.ScrollToMessageRequested.subscribe((messageId) => this.ScrollToMessageRequested.emit(messageId));
1718
1963
  if (instance.artifactActionPerformed) {
1719
1964
  instance.artifactActionPerformed.subscribe((data) => {
1720
1965
  // Parent can handle artifact actions (save, fork, history, share)
@@ -1913,13 +2158,13 @@ export class MessageListComponent extends BaseAngularComponent {
1913
2158
  i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.spacerTemplate = _t.first);
1914
2159
  } }, hostVars: 2, hostBindings: function MessageListComponent_HostBindings(rf, ctx) { if (rf & 2) {
1915
2160
  i0.ɵɵclassProp("mj-list-host-scrolled", ctx.HostSuppliesScroller);
1916
- } }, inputs: { messages: "messages", Conversation: "Conversation", conversation: "conversation", CurrentUser: "CurrentUser", currentUser: "currentUser", IsProcessing: "IsProcessing", isProcessing: "isProcessing", ShowEmptyFill: "ShowEmptyFill", showEmptyFill: "showEmptyFill", ShowDateNavigation: "ShowDateNavigation", showDateNavigation: "showDateNavigation", ShowAgentRunDetails: "ShowAgentRunDetails", showAgentRunDetails: "showAgentRunDetails", ShowReactions: "ShowReactions", showReactions: "showReactions", ShowMessageRating: "ShowMessageRating", showMessageRating: "showMessageRating", AllowPinning: "AllowPinning", allowPinning: "allowPinning", AllowMessageEdit: "AllowMessageEdit", allowMessageEdit: "allowMessageEdit", AllowMessageDelete: "AllowMessageDelete", allowMessageDelete: "allowMessageDelete", ReadOnly: "ReadOnly", HasMoreAbove: "HasMoreAbove", IsLoadingOlder: "IsLoadingOlder", ScrollRoot: "ScrollRoot", AssistantDisplayName: "AssistantDisplayName", assistantDisplayName: "assistantDisplayName", AssistantAvatarUrl: "AssistantAvatarUrl", assistantAvatarUrl: "assistantAvatarUrl", ArtifactMap: "ArtifactMap", artifactMap: "artifactMap", AgentRunMap: "AgentRunMap", agentRunMap: "agentRunMap", RatingsMap: "RatingsMap", ratingsMap: "ratingsMap", UserAvatarMap: "UserAvatarMap", userAvatarMap: "userAvatarMap", AttachmentsMap: "AttachmentsMap", attachmentsMap: "attachmentsMap", SessionMetaMap: "SessionMetaMap", sessionMetaMap: "sessionMetaMap", MessageRendererTemplate: "MessageRendererTemplate", messageRendererTemplate: "messageRendererTemplate", MessageExtraTemplate: "MessageExtraTemplate", messageExtraTemplate: "messageExtraTemplate", MessagesUpdate: "MessagesUpdate", messagesUpdate: "messagesUpdate" }, outputs: { EditMessage: "EditMessage", editMessage: "editMessage", DeleteMessage: "DeleteMessage", deleteMessage: "deleteMessage", RetryMessage: "RetryMessage", retryMessage: "retryMessage", TestFeedbackMessage: "TestFeedbackMessage", testFeedbackMessage: "testFeedbackMessage", ArtifactClicked: "ArtifactClicked", artifactClicked: "artifactClicked", ReplyInThread: "ReplyInThread", replyInThread: "replyInThread", ViewThread: "ViewThread", viewThread: "viewThread", MessageEdited: "MessageEdited", messageEdited: "messageEdited", OpenEntityRecord: "OpenEntityRecord", openEntityRecord: "openEntityRecord", SuggestedResponseSelected: "SuggestedResponseSelected", suggestedResponseSelected: "suggestedResponseSelected", AttachmentClicked: "AttachmentClicked", attachmentClicked: "attachmentClicked", DiagnosticRequested: "DiagnosticRequested", diagnosticRequested: "diagnosticRequested", MessagePinToggled: "MessagePinToggled", messagePinToggled: "messagePinToggled", LivenessCheckRequested: "LivenessCheckRequested", RealtimeSessionOpenRequested: "RealtimeSessionOpenRequested", realtimeSessionOpenRequested: "realtimeSessionOpenRequested", BeforeResponseFormSubmitted: "BeforeResponseFormSubmitted", beforeResponseFormSubmitted: "beforeResponseFormSubmitted", AfterResponseFormSubmitted: "AfterResponseFormSubmitted", afterResponseFormSubmitted: "afterResponseFormSubmitted", OlderRequested: "OlderRequested", DateJumpRequested: "DateJumpRequested" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature, i0.ɵɵNgOnChangesFeature], decls: 9, vars: 3, consts: [["scrollContainer", ""], ["spacerTemplate", ""], ["messageContainer", ""], ["olderSentinel", ""], [1, "message-list-container"], [1, "sticky-date-header"], [1, "transcript-older-sentinel"], ["Icon", "fa-solid fa-comments", "Title", "No messages yet. Start a conversation!", 1, "messages-empty-fill"], [1, "sticky-date-wrapper"], [1, "sticky-date-button", 3, "click"], [1, "fas", "fa-chevron-down"], [1, "date-nav-dropdown"], [1, "date-nav-option", "jump-to"], [1, "date-nav-option", 3, "click"], ["text", "Loading earlier messages\u2026", "size", "small"], [1, "transcript-older-label"], ["aria-hidden", "true", 1, "transcript-spacer"]], template: function MessageListComponent_Template(rf, ctx) { if (rf & 1) {
2161
+ } }, inputs: { messages: "messages", Conversation: "Conversation", conversation: "conversation", ForkChipMap: "ForkChipMap", ForkLayout: "ForkLayout", CanFork: "CanFork", InPlaceTurn: "InPlaceTurn", CurrentUser: "CurrentUser", currentUser: "currentUser", IsProcessing: "IsProcessing", isProcessing: "isProcessing", ShowEmptyFill: "ShowEmptyFill", showEmptyFill: "showEmptyFill", ShowDateNavigation: "ShowDateNavigation", showDateNavigation: "showDateNavigation", ShowAgentRunDetails: "ShowAgentRunDetails", showAgentRunDetails: "showAgentRunDetails", ShowReactions: "ShowReactions", showReactions: "showReactions", ShowMessageRating: "ShowMessageRating", showMessageRating: "showMessageRating", AllowPinning: "AllowPinning", allowPinning: "allowPinning", AllowMessageEdit: "AllowMessageEdit", allowMessageEdit: "allowMessageEdit", AllowMessageDelete: "AllowMessageDelete", allowMessageDelete: "allowMessageDelete", ReadOnly: "ReadOnly", AllowStopRun: "AllowStopRun", InFlightCount: "InFlightCount", HasMoreAbove: "HasMoreAbove", IsLoadingOlder: "IsLoadingOlder", ScrollRoot: "ScrollRoot", AssistantDisplayName: "AssistantDisplayName", assistantDisplayName: "assistantDisplayName", AssistantAvatarUrl: "AssistantAvatarUrl", assistantAvatarUrl: "assistantAvatarUrl", ArtifactMap: "ArtifactMap", artifactMap: "artifactMap", AgentRunMap: "AgentRunMap", agentRunMap: "agentRunMap", RatingsMap: "RatingsMap", ratingsMap: "ratingsMap", UserAvatarMap: "UserAvatarMap", userAvatarMap: "userAvatarMap", AttachmentsMap: "AttachmentsMap", attachmentsMap: "attachmentsMap", SessionMetaMap: "SessionMetaMap", sessionMetaMap: "sessionMetaMap", MessageRendererTemplate: "MessageRendererTemplate", messageRendererTemplate: "messageRendererTemplate", MessageExtraTemplate: "MessageExtraTemplate", messageExtraTemplate: "messageExtraTemplate", MessagesUpdate: "MessagesUpdate", messagesUpdate: "messagesUpdate" }, outputs: { EditMessage: "EditMessage", editMessage: "editMessage", DeleteMessage: "DeleteMessage", deleteMessage: "deleteMessage", RegenerateRequested: "RegenerateRequested", RetryMessage: "RetryMessage", retryMessage: "retryMessage", EditResendRequested: "EditResendRequested", ForkOpenRequested: "ForkOpenRequested", ForkRequested: "ForkRequested", ResendInPlaceRequested: "ResendInPlaceRequested", TestFeedbackMessage: "TestFeedbackMessage", testFeedbackMessage: "testFeedbackMessage", ArtifactClicked: "ArtifactClicked", artifactClicked: "artifactClicked", MessageEdited: "MessageEdited", messageEdited: "messageEdited", OpenEntityRecord: "OpenEntityRecord", openEntityRecord: "openEntityRecord", SuggestedResponseSelected: "SuggestedResponseSelected", suggestedResponseSelected: "suggestedResponseSelected", AttachmentClicked: "AttachmentClicked", attachmentClicked: "attachmentClicked", DiagnosticRequested: "DiagnosticRequested", diagnosticRequested: "diagnosticRequested", BeforeStopClicked: "BeforeStopClicked", StopMessage: "StopMessage", MessagePinToggled: "MessagePinToggled", messagePinToggled: "messagePinToggled", LivenessCheckRequested: "LivenessCheckRequested", RealtimeSessionOpenRequested: "RealtimeSessionOpenRequested", realtimeSessionOpenRequested: "realtimeSessionOpenRequested", BeforeResponseFormSubmitted: "BeforeResponseFormSubmitted", beforeResponseFormSubmitted: "beforeResponseFormSubmitted", AfterResponseFormSubmitted: "AfterResponseFormSubmitted", afterResponseFormSubmitted: "afterResponseFormSubmitted", TaskGraphPanelRequested: "TaskGraphPanelRequested", taskGraphPanelRequested: "taskGraphPanelRequested", ScrollToMessageRequested: "ScrollToMessageRequested", scrollToMessageRequested: "scrollToMessageRequested", OlderRequested: "OlderRequested", DateJumpRequested: "DateJumpRequested" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature, i0.ɵɵNgOnChangesFeature], decls: 9, vars: 3, consts: [["scrollContainer", ""], ["spacerTemplate", ""], ["messageContainer", ""], ["olderSentinel", ""], [1, "message-list-container"], [1, "sticky-date-header"], [1, "transcript-older-sentinel"], [1, "sticky-date-wrapper"], [1, "sticky-date-button", 3, "click"], [1, "fas", "fa-chevron-down"], [1, "date-nav-dropdown"], [1, "date-nav-option", "jump-to"], [1, "date-nav-option", 3, "click"], ["text", "Loading earlier messages\u2026", "size", "small"], [1, "transcript-older-label"], ["aria-hidden", "true", 1, "transcript-spacer"], ["role", "note", 1, "fork-marker"], ["Icon", "fa-solid fa-comments", "Title", "No messages yet. Start a conversation!", 1, "messages-empty-fill"], ["aria-hidden", "true", 1, "fa-solid", "fa-code-branch"], [1, "fork-marker-text"], ["aria-hidden", "true", 1, "fork-marker-line"]], template: function MessageListComponent_Template(rf, ctx) { if (rf & 1) {
1917
2162
  i0.ɵɵelementStart(0, "div", 4, 0);
1918
2163
  i0.ɵɵconditionalCreate(2, MessageListComponent_Conditional_2_Template, 17, 3, "div", 5);
1919
2164
  i0.ɵɵconditionalCreate(3, MessageListComponent_Conditional_3_Template, 4, 1, "div", 6);
1920
2165
  i0.ɵɵtemplate(4, MessageListComponent_ng_template_4_Template, 1, 2, "ng-template", null, 1, i0.ɵɵtemplateRefExtractor);
1921
2166
  i0.ɵɵelementContainer(6, null, 2);
1922
- i0.ɵɵconditionalCreate(8, MessageListComponent_Conditional_8_Template, 1, 0, "mj-empty-state", 7);
2167
+ i0.ɵɵconditionalCreate(8, MessageListComponent_Conditional_8_Template, 2, 1);
1923
2168
  i0.ɵɵelementEnd();
1924
2169
  } if (rf & 2) {
1925
2170
  i0.ɵɵadvance(2);
@@ -1927,18 +2172,26 @@ export class MessageListComponent extends BaseAngularComponent {
1927
2172
  i0.ɵɵadvance();
1928
2173
  i0.ɵɵconditional(ctx.HasMoreAbove ? 3 : -1);
1929
2174
  i0.ɵɵadvance(5);
1930
- i0.ɵɵconditional(ctx.messages.length === 0 && ctx.showEmptyFill ? 8 : -1);
1931
- } }, dependencies: [i1.MJEmptyStateComponent, i2.LoadingComponent], styles: ["\n\n\n\n.message-list-container[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n background-color: var(--mj-bg-surface-card);\n position: relative;\n}\n\n\n.messages-empty-fill[_ngcontent-%COMP%] {\n height: 100%;\n}\n\n\n.sticky-date-header[_ngcontent-%COMP%] {\n position: sticky;\n top: 12px;\n z-index: 100;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 0;\n margin: 0;\n pointer-events: none;\n}\n\n.sticky-date-wrapper[_ngcontent-%COMP%] {\n pointer-events: auto;\n position: relative;\n}\n\n.sticky-date-button[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 16px;\n background: var(--mj-bg-surface-card);\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-primary);\n cursor: pointer;\n transition: all 0.2s;\n box-shadow: var(--mj-shadow-sm);\n}\n\n.sticky-date-button[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-sunken);\n box-shadow: var(--mj-shadow-md);\n}\n\n.sticky-date-button[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 10px;\n color: var(--mj-text-secondary);\n}\n\n\n.date-nav-dropdown[_ngcontent-%COMP%] {\n position: absolute;\n top: 100%;\n left: 50%;\n transform: translateX(-50%);\n margin-top: 8px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n box-shadow: var(--mj-shadow-lg);\n min-width: 200px;\n display: none;\n z-index: 101;\n}\n\n.date-nav-dropdown.show[_ngcontent-%COMP%] {\n display: block;\n}\n\n.date-nav-option[_ngcontent-%COMP%] {\n padding: 10px 16px;\n cursor: pointer;\n transition: background 0.2s;\n font-size: 14px;\n color: var(--mj-text-primary);\n}\n\n.date-nav-option[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-sunken);\n}\n\n.date-nav-option.jump-to[_ngcontent-%COMP%] {\n font-weight: 600;\n color: var(--mj-text-secondary);\n font-size: 12px;\n cursor: default;\n padding: 8px 16px 4px 16px;\n}\n\n.date-nav-option.jump-to[_ngcontent-%COMP%]:hover {\n background: none;\n}\n\n\n\n\n.transcript-older-sentinel[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 2.5rem;\n padding: 0.75rem 1rem;\n}\n\n.transcript-older-label[_ngcontent-%COMP%] {\n font-size: 0.8125rem;\n color: var(--mj-text-secondary);\n}\n\n\n\n.transcript-spacer[_ngcontent-%COMP%] {\n width: 100%;\n flex-shrink: 0;\n}\n\n\n\n\n\n\n\n\n\n.mj-list-host-scrolled[_nghost-%COMP%] .message-list-container[_ngcontent-%COMP%] {\n overflow: visible;\n}"] });
2175
+ i0.ɵɵconditional(ctx.messages.length === 0 ? 8 : -1);
2176
+ } }, dependencies: [i1.MJEmptyStateComponent, i2.LoadingComponent], styles: ["\n\n\n\n.message-list-container[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n background-color: var(--mj-bg-surface-card);\n position: relative;\n}\n\n\n.messages-empty-fill[_ngcontent-%COMP%] {\n height: 100%;\n}\n\n\n.sticky-date-header[_ngcontent-%COMP%] {\n position: sticky;\n top: 12px;\n z-index: 100;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 0;\n margin: 0;\n pointer-events: none;\n}\n\n.sticky-date-wrapper[_ngcontent-%COMP%] {\n pointer-events: auto;\n position: relative;\n}\n\n.sticky-date-button[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 16px;\n background: var(--mj-bg-surface-card);\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-primary);\n cursor: pointer;\n transition: all 0.2s;\n box-shadow: var(--mj-shadow-sm);\n}\n\n.sticky-date-button[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-sunken);\n box-shadow: var(--mj-shadow-md);\n}\n\n.sticky-date-button[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 10px;\n color: var(--mj-text-secondary);\n}\n\n\n.date-nav-dropdown[_ngcontent-%COMP%] {\n position: absolute;\n top: 100%;\n left: 50%;\n transform: translateX(-50%);\n margin-top: 8px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n box-shadow: var(--mj-shadow-lg);\n min-width: 200px;\n display: none;\n z-index: 101;\n}\n\n.date-nav-dropdown.show[_ngcontent-%COMP%] {\n display: block;\n}\n\n.date-nav-option[_ngcontent-%COMP%] {\n padding: 10px 16px;\n cursor: pointer;\n transition: background 0.2s;\n font-size: 14px;\n color: var(--mj-text-primary);\n}\n\n.date-nav-option[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-sunken);\n}\n\n.date-nav-option.jump-to[_ngcontent-%COMP%] {\n font-weight: 600;\n color: var(--mj-text-secondary);\n font-size: 12px;\n cursor: default;\n padding: 8px 16px 4px 16px;\n}\n\n.date-nav-option.jump-to[_ngcontent-%COMP%]:hover {\n background: none;\n}\n\n\n\n\n.transcript-older-sentinel[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 2.5rem;\n padding: 0.75rem 1rem;\n}\n\n.transcript-older-label[_ngcontent-%COMP%] {\n font-size: 0.8125rem;\n color: var(--mj-text-secondary);\n}\n\n\n\n.transcript-spacer[_ngcontent-%COMP%] {\n width: 100%;\n flex-shrink: 0;\n}\n\n\n\n\n\n\n\n\n\n.mj-list-host-scrolled[_nghost-%COMP%] .message-list-container[_ngcontent-%COMP%] {\n overflow: visible;\n}\n\n\n.fork-marker[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: var(--mj-space-2);\n padding: var(--mj-space-4) var(--mj-space-6) var(--mj-space-2);\n font-size: var(--mj-text-xs);\n color: var(--mj-text-secondary);\n}\n.fork-marker[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-status-info);\n}\n.fork-marker-line[_ngcontent-%COMP%] {\n flex: 1;\n height: 1px;\n background: var(--mj-border-default);\n}\n@media (max-width: 768px) {\n .fork-marker[_ngcontent-%COMP%] {\n padding: var(--mj-space-3) var(--mj-space-3) var(--mj-space-2);\n }\n}\n@media (max-width: 480px) {\n .fork-marker[_ngcontent-%COMP%] {\n padding: var(--mj-space-2);\n }\n}"] });
1932
2177
  }
1933
2178
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(MessageListComponent, [{
1934
2179
  type: Component,
1935
- args: [{ standalone: false, selector: 'mj-conversation-message-list', template: "<div class=\"message-list-container\" #scrollContainer>\n <!-- Sticky Date Header (only show for long conversations spanning multiple days) -->\n @if (showDateNavigation && shouldShowDateFilter && messages.length > 0) {\n <div class=\"sticky-date-header\">\n <div class=\"sticky-date-wrapper\">\n <button class=\"sticky-date-button\" (click)=\"toggleDateNav()\">\n <span>{{ currentDateDisplay }}</span>\n <i class=\"fas fa-chevron-down\"></i>\n </button>\n <div class=\"date-nav-dropdown\" [class.show]=\"showDateNav\">\n <div class=\"date-nav-option jump-to\">Jump to...</div>\n <div class=\"date-nav-option\" (click)=\"jumpToDate('today')\">Today</div>\n <div class=\"date-nav-option\" (click)=\"jumpToDate('yesterday')\">Yesterday</div>\n <div class=\"date-nav-option\" (click)=\"jumpToDate('last-week')\">Last week</div>\n <div class=\"date-nav-option\" (click)=\"jumpToDate('last-month')\">Last month</div>\n </div>\n </div>\n </div>\n }\n\n <!-- Windowed transcript: older pages load when this scrolls into view (IntersectionObserver\n in the component, not a scroll listener). Absent entirely once the top is reached. -->\n @if (HasMoreAbove) {\n <div #olderSentinel class=\"transcript-older-sentinel\">\n @if (IsLoadingOlder) {\n <mj-loading text=\"Loading earlier messages\u2026\" size=\"small\"></mj-loading>\n } @else {\n <span class=\"transcript-older-label\">Earlier messages</span>\n }\n </div>\n }\n\n <!-- Height-holding stand-in for a timeline item that has been unmounted to keep the DOM\n bounded. Declared here but rendered into #messageContainer at the item's own index,\n so scroll geometry is unchanged. -->\n <ng-template #spacerTemplate let-height=\"height\">\n <div class=\"transcript-spacer\" [style.height.px]=\"height\" aria-hidden=\"true\"></div>\n </ng-template>\n\n <ng-container #messageContainer></ng-container>\n\n @if (messages.length === 0 && showEmptyFill) {\n <mj-empty-state\n class=\"messages-empty-fill\"\n Icon=\"fa-solid fa-comments\"\n Title=\"No messages yet. Start a conversation!\" />\n }\n</div>", styles: ["/* Scrolls itself ONLY when no host scroller was supplied \u2014 see the `mj-list-host-scrolled`\n host binding. `overflow-y` here makes this element the nearest scrolling ancestor, which is\n what `position: sticky` binds to; when the host owns the scrolling this container never\n moves, so anything sticky inside it silently scrolls away instead of pinning. */\n.message-list-container {\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n background-color: var(--mj-bg-surface-card);\n position: relative;\n}\n\n/* Empty-state fills the message pane vertically */\n.messages-empty-fill {\n height: 100%;\n}\n\n/* Sticky Date Header */\n.sticky-date-header {\n position: sticky;\n top: 12px;\n z-index: 100;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 0;\n margin: 0;\n pointer-events: none;\n}\n\n.sticky-date-wrapper {\n pointer-events: auto;\n position: relative;\n}\n\n.sticky-date-button {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 16px;\n background: var(--mj-bg-surface-card);\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-primary);\n cursor: pointer;\n transition: all 0.2s;\n box-shadow: var(--mj-shadow-sm);\n}\n\n.sticky-date-button:hover {\n background: var(--mj-bg-surface-sunken);\n box-shadow: var(--mj-shadow-md);\n}\n\n.sticky-date-button i {\n font-size: 10px;\n color: var(--mj-text-secondary);\n}\n\n/* Date Navigation Dropdown */\n.date-nav-dropdown {\n position: absolute;\n top: 100%;\n left: 50%;\n transform: translateX(-50%);\n margin-top: 8px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n box-shadow: var(--mj-shadow-lg);\n min-width: 200px;\n display: none;\n z-index: 101;\n}\n\n.date-nav-dropdown.show {\n display: block;\n}\n\n.date-nav-option {\n padding: 10px 16px;\n cursor: pointer;\n transition: background 0.2s;\n font-size: 14px;\n color: var(--mj-text-primary);\n}\n\n.date-nav-option:hover {\n background: var(--mj-bg-surface-sunken);\n}\n\n.date-nav-option.jump-to {\n font-weight: 600;\n color: var(--mj-text-secondary);\n font-size: 12px;\n cursor: default;\n padding: 8px 16px 4px 16px;\n}\n\n.date-nav-option.jump-to:hover {\n background: none;\n}\n\n/* \u2500\u2500 Windowed transcript sentinel \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n Sits above the first loaded message while older pages remain. Needs real height\n so the IntersectionObserver has something to observe. */\n.transcript-older-sentinel {\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 2.5rem;\n padding: 0.75rem 1rem;\n}\n\n.transcript-older-label {\n font-size: 0.8125rem;\n color: var(--mj-text-secondary);\n}\n\n/* Stands in for an unmounted timeline item so the scroll range never changes when the\n DOM is trimmed. Height comes from the item's last measured size. */\n.transcript-spacer {\n width: 100%;\n flex-shrink: 0;\n}\n\n/* Host owns the scrolling: stop creating a scroll context here so `position: sticky`\n descendants (the date navigator) bind to the host's real scroller and actually pin.\n\n BOTH axes, not just `overflow-y`. Per CSS Overflow, when one axis is `visible` and the\n other is not, the `visible` one computes to `auto` \u2014 so leaving `overflow-x: hidden` in\n place silently kept this element a scroll container and the header kept scrolling away.\n Horizontal clipping is not lost: the host's own scroller (`.chat-messages-container`)\n already carries `overflow-x: hidden`. */\n:host(.mj-list-host-scrolled) .message-list-container {\n overflow: visible;\n}\n"] }]
2180
+ args: [{ standalone: false, selector: 'mj-conversation-message-list', template: "<div class=\"message-list-container\" #scrollContainer>\n <!-- Sticky Date Header (only show for long conversations spanning multiple days) -->\n @if (showDateNavigation && shouldShowDateFilter && messages.length > 0) {\n <div class=\"sticky-date-header\">\n <div class=\"sticky-date-wrapper\">\n <button class=\"sticky-date-button\" (click)=\"toggleDateNav()\">\n <span>{{ currentDateDisplay }}</span>\n <i class=\"fas fa-chevron-down\"></i>\n </button>\n <div class=\"date-nav-dropdown\" [class.show]=\"showDateNav\">\n <div class=\"date-nav-option jump-to\">Jump to...</div>\n <div class=\"date-nav-option\" (click)=\"jumpToDate('today')\">Today</div>\n <div class=\"date-nav-option\" (click)=\"jumpToDate('yesterday')\">Yesterday</div>\n <div class=\"date-nav-option\" (click)=\"jumpToDate('last-week')\">Last week</div>\n <div class=\"date-nav-option\" (click)=\"jumpToDate('last-month')\">Last month</div>\n </div>\n </div>\n </div>\n }\n\n <!-- Windowed transcript: older pages load when this scrolls into view (IntersectionObserver\n in the component, not a scroll listener). Absent entirely once the top is reached. -->\n @if (HasMoreAbove) {\n <div #olderSentinel class=\"transcript-older-sentinel\">\n @if (IsLoadingOlder) {\n <mj-loading text=\"Loading earlier messages\u2026\" size=\"small\"></mj-loading>\n } @else {\n <span class=\"transcript-older-label\">Earlier messages</span>\n }\n </div>\n }\n\n <!-- Height-holding stand-in for a timeline item that has been unmounted to keep the DOM\n bounded. Declared here but rendered into #messageContainer at the item's own index,\n so scroll geometry is unchanged. -->\n <ng-template #spacerTemplate let-height=\"height\">\n <div class=\"transcript-spacer\" [style.height.px]=\"height\" aria-hidden=\"true\"></div>\n </ng-template>\n\n <ng-container #messageContainer></ng-container>\n\n @if (messages.length === 0) {\n @if (EmptyViewMarkerText) {\n <!-- A draft fork with no earlier rows: the fork marker, not the new-conversation empty state -->\n <div class=\"fork-marker\" role=\"note\">\n <i class=\"fa-solid fa-code-branch\" aria-hidden=\"true\"></i>\n <span class=\"fork-marker-text\">{{ EmptyViewMarkerText }}</span>\n <span class=\"fork-marker-line\" aria-hidden=\"true\"></span>\n </div>\n } @else if (showEmptyFill) {\n <mj-empty-state\n class=\"messages-empty-fill\"\n Icon=\"fa-solid fa-comments\"\n Title=\"No messages yet. Start a conversation!\" />\n }\n }\n</div>", styles: ["/* Scrolls itself ONLY when no host scroller was supplied \u2014 see the `mj-list-host-scrolled`\n host binding. `overflow-y` here makes this element the nearest scrolling ancestor, which is\n what `position: sticky` binds to; when the host owns the scrolling this container never\n moves, so anything sticky inside it silently scrolls away instead of pinning. */\n.message-list-container {\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n background-color: var(--mj-bg-surface-card);\n position: relative;\n}\n\n/* Empty-state fills the message pane vertically */\n.messages-empty-fill {\n height: 100%;\n}\n\n/* Sticky Date Header */\n.sticky-date-header {\n position: sticky;\n top: 12px;\n z-index: 100;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 0;\n margin: 0;\n pointer-events: none;\n}\n\n.sticky-date-wrapper {\n pointer-events: auto;\n position: relative;\n}\n\n.sticky-date-button {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 16px;\n background: var(--mj-bg-surface-card);\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-primary);\n cursor: pointer;\n transition: all 0.2s;\n box-shadow: var(--mj-shadow-sm);\n}\n\n.sticky-date-button:hover {\n background: var(--mj-bg-surface-sunken);\n box-shadow: var(--mj-shadow-md);\n}\n\n.sticky-date-button i {\n font-size: 10px;\n color: var(--mj-text-secondary);\n}\n\n/* Date Navigation Dropdown */\n.date-nav-dropdown {\n position: absolute;\n top: 100%;\n left: 50%;\n transform: translateX(-50%);\n margin-top: 8px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n box-shadow: var(--mj-shadow-lg);\n min-width: 200px;\n display: none;\n z-index: 101;\n}\n\n.date-nav-dropdown.show {\n display: block;\n}\n\n.date-nav-option {\n padding: 10px 16px;\n cursor: pointer;\n transition: background 0.2s;\n font-size: 14px;\n color: var(--mj-text-primary);\n}\n\n.date-nav-option:hover {\n background: var(--mj-bg-surface-sunken);\n}\n\n.date-nav-option.jump-to {\n font-weight: 600;\n color: var(--mj-text-secondary);\n font-size: 12px;\n cursor: default;\n padding: 8px 16px 4px 16px;\n}\n\n.date-nav-option.jump-to:hover {\n background: none;\n}\n\n/* \u2500\u2500 Windowed transcript sentinel \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n Sits above the first loaded message while older pages remain. Needs real height\n so the IntersectionObserver has something to observe. */\n.transcript-older-sentinel {\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 2.5rem;\n padding: 0.75rem 1rem;\n}\n\n.transcript-older-label {\n font-size: 0.8125rem;\n color: var(--mj-text-secondary);\n}\n\n/* Stands in for an unmounted timeline item so the scroll range never changes when the\n DOM is trimmed. Height comes from the item's last measured size. */\n.transcript-spacer {\n width: 100%;\n flex-shrink: 0;\n}\n\n/* Host owns the scrolling: stop creating a scroll context here so `position: sticky`\n descendants (the date navigator) bind to the host's real scroller and actually pin.\n\n BOTH axes, not just `overflow-y`. Per CSS Overflow, when one axis is `visible` and the\n other is not, the `visible` one computes to `auto` \u2014 so leaving `overflow-x: hidden` in\n place silently kept this element a scroll container and the header kept scrolling away.\n Horizontal clipping is not lost: the host's own scroller (`.chat-messages-container`)\n already carries `overflow-x: hidden`. */\n:host(.mj-list-host-scrolled) .message-list-container {\n overflow: visible;\n}\n\n/* The fork marker of a view with no rows; the same look as the marker under a row (message-item) */\n.fork-marker {\n display: flex;\n align-items: center;\n gap: var(--mj-space-2);\n padding: var(--mj-space-4) var(--mj-space-6) var(--mj-space-2);\n font-size: var(--mj-text-xs);\n color: var(--mj-text-secondary);\n}\n.fork-marker i {\n color: var(--mj-status-info);\n}\n.fork-marker-line {\n flex: 1;\n height: 1px;\n background: var(--mj-border-default);\n}\n@media (max-width: 768px) {\n .fork-marker {\n padding: var(--mj-space-3) var(--mj-space-3) var(--mj-space-2);\n }\n}\n@media (max-width: 480px) {\n .fork-marker {\n padding: var(--mj-space-2);\n }\n}\n"] }]
1936
2181
  }], () => [{ type: i0.ChangeDetectorRef }, { type: i0.ElementRef }], { messages: [{
1937
2182
  type: Input
1938
2183
  }], Conversation: [{
1939
2184
  type: Input
1940
2185
  }], conversation: [{
1941
2186
  type: Input
2187
+ }], ForkChipMap: [{
2188
+ type: Input
2189
+ }], ForkLayout: [{
2190
+ type: Input
2191
+ }], CanFork: [{
2192
+ type: Input
2193
+ }], InPlaceTurn: [{
2194
+ type: Input
1942
2195
  }], CurrentUser: [{
1943
2196
  type: Input
1944
2197
  }], currentUser: [{
@@ -1981,6 +2234,10 @@ export class MessageListComponent extends BaseAngularComponent {
1981
2234
  type: Input
1982
2235
  }], ReadOnly: [{
1983
2236
  type: Input
2237
+ }], AllowStopRun: [{
2238
+ type: Input
2239
+ }], InFlightCount: [{
2240
+ type: Input
1984
2241
  }], HasMoreAbove: [{
1985
2242
  type: Input
1986
2243
  }], IsLoadingOlder: [{
@@ -2038,25 +2295,27 @@ export class MessageListComponent extends BaseAngularComponent {
2038
2295
  type: Output
2039
2296
  }], deleteMessage: [{
2040
2297
  type: Output
2298
+ }], RegenerateRequested: [{
2299
+ type: Output
2041
2300
  }], RetryMessage: [{
2042
2301
  type: Output
2043
2302
  }], retryMessage: [{
2044
2303
  type: Output
2045
- }], TestFeedbackMessage: [{
2304
+ }], EditResendRequested: [{
2046
2305
  type: Output
2047
- }], testFeedbackMessage: [{
2306
+ }], ForkOpenRequested: [{
2048
2307
  type: Output
2049
- }], ArtifactClicked: [{
2308
+ }], ForkRequested: [{
2050
2309
  type: Output
2051
- }], artifactClicked: [{
2310
+ }], ResendInPlaceRequested: [{
2052
2311
  type: Output
2053
- }], ReplyInThread: [{
2312
+ }], TestFeedbackMessage: [{
2054
2313
  type: Output
2055
- }], replyInThread: [{
2314
+ }], testFeedbackMessage: [{
2056
2315
  type: Output
2057
- }], ViewThread: [{
2316
+ }], ArtifactClicked: [{
2058
2317
  type: Output
2059
- }], viewThread: [{
2318
+ }], artifactClicked: [{
2060
2319
  type: Output
2061
2320
  }], MessageEdited: [{
2062
2321
  type: Output
@@ -2078,6 +2337,10 @@ export class MessageListComponent extends BaseAngularComponent {
2078
2337
  type: Output
2079
2338
  }], diagnosticRequested: [{
2080
2339
  type: Output
2340
+ }], BeforeStopClicked: [{
2341
+ type: Output
2342
+ }], StopMessage: [{
2343
+ type: Output
2081
2344
  }], MessagePinToggled: [{
2082
2345
  type: Output
2083
2346
  }], messagePinToggled: [{
@@ -2096,6 +2359,14 @@ export class MessageListComponent extends BaseAngularComponent {
2096
2359
  type: Output
2097
2360
  }], afterResponseFormSubmitted: [{
2098
2361
  type: Output
2362
+ }], TaskGraphPanelRequested: [{
2363
+ type: Output
2364
+ }], taskGraphPanelRequested: [{
2365
+ type: Output
2366
+ }], ScrollToMessageRequested: [{
2367
+ type: Output
2368
+ }], scrollToMessageRequested: [{
2369
+ type: Output
2099
2370
  }], OlderRequested: [{
2100
2371
  type: Output
2101
2372
  }], DateJumpRequested: [{
@@ -2117,5 +2388,5 @@ export class MessageListComponent extends BaseAngularComponent {
2117
2388
  }], messagesUpdate: [{
2118
2389
  type: Input
2119
2390
  }] }); })();
2120
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(MessageListComponent, { className: "MessageListComponent", filePath: "src/lib/components/message/message-list.component.ts", lineNumber: 109 }); })();
2391
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(MessageListComponent, { className: "MessageListComponent", filePath: "src/lib/components/message/message-list.component.ts", lineNumber: 111 }); })();
2121
2392
  //# sourceMappingURL=message-list.component.js.map