@memberjunction/ng-explorer-core 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 (190) hide show
  1. package/dist/app-routing.module.d.ts +23 -1
  2. package/dist/app-routing.module.d.ts.map +1 -1
  3. package/dist/app-routing.module.js +50 -14
  4. package/dist/app-routing.module.js.map +1 -1
  5. package/dist/generated/lazy-feature-config.d.ts +1 -1
  6. package/dist/generated/lazy-feature-config.d.ts.map +1 -1
  7. package/dist/generated/lazy-feature-config.js +12 -1
  8. package/dist/generated/lazy-feature-config.js.map +1 -1
  9. package/dist/lib/command-palette/command-palette.component.d.ts +7 -1
  10. package/dist/lib/command-palette/command-palette.component.d.ts.map +1 -1
  11. package/dist/lib/command-palette/command-palette.component.js +28 -14
  12. package/dist/lib/command-palette/command-palette.component.js.map +1 -1
  13. package/dist/lib/conversation-feedback/conversation-feedback.d.ts +103 -13
  14. package/dist/lib/conversation-feedback/conversation-feedback.d.ts.map +1 -1
  15. package/dist/lib/conversation-feedback/conversation-feedback.js +219 -67
  16. package/dist/lib/conversation-feedback/conversation-feedback.js.map +1 -1
  17. package/dist/lib/dashboard-preferences-dialog/dashboard-preferences-dialog.component.d.ts +64 -10
  18. package/dist/lib/dashboard-preferences-dialog/dashboard-preferences-dialog.component.d.ts.map +1 -1
  19. package/dist/lib/dashboard-preferences-dialog/dashboard-preferences-dialog.component.js +172 -66
  20. package/dist/lib/dashboard-preferences-dialog/dashboard-preferences-dialog.component.js.map +1 -1
  21. package/dist/lib/generic/resource-container-component.d.ts +19 -5
  22. package/dist/lib/generic/resource-container-component.d.ts.map +1 -1
  23. package/dist/lib/generic/resource-container-component.js +43 -13
  24. package/dist/lib/generic/resource-container-component.js.map +1 -1
  25. package/dist/lib/guards/entities.guard.d.ts +4 -0
  26. package/dist/lib/guards/entities.guard.d.ts.map +1 -1
  27. package/dist/lib/guards/entities.guard.js +10 -2
  28. package/dist/lib/guards/entities.guard.js.map +1 -1
  29. package/dist/lib/identity-claims/claim-redeem.component.d.ts +4 -0
  30. package/dist/lib/identity-claims/claim-redeem.component.d.ts.map +1 -1
  31. package/dist/lib/identity-claims/claim-redeem.component.js +10 -2
  32. package/dist/lib/identity-claims/claim-redeem.component.js.map +1 -1
  33. package/dist/lib/oauth/oauth-callback.component.d.ts +4 -0
  34. package/dist/lib/oauth/oauth-callback.component.d.ts.map +1 -1
  35. package/dist/lib/oauth/oauth-callback.component.js +10 -2
  36. package/dist/lib/oauth/oauth-callback.component.js.map +1 -1
  37. package/dist/lib/profile/profile-dialog.component.d.ts.map +1 -1
  38. package/dist/lib/profile/profile-dialog.component.js +194 -191
  39. package/dist/lib/profile/profile-dialog.component.js.map +1 -1
  40. package/dist/lib/resource-wrappers/artifact-resource.component.d.ts +20 -2
  41. package/dist/lib/resource-wrappers/artifact-resource.component.d.ts.map +1 -1
  42. package/dist/lib/resource-wrappers/artifact-resource.component.js +33 -9
  43. package/dist/lib/resource-wrappers/artifact-resource.component.js.map +1 -1
  44. package/dist/lib/resource-wrappers/chat-collections-resource.component.d.ts +80 -10
  45. package/dist/lib/resource-wrappers/chat-collections-resource.component.d.ts.map +1 -1
  46. package/dist/lib/resource-wrappers/chat-collections-resource.component.js +168 -56
  47. package/dist/lib/resource-wrappers/chat-collections-resource.component.js.map +1 -1
  48. package/dist/lib/resource-wrappers/chat-conversations-resource.component.d.ts +199 -25
  49. package/dist/lib/resource-wrappers/chat-conversations-resource.component.d.ts.map +1 -1
  50. package/dist/lib/resource-wrappers/chat-conversations-resource.component.js +534 -182
  51. package/dist/lib/resource-wrappers/chat-conversations-resource.component.js.map +1 -1
  52. package/dist/lib/resource-wrappers/chat-deeplink-params.d.ts +2 -0
  53. package/dist/lib/resource-wrappers/chat-deeplink-params.d.ts.map +1 -1
  54. package/dist/lib/resource-wrappers/chat-deeplink-params.js +5 -1
  55. package/dist/lib/resource-wrappers/chat-deeplink-params.js.map +1 -1
  56. package/dist/lib/resource-wrappers/chat-search-routing.d.ts +25 -0
  57. package/dist/lib/resource-wrappers/chat-search-routing.d.ts.map +1 -0
  58. package/dist/lib/resource-wrappers/chat-search-routing.js +24 -0
  59. package/dist/lib/resource-wrappers/chat-search-routing.js.map +1 -0
  60. package/dist/lib/resource-wrappers/chat-tasks-resource.component.d.ts +14 -2
  61. package/dist/lib/resource-wrappers/chat-tasks-resource.component.d.ts.map +1 -1
  62. package/dist/lib/resource-wrappers/chat-tasks-resource.component.js +32 -8
  63. package/dist/lib/resource-wrappers/chat-tasks-resource.component.js.map +1 -1
  64. package/dist/lib/resource-wrappers/compose-email-fallback.d.ts +46 -0
  65. package/dist/lib/resource-wrappers/compose-email-fallback.d.ts.map +1 -0
  66. package/dist/lib/resource-wrappers/compose-email-fallback.js +62 -0
  67. package/dist/lib/resource-wrappers/compose-email-fallback.js.map +1 -0
  68. package/dist/lib/resource-wrappers/dashboard-resource.component.d.ts +54 -8
  69. package/dist/lib/resource-wrappers/dashboard-resource.component.d.ts.map +1 -1
  70. package/dist/lib/resource-wrappers/dashboard-resource.component.js +138 -46
  71. package/dist/lib/resource-wrappers/dashboard-resource.component.js.map +1 -1
  72. package/dist/lib/resource-wrappers/livekit-room-resource.component.d.ts +223 -30
  73. package/dist/lib/resource-wrappers/livekit-room-resource.component.d.ts.map +1 -1
  74. package/dist/lib/resource-wrappers/livekit-room-resource.component.js +438 -118
  75. package/dist/lib/resource-wrappers/livekit-room-resource.component.js.map +1 -1
  76. package/dist/lib/resource-wrappers/search-results-resource.component.d.ts +7 -3
  77. package/dist/lib/resource-wrappers/search-results-resource.component.d.ts.map +1 -1
  78. package/dist/lib/resource-wrappers/search-results-resource.component.js +23 -15
  79. package/dist/lib/resource-wrappers/search-results-resource.component.js.map +1 -1
  80. package/dist/lib/resource-wrappers/view-resource.component.d.ts +74 -11
  81. package/dist/lib/resource-wrappers/view-resource.component.d.ts.map +1 -1
  82. package/dist/lib/resource-wrappers/view-resource.component.js +214 -68
  83. package/dist/lib/resource-wrappers/view-resource.component.js.map +1 -1
  84. package/dist/lib/services/server-connectivity.service.d.ts +9 -4
  85. package/dist/lib/services/server-connectivity.service.d.ts.map +1 -1
  86. package/dist/lib/services/server-connectivity.service.js +56 -12
  87. package/dist/lib/services/server-connectivity.service.js.map +1 -1
  88. package/dist/lib/services/startup-validation.service.d.ts +4 -0
  89. package/dist/lib/services/startup-validation.service.d.ts.map +1 -1
  90. package/dist/lib/services/startup-validation.service.js +10 -2
  91. package/dist/lib/services/startup-validation.service.js.map +1 -1
  92. package/dist/lib/services/system-validation.service.d.ts +13 -1
  93. package/dist/lib/services/system-validation.service.d.ts.map +1 -1
  94. package/dist/lib/services/system-validation.service.js +29 -5
  95. package/dist/lib/services/system-validation.service.js.map +1 -1
  96. package/dist/lib/shell/components/dialogs/app-access-dialog.component.d.ts +54 -4
  97. package/dist/lib/shell/components/dialogs/app-access-dialog.component.d.ts.map +1 -1
  98. package/dist/lib/shell/components/dialogs/app-access-dialog.component.js +130 -40
  99. package/dist/lib/shell/components/dialogs/app-access-dialog.component.js.map +1 -1
  100. package/dist/lib/shell/components/header/app-nav.component.d.ts +29 -1
  101. package/dist/lib/shell/components/header/app-nav.component.d.ts.map +1 -1
  102. package/dist/lib/shell/components/header/app-nav.component.js +56 -12
  103. package/dist/lib/shell/components/header/app-nav.component.js.map +1 -1
  104. package/dist/lib/shell/components/header/app-switcher.component.d.ts +33 -5
  105. package/dist/lib/shell/components/header/app-switcher.component.d.ts.map +1 -1
  106. package/dist/lib/shell/components/header/app-switcher.component.js +85 -29
  107. package/dist/lib/shell/components/header/app-switcher.component.js.map +1 -1
  108. package/dist/lib/shell/components/record-open/record-origin-crumb.component.js +1 -1
  109. package/dist/lib/shell/components/record-open/record-origin-crumb.component.js.map +1 -1
  110. package/dist/lib/shell/components/tabs/component-cache-manager.d.ts +50 -6
  111. package/dist/lib/shell/components/tabs/component-cache-manager.d.ts.map +1 -1
  112. package/dist/lib/shell/components/tabs/component-cache-manager.js +95 -22
  113. package/dist/lib/shell/components/tabs/component-cache-manager.js.map +1 -1
  114. package/dist/lib/shell/components/tabs/tab-container.component.d.ts +91 -9
  115. package/dist/lib/shell/components/tabs/tab-container.component.d.ts.map +1 -1
  116. package/dist/lib/shell/components/tabs/tab-container.component.js +257 -101
  117. package/dist/lib/shell/components/tabs/tab-container.component.js.map +1 -1
  118. package/dist/lib/shell/loading-themes.d.ts +16 -12
  119. package/dist/lib/shell/loading-themes.d.ts.map +1 -1
  120. package/dist/lib/shell/loading-themes.js +145 -137
  121. package/dist/lib/shell/loading-themes.js.map +1 -1
  122. package/dist/lib/shell/readiness-beacon.d.ts +2 -0
  123. package/dist/lib/shell/readiness-beacon.d.ts.map +1 -1
  124. package/dist/lib/shell/readiness-beacon.js +5 -1
  125. package/dist/lib/shell/readiness-beacon.js.map +1 -1
  126. package/dist/lib/shell/services/about-dialog.service.d.ts +6 -0
  127. package/dist/lib/shell/services/about-dialog.service.d.ts.map +1 -1
  128. package/dist/lib/shell/services/about-dialog.service.js +16 -4
  129. package/dist/lib/shell/services/about-dialog.service.js.map +1 -1
  130. package/dist/lib/shell/services/profile-dialog.service.d.ts +6 -0
  131. package/dist/lib/shell/services/profile-dialog.service.d.ts.map +1 -1
  132. package/dist/lib/shell/services/profile-dialog.service.js +16 -4
  133. package/dist/lib/shell/services/profile-dialog.service.js.map +1 -1
  134. package/dist/lib/shell/services/user-sharing-center-dialog.service.d.ts +6 -0
  135. package/dist/lib/shell/services/user-sharing-center-dialog.service.d.ts.map +1 -1
  136. package/dist/lib/shell/services/user-sharing-center-dialog.service.js +15 -3
  137. package/dist/lib/shell/services/user-sharing-center-dialog.service.js.map +1 -1
  138. package/dist/lib/shell/shell.component.d.ts +264 -39
  139. package/dist/lib/shell/shell.component.d.ts.map +1 -1
  140. package/dist/lib/shell/shell.component.js +697 -294
  141. package/dist/lib/shell/shell.component.js.map +1 -1
  142. package/dist/lib/single-dashboard/Components/add-item/add-item.component.d.ts +64 -8
  143. package/dist/lib/single-dashboard/Components/add-item/add-item.component.d.ts.map +1 -1
  144. package/dist/lib/single-dashboard/Components/add-item/add-item.component.js +129 -37
  145. package/dist/lib/single-dashboard/Components/add-item/add-item.component.js.map +1 -1
  146. package/dist/lib/single-dashboard/Components/delete-item/delete-item.component.d.ts +26 -2
  147. package/dist/lib/single-dashboard/Components/delete-item/delete-item.component.d.ts.map +1 -1
  148. package/dist/lib/single-dashboard/Components/delete-item/delete-item.component.js +48 -10
  149. package/dist/lib/single-dashboard/Components/delete-item/delete-item.component.js.map +1 -1
  150. package/dist/lib/single-dashboard/Components/edit-dashboard/edit-dashboard.component.d.ts +84 -6
  151. package/dist/lib/single-dashboard/Components/edit-dashboard/edit-dashboard.component.d.ts.map +1 -1
  152. package/dist/lib/single-dashboard/Components/edit-dashboard/edit-dashboard.component.js +133 -29
  153. package/dist/lib/single-dashboard/Components/edit-dashboard/edit-dashboard.component.js.map +1 -1
  154. package/dist/lib/single-dashboard/single-dashboard.component.d.ts +173 -23
  155. package/dist/lib/single-dashboard/single-dashboard.component.d.ts.map +1 -1
  156. package/dist/lib/single-dashboard/single-dashboard.component.js +383 -109
  157. package/dist/lib/single-dashboard/single-dashboard.component.js.map +1 -1
  158. package/dist/lib/single-list-detail/single-list-detail.component.d.ts +383 -55
  159. package/dist/lib/single-list-detail/single-list-detail.component.d.ts.map +1 -1
  160. package/dist/lib/single-list-detail/single-list-detail.component.js +962 -326
  161. package/dist/lib/single-list-detail/single-list-detail.component.js.map +1 -1
  162. package/dist/lib/single-query/single-query.component.d.ts +22 -2
  163. package/dist/lib/single-query/single-query.component.d.ts.map +1 -1
  164. package/dist/lib/single-query/single-query.component.js +40 -10
  165. package/dist/lib/single-query/single-query.component.js.map +1 -1
  166. package/dist/lib/single-record/single-record.component.d.ts +41 -3
  167. package/dist/lib/single-record/single-record.component.d.ts.map +1 -1
  168. package/dist/lib/single-record/single-record.component.js +71 -11
  169. package/dist/lib/single-record/single-record.component.js.map +1 -1
  170. package/dist/lib/single-search-result/single-search-result.component.d.ts +23 -3
  171. package/dist/lib/single-search-result/single-search-result.component.d.ts.map +1 -1
  172. package/dist/lib/single-search-result/single-search-result.component.js +42 -12
  173. package/dist/lib/single-search-result/single-search-result.component.js.map +1 -1
  174. package/dist/lib/system-validation/system-validation-banner.component.d.ts +12 -2
  175. package/dist/lib/system-validation/system-validation-banner.component.d.ts.map +1 -1
  176. package/dist/lib/system-validation/system-validation-banner.component.js +25 -5
  177. package/dist/lib/system-validation/system-validation-banner.component.js.map +1 -1
  178. package/dist/lib/user-menu/user-menu.types.d.ts +4 -0
  179. package/dist/lib/user-menu/user-menu.types.d.ts.map +1 -1
  180. package/dist/lib/user-menu/user-menu.types.js +10 -2
  181. package/dist/lib/user-menu/user-menu.types.js.map +1 -1
  182. package/dist/lib/user-notifications/user-notifications.component.d.ts +59 -7
  183. package/dist/lib/user-notifications/user-notifications.component.d.ts.map +1 -1
  184. package/dist/lib/user-notifications/user-notifications.component.js +151 -47
  185. package/dist/lib/user-notifications/user-notifications.component.js.map +1 -1
  186. package/dist/lib/user-profile/user-profile.component.d.ts +3 -2
  187. package/dist/lib/user-profile/user-profile.component.d.ts.map +1 -1
  188. package/dist/lib/user-profile/user-profile.component.js +5 -4
  189. package/dist/lib/user-profile/user-profile.component.js.map +1 -1
  190. package/package.json +52 -52
@@ -8,8 +8,11 @@ import { Component, ViewEncapsulation, ViewChild, HostListener } from '@angular/
8
8
  import { RegisterClass, UUIDsEqual } from '@memberjunction/global';
9
9
  import { BaseResourceComponent } from '@memberjunction/ng-shared';
10
10
  import { MJEnvironmentEntityExtended, UserInfoEngine, ConversationEngine } from '@memberjunction/core-entities';
11
- import { resolveDeepLinkParam } from './chat-deeplink-params.js';
11
+ import { ResolveDeepLinkParam } from './chat-deeplink-params.js';
12
+ import { ResolveChatSearchRoute } from './chat-search-routing.js';
13
+ import { ResolveComposeEmailDraft, BuildComposeEmailFallbackNotice } from './compose-email-fallback.js';
12
14
  import { MentionAutocompleteService } from '@memberjunction/ng-conversations';
15
+ import { MJNotificationService } from '@memberjunction/ng-notifications';
13
16
  import { AIEngineBase } from '@memberjunction/ai-engine-base';
14
17
  import { takeUntil } from 'rxjs';
15
18
  import * as i0 from "@angular/core";
@@ -19,16 +22,16 @@ const _c0 = ["conversationList"];
19
22
  const _c1 = ["chatArea"];
20
23
  function ChatConversationsResource_Conditional_0_Conditional_1_Template(rf, ctx) { if (rf & 1) {
21
24
  const _r1 = i0.ɵɵgetCurrentView();
22
- i0.ɵɵelementStart(0, "div", 9);
25
+ i0.ɵɵelementStart(0, "div", 10);
23
26
  i0.ɵɵlistener("click", function ChatConversationsResource_Conditional_0_Conditional_1_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.collapseSidebar()); });
24
27
  i0.ɵɵelementEnd();
25
28
  } }
26
29
  function ChatConversationsResource_Conditional_0_Conditional_2_Conditional_1_Template(rf, ctx) { if (rf & 1) {
27
30
  const _r3 = i0.ɵɵgetCurrentView();
28
- i0.ɵɵelementStart(0, "mj-conversation-list", 11, 0);
29
- i0.ɵɵlistener("conversationSelected", function ChatConversationsResource_Conditional_0_Conditional_2_Conditional_1_Template_mj_conversation_list_conversationSelected_0_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onConversationSelected($event)); })("conversationDeleted", function ChatConversationsResource_Conditional_0_Conditional_2_Conditional_1_Template_mj_conversation_list_conversationDeleted_0_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onConversationDeleted($event)); })("newConversationRequested", function ChatConversationsResource_Conditional_0_Conditional_2_Conditional_1_Template_mj_conversation_list_newConversationRequested_0_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onNewConversationRequested()); })("pinSidebarRequested", function ChatConversationsResource_Conditional_0_Conditional_2_Conditional_1_Template_mj_conversation_list_pinSidebarRequested_0_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.pinSidebar()); })("unpinSidebarRequested", function ChatConversationsResource_Conditional_0_Conditional_2_Conditional_1_Template_mj_conversation_list_unpinSidebarRequested_0_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.unpinSidebar()); })("refreshRequested", function ChatConversationsResource_Conditional_0_Conditional_2_Conditional_1_Template_mj_conversation_list_refreshRequested_0_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onRefreshRequested()); });
31
+ i0.ɵɵelementStart(0, "mj-conversation-list", 12, 0);
32
+ i0.ɵɵlistener("conversationSelected", function ChatConversationsResource_Conditional_0_Conditional_2_Conditional_1_Template_mj_conversation_list_conversationSelected_0_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onConversationSelected($event)); })("conversationDeleted", function ChatConversationsResource_Conditional_0_Conditional_2_Conditional_1_Template_mj_conversation_list_conversationDeleted_0_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onConversationDeleted($event)); })("newConversationRequested", function ChatConversationsResource_Conditional_0_Conditional_2_Conditional_1_Template_mj_conversation_list_newConversationRequested_0_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onNewConversationRequested()); })("pinSidebarRequested", function ChatConversationsResource_Conditional_0_Conditional_2_Conditional_1_Template_mj_conversation_list_pinSidebarRequested_0_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.pinSidebar()); })("unpinSidebarRequested", function ChatConversationsResource_Conditional_0_Conditional_2_Conditional_1_Template_mj_conversation_list_unpinSidebarRequested_0_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.unpinSidebar()); })("refreshRequested", function ChatConversationsResource_Conditional_0_Conditional_2_Conditional_1_Template_mj_conversation_list_refreshRequested_0_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onRefreshRequested()); })("SearchEscalated", function ChatConversationsResource_Conditional_0_Conditional_2_Conditional_1_Template_mj_conversation_list_SearchEscalated_0_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.OpenSearch($event)); });
30
33
  i0.ɵɵelementEnd();
31
- i0.ɵɵelementStart(2, "mj-conversation-routines-section", 12);
34
+ i0.ɵɵelementStart(2, "mj-conversation-routines-section", 13);
32
35
  i0.ɵɵlistener("openEntityRecord", function ChatConversationsResource_Conditional_0_Conditional_2_Conditional_1_Template_mj_conversation_routines_section_openEntityRecord_2_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onOpenEntityRecord($event)); })("openConversation", function ChatConversationsResource_Conditional_0_Conditional_2_Conditional_1_Template_mj_conversation_routines_section_openConversation_2_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.onConversationSelected($event)); });
33
36
  i0.ɵɵelementEnd();
34
37
  } if (rf & 2) {
@@ -36,7 +39,7 @@ function ChatConversationsResource_Conditional_0_Conditional_2_Conditional_1_Tem
36
39
  i0.ɵɵproperty("environmentId", ctx_r1.environmentId)("currentUser", ctx_r1.currentUser)("selectedConversationId", ctx_r1.selectedConversationId)("renamedConversationId", ctx_r1.renamedConversationId)("isSidebarPinned", ctx_r1.isSidebarPinned)("isMobileView", ctx_r1.isMobileView);
37
40
  } }
38
41
  function ChatConversationsResource_Conditional_0_Conditional_2_Template(rf, ctx) { if (rf & 1) {
39
- i0.ɵɵelementStart(0, "div", 10);
42
+ i0.ɵɵelementStart(0, "div", 11);
40
43
  i0.ɵɵconditionalCreate(1, ChatConversationsResource_Conditional_0_Conditional_2_Conditional_1_Template, 3, 6);
41
44
  i0.ɵɵelementEnd();
42
45
  } if (rf & 2) {
@@ -48,13 +51,13 @@ function ChatConversationsResource_Conditional_0_Conditional_2_Template(rf, ctx)
48
51
  } }
49
52
  function ChatConversationsResource_Conditional_0_Conditional_3_Template(rf, ctx) { if (rf & 1) {
50
53
  const _r4 = i0.ɵɵgetCurrentView();
51
- i0.ɵɵelementStart(0, "div", 13);
54
+ i0.ɵɵelementStart(0, "div", 14);
52
55
  i0.ɵɵlistener("mousedown", function ChatConversationsResource_Conditional_0_Conditional_3_Template_div_mousedown_0_listener($event) { i0.ɵɵrestoreView(_r4); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onSidebarResizeStart($event)); });
53
56
  i0.ɵɵelementEnd();
54
57
  } }
55
58
  function ChatConversationsResource_Conditional_0_Conditional_5_Template(rf, ctx) { if (rf & 1) {
56
59
  const _r5 = i0.ɵɵgetCurrentView();
57
- i0.ɵɵelementStart(0, "mj-conversation-chat-area", 14, 1);
60
+ i0.ɵɵelementStart(0, "mj-conversation-chat-area", 15, 1);
58
61
  i0.ɵɵlistener("sidebarToggleClicked", function ChatConversationsResource_Conditional_0_Conditional_5_Template_mj_conversation_chat_area_sidebarToggleClicked_0_listener() { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.expandSidebar()); })("conversationRenamed", function ChatConversationsResource_Conditional_0_Conditional_5_Template_mj_conversation_chat_area_conversationRenamed_0_listener($event) { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onConversationRenamed($event)); })("conversationCreated", function ChatConversationsResource_Conditional_0_Conditional_5_Template_mj_conversation_chat_area_conversationCreated_0_listener($event) { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onConversationCreated($event)); })("threadOpened", function ChatConversationsResource_Conditional_0_Conditional_5_Template_mj_conversation_chat_area_threadOpened_0_listener($event) { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onThreadOpened($event)); })("threadClosed", function ChatConversationsResource_Conditional_0_Conditional_5_Template_mj_conversation_chat_area_threadClosed_0_listener() { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onThreadClosed()); })("pendingArtifactConsumed", function ChatConversationsResource_Conditional_0_Conditional_5_Template_mj_conversation_chat_area_pendingArtifactConsumed_0_listener() { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onPendingArtifactConsumed()); })("pendingMessageConsumed", function ChatConversationsResource_Conditional_0_Conditional_5_Template_mj_conversation_chat_area_pendingMessageConsumed_0_listener() { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onPendingMessageConsumed()); })("pendingMessageRequested", function ChatConversationsResource_Conditional_0_Conditional_5_Template_mj_conversation_chat_area_pendingMessageRequested_0_listener($event) { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onPendingMessageRequested($event)); })("artifactLinkClicked", function ChatConversationsResource_Conditional_0_Conditional_5_Template_mj_conversation_chat_area_artifactLinkClicked_0_listener($event) { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onArtifactLinkClicked($event)); })("openEntityRecord", function ChatConversationsResource_Conditional_0_Conditional_5_Template_mj_conversation_chat_area_openEntityRecord_0_listener($event) { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onOpenEntityRecord($event)); })("navigationRequest", function ChatConversationsResource_Conditional_0_Conditional_5_Template_mj_conversation_chat_area_navigationRequest_0_listener($event) { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onNavigationRequest($event)); })("composerAgentMentionConsumed", function ChatConversationsResource_Conditional_0_Conditional_5_Template_mj_conversation_chat_area_composerAgentMentionConsumed_0_listener() { i0.ɵɵrestoreView(_r5); const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.onComposerAgentMentionConsumed()); });
59
62
  i0.ɵɵelementEnd();
60
63
  } if (rf & 2) {
@@ -63,11 +66,11 @@ function ChatConversationsResource_Conditional_0_Conditional_5_Template(rf, ctx)
63
66
  } }
64
67
  function ChatConversationsResource_Conditional_0_Template(rf, ctx) { if (rf & 1) {
65
68
  i0.ɵɵelementStart(0, "div", 2);
66
- i0.ɵɵconditionalCreate(1, ChatConversationsResource_Conditional_0_Conditional_1_Template, 1, 0, "div", 4);
67
- i0.ɵɵconditionalCreate(2, ChatConversationsResource_Conditional_0_Conditional_2_Template, 2, 7, "div", 5);
68
- i0.ɵɵconditionalCreate(3, ChatConversationsResource_Conditional_0_Conditional_3_Template, 1, 0, "div", 6);
69
- i0.ɵɵelementStart(4, "div", 7);
70
- i0.ɵɵconditionalCreate(5, ChatConversationsResource_Conditional_0_Conditional_5_Template, 2, 13, "mj-conversation-chat-area", 8);
69
+ i0.ɵɵconditionalCreate(1, ChatConversationsResource_Conditional_0_Conditional_1_Template, 1, 0, "div", 5);
70
+ i0.ɵɵconditionalCreate(2, ChatConversationsResource_Conditional_0_Conditional_2_Template, 2, 7, "div", 6);
71
+ i0.ɵɵconditionalCreate(3, ChatConversationsResource_Conditional_0_Conditional_3_Template, 1, 0, "div", 7);
72
+ i0.ɵɵelementStart(4, "div", 8);
73
+ i0.ɵɵconditionalCreate(5, ChatConversationsResource_Conditional_0_Conditional_5_Template, 2, 13, "mj-conversation-chat-area", 9);
71
74
  i0.ɵɵelementEnd()();
72
75
  } if (rf & 2) {
73
76
  const ctx_r1 = i0.ɵɵnextContext();
@@ -82,9 +85,18 @@ function ChatConversationsResource_Conditional_0_Template(rf, ctx) { if (rf & 1)
82
85
  } }
83
86
  function ChatConversationsResource_Conditional_1_Template(rf, ctx) { if (rf & 1) {
84
87
  i0.ɵɵelementStart(0, "div", 3);
85
- i0.ɵɵelement(1, "mj-loading", 15);
88
+ i0.ɵɵelement(1, "mj-loading", 16);
86
89
  i0.ɵɵelementEnd();
87
90
  } }
91
+ function ChatConversationsResource_Conditional_2_Template(rf, ctx) { if (rf & 1) {
92
+ const _r6 = i0.ɵɵgetCurrentView();
93
+ i0.ɵɵelementStart(0, "mj-search-panel", 17);
94
+ i0.ɵɵlistener("close", function ChatConversationsResource_Conditional_2_Template_mj_search_panel_close_0_listener() { i0.ɵɵrestoreView(_r6); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.CloseSearch()); })("ResultSelected", function ChatConversationsResource_Conditional_2_Template_mj_search_panel_ResultSelected_0_listener($event) { i0.ɵɵrestoreView(_r6); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnSearchResultSelected($event)); });
95
+ i0.ɵɵelementEnd();
96
+ } if (rf & 2) {
97
+ const ctx_r1 = i0.ɵɵnextContext();
98
+ i0.ɵɵproperty("InitialQuery", ctx_r1.SearchSeedQuery)("IsOpen", ctx_r1.IsSearchPanelOpen)("EnvironmentId", ctx_r1.EnvironmentId)("CurrentUser", ctx_r1.CurrentUser);
99
+ } }
88
100
  /**
89
101
  * Chat Conversations Resource - wraps the conversation chat area for tab-based display
90
102
  * Extends BaseResourceComponent to work with the resource type system
@@ -102,33 +114,169 @@ let ChatConversationsResource = class ChatConversationsResource extends BaseReso
102
114
  activeTasksService;
103
115
  uiCommandHandler;
104
116
  bridge;
105
- conversationList;
106
- chatArea;
107
- currentUser = null;
117
+ ConversationList;
118
+ /** @deprecated Use {@link ConversationList}. */
119
+ get conversationList() {
120
+ return this.ConversationList;
121
+ }
122
+ /** @deprecated Use {@link ConversationList}. */
123
+ set conversationList(value) {
124
+ this.ConversationList = value;
125
+ }
126
+ ChatArea;
127
+ /** @deprecated Use {@link ChatArea}. */
128
+ get chatArea() {
129
+ return this.ChatArea;
130
+ }
131
+ /** @deprecated Use {@link ChatArea}. */
132
+ set chatArea(value) {
133
+ this.ChatArea = value;
134
+ }
135
+ CurrentUser = null;
136
+ /** @deprecated Use {@link CurrentUser}. */
137
+ get currentUser() {
138
+ return this.CurrentUser;
139
+ }
140
+ /** @deprecated Use {@link CurrentUser}. */
141
+ set currentUser(value) {
142
+ this.CurrentUser = value;
143
+ }
108
144
  skipUrlUpdate = true; // Skip URL updates during initialization
109
145
  // Ready flag - blocks child rendering until AIEngine is initialized
110
- isReady = false;
146
+ IsReady = false;
147
+ /** @deprecated Use {@link IsReady}. */
148
+ get isReady() {
149
+ return this.IsReady;
150
+ }
151
+ /** @deprecated Use {@link IsReady}. */
152
+ set isReady(value) {
153
+ this.IsReady = value;
154
+ }
111
155
  // LOCAL SELECTION STATE - each wrapper instance manages its own selection
112
- selectedConversationId = null;
113
- selectedConversation = null;
114
- selectedThreadId = null;
115
- isNewUnsavedConversation = false;
116
- renamedConversationId = null;
117
- isSidebarCollapsed = false;
118
- isSidebarPinned = true; // Whether sidebar stays open after selection
119
- isMobileView = false;
120
- sidebarTransitionsEnabled = false; // Disabled during initial load to prevent jarring animation
121
- isSidebarSettingsLoaded = false; // Prevents UI flash while loading settings
156
+ SelectedConversationId = null;
157
+ /** @deprecated Use {@link SelectedConversationId}. */
158
+ get selectedConversationId() {
159
+ return this.SelectedConversationId;
160
+ }
161
+ /** @deprecated Use {@link SelectedConversationId}. */
162
+ set selectedConversationId(value) {
163
+ this.SelectedConversationId = value;
164
+ }
165
+ SelectedConversation = null;
166
+ /** @deprecated Use {@link SelectedConversation}. */
167
+ get selectedConversation() {
168
+ return this.SelectedConversation;
169
+ }
170
+ /** @deprecated Use {@link SelectedConversation}. */
171
+ set selectedConversation(value) {
172
+ this.SelectedConversation = value;
173
+ }
174
+ SelectedThreadId = null;
175
+ /** @deprecated Use {@link SelectedThreadId}. */
176
+ get selectedThreadId() {
177
+ return this.SelectedThreadId;
178
+ }
179
+ /** @deprecated Use {@link SelectedThreadId}. */
180
+ set selectedThreadId(value) {
181
+ this.SelectedThreadId = value;
182
+ }
183
+ IsNewUnsavedConversation = false;
184
+ /** @deprecated Use {@link IsNewUnsavedConversation}. */
185
+ get isNewUnsavedConversation() {
186
+ return this.IsNewUnsavedConversation;
187
+ }
188
+ /** @deprecated Use {@link IsNewUnsavedConversation}. */
189
+ set isNewUnsavedConversation(value) {
190
+ this.IsNewUnsavedConversation = value;
191
+ }
192
+ RenamedConversationId = null;
193
+ /** @deprecated Use {@link RenamedConversationId}. */
194
+ get renamedConversationId() {
195
+ return this.RenamedConversationId;
196
+ }
197
+ /** @deprecated Use {@link RenamedConversationId}. */
198
+ set renamedConversationId(value) {
199
+ this.RenamedConversationId = value;
200
+ }
201
+ IsSidebarCollapsed = false;
202
+ /** @deprecated Use {@link IsSidebarCollapsed}. */
203
+ get isSidebarCollapsed() {
204
+ return this.IsSidebarCollapsed;
205
+ }
206
+ /** @deprecated Use {@link IsSidebarCollapsed}. */
207
+ set isSidebarCollapsed(value) {
208
+ this.IsSidebarCollapsed = value;
209
+ }
210
+ IsSidebarPinned = true;
211
+ /** @deprecated Use {@link IsSidebarPinned}. */
212
+ get isSidebarPinned() {
213
+ return this.IsSidebarPinned;
214
+ }
215
+ /** @deprecated Use {@link IsSidebarPinned}. */
216
+ set isSidebarPinned(value) {
217
+ this.IsSidebarPinned = value;
218
+ } // Whether sidebar stays open after selection
219
+ IsMobileView = false;
220
+ /** @deprecated Use {@link IsMobileView}. */
221
+ get isMobileView() {
222
+ return this.IsMobileView;
223
+ }
224
+ /** @deprecated Use {@link IsMobileView}. */
225
+ set isMobileView(value) {
226
+ this.IsMobileView = value;
227
+ }
228
+ SidebarTransitionsEnabled = false;
229
+ /** @deprecated Use {@link SidebarTransitionsEnabled}. */
230
+ get sidebarTransitionsEnabled() {
231
+ return this.SidebarTransitionsEnabled;
232
+ }
233
+ /** @deprecated Use {@link SidebarTransitionsEnabled}. */
234
+ set sidebarTransitionsEnabled(value) {
235
+ this.SidebarTransitionsEnabled = value;
236
+ } // Disabled during initial load to prevent jarring animation
237
+ IsSidebarSettingsLoaded = false;
238
+ /** @deprecated Use {@link IsSidebarSettingsLoaded}. */
239
+ get isSidebarSettingsLoaded() {
240
+ return this.IsSidebarSettingsLoaded;
241
+ }
242
+ /** @deprecated Use {@link IsSidebarSettingsLoaded}. */
243
+ set isSidebarSettingsLoaded(value) {
244
+ this.IsSidebarSettingsLoaded = value;
245
+ } // Prevents UI flash while loading settings
122
246
  // Sidebar resize state
123
- sidebarWidth = 300; // Default width in pixels
247
+ SidebarWidth = 300;
248
+ /** @deprecated Use {@link SidebarWidth}. */
249
+ get sidebarWidth() {
250
+ return this.SidebarWidth;
251
+ }
252
+ /** @deprecated Use {@link SidebarWidth}. */
253
+ set sidebarWidth(value) {
254
+ this.SidebarWidth = value;
255
+ } // Default width in pixels
124
256
  isSidebarResizing = false;
125
257
  sidebarResizeStartX = 0;
126
258
  sidebarResizeStartWidth = 0;
127
259
  SIDEBAR_MIN_WIDTH = 200;
128
260
  SIDEBAR_MAX_WIDTH = 500;
129
261
  // Pending navigation state
130
- pendingArtifactId = null;
131
- pendingArtifactConversationId = null;
262
+ PendingArtifactId = null;
263
+ /** @deprecated Use {@link PendingArtifactId}. */
264
+ get pendingArtifactId() {
265
+ return this.PendingArtifactId;
266
+ }
267
+ /** @deprecated Use {@link PendingArtifactId}. */
268
+ set pendingArtifactId(value) {
269
+ this.PendingArtifactId = value;
270
+ }
271
+ PendingArtifactConversationId = null;
272
+ /** @deprecated Use {@link PendingArtifactConversationId}. */
273
+ get pendingArtifactConversationId() {
274
+ return this.PendingArtifactConversationId;
275
+ }
276
+ /** @deprecated Use {@link PendingArtifactConversationId}. */
277
+ set pendingArtifactConversationId(value) {
278
+ this.PendingArtifactConversationId = value;
279
+ }
132
280
  /**
133
281
  * A pending request to open the REALTIME SESSION REVIEW overlay (deep link /
134
282
  * cross-resource nav with `realtimeSessionId`, e.g. the AI Agent Session form's
@@ -137,10 +285,42 @@ let ChatConversationsResource = class ChatConversationsResource extends BaseReso
137
285
  * `await chatArea.OpenRealtimeSessionReview(agentSessionId)` (a NEW session starts
138
286
  * through the composer's phone button / `RealtimeSessionService.StartRealtimeSession`).
139
287
  */
140
- pendingRealtimeSessionId = null;
141
- pendingArtifactVersionNumber = null;
142
- pendingMessageToSend = null;
143
- pendingAttachmentsToSend = null;
288
+ PendingRealtimeSessionId = null;
289
+ /** @deprecated Use {@link PendingRealtimeSessionId}. */
290
+ get pendingRealtimeSessionId() {
291
+ return this.PendingRealtimeSessionId;
292
+ }
293
+ /** @deprecated Use {@link PendingRealtimeSessionId}. */
294
+ set pendingRealtimeSessionId(value) {
295
+ this.PendingRealtimeSessionId = value;
296
+ }
297
+ PendingArtifactVersionNumber = null;
298
+ /** @deprecated Use {@link PendingArtifactVersionNumber}. */
299
+ get pendingArtifactVersionNumber() {
300
+ return this.PendingArtifactVersionNumber;
301
+ }
302
+ /** @deprecated Use {@link PendingArtifactVersionNumber}. */
303
+ set pendingArtifactVersionNumber(value) {
304
+ this.PendingArtifactVersionNumber = value;
305
+ }
306
+ PendingMessageToSend = null;
307
+ /** @deprecated Use {@link PendingMessageToSend}. */
308
+ get pendingMessageToSend() {
309
+ return this.PendingMessageToSend;
310
+ }
311
+ /** @deprecated Use {@link PendingMessageToSend}. */
312
+ set pendingMessageToSend(value) {
313
+ this.PendingMessageToSend = value;
314
+ }
315
+ PendingAttachmentsToSend = null;
316
+ /** @deprecated Use {@link PendingAttachmentsToSend}. */
317
+ get pendingAttachmentsToSend() {
318
+ return this.PendingAttachmentsToSend;
319
+ }
320
+ /** @deprecated Use {@link PendingAttachmentsToSend}. */
321
+ set pendingAttachmentsToSend(value) {
322
+ this.PendingAttachmentsToSend = value;
323
+ }
144
324
  // User Settings persistence
145
325
  USER_SETTING_SIDEBAR_KEY = 'Conversations.SidebarState';
146
326
  saveSettingsTimeout = null;
@@ -158,15 +338,15 @@ let ChatConversationsResource = class ChatConversationsResource extends BaseReso
158
338
  async ngOnInit() {
159
339
  super.ngOnInit();
160
340
  const md = this.ProviderToUse;
161
- this.currentUser = md.CurrentUser;
341
+ this.CurrentUser = md.CurrentUser;
162
342
  // Check initial mobile state and set default collapsed
163
343
  this.checkMobileView();
164
- if (this.isMobileView) {
165
- this.isSidebarCollapsed = true;
166
- this.isSidebarSettingsLoaded = true; // Mobile uses defaults, no need to load from server
344
+ if (this.IsMobileView) {
345
+ this.IsSidebarCollapsed = true;
346
+ this.IsSidebarSettingsLoaded = true; // Mobile uses defaults, no need to load from server
167
347
  // Enable transitions after a brief delay to ensure initial state is applied
168
348
  setTimeout(() => {
169
- this.sidebarTransitionsEnabled = true;
349
+ this.SidebarTransitionsEnabled = true;
170
350
  }, 50);
171
351
  }
172
352
  else {
@@ -175,7 +355,7 @@ let ChatConversationsResource = class ChatConversationsResource extends BaseReso
175
355
  this.cdr.detectChanges();
176
356
  // Enable transitions after state is loaded and applied
177
357
  setTimeout(() => {
178
- this.sidebarTransitionsEnabled = true;
358
+ this.SidebarTransitionsEnabled = true;
179
359
  }, 50);
180
360
  });
181
361
  }
@@ -189,9 +369,9 @@ let ChatConversationsResource = class ChatConversationsResource extends BaseReso
189
369
  this.applyConfigurationParams();
190
370
  // Subscribe to actionable commands (open:resource) from the UI command handler service.
191
371
  // open:url commands are handled directly by the service; open:resource needs NavigationService.
192
- this.uiCommandHandler.actionableCommandRequested
372
+ this.uiCommandHandler.ActionableCommandRequested
193
373
  .pipe(takeUntil(this.destroy$))
194
- .subscribe(request => this.handleActionableCommand(request.command));
374
+ .subscribe(request => this.handleActionableCommand(request));
195
375
  // Subscribe to bridge switch events so the overlay can hand off a conversation to this workspace
196
376
  this.bridge.SwitchEvent$
197
377
  .pipe(takeUntil(this.destroy$))
@@ -234,19 +414,19 @@ let ChatConversationsResource = class ChatConversationsResource extends BaseReso
234
414
  // Initialize AIEngine, conversations, and mention service in parallel
235
415
  await Promise.all([
236
416
  AIEngineBase.Instance.Config(false),
237
- this.engine.LoadConversations(this.environmentId, this.currentUser, false),
238
- this.mentionAutocompleteService.initialize(this.currentUser)
417
+ this.engine.LoadConversations(this.EnvironmentId, this.CurrentUser, false),
418
+ this.mentionAutocompleteService.initialize(this.CurrentUser)
239
419
  ]);
240
420
  // Restore active tasks AFTER conversations are cached (uses in-memory lookup)
241
- await this.activeTasksService.restoreFromDatabase(this.currentUser);
421
+ await this.activeTasksService.restoreFromDatabase(this.CurrentUser);
242
422
  // Mark as ready - child components can now render
243
- this.isReady = true;
423
+ this.IsReady = true;
244
424
  this.cdr.detectChanges();
245
425
  }
246
426
  catch (error) {
247
427
  console.error('Failed to initialize AI engines:', error);
248
428
  // Still mark as ready so UI isn't blocked forever
249
- this.isReady = true;
429
+ this.IsReady = true;
250
430
  this.cdr.detectChanges();
251
431
  }
252
432
  }
@@ -260,7 +440,7 @@ let ChatConversationsResource = class ChatConversationsResource extends BaseReso
260
440
  // Try to get from cache first
261
441
  const conversation = this.engine.GetConversation(conversationId);
262
442
  if (conversation) {
263
- this.selectedConversation = conversation;
443
+ this.SelectedConversation = conversation;
264
444
  this.updateTabTitle();
265
445
  }
266
446
  // If not in cache, the chat area component will handle loading it
@@ -298,18 +478,26 @@ let ChatConversationsResource = class ChatConversationsResource extends BaseReso
298
478
  }
299
479
  console.log(`[Omnibar→Chat] wrapper: agent param '${agentName}' (req=${requestNonce ?? 'none'}) received — staging composer pre-address`);
300
480
  this.lastAppliedAgentParamKey = requestKey;
301
- this.isNewUnsavedConversation = true;
302
- this.selectedConversationId = null;
303
- this.selectedConversation = null;
481
+ this.IsNewUnsavedConversation = true;
482
+ this.SelectedConversationId = null;
483
+ this.SelectedConversation = null;
304
484
  // Resolved mention PILL (composerAgentMention) — matching the UX of typing
305
485
  // '@agent' and picking from the dropdown; pendingMessage would AUTO-SEND.
306
- this.pendingComposerAgentMention = agentName;
486
+ this.PendingComposerAgentMention = agentName;
307
487
  this.cdr.detectChanges();
308
488
  }
309
- pendingComposerAgentMention = null;
489
+ PendingComposerAgentMention = null;
490
+ /** @deprecated Use {@link PendingComposerAgentMention}. */
491
+ get pendingComposerAgentMention() {
492
+ return this.PendingComposerAgentMention;
493
+ }
494
+ /** @deprecated Use {@link PendingComposerAgentMention}. */
495
+ set pendingComposerAgentMention(value) {
496
+ this.PendingComposerAgentMention = value;
497
+ }
310
498
  lastAppliedAgentParamKey = null;
311
- onComposerAgentMentionConsumed() {
312
- this.pendingComposerAgentMention = null;
499
+ OnComposerAgentMentionConsumed() {
500
+ this.PendingComposerAgentMention = null;
313
501
  // Consume-and-clear: drop the agent params from the tab/URL so boots and
314
502
  // back/forward can't re-stage the pill. lastAppliedAgentParamKey is
315
503
  // intentionally NOT reset — a fresh omnibar re-tag (even of the same agent)
@@ -318,6 +506,10 @@ let ChatConversationsResource = class ChatConversationsResource extends BaseReso
318
506
  console.log(`[Omnibar→Chat] wrapper: pill applied — clearing agent param from URL`);
319
507
  this.clearAgentParamDeferred();
320
508
  }
509
+ /** @deprecated Use {@link OnComposerAgentMentionConsumed}. */
510
+ onComposerAgentMentionConsumed() {
511
+ return this.OnComposerAgentMentionConsumed();
512
+ }
321
513
  /**
322
514
  * Clears the agent pre-address params OUTSIDE any OnQueryParamsChanged delivery:
323
515
  * UpdateQueryParams is suppressed synchronously during delivery, so an inline
@@ -334,44 +526,44 @@ let ChatConversationsResource = class ChatConversationsResource extends BaseReso
334
526
  const qp = config['queryParams'];
335
527
  this.applyAgentParam(qp?.['agent'], qp?.['agentReq']);
336
528
  const search = typeof window !== 'undefined' ? window.location.search : '';
337
- const conversationId = resolveDeepLinkParam('conversationId', search, qp, config.conversationId);
338
- const artifactId = resolveDeepLinkParam('artifactId', search, qp, config.artifactId);
529
+ const conversationId = ResolveDeepLinkParam('conversationId', search, qp, config.conversationId);
530
+ const artifactId = ResolveDeepLinkParam('artifactId', search, qp, config.artifactId);
339
531
  // Resolved the same URL-first way as artifactId above: pairing a URL artifact with the
340
532
  // previous visit's version number would open the wrong version of the right artifact.
341
- const rawVersion = resolveDeepLinkParam('versionNumber', search, qp, config.versionNumber != null ? String(config.versionNumber) : undefined);
533
+ const rawVersion = ResolveDeepLinkParam('versionNumber', search, qp, config.versionNumber != null ? String(config.versionNumber) : undefined);
342
534
  const versionNumber = rawVersion ? parseInt(rawVersion, 10) : null;
343
535
  // Set pending artifact if provided
344
536
  if (artifactId) {
345
- this.pendingArtifactId = artifactId;
346
- this.pendingArtifactConversationId = conversationId || null;
347
- this.pendingArtifactVersionNumber = versionNumber;
537
+ this.PendingArtifactId = artifactId;
538
+ this.PendingArtifactConversationId = conversationId || null;
539
+ this.PendingArtifactVersionNumber = versionNumber;
348
540
  }
349
541
  // Set conversationId synchronously so child components see it immediately
350
542
  if (conversationId) {
351
- this.selectedConversationId = conversationId;
543
+ this.SelectedConversationId = conversationId;
352
544
  this.bridge.SetActiveFromWorkspace(conversationId);
353
- this.isNewUnsavedConversation = false;
545
+ this.IsNewUnsavedConversation = false;
354
546
  // Load entity asynchronously
355
547
  this.loadConversationEntity(conversationId);
356
548
  }
357
549
  const realtimeSessionId = qp?.['realtimeSessionId'] || config['realtimeSessionId'];
358
550
  if (realtimeSessionId) {
359
- this.pendingRealtimeSessionId = realtimeSessionId;
551
+ this.PendingRealtimeSessionId = realtimeSessionId;
360
552
  this.applyPendingRealtimeSessionReview();
361
553
  }
362
554
  }
363
555
  /** Opens the pending realtime session review once the chat area exists (retries next tick while it renders). */
364
556
  applyPendingRealtimeSessionReview() {
365
- const sessionId = this.pendingRealtimeSessionId;
557
+ const sessionId = this.PendingRealtimeSessionId;
366
558
  if (!sessionId) {
367
559
  return;
368
560
  }
369
- if (!this.chatArea) {
561
+ if (!this.ChatArea) {
370
562
  setTimeout(() => this.applyPendingRealtimeSessionReview(), 50);
371
563
  return;
372
564
  }
373
- this.pendingRealtimeSessionId = null;
374
- void this.chatArea.OpenRealtimeSessionReview(sessionId).then((opened) => {
565
+ this.PendingRealtimeSessionId = null;
566
+ void this.ChatArea.OpenRealtimeSessionReview(sessionId).then((opened) => {
375
567
  if (!opened) {
376
568
  console.warn(`Chat: could not open realtime session review for '${sessionId}'`);
377
569
  }
@@ -388,17 +580,17 @@ let ChatConversationsResource = class ChatConversationsResource extends BaseReso
388
580
  this.applyAgentParam(params['agent'], params['agentReq']);
389
581
  const realtimeSessionId = params['realtimeSessionId'] || null;
390
582
  if (realtimeSessionId) {
391
- this.pendingRealtimeSessionId = realtimeSessionId;
583
+ this.PendingRealtimeSessionId = realtimeSessionId;
392
584
  this.applyPendingRealtimeSessionReview();
393
585
  }
394
586
  const conversationId = params['conversationId'] || null;
395
587
  const artifactId = params['artifactId'] || null;
396
588
  const versionNumber = params['versionNumber'] ? parseInt(params['versionNumber'], 10) : null;
397
589
  // Reflect any artifact intent so the chat area can open it.
398
- this.pendingArtifactId = artifactId;
399
- this.pendingArtifactConversationId = artifactId ? conversationId : null;
400
- this.pendingArtifactVersionNumber = versionNumber;
401
- if (conversationId && conversationId !== this.selectedConversationId) {
590
+ this.PendingArtifactId = artifactId;
591
+ this.PendingArtifactConversationId = artifactId ? conversationId : null;
592
+ this.PendingArtifactVersionNumber = versionNumber;
593
+ if (conversationId && conversationId !== this.SelectedConversationId) {
402
594
  // The URL is already the source of truth here — suppress the echo back to it.
403
595
  // selectConversation()'s body is synchronous up to its URL-update check, so
404
596
  // toggling the flag around the call reliably gates that check.
@@ -417,19 +609,19 @@ let ChatConversationsResource = class ChatConversationsResource extends BaseReso
417
609
  * Select a conversation by ID - loads the entity and updates local state
418
610
  */
419
611
  async selectConversation(conversationId) {
420
- this.selectedConversationId = conversationId;
421
- this.isNewUnsavedConversation = false;
612
+ this.SelectedConversationId = conversationId;
613
+ this.IsNewUnsavedConversation = false;
422
614
  // Keep bridge in sync so other consumers (toast suppression, overlay) know
423
615
  // which conversation the workspace is viewing
424
616
  this.bridge.SetActiveFromWorkspace(conversationId);
425
617
  // Load the conversation entity from data service
426
618
  const conversation = this.engine.GetConversation(conversationId);
427
619
  if (conversation) {
428
- this.selectedConversation = conversation;
620
+ this.SelectedConversation = conversation;
429
621
  }
430
622
  else {
431
623
  // Conversation might not be loaded yet - the chat area will handle loading
432
- this.selectedConversation = null;
624
+ this.SelectedConversation = null;
433
625
  }
434
626
  // Update URL if not skipping
435
627
  if (!this.skipUrlUpdate) {
@@ -443,17 +635,17 @@ let ChatConversationsResource = class ChatConversationsResource extends BaseReso
443
635
  updateUrl() {
444
636
  const queryParams = {};
445
637
  // Add conversation ID
446
- if (this.selectedConversationId) {
447
- queryParams['conversationId'] = this.selectedConversationId;
638
+ if (this.SelectedConversationId) {
639
+ queryParams['conversationId'] = this.SelectedConversationId;
448
640
  }
449
641
  else {
450
642
  queryParams['conversationId'] = null;
451
643
  }
452
644
  // Add artifact ID if we have a pending artifact (will be cleared once opened)
453
- if (this.pendingArtifactId) {
454
- queryParams['artifactId'] = this.pendingArtifactId;
455
- if (this.pendingArtifactVersionNumber) {
456
- queryParams['versionNumber'] = this.pendingArtifactVersionNumber.toString();
645
+ if (this.PendingArtifactId) {
646
+ queryParams['artifactId'] = this.PendingArtifactId;
647
+ if (this.PendingArtifactVersionNumber) {
648
+ queryParams['versionNumber'] = this.PendingArtifactVersionNumber.toString();
457
649
  }
458
650
  }
459
651
  else {
@@ -473,11 +665,11 @@ let ChatConversationsResource = class ChatConversationsResource extends BaseReso
473
665
  * Update the tab/browser title based on the currently selected conversation.
474
666
  */
475
667
  updateTabTitle() {
476
- if (this.isNewUnsavedConversation || !this.selectedConversation) {
668
+ if (this.IsNewUnsavedConversation || !this.SelectedConversation) {
477
669
  this.NotifyDisplayNameChanged('Conversations');
478
670
  return;
479
671
  }
480
- const name = this.selectedConversation.Name;
672
+ const name = this.SelectedConversation.Name;
481
673
  if (name) {
482
674
  this.NotifyDisplayNameChanged(name);
483
675
  }
@@ -485,9 +677,13 @@ let ChatConversationsResource = class ChatConversationsResource extends BaseReso
485
677
  /**
486
678
  * Get the environment ID from configuration or use default
487
679
  */
488
- get environmentId() {
680
+ get EnvironmentId() {
489
681
  return this.Data?.Configuration?.environmentId || MJEnvironmentEntityExtended.DefaultEnvironmentID;
490
682
  }
683
+ /** @deprecated Use {@link EnvironmentId}. */
684
+ get environmentId() {
685
+ return this.EnvironmentId;
686
+ }
491
687
  /**
492
688
  * Get the display name for chat conversations
493
689
  */
@@ -513,43 +709,55 @@ let ChatConversationsResource = class ChatConversationsResource extends BaseReso
513
709
  * After the list refreshes, also reload messages in the active chat area so any
514
710
  * new agent responses are visible without a full page reload.
515
711
  */
712
+ OnRefreshRequested() {
713
+ void this.ChatArea?.reloadMessages();
714
+ }
715
+ /** @deprecated Use {@link OnRefreshRequested}. */
516
716
  onRefreshRequested() {
517
- void this.chatArea?.reloadMessages();
717
+ return this.OnRefreshRequested();
518
718
  }
519
719
  /**
520
720
  * Handle conversation deletion from the list.
521
721
  * If the deleted conversation was selected, navigate to the first remaining conversation.
522
722
  */
523
- onConversationDeleted(deletedId) {
524
- if (this.selectedConversationId === deletedId) {
723
+ OnConversationDeleted(deletedId) {
724
+ if (this.SelectedConversationId === deletedId) {
525
725
  const remaining = this.engine.Conversations.filter(c => !UUIDsEqual(c.ID, deletedId));
526
726
  if (remaining.length > 0) {
527
727
  void this.selectConversation(remaining[0].ID);
528
728
  this.updateUrl();
529
729
  }
530
730
  else {
531
- this.selectedConversationId = null;
532
- this.selectedConversation = null;
533
- this.selectedThreadId = null;
534
- this.isNewUnsavedConversation = true;
731
+ this.SelectedConversationId = null;
732
+ this.SelectedConversation = null;
733
+ this.SelectedThreadId = null;
734
+ this.IsNewUnsavedConversation = true;
535
735
  this.updateUrl();
536
736
  }
537
737
  }
538
738
  }
739
+ /** @deprecated Use {@link OnConversationDeleted}. */
740
+ onConversationDeleted(deletedId) {
741
+ return this.OnConversationDeleted(deletedId);
742
+ }
539
743
  /**
540
744
  * Handle conversation selection from the list
541
745
  */
542
- async onConversationSelected(conversationId) {
746
+ async OnConversationSelected(conversationId) {
543
747
  await this.selectConversation(conversationId);
544
- this.selectedThreadId = null; // Clear thread when switching conversations
545
- this.isNewUnsavedConversation = false;
748
+ this.SelectedThreadId = null; // Clear thread when switching conversations
749
+ this.IsNewUnsavedConversation = false;
546
750
  this.updateUrl();
547
751
  this.updateTabTitle();
548
752
  // Auto-collapse if mobile OR if sidebar is not pinned
549
- if (this.isMobileView || !this.isSidebarPinned) {
550
- this.collapseSidebar();
753
+ if (this.IsMobileView || !this.IsSidebarPinned) {
754
+ this.CollapseSidebar();
551
755
  }
552
756
  }
757
+ /** @deprecated Use {@link OnConversationSelected}. */
758
+ async onConversationSelected(conversationId) {
759
+ return this.OnConversationSelected(conversationId);
760
+ }
553
761
  onWindowResize() {
554
762
  this.checkMobileView();
555
763
  }
@@ -558,7 +766,7 @@ let ChatConversationsResource = class ChatConversationsResource extends BaseReso
558
766
  */
559
767
  onDocumentClick(event) {
560
768
  // Only handle when sidebar is expanded but unpinned
561
- if (this.isSidebarCollapsed || this.isSidebarPinned) {
769
+ if (this.IsSidebarCollapsed || this.IsSidebarPinned) {
562
770
  return;
563
771
  }
564
772
  // Check if click is outside the sidebar
@@ -567,48 +775,60 @@ let ChatConversationsResource = class ChatConversationsResource extends BaseReso
567
775
  const expandHandle = target.closest('.sidebar-expand-handle');
568
776
  // If click is outside sidebar and expand handle, collapse it
569
777
  if (!sidebarElement && !expandHandle) {
570
- this.collapseSidebar();
778
+ this.CollapseSidebar();
571
779
  }
572
780
  }
573
781
  /**
574
782
  * Check if we're in mobile view and handle state accordingly
575
783
  */
576
784
  checkMobileView() {
577
- const wasMobile = this.isMobileView;
578
- this.isMobileView = window.innerWidth < 768;
579
- if (this.isMobileView && !wasMobile) {
785
+ const wasMobile = this.IsMobileView;
786
+ this.IsMobileView = window.innerWidth < 768;
787
+ if (this.IsMobileView && !wasMobile) {
580
788
  // Switched to mobile - default to collapsed
581
- this.isSidebarCollapsed = true;
789
+ this.IsSidebarCollapsed = true;
582
790
  }
583
791
  }
584
792
  /**
585
793
  * Collapse sidebar
586
794
  */
795
+ CollapseSidebar() {
796
+ this.IsSidebarCollapsed = true;
797
+ }
798
+ /** @deprecated Use {@link CollapseSidebar}. */
587
799
  collapseSidebar() {
588
- this.isSidebarCollapsed = true;
800
+ return this.CollapseSidebar();
589
801
  }
590
802
  /**
591
803
  * Expand sidebar (pinned - stays open until unpinned)
592
804
  */
593
- expandSidebar() {
594
- this.isSidebarCollapsed = false;
595
- this.isSidebarPinned = true; // Pin it so it stays open
805
+ ExpandSidebar() {
806
+ this.IsSidebarCollapsed = false;
807
+ this.IsSidebarPinned = true; // Pin it so it stays open
596
808
  this.saveSidebarState();
597
809
  }
810
+ /** @deprecated Use {@link ExpandSidebar}. */
811
+ expandSidebar() {
812
+ return this.ExpandSidebar();
813
+ }
598
814
  /**
599
815
  * Handle sidebar resize start
600
816
  */
601
- onSidebarResizeStart(event) {
817
+ OnSidebarResizeStart(event) {
602
818
  event.preventDefault();
603
819
  this.isSidebarResizing = true;
604
820
  this.sidebarResizeStartX = event.clientX;
605
- this.sidebarResizeStartWidth = this.sidebarWidth;
821
+ this.sidebarResizeStartWidth = this.SidebarWidth;
606
822
  // Disable transitions during resize for immediate feedback
607
- this.sidebarTransitionsEnabled = false;
823
+ this.SidebarTransitionsEnabled = false;
608
824
  // Add event listeners for mousemove and mouseup
609
825
  document.addEventListener('mousemove', this.onSidebarResizeMove);
610
826
  document.addEventListener('mouseup', this.onSidebarResizeEnd);
611
827
  }
828
+ /** @deprecated Use {@link OnSidebarResizeStart}. */
829
+ onSidebarResizeStart(event) {
830
+ return this.OnSidebarResizeStart(event);
831
+ }
612
832
  /**
613
833
  * Handle sidebar resize move (bound method for proper 'this' context)
614
834
  */
@@ -618,7 +838,7 @@ let ChatConversationsResource = class ChatConversationsResource extends BaseReso
618
838
  const delta = event.clientX - this.sidebarResizeStartX;
619
839
  const newWidth = this.sidebarResizeStartWidth + delta;
620
840
  // Clamp to min/max bounds
621
- this.sidebarWidth = Math.max(this.SIDEBAR_MIN_WIDTH, Math.min(this.SIDEBAR_MAX_WIDTH, newWidth));
841
+ this.SidebarWidth = Math.max(this.SIDEBAR_MIN_WIDTH, Math.min(this.SIDEBAR_MAX_WIDTH, newWidth));
622
842
  this.cdr.detectChanges();
623
843
  };
624
844
  /**
@@ -629,7 +849,7 @@ let ChatConversationsResource = class ChatConversationsResource extends BaseReso
629
849
  return;
630
850
  this.isSidebarResizing = false;
631
851
  // Re-enable transitions for collapse/expand animations
632
- this.sidebarTransitionsEnabled = true;
852
+ this.SidebarTransitionsEnabled = true;
633
853
  // Remove event listeners
634
854
  document.removeEventListener('mousemove', this.onSidebarResizeMove);
635
855
  document.removeEventListener('mouseup', this.onSidebarResizeEnd);
@@ -639,18 +859,26 @@ let ChatConversationsResource = class ChatConversationsResource extends BaseReso
639
859
  /**
640
860
  * Pin sidebar - keep it open after selection
641
861
  */
642
- pinSidebar() {
643
- this.isSidebarPinned = true;
862
+ PinSidebar() {
863
+ this.IsSidebarPinned = true;
644
864
  this.saveSidebarState();
645
865
  }
866
+ /** @deprecated Use {@link PinSidebar}. */
867
+ pinSidebar() {
868
+ return this.PinSidebar();
869
+ }
646
870
  /**
647
871
  * Unpin sidebar - will auto-collapse on next selection
648
872
  */
649
- unpinSidebar() {
650
- this.isSidebarPinned = false;
651
- this.collapseSidebar();
873
+ UnpinSidebar() {
874
+ this.IsSidebarPinned = false;
875
+ this.CollapseSidebar();
652
876
  this.saveSidebarState();
653
877
  }
878
+ /** @deprecated Use {@link UnpinSidebar}. */
879
+ unpinSidebar() {
880
+ return this.UnpinSidebar();
881
+ }
654
882
  /**
655
883
  * Save sidebar state to User Settings (server only - no localStorage fallback)
656
884
  * Uses debouncing to avoid excessive database writes
@@ -669,14 +897,14 @@ let ChatConversationsResource = class ChatConversationsResource extends BaseReso
669
897
  */
670
898
  async saveSidebarStateToServer() {
671
899
  try {
672
- const userId = this.currentUser?.ID;
900
+ const userId = this.CurrentUser?.ID;
673
901
  if (!userId) {
674
902
  return;
675
903
  }
676
904
  const stateToSave = {
677
- collapsed: this.isSidebarCollapsed,
678
- pinned: this.isSidebarPinned,
679
- width: this.sidebarWidth
905
+ collapsed: this.IsSidebarCollapsed,
906
+ pinned: this.IsSidebarPinned,
907
+ width: this.SidebarWidth
680
908
  };
681
909
  const engine = UserInfoEngine.Instance;
682
910
  const md = this.ProviderToUse;
@@ -701,126 +929,154 @@ let ChatConversationsResource = class ChatConversationsResource extends BaseReso
701
929
  */
702
930
  async loadSidebarState() {
703
931
  try {
704
- const userId = this.currentUser?.ID;
932
+ const userId = this.CurrentUser?.ID;
705
933
  if (userId) {
706
934
  // Load from cached User Settings
707
935
  const engine = UserInfoEngine.Instance;
708
936
  const setting = engine.UserSettings.find(s => s.Setting === this.USER_SETTING_SIDEBAR_KEY);
709
937
  if (setting?.Value) {
710
938
  const state = JSON.parse(setting.Value);
711
- this.isSidebarCollapsed = state.collapsed ?? true;
712
- this.isSidebarPinned = state.pinned ?? false;
713
- this.sidebarWidth = state.width ?? 300;
939
+ this.IsSidebarCollapsed = state.collapsed ?? true;
940
+ this.IsSidebarPinned = state.pinned ?? false;
941
+ this.SidebarWidth = state.width ?? 300;
714
942
  // Clamp width to valid range
715
- this.sidebarWidth = Math.max(this.SIDEBAR_MIN_WIDTH, Math.min(this.SIDEBAR_MAX_WIDTH, this.sidebarWidth));
716
- this.isSidebarSettingsLoaded = true;
943
+ this.SidebarWidth = Math.max(this.SIDEBAR_MIN_WIDTH, Math.min(this.SIDEBAR_MAX_WIDTH, this.SidebarWidth));
944
+ this.IsSidebarSettingsLoaded = true;
717
945
  return;
718
946
  }
719
947
  }
720
948
  // No saved state found - NEW USER DEFAULT:
721
949
  // Start with sidebar collapsed and show new conversation screen
722
- this.isSidebarCollapsed = true;
723
- this.isSidebarPinned = false;
724
- this.sidebarWidth = 300;
725
- this.isNewUnsavedConversation = true;
726
- this.isSidebarSettingsLoaded = true;
950
+ this.IsSidebarCollapsed = true;
951
+ this.IsSidebarPinned = false;
952
+ this.SidebarWidth = 300;
953
+ this.IsNewUnsavedConversation = true;
954
+ this.IsSidebarSettingsLoaded = true;
727
955
  }
728
956
  catch (error) {
729
957
  console.warn('Failed to load sidebar state:', error);
730
958
  // Default to collapsed for new users on error
731
- this.isSidebarCollapsed = true;
732
- this.isSidebarPinned = false;
733
- this.sidebarWidth = 300;
734
- this.isSidebarSettingsLoaded = true;
959
+ this.IsSidebarCollapsed = true;
960
+ this.IsSidebarPinned = false;
961
+ this.SidebarWidth = 300;
962
+ this.IsSidebarSettingsLoaded = true;
735
963
  }
736
964
  }
737
965
  /**
738
966
  * Handle new conversation request from the list
739
967
  */
740
- onNewConversationRequested() {
741
- this.selectedConversationId = null;
742
- this.selectedConversation = null;
743
- this.selectedThreadId = null;
744
- this.isNewUnsavedConversation = true;
968
+ OnNewConversationRequested() {
969
+ this.SelectedConversationId = null;
970
+ this.SelectedConversation = null;
971
+ this.SelectedThreadId = null;
972
+ this.IsNewUnsavedConversation = true;
745
973
  this.updateUrl();
746
974
  this.NotifyDisplayNameChanged('New Conversation');
747
975
  // Auto-collapse if mobile OR if sidebar is not pinned
748
- if (this.isMobileView || !this.isSidebarPinned) {
749
- this.collapseSidebar();
976
+ if (this.IsMobileView || !this.IsSidebarPinned) {
977
+ this.CollapseSidebar();
750
978
  }
751
979
  }
980
+ /** @deprecated Use {@link OnNewConversationRequested}. */
981
+ onNewConversationRequested() {
982
+ return this.OnNewConversationRequested();
983
+ }
752
984
  /**
753
985
  * Handle conversation created from chat area (after first message in new conversation).
754
986
  * The event now includes pending message and attachments for atomic state update.
755
987
  */
756
- async onConversationCreated(event) {
988
+ async OnConversationCreated(event) {
757
989
  // Set ALL state atomically before Angular change detection runs
758
- this.pendingMessageToSend = event.pendingMessage || null;
759
- this.pendingAttachmentsToSend = event.pendingAttachments || null;
760
- this.selectedConversationId = event.conversation.ID;
761
- this.selectedConversation = event.conversation;
762
- this.isNewUnsavedConversation = false;
990
+ this.PendingMessageToSend = event.pendingMessage || null;
991
+ this.PendingAttachmentsToSend = event.pendingAttachments || null;
992
+ this.SelectedConversationId = event.conversation.ID;
993
+ this.SelectedConversation = event.conversation;
994
+ this.IsNewUnsavedConversation = false;
763
995
  this.bridge.SetActiveFromWorkspace(event.conversation.ID);
764
996
  this.updateUrl();
765
997
  this.updateTabTitle();
766
998
  }
999
+ /** @deprecated Use {@link OnConversationCreated}. */
1000
+ async onConversationCreated(event) {
1001
+ return this.OnConversationCreated(event);
1002
+ }
767
1003
  /**
768
1004
  * Handle conversation rename event
769
1005
  */
770
- onConversationRenamed(event) {
1006
+ OnConversationRenamed(event) {
771
1007
  // Trigger rename animation in the list
772
- this.renamedConversationId = event.conversationId;
1008
+ this.RenamedConversationId = event.conversationId;
773
1009
  // Update tab title with the new name
774
1010
  if (event.name) {
775
1011
  this.NotifyDisplayNameChanged(event.name);
776
1012
  }
777
1013
  // Clear the animation trigger after it completes
778
1014
  setTimeout(() => {
779
- this.renamedConversationId = null;
1015
+ this.RenamedConversationId = null;
780
1016
  }, 1500);
781
1017
  }
1018
+ /** @deprecated Use {@link OnConversationRenamed}. */
1019
+ onConversationRenamed(event) {
1020
+ return this.OnConversationRenamed(event);
1021
+ }
782
1022
  /**
783
1023
  * Handle thread opened event
784
1024
  */
1025
+ OnThreadOpened(threadId) {
1026
+ this.SelectedThreadId = threadId;
1027
+ }
1028
+ /** @deprecated Use {@link OnThreadOpened}. */
785
1029
  onThreadOpened(threadId) {
786
- this.selectedThreadId = threadId;
1030
+ return this.OnThreadOpened(threadId);
787
1031
  }
788
1032
  /**
789
1033
  * Handle thread closed event
790
1034
  */
1035
+ OnThreadClosed() {
1036
+ this.SelectedThreadId = null;
1037
+ }
1038
+ /** @deprecated Use {@link OnThreadClosed}. */
791
1039
  onThreadClosed() {
792
- this.selectedThreadId = null;
1040
+ return this.OnThreadClosed();
793
1041
  }
794
1042
  /**
795
1043
  * Handle pending artifact consumed event
796
1044
  */
797
- onPendingArtifactConsumed() {
798
- this.pendingArtifactId = null;
799
- this.pendingArtifactConversationId = null;
800
- this.pendingArtifactVersionNumber = null;
1045
+ OnPendingArtifactConsumed() {
1046
+ this.PendingArtifactId = null;
1047
+ this.PendingArtifactConversationId = null;
1048
+ this.PendingArtifactVersionNumber = null;
801
1049
  // Update URL to remove artifact params
802
1050
  this.updateUrl();
803
1051
  }
1052
+ /** @deprecated Use {@link OnPendingArtifactConsumed}. */
1053
+ onPendingArtifactConsumed() {
1054
+ return this.OnPendingArtifactConsumed();
1055
+ }
804
1056
  /**
805
1057
  * Handle pending message consumed event
806
1058
  */
1059
+ OnPendingMessageConsumed() {
1060
+ this.PendingMessageToSend = null;
1061
+ this.PendingAttachmentsToSend = null;
1062
+ }
1063
+ /** @deprecated Use {@link OnPendingMessageConsumed}. */
807
1064
  onPendingMessageConsumed() {
808
- this.pendingMessageToSend = null;
809
- this.pendingAttachmentsToSend = null;
1065
+ return this.OnPendingMessageConsumed();
810
1066
  }
811
1067
  /**
812
1068
  * Handle pending message requested event (from empty state creating conversation).
813
1069
  * @deprecated Use onConversationCreated with pendingMessage instead - this is kept for backwards compatibility.
814
1070
  */
815
1071
  onPendingMessageRequested(event) {
816
- this.pendingMessageToSend = event.text;
817
- this.pendingAttachmentsToSend = event.attachments || null;
1072
+ this.PendingMessageToSend = event.text;
1073
+ this.PendingAttachmentsToSend = event.attachments || null;
818
1074
  }
819
1075
  /**
820
1076
  * Handle navigation request from artifact viewer panel within the chat area.
821
1077
  * Converts the link event to a generic navigation request and uses NavigationService.
822
1078
  */
823
- onArtifactLinkClicked(event) {
1079
+ OnArtifactLinkClicked(event) {
824
1080
  // Map the link type to the nav item name
825
1081
  const navItemName = event.type === 'conversation' ? 'Conversations' : 'Collections';
826
1082
  // Build configuration params to pass to the target resource
@@ -841,23 +1097,76 @@ let ChatConversationsResource = class ChatConversationsResource extends BaseReso
841
1097
  // Navigate using the generic nav item method
842
1098
  this.navigationService.OpenNavItemByName(navItemName, params);
843
1099
  }
1100
+ /** @deprecated Use {@link OnArtifactLinkClicked}. */
1101
+ onArtifactLinkClicked(event) {
1102
+ return this.OnArtifactLinkClicked(event);
1103
+ }
844
1104
  /**
845
1105
  * Handle entity record open request from chat area (from React component grids).
846
1106
  * Uses NavigationService to open the record in a new tab.
847
1107
  */
848
- onOpenEntityRecord(event) {
1108
+ OnOpenEntityRecord(event) {
849
1109
  this.navigationService.OpenEntityRecord(event.entityName, event.compositeKey);
850
1110
  }
1111
+ // ========================================
1112
+ // CROSS-ENTITY SEARCH PANEL
1113
+ // ========================================
1114
+ /** Whether the cross-entity search panel is open. */
1115
+ IsSearchPanelOpen = false;
1116
+ /** Term the panel opens with, handed over from the conversation list's own filter. */
1117
+ SearchSeedQuery = '';
1118
+ /**
1119
+ * Open the cross-entity search panel, carrying over the term the user had already typed
1120
+ * into the conversation list's filter so they do not retype it.
1121
+ */
1122
+ OpenSearch(query = '') {
1123
+ this.SearchSeedQuery = query;
1124
+ this.IsSearchPanelOpen = true;
1125
+ }
1126
+ /** Close the cross-entity search panel. */
1127
+ CloseSearch() {
1128
+ this.IsSearchPanelOpen = false;
1129
+ }
1130
+ /**
1131
+ * Route a search result to the right Explorer surface.
1132
+ *
1133
+ * Explorer renders each chat surface as a separate resource, so results for another
1134
+ * surface go through NavigationService. Conversations and messages resolve to a
1135
+ * conversation, which this component owns, so they are selected in place.
1136
+ */
1137
+ OnSearchResultSelected(result) {
1138
+ this.CloseSearch();
1139
+ const route = ResolveChatSearchRoute(result);
1140
+ switch (route?.Kind) {
1141
+ case 'conversation':
1142
+ void this.OnConversationSelected(route.ConversationId);
1143
+ break;
1144
+ case 'artifact':
1145
+ this.navigationService.OpenArtifact(route.ArtifactId, route.Title);
1146
+ break;
1147
+ case 'nav-item':
1148
+ void this.navigationService.OpenNavItemByName(route.NavItemName, route.Configuration);
1149
+ break;
1150
+ }
1151
+ }
1152
+ /** @deprecated Use {@link OnOpenEntityRecord}. */
1153
+ onOpenEntityRecord(event) {
1154
+ return this.OnOpenEntityRecord(event);
1155
+ }
851
1156
  /**
852
1157
  * Handle navigation request from artifact viewer plugins.
853
1158
  * Opens the target nav item (switching apps if needed) then applies query params to the URL.
854
1159
  */
855
- async onNavigationRequest(event) {
1160
+ async OnNavigationRequest(event) {
856
1161
  const appId = event.appName ? this.resolveAppId(event.appName) : undefined;
857
1162
  await this.navigationService.OpenNavItemByName(event.navItemName, undefined, appId, {
858
1163
  queryParams: event.queryParams
859
1164
  });
860
1165
  }
1166
+ /** @deprecated Use {@link OnNavigationRequest}. */
1167
+ async onNavigationRequest(event) {
1168
+ return this.OnNavigationRequest(event);
1169
+ }
861
1170
  /**
862
1171
  * Resolve an application name to its ID.
863
1172
  */
@@ -868,10 +1177,12 @@ let ChatConversationsResource = class ChatConversationsResource extends BaseReso
868
1177
  return app?.ID;
869
1178
  }
870
1179
  /**
871
- * Handle actionable commands that require app-specific navigation (open:resource).
872
- * open:url commands are already handled directly by UICommandHandlerService.
1180
+ * Handle actionable commands that require app-specific navigation (open:resource, and the
1181
+ * compose:email over-length fallback). open:url commands are already handled directly by
1182
+ * UICommandHandlerService.
873
1183
  */
874
- handleActionableCommand(command) {
1184
+ handleActionableCommand(request) {
1185
+ const command = request.command;
875
1186
  if (command.type === 'open:resource') {
876
1187
  const resourceCommand = command;
877
1188
  if (resourceCommand.resourceType === 'Record') {
@@ -885,6 +1196,31 @@ let ChatConversationsResource = class ChatConversationsResource extends BaseReso
885
1196
  this.openMostRecentArtifact();
886
1197
  }
887
1198
  }
1199
+ else if (command.type === 'compose:email') {
1200
+ // The service handles compose:email directly whenever the draft fits in a mailto: URL, so
1201
+ // reaching here means it did NOT fit. Opening the mail client would hand the user a draft
1202
+ // with the body silently truncated, so the service declined and handed it to us instead —
1203
+ // our job is to show the full draft, which lives in the artifact.
1204
+ this.openComposeEmailDraft(command, request.DraftCopiedToClipboard === true);
1205
+ }
1206
+ }
1207
+ /**
1208
+ * The compose:email over-length fallback: open the draft artifact and tell the user why their
1209
+ * mail client did not open.
1210
+ *
1211
+ * With no artifactId (it is optional) the conversation's latest artifact opens, since for a
1212
+ * single-artifact turn that IS the draft. A stated artifactId that is not loaded opens nothing:
1213
+ * a different artifact would be passed off as the draft. Every outcome, including "nothing to
1214
+ * open", ends in one notification, so the button never does nothing visible.
1215
+ */
1216
+ openComposeEmailDraft(command, copiedToClipboard) {
1217
+ const target = ResolveComposeEmailDraft(this.ChatArea?.ArtifactsByDetailId.values() ?? [], command.artifactId);
1218
+ if (this.ChatArea && (target.Kind === 'stated' || target.Kind === 'most-recent')) {
1219
+ void this.ChatArea.OnArtifactClicked({ artifactId: target.Artifact.ArtifactId, versionId: target.Artifact.ArtifactVersionId });
1220
+ }
1221
+ const notice = BuildComposeEmailFallbackNotice(target, copiedToClipboard);
1222
+ // Longer than the default: the notice is two sentences and explains a changed clipboard.
1223
+ MJNotificationService.Instance?.CreateSimpleNotification(notice.Message, notice.Style, 7000);
888
1224
  }
889
1225
  /**
890
1226
  * Open the most recent artifact in the active conversation's artifact viewer.
@@ -892,10 +1228,10 @@ let ChatConversationsResource = class ChatConversationsResource extends BaseReso
892
1228
  * the resourceId is an agent-internal ID, not a database artifact ID.
893
1229
  */
894
1230
  openMostRecentArtifact() {
895
- if (!this.chatArea)
1231
+ if (!this.ChatArea)
896
1232
  return;
897
1233
  // Find the last artifact across all messages
898
- const artifactMap = this.chatArea.artifactsByDetailId;
1234
+ const artifactMap = this.ChatArea.artifactsByDetailId;
899
1235
  let latestArtifact = null;
900
1236
  for (const artifacts of artifactMap.values()) {
901
1237
  if (artifacts.length > 0) {
@@ -907,7 +1243,7 @@ let ChatConversationsResource = class ChatConversationsResource extends BaseReso
907
1243
  }
908
1244
  }
909
1245
  if (latestArtifact) {
910
- this.chatArea.onArtifactClicked(latestArtifact);
1246
+ this.ChatArea.onArtifactClicked(latestArtifact);
911
1247
  }
912
1248
  else {
913
1249
  console.warn('No artifacts found in conversation to open for Report/Dashboard command');
@@ -918,16 +1254,19 @@ let ChatConversationsResource = class ChatConversationsResource extends BaseReso
918
1254
  i0.ɵɵviewQuery(_c0, 5)(_c1, 5);
919
1255
  } if (rf & 2) {
920
1256
  let _t;
921
- i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.conversationList = _t.first);
922
- i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.chatArea = _t.first);
1257
+ i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.ConversationList = _t.first);
1258
+ i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.ChatArea = _t.first);
923
1259
  } }, hostBindings: function ChatConversationsResource_HostBindings(rf, ctx) { if (rf & 1) {
924
1260
  i0.ɵɵlistener("resize", function ChatConversationsResource_resize_HostBindingHandler() { return ctx.onWindowResize(); }, i0.ɵɵresolveWindow)("click", function ChatConversationsResource_click_HostBindingHandler($event) { return ctx.onDocumentClick($event); }, i0.ɵɵresolveDocument);
925
- } }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 3, vars: 1, consts: [["conversationList", ""], ["chatArea", ""], [1, "chat-conversations-container"], [1, "initializing-container"], [1, "mobile-sidebar-backdrop"], [1, "conversation-sidebar", 3, "collapsed", "no-transition", "width"], [1, "sidebar-resize-handle"], [1, "conversation-main"], [3, "environmentId", "currentUser", "conversationId", "conversation", "threadId", "isNewConversation", "pendingMessage", "pendingAttachments", "pendingArtifactId", "pendingArtifactConversationId", "pendingArtifactVersionNumber", "showSidebarToggle", "composerAgentMention"], [1, "mobile-sidebar-backdrop", 3, "click"], [1, "conversation-sidebar"], [3, "conversationSelected", "conversationDeleted", "newConversationRequested", "pinSidebarRequested", "unpinSidebarRequested", "refreshRequested", "environmentId", "currentUser", "selectedConversationId", "renamedConversationId", "isSidebarPinned", "isMobileView"], [3, "openEntityRecord", "openConversation"], [1, "sidebar-resize-handle", 3, "mousedown"], [3, "sidebarToggleClicked", "conversationRenamed", "conversationCreated", "threadOpened", "threadClosed", "pendingArtifactConsumed", "pendingMessageConsumed", "pendingMessageRequested", "artifactLinkClicked", "openEntityRecord", "navigationRequest", "composerAgentMentionConsumed", "environmentId", "currentUser", "conversationId", "conversation", "threadId", "isNewConversation", "pendingMessage", "pendingAttachments", "pendingArtifactId", "pendingArtifactConversationId", "pendingArtifactVersionNumber", "showSidebarToggle", "composerAgentMention"], ["text", "Initializing...", "size", "large"]], template: function ChatConversationsResource_Template(rf, ctx) { if (rf & 1) {
1261
+ } }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 4, vars: 2, consts: [["conversationList", ""], ["chatArea", ""], [1, "chat-conversations-container"], [1, "initializing-container"], [3, "InitialQuery", "IsOpen", "EnvironmentId", "CurrentUser"], [1, "mobile-sidebar-backdrop"], [1, "conversation-sidebar", 3, "collapsed", "no-transition", "width"], [1, "sidebar-resize-handle"], [1, "conversation-main"], [3, "environmentId", "currentUser", "conversationId", "conversation", "threadId", "isNewConversation", "pendingMessage", "pendingAttachments", "pendingArtifactId", "pendingArtifactConversationId", "pendingArtifactVersionNumber", "showSidebarToggle", "composerAgentMention"], [1, "mobile-sidebar-backdrop", 3, "click"], [1, "conversation-sidebar"], [3, "conversationSelected", "conversationDeleted", "newConversationRequested", "pinSidebarRequested", "unpinSidebarRequested", "refreshRequested", "SearchEscalated", "environmentId", "currentUser", "selectedConversationId", "renamedConversationId", "isSidebarPinned", "isMobileView"], [3, "openEntityRecord", "openConversation"], [1, "sidebar-resize-handle", 3, "mousedown"], [3, "sidebarToggleClicked", "conversationRenamed", "conversationCreated", "threadOpened", "threadClosed", "pendingArtifactConsumed", "pendingMessageConsumed", "pendingMessageRequested", "artifactLinkClicked", "openEntityRecord", "navigationRequest", "composerAgentMentionConsumed", "environmentId", "currentUser", "conversationId", "conversation", "threadId", "isNewConversation", "pendingMessage", "pendingAttachments", "pendingArtifactId", "pendingArtifactConversationId", "pendingArtifactVersionNumber", "showSidebarToggle", "composerAgentMention"], ["text", "Initializing...", "size", "large"], [3, "close", "ResultSelected", "InitialQuery", "IsOpen", "EnvironmentId", "CurrentUser"]], template: function ChatConversationsResource_Template(rf, ctx) { if (rf & 1) {
926
1262
  i0.ɵɵconditionalCreate(0, ChatConversationsResource_Conditional_0_Template, 6, 4, "div", 2)(1, ChatConversationsResource_Conditional_1_Template, 2, 0, "div", 3);
927
- i0.ɵɵelement(2, "mj-toast");
1263
+ i0.ɵɵconditionalCreate(2, ChatConversationsResource_Conditional_2_Template, 1, 4, "mj-search-panel", 4);
1264
+ i0.ɵɵelement(3, "mj-toast");
928
1265
  } if (rf & 2) {
929
1266
  i0.ɵɵconditional(ctx.isReady ? 0 : 1);
930
- } }, dependencies: [i1.RoutinesSectionComponent, i1.ConversationListComponent, i1.ConversationChatAreaComponent, i1.ToastComponent, i2.LoadingComponent], styles: ["\n :host {\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n }\n\n .chat-conversations-container {\n display: flex;\n width: 100%;\n height: 100%;\n flex: 1;\n overflow: hidden;\n position: relative;\n }\n\n .conversation-sidebar {\n flex-shrink: 0;\n border-right: 1px solid var(--mj-border-default);\n display: flex;\n flex-direction: column;\n overflow: hidden;\n background: var(--mj-bg-surface-sunken);\n transition: width 0.3s ease;\n }\n\n /* Conversation list scrolls; the routines section stays pinned at the bottom */\n .conversation-sidebar mj-conversation-list {\n flex: 1 1 auto;\n min-height: 0;\n overflow-y: auto;\n }\n\n .conversation-sidebar mj-conversation-routines-section {\n flex-shrink: 0;\n }\n\n /* Disable transitions during initial load to prevent jarring animation */\n .conversation-sidebar.no-transition {\n transition: none !important;\n }\n\n .conversation-sidebar.collapsed {\n width: 0 !important;\n min-width: 0;\n border-right: none;\n overflow: hidden;\n }\n\n /* Resize handle for sidebar */\n .sidebar-resize-handle {\n width: 4px;\n background: transparent;\n cursor: ew-resize;\n flex-shrink: 0;\n position: relative;\n transition: background-color 0.2s;\n }\n\n .sidebar-resize-handle:hover {\n background: var(--mj-brand-primary);\n }\n\n .sidebar-resize-handle:active {\n background: var(--mj-brand-primary-hover);\n }\n\n .sidebar-resize-handle::before {\n content: '';\n position: absolute;\n left: -4px;\n right: -4px;\n top: 0;\n bottom: 0;\n cursor: ew-resize;\n }\n\n .conversation-main {\n flex: 1;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n }\n\n .initializing-container {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n height: 100%;\n flex: 1;\n }\n\n /* Mobile: sidebar slides over the chat instead of squishing it.\n The chat area always fills the full width; the sidebar overlays on\n top and is dismissed by tapping the backdrop. */\n @media (max-width: 767px) {\n .conversation-sidebar {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n height: 100%;\n width: min(85%, 320px) !important;\n z-index: 1000;\n transform: translateX(-100%);\n transition: transform 0.3s ease;\n box-shadow: 2px 0 12px color-mix(in srgb, var(--mj-text-primary) 25%, transparent);\n }\n\n /* Keep a fixed width in both states so only the transform animates\n (avoids text reflow during the slide). */\n .conversation-sidebar.collapsed {\n width: min(85%, 320px) !important;\n border-right: 1px solid var(--mj-border-default);\n overflow-y: auto;\n }\n\n .conversation-sidebar:not(.collapsed) {\n transform: translateX(0);\n }\n\n /* No drag-resize on mobile */\n .sidebar-resize-handle {\n display: none;\n }\n\n .mobile-sidebar-backdrop {\n position: absolute;\n inset: 0;\n background: var(--mj-bg-overlay);\n z-index: 999;\n border: none;\n padding: 0;\n cursor: pointer;\n animation: chatBackdropFade 0.2s ease;\n }\n\n @keyframes chatBackdropFade {\n from { opacity: 0; }\n to { opacity: 1; }\n }\n }\n "], encapsulation: 2 });
1267
+ i0.ɵɵadvance(2);
1268
+ i0.ɵɵconditional(ctx.CurrentUser ? 2 : -1);
1269
+ } }, dependencies: [i1.RoutinesSectionComponent, i1.ConversationListComponent, i1.ConversationChatAreaComponent, i1.SearchPanelComponent, i1.ToastComponent, i2.LoadingComponent], styles: ["\n :host {\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n }\n\n .chat-conversations-container {\n display: flex;\n width: 100%;\n height: 100%;\n flex: 1;\n overflow: hidden;\n position: relative;\n }\n\n .conversation-sidebar {\n flex-shrink: 0;\n border-right: 1px solid var(--mj-border-default);\n display: flex;\n flex-direction: column;\n overflow: hidden;\n background: var(--mj-bg-surface-sunken);\n transition: width 0.3s ease;\n }\n\n /* Conversation list scrolls; the routines section stays pinned at the bottom */\n .conversation-sidebar mj-conversation-list {\n flex: 1 1 auto;\n min-height: 0;\n overflow-y: auto;\n }\n\n .conversation-sidebar mj-conversation-routines-section {\n flex-shrink: 0;\n }\n\n /* Disable transitions during initial load to prevent jarring animation */\n .conversation-sidebar.no-transition {\n transition: none !important;\n }\n\n .conversation-sidebar.collapsed {\n width: 0 !important;\n min-width: 0;\n border-right: none;\n overflow: hidden;\n }\n\n /* Resize handle for sidebar */\n .sidebar-resize-handle {\n width: 4px;\n background: transparent;\n cursor: ew-resize;\n flex-shrink: 0;\n position: relative;\n transition: background-color 0.2s;\n }\n\n .sidebar-resize-handle:hover {\n background: var(--mj-brand-primary);\n }\n\n .sidebar-resize-handle:active {\n background: var(--mj-brand-primary-hover);\n }\n\n .sidebar-resize-handle::before {\n content: '';\n position: absolute;\n left: -4px;\n right: -4px;\n top: 0;\n bottom: 0;\n cursor: ew-resize;\n }\n\n .conversation-main {\n flex: 1;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n }\n\n .initializing-container {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n height: 100%;\n flex: 1;\n }\n\n /* Mobile: sidebar slides over the chat instead of squishing it.\n The chat area always fills the full width; the sidebar overlays on\n top and is dismissed by tapping the backdrop. */\n @media (max-width: 767px) {\n .conversation-sidebar {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n height: 100%;\n width: min(85%, 320px) !important;\n z-index: 1000;\n transform: translateX(-100%);\n transition: transform 0.3s ease;\n box-shadow: 2px 0 12px color-mix(in srgb, var(--mj-text-primary) 25%, transparent);\n }\n\n /* Keep a fixed width in both states so only the transform animates\n (avoids text reflow during the slide). */\n .conversation-sidebar.collapsed {\n width: min(85%, 320px) !important;\n border-right: 1px solid var(--mj-border-default);\n overflow-y: auto;\n }\n\n .conversation-sidebar:not(.collapsed) {\n transform: translateX(0);\n }\n\n /* No drag-resize on mobile */\n .sidebar-resize-handle {\n display: none;\n }\n\n .mobile-sidebar-backdrop {\n position: absolute;\n inset: 0;\n background: var(--mj-bg-overlay);\n z-index: 999;\n border: none;\n padding: 0;\n cursor: pointer;\n animation: chatBackdropFade 0.2s ease;\n }\n\n @keyframes chatBackdropFade {\n from { opacity: 0; }\n to { opacity: 1; }\n }\n }\n "], encapsulation: 2 });
931
1270
  };
932
1271
  ChatConversationsResource = __decorate([
933
1272
  RegisterClass(BaseResourceComponent, 'ChatConversationsResource')
@@ -962,7 +1301,8 @@ export { ChatConversationsResource };
962
1301
  (newConversationRequested)="onNewConversationRequested()"
963
1302
  (pinSidebarRequested)="pinSidebar()"
964
1303
  (unpinSidebarRequested)="unpinSidebar()"
965
- (refreshRequested)="onRefreshRequested()">
1304
+ (refreshRequested)="onRefreshRequested()"
1305
+ (SearchEscalated)="OpenSearch($event)">
966
1306
  </mj-conversation-list>
967
1307
  <!-- Routines — pinned at the very bottom of the sidebar. Gated inside the
968
1308
  section component by Read permission on 'MJ: User Routines'. -->
@@ -1018,13 +1358,25 @@ export { ChatConversationsResource };
1018
1358
  </div>
1019
1359
  }
1020
1360
 
1361
+ <!-- Cross-entity search panel (conversations / messages / artifacts / collections / tasks) -->
1362
+ @if (CurrentUser) {
1363
+ <mj-search-panel
1364
+ [InitialQuery]="SearchSeedQuery"
1365
+ [IsOpen]="IsSearchPanelOpen"
1366
+ [EnvironmentId]="EnvironmentId"
1367
+ [CurrentUser]="CurrentUser"
1368
+ (close)="CloseSearch()"
1369
+ (ResultSelected)="OnSearchResultSelected($event)">
1370
+ </mj-search-panel>
1371
+ }
1372
+
1021
1373
  <!-- Toast notifications container -->
1022
1374
  <mj-toast></mj-toast>
1023
1375
  `, encapsulation: ViewEncapsulation.None, styles: ["\n :host {\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n }\n\n .chat-conversations-container {\n display: flex;\n width: 100%;\n height: 100%;\n flex: 1;\n overflow: hidden;\n position: relative;\n }\n\n .conversation-sidebar {\n flex-shrink: 0;\n border-right: 1px solid var(--mj-border-default);\n display: flex;\n flex-direction: column;\n overflow: hidden;\n background: var(--mj-bg-surface-sunken);\n transition: width 0.3s ease;\n }\n\n /* Conversation list scrolls; the routines section stays pinned at the bottom */\n .conversation-sidebar mj-conversation-list {\n flex: 1 1 auto;\n min-height: 0;\n overflow-y: auto;\n }\n\n .conversation-sidebar mj-conversation-routines-section {\n flex-shrink: 0;\n }\n\n /* Disable transitions during initial load to prevent jarring animation */\n .conversation-sidebar.no-transition {\n transition: none !important;\n }\n\n .conversation-sidebar.collapsed {\n width: 0 !important;\n min-width: 0;\n border-right: none;\n overflow: hidden;\n }\n\n /* Resize handle for sidebar */\n .sidebar-resize-handle {\n width: 4px;\n background: transparent;\n cursor: ew-resize;\n flex-shrink: 0;\n position: relative;\n transition: background-color 0.2s;\n }\n\n .sidebar-resize-handle:hover {\n background: var(--mj-brand-primary);\n }\n\n .sidebar-resize-handle:active {\n background: var(--mj-brand-primary-hover);\n }\n\n .sidebar-resize-handle::before {\n content: '';\n position: absolute;\n left: -4px;\n right: -4px;\n top: 0;\n bottom: 0;\n cursor: ew-resize;\n }\n\n .conversation-main {\n flex: 1;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n }\n\n .initializing-container {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n height: 100%;\n flex: 1;\n }\n\n /* Mobile: sidebar slides over the chat instead of squishing it.\n The chat area always fills the full width; the sidebar overlays on\n top and is dismissed by tapping the backdrop. */\n @media (max-width: 767px) {\n .conversation-sidebar {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n height: 100%;\n width: min(85%, 320px) !important;\n z-index: 1000;\n transform: translateX(-100%);\n transition: transform 0.3s ease;\n box-shadow: 2px 0 12px color-mix(in srgb, var(--mj-text-primary) 25%, transparent);\n }\n\n /* Keep a fixed width in both states so only the transform animates\n (avoids text reflow during the slide). */\n .conversation-sidebar.collapsed {\n width: min(85%, 320px) !important;\n border-right: 1px solid var(--mj-border-default);\n overflow-y: auto;\n }\n\n .conversation-sidebar:not(.collapsed) {\n transform: translateX(0);\n }\n\n /* No drag-resize on mobile */\n .sidebar-resize-handle {\n display: none;\n }\n\n .mobile-sidebar-backdrop {\n position: absolute;\n inset: 0;\n background: var(--mj-bg-overlay);\n z-index: 999;\n border: none;\n padding: 0;\n cursor: pointer;\n animation: chatBackdropFade 0.2s ease;\n }\n\n @keyframes chatBackdropFade {\n from { opacity: 0; }\n to { opacity: 1; }\n }\n }\n "] }]
1024
- }], () => [{ type: i0.ChangeDetectorRef }, { type: i1.ConversationStreamingService }, { type: i1.ActiveTasksService }, { type: i1.UICommandHandlerService }, { type: i1.ConversationBridgeService }], { conversationList: [{
1376
+ }], () => [{ type: i0.ChangeDetectorRef }, { type: i1.ConversationStreamingService }, { type: i1.ActiveTasksService }, { type: i1.UICommandHandlerService }, { type: i1.ConversationBridgeService }], { ConversationList: [{
1025
1377
  type: ViewChild,
1026
1378
  args: ['conversationList']
1027
- }], chatArea: [{
1379
+ }], ChatArea: [{
1028
1380
  type: ViewChild,
1029
1381
  args: ['chatArea']
1030
1382
  }], onWindowResize: [{
@@ -1034,5 +1386,5 @@ export { ChatConversationsResource };
1034
1386
  type: HostListener,
1035
1387
  args: ['document:click', ['$event']]
1036
1388
  }] }); })();
1037
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ChatConversationsResource, { className: "ChatConversationsResource", filePath: "src/lib/resource-wrappers/chat-conversations-resource.component.ts", lineNumber: 262 }); })();
1389
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ChatConversationsResource, { className: "ChatConversationsResource", filePath: "src/lib/resource-wrappers/chat-conversations-resource.component.ts", lineNumber: 278 }); })();
1038
1390
  //# sourceMappingURL=chat-conversations-resource.component.js.map