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

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 (351) hide show
  1. package/README.md +43 -2
  2. package/dist/lib/components/active-tasks/active-tasks-panel.component.d.ts +19 -3
  3. package/dist/lib/components/active-tasks/active-tasks-panel.component.d.ts.map +1 -1
  4. package/dist/lib/components/active-tasks/active-tasks-panel.component.js +39 -7
  5. package/dist/lib/components/active-tasks/active-tasks-panel.component.js.map +1 -1
  6. package/dist/lib/components/agent/active-agent-indicator.component.d.ts +74 -6
  7. package/dist/lib/components/agent/active-agent-indicator.component.d.ts.map +1 -1
  8. package/dist/lib/components/agent/active-agent-indicator.component.js +111 -21
  9. package/dist/lib/components/agent/active-agent-indicator.component.js.map +1 -1
  10. package/dist/lib/components/agent/agent-process-panel.component.d.ts +31 -5
  11. package/dist/lib/components/agent/agent-process-panel.component.d.ts.map +1 -1
  12. package/dist/lib/components/agent/agent-process-panel.component.js +71 -15
  13. package/dist/lib/components/agent/agent-process-panel.component.js.map +1 -1
  14. package/dist/lib/components/artifact/artifact-share-modal.component.d.ts +65 -9
  15. package/dist/lib/components/artifact/artifact-share-modal.component.d.ts.map +1 -1
  16. package/dist/lib/components/artifact/artifact-share-modal.component.js +169 -57
  17. package/dist/lib/components/artifact/artifact-share-modal.component.js.map +1 -1
  18. package/dist/lib/components/attachment/image-viewer.component.d.ts +77 -11
  19. package/dist/lib/components/attachment/image-viewer.component.d.ts.map +1 -1
  20. package/dist/lib/components/attachment/image-viewer.component.js +181 -47
  21. package/dist/lib/components/attachment/image-viewer.component.js.map +1 -1
  22. package/dist/lib/components/collection/artifact-collection-picker-modal.component.d.ts +129 -19
  23. package/dist/lib/components/collection/artifact-collection-picker-modal.component.d.ts.map +1 -1
  24. package/dist/lib/components/collection/artifact-collection-picker-modal.component.js +350 -116
  25. package/dist/lib/components/collection/artifact-collection-picker-modal.component.js.map +1 -1
  26. package/dist/lib/components/collection/artifact-create-modal.component.d.ts +60 -8
  27. package/dist/lib/components/collection/artifact-create-modal.component.d.ts.map +1 -1
  28. package/dist/lib/components/collection/artifact-create-modal.component.js +130 -46
  29. package/dist/lib/components/collection/artifact-create-modal.component.js.map +1 -1
  30. package/dist/lib/components/collection/collection-artifact-card.component.d.ts +63 -3
  31. package/dist/lib/components/collection/collection-artifact-card.component.d.ts.map +1 -1
  32. package/dist/lib/components/collection/collection-artifact-card.component.js +113 -19
  33. package/dist/lib/components/collection/collection-artifact-card.component.js.map +1 -1
  34. package/dist/lib/components/collection/collection-form-modal.component.d.ts +54 -8
  35. package/dist/lib/components/collection/collection-form-modal.component.d.ts.map +1 -1
  36. package/dist/lib/components/collection/collection-form-modal.component.js +130 -46
  37. package/dist/lib/components/collection/collection-form-modal.component.js.map +1 -1
  38. package/dist/lib/components/collection/collection-share-modal.component.d.ts +70 -10
  39. package/dist/lib/components/collection/collection-share-modal.component.d.ts.map +1 -1
  40. package/dist/lib/components/collection/collection-share-modal.component.js +175 -53
  41. package/dist/lib/components/collection/collection-share-modal.component.js.map +1 -1
  42. package/dist/lib/components/collection/collection-tree.component.d.ts +89 -9
  43. package/dist/lib/components/collection/collection-tree.component.d.ts.map +1 -1
  44. package/dist/lib/components/collection/collection-tree.component.js +220 -70
  45. package/dist/lib/components/collection/collection-tree.component.js.map +1 -1
  46. package/dist/lib/components/collection/collection-view.component.d.ts +89 -11
  47. package/dist/lib/components/collection/collection-view.component.d.ts.map +1 -1
  48. package/dist/lib/components/collection/collection-view.component.js +154 -40
  49. package/dist/lib/components/collection/collection-view.component.js.map +1 -1
  50. package/dist/lib/components/collection/collections-full-view.component.d.ts +390 -38
  51. package/dist/lib/components/collection/collections-full-view.component.d.ts.map +1 -1
  52. package/dist/lib/components/collection/collections-full-view.component.js +951 -367
  53. package/dist/lib/components/collection/collections-full-view.component.js.map +1 -1
  54. package/dist/lib/components/composer/ai-composer.component.d.ts +213 -18
  55. package/dist/lib/components/composer/ai-composer.component.d.ts.map +1 -1
  56. package/dist/lib/components/composer/ai-composer.component.js +388 -44
  57. package/dist/lib/components/composer/ai-composer.component.js.map +1 -1
  58. package/dist/lib/components/conversation/conversation-agent-picker.component.d.ts +12 -1
  59. package/dist/lib/components/conversation/conversation-agent-picker.component.d.ts.map +1 -1
  60. package/dist/lib/components/conversation/conversation-agent-picker.component.js +26 -4
  61. package/dist/lib/components/conversation/conversation-agent-picker.component.js.map +1 -1
  62. package/dist/lib/components/conversation/conversation-chat-area.component.d.ts +1191 -124
  63. package/dist/lib/components/conversation/conversation-chat-area.component.d.ts.map +1 -1
  64. package/dist/lib/components/conversation/conversation-chat-area.component.js +2816 -785
  65. package/dist/lib/components/conversation/conversation-chat-area.component.js.map +1 -1
  66. package/dist/lib/components/conversation/conversation-empty-state.component.d.ts +139 -19
  67. package/dist/lib/components/conversation/conversation-empty-state.component.d.ts.map +1 -1
  68. package/dist/lib/components/conversation/conversation-empty-state.component.js +296 -59
  69. package/dist/lib/components/conversation/conversation-empty-state.component.js.map +1 -1
  70. package/dist/lib/components/conversation/conversation-list.component.d.ts +579 -78
  71. package/dist/lib/components/conversation/conversation-list.component.d.ts.map +1 -1
  72. package/dist/lib/components/conversation/conversation-list.component.js +2322 -823
  73. package/dist/lib/components/conversation/conversation-list.component.js.map +1 -1
  74. package/dist/lib/components/conversation/pinned-messages-panel.component.d.ts +42 -4
  75. package/dist/lib/components/conversation/pinned-messages-panel.component.d.ts.map +1 -1
  76. package/dist/lib/components/conversation/pinned-messages-panel.component.js +93 -21
  77. package/dist/lib/components/conversation/pinned-messages-panel.component.js.map +1 -1
  78. package/dist/lib/components/dialogs/input-dialog.component.d.ts +57 -11
  79. package/dist/lib/components/dialogs/input-dialog.component.d.ts.map +1 -1
  80. package/dist/lib/components/dialogs/input-dialog.component.js +128 -16
  81. package/dist/lib/components/dialogs/input-dialog.component.js.map +1 -1
  82. package/dist/lib/components/dialogs/rating-dialog.component.d.ts +68 -10
  83. package/dist/lib/components/dialogs/rating-dialog.component.d.ts.map +1 -1
  84. package/dist/lib/components/dialogs/rating-dialog.component.js +151 -27
  85. package/dist/lib/components/dialogs/rating-dialog.component.js.map +1 -1
  86. package/dist/lib/components/export/export-modal.component.d.ts +84 -10
  87. package/dist/lib/components/export/export-modal.component.d.ts.map +1 -1
  88. package/dist/lib/components/export/export-modal.component.js +173 -49
  89. package/dist/lib/components/export/export-modal.component.js.map +1 -1
  90. package/dist/lib/components/global-tasks/global-tasks-panel.component.d.ts +29 -3
  91. package/dist/lib/components/global-tasks/global-tasks-panel.component.d.ts.map +1 -1
  92. package/dist/lib/components/global-tasks/global-tasks-panel.component.js +58 -12
  93. package/dist/lib/components/global-tasks/global-tasks-panel.component.js.map +1 -1
  94. package/dist/lib/components/library/library-full-view.component.d.ts +57 -8
  95. package/dist/lib/components/library/library-full-view.component.d.ts.map +1 -1
  96. package/dist/lib/components/library/library-full-view.component.js +119 -35
  97. package/dist/lib/components/library/library-full-view.component.js.map +1 -1
  98. package/dist/lib/components/members/members-modal.component.d.ts +76 -10
  99. package/dist/lib/components/members/members-modal.component.d.ts.map +1 -1
  100. package/dist/lib/components/members/members-modal.component.js +164 -50
  101. package/dist/lib/components/members/members-modal.component.js.map +1 -1
  102. package/dist/lib/components/message/actionable-commands.component.d.ts +49 -5
  103. package/dist/lib/components/message/actionable-commands.component.d.ts.map +1 -1
  104. package/dist/lib/components/message/actionable-commands.component.js +140 -26
  105. package/dist/lib/components/message/actionable-commands.component.js.map +1 -1
  106. package/dist/lib/components/message/conversation-message-rating.component.d.ts +46 -10
  107. package/dist/lib/components/message/conversation-message-rating.component.d.ts.map +1 -1
  108. package/dist/lib/components/message/conversation-message-rating.component.js +120 -36
  109. package/dist/lib/components/message/conversation-message-rating.component.js.map +1 -1
  110. package/dist/lib/components/message/message-input.component.d.ts +613 -74
  111. package/dist/lib/components/message/message-input.component.d.ts.map +1 -1
  112. package/dist/lib/components/message/message-input.component.js +1390 -422
  113. package/dist/lib/components/message/message-input.component.js.map +1 -1
  114. package/dist/lib/components/message/message-item.component.d.ts +490 -29
  115. package/dist/lib/components/message/message-item.component.d.ts.map +1 -1
  116. package/dist/lib/components/message/message-item.component.js +1088 -244
  117. package/dist/lib/components/message/message-item.component.js.map +1 -1
  118. package/dist/lib/components/message/message-list.component.d.ts +297 -29
  119. package/dist/lib/components/message/message-list.component.d.ts.map +1 -1
  120. package/dist/lib/components/message/message-list.component.js +598 -123
  121. package/dist/lib/components/message/message-list.component.js.map +1 -1
  122. package/dist/lib/components/navigation/conversation-navigation.component.d.ts +64 -5
  123. package/dist/lib/components/navigation/conversation-navigation.component.d.ts.map +1 -1
  124. package/dist/lib/components/navigation/conversation-navigation.component.js +101 -11
  125. package/dist/lib/components/navigation/conversation-navigation.component.js.map +1 -1
  126. package/dist/lib/components/notification/activity-indicator.component.d.ts +6 -2
  127. package/dist/lib/components/notification/activity-indicator.component.d.ts.map +1 -1
  128. package/dist/lib/components/notification/activity-indicator.component.js +13 -3
  129. package/dist/lib/components/notification/activity-indicator.component.js.map +1 -1
  130. package/dist/lib/components/notification/notification-badge.component.d.ts +15 -3
  131. package/dist/lib/components/notification/notification-badge.component.d.ts.map +1 -1
  132. package/dist/lib/components/notification/notification-badge.component.js +36 -8
  133. package/dist/lib/components/notification/notification-badge.component.js.map +1 -1
  134. package/dist/lib/components/overlay/chat-overlay.component.d.ts +1 -1
  135. package/dist/lib/components/overlay/chat-overlay.component.js +4 -4
  136. package/dist/lib/components/overlay/chat-overlay.component.js.map +1 -1
  137. package/dist/lib/components/project/project-form-modal.component.d.ts +93 -11
  138. package/dist/lib/components/project/project-form-modal.component.d.ts.map +1 -1
  139. package/dist/lib/components/project/project-form-modal.component.js +348 -87
  140. package/dist/lib/components/project/project-form-modal.component.js.map +1 -1
  141. package/dist/lib/components/project/project-selector.component.d.ts +78 -8
  142. package/dist/lib/components/project/project-selector.component.d.ts.map +1 -1
  143. package/dist/lib/components/project/project-selector.component.js +177 -46
  144. package/dist/lib/components/project/project-selector.component.js.map +1 -1
  145. package/dist/lib/components/realtime/realtime-activity-rail.component.d.ts +1 -1
  146. package/dist/lib/components/realtime/realtime-activity-rail.component.js +2 -2
  147. package/dist/lib/components/realtime/realtime-activity-rail.component.js.map +1 -1
  148. package/dist/lib/components/realtime/realtime-delegation-card.component.d.ts +1 -1
  149. package/dist/lib/components/realtime/realtime-delegation-card.component.js +2 -2
  150. package/dist/lib/components/realtime/realtime-delegation-card.component.js.map +1 -1
  151. package/dist/lib/components/realtime/realtime-session-overlay.component.d.ts +2 -2
  152. package/dist/lib/components/realtime/realtime-session-overlay.component.js +18 -18
  153. package/dist/lib/components/realtime/realtime-session-overlay.component.js.map +1 -1
  154. package/dist/lib/components/realtime/realtime-session-timeline-card.component.d.ts +47 -23
  155. package/dist/lib/components/realtime/realtime-session-timeline-card.component.d.ts.map +1 -1
  156. package/dist/lib/components/realtime/realtime-session-timeline-card.component.js +136 -92
  157. package/dist/lib/components/realtime/realtime-session-timeline-card.component.js.map +1 -1
  158. package/dist/lib/components/realtime/realtime-surface-tabs.component.d.ts +2 -2
  159. package/dist/lib/components/realtime/realtime-surface-tabs.component.js +4 -4
  160. package/dist/lib/components/realtime/realtime-surface-tabs.component.js.map +1 -1
  161. package/dist/lib/components/realtime/realtime-surface-tabs.model.d.ts +1 -1
  162. package/dist/lib/components/realtime/realtime-surface-tabs.model.js +3 -3
  163. package/dist/lib/components/realtime/realtime-surface-tabs.model.js.map +1 -1
  164. package/dist/lib/components/realtime/realtime-ui-config.d.ts +13 -11
  165. package/dist/lib/components/realtime/realtime-ui-config.d.ts.map +1 -1
  166. package/dist/lib/components/realtime/realtime-ui-config.js +29 -25
  167. package/dist/lib/components/realtime/realtime-ui-config.js.map +1 -1
  168. package/dist/lib/components/realtime/whiteboard/whiteboard-channel.d.ts +3 -1
  169. package/dist/lib/components/realtime/whiteboard/whiteboard-channel.d.ts.map +1 -1
  170. package/dist/lib/components/realtime/whiteboard/whiteboard-channel.js +6 -2
  171. package/dist/lib/components/realtime/whiteboard/whiteboard-channel.js.map +1 -1
  172. package/dist/lib/components/search/search-panel.component.d.ts +133 -22
  173. package/dist/lib/components/search/search-panel.component.d.ts.map +1 -1
  174. package/dist/lib/components/search/search-panel.component.js +312 -83
  175. package/dist/lib/components/search/search-panel.component.js.map +1 -1
  176. package/dist/lib/components/share/share-modal.component.d.ts +69 -9
  177. package/dist/lib/components/share/share-modal.component.d.ts.map +1 -1
  178. package/dist/lib/components/share/share-modal.component.js +139 -31
  179. package/dist/lib/components/share/share-modal.component.js.map +1 -1
  180. package/dist/lib/components/shared/user-picker.component.d.ts +48 -8
  181. package/dist/lib/components/shared/user-picker.component.d.ts.map +1 -1
  182. package/dist/lib/components/shared/user-picker.component.js +110 -30
  183. package/dist/lib/components/shared/user-picker.component.js.map +1 -1
  184. package/dist/lib/components/sidebar/conversation-sidebar.component.d.ts +114 -11
  185. package/dist/lib/components/sidebar/conversation-sidebar.component.d.ts.map +1 -1
  186. package/dist/lib/components/sidebar/conversation-sidebar.component.js +199 -21
  187. package/dist/lib/components/sidebar/conversation-sidebar.component.js.map +1 -1
  188. package/dist/lib/components/sidebar/routines-section.component.d.ts +20 -1
  189. package/dist/lib/components/sidebar/routines-section.component.d.ts.map +1 -1
  190. package/dist/lib/components/sidebar/routines-section.component.js +25 -5
  191. package/dist/lib/components/sidebar/routines-section.component.js.map +1 -1
  192. package/dist/lib/components/slots/slot-interfaces.d.ts +19 -0
  193. package/dist/lib/components/slots/slot-interfaces.d.ts.map +1 -1
  194. package/dist/lib/components/slots/slot-interfaces.js.map +1 -1
  195. package/dist/lib/components/task/tasks-full-view.component.d.ts +95 -13
  196. package/dist/lib/components/task/tasks-full-view.component.d.ts.map +1 -1
  197. package/dist/lib/components/task/tasks-full-view.component.js +223 -75
  198. package/dist/lib/components/task/tasks-full-view.component.js.map +1 -1
  199. package/dist/lib/components/tasks/task-widget.component.d.ts +46 -6
  200. package/dist/lib/components/tasks/task-widget.component.d.ts.map +1 -1
  201. package/dist/lib/components/tasks/task-widget.component.js +100 -16
  202. package/dist/lib/components/tasks/task-widget.component.js.map +1 -1
  203. package/dist/lib/components/tasks/tasks-dropdown.component.d.ts +64 -7
  204. package/dist/lib/components/tasks/tasks-dropdown.component.d.ts.map +1 -1
  205. package/dist/lib/components/tasks/tasks-dropdown.component.js +127 -27
  206. package/dist/lib/components/tasks/tasks-dropdown.component.js.map +1 -1
  207. package/dist/lib/components/thread/thread-panel.component.d.ts +66 -8
  208. package/dist/lib/components/thread/thread-panel.component.d.ts.map +1 -1
  209. package/dist/lib/components/thread/thread-panel.component.js +146 -36
  210. package/dist/lib/components/thread/thread-panel.component.js.map +1 -1
  211. package/dist/lib/components/toast/toast.component.d.ts +11 -1
  212. package/dist/lib/components/toast/toast.component.d.ts.map +1 -1
  213. package/dist/lib/components/toast/toast.component.js +25 -5
  214. package/dist/lib/components/toast/toast.component.js.map +1 -1
  215. package/dist/lib/components/workspace/conversation-workspace.component.d.ts +385 -42
  216. package/dist/lib/components/workspace/conversation-workspace.component.d.ts.map +1 -1
  217. package/dist/lib/components/workspace/conversation-workspace.component.js +891 -292
  218. package/dist/lib/components/workspace/conversation-workspace.component.js.map +1 -1
  219. package/dist/lib/composer-plugins/base-conversation-mention.provider.d.ts +8 -0
  220. package/dist/lib/composer-plugins/base-conversation-mention.provider.d.ts.map +1 -1
  221. package/dist/lib/composer-plugins/base-conversation-mention.provider.js +8 -1
  222. package/dist/lib/composer-plugins/base-conversation-mention.provider.js.map +1 -1
  223. package/dist/lib/directives/chat-slot.directive.d.ts +5 -1
  224. package/dist/lib/directives/chat-slot.directive.d.ts.map +1 -1
  225. package/dist/lib/directives/chat-slot.directive.js.map +1 -1
  226. package/dist/lib/directives/search-shortcut.directive.d.ts +9 -1
  227. package/dist/lib/directives/search-shortcut.directive.d.ts.map +1 -1
  228. package/dist/lib/directives/search-shortcut.directive.js +14 -4
  229. package/dist/lib/directives/search-shortcut.directive.js.map +1 -1
  230. package/dist/lib/events/chat-events.d.ts +34 -7
  231. package/dist/lib/events/chat-events.d.ts.map +1 -1
  232. package/dist/lib/events/chat-events.js +37 -7
  233. package/dist/lib/events/chat-events.js.map +1 -1
  234. package/dist/lib/models/agent-turn.model.d.ts +113 -0
  235. package/dist/lib/models/agent-turn.model.d.ts.map +1 -0
  236. package/dist/lib/models/agent-turn.model.js +12 -0
  237. package/dist/lib/models/agent-turn.model.js.map +1 -0
  238. package/dist/lib/models/collection-view.model.js.map +1 -1
  239. package/dist/lib/models/conversation-state.model.d.ts +8 -0
  240. package/dist/lib/models/conversation-state.model.d.ts.map +1 -1
  241. package/dist/lib/models/conversation-state.model.js.map +1 -1
  242. package/dist/lib/models/lazy-artifact-info.d.ts +44 -12
  243. package/dist/lib/models/lazy-artifact-info.d.ts.map +1 -1
  244. package/dist/lib/models/lazy-artifact-info.js +98 -34
  245. package/dist/lib/models/lazy-artifact-info.js.map +1 -1
  246. package/dist/lib/services/active-tasks.service.d.ts +30 -4
  247. package/dist/lib/services/active-tasks.service.d.ts.map +1 -1
  248. package/dist/lib/services/active-tasks.service.js +71 -19
  249. package/dist/lib/services/active-tasks.service.js.map +1 -1
  250. package/dist/lib/services/agent-state.service.d.ts +17 -1
  251. package/dist/lib/services/agent-state.service.d.ts.map +1 -1
  252. package/dist/lib/services/agent-state.service.js +48 -16
  253. package/dist/lib/services/agent-state.service.js.map +1 -1
  254. package/dist/lib/services/artifact-permission.service.d.ts +39 -0
  255. package/dist/lib/services/artifact-permission.service.d.ts.map +1 -1
  256. package/dist/lib/services/artifact-permission.service.js +152 -17
  257. package/dist/lib/services/artifact-permission.service.js.map +1 -1
  258. package/dist/lib/services/artifact-state.service.d.ts +58 -5
  259. package/dist/lib/services/artifact-state.service.d.ts.map +1 -1
  260. package/dist/lib/services/artifact-state.service.js +135 -35
  261. package/dist/lib/services/artifact-state.service.js.map +1 -1
  262. package/dist/lib/services/collection-permission.service.d.ts +28 -0
  263. package/dist/lib/services/collection-permission.service.d.ts.map +1 -1
  264. package/dist/lib/services/collection-permission.service.js +88 -32
  265. package/dist/lib/services/collection-permission.service.js.map +1 -1
  266. package/dist/lib/services/collection-state.service.d.ts +11 -1
  267. package/dist/lib/services/collection-state.service.d.ts.map +1 -1
  268. package/dist/lib/services/collection-state.service.js +25 -5
  269. package/dist/lib/services/collection-state.service.js.map +1 -1
  270. package/dist/lib/services/conversation-agent.service.d.ts +47 -4
  271. package/dist/lib/services/conversation-agent.service.d.ts.map +1 -1
  272. package/dist/lib/services/conversation-agent.service.js +85 -20
  273. package/dist/lib/services/conversation-agent.service.js.map +1 -1
  274. package/dist/lib/services/conversation-attachment.service.d.ts +17 -0
  275. package/dist/lib/services/conversation-attachment.service.d.ts.map +1 -1
  276. package/dist/lib/services/conversation-attachment.service.js +38 -10
  277. package/dist/lib/services/conversation-attachment.service.js.map +1 -1
  278. package/dist/lib/services/conversation-liveness-dom.service.d.ts +42 -0
  279. package/dist/lib/services/conversation-liveness-dom.service.d.ts.map +1 -0
  280. package/dist/lib/services/conversation-liveness-dom.service.js +74 -0
  281. package/dist/lib/services/conversation-liveness-dom.service.js.map +1 -0
  282. package/dist/lib/services/conversation-streaming.service.d.ts +22 -0
  283. package/dist/lib/services/conversation-streaming.service.d.ts.map +1 -1
  284. package/dist/lib/services/conversation-streaming.service.js +50 -10
  285. package/dist/lib/services/conversation-streaming.service.js.map +1 -1
  286. package/dist/lib/services/data-cache.service.d.ts +31 -0
  287. package/dist/lib/services/data-cache.service.d.ts.map +1 -1
  288. package/dist/lib/services/data-cache.service.js +71 -15
  289. package/dist/lib/services/data-cache.service.js.map +1 -1
  290. package/dist/lib/services/dialog.service.d.ts +13 -0
  291. package/dist/lib/services/dialog.service.d.ts.map +1 -1
  292. package/dist/lib/services/dialog.service.js +25 -5
  293. package/dist/lib/services/dialog.service.js.map +1 -1
  294. package/dist/lib/services/export.service.d.ts +2 -0
  295. package/dist/lib/services/export.service.d.ts.map +1 -1
  296. package/dist/lib/services/export.service.js +5 -1
  297. package/dist/lib/services/export.service.js.map +1 -1
  298. package/dist/lib/services/mention-parser.service.d.ts +10 -0
  299. package/dist/lib/services/mention-parser.service.d.ts.map +1 -1
  300. package/dist/lib/services/mention-parser.service.js +25 -5
  301. package/dist/lib/services/mention-parser.service.js.map +1 -1
  302. package/dist/lib/services/notification.service.d.ts +54 -6
  303. package/dist/lib/services/notification.service.d.ts.map +1 -1
  304. package/dist/lib/services/notification.service.js +123 -27
  305. package/dist/lib/services/notification.service.js.map +1 -1
  306. package/dist/lib/services/realtime-audio-recorder.d.ts +4 -4
  307. package/dist/lib/services/realtime-audio-recorder.js +12 -12
  308. package/dist/lib/services/realtime-audio-recorder.js.map +1 -1
  309. package/dist/lib/services/realtime-pcm-wav.d.ts +4 -0
  310. package/dist/lib/services/realtime-pcm-wav.d.ts.map +1 -1
  311. package/dist/lib/services/realtime-pcm-wav.js +10 -2
  312. package/dist/lib/services/realtime-pcm-wav.js.map +1 -1
  313. package/dist/lib/services/search.service.d.ts +42 -9
  314. package/dist/lib/services/search.service.d.ts.map +1 -1
  315. package/dist/lib/services/search.service.js +103 -23
  316. package/dist/lib/services/search.service.js.map +1 -1
  317. package/dist/lib/services/toast.service.d.ts +19 -1
  318. package/dist/lib/services/toast.service.d.ts.map +1 -1
  319. package/dist/lib/services/toast.service.js +45 -9
  320. package/dist/lib/services/toast.service.js.map +1 -1
  321. package/dist/lib/services/ui-command-handler.service.d.ts +56 -5
  322. package/dist/lib/services/ui-command-handler.service.d.ts.map +1 -1
  323. package/dist/lib/services/ui-command-handler.service.js +113 -16
  324. package/dist/lib/services/ui-command-handler.service.js.map +1 -1
  325. package/dist/lib/utils/agent-artifact-summary.d.ts +2 -2
  326. package/dist/lib/utils/agent-artifact-summary.js +3 -3
  327. package/dist/lib/utils/agent-artifact-summary.js.map +1 -1
  328. package/dist/lib/utils/agent-turn-routing.d.ts +70 -0
  329. package/dist/lib/utils/agent-turn-routing.d.ts.map +1 -0
  330. package/dist/lib/utils/agent-turn-routing.js +84 -0
  331. package/dist/lib/utils/agent-turn-routing.js.map +1 -0
  332. package/dist/lib/utils/artifact-panel-action.d.ts +15 -4
  333. package/dist/lib/utils/artifact-panel-action.d.ts.map +1 -1
  334. package/dist/lib/utils/artifact-panel-action.js +10 -2
  335. package/dist/lib/utils/artifact-panel-action.js.map +1 -1
  336. package/dist/lib/utils/decision-routing.d.ts +68 -0
  337. package/dist/lib/utils/decision-routing.d.ts.map +1 -0
  338. package/dist/lib/utils/decision-routing.js +101 -0
  339. package/dist/lib/utils/decision-routing.js.map +1 -0
  340. package/dist/lib/utils/distinct-artifacts.d.ts +2 -0
  341. package/dist/lib/utils/distinct-artifacts.d.ts.map +1 -1
  342. package/dist/lib/utils/distinct-artifacts.js +5 -1
  343. package/dist/lib/utils/distinct-artifacts.js.map +1 -1
  344. package/dist/lib/utils/plan-mode-preference.d.ts +2 -2
  345. package/dist/lib/utils/plan-mode-preference.js +6 -6
  346. package/dist/lib/utils/plan-mode-preference.js.map +1 -1
  347. package/dist/public-api.d.ts +5 -0
  348. package/dist/public-api.d.ts.map +1 -1
  349. package/dist/public-api.js +8 -0
  350. package/dist/public-api.js.map +1 -1
  351. package/package.json +32 -32
@@ -7,7 +7,8 @@ import { FormResponseUtils } from '@memberjunction/ng-forms';
7
7
  import { PlanModePreference } from '../../utils/plan-mode-preference';
8
8
  import { MentionAutocompleteService } from '../../services/mention-autocomplete.service';
9
9
  import { BeforeResponseFormSubmittedEventArgs, AfterResponseFormSubmittedEventArgs, } from '../../events/chat-events';
10
- import { UUIDsEqual } from '@memberjunction/global';
10
+ import { NormalizeUUID, UUIDsEqual } from '@memberjunction/global';
11
+ import { ConversationsRuntime } from '@memberjunction/conversations-runtime';
11
12
  import { BadgeTextForAttachment } from '../../util/attachment-badge';
12
13
  import * as i0 from "@angular/core";
13
14
  import * as i1 from "../../services/mention-parser.service";
@@ -89,16 +90,32 @@ function MessageItemComponent_Conditional_13_Template(rf, ctx) { if (rf & 1) {
89
90
  i0.ɵɵelement(1, "i", 28);
90
91
  i0.ɵɵelementEnd();
91
92
  } }
93
+ function MessageItemComponent_Conditional_14_Conditional_3_Template(rf, ctx) { if (rf & 1) {
94
+ i0.ɵɵelementStart(0, "span", 30);
95
+ i0.ɵɵtext(1, "checking\u2026");
96
+ i0.ɵɵelementEnd();
97
+ } }
98
+ function MessageItemComponent_Conditional_14_Conditional_4_Template(rf, ctx) { if (rf & 1) {
99
+ i0.ɵɵelementStart(0, "span", 30);
100
+ i0.ɵɵtext(1, "no response");
101
+ i0.ɵɵelementEnd();
102
+ } }
92
103
  function MessageItemComponent_Conditional_14_Template(rf, ctx) { if (rf & 1) {
93
104
  i0.ɵɵelementStart(0, "span", 29);
94
- i0.ɵɵelement(1, "i", 30);
105
+ i0.ɵɵelement(1, "i", 23);
95
106
  i0.ɵɵtext(2);
107
+ i0.ɵɵconditionalCreate(3, MessageItemComponent_Conditional_14_Conditional_3_Template, 2, 0, "span", 30)(4, MessageItemComponent_Conditional_14_Conditional_4_Template, 2, 0, "span", 30);
96
108
  i0.ɵɵelementEnd();
97
109
  } if (rf & 2) {
98
110
  const ctx_r0 = i0.ɵɵnextContext();
99
- i0.ɵɵclassProp("in-progress", ctx_r0.isInProgressAIMessage)("active", !ctx_r0.isInProgressAIMessage && ctx_r0.isAgentRunActive)("complete", !ctx_r0.isInProgressAIMessage && !ctx_r0.isAgentRunActive && ctx_r0.messageStatus === "Complete")("failed", ctx_r0.messageStatus === "Error");
100
- i0.ɵɵadvance(2);
111
+ i0.ɵɵclassProp("in-progress", ctx_r0.isInProgressAIMessage)("active", !ctx_r0.isInProgressAIMessage && ctx_r0.isAgentRunActive)("complete", !ctx_r0.isInProgressAIMessage && !ctx_r0.isAgentRunActive && ctx_r0.messageStatus === "Complete")("failed", ctx_r0.messageStatus === "Error")("checking", ctx_r0.LivenessState === "checking")("stalled", ctx_r0.LivenessState === "stalled");
112
+ i0.ɵɵproperty("title", ctx_r0.LivenessState === "stalled" ? "No progress reported for several minutes" : ctx_r0.LivenessState === "checking" ? "No recent progress \u2014 re-checking" : "");
113
+ i0.ɵɵadvance();
114
+ i0.ɵɵproperty("ngClass", ctx_r0.LivenessState === "live" ? "fa-clock" : "fa-exclamation-triangle");
115
+ i0.ɵɵadvance();
101
116
  i0.ɵɵtextInterpolate1(" ", ctx_r0.timePillText, " ");
117
+ i0.ɵɵadvance();
118
+ i0.ɵɵconditional(ctx_r0.LivenessState === "checking" ? 3 : ctx_r0.LivenessState === "stalled" ? 4 : -1);
102
119
  } }
103
120
  function MessageItemComponent_Conditional_15_Template(rf, ctx) { if (rf & 1) {
104
121
  const _r4 = i0.ɵɵgetCurrentView();
@@ -265,9 +282,9 @@ function MessageItemComponent_Conditional_18_Template(rf, ctx) { if (rf & 1) {
265
282
  i0.ɵɵadvance(2);
266
283
  i0.ɵɵrepeater(ctx_r0.pendingArtifactPlaceholders);
267
284
  i0.ɵɵadvance(2);
268
- i0.ɵɵconditional(ctx_r0.isLastMessageInConversation && ctx_r0.isConversationOwner && ctx_r0.responseForm ? 9 : -1);
285
+ i0.ɵɵconditional(!ctx_r0.ReadOnly && ctx_r0.isLastMessageInConversation && ctx_r0.isConversationOwner && ctx_r0.responseForm ? 9 : -1);
269
286
  i0.ɵɵadvance();
270
- i0.ɵɵconditional(ctx_r0.isLastMessageInConversation && ctx_r0.isConversationOwner && ctx_r0.actionableCommands.length > 0 ? 10 : -1);
287
+ i0.ɵɵconditional(!ctx_r0.ReadOnly && ctx_r0.isLastMessageInConversation && ctx_r0.isConversationOwner && ctx_r0.actionableCommands.length > 0 ? 10 : -1);
271
288
  } }
272
289
  function MessageItemComponent_Conditional_19_Template(rf, ctx) { if (rf & 1) {
273
290
  const _r14 = i0.ɵɵgetCurrentView();
@@ -304,7 +321,7 @@ function MessageItemComponent_Conditional_20_Conditional_2_Conditional_1_Templat
304
321
  i0.ɵɵelement(0, "mj-conversation-message-rating", 72);
305
322
  } if (rf & 2) {
306
323
  const ctx_r0 = i0.ɵɵnextContext(3);
307
- i0.ɵɵproperty("conversationDetailId", ctx_r0.message.ID)("currentUser", ctx_r0.currentUser)("ratingEntityName", ctx_r0.message.EntityInfo.Name || "MJ: Conversation Details")("ratingsData", ctx_r0.ratings)("canEdit", ctx_r0.isConversationOwner);
324
+ i0.ɵɵproperty("conversationDetailId", ctx_r0.message.ID)("currentUser", ctx_r0.currentUser)("ratingEntityName", ctx_r0.message.EntityInfo.Name || "MJ: Conversation Details")("ratingsData", ctx_r0.ratings)("canEdit", ctx_r0.isConversationOwner && !ctx_r0.ReadOnly);
308
325
  } }
309
326
  function MessageItemComponent_Conditional_20_Conditional_2_Conditional_2_Template(rf, ctx) { if (rf & 1) {
310
327
  const _r16 = i0.ɵɵgetCurrentView();
@@ -440,7 +457,7 @@ function MessageItemComponent_Conditional_22_Conditional_2_Conditional_2_Conditi
440
457
  i0.ɵɵelement(0, "mj-conversation-message-rating", 91);
441
458
  } if (rf & 2) {
442
459
  const ctx_r0 = i0.ɵɵnextContext(4);
443
- i0.ɵɵproperty("conversationDetailId", ctx_r0.message.ID)("currentUser", ctx_r0.currentUser)("ratingsData", ctx_r0.ratings)("canEdit", ctx_r0.isConversationOwner);
460
+ i0.ɵɵproperty("conversationDetailId", ctx_r0.message.ID)("currentUser", ctx_r0.currentUser)("ratingsData", ctx_r0.ratings)("canEdit", ctx_r0.isConversationOwner && !ctx_r0.ReadOnly);
444
461
  } }
445
462
  function MessageItemComponent_Conditional_22_Conditional_2_Conditional_2_Conditional_2_Template(rf, ctx) { if (rf & 1) {
446
463
  const _r19 = i0.ɵɵgetCurrentView();
@@ -548,6 +565,19 @@ function MessageItemComponent_Conditional_24_Template(rf, ctx) { if (rf & 1) {
548
565
  i0.ɵɵtext(8, "0");
549
566
  i0.ɵɵelementEnd()()();
550
567
  } }
568
+ /**
569
+ * Silence after which an in-flight run is no longer presented as healthy. Three missed heartbeats
570
+ * (`AgentRunWatchdogConfig.heartbeatIntervalMs` is 30s), so ordinary jitter never trips it.
571
+ */
572
+ export const LIVENESS_CHECKING_MS = 90_000;
573
+ /**
574
+ * Silence after which the run is presented as stalled. Matches the watchdog's
575
+ * `staleThresholdMinutes`, which is the point the server force-fails the run — so the UI stops
576
+ * claiming progress exactly when the server stops believing in it.
577
+ */
578
+ export const LIVENESS_STALLED_MS = 5 * 60_000;
579
+ /** Minimum gap between re-check requests from one message. The pill re-evaluates every second. */
580
+ export const LIVENESS_RECHECK_THROTTLE_MS = 30_000;
551
581
  /** Shared empty result so the placeholder getter allocates nothing once loading has finished. */
552
582
  const NO_PENDING_ARTIFACTS = Object.freeze([]);
553
583
  /**
@@ -562,23 +592,111 @@ export class MessageItemComponent extends BaseAngularComponent {
562
592
  agentService;
563
593
  markdownService;
564
594
  message;
565
- conversation;
566
- currentUser;
567
- allMessages;
568
- isProcessing = false;
569
- artifact;
595
+ Conversation;
596
+ /** @deprecated Use {@link Conversation}. */
597
+ set conversation(value) {
598
+ this.Conversation = value;
599
+ }
600
+ /** @deprecated Use {@link Conversation}. */
601
+ get conversation() {
602
+ return this.Conversation;
603
+ }
604
+ CurrentUser;
605
+ /** @deprecated Use {@link CurrentUser}. */
606
+ set currentUser(value) {
607
+ this.CurrentUser = value;
608
+ }
609
+ /** @deprecated Use {@link CurrentUser}. */
610
+ get currentUser() {
611
+ return this.CurrentUser;
612
+ }
613
+ AllMessages;
614
+ /** @deprecated Use {@link AllMessages}. */
615
+ set allMessages(value) {
616
+ this.AllMessages = value;
617
+ }
618
+ /** @deprecated Use {@link AllMessages}. */
619
+ get allMessages() {
620
+ return this.AllMessages;
621
+ }
622
+ IsProcessing = false;
623
+ /** @deprecated Use {@link IsProcessing}. */
624
+ set isProcessing(value) {
625
+ this.IsProcessing = value;
626
+ }
627
+ /** @deprecated Use {@link IsProcessing}. */
628
+ get isProcessing() {
629
+ return this.IsProcessing;
630
+ }
631
+ Artifact;
632
+ /** @deprecated Use {@link Artifact}. */
633
+ set artifact(value) {
634
+ this.Artifact = value;
635
+ }
636
+ /** @deprecated Use {@link Artifact}. */
637
+ get artifact() {
638
+ return this.Artifact;
639
+ }
570
640
  artifactVersion;
571
641
  /**
572
642
  * All distinct artifacts attached to this message, each at its latest version.
573
643
  * Preferred over the single `artifact`/`artifactVersion` inputs above (which are
574
644
  * retained for backward compatibility and kept pointed at the first entry).
575
645
  */
576
- artifacts = [];
577
- agentRun = null; // Passed from parent, loaded once per conversation
578
- userAvatarMap = new Map();
579
- ratings; // Pre-loaded ratings from parent (RatingsJSON from query)
580
- isLastMessage = false; // Whether this is the last message in the conversation
581
- attachments = []; // Attachments for this message
646
+ Artifacts = [];
647
+ /** @deprecated Use {@link Artifacts}. */
648
+ set artifacts(value) {
649
+ this.Artifacts = value;
650
+ }
651
+ /** @deprecated Use {@link Artifacts}. */
652
+ get artifacts() {
653
+ return this.Artifacts;
654
+ }
655
+ AgentRun = null;
656
+ /** @deprecated Use {@link AgentRun}. */
657
+ set agentRun(value) {
658
+ this.AgentRun = value;
659
+ }
660
+ /** @deprecated Use {@link AgentRun}. */
661
+ get agentRun() {
662
+ return this.AgentRun;
663
+ } // Passed from parent, loaded once per conversation
664
+ UserAvatarMap = new Map();
665
+ /** @deprecated Use {@link UserAvatarMap}. */
666
+ set userAvatarMap(value) {
667
+ this.UserAvatarMap = value;
668
+ }
669
+ /** @deprecated Use {@link UserAvatarMap}. */
670
+ get userAvatarMap() {
671
+ return this.UserAvatarMap;
672
+ }
673
+ Ratings;
674
+ /** @deprecated Use {@link Ratings}. */
675
+ set ratings(value) {
676
+ this.Ratings = value;
677
+ }
678
+ /** @deprecated Use {@link Ratings}. */
679
+ get ratings() {
680
+ return this.Ratings;
681
+ } // Pre-loaded ratings from parent (RatingsJSON from query)
682
+ IsLastMessage = false;
683
+ /** @deprecated Use {@link IsLastMessage}. */
684
+ set isLastMessage(value) {
685
+ this.IsLastMessage = value;
686
+ }
687
+ /** @deprecated Use {@link IsLastMessage}. */
688
+ get isLastMessage() {
689
+ return this.IsLastMessage;
690
+ } // Whether this is the last message in the conversation
691
+ Attachments = [];
692
+ /** @deprecated Use {@link Attachments}. */
693
+ set attachments(value) {
694
+ this.Attachments = value;
695
+ }
696
+ /** @deprecated Use {@link Attachments}. */
697
+ get attachments() {
698
+ return this.Attachments;
699
+ } // Attachments for this message
582
700
  /**
583
701
  * Artifacts attached to this message whose entity rows have not arrived yet.
584
702
  *
@@ -591,65 +709,261 @@ export class MessageItemComponent extends BaseAngularComponent {
591
709
  * is still loading an image, both render at once. Entries whose artifact has since loaded are
592
710
  * filtered out by {@link pendingArtifactPlaceholders}.
593
711
  */
594
- pendingArtifacts = [];
712
+ PendingArtifacts = [];
713
+ /** @deprecated Use {@link PendingArtifacts}. */
714
+ set pendingArtifacts(value) {
715
+ this.PendingArtifacts = value;
716
+ }
717
+ /** @deprecated Use {@link PendingArtifacts}. */
718
+ get pendingArtifacts() {
719
+ return this.PendingArtifacts;
720
+ }
595
721
  /**
596
722
  * Optional additive per-message slot template (forwarded from chat-area's
597
723
  * `mjChatSlot="messageExtra"`). Rendered inside the bubble after the message
598
724
  * content, before attachments. Receives the message as `$implicit` + a named
599
725
  * `message` context binding. Null when no consumer template is projected.
600
726
  */
601
- messageExtraTemplate = null;
727
+ MessageExtraTemplate = null;
728
+ /** @deprecated Use {@link MessageExtraTemplate}. */
729
+ set messageExtraTemplate(value) {
730
+ this.MessageExtraTemplate = value;
731
+ }
732
+ /** @deprecated Use {@link MessageExtraTemplate}. */
733
+ get messageExtraTemplate() {
734
+ return this.MessageExtraTemplate;
735
+ }
602
736
  // --- Host-level feature gates (forwarded from mj-conversation-chat-area) ---
603
737
  // All default true so existing consumers are unaffected; set false to remove
604
738
  // the affordance entirely (the control is not rendered, not merely disabled).
605
739
  /** Show the per-message agent run-detail grid (run ID, step/token counts, $ cost). */
606
- showAgentRunDetails = true;
740
+ ShowAgentRunDetails = true;
741
+ /** @deprecated Use {@link ShowAgentRunDetails}. */
742
+ set showAgentRunDetails(value) {
743
+ this.ShowAgentRunDetails = value;
744
+ }
745
+ /** @deprecated Use {@link ShowAgentRunDetails}. */
746
+ get showAgentRunDetails() {
747
+ return this.ShowAgentRunDetails;
748
+ }
607
749
  /** Show the per-message reaction buttons (like / comment). */
608
- showReactions = true;
750
+ ShowReactions = true;
751
+ /** @deprecated Use {@link ShowReactions}. */
752
+ set showReactions(value) {
753
+ this.ShowReactions = value;
754
+ }
755
+ /** @deprecated Use {@link ShowReactions}. */
756
+ get showReactions() {
757
+ return this.ShowReactions;
758
+ }
609
759
  /** Show the per-message thumbs rating control on completed AI messages. */
610
- showMessageRating = true;
760
+ ShowMessageRating = true;
761
+ /** @deprecated Use {@link ShowMessageRating}. */
762
+ set showMessageRating(value) {
763
+ this.ShowMessageRating = value;
764
+ }
765
+ /** @deprecated Use {@link ShowMessageRating}. */
766
+ get showMessageRating() {
767
+ return this.ShowMessageRating;
768
+ }
611
769
  /** Allow pinning messages (the per-message pin button). */
612
- allowPinning = true;
770
+ AllowPinning = true;
771
+ /** @deprecated Use {@link AllowPinning}. */
772
+ set allowPinning(value) {
773
+ this.AllowPinning = value;
774
+ }
775
+ /** @deprecated Use {@link AllowPinning}. */
776
+ get allowPinning() {
777
+ return this.AllowPinning;
778
+ }
613
779
  /** Allow editing the user's own messages (the per-message edit button). */
614
- allowMessageEdit = true;
780
+ AllowMessageEdit = true;
781
+ /** @deprecated Use {@link AllowMessageEdit}. */
782
+ set allowMessageEdit(value) {
783
+ this.AllowMessageEdit = value;
784
+ }
785
+ /** @deprecated Use {@link AllowMessageEdit}. */
786
+ get allowMessageEdit() {
787
+ return this.AllowMessageEdit;
788
+ }
615
789
  /** Allow deleting the user's own messages (the per-message delete button). */
616
- allowMessageDelete = true;
790
+ AllowMessageDelete = true;
791
+ /** @deprecated Use {@link AllowMessageDelete}. */
792
+ set allowMessageDelete(value) {
793
+ this.AllowMessageDelete = value;
794
+ }
795
+ /** @deprecated Use {@link AllowMessageDelete}. */
796
+ get allowMessageDelete() {
797
+ return this.AllowMessageDelete;
798
+ }
799
+ /** Hides the response form and actionable commands on this message. */
800
+ ReadOnly = false;
617
801
  /** Host override for the AI message display name (white-label persona). Null = the agent record's name. */
618
- assistantDisplayName = null;
802
+ AssistantDisplayName = null;
803
+ /** @deprecated Use {@link AssistantDisplayName}. */
804
+ set assistantDisplayName(value) {
805
+ this.AssistantDisplayName = value;
806
+ }
807
+ /** @deprecated Use {@link AssistantDisplayName}. */
808
+ get assistantDisplayName() {
809
+ return this.AssistantDisplayName;
810
+ }
619
811
  /** Host image URL for the AI message avatar. Null = the agent's Font Awesome icon. */
620
- set assistantAvatarUrl(value) {
812
+ set AssistantAvatarUrl(value) {
621
813
  if (value !== this._assistantAvatarUrl) {
622
814
  this._assistantAvatarUrl = value;
623
815
  // A new URL gets a fresh chance even if the previous one 404'd.
624
- this.assistantAvatarFailed = false;
816
+ this.AssistantAvatarFailed = false;
625
817
  }
626
818
  }
627
- get assistantAvatarUrl() {
819
+ get AssistantAvatarUrl() {
628
820
  return this._assistantAvatarUrl;
629
821
  }
822
+ /** @deprecated Use {@link AssistantAvatarUrl}. */
823
+ get assistantAvatarUrl() {
824
+ return this.AssistantAvatarUrl;
825
+ }
826
+ /** @deprecated Use {@link AssistantAvatarUrl}. */
827
+ set assistantAvatarUrl(value) {
828
+ this.AssistantAvatarUrl = value;
829
+ }
630
830
  _assistantAvatarUrl = null;
631
831
  /** The last assistantAvatarUrl failed to load — fall back to the icon branch. */
632
- assistantAvatarFailed = false;
832
+ AssistantAvatarFailed = false;
833
+ /** @deprecated Use {@link AssistantAvatarFailed}. */
834
+ get assistantAvatarFailed() {
835
+ return this.AssistantAvatarFailed;
836
+ }
837
+ /** @deprecated Use {@link AssistantAvatarFailed}. */
838
+ set assistantAvatarFailed(value) {
839
+ this.AssistantAvatarFailed = value;
840
+ }
633
841
  /** The avatar image URL actually rendered: trimmed, and null after a load error
634
842
  * so a broken/whitespace URL degrades to the agent icon instead of a broken-image glyph. */
635
- get effectiveAssistantAvatarUrl() {
636
- if (this.assistantAvatarFailed)
843
+ get EffectiveAssistantAvatarUrl() {
844
+ if (this.AssistantAvatarFailed)
637
845
  return null;
638
846
  const url = this._assistantAvatarUrl?.trim();
639
847
  return url ? url : null;
640
848
  }
641
- editClicked = new EventEmitter();
642
- deleteClicked = new EventEmitter();
643
- retryClicked = new EventEmitter();
644
- testFeedbackClicked = new EventEmitter();
645
- artifactClicked = new EventEmitter();
646
- artifactActionPerformed = new EventEmitter();
647
- messageEdited = new EventEmitter();
648
- openEntityRecord = new EventEmitter();
649
- suggestedResponseSelected = new EventEmitter();
650
- attachmentClicked = new EventEmitter();
651
- diagnosticRequested = new EventEmitter(); // emits messageId on Shift+Click
652
- messagePinToggled = new EventEmitter();
849
+ /** @deprecated Use {@link EffectiveAssistantAvatarUrl}. */
850
+ get effectiveAssistantAvatarUrl() {
851
+ return this.EffectiveAssistantAvatarUrl;
852
+ }
853
+ EditClicked = new EventEmitter();
854
+ /**
855
+ * @deprecated Use {@link EditClicked}.
856
+ *
857
+ * The same emitter under the old binding name, so a template still binding
858
+ * (editClicked) keeps working. Must stay AFTER EditClicked: class fields
859
+ * initialise in order, and the other way round this captures undefined.
860
+ */
861
+ editClicked = this.EditClicked;
862
+ DeleteClicked = new EventEmitter();
863
+ /**
864
+ * @deprecated Use {@link DeleteClicked}.
865
+ *
866
+ * The same emitter under the old binding name, so a template still binding
867
+ * (deleteClicked) keeps working. Must stay AFTER DeleteClicked: class fields
868
+ * initialise in order, and the other way round this captures undefined.
869
+ */
870
+ deleteClicked = this.DeleteClicked;
871
+ RetryClicked = new EventEmitter();
872
+ /**
873
+ * @deprecated Use {@link RetryClicked}.
874
+ *
875
+ * The same emitter under the old binding name, so a template still binding
876
+ * (retryClicked) keeps working. Must stay AFTER RetryClicked: class fields
877
+ * initialise in order, and the other way round this captures undefined.
878
+ */
879
+ retryClicked = this.RetryClicked;
880
+ TestFeedbackClicked = new EventEmitter();
881
+ /**
882
+ * @deprecated Use {@link TestFeedbackClicked}.
883
+ *
884
+ * The same emitter under the old binding name, so a template still binding
885
+ * (testFeedbackClicked) keeps working. Must stay AFTER TestFeedbackClicked: class fields
886
+ * initialise in order, and the other way round this captures undefined.
887
+ */
888
+ testFeedbackClicked = this.TestFeedbackClicked;
889
+ ArtifactClicked = new EventEmitter();
890
+ /**
891
+ * @deprecated Use {@link ArtifactClicked}.
892
+ *
893
+ * The same emitter under the old binding name, so a template still binding
894
+ * (artifactClicked) keeps working. Must stay AFTER ArtifactClicked: class fields
895
+ * initialise in order, and the other way round this captures undefined.
896
+ */
897
+ artifactClicked = this.ArtifactClicked;
898
+ ArtifactActionPerformed = new EventEmitter();
899
+ /**
900
+ * @deprecated Use {@link ArtifactActionPerformed}.
901
+ *
902
+ * The same emitter under the old binding name, so a template still binding
903
+ * (artifactActionPerformed) keeps working. Must stay AFTER ArtifactActionPerformed: class fields
904
+ * initialise in order, and the other way round this captures undefined.
905
+ */
906
+ artifactActionPerformed = this.ArtifactActionPerformed;
907
+ MessageEdited = new EventEmitter();
908
+ /**
909
+ * @deprecated Use {@link MessageEdited}.
910
+ *
911
+ * The same emitter under the old binding name, so a template still binding
912
+ * (messageEdited) keeps working. Must stay AFTER MessageEdited: class fields
913
+ * initialise in order, and the other way round this captures undefined.
914
+ */
915
+ messageEdited = this.MessageEdited;
916
+ OpenEntityRecord = new EventEmitter();
917
+ /**
918
+ * @deprecated Use {@link OpenEntityRecord}.
919
+ *
920
+ * The same emitter under the old binding name, so a template still binding
921
+ * (openEntityRecord) keeps working. Must stay AFTER OpenEntityRecord: class fields
922
+ * initialise in order, and the other way round this captures undefined.
923
+ */
924
+ openEntityRecord = this.OpenEntityRecord;
925
+ SuggestedResponseSelected = new EventEmitter();
926
+ /**
927
+ * @deprecated Use {@link SuggestedResponseSelected}.
928
+ *
929
+ * The same emitter under the old binding name, so a template still binding
930
+ * (suggestedResponseSelected) keeps working. Must stay AFTER SuggestedResponseSelected: class fields
931
+ * initialise in order, and the other way round this captures undefined.
932
+ */
933
+ suggestedResponseSelected = this.SuggestedResponseSelected;
934
+ AttachmentClicked = new EventEmitter();
935
+ /**
936
+ * @deprecated Use {@link AttachmentClicked}.
937
+ *
938
+ * The same emitter under the old binding name, so a template still binding
939
+ * (attachmentClicked) keeps working. Must stay AFTER AttachmentClicked: class fields
940
+ * initialise in order, and the other way round this captures undefined.
941
+ */
942
+ attachmentClicked = this.AttachmentClicked;
943
+ DiagnosticRequested = new EventEmitter();
944
+ /**
945
+ * @deprecated Use {@link DiagnosticRequested}.
946
+ *
947
+ * The same emitter under the old binding name, so a template still binding
948
+ * (diagnosticRequested) keeps working. Must stay AFTER DiagnosticRequested: class fields
949
+ * initialise in order, and the other way round this captures undefined.
950
+ */
951
+ diagnosticRequested = this.DiagnosticRequested; // emits messageId on Shift+Click
952
+ MessagePinToggled = new EventEmitter();
953
+ /**
954
+ * @deprecated Use {@link MessagePinToggled}.
955
+ *
956
+ * The same emitter under the old binding name, so a template still binding
957
+ * (messagePinToggled) keeps working. Must stay AFTER MessagePinToggled: class fields
958
+ * initialise in order, and the other way round this captures undefined.
959
+ */
960
+ messagePinToggled = this.MessagePinToggled;
961
+ /**
962
+ * Raised when this message's run has gone quiet long enough that the displayed state may be
963
+ * fiction (MJ #4222). The parent answers by re-reading durable state; if the run really is alive
964
+ * its heartbeat advances and the pill returns to 'live' on the next tick.
965
+ */
966
+ LivenessCheckRequested = new EventEmitter(); // emits messageId
653
967
  /**
654
968
  * Cancelable — fired BEFORE the response form's values are sent back as a new
655
969
  * conversation message. Listeners may set `event.Cancel = true` to halt the
@@ -658,19 +972,67 @@ export class MessageItemComponent extends BaseAngularComponent {
658
972
  * NOT fired and `suggestedResponseSelected` is NOT emitted.
659
973
  * Follows MJ's established Before/After cancelable event pattern.
660
974
  */
661
- beforeResponseFormSubmitted = new EventEmitter();
975
+ BeforeResponseFormSubmitted = new EventEmitter();
976
+ /**
977
+ * @deprecated Use {@link BeforeResponseFormSubmitted}.
978
+ *
979
+ * The same emitter under the old binding name, so a template still binding
980
+ * (beforeResponseFormSubmitted) keeps working. Must stay AFTER BeforeResponseFormSubmitted: class fields
981
+ * initialise in order, and the other way round this captures undefined.
982
+ */
983
+ beforeResponseFormSubmitted = this.BeforeResponseFormSubmitted;
662
984
  /**
663
985
  * Fired AFTER the response form's values have been submitted. Carries the form id
664
986
  * (using the message ID as a stable per-message identifier) and the submitted
665
987
  * values map. Not fired when {@link beforeResponseFormSubmitted} was canceled.
666
988
  */
667
- afterResponseFormSubmitted = new EventEmitter();
989
+ AfterResponseFormSubmitted = new EventEmitter();
990
+ /**
991
+ * @deprecated Use {@link AfterResponseFormSubmitted}.
992
+ *
993
+ * The same emitter under the old binding name, so a template still binding
994
+ * (afterResponseFormSubmitted) keeps working. Must stay AFTER AfterResponseFormSubmitted: class fields
995
+ * initialise in order, and the other way round this captures undefined.
996
+ */
997
+ afterResponseFormSubmitted = this.AfterResponseFormSubmitted;
668
998
  _loadTime = Date.now();
669
999
  _elapsedTimeInterval = null;
670
- _elapsedTimeFormatted = '0:00';
671
- _agentRunDurationFormatted = '0:00';
672
- isEditing = false;
673
- editedText = '';
1000
+ ElapsedTimeFormatted = '0:00';
1001
+ /** @deprecated Use {@link ElapsedTimeFormatted}. */
1002
+ get _elapsedTimeFormatted() {
1003
+ return this.ElapsedTimeFormatted;
1004
+ }
1005
+ /** @deprecated Use {@link ElapsedTimeFormatted}. */
1006
+ set _elapsedTimeFormatted(value) {
1007
+ this.ElapsedTimeFormatted = value;
1008
+ }
1009
+ AgentRunDurationFormatted = '0:00';
1010
+ /** @deprecated Use {@link AgentRunDurationFormatted}. */
1011
+ get _agentRunDurationFormatted() {
1012
+ return this.AgentRunDurationFormatted;
1013
+ }
1014
+ /** @deprecated Use {@link AgentRunDurationFormatted}. */
1015
+ set _agentRunDurationFormatted(value) {
1016
+ this.AgentRunDurationFormatted = value;
1017
+ }
1018
+ IsEditing = false;
1019
+ /** @deprecated Use {@link IsEditing}. */
1020
+ get isEditing() {
1021
+ return this.IsEditing;
1022
+ }
1023
+ /** @deprecated Use {@link IsEditing}. */
1024
+ set isEditing(value) {
1025
+ this.IsEditing = value;
1026
+ }
1027
+ EditedText = '';
1028
+ /** @deprecated Use {@link EditedText}. */
1029
+ get editedText() {
1030
+ return this.EditedText;
1031
+ }
1032
+ /** @deprecated Use {@link EditedText}. */
1033
+ set editedText(value) {
1034
+ this.EditedText = value;
1035
+ }
674
1036
  originalText = '';
675
1037
  // Track previous status for DoCheck comparison
676
1038
  _previousMessageStatus = undefined;
@@ -684,9 +1046,30 @@ export class MessageItemComponent extends BaseAngularComponent {
684
1046
  _messageClasses = 'message-item';
685
1047
  _stableDisplayMessage = '';
686
1048
  _stableIsInProgressAIMessage = false;
1049
+ _stableLivenessState = 'live';
1050
+ /** When this component started watching the current run. Bounds the server-clock comparison. */
1051
+ _livenessWatchStart = Date.now();
1052
+ /** Last time a re-check was requested, so a quiet run asks once per window, not once per second. */
1053
+ _lastLivenessRequestAt = 0;
687
1054
  // Agent run details
688
- isAgentDetailsExpanded = false;
689
- detailTasks = [];
1055
+ IsAgentDetailsExpanded = false;
1056
+ /** @deprecated Use {@link IsAgentDetailsExpanded}. */
1057
+ get isAgentDetailsExpanded() {
1058
+ return this.IsAgentDetailsExpanded;
1059
+ }
1060
+ /** @deprecated Use {@link IsAgentDetailsExpanded}. */
1061
+ set isAgentDetailsExpanded(value) {
1062
+ this.IsAgentDetailsExpanded = value;
1063
+ }
1064
+ DetailTasks = [];
1065
+ /** @deprecated Use {@link DetailTasks}. */
1066
+ get detailTasks() {
1067
+ return this.DetailTasks;
1068
+ }
1069
+ /** @deprecated Use {@link DetailTasks}. */
1070
+ set detailTasks(value) {
1071
+ this.DetailTasks = value;
1072
+ }
690
1073
  tasksLoaded = false;
691
1074
  // Memoization for mention parsing to prevent repeated parsing on change detection
692
1075
  _cachedDisplayMessage = '';
@@ -732,11 +1115,7 @@ export class MessageItemComponent extends BaseAngularComponent {
732
1115
  const currentStatus = this.message.Status;
733
1116
  // Check if status changed from non-Complete to Complete
734
1117
  if (this._previousMessageStatus !== 'Complete' && currentStatus === 'Complete') {
735
- // Stop the elapsed time interval
736
- if (this._elapsedTimeInterval !== null) {
737
- clearInterval(this._elapsedTimeInterval);
738
- this._elapsedTimeInterval = null;
739
- }
1118
+ this.stopElapsedTimeUpdater();
740
1119
  // Force immediate synchronous change detection for dynamically created components
741
1120
  // markForCheck() only schedules a check which may not run for dynamic components
742
1121
  // detectChanges() forces immediate view update so UI shows timer stopped right away
@@ -748,8 +1127,123 @@ export class MessageItemComponent extends BaseAngularComponent {
748
1127
  // ngDoCheck runs once per CD pass but NOT during the dev-mode verify pass, so
749
1128
  // snapshotting here produces values that don't change between the two reads.
750
1129
  this._messageClasses = this.buildMessageClasses();
751
- this._stableIsInProgressAIMessage = this.isAIMessage && currentStatus === 'In-Progress';
1130
+ this._stableIsInProgressAIMessage = this.IsAIMessage && currentStatus === 'In-Progress';
752
1131
  this._stableDisplayMessage = this.computeDisplayMessage();
1132
+ // Nothing in flight means nothing to watch — restart the clock so a run that begins later is
1133
+ // measured from when it began, not from when this component was created.
1134
+ const inFlight = this.isLivenessInFlight();
1135
+ this.refreshLivenessState();
1136
+ // Re-arm the elapsed timer here, not only in ngAfterViewInit. A message that becomes
1137
+ // in-progress AFTER the view initialised — the common case, since the row is rendered before
1138
+ // the agent starts — otherwise never got an interval, so its pill never ticked and its liveness
1139
+ // state was never recomputed on a schedule.
1140
+ if (inFlight && this._elapsedTimeInterval === null) {
1141
+ this.startElapsedTimeUpdater();
1142
+ }
1143
+ else if (!inFlight) {
1144
+ this.stopElapsedTimeUpdater();
1145
+ }
1146
+ }
1147
+ /** Whether something is still running for this message, read live rather than from a cache. */
1148
+ isLivenessInFlight() {
1149
+ return (this.IsAIMessage && this.message?.Status === 'In-Progress') || this.IsAgentRunActive;
1150
+ }
1151
+ /**
1152
+ * Recompute the liveness state, and ask the host to re-read durable state when it has degraded.
1153
+ *
1154
+ * Called from ngDoCheck AND from the one-second timer, and the timer path is the load-bearing
1155
+ * one. `ChangeDetectorRef.detectChanges()` re-renders this view but does NOT re-invoke this
1156
+ * component's own `ngDoCheck` — that runs only when an ancestor's change detection reaches this
1157
+ * node. During the outage this exists to report, nothing triggers an ancestor pass, so a state
1158
+ * computed only in `ngDoCheck` freezes at 'live' and the pill keeps counting as though healthy.
1159
+ */
1160
+ refreshLivenessState() {
1161
+ if (!this.isLivenessInFlight()) {
1162
+ // Nothing in flight means nothing to watch — restart the clock so a run that begins later is
1163
+ // measured from when it began, not from when this component was created.
1164
+ this._livenessWatchStart = Date.now();
1165
+ this._stableLivenessState = 'live';
1166
+ return;
1167
+ }
1168
+ this._stableLivenessState = this.computeLivenessState();
1169
+ if (this._stableLivenessState !== 'live') {
1170
+ this.requestLivenessCheck();
1171
+ }
1172
+ }
1173
+ /**
1174
+ * Classify how much the displayed progress can still be trusted.
1175
+ *
1176
+ * Only meaningful while something is in flight; a finished message is always reported `live`.
1177
+ */
1178
+ computeLivenessState() {
1179
+ if (!this.isLivenessInFlight()) {
1180
+ return 'live';
1181
+ }
1182
+ const silence = this.runSilenceMs();
1183
+ if (silence >= LIVENESS_STALLED_MS) {
1184
+ return 'stalled';
1185
+ }
1186
+ if (silence >= LIVENESS_CHECKING_MS) {
1187
+ return 'checking';
1188
+ }
1189
+ return 'live';
1190
+ }
1191
+ /**
1192
+ * How long the server has been silent about this run, in milliseconds.
1193
+ *
1194
+ * The primary signal is the browser time at which the last push frame for the run, or for this
1195
+ * message, arrived (progress, streamed content, or the server's 60s liveness pulse). Frames that
1196
+ * name the message cover a row with no MJ agent run, such as one written by a host's own turn
1197
+ * handler. The run's own
1198
+ * `LastHeartbeatAt` / `__mj_UpdatedAt` count too, but on the healthy path they are frozen at the
1199
+ * start time: progress frames carry the server's in-memory entity, which is not saved mid-run.
1200
+ * They matter when the run was re-read from the database.
1201
+ *
1202
+ * Server stamps are on the DATABASE clock and compared against the browser's, so the result is
1203
+ * bounded by how long this component has actually been watching: we can never claim more silence
1204
+ * than we have observed. A browser clock running fast cannot invent a stall.
1205
+ */
1206
+ runSilenceMs() {
1207
+ const now = Date.now();
1208
+ const watching = Math.max(0, now - this._livenessWatchStart);
1209
+ const stamps = [this.AgentRun?.LastHeartbeatAt, this.AgentRun?.__mj_UpdatedAt]
1210
+ .filter((d) => d != null)
1211
+ .map(d => new Date(d).getTime())
1212
+ .filter(t => !Number.isNaN(t));
1213
+ const streaming = ConversationsRuntime.Instance.Streaming;
1214
+ const heard = [
1215
+ this.AgentRun?.ID ? streaming.LastHeardFromRun(this.AgentRun.ID) : undefined,
1216
+ this.message?.ID ? streaming.LastHeardForMessage(this.message.ID) : undefined,
1217
+ ];
1218
+ for (const t of heard) {
1219
+ if (t != null) {
1220
+ stamps.push(t);
1221
+ }
1222
+ }
1223
+ if (stamps.length === 0) {
1224
+ // No run row yet, or one carrying no timestamps. Our own watch time is all we have.
1225
+ return watching;
1226
+ }
1227
+ const serverSilence = now - Math.max(...stamps);
1228
+ return Math.max(0, Math.min(serverSilence, watching));
1229
+ }
1230
+ /**
1231
+ * Ask the parent to re-read durable state for this message, at most once per window.
1232
+ *
1233
+ * This closes the loop with the reconciliation triggers: those fire on transport events, and this
1234
+ * one fires on the symptom itself — a run that has simply gone quiet, with no event to notice.
1235
+ */
1236
+ requestLivenessCheck() {
1237
+ const now = Date.now();
1238
+ if (now - this._lastLivenessRequestAt < LIVENESS_RECHECK_THROTTLE_MS) {
1239
+ return;
1240
+ }
1241
+ this._lastLivenessRequestAt = now;
1242
+ this.LivenessCheckRequested.emit(this.message.ID);
1243
+ }
1244
+ /** How much the displayed progress can still be trusted. See {@link MessageLivenessState}. */
1245
+ get LivenessState() {
1246
+ return this._stableLivenessState;
753
1247
  }
754
1248
  ngAfterViewInit() {
755
1249
  // Use message creation timestamp if available (for reconnecting to in-progress messages)
@@ -764,10 +1258,7 @@ export class MessageItemComponent extends BaseAngularComponent {
764
1258
  this.cdRef.detectChanges();
765
1259
  }
766
1260
  ngOnDestroy() {
767
- if (this._elapsedTimeInterval !== null) {
768
- clearInterval(this._elapsedTimeInterval);
769
- this._elapsedTimeInterval = null;
770
- }
1261
+ this.stopElapsedTimeUpdater();
771
1262
  }
772
1263
  /**
773
1264
  * Handles clicks on the message bubble.
@@ -775,7 +1266,7 @@ export class MessageItemComponent extends BaseAngularComponent {
775
1266
  * can dump live streaming state to the browser console — useful for debugging
776
1267
  * stuck or forever-spinning conversations without any code changes.
777
1268
  */
778
- onMessageBubbleClick(event) {
1269
+ OnMessageBubbleClick(event) {
779
1270
  const recordBadge = event.target?.closest?.('.mention-badge.record');
780
1271
  if (recordBadge) {
781
1272
  event.preventDefault();
@@ -783,11 +1274,15 @@ export class MessageItemComponent extends BaseAngularComponent {
783
1274
  this.openRecordLinkBadge(recordBadge);
784
1275
  return;
785
1276
  }
786
- if (!event.shiftKey || !this.isAIMessage)
1277
+ if (!event.shiftKey || !this.IsAIMessage)
787
1278
  return;
788
1279
  event.preventDefault();
789
1280
  event.stopPropagation();
790
- this.diagnosticRequested.emit(this.message.ID);
1281
+ this.DiagnosticRequested.emit(this.message.ID);
1282
+ }
1283
+ /** @deprecated Use {@link OnMessageBubbleClick}. */
1284
+ onMessageBubbleClick(event) {
1285
+ return this.OnMessageBubbleClick(event);
791
1286
  }
792
1287
  openRecordLinkBadge(el) {
793
1288
  const entityName = el.getAttribute('data-record-entity');
@@ -812,7 +1307,7 @@ export class MessageItemComponent extends BaseAngularComponent {
812
1307
  console.warn('Record link: incomplete primary key', entityName, keysJson);
813
1308
  return;
814
1309
  }
815
- this.openEntityRecord.emit({ entityName, compositeKey });
1310
+ this.OpenEntityRecord.emit({ entityName, compositeKey });
816
1311
  }
817
1312
  /**
818
1313
  * Starts the elapsed time updater interval for temporary messages only
@@ -822,7 +1317,7 @@ export class MessageItemComponent extends BaseAngularComponent {
822
1317
  startElapsedTimeUpdater() {
823
1318
  // Start timer for temporary messages (in-progress, no ID) OR active agent runs
824
1319
  // Both need periodic updates to _elapsedTimeFormatted / _agentRunDurationFormatted
825
- if (this.isInProgressAIMessage || this.isAgentRunActive) {
1320
+ if (this.IsInProgressAIMessage || this.IsAgentRunActive) {
826
1321
  // Initial update
827
1322
  this.updateTimers();
828
1323
  this.cdRef.markForCheck();
@@ -837,21 +1332,35 @@ export class MessageItemComponent extends BaseAngularComponent {
837
1332
  }
838
1333
  }
839
1334
  }
1335
+ /** Clears the elapsed time interval, if one is running. */
1336
+ stopElapsedTimeUpdater() {
1337
+ if (this._elapsedTimeInterval !== null) {
1338
+ clearInterval(this._elapsedTimeInterval);
1339
+ this._elapsedTimeInterval = null;
1340
+ }
1341
+ }
840
1342
  /**
841
1343
  * Update all timer displays
842
1344
  * Called every second by the interval timer
843
1345
  */
844
1346
  updateTimers() {
845
1347
  // Update temporary message elapsed time
846
- if (this.isInProgressAIMessage) {
847
- this._elapsedTimeFormatted = this.formatElapsedTime(this.elapsedTimeSinceLoad);
1348
+ if (this.IsInProgressAIMessage) {
1349
+ this.ElapsedTimeFormatted = this.formatElapsedTime(this.ElapsedTimeSinceLoad);
848
1350
  }
849
1351
  // Update agent run duration for active runs
850
- if (this.isAgentRunActive && this.agentRun?.__mj_CreatedAt) {
851
- const createdAt = new Date(this.agentRun.__mj_CreatedAt);
1352
+ if (this.IsAgentRunActive && this.AgentRun?.__mj_CreatedAt) {
1353
+ const createdAt = new Date(this.AgentRun.__mj_CreatedAt);
852
1354
  const now = new Date();
853
1355
  const diffMs = now.getTime() - createdAt.getTime();
854
- this._agentRunDurationFormatted = this.formatDurationFromMs(diffMs);
1356
+ this.AgentRunDurationFormatted = this.formatDurationFromMs(diffMs);
1357
+ }
1358
+ // Silence only grows with time, so it has to be re-evaluated on the clock rather than on
1359
+ // change detection. This is the only path that runs while the transport is dead.
1360
+ this.refreshLivenessState();
1361
+ // The tick stops itself: change detection does not reliably reach this row once it finishes.
1362
+ if (!this.isLivenessInFlight()) {
1363
+ this.stopElapsedTimeUpdater();
855
1364
  }
856
1365
  }
857
1366
  formatElapsedTime(elapsedTime) {
@@ -879,12 +1388,20 @@ export class MessageItemComponent extends BaseAngularComponent {
879
1388
  (seconds < 10 ? '0' : '') + seconds;
880
1389
  return formattedTime;
881
1390
  }
882
- get elapsedTimeSinceLoad() {
1391
+ get ElapsedTimeSinceLoad() {
883
1392
  return Date.now() - this._loadTime;
884
1393
  }
885
- get isAIMessage() {
1394
+ /** @deprecated Use {@link ElapsedTimeSinceLoad}. */
1395
+ get elapsedTimeSinceLoad() {
1396
+ return this.ElapsedTimeSinceLoad;
1397
+ }
1398
+ get IsAIMessage() {
886
1399
  return this.message.Role?.trim().toLowerCase() === 'ai';
887
1400
  }
1401
+ /** @deprecated Use {@link IsAIMessage}. */
1402
+ get isAIMessage() {
1403
+ return this.IsAIMessage;
1404
+ }
888
1405
  /**
889
1406
  * The agent identity as shown in the UI: the ENGINE-resolved identity (see
890
1407
  * {@link engineAgentInfo}) with the host's `assistantDisplayName` override
@@ -892,18 +1409,22 @@ export class MessageItemComponent extends BaseAngularComponent {
892
1409
  * real agent name (e.g. {@link isConversationManager}) uses `engineAgentInfo`
893
1410
  * directly, so a display override can never change routing/behavior decisions.
894
1411
  */
895
- get aiAgentInfo() {
1412
+ get AiAgentInfo() {
896
1413
  const info = this.engineAgentInfo;
897
1414
  if (!info)
898
1415
  return null;
899
- const override = this.assistantDisplayName?.trim();
1416
+ const override = this.AssistantDisplayName?.trim();
900
1417
  return override ? { ...info, name: override } : info;
901
1418
  }
1419
+ /** @deprecated Use {@link AiAgentInfo}. */
1420
+ get aiAgentInfo() {
1421
+ return this.AiAgentInfo;
1422
+ }
902
1423
  /** The engine-resolved agent identity — no host display overrides applied.
903
1424
  * Protected (not private) so the template's run-details header — which labels
904
1425
  * the REAL agent's diagnostics and record link — can read it directly. */
905
1426
  get engineAgentInfo() {
906
- if (!this.isAIMessage)
1427
+ if (!this.IsAIMessage)
907
1428
  return null;
908
1429
  // Get agent ID from denormalized field (populated when message is created)
909
1430
  const agentID = this.message.AgentID;
@@ -932,46 +1453,62 @@ export class MessageItemComponent extends BaseAngularComponent {
932
1453
  role: 'AI Assistant'
933
1454
  };
934
1455
  }
935
- get isUserMessage() {
1456
+ get IsUserMessage() {
936
1457
  return this.message.Role?.trim().toLowerCase() === 'user';
937
1458
  }
1459
+ /** @deprecated Use {@link IsUserMessage}. */
1460
+ get isUserMessage() {
1461
+ return this.IsUserMessage;
1462
+ }
938
1463
  /**
939
1464
  * Get the actual sender name for user messages
940
1465
  * Uses the denormalized User field from the view if available,
941
1466
  * otherwise falls back to current user name
942
1467
  */
943
- get messageSenderName() {
1468
+ get MessageSenderName() {
944
1469
  // Use the denormalized User field from the ConversationDetail view
945
1470
  // This is populated from the UserID (if present) or falls back to Conversation.UserID
946
1471
  if (this.message.User) {
947
1472
  return this.message.User;
948
1473
  }
949
1474
  // Fallback to current user name (for backwards compatibility)
950
- return this.currentUser.Name;
1475
+ return this.CurrentUser.Name;
1476
+ }
1477
+ /** @deprecated Use {@link MessageSenderName}. */
1478
+ get messageSenderName() {
1479
+ return this.MessageSenderName;
951
1480
  }
952
1481
  /**
953
1482
  * Get the user's avatar image URL from the userAvatarMap
954
1483
  * Uses fast O(1) lookup by UserID
955
1484
  */
956
- get userAvatarUrl() {
957
- if (!this.isUserMessage || !this.message.UserID) {
1485
+ get UserAvatarUrl() {
1486
+ if (!this.IsUserMessage || !this.message.UserID) {
958
1487
  return null;
959
1488
  }
960
- const avatarData = this.userAvatarMap.get(this.message.UserID);
1489
+ const avatarData = this.UserAvatarMap.get(this.message.UserID);
961
1490
  return avatarData?.imageUrl || null;
962
1491
  }
1492
+ /** @deprecated Use {@link UserAvatarUrl}. */
1493
+ get userAvatarUrl() {
1494
+ return this.UserAvatarUrl;
1495
+ }
963
1496
  /**
964
1497
  * Get the user's avatar icon class from the userAvatarMap
965
1498
  * Uses fast O(1) lookup by UserID
966
1499
  */
967
- get userAvatarIconClass() {
968
- if (!this.isUserMessage || !this.message.UserID) {
1500
+ get UserAvatarIconClass() {
1501
+ if (!this.IsUserMessage || !this.message.UserID) {
969
1502
  return null;
970
1503
  }
971
- const avatarData = this.userAvatarMap.get(this.message.UserID);
1504
+ const avatarData = this.UserAvatarMap.get(this.message.UserID);
972
1505
  return avatarData?.iconClass || null;
973
1506
  }
974
- get isConversationManager() {
1507
+ /** @deprecated Use {@link UserAvatarIconClass}. */
1508
+ get userAvatarIconClass() {
1509
+ return this.UserAvatarIconClass;
1510
+ }
1511
+ get IsConversationManager() {
975
1512
  // Resolved at runtime via the conversation manager agent registered through
976
1513
  // ConversationsRuntime's DefaultAgentResolver chain — explicit input wins,
977
1514
  // then app-scoped Application Setting, then global Application Setting, then
@@ -985,9 +1522,17 @@ export class MessageItemComponent extends BaseAngularComponent {
985
1522
  return false;
986
1523
  return this.engineAgentInfo?.name === cmName;
987
1524
  }
988
- get displayMessage() {
1525
+ /** @deprecated Use {@link IsConversationManager}. */
1526
+ get isConversationManager() {
1527
+ return this.IsConversationManager;
1528
+ }
1529
+ get DisplayMessage() {
989
1530
  return this._stableDisplayMessage;
990
1531
  }
1532
+ /** @deprecated Use {@link DisplayMessage}. */
1533
+ get displayMessage() {
1534
+ return this.DisplayMessage;
1535
+ }
991
1536
  /**
992
1537
  * Computes the display message from the current message text. Called from
993
1538
  * ngDoCheck to snapshot the value; templates read _stableDisplayMessage.
@@ -995,7 +1540,7 @@ export class MessageItemComponent extends BaseAngularComponent {
995
1540
  computeDisplayMessage() {
996
1541
  let text = this.message.Message || '';
997
1542
  // For Sage, only show the delegation line (starts with emoji)
998
- if (this.isConversationManager && text) {
1543
+ if (this.IsConversationManager && text) {
999
1544
  const delegationMatch = text.match(/🤖.*Delegating to.*Agent.*/);
1000
1545
  if (delegationMatch) {
1001
1546
  text = delegationMatch[0];
@@ -1211,21 +1756,33 @@ export class MessageItemComponent extends BaseAngularComponent {
1211
1756
  escapeHtml(text) {
1212
1757
  return FormResponseUtils.EscapeHtml(text);
1213
1758
  }
1214
- get isInProgressAIMessage() {
1759
+ get IsInProgressAIMessage() {
1215
1760
  return this._stableIsInProgressAIMessage;
1216
1761
  }
1217
- get isAgentRunActive() {
1218
- if (!this.agentRun) {
1762
+ /** @deprecated Use {@link IsInProgressAIMessage}. */
1763
+ get isInProgressAIMessage() {
1764
+ return this.IsInProgressAIMessage;
1765
+ }
1766
+ get IsAgentRunActive() {
1767
+ if (!this.AgentRun) {
1219
1768
  return false;
1220
1769
  }
1221
- const status = this.agentRun.Status?.toLowerCase();
1770
+ const status = this.AgentRun.Status?.toLowerCase();
1222
1771
  return status === 'in-progress' || status === 'running';
1223
1772
  }
1224
- get messageStatus() {
1773
+ /** @deprecated Use {@link IsAgentRunActive}. */
1774
+ get isAgentRunActive() {
1775
+ return this.IsAgentRunActive;
1776
+ }
1777
+ get MessageStatus() {
1225
1778
  return this.message.Status || 'Complete';
1226
1779
  }
1227
- getStatusText() {
1228
- switch (this.messageStatus) {
1780
+ /** @deprecated Use {@link MessageStatus}. */
1781
+ get messageStatus() {
1782
+ return this.MessageStatus;
1783
+ }
1784
+ GetStatusText() {
1785
+ switch (this.MessageStatus) {
1229
1786
  case 'In-Progress':
1230
1787
  return 'Processing...';
1231
1788
  case 'Error':
@@ -1234,34 +1791,46 @@ export class MessageItemComponent extends BaseAngularComponent {
1234
1791
  return '';
1235
1792
  }
1236
1793
  }
1794
+ /** @deprecated Use {@link GetStatusText}. */
1795
+ getStatusText() {
1796
+ return this.GetStatusText();
1797
+ }
1798
+ get IsFirstMessageInConversation() {
1799
+ return this.AllMessages.indexOf(this.message) === 0;
1800
+ }
1801
+ /** @deprecated Use {@link IsFirstMessageInConversation}. */
1237
1802
  get isFirstMessageInConversation() {
1238
- return this.allMessages.indexOf(this.message) === 0;
1803
+ return this.IsFirstMessageInConversation;
1239
1804
  }
1805
+ get IsLastMessageInConversation() {
1806
+ return this.AllMessages.indexOf(this.message) === this.AllMessages.length - 1;
1807
+ }
1808
+ /** @deprecated Use {@link IsLastMessageInConversation}. */
1240
1809
  get isLastMessageInConversation() {
1241
- return this.allMessages.indexOf(this.message) === this.allMessages.length - 1;
1810
+ return this.IsLastMessageInConversation;
1242
1811
  }
1243
1812
  /**
1244
1813
  * Determine if rating component should be shown inline (Option C - Hybrid).
1245
1814
  * Show for latest completed AI message that user hasn't rated yet.
1246
1815
  * For older/already-rated messages, ratings accessible via gear menu.
1247
1816
  */
1248
- shouldShowRating() {
1817
+ ShouldShowRating() {
1249
1818
  // Must be an AI message
1250
- if (!this.isAIMessage)
1819
+ if (!this.IsAIMessage)
1251
1820
  return false;
1252
1821
  // Must be completed (not in progress or failed)
1253
- if (this.messageStatus !== 'Complete')
1822
+ if (this.MessageStatus !== 'Complete')
1254
1823
  return false;
1255
1824
  // Must not be editing
1256
- if (this.isEditing)
1825
+ if (this.IsEditing)
1257
1826
  return false;
1258
1827
  // Must be the last message in conversation
1259
- if (!this.isLastMessageInConversation)
1828
+ if (!this.IsLastMessageInConversation)
1260
1829
  return false;
1261
1830
  // Check if current user has already rated this message
1262
- if (this.ratings && this.ratings.length > 0) {
1263
- const currentUserId = this.currentUser?.ID;
1264
- const userHasRated = this.ratings.some(r => UUIDsEqual(r.UserID, currentUserId));
1831
+ if (this.Ratings && this.Ratings.length > 0) {
1832
+ const currentUserId = this.CurrentUser?.ID;
1833
+ const userHasRated = this.Ratings.some(r => UUIDsEqual(r.UserID, currentUserId));
1265
1834
  // If user already rated, don't show inline (accessible via gear menu)
1266
1835
  if (userHasRated)
1267
1836
  return false;
@@ -1269,88 +1838,136 @@ export class MessageItemComponent extends BaseAngularComponent {
1269
1838
  // Show inline rating for latest completed AI message not yet rated by user
1270
1839
  return true;
1271
1840
  }
1841
+ /** @deprecated Use {@link ShouldShowRating}. */
1842
+ shouldShowRating() {
1843
+ return this.ShouldShowRating();
1844
+ }
1272
1845
  /**
1273
1846
  * Check if message has any ratings (for gear icon badge)
1274
1847
  */
1848
+ HasRatings() {
1849
+ return !!(this.Ratings && this.Ratings.length > 0);
1850
+ }
1851
+ /** @deprecated Use {@link HasRatings}. */
1275
1852
  hasRatings() {
1276
- return !!(this.ratings && this.ratings.length > 0);
1853
+ return this.HasRatings();
1277
1854
  }
1278
1855
  /**
1279
1856
  * Get rating count for badge display on gear icon
1280
1857
  */
1858
+ GetRatingCount() {
1859
+ return this.Ratings?.length || 0;
1860
+ }
1861
+ /** @deprecated Use {@link GetRatingCount}. */
1281
1862
  getRatingCount() {
1282
- return this.ratings?.length || 0;
1863
+ return this.GetRatingCount();
1283
1864
  }
1284
1865
  /**
1285
1866
  * Get thumbs up count (ratings >= 8)
1286
1867
  */
1868
+ GetThumbsUpCount() {
1869
+ return this.Ratings?.filter(r => r.Rating ? r.Rating >= 8 : false).length || 0;
1870
+ }
1871
+ /** @deprecated Use {@link GetThumbsUpCount}. */
1287
1872
  getThumbsUpCount() {
1288
- return this.ratings?.filter(r => r.Rating ? r.Rating >= 8 : false).length || 0;
1873
+ return this.GetThumbsUpCount();
1289
1874
  }
1290
1875
  /**
1291
1876
  * Get thumbs down count (ratings <= 3)
1292
1877
  */
1878
+ GetThumbsDownCount() {
1879
+ return this.Ratings?.filter(r => r.Rating ? r.Rating <= 3 : false).length || 0;
1880
+ }
1881
+ /** @deprecated Use {@link GetThumbsDownCount}. */
1293
1882
  getThumbsDownCount() {
1294
- return this.ratings?.filter(r => r.Rating ? r.Rating <= 3 : false).length || 0;
1883
+ return this.GetThumbsDownCount();
1295
1884
  }
1296
1885
  /**
1297
1886
  * Determine if pin/delete actions should show inline (with rating buttons).
1298
1887
  * Show for latest completed AI message that user hasn't rated yet.
1299
1888
  */
1300
- shouldShowInlineActions() {
1889
+ ShouldShowInlineActions() {
1301
1890
  // Same logic as shouldShowRating - latest unrated message
1302
- return this.shouldShowRating();
1891
+ return this.ShouldShowRating();
1892
+ }
1893
+ /** @deprecated Use {@link ShouldShowInlineActions}. */
1894
+ shouldShowInlineActions() {
1895
+ return this.ShouldShowInlineActions();
1303
1896
  }
1304
1897
  /**
1305
1898
  * The artifacts to render under this message, one card each. Prefers the
1306
1899
  * `artifacts` array; falls back to the legacy single `artifact`/`artifactVersion`
1307
1900
  * inputs so older callers that set only those keep working.
1308
1901
  */
1309
- get displayArtifacts() {
1310
- if (this.artifacts && this.artifacts.length > 0) {
1311
- return this.artifacts;
1902
+ get DisplayArtifacts() {
1903
+ if (this.Artifacts && this.Artifacts.length > 0) {
1904
+ return this.Artifacts;
1312
1905
  }
1313
- if (this.artifact && this.artifactVersion) {
1314
- return [{ artifact: this.artifact, version: this.artifactVersion }];
1906
+ if (this.Artifact && this.artifactVersion) {
1907
+ return [{ artifact: this.Artifact, version: this.artifactVersion }];
1315
1908
  }
1316
1909
  return [];
1317
1910
  }
1911
+ /** @deprecated Use {@link DisplayArtifacts}. */
1912
+ get displayArtifacts() {
1913
+ return this.DisplayArtifacts;
1914
+ }
1915
+ get HasArtifact() {
1916
+ return this.DisplayArtifacts.length > 0;
1917
+ }
1918
+ /** @deprecated Use {@link HasArtifact}. */
1318
1919
  get hasArtifact() {
1319
- return this.displayArtifacts.length > 0;
1920
+ return this.HasArtifact;
1320
1921
  }
1321
1922
  /**
1322
1923
  * Label for a pending artifact. Says what is happening as well as to what — a bare artifact name
1323
1924
  * beside a spinner reads as a title, not as progress, which is the confusion this whole change
1324
1925
  * exists to remove. Matches the media previews' "Loading image..." phrasing.
1325
1926
  */
1326
- pendingLabel(pending) {
1927
+ PendingLabel(pending) {
1327
1928
  return pending.artifactName ? `Loading ${pending.artifactName}...` : 'Loading attachment...';
1328
1929
  }
1930
+ /** @deprecated Use {@link PendingLabel}. */
1931
+ pendingLabel(pending) {
1932
+ return this.PendingLabel(pending);
1933
+ }
1329
1934
  /**
1330
1935
  * The pending artifacts that still have no card of their own, filtered per artifact rather than
1331
1936
  * suppressed wholesale: a message can hold a loaded report and an in-flight image at once, and
1332
1937
  * gating on `displayArtifacts.length` would leave that image's window silent.
1333
1938
  */
1334
- get pendingArtifactPlaceholders() {
1939
+ get PendingArtifactPlaceholders() {
1335
1940
  // Shared constant in the steady state, which the parent now keeps us in most of the time by
1336
1941
  // only publishing artifacts that are genuinely still loading. The component is CheckAlways and
1337
1942
  // runs a per-second refresh while an agent run is active, so allocating here would cost for
1338
1943
  // the life of every message.
1339
- if (this.pendingArtifacts.length === 0) {
1944
+ if (this.PendingArtifacts.length === 0) {
1340
1945
  return NO_PENDING_ARTIFACTS;
1341
1946
  }
1342
- // UUIDsEqual, not string equality: these two IDs come from different sources — one from the
1947
+ // Case-insensitive, not string equality: these two IDs come from different sources — one from the
1343
1948
  // conversation query, one off a loaded entity — and SQL Server returns upper-case UUIDs where
1344
1949
  // PostgreSQL returns lower-case. A case-sensitive match left a placeholder sitting above the
1345
1950
  // very card it was waiting for. See guides/UUID_COMPARISON_GUIDE.md.
1346
- const loaded = this.displayArtifacts;
1347
- return this.pendingArtifacts.filter(p => !loaded.some(a => UUIDsEqual(a.artifact.ID, p.artifactId)));
1951
+ // Normalize into a Set rather than a nested `.some(UUIDsEqual(...))`: UUIDsEqual's `===` fast
1952
+ // path misses whenever the two IDs differ, so each miss allocated two lowercased strings, and
1953
+ // the nested scan paid that n*m times. This getter is re-read on every change-detection pass of
1954
+ // a CheckAlways component, once per message.
1955
+ const loadedIds = new Set(this.DisplayArtifacts.map(a => NormalizeUUID(a.artifact.ID)));
1956
+ return this.PendingArtifacts.filter(p => !loadedIds.has(NormalizeUUID(p.artifactId)));
1957
+ }
1958
+ /** @deprecated Use {@link PendingArtifactPlaceholders}. */
1959
+ get pendingArtifactPlaceholders() {
1960
+ return this.PendingArtifactPlaceholders;
1348
1961
  }
1349
1962
  /**
1350
1963
  * Check if the artifact is a system-only artifact
1351
1964
  */
1965
+ get IsSystemArtifact() {
1966
+ return this.Artifact?.Visibility === 'System Only';
1967
+ }
1968
+ /** @deprecated Use {@link IsSystemArtifact}. */
1352
1969
  get isSystemArtifact() {
1353
- return this.artifact?.Visibility === 'System Only';
1970
+ return this.IsSystemArtifact;
1354
1971
  }
1355
1972
  /**
1356
1973
  * Unified time pill text for all AI message states
@@ -1360,30 +1977,34 @@ export class MessageItemComponent extends BaseAngularComponent {
1360
1977
  * - Completed messages: Final generation time
1361
1978
  * - Failed messages: Time before failure
1362
1979
  */
1363
- get timePillText() {
1980
+ get TimePillText() {
1364
1981
  return this.calculateTimePillText();
1365
1982
  }
1983
+ /** @deprecated Use {@link TimePillText}. */
1984
+ get timePillText() {
1985
+ return this.TimePillText;
1986
+ }
1366
1987
  calculateTimePillText() {
1367
- if (this.isUserMessage) {
1988
+ if (this.IsUserMessage) {
1368
1989
  return null;
1369
1990
  }
1370
1991
  // For temporary messages (in-progress), show live elapsed time
1371
- if (this.isInProgressAIMessage) {
1372
- return this._elapsedTimeFormatted;
1992
+ if (this.IsInProgressAIMessage) {
1993
+ return this.ElapsedTimeFormatted;
1373
1994
  }
1374
1995
  // For active agent runs, calculate live duration from agentRun timestamps
1375
1996
  // This getter recalculates every time using new Date(), so it updates smoothly
1376
- if (this.isAgentRunActive && this.agentRun?.__mj_CreatedAt) {
1377
- return this.agentRunDuration;
1997
+ if (this.IsAgentRunActive && this.AgentRun?.__mj_CreatedAt) {
1998
+ return this.AgentRunDuration;
1378
1999
  }
1379
2000
  // For completed/failed messages with an agent run, use agentRun timestamps.
1380
2001
  // These are set when the run finishes and never change, so pin/edit saves on the
1381
2002
  // message entity cannot corrupt the displayed duration.
1382
- if (this.agentRun?.__mj_CreatedAt && this.agentRun?.__mj_UpdatedAt) {
1383
- return this.agentRunDuration;
2003
+ if (this.AgentRun?.__mj_CreatedAt && this.AgentRun?.__mj_UpdatedAt) {
2004
+ return this.AgentRunDuration;
1384
2005
  }
1385
2006
  // No agent run — fall back to message entity timestamps.
1386
- const fromMessage = this.formattedGenerationTime;
2007
+ const fromMessage = this.FormattedGenerationTime;
1387
2008
  if (fromMessage) {
1388
2009
  return fromMessage;
1389
2010
  }
@@ -1394,11 +2015,11 @@ export class MessageItemComponent extends BaseAngularComponent {
1394
2015
  // complete (no in-progress phase observed), `_elapsedTimeFormatted` is still
1395
2016
  // its initial '0:00' — return null in that case so the time pill doesn't render
1396
2017
  // a misleading zero.
1397
- return this._elapsedTimeFormatted !== '0:00' ? this._elapsedTimeFormatted : null;
2018
+ return this.ElapsedTimeFormatted !== '0:00' ? this.ElapsedTimeFormatted : null;
1398
2019
  }
1399
- get formattedGenerationTime() {
2020
+ get FormattedGenerationTime() {
1400
2021
  // Only show generation time for AI messages
1401
- if (this.isUserMessage || !this.message.__mj_CreatedAt || !this.message.__mj_UpdatedAt) {
2022
+ if (this.IsUserMessage || !this.message.__mj_CreatedAt || !this.message.__mj_UpdatedAt) {
1402
2023
  return null;
1403
2024
  }
1404
2025
  // Calculate generation time from created -> updated timestamps
@@ -1422,50 +2043,66 @@ export class MessageItemComponent extends BaseAngularComponent {
1422
2043
  return `${mins}m ${secs}s`;
1423
2044
  }
1424
2045
  }
2046
+ /** @deprecated Use {@link FormattedGenerationTime}. */
2047
+ get formattedGenerationTime() {
2048
+ return this.FormattedGenerationTime;
2049
+ }
1425
2050
  /**
1426
2051
  * Returns the cached CSS class string. Updated in ngDoCheck so the value
1427
2052
  * is stable within a single change detection cycle, preventing
1428
2053
  * ExpressionChangedAfterItHasBeenCheckedError.
1429
2054
  */
1430
- get messageClasses() {
2055
+ get MessageClasses() {
1431
2056
  return this._messageClasses;
1432
2057
  }
2058
+ /** @deprecated Use {@link MessageClasses}. */
2059
+ get messageClasses() {
2060
+ return this.MessageClasses;
2061
+ }
1433
2062
  buildMessageClasses() {
1434
2063
  const classes = ['message-item'];
1435
- if (this.isAIMessage) {
2064
+ if (this.IsAIMessage) {
1436
2065
  classes.push('ai-message');
1437
- if (this.isInProgressAIMessage) {
2066
+ if (this.IsInProgressAIMessage) {
1438
2067
  classes.push('in-progress');
1439
2068
  }
1440
2069
  }
1441
- else if (this.isUserMessage) {
2070
+ else if (this.IsUserMessage) {
1442
2071
  classes.push('user-message');
1443
2072
  }
1444
2073
  if (this.message?.IsPinned) {
1445
2074
  classes.push('pinned');
1446
2075
  }
1447
- if (this.isEditing) {
2076
+ if (this.IsEditing) {
1448
2077
  classes.push('editing');
1449
2078
  }
1450
2079
  return classes.join(' ');
1451
2080
  }
1452
- get isMessageEdited() {
2081
+ get IsMessageEdited() {
1453
2082
  // Only show edited badge if user actually edited the message content
1454
2083
  // The OriginalMessageChanged flag is set server-side when the Message field changes on update
1455
- if (!this.isUserMessage) {
2084
+ if (!this.IsUserMessage) {
1456
2085
  return false;
1457
2086
  }
1458
2087
  return this.message.OriginalMessageChanged === true;
1459
2088
  }
1460
- onEditClick() {
1461
- if (!this.isProcessing && !this.isEditing) {
1462
- this.startEditing();
2089
+ /** @deprecated Use {@link IsMessageEdited}. */
2090
+ get isMessageEdited() {
2091
+ return this.IsMessageEdited;
2092
+ }
2093
+ OnEditClick() {
2094
+ if (!this.IsProcessing && !this.IsEditing) {
2095
+ this.StartEditing();
1463
2096
  }
1464
2097
  }
1465
- startEditing() {
2098
+ /** @deprecated Use {@link OnEditClick}. */
2099
+ onEditClick() {
2100
+ return this.OnEditClick();
2101
+ }
2102
+ StartEditing() {
1466
2103
  this.originalText = this.message.Message || '';
1467
- this.editedText = this.originalText;
1468
- this.isEditing = true;
2104
+ this.EditedText = this.originalText;
2105
+ this.IsEditing = true;
1469
2106
  // Focus textarea after Angular renders it
1470
2107
  Promise.resolve().then(() => {
1471
2108
  const textarea = document.querySelector('.message-edit-textarea');
@@ -1476,29 +2113,37 @@ export class MessageItemComponent extends BaseAngularComponent {
1476
2113
  this.cdRef.detectChanges();
1477
2114
  });
1478
2115
  }
1479
- cancelEditing() {
1480
- this.isEditing = false;
1481
- this.editedText = '';
2116
+ /** @deprecated Use {@link StartEditing}. */
2117
+ startEditing() {
2118
+ return this.StartEditing();
2119
+ }
2120
+ CancelEditing() {
2121
+ this.IsEditing = false;
2122
+ this.EditedText = '';
1482
2123
  this.originalText = '';
1483
2124
  this.cdRef.detectChanges();
1484
2125
  }
1485
- async saveEdit() {
1486
- if (!this.editedText.trim() || this.editedText === this.originalText) {
1487
- this.cancelEditing();
2126
+ /** @deprecated Use {@link CancelEditing}. */
2127
+ cancelEditing() {
2128
+ return this.CancelEditing();
2129
+ }
2130
+ async SaveEdit() {
2131
+ if (!this.EditedText.trim() || this.EditedText === this.originalText) {
2132
+ this.CancelEditing();
1488
2133
  return;
1489
2134
  }
1490
2135
  try {
1491
2136
  // Update the message entity
1492
- this.message.Message = this.editedText;
2137
+ this.message.Message = this.EditedText;
1493
2138
  const saveResult = await this.message.Save();
1494
2139
  if (saveResult) {
1495
- this.isEditing = false;
1496
- this.editedText = '';
2140
+ this.IsEditing = false;
2141
+ this.EditedText = '';
1497
2142
  this.originalText = '';
1498
2143
  // Invalidate display message cache since message changed
1499
2144
  this._cachedMessageText = '';
1500
2145
  this._cachedDisplayMessage = '';
1501
- this.messageEdited.emit(this.message);
2146
+ this.MessageEdited.emit(this.message);
1502
2147
  this.cdRef.detectChanges();
1503
2148
  }
1504
2149
  else {
@@ -1511,21 +2156,33 @@ export class MessageItemComponent extends BaseAngularComponent {
1511
2156
  alert('Error saving message. Please try again.');
1512
2157
  }
1513
2158
  }
1514
- onEditKeydown(event) {
2159
+ /** @deprecated Use {@link SaveEdit}. */
2160
+ async saveEdit() {
2161
+ return this.SaveEdit();
2162
+ }
2163
+ OnEditKeydown(event) {
1515
2164
  if (event.key === 'Escape') {
1516
2165
  event.preventDefault();
1517
- this.cancelEditing();
2166
+ this.CancelEditing();
1518
2167
  }
1519
2168
  else if (event.key === 'Enter' && !event.shiftKey) {
1520
2169
  event.preventDefault();
1521
- this.saveEdit();
2170
+ this.SaveEdit();
1522
2171
  }
1523
2172
  }
1524
- onDeleteClick() {
1525
- if (!this.isProcessing) {
1526
- this.deleteClicked.emit(this.message);
2173
+ /** @deprecated Use {@link OnEditKeydown}. */
2174
+ onEditKeydown(event) {
2175
+ return this.OnEditKeydown(event);
2176
+ }
2177
+ OnDeleteClick() {
2178
+ if (!this.IsProcessing) {
2179
+ this.DeleteClicked.emit(this.message);
1527
2180
  }
1528
2181
  }
2182
+ /** @deprecated Use {@link OnDeleteClick}. */
2183
+ onDeleteClick() {
2184
+ return this.OnDeleteClick();
2185
+ }
1529
2186
  async PinMessage() {
1530
2187
  // Optimistic update — toggle immediately so the UI responds at once
1531
2188
  const previousValue = this.message.IsPinned;
@@ -1542,99 +2199,155 @@ export class MessageItemComponent extends BaseAngularComponent {
1542
2199
  // Notify parent so it can patch the conversation cache in-place.
1543
2200
  // Without this, navigating away and back rebuilds entities from stale cache data,
1544
2201
  // causing the pin state to appear lost until the next full page reload.
1545
- this.messagePinToggled.emit(this.message);
2202
+ this.MessagePinToggled.emit(this.message);
2203
+ }
2204
+ }
2205
+ OnTestFeedbackClick() {
2206
+ if (!this.IsProcessing) {
2207
+ this.TestFeedbackClicked.emit(this.message);
1546
2208
  }
1547
2209
  }
2210
+ /** @deprecated Use {@link OnTestFeedbackClick}. */
1548
2211
  onTestFeedbackClick() {
1549
- if (!this.isProcessing) {
1550
- this.testFeedbackClicked.emit(this.message);
2212
+ return this.OnTestFeedbackClick();
2213
+ }
2214
+ OnRetryClick() {
2215
+ if (!this.IsProcessing && this.MessageStatus === 'Error') {
2216
+ this.RetryClicked.emit(this.message);
1551
2217
  }
1552
2218
  }
2219
+ /** @deprecated Use {@link OnRetryClick}. */
1553
2220
  onRetryClick() {
1554
- if (!this.isProcessing && this.messageStatus === 'Error') {
1555
- this.retryClicked.emit(this.message);
1556
- }
2221
+ return this.OnRetryClick();
1557
2222
  }
1558
- onArtifactClick() {
1559
- if (this.hasArtifact && this.artifact) {
1560
- this.artifactClicked.emit({
1561
- artifactId: this.artifact.ID,
2223
+ OnArtifactClick() {
2224
+ if (this.HasArtifact && this.Artifact) {
2225
+ this.ArtifactClicked.emit({
2226
+ artifactId: this.Artifact.ID,
1562
2227
  versionId: this.artifactVersion?.ID
1563
2228
  });
1564
2229
  }
1565
2230
  }
1566
- onArtifactActionPerformed(event) {
2231
+ /** @deprecated Use {@link OnArtifactClick}. */
2232
+ onArtifactClick() {
2233
+ return this.OnArtifactClick();
2234
+ }
2235
+ OnArtifactActionPerformed(event) {
1567
2236
  // Handle artifact actions from inline-artifact component
1568
2237
  if (event.action === 'open') {
1569
- this.artifactClicked.emit({
2238
+ this.ArtifactClicked.emit({
1570
2239
  artifactId: event.artifact.ID,
1571
2240
  versionId: event.version?.ID
1572
2241
  });
1573
2242
  }
1574
2243
  else {
1575
2244
  // Emit other actions to parent
1576
- this.artifactActionPerformed.emit({ action: event.action, artifactId: event.artifact.ID });
2245
+ this.ArtifactActionPerformed.emit({ action: event.action, artifactId: event.artifact.ID });
1577
2246
  }
1578
2247
  }
1579
- toggleReaction(type) {
2248
+ /** @deprecated Use {@link OnArtifactActionPerformed}. */
2249
+ onArtifactActionPerformed(event) {
2250
+ return this.OnArtifactActionPerformed(event);
2251
+ }
2252
+ ToggleReaction(type) {
1580
2253
  // TODO: Implement reaction toggling
1581
2254
  console.log('Toggle reaction:', type, 'for message:', this.message.ID);
1582
2255
  }
1583
- onSaveArtifact(event) {
2256
+ /** @deprecated Use {@link ToggleReaction}. */
2257
+ toggleReaction(type) {
2258
+ return this.ToggleReaction(type);
2259
+ }
2260
+ OnSaveArtifact(event) {
1584
2261
  event.stopPropagation();
1585
2262
  // TODO: Implement artifact save
1586
2263
  console.log('Save artifact for message:', this.message.ID);
1587
2264
  }
1588
- onShareArtifact(event) {
2265
+ /** @deprecated Use {@link OnSaveArtifact}. */
2266
+ onSaveArtifact(event) {
2267
+ return this.OnSaveArtifact(event);
2268
+ }
2269
+ OnShareArtifact(event) {
1589
2270
  event.stopPropagation();
1590
2271
  // TODO: Implement artifact share
1591
2272
  console.log('Share artifact for message:', this.message.ID);
1592
2273
  }
1593
- onExportArtifact(event) {
2274
+ /** @deprecated Use {@link OnShareArtifact}. */
2275
+ onShareArtifact(event) {
2276
+ return this.OnShareArtifact(event);
2277
+ }
2278
+ OnExportArtifact(event) {
1594
2279
  event.stopPropagation();
1595
2280
  // TODO: Implement artifact export
1596
2281
  console.log('Export artifact for message:', this.message.ID);
1597
2282
  }
2283
+ /** @deprecated Use {@link OnExportArtifact}. */
2284
+ onExportArtifact(event) {
2285
+ return this.OnExportArtifact(event);
2286
+ }
1598
2287
  /**
1599
2288
  * Handle attachment thumbnail click
1600
2289
  * Emits the attachment for the parent to display in the image viewer
1601
2290
  */
2291
+ OnAttachmentClick(attachment) {
2292
+ this.AttachmentClicked.emit(attachment);
2293
+ }
2294
+ /** @deprecated Use {@link OnAttachmentClick}. */
1602
2295
  onAttachmentClick(attachment) {
1603
- this.attachmentClicked.emit(attachment);
2296
+ return this.OnAttachmentClick(attachment);
1604
2297
  }
1605
2298
  /**
1606
2299
  * Check if message has any attachments
1607
2300
  */
2301
+ get HasAttachments() {
2302
+ return this.Attachments && this.Attachments.length > 0;
2303
+ }
2304
+ /** @deprecated Use {@link HasAttachments}. */
1608
2305
  get hasAttachments() {
1609
- return this.attachments && this.attachments.length > 0;
2306
+ return this.HasAttachments;
1610
2307
  }
1611
2308
  /**
1612
2309
  * Get only image attachments
1613
2310
  */
2311
+ get ImageAttachments() {
2312
+ return this.Attachments?.filter(a => a.type === 'Image') || [];
2313
+ }
2314
+ /** @deprecated Use {@link ImageAttachments}. */
1614
2315
  get imageAttachments() {
1615
- return this.attachments?.filter(a => a.type === 'Image') || [];
2316
+ return this.ImageAttachments;
1616
2317
  }
1617
2318
  /**
1618
2319
  * Format file size for display
1619
2320
  */
1620
- formatFileSize(bytes) {
2321
+ FormatFileSize(bytes) {
1621
2322
  if (bytes < 1024)
1622
2323
  return bytes + ' B';
1623
2324
  if (bytes < 1024 * 1024)
1624
2325
  return (bytes / 1024).toFixed(1) + ' KB';
1625
2326
  return (bytes / (1024 * 1024)).toFixed(1) + ' MB';
1626
2327
  }
2328
+ /** @deprecated Use {@link FormatFileSize}. */
2329
+ formatFileSize(bytes) {
2330
+ return this.FormatFileSize(bytes);
2331
+ }
1627
2332
  /** Compact UPPERCASE badge label (artifact-type name wins over file extension). */
1628
- badgeTextFor(attachment) {
2333
+ BadgeTextFor(attachment) {
1629
2334
  return BadgeTextForAttachment(attachment);
1630
2335
  }
2336
+ /** @deprecated Use {@link BadgeTextFor}. */
2337
+ badgeTextFor(attachment) {
2338
+ return this.BadgeTextFor(attachment);
2339
+ }
1631
2340
  /**
1632
2341
  * Whether this message has an associated agent run
1633
2342
  * Based on whether the message has an AgentID (not whether agentRun object is loaded)
1634
2343
  */
1635
- get hasAgentRun() {
2344
+ get HasAgentRun() {
1636
2345
  return !!this.message?.AgentID;
1637
2346
  }
2347
+ /** @deprecated Use {@link HasAgentRun}. */
2348
+ get hasAgentRun() {
2349
+ return this.HasAgentRun;
2350
+ }
1638
2351
  /**
1639
2352
  * Whether the agent-run gear's expanded panel would actually render anything —
1640
2353
  * used to gate the gear button itself so it doesn't appear as a dead control
@@ -1653,40 +2366,48 @@ export class MessageItemComponent extends BaseAngularComponent {
1653
2366
  * empty. That window is deliberately preserved (byte-identical defaults) rather
1654
2367
  * than fixed here.
1655
2368
  */
1656
- get hasAgentDetailsPanelContent() {
2369
+ get HasAgentDetailsPanelContent() {
1657
2370
  // Run-details enabled → gear shows for any agent-run message (the button
1658
2371
  // already AND-gates hasAgentRun), exactly as before the gate existed — even
1659
2372
  // before the agentRun object finishes loading. This keeps the default
1660
2373
  // (showAgentRunDetails=true) byte-identical.
1661
- if (this.showAgentRunDetails)
2374
+ if (this.ShowAgentRunDetails)
1662
2375
  return true;
1663
- if (this.detailTasks.length > 0)
2376
+ if (this.DetailTasks.length > 0)
1664
2377
  return true;
1665
- if (!this.isLastMessage) {
1666
- if (this.allowMessageDelete && this.isConversationOwner)
2378
+ if (!this.IsLastMessage) {
2379
+ if (this.AllowMessageDelete && this.IsConversationOwner)
1667
2380
  return true;
1668
- if (this.allowPinning)
2381
+ if (this.AllowPinning)
1669
2382
  return true;
1670
2383
  // The rating only renders inside the template's `messageStatus === 'Complete'`
1671
2384
  // branch, so an incomplete/errored message must NOT count it as content —
1672
2385
  // otherwise the gear reappears over an empty panel, which is the whole bug
1673
2386
  // this getter exists to prevent.
1674
- if (this.showMessageRating && this.messageStatus === 'Complete')
2387
+ if (this.ShowMessageRating && this.MessageStatus === 'Complete')
1675
2388
  return true;
1676
2389
  }
1677
2390
  return false;
1678
2391
  }
2392
+ /** @deprecated Use {@link HasAgentDetailsPanelContent}. */
2393
+ get hasAgentDetailsPanelContent() {
2394
+ return this.HasAgentDetailsPanelContent;
2395
+ }
1679
2396
  /**
1680
2397
  * Toggle the agent details panel expansion
1681
2398
  */
1682
- async toggleAgentDetails() {
1683
- this.isAgentDetailsExpanded = !this.isAgentDetailsExpanded;
2399
+ async ToggleAgentDetails() {
2400
+ this.IsAgentDetailsExpanded = !this.IsAgentDetailsExpanded;
1684
2401
  // Load tasks when expanding if not already loaded
1685
- if (this.isAgentDetailsExpanded && !this.tasksLoaded) {
2402
+ if (this.IsAgentDetailsExpanded && !this.tasksLoaded) {
1686
2403
  await this.loadTasks();
1687
2404
  }
1688
2405
  this.cdRef.detectChanges();
1689
2406
  }
2407
+ /** @deprecated Use {@link ToggleAgentDetails}. */
2408
+ async toggleAgentDetails() {
2409
+ return this.ToggleAgentDetails();
2410
+ }
1690
2411
  /**
1691
2412
  * Load tasks associated with this conversation detail
1692
2413
  */
@@ -1701,9 +2422,9 @@ export class MessageItemComponent extends BaseAngularComponent {
1701
2422
  ExtraFilter: `ConversationDetailID='${this.message.ID}'`,
1702
2423
  OrderBy: '__mj_CreatedAt DESC',
1703
2424
  ResultType: 'entity_object'
1704
- }, this.currentUser);
2425
+ }, this.CurrentUser);
1705
2426
  if (result.Success) {
1706
- this.detailTasks = result.Results || [];
2427
+ this.DetailTasks = result.Results || [];
1707
2428
  this.tasksLoaded = true;
1708
2429
  }
1709
2430
  }
@@ -1716,91 +2437,123 @@ export class MessageItemComponent extends BaseAngularComponent {
1716
2437
  * For active runs: Calculate from created to NOW (live updates)
1717
2438
  * For completed runs: Calculate from created to updated timestamp (static)
1718
2439
  */
1719
- get agentRunDuration() {
1720
- if (!this.agentRun || !this.agentRun.__mj_CreatedAt) {
2440
+ get AgentRunDuration() {
2441
+ if (!this.AgentRun || !this.AgentRun.__mj_CreatedAt) {
1721
2442
  return null;
1722
2443
  }
1723
2444
  // For active runs, return the interval-updated field to avoid
1724
2445
  // ExpressionChangedAfterItHasBeenCheckedError (new Date() changes between CD cycles)
1725
- if (this.isAgentRunActive) {
1726
- return this._agentRunDurationFormatted;
2446
+ if (this.IsAgentRunActive) {
2447
+ return this.AgentRunDurationFormatted;
1727
2448
  }
1728
2449
  // For completed runs, calculate static duration from timestamps
1729
- if (!this.agentRun.__mj_UpdatedAt) {
2450
+ if (!this.AgentRun.__mj_UpdatedAt) {
1730
2451
  return null;
1731
2452
  }
1732
- const createdAt = new Date(this.agentRun.__mj_CreatedAt);
1733
- const endTime = new Date(this.agentRun.__mj_UpdatedAt);
2453
+ const createdAt = new Date(this.AgentRun.__mj_CreatedAt);
2454
+ const endTime = new Date(this.AgentRun.__mj_UpdatedAt);
1734
2455
  const diffMs = endTime.getTime() - createdAt.getTime();
1735
2456
  if (diffMs <= 0) {
1736
2457
  return null;
1737
2458
  }
1738
2459
  return this.formatDurationFromMs(diffMs);
1739
2460
  }
2461
+ /** @deprecated Use {@link AgentRunDuration}. */
2462
+ get agentRunDuration() {
2463
+ return this.AgentRunDuration;
2464
+ }
1740
2465
  /**
1741
2466
  * Get total tokens used in the agent run
1742
2467
  */
1743
- get agentRunTotalTokens() {
1744
- if (!this.agentRun) {
2468
+ get AgentRunTotalTokens() {
2469
+ if (!this.AgentRun) {
1745
2470
  return 0;
1746
2471
  }
1747
- return (this.agentRun.TotalPromptTokensUsed || 0) + (this.agentRun.TotalCompletionTokensUsed || 0);
2472
+ return (this.AgentRun.TotalPromptTokensUsed || 0) + (this.AgentRun.TotalCompletionTokensUsed || 0);
2473
+ }
2474
+ /** @deprecated Use {@link AgentRunTotalTokens}. */
2475
+ get agentRunTotalTokens() {
2476
+ return this.AgentRunTotalTokens;
1748
2477
  }
1749
2478
  /**
1750
2479
  * Get total cost of the agent run
1751
2480
  */
2481
+ get AgentRunTotalCost() {
2482
+ return this.AgentRun?.TotalCost || 0;
2483
+ }
2484
+ /** @deprecated Use {@link AgentRunTotalCost}. */
1752
2485
  get agentRunTotalCost() {
1753
- return this.agentRun?.TotalCost || 0;
2486
+ return this.AgentRunTotalCost;
1754
2487
  }
1755
2488
  /**
1756
2489
  * Get number of steps in the agent run
1757
2490
  */
1758
- get agentRunStepCount() {
2491
+ get AgentRunStepCount() {
1759
2492
  // Count from the Steps array if available
1760
- if (this.agentRun && this.agentRun.Steps) {
1761
- return this.agentRun.Steps.length;
2493
+ if (this.AgentRun && this.AgentRun.Steps) {
2494
+ return this.AgentRun.Steps.length;
1762
2495
  }
1763
2496
  return 0;
1764
2497
  }
2498
+ /** @deprecated Use {@link AgentRunStepCount}. */
2499
+ get agentRunStepCount() {
2500
+ return this.AgentRunStepCount;
2501
+ }
1765
2502
  /**
1766
2503
  * Format number with commas
1767
2504
  */
1768
- formatNumber(num) {
2505
+ FormatNumber(num) {
1769
2506
  return num.toLocaleString();
1770
2507
  }
2508
+ /** @deprecated Use {@link FormatNumber}. */
2509
+ formatNumber(num) {
2510
+ return this.FormatNumber(num);
2511
+ }
1771
2512
  /**
1772
2513
  * Open the agent run entity record in a new tab
1773
2514
  */
1774
- openAgentRunRecord() {
1775
- if (!this.agentRun?.ID)
2515
+ OpenAgentRunRecord() {
2516
+ if (!this.AgentRun?.ID)
1776
2517
  return;
1777
2518
  const compositeKey = new CompositeKey([
1778
- new KeyValuePair('ID', this.agentRun.ID)
2519
+ new KeyValuePair('ID', this.AgentRun.ID)
1779
2520
  ]);
1780
- this.openEntityRecord.emit({
2521
+ this.OpenEntityRecord.emit({
1781
2522
  entityName: 'MJ: AI Agent Runs',
1782
2523
  compositeKey
1783
2524
  });
1784
2525
  }
2526
+ /** @deprecated Use {@link OpenAgentRunRecord}. */
2527
+ openAgentRunRecord() {
2528
+ return this.OpenAgentRunRecord();
2529
+ }
1785
2530
  /**
1786
2531
  * Open the agent entity record in a new tab
1787
2532
  */
1788
- openAgentRecord() {
1789
- if (!this.agentRun?.AgentID)
2533
+ OpenAgentRecord() {
2534
+ if (!this.AgentRun?.AgentID)
1790
2535
  return;
1791
2536
  const compositeKey = new CompositeKey([
1792
- new KeyValuePair('ID', this.agentRun.AgentID)
2537
+ new KeyValuePair('ID', this.AgentRun.AgentID)
1793
2538
  ]);
1794
- this.openEntityRecord.emit({
2539
+ this.OpenEntityRecord.emit({
1795
2540
  entityName: 'MJ: AI Agents',
1796
2541
  compositeKey
1797
2542
  });
1798
2543
  }
2544
+ /** @deprecated Use {@link OpenAgentRecord}. */
2545
+ openAgentRecord() {
2546
+ return this.OpenAgentRecord();
2547
+ }
1799
2548
  /**
1800
2549
  * Check if current user is the conversation owner
1801
2550
  */
2551
+ get IsConversationOwner() {
2552
+ return UUIDsEqual(this.Conversation?.UserID, this.CurrentUser.ID);
2553
+ }
2554
+ /** @deprecated Use {@link IsConversationOwner}. */
1802
2555
  get isConversationOwner() {
1803
- return UUIDsEqual(this.conversation?.UserID, this.currentUser.ID);
2556
+ return this.IsConversationOwner;
1804
2557
  }
1805
2558
  /**
1806
2559
  * Get agent response form from message
@@ -1813,7 +2566,7 @@ export class MessageItemComponent extends BaseAngularComponent {
1813
2566
  */
1814
2567
  _responseFormRaw = undefined;
1815
2568
  _responseFormCache = null;
1816
- get responseForm() {
2569
+ get ResponseForm() {
1817
2570
  const rawData = this.message.ResponseForm ?? null;
1818
2571
  if (rawData === this._responseFormRaw)
1819
2572
  return this._responseFormCache;
@@ -1831,6 +2584,10 @@ export class MessageItemComponent extends BaseAngularComponent {
1831
2584
  }
1832
2585
  return this._responseFormCache;
1833
2586
  }
2587
+ /** @deprecated Use {@link ResponseForm}. */
2588
+ get responseForm() {
2589
+ return this.ResponseForm;
2590
+ }
1834
2591
  /**
1835
2592
  * Get actionable commands from message
1836
2593
  * Uses ActionableCommands property from MJConversationDetailEntity
@@ -1839,7 +2596,7 @@ export class MessageItemComponent extends BaseAngularComponent {
1839
2596
  */
1840
2597
  _actionableCommandsRaw = undefined;
1841
2598
  _actionableCommandsCache = [];
1842
- get actionableCommands() {
2599
+ get ActionableCommands() {
1843
2600
  const rawData = this.message.ActionableCommands ?? null;
1844
2601
  if (rawData === this._actionableCommandsRaw)
1845
2602
  return this._actionableCommandsCache;
@@ -1858,12 +2615,16 @@ export class MessageItemComponent extends BaseAngularComponent {
1858
2615
  }
1859
2616
  return this._actionableCommandsCache;
1860
2617
  }
2618
+ /** @deprecated Use {@link ActionableCommands}. */
2619
+ get actionableCommands() {
2620
+ return this.ActionableCommands;
2621
+ }
1861
2622
  /**
1862
2623
  * Handle agent response form submission
1863
2624
  * Converts form data to the new @{_mode:"form",...} format
1864
2625
  */
1865
- onFormSubmitted(formData) {
1866
- const form = this.responseForm;
2626
+ OnFormSubmitted(formData) {
2627
+ const form = this.ResponseForm;
1867
2628
  if (!form) {
1868
2629
  console.error('No response form available for submission');
1869
2630
  return;
@@ -1890,7 +2651,7 @@ export class MessageItemComponent extends BaseAngularComponent {
1890
2651
  // message ID as the form id — each AgentResponseForm is attached to exactly
1891
2652
  // one message, giving a stable per-message identifier.
1892
2653
  const beforeEvent = new BeforeResponseFormSubmittedEventArgs(this.message.ID, formData);
1893
- this.beforeResponseFormSubmitted.emit(beforeEvent);
2654
+ this.BeforeResponseFormSubmitted.emit(beforeEvent);
1894
2655
  if (beforeEvent.Cancel) {
1895
2656
  return;
1896
2657
  }
@@ -1903,11 +2664,15 @@ export class MessageItemComponent extends BaseAngularComponent {
1903
2664
  const formMessage = ConversationUtility.CreateFormResponse('formSubmit', // Generic action name
1904
2665
  fields, form.title);
1905
2666
  // Emit the formatted message
1906
- this.suggestedResponseSelected.emit({
2667
+ this.SuggestedResponseSelected.emit({
1907
2668
  text: formMessage,
1908
2669
  customInput: undefined // No longer needed with new format
1909
2670
  });
1910
- this.afterResponseFormSubmitted.emit(new AfterResponseFormSubmittedEventArgs(this.message.ID, formData));
2671
+ this.AfterResponseFormSubmitted.emit(new AfterResponseFormSubmittedEventArgs(this.message.ID, formData));
2672
+ }
2673
+ /** @deprecated Use {@link OnFormSubmitted}. */
2674
+ onFormSubmitted(formData) {
2675
+ return this.OnFormSubmitted(formData);
1911
2676
  }
1912
2677
  /**
1913
2678
  * Detects a plan-approval form submission (the Plan Mode HITL card — identified by its
@@ -1916,7 +2681,7 @@ export class MessageItemComponent extends BaseAngularComponent {
1916
2681
  * Mode (plan phase complete — execute); REJECT intentionally leaves it on (re-plan).
1917
2682
  */
1918
2683
  applyPlanDecision(formData) {
1919
- const form = this.responseForm;
2684
+ const form = this.ResponseForm;
1920
2685
  const isPlanForm = !!form?.questions.some(q => q.id === 'plan') &&
1921
2686
  !!form?.questions.some(q => q.id === 'decision');
1922
2687
  if (!isPlanForm) {
@@ -1929,24 +2694,29 @@ export class MessageItemComponent extends BaseAngularComponent {
1929
2694
  /**
1930
2695
  * Handle actionable command execution
1931
2696
  */
1932
- async onCommandExecuted(command) {
2697
+ async OnCommandExecuted(command) {
1933
2698
  try {
1934
- await this.uiCommandHandler.executeActionableCommand(command, {
2699
+ await this.uiCommandHandler.ExecuteActionableCommand(command, {
1935
2700
  conversationId: this.message.ConversationID,
1936
2701
  conversationDetailId: this.message.ID
1937
2702
  });
1938
2703
  }
1939
2704
  catch (error) {
1940
- console.error('Failed to execute command:', command, error);
2705
+ // compose:email by TYPE ONLY: its body and recipients are the user's correspondence.
2706
+ console.error('Failed to execute command:', command.type === 'compose:email' ? command.type : command, error);
1941
2707
  }
1942
2708
  }
2709
+ /** @deprecated Use {@link OnCommandExecuted}. */
2710
+ async onCommandExecuted(command) {
2711
+ return this.OnCommandExecuted(command);
2712
+ }
1943
2713
  /**
1944
2714
  * Execute automatic commands when message loads
1945
2715
  * This is called after a message with automatic commands is received
1946
2716
  */
1947
2717
  async executeAutomaticCommands() {
1948
2718
  try {
1949
- if (!this.isLastMessage)
2719
+ if (!this.IsLastMessage)
1950
2720
  return; // we only do this when the message is the last one in the conversation
1951
2721
  // TODO - IMPORTANT
1952
2722
  // BELOW, after doing the commands,
@@ -1996,7 +2766,7 @@ export class MessageItemComponent extends BaseAngularComponent {
1996
2766
  return option?.label;
1997
2767
  }
1998
2768
  static ɵfac = function MessageItemComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || MessageItemComponent)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef), i0.ɵɵdirectiveInject(i1.MentionParserService), i0.ɵɵdirectiveInject(i2.UICommandHandlerService), i0.ɵɵdirectiveInject(i3.ConversationAgentService), i0.ɵɵdirectiveInject(i4.MarkdownService)); };
1999
- static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: MessageItemComponent, selectors: [["mj-conversation-message-item"]], inputs: { message: "message", conversation: "conversation", currentUser: "currentUser", allMessages: "allMessages", isProcessing: "isProcessing", artifact: "artifact", artifactVersion: "artifactVersion", artifacts: "artifacts", agentRun: "agentRun", userAvatarMap: "userAvatarMap", ratings: "ratings", isLastMessage: "isLastMessage", attachments: "attachments", pendingArtifacts: "pendingArtifacts", messageExtraTemplate: "messageExtraTemplate", showAgentRunDetails: "showAgentRunDetails", showReactions: "showReactions", showMessageRating: "showMessageRating", allowPinning: "allowPinning", allowMessageEdit: "allowMessageEdit", allowMessageDelete: "allowMessageDelete", assistantDisplayName: "assistantDisplayName", assistantAvatarUrl: "assistantAvatarUrl" }, outputs: { editClicked: "editClicked", deleteClicked: "deleteClicked", retryClicked: "retryClicked", testFeedbackClicked: "testFeedbackClicked", artifactClicked: "artifactClicked", artifactActionPerformed: "artifactActionPerformed", messageEdited: "messageEdited", openEntityRecord: "openEntityRecord", suggestedResponseSelected: "suggestedResponseSelected", attachmentClicked: "attachmentClicked", diagnosticRequested: "diagnosticRequested", messagePinToggled: "messagePinToggled", beforeResponseFormSubmitted: "beforeResponseFormSubmitted", afterResponseFormSubmitted: "afterResponseFormSubmitted" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature, i0.ɵɵNgOnChangesFeature], decls: 25, vars: 27, consts: [[3, "click"], [1, "message-avatar"], [1, "avatar-circle"], [1, "message-content"], [1, "message-header"], [1, "message-sender", 3, "title"], [1, "message-time"], [1, "message-status", 3, "error"], ["title", "Edit message", 1, "message-edit-icon"], [1, "time-pill", 3, "in-progress", "active", "complete", "failed"], ["title", "Provide Test Feedback", 1, "test-feedback-icon"], [1, "agent-run-icon", 3, "expanded", "title"], [1, "message-body"], [1, "message-edit-container"], [1, "message-footer"], [1, "agent-details-section"], [1, "agent-details-panel"], [1, "message-actions"], [1, "message-reactions"], ["alt", "User avatar", 1, "avatar-image", 3, "src"], [3, "class"], [1, "fas", "fa-user"], ["alt", "Assistant avatar", 1, "avatar-image", 3, "src"], [1, "fas", 3, "ngClass"], ["alt", "Assistant avatar", 1, "avatar-image", 3, "error", "src"], [1, "message-status"], [1, "status-text"], ["title", "Edit message", 1, "message-edit-icon", 3, "click"], [1, "fas", "fa-pen"], [1, "time-pill"], [1, "fas", "fa-clock"], ["title", "Provide Test Feedback", 1, "test-feedback-icon", 3, "click"], [1, "fas", "fa-flask"], [1, "agent-run-icon", 3, "click", "title"], [1, "fas", "fa-cog"], [1, "rating-badge"], [1, "message-text"], [3, "data", "enableCollapsibleHeadings"], [1, "edited-badge"], [1, "message-attachments"], [1, "artifact-wrapper", 3, "system-artifact"], [3, "FormDefinition", "Disabled"], [3, "commands", "disabled", "isLastMessage", "isConversationOwner"], [4, "ngTemplateOutlet", "ngTemplateOutletContext"], [1, "attachment-item", "image-attachment", 3, "title"], [1, "attachment-strip", 3, "is-artifact", "title"], [1, "attachment-item", "image-attachment", 3, "click", "title"], ["loading", "lazy", 1, "attachment-thumbnail", 3, "src", "alt"], [1, "attachment-overlay"], [1, "fas", "fa-expand"], [1, "attachment-strip", 3, "click", "title"], [1, "attachment-badge"], [1, "attachment-meta"], [1, "file-name"], [1, "file-size"], [1, "artifact-wrapper"], [3, "actionPerformed", "artifactId", "artifact", "artifactVersion", "currentUser"], [1, "artifact-pending"], ["size", "small", 3, "text"], [3, "FormSubmitted", "FormDefinition", "Disabled"], [3, "commandExecuted", "commands", "disabled", "isLastMessage", "isConversationOwner"], ["rows", "4", "placeholder", "Edit your message...", 1, "message-edit-textarea", 3, "ngModelChange", "keydown", "ngModel"], [1, "edit-actions"], [1, "edit-action-btn", "save", 3, "click"], [1, "fas", "fa-check"], [1, "edit-action-btn", "cancel", 3, "click"], [1, "fas", "fa-times"], [1, "edit-hint"], ["title", "Delete this message and all messages below it", 1, "action-bar-btn", "danger", "inline-delete"], [1, "ai-message-actions"], ["title", "Delete this message and all messages below it", 1, "action-bar-btn", "danger", "inline-delete", 3, "click"], [1, "fas", "fa-trash"], [3, "conversationDetailId", "currentUser", "ratingEntityName", "ratingsData", "canEdit"], ["type", "button", 1, "action-bar-btn", "pin-btn", 3, "pinned", "title"], ["type", "button", 1, "action-bar-btn", "pin-btn", 3, "click", "title"], [1, "fas", "fa-thumbtack"], [1, "agent-details-content"], [1, "agent-panel-actions"], [1, "agent-details-tasks"], [1, "agent-details-header"], [1, "fas", "fa-chart-line"], ["title", "Open agent details", 1, "agent-name-link", 3, "click"], [1, "agent-details-grid"], [1, "detail-row"], [1, "detail-label"], [1, "detail-value"], ["title", "Open agent run details", 1, "run-id-link", 3, "click"], [1, "fas", "fa-external-link-alt"], [1, "detail-value", "status-badge"], ["title", "Delete this message and all messages below it", 1, "action-bar-btn", "danger"], ["title", "Delete this message and all messages below it", 1, "action-bar-btn", "danger", 3, "click"], [3, "conversationDetailId", "currentUser", "ratingsData", "canEdit"], [1, "tasks-section-header"], [1, "fas", "fa-tasks"], [1, "tasks-list"], [3, "task", "compact", "clickable", "showProgress", "showDuration"], ["title", "Retry", 1, "message-action-btn", "retry-btn", 3, "click"], [1, "fas", "fa-redo"], [1, "reaction-btn", 3, "click"], [1, "far", "fa-thumbs-up"], [1, "reaction-count"], [1, "far", "fa-comment"]], template: function MessageItemComponent_Template(rf, ctx) { if (rf & 1) {
2769
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: MessageItemComponent, selectors: [["mj-conversation-message-item"]], inputs: { message: "message", Conversation: "Conversation", conversation: "conversation", CurrentUser: "CurrentUser", currentUser: "currentUser", AllMessages: "AllMessages", allMessages: "allMessages", IsProcessing: "IsProcessing", isProcessing: "isProcessing", Artifact: "Artifact", artifact: "artifact", artifactVersion: "artifactVersion", Artifacts: "Artifacts", artifacts: "artifacts", AgentRun: "AgentRun", agentRun: "agentRun", UserAvatarMap: "UserAvatarMap", userAvatarMap: "userAvatarMap", Ratings: "Ratings", ratings: "ratings", IsLastMessage: "IsLastMessage", isLastMessage: "isLastMessage", Attachments: "Attachments", attachments: "attachments", PendingArtifacts: "PendingArtifacts", pendingArtifacts: "pendingArtifacts", MessageExtraTemplate: "MessageExtraTemplate", messageExtraTemplate: "messageExtraTemplate", 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", AssistantDisplayName: "AssistantDisplayName", assistantDisplayName: "assistantDisplayName", AssistantAvatarUrl: "AssistantAvatarUrl", assistantAvatarUrl: "assistantAvatarUrl" }, outputs: { EditClicked: "EditClicked", editClicked: "editClicked", DeleteClicked: "DeleteClicked", deleteClicked: "deleteClicked", RetryClicked: "RetryClicked", retryClicked: "retryClicked", TestFeedbackClicked: "TestFeedbackClicked", testFeedbackClicked: "testFeedbackClicked", ArtifactClicked: "ArtifactClicked", artifactClicked: "artifactClicked", ArtifactActionPerformed: "ArtifactActionPerformed", artifactActionPerformed: "artifactActionPerformed", 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", BeforeResponseFormSubmitted: "BeforeResponseFormSubmitted", beforeResponseFormSubmitted: "beforeResponseFormSubmitted", AfterResponseFormSubmitted: "AfterResponseFormSubmitted", afterResponseFormSubmitted: "afterResponseFormSubmitted" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature, i0.ɵɵNgOnChangesFeature], decls: 25, vars: 27, consts: [[3, "click"], [1, "message-avatar"], [1, "avatar-circle"], [1, "message-content"], [1, "message-header"], [1, "message-sender", 3, "title"], [1, "message-time"], [1, "message-status", 3, "error"], ["title", "Edit message", 1, "message-edit-icon"], [1, "time-pill", 3, "in-progress", "active", "complete", "failed", "checking", "stalled", "title"], ["title", "Provide Test Feedback", 1, "test-feedback-icon"], [1, "agent-run-icon", 3, "expanded", "title"], [1, "message-body"], [1, "message-edit-container"], [1, "message-footer"], [1, "agent-details-section"], [1, "agent-details-panel"], [1, "message-actions"], [1, "message-reactions"], ["alt", "User avatar", 1, "avatar-image", 3, "src"], [3, "class"], [1, "fas", "fa-user"], ["alt", "Assistant avatar", 1, "avatar-image", 3, "src"], [1, "fas", 3, "ngClass"], ["alt", "Assistant avatar", 1, "avatar-image", 3, "error", "src"], [1, "message-status"], [1, "status-text"], ["title", "Edit message", 1, "message-edit-icon", 3, "click"], [1, "fas", "fa-pen"], [1, "time-pill", 3, "title"], [1, "liveness-label"], ["title", "Provide Test Feedback", 1, "test-feedback-icon", 3, "click"], [1, "fas", "fa-flask"], [1, "agent-run-icon", 3, "click", "title"], [1, "fas", "fa-cog"], [1, "rating-badge"], [1, "message-text"], [3, "data", "enableCollapsibleHeadings"], [1, "edited-badge"], [1, "message-attachments"], [1, "artifact-wrapper", 3, "system-artifact"], [3, "FormDefinition", "Disabled"], [3, "commands", "disabled", "isLastMessage", "isConversationOwner"], [4, "ngTemplateOutlet", "ngTemplateOutletContext"], [1, "attachment-item", "image-attachment", 3, "title"], [1, "attachment-strip", 3, "is-artifact", "title"], [1, "attachment-item", "image-attachment", 3, "click", "title"], ["loading", "lazy", 1, "attachment-thumbnail", 3, "src", "alt"], [1, "attachment-overlay"], [1, "fas", "fa-expand"], [1, "attachment-strip", 3, "click", "title"], [1, "attachment-badge"], [1, "attachment-meta"], [1, "file-name"], [1, "file-size"], [1, "artifact-wrapper"], [3, "actionPerformed", "artifactId", "artifact", "artifactVersion", "currentUser"], [1, "artifact-pending"], ["size", "small", 3, "text"], [3, "FormSubmitted", "FormDefinition", "Disabled"], [3, "commandExecuted", "commands", "disabled", "isLastMessage", "isConversationOwner"], ["rows", "4", "placeholder", "Edit your message...", 1, "message-edit-textarea", 3, "ngModelChange", "keydown", "ngModel"], [1, "edit-actions"], [1, "edit-action-btn", "save", 3, "click"], [1, "fas", "fa-check"], [1, "edit-action-btn", "cancel", 3, "click"], [1, "fas", "fa-times"], [1, "edit-hint"], ["title", "Delete this message and all messages below it", 1, "action-bar-btn", "danger", "inline-delete"], [1, "ai-message-actions"], ["title", "Delete this message and all messages below it", 1, "action-bar-btn", "danger", "inline-delete", 3, "click"], [1, "fas", "fa-trash"], [3, "conversationDetailId", "currentUser", "ratingEntityName", "ratingsData", "canEdit"], ["type", "button", 1, "action-bar-btn", "pin-btn", 3, "pinned", "title"], ["type", "button", 1, "action-bar-btn", "pin-btn", 3, "click", "title"], [1, "fas", "fa-thumbtack"], [1, "agent-details-content"], [1, "agent-panel-actions"], [1, "agent-details-tasks"], [1, "agent-details-header"], [1, "fas", "fa-chart-line"], ["title", "Open agent details", 1, "agent-name-link", 3, "click"], [1, "agent-details-grid"], [1, "detail-row"], [1, "detail-label"], [1, "detail-value"], ["title", "Open agent run details", 1, "run-id-link", 3, "click"], [1, "fas", "fa-external-link-alt"], [1, "detail-value", "status-badge"], ["title", "Delete this message and all messages below it", 1, "action-bar-btn", "danger"], ["title", "Delete this message and all messages below it", 1, "action-bar-btn", "danger", 3, "click"], [3, "conversationDetailId", "currentUser", "ratingsData", "canEdit"], [1, "tasks-section-header"], [1, "fas", "fa-tasks"], [1, "tasks-list"], [3, "task", "compact", "clickable", "showProgress", "showDuration"], ["title", "Retry", 1, "message-action-btn", "retry-btn", 3, "click"], [1, "fas", "fa-redo"], [1, "reaction-btn", 3, "click"], [1, "far", "fa-thumbs-up"], [1, "reaction-count"], [1, "far", "fa-comment"]], template: function MessageItemComponent_Template(rf, ctx) { if (rf & 1) {
2000
2770
  i0.ɵɵelementStart(0, "div", 0);
2001
2771
  i0.ɵɵlistener("click", function MessageItemComponent_Template_div_click_0_listener($event) { return ctx.onMessageBubbleClick($event); });
2002
2772
  i0.ɵɵelementStart(1, "div", 1)(2, "div", 2);
@@ -2011,7 +2781,7 @@ export class MessageItemComponent extends BaseAngularComponent {
2011
2781
  i0.ɵɵelementEnd();
2012
2782
  i0.ɵɵconditionalCreate(12, MessageItemComponent_Conditional_12_Template, 4, 4, "span", 7);
2013
2783
  i0.ɵɵconditionalCreate(13, MessageItemComponent_Conditional_13_Template, 2, 0, "span", 8);
2014
- i0.ɵɵconditionalCreate(14, MessageItemComponent_Conditional_14_Template, 3, 9, "span", 9);
2784
+ i0.ɵɵconditionalCreate(14, MessageItemComponent_Conditional_14_Template, 5, 16, "span", 9);
2015
2785
  i0.ɵɵconditionalCreate(15, MessageItemComponent_Conditional_15_Template, 2, 0, "span", 10);
2016
2786
  i0.ɵɵconditionalCreate(16, MessageItemComponent_Conditional_16_Template, 3, 4, "span", 11);
2017
2787
  i0.ɵɵelementEnd();
@@ -2061,85 +2831,159 @@ export class MessageItemComponent extends BaseAngularComponent {
2061
2831
  i0.ɵɵconditional(ctx.messageStatus === "Error" && ctx.isAIMessage && !ctx.isProcessing && !ctx.isEditing ? 23 : -1);
2062
2832
  i0.ɵɵadvance();
2063
2833
  i0.ɵɵconditional(ctx.showReactions && !ctx.isProcessing && !ctx.isInProgressAIMessage && !ctx.isEditing ? 24 : -1);
2064
- } }, dependencies: [i5.NgClass, i5.NgTemplateOutlet, i6.DefaultValueAccessor, i6.NgControlStatus, i6.NgModel, i7.ArtifactMessageCardComponent, i8.LoadingComponent, i4.MarkdownComponent, i9.DynamicFormComponent, i10.ActionableCommandsComponent, i11.ConversationMessageRatingComponent, i12.TaskWidgetComponent, i5.DatePipe], styles: [".message-item[_ngcontent-%COMP%] {\n display: flex;\n gap: 12px;\n padding: 8px 24px;\n transition: background-color 150ms ease;\n animation: _ngcontent-%COMP%_fadeIn 0.3s ease;\n position: relative;\n}\n\n@keyframes _ngcontent-%COMP%_fadeIn {\n from {\n opacity: 0;\n transform: translateY(10px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n.message-item.ai-message[_ngcontent-%COMP%] {\n background-color: transparent;\n}\n\n.message-item.user-message[_ngcontent-%COMP%] {\n background-color: transparent;\n}\n\n\n.message-item.pin-beacon[_ngcontent-%COMP%] {\n animation: _ngcontent-%COMP%_pinBeacon 1.5s ease-out forwards;\n}\n\n@keyframes _ngcontent-%COMP%_pinBeacon {\n 0% { box-shadow: 0 0 0 0 color-mix(in srgb, var(--mj-status-warning) 60%, transparent); }\n 20% { box-shadow: 0 0 0 8px color-mix(in srgb, var(--mj-status-warning) 35%, transparent); }\n 50% { box-shadow: 0 0 0 4px color-mix(in srgb, var(--mj-status-warning) 15%, transparent); }\n 70% { box-shadow: 0 0 0 6px color-mix(in srgb, var(--mj-status-warning) 20%, transparent); }\n 100% { box-shadow: none; }\n}\n\n.message-item.in-progress[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n border-left: 3px solid var(--mj-brand-primary);\n position: relative;\n}\n\n@keyframes _ngcontent-%COMP%_shimmer {\n 0% {\n background-position: -200% 0;\n }\n 100% {\n background-position: 200% 0;\n }\n}\n\n\n.message-item.in-progress[_ngcontent-%COMP%] .message-text[_ngcontent-%COMP%] {\n color: var(--mj-text-primary);\n font-weight: 500;\n max-height: 150px;\n overflow-y: auto;\n display: block;\n}\n\n\n\n.message-item.in-progress[_ngcontent-%COMP%] .avatar-circle[_ngcontent-%COMP%] {\n box-shadow: 0 0 0 0 color-mix(in srgb, var(--mj-brand-primary) 70%, transparent);\n animation: _ngcontent-%COMP%_pulse 2s ease-in-out infinite;\n}\n\n@keyframes _ngcontent-%COMP%_pulse {\n 0%, 100% {\n box-shadow: 0 0 0 0 color-mix(in srgb, var(--mj-brand-primary) 70%, transparent);\n }\n 50% {\n box-shadow: 0 0 0 8px color-mix(in srgb, var(--mj-brand-primary) 0%, transparent);\n }\n}\n\n.message-item[_ngcontent-%COMP%]:hover {\n background-color: color-mix(in srgb, var(--mj-text-primary) 2%, transparent);\n}\n\n\n[_nghost-%COMP%] .mention-badge {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 4px 12px;\n margin: 0 3px;\n border-radius: 16px;\n font-weight: 600;\n font-size: 13px;\n cursor: pointer;\n transition: all 0.2s ease;\n vertical-align: middle;\n white-space: nowrap;\n}\n\n[_nghost-%COMP%] .mention-badge.agent {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border: 2px solid color-mix(in srgb, var(--mj-brand-primary) 40%, transparent);\n box-shadow: var(--mj-shadow-md);\n}\n\n[_nghost-%COMP%] .mention-badge.user {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border: 2px solid color-mix(in srgb, var(--mj-brand-primary) 40%, transparent);\n box-shadow: var(--mj-shadow-md);\n}\n\n[_nghost-%COMP%] .mention-badge.entity {\n background: var(--mj-status-success);\n color: var(--mj-text-inverse);\n border: 2px solid color-mix(in srgb, var(--mj-status-success) 40%, transparent);\n box-shadow: var(--mj-shadow-md);\n}\n\n[_nghost-%COMP%] .mention-badge.query {\n background: var(--mj-status-warning);\n color: var(--mj-text-inverse);\n border: 2px solid color-mix(in srgb, var(--mj-status-warning) 40%, transparent);\n box-shadow: var(--mj-shadow-md);\n}\n\n[_nghost-%COMP%] .mention-badge.record {\n background: var(--mj-color-info, #2563eb);\n color: var(--mj-text-inverse, #fff);\n border: 2px solid color-mix(in srgb, var(--mj-color-info, #2563eb) 40%, transparent);\n box-shadow: var(--mj-shadow-md);\n text-decoration: none;\n}\n\n\n[_nghost-%COMP%] .mention-badge.record.icon-only {\n padding: 4px 7px;\n gap: 0;\n min-width: 1.65em;\n justify-content: center;\n}\n\n\n\n\n[_nghost-%COMP%] .mention-badge.skill {\n background: var(--mj-status-success);\n color: var(--mj-text-inverse);\n border: 2px solid color-mix(in srgb, var(--mj-text-inverse) 35%, transparent);\n border-radius: 4px;\n box-shadow: var(--mj-shadow-md);\n}\n\n[_nghost-%COMP%] .mention-badge i {\n font-size: 12px;\n opacity: 0.95;\n}\n\n\n[_nghost-%COMP%] .mention-badge i[class^=\"mj-icon-\"], \n[_nghost-%COMP%] .mention-badge i[class*=\" mj-icon-\"] {\n width: 16px;\n height: 16px;\n display: inline-block;\n background-size: contain;\n background-repeat: no-repeat;\n background-position: center;\n vertical-align: middle;\n font-size: inherit;\n}\n\n\n[_nghost-%COMP%] .mention-badge i.mj-icon-skip {\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 101.89918457031249 96.83947368421053'%3E%3Cg transform='translate(-0.1288232421875,-0.0)'%3E%3Cpath d='M93.85,41.56c-.84,0-1.62.2-2.37.55-3-4.35-7.49-8.12-13.04-11.04l.04-7.18v-14.44h-10.24v17.6c-1.52-.43-3.07-.8-4.67-1.11V0h-10.24v24.72s-.09,0-.14,0h-4.38s-.1,0-.14,0V7.3h-10.24v18.62c-1.6.32-3.15.69-4.67,1.11v-11.67h-10.24v6.09l.04,9.6c-5.55,2.92-10.04,6.7-13.04,11.04-.75-.35-1.53-.55-2.37-.55-4.5,0-8.14,5.61-8.14,12.51s3.64,12.53,8.14,12.53c.58,0,1.14-.12,1.67-.29,4.1,6.62,11.54,12.06,20.98,15.28l.79.13v7.05c0,2.97,1.45,5.58,3.87,6.99,1.18.69,2.5,1.04,3.85,1.03,1.4,0,2.83-.37,4.15-1.12l7.54-4.29,7.56,4.3c1.31.74,2.73,1.12,4.13,1.12s2.67-.35,3.85-1.04c2.42-1.41,3.86-4.02,3.86-6.98v-7.05l.79-.13c9.44-3.22,16.89-8.66,20.98-15.28.54.17,1.09.29,1.68.29,4.5,0,8.14-5.61,8.14-12.53s-3.63-12.51-8.14-12.51' fill='%23AAAAAA'/%3E%3Cpath d='M86.69,50.87c0-12.22-13.6-19.1-28.94-20.66-4.48-.47-9.19-.54-13.52,0-15.34,1.53-28.93,8.41-28.93,20.66,0,8.55,5.7,15.55,12.68,15.55h7.94c3.05,2.5,6.93,4.1,11.08,4.71,2.65.4,5.44.46,8.01,0,4.15-.6,8.05-2.2,11.1-4.71h7.92c6.97,0,12.68-7,12.68-15.55' fill='white' opacity='0.9'/%3E%3Cpath d='M57.83,55.82c-1.19,2.58-3.8,4.35-6.84,4.35s-5.65-1.77-6.84-4.35h13.68Z' fill='%23AAAAAA'/%3E%3Cpath d='M32.52,41.14c1.74,0,3.18,2.13,3.18,4.76s-1.44,4.74-3.18,4.74-3.16-2.13-3.16-4.74,1.41-4.76,3.16-4.76' fill='%23AAAAAA'/%3E%3Cpath d='M69.46,41.14c1.74,0,3.16,2.13,3.16,4.76s-1.41,4.74-3.16,4.74-3.18-2.13-3.18-4.74,1.41-4.76,3.18-4.76' fill='%23AAAAAA'/%3E%3Cpath d='M63.91,76.15c-.82-.48-1.84-.43-2.8.12l-10.13,5.75-10.11-5.75c-.96-.55-1.98-.59-2.8-.12-.82.47-1.29,1.38-1.29,2.49v10.12c0,1.11.47,2.02,1.28,2.49.38.22.8.33,1.24.33.51,0,1.05-.15,1.57-.44l10.12-5.75,10.11,5.75c.52.29,1.05.44,1.56.44.44,0,.86-.11,1.24-.33.81-.48,1.28-1.38,1.28-2.49v-10.12c0-1.11-.47-2.02-1.28-2.49' fill='white' opacity='0.9'/%3E%3C/g%3E%3C/svg%3E\");\n}\n\n\n[_nghost-%COMP%] .mention-badge i.mj-icon-betty {\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'%3E%3Ccircle cx='50' cy='50' r='45' fill='%23FF6B6B'/%3E%3Ctext x='50' y='65' text-anchor='middle' font-size='40' fill='white' font-family='Arial, sans-serif' font-weight='bold'%3EB%3C/text%3E%3C/svg%3E\");\n}\n\n\n[_nghost-%COMP%] .mention-badge i.mj-icon-izzy {\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 204 180'%3E%3Cpath d='M0 0 C3.61144774 3.08477828 4.84942137 4.90830493 5.5 9.625 C5 13 5 13 3.5 14.9375 C1.74432121 17.35155834 1.83578869 18.21944114 1.90625 21.12890625 C1.9371875 22.40636719 1.968125 23.68382813 2 25 C3.18335937 24.72285156 4.36671875 24.44570313 5.5859375 24.16015625 C22.44010416 20.26839867 22.44010416 20.26839867 30 20 C31.80210938 19.92265625 31.80210938 19.92265625 33.640625 19.84375 C47.49356199 19.44904163 61.73614427 20.86627802 75 25 C75.53596907 19.64244551 75.53596907 19.64244551 73.5 15 C71.5549761 12.4066348 71.45048389 10.16629658 71.59375 6.97265625 C72.33633815 3.36681955 74.01253991 1.99164006 77 0 C79.80907914 -0.63997166 82.18961327 -0.63020793 85 0 C87.8100346 1.79363911 89.50940468 3.01880935 91 6 C90.984375 8.05859375 90.984375 8.05859375 90.75 10.4375 C90.68296875 11.21996094 90.6159375 12.00242187 90.546875 12.80859375 C90 15 90 15 88.49609375 16.3984375 C86.25734576 18.79500846 86.4852344 20.97464008 86.3125 24.1875 C86.21388672 25.81751953 86.21388672 25.81751953 86.11328125 27.48046875 C86.07589844 28.31191406 86.03851563 29.14335937 86 30 C86.67675781 30.0825 87.35351562 30.165 88.05078125 30.25 C91.82333306 31.20937741 94.89353787 32.99425194 98.1875 35 C99.18052124 35.60448975 99.18052124 35.60448975 100.19360352 36.22119141 C111.98050012 43.58460075 121.17745776 53.2687532 127 66 C127 66.66 127 67.32 127 68 C127.721875 68.0825 128.44375 68.165 129.1875 68.25 C133.81406141 69.48374971 136.2179022 71.66516963 138.625 75.7734375 C140.97801199 81.55147269 140.43210927 87.87027126 140.375 94 C140.38660156 95.24523437 140.39820313 96.49046875 140.41015625 97.7734375 C140.3675701 111.08870765 140.3675701 111.08870765 135.5 116.7421875 C131.62323281 119.66995439 128.8523137 121.14337998 124 121.125 C122.9790625 121.12886719 122.9790625 121.12886719 121.9375 121.1328125 C120 121 120 121 117 120 C116.74347656 120.65226562 116.48695313 121.30453125 116.22265625 121.9765625 C115.83980469 122.85054688 115.45695313 123.72453125 115.0625 124.625 C114.70285156 125.48351562 114.34320313 126.34203125 113.97265625 127.2265625 C108.57908063 134.80960941 99.56813916 137.59212379 91.0625 140.375 C90.02287109 140.72949219 88.98324219 141.08398438 87.91210938 141.44921875 C80.34347852 144 80.34347852 144 78 144 C78.02094727 144.65484375 78.04189453 145.3096875 78.06347656 145.984375 C78.14730383 148.98942328 78.19886895 151.99422464 78.25 155 C78.28351563 156.02996094 78.31703125 157.05992187 78.3515625 158.12109375 C78.43361416 164.56214867 77.93369275 169.71304442 74 175 C68.75523423 179.17440541 64.68195675 180.53237245 58 180 C55.12653443 178.963898 52.49379495 177.58020045 49.8125 176.125 C49.11447266 175.76019531 48.41644531 175.39539063 47.69726562 175.01953125 C46.39868999 174.33997216 45.10309803 173.65465367 43.81176758 172.96142578 C43.21388428 172.64415527 42.61600098 172.32688477 42 172 C41.34290039 171.59402588 40.68580078 171.18805176 40.00878906 170.76977539 C38.03672401 169.77639533 38.03672401 169.77639533 36.12475586 170.58325195 C35.49448486 170.96441162 34.86421387 171.34557129 34.21484375 171.73828125 C33.17166992 172.35026367 33.17166992 172.35026367 32.10742188 172.97460938 C31.39134766 173.41611328 30.67527344 173.85761719 29.9375 174.3125 C28.51029236 175.1647359 27.08194984 176.01507485 25.65234375 176.86328125 C25.02320068 177.24782471 24.39405762 177.63236816 23.74584961 178.02856445 C19.79572932 180.2265128 16.44037501 180.296025 12 180 C6.82155197 178.33236419 3.95074467 176.59004726 1 172 C-0.72417326 168.34258111 -1.2403609 165.51230089 -1.1953125 161.48046875 C-1.18886719 160.45888672 -1.18242188 159.43730469 -1.17578125 158.38476562 C-1.15902344 157.32966797 -1.14226563 156.27457031 -1.125 155.1875 C-1.11597656 154.11306641 -1.10695312 153.03863281 -1.09765625 151.93164062 C-1.07415306 149.28753146 -1.04129575 146.64388128 -1 144 C-1.63196289 143.81171631 -2.26392578 143.62343262 -2.91503906 143.42944336 C-8.20708475 141.84808949 -13.49207901 140.2541307 -18.75 138.5625 C-19.98234375 138.17191406 -21.2146875 137.78132812 -22.484375 137.37890625 C-29.06200008 134.79901552 -34.12925122 130.90130551 -38 125 C-38.875 121.5625 -38.875 121.5625 -39 119 C-39.495 119.33 -39.99 119.66 -40.5 120 C-45.24354984 121.89741993 -49.49426304 121.53143657 -54.1875 119.875 C-58.42051121 117.05299253 -61.35909664 113.92271008 -63 109 C-63.22709306 104.92471184 -63.22828659 100.8492307 -63.24023438 96.76806641 C-63.2498982 94.77103695 -63.28108516 92.77414948 -63.3125 90.77734375 C-63.36188158 78.59243786 -63.36188158 78.59243786 -60 73 C-57.7509823 70.86631654 -55.88785241 69.35340008 -53.0078125 68.20703125 C-50.3010212 66.57979679 -49.65488803 64.83796148 -48.3125 62 C-45.06106922 55.7428385 -40.95735135 50.97447519 -36 46 C-35.40832031 45.38511719 -34.81664063 44.77023438 -34.20703125 44.13671875 C-28.97373562 39.11136864 -17.47215548 30 -10 30 C-10.08733973 27.91589342 -10.19552278 25.83265331 -10.3125 23.75 C-10.37050781 22.58984375 -10.42851563 21.4296875 -10.48828125 20.234375 C-11.02905532 16.81635262 -11.84853545 15.59874271 -14 13 C-14.54046356 8.75350057 -14.48376179 6.74176808 -12.125 3.125 C-8.57275398 -0.42724602 -4.8825369 -0.970906 0 0 Z M5 35 C4.30245605 35.21962402 3.60491211 35.43924805 2.88623047 35.66552734 C-14.1501062 41.15773444 -29.02751477 50.81254544 -39 66 C-39.33 66.99 -39.66 67.98 -40 69 C-37.525 70.98 -37.525 70.98 -35 73 C-34.52691406 72.29875 -34.05382812 71.5975 -33.56640625 70.875 C-21.08320269 52.96537462 -2.17172019 42.38052109 19.26171875 38.5078125 C46.97805996 34.9959591 75.10426623 38.71529466 97.73046875 56.09765625 C103.53827054 61.07953766 107.9264808 66.53902088 112 73 C113.32 72.01 114.64 71.02 116 70 C115.01713954 61.60788376 107.55262518 55.04847712 101.375 49.8125 C82.80696113 35.82916208 61.35998978 30.59265576 38.375 30.625 C37.71836365 30.62554382 37.06172729 30.62608765 36.38519287 30.62664795 C25.42439402 30.66823796 15.42390121 31.62072499 5 35 Z' fill='%234E3B78' transform='translate(63,0)'/%3E%3Cpath d='M0 0 C5.27957047 5.78547525 9.31612861 13.25448014 10 21.125 C9.69743213 24.83293961 8.77676366 26.8914086 6.1875 29.5625 C-2.04152489 35.76003038 -13.60917874 39.6270706 -23.875 38.8125 C-24.535 38.1525 -25.195 37.4925 -25.875 36.8125 C-28.97847254 36.48234335 -31.03281176 36.30718706 -33.75 37.9375 C-35.40354531 40.69340884 -35.26865568 42.66325452 -34.875 45.8125 C-33.95833333 47.89583333 -33.95833333 47.89583333 -31.875 48.8125 C-28.29166667 48.89583333 -28.29166667 48.89583333 -24.875 47.8125 C-24.57086182 47.16466553 -24.26672363 46.51683105 -23.95336914 45.84936523 C-22.875 43.8125 -22.875 43.8125 -20.77124023 42.88696289 C-19.91731689 42.6883667 -19.06339355 42.48977051 -18.18359375 42.28515625 C-17.23806641 42.04990234 -16.29253906 41.81464844 -15.31835938 41.57226562 C-14.32642578 41.34216797 -13.33449219 41.11207031 -12.3125 40.875 C-4.77934417 39.10870895 1.54823541 36.95205932 8.125 32.8125 C7.81647145 40.06292099 4.56245219 45.32546918 -0.5 50.4609375 C-5.29811284 54.61130511 -8.83216751 54.86916719 -15 55 C-21.13677833 55.26569953 -25.04589225 56.51893716 -29.890625 60.31640625 C-39.17633501 67.31724667 -52.82450605 66.52799961 -63.875 65.8125 C-71.37432145 64.60538489 -79.4496824 61.2378176 -84.875 55.8125 C-86.81199027 55.70419517 -88.75076074 55.60687514 -90.69067383 55.58691406 C-97.68300211 55.51299157 -103.12007731 55.4392364 -108.44140625 50.40234375 C-108.91449219 49.87769531 -109.38757813 49.35304688 -109.875 48.8125 C-110.6175 48.090625 -111.36 47.36875 -112.125 46.625 C-118.35765562 36.60823203 -119.69570866 25.34707186 -117.25 13.8828125 C-113.47065738 3.0509466 -104.76645407 -4.0120534 -94.875 -9.1875 C-91.26850975 -10.75400624 -87.62602625 -12.0153043 -83.875 -13.1875 C-83.029375 -13.47496094 -82.18375 -13.76242188 -81.3125 -14.05859375 C-56.0861494 -22.29657387 -20.04377266 -18.06142152 0 0 Z' fill='%23FDFDFD' transform='translate(155.875,64.1875)'/%3E%3Cpath d='M0 0 C5.24479788 1.58079188 9.51172656 4.60408712 14.06640625 7.58984375 C18.37837094 10.28462973 18.37837094 10.28462973 23.30859375 11.1328125 C28.49696048 9.20971132 33.08639658 6.29555589 37.79882812 3.42578125 C43.66838131 -0.00837477 43.66838131 -0.00837477 47.27734375 0.078125 C49.34375 1.0078125 49.34375 1.0078125 51.34375 3.0078125 C51.82984303 7.30136192 51.71414913 11.62739332 51.71875 15.9453125 C51.74324219 17.15123047 51.76773438 18.35714844 51.79296875 19.59960938 C51.79876953 21.33114258 51.79876953 21.33114258 51.8046875 23.09765625 C51.81290527 24.15847412 51.82112305 25.21929199 51.82958984 26.31225586 C51.34375 29.0078125 51.34375 29.0078125 49.48461914 30.87670898 C46.29658529 32.56106989 44.78123809 32.062357 41.34375 31.0078125 C37.60135447 29.03986817 34.07891261 26.72386924 30.53320312 24.42578125 C26.44214688 21.80182316 26.44214688 21.80182316 21.77734375 20.921875 C17.60401055 22.78413283 13.85973006 25.2663764 10.046875 27.76953125 C5.85335687 30.41401513 2.44659272 31.9581498 -2.65625 32.0078125 C-4.33203125 30.87695312 -4.33203125 30.87695312 -5.65625 29.0078125 C-6.04443359 26.328125 -6.04443359 26.328125 -6.0546875 23.1328125 C-6.05855469 21.98296875 -6.06242187 20.833125 -6.06640625 19.6484375 C-6.05480469 18.44703125 -6.04320313 17.245625 -6.03125 16.0078125 C-6.04285156 14.80640625 -6.05445312 13.605 -6.06640625 12.3671875 C-6.06253906 11.21734375 -6.05867188 10.0675 -6.0546875 8.8828125 C-6.05130371 7.82835937 -6.04791992 6.77390625 -6.04443359 5.6875 C-5.65625 3.0078125 -5.65625 3.0078125 -4.29736328 1.14111328 C-2.65625 0.0078125 -2.65625 0.0078125 0 0 Z' fill='%23FCFCFD' transform='translate(78.65625,136.9921875)'/%3E%3Cpath d='M0 0 C2.5 0.625 2.5 0.625 4.8125 2.625 C6.96830116 6.4575354 7.24792603 9.32007692 6.5 13.625 C5.34367254 15.98793002 4.35016245 17.77483755 2.5 19.625 C0.1875 20 0.1875 20 -2.5 19.625 C-5.06638215 17.47478793 -6.29103188 15.79226637 -6.88671875 12.46484375 C-7.08084032 8.45522921 -6.77549931 6.12498023 -4.8125 2.5625 C-2.5 0.625 -2.5 0.625 0 0 Z' fill='%2353417C' transform='translate(138.5,67.375)'/%3E%3Cpath d='M0 0 C2.5 0.6875 2.5 0.6875 4.8125 2.625 C7.08407605 6.74748987 7.32547179 10.07653131 6.5 14.6875 C4.8125 17.75 4.8125 17.75 2.5 19.6875 C-0.0625 20.25 -0.0625 20.25 -2.5 19.6875 C-5.30401904 17.38419865 -5.84979387 14.76309142 -6.4375 11.3125 C-6.72853275 7.71913649 -6.44645777 6.57011897 -4.875 3.125 C-2.5 0.6875 -2.5 0.6875 0 0 Z' fill='%23523F7B' transform='translate(64.5,67.3125)'/%3E%3Cpath d='M0 0 C8.91 0 17.82 0 27 0 C24.81183076 5.47042311 24.169236 6.55141452 19 9 C14.08609728 9.94526984 9.88605617 10.13992406 5.51171875 7.49609375 C3.4733513 5.76185217 1.65854906 4.10051199 0 2 C0 1.34 0 0.68 0 0 Z' fill='%23574680' transform='translate(88,95)'/%3E%3C/svg%3E\");\n}\n\n\n[_nghost-%COMP%] .mention-badge img {\n width: 16px;\n height: 16px;\n border-radius: 50%;\n object-fit: cover;\n vertical-align: middle;\n}\n\n[_nghost-%COMP%] .mention-badge:hover {\n transform: translateY(-1px);\n box-shadow: var(--mj-shadow-lg);\n}\n\n\n\n[_nghost-%COMP%] .mention-badge .preset-indicator {\n display: inline-block;\n font-size: 10px;\n font-weight: 600;\n font-family: 'SF Mono', 'Monaco', 'Inconsolata', 'Roboto Mono', 'Courier New', monospace;\n background: rgba(255, 255, 255, 0.25);\n padding: 2px 6px;\n border-radius: 4px;\n margin-left: 4px;\n letter-spacing: 0.3px;\n text-transform: uppercase;\n border: 1px solid rgba(255, 255, 255, 0.15);\n}\n\n.message-avatar[_ngcontent-%COMP%] {\n flex-shrink: 0;\n}\n\n.avatar-circle[_ngcontent-%COMP%] {\n width: 36px;\n height: 36px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 16px;\n color: var(--mj-text-inverse);\n}\n\n\n.avatar-circle.user-avatar[_ngcontent-%COMP%] {\n border-radius: 50%;\n background-color: var(--mj-text-primary);\n}\n\n\n.avatar-circle.ai-avatar[_ngcontent-%COMP%] {\n border-radius: 8px;\n background-color: var(--mj-brand-primary); \n}\n\n\n\n\n\n\n.avatar-circle.ai-avatar.avatar-has-image[_ngcontent-%COMP%] {\n background-color: transparent;\n overflow: hidden;\n}\n.avatar-circle.ai-avatar[_ngcontent-%COMP%] .avatar-image[_ngcontent-%COMP%] {\n border-radius: inherit;\n}\n\n.avatar-image[_ngcontent-%COMP%] {\n width: 100%;\n height: 100%;\n object-fit: cover;\n border-radius: 50%;\n}\n\n\n\n.artifact-pending[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n padding: 12px 16px;\n}\n\n\n.artifact-wrapper.system-artifact[_ngcontent-%COMP%] {\n opacity: 0.85;\n position: relative;\n}\n\n.artifact-wrapper.system-artifact[_ngcontent-%COMP%]::before {\n content: 'SYSTEM';\n position: absolute;\n top: 8px;\n right: 8px;\n font-size: 9px;\n font-weight: 600;\n color: var(--mj-text-muted);\n background: var(--mj-bg-surface-sunken);\n padding: 2px 6px;\n border-radius: 3px;\n letter-spacing: 0.5px;\n z-index: 10;\n}\n\n.message-content[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n position: relative;\n}\n\n.message-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 4px;\n font-size: 13px;\n}\n\n.message-sender[_ngcontent-%COMP%] {\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n\n.agent-badge[_ngcontent-%COMP%] {\n display: inline-block;\n padding: 2px 8px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 10px;\n font-size: 11px;\n color: var(--mj-text-secondary);\n font-weight: 500;\n}\n\n.message-time[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n font-size: 12px;\n font-weight: 400;\n}\n\n\n\n\n\n\n\n.time-pill[_ngcontent-%COMP%], \n.test-feedback-icon[_ngcontent-%COMP%], \n.agent-run-icon[_ngcontent-%COMP%], \n.message-edit-icon[_ngcontent-%COMP%] {\n margin-left: auto;\n}\n.time-pill[_ngcontent-%COMP%] ~ .test-feedback-icon[_ngcontent-%COMP%], \n.time-pill[_ngcontent-%COMP%] ~ .agent-run-icon[_ngcontent-%COMP%], \n.test-feedback-icon[_ngcontent-%COMP%] ~ .agent-run-icon[_ngcontent-%COMP%], \n.message-edit-icon[_ngcontent-%COMP%] ~ .test-feedback-icon[_ngcontent-%COMP%], \n.message-edit-icon[_ngcontent-%COMP%] ~ .agent-run-icon[_ngcontent-%COMP%] {\n margin-left: 8px;\n}\n\n\n.message-edit-icon[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 20px;\n height: 20px;\n color: var(--mj-text-muted);\n cursor: pointer;\n transition: all 0.2s ease;\n opacity: 0;\n}\n.message-item[_ngcontent-%COMP%]:hover .message-edit-icon[_ngcontent-%COMP%], \n.message-edit-icon[_ngcontent-%COMP%]:focus-visible {\n opacity: 1;\n}\n.message-edit-icon[_ngcontent-%COMP%]:hover {\n color: var(--mj-text-secondary);\n}\n.message-edit-icon[_ngcontent-%COMP%] i.fa-pen[_ngcontent-%COMP%] {\n font-size: 12px;\n}\n\n\n.time-pill[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 2px 8px;\n border-radius: 10px;\n font-size: 11px;\n font-weight: 500;\n transition: all 0.3s ease;\n}\n\n.time-pill[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 10px;\n}\n\n\n.time-pill.complete[_ngcontent-%COMP%] {\n background: var(--mj-status-info-bg);\n color: var(--mj-status-info-text);\n}\n\n\n.time-pill.in-progress[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n\n.time-pill.active[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n\n.time-pill.failed[_ngcontent-%COMP%] {\n background: var(--mj-status-error-bg);\n color: var(--mj-status-error-text);\n}\n\n@keyframes _ngcontent-%COMP%_pillPulse {\n 0%, 100% {\n opacity: 1;\n }\n 50% {\n opacity: 0.85;\n }\n}\n\n\n.generation-time[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 2px 8px;\n background: var(--mj-status-info-bg);\n border-radius: 10px;\n font-size: 11px;\n color: var(--mj-status-info-text);\n font-weight: 500;\n margin-left: auto;\n}\n\n.generation-time[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 10px;\n}\n\n\n.message-elapsed[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n font-size: 11px;\n font-style: italic;\n}\n\n.message-body[_ngcontent-%COMP%] {\n margin-bottom: 0;\n}\n\n.message-text[_ngcontent-%COMP%] {\n color: var(--mj-text-primary);\n line-height: 1.5;\n word-wrap: break-word;\n}\n\n\n.message-text[_ngcontent-%COMP%] mj-markdown[_ngcontent-%COMP%] > [_ngcontent-%COMP%]:first-child, \n.message-text[_ngcontent-%COMP%] .mj-markdown-container > :first-child {\n margin-top: 0;\n}\n\n.message-text[_ngcontent-%COMP%] mj-markdown[_ngcontent-%COMP%] > [_ngcontent-%COMP%]:last-child, \n.message-text[_ngcontent-%COMP%] .mj-markdown-container > :last-child {\n margin-bottom: 0;\n}\n\n\n.message-item.user-message[_ngcontent-%COMP%] .message-content[_ngcontent-%COMP%] {\n border-radius: 12px 12px 12px 4px;\n}\n\n.message-item.ai-message[_ngcontent-%COMP%] .message-content[_ngcontent-%COMP%] {\n border-radius: 4px 12px 12px 12px;\n}\n\n\n.message-reactions[_ngcontent-%COMP%] {\n display: none; \n}\n\n\n.artifact-card[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 12px;\n margin-top: 12px;\n padding: 16px;\n border: 1px solid color-mix(in srgb, var(--mj-text-primary) 8%, transparent);\n border-radius: 8px;\n background: color-mix(in srgb, var(--mj-brand-primary) 5%, var(--mj-bg-surface));\n cursor: pointer;\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n max-width: 500px;\n box-shadow: var(--mj-shadow-sm);\n position: relative;\n overflow: hidden;\n}\n\n.artifact-card[_ngcontent-%COMP%]::before {\n content: '';\n position: absolute;\n left: 0;\n top: 0;\n bottom: 0;\n width: 3px;\n background: var(--mj-brand-primary);\n opacity: 1;\n}\n\n.artifact-card[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n border-color: color-mix(in srgb, var(--mj-brand-primary) 30%, transparent);\n box-shadow: var(--mj-shadow-md);\n transform: translateY(-1px);\n}\n\n.artifact-card-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n}\n\n.artifact-card-icon[_ngcontent-%COMP%] {\n width: 36px;\n height: 36px;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-brand-primary);\n flex-shrink: 0;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n border-radius: 6px;\n transition: all 0.2s ease;\n}\n\n.artifact-card[_ngcontent-%COMP%]:hover .artifact-card-icon[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n transform: scale(1.05);\n}\n\n.artifact-card-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 18px;\n}\n\n.artifact-card-content[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n}\n\n.artifact-card-label[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n letter-spacing: -0.01em;\n margin-bottom: 4px;\n}\n\n.artifact-card-description[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-text-secondary);\n line-height: 1.5;\n}\n\n.message-actions[_ngcontent-%COMP%] {\n position: absolute;\n bottom: 8px;\n right: 8px;\n display: flex;\n gap: 2px;\n opacity: 0;\n transform: translateY(4px);\n transition: all 200ms cubic-bezier(0.4, 0, 0.2, 1);\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n padding: 4px;\n box-shadow: var(--mj-shadow-md);\n pointer-events: none;\n}\n\n.message-item[_ngcontent-%COMP%]:hover .message-actions[_ngcontent-%COMP%] {\n opacity: 1;\n transform: translateY(0);\n pointer-events: auto;\n}\n\n.message-action-btn[_ngcontent-%COMP%] {\n padding: 6px 8px;\n background: transparent;\n border: none;\n border-radius: 6px;\n cursor: pointer;\n color: var(--mj-text-secondary);\n font-size: 13px;\n transition: all 150ms ease;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 32px;\n height: 32px;\n}\n\n.message-action-btn[_ngcontent-%COMP%]:hover {\n background-color: var(--mj-bg-surface-sunken);\n color: var(--mj-text-primary);\n}\n\n.message-action-btn.danger[_ngcontent-%COMP%]:hover {\n background-color: var(--mj-status-error-bg);\n color: var(--mj-status-error);\n}\n\n.message-action-btn.retry-btn[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n font-weight: 600;\n gap: 6px;\n padding: 6px 12px;\n min-width: auto;\n}\n\n.message-action-btn.retry-btn[_ngcontent-%COMP%]:hover {\n background-color: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n color: var(--mj-brand-primary-hover);\n}\n\n\n.thread-indicator[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n margin-top: 8px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n border-radius: 16px;\n cursor: pointer;\n transition: all 150ms ease;\n font-size: 12px;\n color: var(--mj-brand-primary-hover);\n font-weight: 500;\n}\n\n.thread-indicator[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n border-color: color-mix(in srgb, var(--mj-brand-primary) 30%, transparent);\n transform: translateY(-1px);\n box-shadow: var(--mj-shadow-sm);\n}\n\n.thread-indicator[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 14px;\n}\n\n.thread-count[_ngcontent-%COMP%] {\n font-weight: 600;\n}\n\n\n.message-item.editing[_ngcontent-%COMP%] {\n background-color: var(--mj-status-warning-bg);\n border-left: 3px solid var(--mj-status-warning);\n}\n\n.message-edit-container[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.message-edit-textarea[_ngcontent-%COMP%] {\n width: 100%;\n padding: 12px;\n border: 1px solid var(--mj-border-strong);\n border-radius: 6px;\n font-family: inherit;\n font-size: 14px;\n line-height: 1.6;\n resize: vertical;\n min-height: 80px;\n transition: border-color 150ms ease;\n}\n\n.message-edit-textarea[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 2px color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n}\n\n.edit-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n}\n\n.edit-action-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 8px 16px;\n border: none;\n border-radius: 6px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: all 150ms ease;\n}\n\n.edit-action-btn.save[_ngcontent-%COMP%] {\n background-color: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n}\n\n.edit-action-btn.save[_ngcontent-%COMP%]:hover {\n background-color: var(--mj-brand-primary-hover);\n}\n\n.edit-action-btn.cancel[_ngcontent-%COMP%] {\n background-color: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n}\n\n.edit-action-btn.cancel[_ngcontent-%COMP%]:hover {\n background-color: var(--mj-border-default);\n color: var(--mj-text-primary);\n}\n\n.edit-hint[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-muted);\n font-style: italic;\n}\n\n.edited-badge[_ngcontent-%COMP%] {\n margin-left: 8px;\n font-size: 11px;\n color: var(--mj-text-muted);\n font-style: italic;\n font-weight: normal;\n}\n\n\n.message-action-bar[_ngcontent-%COMP%] {\n margin-top: 12px;\n margin-bottom: 8px;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n padding: 12px;\n}\n\n.action-bar-container[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 16px;\n}\n\n.action-buttons[_ngcontent-%COMP%] {\n display: flex;\n gap: 4px;\n margin-left: 16px;\n padding-left: 16px;\n border-left: 1px solid var(--mj-border-default);\n}\n\n.action-bar-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 6px 10px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-text-muted);\n border-radius: 6px;\n font-size: 16px;\n line-height: 1;\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.2s;\n min-width: 36px;\n height: 32px;\n opacity: 0.6;\n}\n\n.action-bar-btn[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 16px;\n line-height: 1;\n}\n\n.action-bar-btn[_ngcontent-%COMP%]:hover {\n opacity: 1;\n border-color: var(--mj-text-secondary);\n}\n\n.action-bar-btn.danger[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n}\n\n.action-bar-btn.danger[_ngcontent-%COMP%]:hover {\n opacity: 1;\n background: var(--mj-status-error-bg);\n border-color: var(--mj-status-error);\n}\n\n.action-bar-btn[_ngcontent-%COMP%] i.pinned[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n.action-bar-btn.test-feedback[_ngcontent-%COMP%] {\n color: var(--mj-status-warning);\n}\n\n.action-bar-btn.test-feedback[_ngcontent-%COMP%]:hover {\n opacity: 1;\n background: var(--mj-status-warning-bg);\n border-color: var(--mj-status-warning);\n}\n\n\n.message-status[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n font-size: 12px;\n color: var(--mj-text-secondary);\n padding: 2px 8px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 4px;\n margin-left: 8px;\n animation: _ngcontent-%COMP%_statusPulse 2s ease-in-out infinite;\n}\n\n.message-status[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-size: 11px;\n}\n\n.message-status.error[_ngcontent-%COMP%] {\n background: var(--mj-status-error-bg);\n color: var(--mj-status-error);\n}\n\n.message-status.error[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n}\n\n.status-text[_ngcontent-%COMP%] {\n font-weight: 500;\n}\n\n@keyframes _ngcontent-%COMP%_statusPulse {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.7; }\n}\n\n\n\n\n\n\n\n\n\n.agent-run-icon[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 20px;\n height: 20px;\n color: var(--mj-text-muted);\n cursor: pointer;\n transition: all 0.2s ease;\n user-select: none;\n}\n\n.agent-run-icon[_ngcontent-%COMP%] i.fa-cog[_ngcontent-%COMP%] {\n font-size: 13px;\n}\n\n.agent-run-icon[_ngcontent-%COMP%]:hover {\n color: var(--mj-text-secondary);\n}\n\n.agent-run-icon.expanded[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n transform: scale(1.1);\n}\n\n\n\n.test-feedback-icon[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 20px;\n height: 20px;\n color: var(--mj-text-muted);\n cursor: pointer;\n transition: all 0.2s ease;\n user-select: none;\n}\n\n.test-feedback-icon[_ngcontent-%COMP%] i.fa-flask[_ngcontent-%COMP%] {\n font-size: 13px;\n}\n\n.test-feedback-icon[_ngcontent-%COMP%]:hover {\n color: var(--mj-brand-primary); \n transform: scale(1.1);\n}\n\n@keyframes _ngcontent-%COMP%_rotate {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n\n\n.agent-details-panel[_ngcontent-%COMP%] {\n margin-top: 12px;\n padding: 16px;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n animation: _ngcontent-%COMP%_slideDown 0.2s ease;\n}\n\n@keyframes _ngcontent-%COMP%_slideDown {\n from {\n opacity: 0;\n transform: translateY(-10px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n\n.agent-details-loading[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n color: var(--mj-text-secondary);\n font-size: 13px;\n}\n\n.agent-details-loading[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n\n.agent-details-error[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n color: var(--mj-status-error);\n font-size: 13px;\n}\n\n.agent-details-error[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n}\n\n\n.agent-details-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 12px;\n padding-bottom: 8px;\n border-bottom: 1px solid var(--mj-border-default);\n font-weight: 600;\n font-size: 13px;\n color: var(--mj-text-primary);\n}\n\n.agent-details-header[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n.agent-name-link[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n cursor: pointer;\n text-decoration: none;\n font-weight: 600;\n transition: all 0.2s ease;\n}\n\n.agent-name-link[_ngcontent-%COMP%]:hover {\n color: var(--mj-brand-primary-hover);\n text-decoration: underline;\n}\n\n\n.agent-details-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 12px;\n margin-bottom: 12px;\n}\n\n.detail-row[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n padding: 8px 12px;\n background: var(--mj-bg-surface-card);\n border-radius: 6px;\n border: 1px solid var(--mj-border-default);\n}\n\n.detail-label[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-secondary);\n font-weight: 500;\n}\n\n.detail-value[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-text-primary);\n font-weight: 600;\n font-family: 'Monaco', 'Menlo', 'Consolas', monospace;\n}\n\n\n.status-badge[_ngcontent-%COMP%] {\n padding: 3px 8px;\n border-radius: 10px;\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n}\n\n.status-badge.status-pending[_ngcontent-%COMP%] {\n background: var(--mj-status-warning-bg);\n color: var(--mj-status-warning-text);\n}\n\n.status-badge.status-running[_ngcontent-%COMP%] {\n background: var(--mj-status-info-bg);\n color: var(--mj-status-info-text);\n}\n\n.status-badge.status-complete[_ngcontent-%COMP%] {\n background: var(--mj-status-success-bg);\n color: var(--mj-status-success-text);\n}\n\n.status-badge.status-failed[_ngcontent-%COMP%], \n.status-badge.status-error[_ngcontent-%COMP%] {\n background: var(--mj-status-error-bg);\n color: var(--mj-status-error-text);\n}\n\n.status-badge.status-cancelled[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n}\n\n\n.run-id-link[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n cursor: pointer;\n text-decoration: none;\n display: inline-flex;\n align-items: center;\n gap: 4px;\n transition: all 0.2s ease;\n}\n\n.run-id-link[_ngcontent-%COMP%]:hover {\n color: var(--mj-brand-primary-hover);\n text-decoration: underline;\n}\n\n.run-id-link[_ngcontent-%COMP%] i.fa-external-link-alt[_ngcontent-%COMP%] {\n font-size: 10px;\n opacity: 0.7;\n}\n\n\n.agent-details-tasks[_ngcontent-%COMP%] {\n margin-top: 16px;\n padding-top: 16px;\n border-top: 1px solid var(--mj-border-default);\n}\n\n.tasks-section-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 12px;\n font-weight: 600;\n font-size: 12px;\n color: var(--mj-text-primary);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.tasks-section-header[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-size: 11px;\n}\n\n.tasks-list[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n\n.tasks-list[_ngcontent-%COMP%] mj-task-widget[_ngcontent-%COMP%] {\n display: block;\n}\n\n\n.artifact-version-badge[_ngcontent-%COMP%] {\n display: inline-block;\n margin-left: 8px;\n padding: 2px 8px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-size: 11px;\n font-weight: 600;\n font-family: monospace;\n border-radius: 4px;\n vertical-align: middle;\n}\n\n\n.message-footer[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-top: 8px;\n padding-top: 8px;\n border-top: 1px solid var(--mj-border-default);\n}\n\n.rating-counts[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n font-size: 13px;\n color: var(--mj-text-secondary);\n}\n\n.rating-count[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.rating-count.thumbs-up[_ngcontent-%COMP%] {\n color: var(--mj-status-success);\n}\n\n.rating-count.thumbs-down[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n}\n\n.rating-total[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n\n.inline-delete[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n}\n\n.message-item.pinned[_ngcontent-%COMP%] {\n border-left: 3px solid var(--mj-status-warning);\n background-color: color-mix(in srgb, var(--mj-status-warning) 8%, transparent);\n}\n\n\n.ai-message-actions[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-left: auto;\n}\n\n.action-bar-btn.pin-btn[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n}\n\n.action-bar-btn.pin-btn[_ngcontent-%COMP%]:hover {\n color: var(--mj-status-warning);\n border-color: var(--mj-status-warning);\n}\n\n.action-bar-btn.pin-btn.pinned[_ngcontent-%COMP%] {\n opacity: 1;\n color: var(--mj-status-warning);\n border-color: var(--mj-status-warning-border);\n background: color-mix(in srgb, var(--mj-status-warning) 10%, var(--mj-bg-surface));\n}\n\n\n.agent-panel-actions[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 8px 0 0;\n margin-top: 8px;\n border-top: 1px solid var(--mj-border-subtle);\n}\n\n\n.agent-details-section[_ngcontent-%COMP%] {\n margin-top: 8px;\n}\n\n\n@media (max-width: 768px) {\n .message-item[_ngcontent-%COMP%] {\n padding: 8px 12px;\n gap: 8px;\n }\n\n .avatar-circle[_ngcontent-%COMP%] {\n width: 32px;\n height: 32px;\n font-size: 14px;\n }\n\n .artifact-card[_ngcontent-%COMP%] {\n max-width: 90vw;\n padding: 12px;\n }\n\n .artifact-card-icon[_ngcontent-%COMP%] {\n width: 32px;\n height: 32px;\n }\n\n .artifact-card-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 16px;\n }\n\n .message-header[_ngcontent-%COMP%] {\n font-size: 12px;\n }\n\n .message-sender[_ngcontent-%COMP%] {\n font-size: 12px;\n }\n\n .message-time[_ngcontent-%COMP%] {\n font-size: 11px;\n }\n\n .agent-badge[_ngcontent-%COMP%] {\n font-size: 10px;\n padding: 1px 6px;\n }\n\n .time-pill[_ngcontent-%COMP%] {\n font-size: 10px;\n padding: 2px 6px;\n }\n\n .message-actions[_ngcontent-%COMP%] {\n gap: 1px;\n padding: 3px;\n }\n\n .message-action-btn[_ngcontent-%COMP%] {\n min-width: 28px;\n height: 28px;\n font-size: 12px;\n }\n}\n\n\n@media (max-width: 480px) {\n .message-item[_ngcontent-%COMP%] {\n padding: 6px 8px;\n gap: 6px;\n }\n\n .avatar-circle[_ngcontent-%COMP%] {\n width: 28px;\n height: 28px;\n font-size: 12px;\n }\n\n .avatar-circle.ai-avatar[_ngcontent-%COMP%] {\n border-radius: 6px;\n }\n\n .artifact-card[_ngcontent-%COMP%] {\n padding: 10px;\n margin-top: 8px;\n }\n\n .artifact-card-header[_ngcontent-%COMP%] {\n gap: 8px;\n }\n\n .artifact-card-icon[_ngcontent-%COMP%] {\n width: 28px;\n height: 28px;\n }\n\n .artifact-card-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 14px;\n }\n\n .artifact-card-label[_ngcontent-%COMP%] {\n font-size: 13px;\n }\n\n .artifact-card-description[_ngcontent-%COMP%] {\n font-size: 12px;\n }\n\n .message-header[_ngcontent-%COMP%] {\n font-size: 11px;\n gap: 6px;\n }\n\n .message-sender[_ngcontent-%COMP%] {\n font-size: 11px;\n }\n\n .message-time[_ngcontent-%COMP%] {\n font-size: 10px;\n }\n\n .agent-badge[_ngcontent-%COMP%] {\n font-size: 9px;\n padding: 1px 5px;\n }\n\n .time-pill[_ngcontent-%COMP%] {\n font-size: 9px;\n padding: 1px 5px;\n }\n\n .thread-indicator[_ngcontent-%COMP%] {\n padding: 4px 8px;\n font-size: 11px;\n margin-top: 6px;\n }\n\n .agent-details-panel[_ngcontent-%COMP%] {\n padding: 12px;\n margin-top: 8px;\n }\n\n .agent-details-grid[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n gap: 8px;\n }\n\n .detail-row[_ngcontent-%COMP%] {\n padding: 6px 8px;\n }\n\n .detail-label[_ngcontent-%COMP%], \n .detail-value[_ngcontent-%COMP%] {\n font-size: 11px;\n }\n}\n\n\n[_nghost-%COMP%] .form-response-pill {\n margin: 0 3px;\n transition: all 0.2s ease;\n}\n\n\n[_nghost-%COMP%] .form-response-pill.single-field {\n display: inline-flex;\n align-items: center;\n vertical-align: middle;\n gap: 6px;\n padding: 4px 12px;\n background: var(--mj-status-success);\n color: var(--mj-text-inverse);\n border: 2px solid color-mix(in srgb, var(--mj-status-success) 40%, transparent);\n border-radius: 16px;\n font-size: 13px;\n font-weight: 600;\n box-shadow: var(--mj-shadow-md);\n cursor: default;\n white-space: nowrap;\n}\n\n\n[_nghost-%COMP%] .form-response-pill.multi-field {\n display: inline-block;\n max-width: min(800px, 100%);\n width: auto;\n min-width: 400px;\n margin: 8px 0;\n vertical-align: top;\n}\n\n[_nghost-%COMP%] .form-response-pill.single-field i {\n font-size: 11px;\n opacity: 0.95;\n}\n\n[_nghost-%COMP%] .form-response-pill.single-field strong {\n font-weight: 600;\n margin-right: 4px;\n}\n\n\n[_nghost-%COMP%] .form-response-pill .pill-header {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n background: var(--mj-status-success);\n color: var(--mj-text-inverse);\n font-weight: 600;\n font-size: 13px;\n border-radius: 12px 12px 0 0;\n border: 2px solid color-mix(in srgb, var(--mj-status-success) 40%, transparent);\n border-bottom: none;\n box-shadow: var(--mj-shadow-md);\n}\n\n[_nghost-%COMP%] .form-response-pill .pill-header i {\n font-size: 12px;\n opacity: 0.95;\n}\n\n[_nghost-%COMP%] .form-response-pill .pill-fields {\n padding: 10px 12px;\n background: color-mix(in srgb, var(--mj-status-success) 8%, transparent);\n border: 2px solid color-mix(in srgb, var(--mj-status-success) 40%, transparent);\n border-top: none;\n border-radius: 0 0 12px 12px;\n}\n\n[_nghost-%COMP%] .form-response-pill .pill-field {\n display: flex;\n flex-direction: column;\n gap: 6px;\n padding: 12px 0;\n font-size: 13px;\n}\n\n[_nghost-%COMP%] .form-response-pill .pill-field:not(:last-child) {\n border-bottom: 1px solid color-mix(in srgb, var(--mj-status-success) 20%, transparent);\n padding-bottom: 12px;\n margin-bottom: 0;\n}\n\n[_nghost-%COMP%] .form-response-pill .field-question {\n font-weight: 600;\n color: var(--mj-status-success);\n font-size: 12px;\n line-height: 1.4;\n text-transform: uppercase;\n letter-spacing: 0.3px;\n opacity: 0.9;\n}\n\n[_nghost-%COMP%] .form-response-pill .field-answer {\n color: var(--mj-text-primary);\n font-weight: 400;\n font-size: 15px;\n line-height: 1.6;\n padding: 8px 0 8px 12px;\n background: transparent;\n border-left: 3px solid color-mix(in srgb, var(--mj-status-success) 40%, transparent);\n font-style: italic;\n}\n\n\n\n[_nghost-%COMP%] .form-response-pill.single-field:hover {\n transform: translateY(-1px);\n box-shadow: var(--mj-shadow-lg);\n}\n\n[_nghost-%COMP%] .form-response-pill.multi-field:hover {\n transform: translateY(-1px);\n}\n\n[_nghost-%COMP%] .form-response-pill.multi-field:hover .pill-header {\n box-shadow: var(--mj-shadow-lg);\n}\n\n\n@media (max-width: 600px) {\n [_nghost-%COMP%] .form-response-pill.multi-field {\n min-width: 300px;\n }\n}\n\n@media (max-width: 400px) {\n [_nghost-%COMP%] .form-response-pill.multi-field {\n min-width: 100%;\n }\n\n [_nghost-%COMP%] .form-response-pill .field-question {\n font-size: 11px;\n }\n\n [_nghost-%COMP%] .form-response-pill .field-answer {\n font-size: 14px;\n padding: 6px 0 6px 10px;\n }\n}\n\n\n\n.message-attachments[_ngcontent-%COMP%] {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n margin-top: 12px;\n margin-bottom: 8px;\n}\n\n.attachment-item[_ngcontent-%COMP%] {\n position: relative;\n border-radius: 8px;\n overflow: hidden;\n cursor: pointer;\n transition: transform 0.2s, box-shadow 0.2s;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid color-mix(in srgb, var(--mj-text-primary) 10%, transparent);\n}\n\n.attachment-item[_ngcontent-%COMP%]:hover {\n transform: scale(1.02);\n box-shadow: var(--mj-shadow-md);\n}\n\n.attachment-item.image-attachment[_ngcontent-%COMP%] {\n width: 200px;\n height: 150px;\n}\n\n.attachment-thumbnail[_ngcontent-%COMP%] {\n width: 100%;\n height: 100%;\n object-fit: cover;\n display: block;\n}\n\n.attachment-overlay[_ngcontent-%COMP%] {\n position: absolute;\n inset: 0;\n background: var(--mj-bg-overlay);\n display: flex;\n align-items: center;\n justify-content: center;\n opacity: 0;\n transition: opacity 0.2s;\n}\n\n.attachment-item[_ngcontent-%COMP%]:hover .attachment-overlay[_ngcontent-%COMP%] {\n opacity: 1;\n}\n\n.attachment-overlay[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-text-inverse);\n font-size: 24px;\n}\n\n\n\n\n.attachment-strip[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 8px 12px 8px 8px;\n width: 320px;\n max-width: 100%;\n min-height: 56px;\n cursor: pointer;\n border-radius: 8px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n transition: background 0.15s, border-color 0.15s;\n}\n\n.attachment-strip[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-border-strong);\n}\n\n.attachment-badge[_ngcontent-%COMP%] {\n flex: 0 0 auto;\n min-width: 48px;\n height: 48px;\n padding: 0 10px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 6px;\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n font-size: 11px;\n font-weight: 700;\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-secondary);\n border: 1px solid var(--mj-border-subtle);\n user-select: none;\n text-align: center;\n line-height: 1;\n white-space: nowrap;\n}\n\n.attachment-strip.is-artifact[_ngcontent-%COMP%] .attachment-badge[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n border-color: color-mix(in srgb, var(--mj-brand-primary) 25%, transparent);\n}\n\n.attachment-meta[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n min-width: 0; \n gap: 2px;\n}\n\n.attachment-strip[_ngcontent-%COMP%] .file-name[_ngcontent-%COMP%] {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-primary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.attachment-strip[_ngcontent-%COMP%] .file-size[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-muted);\n}\n\n\n@media (max-width: 600px) {\n .attachment-item.image-attachment[_ngcontent-%COMP%] {\n width: 150px;\n height: 112px;\n }\n\n .attachment-strip[_ngcontent-%COMP%] {\n width: 100%;\n }\n}\n\n[_nghost-%COMP%] .form-response-pill .field-answer-markdown {\n font-style: normal; \n font-size: 13.5px;\n line-height: 1.6;\n color: var(--mj-text-primary);\n}\n[_nghost-%COMP%] .form-response-pill .field-answer-markdown h1, \n[_nghost-%COMP%] .form-response-pill .field-answer-markdown h2, \n[_nghost-%COMP%] .form-response-pill .field-answer-markdown h3, \n[_nghost-%COMP%] .form-response-pill .field-answer-markdown h4 {\n font-size: 13.5px;\n font-weight: 700;\n margin: 10px 0 4px;\n color: var(--mj-text-primary);\n}\n[_nghost-%COMP%] .form-response-pill .field-answer-markdown p {\n margin: 6px 0;\n}\n[_nghost-%COMP%] .form-response-pill .field-answer-markdown ul, \n[_nghost-%COMP%] .form-response-pill .field-answer-markdown ol {\n margin: 6px 0;\n padding-left: 22px;\n}\n[_nghost-%COMP%] .form-response-pill .field-answer-markdown li {\n margin: 3px 0;\n}\n[_nghost-%COMP%] .form-response-pill .field-answer-markdown code {\n font-size: 12px;\n padding: 1px 5px;\n border-radius: 4px;\n background: color-mix(in srgb, var(--mj-status-success) 12%, transparent);\n}\n[_nghost-%COMP%] .form-response-pill .field-answer-markdown table {\n border-collapse: collapse;\n margin: 8px 0;\n}\n[_nghost-%COMP%] .form-response-pill .field-answer-markdown th, \n[_nghost-%COMP%] .form-response-pill .field-answer-markdown td {\n border: 1px solid color-mix(in srgb, var(--mj-status-success) 25%, transparent);\n padding: 4px 10px;\n font-size: 12.5px;\n}", "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n[class^=\"mj-icon-\"][_ngcontent-%COMP%], \n[class*=\" mj-icon-\"][_ngcontent-%COMP%] {\n font-style: normal;\n font-variant: normal;\n text-rendering: auto;\n -webkit-font-smoothing: antialiased;\n display: inline-block;\n font-size: inherit;\n line-height: 1;\n}\n\n\n\n\n\n\n\n\n\n.mj-icon-skip[_ngcontent-%COMP%] {\n width: 1.4em;\n height: 1.4em;\n display: inline-block;\n background-size: contain;\n background-repeat: no-repeat;\n background-position: center;\n \n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 101.89918457031249 96.83947368421053'%3E%3Cg transform='translate(-0.1288232421875,-0.0)'%3E%3Cpath d='M93.85,41.56c-.84,0-1.62.2-2.37.55-3-4.35-7.49-8.12-13.04-11.04l.04-7.18v-14.44h-10.24v17.6c-1.52-.43-3.07-.8-4.67-1.11V0h-10.24v24.72s-.09,0-.14,0h-4.38s-.1,0-.14,0V7.3h-10.24v18.62c-1.6.32-3.15.69-4.67,1.11v-11.67h-10.24v6.09l.04,9.6c-5.55,2.92-10.04,6.7-13.04,11.04-.75-.35-1.53-.55-2.37-.55-4.5,0-8.14,5.61-8.14,12.51s3.64,12.53,8.14,12.53c.58,0,1.14-.12,1.67-.29,4.1,6.62,11.54,12.06,20.98,15.28l.79.13v7.05c0,2.97,1.45,5.58,3.87,6.99,1.18.69,2.5,1.04,3.85,1.03,1.4,0,2.83-.37,4.15-1.12l7.54-4.29,7.56,4.3c1.31.74,2.73,1.12,4.13,1.12s2.67-.35,3.85-1.04c2.42-1.41,3.86-4.02,3.86-6.98v-7.05l.79-.13c9.44-3.22,16.89-8.66,20.98-15.28.54.17,1.09.29,1.68.29,4.5,0,8.14-5.61,8.14-12.53s-3.63-12.51-8.14-12.51' fill='%23AAAAAA'/%3E%3Cpath d='M86.69,50.87c0-12.22-13.6-19.1-28.94-20.66-4.48-.47-9.19-.54-13.52,0-15.34,1.53-28.93,8.41-28.93,20.66,0,8.55,5.7,15.55,12.68,15.55h7.94c3.05,2.5,6.93,4.1,11.08,4.71,2.65.4,5.44.46,8.01,0,4.15-.6,8.05-2.2,11.1-4.71h7.92c6.97,0,12.68-7,12.68-15.55' fill='white' opacity='0.9'/%3E%3Cpath d='M57.83,55.82c-1.19,2.58-3.8,4.35-6.84,4.35s-5.65-1.77-6.84-4.35h13.68Z' fill='%23AAAAAA'/%3E%3Cpath d='M32.52,41.14c1.74,0,3.18,2.13,3.18,4.76s-1.44,4.74-3.18,4.74-3.16-2.13-3.16-4.74,1.41-4.76,3.16-4.76' fill='%23AAAAAA'/%3E%3Cpath d='M69.46,41.14c1.74,0,3.16,2.13,3.16,4.76s-1.41,4.74-3.16,4.74-3.18-2.13-3.18-4.74,1.41-4.76,3.18-4.76' fill='%23AAAAAA'/%3E%3Cpath d='M63.91,76.15c-.82-.48-1.84-.43-2.8.12l-10.13,5.75-10.11-5.75c-.96-.55-1.98-.59-2.8-.12-.82.47-1.29,1.38-1.29,2.49v10.12c0,1.11.47,2.02,1.28,2.49.38.22.8.33,1.24.33.51,0,1.05-.15,1.57-.44l10.12-5.75,10.11,5.75c.52.29,1.05.44,1.56.44.44,0,.86-.11,1.24-.33.81-.48,1.28-1.38,1.28-2.49v-10.12c0-1.11-.47-2.02-1.28-2.49' fill='white' opacity='0.9'/%3E%3C/g%3E%3C/svg%3E\");\n vertical-align: middle;\n}\n\n\n\n\n\n.mj-icon-skip-lightning[_ngcontent-%COMP%]::before {\n content: \"\u26A1\";\n color: var(--mj-brand-primary);\n font-size: 1.1em;\n}\n\n\n\n\n\n.mj-icon-skip-brain[_ngcontent-%COMP%]::before {\n content: \"\uD83E\uDDE0\";\n font-size: 1.2em;\n}\n\n\n\n\n\n.mj-icon-betty[_ngcontent-%COMP%] {\n width: 1.4em;\n height: 1.4em;\n display: inline-block;\n background-size: contain;\n background-repeat: no-repeat;\n background-position: center;\n \n background-image: url(\"data:image/svg+xml,%3Csvg id='a' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 200 150'%3E%3Cpath d='M64.96,60.23h75.12c10.58,0,20.24,4.31,27.2,11.32,7.01,6.95,11.32,16.61,11.32,27.19s-4.31,20.24-11.32,27.19c-6.95,7.02-16.61,11.32-27.2,11.32h-75.12c-10.58,0-20.24-4.31-27.19-11.32-2.65-2.64-4.92-5.6-6.71-8.92-.24,0-.49.06-.74.06-2.46,0-4.67-1.05-6.34-2.65-1.6-1.66-2.58-3.87-2.58-6.34v-18.7c0-2.46.98-4.74,2.58-6.34,1.66-1.66,3.87-2.65,6.34-2.65.25,0,.49,0,.74.06,1.79-3.32,4.06-6.34,6.71-8.92,6.95-7.01,16.61-11.32,27.19-11.32' fill='%233d1252'/%3E%3Cpath d='M132.33,68.36h0c0,1.72-.74,3.32-1.91,4.49-1.11,1.17-2.71,1.84-4.49,1.84h-13.29c-1.78,0-3.32-.68-4.49-1.84-1.17-1.17-1.91-2.77-1.91-4.49h-12.92c-8.37,0-15.94,3.44-21.47,8.92-5.47,5.54-8.92,13.1-8.92,21.47v1.17l.06.37v.37l.06.43v.37l.06.37v.37l.06.37.06.43.06.37.06.37.06.37.06.37c0,.12.06.25.06.37l.06.37.12.37.06.37.12.37.06.37.12.37.12.31.06.37.12.37.12.37.12.31.12.37.12.37.19.31.12.37.12.37.12.31.18.37.12.31.19.31.18.37.12.31.18.31.19.37.18.31.18.31.19.31.18.31c.12.24.25.43.37.68l.19.25.24.31.19.31c.43.62.86,1.23,1.35,1.79l.18.24c.49.62.99,1.17,1.48,1.66.19.19.31.37.49.56.19.12.37.31.56.49.49.49,1.04.98,1.6,1.47l.31.19c.56.49,1.17.92,1.79,1.35.18.12.37.25.55.37l.31.25.31.18.31.19.37.18.31.18.31.19.31.18.31.19.37.12.31.19.31.18c.12.06.24.12.37.12l.31.19.37.12.31.19.37.12.31.12.37.19.37.12.31.12.37.12.37.12.37.06c.24.12.43.18.68.25l.37.12.37.06.37.12c.12,0,.25.06.37.06l.37.06.37.12.37.06.37.06.37.06.37.06.37.06.37.06.43.06h.37l.37.06h.37l.37.06h.8l.37.06h47.56c8.37,0,15.94-3.44,21.47-8.92,5.48-5.54,8.92-13.1,8.92-21.47s-3.44-15.94-8.92-21.47c-5.54-5.48-13.1-8.92-21.47-8.92h-7.75Z' fill='%23fff'/%3E%3Cpolygon points='54.93 12.74 85.57 55.25 106.12 55.25 106.12 34.89 106.12 34.7 105.75 34.7 54.93 12.74' fill='%233aba91'/%3E%3Cpolygon points='111.1 55.25 124.76 55.25 145 27.07 111.35 41.59 111.1 41.59 111.1 41.72 111.1 55.25' fill='%233aba91'/%3E%3Cpath d='M94.55,82.81c3.75,0,6.83,3.81,7.57,8.92.06.74-.31,1.35-.98,1.66-.61.31-1.35.18-1.84-.37-1.29-1.48-2.96-2.34-4.74-2.34s-3.38.86-4.67,2.34c-.49.55-1.23.68-1.91.37-.68-.31-1.05-.92-.92-1.66.68-5.11,3.81-8.92,7.51-8.92' fill='%233d1252'/%3E%3Cpath d='M132.08,115.24c-.31,1.05-.86,2.03-1.66,2.77-1.11,1.17-2.71,1.84-4.49,1.84h-13.29c-1.79,0-3.32-.68-4.49-1.84-.8-.74-1.36-1.72-1.66-2.77-.19-.68.06-1.41.68-1.84.56-.43,1.35-.49,1.97-.06.98.68,2.21,1.05,3.51,1.05h13.29c1.29,0,2.52-.37,3.51-1.05.61-.43,1.41-.37,1.97.06.62.43.86,1.17.68,1.84' fill='%233d1252'/%3E%3Cpath d='M144.02,82.81c3.69,0,6.83,3.81,7.51,8.92.12.74-.24,1.35-.92,1.66-.68.31-1.41.18-1.91-.37-1.29-1.48-2.89-2.34-4.67-2.34s-3.44.86-4.74,2.34c-.49.55-1.23.68-1.84.37-.68-.31-1.05-.92-.98-1.66.74-5.11,3.81-8.92,7.57-8.92' fill='%233d1252'/%3E%3C/svg%3E\");\n vertical-align: middle;\n}\n\n\n\n\n\n.mj-icon-izzy[_ngcontent-%COMP%] {\n width: 1.4em;\n height: 1.4em;\n display: inline-block;\n background-size: contain;\n background-repeat: no-repeat;\n background-position: center;\n \n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 204 180'%3E%3Cpath d='M0 0 C3.61144774 3.08477828 4.84942137 4.90830493 5.5 9.625 C5 13 5 13 3.5 14.9375 C1.74432121 17.35155834 1.83578869 18.21944114 1.90625 21.12890625 C1.9371875 22.40636719 1.968125 23.68382813 2 25 C3.18335937 24.72285156 4.36671875 24.44570313 5.5859375 24.16015625 C22.44010416 20.26839867 22.44010416 20.26839867 30 20 C31.80210938 19.92265625 31.80210938 19.92265625 33.640625 19.84375 C47.49356199 19.44904163 61.73614427 20.86627802 75 25 C75.53596907 19.64244551 75.53596907 19.64244551 73.5 15 C71.5549761 12.4066348 71.45048389 10.16629658 71.59375 6.97265625 C72.33633815 3.36681955 74.01253991 1.99164006 77 0 C79.80907914 -0.63997166 82.18961327 -0.63020793 85 0 C87.8100346 1.79363911 89.50940468 3.01880935 91 6 C90.984375 8.05859375 90.984375 8.05859375 90.75 10.4375 C90.68296875 11.21996094 90.6159375 12.00242187 90.546875 12.80859375 C90 15 90 15 88.49609375 16.3984375 C86.25734576 18.79500846 86.4852344 20.97464008 86.3125 24.1875 C86.21388672 25.81751953 86.21388672 25.81751953 86.11328125 27.48046875 C86.07589844 28.31191406 86.03851563 29.14335937 86 30 C86.67675781 30.0825 87.35351562 30.165 88.05078125 30.25 C91.82333306 31.20937741 94.89353787 32.99425194 98.1875 35 C99.18052124 35.60448975 99.18052124 35.60448975 100.19360352 36.22119141 C111.98050012 43.58460075 121.17745776 53.2687532 127 66 C127 66.66 127 67.32 127 68 C127.721875 68.0825 128.44375 68.165 129.1875 68.25 C133.81406141 69.48374971 136.2179022 71.66516963 138.625 75.7734375 C140.97801199 81.55147269 140.43210927 87.87027126 140.375 94 C140.38660156 95.24523437 140.39820313 96.49046875 140.41015625 97.7734375 C140.3675701 111.08870765 140.3675701 111.08870765 135.5 116.7421875 C131.62323281 119.66995439 128.8523137 121.14337998 124 121.125 C122.9790625 121.12886719 122.9790625 121.12886719 121.9375 121.1328125 C120 121 120 121 117 120 C116.74347656 120.65226562 116.48695313 121.30453125 116.22265625 121.9765625 C115.83980469 122.85054688 115.45695313 123.72453125 115.0625 124.625 C114.70285156 125.48351562 114.34320313 126.34203125 113.97265625 127.2265625 C108.57908063 134.80960941 99.56813916 137.59212379 91.0625 140.375 C90.02287109 140.72949219 88.98324219 141.08398438 87.91210938 141.44921875 C80.34347852 144 80.34347852 144 78 144 C78.02094727 144.65484375 78.04189453 145.3096875 78.06347656 145.984375 C78.14730383 148.98942328 78.19886895 151.99422464 78.25 155 C78.28351563 156.02996094 78.31703125 157.05992187 78.3515625 158.12109375 C78.43361416 164.56214867 77.93369275 169.71304442 74 175 C68.75523423 179.17440541 64.68195675 180.53237245 58 180 C55.12653443 178.963898 52.49379495 177.58020045 49.8125 176.125 C49.11447266 175.76019531 48.41644531 175.39539063 47.69726562 175.01953125 C46.39868999 174.33997216 45.10309803 173.65465367 43.81176758 172.96142578 C43.21388428 172.64415527 42.61600098 172.32688477 42 172 C41.34290039 171.59402588 40.68580078 171.18805176 40.00878906 170.76977539 C38.03672401 169.77639533 38.03672401 169.77639533 36.12475586 170.58325195 C35.49448486 170.96441162 34.86421387 171.34557129 34.21484375 171.73828125 C33.17166992 172.35026367 33.17166992 172.35026367 32.10742188 172.97460938 C31.39134766 173.41611328 30.67527344 173.85761719 29.9375 174.3125 C28.51029236 175.1647359 27.08194984 176.01507485 25.65234375 176.86328125 C25.02320068 177.24782471 24.39405762 177.63236816 23.74584961 178.02856445 C19.79572932 180.2265128 16.44037501 180.296025 12 180 C6.82155197 178.33236419 3.95074467 176.59004726 1 172 C-0.72417326 168.34258111 -1.2403609 165.51230089 -1.1953125 161.48046875 C-1.18886719 160.45888672 -1.18242188 159.43730469 -1.17578125 158.38476562 C-1.15902344 157.32966797 -1.14226563 156.27457031 -1.125 155.1875 C-1.11597656 154.11306641 -1.10695312 153.03863281 -1.09765625 151.93164062 C-1.07415306 149.28753146 -1.04129575 146.64388128 -1 144 C-1.63196289 143.81171631 -2.26392578 143.62343262 -2.91503906 143.42944336 C-8.20708475 141.84808949 -13.49207901 140.2541307 -18.75 138.5625 C-19.98234375 138.17191406 -21.2146875 137.78132812 -22.484375 137.37890625 C-29.06200008 134.79901552 -34.12925122 130.90130551 -38 125 C-38.875 121.5625 -38.875 121.5625 -39 119 C-39.495 119.33 -39.99 119.66 -40.5 120 C-45.24354984 121.89741993 -49.49426304 121.53143657 -54.1875 119.875 C-58.42051121 117.05299253 -61.35909664 113.92271008 -63 109 C-63.22709306 104.92471184 -63.22828659 100.8492307 -63.24023438 96.76806641 C-63.2498982 94.77103695 -63.28108516 92.77414948 -63.3125 90.77734375 C-63.36188158 78.59243786 -63.36188158 78.59243786 -60 73 C-57.7509823 70.86631654 -55.88785241 69.35340008 -53.0078125 68.20703125 C-50.3010212 66.57979679 -49.65488803 64.83796148 -48.3125 62 C-45.06106922 55.7428385 -40.95735135 50.97447519 -36 46 C-35.40832031 45.38511719 -34.81664063 44.77023438 -34.20703125 44.13671875 C-28.97373562 39.11136864 -17.47215548 30 -10 30 C-10.08733973 27.91589342 -10.19552278 25.83265331 -10.3125 23.75 C-10.37050781 22.58984375 -10.42851563 21.4296875 -10.48828125 20.234375 C-11.02905532 16.81635262 -11.84853545 15.59874271 -14 13 C-14.54046356 8.75350057 -14.48376179 6.74176808 -12.125 3.125 C-8.57275398 -0.42724602 -4.8825369 -0.970906 0 0 Z M5 35 C4.30245605 35.21962402 3.60491211 35.43924805 2.88623047 35.66552734 C-14.1501062 41.15773444 -29.02751477 50.81254544 -39 66 C-39.33 66.99 -39.66 67.98 -40 69 C-37.525 70.98 -37.525 70.98 -35 73 C-34.52691406 72.29875 -34.05382812 71.5975 -33.56640625 70.875 C-21.08320269 52.96537462 -2.17172019 42.38052109 19.26171875 38.5078125 C46.97805996 34.9959591 75.10426623 38.71529466 97.73046875 56.09765625 C103.53827054 61.07953766 107.9264808 66.53902088 112 73 C113.32 72.01 114.64 71.02 116 70 C115.01713954 61.60788376 107.55262518 55.04847712 101.375 49.8125 C82.80696113 35.82916208 61.35998978 30.59265576 38.375 30.625 C37.71836365 30.62554382 37.06172729 30.62608765 36.38519287 30.62664795 C25.42439402 30.66823796 15.42390121 31.62072499 5 35 Z' fill='%234E3B78' transform='translate(63,0)'/%3E%3Cpath d='M0 0 C5.27957047 5.78547525 9.31612861 13.25448014 10 21.125 C9.69743213 24.83293961 8.77676366 26.8914086 6.1875 29.5625 C-2.04152489 35.76003038 -13.60917874 39.6270706 -23.875 38.8125 C-24.535 38.1525 -25.195 37.4925 -25.875 36.8125 C-28.97847254 36.48234335 -31.03281176 36.30718706 -33.75 37.9375 C-35.40354531 40.69340884 -35.26865568 42.66325452 -34.875 45.8125 C-33.95833333 47.89583333 -33.95833333 47.89583333 -31.875 48.8125 C-28.29166667 48.89583333 -28.29166667 48.89583333 -24.875 47.8125 C-24.57086182 47.16466553 -24.26672363 46.51683105 -23.95336914 45.84936523 C-22.875 43.8125 -22.875 43.8125 -20.77124023 42.88696289 C-19.91731689 42.6883667 -19.06339355 42.48977051 -18.18359375 42.28515625 C-17.23806641 42.04990234 -16.29253906 41.81464844 -15.31835938 41.57226562 C-14.32642578 41.34216797 -13.33449219 41.11207031 -12.3125 40.875 C-4.77934417 39.10870895 1.54823541 36.95205932 8.125 32.8125 C7.81647145 40.06292099 4.56245219 45.32546918 -0.5 50.4609375 C-5.29811284 54.61130511 -8.83216751 54.86916719 -15 55 C-21.13677833 55.26569953 -25.04589225 56.51893716 -29.890625 60.31640625 C-39.17633501 67.31724667 -52.82450605 66.52799961 -63.875 65.8125 C-71.37432145 64.60538489 -79.4496824 61.2378176 -84.875 55.8125 C-86.81199027 55.70419517 -88.75076074 55.60687514 -90.69067383 55.58691406 C-97.68300211 55.51299157 -103.12007731 55.4392364 -108.44140625 50.40234375 C-108.91449219 49.87769531 -109.38757813 49.35304688 -109.875 48.8125 C-110.6175 48.090625 -111.36 47.36875 -112.125 46.625 C-118.35765562 36.60823203 -119.69570866 25.34707186 -117.25 13.8828125 C-113.47065738 3.0509466 -104.76645407 -4.0120534 -94.875 -9.1875 C-91.26850975 -10.75400624 -87.62602625 -12.0153043 -83.875 -13.1875 C-83.029375 -13.47496094 -82.18375 -13.76242188 -81.3125 -14.05859375 C-56.0861494 -22.29657387 -20.04377266 -18.06142152 0 0 Z' fill='%23FDFDFD' transform='translate(155.875,64.1875)'/%3E%3Cpath d='M0 0 C5.24479788 1.58079188 9.51172656 4.60408712 14.06640625 7.58984375 C18.37837094 10.28462973 18.37837094 10.28462973 23.30859375 11.1328125 C28.49696048 9.20971132 33.08639658 6.29555589 37.79882812 3.42578125 C43.66838131 -0.00837477 43.66838131 -0.00837477 47.27734375 0.078125 C49.34375 1.0078125 49.34375 1.0078125 51.34375 3.0078125 C51.82984303 7.30136192 51.71414913 11.62739332 51.71875 15.9453125 C51.74324219 17.15123047 51.76773438 18.35714844 51.79296875 19.59960938 C51.79876953 21.33114258 51.79876953 21.33114258 51.8046875 23.09765625 C51.81290527 24.15847412 51.82112305 25.21929199 51.82958984 26.31225586 C51.34375 29.0078125 51.34375 29.0078125 49.48461914 30.87670898 C46.29658529 32.56106989 44.78123809 32.062357 41.34375 31.0078125 C37.60135447 29.03986817 34.07891261 26.72386924 30.53320312 24.42578125 C26.44214688 21.80182316 26.44214688 21.80182316 21.77734375 20.921875 C17.60401055 22.78413283 13.85973006 25.2663764 10.046875 27.76953125 C5.85335687 30.41401513 2.44659272 31.9581498 -2.65625 32.0078125 C-4.33203125 30.87695312 -4.33203125 30.87695312 -5.65625 29.0078125 C-6.04443359 26.328125 -6.04443359 26.328125 -6.0546875 23.1328125 C-6.05855469 21.98296875 -6.06242187 20.833125 -6.06640625 19.6484375 C-6.05480469 18.44703125 -6.04320313 17.245625 -6.03125 16.0078125 C-6.04285156 14.80640625 -6.05445312 13.605 -6.06640625 12.3671875 C-6.06253906 11.21734375 -6.05867188 10.0675 -6.0546875 8.8828125 C-6.05130371 7.82835937 -6.04791992 6.77390625 -6.04443359 5.6875 C-5.65625 3.0078125 -5.65625 3.0078125 -4.29736328 1.14111328 C-2.65625 0.0078125 -2.65625 0.0078125 0 0 Z' fill='%23FCFCFD' transform='translate(78.65625,136.9921875)'/%3E%3Cpath d='M0 0 C2.5 0.625 2.5 0.625 4.8125 2.625 C6.96830116 6.4575354 7.24792603 9.32007692 6.5 13.625 C5.34367254 15.98793002 4.35016245 17.77483755 2.5 19.625 C0.1875 20 0.1875 20 -2.5 19.625 C-5.06638215 17.47478793 -6.29103188 15.79226637 -6.88671875 12.46484375 C-7.08084032 8.45522921 -6.77549931 6.12498023 -4.8125 2.5625 C-2.5 0.625 -2.5 0.625 0 0 Z' fill='%2353417C' transform='translate(138.5,67.375)'/%3E%3Cpath d='M0 0 C2.5 0.6875 2.5 0.6875 4.8125 2.625 C7.08407605 6.74748987 7.32547179 10.07653131 6.5 14.6875 C4.8125 17.75 4.8125 17.75 2.5 19.6875 C-0.0625 20.25 -0.0625 20.25 -2.5 19.6875 C-5.30401904 17.38419865 -5.84979387 14.76309142 -6.4375 11.3125 C-6.72853275 7.71913649 -6.44645777 6.57011897 -4.875 3.125 C-2.5 0.6875 -2.5 0.6875 0 0 Z' fill='%23523F7B' transform='translate(64.5,67.3125)'/%3E%3Cpath d='M0 0 C8.91 0 17.82 0 27 0 C24.81183076 5.47042311 24.169236 6.55141452 19 9 C14.08609728 9.94526984 9.88605617 10.13992406 5.51171875 7.49609375 C3.4733513 5.76185217 1.65854906 4.10051199 0 2 C0 1.34 0 0.68 0 0 Z' fill='%23574680' transform='translate(88,95)'/%3E%3C/svg%3E\");\n vertical-align: middle;\n}\n\n\n\n\n\n\n\n\n.mj-icon-data-analyst[_ngcontent-%COMP%]::before {\n content: \"\uD83D\uDCCA\";\n font-size: 1.1em;\n}\n\n\n\n\n.mj-icon-api[_ngcontent-%COMP%]::before {\n content: \"\uD83D\uDD0C\";\n font-size: 1.1em;\n}\n\n\n\n\n.mj-icon-processing[_ngcontent-%COMP%]::before {\n content: \"\u2699\uFE0F\";\n display: inline-block;\n animation: _ngcontent-%COMP%_rotate-icon 2s linear infinite;\n}\n\n@keyframes _ngcontent-%COMP%_rotate-icon {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n}\n\n\n\n\n\n.mj-icon-monogram-s[_ngcontent-%COMP%]::before {\n content: \"S\";\n font-weight: 800;\n font-family: system-ui, -apple-system, sans-serif;\n font-size: 1.1em;\n color: var(--mj-brand-primary);\n}\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"] });
2834
+ } }, dependencies: [i5.NgClass, i5.NgTemplateOutlet, i6.DefaultValueAccessor, i6.NgControlStatus, i6.NgModel, i7.ArtifactMessageCardComponent, i8.LoadingComponent, i4.MarkdownComponent, i9.DynamicFormComponent, i10.ActionableCommandsComponent, i11.ConversationMessageRatingComponent, i12.TaskWidgetComponent, i5.DatePipe], styles: [".message-item[_ngcontent-%COMP%] {\n display: flex;\n gap: 12px;\n padding: 8px 24px;\n transition: background-color 150ms ease;\n animation: _ngcontent-%COMP%_fadeIn 0.3s ease;\n position: relative;\n}\n\n@keyframes _ngcontent-%COMP%_fadeIn {\n from {\n opacity: 0;\n transform: translateY(10px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n.message-item.ai-message[_ngcontent-%COMP%] {\n background-color: transparent;\n}\n\n.message-item.user-message[_ngcontent-%COMP%] {\n background-color: transparent;\n}\n\n\n.message-item.pin-beacon[_ngcontent-%COMP%] {\n animation: _ngcontent-%COMP%_pinBeacon 1.5s ease-out forwards;\n}\n\n@keyframes _ngcontent-%COMP%_pinBeacon {\n 0% { box-shadow: 0 0 0 0 color-mix(in srgb, var(--mj-status-warning) 60%, transparent); }\n 20% { box-shadow: 0 0 0 8px color-mix(in srgb, var(--mj-status-warning) 35%, transparent); }\n 50% { box-shadow: 0 0 0 4px color-mix(in srgb, var(--mj-status-warning) 15%, transparent); }\n 70% { box-shadow: 0 0 0 6px color-mix(in srgb, var(--mj-status-warning) 20%, transparent); }\n 100% { box-shadow: none; }\n}\n\n.message-item.in-progress[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n border-left: 3px solid var(--mj-brand-primary);\n position: relative;\n}\n\n@keyframes _ngcontent-%COMP%_shimmer {\n 0% {\n background-position: -200% 0;\n }\n 100% {\n background-position: 200% 0;\n }\n}\n\n\n.message-item.in-progress[_ngcontent-%COMP%] .message-text[_ngcontent-%COMP%] {\n color: var(--mj-text-primary);\n font-weight: 500;\n max-height: 150px;\n overflow-y: auto;\n display: block;\n}\n\n\n\n.message-item.in-progress[_ngcontent-%COMP%] .avatar-circle[_ngcontent-%COMP%] {\n box-shadow: 0 0 0 0 color-mix(in srgb, var(--mj-brand-primary) 70%, transparent);\n animation: _ngcontent-%COMP%_pulse 2s ease-in-out infinite;\n}\n\n@keyframes _ngcontent-%COMP%_pulse {\n 0%, 100% {\n box-shadow: 0 0 0 0 color-mix(in srgb, var(--mj-brand-primary) 70%, transparent);\n }\n 50% {\n box-shadow: 0 0 0 8px color-mix(in srgb, var(--mj-brand-primary) 0%, transparent);\n }\n}\n\n.message-item[_ngcontent-%COMP%]:hover {\n background-color: color-mix(in srgb, var(--mj-text-primary) 2%, transparent);\n}\n\n\n[_nghost-%COMP%] .mention-badge {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 4px 12px;\n margin: 0 3px;\n border-radius: 16px;\n font-weight: 600;\n font-size: 13px;\n cursor: pointer;\n transition: all 0.2s ease;\n vertical-align: middle;\n white-space: nowrap;\n}\n\n[_nghost-%COMP%] .mention-badge.agent {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border: 2px solid color-mix(in srgb, var(--mj-brand-primary) 40%, transparent);\n box-shadow: var(--mj-shadow-md);\n}\n\n[_nghost-%COMP%] .mention-badge.user {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border: 2px solid color-mix(in srgb, var(--mj-brand-primary) 40%, transparent);\n box-shadow: var(--mj-shadow-md);\n}\n\n[_nghost-%COMP%] .mention-badge.entity {\n background: var(--mj-status-success);\n color: var(--mj-text-inverse);\n border: 2px solid color-mix(in srgb, var(--mj-status-success) 40%, transparent);\n box-shadow: var(--mj-shadow-md);\n}\n\n[_nghost-%COMP%] .mention-badge.query {\n background: var(--mj-status-warning);\n color: var(--mj-text-inverse);\n border: 2px solid color-mix(in srgb, var(--mj-status-warning) 40%, transparent);\n box-shadow: var(--mj-shadow-md);\n}\n\n[_nghost-%COMP%] .mention-badge.record {\n background: var(--mj-color-info, #2563eb);\n color: var(--mj-text-inverse, #fff);\n border: 2px solid color-mix(in srgb, var(--mj-color-info, #2563eb) 40%, transparent);\n box-shadow: var(--mj-shadow-md);\n text-decoration: none;\n}\n\n\n[_nghost-%COMP%] .mention-badge.record.icon-only {\n padding: 4px 7px;\n gap: 0;\n min-width: 1.65em;\n justify-content: center;\n}\n\n\n\n\n[_nghost-%COMP%] .mention-badge.skill {\n background: var(--mj-status-success);\n color: var(--mj-text-inverse);\n border: 2px solid color-mix(in srgb, var(--mj-text-inverse) 35%, transparent);\n border-radius: 4px;\n box-shadow: var(--mj-shadow-md);\n}\n\n[_nghost-%COMP%] .mention-badge i {\n font-size: 12px;\n opacity: 0.95;\n}\n\n\n[_nghost-%COMP%] .mention-badge i[class^=\"mj-icon-\"], \n[_nghost-%COMP%] .mention-badge i[class*=\" mj-icon-\"] {\n width: 16px;\n height: 16px;\n display: inline-block;\n background-size: contain;\n background-repeat: no-repeat;\n background-position: center;\n vertical-align: middle;\n font-size: inherit;\n}\n\n\n[_nghost-%COMP%] .mention-badge i.mj-icon-skip {\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 101.89918457031249 96.83947368421053'%3E%3Cg transform='translate(-0.1288232421875,-0.0)'%3E%3Cpath d='M93.85,41.56c-.84,0-1.62.2-2.37.55-3-4.35-7.49-8.12-13.04-11.04l.04-7.18v-14.44h-10.24v17.6c-1.52-.43-3.07-.8-4.67-1.11V0h-10.24v24.72s-.09,0-.14,0h-4.38s-.1,0-.14,0V7.3h-10.24v18.62c-1.6.32-3.15.69-4.67,1.11v-11.67h-10.24v6.09l.04,9.6c-5.55,2.92-10.04,6.7-13.04,11.04-.75-.35-1.53-.55-2.37-.55-4.5,0-8.14,5.61-8.14,12.51s3.64,12.53,8.14,12.53c.58,0,1.14-.12,1.67-.29,4.1,6.62,11.54,12.06,20.98,15.28l.79.13v7.05c0,2.97,1.45,5.58,3.87,6.99,1.18.69,2.5,1.04,3.85,1.03,1.4,0,2.83-.37,4.15-1.12l7.54-4.29,7.56,4.3c1.31.74,2.73,1.12,4.13,1.12s2.67-.35,3.85-1.04c2.42-1.41,3.86-4.02,3.86-6.98v-7.05l.79-.13c9.44-3.22,16.89-8.66,20.98-15.28.54.17,1.09.29,1.68.29,4.5,0,8.14-5.61,8.14-12.53s-3.63-12.51-8.14-12.51' fill='%23AAAAAA'/%3E%3Cpath d='M86.69,50.87c0-12.22-13.6-19.1-28.94-20.66-4.48-.47-9.19-.54-13.52,0-15.34,1.53-28.93,8.41-28.93,20.66,0,8.55,5.7,15.55,12.68,15.55h7.94c3.05,2.5,6.93,4.1,11.08,4.71,2.65.4,5.44.46,8.01,0,4.15-.6,8.05-2.2,11.1-4.71h7.92c6.97,0,12.68-7,12.68-15.55' fill='white' opacity='0.9'/%3E%3Cpath d='M57.83,55.82c-1.19,2.58-3.8,4.35-6.84,4.35s-5.65-1.77-6.84-4.35h13.68Z' fill='%23AAAAAA'/%3E%3Cpath d='M32.52,41.14c1.74,0,3.18,2.13,3.18,4.76s-1.44,4.74-3.18,4.74-3.16-2.13-3.16-4.74,1.41-4.76,3.16-4.76' fill='%23AAAAAA'/%3E%3Cpath d='M69.46,41.14c1.74,0,3.16,2.13,3.16,4.76s-1.41,4.74-3.16,4.74-3.18-2.13-3.18-4.74,1.41-4.76,3.18-4.76' fill='%23AAAAAA'/%3E%3Cpath d='M63.91,76.15c-.82-.48-1.84-.43-2.8.12l-10.13,5.75-10.11-5.75c-.96-.55-1.98-.59-2.8-.12-.82.47-1.29,1.38-1.29,2.49v10.12c0,1.11.47,2.02,1.28,2.49.38.22.8.33,1.24.33.51,0,1.05-.15,1.57-.44l10.12-5.75,10.11,5.75c.52.29,1.05.44,1.56.44.44,0,.86-.11,1.24-.33.81-.48,1.28-1.38,1.28-2.49v-10.12c0-1.11-.47-2.02-1.28-2.49' fill='white' opacity='0.9'/%3E%3C/g%3E%3C/svg%3E\");\n}\n\n\n[_nghost-%COMP%] .mention-badge i.mj-icon-betty {\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'%3E%3Ccircle cx='50' cy='50' r='45' fill='%23FF6B6B'/%3E%3Ctext x='50' y='65' text-anchor='middle' font-size='40' fill='white' font-family='Arial, sans-serif' font-weight='bold'%3EB%3C/text%3E%3C/svg%3E\");\n}\n\n\n[_nghost-%COMP%] .mention-badge i.mj-icon-izzy {\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 204 180'%3E%3Cpath d='M0 0 C3.61144774 3.08477828 4.84942137 4.90830493 5.5 9.625 C5 13 5 13 3.5 14.9375 C1.74432121 17.35155834 1.83578869 18.21944114 1.90625 21.12890625 C1.9371875 22.40636719 1.968125 23.68382813 2 25 C3.18335937 24.72285156 4.36671875 24.44570313 5.5859375 24.16015625 C22.44010416 20.26839867 22.44010416 20.26839867 30 20 C31.80210938 19.92265625 31.80210938 19.92265625 33.640625 19.84375 C47.49356199 19.44904163 61.73614427 20.86627802 75 25 C75.53596907 19.64244551 75.53596907 19.64244551 73.5 15 C71.5549761 12.4066348 71.45048389 10.16629658 71.59375 6.97265625 C72.33633815 3.36681955 74.01253991 1.99164006 77 0 C79.80907914 -0.63997166 82.18961327 -0.63020793 85 0 C87.8100346 1.79363911 89.50940468 3.01880935 91 6 C90.984375 8.05859375 90.984375 8.05859375 90.75 10.4375 C90.68296875 11.21996094 90.6159375 12.00242187 90.546875 12.80859375 C90 15 90 15 88.49609375 16.3984375 C86.25734576 18.79500846 86.4852344 20.97464008 86.3125 24.1875 C86.21388672 25.81751953 86.21388672 25.81751953 86.11328125 27.48046875 C86.07589844 28.31191406 86.03851563 29.14335937 86 30 C86.67675781 30.0825 87.35351562 30.165 88.05078125 30.25 C91.82333306 31.20937741 94.89353787 32.99425194 98.1875 35 C99.18052124 35.60448975 99.18052124 35.60448975 100.19360352 36.22119141 C111.98050012 43.58460075 121.17745776 53.2687532 127 66 C127 66.66 127 67.32 127 68 C127.721875 68.0825 128.44375 68.165 129.1875 68.25 C133.81406141 69.48374971 136.2179022 71.66516963 138.625 75.7734375 C140.97801199 81.55147269 140.43210927 87.87027126 140.375 94 C140.38660156 95.24523437 140.39820313 96.49046875 140.41015625 97.7734375 C140.3675701 111.08870765 140.3675701 111.08870765 135.5 116.7421875 C131.62323281 119.66995439 128.8523137 121.14337998 124 121.125 C122.9790625 121.12886719 122.9790625 121.12886719 121.9375 121.1328125 C120 121 120 121 117 120 C116.74347656 120.65226562 116.48695313 121.30453125 116.22265625 121.9765625 C115.83980469 122.85054688 115.45695313 123.72453125 115.0625 124.625 C114.70285156 125.48351562 114.34320313 126.34203125 113.97265625 127.2265625 C108.57908063 134.80960941 99.56813916 137.59212379 91.0625 140.375 C90.02287109 140.72949219 88.98324219 141.08398438 87.91210938 141.44921875 C80.34347852 144 80.34347852 144 78 144 C78.02094727 144.65484375 78.04189453 145.3096875 78.06347656 145.984375 C78.14730383 148.98942328 78.19886895 151.99422464 78.25 155 C78.28351563 156.02996094 78.31703125 157.05992187 78.3515625 158.12109375 C78.43361416 164.56214867 77.93369275 169.71304442 74 175 C68.75523423 179.17440541 64.68195675 180.53237245 58 180 C55.12653443 178.963898 52.49379495 177.58020045 49.8125 176.125 C49.11447266 175.76019531 48.41644531 175.39539063 47.69726562 175.01953125 C46.39868999 174.33997216 45.10309803 173.65465367 43.81176758 172.96142578 C43.21388428 172.64415527 42.61600098 172.32688477 42 172 C41.34290039 171.59402588 40.68580078 171.18805176 40.00878906 170.76977539 C38.03672401 169.77639533 38.03672401 169.77639533 36.12475586 170.58325195 C35.49448486 170.96441162 34.86421387 171.34557129 34.21484375 171.73828125 C33.17166992 172.35026367 33.17166992 172.35026367 32.10742188 172.97460938 C31.39134766 173.41611328 30.67527344 173.85761719 29.9375 174.3125 C28.51029236 175.1647359 27.08194984 176.01507485 25.65234375 176.86328125 C25.02320068 177.24782471 24.39405762 177.63236816 23.74584961 178.02856445 C19.79572932 180.2265128 16.44037501 180.296025 12 180 C6.82155197 178.33236419 3.95074467 176.59004726 1 172 C-0.72417326 168.34258111 -1.2403609 165.51230089 -1.1953125 161.48046875 C-1.18886719 160.45888672 -1.18242188 159.43730469 -1.17578125 158.38476562 C-1.15902344 157.32966797 -1.14226563 156.27457031 -1.125 155.1875 C-1.11597656 154.11306641 -1.10695312 153.03863281 -1.09765625 151.93164062 C-1.07415306 149.28753146 -1.04129575 146.64388128 -1 144 C-1.63196289 143.81171631 -2.26392578 143.62343262 -2.91503906 143.42944336 C-8.20708475 141.84808949 -13.49207901 140.2541307 -18.75 138.5625 C-19.98234375 138.17191406 -21.2146875 137.78132812 -22.484375 137.37890625 C-29.06200008 134.79901552 -34.12925122 130.90130551 -38 125 C-38.875 121.5625 -38.875 121.5625 -39 119 C-39.495 119.33 -39.99 119.66 -40.5 120 C-45.24354984 121.89741993 -49.49426304 121.53143657 -54.1875 119.875 C-58.42051121 117.05299253 -61.35909664 113.92271008 -63 109 C-63.22709306 104.92471184 -63.22828659 100.8492307 -63.24023438 96.76806641 C-63.2498982 94.77103695 -63.28108516 92.77414948 -63.3125 90.77734375 C-63.36188158 78.59243786 -63.36188158 78.59243786 -60 73 C-57.7509823 70.86631654 -55.88785241 69.35340008 -53.0078125 68.20703125 C-50.3010212 66.57979679 -49.65488803 64.83796148 -48.3125 62 C-45.06106922 55.7428385 -40.95735135 50.97447519 -36 46 C-35.40832031 45.38511719 -34.81664063 44.77023438 -34.20703125 44.13671875 C-28.97373562 39.11136864 -17.47215548 30 -10 30 C-10.08733973 27.91589342 -10.19552278 25.83265331 -10.3125 23.75 C-10.37050781 22.58984375 -10.42851563 21.4296875 -10.48828125 20.234375 C-11.02905532 16.81635262 -11.84853545 15.59874271 -14 13 C-14.54046356 8.75350057 -14.48376179 6.74176808 -12.125 3.125 C-8.57275398 -0.42724602 -4.8825369 -0.970906 0 0 Z M5 35 C4.30245605 35.21962402 3.60491211 35.43924805 2.88623047 35.66552734 C-14.1501062 41.15773444 -29.02751477 50.81254544 -39 66 C-39.33 66.99 -39.66 67.98 -40 69 C-37.525 70.98 -37.525 70.98 -35 73 C-34.52691406 72.29875 -34.05382812 71.5975 -33.56640625 70.875 C-21.08320269 52.96537462 -2.17172019 42.38052109 19.26171875 38.5078125 C46.97805996 34.9959591 75.10426623 38.71529466 97.73046875 56.09765625 C103.53827054 61.07953766 107.9264808 66.53902088 112 73 C113.32 72.01 114.64 71.02 116 70 C115.01713954 61.60788376 107.55262518 55.04847712 101.375 49.8125 C82.80696113 35.82916208 61.35998978 30.59265576 38.375 30.625 C37.71836365 30.62554382 37.06172729 30.62608765 36.38519287 30.62664795 C25.42439402 30.66823796 15.42390121 31.62072499 5 35 Z' fill='%234E3B78' transform='translate(63,0)'/%3E%3Cpath d='M0 0 C5.27957047 5.78547525 9.31612861 13.25448014 10 21.125 C9.69743213 24.83293961 8.77676366 26.8914086 6.1875 29.5625 C-2.04152489 35.76003038 -13.60917874 39.6270706 -23.875 38.8125 C-24.535 38.1525 -25.195 37.4925 -25.875 36.8125 C-28.97847254 36.48234335 -31.03281176 36.30718706 -33.75 37.9375 C-35.40354531 40.69340884 -35.26865568 42.66325452 -34.875 45.8125 C-33.95833333 47.89583333 -33.95833333 47.89583333 -31.875 48.8125 C-28.29166667 48.89583333 -28.29166667 48.89583333 -24.875 47.8125 C-24.57086182 47.16466553 -24.26672363 46.51683105 -23.95336914 45.84936523 C-22.875 43.8125 -22.875 43.8125 -20.77124023 42.88696289 C-19.91731689 42.6883667 -19.06339355 42.48977051 -18.18359375 42.28515625 C-17.23806641 42.04990234 -16.29253906 41.81464844 -15.31835938 41.57226562 C-14.32642578 41.34216797 -13.33449219 41.11207031 -12.3125 40.875 C-4.77934417 39.10870895 1.54823541 36.95205932 8.125 32.8125 C7.81647145 40.06292099 4.56245219 45.32546918 -0.5 50.4609375 C-5.29811284 54.61130511 -8.83216751 54.86916719 -15 55 C-21.13677833 55.26569953 -25.04589225 56.51893716 -29.890625 60.31640625 C-39.17633501 67.31724667 -52.82450605 66.52799961 -63.875 65.8125 C-71.37432145 64.60538489 -79.4496824 61.2378176 -84.875 55.8125 C-86.81199027 55.70419517 -88.75076074 55.60687514 -90.69067383 55.58691406 C-97.68300211 55.51299157 -103.12007731 55.4392364 -108.44140625 50.40234375 C-108.91449219 49.87769531 -109.38757813 49.35304688 -109.875 48.8125 C-110.6175 48.090625 -111.36 47.36875 -112.125 46.625 C-118.35765562 36.60823203 -119.69570866 25.34707186 -117.25 13.8828125 C-113.47065738 3.0509466 -104.76645407 -4.0120534 -94.875 -9.1875 C-91.26850975 -10.75400624 -87.62602625 -12.0153043 -83.875 -13.1875 C-83.029375 -13.47496094 -82.18375 -13.76242188 -81.3125 -14.05859375 C-56.0861494 -22.29657387 -20.04377266 -18.06142152 0 0 Z' fill='%23FDFDFD' transform='translate(155.875,64.1875)'/%3E%3Cpath d='M0 0 C5.24479788 1.58079188 9.51172656 4.60408712 14.06640625 7.58984375 C18.37837094 10.28462973 18.37837094 10.28462973 23.30859375 11.1328125 C28.49696048 9.20971132 33.08639658 6.29555589 37.79882812 3.42578125 C43.66838131 -0.00837477 43.66838131 -0.00837477 47.27734375 0.078125 C49.34375 1.0078125 49.34375 1.0078125 51.34375 3.0078125 C51.82984303 7.30136192 51.71414913 11.62739332 51.71875 15.9453125 C51.74324219 17.15123047 51.76773438 18.35714844 51.79296875 19.59960938 C51.79876953 21.33114258 51.79876953 21.33114258 51.8046875 23.09765625 C51.81290527 24.15847412 51.82112305 25.21929199 51.82958984 26.31225586 C51.34375 29.0078125 51.34375 29.0078125 49.48461914 30.87670898 C46.29658529 32.56106989 44.78123809 32.062357 41.34375 31.0078125 C37.60135447 29.03986817 34.07891261 26.72386924 30.53320312 24.42578125 C26.44214688 21.80182316 26.44214688 21.80182316 21.77734375 20.921875 C17.60401055 22.78413283 13.85973006 25.2663764 10.046875 27.76953125 C5.85335687 30.41401513 2.44659272 31.9581498 -2.65625 32.0078125 C-4.33203125 30.87695312 -4.33203125 30.87695312 -5.65625 29.0078125 C-6.04443359 26.328125 -6.04443359 26.328125 -6.0546875 23.1328125 C-6.05855469 21.98296875 -6.06242187 20.833125 -6.06640625 19.6484375 C-6.05480469 18.44703125 -6.04320313 17.245625 -6.03125 16.0078125 C-6.04285156 14.80640625 -6.05445312 13.605 -6.06640625 12.3671875 C-6.06253906 11.21734375 -6.05867188 10.0675 -6.0546875 8.8828125 C-6.05130371 7.82835937 -6.04791992 6.77390625 -6.04443359 5.6875 C-5.65625 3.0078125 -5.65625 3.0078125 -4.29736328 1.14111328 C-2.65625 0.0078125 -2.65625 0.0078125 0 0 Z' fill='%23FCFCFD' transform='translate(78.65625,136.9921875)'/%3E%3Cpath d='M0 0 C2.5 0.625 2.5 0.625 4.8125 2.625 C6.96830116 6.4575354 7.24792603 9.32007692 6.5 13.625 C5.34367254 15.98793002 4.35016245 17.77483755 2.5 19.625 C0.1875 20 0.1875 20 -2.5 19.625 C-5.06638215 17.47478793 -6.29103188 15.79226637 -6.88671875 12.46484375 C-7.08084032 8.45522921 -6.77549931 6.12498023 -4.8125 2.5625 C-2.5 0.625 -2.5 0.625 0 0 Z' fill='%2353417C' transform='translate(138.5,67.375)'/%3E%3Cpath d='M0 0 C2.5 0.6875 2.5 0.6875 4.8125 2.625 C7.08407605 6.74748987 7.32547179 10.07653131 6.5 14.6875 C4.8125 17.75 4.8125 17.75 2.5 19.6875 C-0.0625 20.25 -0.0625 20.25 -2.5 19.6875 C-5.30401904 17.38419865 -5.84979387 14.76309142 -6.4375 11.3125 C-6.72853275 7.71913649 -6.44645777 6.57011897 -4.875 3.125 C-2.5 0.6875 -2.5 0.6875 0 0 Z' fill='%23523F7B' transform='translate(64.5,67.3125)'/%3E%3Cpath d='M0 0 C8.91 0 17.82 0 27 0 C24.81183076 5.47042311 24.169236 6.55141452 19 9 C14.08609728 9.94526984 9.88605617 10.13992406 5.51171875 7.49609375 C3.4733513 5.76185217 1.65854906 4.10051199 0 2 C0 1.34 0 0.68 0 0 Z' fill='%23574680' transform='translate(88,95)'/%3E%3C/svg%3E\");\n}\n\n\n[_nghost-%COMP%] .mention-badge img {\n width: 16px;\n height: 16px;\n border-radius: 50%;\n object-fit: cover;\n vertical-align: middle;\n}\n\n[_nghost-%COMP%] .mention-badge:hover {\n transform: translateY(-1px);\n box-shadow: var(--mj-shadow-lg);\n}\n\n\n\n[_nghost-%COMP%] .mention-badge .preset-indicator {\n display: inline-block;\n font-size: 10px;\n font-weight: 600;\n font-family: 'SF Mono', 'Monaco', 'Inconsolata', 'Roboto Mono', 'Courier New', monospace;\n background: rgba(255, 255, 255, 0.25);\n padding: 2px 6px;\n border-radius: 4px;\n margin-left: 4px;\n letter-spacing: 0.3px;\n text-transform: uppercase;\n border: 1px solid rgba(255, 255, 255, 0.15);\n}\n\n.message-avatar[_ngcontent-%COMP%] {\n flex-shrink: 0;\n}\n\n.avatar-circle[_ngcontent-%COMP%] {\n width: 36px;\n height: 36px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 16px;\n color: var(--mj-text-inverse);\n}\n\n\n.avatar-circle.user-avatar[_ngcontent-%COMP%] {\n border-radius: 50%;\n background-color: var(--mj-text-primary);\n}\n\n\n.avatar-circle.ai-avatar[_ngcontent-%COMP%] {\n border-radius: 8px;\n background-color: var(--mj-brand-primary); \n}\n\n\n\n\n\n\n.avatar-circle.ai-avatar.avatar-has-image[_ngcontent-%COMP%] {\n background-color: transparent;\n overflow: hidden;\n}\n.avatar-circle.ai-avatar[_ngcontent-%COMP%] .avatar-image[_ngcontent-%COMP%] {\n border-radius: inherit;\n}\n\n.avatar-image[_ngcontent-%COMP%] {\n width: 100%;\n height: 100%;\n object-fit: cover;\n border-radius: 50%;\n}\n\n\n\n.artifact-pending[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n padding: 12px 16px;\n}\n\n\n.artifact-wrapper.system-artifact[_ngcontent-%COMP%] {\n opacity: 0.85;\n position: relative;\n}\n\n.artifact-wrapper.system-artifact[_ngcontent-%COMP%]::before {\n content: 'SYSTEM';\n position: absolute;\n top: 8px;\n right: 8px;\n font-size: 9px;\n font-weight: 600;\n color: var(--mj-text-muted);\n background: var(--mj-bg-surface-sunken);\n padding: 2px 6px;\n border-radius: 3px;\n letter-spacing: 0.5px;\n z-index: 10;\n}\n\n.message-content[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n position: relative;\n}\n\n.message-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 4px;\n font-size: 13px;\n}\n\n.message-sender[_ngcontent-%COMP%] {\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n\n.agent-badge[_ngcontent-%COMP%] {\n display: inline-block;\n padding: 2px 8px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 10px;\n font-size: 11px;\n color: var(--mj-text-secondary);\n font-weight: 500;\n}\n\n.message-time[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n font-size: 12px;\n font-weight: 400;\n}\n\n\n\n\n\n\n\n.time-pill[_ngcontent-%COMP%], \n.test-feedback-icon[_ngcontent-%COMP%], \n.agent-run-icon[_ngcontent-%COMP%], \n.message-edit-icon[_ngcontent-%COMP%] {\n margin-left: auto;\n}\n.time-pill[_ngcontent-%COMP%] ~ .test-feedback-icon[_ngcontent-%COMP%], \n.time-pill[_ngcontent-%COMP%] ~ .agent-run-icon[_ngcontent-%COMP%], \n.test-feedback-icon[_ngcontent-%COMP%] ~ .agent-run-icon[_ngcontent-%COMP%], \n.message-edit-icon[_ngcontent-%COMP%] ~ .test-feedback-icon[_ngcontent-%COMP%], \n.message-edit-icon[_ngcontent-%COMP%] ~ .agent-run-icon[_ngcontent-%COMP%] {\n margin-left: 8px;\n}\n\n\n.message-edit-icon[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 20px;\n height: 20px;\n color: var(--mj-text-muted);\n cursor: pointer;\n transition: all 0.2s ease;\n opacity: 0;\n}\n.message-item[_ngcontent-%COMP%]:hover .message-edit-icon[_ngcontent-%COMP%], \n.message-edit-icon[_ngcontent-%COMP%]:focus-visible {\n opacity: 1;\n}\n.message-edit-icon[_ngcontent-%COMP%]:hover {\n color: var(--mj-text-secondary);\n}\n.message-edit-icon[_ngcontent-%COMP%] i.fa-pen[_ngcontent-%COMP%] {\n font-size: 12px;\n}\n\n\n.time-pill[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 2px 8px;\n border-radius: 10px;\n font-size: 11px;\n font-weight: 500;\n transition: all 0.3s ease;\n}\n\n.time-pill[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 10px;\n}\n\n\n.time-pill.complete[_ngcontent-%COMP%] {\n background: var(--mj-status-info-bg);\n color: var(--mj-status-info-text);\n}\n\n\n.time-pill.in-progress[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n\n.time-pill.active[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n\n\n\n.time-pill.checking[_ngcontent-%COMP%] {\n background: var(--mj-status-warning-bg);\n color: var(--mj-status-warning-text);\n}\n\n.time-pill.stalled[_ngcontent-%COMP%] {\n background: var(--mj-status-error-bg);\n color: var(--mj-status-error-text);\n}\n\n.time-pill[_ngcontent-%COMP%] .liveness-label[_ngcontent-%COMP%] {\n font-weight: 400;\n opacity: 0.85;\n}\n\n\n.time-pill.failed[_ngcontent-%COMP%] {\n background: var(--mj-status-error-bg);\n color: var(--mj-status-error-text);\n}\n\n@keyframes _ngcontent-%COMP%_pillPulse {\n 0%, 100% {\n opacity: 1;\n }\n 50% {\n opacity: 0.85;\n }\n}\n\n\n.generation-time[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 2px 8px;\n background: var(--mj-status-info-bg);\n border-radius: 10px;\n font-size: 11px;\n color: var(--mj-status-info-text);\n font-weight: 500;\n margin-left: auto;\n}\n\n.generation-time[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 10px;\n}\n\n\n.message-elapsed[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n font-size: 11px;\n font-style: italic;\n}\n\n.message-body[_ngcontent-%COMP%] {\n margin-bottom: 0;\n}\n\n.message-text[_ngcontent-%COMP%] {\n color: var(--mj-text-primary);\n line-height: 1.5;\n word-wrap: break-word;\n}\n\n\n.message-text[_ngcontent-%COMP%] mj-markdown[_ngcontent-%COMP%] > [_ngcontent-%COMP%]:first-child, \n.message-text[_ngcontent-%COMP%] .mj-markdown-container > :first-child {\n margin-top: 0;\n}\n\n.message-text[_ngcontent-%COMP%] mj-markdown[_ngcontent-%COMP%] > [_ngcontent-%COMP%]:last-child, \n.message-text[_ngcontent-%COMP%] .mj-markdown-container > :last-child {\n margin-bottom: 0;\n}\n\n\n.message-item.user-message[_ngcontent-%COMP%] .message-content[_ngcontent-%COMP%] {\n border-radius: 12px 12px 12px 4px;\n}\n\n.message-item.ai-message[_ngcontent-%COMP%] .message-content[_ngcontent-%COMP%] {\n border-radius: 4px 12px 12px 12px;\n}\n\n\n.message-reactions[_ngcontent-%COMP%] {\n display: none; \n}\n\n\n.artifact-card[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 12px;\n margin-top: 12px;\n padding: 16px;\n border: 1px solid color-mix(in srgb, var(--mj-text-primary) 8%, transparent);\n border-radius: 8px;\n background: color-mix(in srgb, var(--mj-brand-primary) 5%, var(--mj-bg-surface));\n cursor: pointer;\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n max-width: 500px;\n box-shadow: var(--mj-shadow-sm);\n position: relative;\n overflow: hidden;\n}\n\n.artifact-card[_ngcontent-%COMP%]::before {\n content: '';\n position: absolute;\n left: 0;\n top: 0;\n bottom: 0;\n width: 3px;\n background: var(--mj-brand-primary);\n opacity: 1;\n}\n\n.artifact-card[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n border-color: color-mix(in srgb, var(--mj-brand-primary) 30%, transparent);\n box-shadow: var(--mj-shadow-md);\n transform: translateY(-1px);\n}\n\n.artifact-card-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n}\n\n.artifact-card-icon[_ngcontent-%COMP%] {\n width: 36px;\n height: 36px;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-brand-primary);\n flex-shrink: 0;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n border-radius: 6px;\n transition: all 0.2s ease;\n}\n\n.artifact-card[_ngcontent-%COMP%]:hover .artifact-card-icon[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n transform: scale(1.05);\n}\n\n.artifact-card-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 18px;\n}\n\n.artifact-card-content[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n}\n\n.artifact-card-label[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n letter-spacing: -0.01em;\n margin-bottom: 4px;\n}\n\n.artifact-card-description[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-text-secondary);\n line-height: 1.5;\n}\n\n.message-actions[_ngcontent-%COMP%] {\n position: absolute;\n bottom: 8px;\n right: 8px;\n display: flex;\n gap: 2px;\n opacity: 0;\n transform: translateY(4px);\n transition: all 200ms cubic-bezier(0.4, 0, 0.2, 1);\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n padding: 4px;\n box-shadow: var(--mj-shadow-md);\n pointer-events: none;\n}\n\n.message-item[_ngcontent-%COMP%]:hover .message-actions[_ngcontent-%COMP%] {\n opacity: 1;\n transform: translateY(0);\n pointer-events: auto;\n}\n\n.message-action-btn[_ngcontent-%COMP%] {\n padding: 6px 8px;\n background: transparent;\n border: none;\n border-radius: 6px;\n cursor: pointer;\n color: var(--mj-text-secondary);\n font-size: 13px;\n transition: all 150ms ease;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 32px;\n height: 32px;\n}\n\n.message-action-btn[_ngcontent-%COMP%]:hover {\n background-color: var(--mj-bg-surface-sunken);\n color: var(--mj-text-primary);\n}\n\n.message-action-btn.danger[_ngcontent-%COMP%]:hover {\n background-color: var(--mj-status-error-bg);\n color: var(--mj-status-error);\n}\n\n.message-action-btn.retry-btn[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n font-weight: 600;\n gap: 6px;\n padding: 6px 12px;\n min-width: auto;\n}\n\n.message-action-btn.retry-btn[_ngcontent-%COMP%]:hover {\n background-color: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n color: var(--mj-brand-primary-hover);\n}\n\n\n.thread-indicator[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n margin-top: 8px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n border-radius: 16px;\n cursor: pointer;\n transition: all 150ms ease;\n font-size: 12px;\n color: var(--mj-brand-primary-hover);\n font-weight: 500;\n}\n\n.thread-indicator[_ngcontent-%COMP%]:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n border-color: color-mix(in srgb, var(--mj-brand-primary) 30%, transparent);\n transform: translateY(-1px);\n box-shadow: var(--mj-shadow-sm);\n}\n\n.thread-indicator[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 14px;\n}\n\n.thread-count[_ngcontent-%COMP%] {\n font-weight: 600;\n}\n\n\n.message-item.editing[_ngcontent-%COMP%] {\n background-color: var(--mj-status-warning-bg);\n border-left: 3px solid var(--mj-status-warning);\n}\n\n.message-edit-container[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.message-edit-textarea[_ngcontent-%COMP%] {\n width: 100%;\n padding: 12px;\n border: 1px solid var(--mj-border-strong);\n border-radius: 6px;\n font-family: inherit;\n font-size: 14px;\n line-height: 1.6;\n resize: vertical;\n min-height: 80px;\n transition: border-color 150ms ease;\n}\n\n.message-edit-textarea[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 2px color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n}\n\n.edit-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n}\n\n.edit-action-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 8px 16px;\n border: none;\n border-radius: 6px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: all 150ms ease;\n}\n\n.edit-action-btn.save[_ngcontent-%COMP%] {\n background-color: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n}\n\n.edit-action-btn.save[_ngcontent-%COMP%]:hover {\n background-color: var(--mj-brand-primary-hover);\n}\n\n.edit-action-btn.cancel[_ngcontent-%COMP%] {\n background-color: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n}\n\n.edit-action-btn.cancel[_ngcontent-%COMP%]:hover {\n background-color: var(--mj-border-default);\n color: var(--mj-text-primary);\n}\n\n.edit-hint[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-muted);\n font-style: italic;\n}\n\n.edited-badge[_ngcontent-%COMP%] {\n margin-left: 8px;\n font-size: 11px;\n color: var(--mj-text-muted);\n font-style: italic;\n font-weight: normal;\n}\n\n\n.message-action-bar[_ngcontent-%COMP%] {\n margin-top: 12px;\n margin-bottom: 8px;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n padding: 12px;\n}\n\n.action-bar-container[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 16px;\n}\n\n.action-buttons[_ngcontent-%COMP%] {\n display: flex;\n gap: 4px;\n margin-left: 16px;\n padding-left: 16px;\n border-left: 1px solid var(--mj-border-default);\n}\n\n.action-bar-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 6px 10px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-text-muted);\n border-radius: 6px;\n font-size: 16px;\n line-height: 1;\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.2s;\n min-width: 36px;\n height: 32px;\n opacity: 0.6;\n}\n\n.action-bar-btn[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 16px;\n line-height: 1;\n}\n\n.action-bar-btn[_ngcontent-%COMP%]:hover {\n opacity: 1;\n border-color: var(--mj-text-secondary);\n}\n\n.action-bar-btn.danger[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n}\n\n.action-bar-btn.danger[_ngcontent-%COMP%]:hover {\n opacity: 1;\n background: var(--mj-status-error-bg);\n border-color: var(--mj-status-error);\n}\n\n.action-bar-btn[_ngcontent-%COMP%] i.pinned[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n.action-bar-btn.test-feedback[_ngcontent-%COMP%] {\n color: var(--mj-status-warning);\n}\n\n.action-bar-btn.test-feedback[_ngcontent-%COMP%]:hover {\n opacity: 1;\n background: var(--mj-status-warning-bg);\n border-color: var(--mj-status-warning);\n}\n\n\n.message-status[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n font-size: 12px;\n color: var(--mj-text-secondary);\n padding: 2px 8px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 4px;\n margin-left: 8px;\n animation: _ngcontent-%COMP%_statusPulse 2s ease-in-out infinite;\n}\n\n.message-status[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-size: 11px;\n}\n\n.message-status.error[_ngcontent-%COMP%] {\n background: var(--mj-status-error-bg);\n color: var(--mj-status-error);\n}\n\n.message-status.error[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n}\n\n.status-text[_ngcontent-%COMP%] {\n font-weight: 500;\n}\n\n@keyframes _ngcontent-%COMP%_statusPulse {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.7; }\n}\n\n\n\n\n\n\n\n\n\n.agent-run-icon[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 20px;\n height: 20px;\n color: var(--mj-text-muted);\n cursor: pointer;\n transition: all 0.2s ease;\n user-select: none;\n}\n\n.agent-run-icon[_ngcontent-%COMP%] i.fa-cog[_ngcontent-%COMP%] {\n font-size: 13px;\n}\n\n.agent-run-icon[_ngcontent-%COMP%]:hover {\n color: var(--mj-text-secondary);\n}\n\n.agent-run-icon.expanded[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n transform: scale(1.1);\n}\n\n\n\n.test-feedback-icon[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 20px;\n height: 20px;\n color: var(--mj-text-muted);\n cursor: pointer;\n transition: all 0.2s ease;\n user-select: none;\n}\n\n.test-feedback-icon[_ngcontent-%COMP%] i.fa-flask[_ngcontent-%COMP%] {\n font-size: 13px;\n}\n\n.test-feedback-icon[_ngcontent-%COMP%]:hover {\n color: var(--mj-brand-primary); \n transform: scale(1.1);\n}\n\n@keyframes _ngcontent-%COMP%_rotate {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n\n\n.agent-details-panel[_ngcontent-%COMP%] {\n margin-top: 12px;\n padding: 16px;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n animation: _ngcontent-%COMP%_slideDown 0.2s ease;\n}\n\n@keyframes _ngcontent-%COMP%_slideDown {\n from {\n opacity: 0;\n transform: translateY(-10px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n\n.agent-details-loading[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n color: var(--mj-text-secondary);\n font-size: 13px;\n}\n\n.agent-details-loading[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n\n.agent-details-error[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n color: var(--mj-status-error);\n font-size: 13px;\n}\n\n.agent-details-error[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n}\n\n\n.agent-details-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 12px;\n padding-bottom: 8px;\n border-bottom: 1px solid var(--mj-border-default);\n font-weight: 600;\n font-size: 13px;\n color: var(--mj-text-primary);\n}\n\n.agent-details-header[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n.agent-name-link[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n cursor: pointer;\n text-decoration: none;\n font-weight: 600;\n transition: all 0.2s ease;\n}\n\n.agent-name-link[_ngcontent-%COMP%]:hover {\n color: var(--mj-brand-primary-hover);\n text-decoration: underline;\n}\n\n\n.agent-details-grid[_ngcontent-%COMP%] {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 12px;\n margin-bottom: 12px;\n}\n\n.detail-row[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n padding: 8px 12px;\n background: var(--mj-bg-surface-card);\n border-radius: 6px;\n border: 1px solid var(--mj-border-default);\n}\n\n.detail-label[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-secondary);\n font-weight: 500;\n}\n\n.detail-value[_ngcontent-%COMP%] {\n font-size: 13px;\n color: var(--mj-text-primary);\n font-weight: 600;\n font-family: 'Monaco', 'Menlo', 'Consolas', monospace;\n}\n\n\n.status-badge[_ngcontent-%COMP%] {\n padding: 3px 8px;\n border-radius: 10px;\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n}\n\n.status-badge.status-pending[_ngcontent-%COMP%] {\n background: var(--mj-status-warning-bg);\n color: var(--mj-status-warning-text);\n}\n\n.status-badge.status-running[_ngcontent-%COMP%] {\n background: var(--mj-status-info-bg);\n color: var(--mj-status-info-text);\n}\n\n.status-badge.status-complete[_ngcontent-%COMP%] {\n background: var(--mj-status-success-bg);\n color: var(--mj-status-success-text);\n}\n\n.status-badge.status-failed[_ngcontent-%COMP%], \n.status-badge.status-error[_ngcontent-%COMP%] {\n background: var(--mj-status-error-bg);\n color: var(--mj-status-error-text);\n}\n\n.status-badge.status-cancelled[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n}\n\n\n.run-id-link[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n cursor: pointer;\n text-decoration: none;\n display: inline-flex;\n align-items: center;\n gap: 4px;\n transition: all 0.2s ease;\n}\n\n.run-id-link[_ngcontent-%COMP%]:hover {\n color: var(--mj-brand-primary-hover);\n text-decoration: underline;\n}\n\n.run-id-link[_ngcontent-%COMP%] i.fa-external-link-alt[_ngcontent-%COMP%] {\n font-size: 10px;\n opacity: 0.7;\n}\n\n\n.agent-details-tasks[_ngcontent-%COMP%] {\n margin-top: 16px;\n padding-top: 16px;\n border-top: 1px solid var(--mj-border-default);\n}\n\n.tasks-section-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 12px;\n font-weight: 600;\n font-size: 12px;\n color: var(--mj-text-primary);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.tasks-section-header[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n font-size: 11px;\n}\n\n.tasks-list[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n\n.tasks-list[_ngcontent-%COMP%] mj-task-widget[_ngcontent-%COMP%] {\n display: block;\n}\n\n\n.artifact-version-badge[_ngcontent-%COMP%] {\n display: inline-block;\n margin-left: 8px;\n padding: 2px 8px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-size: 11px;\n font-weight: 600;\n font-family: monospace;\n border-radius: 4px;\n vertical-align: middle;\n}\n\n\n.message-footer[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-top: 8px;\n padding-top: 8px;\n border-top: 1px solid var(--mj-border-default);\n}\n\n.rating-counts[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n font-size: 13px;\n color: var(--mj-text-secondary);\n}\n\n.rating-count[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.rating-count.thumbs-up[_ngcontent-%COMP%] {\n color: var(--mj-status-success);\n}\n\n.rating-count.thumbs-down[_ngcontent-%COMP%] {\n color: var(--mj-status-error);\n}\n\n.rating-total[_ngcontent-%COMP%] {\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n\n.inline-delete[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n}\n\n.message-item.pinned[_ngcontent-%COMP%] {\n border-left: 3px solid var(--mj-status-warning);\n background-color: color-mix(in srgb, var(--mj-status-warning) 8%, transparent);\n}\n\n\n.ai-message-actions[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-left: auto;\n}\n\n.action-bar-btn.pin-btn[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n}\n\n.action-bar-btn.pin-btn[_ngcontent-%COMP%]:hover {\n color: var(--mj-status-warning);\n border-color: var(--mj-status-warning);\n}\n\n.action-bar-btn.pin-btn.pinned[_ngcontent-%COMP%] {\n opacity: 1;\n color: var(--mj-status-warning);\n border-color: var(--mj-status-warning-border);\n background: color-mix(in srgb, var(--mj-status-warning) 10%, var(--mj-bg-surface));\n}\n\n\n.agent-panel-actions[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 8px 0 0;\n margin-top: 8px;\n border-top: 1px solid var(--mj-border-subtle);\n}\n\n\n.agent-details-section[_ngcontent-%COMP%] {\n margin-top: 8px;\n}\n\n\n@media (max-width: 768px) {\n .message-item[_ngcontent-%COMP%] {\n padding: 8px 12px;\n gap: 8px;\n }\n\n .avatar-circle[_ngcontent-%COMP%] {\n width: 32px;\n height: 32px;\n font-size: 14px;\n }\n\n .artifact-card[_ngcontent-%COMP%] {\n max-width: 90vw;\n padding: 12px;\n }\n\n .artifact-card-icon[_ngcontent-%COMP%] {\n width: 32px;\n height: 32px;\n }\n\n .artifact-card-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 16px;\n }\n\n .message-header[_ngcontent-%COMP%] {\n font-size: 12px;\n }\n\n .message-sender[_ngcontent-%COMP%] {\n font-size: 12px;\n }\n\n .message-time[_ngcontent-%COMP%] {\n font-size: 11px;\n }\n\n .agent-badge[_ngcontent-%COMP%] {\n font-size: 10px;\n padding: 1px 6px;\n }\n\n .time-pill[_ngcontent-%COMP%] {\n font-size: 10px;\n padding: 2px 6px;\n }\n\n .message-actions[_ngcontent-%COMP%] {\n gap: 1px;\n padding: 3px;\n }\n\n .message-action-btn[_ngcontent-%COMP%] {\n min-width: 28px;\n height: 28px;\n font-size: 12px;\n }\n}\n\n\n@media (max-width: 480px) {\n .message-item[_ngcontent-%COMP%] {\n padding: 6px 8px;\n gap: 6px;\n }\n\n .avatar-circle[_ngcontent-%COMP%] {\n width: 28px;\n height: 28px;\n font-size: 12px;\n }\n\n .avatar-circle.ai-avatar[_ngcontent-%COMP%] {\n border-radius: 6px;\n }\n\n .artifact-card[_ngcontent-%COMP%] {\n padding: 10px;\n margin-top: 8px;\n }\n\n .artifact-card-header[_ngcontent-%COMP%] {\n gap: 8px;\n }\n\n .artifact-card-icon[_ngcontent-%COMP%] {\n width: 28px;\n height: 28px;\n }\n\n .artifact-card-icon[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 14px;\n }\n\n .artifact-card-label[_ngcontent-%COMP%] {\n font-size: 13px;\n }\n\n .artifact-card-description[_ngcontent-%COMP%] {\n font-size: 12px;\n }\n\n .message-header[_ngcontent-%COMP%] {\n font-size: 11px;\n gap: 6px;\n }\n\n .message-sender[_ngcontent-%COMP%] {\n font-size: 11px;\n }\n\n .message-time[_ngcontent-%COMP%] {\n font-size: 10px;\n }\n\n .agent-badge[_ngcontent-%COMP%] {\n font-size: 9px;\n padding: 1px 5px;\n }\n\n .time-pill[_ngcontent-%COMP%] {\n font-size: 9px;\n padding: 1px 5px;\n }\n\n .thread-indicator[_ngcontent-%COMP%] {\n padding: 4px 8px;\n font-size: 11px;\n margin-top: 6px;\n }\n\n .agent-details-panel[_ngcontent-%COMP%] {\n padding: 12px;\n margin-top: 8px;\n }\n\n .agent-details-grid[_ngcontent-%COMP%] {\n grid-template-columns: 1fr;\n gap: 8px;\n }\n\n .detail-row[_ngcontent-%COMP%] {\n padding: 6px 8px;\n }\n\n .detail-label[_ngcontent-%COMP%], \n .detail-value[_ngcontent-%COMP%] {\n font-size: 11px;\n }\n}\n\n\n[_nghost-%COMP%] .form-response-pill {\n margin: 0 3px;\n transition: all 0.2s ease;\n}\n\n\n[_nghost-%COMP%] .form-response-pill.single-field {\n display: inline-flex;\n align-items: center;\n vertical-align: middle;\n gap: 6px;\n padding: 4px 12px;\n background: var(--mj-status-success);\n color: var(--mj-text-inverse);\n border: 2px solid color-mix(in srgb, var(--mj-status-success) 40%, transparent);\n border-radius: 16px;\n font-size: 13px;\n font-weight: 600;\n box-shadow: var(--mj-shadow-md);\n cursor: default;\n white-space: nowrap;\n}\n\n\n[_nghost-%COMP%] .form-response-pill.multi-field {\n display: inline-block;\n max-width: min(800px, 100%);\n width: auto;\n min-width: 400px;\n margin: 8px 0;\n vertical-align: top;\n}\n\n[_nghost-%COMP%] .form-response-pill.single-field i {\n font-size: 11px;\n opacity: 0.95;\n}\n\n[_nghost-%COMP%] .form-response-pill.single-field strong {\n font-weight: 600;\n margin-right: 4px;\n}\n\n\n[_nghost-%COMP%] .form-response-pill .pill-header {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n background: var(--mj-status-success);\n color: var(--mj-text-inverse);\n font-weight: 600;\n font-size: 13px;\n border-radius: 12px 12px 0 0;\n border: 2px solid color-mix(in srgb, var(--mj-status-success) 40%, transparent);\n border-bottom: none;\n box-shadow: var(--mj-shadow-md);\n}\n\n[_nghost-%COMP%] .form-response-pill .pill-header i {\n font-size: 12px;\n opacity: 0.95;\n}\n\n[_nghost-%COMP%] .form-response-pill .pill-fields {\n padding: 10px 12px;\n background: color-mix(in srgb, var(--mj-status-success) 8%, transparent);\n border: 2px solid color-mix(in srgb, var(--mj-status-success) 40%, transparent);\n border-top: none;\n border-radius: 0 0 12px 12px;\n}\n\n[_nghost-%COMP%] .form-response-pill .pill-field {\n display: flex;\n flex-direction: column;\n gap: 6px;\n padding: 12px 0;\n font-size: 13px;\n}\n\n[_nghost-%COMP%] .form-response-pill .pill-field:not(:last-child) {\n border-bottom: 1px solid color-mix(in srgb, var(--mj-status-success) 20%, transparent);\n padding-bottom: 12px;\n margin-bottom: 0;\n}\n\n[_nghost-%COMP%] .form-response-pill .field-question {\n font-weight: 600;\n color: var(--mj-status-success);\n font-size: 12px;\n line-height: 1.4;\n text-transform: uppercase;\n letter-spacing: 0.3px;\n opacity: 0.9;\n}\n\n[_nghost-%COMP%] .form-response-pill .field-answer {\n color: var(--mj-text-primary);\n font-weight: 400;\n font-size: 15px;\n line-height: 1.6;\n padding: 8px 0 8px 12px;\n background: transparent;\n border-left: 3px solid color-mix(in srgb, var(--mj-status-success) 40%, transparent);\n font-style: italic;\n}\n\n\n\n[_nghost-%COMP%] .form-response-pill.single-field:hover {\n transform: translateY(-1px);\n box-shadow: var(--mj-shadow-lg);\n}\n\n[_nghost-%COMP%] .form-response-pill.multi-field:hover {\n transform: translateY(-1px);\n}\n\n[_nghost-%COMP%] .form-response-pill.multi-field:hover .pill-header {\n box-shadow: var(--mj-shadow-lg);\n}\n\n\n@media (max-width: 600px) {\n [_nghost-%COMP%] .form-response-pill.multi-field {\n min-width: 300px;\n }\n}\n\n@media (max-width: 400px) {\n [_nghost-%COMP%] .form-response-pill.multi-field {\n min-width: 100%;\n }\n\n [_nghost-%COMP%] .form-response-pill .field-question {\n font-size: 11px;\n }\n\n [_nghost-%COMP%] .form-response-pill .field-answer {\n font-size: 14px;\n padding: 6px 0 6px 10px;\n }\n}\n\n\n\n.message-attachments[_ngcontent-%COMP%] {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n margin-top: 12px;\n margin-bottom: 8px;\n}\n\n.attachment-item[_ngcontent-%COMP%] {\n position: relative;\n border-radius: 8px;\n overflow: hidden;\n cursor: pointer;\n transition: transform 0.2s, box-shadow 0.2s;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid color-mix(in srgb, var(--mj-text-primary) 10%, transparent);\n}\n\n.attachment-item[_ngcontent-%COMP%]:hover {\n transform: scale(1.02);\n box-shadow: var(--mj-shadow-md);\n}\n\n.attachment-item.image-attachment[_ngcontent-%COMP%] {\n width: 200px;\n height: 150px;\n}\n\n.attachment-thumbnail[_ngcontent-%COMP%] {\n width: 100%;\n height: 100%;\n object-fit: cover;\n display: block;\n}\n\n.attachment-overlay[_ngcontent-%COMP%] {\n position: absolute;\n inset: 0;\n background: var(--mj-bg-overlay);\n display: flex;\n align-items: center;\n justify-content: center;\n opacity: 0;\n transition: opacity 0.2s;\n}\n\n.attachment-item[_ngcontent-%COMP%]:hover .attachment-overlay[_ngcontent-%COMP%] {\n opacity: 1;\n}\n\n.attachment-overlay[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-text-inverse);\n font-size: 24px;\n}\n\n\n\n\n.attachment-strip[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 8px 12px 8px 8px;\n width: 320px;\n max-width: 100%;\n min-height: 56px;\n cursor: pointer;\n border-radius: 8px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n transition: background 0.15s, border-color 0.15s;\n}\n\n.attachment-strip[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-border-strong);\n}\n\n.attachment-badge[_ngcontent-%COMP%] {\n flex: 0 0 auto;\n min-width: 48px;\n height: 48px;\n padding: 0 10px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 6px;\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n font-size: 11px;\n font-weight: 700;\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-secondary);\n border: 1px solid var(--mj-border-subtle);\n user-select: none;\n text-align: center;\n line-height: 1;\n white-space: nowrap;\n}\n\n.attachment-strip.is-artifact[_ngcontent-%COMP%] .attachment-badge[_ngcontent-%COMP%] {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n border-color: color-mix(in srgb, var(--mj-brand-primary) 25%, transparent);\n}\n\n.attachment-meta[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n min-width: 0; \n gap: 2px;\n}\n\n.attachment-strip[_ngcontent-%COMP%] .file-name[_ngcontent-%COMP%] {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-primary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.attachment-strip[_ngcontent-%COMP%] .file-size[_ngcontent-%COMP%] {\n font-size: 11px;\n color: var(--mj-text-muted);\n}\n\n\n@media (max-width: 600px) {\n .attachment-item.image-attachment[_ngcontent-%COMP%] {\n width: 150px;\n height: 112px;\n }\n\n .attachment-strip[_ngcontent-%COMP%] {\n width: 100%;\n }\n}\n\n[_nghost-%COMP%] .form-response-pill .field-answer-markdown {\n font-style: normal; \n font-size: 13.5px;\n line-height: 1.6;\n color: var(--mj-text-primary);\n}\n[_nghost-%COMP%] .form-response-pill .field-answer-markdown h1, \n[_nghost-%COMP%] .form-response-pill .field-answer-markdown h2, \n[_nghost-%COMP%] .form-response-pill .field-answer-markdown h3, \n[_nghost-%COMP%] .form-response-pill .field-answer-markdown h4 {\n font-size: 13.5px;\n font-weight: 700;\n margin: 10px 0 4px;\n color: var(--mj-text-primary);\n}\n[_nghost-%COMP%] .form-response-pill .field-answer-markdown p {\n margin: 6px 0;\n}\n[_nghost-%COMP%] .form-response-pill .field-answer-markdown ul, \n[_nghost-%COMP%] .form-response-pill .field-answer-markdown ol {\n margin: 6px 0;\n padding-left: 22px;\n}\n[_nghost-%COMP%] .form-response-pill .field-answer-markdown li {\n margin: 3px 0;\n}\n[_nghost-%COMP%] .form-response-pill .field-answer-markdown code {\n font-size: 12px;\n padding: 1px 5px;\n border-radius: 4px;\n background: color-mix(in srgb, var(--mj-status-success) 12%, transparent);\n}\n[_nghost-%COMP%] .form-response-pill .field-answer-markdown table {\n border-collapse: collapse;\n margin: 8px 0;\n}\n[_nghost-%COMP%] .form-response-pill .field-answer-markdown th, \n[_nghost-%COMP%] .form-response-pill .field-answer-markdown td {\n border: 1px solid color-mix(in srgb, var(--mj-status-success) 25%, transparent);\n padding: 4px 10px;\n font-size: 12.5px;\n}", "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n[class^=\"mj-icon-\"][_ngcontent-%COMP%], \n[class*=\" mj-icon-\"][_ngcontent-%COMP%] {\n font-style: normal;\n font-variant: normal;\n text-rendering: auto;\n -webkit-font-smoothing: antialiased;\n display: inline-block;\n font-size: inherit;\n line-height: 1;\n}\n\n\n\n\n\n\n\n\n\n.mj-icon-skip[_ngcontent-%COMP%] {\n width: 1.4em;\n height: 1.4em;\n display: inline-block;\n background-size: contain;\n background-repeat: no-repeat;\n background-position: center;\n \n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 101.89918457031249 96.83947368421053'%3E%3Cg transform='translate(-0.1288232421875,-0.0)'%3E%3Cpath d='M93.85,41.56c-.84,0-1.62.2-2.37.55-3-4.35-7.49-8.12-13.04-11.04l.04-7.18v-14.44h-10.24v17.6c-1.52-.43-3.07-.8-4.67-1.11V0h-10.24v24.72s-.09,0-.14,0h-4.38s-.1,0-.14,0V7.3h-10.24v18.62c-1.6.32-3.15.69-4.67,1.11v-11.67h-10.24v6.09l.04,9.6c-5.55,2.92-10.04,6.7-13.04,11.04-.75-.35-1.53-.55-2.37-.55-4.5,0-8.14,5.61-8.14,12.51s3.64,12.53,8.14,12.53c.58,0,1.14-.12,1.67-.29,4.1,6.62,11.54,12.06,20.98,15.28l.79.13v7.05c0,2.97,1.45,5.58,3.87,6.99,1.18.69,2.5,1.04,3.85,1.03,1.4,0,2.83-.37,4.15-1.12l7.54-4.29,7.56,4.3c1.31.74,2.73,1.12,4.13,1.12s2.67-.35,3.85-1.04c2.42-1.41,3.86-4.02,3.86-6.98v-7.05l.79-.13c9.44-3.22,16.89-8.66,20.98-15.28.54.17,1.09.29,1.68.29,4.5,0,8.14-5.61,8.14-12.53s-3.63-12.51-8.14-12.51' fill='%23AAAAAA'/%3E%3Cpath d='M86.69,50.87c0-12.22-13.6-19.1-28.94-20.66-4.48-.47-9.19-.54-13.52,0-15.34,1.53-28.93,8.41-28.93,20.66,0,8.55,5.7,15.55,12.68,15.55h7.94c3.05,2.5,6.93,4.1,11.08,4.71,2.65.4,5.44.46,8.01,0,4.15-.6,8.05-2.2,11.1-4.71h7.92c6.97,0,12.68-7,12.68-15.55' fill='white' opacity='0.9'/%3E%3Cpath d='M57.83,55.82c-1.19,2.58-3.8,4.35-6.84,4.35s-5.65-1.77-6.84-4.35h13.68Z' fill='%23AAAAAA'/%3E%3Cpath d='M32.52,41.14c1.74,0,3.18,2.13,3.18,4.76s-1.44,4.74-3.18,4.74-3.16-2.13-3.16-4.74,1.41-4.76,3.16-4.76' fill='%23AAAAAA'/%3E%3Cpath d='M69.46,41.14c1.74,0,3.16,2.13,3.16,4.76s-1.41,4.74-3.16,4.74-3.18-2.13-3.18-4.74,1.41-4.76,3.18-4.76' fill='%23AAAAAA'/%3E%3Cpath d='M63.91,76.15c-.82-.48-1.84-.43-2.8.12l-10.13,5.75-10.11-5.75c-.96-.55-1.98-.59-2.8-.12-.82.47-1.29,1.38-1.29,2.49v10.12c0,1.11.47,2.02,1.28,2.49.38.22.8.33,1.24.33.51,0,1.05-.15,1.57-.44l10.12-5.75,10.11,5.75c.52.29,1.05.44,1.56.44.44,0,.86-.11,1.24-.33.81-.48,1.28-1.38,1.28-2.49v-10.12c0-1.11-.47-2.02-1.28-2.49' fill='white' opacity='0.9'/%3E%3C/g%3E%3C/svg%3E\");\n vertical-align: middle;\n}\n\n\n\n\n\n.mj-icon-skip-lightning[_ngcontent-%COMP%]::before {\n content: \"\u26A1\";\n color: var(--mj-brand-primary);\n font-size: 1.1em;\n}\n\n\n\n\n\n.mj-icon-skip-brain[_ngcontent-%COMP%]::before {\n content: \"\uD83E\uDDE0\";\n font-size: 1.2em;\n}\n\n\n\n\n\n.mj-icon-betty[_ngcontent-%COMP%] {\n width: 1.4em;\n height: 1.4em;\n display: inline-block;\n background-size: contain;\n background-repeat: no-repeat;\n background-position: center;\n \n background-image: url(\"data:image/svg+xml,%3Csvg id='a' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 200 150'%3E%3Cpath d='M64.96,60.23h75.12c10.58,0,20.24,4.31,27.2,11.32,7.01,6.95,11.32,16.61,11.32,27.19s-4.31,20.24-11.32,27.19c-6.95,7.02-16.61,11.32-27.2,11.32h-75.12c-10.58,0-20.24-4.31-27.19-11.32-2.65-2.64-4.92-5.6-6.71-8.92-.24,0-.49.06-.74.06-2.46,0-4.67-1.05-6.34-2.65-1.6-1.66-2.58-3.87-2.58-6.34v-18.7c0-2.46.98-4.74,2.58-6.34,1.66-1.66,3.87-2.65,6.34-2.65.25,0,.49,0,.74.06,1.79-3.32,4.06-6.34,6.71-8.92,6.95-7.01,16.61-11.32,27.19-11.32' fill='%233d1252'/%3E%3Cpath d='M132.33,68.36h0c0,1.72-.74,3.32-1.91,4.49-1.11,1.17-2.71,1.84-4.49,1.84h-13.29c-1.78,0-3.32-.68-4.49-1.84-1.17-1.17-1.91-2.77-1.91-4.49h-12.92c-8.37,0-15.94,3.44-21.47,8.92-5.47,5.54-8.92,13.1-8.92,21.47v1.17l.06.37v.37l.06.43v.37l.06.37v.37l.06.37.06.43.06.37.06.37.06.37.06.37c0,.12.06.25.06.37l.06.37.12.37.06.37.12.37.06.37.12.37.12.31.06.37.12.37.12.37.12.31.12.37.12.37.19.31.12.37.12.37.12.31.18.37.12.31.19.31.18.37.12.31.18.31.19.37.18.31.18.31.19.31.18.31c.12.24.25.43.37.68l.19.25.24.31.19.31c.43.62.86,1.23,1.35,1.79l.18.24c.49.62.99,1.17,1.48,1.66.19.19.31.37.49.56.19.12.37.31.56.49.49.49,1.04.98,1.6,1.47l.31.19c.56.49,1.17.92,1.79,1.35.18.12.37.25.55.37l.31.25.31.18.31.19.37.18.31.18.31.19.31.18.31.19.37.12.31.19.31.18c.12.06.24.12.37.12l.31.19.37.12.31.19.37.12.31.12.37.19.37.12.31.12.37.12.37.12.37.06c.24.12.43.18.68.25l.37.12.37.06.37.12c.12,0,.25.06.37.06l.37.06.37.12.37.06.37.06.37.06.37.06.37.06.37.06.43.06h.37l.37.06h.37l.37.06h.8l.37.06h47.56c8.37,0,15.94-3.44,21.47-8.92,5.48-5.54,8.92-13.1,8.92-21.47s-3.44-15.94-8.92-21.47c-5.54-5.48-13.1-8.92-21.47-8.92h-7.75Z' fill='%23fff'/%3E%3Cpolygon points='54.93 12.74 85.57 55.25 106.12 55.25 106.12 34.89 106.12 34.7 105.75 34.7 54.93 12.74' fill='%233aba91'/%3E%3Cpolygon points='111.1 55.25 124.76 55.25 145 27.07 111.35 41.59 111.1 41.59 111.1 41.72 111.1 55.25' fill='%233aba91'/%3E%3Cpath d='M94.55,82.81c3.75,0,6.83,3.81,7.57,8.92.06.74-.31,1.35-.98,1.66-.61.31-1.35.18-1.84-.37-1.29-1.48-2.96-2.34-4.74-2.34s-3.38.86-4.67,2.34c-.49.55-1.23.68-1.91.37-.68-.31-1.05-.92-.92-1.66.68-5.11,3.81-8.92,7.51-8.92' fill='%233d1252'/%3E%3Cpath d='M132.08,115.24c-.31,1.05-.86,2.03-1.66,2.77-1.11,1.17-2.71,1.84-4.49,1.84h-13.29c-1.79,0-3.32-.68-4.49-1.84-.8-.74-1.36-1.72-1.66-2.77-.19-.68.06-1.41.68-1.84.56-.43,1.35-.49,1.97-.06.98.68,2.21,1.05,3.51,1.05h13.29c1.29,0,2.52-.37,3.51-1.05.61-.43,1.41-.37,1.97.06.62.43.86,1.17.68,1.84' fill='%233d1252'/%3E%3Cpath d='M144.02,82.81c3.69,0,6.83,3.81,7.51,8.92.12.74-.24,1.35-.92,1.66-.68.31-1.41.18-1.91-.37-1.29-1.48-2.89-2.34-4.67-2.34s-3.44.86-4.74,2.34c-.49.55-1.23.68-1.84.37-.68-.31-1.05-.92-.98-1.66.74-5.11,3.81-8.92,7.57-8.92' fill='%233d1252'/%3E%3C/svg%3E\");\n vertical-align: middle;\n}\n\n\n\n\n\n.mj-icon-izzy[_ngcontent-%COMP%] {\n width: 1.4em;\n height: 1.4em;\n display: inline-block;\n background-size: contain;\n background-repeat: no-repeat;\n background-position: center;\n \n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 204 180'%3E%3Cpath d='M0 0 C3.61144774 3.08477828 4.84942137 4.90830493 5.5 9.625 C5 13 5 13 3.5 14.9375 C1.74432121 17.35155834 1.83578869 18.21944114 1.90625 21.12890625 C1.9371875 22.40636719 1.968125 23.68382813 2 25 C3.18335937 24.72285156 4.36671875 24.44570313 5.5859375 24.16015625 C22.44010416 20.26839867 22.44010416 20.26839867 30 20 C31.80210938 19.92265625 31.80210938 19.92265625 33.640625 19.84375 C47.49356199 19.44904163 61.73614427 20.86627802 75 25 C75.53596907 19.64244551 75.53596907 19.64244551 73.5 15 C71.5549761 12.4066348 71.45048389 10.16629658 71.59375 6.97265625 C72.33633815 3.36681955 74.01253991 1.99164006 77 0 C79.80907914 -0.63997166 82.18961327 -0.63020793 85 0 C87.8100346 1.79363911 89.50940468 3.01880935 91 6 C90.984375 8.05859375 90.984375 8.05859375 90.75 10.4375 C90.68296875 11.21996094 90.6159375 12.00242187 90.546875 12.80859375 C90 15 90 15 88.49609375 16.3984375 C86.25734576 18.79500846 86.4852344 20.97464008 86.3125 24.1875 C86.21388672 25.81751953 86.21388672 25.81751953 86.11328125 27.48046875 C86.07589844 28.31191406 86.03851563 29.14335937 86 30 C86.67675781 30.0825 87.35351562 30.165 88.05078125 30.25 C91.82333306 31.20937741 94.89353787 32.99425194 98.1875 35 C99.18052124 35.60448975 99.18052124 35.60448975 100.19360352 36.22119141 C111.98050012 43.58460075 121.17745776 53.2687532 127 66 C127 66.66 127 67.32 127 68 C127.721875 68.0825 128.44375 68.165 129.1875 68.25 C133.81406141 69.48374971 136.2179022 71.66516963 138.625 75.7734375 C140.97801199 81.55147269 140.43210927 87.87027126 140.375 94 C140.38660156 95.24523437 140.39820313 96.49046875 140.41015625 97.7734375 C140.3675701 111.08870765 140.3675701 111.08870765 135.5 116.7421875 C131.62323281 119.66995439 128.8523137 121.14337998 124 121.125 C122.9790625 121.12886719 122.9790625 121.12886719 121.9375 121.1328125 C120 121 120 121 117 120 C116.74347656 120.65226562 116.48695313 121.30453125 116.22265625 121.9765625 C115.83980469 122.85054688 115.45695313 123.72453125 115.0625 124.625 C114.70285156 125.48351562 114.34320313 126.34203125 113.97265625 127.2265625 C108.57908063 134.80960941 99.56813916 137.59212379 91.0625 140.375 C90.02287109 140.72949219 88.98324219 141.08398438 87.91210938 141.44921875 C80.34347852 144 80.34347852 144 78 144 C78.02094727 144.65484375 78.04189453 145.3096875 78.06347656 145.984375 C78.14730383 148.98942328 78.19886895 151.99422464 78.25 155 C78.28351563 156.02996094 78.31703125 157.05992187 78.3515625 158.12109375 C78.43361416 164.56214867 77.93369275 169.71304442 74 175 C68.75523423 179.17440541 64.68195675 180.53237245 58 180 C55.12653443 178.963898 52.49379495 177.58020045 49.8125 176.125 C49.11447266 175.76019531 48.41644531 175.39539063 47.69726562 175.01953125 C46.39868999 174.33997216 45.10309803 173.65465367 43.81176758 172.96142578 C43.21388428 172.64415527 42.61600098 172.32688477 42 172 C41.34290039 171.59402588 40.68580078 171.18805176 40.00878906 170.76977539 C38.03672401 169.77639533 38.03672401 169.77639533 36.12475586 170.58325195 C35.49448486 170.96441162 34.86421387 171.34557129 34.21484375 171.73828125 C33.17166992 172.35026367 33.17166992 172.35026367 32.10742188 172.97460938 C31.39134766 173.41611328 30.67527344 173.85761719 29.9375 174.3125 C28.51029236 175.1647359 27.08194984 176.01507485 25.65234375 176.86328125 C25.02320068 177.24782471 24.39405762 177.63236816 23.74584961 178.02856445 C19.79572932 180.2265128 16.44037501 180.296025 12 180 C6.82155197 178.33236419 3.95074467 176.59004726 1 172 C-0.72417326 168.34258111 -1.2403609 165.51230089 -1.1953125 161.48046875 C-1.18886719 160.45888672 -1.18242188 159.43730469 -1.17578125 158.38476562 C-1.15902344 157.32966797 -1.14226563 156.27457031 -1.125 155.1875 C-1.11597656 154.11306641 -1.10695312 153.03863281 -1.09765625 151.93164062 C-1.07415306 149.28753146 -1.04129575 146.64388128 -1 144 C-1.63196289 143.81171631 -2.26392578 143.62343262 -2.91503906 143.42944336 C-8.20708475 141.84808949 -13.49207901 140.2541307 -18.75 138.5625 C-19.98234375 138.17191406 -21.2146875 137.78132812 -22.484375 137.37890625 C-29.06200008 134.79901552 -34.12925122 130.90130551 -38 125 C-38.875 121.5625 -38.875 121.5625 -39 119 C-39.495 119.33 -39.99 119.66 -40.5 120 C-45.24354984 121.89741993 -49.49426304 121.53143657 -54.1875 119.875 C-58.42051121 117.05299253 -61.35909664 113.92271008 -63 109 C-63.22709306 104.92471184 -63.22828659 100.8492307 -63.24023438 96.76806641 C-63.2498982 94.77103695 -63.28108516 92.77414948 -63.3125 90.77734375 C-63.36188158 78.59243786 -63.36188158 78.59243786 -60 73 C-57.7509823 70.86631654 -55.88785241 69.35340008 -53.0078125 68.20703125 C-50.3010212 66.57979679 -49.65488803 64.83796148 -48.3125 62 C-45.06106922 55.7428385 -40.95735135 50.97447519 -36 46 C-35.40832031 45.38511719 -34.81664063 44.77023438 -34.20703125 44.13671875 C-28.97373562 39.11136864 -17.47215548 30 -10 30 C-10.08733973 27.91589342 -10.19552278 25.83265331 -10.3125 23.75 C-10.37050781 22.58984375 -10.42851563 21.4296875 -10.48828125 20.234375 C-11.02905532 16.81635262 -11.84853545 15.59874271 -14 13 C-14.54046356 8.75350057 -14.48376179 6.74176808 -12.125 3.125 C-8.57275398 -0.42724602 -4.8825369 -0.970906 0 0 Z M5 35 C4.30245605 35.21962402 3.60491211 35.43924805 2.88623047 35.66552734 C-14.1501062 41.15773444 -29.02751477 50.81254544 -39 66 C-39.33 66.99 -39.66 67.98 -40 69 C-37.525 70.98 -37.525 70.98 -35 73 C-34.52691406 72.29875 -34.05382812 71.5975 -33.56640625 70.875 C-21.08320269 52.96537462 -2.17172019 42.38052109 19.26171875 38.5078125 C46.97805996 34.9959591 75.10426623 38.71529466 97.73046875 56.09765625 C103.53827054 61.07953766 107.9264808 66.53902088 112 73 C113.32 72.01 114.64 71.02 116 70 C115.01713954 61.60788376 107.55262518 55.04847712 101.375 49.8125 C82.80696113 35.82916208 61.35998978 30.59265576 38.375 30.625 C37.71836365 30.62554382 37.06172729 30.62608765 36.38519287 30.62664795 C25.42439402 30.66823796 15.42390121 31.62072499 5 35 Z' fill='%234E3B78' transform='translate(63,0)'/%3E%3Cpath d='M0 0 C5.27957047 5.78547525 9.31612861 13.25448014 10 21.125 C9.69743213 24.83293961 8.77676366 26.8914086 6.1875 29.5625 C-2.04152489 35.76003038 -13.60917874 39.6270706 -23.875 38.8125 C-24.535 38.1525 -25.195 37.4925 -25.875 36.8125 C-28.97847254 36.48234335 -31.03281176 36.30718706 -33.75 37.9375 C-35.40354531 40.69340884 -35.26865568 42.66325452 -34.875 45.8125 C-33.95833333 47.89583333 -33.95833333 47.89583333 -31.875 48.8125 C-28.29166667 48.89583333 -28.29166667 48.89583333 -24.875 47.8125 C-24.57086182 47.16466553 -24.26672363 46.51683105 -23.95336914 45.84936523 C-22.875 43.8125 -22.875 43.8125 -20.77124023 42.88696289 C-19.91731689 42.6883667 -19.06339355 42.48977051 -18.18359375 42.28515625 C-17.23806641 42.04990234 -16.29253906 41.81464844 -15.31835938 41.57226562 C-14.32642578 41.34216797 -13.33449219 41.11207031 -12.3125 40.875 C-4.77934417 39.10870895 1.54823541 36.95205932 8.125 32.8125 C7.81647145 40.06292099 4.56245219 45.32546918 -0.5 50.4609375 C-5.29811284 54.61130511 -8.83216751 54.86916719 -15 55 C-21.13677833 55.26569953 -25.04589225 56.51893716 -29.890625 60.31640625 C-39.17633501 67.31724667 -52.82450605 66.52799961 -63.875 65.8125 C-71.37432145 64.60538489 -79.4496824 61.2378176 -84.875 55.8125 C-86.81199027 55.70419517 -88.75076074 55.60687514 -90.69067383 55.58691406 C-97.68300211 55.51299157 -103.12007731 55.4392364 -108.44140625 50.40234375 C-108.91449219 49.87769531 -109.38757813 49.35304688 -109.875 48.8125 C-110.6175 48.090625 -111.36 47.36875 -112.125 46.625 C-118.35765562 36.60823203 -119.69570866 25.34707186 -117.25 13.8828125 C-113.47065738 3.0509466 -104.76645407 -4.0120534 -94.875 -9.1875 C-91.26850975 -10.75400624 -87.62602625 -12.0153043 -83.875 -13.1875 C-83.029375 -13.47496094 -82.18375 -13.76242188 -81.3125 -14.05859375 C-56.0861494 -22.29657387 -20.04377266 -18.06142152 0 0 Z' fill='%23FDFDFD' transform='translate(155.875,64.1875)'/%3E%3Cpath d='M0 0 C5.24479788 1.58079188 9.51172656 4.60408712 14.06640625 7.58984375 C18.37837094 10.28462973 18.37837094 10.28462973 23.30859375 11.1328125 C28.49696048 9.20971132 33.08639658 6.29555589 37.79882812 3.42578125 C43.66838131 -0.00837477 43.66838131 -0.00837477 47.27734375 0.078125 C49.34375 1.0078125 49.34375 1.0078125 51.34375 3.0078125 C51.82984303 7.30136192 51.71414913 11.62739332 51.71875 15.9453125 C51.74324219 17.15123047 51.76773438 18.35714844 51.79296875 19.59960938 C51.79876953 21.33114258 51.79876953 21.33114258 51.8046875 23.09765625 C51.81290527 24.15847412 51.82112305 25.21929199 51.82958984 26.31225586 C51.34375 29.0078125 51.34375 29.0078125 49.48461914 30.87670898 C46.29658529 32.56106989 44.78123809 32.062357 41.34375 31.0078125 C37.60135447 29.03986817 34.07891261 26.72386924 30.53320312 24.42578125 C26.44214688 21.80182316 26.44214688 21.80182316 21.77734375 20.921875 C17.60401055 22.78413283 13.85973006 25.2663764 10.046875 27.76953125 C5.85335687 30.41401513 2.44659272 31.9581498 -2.65625 32.0078125 C-4.33203125 30.87695312 -4.33203125 30.87695312 -5.65625 29.0078125 C-6.04443359 26.328125 -6.04443359 26.328125 -6.0546875 23.1328125 C-6.05855469 21.98296875 -6.06242187 20.833125 -6.06640625 19.6484375 C-6.05480469 18.44703125 -6.04320313 17.245625 -6.03125 16.0078125 C-6.04285156 14.80640625 -6.05445312 13.605 -6.06640625 12.3671875 C-6.06253906 11.21734375 -6.05867188 10.0675 -6.0546875 8.8828125 C-6.05130371 7.82835937 -6.04791992 6.77390625 -6.04443359 5.6875 C-5.65625 3.0078125 -5.65625 3.0078125 -4.29736328 1.14111328 C-2.65625 0.0078125 -2.65625 0.0078125 0 0 Z' fill='%23FCFCFD' transform='translate(78.65625,136.9921875)'/%3E%3Cpath d='M0 0 C2.5 0.625 2.5 0.625 4.8125 2.625 C6.96830116 6.4575354 7.24792603 9.32007692 6.5 13.625 C5.34367254 15.98793002 4.35016245 17.77483755 2.5 19.625 C0.1875 20 0.1875 20 -2.5 19.625 C-5.06638215 17.47478793 -6.29103188 15.79226637 -6.88671875 12.46484375 C-7.08084032 8.45522921 -6.77549931 6.12498023 -4.8125 2.5625 C-2.5 0.625 -2.5 0.625 0 0 Z' fill='%2353417C' transform='translate(138.5,67.375)'/%3E%3Cpath d='M0 0 C2.5 0.6875 2.5 0.6875 4.8125 2.625 C7.08407605 6.74748987 7.32547179 10.07653131 6.5 14.6875 C4.8125 17.75 4.8125 17.75 2.5 19.6875 C-0.0625 20.25 -0.0625 20.25 -2.5 19.6875 C-5.30401904 17.38419865 -5.84979387 14.76309142 -6.4375 11.3125 C-6.72853275 7.71913649 -6.44645777 6.57011897 -4.875 3.125 C-2.5 0.6875 -2.5 0.6875 0 0 Z' fill='%23523F7B' transform='translate(64.5,67.3125)'/%3E%3Cpath d='M0 0 C8.91 0 17.82 0 27 0 C24.81183076 5.47042311 24.169236 6.55141452 19 9 C14.08609728 9.94526984 9.88605617 10.13992406 5.51171875 7.49609375 C3.4733513 5.76185217 1.65854906 4.10051199 0 2 C0 1.34 0 0.68 0 0 Z' fill='%23574680' transform='translate(88,95)'/%3E%3C/svg%3E\");\n vertical-align: middle;\n}\n\n\n\n\n\n\n\n\n.mj-icon-data-analyst[_ngcontent-%COMP%]::before {\n content: \"\uD83D\uDCCA\";\n font-size: 1.1em;\n}\n\n\n\n\n.mj-icon-api[_ngcontent-%COMP%]::before {\n content: \"\uD83D\uDD0C\";\n font-size: 1.1em;\n}\n\n\n\n\n.mj-icon-processing[_ngcontent-%COMP%]::before {\n content: \"\u2699\uFE0F\";\n display: inline-block;\n animation: _ngcontent-%COMP%_rotate-icon 2s linear infinite;\n}\n\n@keyframes _ngcontent-%COMP%_rotate-icon {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n}\n\n\n\n\n\n.mj-icon-monogram-s[_ngcontent-%COMP%]::before {\n content: \"S\";\n font-weight: 800;\n font-family: system-ui, -apple-system, sans-serif;\n font-size: 1.1em;\n color: var(--mj-brand-primary);\n}\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"] });
2065
2835
  }
2066
2836
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(MessageItemComponent, [{
2067
2837
  type: Component,
2068
- args: [{ standalone: false, selector: 'mj-conversation-message-item', template: "<div [class]=\"messageClasses\" [attr.data-message-id]=\"message.ID\" (click)=\"onMessageBubbleClick($event)\">\n <div class=\"message-avatar\">\n <div class=\"avatar-circle\" [class.ai-avatar]=\"isAIMessage\" [class.user-avatar]=\"isUserMessage\"\n [class.avatar-has-image]=\"isAIMessage && effectiveAssistantAvatarUrl !== null\">\n @if (isUserMessage) {\n @if (userAvatarUrl) {\n <img [src]=\"userAvatarUrl\" alt=\"User avatar\" class=\"avatar-image\" />\n } @else if (userAvatarIconClass) {\n <i [class]=\"userAvatarIconClass\"></i>\n } @else {\n <i class=\"fas fa-user\"></i>\n }\n } @else if (isAIMessage) {\n @if (effectiveAssistantAvatarUrl) {\n <img [src]=\"effectiveAssistantAvatarUrl\" alt=\"Assistant avatar\" class=\"avatar-image\"\n (error)=\"assistantAvatarFailed = true\" />\n } @else {\n <i class=\"fas\" [ngClass]=\"aiAgentInfo?.iconClass || 'fa-robot'\"></i>\n }\n }\n </div>\n </div>\n\n <div class=\"message-content\">\n <div class=\"message-header\">\n <span class=\"message-sender\" [title]=\"isAIMessage ? (aiAgentInfo?.role || 'AI Assistant') : ''\">\n {{ isAIMessage ? (aiAgentInfo?.name || 'AI Assistant') : messageSenderName }}\n </span>\n <span class=\"message-time\">{{ message.__mj_CreatedAt | date:'short' }}</span>\n\n <!-- Status indicator for user messages -->\n @if (isUserMessage && messageStatus !== 'Complete') {\n <span class=\"message-status\" [class.error]=\"messageStatus === 'Error'\">\n <i class=\"fas\" [ngClass]=\"messageStatus === 'Error' ? 'fa-exclamation-triangle' : 'fa-circle-notch fa-spin'\"></i>\n <span class=\"status-text\">{{ getStatusText() }}</span>\n </span>\n }\n\n <!-- Edit (owner's completed user messages) \u2014 opens the inline editor; the server\n sets OriginalMessageChanged when the text actually changes on save -->\n @if (allowMessageEdit && isUserMessage && isConversationOwner && !isEditing && messageStatus === 'Complete') {\n <span class=\"message-edit-icon\" (click)=\"onEditClick()\" title=\"Edit message\">\n <i class=\"fas fa-pen\"></i>\n </span>\n }\n\n <!-- Time pill - shows for AI messages in all states (in-progress, active, complete, failed) -->\n @if (!isUserMessage && timePillText) {\n <span\n class=\"time-pill\"\n [class.in-progress]=\"isInProgressAIMessage\"\n [class.active]=\"!isInProgressAIMessage && isAgentRunActive\"\n [class.complete]=\"!isInProgressAIMessage && !isAgentRunActive && messageStatus === 'Complete'\"\n [class.failed]=\"messageStatus === 'Error'\">\n <i class=\"fas fa-clock\"></i>\n {{ timePillText }}\n </span>\n }\n\n <!-- Test feedback icon (appears for test runs only) -->\n @if (message.TestRunID) {\n <span\n class=\"test-feedback-icon\"\n (click)=\"onTestFeedbackClick()\"\n title=\"Provide Test Feedback\">\n <i class=\"fas fa-flask\"></i>\n </span>\n }\n\n <!-- Agent run icon (clickable to expand details) - always rightmost when present.\n Rendered only when its panel would actually have content, so it never\n appears as a dead control opening an empty popup (e.g. a white-label\n surface with showAgentRunDetails=false and no message actions). -->\n @if (hasAgentRun && hasAgentDetailsPanelContent) {\n <span\n class=\"agent-run-icon\"\n (click)=\"toggleAgentDetails()\"\n [class.expanded]=\"isAgentDetailsExpanded\"\n [title]=\"hasRatings() ? 'Agent details & ' + getRatingCount() + ' rating(s)' : 'Click to view agent execution details'\">\n <i class=\"fas fa-cog\"></i>\n @if (hasRatings()) {\n <span class=\"rating-badge\">{{ getRatingCount() }}</span>\n }\n </span>\n }\n </div>\n\n <div class=\"message-body\">\n @if (!isEditing) {\n <div class=\"message-text\">\n <mj-markdown [data]=\"displayMessage\" [enableCollapsibleHeadings]=\"true\"></mj-markdown>\n @if (isMessageEdited) {\n <span class=\"edited-badge\">(edited)</span>\n }\n </div>\n\n <!-- messageExtra slot \u2014 per-message additive decoration projected by the\n consumer via `mjChatSlot=\"messageExtra\"`. Renders after the message\n content, before attachments. Receives the message as $implicit. -->\n @if (messageExtraTemplate) {\n <ng-container *ngTemplateOutlet=\"messageExtraTemplate; context: {\n $implicit: message,\n message: message\n }\"></ng-container>\n }\n\n <!-- Message Attachments -->\n @if (hasAttachments) {\n <div class=\"message-attachments\">\n @for (attachment of attachments; track attachment.id) {\n @if (attachment.type === 'Image') {\n <div class=\"attachment-item image-attachment\"\n (click)=\"onAttachmentClick(attachment)\"\n [title]=\"attachment.fileName || 'Image attachment'\">\n <img\n [src]=\"attachment.thumbnailUrl || attachment.contentUrl\"\n [alt]=\"attachment.fileName || 'Image attachment'\"\n class=\"attachment-thumbnail\"\n loading=\"lazy\">\n <div class=\"attachment-overlay\">\n <i class=\"fas fa-expand\"></i>\n </div>\n </div>\n } @else {\n <div class=\"attachment-strip\"\n [class.is-artifact]=\"!!attachment.artifactTypeName\"\n (click)=\"onAttachmentClick(attachment)\"\n [title]=\"attachment.fileName || 'File'\">\n <div class=\"attachment-badge\">{{ badgeTextFor(attachment) }}</div>\n <div class=\"attachment-meta\">\n <span class=\"file-name\">{{ attachment.fileName || 'File' }}</span>\n <span class=\"file-size\">{{ formatFileSize(attachment.sizeBytes) }}</span>\n </div>\n </div>\n }\n }\n </div>\n }\n\n <!-- Artifact Message Cards \u2014 one per distinct artifact on this message -->\n @for (a of displayArtifacts; track a.artifact.ID) {\n <div class=\"artifact-wrapper\" [class.system-artifact]=\"a.artifact.Visibility === 'System Only'\">\n <mj-artifact-message-card\n [artifactId]=\"a.artifact.ID\"\n [artifact]=\"a.artifact\"\n [artifactVersion]=\"a.version\"\n [currentUser]=\"currentUser\"\n (actionPerformed)=\"onArtifactActionPerformed($event)\">\n </mj-artifact-message-card>\n </div>\n }\n\n <!-- One per attached artifact whose rows are still loading. Rendered AFTER the loaded\n cards, so an artifact arriving appends rather than reordering what is already on\n screen. Carries the same system-artifact de-emphasis as the card it becomes. -->\n @for (pending of pendingArtifactPlaceholders; track pending.artifactId) {\n <div class=\"artifact-wrapper\" [class.system-artifact]=\"pending.visibility === 'System Only'\">\n <div class=\"artifact-pending\">\n <mj-loading [text]=\"pendingLabel(pending)\" size=\"small\"></mj-loading>\n </div>\n </div>\n }\n\n <!-- Agent Response Form (shown only for last message by owner) -->\n @if (isLastMessageInConversation && isConversationOwner && responseForm) {\n <mj-dynamic-form\n [FormDefinition]=\"responseForm\"\n [Disabled]=\"isProcessing\"\n (FormSubmitted)=\"onFormSubmitted($event)\">\n </mj-dynamic-form>\n }\n\n <!-- Actionable Commands (shown only for last message by owner) -->\n @if (isLastMessageInConversation && isConversationOwner && actionableCommands.length > 0) {\n <mj-actionable-commands\n [commands]=\"actionableCommands\"\n [disabled]=\"isProcessing\"\n [isLastMessage]=\"isLastMessageInConversation\"\n [isConversationOwner]=\"isConversationOwner\"\n (commandExecuted)=\"onCommandExecuted($event)\">\n </mj-actionable-commands>\n }\n }\n\n @if (isEditing) {\n <div class=\"message-edit-container\">\n <textarea\n class=\"message-edit-textarea\"\n [(ngModel)]=\"editedText\"\n (keydown)=\"onEditKeydown($event)\"\n rows=\"4\"\n placeholder=\"Edit your message...\"></textarea>\n <div class=\"edit-actions\">\n <button class=\"edit-action-btn save\" (click)=\"saveEdit()\">\n <i class=\"fas fa-check\"></i>\n Save\n </button>\n <button class=\"edit-action-btn cancel\" (click)=\"cancelEditing()\">\n <i class=\"fas fa-times\"></i>\n Cancel\n </button>\n </div>\n <div class=\"edit-hint\">\n Press Enter to save, Shift+Enter for new line, Escape to cancel\n </div>\n </div>\n }\n </div>\n\n <!-- Message Footer: only rendered on the last message.\n Non-last messages have no footer \u2014 pin/delete/rating live in the gear panel. -->\n @if (!isEditing && isLastMessage && (isConversationOwner || (isAIMessage && messageStatus === 'Complete'))) {\n <div class=\"message-footer\">\n @if (allowMessageDelete && isConversationOwner) {\n <button class=\"action-bar-btn danger inline-delete\" (click)=\"onDeleteClick()\" title=\"Delete this message and all messages below it\">\n <i class=\"fas fa-trash\"></i>\n </button>\n }\n @if (isAIMessage && messageStatus === 'Complete') {\n <div class=\"ai-message-actions\">\n <!-- Thumbs visible inline only on the latest AI message, left of pin -->\n @if (showMessageRating) {\n <mj-conversation-message-rating\n [conversationDetailId]=\"message.ID\"\n [currentUser]=\"currentUser\"\n [ratingEntityName]=\"message.EntityInfo.Name || 'MJ: Conversation Details'\"\n [ratingsData]=\"ratings\"\n [canEdit]=\"isConversationOwner\">\n </mj-conversation-message-rating>\n }\n @if (allowPinning) {\n <button\n class=\"action-bar-btn pin-btn\"\n [class.pinned]=\"message.IsPinned\"\n (click)=\"PinMessage()\"\n [title]=\"message.IsPinned ? 'Unpin message' : 'Pin message'\"\n type=\"button\">\n <i class=\"fas fa-thumbtack\"></i>\n </button>\n }\n </div>\n }\n </div>\n }\n\n <!-- Agent details content section -->\n <div class=\"agent-details-section\">\n <!-- Agent Run Details Panel (expandable) -->\n @if (isAgentDetailsExpanded && hasAgentRun) {\n <!-- Agent Run Details Panel -->\n <div class=\"agent-details-panel\">\n @if (agentRun && showAgentRunDetails) {\n <div class=\"agent-details-content\">\n <div class=\"agent-details-header\">\n <i class=\"fas fa-chart-line\"></i>\n <span>\n <!-- Deliberately the ENGINE-resolved name: this header labels the real\n agent's diagnostics, and the link opens the real agent record \u2014 a\n host assistantDisplayName override must not relabel either. -->\n <a class=\"agent-name-link\" (click)=\"openAgentRecord()\" title=\"Open agent details\">\n {{ engineAgentInfo?.name || 'Agent' }}\n </a>\n Run Details\n </span>\n </div>\n\n <!-- Run-detail grid (run ID, step/token counts, $ cost, status) \u2014 developer/\n observability data. The whole run-details section (this grid AND its\n header above) is gated on showAgentRunDetails at the panel root, so a\n white-labeled surface hides all of it; the delete/pin/rating overflow\n below is a sibling block (outside this @if) and still renders. -->\n <div class=\"agent-details-grid\">\n <div class=\"detail-row\">\n <span class=\"detail-label\">Run ID:</span>\n <span class=\"detail-value\">\n <a class=\"run-id-link\" (click)=\"openAgentRunRecord()\" title=\"Open agent run details\">\n {{ agentRun.ID }}\n <i class=\"fas fa-external-link-alt\"></i>\n </a>\n </span>\n </div>\n\n @if (agentRunStepCount > 0) {\n <div class=\"detail-row\">\n <span class=\"detail-label\">Steps:</span>\n <span class=\"detail-value\">{{ agentRunStepCount }}</span>\n </div>\n }\n\n @if (agentRunTotalTokens > 0) {\n <div class=\"detail-row\">\n <span class=\"detail-label\">Tokens:</span>\n <span class=\"detail-value\">{{ formatNumber(agentRunTotalTokens) }}</span>\n </div>\n }\n\n @if (agentRunTotalCost > 0) {\n <div class=\"detail-row\">\n <span class=\"detail-label\">Cost:</span>\n <span class=\"detail-value\">\\${{ agentRunTotalCost.toFixed(4) }}</span>\n </div>\n }\n\n @if (agentRun.Status) {\n <div class=\"detail-row\">\n <span class=\"detail-label\">Status:</span>\n <span class=\"detail-value status-badge\" [class]=\"'status-' + agentRun.Status.toLowerCase()\">\n {{ agentRun.Status }}\n </span>\n </div>\n }\n </div>\n </div>\n }\n\n <!-- Delete + Rating + Pin in gear panel for non-last messages \u2014 mirrors last-message footer layout -->\n @if (!isLastMessage) {\n <div class=\"agent-panel-actions\">\n @if (allowMessageDelete && isConversationOwner) {\n <button class=\"action-bar-btn danger\" (click)=\"onDeleteClick()\" title=\"Delete this message and all messages below it\">\n <i class=\"fas fa-trash\"></i>\n </button>\n }\n @if (messageStatus === 'Complete') {\n <div class=\"ai-message-actions\">\n @if (showMessageRating) {\n <mj-conversation-message-rating\n [conversationDetailId]=\"message.ID\"\n [currentUser]=\"currentUser\"\n [ratingsData]=\"ratings\"\n [canEdit]=\"isConversationOwner\">\n </mj-conversation-message-rating>\n }\n @if (allowPinning) {\n <button\n class=\"action-bar-btn pin-btn\"\n [class.pinned]=\"message.IsPinned\"\n (click)=\"PinMessage()\"\n [title]=\"message.IsPinned ? 'Unpin message' : 'Pin message'\"\n type=\"button\">\n <i class=\"fas fa-thumbtack\"></i>\n </button>\n }\n </div>\n } @else if (allowPinning) {\n <button\n class=\"action-bar-btn pin-btn\"\n [class.pinned]=\"message.IsPinned\"\n (click)=\"PinMessage()\"\n [title]=\"message.IsPinned ? 'Unpin message' : 'Pin message'\"\n type=\"button\">\n <i class=\"fas fa-thumbtack\"></i>\n </button>\n }\n </div>\n }\n\n <!-- Tasks Section -->\n @if (detailTasks.length > 0) {\n <div class=\"agent-details-tasks\">\n <div class=\"tasks-section-header\">\n <i class=\"fas fa-tasks\"></i>\n <span>Associated Tasks ({{ detailTasks.length }})</span>\n </div>\n <div class=\"tasks-list\">\n @for (task of detailTasks; track task) {\n <mj-task-widget\n [task]=\"task\"\n [compact]=\"false\"\n [clickable]=\"false\"\n [showProgress]=\"true\"\n [showDuration]=\"true\">\n </mj-task-widget>\n }\n </div>\n </div>\n }\n </div>\n }\n </div>\n\n <!-- Rating component moved to message footer (lines 113-134) -->\n\n <!-- Removed message-actions hover panel - actions now in gear icon dropdown -->\n <!-- Retry button kept for critical error recovery on failed messages -->\n @if (messageStatus === 'Error' && isAIMessage && !isProcessing && !isEditing) {\n <div class=\"message-actions\">\n <button class=\"message-action-btn retry-btn\" (click)=\"onRetryClick()\" title=\"Retry\">\n <i class=\"fas fa-redo\"></i>\n Retry\n </button>\n </div>\n }\n\n <!-- Reaction Buttons -->\n @if (showReactions && !isProcessing && !isInProgressAIMessage && !isEditing) {\n <div class=\"message-reactions\">\n <button class=\"reaction-btn\" (click)=\"toggleReaction('like')\">\n <i class=\"far fa-thumbs-up\"></i>\n <span class=\"reaction-count\">0</span>\n </button>\n <button class=\"reaction-btn\" (click)=\"toggleReaction('comment')\">\n <i class=\"far fa-comment\"></i>\n <span class=\"reaction-count\">0</span>\n </button>\n </div>\n }\n </div>\n</div>", styles: [".message-item {\n display: flex;\n gap: 12px;\n padding: 8px 24px;\n transition: background-color 150ms ease;\n animation: fadeIn 0.3s ease;\n position: relative;\n}\n\n@keyframes fadeIn {\n from {\n opacity: 0;\n transform: translateY(10px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n.message-item.ai-message {\n background-color: transparent;\n}\n\n.message-item.user-message {\n background-color: transparent;\n}\n\n/* Jump-to beacon: pulsed amber glow applied programmatically after scroll */\n.message-item.pin-beacon {\n animation: pinBeacon 1.5s ease-out forwards;\n}\n\n@keyframes pinBeacon {\n 0% { box-shadow: 0 0 0 0 color-mix(in srgb, var(--mj-status-warning) 60%, transparent); }\n 20% { box-shadow: 0 0 0 8px color-mix(in srgb, var(--mj-status-warning) 35%, transparent); }\n 50% { box-shadow: 0 0 0 4px color-mix(in srgb, var(--mj-status-warning) 15%, transparent); }\n 70% { box-shadow: 0 0 0 6px color-mix(in srgb, var(--mj-status-warning) 20%, transparent); }\n 100% { box-shadow: none; }\n}\n\n.message-item.in-progress {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n border-left: 3px solid var(--mj-brand-primary);\n position: relative;\n}\n\n@keyframes shimmer {\n 0% {\n background-position: -200% 0;\n }\n 100% {\n background-position: 200% 0;\n }\n}\n\n/* Progress message styling - make it visually distinct */\n.message-item.in-progress .message-text {\n color: var(--mj-text-primary);\n font-weight: 500;\n max-height: 150px;\n overflow-y: auto;\n display: block;\n}\n\n\n/* Pulse effect for avatar */\n.message-item.in-progress .avatar-circle {\n box-shadow: 0 0 0 0 color-mix(in srgb, var(--mj-brand-primary) 70%, transparent);\n animation: pulse 2s ease-in-out infinite;\n}\n\n@keyframes pulse {\n 0%, 100% {\n box-shadow: 0 0 0 0 color-mix(in srgb, var(--mj-brand-primary) 70%, transparent);\n }\n 50% {\n box-shadow: 0 0 0 8px color-mix(in srgb, var(--mj-brand-primary) 0%, transparent);\n }\n}\n\n.message-item:hover {\n background-color: color-mix(in srgb, var(--mj-text-primary) 2%, transparent);\n}\n\n/* Mention Pills - Match new editor chip style */\n:host ::ng-deep .mention-badge {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 4px 12px;\n margin: 0 3px;\n border-radius: 16px;\n font-weight: 600;\n font-size: 13px;\n cursor: pointer;\n transition: all 0.2s ease;\n vertical-align: middle;\n white-space: nowrap;\n}\n\n:host ::ng-deep .mention-badge.agent {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border: 2px solid color-mix(in srgb, var(--mj-brand-primary) 40%, transparent);\n box-shadow: var(--mj-shadow-md);\n}\n\n:host ::ng-deep .mention-badge.user {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border: 2px solid color-mix(in srgb, var(--mj-brand-primary) 40%, transparent);\n box-shadow: var(--mj-shadow-md);\n}\n\n:host ::ng-deep .mention-badge.entity {\n background: var(--mj-status-success);\n color: var(--mj-text-inverse);\n border: 2px solid color-mix(in srgb, var(--mj-status-success) 40%, transparent);\n box-shadow: var(--mj-shadow-md);\n}\n\n:host ::ng-deep .mention-badge.query {\n background: var(--mj-status-warning);\n color: var(--mj-text-inverse);\n border: 2px solid color-mix(in srgb, var(--mj-status-warning) 40%, transparent);\n box-shadow: var(--mj-shadow-md);\n}\n\n:host ::ng-deep .mention-badge.record {\n background: var(--mj-color-info, #2563eb);\n color: var(--mj-text-inverse, #fff);\n border: 2px solid color-mix(in srgb, var(--mj-color-info, #2563eb) 40%, transparent);\n box-shadow: var(--mj-shadow-md);\n text-decoration: none;\n}\n\n/* Icon-only record citation: surrounding prose already named the row. */\n:host ::ng-deep .mention-badge.record.icon-only {\n padding: 4px 7px;\n gap: 0;\n min-width: 1.65em;\n justify-content: center;\n}\n\n/* Skills: standard green fallback (AISkill.Color overrides via inline style) + sharp-cornered\n rectangle \u2014 the shape differentiates skills from the rounded agent/user/entity pills.\n Keep color + shape in sync with the composer chip (mention-editor's createMentionChip). */\n:host ::ng-deep .mention-badge.skill {\n background: var(--mj-status-success);\n color: var(--mj-text-inverse);\n border: 2px solid color-mix(in srgb, var(--mj-text-inverse) 35%, transparent);\n border-radius: 4px;\n box-shadow: var(--mj-shadow-md);\n}\n\n:host ::ng-deep .mention-badge i {\n font-size: 12px;\n opacity: 0.95;\n}\n\n/* Support for custom icon classes with background-image (like mj-icon-skip) */\n:host ::ng-deep .mention-badge i[class^=\"mj-icon-\"],\n:host ::ng-deep .mention-badge i[class*=\" mj-icon-\"] {\n width: 16px;\n height: 16px;\n display: inline-block;\n background-size: contain;\n background-repeat: no-repeat;\n background-position: center;\n vertical-align: middle;\n font-size: inherit;\n}\n\n/* Skip icon - must use ::ng-deep for dynamically injected HTML */\n:host ::ng-deep .mention-badge i.mj-icon-skip {\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 101.89918457031249 96.83947368421053'%3E%3Cg transform='translate(-0.1288232421875,-0.0)'%3E%3Cpath d='M93.85,41.56c-.84,0-1.62.2-2.37.55-3-4.35-7.49-8.12-13.04-11.04l.04-7.18v-14.44h-10.24v17.6c-1.52-.43-3.07-.8-4.67-1.11V0h-10.24v24.72s-.09,0-.14,0h-4.38s-.1,0-.14,0V7.3h-10.24v18.62c-1.6.32-3.15.69-4.67,1.11v-11.67h-10.24v6.09l.04,9.6c-5.55,2.92-10.04,6.7-13.04,11.04-.75-.35-1.53-.55-2.37-.55-4.5,0-8.14,5.61-8.14,12.51s3.64,12.53,8.14,12.53c.58,0,1.14-.12,1.67-.29,4.1,6.62,11.54,12.06,20.98,15.28l.79.13v7.05c0,2.97,1.45,5.58,3.87,6.99,1.18.69,2.5,1.04,3.85,1.03,1.4,0,2.83-.37,4.15-1.12l7.54-4.29,7.56,4.3c1.31.74,2.73,1.12,4.13,1.12s2.67-.35,3.85-1.04c2.42-1.41,3.86-4.02,3.86-6.98v-7.05l.79-.13c9.44-3.22,16.89-8.66,20.98-15.28.54.17,1.09.29,1.68.29,4.5,0,8.14-5.61,8.14-12.53s-3.63-12.51-8.14-12.51' fill='%23AAAAAA'/%3E%3Cpath d='M86.69,50.87c0-12.22-13.6-19.1-28.94-20.66-4.48-.47-9.19-.54-13.52,0-15.34,1.53-28.93,8.41-28.93,20.66,0,8.55,5.7,15.55,12.68,15.55h7.94c3.05,2.5,6.93,4.1,11.08,4.71,2.65.4,5.44.46,8.01,0,4.15-.6,8.05-2.2,11.1-4.71h7.92c6.97,0,12.68-7,12.68-15.55' fill='white' opacity='0.9'/%3E%3Cpath d='M57.83,55.82c-1.19,2.58-3.8,4.35-6.84,4.35s-5.65-1.77-6.84-4.35h13.68Z' fill='%23AAAAAA'/%3E%3Cpath d='M32.52,41.14c1.74,0,3.18,2.13,3.18,4.76s-1.44,4.74-3.18,4.74-3.16-2.13-3.16-4.74,1.41-4.76,3.16-4.76' fill='%23AAAAAA'/%3E%3Cpath d='M69.46,41.14c1.74,0,3.16,2.13,3.16,4.76s-1.41,4.74-3.16,4.74-3.18-2.13-3.18-4.74,1.41-4.76,3.18-4.76' fill='%23AAAAAA'/%3E%3Cpath d='M63.91,76.15c-.82-.48-1.84-.43-2.8.12l-10.13,5.75-10.11-5.75c-.96-.55-1.98-.59-2.8-.12-.82.47-1.29,1.38-1.29,2.49v10.12c0,1.11.47,2.02,1.28,2.49.38.22.8.33,1.24.33.51,0,1.05-.15,1.57-.44l10.12-5.75,10.11,5.75c.52.29,1.05.44,1.56.44.44,0,.86-.11,1.24-.33.81-.48,1.28-1.38,1.28-2.49v-10.12c0-1.11-.47-2.02-1.28-2.49' fill='white' opacity='0.9'/%3E%3C/g%3E%3C/svg%3E\");\n}\n\n/* Betty icon */\n:host ::ng-deep .mention-badge i.mj-icon-betty {\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'%3E%3Ccircle cx='50' cy='50' r='45' fill='%23FF6B6B'/%3E%3Ctext x='50' y='65' text-anchor='middle' font-size='40' fill='white' font-family='Arial, sans-serif' font-weight='bold'%3EB%3C/text%3E%3C/svg%3E\");\n}\n\n/* Izzy icon */\n:host ::ng-deep .mention-badge i.mj-icon-izzy {\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 204 180'%3E%3Cpath d='M0 0 C3.61144774 3.08477828 4.84942137 4.90830493 5.5 9.625 C5 13 5 13 3.5 14.9375 C1.74432121 17.35155834 1.83578869 18.21944114 1.90625 21.12890625 C1.9371875 22.40636719 1.968125 23.68382813 2 25 C3.18335937 24.72285156 4.36671875 24.44570313 5.5859375 24.16015625 C22.44010416 20.26839867 22.44010416 20.26839867 30 20 C31.80210938 19.92265625 31.80210938 19.92265625 33.640625 19.84375 C47.49356199 19.44904163 61.73614427 20.86627802 75 25 C75.53596907 19.64244551 75.53596907 19.64244551 73.5 15 C71.5549761 12.4066348 71.45048389 10.16629658 71.59375 6.97265625 C72.33633815 3.36681955 74.01253991 1.99164006 77 0 C79.80907914 -0.63997166 82.18961327 -0.63020793 85 0 C87.8100346 1.79363911 89.50940468 3.01880935 91 6 C90.984375 8.05859375 90.984375 8.05859375 90.75 10.4375 C90.68296875 11.21996094 90.6159375 12.00242187 90.546875 12.80859375 C90 15 90 15 88.49609375 16.3984375 C86.25734576 18.79500846 86.4852344 20.97464008 86.3125 24.1875 C86.21388672 25.81751953 86.21388672 25.81751953 86.11328125 27.48046875 C86.07589844 28.31191406 86.03851563 29.14335937 86 30 C86.67675781 30.0825 87.35351562 30.165 88.05078125 30.25 C91.82333306 31.20937741 94.89353787 32.99425194 98.1875 35 C99.18052124 35.60448975 99.18052124 35.60448975 100.19360352 36.22119141 C111.98050012 43.58460075 121.17745776 53.2687532 127 66 C127 66.66 127 67.32 127 68 C127.721875 68.0825 128.44375 68.165 129.1875 68.25 C133.81406141 69.48374971 136.2179022 71.66516963 138.625 75.7734375 C140.97801199 81.55147269 140.43210927 87.87027126 140.375 94 C140.38660156 95.24523437 140.39820313 96.49046875 140.41015625 97.7734375 C140.3675701 111.08870765 140.3675701 111.08870765 135.5 116.7421875 C131.62323281 119.66995439 128.8523137 121.14337998 124 121.125 C122.9790625 121.12886719 122.9790625 121.12886719 121.9375 121.1328125 C120 121 120 121 117 120 C116.74347656 120.65226562 116.48695313 121.30453125 116.22265625 121.9765625 C115.83980469 122.85054688 115.45695313 123.72453125 115.0625 124.625 C114.70285156 125.48351562 114.34320313 126.34203125 113.97265625 127.2265625 C108.57908063 134.80960941 99.56813916 137.59212379 91.0625 140.375 C90.02287109 140.72949219 88.98324219 141.08398438 87.91210938 141.44921875 C80.34347852 144 80.34347852 144 78 144 C78.02094727 144.65484375 78.04189453 145.3096875 78.06347656 145.984375 C78.14730383 148.98942328 78.19886895 151.99422464 78.25 155 C78.28351563 156.02996094 78.31703125 157.05992187 78.3515625 158.12109375 C78.43361416 164.56214867 77.93369275 169.71304442 74 175 C68.75523423 179.17440541 64.68195675 180.53237245 58 180 C55.12653443 178.963898 52.49379495 177.58020045 49.8125 176.125 C49.11447266 175.76019531 48.41644531 175.39539063 47.69726562 175.01953125 C46.39868999 174.33997216 45.10309803 173.65465367 43.81176758 172.96142578 C43.21388428 172.64415527 42.61600098 172.32688477 42 172 C41.34290039 171.59402588 40.68580078 171.18805176 40.00878906 170.76977539 C38.03672401 169.77639533 38.03672401 169.77639533 36.12475586 170.58325195 C35.49448486 170.96441162 34.86421387 171.34557129 34.21484375 171.73828125 C33.17166992 172.35026367 33.17166992 172.35026367 32.10742188 172.97460938 C31.39134766 173.41611328 30.67527344 173.85761719 29.9375 174.3125 C28.51029236 175.1647359 27.08194984 176.01507485 25.65234375 176.86328125 C25.02320068 177.24782471 24.39405762 177.63236816 23.74584961 178.02856445 C19.79572932 180.2265128 16.44037501 180.296025 12 180 C6.82155197 178.33236419 3.95074467 176.59004726 1 172 C-0.72417326 168.34258111 -1.2403609 165.51230089 -1.1953125 161.48046875 C-1.18886719 160.45888672 -1.18242188 159.43730469 -1.17578125 158.38476562 C-1.15902344 157.32966797 -1.14226563 156.27457031 -1.125 155.1875 C-1.11597656 154.11306641 -1.10695312 153.03863281 -1.09765625 151.93164062 C-1.07415306 149.28753146 -1.04129575 146.64388128 -1 144 C-1.63196289 143.81171631 -2.26392578 143.62343262 -2.91503906 143.42944336 C-8.20708475 141.84808949 -13.49207901 140.2541307 -18.75 138.5625 C-19.98234375 138.17191406 -21.2146875 137.78132812 -22.484375 137.37890625 C-29.06200008 134.79901552 -34.12925122 130.90130551 -38 125 C-38.875 121.5625 -38.875 121.5625 -39 119 C-39.495 119.33 -39.99 119.66 -40.5 120 C-45.24354984 121.89741993 -49.49426304 121.53143657 -54.1875 119.875 C-58.42051121 117.05299253 -61.35909664 113.92271008 -63 109 C-63.22709306 104.92471184 -63.22828659 100.8492307 -63.24023438 96.76806641 C-63.2498982 94.77103695 -63.28108516 92.77414948 -63.3125 90.77734375 C-63.36188158 78.59243786 -63.36188158 78.59243786 -60 73 C-57.7509823 70.86631654 -55.88785241 69.35340008 -53.0078125 68.20703125 C-50.3010212 66.57979679 -49.65488803 64.83796148 -48.3125 62 C-45.06106922 55.7428385 -40.95735135 50.97447519 -36 46 C-35.40832031 45.38511719 -34.81664063 44.77023438 -34.20703125 44.13671875 C-28.97373562 39.11136864 -17.47215548 30 -10 30 C-10.08733973 27.91589342 -10.19552278 25.83265331 -10.3125 23.75 C-10.37050781 22.58984375 -10.42851563 21.4296875 -10.48828125 20.234375 C-11.02905532 16.81635262 -11.84853545 15.59874271 -14 13 C-14.54046356 8.75350057 -14.48376179 6.74176808 -12.125 3.125 C-8.57275398 -0.42724602 -4.8825369 -0.970906 0 0 Z M5 35 C4.30245605 35.21962402 3.60491211 35.43924805 2.88623047 35.66552734 C-14.1501062 41.15773444 -29.02751477 50.81254544 -39 66 C-39.33 66.99 -39.66 67.98 -40 69 C-37.525 70.98 -37.525 70.98 -35 73 C-34.52691406 72.29875 -34.05382812 71.5975 -33.56640625 70.875 C-21.08320269 52.96537462 -2.17172019 42.38052109 19.26171875 38.5078125 C46.97805996 34.9959591 75.10426623 38.71529466 97.73046875 56.09765625 C103.53827054 61.07953766 107.9264808 66.53902088 112 73 C113.32 72.01 114.64 71.02 116 70 C115.01713954 61.60788376 107.55262518 55.04847712 101.375 49.8125 C82.80696113 35.82916208 61.35998978 30.59265576 38.375 30.625 C37.71836365 30.62554382 37.06172729 30.62608765 36.38519287 30.62664795 C25.42439402 30.66823796 15.42390121 31.62072499 5 35 Z' fill='%234E3B78' transform='translate(63,0)'/%3E%3Cpath d='M0 0 C5.27957047 5.78547525 9.31612861 13.25448014 10 21.125 C9.69743213 24.83293961 8.77676366 26.8914086 6.1875 29.5625 C-2.04152489 35.76003038 -13.60917874 39.6270706 -23.875 38.8125 C-24.535 38.1525 -25.195 37.4925 -25.875 36.8125 C-28.97847254 36.48234335 -31.03281176 36.30718706 -33.75 37.9375 C-35.40354531 40.69340884 -35.26865568 42.66325452 -34.875 45.8125 C-33.95833333 47.89583333 -33.95833333 47.89583333 -31.875 48.8125 C-28.29166667 48.89583333 -28.29166667 48.89583333 -24.875 47.8125 C-24.57086182 47.16466553 -24.26672363 46.51683105 -23.95336914 45.84936523 C-22.875 43.8125 -22.875 43.8125 -20.77124023 42.88696289 C-19.91731689 42.6883667 -19.06339355 42.48977051 -18.18359375 42.28515625 C-17.23806641 42.04990234 -16.29253906 41.81464844 -15.31835938 41.57226562 C-14.32642578 41.34216797 -13.33449219 41.11207031 -12.3125 40.875 C-4.77934417 39.10870895 1.54823541 36.95205932 8.125 32.8125 C7.81647145 40.06292099 4.56245219 45.32546918 -0.5 50.4609375 C-5.29811284 54.61130511 -8.83216751 54.86916719 -15 55 C-21.13677833 55.26569953 -25.04589225 56.51893716 -29.890625 60.31640625 C-39.17633501 67.31724667 -52.82450605 66.52799961 -63.875 65.8125 C-71.37432145 64.60538489 -79.4496824 61.2378176 -84.875 55.8125 C-86.81199027 55.70419517 -88.75076074 55.60687514 -90.69067383 55.58691406 C-97.68300211 55.51299157 -103.12007731 55.4392364 -108.44140625 50.40234375 C-108.91449219 49.87769531 -109.38757813 49.35304688 -109.875 48.8125 C-110.6175 48.090625 -111.36 47.36875 -112.125 46.625 C-118.35765562 36.60823203 -119.69570866 25.34707186 -117.25 13.8828125 C-113.47065738 3.0509466 -104.76645407 -4.0120534 -94.875 -9.1875 C-91.26850975 -10.75400624 -87.62602625 -12.0153043 -83.875 -13.1875 C-83.029375 -13.47496094 -82.18375 -13.76242188 -81.3125 -14.05859375 C-56.0861494 -22.29657387 -20.04377266 -18.06142152 0 0 Z' fill='%23FDFDFD' transform='translate(155.875,64.1875)'/%3E%3Cpath d='M0 0 C5.24479788 1.58079188 9.51172656 4.60408712 14.06640625 7.58984375 C18.37837094 10.28462973 18.37837094 10.28462973 23.30859375 11.1328125 C28.49696048 9.20971132 33.08639658 6.29555589 37.79882812 3.42578125 C43.66838131 -0.00837477 43.66838131 -0.00837477 47.27734375 0.078125 C49.34375 1.0078125 49.34375 1.0078125 51.34375 3.0078125 C51.82984303 7.30136192 51.71414913 11.62739332 51.71875 15.9453125 C51.74324219 17.15123047 51.76773438 18.35714844 51.79296875 19.59960938 C51.79876953 21.33114258 51.79876953 21.33114258 51.8046875 23.09765625 C51.81290527 24.15847412 51.82112305 25.21929199 51.82958984 26.31225586 C51.34375 29.0078125 51.34375 29.0078125 49.48461914 30.87670898 C46.29658529 32.56106989 44.78123809 32.062357 41.34375 31.0078125 C37.60135447 29.03986817 34.07891261 26.72386924 30.53320312 24.42578125 C26.44214688 21.80182316 26.44214688 21.80182316 21.77734375 20.921875 C17.60401055 22.78413283 13.85973006 25.2663764 10.046875 27.76953125 C5.85335687 30.41401513 2.44659272 31.9581498 -2.65625 32.0078125 C-4.33203125 30.87695312 -4.33203125 30.87695312 -5.65625 29.0078125 C-6.04443359 26.328125 -6.04443359 26.328125 -6.0546875 23.1328125 C-6.05855469 21.98296875 -6.06242187 20.833125 -6.06640625 19.6484375 C-6.05480469 18.44703125 -6.04320313 17.245625 -6.03125 16.0078125 C-6.04285156 14.80640625 -6.05445312 13.605 -6.06640625 12.3671875 C-6.06253906 11.21734375 -6.05867188 10.0675 -6.0546875 8.8828125 C-6.05130371 7.82835937 -6.04791992 6.77390625 -6.04443359 5.6875 C-5.65625 3.0078125 -5.65625 3.0078125 -4.29736328 1.14111328 C-2.65625 0.0078125 -2.65625 0.0078125 0 0 Z' fill='%23FCFCFD' transform='translate(78.65625,136.9921875)'/%3E%3Cpath d='M0 0 C2.5 0.625 2.5 0.625 4.8125 2.625 C6.96830116 6.4575354 7.24792603 9.32007692 6.5 13.625 C5.34367254 15.98793002 4.35016245 17.77483755 2.5 19.625 C0.1875 20 0.1875 20 -2.5 19.625 C-5.06638215 17.47478793 -6.29103188 15.79226637 -6.88671875 12.46484375 C-7.08084032 8.45522921 -6.77549931 6.12498023 -4.8125 2.5625 C-2.5 0.625 -2.5 0.625 0 0 Z' fill='%2353417C' transform='translate(138.5,67.375)'/%3E%3Cpath d='M0 0 C2.5 0.6875 2.5 0.6875 4.8125 2.625 C7.08407605 6.74748987 7.32547179 10.07653131 6.5 14.6875 C4.8125 17.75 4.8125 17.75 2.5 19.6875 C-0.0625 20.25 -0.0625 20.25 -2.5 19.6875 C-5.30401904 17.38419865 -5.84979387 14.76309142 -6.4375 11.3125 C-6.72853275 7.71913649 -6.44645777 6.57011897 -4.875 3.125 C-2.5 0.6875 -2.5 0.6875 0 0 Z' fill='%23523F7B' transform='translate(64.5,67.3125)'/%3E%3Cpath d='M0 0 C8.91 0 17.82 0 27 0 C24.81183076 5.47042311 24.169236 6.55141452 19 9 C14.08609728 9.94526984 9.88605617 10.13992406 5.51171875 7.49609375 C3.4733513 5.76185217 1.65854906 4.10051199 0 2 C0 1.34 0 0.68 0 0 Z' fill='%23574680' transform='translate(88,95)'/%3E%3C/svg%3E\");\n}\n\n/* Support for image tags in mention badges */\n:host ::ng-deep .mention-badge img {\n width: 16px;\n height: 16px;\n border-radius: 50%;\n object-fit: cover;\n vertical-align: middle;\n}\n\n:host ::ng-deep .mention-badge:hover {\n transform: translateY(-1px);\n box-shadow: var(--mj-shadow-lg);\n}\n\n/* Configuration preset indicator for agent mentions with non-default presets */\n/* Matches the styling from mention-editor.component.ts (lines 432-444) */\n:host ::ng-deep .mention-badge .preset-indicator {\n display: inline-block;\n font-size: 10px;\n font-weight: 600;\n font-family: 'SF Mono', 'Monaco', 'Inconsolata', 'Roboto Mono', 'Courier New', monospace;\n background: rgba(255, 255, 255, 0.25);\n padding: 2px 6px;\n border-radius: 4px;\n margin-left: 4px;\n letter-spacing: 0.3px;\n text-transform: uppercase;\n border: 1px solid rgba(255, 255, 255, 0.15);\n}\n\n.message-avatar {\n flex-shrink: 0;\n}\n\n.avatar-circle {\n width: 36px;\n height: 36px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 16px;\n color: var(--mj-text-inverse);\n}\n\n/* User avatars are circular */\n.avatar-circle.user-avatar {\n border-radius: 50%;\n background-color: var(--mj-text-primary);\n}\n\n/* Agent avatars are square with rounded corners */\n.avatar-circle.ai-avatar {\n border-radius: 8px;\n background-color: var(--mj-brand-primary); /* Brand color for agents */\n}\n\n/* Avatar images (for users with uploaded photos or URLs) */\n/* Host-supplied assistant avatar: the AI tile is a rounded SQUARE (8px, brand\n fill), so the image must clip to the tile's radius \u2014 not the user avatar's\n 50% circle \u2014 and the brand fill must drop so nothing peeks out at the\n corners or behind a transparent image. */\n.avatar-circle.ai-avatar.avatar-has-image {\n background-color: transparent;\n overflow: hidden;\n}\n.avatar-circle.ai-avatar .avatar-image {\n border-radius: inherit;\n}\n\n.avatar-image {\n width: 100%;\n height: 100%;\n object-fit: cover;\n border-radius: 50%;\n}\n\n/* Container for the standard mj-loading indicator while an artifact's rows load. Layout only \u2014\n the indicator owns its own animation, so there is no bespoke shimmer to keep re-themed. */\n.artifact-pending {\n display: flex;\n align-items: center;\n padding: 12px 16px;\n}\n\n/* System artifact styling - subtle visual distinction */\n.artifact-wrapper.system-artifact {\n opacity: 0.85;\n position: relative;\n}\n\n.artifact-wrapper.system-artifact::before {\n content: 'SYSTEM';\n position: absolute;\n top: 8px;\n right: 8px;\n font-size: 9px;\n font-weight: 600;\n color: var(--mj-text-muted);\n background: var(--mj-bg-surface-sunken);\n padding: 2px 6px;\n border-radius: 3px;\n letter-spacing: 0.5px;\n z-index: 10;\n}\n\n.message-content {\n flex: 1;\n min-width: 0;\n position: relative;\n}\n\n.message-header {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 4px;\n font-size: 13px;\n}\n\n.message-sender {\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n/* Agent role badge */\n.agent-badge {\n display: inline-block;\n padding: 2px 8px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 10px;\n font-size: 11px;\n color: var(--mj-text-secondary);\n font-weight: 500;\n}\n\n.message-time {\n color: var(--mj-text-muted);\n font-size: 12px;\n font-weight: 400;\n}\n\n/* Right-side cluster anchoring.\n The first of these three siblings that actually renders absorbs the\n `margin-left: auto`, pushing the whole cluster right. Subsequent siblings\n then sit next to it (relying on the flex container's `gap`). This used to\n live only on .time-pill, which broke when timePillText returned null after\n agent completion \u2014 the gear icon would shift to the left. */\n.time-pill,\n.test-feedback-icon,\n.agent-run-icon,\n.message-edit-icon {\n margin-left: auto;\n}\n.time-pill ~ .test-feedback-icon,\n.time-pill ~ .agent-run-icon,\n.test-feedback-icon ~ .agent-run-icon,\n.message-edit-icon ~ .test-feedback-icon,\n.message-edit-icon ~ .agent-run-icon {\n margin-left: 8px;\n}\n\n/* Edit pencil on user messages \u2014 revealed on message hover to keep headers quiet */\n.message-edit-icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 20px;\n height: 20px;\n color: var(--mj-text-muted);\n cursor: pointer;\n transition: all 0.2s ease;\n opacity: 0;\n}\n.message-item:hover .message-edit-icon,\n.message-edit-icon:focus-visible {\n opacity: 1;\n}\n.message-edit-icon:hover {\n color: var(--mj-text-secondary);\n}\n.message-edit-icon i.fa-pen {\n font-size: 12px;\n}\n\n/* Time pill - unified styling for all AI message states */\n.time-pill {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 2px 8px;\n border-radius: 10px;\n font-size: 11px;\n font-weight: 500;\n transition: all 0.3s ease;\n}\n\n.time-pill i {\n font-size: 10px;\n}\n\n/* Complete state - light blue (default) */\n.time-pill.complete {\n background: var(--mj-status-info-bg);\n color: var(--mj-status-info-text);\n}\n\n/* In-progress state - brand color with subtle pulse */\n.time-pill.in-progress {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n/* Active agent run state - brand color with subtle pulse */\n.time-pill.active {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n/* Failed state - red */\n.time-pill.failed {\n background: var(--mj-status-error-bg);\n color: var(--mj-status-error-text);\n}\n\n@keyframes pillPulse {\n 0%, 100% {\n opacity: 1;\n }\n 50% {\n opacity: 0.85;\n }\n}\n\n/* Deprecated - keeping for backward compatibility but no longer used */\n.generation-time {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 2px 8px;\n background: var(--mj-status-info-bg);\n border-radius: 10px;\n font-size: 11px;\n color: var(--mj-status-info-text);\n font-weight: 500;\n margin-left: auto;\n}\n\n.generation-time i {\n font-size: 10px;\n}\n\n/* Deprecated - keeping for backward compatibility but no longer used */\n.message-elapsed {\n color: var(--mj-text-muted);\n font-size: 11px;\n font-style: italic;\n}\n\n.message-body {\n margin-bottom: 0;\n}\n\n.message-text {\n color: var(--mj-text-primary);\n line-height: 1.5;\n word-wrap: break-word;\n}\n\n/* Remove extra margin from markdown paragraphs */\n.message-text mj-markdown > :first-child,\n.message-text ::ng-deep .mj-markdown-container > :first-child {\n margin-top: 0;\n}\n\n.message-text mj-markdown > :last-child,\n.message-text ::ng-deep .mj-markdown-container > :last-child {\n margin-bottom: 0;\n}\n\n/* Asymmetric bubble shapes for message content */\n.message-item.user-message .message-content {\n border-radius: 12px 12px 12px 4px;\n}\n\n.message-item.ai-message .message-content {\n border-radius: 4px 12px 12px 12px;\n}\n\n/* Reaction Buttons */\n.message-reactions {\n display: none; /* Hide reactions for now - not implemented */\n}\n\n/* Artifact Card - Claude.ai Style */\n.artifact-card {\n display: flex;\n flex-direction: column;\n gap: 12px;\n margin-top: 12px;\n padding: 16px;\n border: 1px solid color-mix(in srgb, var(--mj-text-primary) 8%, transparent);\n border-radius: 8px;\n background: color-mix(in srgb, var(--mj-brand-primary) 5%, var(--mj-bg-surface));\n cursor: pointer;\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n max-width: 500px;\n box-shadow: var(--mj-shadow-sm);\n position: relative;\n overflow: hidden;\n}\n\n.artifact-card::before {\n content: '';\n position: absolute;\n left: 0;\n top: 0;\n bottom: 0;\n width: 3px;\n background: var(--mj-brand-primary);\n opacity: 1;\n}\n\n.artifact-card:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n border-color: color-mix(in srgb, var(--mj-brand-primary) 30%, transparent);\n box-shadow: var(--mj-shadow-md);\n transform: translateY(-1px);\n}\n\n.artifact-card-header {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n}\n\n.artifact-card-icon {\n width: 36px;\n height: 36px;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-brand-primary);\n flex-shrink: 0;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n border-radius: 6px;\n transition: all 0.2s ease;\n}\n\n.artifact-card:hover .artifact-card-icon {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n transform: scale(1.05);\n}\n\n.artifact-card-icon i {\n font-size: 18px;\n}\n\n.artifact-card-content {\n flex: 1;\n min-width: 0;\n}\n\n.artifact-card-label {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n letter-spacing: -0.01em;\n margin-bottom: 4px;\n}\n\n.artifact-card-description {\n font-size: 13px;\n color: var(--mj-text-secondary);\n line-height: 1.5;\n}\n\n.message-actions {\n position: absolute;\n bottom: 8px;\n right: 8px;\n display: flex;\n gap: 2px;\n opacity: 0;\n transform: translateY(4px);\n transition: all 200ms cubic-bezier(0.4, 0, 0.2, 1);\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n padding: 4px;\n box-shadow: var(--mj-shadow-md);\n pointer-events: none;\n}\n\n.message-item:hover .message-actions {\n opacity: 1;\n transform: translateY(0);\n pointer-events: auto;\n}\n\n.message-action-btn {\n padding: 6px 8px;\n background: transparent;\n border: none;\n border-radius: 6px;\n cursor: pointer;\n color: var(--mj-text-secondary);\n font-size: 13px;\n transition: all 150ms ease;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 32px;\n height: 32px;\n}\n\n.message-action-btn:hover {\n background-color: var(--mj-bg-surface-sunken);\n color: var(--mj-text-primary);\n}\n\n.message-action-btn.danger:hover {\n background-color: var(--mj-status-error-bg);\n color: var(--mj-status-error);\n}\n\n.message-action-btn.retry-btn {\n color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n font-weight: 600;\n gap: 6px;\n padding: 6px 12px;\n min-width: auto;\n}\n\n.message-action-btn.retry-btn:hover {\n background-color: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n color: var(--mj-brand-primary-hover);\n}\n\n/* Thread indicator badge */\n.thread-indicator {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n margin-top: 8px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n border-radius: 16px;\n cursor: pointer;\n transition: all 150ms ease;\n font-size: 12px;\n color: var(--mj-brand-primary-hover);\n font-weight: 500;\n}\n\n.thread-indicator:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n border-color: color-mix(in srgb, var(--mj-brand-primary) 30%, transparent);\n transform: translateY(-1px);\n box-shadow: var(--mj-shadow-sm);\n}\n\n.thread-indicator i {\n font-size: 14px;\n}\n\n.thread-count {\n font-weight: 600;\n}\n\n/* Edit mode styles */\n.message-item.editing {\n background-color: var(--mj-status-warning-bg);\n border-left: 3px solid var(--mj-status-warning);\n}\n\n.message-edit-container {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.message-edit-textarea {\n width: 100%;\n padding: 12px;\n border: 1px solid var(--mj-border-strong);\n border-radius: 6px;\n font-family: inherit;\n font-size: 14px;\n line-height: 1.6;\n resize: vertical;\n min-height: 80px;\n transition: border-color 150ms ease;\n}\n\n.message-edit-textarea:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 2px color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n}\n\n.edit-actions {\n display: flex;\n gap: 8px;\n}\n\n.edit-action-btn {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 8px 16px;\n border: none;\n border-radius: 6px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: all 150ms ease;\n}\n\n.edit-action-btn.save {\n background-color: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n}\n\n.edit-action-btn.save:hover {\n background-color: var(--mj-brand-primary-hover);\n}\n\n.edit-action-btn.cancel {\n background-color: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n}\n\n.edit-action-btn.cancel:hover {\n background-color: var(--mj-border-default);\n color: var(--mj-text-primary);\n}\n\n.edit-hint {\n font-size: 12px;\n color: var(--mj-text-muted);\n font-style: italic;\n}\n\n.edited-badge {\n margin-left: 8px;\n font-size: 11px;\n color: var(--mj-text-muted);\n font-style: italic;\n font-weight: normal;\n}\n\n/* Message Action Bar (separate panel above agent details) */\n.message-action-bar {\n margin-top: 12px;\n margin-bottom: 8px;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n padding: 12px;\n}\n\n.action-bar-container {\n display: flex;\n align-items: center;\n gap: 16px;\n}\n\n.action-buttons {\n display: flex;\n gap: 4px;\n margin-left: 16px;\n padding-left: 16px;\n border-left: 1px solid var(--mj-border-default);\n}\n\n.action-bar-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 6px 10px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-text-muted);\n border-radius: 6px;\n font-size: 16px;\n line-height: 1;\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.2s;\n min-width: 36px;\n height: 32px;\n opacity: 0.6;\n}\n\n.action-bar-btn i {\n font-size: 16px;\n line-height: 1;\n}\n\n.action-bar-btn:hover {\n opacity: 1;\n border-color: var(--mj-text-secondary);\n}\n\n.action-bar-btn.danger {\n color: var(--mj-status-error);\n}\n\n.action-bar-btn.danger:hover {\n opacity: 1;\n background: var(--mj-status-error-bg);\n border-color: var(--mj-status-error);\n}\n\n.action-bar-btn i.pinned {\n color: var(--mj-brand-primary);\n}\n\n.action-bar-btn.test-feedback {\n color: var(--mj-status-warning);\n}\n\n.action-bar-btn.test-feedback:hover {\n opacity: 1;\n background: var(--mj-status-warning-bg);\n border-color: var(--mj-status-warning);\n}\n\n/* Message status indicator */\n.message-status {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n font-size: 12px;\n color: var(--mj-text-secondary);\n padding: 2px 8px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 4px;\n margin-left: 8px;\n animation: statusPulse 2s ease-in-out infinite;\n}\n\n.message-status i {\n color: var(--mj-brand-primary);\n font-size: 11px;\n}\n\n.message-status.error {\n background: var(--mj-status-error-bg);\n color: var(--mj-status-error);\n}\n\n.message-status.error i {\n color: var(--mj-status-error);\n}\n\n.status-text {\n font-weight: 500;\n}\n\n@keyframes statusPulse {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.7; }\n}\n\n/* ============================================\n Agent Run Icon & Details Panel\n ============================================ */\n\n/* Agent run gear icon in header - muted style for power users.\n Left-margin is governed by the right-side cluster rules above so the gear\n stays right-anchored whether or not the time pill / test-feedback icon\n renders alongside it. */\n.agent-run-icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 20px;\n height: 20px;\n color: var(--mj-text-muted);\n cursor: pointer;\n transition: all 0.2s ease;\n user-select: none;\n}\n\n.agent-run-icon i.fa-cog {\n font-size: 13px;\n}\n\n.agent-run-icon:hover {\n color: var(--mj-text-secondary);\n}\n\n.agent-run-icon.expanded {\n color: var(--mj-brand-primary);\n transform: scale(1.1);\n}\n\n/* Test feedback icon in header - appears for test runs.\n Left-margin handled by the right-side cluster rules above. */\n.test-feedback-icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 20px;\n height: 20px;\n color: var(--mj-text-muted);\n cursor: pointer;\n transition: all 0.2s ease;\n user-select: none;\n}\n\n.test-feedback-icon i.fa-flask {\n font-size: 13px;\n}\n\n.test-feedback-icon:hover {\n color: var(--mj-brand-primary); /* Blue color for test feedback */\n transform: scale(1.1);\n}\n\n@keyframes rotate {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n\n/* Agent details panel */\n.agent-details-panel {\n margin-top: 12px;\n padding: 16px;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n animation: slideDown 0.2s ease;\n}\n\n@keyframes slideDown {\n from {\n opacity: 0;\n transform: translateY(-10px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n/* Loading state */\n.agent-details-loading {\n display: flex;\n align-items: center;\n gap: 8px;\n color: var(--mj-text-secondary);\n font-size: 13px;\n}\n\n.agent-details-loading i {\n color: var(--mj-brand-primary);\n}\n\n/* Error state */\n.agent-details-error {\n display: flex;\n align-items: center;\n gap: 8px;\n color: var(--mj-status-error);\n font-size: 13px;\n}\n\n.agent-details-error i {\n color: var(--mj-status-error);\n}\n\n/* Content header */\n.agent-details-header {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 12px;\n padding-bottom: 8px;\n border-bottom: 1px solid var(--mj-border-default);\n font-weight: 600;\n font-size: 13px;\n color: var(--mj-text-primary);\n}\n\n.agent-details-header i {\n color: var(--mj-brand-primary);\n}\n\n.agent-name-link {\n color: var(--mj-brand-primary);\n cursor: pointer;\n text-decoration: none;\n font-weight: 600;\n transition: all 0.2s ease;\n}\n\n.agent-name-link:hover {\n color: var(--mj-brand-primary-hover);\n text-decoration: underline;\n}\n\n/* Details grid */\n.agent-details-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 12px;\n margin-bottom: 12px;\n}\n\n.detail-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n padding: 8px 12px;\n background: var(--mj-bg-surface-card);\n border-radius: 6px;\n border: 1px solid var(--mj-border-default);\n}\n\n.detail-label {\n font-size: 12px;\n color: var(--mj-text-secondary);\n font-weight: 500;\n}\n\n.detail-value {\n font-size: 13px;\n color: var(--mj-text-primary);\n font-weight: 600;\n font-family: 'Monaco', 'Menlo', 'Consolas', monospace;\n}\n\n/* Status badge in details */\n.status-badge {\n padding: 3px 8px;\n border-radius: 10px;\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n}\n\n.status-badge.status-pending {\n background: var(--mj-status-warning-bg);\n color: var(--mj-status-warning-text);\n}\n\n.status-badge.status-running {\n background: var(--mj-status-info-bg);\n color: var(--mj-status-info-text);\n}\n\n.status-badge.status-complete {\n background: var(--mj-status-success-bg);\n color: var(--mj-status-success-text);\n}\n\n.status-badge.status-failed,\n.status-badge.status-error {\n background: var(--mj-status-error-bg);\n color: var(--mj-status-error-text);\n}\n\n.status-badge.status-cancelled {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n}\n\n/* Run ID link styling */\n.run-id-link {\n color: var(--mj-brand-primary);\n cursor: pointer;\n text-decoration: none;\n display: inline-flex;\n align-items: center;\n gap: 4px;\n transition: all 0.2s ease;\n}\n\n.run-id-link:hover {\n color: var(--mj-brand-primary-hover);\n text-decoration: underline;\n}\n\n.run-id-link i.fa-external-link-alt {\n font-size: 10px;\n opacity: 0.7;\n}\n\n/* Tasks section in agent details */\n.agent-details-tasks {\n margin-top: 16px;\n padding-top: 16px;\n border-top: 1px solid var(--mj-border-default);\n}\n\n.tasks-section-header {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 12px;\n font-weight: 600;\n font-size: 12px;\n color: var(--mj-text-primary);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.tasks-section-header i {\n color: var(--mj-brand-primary);\n font-size: 11px;\n}\n\n.tasks-list {\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n\n.tasks-list mj-task-widget {\n display: block;\n}\n\n/* Artifact version badge */\n.artifact-version-badge {\n display: inline-block;\n margin-left: 8px;\n padding: 2px 8px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-size: 11px;\n font-weight: 600;\n font-family: monospace;\n border-radius: 4px;\n vertical-align: middle;\n}\n\n/* Message Footer (rating counts and inline actions) */\n.message-footer {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-top: 8px;\n padding-top: 8px;\n border-top: 1px solid var(--mj-border-default);\n}\n\n.rating-counts {\n display: flex;\n align-items: center;\n gap: 12px;\n font-size: 13px;\n color: var(--mj-text-secondary);\n}\n\n.rating-count {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.rating-count.thumbs-up {\n color: var(--mj-status-success);\n}\n\n.rating-count.thumbs-down {\n color: var(--mj-status-error);\n}\n\n.rating-total {\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n/* Delete button \u2014 always visible on the last message, no hover required */\n.inline-delete {\n display: flex;\n align-items: center;\n}\n\n.message-item.pinned {\n border-left: 3px solid var(--mj-status-warning);\n background-color: color-mix(in srgb, var(--mj-status-warning) 8%, transparent);\n}\n\n/* Wraps pin button + rating component on the right side of the footer */\n.ai-message-actions {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-left: auto;\n}\n\n.action-bar-btn.pin-btn {\n color: var(--mj-text-muted);\n}\n\n.action-bar-btn.pin-btn:hover {\n color: var(--mj-status-warning);\n border-color: var(--mj-status-warning);\n}\n\n.action-bar-btn.pin-btn.pinned {\n opacity: 1;\n color: var(--mj-status-warning);\n border-color: var(--mj-status-warning-border);\n background: color-mix(in srgb, var(--mj-status-warning) 10%, var(--mj-bg-surface));\n}\n\n/* Delete + Rating + Pin in gear panel for non-last messages \u2014 mirrors .message-footer layout */\n.agent-panel-actions {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 8px 0 0;\n margin-top: 8px;\n border-top: 1px solid var(--mj-border-subtle);\n}\n\n/* Agent details section wrapper */\n.agent-details-section {\n margin-top: 8px;\n}\n\n/* Mobile adjustments: 481px - 768px */\n@media (max-width: 768px) {\n .message-item {\n padding: 8px 12px;\n gap: 8px;\n }\n\n .avatar-circle {\n width: 32px;\n height: 32px;\n font-size: 14px;\n }\n\n .artifact-card {\n max-width: 90vw;\n padding: 12px;\n }\n\n .artifact-card-icon {\n width: 32px;\n height: 32px;\n }\n\n .artifact-card-icon i {\n font-size: 16px;\n }\n\n .message-header {\n font-size: 12px;\n }\n\n .message-sender {\n font-size: 12px;\n }\n\n .message-time {\n font-size: 11px;\n }\n\n .agent-badge {\n font-size: 10px;\n padding: 1px 6px;\n }\n\n .time-pill {\n font-size: 10px;\n padding: 2px 6px;\n }\n\n .message-actions {\n gap: 1px;\n padding: 3px;\n }\n\n .message-action-btn {\n min-width: 28px;\n height: 28px;\n font-size: 12px;\n }\n}\n\n/* Small Phone adjustments: <= 480px */\n@media (max-width: 480px) {\n .message-item {\n padding: 6px 8px;\n gap: 6px;\n }\n\n .avatar-circle {\n width: 28px;\n height: 28px;\n font-size: 12px;\n }\n\n .avatar-circle.ai-avatar {\n border-radius: 6px;\n }\n\n .artifact-card {\n padding: 10px;\n margin-top: 8px;\n }\n\n .artifact-card-header {\n gap: 8px;\n }\n\n .artifact-card-icon {\n width: 28px;\n height: 28px;\n }\n\n .artifact-card-icon i {\n font-size: 14px;\n }\n\n .artifact-card-label {\n font-size: 13px;\n }\n\n .artifact-card-description {\n font-size: 12px;\n }\n\n .message-header {\n font-size: 11px;\n gap: 6px;\n }\n\n .message-sender {\n font-size: 11px;\n }\n\n .message-time {\n font-size: 10px;\n }\n\n .agent-badge {\n font-size: 9px;\n padding: 1px 5px;\n }\n\n .time-pill {\n font-size: 9px;\n padding: 1px 5px;\n }\n\n .thread-indicator {\n padding: 4px 8px;\n font-size: 11px;\n margin-top: 6px;\n }\n\n .agent-details-panel {\n padding: 12px;\n margin-top: 8px;\n }\n\n .agent-details-grid {\n grid-template-columns: 1fr;\n gap: 8px;\n }\n\n .detail-row {\n padding: 6px 8px;\n }\n\n .detail-label,\n .detail-value {\n font-size: 11px;\n }\n}\n\n/* Form Response Pills */\n:host ::ng-deep .form-response-pill {\n margin: 0 3px;\n transition: all 0.2s ease;\n}\n\n/* Single field form - inline pill (similar to mention badges) */\n:host ::ng-deep .form-response-pill.single-field {\n display: inline-flex;\n align-items: center;\n vertical-align: middle;\n gap: 6px;\n padding: 4px 12px;\n background: var(--mj-status-success);\n color: var(--mj-text-inverse);\n border: 2px solid color-mix(in srgb, var(--mj-status-success) 40%, transparent);\n border-radius: 16px;\n font-size: 13px;\n font-weight: 600;\n box-shadow: var(--mj-shadow-md);\n cursor: default;\n white-space: nowrap;\n}\n\n/* Multi-field form - card-style (block display) */\n:host ::ng-deep .form-response-pill.multi-field {\n display: inline-block;\n max-width: min(800px, 100%);\n width: auto;\n min-width: 400px;\n margin: 8px 0;\n vertical-align: top;\n}\n\n:host ::ng-deep .form-response-pill.single-field i {\n font-size: 11px;\n opacity: 0.95;\n}\n\n:host ::ng-deep .form-response-pill.single-field strong {\n font-weight: 600;\n margin-right: 4px;\n}\n\n/* Multi-field form - card-style pill */\n:host ::ng-deep .form-response-pill .pill-header {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n background: var(--mj-status-success);\n color: var(--mj-text-inverse);\n font-weight: 600;\n font-size: 13px;\n border-radius: 12px 12px 0 0;\n border: 2px solid color-mix(in srgb, var(--mj-status-success) 40%, transparent);\n border-bottom: none;\n box-shadow: var(--mj-shadow-md);\n}\n\n:host ::ng-deep .form-response-pill .pill-header i {\n font-size: 12px;\n opacity: 0.95;\n}\n\n:host ::ng-deep .form-response-pill .pill-fields {\n padding: 10px 12px;\n background: color-mix(in srgb, var(--mj-status-success) 8%, transparent);\n border: 2px solid color-mix(in srgb, var(--mj-status-success) 40%, transparent);\n border-top: none;\n border-radius: 0 0 12px 12px;\n}\n\n:host ::ng-deep .form-response-pill .pill-field {\n display: flex;\n flex-direction: column;\n gap: 6px;\n padding: 12px 0;\n font-size: 13px;\n}\n\n:host ::ng-deep .form-response-pill .pill-field:not(:last-child) {\n border-bottom: 1px solid color-mix(in srgb, var(--mj-status-success) 20%, transparent);\n padding-bottom: 12px;\n margin-bottom: 0;\n}\n\n:host ::ng-deep .form-response-pill .field-question {\n font-weight: 600;\n color: var(--mj-status-success);\n font-size: 12px;\n line-height: 1.4;\n text-transform: uppercase;\n letter-spacing: 0.3px;\n opacity: 0.9;\n}\n\n:host ::ng-deep .form-response-pill .field-answer {\n color: var(--mj-text-primary);\n font-weight: 400;\n font-size: 15px;\n line-height: 1.6;\n padding: 8px 0 8px 12px;\n background: transparent;\n border-left: 3px solid color-mix(in srgb, var(--mj-status-success) 40%, transparent);\n font-style: italic;\n}\n\n\n/* Hover effect for form pills */\n:host ::ng-deep .form-response-pill.single-field:hover {\n transform: translateY(-1px);\n box-shadow: var(--mj-shadow-lg);\n}\n\n:host ::ng-deep .form-response-pill.multi-field:hover {\n transform: translateY(-1px);\n}\n\n:host ::ng-deep .form-response-pill.multi-field:hover .pill-header {\n box-shadow: var(--mj-shadow-lg);\n}\n\n/* Responsive adjustments for multi-field forms */\n@media (max-width: 600px) {\n :host ::ng-deep .form-response-pill.multi-field {\n min-width: 300px;\n }\n}\n\n@media (max-width: 400px) {\n :host ::ng-deep .form-response-pill.multi-field {\n min-width: 100%;\n }\n\n :host ::ng-deep .form-response-pill .field-question {\n font-size: 11px;\n }\n\n :host ::ng-deep .form-response-pill .field-answer {\n font-size: 14px;\n padding: 6px 0 6px 10px;\n }\n}\n\n/* ==================== Message Attachments ==================== */\n\n.message-attachments {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n margin-top: 12px;\n margin-bottom: 8px;\n}\n\n.attachment-item {\n position: relative;\n border-radius: 8px;\n overflow: hidden;\n cursor: pointer;\n transition: transform 0.2s, box-shadow 0.2s;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid color-mix(in srgb, var(--mj-text-primary) 10%, transparent);\n}\n\n.attachment-item:hover {\n transform: scale(1.02);\n box-shadow: var(--mj-shadow-md);\n}\n\n.attachment-item.image-attachment {\n width: 200px;\n height: 150px;\n}\n\n.attachment-thumbnail {\n width: 100%;\n height: 100%;\n object-fit: cover;\n display: block;\n}\n\n.attachment-overlay {\n position: absolute;\n inset: 0;\n background: var(--mj-bg-overlay);\n display: flex;\n align-items: center;\n justify-content: center;\n opacity: 0;\n transition: opacity 0.2s;\n}\n\n.attachment-item:hover .attachment-overlay {\n opacity: 1;\n}\n\n.attachment-overlay i {\n color: var(--mj-text-inverse);\n font-size: 24px;\n}\n\n/* Non-image attachment tile: horizontal strip with UPPERCASE type badge,\n filename, and size. Artifact-typed attachments get a brand-primary tinted\n badge to distinguish them from plain uploads. */\n.attachment-strip {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 8px 12px 8px 8px;\n width: 320px;\n max-width: 100%;\n min-height: 56px;\n cursor: pointer;\n border-radius: 8px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n transition: background 0.15s, border-color 0.15s;\n}\n\n.attachment-strip:hover {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-border-strong);\n}\n\n.attachment-badge {\n flex: 0 0 auto;\n min-width: 48px;\n height: 48px;\n padding: 0 10px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 6px;\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n font-size: 11px;\n font-weight: 700;\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-secondary);\n border: 1px solid var(--mj-border-subtle);\n user-select: none;\n text-align: center;\n line-height: 1;\n white-space: nowrap;\n}\n\n.attachment-strip.is-artifact .attachment-badge {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n border-color: color-mix(in srgb, var(--mj-brand-primary) 25%, transparent);\n}\n\n.attachment-meta {\n display: flex;\n flex-direction: column;\n min-width: 0; /* allow ellipsis inside flex child */\n gap: 2px;\n}\n\n.attachment-strip .file-name {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-primary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.attachment-strip .file-size {\n font-size: 11px;\n color: var(--mj-text-muted);\n}\n\n/* Responsive attachments */\n@media (max-width: 600px) {\n .attachment-item.image-attachment {\n width: 150px;\n height: 112px;\n }\n\n .attachment-strip {\n width: 100%;\n }\n}\n/* \u2500\u2500 Markdown-rendered textarea values inside submitted form pills (e.g. the approved Plan) \u2500\u2500 */\n:host ::ng-deep .form-response-pill .field-answer-markdown {\n font-style: normal; /* the pill's default italic reads poorly on multi-line formatted content */\n font-size: 13.5px;\n line-height: 1.6;\n color: var(--mj-text-primary);\n}\n:host ::ng-deep .form-response-pill .field-answer-markdown h1,\n:host ::ng-deep .form-response-pill .field-answer-markdown h2,\n:host ::ng-deep .form-response-pill .field-answer-markdown h3,\n:host ::ng-deep .form-response-pill .field-answer-markdown h4 {\n font-size: 13.5px;\n font-weight: 700;\n margin: 10px 0 4px;\n color: var(--mj-text-primary);\n}\n:host ::ng-deep .form-response-pill .field-answer-markdown p {\n margin: 6px 0;\n}\n:host ::ng-deep .form-response-pill .field-answer-markdown ul,\n:host ::ng-deep .form-response-pill .field-answer-markdown ol {\n margin: 6px 0;\n padding-left: 22px;\n}\n:host ::ng-deep .form-response-pill .field-answer-markdown li {\n margin: 3px 0;\n}\n:host ::ng-deep .form-response-pill .field-answer-markdown code {\n font-size: 12px;\n padding: 1px 5px;\n border-radius: 4px;\n background: color-mix(in srgb, var(--mj-status-success) 12%, transparent);\n}\n:host ::ng-deep .form-response-pill .field-answer-markdown table {\n border-collapse: collapse;\n margin: 8px 0;\n}\n:host ::ng-deep .form-response-pill .field-answer-markdown th,\n:host ::ng-deep .form-response-pill .field-answer-markdown td {\n border: 1px solid color-mix(in srgb, var(--mj-status-success) 25%, transparent);\n padding: 4px 10px;\n font-size: 12.5px;\n}\n", "/**\n * Custom Agent Icons for MemberJunction\n *\n * This file contains custom icon definitions for agents that need unique branding\n * beyond Font Awesome icons. Icons can be CSS-based (emoji, Unicode, SVG data URIs)\n * or reference external image files.\n *\n * USAGE IN AGENT METADATA:\n * \"IconClass\": \"mj-icon-skip\" (references .mj-icon-skip class below)\n *\n * EXTENSIBILITY FOR 3RD PARTY DEVELOPERS:\n * Third-party developers have TWO options:\n *\n * 1. CSS CLASS APPROACH (Recommended for developers):\n * - Add your own global CSS with custom icon classes\n * - Reference your class in agent metadata: \"IconClass\": \"your-custom-class\"\n * - Works with any CSS available to the application\n * - Example: If you have a global stylesheet with .acme-icon-analyzer { ... }\n * then use \"IconClass\": \"acme-icon-analyzer\"\n *\n * 2. LOGO URL APPROACH (Recommended for end users):\n * - Use the LogoURL field in agent metadata\n * - Provide a URL or data URI: \"LogoURL\": \"https://example.com/logo.png\"\n * - Supports: HTTP URLs, data URIs (data:image/png;base64,...)\n * - LogoURL takes precedence over IconClass in the UI\n * - Perfect for non-technical users or external/uploaded images\n *\n * BEST PRACTICES:\n * - Use mj-icon-* prefix for MJ core icons\n * - Use your own prefix for 3rd party icons (e.g., acme-icon-*)\n * - Keep icons simple and recognizable at 16-36px sizes\n * - Test in both light and dark themes\n * - Prefer CSS classes over LogoURL for version-controlled icons\n */\n\n/* ============================================\n BASE STYLES FOR CUSTOM ICONS\n ============================================ */\n\n/* Base styling for all custom MJ icons */\n[class^=\"mj-icon-\"],\n[class*=\" mj-icon-\"] {\n font-style: normal;\n font-variant: normal;\n text-rendering: auto;\n -webkit-font-smoothing: antialiased;\n display: inline-block;\n font-size: inherit;\n line-height: 1;\n}\n\n/* ============================================\n MJ CORE ICONS\n ============================================ */\n\n/**\n * Skip Brain Icon - Analytics/Intelligence Agent\n * Official Skip logo from Skip SaaS branding\n */\n.mj-icon-skip {\n width: 1.4em;\n height: 1.4em;\n display: inline-block;\n background-size: contain;\n background-repeat: no-repeat;\n background-position: center;\n /* Official Skip logo SVG */\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 101.89918457031249 96.83947368421053'%3E%3Cg transform='translate(-0.1288232421875,-0.0)'%3E%3Cpath d='M93.85,41.56c-.84,0-1.62.2-2.37.55-3-4.35-7.49-8.12-13.04-11.04l.04-7.18v-14.44h-10.24v17.6c-1.52-.43-3.07-.8-4.67-1.11V0h-10.24v24.72s-.09,0-.14,0h-4.38s-.1,0-.14,0V7.3h-10.24v18.62c-1.6.32-3.15.69-4.67,1.11v-11.67h-10.24v6.09l.04,9.6c-5.55,2.92-10.04,6.7-13.04,11.04-.75-.35-1.53-.55-2.37-.55-4.5,0-8.14,5.61-8.14,12.51s3.64,12.53,8.14,12.53c.58,0,1.14-.12,1.67-.29,4.1,6.62,11.54,12.06,20.98,15.28l.79.13v7.05c0,2.97,1.45,5.58,3.87,6.99,1.18.69,2.5,1.04,3.85,1.03,1.4,0,2.83-.37,4.15-1.12l7.54-4.29,7.56,4.3c1.31.74,2.73,1.12,4.13,1.12s2.67-.35,3.85-1.04c2.42-1.41,3.86-4.02,3.86-6.98v-7.05l.79-.13c9.44-3.22,16.89-8.66,20.98-15.28.54.17,1.09.29,1.68.29,4.5,0,8.14-5.61,8.14-12.53s-3.63-12.51-8.14-12.51' fill='%23AAAAAA'/%3E%3Cpath d='M86.69,50.87c0-12.22-13.6-19.1-28.94-20.66-4.48-.47-9.19-.54-13.52,0-15.34,1.53-28.93,8.41-28.93,20.66,0,8.55,5.7,15.55,12.68,15.55h7.94c3.05,2.5,6.93,4.1,11.08,4.71,2.65.4,5.44.46,8.01,0,4.15-.6,8.05-2.2,11.1-4.71h7.92c6.97,0,12.68-7,12.68-15.55' fill='white' opacity='0.9'/%3E%3Cpath d='M57.83,55.82c-1.19,2.58-3.8,4.35-6.84,4.35s-5.65-1.77-6.84-4.35h13.68Z' fill='%23AAAAAA'/%3E%3Cpath d='M32.52,41.14c1.74,0,3.18,2.13,3.18,4.76s-1.44,4.74-3.18,4.74-3.16-2.13-3.16-4.74,1.41-4.76,3.16-4.76' fill='%23AAAAAA'/%3E%3Cpath d='M69.46,41.14c1.74,0,3.16,2.13,3.16,4.76s-1.41,4.74-3.16,4.74-3.18-2.13-3.18-4.74,1.41-4.76,3.18-4.76' fill='%23AAAAAA'/%3E%3Cpath d='M63.91,76.15c-.82-.48-1.84-.43-2.8.12l-10.13,5.75-10.11-5.75c-.96-.55-1.98-.59-2.8-.12-.82.47-1.29,1.38-1.29,2.49v10.12c0,1.11.47,2.02,1.28,2.49.38.22.8.33,1.24.33.51,0,1.05-.15,1.57-.44l10.12-5.75,10.11,5.75c.52.29,1.05.44,1.56.44.44,0,.86-.11,1.24-.33.81-.48,1.28-1.38,1.28-2.49v-10.12c0-1.11-.47-2.02-1.28-2.49' fill='white' opacity='0.9'/%3E%3C/g%3E%3C/svg%3E\");\n vertical-align: middle;\n}\n\n/**\n * Alternative Skip Icon - Lightning Bolt\n * Simple emoji-based icon for quick setup\n */\n.mj-icon-skip-lightning::before {\n content: \"\u26A1\";\n color: var(--mj-brand-primary);\n font-size: 1.1em;\n}\n\n/**\n * Skip Icon - Brain Emoji\n * Fallback emoji option\n */\n.mj-icon-skip-brain::before {\n content: \"\uD83E\uDDE0\";\n font-size: 1.2em;\n}\n\n/**\n * Betty Icon - AI Assistant\n * Official Betty logo (face icon only)\n */\n.mj-icon-betty {\n width: 1.4em;\n height: 1.4em;\n display: inline-block;\n background-size: contain;\n background-repeat: no-repeat;\n background-position: center;\n /* Official Betty face icon SVG */\n background-image: url(\"data:image/svg+xml,%3Csvg id='a' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 200 150'%3E%3Cpath d='M64.96,60.23h75.12c10.58,0,20.24,4.31,27.2,11.32,7.01,6.95,11.32,16.61,11.32,27.19s-4.31,20.24-11.32,27.19c-6.95,7.02-16.61,11.32-27.2,11.32h-75.12c-10.58,0-20.24-4.31-27.19-11.32-2.65-2.64-4.92-5.6-6.71-8.92-.24,0-.49.06-.74.06-2.46,0-4.67-1.05-6.34-2.65-1.6-1.66-2.58-3.87-2.58-6.34v-18.7c0-2.46.98-4.74,2.58-6.34,1.66-1.66,3.87-2.65,6.34-2.65.25,0,.49,0,.74.06,1.79-3.32,4.06-6.34,6.71-8.92,6.95-7.01,16.61-11.32,27.19-11.32' fill='%233d1252'/%3E%3Cpath d='M132.33,68.36h0c0,1.72-.74,3.32-1.91,4.49-1.11,1.17-2.71,1.84-4.49,1.84h-13.29c-1.78,0-3.32-.68-4.49-1.84-1.17-1.17-1.91-2.77-1.91-4.49h-12.92c-8.37,0-15.94,3.44-21.47,8.92-5.47,5.54-8.92,13.1-8.92,21.47v1.17l.06.37v.37l.06.43v.37l.06.37v.37l.06.37.06.43.06.37.06.37.06.37.06.37c0,.12.06.25.06.37l.06.37.12.37.06.37.12.37.06.37.12.37.12.31.06.37.12.37.12.37.12.31.12.37.12.37.19.31.12.37.12.37.12.31.18.37.12.31.19.31.18.37.12.31.18.31.19.37.18.31.18.31.19.31.18.31c.12.24.25.43.37.68l.19.25.24.31.19.31c.43.62.86,1.23,1.35,1.79l.18.24c.49.62.99,1.17,1.48,1.66.19.19.31.37.49.56.19.12.37.31.56.49.49.49,1.04.98,1.6,1.47l.31.19c.56.49,1.17.92,1.79,1.35.18.12.37.25.55.37l.31.25.31.18.31.19.37.18.31.18.31.19.31.18.31.19.37.12.31.19.31.18c.12.06.24.12.37.12l.31.19.37.12.31.19.37.12.31.12.37.19.37.12.31.12.37.12.37.12.37.06c.24.12.43.18.68.25l.37.12.37.06.37.12c.12,0,.25.06.37.06l.37.06.37.12.37.06.37.06.37.06.37.06.37.06.37.06.43.06h.37l.37.06h.37l.37.06h.8l.37.06h47.56c8.37,0,15.94-3.44,21.47-8.92,5.48-5.54,8.92-13.1,8.92-21.47s-3.44-15.94-8.92-21.47c-5.54-5.48-13.1-8.92-21.47-8.92h-7.75Z' fill='%23fff'/%3E%3Cpolygon points='54.93 12.74 85.57 55.25 106.12 55.25 106.12 34.89 106.12 34.7 105.75 34.7 54.93 12.74' fill='%233aba91'/%3E%3Cpolygon points='111.1 55.25 124.76 55.25 145 27.07 111.35 41.59 111.1 41.59 111.1 41.72 111.1 55.25' fill='%233aba91'/%3E%3Cpath d='M94.55,82.81c3.75,0,6.83,3.81,7.57,8.92.06.74-.31,1.35-.98,1.66-.61.31-1.35.18-1.84-.37-1.29-1.48-2.96-2.34-4.74-2.34s-3.38.86-4.67,2.34c-.49.55-1.23.68-1.91.37-.68-.31-1.05-.92-.92-1.66.68-5.11,3.81-8.92,7.51-8.92' fill='%233d1252'/%3E%3Cpath d='M132.08,115.24c-.31,1.05-.86,2.03-1.66,2.77-1.11,1.17-2.71,1.84-4.49,1.84h-13.29c-1.79,0-3.32-.68-4.49-1.84-.8-.74-1.36-1.72-1.66-2.77-.19-.68.06-1.41.68-1.84.56-.43,1.35-.49,1.97-.06.98.68,2.21,1.05,3.51,1.05h13.29c1.29,0,2.52-.37,3.51-1.05.61-.43,1.41-.37,1.97.06.62.43.86,1.17.68,1.84' fill='%233d1252'/%3E%3Cpath d='M144.02,82.81c3.69,0,6.83,3.81,7.51,8.92.12.74-.24,1.35-.92,1.66-.68.31-1.41.18-1.91-.37-1.29-1.48-2.89-2.34-4.67-2.34s-3.44.86-4.74,2.34c-.49.55-1.23.68-1.84.37-.68-.31-1.05-.92-.98-1.66.74-5.11,3.81-8.92,7.57-8.92' fill='%233d1252'/%3E%3C/svg%3E\");\n vertical-align: middle;\n}\n\n/**\n * Izzy Icon - AI Assistant\n * Official Izzy logo (mark only)\n */\n.mj-icon-izzy {\n width: 1.4em;\n height: 1.4em;\n display: inline-block;\n background-size: contain;\n background-repeat: no-repeat;\n background-position: center;\n /* Official Izzy mark icon SVG */\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 204 180'%3E%3Cpath d='M0 0 C3.61144774 3.08477828 4.84942137 4.90830493 5.5 9.625 C5 13 5 13 3.5 14.9375 C1.74432121 17.35155834 1.83578869 18.21944114 1.90625 21.12890625 C1.9371875 22.40636719 1.968125 23.68382813 2 25 C3.18335937 24.72285156 4.36671875 24.44570313 5.5859375 24.16015625 C22.44010416 20.26839867 22.44010416 20.26839867 30 20 C31.80210938 19.92265625 31.80210938 19.92265625 33.640625 19.84375 C47.49356199 19.44904163 61.73614427 20.86627802 75 25 C75.53596907 19.64244551 75.53596907 19.64244551 73.5 15 C71.5549761 12.4066348 71.45048389 10.16629658 71.59375 6.97265625 C72.33633815 3.36681955 74.01253991 1.99164006 77 0 C79.80907914 -0.63997166 82.18961327 -0.63020793 85 0 C87.8100346 1.79363911 89.50940468 3.01880935 91 6 C90.984375 8.05859375 90.984375 8.05859375 90.75 10.4375 C90.68296875 11.21996094 90.6159375 12.00242187 90.546875 12.80859375 C90 15 90 15 88.49609375 16.3984375 C86.25734576 18.79500846 86.4852344 20.97464008 86.3125 24.1875 C86.21388672 25.81751953 86.21388672 25.81751953 86.11328125 27.48046875 C86.07589844 28.31191406 86.03851563 29.14335937 86 30 C86.67675781 30.0825 87.35351562 30.165 88.05078125 30.25 C91.82333306 31.20937741 94.89353787 32.99425194 98.1875 35 C99.18052124 35.60448975 99.18052124 35.60448975 100.19360352 36.22119141 C111.98050012 43.58460075 121.17745776 53.2687532 127 66 C127 66.66 127 67.32 127 68 C127.721875 68.0825 128.44375 68.165 129.1875 68.25 C133.81406141 69.48374971 136.2179022 71.66516963 138.625 75.7734375 C140.97801199 81.55147269 140.43210927 87.87027126 140.375 94 C140.38660156 95.24523437 140.39820313 96.49046875 140.41015625 97.7734375 C140.3675701 111.08870765 140.3675701 111.08870765 135.5 116.7421875 C131.62323281 119.66995439 128.8523137 121.14337998 124 121.125 C122.9790625 121.12886719 122.9790625 121.12886719 121.9375 121.1328125 C120 121 120 121 117 120 C116.74347656 120.65226562 116.48695313 121.30453125 116.22265625 121.9765625 C115.83980469 122.85054688 115.45695313 123.72453125 115.0625 124.625 C114.70285156 125.48351562 114.34320313 126.34203125 113.97265625 127.2265625 C108.57908063 134.80960941 99.56813916 137.59212379 91.0625 140.375 C90.02287109 140.72949219 88.98324219 141.08398438 87.91210938 141.44921875 C80.34347852 144 80.34347852 144 78 144 C78.02094727 144.65484375 78.04189453 145.3096875 78.06347656 145.984375 C78.14730383 148.98942328 78.19886895 151.99422464 78.25 155 C78.28351563 156.02996094 78.31703125 157.05992187 78.3515625 158.12109375 C78.43361416 164.56214867 77.93369275 169.71304442 74 175 C68.75523423 179.17440541 64.68195675 180.53237245 58 180 C55.12653443 178.963898 52.49379495 177.58020045 49.8125 176.125 C49.11447266 175.76019531 48.41644531 175.39539063 47.69726562 175.01953125 C46.39868999 174.33997216 45.10309803 173.65465367 43.81176758 172.96142578 C43.21388428 172.64415527 42.61600098 172.32688477 42 172 C41.34290039 171.59402588 40.68580078 171.18805176 40.00878906 170.76977539 C38.03672401 169.77639533 38.03672401 169.77639533 36.12475586 170.58325195 C35.49448486 170.96441162 34.86421387 171.34557129 34.21484375 171.73828125 C33.17166992 172.35026367 33.17166992 172.35026367 32.10742188 172.97460938 C31.39134766 173.41611328 30.67527344 173.85761719 29.9375 174.3125 C28.51029236 175.1647359 27.08194984 176.01507485 25.65234375 176.86328125 C25.02320068 177.24782471 24.39405762 177.63236816 23.74584961 178.02856445 C19.79572932 180.2265128 16.44037501 180.296025 12 180 C6.82155197 178.33236419 3.95074467 176.59004726 1 172 C-0.72417326 168.34258111 -1.2403609 165.51230089 -1.1953125 161.48046875 C-1.18886719 160.45888672 -1.18242188 159.43730469 -1.17578125 158.38476562 C-1.15902344 157.32966797 -1.14226563 156.27457031 -1.125 155.1875 C-1.11597656 154.11306641 -1.10695312 153.03863281 -1.09765625 151.93164062 C-1.07415306 149.28753146 -1.04129575 146.64388128 -1 144 C-1.63196289 143.81171631 -2.26392578 143.62343262 -2.91503906 143.42944336 C-8.20708475 141.84808949 -13.49207901 140.2541307 -18.75 138.5625 C-19.98234375 138.17191406 -21.2146875 137.78132812 -22.484375 137.37890625 C-29.06200008 134.79901552 -34.12925122 130.90130551 -38 125 C-38.875 121.5625 -38.875 121.5625 -39 119 C-39.495 119.33 -39.99 119.66 -40.5 120 C-45.24354984 121.89741993 -49.49426304 121.53143657 -54.1875 119.875 C-58.42051121 117.05299253 -61.35909664 113.92271008 -63 109 C-63.22709306 104.92471184 -63.22828659 100.8492307 -63.24023438 96.76806641 C-63.2498982 94.77103695 -63.28108516 92.77414948 -63.3125 90.77734375 C-63.36188158 78.59243786 -63.36188158 78.59243786 -60 73 C-57.7509823 70.86631654 -55.88785241 69.35340008 -53.0078125 68.20703125 C-50.3010212 66.57979679 -49.65488803 64.83796148 -48.3125 62 C-45.06106922 55.7428385 -40.95735135 50.97447519 -36 46 C-35.40832031 45.38511719 -34.81664063 44.77023438 -34.20703125 44.13671875 C-28.97373562 39.11136864 -17.47215548 30 -10 30 C-10.08733973 27.91589342 -10.19552278 25.83265331 -10.3125 23.75 C-10.37050781 22.58984375 -10.42851563 21.4296875 -10.48828125 20.234375 C-11.02905532 16.81635262 -11.84853545 15.59874271 -14 13 C-14.54046356 8.75350057 -14.48376179 6.74176808 -12.125 3.125 C-8.57275398 -0.42724602 -4.8825369 -0.970906 0 0 Z M5 35 C4.30245605 35.21962402 3.60491211 35.43924805 2.88623047 35.66552734 C-14.1501062 41.15773444 -29.02751477 50.81254544 -39 66 C-39.33 66.99 -39.66 67.98 -40 69 C-37.525 70.98 -37.525 70.98 -35 73 C-34.52691406 72.29875 -34.05382812 71.5975 -33.56640625 70.875 C-21.08320269 52.96537462 -2.17172019 42.38052109 19.26171875 38.5078125 C46.97805996 34.9959591 75.10426623 38.71529466 97.73046875 56.09765625 C103.53827054 61.07953766 107.9264808 66.53902088 112 73 C113.32 72.01 114.64 71.02 116 70 C115.01713954 61.60788376 107.55262518 55.04847712 101.375 49.8125 C82.80696113 35.82916208 61.35998978 30.59265576 38.375 30.625 C37.71836365 30.62554382 37.06172729 30.62608765 36.38519287 30.62664795 C25.42439402 30.66823796 15.42390121 31.62072499 5 35 Z' fill='%234E3B78' transform='translate(63,0)'/%3E%3Cpath d='M0 0 C5.27957047 5.78547525 9.31612861 13.25448014 10 21.125 C9.69743213 24.83293961 8.77676366 26.8914086 6.1875 29.5625 C-2.04152489 35.76003038 -13.60917874 39.6270706 -23.875 38.8125 C-24.535 38.1525 -25.195 37.4925 -25.875 36.8125 C-28.97847254 36.48234335 -31.03281176 36.30718706 -33.75 37.9375 C-35.40354531 40.69340884 -35.26865568 42.66325452 -34.875 45.8125 C-33.95833333 47.89583333 -33.95833333 47.89583333 -31.875 48.8125 C-28.29166667 48.89583333 -28.29166667 48.89583333 -24.875 47.8125 C-24.57086182 47.16466553 -24.26672363 46.51683105 -23.95336914 45.84936523 C-22.875 43.8125 -22.875 43.8125 -20.77124023 42.88696289 C-19.91731689 42.6883667 -19.06339355 42.48977051 -18.18359375 42.28515625 C-17.23806641 42.04990234 -16.29253906 41.81464844 -15.31835938 41.57226562 C-14.32642578 41.34216797 -13.33449219 41.11207031 -12.3125 40.875 C-4.77934417 39.10870895 1.54823541 36.95205932 8.125 32.8125 C7.81647145 40.06292099 4.56245219 45.32546918 -0.5 50.4609375 C-5.29811284 54.61130511 -8.83216751 54.86916719 -15 55 C-21.13677833 55.26569953 -25.04589225 56.51893716 -29.890625 60.31640625 C-39.17633501 67.31724667 -52.82450605 66.52799961 -63.875 65.8125 C-71.37432145 64.60538489 -79.4496824 61.2378176 -84.875 55.8125 C-86.81199027 55.70419517 -88.75076074 55.60687514 -90.69067383 55.58691406 C-97.68300211 55.51299157 -103.12007731 55.4392364 -108.44140625 50.40234375 C-108.91449219 49.87769531 -109.38757813 49.35304688 -109.875 48.8125 C-110.6175 48.090625 -111.36 47.36875 -112.125 46.625 C-118.35765562 36.60823203 -119.69570866 25.34707186 -117.25 13.8828125 C-113.47065738 3.0509466 -104.76645407 -4.0120534 -94.875 -9.1875 C-91.26850975 -10.75400624 -87.62602625 -12.0153043 -83.875 -13.1875 C-83.029375 -13.47496094 -82.18375 -13.76242188 -81.3125 -14.05859375 C-56.0861494 -22.29657387 -20.04377266 -18.06142152 0 0 Z' fill='%23FDFDFD' transform='translate(155.875,64.1875)'/%3E%3Cpath d='M0 0 C5.24479788 1.58079188 9.51172656 4.60408712 14.06640625 7.58984375 C18.37837094 10.28462973 18.37837094 10.28462973 23.30859375 11.1328125 C28.49696048 9.20971132 33.08639658 6.29555589 37.79882812 3.42578125 C43.66838131 -0.00837477 43.66838131 -0.00837477 47.27734375 0.078125 C49.34375 1.0078125 49.34375 1.0078125 51.34375 3.0078125 C51.82984303 7.30136192 51.71414913 11.62739332 51.71875 15.9453125 C51.74324219 17.15123047 51.76773438 18.35714844 51.79296875 19.59960938 C51.79876953 21.33114258 51.79876953 21.33114258 51.8046875 23.09765625 C51.81290527 24.15847412 51.82112305 25.21929199 51.82958984 26.31225586 C51.34375 29.0078125 51.34375 29.0078125 49.48461914 30.87670898 C46.29658529 32.56106989 44.78123809 32.062357 41.34375 31.0078125 C37.60135447 29.03986817 34.07891261 26.72386924 30.53320312 24.42578125 C26.44214688 21.80182316 26.44214688 21.80182316 21.77734375 20.921875 C17.60401055 22.78413283 13.85973006 25.2663764 10.046875 27.76953125 C5.85335687 30.41401513 2.44659272 31.9581498 -2.65625 32.0078125 C-4.33203125 30.87695312 -4.33203125 30.87695312 -5.65625 29.0078125 C-6.04443359 26.328125 -6.04443359 26.328125 -6.0546875 23.1328125 C-6.05855469 21.98296875 -6.06242187 20.833125 -6.06640625 19.6484375 C-6.05480469 18.44703125 -6.04320313 17.245625 -6.03125 16.0078125 C-6.04285156 14.80640625 -6.05445312 13.605 -6.06640625 12.3671875 C-6.06253906 11.21734375 -6.05867188 10.0675 -6.0546875 8.8828125 C-6.05130371 7.82835937 -6.04791992 6.77390625 -6.04443359 5.6875 C-5.65625 3.0078125 -5.65625 3.0078125 -4.29736328 1.14111328 C-2.65625 0.0078125 -2.65625 0.0078125 0 0 Z' fill='%23FCFCFD' transform='translate(78.65625,136.9921875)'/%3E%3Cpath d='M0 0 C2.5 0.625 2.5 0.625 4.8125 2.625 C6.96830116 6.4575354 7.24792603 9.32007692 6.5 13.625 C5.34367254 15.98793002 4.35016245 17.77483755 2.5 19.625 C0.1875 20 0.1875 20 -2.5 19.625 C-5.06638215 17.47478793 -6.29103188 15.79226637 -6.88671875 12.46484375 C-7.08084032 8.45522921 -6.77549931 6.12498023 -4.8125 2.5625 C-2.5 0.625 -2.5 0.625 0 0 Z' fill='%2353417C' transform='translate(138.5,67.375)'/%3E%3Cpath d='M0 0 C2.5 0.6875 2.5 0.6875 4.8125 2.625 C7.08407605 6.74748987 7.32547179 10.07653131 6.5 14.6875 C4.8125 17.75 4.8125 17.75 2.5 19.6875 C-0.0625 20.25 -0.0625 20.25 -2.5 19.6875 C-5.30401904 17.38419865 -5.84979387 14.76309142 -6.4375 11.3125 C-6.72853275 7.71913649 -6.44645777 6.57011897 -4.875 3.125 C-2.5 0.6875 -2.5 0.6875 0 0 Z' fill='%23523F7B' transform='translate(64.5,67.3125)'/%3E%3Cpath d='M0 0 C8.91 0 17.82 0 27 0 C24.81183076 5.47042311 24.169236 6.55141452 19 9 C14.08609728 9.94526984 9.88605617 10.13992406 5.51171875 7.49609375 C3.4733513 5.76185217 1.65854906 4.10051199 0 2 C0 1.34 0 0.68 0 0 Z' fill='%23574680' transform='translate(88,95)'/%3E%3C/svg%3E\");\n vertical-align: middle;\n}\n\n/* ============================================\n EXAMPLE CUSTOM ICONS FOR OTHER AGENTS\n ============================================ */\n\n/**\n * Data Analysis Icon - Chart emoji\n */\n.mj-icon-data-analyst::before {\n content: \"\uD83D\uDCCA\";\n font-size: 1.1em;\n}\n\n/**\n * API/Integration Icon - Plug emoji\n */\n.mj-icon-api::before {\n content: \"\uD83D\uDD0C\";\n font-size: 1.1em;\n}\n\n/**\n * Processing/Workflow Icon - Gear emoji with animation\n */\n.mj-icon-processing::before {\n content: \"\u2699\uFE0F\";\n display: inline-block;\n animation: rotate-icon 2s linear infinite;\n}\n\n@keyframes rotate-icon {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n}\n\n/**\n * Text/Letter-based Icon\n * Simple monogram icon\n */\n.mj-icon-monogram-s::before {\n content: \"S\";\n font-weight: 800;\n font-family: system-ui, -apple-system, sans-serif;\n font-size: 1.1em;\n color: var(--mj-brand-primary);\n}\n\n/* ============================================\n TEMPLATE FOR NEW ICONS\n ============================================ */\n\n/*\n// EMOJI-BASED ICON (Simplest)\n.mj-icon-my-agent::before {\n content: \"\uD83C\uDFAF\"; // Use any emoji\n font-size: 1.2em;\n}\n\n// UNICODE SYMBOL ICON\n.mj-icon-my-agent::before {\n content: \"\\2022\"; // Unicode character\n font-size: 1.2em;\n color: #667eea;\n}\n\n// TEXT/LETTER ICON\n.mj-icon-my-agent::before {\n content: \"MA\"; // Initials/text\n font-weight: 800;\n font-size: 0.9em;\n color: #667eea;\n}\n\n// SVG DATA URI ICON (Most Control)\n.mj-icon-my-agent {\n width: 1em;\n height: 1em;\n display: inline-block;\n background-size: contain;\n background-repeat: no-repeat;\n background-position: center;\n background-image: url('data:image/svg+xml;utf8,<svg>...</svg>');\n vertical-align: middle;\n}\n\n// EXTERNAL IMAGE FILE (For existing assets)\n.mj-icon-my-agent {\n width: 1em;\n height: 1em;\n display: inline-block;\n background-size: contain;\n background-repeat: no-repeat;\n background-position: center;\n background-image: url('/assets/icons/my-agent.svg');\n vertical-align: middle;\n}\n\n// GRADIENT TEXT ICON\n.mj-icon-my-agent::before {\n content: \"\u26A1\";\n background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n -webkit-background-clip: text;\n -webkit-text-fill-color: transparent;\n background-clip: text;\n}\n*/\n\n/* ============================================\n 3RD PARTY EXAMPLES\n These would typically be in EXTERNAL CSS files\n ============================================ */\n\n/*\n// Example: Acme Corp custom agent icons\n// This would be in acme-corp-styles.css loaded by the application\n\n.acme-icon-analyzer {\n width: 1em;\n height: 1em;\n display: inline-block;\n background-size: contain;\n background-image: url('https://acme.com/icons/analyzer.svg');\n}\n\n.acme-icon-reporter::before {\n content: \"A\";\n font-weight: 800;\n color: #FF6B35;\n}\n*/\n"] }]
2838
+ args: [{ standalone: false, selector: 'mj-conversation-message-item', template: "<div [class]=\"messageClasses\" [attr.data-message-id]=\"message.ID\" (click)=\"onMessageBubbleClick($event)\">\n <div class=\"message-avatar\">\n <div class=\"avatar-circle\" [class.ai-avatar]=\"isAIMessage\" [class.user-avatar]=\"isUserMessage\"\n [class.avatar-has-image]=\"isAIMessage && effectiveAssistantAvatarUrl !== null\">\n @if (isUserMessage) {\n @if (userAvatarUrl) {\n <img [src]=\"userAvatarUrl\" alt=\"User avatar\" class=\"avatar-image\" />\n } @else if (userAvatarIconClass) {\n <i [class]=\"userAvatarIconClass\"></i>\n } @else {\n <i class=\"fas fa-user\"></i>\n }\n } @else if (isAIMessage) {\n @if (effectiveAssistantAvatarUrl) {\n <img [src]=\"effectiveAssistantAvatarUrl\" alt=\"Assistant avatar\" class=\"avatar-image\"\n (error)=\"assistantAvatarFailed = true\" />\n } @else {\n <i class=\"fas\" [ngClass]=\"aiAgentInfo?.iconClass || 'fa-robot'\"></i>\n }\n }\n </div>\n </div>\n\n <div class=\"message-content\">\n <div class=\"message-header\">\n <span class=\"message-sender\" [title]=\"isAIMessage ? (aiAgentInfo?.role || 'AI Assistant') : ''\">\n {{ isAIMessage ? (aiAgentInfo?.name || 'AI Assistant') : messageSenderName }}\n </span>\n <span class=\"message-time\">{{ message.__mj_CreatedAt | date:'short' }}</span>\n\n <!-- Status indicator for user messages -->\n @if (isUserMessage && messageStatus !== 'Complete') {\n <span class=\"message-status\" [class.error]=\"messageStatus === 'Error'\">\n <i class=\"fas\" [ngClass]=\"messageStatus === 'Error' ? 'fa-exclamation-triangle' : 'fa-circle-notch fa-spin'\"></i>\n <span class=\"status-text\">{{ getStatusText() }}</span>\n </span>\n }\n\n <!-- Edit (owner's completed user messages) \u2014 opens the inline editor; the server\n sets OriginalMessageChanged when the text actually changes on save -->\n @if (allowMessageEdit && isUserMessage && isConversationOwner && !isEditing && messageStatus === 'Complete') {\n <span class=\"message-edit-icon\" (click)=\"onEditClick()\" title=\"Edit message\">\n <i class=\"fas fa-pen\"></i>\n </span>\n }\n\n <!-- Time pill - shows for AI messages in all states (in-progress, active, complete, failed) -->\n @if (!isUserMessage && timePillText) {\n <span\n class=\"time-pill\"\n [class.in-progress]=\"isInProgressAIMessage\"\n [class.active]=\"!isInProgressAIMessage && isAgentRunActive\"\n [class.complete]=\"!isInProgressAIMessage && !isAgentRunActive && messageStatus === 'Complete'\"\n [class.failed]=\"messageStatus === 'Error'\"\n [class.checking]=\"LivenessState === 'checking'\"\n [class.stalled]=\"LivenessState === 'stalled'\"\n [title]=\"LivenessState === 'stalled' ? 'No progress reported for several minutes' : (LivenessState === 'checking' ? 'No recent progress \u2014 re-checking' : '')\">\n <i class=\"fas\" [ngClass]=\"LivenessState === 'live' ? 'fa-clock' : 'fa-exclamation-triangle'\"></i>\n {{ timePillText }}\n @if (LivenessState === 'checking') {\n <span class=\"liveness-label\">checking\u2026</span>\n } @else if (LivenessState === 'stalled') {\n <span class=\"liveness-label\">no response</span>\n }\n </span>\n }\n\n <!-- Test feedback icon (appears for test runs only) -->\n @if (message.TestRunID) {\n <span\n class=\"test-feedback-icon\"\n (click)=\"onTestFeedbackClick()\"\n title=\"Provide Test Feedback\">\n <i class=\"fas fa-flask\"></i>\n </span>\n }\n\n <!-- Agent run icon (clickable to expand details) - always rightmost when present.\n Rendered only when its panel would actually have content, so it never\n appears as a dead control opening an empty popup (e.g. a white-label\n surface with showAgentRunDetails=false and no message actions). -->\n @if (hasAgentRun && hasAgentDetailsPanelContent) {\n <span\n class=\"agent-run-icon\"\n (click)=\"toggleAgentDetails()\"\n [class.expanded]=\"isAgentDetailsExpanded\"\n [title]=\"hasRatings() ? 'Agent details & ' + getRatingCount() + ' rating(s)' : 'Click to view agent execution details'\">\n <i class=\"fas fa-cog\"></i>\n @if (hasRatings()) {\n <span class=\"rating-badge\">{{ getRatingCount() }}</span>\n }\n </span>\n }\n </div>\n\n <div class=\"message-body\">\n @if (!isEditing) {\n <div class=\"message-text\">\n <mj-markdown [data]=\"displayMessage\" [enableCollapsibleHeadings]=\"true\"></mj-markdown>\n @if (isMessageEdited) {\n <span class=\"edited-badge\">(edited)</span>\n }\n </div>\n\n <!-- messageExtra slot \u2014 per-message additive decoration projected by the\n consumer via `mjChatSlot=\"messageExtra\"`. Renders after the message\n content, before attachments. Receives the message as $implicit. -->\n @if (messageExtraTemplate) {\n <ng-container *ngTemplateOutlet=\"messageExtraTemplate; context: {\n $implicit: message,\n message: message\n }\"></ng-container>\n }\n\n <!-- Message Attachments -->\n @if (hasAttachments) {\n <div class=\"message-attachments\">\n @for (attachment of attachments; track attachment.id) {\n @if (attachment.type === 'Image') {\n <div class=\"attachment-item image-attachment\"\n (click)=\"onAttachmentClick(attachment)\"\n [title]=\"attachment.fileName || 'Image attachment'\">\n <img\n [src]=\"attachment.thumbnailUrl || attachment.contentUrl\"\n [alt]=\"attachment.fileName || 'Image attachment'\"\n class=\"attachment-thumbnail\"\n loading=\"lazy\">\n <div class=\"attachment-overlay\">\n <i class=\"fas fa-expand\"></i>\n </div>\n </div>\n } @else {\n <div class=\"attachment-strip\"\n [class.is-artifact]=\"!!attachment.artifactTypeName\"\n (click)=\"onAttachmentClick(attachment)\"\n [title]=\"attachment.fileName || 'File'\">\n <div class=\"attachment-badge\">{{ badgeTextFor(attachment) }}</div>\n <div class=\"attachment-meta\">\n <span class=\"file-name\">{{ attachment.fileName || 'File' }}</span>\n <span class=\"file-size\">{{ formatFileSize(attachment.sizeBytes) }}</span>\n </div>\n </div>\n }\n }\n </div>\n }\n\n <!-- Artifact Message Cards \u2014 one per distinct artifact on this message -->\n @for (a of displayArtifacts; track a.artifact.ID) {\n <div class=\"artifact-wrapper\" [class.system-artifact]=\"a.artifact.Visibility === 'System Only'\">\n <mj-artifact-message-card\n [artifactId]=\"a.artifact.ID\"\n [artifact]=\"a.artifact\"\n [artifactVersion]=\"a.version\"\n [currentUser]=\"currentUser\"\n (actionPerformed)=\"onArtifactActionPerformed($event)\">\n </mj-artifact-message-card>\n </div>\n }\n\n <!-- One per attached artifact whose rows are still loading. Rendered AFTER the loaded\n cards, so an artifact arriving appends rather than reordering what is already on\n screen. Carries the same system-artifact de-emphasis as the card it becomes. -->\n @for (pending of pendingArtifactPlaceholders; track pending.artifactId) {\n <div class=\"artifact-wrapper\" [class.system-artifact]=\"pending.visibility === 'System Only'\">\n <div class=\"artifact-pending\">\n <mj-loading [text]=\"pendingLabel(pending)\" size=\"small\"></mj-loading>\n </div>\n </div>\n }\n\n <!-- Agent Response Form (shown only for last message by owner) -->\n @if (!ReadOnly && isLastMessageInConversation && isConversationOwner && responseForm) {\n <mj-dynamic-form\n [FormDefinition]=\"responseForm\"\n [Disabled]=\"isProcessing\"\n (FormSubmitted)=\"onFormSubmitted($event)\">\n </mj-dynamic-form>\n }\n\n <!-- Actionable Commands (shown only for last message by owner) -->\n @if (!ReadOnly && isLastMessageInConversation && isConversationOwner && actionableCommands.length > 0) {\n <mj-actionable-commands\n [commands]=\"actionableCommands\"\n [disabled]=\"isProcessing\"\n [isLastMessage]=\"isLastMessageInConversation\"\n [isConversationOwner]=\"isConversationOwner\"\n (commandExecuted)=\"onCommandExecuted($event)\">\n </mj-actionable-commands>\n }\n }\n\n @if (isEditing) {\n <div class=\"message-edit-container\">\n <textarea\n class=\"message-edit-textarea\"\n [(ngModel)]=\"editedText\"\n (keydown)=\"onEditKeydown($event)\"\n rows=\"4\"\n placeholder=\"Edit your message...\"></textarea>\n <div class=\"edit-actions\">\n <button class=\"edit-action-btn save\" (click)=\"saveEdit()\">\n <i class=\"fas fa-check\"></i>\n Save\n </button>\n <button class=\"edit-action-btn cancel\" (click)=\"cancelEditing()\">\n <i class=\"fas fa-times\"></i>\n Cancel\n </button>\n </div>\n <div class=\"edit-hint\">\n Press Enter to save, Shift+Enter for new line, Escape to cancel\n </div>\n </div>\n }\n </div>\n\n <!-- Message Footer: only rendered on the last message.\n Non-last messages have no footer \u2014 pin/delete/rating live in the gear panel. -->\n @if (!isEditing && isLastMessage && (isConversationOwner || (isAIMessage && messageStatus === 'Complete'))) {\n <div class=\"message-footer\">\n @if (allowMessageDelete && isConversationOwner) {\n <button class=\"action-bar-btn danger inline-delete\" (click)=\"onDeleteClick()\" title=\"Delete this message and all messages below it\">\n <i class=\"fas fa-trash\"></i>\n </button>\n }\n @if (isAIMessage && messageStatus === 'Complete') {\n <div class=\"ai-message-actions\">\n <!-- Thumbs visible inline only on the latest AI message, left of pin -->\n @if (showMessageRating) {\n <mj-conversation-message-rating\n [conversationDetailId]=\"message.ID\"\n [currentUser]=\"currentUser\"\n [ratingEntityName]=\"message.EntityInfo.Name || 'MJ: Conversation Details'\"\n [ratingsData]=\"ratings\"\n [canEdit]=\"isConversationOwner && !ReadOnly\">\n </mj-conversation-message-rating>\n }\n @if (allowPinning) {\n <button\n class=\"action-bar-btn pin-btn\"\n [class.pinned]=\"message.IsPinned\"\n (click)=\"PinMessage()\"\n [title]=\"message.IsPinned ? 'Unpin message' : 'Pin message'\"\n type=\"button\">\n <i class=\"fas fa-thumbtack\"></i>\n </button>\n }\n </div>\n }\n </div>\n }\n\n <!-- Agent details content section -->\n <div class=\"agent-details-section\">\n <!-- Agent Run Details Panel (expandable) -->\n @if (isAgentDetailsExpanded && hasAgentRun) {\n <!-- Agent Run Details Panel -->\n <div class=\"agent-details-panel\">\n @if (agentRun && showAgentRunDetails) {\n <div class=\"agent-details-content\">\n <div class=\"agent-details-header\">\n <i class=\"fas fa-chart-line\"></i>\n <span>\n <!-- Deliberately the ENGINE-resolved name: this header labels the real\n agent's diagnostics, and the link opens the real agent record \u2014 a\n host assistantDisplayName override must not relabel either. -->\n <a class=\"agent-name-link\" (click)=\"openAgentRecord()\" title=\"Open agent details\">\n {{ engineAgentInfo?.name || 'Agent' }}\n </a>\n Run Details\n </span>\n </div>\n\n <!-- Run-detail grid (run ID, step/token counts, $ cost, status) \u2014 developer/\n observability data. The whole run-details section (this grid AND its\n header above) is gated on showAgentRunDetails at the panel root, so a\n white-labeled surface hides all of it; the delete/pin/rating overflow\n below is a sibling block (outside this @if) and still renders. -->\n <div class=\"agent-details-grid\">\n <div class=\"detail-row\">\n <span class=\"detail-label\">Run ID:</span>\n <span class=\"detail-value\">\n <a class=\"run-id-link\" (click)=\"openAgentRunRecord()\" title=\"Open agent run details\">\n {{ agentRun.ID }}\n <i class=\"fas fa-external-link-alt\"></i>\n </a>\n </span>\n </div>\n\n @if (agentRunStepCount > 0) {\n <div class=\"detail-row\">\n <span class=\"detail-label\">Steps:</span>\n <span class=\"detail-value\">{{ agentRunStepCount }}</span>\n </div>\n }\n\n @if (agentRunTotalTokens > 0) {\n <div class=\"detail-row\">\n <span class=\"detail-label\">Tokens:</span>\n <span class=\"detail-value\">{{ formatNumber(agentRunTotalTokens) }}</span>\n </div>\n }\n\n @if (agentRunTotalCost > 0) {\n <div class=\"detail-row\">\n <span class=\"detail-label\">Cost:</span>\n <span class=\"detail-value\">\\${{ agentRunTotalCost.toFixed(4) }}</span>\n </div>\n }\n\n @if (agentRun.Status) {\n <div class=\"detail-row\">\n <span class=\"detail-label\">Status:</span>\n <span class=\"detail-value status-badge\" [class]=\"'status-' + agentRun.Status.toLowerCase()\">\n {{ agentRun.Status }}\n </span>\n </div>\n }\n </div>\n </div>\n }\n\n <!-- Delete + Rating + Pin in gear panel for non-last messages \u2014 mirrors last-message footer layout -->\n @if (!isLastMessage) {\n <div class=\"agent-panel-actions\">\n @if (allowMessageDelete && isConversationOwner) {\n <button class=\"action-bar-btn danger\" (click)=\"onDeleteClick()\" title=\"Delete this message and all messages below it\">\n <i class=\"fas fa-trash\"></i>\n </button>\n }\n @if (messageStatus === 'Complete') {\n <div class=\"ai-message-actions\">\n @if (showMessageRating) {\n <mj-conversation-message-rating\n [conversationDetailId]=\"message.ID\"\n [currentUser]=\"currentUser\"\n [ratingsData]=\"ratings\"\n [canEdit]=\"isConversationOwner && !ReadOnly\">\n </mj-conversation-message-rating>\n }\n @if (allowPinning) {\n <button\n class=\"action-bar-btn pin-btn\"\n [class.pinned]=\"message.IsPinned\"\n (click)=\"PinMessage()\"\n [title]=\"message.IsPinned ? 'Unpin message' : 'Pin message'\"\n type=\"button\">\n <i class=\"fas fa-thumbtack\"></i>\n </button>\n }\n </div>\n } @else if (allowPinning) {\n <button\n class=\"action-bar-btn pin-btn\"\n [class.pinned]=\"message.IsPinned\"\n (click)=\"PinMessage()\"\n [title]=\"message.IsPinned ? 'Unpin message' : 'Pin message'\"\n type=\"button\">\n <i class=\"fas fa-thumbtack\"></i>\n </button>\n }\n </div>\n }\n\n <!-- Tasks Section -->\n @if (detailTasks.length > 0) {\n <div class=\"agent-details-tasks\">\n <div class=\"tasks-section-header\">\n <i class=\"fas fa-tasks\"></i>\n <span>Associated Tasks ({{ detailTasks.length }})</span>\n </div>\n <div class=\"tasks-list\">\n @for (task of detailTasks; track task) {\n <mj-task-widget\n [task]=\"task\"\n [compact]=\"false\"\n [clickable]=\"false\"\n [showProgress]=\"true\"\n [showDuration]=\"true\">\n </mj-task-widget>\n }\n </div>\n </div>\n }\n </div>\n }\n </div>\n\n <!-- Rating component moved to message footer (lines 113-134) -->\n\n <!-- Removed message-actions hover panel - actions now in gear icon dropdown -->\n <!-- Retry button kept for critical error recovery on failed messages -->\n @if (messageStatus === 'Error' && isAIMessage && !isProcessing && !isEditing) {\n <div class=\"message-actions\">\n <button class=\"message-action-btn retry-btn\" (click)=\"onRetryClick()\" title=\"Retry\">\n <i class=\"fas fa-redo\"></i>\n Retry\n </button>\n </div>\n }\n\n <!-- Reaction Buttons -->\n @if (showReactions && !isProcessing && !isInProgressAIMessage && !isEditing) {\n <div class=\"message-reactions\">\n <button class=\"reaction-btn\" (click)=\"toggleReaction('like')\">\n <i class=\"far fa-thumbs-up\"></i>\n <span class=\"reaction-count\">0</span>\n </button>\n <button class=\"reaction-btn\" (click)=\"toggleReaction('comment')\">\n <i class=\"far fa-comment\"></i>\n <span class=\"reaction-count\">0</span>\n </button>\n </div>\n }\n </div>\n</div>", styles: [".message-item {\n display: flex;\n gap: 12px;\n padding: 8px 24px;\n transition: background-color 150ms ease;\n animation: fadeIn 0.3s ease;\n position: relative;\n}\n\n@keyframes fadeIn {\n from {\n opacity: 0;\n transform: translateY(10px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n.message-item.ai-message {\n background-color: transparent;\n}\n\n.message-item.user-message {\n background-color: transparent;\n}\n\n/* Jump-to beacon: pulsed amber glow applied programmatically after scroll */\n.message-item.pin-beacon {\n animation: pinBeacon 1.5s ease-out forwards;\n}\n\n@keyframes pinBeacon {\n 0% { box-shadow: 0 0 0 0 color-mix(in srgb, var(--mj-status-warning) 60%, transparent); }\n 20% { box-shadow: 0 0 0 8px color-mix(in srgb, var(--mj-status-warning) 35%, transparent); }\n 50% { box-shadow: 0 0 0 4px color-mix(in srgb, var(--mj-status-warning) 15%, transparent); }\n 70% { box-shadow: 0 0 0 6px color-mix(in srgb, var(--mj-status-warning) 20%, transparent); }\n 100% { box-shadow: none; }\n}\n\n.message-item.in-progress {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n border-left: 3px solid var(--mj-brand-primary);\n position: relative;\n}\n\n@keyframes shimmer {\n 0% {\n background-position: -200% 0;\n }\n 100% {\n background-position: 200% 0;\n }\n}\n\n/* Progress message styling - make it visually distinct */\n.message-item.in-progress .message-text {\n color: var(--mj-text-primary);\n font-weight: 500;\n max-height: 150px;\n overflow-y: auto;\n display: block;\n}\n\n\n/* Pulse effect for avatar */\n.message-item.in-progress .avatar-circle {\n box-shadow: 0 0 0 0 color-mix(in srgb, var(--mj-brand-primary) 70%, transparent);\n animation: pulse 2s ease-in-out infinite;\n}\n\n@keyframes pulse {\n 0%, 100% {\n box-shadow: 0 0 0 0 color-mix(in srgb, var(--mj-brand-primary) 70%, transparent);\n }\n 50% {\n box-shadow: 0 0 0 8px color-mix(in srgb, var(--mj-brand-primary) 0%, transparent);\n }\n}\n\n.message-item:hover {\n background-color: color-mix(in srgb, var(--mj-text-primary) 2%, transparent);\n}\n\n/* Mention Pills - Match new editor chip style */\n:host ::ng-deep .mention-badge {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 4px 12px;\n margin: 0 3px;\n border-radius: 16px;\n font-weight: 600;\n font-size: 13px;\n cursor: pointer;\n transition: all 0.2s ease;\n vertical-align: middle;\n white-space: nowrap;\n}\n\n:host ::ng-deep .mention-badge.agent {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border: 2px solid color-mix(in srgb, var(--mj-brand-primary) 40%, transparent);\n box-shadow: var(--mj-shadow-md);\n}\n\n:host ::ng-deep .mention-badge.user {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border: 2px solid color-mix(in srgb, var(--mj-brand-primary) 40%, transparent);\n box-shadow: var(--mj-shadow-md);\n}\n\n:host ::ng-deep .mention-badge.entity {\n background: var(--mj-status-success);\n color: var(--mj-text-inverse);\n border: 2px solid color-mix(in srgb, var(--mj-status-success) 40%, transparent);\n box-shadow: var(--mj-shadow-md);\n}\n\n:host ::ng-deep .mention-badge.query {\n background: var(--mj-status-warning);\n color: var(--mj-text-inverse);\n border: 2px solid color-mix(in srgb, var(--mj-status-warning) 40%, transparent);\n box-shadow: var(--mj-shadow-md);\n}\n\n:host ::ng-deep .mention-badge.record {\n background: var(--mj-color-info, #2563eb);\n color: var(--mj-text-inverse, #fff);\n border: 2px solid color-mix(in srgb, var(--mj-color-info, #2563eb) 40%, transparent);\n box-shadow: var(--mj-shadow-md);\n text-decoration: none;\n}\n\n/* Icon-only record citation: surrounding prose already named the row. */\n:host ::ng-deep .mention-badge.record.icon-only {\n padding: 4px 7px;\n gap: 0;\n min-width: 1.65em;\n justify-content: center;\n}\n\n/* Skills: standard green fallback (AISkill.Color overrides via inline style) + sharp-cornered\n rectangle \u2014 the shape differentiates skills from the rounded agent/user/entity pills.\n Keep color + shape in sync with the composer chip (mention-editor's createMentionChip). */\n:host ::ng-deep .mention-badge.skill {\n background: var(--mj-status-success);\n color: var(--mj-text-inverse);\n border: 2px solid color-mix(in srgb, var(--mj-text-inverse) 35%, transparent);\n border-radius: 4px;\n box-shadow: var(--mj-shadow-md);\n}\n\n:host ::ng-deep .mention-badge i {\n font-size: 12px;\n opacity: 0.95;\n}\n\n/* Support for custom icon classes with background-image (like mj-icon-skip) */\n:host ::ng-deep .mention-badge i[class^=\"mj-icon-\"],\n:host ::ng-deep .mention-badge i[class*=\" mj-icon-\"] {\n width: 16px;\n height: 16px;\n display: inline-block;\n background-size: contain;\n background-repeat: no-repeat;\n background-position: center;\n vertical-align: middle;\n font-size: inherit;\n}\n\n/* Skip icon - must use ::ng-deep for dynamically injected HTML */\n:host ::ng-deep .mention-badge i.mj-icon-skip {\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 101.89918457031249 96.83947368421053'%3E%3Cg transform='translate(-0.1288232421875,-0.0)'%3E%3Cpath d='M93.85,41.56c-.84,0-1.62.2-2.37.55-3-4.35-7.49-8.12-13.04-11.04l.04-7.18v-14.44h-10.24v17.6c-1.52-.43-3.07-.8-4.67-1.11V0h-10.24v24.72s-.09,0-.14,0h-4.38s-.1,0-.14,0V7.3h-10.24v18.62c-1.6.32-3.15.69-4.67,1.11v-11.67h-10.24v6.09l.04,9.6c-5.55,2.92-10.04,6.7-13.04,11.04-.75-.35-1.53-.55-2.37-.55-4.5,0-8.14,5.61-8.14,12.51s3.64,12.53,8.14,12.53c.58,0,1.14-.12,1.67-.29,4.1,6.62,11.54,12.06,20.98,15.28l.79.13v7.05c0,2.97,1.45,5.58,3.87,6.99,1.18.69,2.5,1.04,3.85,1.03,1.4,0,2.83-.37,4.15-1.12l7.54-4.29,7.56,4.3c1.31.74,2.73,1.12,4.13,1.12s2.67-.35,3.85-1.04c2.42-1.41,3.86-4.02,3.86-6.98v-7.05l.79-.13c9.44-3.22,16.89-8.66,20.98-15.28.54.17,1.09.29,1.68.29,4.5,0,8.14-5.61,8.14-12.53s-3.63-12.51-8.14-12.51' fill='%23AAAAAA'/%3E%3Cpath d='M86.69,50.87c0-12.22-13.6-19.1-28.94-20.66-4.48-.47-9.19-.54-13.52,0-15.34,1.53-28.93,8.41-28.93,20.66,0,8.55,5.7,15.55,12.68,15.55h7.94c3.05,2.5,6.93,4.1,11.08,4.71,2.65.4,5.44.46,8.01,0,4.15-.6,8.05-2.2,11.1-4.71h7.92c6.97,0,12.68-7,12.68-15.55' fill='white' opacity='0.9'/%3E%3Cpath d='M57.83,55.82c-1.19,2.58-3.8,4.35-6.84,4.35s-5.65-1.77-6.84-4.35h13.68Z' fill='%23AAAAAA'/%3E%3Cpath d='M32.52,41.14c1.74,0,3.18,2.13,3.18,4.76s-1.44,4.74-3.18,4.74-3.16-2.13-3.16-4.74,1.41-4.76,3.16-4.76' fill='%23AAAAAA'/%3E%3Cpath d='M69.46,41.14c1.74,0,3.16,2.13,3.16,4.76s-1.41,4.74-3.16,4.74-3.18-2.13-3.18-4.74,1.41-4.76,3.18-4.76' fill='%23AAAAAA'/%3E%3Cpath d='M63.91,76.15c-.82-.48-1.84-.43-2.8.12l-10.13,5.75-10.11-5.75c-.96-.55-1.98-.59-2.8-.12-.82.47-1.29,1.38-1.29,2.49v10.12c0,1.11.47,2.02,1.28,2.49.38.22.8.33,1.24.33.51,0,1.05-.15,1.57-.44l10.12-5.75,10.11,5.75c.52.29,1.05.44,1.56.44.44,0,.86-.11,1.24-.33.81-.48,1.28-1.38,1.28-2.49v-10.12c0-1.11-.47-2.02-1.28-2.49' fill='white' opacity='0.9'/%3E%3C/g%3E%3C/svg%3E\");\n}\n\n/* Betty icon */\n:host ::ng-deep .mention-badge i.mj-icon-betty {\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'%3E%3Ccircle cx='50' cy='50' r='45' fill='%23FF6B6B'/%3E%3Ctext x='50' y='65' text-anchor='middle' font-size='40' fill='white' font-family='Arial, sans-serif' font-weight='bold'%3EB%3C/text%3E%3C/svg%3E\");\n}\n\n/* Izzy icon */\n:host ::ng-deep .mention-badge i.mj-icon-izzy {\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 204 180'%3E%3Cpath d='M0 0 C3.61144774 3.08477828 4.84942137 4.90830493 5.5 9.625 C5 13 5 13 3.5 14.9375 C1.74432121 17.35155834 1.83578869 18.21944114 1.90625 21.12890625 C1.9371875 22.40636719 1.968125 23.68382813 2 25 C3.18335937 24.72285156 4.36671875 24.44570313 5.5859375 24.16015625 C22.44010416 20.26839867 22.44010416 20.26839867 30 20 C31.80210938 19.92265625 31.80210938 19.92265625 33.640625 19.84375 C47.49356199 19.44904163 61.73614427 20.86627802 75 25 C75.53596907 19.64244551 75.53596907 19.64244551 73.5 15 C71.5549761 12.4066348 71.45048389 10.16629658 71.59375 6.97265625 C72.33633815 3.36681955 74.01253991 1.99164006 77 0 C79.80907914 -0.63997166 82.18961327 -0.63020793 85 0 C87.8100346 1.79363911 89.50940468 3.01880935 91 6 C90.984375 8.05859375 90.984375 8.05859375 90.75 10.4375 C90.68296875 11.21996094 90.6159375 12.00242187 90.546875 12.80859375 C90 15 90 15 88.49609375 16.3984375 C86.25734576 18.79500846 86.4852344 20.97464008 86.3125 24.1875 C86.21388672 25.81751953 86.21388672 25.81751953 86.11328125 27.48046875 C86.07589844 28.31191406 86.03851563 29.14335937 86 30 C86.67675781 30.0825 87.35351562 30.165 88.05078125 30.25 C91.82333306 31.20937741 94.89353787 32.99425194 98.1875 35 C99.18052124 35.60448975 99.18052124 35.60448975 100.19360352 36.22119141 C111.98050012 43.58460075 121.17745776 53.2687532 127 66 C127 66.66 127 67.32 127 68 C127.721875 68.0825 128.44375 68.165 129.1875 68.25 C133.81406141 69.48374971 136.2179022 71.66516963 138.625 75.7734375 C140.97801199 81.55147269 140.43210927 87.87027126 140.375 94 C140.38660156 95.24523437 140.39820313 96.49046875 140.41015625 97.7734375 C140.3675701 111.08870765 140.3675701 111.08870765 135.5 116.7421875 C131.62323281 119.66995439 128.8523137 121.14337998 124 121.125 C122.9790625 121.12886719 122.9790625 121.12886719 121.9375 121.1328125 C120 121 120 121 117 120 C116.74347656 120.65226562 116.48695313 121.30453125 116.22265625 121.9765625 C115.83980469 122.85054688 115.45695313 123.72453125 115.0625 124.625 C114.70285156 125.48351562 114.34320313 126.34203125 113.97265625 127.2265625 C108.57908063 134.80960941 99.56813916 137.59212379 91.0625 140.375 C90.02287109 140.72949219 88.98324219 141.08398438 87.91210938 141.44921875 C80.34347852 144 80.34347852 144 78 144 C78.02094727 144.65484375 78.04189453 145.3096875 78.06347656 145.984375 C78.14730383 148.98942328 78.19886895 151.99422464 78.25 155 C78.28351563 156.02996094 78.31703125 157.05992187 78.3515625 158.12109375 C78.43361416 164.56214867 77.93369275 169.71304442 74 175 C68.75523423 179.17440541 64.68195675 180.53237245 58 180 C55.12653443 178.963898 52.49379495 177.58020045 49.8125 176.125 C49.11447266 175.76019531 48.41644531 175.39539063 47.69726562 175.01953125 C46.39868999 174.33997216 45.10309803 173.65465367 43.81176758 172.96142578 C43.21388428 172.64415527 42.61600098 172.32688477 42 172 C41.34290039 171.59402588 40.68580078 171.18805176 40.00878906 170.76977539 C38.03672401 169.77639533 38.03672401 169.77639533 36.12475586 170.58325195 C35.49448486 170.96441162 34.86421387 171.34557129 34.21484375 171.73828125 C33.17166992 172.35026367 33.17166992 172.35026367 32.10742188 172.97460938 C31.39134766 173.41611328 30.67527344 173.85761719 29.9375 174.3125 C28.51029236 175.1647359 27.08194984 176.01507485 25.65234375 176.86328125 C25.02320068 177.24782471 24.39405762 177.63236816 23.74584961 178.02856445 C19.79572932 180.2265128 16.44037501 180.296025 12 180 C6.82155197 178.33236419 3.95074467 176.59004726 1 172 C-0.72417326 168.34258111 -1.2403609 165.51230089 -1.1953125 161.48046875 C-1.18886719 160.45888672 -1.18242188 159.43730469 -1.17578125 158.38476562 C-1.15902344 157.32966797 -1.14226563 156.27457031 -1.125 155.1875 C-1.11597656 154.11306641 -1.10695312 153.03863281 -1.09765625 151.93164062 C-1.07415306 149.28753146 -1.04129575 146.64388128 -1 144 C-1.63196289 143.81171631 -2.26392578 143.62343262 -2.91503906 143.42944336 C-8.20708475 141.84808949 -13.49207901 140.2541307 -18.75 138.5625 C-19.98234375 138.17191406 -21.2146875 137.78132812 -22.484375 137.37890625 C-29.06200008 134.79901552 -34.12925122 130.90130551 -38 125 C-38.875 121.5625 -38.875 121.5625 -39 119 C-39.495 119.33 -39.99 119.66 -40.5 120 C-45.24354984 121.89741993 -49.49426304 121.53143657 -54.1875 119.875 C-58.42051121 117.05299253 -61.35909664 113.92271008 -63 109 C-63.22709306 104.92471184 -63.22828659 100.8492307 -63.24023438 96.76806641 C-63.2498982 94.77103695 -63.28108516 92.77414948 -63.3125 90.77734375 C-63.36188158 78.59243786 -63.36188158 78.59243786 -60 73 C-57.7509823 70.86631654 -55.88785241 69.35340008 -53.0078125 68.20703125 C-50.3010212 66.57979679 -49.65488803 64.83796148 -48.3125 62 C-45.06106922 55.7428385 -40.95735135 50.97447519 -36 46 C-35.40832031 45.38511719 -34.81664063 44.77023438 -34.20703125 44.13671875 C-28.97373562 39.11136864 -17.47215548 30 -10 30 C-10.08733973 27.91589342 -10.19552278 25.83265331 -10.3125 23.75 C-10.37050781 22.58984375 -10.42851563 21.4296875 -10.48828125 20.234375 C-11.02905532 16.81635262 -11.84853545 15.59874271 -14 13 C-14.54046356 8.75350057 -14.48376179 6.74176808 -12.125 3.125 C-8.57275398 -0.42724602 -4.8825369 -0.970906 0 0 Z M5 35 C4.30245605 35.21962402 3.60491211 35.43924805 2.88623047 35.66552734 C-14.1501062 41.15773444 -29.02751477 50.81254544 -39 66 C-39.33 66.99 -39.66 67.98 -40 69 C-37.525 70.98 -37.525 70.98 -35 73 C-34.52691406 72.29875 -34.05382812 71.5975 -33.56640625 70.875 C-21.08320269 52.96537462 -2.17172019 42.38052109 19.26171875 38.5078125 C46.97805996 34.9959591 75.10426623 38.71529466 97.73046875 56.09765625 C103.53827054 61.07953766 107.9264808 66.53902088 112 73 C113.32 72.01 114.64 71.02 116 70 C115.01713954 61.60788376 107.55262518 55.04847712 101.375 49.8125 C82.80696113 35.82916208 61.35998978 30.59265576 38.375 30.625 C37.71836365 30.62554382 37.06172729 30.62608765 36.38519287 30.62664795 C25.42439402 30.66823796 15.42390121 31.62072499 5 35 Z' fill='%234E3B78' transform='translate(63,0)'/%3E%3Cpath d='M0 0 C5.27957047 5.78547525 9.31612861 13.25448014 10 21.125 C9.69743213 24.83293961 8.77676366 26.8914086 6.1875 29.5625 C-2.04152489 35.76003038 -13.60917874 39.6270706 -23.875 38.8125 C-24.535 38.1525 -25.195 37.4925 -25.875 36.8125 C-28.97847254 36.48234335 -31.03281176 36.30718706 -33.75 37.9375 C-35.40354531 40.69340884 -35.26865568 42.66325452 -34.875 45.8125 C-33.95833333 47.89583333 -33.95833333 47.89583333 -31.875 48.8125 C-28.29166667 48.89583333 -28.29166667 48.89583333 -24.875 47.8125 C-24.57086182 47.16466553 -24.26672363 46.51683105 -23.95336914 45.84936523 C-22.875 43.8125 -22.875 43.8125 -20.77124023 42.88696289 C-19.91731689 42.6883667 -19.06339355 42.48977051 -18.18359375 42.28515625 C-17.23806641 42.04990234 -16.29253906 41.81464844 -15.31835938 41.57226562 C-14.32642578 41.34216797 -13.33449219 41.11207031 -12.3125 40.875 C-4.77934417 39.10870895 1.54823541 36.95205932 8.125 32.8125 C7.81647145 40.06292099 4.56245219 45.32546918 -0.5 50.4609375 C-5.29811284 54.61130511 -8.83216751 54.86916719 -15 55 C-21.13677833 55.26569953 -25.04589225 56.51893716 -29.890625 60.31640625 C-39.17633501 67.31724667 -52.82450605 66.52799961 -63.875 65.8125 C-71.37432145 64.60538489 -79.4496824 61.2378176 -84.875 55.8125 C-86.81199027 55.70419517 -88.75076074 55.60687514 -90.69067383 55.58691406 C-97.68300211 55.51299157 -103.12007731 55.4392364 -108.44140625 50.40234375 C-108.91449219 49.87769531 -109.38757813 49.35304688 -109.875 48.8125 C-110.6175 48.090625 -111.36 47.36875 -112.125 46.625 C-118.35765562 36.60823203 -119.69570866 25.34707186 -117.25 13.8828125 C-113.47065738 3.0509466 -104.76645407 -4.0120534 -94.875 -9.1875 C-91.26850975 -10.75400624 -87.62602625 -12.0153043 -83.875 -13.1875 C-83.029375 -13.47496094 -82.18375 -13.76242188 -81.3125 -14.05859375 C-56.0861494 -22.29657387 -20.04377266 -18.06142152 0 0 Z' fill='%23FDFDFD' transform='translate(155.875,64.1875)'/%3E%3Cpath d='M0 0 C5.24479788 1.58079188 9.51172656 4.60408712 14.06640625 7.58984375 C18.37837094 10.28462973 18.37837094 10.28462973 23.30859375 11.1328125 C28.49696048 9.20971132 33.08639658 6.29555589 37.79882812 3.42578125 C43.66838131 -0.00837477 43.66838131 -0.00837477 47.27734375 0.078125 C49.34375 1.0078125 49.34375 1.0078125 51.34375 3.0078125 C51.82984303 7.30136192 51.71414913 11.62739332 51.71875 15.9453125 C51.74324219 17.15123047 51.76773438 18.35714844 51.79296875 19.59960938 C51.79876953 21.33114258 51.79876953 21.33114258 51.8046875 23.09765625 C51.81290527 24.15847412 51.82112305 25.21929199 51.82958984 26.31225586 C51.34375 29.0078125 51.34375 29.0078125 49.48461914 30.87670898 C46.29658529 32.56106989 44.78123809 32.062357 41.34375 31.0078125 C37.60135447 29.03986817 34.07891261 26.72386924 30.53320312 24.42578125 C26.44214688 21.80182316 26.44214688 21.80182316 21.77734375 20.921875 C17.60401055 22.78413283 13.85973006 25.2663764 10.046875 27.76953125 C5.85335687 30.41401513 2.44659272 31.9581498 -2.65625 32.0078125 C-4.33203125 30.87695312 -4.33203125 30.87695312 -5.65625 29.0078125 C-6.04443359 26.328125 -6.04443359 26.328125 -6.0546875 23.1328125 C-6.05855469 21.98296875 -6.06242187 20.833125 -6.06640625 19.6484375 C-6.05480469 18.44703125 -6.04320313 17.245625 -6.03125 16.0078125 C-6.04285156 14.80640625 -6.05445312 13.605 -6.06640625 12.3671875 C-6.06253906 11.21734375 -6.05867188 10.0675 -6.0546875 8.8828125 C-6.05130371 7.82835937 -6.04791992 6.77390625 -6.04443359 5.6875 C-5.65625 3.0078125 -5.65625 3.0078125 -4.29736328 1.14111328 C-2.65625 0.0078125 -2.65625 0.0078125 0 0 Z' fill='%23FCFCFD' transform='translate(78.65625,136.9921875)'/%3E%3Cpath d='M0 0 C2.5 0.625 2.5 0.625 4.8125 2.625 C6.96830116 6.4575354 7.24792603 9.32007692 6.5 13.625 C5.34367254 15.98793002 4.35016245 17.77483755 2.5 19.625 C0.1875 20 0.1875 20 -2.5 19.625 C-5.06638215 17.47478793 -6.29103188 15.79226637 -6.88671875 12.46484375 C-7.08084032 8.45522921 -6.77549931 6.12498023 -4.8125 2.5625 C-2.5 0.625 -2.5 0.625 0 0 Z' fill='%2353417C' transform='translate(138.5,67.375)'/%3E%3Cpath d='M0 0 C2.5 0.6875 2.5 0.6875 4.8125 2.625 C7.08407605 6.74748987 7.32547179 10.07653131 6.5 14.6875 C4.8125 17.75 4.8125 17.75 2.5 19.6875 C-0.0625 20.25 -0.0625 20.25 -2.5 19.6875 C-5.30401904 17.38419865 -5.84979387 14.76309142 -6.4375 11.3125 C-6.72853275 7.71913649 -6.44645777 6.57011897 -4.875 3.125 C-2.5 0.6875 -2.5 0.6875 0 0 Z' fill='%23523F7B' transform='translate(64.5,67.3125)'/%3E%3Cpath d='M0 0 C8.91 0 17.82 0 27 0 C24.81183076 5.47042311 24.169236 6.55141452 19 9 C14.08609728 9.94526984 9.88605617 10.13992406 5.51171875 7.49609375 C3.4733513 5.76185217 1.65854906 4.10051199 0 2 C0 1.34 0 0.68 0 0 Z' fill='%23574680' transform='translate(88,95)'/%3E%3C/svg%3E\");\n}\n\n/* Support for image tags in mention badges */\n:host ::ng-deep .mention-badge img {\n width: 16px;\n height: 16px;\n border-radius: 50%;\n object-fit: cover;\n vertical-align: middle;\n}\n\n:host ::ng-deep .mention-badge:hover {\n transform: translateY(-1px);\n box-shadow: var(--mj-shadow-lg);\n}\n\n/* Configuration preset indicator for agent mentions with non-default presets */\n/* Matches the styling from mention-editor.component.ts (lines 432-444) */\n:host ::ng-deep .mention-badge .preset-indicator {\n display: inline-block;\n font-size: 10px;\n font-weight: 600;\n font-family: 'SF Mono', 'Monaco', 'Inconsolata', 'Roboto Mono', 'Courier New', monospace;\n background: rgba(255, 255, 255, 0.25);\n padding: 2px 6px;\n border-radius: 4px;\n margin-left: 4px;\n letter-spacing: 0.3px;\n text-transform: uppercase;\n border: 1px solid rgba(255, 255, 255, 0.15);\n}\n\n.message-avatar {\n flex-shrink: 0;\n}\n\n.avatar-circle {\n width: 36px;\n height: 36px;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 16px;\n color: var(--mj-text-inverse);\n}\n\n/* User avatars are circular */\n.avatar-circle.user-avatar {\n border-radius: 50%;\n background-color: var(--mj-text-primary);\n}\n\n/* Agent avatars are square with rounded corners */\n.avatar-circle.ai-avatar {\n border-radius: 8px;\n background-color: var(--mj-brand-primary); /* Brand color for agents */\n}\n\n/* Avatar images (for users with uploaded photos or URLs) */\n/* Host-supplied assistant avatar: the AI tile is a rounded SQUARE (8px, brand\n fill), so the image must clip to the tile's radius \u2014 not the user avatar's\n 50% circle \u2014 and the brand fill must drop so nothing peeks out at the\n corners or behind a transparent image. */\n.avatar-circle.ai-avatar.avatar-has-image {\n background-color: transparent;\n overflow: hidden;\n}\n.avatar-circle.ai-avatar .avatar-image {\n border-radius: inherit;\n}\n\n.avatar-image {\n width: 100%;\n height: 100%;\n object-fit: cover;\n border-radius: 50%;\n}\n\n/* Container for the standard mj-loading indicator while an artifact's rows load. Layout only \u2014\n the indicator owns its own animation, so there is no bespoke shimmer to keep re-themed. */\n.artifact-pending {\n display: flex;\n align-items: center;\n padding: 12px 16px;\n}\n\n/* System artifact styling - subtle visual distinction */\n.artifact-wrapper.system-artifact {\n opacity: 0.85;\n position: relative;\n}\n\n.artifact-wrapper.system-artifact::before {\n content: 'SYSTEM';\n position: absolute;\n top: 8px;\n right: 8px;\n font-size: 9px;\n font-weight: 600;\n color: var(--mj-text-muted);\n background: var(--mj-bg-surface-sunken);\n padding: 2px 6px;\n border-radius: 3px;\n letter-spacing: 0.5px;\n z-index: 10;\n}\n\n.message-content {\n flex: 1;\n min-width: 0;\n position: relative;\n}\n\n.message-header {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 4px;\n font-size: 13px;\n}\n\n.message-sender {\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n/* Agent role badge */\n.agent-badge {\n display: inline-block;\n padding: 2px 8px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 10px;\n font-size: 11px;\n color: var(--mj-text-secondary);\n font-weight: 500;\n}\n\n.message-time {\n color: var(--mj-text-muted);\n font-size: 12px;\n font-weight: 400;\n}\n\n/* Right-side cluster anchoring.\n The first of these three siblings that actually renders absorbs the\n `margin-left: auto`, pushing the whole cluster right. Subsequent siblings\n then sit next to it (relying on the flex container's `gap`). This used to\n live only on .time-pill, which broke when timePillText returned null after\n agent completion \u2014 the gear icon would shift to the left. */\n.time-pill,\n.test-feedback-icon,\n.agent-run-icon,\n.message-edit-icon {\n margin-left: auto;\n}\n.time-pill ~ .test-feedback-icon,\n.time-pill ~ .agent-run-icon,\n.test-feedback-icon ~ .agent-run-icon,\n.message-edit-icon ~ .test-feedback-icon,\n.message-edit-icon ~ .agent-run-icon {\n margin-left: 8px;\n}\n\n/* Edit pencil on user messages \u2014 revealed on message hover to keep headers quiet */\n.message-edit-icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 20px;\n height: 20px;\n color: var(--mj-text-muted);\n cursor: pointer;\n transition: all 0.2s ease;\n opacity: 0;\n}\n.message-item:hover .message-edit-icon,\n.message-edit-icon:focus-visible {\n opacity: 1;\n}\n.message-edit-icon:hover {\n color: var(--mj-text-secondary);\n}\n.message-edit-icon i.fa-pen {\n font-size: 12px;\n}\n\n/* Time pill - unified styling for all AI message states */\n.time-pill {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 2px 8px;\n border-radius: 10px;\n font-size: 11px;\n font-weight: 500;\n transition: all 0.3s ease;\n}\n\n.time-pill i {\n font-size: 10px;\n}\n\n/* Complete state - light blue (default) */\n.time-pill.complete {\n background: var(--mj-status-info-bg);\n color: var(--mj-status-info-text);\n}\n\n/* In-progress state - brand color with subtle pulse */\n.time-pill.in-progress {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n/* Active agent run state - brand color with subtle pulse */\n.time-pill.active {\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n}\n\n/* Liveness states (MJ #4222) \u2014 the run may no longer be progressing, so the pill stops\n presenting the elapsed time as healthy progress. These follow .in-progress/.active in the\n stylesheet so they win on equal specificity. */\n.time-pill.checking {\n background: var(--mj-status-warning-bg);\n color: var(--mj-status-warning-text);\n}\n\n.time-pill.stalled {\n background: var(--mj-status-error-bg);\n color: var(--mj-status-error-text);\n}\n\n.time-pill .liveness-label {\n font-weight: 400;\n opacity: 0.85;\n}\n\n/* Failed state - red */\n.time-pill.failed {\n background: var(--mj-status-error-bg);\n color: var(--mj-status-error-text);\n}\n\n@keyframes pillPulse {\n 0%, 100% {\n opacity: 1;\n }\n 50% {\n opacity: 0.85;\n }\n}\n\n/* Deprecated - keeping for backward compatibility but no longer used */\n.generation-time {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 2px 8px;\n background: var(--mj-status-info-bg);\n border-radius: 10px;\n font-size: 11px;\n color: var(--mj-status-info-text);\n font-weight: 500;\n margin-left: auto;\n}\n\n.generation-time i {\n font-size: 10px;\n}\n\n/* Deprecated - keeping for backward compatibility but no longer used */\n.message-elapsed {\n color: var(--mj-text-muted);\n font-size: 11px;\n font-style: italic;\n}\n\n.message-body {\n margin-bottom: 0;\n}\n\n.message-text {\n color: var(--mj-text-primary);\n line-height: 1.5;\n word-wrap: break-word;\n}\n\n/* Remove extra margin from markdown paragraphs */\n.message-text mj-markdown > :first-child,\n.message-text ::ng-deep .mj-markdown-container > :first-child {\n margin-top: 0;\n}\n\n.message-text mj-markdown > :last-child,\n.message-text ::ng-deep .mj-markdown-container > :last-child {\n margin-bottom: 0;\n}\n\n/* Asymmetric bubble shapes for message content */\n.message-item.user-message .message-content {\n border-radius: 12px 12px 12px 4px;\n}\n\n.message-item.ai-message .message-content {\n border-radius: 4px 12px 12px 12px;\n}\n\n/* Reaction Buttons */\n.message-reactions {\n display: none; /* Hide reactions for now - not implemented */\n}\n\n/* Artifact Card - Claude.ai Style */\n.artifact-card {\n display: flex;\n flex-direction: column;\n gap: 12px;\n margin-top: 12px;\n padding: 16px;\n border: 1px solid color-mix(in srgb, var(--mj-text-primary) 8%, transparent);\n border-radius: 8px;\n background: color-mix(in srgb, var(--mj-brand-primary) 5%, var(--mj-bg-surface));\n cursor: pointer;\n transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);\n max-width: 500px;\n box-shadow: var(--mj-shadow-sm);\n position: relative;\n overflow: hidden;\n}\n\n.artifact-card::before {\n content: '';\n position: absolute;\n left: 0;\n top: 0;\n bottom: 0;\n width: 3px;\n background: var(--mj-brand-primary);\n opacity: 1;\n}\n\n.artifact-card:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 8%, var(--mj-bg-surface));\n border-color: color-mix(in srgb, var(--mj-brand-primary) 30%, transparent);\n box-shadow: var(--mj-shadow-md);\n transform: translateY(-1px);\n}\n\n.artifact-card-header {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n}\n\n.artifact-card-icon {\n width: 36px;\n height: 36px;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--mj-brand-primary);\n flex-shrink: 0;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n border-radius: 6px;\n transition: all 0.2s ease;\n}\n\n.artifact-card:hover .artifact-card-icon {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n transform: scale(1.05);\n}\n\n.artifact-card-icon i {\n font-size: 18px;\n}\n\n.artifact-card-content {\n flex: 1;\n min-width: 0;\n}\n\n.artifact-card-label {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n letter-spacing: -0.01em;\n margin-bottom: 4px;\n}\n\n.artifact-card-description {\n font-size: 13px;\n color: var(--mj-text-secondary);\n line-height: 1.5;\n}\n\n.message-actions {\n position: absolute;\n bottom: 8px;\n right: 8px;\n display: flex;\n gap: 2px;\n opacity: 0;\n transform: translateY(4px);\n transition: all 200ms cubic-bezier(0.4, 0, 0.2, 1);\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n padding: 4px;\n box-shadow: var(--mj-shadow-md);\n pointer-events: none;\n}\n\n.message-item:hover .message-actions {\n opacity: 1;\n transform: translateY(0);\n pointer-events: auto;\n}\n\n.message-action-btn {\n padding: 6px 8px;\n background: transparent;\n border: none;\n border-radius: 6px;\n cursor: pointer;\n color: var(--mj-text-secondary);\n font-size: 13px;\n transition: all 150ms ease;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 32px;\n height: 32px;\n}\n\n.message-action-btn:hover {\n background-color: var(--mj-bg-surface-sunken);\n color: var(--mj-text-primary);\n}\n\n.message-action-btn.danger:hover {\n background-color: var(--mj-status-error-bg);\n color: var(--mj-status-error);\n}\n\n.message-action-btn.retry-btn {\n color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n font-weight: 600;\n gap: 6px;\n padding: 6px 12px;\n min-width: auto;\n}\n\n.message-action-btn.retry-btn:hover {\n background-color: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n color: var(--mj-brand-primary-hover);\n}\n\n/* Thread indicator badge */\n.thread-indicator {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n margin-top: 8px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n border: 1px solid color-mix(in srgb, var(--mj-brand-primary) 15%, transparent);\n border-radius: 16px;\n cursor: pointer;\n transition: all 150ms ease;\n font-size: 12px;\n color: var(--mj-brand-primary-hover);\n font-weight: 500;\n}\n\n.thread-indicator:hover {\n background: color-mix(in srgb, var(--mj-brand-primary) 15%, var(--mj-bg-surface));\n border-color: color-mix(in srgb, var(--mj-brand-primary) 30%, transparent);\n transform: translateY(-1px);\n box-shadow: var(--mj-shadow-sm);\n}\n\n.thread-indicator i {\n font-size: 14px;\n}\n\n.thread-count {\n font-weight: 600;\n}\n\n/* Edit mode styles */\n.message-item.editing {\n background-color: var(--mj-status-warning-bg);\n border-left: 3px solid var(--mj-status-warning);\n}\n\n.message-edit-container {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n\n.message-edit-textarea {\n width: 100%;\n padding: 12px;\n border: 1px solid var(--mj-border-strong);\n border-radius: 6px;\n font-family: inherit;\n font-size: 14px;\n line-height: 1.6;\n resize: vertical;\n min-height: 80px;\n transition: border-color 150ms ease;\n}\n\n.message-edit-textarea:focus {\n outline: none;\n border-color: var(--mj-brand-primary);\n box-shadow: 0 0 0 2px color-mix(in srgb, var(--mj-brand-primary) 10%, transparent);\n}\n\n.edit-actions {\n display: flex;\n gap: 8px;\n}\n\n.edit-action-btn {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 8px 16px;\n border: none;\n border-radius: 6px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: all 150ms ease;\n}\n\n.edit-action-btn.save {\n background-color: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n}\n\n.edit-action-btn.save:hover {\n background-color: var(--mj-brand-primary-hover);\n}\n\n.edit-action-btn.cancel {\n background-color: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n}\n\n.edit-action-btn.cancel:hover {\n background-color: var(--mj-border-default);\n color: var(--mj-text-primary);\n}\n\n.edit-hint {\n font-size: 12px;\n color: var(--mj-text-muted);\n font-style: italic;\n}\n\n.edited-badge {\n margin-left: 8px;\n font-size: 11px;\n color: var(--mj-text-muted);\n font-style: italic;\n font-weight: normal;\n}\n\n/* Message Action Bar (separate panel above agent details) */\n.message-action-bar {\n margin-top: 12px;\n margin-bottom: 8px;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n padding: 12px;\n}\n\n.action-bar-container {\n display: flex;\n align-items: center;\n gap: 16px;\n}\n\n.action-buttons {\n display: flex;\n gap: 4px;\n margin-left: 16px;\n padding-left: 16px;\n border-left: 1px solid var(--mj-border-default);\n}\n\n.action-bar-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 6px 10px;\n background: var(--mj-bg-surface-card);\n border: 1px solid var(--mj-text-muted);\n border-radius: 6px;\n font-size: 16px;\n line-height: 1;\n color: var(--mj-text-secondary);\n cursor: pointer;\n transition: all 0.2s;\n min-width: 36px;\n height: 32px;\n opacity: 0.6;\n}\n\n.action-bar-btn i {\n font-size: 16px;\n line-height: 1;\n}\n\n.action-bar-btn:hover {\n opacity: 1;\n border-color: var(--mj-text-secondary);\n}\n\n.action-bar-btn.danger {\n color: var(--mj-status-error);\n}\n\n.action-bar-btn.danger:hover {\n opacity: 1;\n background: var(--mj-status-error-bg);\n border-color: var(--mj-status-error);\n}\n\n.action-bar-btn i.pinned {\n color: var(--mj-brand-primary);\n}\n\n.action-bar-btn.test-feedback {\n color: var(--mj-status-warning);\n}\n\n.action-bar-btn.test-feedback:hover {\n opacity: 1;\n background: var(--mj-status-warning-bg);\n border-color: var(--mj-status-warning);\n}\n\n/* Message status indicator */\n.message-status {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n font-size: 12px;\n color: var(--mj-text-secondary);\n padding: 2px 8px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 4px;\n margin-left: 8px;\n animation: statusPulse 2s ease-in-out infinite;\n}\n\n.message-status i {\n color: var(--mj-brand-primary);\n font-size: 11px;\n}\n\n.message-status.error {\n background: var(--mj-status-error-bg);\n color: var(--mj-status-error);\n}\n\n.message-status.error i {\n color: var(--mj-status-error);\n}\n\n.status-text {\n font-weight: 500;\n}\n\n@keyframes statusPulse {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.7; }\n}\n\n/* ============================================\n Agent Run Icon & Details Panel\n ============================================ */\n\n/* Agent run gear icon in header - muted style for power users.\n Left-margin is governed by the right-side cluster rules above so the gear\n stays right-anchored whether or not the time pill / test-feedback icon\n renders alongside it. */\n.agent-run-icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 20px;\n height: 20px;\n color: var(--mj-text-muted);\n cursor: pointer;\n transition: all 0.2s ease;\n user-select: none;\n}\n\n.agent-run-icon i.fa-cog {\n font-size: 13px;\n}\n\n.agent-run-icon:hover {\n color: var(--mj-text-secondary);\n}\n\n.agent-run-icon.expanded {\n color: var(--mj-brand-primary);\n transform: scale(1.1);\n}\n\n/* Test feedback icon in header - appears for test runs.\n Left-margin handled by the right-side cluster rules above. */\n.test-feedback-icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 20px;\n height: 20px;\n color: var(--mj-text-muted);\n cursor: pointer;\n transition: all 0.2s ease;\n user-select: none;\n}\n\n.test-feedback-icon i.fa-flask {\n font-size: 13px;\n}\n\n.test-feedback-icon:hover {\n color: var(--mj-brand-primary); /* Blue color for test feedback */\n transform: scale(1.1);\n}\n\n@keyframes rotate {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n\n/* Agent details panel */\n.agent-details-panel {\n margin-top: 12px;\n padding: 16px;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid var(--mj-border-default);\n border-radius: 8px;\n animation: slideDown 0.2s ease;\n}\n\n@keyframes slideDown {\n from {\n opacity: 0;\n transform: translateY(-10px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n/* Loading state */\n.agent-details-loading {\n display: flex;\n align-items: center;\n gap: 8px;\n color: var(--mj-text-secondary);\n font-size: 13px;\n}\n\n.agent-details-loading i {\n color: var(--mj-brand-primary);\n}\n\n/* Error state */\n.agent-details-error {\n display: flex;\n align-items: center;\n gap: 8px;\n color: var(--mj-status-error);\n font-size: 13px;\n}\n\n.agent-details-error i {\n color: var(--mj-status-error);\n}\n\n/* Content header */\n.agent-details-header {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 12px;\n padding-bottom: 8px;\n border-bottom: 1px solid var(--mj-border-default);\n font-weight: 600;\n font-size: 13px;\n color: var(--mj-text-primary);\n}\n\n.agent-details-header i {\n color: var(--mj-brand-primary);\n}\n\n.agent-name-link {\n color: var(--mj-brand-primary);\n cursor: pointer;\n text-decoration: none;\n font-weight: 600;\n transition: all 0.2s ease;\n}\n\n.agent-name-link:hover {\n color: var(--mj-brand-primary-hover);\n text-decoration: underline;\n}\n\n/* Details grid */\n.agent-details-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 12px;\n margin-bottom: 12px;\n}\n\n.detail-row {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n padding: 8px 12px;\n background: var(--mj-bg-surface-card);\n border-radius: 6px;\n border: 1px solid var(--mj-border-default);\n}\n\n.detail-label {\n font-size: 12px;\n color: var(--mj-text-secondary);\n font-weight: 500;\n}\n\n.detail-value {\n font-size: 13px;\n color: var(--mj-text-primary);\n font-weight: 600;\n font-family: 'Monaco', 'Menlo', 'Consolas', monospace;\n}\n\n/* Status badge in details */\n.status-badge {\n padding: 3px 8px;\n border-radius: 10px;\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n}\n\n.status-badge.status-pending {\n background: var(--mj-status-warning-bg);\n color: var(--mj-status-warning-text);\n}\n\n.status-badge.status-running {\n background: var(--mj-status-info-bg);\n color: var(--mj-status-info-text);\n}\n\n.status-badge.status-complete {\n background: var(--mj-status-success-bg);\n color: var(--mj-status-success-text);\n}\n\n.status-badge.status-failed,\n.status-badge.status-error {\n background: var(--mj-status-error-bg);\n color: var(--mj-status-error-text);\n}\n\n.status-badge.status-cancelled {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-secondary);\n}\n\n/* Run ID link styling */\n.run-id-link {\n color: var(--mj-brand-primary);\n cursor: pointer;\n text-decoration: none;\n display: inline-flex;\n align-items: center;\n gap: 4px;\n transition: all 0.2s ease;\n}\n\n.run-id-link:hover {\n color: var(--mj-brand-primary-hover);\n text-decoration: underline;\n}\n\n.run-id-link i.fa-external-link-alt {\n font-size: 10px;\n opacity: 0.7;\n}\n\n/* Tasks section in agent details */\n.agent-details-tasks {\n margin-top: 16px;\n padding-top: 16px;\n border-top: 1px solid var(--mj-border-default);\n}\n\n.tasks-section-header {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 12px;\n font-weight: 600;\n font-size: 12px;\n color: var(--mj-text-primary);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.tasks-section-header i {\n color: var(--mj-brand-primary);\n font-size: 11px;\n}\n\n.tasks-list {\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n\n.tasks-list mj-task-widget {\n display: block;\n}\n\n/* Artifact version badge */\n.artifact-version-badge {\n display: inline-block;\n margin-left: 8px;\n padding: 2px 8px;\n background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-size: 11px;\n font-weight: 600;\n font-family: monospace;\n border-radius: 4px;\n vertical-align: middle;\n}\n\n/* Message Footer (rating counts and inline actions) */\n.message-footer {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-top: 8px;\n padding-top: 8px;\n border-top: 1px solid var(--mj-border-default);\n}\n\n.rating-counts {\n display: flex;\n align-items: center;\n gap: 12px;\n font-size: 13px;\n color: var(--mj-text-secondary);\n}\n\n.rating-count {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.rating-count.thumbs-up {\n color: var(--mj-status-success);\n}\n\n.rating-count.thumbs-down {\n color: var(--mj-status-error);\n}\n\n.rating-total {\n font-size: 12px;\n color: var(--mj-text-muted);\n}\n\n/* Delete button \u2014 always visible on the last message, no hover required */\n.inline-delete {\n display: flex;\n align-items: center;\n}\n\n.message-item.pinned {\n border-left: 3px solid var(--mj-status-warning);\n background-color: color-mix(in srgb, var(--mj-status-warning) 8%, transparent);\n}\n\n/* Wraps pin button + rating component on the right side of the footer */\n.ai-message-actions {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-left: auto;\n}\n\n.action-bar-btn.pin-btn {\n color: var(--mj-text-muted);\n}\n\n.action-bar-btn.pin-btn:hover {\n color: var(--mj-status-warning);\n border-color: var(--mj-status-warning);\n}\n\n.action-bar-btn.pin-btn.pinned {\n opacity: 1;\n color: var(--mj-status-warning);\n border-color: var(--mj-status-warning-border);\n background: color-mix(in srgb, var(--mj-status-warning) 10%, var(--mj-bg-surface));\n}\n\n/* Delete + Rating + Pin in gear panel for non-last messages \u2014 mirrors .message-footer layout */\n.agent-panel-actions {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 8px 0 0;\n margin-top: 8px;\n border-top: 1px solid var(--mj-border-subtle);\n}\n\n/* Agent details section wrapper */\n.agent-details-section {\n margin-top: 8px;\n}\n\n/* Mobile adjustments: 481px - 768px */\n@media (max-width: 768px) {\n .message-item {\n padding: 8px 12px;\n gap: 8px;\n }\n\n .avatar-circle {\n width: 32px;\n height: 32px;\n font-size: 14px;\n }\n\n .artifact-card {\n max-width: 90vw;\n padding: 12px;\n }\n\n .artifact-card-icon {\n width: 32px;\n height: 32px;\n }\n\n .artifact-card-icon i {\n font-size: 16px;\n }\n\n .message-header {\n font-size: 12px;\n }\n\n .message-sender {\n font-size: 12px;\n }\n\n .message-time {\n font-size: 11px;\n }\n\n .agent-badge {\n font-size: 10px;\n padding: 1px 6px;\n }\n\n .time-pill {\n font-size: 10px;\n padding: 2px 6px;\n }\n\n .message-actions {\n gap: 1px;\n padding: 3px;\n }\n\n .message-action-btn {\n min-width: 28px;\n height: 28px;\n font-size: 12px;\n }\n}\n\n/* Small Phone adjustments: <= 480px */\n@media (max-width: 480px) {\n .message-item {\n padding: 6px 8px;\n gap: 6px;\n }\n\n .avatar-circle {\n width: 28px;\n height: 28px;\n font-size: 12px;\n }\n\n .avatar-circle.ai-avatar {\n border-radius: 6px;\n }\n\n .artifact-card {\n padding: 10px;\n margin-top: 8px;\n }\n\n .artifact-card-header {\n gap: 8px;\n }\n\n .artifact-card-icon {\n width: 28px;\n height: 28px;\n }\n\n .artifact-card-icon i {\n font-size: 14px;\n }\n\n .artifact-card-label {\n font-size: 13px;\n }\n\n .artifact-card-description {\n font-size: 12px;\n }\n\n .message-header {\n font-size: 11px;\n gap: 6px;\n }\n\n .message-sender {\n font-size: 11px;\n }\n\n .message-time {\n font-size: 10px;\n }\n\n .agent-badge {\n font-size: 9px;\n padding: 1px 5px;\n }\n\n .time-pill {\n font-size: 9px;\n padding: 1px 5px;\n }\n\n .thread-indicator {\n padding: 4px 8px;\n font-size: 11px;\n margin-top: 6px;\n }\n\n .agent-details-panel {\n padding: 12px;\n margin-top: 8px;\n }\n\n .agent-details-grid {\n grid-template-columns: 1fr;\n gap: 8px;\n }\n\n .detail-row {\n padding: 6px 8px;\n }\n\n .detail-label,\n .detail-value {\n font-size: 11px;\n }\n}\n\n/* Form Response Pills */\n:host ::ng-deep .form-response-pill {\n margin: 0 3px;\n transition: all 0.2s ease;\n}\n\n/* Single field form - inline pill (similar to mention badges) */\n:host ::ng-deep .form-response-pill.single-field {\n display: inline-flex;\n align-items: center;\n vertical-align: middle;\n gap: 6px;\n padding: 4px 12px;\n background: var(--mj-status-success);\n color: var(--mj-text-inverse);\n border: 2px solid color-mix(in srgb, var(--mj-status-success) 40%, transparent);\n border-radius: 16px;\n font-size: 13px;\n font-weight: 600;\n box-shadow: var(--mj-shadow-md);\n cursor: default;\n white-space: nowrap;\n}\n\n/* Multi-field form - card-style (block display) */\n:host ::ng-deep .form-response-pill.multi-field {\n display: inline-block;\n max-width: min(800px, 100%);\n width: auto;\n min-width: 400px;\n margin: 8px 0;\n vertical-align: top;\n}\n\n:host ::ng-deep .form-response-pill.single-field i {\n font-size: 11px;\n opacity: 0.95;\n}\n\n:host ::ng-deep .form-response-pill.single-field strong {\n font-weight: 600;\n margin-right: 4px;\n}\n\n/* Multi-field form - card-style pill */\n:host ::ng-deep .form-response-pill .pill-header {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n background: var(--mj-status-success);\n color: var(--mj-text-inverse);\n font-weight: 600;\n font-size: 13px;\n border-radius: 12px 12px 0 0;\n border: 2px solid color-mix(in srgb, var(--mj-status-success) 40%, transparent);\n border-bottom: none;\n box-shadow: var(--mj-shadow-md);\n}\n\n:host ::ng-deep .form-response-pill .pill-header i {\n font-size: 12px;\n opacity: 0.95;\n}\n\n:host ::ng-deep .form-response-pill .pill-fields {\n padding: 10px 12px;\n background: color-mix(in srgb, var(--mj-status-success) 8%, transparent);\n border: 2px solid color-mix(in srgb, var(--mj-status-success) 40%, transparent);\n border-top: none;\n border-radius: 0 0 12px 12px;\n}\n\n:host ::ng-deep .form-response-pill .pill-field {\n display: flex;\n flex-direction: column;\n gap: 6px;\n padding: 12px 0;\n font-size: 13px;\n}\n\n:host ::ng-deep .form-response-pill .pill-field:not(:last-child) {\n border-bottom: 1px solid color-mix(in srgb, var(--mj-status-success) 20%, transparent);\n padding-bottom: 12px;\n margin-bottom: 0;\n}\n\n:host ::ng-deep .form-response-pill .field-question {\n font-weight: 600;\n color: var(--mj-status-success);\n font-size: 12px;\n line-height: 1.4;\n text-transform: uppercase;\n letter-spacing: 0.3px;\n opacity: 0.9;\n}\n\n:host ::ng-deep .form-response-pill .field-answer {\n color: var(--mj-text-primary);\n font-weight: 400;\n font-size: 15px;\n line-height: 1.6;\n padding: 8px 0 8px 12px;\n background: transparent;\n border-left: 3px solid color-mix(in srgb, var(--mj-status-success) 40%, transparent);\n font-style: italic;\n}\n\n\n/* Hover effect for form pills */\n:host ::ng-deep .form-response-pill.single-field:hover {\n transform: translateY(-1px);\n box-shadow: var(--mj-shadow-lg);\n}\n\n:host ::ng-deep .form-response-pill.multi-field:hover {\n transform: translateY(-1px);\n}\n\n:host ::ng-deep .form-response-pill.multi-field:hover .pill-header {\n box-shadow: var(--mj-shadow-lg);\n}\n\n/* Responsive adjustments for multi-field forms */\n@media (max-width: 600px) {\n :host ::ng-deep .form-response-pill.multi-field {\n min-width: 300px;\n }\n}\n\n@media (max-width: 400px) {\n :host ::ng-deep .form-response-pill.multi-field {\n min-width: 100%;\n }\n\n :host ::ng-deep .form-response-pill .field-question {\n font-size: 11px;\n }\n\n :host ::ng-deep .form-response-pill .field-answer {\n font-size: 14px;\n padding: 6px 0 6px 10px;\n }\n}\n\n/* ==================== Message Attachments ==================== */\n\n.message-attachments {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n margin-top: 12px;\n margin-bottom: 8px;\n}\n\n.attachment-item {\n position: relative;\n border-radius: 8px;\n overflow: hidden;\n cursor: pointer;\n transition: transform 0.2s, box-shadow 0.2s;\n background: var(--mj-bg-surface-sunken);\n border: 1px solid color-mix(in srgb, var(--mj-text-primary) 10%, transparent);\n}\n\n.attachment-item:hover {\n transform: scale(1.02);\n box-shadow: var(--mj-shadow-md);\n}\n\n.attachment-item.image-attachment {\n width: 200px;\n height: 150px;\n}\n\n.attachment-thumbnail {\n width: 100%;\n height: 100%;\n object-fit: cover;\n display: block;\n}\n\n.attachment-overlay {\n position: absolute;\n inset: 0;\n background: var(--mj-bg-overlay);\n display: flex;\n align-items: center;\n justify-content: center;\n opacity: 0;\n transition: opacity 0.2s;\n}\n\n.attachment-item:hover .attachment-overlay {\n opacity: 1;\n}\n\n.attachment-overlay i {\n color: var(--mj-text-inverse);\n font-size: 24px;\n}\n\n/* Non-image attachment tile: horizontal strip with UPPERCASE type badge,\n filename, and size. Artifact-typed attachments get a brand-primary tinted\n badge to distinguish them from plain uploads. */\n.attachment-strip {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 8px 12px 8px 8px;\n width: 320px;\n max-width: 100%;\n min-height: 56px;\n cursor: pointer;\n border-radius: 8px;\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n transition: background 0.15s, border-color 0.15s;\n}\n\n.attachment-strip:hover {\n background: var(--mj-bg-surface-hover);\n border-color: var(--mj-border-strong);\n}\n\n.attachment-badge {\n flex: 0 0 auto;\n min-width: 48px;\n height: 48px;\n padding: 0 10px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 6px;\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n font-size: 11px;\n font-weight: 700;\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-secondary);\n border: 1px solid var(--mj-border-subtle);\n user-select: none;\n text-align: center;\n line-height: 1;\n white-space: nowrap;\n}\n\n.attachment-strip.is-artifact .attachment-badge {\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n border-color: color-mix(in srgb, var(--mj-brand-primary) 25%, transparent);\n}\n\n.attachment-meta {\n display: flex;\n flex-direction: column;\n min-width: 0; /* allow ellipsis inside flex child */\n gap: 2px;\n}\n\n.attachment-strip .file-name {\n font-size: 13px;\n font-weight: 500;\n color: var(--mj-text-primary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.attachment-strip .file-size {\n font-size: 11px;\n color: var(--mj-text-muted);\n}\n\n/* Responsive attachments */\n@media (max-width: 600px) {\n .attachment-item.image-attachment {\n width: 150px;\n height: 112px;\n }\n\n .attachment-strip {\n width: 100%;\n }\n}\n/* \u2500\u2500 Markdown-rendered textarea values inside submitted form pills (e.g. the approved Plan) \u2500\u2500 */\n:host ::ng-deep .form-response-pill .field-answer-markdown {\n font-style: normal; /* the pill's default italic reads poorly on multi-line formatted content */\n font-size: 13.5px;\n line-height: 1.6;\n color: var(--mj-text-primary);\n}\n:host ::ng-deep .form-response-pill .field-answer-markdown h1,\n:host ::ng-deep .form-response-pill .field-answer-markdown h2,\n:host ::ng-deep .form-response-pill .field-answer-markdown h3,\n:host ::ng-deep .form-response-pill .field-answer-markdown h4 {\n font-size: 13.5px;\n font-weight: 700;\n margin: 10px 0 4px;\n color: var(--mj-text-primary);\n}\n:host ::ng-deep .form-response-pill .field-answer-markdown p {\n margin: 6px 0;\n}\n:host ::ng-deep .form-response-pill .field-answer-markdown ul,\n:host ::ng-deep .form-response-pill .field-answer-markdown ol {\n margin: 6px 0;\n padding-left: 22px;\n}\n:host ::ng-deep .form-response-pill .field-answer-markdown li {\n margin: 3px 0;\n}\n:host ::ng-deep .form-response-pill .field-answer-markdown code {\n font-size: 12px;\n padding: 1px 5px;\n border-radius: 4px;\n background: color-mix(in srgb, var(--mj-status-success) 12%, transparent);\n}\n:host ::ng-deep .form-response-pill .field-answer-markdown table {\n border-collapse: collapse;\n margin: 8px 0;\n}\n:host ::ng-deep .form-response-pill .field-answer-markdown th,\n:host ::ng-deep .form-response-pill .field-answer-markdown td {\n border: 1px solid color-mix(in srgb, var(--mj-status-success) 25%, transparent);\n padding: 4px 10px;\n font-size: 12.5px;\n}\n", "/**\n * Custom Agent Icons for MemberJunction\n *\n * This file contains custom icon definitions for agents that need unique branding\n * beyond Font Awesome icons. Icons can be CSS-based (emoji, Unicode, SVG data URIs)\n * or reference external image files.\n *\n * USAGE IN AGENT METADATA:\n * \"IconClass\": \"mj-icon-skip\" (references .mj-icon-skip class below)\n *\n * EXTENSIBILITY FOR 3RD PARTY DEVELOPERS:\n * Third-party developers have TWO options:\n *\n * 1. CSS CLASS APPROACH (Recommended for developers):\n * - Add your own global CSS with custom icon classes\n * - Reference your class in agent metadata: \"IconClass\": \"your-custom-class\"\n * - Works with any CSS available to the application\n * - Example: If you have a global stylesheet with .acme-icon-analyzer { ... }\n * then use \"IconClass\": \"acme-icon-analyzer\"\n *\n * 2. LOGO URL APPROACH (Recommended for end users):\n * - Use the LogoURL field in agent metadata\n * - Provide a URL or data URI: \"LogoURL\": \"https://example.com/logo.png\"\n * - Supports: HTTP URLs, data URIs (data:image/png;base64,...)\n * - LogoURL takes precedence over IconClass in the UI\n * - Perfect for non-technical users or external/uploaded images\n *\n * BEST PRACTICES:\n * - Use mj-icon-* prefix for MJ core icons\n * - Use your own prefix for 3rd party icons (e.g., acme-icon-*)\n * - Keep icons simple and recognizable at 16-36px sizes\n * - Test in both light and dark themes\n * - Prefer CSS classes over LogoURL for version-controlled icons\n */\n\n/* ============================================\n BASE STYLES FOR CUSTOM ICONS\n ============================================ */\n\n/* Base styling for all custom MJ icons */\n[class^=\"mj-icon-\"],\n[class*=\" mj-icon-\"] {\n font-style: normal;\n font-variant: normal;\n text-rendering: auto;\n -webkit-font-smoothing: antialiased;\n display: inline-block;\n font-size: inherit;\n line-height: 1;\n}\n\n/* ============================================\n MJ CORE ICONS\n ============================================ */\n\n/**\n * Skip Brain Icon - Analytics/Intelligence Agent\n * Official Skip logo from Skip SaaS branding\n */\n.mj-icon-skip {\n width: 1.4em;\n height: 1.4em;\n display: inline-block;\n background-size: contain;\n background-repeat: no-repeat;\n background-position: center;\n /* Official Skip logo SVG */\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 101.89918457031249 96.83947368421053'%3E%3Cg transform='translate(-0.1288232421875,-0.0)'%3E%3Cpath d='M93.85,41.56c-.84,0-1.62.2-2.37.55-3-4.35-7.49-8.12-13.04-11.04l.04-7.18v-14.44h-10.24v17.6c-1.52-.43-3.07-.8-4.67-1.11V0h-10.24v24.72s-.09,0-.14,0h-4.38s-.1,0-.14,0V7.3h-10.24v18.62c-1.6.32-3.15.69-4.67,1.11v-11.67h-10.24v6.09l.04,9.6c-5.55,2.92-10.04,6.7-13.04,11.04-.75-.35-1.53-.55-2.37-.55-4.5,0-8.14,5.61-8.14,12.51s3.64,12.53,8.14,12.53c.58,0,1.14-.12,1.67-.29,4.1,6.62,11.54,12.06,20.98,15.28l.79.13v7.05c0,2.97,1.45,5.58,3.87,6.99,1.18.69,2.5,1.04,3.85,1.03,1.4,0,2.83-.37,4.15-1.12l7.54-4.29,7.56,4.3c1.31.74,2.73,1.12,4.13,1.12s2.67-.35,3.85-1.04c2.42-1.41,3.86-4.02,3.86-6.98v-7.05l.79-.13c9.44-3.22,16.89-8.66,20.98-15.28.54.17,1.09.29,1.68.29,4.5,0,8.14-5.61,8.14-12.53s-3.63-12.51-8.14-12.51' fill='%23AAAAAA'/%3E%3Cpath d='M86.69,50.87c0-12.22-13.6-19.1-28.94-20.66-4.48-.47-9.19-.54-13.52,0-15.34,1.53-28.93,8.41-28.93,20.66,0,8.55,5.7,15.55,12.68,15.55h7.94c3.05,2.5,6.93,4.1,11.08,4.71,2.65.4,5.44.46,8.01,0,4.15-.6,8.05-2.2,11.1-4.71h7.92c6.97,0,12.68-7,12.68-15.55' fill='white' opacity='0.9'/%3E%3Cpath d='M57.83,55.82c-1.19,2.58-3.8,4.35-6.84,4.35s-5.65-1.77-6.84-4.35h13.68Z' fill='%23AAAAAA'/%3E%3Cpath d='M32.52,41.14c1.74,0,3.18,2.13,3.18,4.76s-1.44,4.74-3.18,4.74-3.16-2.13-3.16-4.74,1.41-4.76,3.16-4.76' fill='%23AAAAAA'/%3E%3Cpath d='M69.46,41.14c1.74,0,3.16,2.13,3.16,4.76s-1.41,4.74-3.16,4.74-3.18-2.13-3.18-4.74,1.41-4.76,3.18-4.76' fill='%23AAAAAA'/%3E%3Cpath d='M63.91,76.15c-.82-.48-1.84-.43-2.8.12l-10.13,5.75-10.11-5.75c-.96-.55-1.98-.59-2.8-.12-.82.47-1.29,1.38-1.29,2.49v10.12c0,1.11.47,2.02,1.28,2.49.38.22.8.33,1.24.33.51,0,1.05-.15,1.57-.44l10.12-5.75,10.11,5.75c.52.29,1.05.44,1.56.44.44,0,.86-.11,1.24-.33.81-.48,1.28-1.38,1.28-2.49v-10.12c0-1.11-.47-2.02-1.28-2.49' fill='white' opacity='0.9'/%3E%3C/g%3E%3C/svg%3E\");\n vertical-align: middle;\n}\n\n/**\n * Alternative Skip Icon - Lightning Bolt\n * Simple emoji-based icon for quick setup\n */\n.mj-icon-skip-lightning::before {\n content: \"\u26A1\";\n color: var(--mj-brand-primary);\n font-size: 1.1em;\n}\n\n/**\n * Skip Icon - Brain Emoji\n * Fallback emoji option\n */\n.mj-icon-skip-brain::before {\n content: \"\uD83E\uDDE0\";\n font-size: 1.2em;\n}\n\n/**\n * Betty Icon - AI Assistant\n * Official Betty logo (face icon only)\n */\n.mj-icon-betty {\n width: 1.4em;\n height: 1.4em;\n display: inline-block;\n background-size: contain;\n background-repeat: no-repeat;\n background-position: center;\n /* Official Betty face icon SVG */\n background-image: url(\"data:image/svg+xml,%3Csvg id='a' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 200 150'%3E%3Cpath d='M64.96,60.23h75.12c10.58,0,20.24,4.31,27.2,11.32,7.01,6.95,11.32,16.61,11.32,27.19s-4.31,20.24-11.32,27.19c-6.95,7.02-16.61,11.32-27.2,11.32h-75.12c-10.58,0-20.24-4.31-27.19-11.32-2.65-2.64-4.92-5.6-6.71-8.92-.24,0-.49.06-.74.06-2.46,0-4.67-1.05-6.34-2.65-1.6-1.66-2.58-3.87-2.58-6.34v-18.7c0-2.46.98-4.74,2.58-6.34,1.66-1.66,3.87-2.65,6.34-2.65.25,0,.49,0,.74.06,1.79-3.32,4.06-6.34,6.71-8.92,6.95-7.01,16.61-11.32,27.19-11.32' fill='%233d1252'/%3E%3Cpath d='M132.33,68.36h0c0,1.72-.74,3.32-1.91,4.49-1.11,1.17-2.71,1.84-4.49,1.84h-13.29c-1.78,0-3.32-.68-4.49-1.84-1.17-1.17-1.91-2.77-1.91-4.49h-12.92c-8.37,0-15.94,3.44-21.47,8.92-5.47,5.54-8.92,13.1-8.92,21.47v1.17l.06.37v.37l.06.43v.37l.06.37v.37l.06.37.06.43.06.37.06.37.06.37.06.37c0,.12.06.25.06.37l.06.37.12.37.06.37.12.37.06.37.12.37.12.31.06.37.12.37.12.37.12.31.12.37.12.37.19.31.12.37.12.37.12.31.18.37.12.31.19.31.18.37.12.31.18.31.19.37.18.31.18.31.19.31.18.31c.12.24.25.43.37.68l.19.25.24.31.19.31c.43.62.86,1.23,1.35,1.79l.18.24c.49.62.99,1.17,1.48,1.66.19.19.31.37.49.56.19.12.37.31.56.49.49.49,1.04.98,1.6,1.47l.31.19c.56.49,1.17.92,1.79,1.35.18.12.37.25.55.37l.31.25.31.18.31.19.37.18.31.18.31.19.31.18.31.19.37.12.31.19.31.18c.12.06.24.12.37.12l.31.19.37.12.31.19.37.12.31.12.37.19.37.12.31.12.37.12.37.12.37.06c.24.12.43.18.68.25l.37.12.37.06.37.12c.12,0,.25.06.37.06l.37.06.37.12.37.06.37.06.37.06.37.06.37.06.37.06.43.06h.37l.37.06h.37l.37.06h.8l.37.06h47.56c8.37,0,15.94-3.44,21.47-8.92,5.48-5.54,8.92-13.1,8.92-21.47s-3.44-15.94-8.92-21.47c-5.54-5.48-13.1-8.92-21.47-8.92h-7.75Z' fill='%23fff'/%3E%3Cpolygon points='54.93 12.74 85.57 55.25 106.12 55.25 106.12 34.89 106.12 34.7 105.75 34.7 54.93 12.74' fill='%233aba91'/%3E%3Cpolygon points='111.1 55.25 124.76 55.25 145 27.07 111.35 41.59 111.1 41.59 111.1 41.72 111.1 55.25' fill='%233aba91'/%3E%3Cpath d='M94.55,82.81c3.75,0,6.83,3.81,7.57,8.92.06.74-.31,1.35-.98,1.66-.61.31-1.35.18-1.84-.37-1.29-1.48-2.96-2.34-4.74-2.34s-3.38.86-4.67,2.34c-.49.55-1.23.68-1.91.37-.68-.31-1.05-.92-.92-1.66.68-5.11,3.81-8.92,7.51-8.92' fill='%233d1252'/%3E%3Cpath d='M132.08,115.24c-.31,1.05-.86,2.03-1.66,2.77-1.11,1.17-2.71,1.84-4.49,1.84h-13.29c-1.79,0-3.32-.68-4.49-1.84-.8-.74-1.36-1.72-1.66-2.77-.19-.68.06-1.41.68-1.84.56-.43,1.35-.49,1.97-.06.98.68,2.21,1.05,3.51,1.05h13.29c1.29,0,2.52-.37,3.51-1.05.61-.43,1.41-.37,1.97.06.62.43.86,1.17.68,1.84' fill='%233d1252'/%3E%3Cpath d='M144.02,82.81c3.69,0,6.83,3.81,7.51,8.92.12.74-.24,1.35-.92,1.66-.68.31-1.41.18-1.91-.37-1.29-1.48-2.89-2.34-4.67-2.34s-3.44.86-4.74,2.34c-.49.55-1.23.68-1.84.37-.68-.31-1.05-.92-.98-1.66.74-5.11,3.81-8.92,7.57-8.92' fill='%233d1252'/%3E%3C/svg%3E\");\n vertical-align: middle;\n}\n\n/**\n * Izzy Icon - AI Assistant\n * Official Izzy logo (mark only)\n */\n.mj-icon-izzy {\n width: 1.4em;\n height: 1.4em;\n display: inline-block;\n background-size: contain;\n background-repeat: no-repeat;\n background-position: center;\n /* Official Izzy mark icon SVG */\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 204 180'%3E%3Cpath d='M0 0 C3.61144774 3.08477828 4.84942137 4.90830493 5.5 9.625 C5 13 5 13 3.5 14.9375 C1.74432121 17.35155834 1.83578869 18.21944114 1.90625 21.12890625 C1.9371875 22.40636719 1.968125 23.68382813 2 25 C3.18335937 24.72285156 4.36671875 24.44570313 5.5859375 24.16015625 C22.44010416 20.26839867 22.44010416 20.26839867 30 20 C31.80210938 19.92265625 31.80210938 19.92265625 33.640625 19.84375 C47.49356199 19.44904163 61.73614427 20.86627802 75 25 C75.53596907 19.64244551 75.53596907 19.64244551 73.5 15 C71.5549761 12.4066348 71.45048389 10.16629658 71.59375 6.97265625 C72.33633815 3.36681955 74.01253991 1.99164006 77 0 C79.80907914 -0.63997166 82.18961327 -0.63020793 85 0 C87.8100346 1.79363911 89.50940468 3.01880935 91 6 C90.984375 8.05859375 90.984375 8.05859375 90.75 10.4375 C90.68296875 11.21996094 90.6159375 12.00242187 90.546875 12.80859375 C90 15 90 15 88.49609375 16.3984375 C86.25734576 18.79500846 86.4852344 20.97464008 86.3125 24.1875 C86.21388672 25.81751953 86.21388672 25.81751953 86.11328125 27.48046875 C86.07589844 28.31191406 86.03851563 29.14335937 86 30 C86.67675781 30.0825 87.35351562 30.165 88.05078125 30.25 C91.82333306 31.20937741 94.89353787 32.99425194 98.1875 35 C99.18052124 35.60448975 99.18052124 35.60448975 100.19360352 36.22119141 C111.98050012 43.58460075 121.17745776 53.2687532 127 66 C127 66.66 127 67.32 127 68 C127.721875 68.0825 128.44375 68.165 129.1875 68.25 C133.81406141 69.48374971 136.2179022 71.66516963 138.625 75.7734375 C140.97801199 81.55147269 140.43210927 87.87027126 140.375 94 C140.38660156 95.24523437 140.39820313 96.49046875 140.41015625 97.7734375 C140.3675701 111.08870765 140.3675701 111.08870765 135.5 116.7421875 C131.62323281 119.66995439 128.8523137 121.14337998 124 121.125 C122.9790625 121.12886719 122.9790625 121.12886719 121.9375 121.1328125 C120 121 120 121 117 120 C116.74347656 120.65226562 116.48695313 121.30453125 116.22265625 121.9765625 C115.83980469 122.85054688 115.45695313 123.72453125 115.0625 124.625 C114.70285156 125.48351562 114.34320313 126.34203125 113.97265625 127.2265625 C108.57908063 134.80960941 99.56813916 137.59212379 91.0625 140.375 C90.02287109 140.72949219 88.98324219 141.08398438 87.91210938 141.44921875 C80.34347852 144 80.34347852 144 78 144 C78.02094727 144.65484375 78.04189453 145.3096875 78.06347656 145.984375 C78.14730383 148.98942328 78.19886895 151.99422464 78.25 155 C78.28351563 156.02996094 78.31703125 157.05992187 78.3515625 158.12109375 C78.43361416 164.56214867 77.93369275 169.71304442 74 175 C68.75523423 179.17440541 64.68195675 180.53237245 58 180 C55.12653443 178.963898 52.49379495 177.58020045 49.8125 176.125 C49.11447266 175.76019531 48.41644531 175.39539063 47.69726562 175.01953125 C46.39868999 174.33997216 45.10309803 173.65465367 43.81176758 172.96142578 C43.21388428 172.64415527 42.61600098 172.32688477 42 172 C41.34290039 171.59402588 40.68580078 171.18805176 40.00878906 170.76977539 C38.03672401 169.77639533 38.03672401 169.77639533 36.12475586 170.58325195 C35.49448486 170.96441162 34.86421387 171.34557129 34.21484375 171.73828125 C33.17166992 172.35026367 33.17166992 172.35026367 32.10742188 172.97460938 C31.39134766 173.41611328 30.67527344 173.85761719 29.9375 174.3125 C28.51029236 175.1647359 27.08194984 176.01507485 25.65234375 176.86328125 C25.02320068 177.24782471 24.39405762 177.63236816 23.74584961 178.02856445 C19.79572932 180.2265128 16.44037501 180.296025 12 180 C6.82155197 178.33236419 3.95074467 176.59004726 1 172 C-0.72417326 168.34258111 -1.2403609 165.51230089 -1.1953125 161.48046875 C-1.18886719 160.45888672 -1.18242188 159.43730469 -1.17578125 158.38476562 C-1.15902344 157.32966797 -1.14226563 156.27457031 -1.125 155.1875 C-1.11597656 154.11306641 -1.10695312 153.03863281 -1.09765625 151.93164062 C-1.07415306 149.28753146 -1.04129575 146.64388128 -1 144 C-1.63196289 143.81171631 -2.26392578 143.62343262 -2.91503906 143.42944336 C-8.20708475 141.84808949 -13.49207901 140.2541307 -18.75 138.5625 C-19.98234375 138.17191406 -21.2146875 137.78132812 -22.484375 137.37890625 C-29.06200008 134.79901552 -34.12925122 130.90130551 -38 125 C-38.875 121.5625 -38.875 121.5625 -39 119 C-39.495 119.33 -39.99 119.66 -40.5 120 C-45.24354984 121.89741993 -49.49426304 121.53143657 -54.1875 119.875 C-58.42051121 117.05299253 -61.35909664 113.92271008 -63 109 C-63.22709306 104.92471184 -63.22828659 100.8492307 -63.24023438 96.76806641 C-63.2498982 94.77103695 -63.28108516 92.77414948 -63.3125 90.77734375 C-63.36188158 78.59243786 -63.36188158 78.59243786 -60 73 C-57.7509823 70.86631654 -55.88785241 69.35340008 -53.0078125 68.20703125 C-50.3010212 66.57979679 -49.65488803 64.83796148 -48.3125 62 C-45.06106922 55.7428385 -40.95735135 50.97447519 -36 46 C-35.40832031 45.38511719 -34.81664063 44.77023438 -34.20703125 44.13671875 C-28.97373562 39.11136864 -17.47215548 30 -10 30 C-10.08733973 27.91589342 -10.19552278 25.83265331 -10.3125 23.75 C-10.37050781 22.58984375 -10.42851563 21.4296875 -10.48828125 20.234375 C-11.02905532 16.81635262 -11.84853545 15.59874271 -14 13 C-14.54046356 8.75350057 -14.48376179 6.74176808 -12.125 3.125 C-8.57275398 -0.42724602 -4.8825369 -0.970906 0 0 Z M5 35 C4.30245605 35.21962402 3.60491211 35.43924805 2.88623047 35.66552734 C-14.1501062 41.15773444 -29.02751477 50.81254544 -39 66 C-39.33 66.99 -39.66 67.98 -40 69 C-37.525 70.98 -37.525 70.98 -35 73 C-34.52691406 72.29875 -34.05382812 71.5975 -33.56640625 70.875 C-21.08320269 52.96537462 -2.17172019 42.38052109 19.26171875 38.5078125 C46.97805996 34.9959591 75.10426623 38.71529466 97.73046875 56.09765625 C103.53827054 61.07953766 107.9264808 66.53902088 112 73 C113.32 72.01 114.64 71.02 116 70 C115.01713954 61.60788376 107.55262518 55.04847712 101.375 49.8125 C82.80696113 35.82916208 61.35998978 30.59265576 38.375 30.625 C37.71836365 30.62554382 37.06172729 30.62608765 36.38519287 30.62664795 C25.42439402 30.66823796 15.42390121 31.62072499 5 35 Z' fill='%234E3B78' transform='translate(63,0)'/%3E%3Cpath d='M0 0 C5.27957047 5.78547525 9.31612861 13.25448014 10 21.125 C9.69743213 24.83293961 8.77676366 26.8914086 6.1875 29.5625 C-2.04152489 35.76003038 -13.60917874 39.6270706 -23.875 38.8125 C-24.535 38.1525 -25.195 37.4925 -25.875 36.8125 C-28.97847254 36.48234335 -31.03281176 36.30718706 -33.75 37.9375 C-35.40354531 40.69340884 -35.26865568 42.66325452 -34.875 45.8125 C-33.95833333 47.89583333 -33.95833333 47.89583333 -31.875 48.8125 C-28.29166667 48.89583333 -28.29166667 48.89583333 -24.875 47.8125 C-24.57086182 47.16466553 -24.26672363 46.51683105 -23.95336914 45.84936523 C-22.875 43.8125 -22.875 43.8125 -20.77124023 42.88696289 C-19.91731689 42.6883667 -19.06339355 42.48977051 -18.18359375 42.28515625 C-17.23806641 42.04990234 -16.29253906 41.81464844 -15.31835938 41.57226562 C-14.32642578 41.34216797 -13.33449219 41.11207031 -12.3125 40.875 C-4.77934417 39.10870895 1.54823541 36.95205932 8.125 32.8125 C7.81647145 40.06292099 4.56245219 45.32546918 -0.5 50.4609375 C-5.29811284 54.61130511 -8.83216751 54.86916719 -15 55 C-21.13677833 55.26569953 -25.04589225 56.51893716 -29.890625 60.31640625 C-39.17633501 67.31724667 -52.82450605 66.52799961 -63.875 65.8125 C-71.37432145 64.60538489 -79.4496824 61.2378176 -84.875 55.8125 C-86.81199027 55.70419517 -88.75076074 55.60687514 -90.69067383 55.58691406 C-97.68300211 55.51299157 -103.12007731 55.4392364 -108.44140625 50.40234375 C-108.91449219 49.87769531 -109.38757813 49.35304688 -109.875 48.8125 C-110.6175 48.090625 -111.36 47.36875 -112.125 46.625 C-118.35765562 36.60823203 -119.69570866 25.34707186 -117.25 13.8828125 C-113.47065738 3.0509466 -104.76645407 -4.0120534 -94.875 -9.1875 C-91.26850975 -10.75400624 -87.62602625 -12.0153043 -83.875 -13.1875 C-83.029375 -13.47496094 -82.18375 -13.76242188 -81.3125 -14.05859375 C-56.0861494 -22.29657387 -20.04377266 -18.06142152 0 0 Z' fill='%23FDFDFD' transform='translate(155.875,64.1875)'/%3E%3Cpath d='M0 0 C5.24479788 1.58079188 9.51172656 4.60408712 14.06640625 7.58984375 C18.37837094 10.28462973 18.37837094 10.28462973 23.30859375 11.1328125 C28.49696048 9.20971132 33.08639658 6.29555589 37.79882812 3.42578125 C43.66838131 -0.00837477 43.66838131 -0.00837477 47.27734375 0.078125 C49.34375 1.0078125 49.34375 1.0078125 51.34375 3.0078125 C51.82984303 7.30136192 51.71414913 11.62739332 51.71875 15.9453125 C51.74324219 17.15123047 51.76773438 18.35714844 51.79296875 19.59960938 C51.79876953 21.33114258 51.79876953 21.33114258 51.8046875 23.09765625 C51.81290527 24.15847412 51.82112305 25.21929199 51.82958984 26.31225586 C51.34375 29.0078125 51.34375 29.0078125 49.48461914 30.87670898 C46.29658529 32.56106989 44.78123809 32.062357 41.34375 31.0078125 C37.60135447 29.03986817 34.07891261 26.72386924 30.53320312 24.42578125 C26.44214688 21.80182316 26.44214688 21.80182316 21.77734375 20.921875 C17.60401055 22.78413283 13.85973006 25.2663764 10.046875 27.76953125 C5.85335687 30.41401513 2.44659272 31.9581498 -2.65625 32.0078125 C-4.33203125 30.87695312 -4.33203125 30.87695312 -5.65625 29.0078125 C-6.04443359 26.328125 -6.04443359 26.328125 -6.0546875 23.1328125 C-6.05855469 21.98296875 -6.06242187 20.833125 -6.06640625 19.6484375 C-6.05480469 18.44703125 -6.04320313 17.245625 -6.03125 16.0078125 C-6.04285156 14.80640625 -6.05445312 13.605 -6.06640625 12.3671875 C-6.06253906 11.21734375 -6.05867188 10.0675 -6.0546875 8.8828125 C-6.05130371 7.82835937 -6.04791992 6.77390625 -6.04443359 5.6875 C-5.65625 3.0078125 -5.65625 3.0078125 -4.29736328 1.14111328 C-2.65625 0.0078125 -2.65625 0.0078125 0 0 Z' fill='%23FCFCFD' transform='translate(78.65625,136.9921875)'/%3E%3Cpath d='M0 0 C2.5 0.625 2.5 0.625 4.8125 2.625 C6.96830116 6.4575354 7.24792603 9.32007692 6.5 13.625 C5.34367254 15.98793002 4.35016245 17.77483755 2.5 19.625 C0.1875 20 0.1875 20 -2.5 19.625 C-5.06638215 17.47478793 -6.29103188 15.79226637 -6.88671875 12.46484375 C-7.08084032 8.45522921 -6.77549931 6.12498023 -4.8125 2.5625 C-2.5 0.625 -2.5 0.625 0 0 Z' fill='%2353417C' transform='translate(138.5,67.375)'/%3E%3Cpath d='M0 0 C2.5 0.6875 2.5 0.6875 4.8125 2.625 C7.08407605 6.74748987 7.32547179 10.07653131 6.5 14.6875 C4.8125 17.75 4.8125 17.75 2.5 19.6875 C-0.0625 20.25 -0.0625 20.25 -2.5 19.6875 C-5.30401904 17.38419865 -5.84979387 14.76309142 -6.4375 11.3125 C-6.72853275 7.71913649 -6.44645777 6.57011897 -4.875 3.125 C-2.5 0.6875 -2.5 0.6875 0 0 Z' fill='%23523F7B' transform='translate(64.5,67.3125)'/%3E%3Cpath d='M0 0 C8.91 0 17.82 0 27 0 C24.81183076 5.47042311 24.169236 6.55141452 19 9 C14.08609728 9.94526984 9.88605617 10.13992406 5.51171875 7.49609375 C3.4733513 5.76185217 1.65854906 4.10051199 0 2 C0 1.34 0 0.68 0 0 Z' fill='%23574680' transform='translate(88,95)'/%3E%3C/svg%3E\");\n vertical-align: middle;\n}\n\n/* ============================================\n EXAMPLE CUSTOM ICONS FOR OTHER AGENTS\n ============================================ */\n\n/**\n * Data Analysis Icon - Chart emoji\n */\n.mj-icon-data-analyst::before {\n content: \"\uD83D\uDCCA\";\n font-size: 1.1em;\n}\n\n/**\n * API/Integration Icon - Plug emoji\n */\n.mj-icon-api::before {\n content: \"\uD83D\uDD0C\";\n font-size: 1.1em;\n}\n\n/**\n * Processing/Workflow Icon - Gear emoji with animation\n */\n.mj-icon-processing::before {\n content: \"\u2699\uFE0F\";\n display: inline-block;\n animation: rotate-icon 2s linear infinite;\n}\n\n@keyframes rotate-icon {\n from { transform: rotate(0deg); }\n to { transform: rotate(360deg); }\n}\n\n/**\n * Text/Letter-based Icon\n * Simple monogram icon\n */\n.mj-icon-monogram-s::before {\n content: \"S\";\n font-weight: 800;\n font-family: system-ui, -apple-system, sans-serif;\n font-size: 1.1em;\n color: var(--mj-brand-primary);\n}\n\n/* ============================================\n TEMPLATE FOR NEW ICONS\n ============================================ */\n\n/*\n// EMOJI-BASED ICON (Simplest)\n.mj-icon-my-agent::before {\n content: \"\uD83C\uDFAF\"; // Use any emoji\n font-size: 1.2em;\n}\n\n// UNICODE SYMBOL ICON\n.mj-icon-my-agent::before {\n content: \"\\2022\"; // Unicode character\n font-size: 1.2em;\n color: #667eea;\n}\n\n// TEXT/LETTER ICON\n.mj-icon-my-agent::before {\n content: \"MA\"; // Initials/text\n font-weight: 800;\n font-size: 0.9em;\n color: #667eea;\n}\n\n// SVG DATA URI ICON (Most Control)\n.mj-icon-my-agent {\n width: 1em;\n height: 1em;\n display: inline-block;\n background-size: contain;\n background-repeat: no-repeat;\n background-position: center;\n background-image: url('data:image/svg+xml;utf8,<svg>...</svg>');\n vertical-align: middle;\n}\n\n// EXTERNAL IMAGE FILE (For existing assets)\n.mj-icon-my-agent {\n width: 1em;\n height: 1em;\n display: inline-block;\n background-size: contain;\n background-repeat: no-repeat;\n background-position: center;\n background-image: url('/assets/icons/my-agent.svg');\n vertical-align: middle;\n}\n\n// GRADIENT TEXT ICON\n.mj-icon-my-agent::before {\n content: \"\u26A1\";\n background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n -webkit-background-clip: text;\n -webkit-text-fill-color: transparent;\n background-clip: text;\n}\n*/\n\n/* ============================================\n 3RD PARTY EXAMPLES\n These would typically be in EXTERNAL CSS files\n ============================================ */\n\n/*\n// Example: Acme Corp custom agent icons\n// This would be in acme-corp-styles.css loaded by the application\n\n.acme-icon-analyzer {\n width: 1em;\n height: 1em;\n display: inline-block;\n background-size: contain;\n background-image: url('https://acme.com/icons/analyzer.svg');\n}\n\n.acme-icon-reporter::before {\n content: \"A\";\n font-weight: 800;\n color: #FF6B35;\n}\n*/\n"] }]
2069
2839
  }], () => [{ type: i0.ChangeDetectorRef }, { type: i1.MentionParserService }, { type: i2.UICommandHandlerService }, { type: i3.ConversationAgentService }, { type: i4.MarkdownService }], { message: [{
2070
2840
  type: Input
2841
+ }], Conversation: [{
2842
+ type: Input
2071
2843
  }], conversation: [{
2072
2844
  type: Input
2845
+ }], CurrentUser: [{
2846
+ type: Input
2073
2847
  }], currentUser: [{
2074
2848
  type: Input
2849
+ }], AllMessages: [{
2850
+ type: Input
2075
2851
  }], allMessages: [{
2076
2852
  type: Input
2853
+ }], IsProcessing: [{
2854
+ type: Input
2077
2855
  }], isProcessing: [{
2078
2856
  type: Input
2857
+ }], Artifact: [{
2858
+ type: Input
2079
2859
  }], artifact: [{
2080
2860
  type: Input
2081
2861
  }], artifactVersion: [{
2082
2862
  type: Input
2863
+ }], Artifacts: [{
2864
+ type: Input
2083
2865
  }], artifacts: [{
2084
2866
  type: Input
2867
+ }], AgentRun: [{
2868
+ type: Input
2085
2869
  }], agentRun: [{
2086
2870
  type: Input
2871
+ }], UserAvatarMap: [{
2872
+ type: Input
2087
2873
  }], userAvatarMap: [{
2088
2874
  type: Input
2875
+ }], Ratings: [{
2876
+ type: Input
2089
2877
  }], ratings: [{
2090
2878
  type: Input
2879
+ }], IsLastMessage: [{
2880
+ type: Input
2091
2881
  }], isLastMessage: [{
2092
2882
  type: Input
2883
+ }], Attachments: [{
2884
+ type: Input
2093
2885
  }], attachments: [{
2094
2886
  type: Input
2887
+ }], PendingArtifacts: [{
2888
+ type: Input
2095
2889
  }], pendingArtifacts: [{
2096
2890
  type: Input
2891
+ }], MessageExtraTemplate: [{
2892
+ type: Input
2097
2893
  }], messageExtraTemplate: [{
2098
2894
  type: Input
2895
+ }], ShowAgentRunDetails: [{
2896
+ type: Input
2099
2897
  }], showAgentRunDetails: [{
2100
2898
  type: Input
2899
+ }], ShowReactions: [{
2900
+ type: Input
2101
2901
  }], showReactions: [{
2102
2902
  type: Input
2903
+ }], ShowMessageRating: [{
2904
+ type: Input
2103
2905
  }], showMessageRating: [{
2104
2906
  type: Input
2907
+ }], AllowPinning: [{
2908
+ type: Input
2105
2909
  }], allowPinning: [{
2106
2910
  type: Input
2911
+ }], AllowMessageEdit: [{
2912
+ type: Input
2107
2913
  }], allowMessageEdit: [{
2108
2914
  type: Input
2915
+ }], AllowMessageDelete: [{
2916
+ type: Input
2109
2917
  }], allowMessageDelete: [{
2110
2918
  type: Input
2919
+ }], ReadOnly: [{
2920
+ type: Input
2921
+ }], AssistantDisplayName: [{
2922
+ type: Input
2111
2923
  }], assistantDisplayName: [{
2112
2924
  type: Input
2925
+ }], AssistantAvatarUrl: [{
2926
+ type: Input
2113
2927
  }], assistantAvatarUrl: [{
2114
2928
  type: Input
2929
+ }], EditClicked: [{
2930
+ type: Output
2115
2931
  }], editClicked: [{
2116
2932
  type: Output
2933
+ }], DeleteClicked: [{
2934
+ type: Output
2117
2935
  }], deleteClicked: [{
2118
2936
  type: Output
2937
+ }], RetryClicked: [{
2938
+ type: Output
2119
2939
  }], retryClicked: [{
2120
2940
  type: Output
2941
+ }], TestFeedbackClicked: [{
2942
+ type: Output
2121
2943
  }], testFeedbackClicked: [{
2122
2944
  type: Output
2945
+ }], ArtifactClicked: [{
2946
+ type: Output
2123
2947
  }], artifactClicked: [{
2124
2948
  type: Output
2949
+ }], ArtifactActionPerformed: [{
2950
+ type: Output
2125
2951
  }], artifactActionPerformed: [{
2126
2952
  type: Output
2953
+ }], MessageEdited: [{
2954
+ type: Output
2127
2955
  }], messageEdited: [{
2128
2956
  type: Output
2957
+ }], OpenEntityRecord: [{
2958
+ type: Output
2129
2959
  }], openEntityRecord: [{
2130
2960
  type: Output
2961
+ }], SuggestedResponseSelected: [{
2962
+ type: Output
2131
2963
  }], suggestedResponseSelected: [{
2132
2964
  type: Output
2965
+ }], AttachmentClicked: [{
2966
+ type: Output
2133
2967
  }], attachmentClicked: [{
2134
2968
  type: Output
2969
+ }], DiagnosticRequested: [{
2970
+ type: Output
2135
2971
  }], diagnosticRequested: [{
2136
2972
  type: Output
2973
+ }], MessagePinToggled: [{
2974
+ type: Output
2137
2975
  }], messagePinToggled: [{
2138
2976
  type: Output
2977
+ }], LivenessCheckRequested: [{
2978
+ type: Output
2979
+ }], BeforeResponseFormSubmitted: [{
2980
+ type: Output
2139
2981
  }], beforeResponseFormSubmitted: [{
2140
2982
  type: Output
2983
+ }], AfterResponseFormSubmitted: [{
2984
+ type: Output
2141
2985
  }], afterResponseFormSubmitted: [{
2142
2986
  type: Output
2143
2987
  }] }); })();
2144
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(MessageItemComponent, { className: "MessageItemComponent", filePath: "src/lib/components/message/message-item.component.ts", lineNumber: 99 }); })();
2988
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(MessageItemComponent, { className: "MessageItemComponent", filePath: "src/lib/components/message/message-item.component.ts", lineNumber: 125 }); })();
2145
2989
  //# sourceMappingURL=message-item.component.js.map